563 lines
28 KiB
C
563 lines
28 KiB
C
/* hp_disclib.h: HP MAC/ICD disc controller simulator library declarations
|
|
|
|
Copyright (c) 2011-2017, J. David Bryan
|
|
Copyright (c) 2004-2011, Robert M. Supnik
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
Except as contained in this notice, the name of the authors shall not be used
|
|
in advertising or otherwise to promote the sale, use or other dealings in
|
|
this Software without prior written authorization from the authors.
|
|
|
|
05-Sep-17 JDB Changed REG_A (permit any symbolic override) to REG_X
|
|
10-Oct-16 JDB Moved "hp3000_defs.h" inclusion to "hp_disclib.c"
|
|
13-May-16 JDB Modified for revised SCP API function parameter types
|
|
24-Mar-16 JDB Added the DL_BUFFER type to define the disc buffer array
|
|
21-Mar-16 JDB Changed uint16 types to HP_WORD
|
|
27-Jul-15 JDB First revised release version
|
|
21-Feb-15 JDB Revised for new controller interface model
|
|
24-Oct-12 JDB Changed CNTLR_OPCODE to title case to avoid name clash
|
|
07-May-12 JDB Added end-of-track delay time as a controller variable
|
|
02-May-12 JDB First release
|
|
09-Nov-11 JDB Created disc controller common library from DS simulator
|
|
|
|
|
|
This file provides the declarations for interoperation between interface
|
|
simulators and the simulation library for the HP 13037 and 13365 disc
|
|
controllers. It must be included by the interface-specific modules.
|
|
*/
|
|
|
|
|
|
|
|
/* Architectural constants.
|
|
|
|
The type of the disc buffer element is defined. This must be a 16-bit array
|
|
for the file representation to be packed.
|
|
*/
|
|
|
|
typedef uint16 DL_BUFFER; /* a buffer containing 16-bit disc data words */
|
|
|
|
|
|
/* Program limits */
|
|
|
|
#define DL_MAXDRIVE 7 /* last valid drive number */
|
|
#define DL_AUXUNITS 1 /* number of MAC auxiliary units required */
|
|
#define DL_BUFSIZE 138 /* required buffer size in words (full sector) */
|
|
|
|
|
|
/* Program constants (cylinders * heads * sectors * words per sector) */
|
|
|
|
#define WORDS_7905 (411 * 3 * 48 * 128) /* 7905 capacity = 15 MB */
|
|
#define WORDS_7906 (411 * 4 * 48 * 128) /* 7906 capacity = 20 MB */
|
|
#define WORDS_7920 (823 * 5 * 48 * 128) /* 7920 capacity = 50 MB */
|
|
#define WORDS_7925 (823 * 9 * 64 * 128) /* 7925 capacity = 120 MB */
|
|
|
|
|
|
/* Debug flags */
|
|
|
|
#define DL_DEB_CMD (1u << 0) /* trace controller commands */
|
|
#define DL_DEB_INCO (1u << 1) /* trace command initiations and completions */
|
|
#define DL_DEB_STATE (1u << 2) /* trace command execution state changes */
|
|
#define DL_DEB_SERV (1u << 3) /* trace unit service scheduling calls */
|
|
#define DL_DEB_XFER (1u << 4) /* trace data reads and writes */
|
|
#define DL_DEB_IOB (1u << 5) /* trace I/O bus signals and data words */
|
|
#define DL_DEB_V_UF 6 /* first free debug flag bit */
|
|
|
|
|
|
/* Common per-unit disc drive state variables */
|
|
|
|
#define CYL u3 /* drive cylinder */
|
|
#define STATUS u4 /* drive status (Status 2) */
|
|
#define OPCODE u5 /* drive current operation */
|
|
#define PHASE u6 /* drive current operation phase */
|
|
|
|
|
|
/* Device flags and accessors */
|
|
|
|
#define DEV_REALTIME_SHIFT (DEV_V_UF + 0) /* bits 0-0: timing mode is realistic */
|
|
|
|
#define DEV_REALTIME (1u << DEV_REALTIME_SHIFT) /* realistic timing flag */
|
|
|
|
|
|
/* Unit flags and accessors */
|
|
|
|
#define UNIT_MODEL_SHIFT (UNIT_V_UF + 0) /* bits 0-1: drive model ID */
|
|
#define UNIT_PROT_SHIFT (UNIT_V_UF + 2) /* bits 2-3 write protection */
|
|
#define UNIT_UNLOAD_SHIFT (UNIT_V_UF + 4) /* bits 4-4: heads unloaded */
|
|
#define UNIT_FMT_SHIFT (UNIT_V_UF + 5) /* bits 5-5: format enabled */
|
|
#define DL_V_UF (UNIT_V_UF + 6) /* first free unit flag bit */
|
|
|
|
#define UNIT_MODEL_MASK 0000003u /* model ID mask */
|
|
#define UNIT_PROT_MASK 0000003u /* head protection mask */
|
|
|
|
#define UNIT_MODEL (UNIT_MODEL_MASK << UNIT_MODEL_SHIFT)
|
|
#define UNIT_PROT (UNIT_PROT_MASK << UNIT_PROT_SHIFT)
|
|
#define UNIT_PROT_L (1u << UNIT_PROT_SHIFT + 0)
|
|
#define UNIT_PROT_U (1u << UNIT_PROT_SHIFT + 1)
|
|
#define UNIT_UNLOAD (1u << UNIT_UNLOAD_SHIFT)
|
|
#define UNIT_FMT (1u << UNIT_FMT_SHIFT)
|
|
|
|
#define UNIT_7905 (HP_7905 << UNIT_MODEL_SHIFT)
|
|
#define UNIT_7906 (HP_7906 << UNIT_MODEL_SHIFT)
|
|
#define UNIT_7920 (HP_7920 << UNIT_MODEL_SHIFT)
|
|
#define UNIT_7925 (HP_7925 << UNIT_MODEL_SHIFT)
|
|
|
|
|
|
/* Controller flag and function accessors */
|
|
|
|
#define DLIFN(C) ((CNTLR_IFN_SET) ((C) & ~D16_MASK))
|
|
#define DLIBUS(C) ((CNTLR_IBUS) ((C) & D16_MASK))
|
|
|
|
#define DLNEXTIFN(S) ((CNTLR_IFN) IOPRIORITY (S))
|
|
|
|
|
|
/* Disc drive types */
|
|
|
|
typedef enum {
|
|
HP_All = -1,
|
|
HP_7906 = 0, /* these values */
|
|
HP_7920 = 1, /* are hard-coded */
|
|
HP_7905 = 2, /* in the 13037 */
|
|
HP_7925 = 3 /* controller microcode */
|
|
} DRIVE_TYPE;
|
|
|
|
|
|
/* Controller types */
|
|
|
|
typedef enum {
|
|
MAC = 0,
|
|
ICD,
|
|
CS80
|
|
} CNTLR_TYPE;
|
|
|
|
#define LAST_CNTLR CS80
|
|
#define CNTLR_COUNT (LAST_CNTLR + 1)
|
|
|
|
|
|
/* Interface flags and function bus orders.
|
|
|
|
The CNTLR_FLAG and CNTLR_IFN declarations mirror the hardware signals that
|
|
are received and asserted, respectively, by the 13037 disc controller. In
|
|
simulation, the interface to which the controller is connected sends a set of
|
|
one or more flags that indicate the state of the interface to the controller.
|
|
The controller then returns a set of one or more functions that request the
|
|
interface to perform certain actions.
|
|
|
|
In hardware, a series of functions are sent sequentially to the interface as
|
|
encoded values accompanied by IFVLD (interface function is valid) or IFCLK
|
|
(interface function clock) signals. In simulation, the functions are decoded
|
|
into a set of function identifiers that are returned to, and then processed
|
|
sequentially by, the interface in order of ascending numerical value.
|
|
|
|
|
|
Implementation notes:
|
|
|
|
1. The enumerations describe signals. A set of signals normally would be
|
|
modeled as an unsigned integer, as a set may contain more than one
|
|
signal. However, we define a set as the enumeration, as the "gdb"
|
|
debugger has special provisions for an enumeration of discrete bit values
|
|
and will display the set in "ORed" form.
|
|
|
|
2. The null sets -- NO_FLAGS and NO_FUNCTIONS -- cannot be defined as
|
|
enumeration constants, as including them would require handlers for them
|
|
in "switch" statements, which is undesirable. Therefore, we define them
|
|
as an explicit integer zero values compatible with the enumerations.
|
|
|
|
3. Function bus values are restricted to the upper 16 bits to allow the
|
|
combined function and data value to fit in 32 bits.
|
|
|
|
4. The hardware signal CLEAR is renamed CLEARF in simulation to avoid the
|
|
name clash with the flip-flop CLEAR enumeration value. (A sensible
|
|
language would allow a definition of CLEAR in each of the enumerations.
|
|
However, C has a single name space for all enumeration constants.)
|
|
|
|
5. In hardware, the BUSY command is used in combination with the LSB of the
|
|
data bus to set or clear the interface busy flip-flop. In simulation,
|
|
separate BUSY (set busy) and FREE (clear busy) commands are used to allow
|
|
the data bus to carry a full 16-bit value.
|
|
|
|
6. The DVEND function must come numerically after RQSRV, as DVEND will abort
|
|
the transfer if no retries are left.
|
|
*/
|
|
|
|
typedef enum { /* interface flags */
|
|
CLEARF = 0000001, /* Clear Controller */
|
|
CMRDY = 0000002, /* Command Ready */
|
|
DTRDY = 0000004, /* Data Ready */
|
|
EOD = 0000010, /* End of Data */
|
|
INTOK = 0000020, /* Interrupt OK */
|
|
OVRUN = 0000040, /* Data Overrun */
|
|
XFRNG = 0000100 /* Data Transfer No Good */
|
|
} CNTLR_FLAG;
|
|
|
|
#define NO_FLAGS ((CNTLR_FLAG) 0) /* no flags are asserted */
|
|
|
|
typedef CNTLR_FLAG CNTLR_FLAG_SET; /* a set of CNTLR_FLAGs */
|
|
|
|
|
|
typedef enum { /* interface function bus orders */
|
|
BUSY = 000000200000, /* Set Interface Busy */
|
|
DSCIF = 000000400000, /* Disconnect Interface */
|
|
SELIF = 000001000000, /* Select Interface */
|
|
IFIN = 000002000000, /* Interface In */
|
|
IFOUT = 000004000000, /* Interface Out */
|
|
IFGTC = 000010000000, /* Interface Get Command */
|
|
IFPRF = 000020000000, /* Interface Prefetch Command */
|
|
RQSRV = 000040000000, /* Request Service */
|
|
DVEND = 000100000000, /* Device End */
|
|
SRTRY = 000200000000, /* Set Retry Counter */
|
|
STDFL = 000400000000, /* Set Data Flag */
|
|
STINT = 001000000000, /* Set Interrupt */
|
|
WRTIO = 002000000000, /* Write TIO Register */
|
|
FREE = 004000000000 /* Set Interface Free */
|
|
} CNTLR_IFN;
|
|
|
|
#define NO_FUNCTIONS ((CNTLR_IFN) 0) /* no functions are asserted */
|
|
|
|
typedef CNTLR_IFN CNTLR_IFN_SET; /* a set of CNTLR_IFNs */
|
|
|
|
|
|
typedef HP_WORD CNTLR_IBUS; /* the interface data bus */
|
|
|
|
#undef NO_DATA /* remove winsock definition */
|
|
#define NO_DATA ((CNTLR_IBUS) 0) /* no data asserted */
|
|
|
|
|
|
typedef uint32 CNTLR_IFN_IBUS; /* a combined interface function set and data bus value */
|
|
|
|
|
|
/* Controller opcodes */
|
|
|
|
typedef enum {
|
|
Cold_Load_Read = 000,
|
|
Recalibrate = 001,
|
|
Seek = 002,
|
|
Request_Status = 003,
|
|
Request_Sector_Address = 004,
|
|
Read = 005,
|
|
Read_Full_Sector = 006,
|
|
Verify = 007,
|
|
Write = 010,
|
|
Write_Full_Sector = 011,
|
|
Clear = 012,
|
|
Initialize = 013,
|
|
Address_Record = 014,
|
|
Request_Syndrome = 015,
|
|
Read_With_Offset = 016,
|
|
Set_File_Mask = 017,
|
|
Invalid_Opcode = 020,
|
|
Read_Without_Verify = 022,
|
|
Load_TIO_Register = 023,
|
|
Request_Disc_Address = 024,
|
|
End = 025,
|
|
Wakeup = 026
|
|
} CNTLR_OPCODE;
|
|
|
|
#define LAST_OPCODE Wakeup
|
|
|
|
|
|
/* Controller command classifications */
|
|
|
|
typedef enum {
|
|
Class_Invalid, /* invalid classification */
|
|
Class_Read, /* read classification */
|
|
Class_Write, /* write classification */
|
|
Class_Control, /* control classification */
|
|
Class_Status /* status classification */
|
|
} CNTLR_CLASS;
|
|
|
|
|
|
/* Controller status.
|
|
|
|
Not all status values are returned by the library. The values not currently
|
|
returned are:
|
|
|
|
- Illegal_Drive_Type
|
|
- Cylinder_Miscompare
|
|
- Head_Sector_Miscompare
|
|
- Sync_Timeout
|
|
- Correctable_Data_Error
|
|
- Illegal_Spare_Access
|
|
- Defective_Track
|
|
|
|
In hardware, all of the above errors, except for Illegal_Drive_Type and
|
|
Correctable_Data_Error, potentially could occur during the address
|
|
verification that precedes normal reads and writes. In simulation, these
|
|
cannot occur, as sector address headers are not simulated. However, any
|
|
error may be returned if diagnostic overrides are used.
|
|
|
|
In simulation, Uncorrectable_Data_Error is returned by default by the Request
|
|
Syndrome command. Uncorrectable_Data_Error is also returned if a host I/O
|
|
error occurs on reading or writing.
|
|
*/
|
|
|
|
typedef enum {
|
|
Normal_Completion = 000,
|
|
Illegal_Opcode = 001,
|
|
Unit_Available = 002,
|
|
Illegal_Drive_Type = 003,
|
|
Cylinder_Miscompare = 007,
|
|
Uncorrectable_Data_Error = 010,
|
|
Head_Sector_Miscompare = 011,
|
|
IO_Program_Error = 012,
|
|
Sync_Timeout = 013,
|
|
End_of_Cylinder = 014,
|
|
Data_Overrun = 016,
|
|
Correctable_Data_Error = 017,
|
|
Illegal_Spare_Access = 020,
|
|
Defective_Track = 021,
|
|
Access_Not_Ready = 022,
|
|
Status_2_Error = 023,
|
|
Protected_Track = 026,
|
|
Unit_Unavailable = 027,
|
|
Drive_Attention = 037
|
|
} CNTLR_STATUS;
|
|
|
|
#define LAST_STATUS Drive_Attention
|
|
|
|
|
|
/* Controller execution states */
|
|
|
|
typedef enum {
|
|
Idle_State, /* idle */
|
|
Wait_State, /* command wait */
|
|
Busy_State /* busy */
|
|
} CNTLR_STATE;
|
|
|
|
|
|
/* Unit command phases */
|
|
|
|
typedef enum {
|
|
Idle_Phase = 0,
|
|
Parameter_Phase,
|
|
Seek_Phase,
|
|
Rotate_Phase,
|
|
Data_Phase,
|
|
Intersector_Phase,
|
|
End_Phase
|
|
} CNTLR_PHASE;
|
|
|
|
#define LAST_PHASE End_Phase
|
|
|
|
|
|
/* Diagnostic override entries.
|
|
|
|
Diagnostic overrides are used to return controller status values that
|
|
otherwise are not simulated to a diagnostic program. A table of override
|
|
entries may be set up by the interface simulator if this facility is desired.
|
|
*/
|
|
|
|
typedef struct {
|
|
uint32 cylinder; /* matching cylinder address */
|
|
uint32 head; /* matching head address */
|
|
uint32 sector; /* matching sector address */
|
|
CNTLR_OPCODE opcode; /* matching controller opcode */
|
|
uint32 spd; /* returned S/P/D flags */
|
|
CNTLR_STATUS status; /* returned controller status */
|
|
} DIAG_ENTRY;
|
|
|
|
#define DL_OVEND D32_UMAX /* marker for the end of the current override set */
|
|
|
|
|
|
/* Disc access delays */
|
|
|
|
typedef struct {
|
|
CNTLR_TYPE type; /* controller type */
|
|
DRIVE_TYPE drive; /* drive type */
|
|
int32 seek_one; /* track-to-track seek time */
|
|
int32 seek_full; /* full-stroke seek time */
|
|
int32 sector_full; /* full sector rotation time */
|
|
int32 data_xfer; /* per-word data transfer time */
|
|
int32 intersector_gap; /* intersector gap time */
|
|
int32 overhead; /* controller execution overhead */
|
|
} DELAY_PROPS;
|
|
|
|
#define DELAY_INIT(sk1,skf,scf,dxfr,isg,ovhd) \
|
|
(CNTLR_TYPE) 0, (DRIVE_TYPE) 0, \
|
|
(sk1), (skf), (scf), (dxfr), (isg), (ovhd)
|
|
|
|
|
|
/* Disc controller state */
|
|
|
|
typedef struct {
|
|
CNTLR_TYPE type; /* controller type */
|
|
DEVICE *device; /* controlling device pointer */
|
|
CNTLR_STATE state; /* controller state */
|
|
CNTLR_OPCODE opcode; /* controller opcode */
|
|
CNTLR_STATUS status; /* controller status */
|
|
FLIP_FLOP eoc; /* end-of-cylinder flag */
|
|
t_bool verify; /* address verification required */
|
|
uint32 spd_unit; /* S/P/D flags and unit number */
|
|
uint32 file_mask; /* file mask */
|
|
uint32 cylinder; /* cylinder address */
|
|
uint32 head; /* head address */
|
|
uint32 sector; /* sector address */
|
|
uint32 count; /* count of words transferred or to verify */
|
|
uint32 poll_unit; /* last unit polled for attention */
|
|
DL_BUFFER *buffer; /* data buffer pointer */
|
|
uint32 index; /* data buffer current index */
|
|
uint32 length; /* data buffer valid length */
|
|
DIAG_ENTRY *dop_base; /* pointer to the diagnostic override array */
|
|
int32 dop_index; /* current diagnostic override entry index */
|
|
DELAY_PROPS *fastptr; /* pointer to the FASTTIME delays */
|
|
const DELAY_PROPS *dlyptr; /* current delay property pointer */
|
|
} CNTLR_VARS;
|
|
|
|
typedef CNTLR_VARS *CVPTR; /* pointer to a controller state variable structure */
|
|
|
|
|
|
/* Controller state variable structure initialization.
|
|
|
|
The supplied parameters are:
|
|
|
|
ctype - the type of the controller (CNTLR_TYPE)
|
|
dev - the device on which the controller operates (DEVICE)
|
|
bufptr - a pointer to the data buffer (array of DL_BUFFER)
|
|
doa - a pointer to the diagnostic override array (array of DIAG_ENTRY)
|
|
or NULL if this facility is not used
|
|
fast - a pointer to the fast timing values (DELAY_PROPS)
|
|
*/
|
|
|
|
#define CNTLR_INIT(ctype,dev,bufptr,doa,fast) \
|
|
(ctype), &(dev), Idle_State, End, Normal_Completion, \
|
|
CLEAR, FALSE, \
|
|
0, 0, 0, 0, 0, 0, 0, \
|
|
(bufptr), 0, 0, \
|
|
(doa), -1, \
|
|
&(fast), &(fast)
|
|
|
|
|
|
/* Disc controller device register definitions.
|
|
|
|
These definitions should be included AFTER any interface-specific registers.
|
|
|
|
The supplied parameters are:
|
|
|
|
cntlr - the controller state variable structure (CNTLR_VARS)
|
|
units - the unit array (array of UNIT)
|
|
numunits - the number of units in the unit array
|
|
buffer - the sector buffer (array of DL_BUFFER)
|
|
times - the fast timing values structure (DELAY_PROPS)
|
|
|
|
|
|
Implementation notes:
|
|
|
|
1. The CNTLR_VARS fields "type", "device", "buffer", "dop_base", "fastptr",
|
|
and "dlyptr" do not need to appear in the REG array, as "dlyptr" is reset
|
|
by the dl_attach routine during a RESTORE, and the others are static.
|
|
|
|
2. The fast timing structure does not use the controller and drive type
|
|
fields, so they do not appear in hidden registers, as they need not be
|
|
SAVEd or RESTOREd.
|
|
*/
|
|
|
|
#define DL_REGS(cntlr,units,numunits,buffer,times) \
|
|
/* Macro Name Location Radix Width Depth Flags */ \
|
|
/* ------ -------- ------------------ ----- ----- ----------------- ----------------- */ \
|
|
{ ORDATA (OPCODE, (cntlr).opcode, 5), REG_RO }, \
|
|
{ ORDATA (CSTATS, (cntlr).status, 5), REG_RO }, \
|
|
{ DRDATA (CSTATE, (cntlr).state, 2), PV_LEFT | REG_RO }, \
|
|
{ FLDATA (EOC, (cntlr).eoc, 0) }, \
|
|
{ FLDATA (VERIFY, (cntlr).verify, 0) }, \
|
|
{ ORDATA (SPDU, (cntlr).spd_unit, 16) }, \
|
|
{ ORDATA (FLMASK, (cntlr).file_mask, 4) }, \
|
|
{ DRDATA (CYL, (cntlr).cylinder, 16), PV_LEFT }, \
|
|
{ DRDATA (HEAD, (cntlr).head, 6), PV_LEFT }, \
|
|
{ DRDATA (SECTOR, (cntlr).sector, 8), PV_LEFT }, \
|
|
{ DRDATA (COUNT, (cntlr).count, 16), PV_LEFT }, \
|
|
{ BRDATA (SECBUF, (buffer), 8, 16, DL_BUFSIZE), REG_X }, \
|
|
{ DRDATA (INDEX, (cntlr).index, 8), PV_LEFT }, \
|
|
{ DRDATA (LENGTH, (cntlr).length, 8), PV_LEFT }, \
|
|
{ DRDATA (POLLU, (cntlr).poll_unit, 4), REG_HRO }, \
|
|
{ DRDATA (DOINDX, (cntlr).dop_index, 16), PV_LEFT | REG_HRO }, \
|
|
\
|
|
/* Macro Name Location Width Flags */ \
|
|
/* ------ ------ ------------------------ ----- ---------------- */ \
|
|
{ DRDATA (TTIME, (times).seek_one, 24), PV_LEFT | REG_NZ }, \
|
|
{ DRDATA (FTIME, (times).seek_full, 24), PV_LEFT | REG_NZ }, \
|
|
{ DRDATA (STIME, (times).sector_full, 24), PV_LEFT | REG_NZ }, \
|
|
{ DRDATA (XTIME, (times).data_xfer, 24), PV_LEFT | REG_NZ }, \
|
|
{ DRDATA (GTIME, (times).intersector_gap, 24), PV_LEFT | REG_NZ }, \
|
|
{ DRDATA (OTIME, (times).overhead, 24), PV_LEFT | REG_NZ }, \
|
|
\
|
|
/* Macro Name Location Radix Width Offset Depth Flags */ \
|
|
/* ------ ------- ------------------ ----- --------- ------ ----------- ----------------- */ \
|
|
{ URDATA (UCYL, (units)[0].CYL, 10, 10, 0, (numunits), PV_LEFT) }, \
|
|
{ URDATA (UOPCODE, (units)[0].OPCODE, 8, 6, 0, (numunits), PV_RZRO | REG_RO) }, \
|
|
{ URDATA (USTATUS, (units)[0].STATUS, 2, 32, 0, (numunits), PV_RZRO) }, \
|
|
{ URDATA (USTATE, (units)[0].PHASE, 10, 4, 0, (numunits), PV_RZRO | REG_RO) }, \
|
|
{ URDATA (UPOS, (units)[0].pos, 10, T_ADDR_W, 0, (numunits), PV_LEFT | REG_RO) }, \
|
|
{ URDATA (UWAIT, (units)[0].wait, 8, 32, 0, (numunits), PV_LEFT) }
|
|
|
|
|
|
/* Disc controller device modifier definitions.
|
|
|
|
These definitions should be included BEFORE any device-specific modifiers.
|
|
*/
|
|
|
|
#define DL_MODS(cntlr,loadvalid,ovcount) \
|
|
/* Mask Value Match Value Print String Match String Validation Display Descriptor */ \
|
|
/* ------------ ----------- ----------------- ------------ ------------- ------- ---------- */ \
|
|
{ UNIT_MODEL, UNIT_7905, "7905", "7905", &dl_set_model, NULL, NULL }, \
|
|
{ UNIT_MODEL, UNIT_7906, "7906", "7906", &dl_set_model, NULL, NULL }, \
|
|
{ UNIT_MODEL, UNIT_7920, "7920", "7920", &dl_set_model, NULL, NULL }, \
|
|
{ UNIT_MODEL, UNIT_7925, "7925", "7925", &dl_set_model, NULL, NULL }, \
|
|
\
|
|
{ UNIT_UNLOAD, 0, "heads loaded", "LOAD", &(loadvalid), NULL, NULL }, \
|
|
{ UNIT_UNLOAD, UNIT_UNLOAD, "heads unloaded", "UNLOAD", &(loadvalid), NULL, NULL }, \
|
|
\
|
|
{ UNIT_FMT, UNIT_FMT, "format enabled", "FORMAT", NULL, NULL, NULL }, \
|
|
{ UNIT_FMT, 0, "format disabled", "NOFORMAT", NULL, NULL, NULL }, \
|
|
\
|
|
/* Entry Flags Value Print String Match String Validation Display Descriptor */ \
|
|
/* ------------------- ---------- ------------ -------------- ---------------- ----------------- ----------------- */ \
|
|
{ MTAB_XUN, 1, "", "PROTECT", &dl_set_protect, &dl_show_protect, NULL }, \
|
|
{ MTAB_XUN, 0, NULL, "UNPROTECT", &dl_set_protect, NULL, NULL }, \
|
|
\
|
|
{ MTAB_XDV, 0, NULL, "FASTTIME", &dl_set_timing, NULL, (void *) &(cntlr) }, \
|
|
{ MTAB_XDV, 1, NULL, "REALTIME", &dl_set_timing, NULL, (void *) &(cntlr) }, \
|
|
{ MTAB_XDV, 0, "TIMING", NULL, NULL, &dl_show_timing, (void *) &(cntlr) }, \
|
|
\
|
|
{ MTAB_XDV | MTAB_NMO, (ovcount), "DIAG", "DIAGNOSTIC", &dl_set_diag, &dl_show_diag, (void *) &(cntlr) }, \
|
|
{ MTAB_XDV, 0, "", "NODIAGNOSTIC", &dl_set_diag, &dl_show_diag, (void *) &(cntlr) }
|
|
|
|
|
|
|
|
/* Disc library global controller routines */
|
|
|
|
extern CNTLR_IFN_IBUS dl_controller (CVPTR cvptr, UNIT *uptr, CNTLR_FLAG_SET flags, CNTLR_IBUS data);
|
|
extern t_stat dl_load_unload (CVPTR cvptr, UNIT *uptr, t_bool load);
|
|
|
|
/* Disc library global utility routines */
|
|
|
|
extern const char *dl_opcode_name (CNTLR_TYPE controller, CNTLR_OPCODE opcode);
|
|
extern const char *dl_status_name (CNTLR_STATUS status);
|
|
|
|
/* Disc library global SCP support routines */
|
|
|
|
extern t_stat dl_attach (CVPTR cvptr, UNIT *uptr, CONST char *cptr);
|
|
extern t_stat dl_detach (CVPTR cvptr, UNIT *uptr);
|
|
|
|
extern t_stat dl_set_model (UNIT *uptr, int32 value, CONST char *cptr, void *desc);
|
|
extern t_stat dl_set_protect (UNIT *uptr, int32 value, CONST char *cptr, void *desc);
|
|
extern t_stat dl_set_diag (UNIT *uptr, int32 value, CONST char *cptr, void *desc);
|
|
extern t_stat dl_set_timing (UNIT *uptr, int32 value, CONST char *cptr, void *desc);
|
|
|
|
extern t_stat dl_show_protect (FILE *st, UNIT *uptr, int32 value, CONST void *desc);
|
|
extern t_stat dl_show_diag (FILE *st, UNIT *uptr, int32 value, CONST void *desc);
|
|
extern t_stat dl_show_timing (FILE *st, UNIT *uptr, int32 value, CONST void *desc);
|