blob: 78bd28519aead028fec7663f268541c24b35b873 [file] [log] [blame] [raw]
/* i7000_defs.h: IBM 70xx simulator definitions
Copyright (c) 2005-2016, Richard Cornwell
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
RICHARD CORNWELL 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.
Generic channel interface for all processors in IBM 700 and 7000 line.
*/
#ifndef _I7000_H_
#define _I7000_H_
#include "sim_defs.h" /* simulator defns */
/* Definitions for each supported CPU */
#ifdef I701
#define NUM_CHAN 1
#define NUM_DEVS_CDR 1
#define NUM_DEVS_CDP 1
#define NUM_DEVS_LPR 1
#define NUM_DEVS_DR 1
#define NUM_DEVS_MT 0
#define MT_CHANNEL_ZERO
#define NUM_UNITS_MT 5
#define NUM_UNITS_DR 16
#define MAXMEMSIZE 2048
#define CHARSPERWORD 6
extern t_uint64 M[];
#endif
#ifdef I7010 /* Includes 1410 and 7010 */
#define NUM_CHAN 5
#define NUM_DEVS_CDR 1
#define NUM_DEVS_CDP 1
#define STACK_DEV 1
#define NUM_DEVS_LPR 1
#define NUM_DEVS_CON 1
#define NUM_DEVS_DSK 5
#define NUM_DEVS_COM 1
#define NUM_DEVS_MT 3
#define CHAN_CHUREC 1
#define NUM_UNITS_MT 10 /* A, B */
#define MAXMEMSIZE (100000)
#define CHARSPERWORD 1
extern uint8 M[];
#endif
#ifdef I7030
/* Not yet */
#endif
#ifdef I7070 /* Includes 7070, 7074 */
#define NUM_CHAN 9
#define NUM_DEVS_CDR 1
#define NUM_DEVS_CDP 1
#define NUM_DEVS_LPR 1
#define NUM_DEVS_CON 1
#define NUM_DEVS_MT 3
#define NUM_DEVS_DSK 10
#define NUM_DEVS_HT 0
#define NUM_DEVS_COM 1
#define NUM_UNITS_HT 10
#define NUM_UNITS_MT 10 /* A, B */
#define NUM_DEVS_CHRON 1
#define MAXMEMSIZE (30000)
#define CHARSPERWORD 5
extern t_uint64 M[];
#endif
#ifdef I7080 /* Includes 702, 705-i/ii, 705-iii, 7080 */
#define NUM_CHAN 11
#define NUM_DEVS_CDR 1
#define NUM_DEVS_CDP 1
#define NUM_DEVS_LPR 1
#define NUM_DEVS_CON 1
#define NUM_DEVS_MT 4
#define NUM_DEVS_CHRON 1
#define NUM_DEVS_DR 1
#define NUM_DEVS_DSK 5
#define NUM_DEVS_HT 0
#define NUM_DEVS_COM 1
#define NUM_UNITS_MT 10
#define MT_CHANNEL_ZERO
#define NUM_UNITS_HT 10
#define MAXMEMSIZE (160000)
#define CHARSPERWORD 1
extern uint8 M[];
#endif
#ifdef I704 /* Special build for 704 only */
#define NUM_CHAN 1
#define NUM_DEVS_CDR 1
#define NUM_DEVS_CDP 1
#define NUM_DEVS_LPR 1
#define NUM_DEVS_DR 1
#define NUM_DEVS_MT 0
#define NUM_UNITS_MT 10
#define MT_CHANNEL_ZERO
#define NUM_UNITS_DR 16
#define MAXMEMSIZE (32*1024)
#define CHARSPERWORD 6
extern t_uint64 M[];
#endif
#ifdef I7040 /* Includes 7040, 7044 */
/* Not yet */
#define NUM_CHAN 8
#define NUM_DEVS_CDP 2
#define NUM_DEVS_CDR 2
#define NUM_DEVS_LPR 2
#define NUM_DEVS_MT 4
#define NUM_DEVS_CHRON 1
#define NUM_DEVS_DSK 10
#define NUM_DEVS_COM 1
#define NUM_DEVS_HD 1
#define NUM_DEVS_HT 0
#define MT_CHANNEL_ZERO
#define NUM_UNITS_HT 10
#define NUM_UNITS_MT 10 /* A, B */
#define NUM_UNITS_HD 8
#define MAXMEMSIZE (32*1024)
#define CHARSPERWORD 6
extern t_uint64 M[];
#endif
#ifdef I7090 /* Includes 704, 709, 7090, 7094 */
#define NUM_CHAN 9
#define NUM_DEVS_CDP 4
#define NUM_DEVS_CDR 4
#define NUM_DEVS_LPR 4
#define NUM_DEVS_MT 3
#define NUM_DEVS_CHRON 1
#define NUM_DEVS_DR 1
#define NUM_DEVS_DSK 10
#define NUM_DEVS_COM 1
#define NUM_DEVS_HD 1
#define NUM_DEVS_HT 0
#define MT_CHANNEL_ZERO
#define NUM_UNITS_HT 10
#define NUM_UNITS_MT 10 /* A, B */
#define NUM_UNITS_DR 16
#define NUM_UNITS_HD 8
#define MAXMEMSIZE (64*1024)
#define CHARSPERWORD 6
/*#define EXTRA_SL */ /* Remove comments to allow 4 extra sense lights */
/*#define EXTRA_SW */ /* Remove comments to allow 6 extra switchs */
extern t_uint64 M[];
#endif
/* Simulation stop codes. */
#define STOP_IONRDY 1 /* I/O dev not ready */
#define STOP_HALT 2 /* HALT */
#define STOP_IBKPT 3 /* breakpoint */
#define STOP_UUO 4 /* invalid opcode */
#define STOP_INDLIM 5 /* indirect limit */
#define STOP_XECLIM 6 /* XEC limit */
#define STOP_IOCHECK 7 /* IOCHECK */
#define STOP_MMTRP 8 /* mm in trap */
#define STOP_INVLIN 9 /* 7750 invalid line number */
#define STOP_INVMSG 10 /* 7750 invalid message */
#define STOP_NOOFREE 11 /* 7750 No free output buffers */
#define STOP_NOIFREE 12 /* 7750 No free input buffers */
#define STOP_FIELD 13 /* Field overflow */
#define STOP_ACOFL 13 /* AC Overflow - 7080 */
#define STOP_SIGN 14 /* Sign change */
#define STOP_DIV 15 /* Divide error */
#define STOP_INDEX 16 /* 7070 Alpha index */
#define STOP_NOWM 17 /* Stop if no word mark found */
#define STOP_INVADDR 18 /* Stop on invalid address */
#define STOP_INVLEN 19 /* Invalid length instruction */
#define STOP_RECCHK 19 /* Record check - 7080 */
#define STOP_PROG 20 /* Program fault */
#define STOP_PROT 21 /* Protection fault */
/* Memory */
#define MEMSIZE (cpu_unit.capac) /* actual memory size */
#define MEMMASK (MEMSIZE - 1) /* Memory bits */
/* Globally visible flags */
#define CHAN_PIO (0) /* Polled mode I/O */
#define CHAN_UREC (1) /* Unit record devices */
#define CHAN_7010 (1) /* Channel type for 7010 */
#define CHAN_7604 (2) /* 7070 tape controller */
#define CHAN_7607 (2) /* Generic 7090 channel */
#define CHAN_7621 (2) /* 7080 tape controller */
#define CHAN_7904 (3) /* 7040 generic channel */
#define CHAN_7907 (3) /* Disk/Hyper/7750 channel for 7070 */
#define CHAN_7908 (3) /* Disk/Hyper/7750 channel for 7080 */
#define CHAN_7909 (3) /* Disk/Hyper/7750 channel for 7090 */
#define CHAN_7289 (4) /* Special CTSS device for 7090 */
#define CHAN_754 (4) /* 705 tape controller */
#define CH_TYP_PIO 01 /* Can be on PIO channel */
#define CH_TYP_UREC 02 /* Can be on Unit record channel */
#define CH_TYP_76XX 04 /* Can be on 76xx Channel */
#define CH_TYP_79XX 010 /* Can be on a 79xx channel */
#define CH_TYP_SPEC 020 /* Special channel */
#define CH_TYP_754 020 /* 705 tape controller */
/* Device information block */
struct dib {
uint8 ctype; /* Type of channel */
uint8 upc; /* Units per channel */
uint16 addr; /* Unit address */
uint16 mask; /* Channel mask type */
uint32 (*cmd)(UNIT *up, uint16 cmd, uint16 dev);/* Issue command. */
void (*ini)(UNIT *up, t_bool f);
};
typedef struct dib DIB;
/* Debuging controls */
#define DEBUG_CHAN 0x0000001 /* Show channel fetchs */
#define DEBUG_TRAP 0x0000002 /* Show CPU Traps */
#define DEBUG_CMD 0x0000004 /* Show device commands */
#define DEBUG_DATA 0x0000008 /* Show data transfers */
#define DEBUG_DETAIL 0x0000020 /* Show details */
#define DEBUG_EXP 0x0000040 /* Show error conditions */
#define DEBUG_SNS 0x0000080 /* Shows sense data for 7909 devs */
#define DEBUG_CTSS 0x0000100 /* Shows CTSS specail instructions */
#define DEBUG_PRIO 0x0000100 /* Debug Priority mode on 7010 */
#define DEBUG_PROT 0x0000200 /* Protection traps */
extern DEBTAB dev_debug[];
extern DEBTAB crd_debug[];
/* Channels */
#define CHAN_CHPIO 0 /* Puesdo access for 704 */
#ifndef CHAN_CHUREC
#define CHAN_CHUREC 0 /* Unit record devices */
#endif
#define CHAN_A 1
#define CHAN_B 2
#define CHAN_C 3
#define CHAN_D 4
#define CHAN_E 5
#define CHAN_F 6
#define CHAN_G 7
#define CHAN_H 8
#define UNIT_V_SELECT (UNIT_V_UF + 9) /* 9 */
#define UNIT_SELECT (1 << UNIT_V_SELECT)
#define UNIT_V_CHAN (UNIT_V_SELECT + 1) /* 10 */
#define UNIT_CHAN (017 << UNIT_V_CHAN) /* 10-14 */
#define UNIT_S_CHAN(x) (UNIT_CHAN & ((x) << UNIT_V_CHAN))
#define UNIT_G_CHAN(x) ((UNIT_CHAN & (x)) >> UNIT_V_CHAN)
#define UNIT_V_LOCAL (UNIT_V_UF + 0) /* 0 */
#define DEV_BUF_NUM(x) (((x) & 07) << DEV_V_UF)
#define GET_DEV_BUF(x) (((x) >> DEV_V_UF) & 07)
#define UNIT_V_MODE (UNIT_V_LOCAL + 1) /* 1 */
/* Specific to channel devices */
#define UNIT_V_MODEL (UNIT_V_UF + 0)
#define CHAN_MODEL (07 << UNIT_V_MODEL)
#define CHAN_S_TYPE(x) (CHAN_MODEL & ((x) << UNIT_V_MODEL))
#define CHAN_G_TYPE(x) ((CHAN_MODEL & (x)) >> UNIT_V_MODEL)
#define UNIT_V_AUTO (UNIT_V_UF + 4)
#define CHAN_AUTO (1 << UNIT_V_AUTO)
#define UNIT_V_SET (UNIT_V_UF + 5)
#define CHAN_SET (1 << UNIT_V_SET)
extern t_value assembly[NUM_CHAN]; /* Assembly register */
/* I/O routine functions */
/* Channel half of controls */
/* Channel status */
extern uint32 chan_flags[NUM_CHAN]; /* Channel flags */
extern const char *chname[11]; /* Channel names */
extern int num_devs[NUM_CHAN]; /* Number devices per channel*/
extern uint8 lpr_chan9[NUM_CHAN];
#ifdef I7010
extern uint8 lpr_chan12[NUM_CHAN];
#endif
/* Sense information for 7909 channels */
#define SNS_IOCHECK 0x00000400 /* IO Check */
#define SNS_SEQCHECK 0x00000200 /* Sequence check */
#define SNS_UEND 0x00000100 /* Unusual end */
#define SNS_ATTN1 0x00000080 /* Attention 1 */
#define SNS_ATTN2 0x00000040 /* Attention 2 */
#define SNS_ADCHECK 0x00000020 /* Adaptor check */
#define CTL_PREAD 0x00000010 /* Prepare to read */
#define CTL_PWRITE 0x00000008 /* Prepare to write */
#define CTL_READ 0x00000004 /* Read Status */
#define CTL_WRITE 0x00000002 /* Write Status */
#define SNS_IRQ 0x00000001 /* IRQ */
#define SNS_MASK 0x000007fe /* Mask of sense codes */
#define SNS_IRQS 0x000007e0
#define SNS_IMSK 0x00000620 /* Non maskable irqs */
#define CTL_END 0x00000800 /* Transfer is done */
#define CTL_INHB 0x00001000 /* Interupts inhibited */
#define CTL_SEL 0x00002000 /* Device select */
#define CTL_SNS 0x00004000 /* Sense transfer */
#define CTL_CNTL 0x00008000 /* Control transfer */
/* Channel status infomation */
#define STA_PEND 0x00010000 /* Pending LCH instruct */
#define STA_ACTIVE 0x00020000 /* Channel active */
#define STA_WAIT 0x00040000 /* Channel waiting for EOR */
#define STA_START 0x00080000 /* Channel was started, but not reset */
#define STA_TWAIT 0x00100000 /* Channel waiting on IORT */
/* Device error controls */
#define CHS_EOT 0x00200000 /* Channel at EOT */
#define CHS_BOT 0x00400000 /* Channel at BOT */
#define CHS_EOF 0x00800000 /* Channel at EOF */
#define CHS_ERR 0x01000000 /* Channel has Error */
#define CHS_ATTN 0x02000000 /* Channel attention*/
/* Device half of controls */
#define DEV_SEL 0x04000000 /* Channel selected */
#define DEV_WRITE 0x08000000 /* Device is writing to memory */
#define DEV_FULL 0x10000000 /* Buffer full */
#define DEV_REOR 0x20000000 /* Device at End of Record */
#define DEV_DISCO 0x40000000 /* Channel is done with device */
#define DEV_WEOR 0x80000000 /* Channel wants EOR written */
/* Device status information stored in u5 */
#define URCSTA_EOF 0001 /* Hit end of file */
#define URCSTA_ERR 0002 /* Error reading record */
#define URCSTA_CARD 0004 /* Unit has card in buffer */
#define URCSTA_FULL 0004 /* Unit has full buffer */
#define URCSTA_BUSY 0010 /* Device is busy */
#define URCSTA_WDISCO 0020 /* Device is wait for disconnect */
#define URCSTA_READ 0040 /* Device is reading channel */
#define URCSTA_WRITE 0100 /* Device is reading channel */
#define URCSTA_INPUT 0200 /* Console fill buffer from keyboard */
#define URCSTA_ON 0200 /* 7090 Unit is on */
#define URCSTA_IDLE 0400 /* 7090 Unit is idle */
#define URCSTA_WMKS 0400 /* Printer print WM as 1 */
#define URCSTA_SKIPAFT 01000 /* Skip to line after printing next line */
#define URCSTA_NOXFER 01000 /* Don't set up to transfer after feed */
#define URCSTA_LOAD 01000 /* Load flag for 7070 card reader */
#define URCSTA_CMD 01000 /* 7090 Command recieved */
/* Boot from given device */
t_stat chan_boot(int32 unit_num, DEVICE *dptr);
/* Sets the device onto a given channel */
t_stat chan_set_devs(DEVICE *dptr);
t_stat set_chan(UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat set_cchan(UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat print_chan(FILE *st, UNIT *uptr, int32 v, CONST void *desc);
t_stat get_chan(FILE *st, UNIT *uptr, int32 v, CONST void *desc);
t_stat chan9_set_select(UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat chan9_get_select(FILE *st, UNIT *uptr, int32 v, CONST void *desc);
/* Check channel for error */
int chan_error(int chan);
/* Check channel for flags, clear flags if set */
int chan_stat(int chan, uint32 flag);
/* Check channel for flags set */
int chan_test(int chan, uint32 flag);
/* Check channel is active */
int chan_active(int chan);
/* Check channel is selected */
int chan_select(int chan);
/* Channel data handling char at a time */
int chan_write_char(int chan, uint8 *data, int flags);
int chan_read_char(int chan, uint8 *data, int flags);
/* Flag end of file on channel */
void chan_set_eof(int chan);
/* Flag error on channel */
void chan_set_error(int chan);
/* Flag attention on channel */
void chan_set_attn(int chan);
/* Start a selection command on channel */
void chan_set_sel(int chan, int need);
void chan_clear_status(int chan);
/* Set or clear a flag */
void chan_set(int chan, uint32 flag);
void chan_clear(int chan, uint32 flag);
/* Channel 7909 special error posting */
void chan9_clear_error(int chan, int sel);
void chan9_set_attn(int chan, int sel);
void chan9_set_error(int chan, uint32 mask);
void chan_proc();
#ifdef I7010
/* Sets the device that will interrupt on the channel. */
t_stat set_urec(UNIT * uptr, int32 val, CONST char *cptr, void *desc);
t_stat get_urec(FILE * st, UNIT * uptr, int32 v, CONST void *desc);
/* Execute the next channel instruction. */
void chan_set_attn_urec(int chan, uint16 addr);
void chan_set_attn_inq(int chan);
void chan_clear_attn_inq(int chan);
#endif
#ifdef I7070
void chan_set_attn_a(int chan);
void chan_set_attn_b(int chan);
void chan_set_attn_inq(int chan);
void chan_clear_attn_inq(int chan);
void chan_set_load_mode(int chan);
#endif
#ifdef I7080
void chan_set_attn_inq(int chan);
void chan_clear_attn_inq(int chan);
#endif
/* Convert micro seconds to click ticks */
#define us_to_ticks(us) (((us) * 10) / cycle_time)
/* Returns from chan_read/chan_write */
#define DATA_OK 0 /* Data transfered ok */
#define TIME_ERROR 1 /* Channel did not transfer last operation */
#define END_RECORD 2 /* End of record */
/* Returns from device commands */
#define SCPE_BUSY (1) /* Device is active */
#define SCPE_NODEV (2) /* No device exists */
/* I/O Command codes */
#define IO_RDS 1 /* Read record */
#define IO_BSR 2 /* Backspace one record */
#define IO_BSF 3 /* Backspace one file */
#define IO_WRS 4 /* Write one record */
#define IO_WEF 5 /* Write eof */
#define IO_REW 6 /* Rewind */
#define IO_DRS 7 /* Set unit offline */
#define IO_SDL 8 /* Set density low */
#define IO_SDH 9 /* Set density high */
#define IO_RUN 10 /* Rewind and unload unit */
#define IO_TRS 11 /* Check it unit ready */
#define IO_CTL 12 /* Io control device specific */
#define IO_RDB 13 /* Read backwards */
#define IO_SKR 14 /* Skip record forward */
#define IO_ERG 15 /* Erase next records from tape */
/* Global device definitions */
#ifdef CPANEL
extern DEVICE cp_dev;
#endif
#ifdef NUM_DEVS_TP
extern DIB tp_dib;
extern uint32 tp_cmd(UNIT *, uint16, uint16);
extern DEVICE tpa_dev;
#endif
#ifdef NUM_DEVS_CDR
extern DIB cdr_dib;
extern DEVICE cdr_dev;
extern uint32 cdr_cmd(UNIT *, uint16, uint16);
#endif
#ifdef NUM_DEVS_CDP
extern DIB cdp_dib;
extern DEVICE cdp_dev;
extern uint32 cdp_cmd(UNIT *, uint16, uint16);
extern void cdp_ini(UNIT *, t_bool);
#endif
#ifdef STACK_DEV
extern DEVICE stack_dev;
#endif
#ifdef NUM_DEVS_LPR
extern DIB lpr_dib;
extern DEVICE lpr_dev;
extern uint32 lpr_cmd(UNIT *, uint16, uint16);
extern void lpr_ini(UNIT *, t_bool);
#endif
#ifdef NUM_DEVS_CON
extern DIB con_dib;
extern DEVICE con_dev;
extern uint32 con_cmd(UNIT *, uint16, uint16);
extern void con_ini(UNIT *, t_bool);
#endif
#ifdef NUM_DEVS_CHRON
extern DIB chron_dib;
extern DEVICE chron_dev;
extern uint32 chron_cmd(UNIT *, uint16, uint16);
#endif
#ifdef NUM_DEVS_COM
extern uint32 com_cmd(UNIT *, uint16, uint16);
extern DIB com_dib;
extern DEVICE com_dev;
extern DEVICE coml_dev;
#endif
#ifdef NUM_DEVS_DR
extern uint32 drm_cmd(UNIT *, uint16, uint16);
extern void drm_ini(UNIT *, t_bool);
extern DIB drm_dib;
extern DEVICE drm_dev;
#endif
#ifdef NUM_DEVS_DSK
extern uint32 dsk_cmd(UNIT *, uint16, uint16);
extern void dsk_ini(UNIT *, t_bool);
extern DIB dsk_dib;
extern DEVICE dsk_dev;
#endif
#ifdef NUM_DEVS_HD
extern uint32 hsdrm_cmd(UNIT *, uint16, uint16);
extern void hsdrm_ini(UNIT *, t_bool);
extern DIB hsdrm_dib;
extern DEVICE hsdrm_dev;
#endif
#ifdef NUM_DEVS_HT
extern DIB ht_dib;
extern uint32 ht_cmd(UNIT *, uint16, uint16);
extern DEVICE hta_dev;
#if NUM_DEVS_HT > 1
extern DEVICE htb_dev;
#endif
#endif
#if (NUM_DEVS_MT > 0) || defined(MT_CHANNEL_ZERO)
extern DIB mt_dib;
extern uint32 mt_cmd(UNIT *, uint16, uint16);
extern void mt_ini(UNIT *, t_bool);
#ifdef MT_CHANNEL_ZERO
extern DEVICE mtz_dev;
#endif
#if NUM_DEVS_MT > 0
extern DEVICE mta_dev;
#if NUM_DEVS_MT > 1
extern DEVICE mtb_dev;
#if NUM_DEVS_MT > 2
extern DEVICE mtc_dev;
#if NUM_DEVS_MT > 3
extern DEVICE mtd_dev;
#if NUM_DEVS_MT > 4
extern DEVICE mte_dev;
#if NUM_DEVS_MT > 5
extern DEVICE mtf_dev;
#endif /* 5 */
#endif /* 4 */
#endif /* 3 */
#endif /* 2 */
#endif /* 1 */
#endif /* 0 */
#endif /* NUM_DEVS_MT */
/* Character codes */
#define CHR_ABLANK 000
#define CHR_MARK CHR_ABLANK
#define CHR_1 001
#define CHR_2 002
#define CHR_3 003
#define CHR_4 004
#define CHR_5 005
#define CHR_6 006
#define CHR_7 007
#define CHR_8 010
#define CHR_9 011
#define CHR_0 012
#define CHR_EQ 013
#define CHR_QUOT 014 /* Also @ */
#define CHR_COL 015
#define CHR_GT 016
#define CHR_TRM 017
#define CHR_BLANK 020
#define CHR_SLSH 021
#define CHR_S 022
#define CHR_T 023
#define CHR_U 024
#define CHR_V 025
#define CHR_W 026
#define CHR_X 027
#define CHR_Y 030
#define CHR_Z 031
#define CHR_RM 032
#define CHR_COM 033
#define CHR_RPARN 034 /* Also % */
#define CHR_WM 035
#define CHR_BSLSH 036
#define CHR_UND 037
#define CHR_MINUS 040
#define CHR_J 041
#define CHR_K 042
#define CHR_L 043
#define CHR_M 044
#define CHR_N 045
#define CHR_O 046
#define CHR_P 047
#define CHR_Q 050
#define CHR_R 051
#define CHR_EXPL 052
#define CHR_DOL 053
#define CHR_STAR 054
#define CHR_LBRK 055
#define CHR_SEMI 056
#define CHR_CART 057
#define CHR_PLUS 060
#define CHR_A 061
#define CHR_B 062
#define CHR_C 063
#define CHR_D 064
#define CHR_E 065
#define CHR_F 066
#define CHR_G 067
#define CHR_H 070
#define CHR_I 071
#define CHR_QUEST 072
#define CHR_DOT 073
#define CHR_LPARN 074 /* Also Square */
#define CHR_RBRAK 075
#define CHR_LESS 076
#define CHR_GM 077
/* Generic devices common to all */
extern DEVICE cpu_dev;
extern UNIT cpu_unit;
extern DEVICE chan_dev;
extern UNIT chan_unit[NUM_CHAN];
extern REG cpu_reg[];
extern int cycle_time;
extern const char mem_to_ascii[64];
extern const char *cpu_description(DEVICE *dptr);
extern const char *chan_type_name[];
extern void help_set_chan_type(FILE *st, DEVICE *dptr, const char *name);
#endif /* _I7000_H_ */