1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-13 15:27:04 +00:00
rcornwell.sims/ICL1900/icl1900_defs.h
2020-10-12 23:27:46 -04:00

318 lines
14 KiB
C
Executable File

/* icl1900_defs.h: ICL1900 simulator definitions
Copyright (c) 2017, 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.
*/
#ifndef _ICL1900_H_
#define _ICL1900_H_
#include "sim_defs.h" /* simulator defns */
/* Definitions for each supported CPU */
#define NUM_DEVS_PTR 2
#define NUM_DEVS_PTP 2
#define NUM_DEVS_CDR 1
#define NUM_DEVS_CDP 1
#define NUM_DEVS_LPR 1
#define NUM_DEVS_CON 0
#define NUM_DEVS_MT 4 /* 1971 SI tape drives */
#define NUM_DEVS_MTA 8 /* 1974 NSI tape drives */
#define NUM_DEVS_EDS8 8
#define NUM_DEVS_EDS30 0
#define NUM_DEVS_DTC 0
#define MAXMEMSIZE (4096 * 1024)
extern uint32 M[]; /* Main Memory */
extern uint32 XR[8];
/* Memory */
#define MEMSIZE (cpu_unit[0].capac) /* actual memory size */
#define MEMMASK (MEMSIZE - 1) /* Memory bits */
/* 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 0x0000010 /* Show details */
#define DEBUG_EXP 0x0000020 /* Show exeption conditions */
#define DEBUG_STATUS 0x0000040 /* Show status conditions */
extern DEBTAB dev_debug[];
extern DEBTAB card_debug[];
extern uint8 hol_to_mem[4096];
extern uint8 mem_to_ascii[64];
extern uint16 mem_to_hol[64];
extern uint32 SR64;
extern uint32 SR65;
extern uint32 RC;
extern uint16 cpu_flags;
extern uint8 io_flags;
extern uint8 loading;
/* Returns from device commands */
#define SCPE_BUSY (1) /* Device is active */
#define SCPE_NODEV (2) /* No device exists */
typedef struct _cpumod
{
CONST char *name;
uint8 mod_num; /* Model number */
uint16 cpu_flags; /* Cpu option flags */
uint8 io_flags; /* I/O type option. */
uint16 ticker; /* Number of ticker events per second */
} CPUMOD;
/* Definitions for cpu flags */
#define CPU_TYPE (cpu_flags & 7)
#define TYPE_A1 0000
#define TYPE_A2 0001
#define TYPE_B1 0002
#define TYPE_B2 0003
#define TYPE_C1 0004
#define TYPE_C2 0005
#define FLOAT_STD 0010 /* Floating point standard */
#define FLOAT_OPT 0020 /* Floating point optional */
#define FLOAT 0040 /* Floating point installed */
#define STD_FLOAT 0100 /* Std Floating point only */
#define NORM_OP 0001
#define MULT_OPT 0200 /* Multiply/Divide optional */
#define MULT 0400 /* Multiply/Divide installed */
#define SV 01000 /* Stevenage Machine */
#define WG 00000 /* West Gorton Machine */
#define SL_FLOAT 02000 /* Store and load floating point registers */
/* Definitions for io_flags */
#define EXT_IO 0001 /* I/O channels at 256 and above */
/* Symbol tables */
typedef struct _opcode
{
CONST char *name;
uint8 type;
}
t_opcode;
#define OP_LDX 0000 /* Load to X */
#define OP_ADX 0001 /* Add to X */
#define OP_NGX 0002 /* Negative to X */
#define OP_SBX 0003 /* Subtract from X */
#define OP_LDXC 0004 /* Load into X with carry */
#define OP_ADXC 0005 /* Add to X with carry */
#define OP_NGXC 0006 /* Negative to X with carry */
#define OP_SBXC 0007 /* Subtract from X with carry */
#define OP_STO 0010 /* Store contents of X */
#define OP_ADS 0011 /* Add X to store */
#define OP_NGS 0012 /* Negative into Store */
#define OP_SBS 0013 /* Subtract from store */
#define OP_STOC 0014 /* Store contents of X with carry */
#define OP_ADSC 0015 /* Add X to store with carry */
#define OP_NGSC 0016 /* Negative into Store with carry */
#define OP_SBSC 0017 /* Subtract from store with carry */
#define OP_ANDX 0020 /* Logical AND into X */
#define OP_ORX 0021 /* Logical OR into X */
#define OP_ERX 0022 /* Logical XOR into X */
#define OP_OBEY 0023 /* Obey instruction at N */
#define OP_LDCH 0024 /* Load Character to X */
#define OP_LDEX 0025 /* Load Exponent */
#define OP_TXU 0026 /* Test X unequal */
#define OP_TXL 0027 /* Test X Less */
#define OP_ANDS 0030 /* Logical AND into store */
#define OP_ORS 0031 /* Logical OR into store */
#define OP_ERS 0032 /* Logical XOR into store */
#define OP_STOZ 0033 /* Store Zero */
#define OP_DCH 0034 /* Deposit Character to X */
#define OP_DEX 0035 /* Deposit Exponent */
#define OP_DSA 0036 /* Deposit Short Address */
#define OP_DLA 0037 /* Deposit Long Address */
#define OP_MPY 0040 /* Multiply */
#define OP_MPR 0041 /* Multiply and Round */
#define OP_MPA 0042 /* Multiply and Accumulate */
#define OP_CDB 0043 /* Convert Decimal to Binary */
#define OP_DVD 0044 /* Unrounded Double Length Divide */
#define OP_DVR 0045 /* Rounded Double Length Divide */
#define OP_DVS 0046 /* Single Length Divide */
#define OP_CBD 0047 /* Convert Binary to Decimal */
#define OP_BZE 0050 /* Branch if X is Zero */
#define OP_BZE1 0051
#define OP_BNZ 0052 /* Branch if X is not Zero */
#define OP_BNZ1 0053
#define OP_BPZ 0054 /* Branch if X is Positive or zero */
#define OP_BPZ1 0055
#define OP_BNG 0056 /* Branch if X is Positive or zero */
#define OP_BNG1 0057
#define OP_BUX 0060 /* Branch on Unit indexing */
#define OP_BUX1 0061
#define OP_BDX 0062 /* Branch on Double Indexing */
#define OP_BDX1 0063
#define OP_BCHX 0064 /* Branch on Character Indexing */
#define OP_BCHX1 0065
#define OP_BCT 0066 /* Branch on Count - BC */
#define OP_BCT1 0067
#define OP_CALL 0070 /* Call Subroutine */
#define OP_CALL1 0071
#define OP_EXIT 0072 /* Exit Subroutine */
#define OP_EXIT1 0073
#define OP_BRN 0074 /* Branch unconditional */
#define OP_BRN1 0075
#define OP_BFP 0076 /* Branch state of floating point accumulator */
#define OP_BFP1 0077
#define OP_LDN 0100 /* Load direct to X */
#define OP_ADN 0101 /* Add direct to X */
#define OP_NGN 0102 /* Negative direct to X */
#define OP_SBN 0103 /* Subtract direct from X */
#define OP_LDNC 0104 /* Load direct into X with carry */
#define OP_ADNC 0105 /* Add direct to X with carry */
#define OP_NGNC 0106 /* Negative direct to X with carry */
#define OP_SBNC 0107 /* Subtract direct from X with carry */
#define OP_SLL 0110 /* Shift Left */
#define OP_SLD 0111 /* Shift Left Double */
#define OP_SRL 0112 /* Shift Right */
#define OP_SRD 0113 /* Shift Right Double*/
#define OP_NORM 0114 /* Nomarlize Single -2 +FP */
#define OP_NORMD 0115 /* Normalize Double -2 +FP */
#define OP_MVCH 0116 /* Move Characters - BC */
#define OP_SMO 0117 /* Supplementary Modifier - BC */
#define OP_ANDN 0120 /* Logical AND direct into X */
#define OP_ORN 0121 /* Logical OR direct into X */
#define OP_ERN 0122 /* Logical XOR direct into X */
#define OP_NULL 0123 /* No Operation */
#define OP_LDCT 0124 /* Load Count */
#define OP_MODE 0125 /* Set Mode */
#define OP_MOVE 0126 /* Copy N words */
#define OP_SUM 0127 /* Sum N words */
#define OP_FLOAT 0130 /* Convert Fixed to Float +FP */
#define OP_FIX 0131 /* Convert Float to Fixed +FP */
#define OP_FAD 0132 /* Floating Point Add +FP */
#define OP_FSB 0133 /* Floating Point Subtract +FP */
#define OP_FMPY 0134 /* Floating Point Multiply +FP */
#define OP_FDVD 0135 /* Floating Point Divide +FP */
#define OP_LFP 0136 /* Load Floating Point +FP */
#define OP_SFP 0137 /* Store Floating Point +FP */
#define FMASK 077777777
#define CMASK 060000000
#define BM1 0100000000
#define B0 040000000
#define B1 020000000
#define B2 010000000
#define B3 004000000
#define B4 002000000
#define B5 001000000
#define B8 000100000
#define B15 000001000
#define B16 000000400
#define B17 000000200
#define M9 000000777
#define M12 000007777
#define M15 000077777
#define M22 017777777
#define M23 037777777
#define CNTMSK 077700000
#define CHCMSK 017700000
#define NMASK 037777400
#define MMASK 037777000
#define UNIT_V_ADDR (UNIT_V_UF + 9)
#define UNIT_M_ADDR (077 << UNIT_V_ADDR)
#define GET_UADDR(x) ((UNIT_M_ADDR & (x)) >> UNIT_V_ADDR)
#define UNIT_ADDR(x) (UNIT_M_ADDR & ((x) << UNIT_V_ADDR))
/* DIB type flags */
#define CHAR_DEV 0 /* Device transfers via characters */
#define WORD_DEV 1 /* Device transfers via words */
#define SPEC_HES 2 /* Special transfer */
#define LONG_BLK 4 /* Long block device */
#define MULT_DEV 8 /* Channel in device flags */
#define BLK_DEV 16 /* First in group of devices. */
struct icl_dib {
uint8 type; /* Type of device */
void (*si_cmd)(uint32 dev, uint32 cmd, uint32 *resp); /* Start io on device */
void (*nsi_cmd)(uint32 dev, uint32 cmd); /* Start non-standard I/O on device */
void (*nsi_status)(uint32 dev, uint32 *resp); /* Non-Standard I/O status */
};
typedef struct icl_dib DIB;
/* Common commands */
#define SEND_Q 020 /* Send status Q */
#define SEND_P 024 /* Send status P */
#define SEND_P2 025 /* Send status P2 */
#define DISCO 036 /* Disconnect device */
/* General response code */
#define DEV_INOP 000 /* Device inoperable */
#define DEV_REJT 003 /* Command rejected */
#define DEV_ACCP 005 /* Command accepted */
/* P Staus bits */
#define DEV_OPT 001 /* Device operational */
#define DEV_WARN 002 /* Device has warning */
#define DEV_ERROR 004 /* Device has error pending */
/* Q Status bits */
#define DEV_TERM 001 /* Device terminated */
#define DEV_P_STAT 040 /* No P status */
/* Channel controls */
extern t_stat chan_set_devs();
extern t_stat set_chan(UNIT *uptr, int32 val, CONST char *cptr, void *desc);
extern t_stat get_chan(FILE *st, UNIT *uptr, int32 v, CONST void *desc);
/* Hesitation operations */
extern void chan_send_cmd(int dev, uint32 cmd, uint32 *resp);
extern void chan_nsi_cmd(int dev, uint32 cmd);
extern void chan_nsi_status(int dev, uint32 *resp);
extern int chan_input_char(int dev, uint8 *data, int eor);
extern int chan_output_char(int dev, uint8 *data, int eor);
extern int chan_input_word(int dev, uint32 *data, int eor);
extern int chan_output_word(int dev, uint32 *data, int eor);
extern void chan_set_done(int dev);
extern void chan_clr_done(int dev);
/* Generic devices common to all */
extern DEVICE cpu_dev;
extern UNIT cpu_unit[];
extern REG cpu_reg[];
/* Global device definitions */
extern DIB ctyi_dib;
extern DIB ctyo_dib;
extern DEVICE cty_dev;
extern DEVICE ptr_dev;
extern DEVICE ptp_dev;
extern DEVICE cdr_dev;
extern DEVICE cdp_dev;
extern DEVICE lpr_dev;
extern DEVICE dtc_dev;
extern DEVICE eds8_dev;
extern DEVICE eds30_dev;
extern DEVICE mt_dev;
extern DEVICE mta_dev;
extern uint8 parity_table[64];
#endif /* _ICL1900_H_ */