RESTRICTION: The HP DS disk is not debugged. DO NOT enable this feature for normal operations. WARNING: Massive changes in the PDP-11 make all previous SAVEd file obsolete. Do not attempt to use a PDP-11 SAVE file from a prior release with V3.3! 1. New Features in 3.3 1.1 SCP - Added -p (powerup) qualifier to RESET - Changed SET <unit> ONLINE/OFFLINE to SET <unit> ENABLED/DISABLED - Moved SET DEBUG under SET CONSOLE hierarchy - Added optional parameter value to SHOW command - Added output file option to SHOW command 1.2 PDP-11 - Separated RH Massbus adapter from RP controller - Added TU tape support - Added model emulation framework - Added model details 1.3 VAX - Separated out CVAX-specific features from core instruction simulator - Implemented capability for CIS, octaword, compatibility mode instructions - Added instruction display and parse for compatibility mode - Changed SET CPU VIRTUAL=n to SHOW CPU VIRTUAL=n - Added =n optional parameter to SHOW CPU HISTORY 1.4 Unibus/Qbus simulators (PDP-11, VAX, PDP-10) - Simplified DMA API's - Modified DMA peripherals to use simplified API's 1.5 HP2100 (all changes from Dave Bryan) CPU - moved MP into its own device; added MP option jumpers - modified DMA to allow disabling - modified SET CPU 2100/2116 to truncate memory > 32K - added -F switch to SET CPU to force memory truncation - modified WRU to be REG_HRO - added BRK and DEL to save console settings DR - provided protected tracks and "Writing Enabled" status bit - added "parity error" status return on writes for 12606 - added track origin test for 12606 - added SCP test for 12606 - added "Sector Flag" status bit - added "Read Inhibit" status bit for 12606 - added TRACKPROT modifier LPS - added SET OFFLINE/ONLINE, POWEROFF/POWERON - added fast/realistic timing - added debug printouts LPT - added SET OFFLINE/ONLINE, POWEROFF/POWERON PTR - added paper tape loop mode, DIAG/READER modifiers to PTR - added PV_LEFT to PTR TRLLIM register CLK - modified CLK to permit disable 1.6 IBM 1401, IBM 1620, Interdata 16b, SDS 940, PDP-10 - Added instruction history 1.7 H316, PDP-15, PDP-8 - Added =n optional value to SHOW CPU HISTORY 2. Bugs Fixed in 3.3 2.1 SCP - Fixed comma-separated SET options (from Dave Bryan) - Fixed duplicate HELP displays with user-specified commands 2.2 PDP-10 - Replicated RP register state per drive - Fixed TU to set FCE on short record - Fixed TU to return bit<15> in drive type - Fixed TU format specification, 1:0 are don't cares - Fixed TU handling of TMK status - Fixed TU handling of DONE, ATA at end of operation - Implemented TU write check 2.3 PDP-11 - Replicated RP register state per drive - Fixed RQ, TQ to report correct controller type and stage 1 configuration flags on a Unibus system - Fixed HK CS2<output_ready> flag 2.4 VAX - Fixed parsing of indirect displacement modes in instruction input 2.5 HP2100 (all fixes from Dave Bryan) CPU - fixed S-register behavior on 2116 - fixed LIx/MIx behavior for DMA on 2116 and 2100 - fixed LIx/MIx behavior for empty I/O card slots DP - fixed enable/disable from either device - fixed ANY ERROR status for 12557A interface - fixed unattached drive status for 12557A interface - status cmd without prior STC DC now completes (12557A) - OTA/OTB CC on 13210A interface also does CLC CC - fixed RAR model - fixed seek check on 13210 if sector out of range DQ - fixed enable/disable from either device - shortened xtime from 5 to 3 (drive avg 156KW/second) - fixed not ready/any error status - fixed RAR model DR - fixed enable/disable from either device - fixed sector return in status word - fixed DMA last word write, incomplete sector fill value - fixed 12610 SFC operation - fixed current-sector determination IPL - fixed enable/disable from either device LPS - fixed status returns for error conditions - fixed handling of non-printing characters - fixed handling of characters after column 80 - improved timing model accuracy for RTE LPT - fixed status returns for error conditions - fixed TOF handling so form remains on line 0 SYS - fixed display of CCA/CCB/CCE instructions 2.5 PDP-15 FPP - fixed URFST to mask low 9b of fraction - fixed exception PC setting
283 lines
10 KiB
C
283 lines
10 KiB
C
/* i1401_defs.h: IBM 1401 simulator definitions
|
||
|
||
Copyright (c) 1993-2004, 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.
|
||
|
||
14-Nov-04 RMS Added column binary support
|
||
27-Oct-04 RMS Added maximum instruction length
|
||
16-Mar-03 RMS Fixed mnemonic for MCS
|
||
03-Jun-02 RMS Added 1311 support
|
||
14-Apr-99 RMS Converted t_addr to unsigned
|
||
|
||
This simulator is based on the 1401 simulator written by Len Fehskens
|
||
with assistance from Sarah Lee Harris and Bob Supnik. This one's for
|
||
you, Len. I am grateful to Paul Pierce and Charles Owen for their help
|
||
in answering questions, gathering source material, and debugging.
|
||
*/
|
||
|
||
#include "sim_defs.h"
|
||
|
||
/* Simulator stop codes */
|
||
|
||
#define STOP_NXI 1 /* unimpl instr */
|
||
#define STOP_NXM 2 /* non-exist mem */
|
||
#define STOP_NXD 3 /* non-exist dev */
|
||
#define STOP_NOWM 4 /* no WM under op */
|
||
#define STOP_INVA 5 /* invalid A addr */
|
||
#define STOP_INVB 6 /* invalid B addr */
|
||
#define STOP_INVL 7 /* invalid length */
|
||
#define STOP_INVM 8 /* invalid modifier */
|
||
#define STOP_INVBR 9 /* invalid branch */
|
||
#define STOP_IBKPT 10 /* breakpoint */
|
||
#define STOP_HALT 11 /* halt */
|
||
#define STOP_INVMTU 12 /* invalid MT unit */
|
||
#define STOP_MTZ 13 /* MT zero lnt rec */
|
||
#define STOP_MTL 14 /* MT write lock */
|
||
#define STOP_CCT 15 /* inv CCT channel */
|
||
#define STOP_NOCD 16 /* no cards left */
|
||
#define STOP_WRAP 17 /* AS, BS mem wrap */
|
||
#define STOP_MCE1 18 /* MCE short A field */
|
||
#define STOP_MCE2 19 /* MCE short B field */
|
||
#define STOP_MCE3 20 /* MCE hanging $ */
|
||
#define STOP_IOC 21 /* I/O check */
|
||
#define STOP_INVDSC 22 /* invalid disk sector */
|
||
#define STOP_INVDCN 23 /* invalid disk count */
|
||
#define STOP_INVDSK 24 /* invalid disk unit */
|
||
#define STOP_INVDFN 25 /* invalid disk func */
|
||
#define STOP_INVDLN 26 /* invalid disk reclen */
|
||
#define STOP_WRADIS 27 /* write address dis */
|
||
#define STOP_WRCHKE 28 /* write check error */
|
||
#define STOP_INVDAD 39 /* invalid disk addr */
|
||
#define STOP_INVDCY 30 /* invalid direct seek */
|
||
|
||
/* Memory and devices */
|
||
|
||
#define MAXMEMSIZE 16000 /* max memory */
|
||
#define MEMSIZE (cpu_unit.capac) /* current memory */
|
||
#define CDR_BUF 1 /* card rdr buffer */
|
||
#define CDR_WIDTH 80 /* card rdr width */
|
||
#define CDP_BUF 101 /* card punch buffer */
|
||
#define CDP_WIDTH 80 /* card punch width */
|
||
#define CD_CBUF1 401 /* r/p col bin buf 12-3 */
|
||
#define CD_CBUF2 501 /* r/p col bin buf 4-9 */
|
||
#define LPT_BUF 201 /* line print buffer */
|
||
#define LPT_WIDTH 132 /* line print width */
|
||
#define CCT_LNT 132 /* car ctrl length */
|
||
#define INQ_WIDTH 80 /* inq term width */
|
||
#define ADDR_ERR(x) (((uint32) (x)) >= MEMSIZE)
|
||
|
||
/* Binary address format
|
||
|
||
<14:0> address, with index added in
|
||
<23:16> index register memory address
|
||
<25:24> address error bits
|
||
*/
|
||
|
||
#define ADDRMASK 037777 /* addr mask */
|
||
#define INDEXMASK 077777 /* addr + index mask */
|
||
#define V_INDEX 16
|
||
#define M_INDEX 0177
|
||
#define V_ADDRERR 24
|
||
#define BA (1 << V_ADDRERR) /* bad addr digit */
|
||
#define X1 (87 << V_INDEX) /* index reg 1 */
|
||
#define X2 (92 << V_INDEX) /* index reg 2 */
|
||
#define X3 (97 << V_INDEX) /* index reg 3 */
|
||
|
||
/* CPU instruction control flags. The flag definitions must be harmonized
|
||
with the UNIT flag definitions used by the simulator. */
|
||
|
||
/* Lengths */
|
||
|
||
#define L1 0001 /* 1: op */
|
||
#define L2 0002 /* 2: op d */
|
||
#define L4 0004 /* 4: op aaa */
|
||
#define L5 0010 /* 5: op aaa d */
|
||
#define L7 0020 /* 7: op aaa bbb */
|
||
#define L8 0040 /* 8: op aaa bbb d */
|
||
#define MAX_L 8 /* max length */
|
||
|
||
/* CPU options, stored in cpu_unit.flags */
|
||
|
||
#define MDV (1 << (UNIT_V_UF + 0)) /* multiply/divide */
|
||
#define MR (1 << (UNIT_V_UF + 1)) /* move record */
|
||
#define XSA (1 << (UNIT_V_UF + 2)) /* index, store addr */
|
||
#define EPE (1 << (UNIT_V_UF + 3)) /* expanded edit */
|
||
#define MA (1 << (UNIT_V_UF + 4)) /* modify address */
|
||
#define BBE (1 << (UNIT_V_UF + 5)) /* br bit equal */
|
||
#define HLE (1 << (UNIT_V_UF + 6)) /* high/low/equal */
|
||
#define UNIT_MSIZE (1 << (UNIT_V_UF + 7)) /* fake flag */
|
||
#define ALLOPT (MDV + MR + XSA + EPE + MA + BBE + HLE)
|
||
#define STDOPT (MDV + MR + XSA + EPE + MA + BBE + HLE)
|
||
|
||
/* Fetch control */
|
||
|
||
#define AREQ (1 << (UNIT_V_UF + 8)) /* validate A */
|
||
#define BREQ (1 << (UNIT_V_UF + 9)) /* validate B */
|
||
#define MLS (1 << (UNIT_V_UF + 10)) /* move load store */
|
||
#define NOWM (1 << (UNIT_V_UF + 11)) /* no WM at end */
|
||
#define HNOP (1 << (UNIT_V_UF + 12)) /* halt or nop */
|
||
#define IO (1 << (UNIT_V_UF + 13)) /* IO */
|
||
#define UNIT_BCD (1 << (UNIT_V_UF + 14)) /* BCD strings */
|
||
|
||
#if (UNIT_V_UF < 6) || ((UNIT_V_UF + 14) > 31)
|
||
Definition error: flags overlap
|
||
#endif
|
||
|
||
/* BCD memory character format */
|
||
|
||
#define WM 0100 /* word mark */
|
||
#define ZONE 0060 /* zone */
|
||
#define BBIT 0040 /* 1 in valid sign */
|
||
#define ABIT 0020 /* sign (1 = +) */
|
||
#define DIGIT 0017 /* digit */
|
||
#define CHAR 0077 /* character */
|
||
|
||
#define V_WM 6
|
||
#define V_ZONE 4
|
||
#define V_DIGIT 0
|
||
|
||
/* Interesting BCD characters */
|
||
|
||
#define BCD_BLANK 000
|
||
#define BCD_ONE 001
|
||
#define BCD_TWO 002
|
||
#define BCD_THREE 003
|
||
#define BCD_FOUR 004
|
||
#define BCD_FIVE 005
|
||
#define BCD_SIX 006
|
||
#define BCD_SEVEN 007
|
||
#define BCD_EIGHT 010
|
||
#define BCD_NINE 011
|
||
#define BCD_ZERO 012
|
||
#define BCD_ALT 020
|
||
#define BCD_S 022
|
||
#define BCD_U 024
|
||
#define BCD_W 026
|
||
#define BCD_RECMRK 032
|
||
#define BCD_COMMA 033
|
||
#define BCD_PERCNT 034
|
||
#define BCD_WM 035
|
||
#define BCD_BS 036
|
||
#define BCD_TS 037
|
||
#define BCD_MINUS 040
|
||
#define BCD_M 044
|
||
#define BCD_R 051
|
||
#define BCD_DOLLAR 053
|
||
#define BCD_ASTER 054
|
||
#define BCD_AMPER 060
|
||
#define BCD_A 061
|
||
#define BCD_B 062
|
||
#define BCD_C 063
|
||
#define BCD_E 065
|
||
#define BCD_DECIMAL 073
|
||
#define BCD_SQUARE 074
|
||
#define BCD_GRPMRK 077
|
||
|
||
/* Opcodes */
|
||
|
||
#define OP_R 001 /* read */
|
||
#define OP_W 002 /* write */
|
||
#define OP_WR 003 /* write and read */
|
||
#define OP_P 004 /* punch */
|
||
#define OP_RP 005 /* read and punch */
|
||
#define OP_WP 006 /* write and punch */
|
||
#define OP_WRP 007 /* write read punch */
|
||
#define OP_RF 010 /* reader feed */
|
||
#define OP_PF 011 /* punch feed */
|
||
#define OP_MA 013 /* modify address */
|
||
#define OP_MUL 014 /* multiply */
|
||
#define OP_CS 021 /* clear storage */
|
||
#define OP_S 022 /* subtract */
|
||
#define OP_MTF 024 /* magtape function */
|
||
#define OP_BWZ 025 /* branch wm or zone */
|
||
#define OP_BBE 026 /* branch bit equal */
|
||
#define OP_MZ 030 /* move zone */
|
||
#define OP_MCS 031 /* move suppr zeroes */
|
||
#define OP_SWM 033 /* set word mark */
|
||
#define OP_DIV 034 /* divide */
|
||
#define OP_SS 042 /* select stacker */
|
||
#define OP_LCA 043 /* load characters */
|
||
#define OP_MCW 044 /* move characters */
|
||
#define OP_NOP 045 /* no op */
|
||
#define OP_MCM 047 /* move to rec/grp mk */
|
||
#define OP_SAR 050 /* store A register */
|
||
#define OP_ZS 052 /* zero and subtract */
|
||
#define OP_A 061 /* add */
|
||
#define OP_B 062 /* branch */
|
||
#define OP_C 063 /* compare */
|
||
#define OP_MN 064 /* move numeric */
|
||
#define OP_MCE 065 /* move char and edit */
|
||
#define OP_CC 066 /* carriage control */
|
||
#define OP_SBR 070 /* store B register */
|
||
#define OP_ZA 072 /* zero and add */
|
||
#define OP_H 073 /* halt */
|
||
#define OP_CWM 074 /* clear word mark */
|
||
|
||
/* I/O addresses */
|
||
|
||
#define IO_INQ 023 /* inquiry terminal */
|
||
#define IO_MT 024 /* magtape */
|
||
#define IO_MTB 062 /* binary magtape */
|
||
#define IO_DP 066 /* 1311 diskpack */
|
||
|
||
/* I/O modes */
|
||
|
||
#define MD_NORM 0 /* normal (move) */
|
||
#define MD_WM 1 /* word mark (load) */
|
||
#define MD_BIN 2 /* binary */
|
||
|
||
/* Indicator characters */
|
||
|
||
#define IN_UNC 000 /* unconditional */
|
||
#define IN_CC9 011 /* carr ctrl chan 9 */
|
||
#define IN_CC12 014 /* carr ctrl chan 12 */
|
||
#define IN_UNQ 021 /* unequal */
|
||
#define IN_EQU 022 /* equal */
|
||
#define IN_LOW 023 /* low */
|
||
#define IN_HGH 024 /* high */
|
||
#define IN_DPW 025 /* parity/compare check */
|
||
#define IN_LNG 026 /* wrong lnt record */
|
||
#define IN_UNA 027 /* unequal addr cmp */
|
||
#define IN_DSK 030 /* disk error */
|
||
#define IN_OVF 031 /* overflow */
|
||
#define IN_LPT 032 /* printer error */
|
||
#define IN_PRO 034 /* process check */
|
||
#define IN_DBY 036 /* disk busy */
|
||
#define IN_END 042 /* end indicator */
|
||
#define IN_TAP 043 /* tape error */
|
||
#define IN_ACC 045 /* access error */
|
||
#define IN_BSY 047 /* printer busy */
|
||
#define IN_INR 050 /* inquiry request */
|
||
#define IN_PCB 051 /* printer carr busy */
|
||
#define IN_PNCH 052 /* punch error */
|
||
#define IN_INC 054 /* inquiry clear */
|
||
#define IN_LST 061 /* last card */
|
||
#define IN_SSB 062 /* sense switch B */
|
||
#define IN_SSC 063 /* sense switch C */
|
||
#define IN_SSD 064 /* sense switch D */
|
||
#define IN_SSE 065 /* sense switch E */
|
||
#define IN_SSF 066 /* sense switch F */
|
||
#define IN_SSG 067 /* sense switch G */
|
||
#define IN_READ 072 /* reader error */
|
||
|
||
#define CRETIOE(f,c) return ((f)? (c): SCPE_OK)
|