| /* hp_disclib.h: HP MAC/ICD disc controller simulator library definitions | |
| Copyright (c) 2011-2016, 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. | |
| 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. | |
| */ | |
| #include "hp3000_defs.h" /* this must reflect the machine used */ | |
| /* 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 (1 << 0) /* trace controller commands */ | |
| #define DL_DEB_INCO (1 << 1) /* trace command initiations and completions */ | |
| #define DL_DEB_STATE (1 << 2) /* trace command execution state changes */ | |
| #define DL_DEB_SERV (1 << 3) /* trace unit service scheduling calls */ | |
| #define DL_DEB_XFER (1 << 4) /* trace data reads and writes */ | |
| #define DL_DEB_IOB (1 << 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 (1 << 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 0000003 /* model ID mask */ | |
| #define UNIT_PROT_MASK 0000003 /* 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 (1 << UNIT_PROT_SHIFT + 0) | |
| #define UNIT_PROT_U (1 << UNIT_PROT_SHIFT + 1) | |
| #define UNIT_UNLOAD (1 << UNIT_UNLOAD_SHIFT) | |
| #define UNIT_FMT (1 << 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, | |
| CMRDY = 0000002, | |
| DTRDY = 0000004, | |
| EOD = 0000010, | |
| INTOK = 0000020, | |
| OVRUN = 0000040, | |
| XFRNG = 0000100 | |
| } 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, | |
| DSCIF = 000000400000, | |
| SELIF = 000001000000, | |
| IFIN = 000002000000, | |
| IFOUT = 000004000000, | |
| IFGTC = 000010000000, | |
| IFPRF = 000020000000, | |
| RQSRV = 000040000000, | |
| DVEND = 000100000000, | |
| SRTRY = 000200000000, | |
| STDFL = 000400000000, | |
| STINT = 001000000000, | |
| WRTIO = 002000000000, | |
| FREE = 004000000000 | |
| } CNTLR_IFN; | |
| #define NO_FUNCTIONS ((CNTLR_IFN) 0) /* no functions are asserted */ | |
| typedef CNTLR_IFN CNTLR_IFN_SET; /* a set of CNTLR_IFNs */ | |
| typedef uint16 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) \ | |
| 0, 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 */ | |
| uint16 *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 */ | |
| DIAG_ENTRY *dop; /* current diagnostic override entry pointer */ | |
| 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 uint16) | |
| 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), NULL, \ | |
| &(fast), &(fast) | |
| /* Disc controller device register definitions. | |
| 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 uint16) | |
| times - the fast timing values structure (DELAY_PROPS) | |
| These definitions should be included AFTER any interface-specific registers. | |
| Implementation notes: | |
| 1. The "CNTLR" register is present to ensure that the entire CNTLR_VARS | |
| structure is saved and restored. | |
| 2. The fast timing structure does not use the controller and drive type | |
| fields, so they do not need to be SAVEd or RESTOREd, so they do not need | |
| to appear in hidden registers. | |
| */ | |
| #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_A }, \ | |
| { DRDATA (INDEX, (cntlr).index, 8), PV_LEFT }, \ | |
| { DRDATA (LENGTH, (cntlr).length, 8), PV_LEFT }, \ | |
| { SRDATA (CNTLR, (cntlr)), 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, char *cptr); | |
| extern t_stat dl_detach (CVPTR cvptr, UNIT *uptr); | |
| extern t_stat dl_set_model (UNIT *uptr, int32 value, char *cptr, void *desc); | |
| extern t_stat dl_set_protect (UNIT *uptr, int32 value, char *cptr, void *desc); | |
| extern t_stat dl_set_diag (UNIT *uptr, int32 value, char *cptr, void *desc); | |
| extern t_stat dl_set_timing (UNIT *uptr, int32 value, char *cptr, void *desc); | |
| extern t_stat dl_show_protect (FILE *st, UNIT *uptr, int32 value, void *desc); | |
| extern t_stat dl_show_diag (FILE *st, UNIT *uptr, int32 value, void *desc); | |
| extern t_stat dl_show_timing (FILE *st, UNIT *uptr, int32 value, void *desc); |