Because some key files have changed, V3.0 should be unzipped to a clean directory. 1. New Features in 3.0-0 1.1 SCP and Libraries - Added ASSIGN/DEASSIGN (logical name) commands. - Changed RESTORE to unconditionally detach files. - Added E11 and TPC format support to magtape library. - Fixed bug in SHOW CONNECTIONS. - Added USE_ADDR64 support 1.2 All magtapes - Magtapes support SIMH format, E11 format, and TPC format (read only). - SET <tape_unit> FORMAT=format sets the specified tape unit's format. - SHOW <tape_unit> FORMAT displays the specified tape unit's format. - Tape format can also be set as part of the ATTACH command, using the -F switch. 1.3 VAX - VAX can be compiled without USE_INT64. - If compiled with USE_INT64 and USE_ADDR64, RQ and TQ controllers support files > 2GB. - VAX ROM has speed control (SET ROM DELAY/NODELAY). 2. Bugs Fixed in 3.01-0 2.1 VAX - Fixed CVTfi bug: integer overflow not set if exponent out of range - Fixed EMODx bugs: o First and second operands reversed o Separated fraction received wrong exponent o Overflow calculation on separated integer incorrect o Fraction not set to zero if exponent out of range - Fixed interval timer and ROM access to pass power-up self-test even on very fast host processors (fixes from Mark Pizzolato). 2.2 1401 - Fixed mnemonic, instruction lengths, and reverse scan length check bug for MCS. - Fixed MCE bug, BS off by 1 if zero suppress. - Fixed chaining bug, D lost if return to SCP. - Fixed H branch, branch occurs after continue. - Added check for invalid 8 character MCW, LCA. - Fixed magtape load-mode end of record response. 2.3 Nova - Fixed DSK variable size interaction with restore. 2.4 PDP-1 - Fixed DT variable size interaction with restore. 2.5 PDP-11 - Fixed DT variable size interaction with restore. - Fixed bug in MMR1 update (found by Tim Stark). - Added XQ features and fixed bugs: o Corrected XQ interrupts on IE state transition (code by Tom Evans). o Added XQ interrupt clear on soft reset. o Removed XQ interrupt when setting XL or RL (multiple people). o Added SET/SHOW XQ STATS. o Added SHOW XQ FILTERS. o Added ability to split received packet into multiple buffers. o Added explicit runt and giant packet processing. 2.6 PDP-18B - Fixed DT, RF variable size interaction with restore. - Fixed MT bug in MTTR. 2.7 PDP-8 - Fixed DT, DF, RF, RX variable size interaction with restore. - Fixed MT bug in SKTR. 2.8 HP2100 - Fixed bug in DP (13210A controller only), DQ read status. - Fixed bug in DP, DQ seek complete. 2.9 GRI - Fixed bug in SC queue pointer management. 3. New Features in 3.0 vs prior releases N/A 4. Bugs Fixed in 3.0 vs prior releases N/A 5. General Notes WARNING: The RESTORE command has changed. RESTORE will now detach an attached file on a unit, if that unit did not have an attached file in the saved configuration. This is required to assure that the unit flags and the file state are consistent. WARNING: The compilation scheme for the PDP-10, PDP-11, and VAX has changed. Use one of the supplied build files, or read the documentation carefully, before compiling any of these simulators.
221 lines
9 KiB
C
221 lines
9 KiB
C
/* i1620_defs.h: IBM 1620 simulator definitions
|
|
|
|
Copyright (c) 2002-2003, 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
|
|
ROBERT M SUPNIK 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 Robert M Supnik shall not
|
|
be used in advertising or otherwise to promote the sale, use or other dealings
|
|
in this Software without prior written authorization from Robert M Supnik.
|
|
|
|
This simulator is based on the 1620 simulator written by Geoff Kuenning.
|
|
I am grateful to Al Kossow, the Computer History Museum, and the IBM Corporate
|
|
Archives for their help in gathering documentation about the IBM 1620.
|
|
|
|
18-Oct-02 RMS Fixed bug in ADDR_S macro (found by Hans Pufal)
|
|
*/
|
|
|
|
#include "sim_defs.h" /* simulator defns */
|
|
|
|
/* Simulator stop codes */
|
|
|
|
#define STOP_HALT 1 /* HALT */
|
|
#define STOP_IBKPT 2 /* breakpoint */
|
|
#define STOP_INVINS 3 /* invalid instruction */
|
|
#define STOP_INVDIG 4 /* invalid digit */
|
|
#define STOP_INVCHR 5 /* invalid char */
|
|
#define STOP_INVIND 6 /* invalid indicator */
|
|
#define STOP_INVPDG 7 /* invalid P addr digit */
|
|
#define STOP_INVPAD 8 /* invalid P addr */
|
|
#define STOP_INVPIA 9 /* invalid P indir addr */
|
|
#define STOP_INVQDG 10 /* invalid Q addr digits */
|
|
#define STOP_INVQAD 11 /* invalid Q addr */
|
|
#define STOP_INVQIA 12 /* invalid Q indir addr */
|
|
#define STOP_INVIO 13 /* invalid IO address */
|
|
#define STOP_INVRTN 14 /* invalid return */
|
|
#define STOP_INVFNC 15 /* invalid function */
|
|
#define STOP_INVIAD 16 /* invalid instr addr */
|
|
#define STOP_INVSEL 17 /* invalid select */
|
|
#define STOP_INVIDX 18 /* invalid index instr */
|
|
#define STOP_INVEAD 19 /* invalid even addr */
|
|
#define STOP_INVDCF 20 /* invalid DCF addr */
|
|
#define STOP_INVDRV 21 /* invalid disk drive */
|
|
#define STOP_INVDSC 22 /* invalid disk sector */
|
|
#define STOP_INVDCN 23 /* invalid disk count */
|
|
#define STOP_INVDBA 24 /* invalid disk buf addr */
|
|
#define STOP_DACERR 25 /* disk addr comp err */
|
|
#define STOP_DWCERR 26 /* disk wr check err */
|
|
#define STOP_CYOERR 27 /* cylinder ovflo err */
|
|
#define STOP_WRLERR 28 /* wrong rec lnt err */
|
|
#define STOP_CCT 29 /* runaway CCT */
|
|
#define STOP_FWRAP 30 /* field wrap */
|
|
#define STOP_RWRAP 31 /* record wrap */
|
|
#define STOP_NOCD 32 /* no card in reader */
|
|
#define STOP_OVERFL 33 /* overflow */
|
|
#define STOP_EXPCHK 34 /* exponent error */
|
|
#define STOP_WRADIS 35 /* write addr disabled */
|
|
#define STOP_FPLNT 36 /* invalid fp length */
|
|
#define STOP_FPUNL 37 /* fp lengths unequal */
|
|
#define STOP_FPMF 38 /* no flag on exp */
|
|
#define STOP_FPDVZ 39 /* divide by zero */
|
|
|
|
/* Memory */
|
|
|
|
#define MAXMEMSIZE 60000 /* max mem size */
|
|
#define MEMSIZE (cpu_unit.capac) /* act memory size */
|
|
|
|
/* Processor parameters */
|
|
|
|
#define INST_LEN 12 /* inst length */
|
|
#define ADDR_LEN 5 /* addr length */
|
|
#define MUL_TABLE 100 /* multiply table */
|
|
#define MUL_TABLE_LEN 200
|
|
#define ADD_TABLE 300 /* add table */
|
|
#define ADD_TABLE_LEN 100
|
|
#define IDX_A 300 /* index A base */
|
|
#define IDX_B 340 /* index B base */
|
|
#define PROD_AREA 80 /* product area */
|
|
#define PROD_AREA_LEN 20 /* product area */
|
|
#define PROD_AREA_END (PROD_AREA + PROD_AREA_LEN)
|
|
|
|
/* Branch indicator codes */
|
|
|
|
#define NUM_IND 100 /* number of indicators */
|
|
|
|
#define IN_SW1 1 /* sense switch 1 */
|
|
#define IN_SW2 2 /* sense switch 2 */
|
|
#define IN_SW3 3 /* sense switch 3 */
|
|
#define IN_SW4 4 /* sense switch 4 */
|
|
#define IN_RDCHK 6 /* read check (I/O error) */
|
|
#define IN_WRCHK 7 /* write check (I/O error) */
|
|
#define IN_LAST 9 /* last card was just read */
|
|
#define IN_HP 11 /* high or positive result */
|
|
#define IN_EZ 12 /* equal or zero result */
|
|
#define IN_HPEZ 13 /* high/positive or equal/zero */
|
|
#define IN_OVF 14 /* overflow */
|
|
#define IN_EXPCHK 15 /* floating exponent check */
|
|
#define IN_MBREVEN 16 /* even parity check */
|
|
#define IN_MBRODD 17 /* odd parity check */
|
|
#define IN_ANYCHK 19 /* any of read, write, even/odd */
|
|
#define IN_PRCHK 25 /* printer check */
|
|
#define IN_IXN 30 /* IX neither */
|
|
#define IN_IXA 31 /* IX A band */
|
|
#define IN_IXB 32 /* IX B band */
|
|
#define IN_PRCH9 33 /* printer chan 9 */
|
|
#define IN_PRCH12 34 /* printer chan 12 */
|
|
#define IN_PRBSY 35 /* printer busy */
|
|
#define IN_DACH 36 /* disk addr/data check */
|
|
#define IN_DWLR 37 /* disk rec length */
|
|
#define IN_DCYO 38 /* disk cyl overflow */
|
|
#define IN_DERR 39 /* disk any error */
|
|
|
|
/* I/O channel codes */
|
|
|
|
#define NUM_IO 100 /* number of IO chan */
|
|
|
|
#define IO_TTY 1 /* console typewriter */
|
|
#define IO_PTP 2 /* paper-tape punch */
|
|
#define IO_PTR 3 /* paper-tape reader */
|
|
#define IO_CDP 4 /* card punch */
|
|
#define IO_CDR 5 /* card reader */
|
|
#define IO_DSK 7 /* disk */
|
|
#define IO_LPT 9 /* line printer */
|
|
#define IO_BTP 32 /* binary ptp */
|
|
#define IO_BTR 33 /* binary ptr */
|
|
|
|
#define LPT_WIDTH 120 /* line print width */
|
|
#define CCT_LNT 132 /* car ctrl length */
|
|
|
|
#define CRETIOE(f,c) return ((f)? (c): SCPE_OK)
|
|
|
|
/* Memory representation: flag + BCD digit per byte */
|
|
|
|
#define FLAG 0x10
|
|
#define DIGIT 0x0F
|
|
#define REC_MARK 0xA
|
|
#define NUM_BLANK 0xC
|
|
#define GRP_MARK 0xF
|
|
#define BAD_DIGIT(x) ((x) > 9)
|
|
|
|
/* Instruction format */
|
|
|
|
#define I_OP 0 /* opcode */
|
|
#define I_P 2 /* P start */
|
|
#define I_PL 6 /* P end */
|
|
#define I_Q 7 /* Q start */
|
|
#define I_QL 11 /* Q end */
|
|
#define I_IO 8 /* IO select */
|
|
#define I_BR 8 /* indicator select */
|
|
#define I_CTL 10 /* control select */
|
|
#define I_SEL 11 /* BS select */
|
|
|
|
#define ADDR_A(x,a) ((((x) + (a)) >= MEMSIZE)? ((x) + (a) - MEMSIZE): ((x) + (a)))
|
|
#define ADDR_S(x,a) (((x) < (a))? ((x) - (a) + MEMSIZE): ((x) - (a)))
|
|
#define PP(x) x = ADDR_A(x,1)
|
|
#define MM(x) x = ADDR_S(x,1)
|
|
|
|
/* CPU options, stored in cpu_unit.flags */
|
|
/* Decoding flags must be part of the same definition set */
|
|
|
|
#define UNIT_SCP ((1 << UNIT_V_UF) - 1) /* mask of SCP flags */
|
|
#define IF_MII (1 << (UNIT_V_UF + 0)) /* model 2 */
|
|
#define IF_DIV (1 << (UNIT_V_UF + 1)) /* automatic divide */
|
|
#define IF_IA (1 << (UNIT_V_UF + 2)) /* indirect addressing */
|
|
#define IF_EDT (1 << (UNIT_V_UF + 3)) /* edit */
|
|
#define IF_FP (1 << (UNIT_V_UF + 4)) /* floating point */
|
|
#define IF_BIN (1 << (UNIT_V_UF + 5)) /* binary */
|
|
#define IF_IDX (1 << (UNIT_V_UF + 6)) /* indexing */
|
|
#define IF_VPA (1 << (UNIT_V_UF + 7)) /* valid P addr */
|
|
#define IF_VQA (1 << (UNIT_V_UF + 8)) /* valid Q addr */
|
|
#define IF_4QA (1 << (UNIT_V_UF + 9)) /* 4 char Q addr */
|
|
#define IF_NQX (1 << (UNIT_V_UF + 10)) /* no Q indexing */
|
|
#define IF_IMM (1 << (UNIT_V_UF + 11)) /* immediate */
|
|
#define UNIT_BCD (1 << (UNIT_V_UF + 12)) /* BCD coded */
|
|
#define UNIT_MSIZE (1 << (UNIT_V_UF + 13)) /* fake flag */
|
|
#define ALLOPT (IF_DIV + IF_IA + IF_EDT + IF_FP + IF_BIN + IF_IDX)
|
|
#define MI_OPT (IF_DIV + IF_IA + IF_EDT + IF_FP)
|
|
#define MI_STD (IF_DIV + IF_IA + IF_EDT)
|
|
#define MII_OPT (ALLOPT)
|
|
#define MII_STD (IF_DIV + IF_IA + IF_EDT + IF_BIN + IF_IDX)
|
|
|
|
/* Add status codes */
|
|
|
|
#define ADD_NOCRY 0 /* no carry out */
|
|
#define ADD_CARRY 1 /* carry out */
|
|
#define ADD_SIGNC 2 /* sign change */
|
|
|
|
/* Opcodes */
|
|
|
|
enum opcodes {
|
|
OP_FADD = 1, OP_FSUB, OP_FMUL, /* 00 - 09 */
|
|
OP_FSL = 5, OP_TFL, OP_BTFL, OP_FSR, OP_FDIV,
|
|
OP_BTAM = 10, OP_AM, OP_SM, OP_MM, OP_CM, /* 10 - 19 */
|
|
OP_TDM, OP_TFM, OP_BTM, OP_LDM, OP_DM,
|
|
OP_BTA = 20, OP_A, OP_S, OP_M, OP_C, /* 20 - 29 */
|
|
OP_TD, OP_TF, OP_BT, OP_LD, OP_D,
|
|
OP_TRNM = 30, OP_TR, OP_SF, OP_CF, OP_K, /* 30 - 39 */
|
|
OP_DN, OP_RN, OP_RA, OP_WN, OP_WA,
|
|
OP_NOP = 41, OP_BB, OP_BD, OP_BNF, /* 40 - 49 */
|
|
OP_BNR, OP_BI, OP_BNI, OP_H, OP_B,
|
|
OP_BNG = 55,
|
|
OP_BS = 60, OP_BX, OP_BXM, OP_BCX, OP_BCXM, /* 60 - 69 */
|
|
OP_BLX, OP_BLXM, OP_BSX,
|
|
OP_MA = 70, OP_MF, OP_TNS, OP_TNF, /* 70 - 79 */
|
|
/* 80 - 89 */
|
|
OP_BBT = 90, OP_BMK, OP_ORF, OP_ANDF, OP_CPLF, /* 90 - 99 */
|
|
OP_EORF, OP_OTD, OP_DTO };
|