RESTRICTION: The PDP-15 FPP is only partially debugged. Do NOT enable this feature for normal operations. WARNING: The core simulator files (scp.c, sim_*.c) have been reorganized. Unzip V3.2-0 to an empty directory before attempting to compile the source. IMPORTANT: If you are compiling for UNIX, please read the notes for Ethernet very carefully. You may need to download a new version of the pcap library, or make changes to the makefile, to get Ethernet support to work. 1. New Features in 3.2-0 1.1 SCP and libraries - Added SHOW <device> RADIX command. - Added SHOW <device> MODIFIERS command. - Added SHOW <device> NAMES command. - Added SET/SHOW <device> DEBUG command. - Added sim_vm_parse_addr and sim_vm_fprint_addr optional interfaces. - Added REG_VMAD flag. - Split SCP into separate libraries for easier modification. - Added more room to the device and unit flag fields. - Changed terminal multiplexor library to support unlimited. number of async lines. 1.2 All DECtapes - Added STOP_EOR flag to enable end-of-reel error stop - Added device debug support. 1.3 Nova and Eclipse - Added QTY and ALM multiplexors (Bruce Ray). 1.4 LGP-30 - Added LGP-30/LGP-21 simulator. 1.5 PDP-11 - Added format, address increment inhibit, transfer overrun detection to RK. - Added device debug support to HK, RP, TM, TQ, TS. - Added DEUNA/DELUA (XU) support (Dave Hittner). - Add DZ per-line logging. 1.6 18b PDP's - Added support for 1-4 (PDP-9)/1-16 (PDP-15) additional terminals. 1.7 PDP-10 - Added DEUNA/DELUA (XU) support (Dave Hittner). 1.8 VAX - Added extended memory to 512MB (Mark Pizzolato). - Added RXV21 support. 2. Bugs Fixed in 3.2-0 2.1 SCP - Fixed double logging of SHOW BREAK (found by Mark Pizzolato). - Fixed implementation of REG_VMIO. 2.2 Nova and Eclipse - Fixed device enable/disable support (found by Bruce Ray). 2.3 PDP-1 - Fixed bug in LOAD (found by Mark Crispin). 2.4 PDP-10 - Fixed bug in floating point unpack. - Fixed bug in FIXR (found by Phil Stone, fixed by Chris Smith). 2.6 PDP-11 - Fixed bug in RQ interrupt control (found by Tom Evans). 2.6 PDP-18B - Fixed bug in PDP-15 XVM g_mode implementation. - Fixed bug in PDP-15 indexed address calculation. - Fixed bug in PDP-15 autoindexed address calculation. - Fixed bugs in FPP-15 instruction decode. - Fixed clock response to CAF. - Fixed bug in hardware read-in mode bootstrap. - Fixed PDP-15 XVM instruction decoding errors. 2.7 VAX - Fixed PC read fault in EXTxV. - Fixed PC write fault in INSV.
269 lines
9.8 KiB
C
269 lines
9.8 KiB
C
/* hp2100_defs.h: HP 2100 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.
|
||
|
||
25-Apr-03 RMS Revised for extended file support
|
||
24-Oct-02 RMS Added indirect address interrupt
|
||
08-Feb-02 RMS Added DMS definitions
|
||
01-Feb-02 RMS Added terminal multiplexor support
|
||
16-Jan-02 RMS Added additional device support
|
||
30-Nov-01 RMS Added extended SET/SHOW support
|
||
15-Oct-00 RMS Added dynamic device numbers
|
||
14-Apr-99 RMS Changed t_addr to unsigned
|
||
|
||
The author gratefully acknowledges the help of Jeff Moffat in answering
|
||
questions about the HP2100.
|
||
*/
|
||
|
||
#include "sim_defs.h" /* simulator defns */
|
||
|
||
/* Simulator stop codes */
|
||
|
||
#define STOP_RSRV 1 /* must be 1 */
|
||
#define STOP_IODV 2 /* must be 2 */
|
||
#define STOP_HALT 3 /* HALT */
|
||
#define STOP_IBKPT 4 /* breakpoint */
|
||
#define STOP_IND 5 /* indirect loop */
|
||
#define STOP_INDINT 6 /* indirect intr */
|
||
#define STOP_NOCONN 7 /* no connection */
|
||
|
||
#define ABORT_PRO 1 /* protection abort */
|
||
|
||
/* Memory */
|
||
|
||
#define MEMSIZE (cpu_unit.capac) /* actual memory size */
|
||
#define MEM_ADDR_OK(x) (((uint32) (x)) < MEMSIZE)
|
||
#define VA_N_SIZE 15 /* virtual addr size */
|
||
#define VASIZE (1 << VA_N_SIZE)
|
||
#define VAMASK (VASIZE - 1) /* virt addr mask */
|
||
#define PA_N_SIZE 20 /* phys addr size */
|
||
#define PASIZE (1 << PA_N_SIZE)
|
||
#define PAMASK (PASIZE - 1) /* phys addr mask */
|
||
|
||
/* Architectural constants */
|
||
|
||
#define SIGN32 020000000000 /* 32b sign */
|
||
#define SIGN 0100000 /* 16b sign */
|
||
#define DMASK 0177777 /* 16b data mask */
|
||
#define AR M[0] /* A = location 0 */
|
||
#define BR M[1] /* B = location 1 */
|
||
#define ABREG M /* register array */
|
||
#define SEXT(x) ((int32) (((x) & SIGN)? ((x) | ~DMASK): ((x) & DMASK)))
|
||
|
||
/* Memory reference instructions */
|
||
|
||
#define I_IA 0100000 /* indirect address */
|
||
#define I_AB 0004000 /* A/B select */
|
||
#define I_CP 0002000 /* current page */
|
||
#define I_DISP 0001777 /* page displacement */
|
||
#define I_PAGENO 0076000 /* page number */
|
||
|
||
/* Other instructions */
|
||
|
||
#define I_NMRMASK 0102000 /* non-mrf opcode */
|
||
#define I_SRG 0000000 /* shift */
|
||
#define I_ASKP 0002000 /* alter/skip */
|
||
#define I_EXTD 0100000 /* extend */
|
||
#define I_IO 0102000 /* I/O */
|
||
#define I_CTL 0004000 /* CTL on/off */
|
||
#define I_HC 0001000 /* hold/clear */
|
||
#define I_DEVMASK 0000077 /* device mask */
|
||
#define I_GETIOOP(x) (((x) >> 6) & 07) /* I/O sub op */
|
||
|
||
/* DMA channels */
|
||
|
||
#define DMA1_STC 0100000 /* DMA - issue STC */
|
||
#define DMA1_CLC 0020000 /* DMA - issue CLC */
|
||
#define DMA2_OI 0100000 /* DMA - output/input */
|
||
|
||
struct DMA { /* DMA channel */
|
||
int32 cw1; /* device select */
|
||
int32 cw2; /* direction, address */
|
||
int32 cw3; /* word count */
|
||
};
|
||
|
||
/* Memory management */
|
||
|
||
#define VA_N_OFF 10 /* offset width */
|
||
#define VA_M_OFF ((1 << VA_N_OFF) - 1) /* offset mask */
|
||
#define VA_GETOFF(x) ((x) & VA_M_OFF)
|
||
#define VA_N_PAG (VA_N_SIZE - VA_N_OFF) /* page width */
|
||
#define VA_V_PAG (VA_N_OFF)
|
||
#define VA_M_PAG ((1 << VA_N_PAG) - 1)
|
||
#define VA_GETPAG(x) (((x) >> VA_V_PAG) & VA_M_PAG)
|
||
|
||
/* Maps */
|
||
|
||
#define MAP_NUM 4 /* num maps */
|
||
#define MAP_LNT (1 << VA_N_PAG) /* map length */
|
||
#define MAP_MASK ((MAP_NUM * MAP_LNT) - 1)
|
||
#define SMAP 0 /* system map */
|
||
#define UMAP (SMAP + MAP_LNT) /* user map */
|
||
#define PAMAP (UMAP + MAP_LNT) /* port A map */
|
||
#define PBMAP (PAMAP + MAP_LNT) /* port B map */
|
||
|
||
/* Map entries are left shifted by VA_N_OFF, flags in lower 2b */
|
||
|
||
#define PA_N_PAG (PA_N_SIZE - VA_N_OFF) /* page width */
|
||
#define PA_V_PAG (VA_N_OFF)
|
||
#define PA_M_PAG ((1 << PA_N_PAG) - 1)
|
||
#define MAPM_V_RPR 15 /* in mem: read prot */
|
||
#define MAPM_V_WPR 14 /* write prot */
|
||
#define MAPA_V_RPR 1 /* in array: */
|
||
#define MAPA_V_WPR 0
|
||
#define PA_GETPAG(x) ((x) & (PA_M_PAG << VA_V_PAG))
|
||
#define RD (1 << MAPA_V_RPR)
|
||
#define WR (1 << MAPA_V_WPR)
|
||
|
||
/* Map status register */
|
||
|
||
#define MST_ENBI 0100000 /* mem enb @ int */
|
||
#define MST_UMPI 0040000 /* usr map @ int */
|
||
#define MST_ENB 0020000 /* mem enb */
|
||
#define MST_UMP 0010000 /* usr map */
|
||
#define MST_PRO 0004000 /* protection */
|
||
#define MST_FLT 0002000 /* fence comp */
|
||
#define MST_FENCE 0001777 /* base page fence */
|
||
|
||
/* Map violation register */
|
||
|
||
#define MVI_V_RPR 15
|
||
#define MVI_V_WPR 14
|
||
#define MVI_RPR (1 << MVI_V_RPR) /* rd viol */
|
||
#define MVI_WPR (1 << MVI_V_WPR) /* wr viol */
|
||
#define MVI_BPG 0020000 /* base page viol */
|
||
#define MVI_PRV 0010000 /* priv viol */
|
||
#define MVI_MEB 0000200 /* me bus enb @ viol */
|
||
#define MVI_MEM 0000100 /* mem enb @ viol */
|
||
#define MVI_UMP 0000040 /* usr map @ viol */
|
||
#define MVI_PAG 0000037 /* pag sel */
|
||
|
||
/* Timers */
|
||
|
||
#define TMR_CLK 0 /* clock */
|
||
#define TMR_MUX 1 /* multiplexor */
|
||
|
||
/* I/O sub-opcodes */
|
||
|
||
#define ioHLT 0 /* halt */
|
||
#define ioFLG 1 /* set/clear flag */
|
||
#define ioSFC 2 /* skip on flag clear */
|
||
#define ioSFS 3 /* skip on flag set */
|
||
#define ioMIX 4 /* merge into A/B */
|
||
#define ioLIX 5 /* load into A/B */
|
||
#define ioOTX 6 /* output from A/B */
|
||
#define ioCTL 7 /* set/clear control */
|
||
|
||
/* I/O devices - fixed assignments */
|
||
|
||
#define CPU 000 /* interrupt control */
|
||
#define OVF 001 /* overflow */
|
||
#define DMALT0 002 /* DMA 0 alternate */
|
||
#define DMALT1 003 /* DMA 1 alternate */
|
||
#define PWR 004 /* power fail */
|
||
#define PRO 005 /* parity/mem protect */
|
||
#define DMA0 006 /* DMA channel 0 */
|
||
#define DMA1 007 /* DMA channel 1 */
|
||
#define VARDEV (DMA1 + 1) /* start of var assign */
|
||
#define M_NXDEV (INT_M (CPU) | INT_M (OVF) | \
|
||
INT_M (DMALT0) | INT_M (DMALT1))
|
||
#define M_FXDEV (M_NXDEV | INT_M (PWR) | INT_M (PRO) | \
|
||
INT_M (DMA0) | INT_M (DMA1))
|
||
|
||
/* I/O devices - variable assignment defaults */
|
||
|
||
#define PTR 010 /* paper tape reader */
|
||
#define TTY 011 /* console */
|
||
#define PTP 012 /* paper tape punch */
|
||
#define CLK 013 /* clock */
|
||
#define LPS 014 /* 12653 line printer */
|
||
#define LPT 015 /* 12845 line printer */
|
||
#define MTD 020 /* 12559A data */
|
||
#define MTC 021 /* 12559A control */
|
||
#define DPD 022 /* 12557A data */
|
||
#define DPC 023 /* 12557A control */
|
||
#define DQD 024 /* 12565A data */
|
||
#define DQC 025 /* 12565A control */
|
||
#define DRD 026 /* 12610A data */
|
||
#define DRC 027 /* 12610A control */
|
||
#define MSD 030 /* 13181A data */
|
||
#define MSC 031 /* 13181A control */
|
||
#define IPLI 032 /* 12556B link in */
|
||
#define IPLO 033 /* 12556B link out */
|
||
#define MUXL 040 /* 12920A lower data */
|
||
#define MUXU 041 /* 12920A upper data */
|
||
#define MUXC 042 /* 12920A control */
|
||
|
||
/* IBL assignments */
|
||
|
||
#define IBL_PTR 0000000 /* PTR */
|
||
#define IBL_DP 0040000 /* DP */
|
||
#define IBL_DQ 0060000 /* DQ */
|
||
#define IBL_MS 0100000 /* MS */
|
||
#define IBL_TBD 0140000 /* tbd */
|
||
#define IBL_V_DEV 6 /* dev in <11:6> */
|
||
#define IBL_FIX 0000001 /* DP fixed */
|
||
#define IBL_LNT 64 /* boot length */
|
||
#define IBL_MASK (IBL_LNT - 1) /* boot length mask */
|
||
|
||
/* Dynamic device information table */
|
||
|
||
struct hp_dib {
|
||
int32 devno; /* device number */
|
||
int32 cmd; /* saved command */
|
||
int32 ctl; /* saved control */
|
||
int32 flg; /* saved flag */
|
||
int32 fbf; /* saved flag buf */
|
||
int32 (*iot)(); /* I/O routine */
|
||
};
|
||
|
||
typedef struct hp_dib DIB;
|
||
|
||
/* I/O macros */
|
||
|
||
#define INT_V(x) ((x) & 037) /* device bit pos */
|
||
#define INT_M(x) (1u << INT_V (x)) /* device bit mask */
|
||
#define setCMD(D) dev_cmd[(D)/32] = dev_cmd[(D)/32] | INT_M ((D))
|
||
#define clrCMD(D) dev_cmd[(D)/32] = dev_cmd[(D)/32] & ~INT_M (D)
|
||
#define setCTL(D) dev_ctl[(D)/32] = dev_ctl[(D)/32] | INT_M ((D))
|
||
#define clrCTL(D) dev_ctl[(D)/32] = dev_ctl[(D)/32] & ~INT_M (D)
|
||
#define setFBF(D) dev_fbf[(D)/32] = dev_fbf[(D)/32] | INT_M (D)
|
||
#define clrFBF(D) dev_fbf[(D)/32] = dev_fbf[(D)/32] & ~INT_M (D)
|
||
#define setFLG(D) dev_flg[(D)/32] = dev_flg[(D)/32] | INT_M (D); \
|
||
setFBF(D)
|
||
#define clrFLG(D) dev_flg[(D)/32] = dev_flg[(D)/32] & ~INT_M (D); \
|
||
clrFBF(D)
|
||
#define CMD(D) ((dev_cmd[(D)/32] >> INT_V (D)) & 1)
|
||
#define CTL(D) ((dev_ctl[(D)/32] >> INT_V (D)) & 1)
|
||
#define FLG(D) ((dev_flg[(D)/32] >> INT_V (D)) & 1)
|
||
#define FBF(D) ((dev_fbf[(D)/32] >> INT_V (D)) & 1)
|
||
|
||
#define IOT_V_REASON 16
|
||
#define IORETURN(f,v) ((f)? (v): SCPE_OK) /* stop on error */
|
||
|
||
/* Function prototypes */
|
||
|
||
t_stat hp_setdev (UNIT *uptr, int32 val, char *cptr, void *desc);
|
||
t_stat hp_showdev (FILE *st, UNIT *uptr, int32 val, void *desc);
|
||
void hp_enbdis_pair (DEVICE *ccp, DEVICE *dcp);
|