blob: 1dd6e8d10577ba7f303c81a95bbefa29ed314c9f [file] [log] [blame] [raw]
/*
Copyright (c) 2015-2017, John Forecast
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
JOHN FORECAST 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 John Forecast shall not
be used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from John Forecast.
*/
/* cdc1700_defs.h: CDC1700 simulator definitions
*/
#ifndef _CDC1700_DEFS_H
#define _CDC1700_DEFS_H
#include "sim_defs.h"
#include "sim_tape.h"
#define DBGOUT (sim_deb != NULL ? sim_deb : stdout)
/*
* Private status codes
*/
#define SCPE_LOOP 1 /* Indirect addressing loop */
#define SCPE_SSTOP 2 /* Selective stop */
#define SCPE_INVEXI 3 /* Invalid bit in EXI delta */
#define SCPE_IBKPT 4 /* Breakpoint */
#define SCPE_REJECT 5 /* Stop on reject */
#define SCPE_UNIMPL 6 /* Unimplemented instruction */
/*
* Private device flags
*/
#define DEV_V_REJECT (DEV_V_UF + 1) /* Stop on reject enabled */
#define DEV_V_NOEQUIP (DEV_V_UF + 2) /* Not an equipment device */
#define DEV_V_INDEV (DEV_V_UF + 3) /* Input device for IO_DEVICE */
#define DEV_V_OUTDEV (DEV_V_UF + 4) /* Output device for IO_DEVICE */
#define DEV_V_PROTECT (DEV_V_UF + 5) /* Device supports protection */
#define DEV_V_PROTECTED (DEV_V_UF + 6) /* Device protection enabled */
#define DEV_V_REVERSE (DEV_V_UF + 7) /* DP reverse addressing */
#define DEV_V_FIXED (DEV_V_UF + 7) /* CDD fixed drive first addressing */
#define DEV_REJECT (1 << DEV_V_REJECT)
#define DEV_NOEQUIP (1 << DEV_V_NOEQUIP)
#define DEV_INDEV (1 << DEV_V_INDEV)
#define DEV_OUTDEV (1 << DEV_V_OUTDEV)
#define DEV_PROTECT (1 << DEV_V_PROTECT)
#define DEV_PROTECTED (1 << DEV_V_PROTECTED)
#define DEV_REVERSE (1 << DEV_V_REVERSE)
#define DEV_FIXED (1 << DEV_V_FIXED)
/*
* CPU debug flags
*/
#define DBG_V_DISASS 0 /* Disassemble on execution */
#define DBG_V_IDISASS 1 /* Disassemble during interrupt */
#define DBG_V_INTR 2 /* Indicate interrupt execution */
#define DBG_V_TRACE 3 /* Trace register content */
#define DBG_V_ITRACE 4 /* Trace during interrupt */
#define DBG_V_TARGET 5 /* Output target address */
#define DBG_V_INPUT 6 /* Trace input operations */
#define DBG_V_OUTPUT 7 /* Trace output operations */
#define DBG_V_FULL 8 /* Full Trace (emulator debug) */
#define DBG_V_INTLVL 9 /* Prefix with interrupt level */
#define DBG_V_PROTECT 10 /* Display protect fault information */
#define DBG_V_MISSING 11 /* Display access to missing devices */
#define DBG_V_ENH 12 /* Display enh. instructions ignored */
/* in basic instruction mode */
#define DBG_V_MSOS5 13 /* Trace MSOS5 system requests */
#define DBG_DISASS (1 << DBG_V_DISASS)
#define DBG_IDISASS (1 << DBG_V_IDISASS)
#define DBG_INTR (1 << DBG_V_INTR)
#define DBG_TRACE (1 << DBG_V_TRACE)
#define DBG_ITRACE (1 << DBG_V_ITRACE)
#define DBG_TARGET (1 << DBG_V_TARGET)
#define DBG_INPUT (1 << DBG_V_INPUT)
#define DBG_OUTPUT (1 << DBG_V_OUTPUT)
#define DBG_FULL (1 << DBG_V_FULL)
#define DBG_INTLVL (1 << DBG_V_INTLVL)
#define DBG_PROTECT (1 << DBG_V_PROTECT)
#define DBG_MISSING (1 << DBG_V_MISSING)
#define DBG_ENH (1 << DBG_V_ENH)
#define DBG_MSOS5 (1 << DBG_V_MSOS5)
/*
* Default device radix
*/
#define DEV_RDX 16
/*
* Private unit flags
*/
#define UNIT_V_7TRACK (MTUF_V_UF + 0) /* 7-track tape transport */
#define UNIT_V_WPROT (MTUF_V_UF + 1) /* Write protected */
#define UNIT_V_854 (UNIT_V_UF + 0) /* 854 vs. 853 disk pack drive */
#define UNIT_V_856_4 (UNIT_V_UF + 0) /* 856_4 vs. 856_2 drive */
#define UNIT_V_DRMSIZE (UNIT_V_UF + 0) /* 1752 drum memory assignment */
#define UNIT_7TRACK (1 << UNIT_V_7TRACK)
#define UNIT_WPROT (1 << UNIT_V_WPROT)
#define UNIT_854 (1 << UNIT_V_854)
#define UNIT_856_4 (1 << UNIT_V_856_4)
#define UNIT_DRMSIZE (1 << UNIT_V_DRMSIZE)
/*
* CPU
*/
/* The currently supported instruction set is held in u3. */
#define INSTR_ORIGINAL 0 /* Original instruction set */
#define INSTR_BASIC 1 /* Basic instruction set */
#define INSTR_ENHANCED 2 /* Enhanced instruction set */
#define INSTR_SET (cpu_unit.u3)
#define MAXMEMSIZE 65536
#define DEFAULTMEMSIZE 32768
/*
* Compute the actual memory address based on the amount of memory installed
* on the system. Note we only support power of 2 memories like the real
* hardware - the system reference manual says that 12K and 24K systems are
* possible but not supported by standard software.
*/
#define MEMADDR(p) ((p) & (cpu_unit.capac - 1))
/*
* Protect bit access
*/
#define SETPROTECT(a) P[MEMADDR(a)] = 1
#define CLRPROTECT(a) P[MEMADDR(a)] = 0
#define ISPROTECTED(a) P[MEMADDR(a)]
/*
* Max count of indirect addressing. Used to avoid infinite loops.
*/
#define MAXINDIRECT 10000
/*
* Register access
*/
#define INCP Preg = MEMADDR(Preg + 1)
/*
* I/O operations
*/
enum IOstatus {
IO_REPLY, /* Device sent a reply */
IO_REJECT, /* Device sent a reject */
IO_INTERNALREJECT /* I/O rejected internally */
};
#define SIGN 0x8000
#define MAXPOS 0x7FFF
#define MAXNEG 0xFFFF
#define ABS(v) (((v) & SIGN) ? ~(v) : (v))
/*
* Instruction layout:
*
* Storage reference instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | op |re|in|i1|i2| delta |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
* Register reference instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | 0 0 0 0| F1 | modifier |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
* Inter-register instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | 0 0 0 0| 1 0 0 0|lp|xr| origin | dest |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
* Shift instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | 0 0 0 0| 1 1 1 1|LR| A| Q| count |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
* Skip instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | 0 0 0 0| 0 0 0 1| type | count |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*/
#define MOD_RE 0x800
#define MOD_IN 0x400
#define MOD_I1 0x200
#define MOD_I2 0x100
#define OPC_MASK 0xF000
#define OPC_ADQ 0xF000
#define OPC_LDQ 0xE000
#define OPC_RAO 0xD000
#define OPC_LDA 0xC000
#define OPC_EOR 0xB000
#define OPC_AND 0xA000
#define OPC_SUB 0x9000
#define OPC_ADD 0x8000
#define OPC_SPA 0x7000
#define OPC_STA 0x6000
#define OPC_RTJ 0x5000
#define OPC_STQ 0x4000
#define OPC_DVI 0x3000
#define OPC_MUI 0x2000
#define OPC_JMP 0x1000
#define OPC_SPECIAL 0x0000
#define OPC_SPECIALMASK 0x0F00
#define OPC_SLS 0x0000
#define OPC_SKIPS 0x0100
#define OPC_SKIPMASK 0x00F0
#define OPC_SKIPCOUNT 0x000F
#define OPC_SAZ (OPC_SKIPS | 0x00)
#define OPC_SAN (OPC_SKIPS | 0x10)
#define OPC_SAP (OPC_SKIPS | 0x20)
#define OPC_SAM (OPC_SKIPS | 0x30)
#define OPC_SQZ (OPC_SKIPS | 0x40)
#define OPC_SQN (OPC_SKIPS | 0x50)
#define OPC_SQP (OPC_SKIPS | 0x60)
#define OPC_SQM (OPC_SKIPS | 0x70)
#define OPC_SWS (OPC_SKIPS | 0x80)
#define OPC_SWN (OPC_SKIPS | 0x90)
#define OPC_SOV (OPC_SKIPS | 0xA0)
#define OPC_SNO (OPC_SKIPS | 0xB0)
#define OPC_SPE (OPC_SKIPS | 0xC0)
#define OPC_SNP (OPC_SKIPS | 0xD0)
#define OPC_SPF (OPC_SKIPS | 0xE0)
#define OPC_SNF (OPC_SKIPS | 0xF0)
#define OPC_INP 0x0200
#define OPC_OUT 0x0300
#define OPC_EIN 0x0400
#define OPC_IIN 0x0500
#define OPC_ECA 0x0580
#define OPC_DCA 0x05C0
#define OPC_SPB 0x0600
#define OPC_CPB 0x0700
#define OPC_INTER 0x0800
#define MOD_LP 0x80
#define MOD_XR 0x40
#define MOD_O_A 0x20
#define MOD_O_Q 0x10
#define MOD_O_M 0x08
#define MOD_D_A 0x04
#define MOD_D_Q 0x02
#define MOD_D_M 0x01
#define OPC_AAM (OPC_INTER | MOD_O_A | MOD_O_M)
#define OPC_AAQ (OPC_INTER | MOD_O_A | MOD_O_Q)
#define OPC_AAB (OPC_INTER | MOD_O_A | MOD_O_Q | MOD_O_M)
#define OPC_CLR (OPC_INTER | MOD_XR)
#define OPC_TCM (OPC_INTER | MOD_XR | MOD_O_M)
#define OPC_TCQ (OPC_INTER | MOD_XR | MOD_O_Q)
#define OPC_TCB (OPC_INTER | MOD_XR | MOD_O_Q | MOD_O_M)
#define OPC_TCA (OPC_INTER | MOD_XR | MOD_O_A)
#define OPC_EAM (OPC_INTER | MOD_XR | MOD_O_A | MOD_O_M)
#define OPC_EAQ (OPC_INTER | MOD_XR | MOD_O_A | MOD_O_Q)
#define OPC_EAB (OPC_INTER | MOD_XR | MOD_O_A | MOD_O_Q | MOD_O_M)
#define OPC_SET (OPC_INTER | MOD_LP)
#define OPC_TRM (OPC_INTER | MOD_LP | MOD_O_M)
#define OPC_TRQ (OPC_INTER | MOD_LP | MOD_O_Q)
#define OPC_TRB (OPC_INTER | MOD_LP | MOD_O_Q | MOD_O_M)
#define OPC_TRA (OPC_INTER | MOD_LP | MOD_O_A)
#define OPC_LAM (OPC_INTER | MOD_LP | MOD_O_A | MOD_O_M)
#define OPC_LAQ (OPC_INTER | MOD_LP | MOD_O_A | MOD_O_Q)
#define OPC_LAB (OPC_INTER | MOD_LP | MOD_O_A | MOD_O_Q | MOD_O_M)
#define OPC_CAM (OPC_INTER | MOD_LP | MOD_XR | MOD_O_A | MOD_O_M)
#define OPC_CAQ (OPC_INTER | MOD_LP | MOD_XR | MOD_O_A | MOD_O_Q)
#define OPC_CAB (OPC_INTER | MOD_LP | MOD_XR | MOD_O_A | MOD_O_Q | MOD_O_M)
#define OPC_INA 0x0900
#define OPC_ENA 0x0A00
#define OPC_NOP 0x0B00
#define OPC_ENQ 0x0C00
#define OPC_INQ 0x0D00
#define OPC_EXI 0x0E00
#define OPC_MODMASK 0x00FF
#define EXTEND16(v) (((v) & 0x8000) ? (v) | 0xFFFF0000 : (v))
#define EXTEND8(v) (((v) & 0x80) ? (v) | 0xFF00 : (v))
#define EXTEND4(v) (((v) & 0x8) ? (v) | 0xFFF0 : (v))
#define TRUNC16(v) ((v) & 0xFFFF)
#define CANEXTEND8(v) (((v) & 0xFF80) == 0xFF80)
#define OPC_SHIFTS 0x0F00
#define OPC_SHIFTMASK 0x00E0
#define MOD_LR 0x80
#define MOD_S_A 0x40
#define MOD_S_Q 0x20
#define OPC_SHIFTCOUNT 0x001F
#define OPC_QRS (OPC_SHIFTS | MOD_S_Q)
#define OPC_ARS (OPC_SHIFTS | MOD_S_A)
#define OPC_LRS (OPC_SHIFTS | MOD_S_A | MOD_S_Q)
#define OPC_QLS (OPC_SHIFTS | MOD_LR | MOD_S_Q)
#define OPC_ALS (OPC_SHIFTS | MOD_LR | MOD_S_A)
#define OPC_LLS (OPC_SHIFTS | MOD_LR | MOD_S_A | MOD_S_Q)
#define OPC_ADDRMASK 0x00FF
#define ISCONSTANT(i) ((i & (MOD_RE | MOD_IN | OPC_ADDRMASK)) == 0)
/*
* Enhanced instruction layout.
*
* Enhanced storage reference instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | F = 0 | F1 = 4 |r |i | Ra | Rb |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | F4 | F5 | delta |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | 16-bit address, only present if delta = 0 |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
* Field reference instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | F = 0 | F1 = 5 |r |i | Ra | Rb |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | FLDSTR | FLDLTH-1 | delta |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | 16-bit address, only present if delta = 0 |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
* Enhanced inter-register instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | F = 0 | F1 = 7 | Ra | F2a | Rb |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
* Enhanced skip instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | F = 0 | F1 = 0 | F2 | SK |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
* Decrement and repeat instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | F = 0 | F1 = 6 | Ra |0 | SK |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
* Miscellaneous instructions:
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | F = 0 | F1 = B | Ra |0 | F3 |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
*/
#define MOD_ENHRE 0x0080
#define MOD_ENHIN 0x0040
#define MOD_ENHRA 0x0038
#define MOD_ENHRB 0x0007
#define REG_NOREG 0x0
#define REG_R1 0x1
#define REG_R2 0x2
#define REG_R3 0x3
#define REG_R4 0x4
#define REG_Q 0x5
#define REG_A 0x6
#define REG_I 0x7
#define OPC_ENHF4 0xF000
#define OPC_ENHF5 0x0F00
#define WORD_REG 0x0
#define WORD_MEM 0x1
#define CHAR_REG 0x2
#define CHAR_MEM 0x3
#define OPC_STOSJMP 0x5000
#define OPC_STOADD 0x8000
#define OPC_STOSUB 0x9000
#define OPC_STOAND 0xA000
#define OPC_STOLOADST 0xC000
#define OPC_STOOR 0xD000
#define OPC_STOCRE 0xE000
#define OPC_FLDF3A 0x07
#define OPC_FLDRSV1 0x0
#define OPC_FLDRSV2 0x1
#define OPC_FLDSFZ 0x2
#define OPC_FLDSFN 0x3
#define OPC_FLDLOAD 0x4
#define OPC_FLDSTORE 0x5
#define OPC_FLDCLEAR 0x6
#define OPC_FLDSET 0x7
#define OPC_FLDSTR 0xF000
#define OPC_FLDLTH 0x0F00
#define OPC_ENHXFRRA 0xE0
#define OPC_ENHXFRF2A 0x18
#define OPC_ENHXFRRB 0x7
#define OPC_ENHSKIPTY 0x30
#define OPC_ENHSKIPREG 0xC0
#define OPC_ENHSKIPCNT 0xF
#define OPC_DRPMBZ 0x10
#define OPC_DRPRA 0xE0
#define OPC_DRPSK 0xF
#define OPC_MISCRA 0xE0
#define OPC_MISCF3 0xF
#define OPC_ENHLMM 0x1
#define OPC_ENHLRG 0x2
#define OPC_ENHSRG 0x3
#define OPC_ENHSIO 0x4
#define OPC_ENHSPS 0x5
#define OPC_ENHDMI 0x6
#define OPC_ENHCBP 0x7
#define OPC_ENHGPE 0x8
#define OPC_ENHGPO 0x9
#define OPC_ENHASC 0xA
#define OPC_ENHAPM 0xB
#define OPC_ENHPM0 0xC
#define OPC_ENHPM1 0xD
#define OPC_ENHLUB 0x0
#define OPC_ENHLLB 0x1
#define OPC_ENHEMS 0x2
#define OPC_ENHWPR 0x3
#define OPC_ENHRPR 0x4
#define OPC_ENHECC 0x5
/*
* Interrupt vector definitions
*/
#define INTERRUPT_BASE 0x100
#define INTERRUPT_00 (INTERRUPT_BASE + 0x00)
#define INTERRUPT_01 (INTERRUPT_BASE + 0x04)
#define INTERRUPT_02 (INTERRUPT_BASE + 0x08)
#define INTERRUPT_03 (INTERRUPT_BASE + 0x0C)
#define INTERRUPT_04 (INTERRUPT_BASE + 0x10)
#define INTERRUPT_05 (INTERRUPT_BASE + 0x14)
#define INTERRUPT_06 (INTERRUPT_BASE + 0x18)
#define INTERRUPT_07 (INTERRUPT_BASE + 0x1C)
#define INTERRUPT_08 (INTERRUPT_BASE + 0x20)
#define INTERRUPT_09 (INTERRUPT_BASE + 0x24)
#define INTERRUPT_10 (INTERRUPT_BASE + 0x28)
#define INTERRUPT_11 (INTERRUPT_BASE + 0x2C)
#define INTERRUPT_12 (INTERRUPT_BASE + 0x30)
#define INTERRUPT_13 (INTERRUPT_BASE + 0x34)
#define INTERRUPT_14 (INTERRUPT_BASE + 0x38)
#define INTERRUPT_15 (INTERRUPT_BASE + 0x3C)
#define INTR_BASIC 2
#define INTR_1705 16
/*
* I/O definitions.
*/
#define IO_CONTINUE 0x8000
#define IO_W 0x7800
#define IO_EQUIPMENT 0x0780
#define IO_COMMAND 0x007F
/*
* Standard director functions
*/
#define IO_DIR_STOP 0x0040 /* Stop motion */
#define IO_DIR_START 0x0020 /* Start motion */
#define IO_DIR_ALARM 0x0010 /* Alarm int req. */
#define IO_DIR_EOP 0x0008 /* End of operation int req. */
#define IO_DIR_DATA 0x0004 /* Data int req. */
#define IO_DIR_CINT 0x0002 /* Clear interrupts */
#define IO_DIR_CCONT 0x0001 /* Clear controller */
/*
* Illegal combination of functions - Start + Stop
*/
#define STARTSTOP(v) (((v) & \
(IO_DIR_START | IO_DIR_STOP)) == \
(IO_DIR_START | IO_DIR_STOP))
/*
* Standard status bits
*/
#define IO_ST_PARITY 0x0100 /* Parity error */
#define IO_ST_PROT 0x0080 /* Protected */
#define IO_ST_LOST 0x0040 /* Lost data */
#define IO_ST_ALARM 0x0020 /* Alarm */
#define IO_ST_EOP 0x0010 /* End of operation */
#define IO_ST_DATA 0x0008 /* Data */
#define IO_ST_INT 0x0004 /* Interrupt */
#define IO_ST_BUSY 0x0002 /* Device busy */
#define IO_ST_READY 0x0001 /* Device ready */
/*
* The following type/values may be used to differentiate processing when
* a single device driver is used to emulate multiple controller types (e.g.
* the LP device driver emulates both 1740 and 1742-30/-120 controllers).
*/
enum IOdevtype {
IOtype_default, /* Initial value */
IOtype_dev1, /* Device specific values */
IOtype_dev2,
IOtype_dev3,
IOtype_dev4,
IOtype_dev5,
IOtype_dev6,
IOtype_dev7,
IOtype_dev8
};
/*
* I/O framework device structure
*/
struct io_device {
const char *iod_name;
const char *iod_model;
enum IOdevtype iod_type;
uint8 iod_equip;
uint8 iod_station;
uint16 iod_interrupt;
uint16 iod_dcbase;
DEVICE *iod_indev;
DEVICE *iod_outdev;
UNIT *iod_unit;
t_bool (*iod_reject)(struct io_device *, t_bool, uint8);
enum IOstatus (*iod_IOread)(struct io_device *, uint8);
enum IOstatus (*iod_IOwrite)(struct io_device *, uint8);
enum IOstatus (*iod_BDCread)(struct io_device *, uint16 *, uint8);
enum IOstatus (*iod_BDCwrite)(struct io_device *, uint16 *, uint8);
void (*iod_state)(const char *, DEVICE *, struct io_device *);
t_bool (*iod_intr)(struct io_device *);
uint16 (*iod_raised)(DEVICE *);
void (*iod_clear)(DEVICE *);
uint8 (*iod_decode)(struct io_device *, t_bool, uint8);
t_bool (*iod_chksta)(t_bool, uint8);
uint16 iod_ienable;
uint16 iod_oldienable;
uint16 iod_imask;
uint16 iod_dmask;
uint16 iod_smask;
uint16 iod_cmask;
uint16 iod_rmask;
uint8 iod_regs;
uint16 iod_validmask;
uint16 iod_readmap;
uint16 iod_rejmapR;
uint16 iod_rejmapW;
uint8 iod_flags;
uint8 iod_dc;
uint16 iod_readR[16];
uint16 iod_writeR[16];
uint16 iod_prevR[16];
uint16 iod_forced;
t_uint64 iod_event;
uint16 iod_private;
void *iod_private2;
uint16 iod_private3;
t_bool iod_private4;
const char *iod_private5;
uint16 iod_private6;
uint16 iod_private7;
uint16 iod_private8;
uint8 iod_private9;
t_bool iod_private10;
uint16 iod_private11;
uint16 iod_private12;
uint8 iod_private13;
uint8 iod_private14;
};
#define STATUS iod_readR[1]
#define DEVSTATUS(iod) ((iod)->iod_readR[1])
#define DCSTATUS(iod) ((iod)->iod_readR[2])
#define FUNCTION iod_writeR[1]
#define IENABLE iod_ienable
#define OLDIENABLE iod_oldienable
#define ENABLED(iod) ((iod)->iod_ienable)
#define ISENABLED(iod, mask) \
(((iod)->iod_ienable & mask) != 0)
#define SETSTICKY(iod, reg, value) \
((iod)->iod_sticky[reg] |= value)
#define CLRSTICKY(iod, reg, value) \
((iod)->iod_sticky[reg] &= ~value)
#define MASK_REGISTER0 0x0001
#define MASK_REGISTER1 0x0002
#define MASK_REGISTER2 0x0004
#define MASK_REGISTER3 0x0008
#define MASK_REGISTER4 0x0010
#define MASK_REGISTER5 0x0020
#define MASK_REGISTER6 0x0040
#define MASK_REGISTER7 0x0080
#define MASK_REGISTER8 0x0100
#define MASK_REGISTER9 0x0200
#define MASK_REGISTER10 0x0400
#define MASK_REGISTER11 0x0800
#define MASK_REGISTER12 0x1000
#define MASK_REGISTER13 0x2000
#define MASK_REGISTER14 0x4000
#define MASK_REGISTER15 0x8000
#define STATUS_ZERO 0x01
#define DEVICE_DC 0x02
#define AQ_ONLY 0x04
#define IODEV(name, model, id, equ, sta, base, busy, ior, iow, bdcr, bdcw, dump, intr, raised, clear, decode, chksta, mask, regs, valid, map, rejR, rejW, flags, dc, devspec) \
{ name, model, IOtype_default, equ, sta, 0, base, \
NULL, NULL, NULL, \
busy, ior, iow, bdcr, bdcw, dump, intr, raised, clear, decode, chksta, \
0, 0, IO_##id##_INTR, IO_##id##_DIRMSK, IO_##id##_STMSK, \
IO_##id##_STCINT | IO_ST_INT, \
mask, regs, valid, map, rejR, rejW, flags, dc, \
{ 0, 0, 0, 0, 0, 0, 0, 0, }, \
{ 0, 0, 0, 0, 0, 0, 0, 0, }, \
{ 0, 0, 0, 0, 0, 0, 0, 0, }, \
0, 0, 0, devspec, 0, FALSE, NULL, 0, 0, 0, 0, FALSE \
}
typedef struct io_device IO_DEVICE;
#define IODEVICE(dev) ((IO_DEVICE *)dev->ctxt)
#define CHANGED(iod, n) ((iod)->iod_writeR[n] ^ (iod)->iod_prevR[n])
#define ICHANGED(iod) ((iod)->iod_ienable ^ (iod)->iod_oldienable)
#define DEVRESET(iod) \
(iod)->iod_ienable = 0; \
(iod)->iod_oldienable = 0; \
(iod)->iod_forced = 0
/*
* Routine type to return interrupt mask for a device.
*/
typedef uint16 devINTR(DEVICE *);
/*
* Generic device flags
*/
#define DBG_V_DTRACE 0 /* Trace device ops */
#define DBG_V_DSTATE 1 /* Dump device state */
#define DBG_V_DINTR 2 /* Trace device interrupts */
#define DBG_V_DERROR 3 /* Trace device errors */
#define DBG_V_LOC 4 /* Dump instruction location */
#define DBG_V_FIRSTREJ 5 /* Dump only first Reject */
#define DBG_SPECIFIC 6 /* Start of device-specific */
/* flags */
#define DBG_DTRACE (1 << DBG_V_DTRACE)
#define DBG_DSTATE (1 << DBG_V_DSTATE)
#define DBG_DINTR (1 << DBG_V_DINTR)
#define DBG_DERROR (1 << DBG_V_DERROR)
#define DBG_DLOC (1 << DBG_V_LOC)
#define DBG_DFIRSTREJ (1 << DBG_V_FIRSTREJ)
/*
* Device specific values
*/
/*
* CPU is treated as a device but has no interrupts, director functions or
* status bits.
*/
#define IO_CPU_INTR 0
#define IO_CPU_DIRMSK 0
#define IO_CPU_STMSK 0
#define IO_CPU_STCINT 0
/*
* 1706-A Buffered Data Channel
*/
#define IO_1706_1_A 0x1000 /* 1706-A #1 */
#define IO_1706_1_B 0x1800
#define IO_1706_1_C 0x2000
#define IO_1706_1_D 0x2800
#define IO_1706_2_A 0x3800 /* 1706-A #2 */
#define IO_1706_2_B 0x4000
#define IO_1706_2_C 0x4800
#define IO_1706_2_D 0x5000
#define IO_1706_3_A 0x6000 /* 1706-A #3 */
#define IO_1706_3_B 0x6800
#define IO_1706_3_C 0x7000
#define IO_1706_3_D 0x7800
#define IO_1706_SET 0x8000 /* Set/clear for ones */
#define IO_1706_EOP 0x0001 /* Enable interrupt on EOP */
#define IO_1706_PROT 0x0040 /* Program protect fault */
#define IO_1706_REPLY 0x0200 /* Device reply */
#define IO_1706_REJECT 0x0100 /* Device reject */
#define IO_1706_STMSK (IO_1706_REPLY | IO_1706_REJECT | IO_1706_PROT | \
IO_ST_EOP | IO_ST_BUSY | IO_ST_READY)
/*
* A 1706-A has no interrupts, director functions or status bits of it's own
* that are accessible through normal I/O requests.
*/
#define IO_DC_INTR 0
#define IO_DC_DIRMSK 0
#define IO_DC_STMSK 0
#define IO_DC_STCINT 0
#define IO_1706_MAX 3 /* Max # of 1706's allowed */
#define IO_1706_DEVS 8 /* Max devices per channel */
#define IDX_FROM_CHAN(c) (c - 1)
/*
* 1711-A/B, 1712-A Teletypewriter
*/
#define IO_1711_A 0x0090
#define IO_1711_B 0x0091
#define IO_1711_SREAD 0x0200 /* Select read mode */
#define IO_1711_SWRITE 0x0100 /* Select write mode */
#define IO_1711_DIRMSK (IO_1711_SREAD | IO_1711_SWRITE | IO_DIR_ALARM | \
IO_DIR_EOP | IO_DIR_DATA | IO_DIR_CINT | IO_DIR_CCONT)
#define IO_1711_INTR (IO_DIR_ALARM | IO_DIR_EOP | IO_DIR_DATA)
#define IO_1711_MANUAL 0x0800 /* Manual interrupt */
#define IO_1711_MON 0x0400 /* Motor on */
#define IO_1711_RMODE 0x0200 /* Read mode */
#define IO_1711_STMSK (IO_1711_MANUAL | IO_1711_MON | IO_1711_RMODE | \
IO_ST_LOST | IO_ST_ALARM | IO_ST_EOP \
| IO_ST_DATA | IO_ST_INT | IO_ST_BUSY | IO_ST_READY)
#define IO_1711_STCINT (IO_ST_ALARM | IO_ST_EOP | IO_ST_DATA)
/*
* 1721-A/B/C/D, 1722-A/B Paper Tape Reader
*/
#define IO_1721_A 0x00A0
#define IO_1721_B 0x00A1
#define IO_1721_DIRMSK (IO_DIR_STOP | IO_DIR_START | IO_DIR_ALARM | \
IO_DIR_DATA | IO_DIR_CINT | IO_DIR_CCONT)
#define IO_1721_INTR (IO_DIR_ALARM | IO_DIR_DATA)
#define IO_1721_POWERON 0x0400 /* Power on */
#define IO_1721_MOTIONF 0x0200 /* Paper motion failure */
#define IO_1721_EXIST 0x0100 /* Existence code */
#define IO_1721_STMSK (IO_1721_POWERON | IO_1721_MOTIONF | IO_1721_EXIST | \
IO_ST_PROT | IO_ST_LOST | IO_ST_ALARM | \
IO_ST_DATA | IO_ST_INT | IO_ST_BUSY | IO_ST_READY)
#define IO_1721_STCINT (IO_ST_ALARM | IO_ST_DATA)
/*
* 1723-A/B, 1724-A/B Paper Tape Punch
*/
#define IO_1723_A 0x00C0
#define IO_1723_B 0x00C1
#define IO_1723_DIRMSK (IO_DIR_STOP | IO_DIR_START | IO_DIR_ALARM | \
IO_DIR_DATA | IO_DIR_CINT | IO_DIR_CCONT)
#define IO_1723_INTR (IO_DIR_ALARM | IO_DIR_DATA)
#define IO_1723_TAPELOW 0x0800 /* Tape supply low */
#define IO_1723_POWERON 0x0400 /* Power on */
#define IO_1723_BREAK 0x0200 /* Tape break */
#define IO_1723_EXIST 0x0100 /* Existence code */
#define IO_1723_STMSK (IO_1723_TAPELOW | IO_1723_POWERON | IO_1723_BREAK | \
IO_1723_EXIST | IO_ST_PROT | IO_ST_ALARM | \
IO_ST_DATA | IO_ST_INT | IO_ST_BUSY | IO_ST_READY)
#define IO_1723_STCINT (IO_ST_ALARM | IO_ST_DATA)
/*
* 1726 Card Reader
*/
#define IO_1726_GATE 0x0200 /* gate card */
#define IO_1726_NHOL 0x0400 /* Negate hollerith to acsii */
#define IO_1726_RHOL 0x0800 /* Rel. hollerith to ascii */
#define IO_1726_RELOAD 0x1000 /* Reload memory */
#define IO_1726_DIRMSK (IO_1726_RELOAD | IO_1726_RHOL | IO_1726_NHOL | \
IO_1726_GATE | IO_DIR_ALARM | IO_DIR_EOP | \
IO_DIR_DATA | IO_DIR_CINT | IO_DIR_CCONT)
#define IO_1726_INTR (IO_DIR_ALARM | IO_DIR_EOP | IO_DIR_DATA)
#define IO_1726_ERROR 0x0100 /* Error */
#define IO_1726_BINARY 0x0200 /* Binary card */
#define IO_1726_SEP 0x0400 /* Separator card */
#define IO_1726_FEED 0x0800 /* Fail to feed */
#define IO_1726_JAM 0x1000 /* Stacker full or jam */
#define IO_1726_EMPTY 0x2000 /* Input tray empty */
#define IO_1726_EOF 0x4000 /* End of file */
#define IO_1726_PWROFF 0x8000 /* Motor power off */
#define IO_1726_STMSK (IO_1726_PWROFF | IO_1726_EOF | IO_1726_EMPTY | \
IO_1726_JAM | IO_1726_FEED | IO_1726_SEP | \
IO_1726_BINARY | IO_1726_ERROR | IO_ST_PROT | \
IO_ST_ALARM | IO_ST_EOP | IO_ST_DATA | \
IO_ST_INT | IO_ST_BUSY | IO_ST_READY)
#define IO_1726_STCINT (IO_ST_ALARM | IO_ST_EOP | IO_ST_DATA)
/*
* 1728-A/B Card Reader/Punch
*/
#define IO_1728_MASK 0x0060 /* Station mask */
#define IO_1728_CR 0x0020 /* Card reader select */
#define IO_1728_CP 0x0040 /* Card puch select */
#define IO_1728_OFFSET 0x0100 /* Offset request */
#define IO_1728_FEED 0x0080 /* Initiate feed cycle */
#define IO_1728_DIRMSK (IO_1728_OFFSET | IO_1728_FEED | IO_DIR_ALARM | \
IO_DIR_EOP | IO_DIR_DATA | IO_DIR_CINT | \
IO_DIR_CCONT)
#define IO_1728_INTR (IO_DIR_ALARM | IO_DIR_EOP | IO_DIR_DATA)
#define IO_1728_CBFULL 0x0800 /* Chip box full */
#define IO_1728_EOF 0x0400 /* End of file */
#define IO_1728_FEEDAL 0x0200 /* Feed alert */
#define IO_1728_ERROR 0x0100 /* Pre-read or punch error */
#define IO_1728_STMSK (IO_1728_CBFULL | IO_1728_EOF | IO_1728_FEEDAL | \
IO_1728_ERROR | IO_ST_PROT | IO_ST_LOST | \
IO_ST_EOP | IO_ST_DATA | IO_ST_INT | IO_ST_BUSY | \
IO_ST_READY)
#define IO_1728_STCINT (IO_DIR_ALARM | IO_DIR_EOP | IO_DIR_DATA)
#define IO_ST2_INTLOCK 0x0400 /* Door interlock */
#define IO_ST2_PUNINH 0x0200 /* Punch inhibit set */
#define IO_ST2_MANUAL 0x0100 /* Manual mode */
#define IO_ST2_PUNERR 0x0080 /* Punch error */
#define IO_ST2_PREERR 0x0040 /* Pre-read error */
#define IO_ST2_STKJAM 0x0020 /* Stacker area jam */
#define IO_ST2_PUNJAM 0x0010 /* Punch area jam */
#define IO_ST2_READJAM 0x0008 /* Read area jam */
#define IO_ST2_FFEED 0x0004 /* Fail to feed */
#define IO_ST2_FULL 0x0002 /* Stacker full */
#define IO_ST2_EMPTY 0x0001 /* Hopper empty */
#define IO_1728_ST2MSK (IO_ST2_INTLOCK | IO_ST2_PUNINH | IO_ST2_MANUAL | \
IO_ST2_PUNERR | IO_ST2_PREERR | IO_ST2_STKJAM | \
IO_ST2_PUNJAM | IO_ST2_READJAM | IO_ST2_FFEED | \
IO_ST2_FULL | IO_ST2_EMPTY)
/*
* 1729-A/B Card Reader
*/
#define IO_1729_A 0x00E0
#define IO_1729_B 0x00E1
#define IO_1729_IEOR 0x0008 /* Interrupt on End of Record */
#define IO_1729_DIRMSK (IO_DIR_STOP | IO_DIR_START | IO_DIR_ALARM | \
IO_1729_IEOR | IO_DIR_DATA | IO_DIR_CINT | \
IO_DIR_CCONT)
#define IO_1729_INTR (IO_DIR_ALARM | IO_1729_IEOR | IO_DIR_DATA)
#define IO_1729_EMPTY 0x0200 /* Read station empty */
#define IO_1729_EXIST 0x0100 /* Existence code */
#define IO_1729_EOR 0x0010 /* End of Record */
#define IO_1729_STMSK (IO_1729_EMPTY | IO_1729_EXIST | IO_ST_PROT | \
IO_ST_LOST | IO_ST_ALARM | IO_1729_EOR | \
IO_ST_DATA | IO_ST_INT | IO_ST_BUSY | \
IO_ST_READY)
#define IO_1729_STCINT (IO_ST_ALARM | IO_1729_EOR | IO_ST_DATA)
/*
* 1732-3 Magnetic Tape Controller
*/
#define IO_1732_WRITE 0x0080 /* Write motion */
#define IO_1732_READ 0x0100 /* Read motion */
#define IO_1732_BACKSP 0x0180 /* Backspace */
#define IO_1732_WFM 0x0280 /* Write file mark/tape mark */
#define IO_1732_SFWD 0x0300 /* Search FM/TM forward */
#define IO_1732_SBACK 0x0380 /* Search FM/TM backward */
#define IO_1732_REWL 0x0400 /* Rewind load */
#define IO_1732_MOTION 0x0780 /* Motion field mask */
#define IO_1732_LRT 0x1000 /* Select low read threshold */
#define IO_1732_DESEL 0x0800 /* Deselect tape unit */
#define IO_1732_SEL 0x0400 /* Select tape unit */
#define IO_1732_UNIT 0x0180 /* Unit mask */
#define IO_1732_ASSEM 0x0040 /* Assembly/Disassembly */
#define IO_1732_1600 0x0020 /* Select 1600 BPI */
#define IO_1732_556 0x0010 /* Select 556 BPI */
#define IO_1732_800 0x0008 /* Select 800 BPI */
#define IO_1732_BINARY 0x0004 /* Binary mode */
#define IO_1732_BCD 0x0002 /* BCD mode */
#define IO_1732_PARITY 0x0006 /* Parity mask */
#define IO_1732_CHAR 0x0001 /* Character mode */
/* 1732-A/B changes */
#define IO_1732A_REWU 0x0600 /* Rewind and unload */
#define IO_1732A_UNIT 0x0380 /* Unit mask */
#define IO_1732A_200 0x0020 /* Select 200 BPI */
#define IO_1732_DIRMSK (IO_1732_MOTION | IO_DIR_ALARM | IO_DIR_EOP | \
IO_DIR_DATA | IO_DIR_CINT | IO_DIR_CCONT)
#define IO_1732_INTR (IO_DIR_ALARM | IO_DIR_EOP | IO_DIR_DATA)
#define IO_1732_PROT 0x8000 /* Protect fault */
#define IO_1732_SPE 0x4000 /* Storage parity error */
#define IO_1732_FILL 0x2000 /* Odd byte record in */
/* assembly mode */
#define IO_1732_ACTIVE 0x1000 /* Controller active */
#define IO_1732_FMARK 0x0800 /* At file mark */
#define IO_1732_BOT 0x0400 /* At BOT */
#define IO_1732_EOT 0x0200 /* At EOT */
#define IO_1732_STMSK (IO_1732_PROT | IO_1732_SPE | IO_1732_FILL | \
IO_1732_ACTIVE | IO_1732_FMARK | IO_1732_BOT | \
IO_1732_EOT | IO_ST_PARITY | IO_ST_PROT | \
IO_ST_LOST | IO_ST_ALARM | IO_ST_EOP | \
IO_ST_DATA | IO_ST_INT | IO_ST_BUSY | \
IO_ST_READY)
#define IO_1732_STCINT (IO_DIR_ALARM | IO_DIR_EOP | IO_DIR_DATA)
#define IO_ST2_LRT 0x0200 /* Low read threshold */
#define IO_ST2_IDABORT 0x0100 /* ID abort */
#define IO_ST2_PETRANS 0x0080 /* PE capable transport */
#define IO_ST2_PELOST 0x0040 /* PE - lost data */
#define IO_ST2_PEWARN 0x0020 /* PE - error warning */
#define IO_ST2_WENABLE 0x0010 /* Write enable */
#define IO_ST2_7TRACK 0x0008 /* Seven track transport */
#define IO_ST2_1600 0x0004 /* 1600 BPI */
#define IO_ST2_800 0x0002 /* 800 BPI */
#define IO_ST2_556 0x0001 /* 556 BPI */
#define IO_1732_ST2MSK (IO_ST2_LRT | IO_ST2_IDABORT | IO_ST2_PETRANS | \
IO_ST2_PELOST | IO_ST2_PEWARN | IO_ST2_WENABLE | \
IO_ST2_7TRACK | IO_ST2_1600 | IO_ST2_800 | \
IO_ST2_556)
#define IO_1732A_ST2MSK (IO_ST2_WENABLE | IO_ST2_7TRACK | IO_ST2_800 | \
IO_ST2_556)
/*
* 1733-2 Cartridge Disk Drive Controller
*/
#define IO_1733_USC 0x0600 /* Unit select code */
#define IO_1733_USEL 0x0100 /* Unit select */
#define IO_1733_UDSEL 0x0080 /* Unit de-select */
#define IO_1733_RBINT 0x0004 /* Ready and not busy int */
#define IO_1733_DIRMSK (IO_1733_USC | IO_1733_USEL | IO_1733_UDSEL | \
IO_DIR_ALARM | IO_DIR_EOP | IO_1733_RBINT | \
IO_DIR_CINT)
#define IO_1733_INTR (IO_DIR_ALARM | IO_DIR_EOP | IO_1733_RBINT)
#define IO_1733_DSEEK 0x8000 /* Drive seek error */
#define IO_1733_SPROT 0x4000 /* Storage protect fault */
#define IO_1733_SPAR 0x2000 /* Storage parity error */
#define IO_1733_SINGLE 0x1000 /* Single density */
#define IO_1733_CSEEK 0x0800 /* Controller seek error */
#define IO_1733_ADDRERR 0x0400 /* Address error */
#define IO_1733_LOST 0x0200 /* Lost data */
#define IO_1733_CWERR 0x0100 /* Checkword error */
#define IO_1733_NOCOMP 0x0040 /* No compare */
#define IO_1733_ONCYL 0x0008 /* On cylinder */
#define IO_1733_STMSK (IO_1733_DSEEK | IO_1733_SPROT | IO_1733_SPAR | \
IO_1733_SINGLE | IO_1733_CSEEK | IO_1733_ADDRERR | \
IO_1733_LOST | IO_1733_CWERR | IO_ST_PROT | \
IO_1733_NOCOMP | IO_ST_ALARM | IO_ST_EOP | \
IO_1733_ONCYL | IO_ST_INT | IO_ST_BUSY | \
IO_ST_READY)
#define IO_1733_STCINT (IO_ST_ALARM | IO_ST_EOP)
/*
* 1738-A/B Disk Pack Controller
*/
#define IO_1738_USC 0x0200 /* Unit select code */
#define IO_1738_USEL 0x0100 /* Unit select */
#define IO_1738_REL 0x0080 /* Release */
#define IO_1738_RBINT 0x0004 /* Ready and not busy int */
#define IO_1738_DIRMSK (IO_1738_USC | IO_1738_USEL | IO_1738_REL | \
IO_DIR_ALARM | IO_DIR_EOP | IO_1738_RBINT | \
IO_DIR_CINT)
#define IO_1738_INTR (IO_DIR_ALARM | IO_DIR_EOP | IO_1738_RBINT)
#define IO_1738_SPROT 0x4000 /* Storage protect fault */
#define IO_1738_SPAR 0x2000 /* Storage parity error */
#define IO_1738_DEFECT 0x1000 /* Defective track */
#define IO_1738_ADDRERR 0x0800 /* Address error */
#define IO_1738_SKERR 0x0400 /* Seek error */
#define IO_1738_LOST 0x0200 /* Lost data */
#define IO_1738_CWERR 0x0100 /* Checkword error */
#define IO_1738_NOCOMP 0x0040 /* No compare */
#define IO_1738_ONCYL 0x0008 /* On cylinder */
#define IO_1738_STMSK (IO_1738_SPROT | IO_1738_SPAR | IO_1738_DEFECT | \
IO_1738_ADDRERR | IO_1738_SKERR | IO_1738_LOST | \
IO_1738_CWERR | IO_ST_PROT | IO_1738_NOCOMP | \
IO_ST_ALARM | IO_ST_EOP | IO_1738_ONCYL | \
IO_ST_INT | IO_ST_BUSY | IO_ST_READY)
#define IO_1738_STCINT (IO_ST_ALARM | IO_ST_EOP)
/*
* 1740 - Line Printer Controller
*/
#define IO_1740_CPRINT 0x0001 /* Clear printer */
#define IO_1740_DIRMSK (IO_DIR_ALARM | IO_DIR_EOP | IO_DIR_DATA | \
IO_DIR_CINT | IO_1740_CPRINT)
#define IO_1740_INTR (IO_DIR_ALARM | IO_DIR_EOP | IO_DIR_DATA)
#define IO_1740_L12 0x4000 /* Level 12 */
#define IO_1740_L7 0x0200 /* Level 7 */
#define IO_1740_L6 0x0100 /* Level 6 */
#define IO_1740_L5 0x0080 /* Level 5 */
#define IO_1740_L4 0x0040 /* Level 4 */
#define IO_1740_L3 0x0020 /* Level 3 */
#define IO_1740_L2 0x0010 /* Level 2 */
#define IO_1740_L1 0x0008 /* Level 1 */
#define IO_1740_DSP 0x0004 /* Double space */
#define IO_1740_SSP 0x0002 /* Single space */
#define IO_1740_PRINT 0x0001 /* Print */
#define IO_1740_DIR2MSK (IO_1740_L12 | IO_1740_L7 | IO_1740_L6 | \
IO_1740_L5 | IO_1740_L4 | IO_1740_L3 | \
IO_1740_L2 | IO_1740_L1 | IO_1740_DSP | \
IO_1740_SSP | IO_1740_PRINT)
#define IO_1740_LEVELS (IO_1740_L1 | IO_1740_L2 | IO_1740_L3 | \
IO_1740_L4 | IO_1740_L5 | IO_1740_L6 | \
IO_1740_L7 | IO_1740_L12)
#define IO_1740_MOTION (IO_1740_SSP | IO_1740_DSP | IO_1740_LEVELS)
#define IO_1740_STMSK (IO_ST_PROT | IO_ST_ALARM | IO_ST_EOP | \
IO_ST_DATA | IO_ST_INT | IO_ST_BUSY | \
IO_ST_READY)
#define IO_1740_STCINT (IO_ST_ALARM | IO_ST_EOP | IO_ST_DATA)
/*
* 1742-30/-120 Line Printer
*/
#define IO_1742_PRINT 0x0020 /* Print */
#define IO_1742_DIRMSK (IO_1742_PRINT | IO_DIR_ALARM | IO_DIR_EOP | \
IO_DIR_DATA | IO_DIR_CINT | IO_DIR_CCONT)
#define IO_1742_INTR (IO_DIR_ALARM | IO_DIR_EOP | IO_DIR_DATA)
#define IO_1742_LIMAGE 0x0100 /* Load image (-120 only) */
#define IO_1742_ERROR 0x0040 /* Device error */
#define IO_1742_STMSK (IO_1742_LIMAGE | IO_ST_PROT | IO_1742_ERROR | \
IO_ST_ALARM | IO_ST_EOP | IO_ST_DATA | \
IO_ST_INT | IO_ST_BUSY | IO_ST_READY)
#define IO_1742_STCINT (IO_ST_ALARM | IO_ST_EOP | IO_ST_DATA)
/*
* 1752-1/2/3/4 Drum
*/
#define IO_1752_DIRMSK (IO_DIR_ALARM | IO_DIR_EOP | IO_DIR_CINT | \
IO_DIR_CCONT)
#define IO_1752_INTR (IO_DIR_ALARM | IO_DIR_EOP)
#define IO_1752_OVERR 0x8000 /* Sector overrange error */
#define IO_1752_GUARDED 0x4000 /* Guarded address error */
#define IO_1752_SECCMP 0x2000 /* Sector compare */
#define IO_1752_POWERF 0x1000 /* Power failure */
#define IO_1752_TIMERR 0x0800 /* Timing track error */
#define IO_1752_GUARDE 0x0400 /* Guarded address enabled */
#define IO_1752_PROTF 0x0200 /* Protect fault */
#define IO_1752_CHECKW 0x0100 /* Checkword error */
#define IO_1752_STMSK (IO_1752_OVERR | IO_1752_GUARDED | IO_1752_SECCMP | \
IO_1752_POWERF | IO_1752_TIMERR | IO_1752_GUARDE | \
IO_1752_PROTF | IO_1752_CHECKW | IO_ST_PROT | \
IO_ST_LOST | IO_ST_ALARM | IO_ST_EOP | IO_ST_DATA | \
IO_ST_INT | IO_ST_BUSY | IO_ST_READY)
#define IO_1752_STCINT (IO_ST_ALARM | IO_ST_EOP)
/*
* 10336-1 Real-Time Clock
*/
#define IO_10336_ACK 0x0002 /* Acknowledge interrupt */
#define IO_10336_STOP 0x0040 /* Stop clock */
#define IO_10336_START 0x0080 /* Start clock */
#define IO_10336_DIS 0x4000 /* Disable interrupt */
#define IO_10336_ENA 0x8000 /* Enable interrupt */
#define IO_10336_DIRMSK (IO_10336_ENA | IO_10336_DIS | IO_10336_START | \
IO_10336_STOP | IO_10336_ACK | IO_DIR_CCONT)
#define IO_10336_INTR 0
#define IO_10336_STMSK 0
#define IO_10336_STCINT 0
/*
* M05 addressing scheme used by Cyber-18 enhanced instruction set for
* magtape access.
*/
#define M05_SAMPLE 0x0000 /* Sample (peripheral input) */
#define M05_SET 0x0008 /* Set (peripheral output) */
#define M05_DEVICE 0x0070 /* Device selection */
#define M05_CONTR 0x0380 /* Controller selection */
/*
* Timing parameters
*/
#define TT_OUT_WAIT 200 /* TTY output wait time */
#define TT_IN_XFER 60 /* TTY input transfer delay */
#define TT_IN_MOTION 500 /* TTY paper motion delay */
#define PTP_OUT_WAIT 500 /* Punch output wait time */
#define PTR_IN_WAIT 450 /* Reader input wait time */
#define LP_OUT_WAIT 15 /* Line printer output wait time */
#define LP_PRINT_WAIT 3000 /* Print line wait time */
#define LP_CC_WAIT 300 /* Control char wait time */
#define MT_MOTION_WAIT 150 /* Magtape motion delay */
#define MT_RDATA_DELAY 46 /* Read data avail. period */
#define MT_WDATA_DELAY 46 /* Write data ready period */
#define MT_200_WAIT 134 /* I/O latency (200 bpi) */
#define MT_556_WAIT 48 /* I/O latency (556 bpi) */
#define MT_800_WAIT 33 /* I/O latency (800 bpi) */
#define MT_1600_WAIT 16 /* I/O latency (1600 bpi) */
#define MT_MIN_WAIT 10 /* Minimum I/O latency */
#define MT_REC_WAIT 100 /* Magtape record latency */
#define MT_TM_WAIT 200 /* Magtape write TM latency */
#define MT_EOP_WAIT 100 /* Magtape EOP latency */
#define DP_XFER_WAIT 300 /* Control info xfer time */
#define DP_SEEK_WAIT 2000 /* Seek wait time */
#define DP_IO_WAIT 1000 /* Sector I/O wait time */
#define CD_SEEK_WAIT 1100 /* Seek wait time */
#define CD_IO_WAIT 800 /* Sector I/O wait time */
#define CD_RTZS_WAIT 200 /* Return to zero seek wait */
#define DRM_ACCESS_WAIT 5800 /* Average access latency */
#define DRM_SECTOR_WAIT 350 /* Sector I/O time */
#define DC_START_WAIT 4 /* Startup delay */
#define DC_IO_WAIT 4 /* I/O transfer delay */
#define DC_EOP_WAIT 5 /* EOP delay */
#define RDR_IN_WAIT 200 /* Card reader feed wait */
#define PUN_OUT_WAIT 200 /* Card punch feed wait */
#endif