/* gri_defs.h: GRI-909 simulator definitions | |
Copyright (c) 2001-2002, 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. | |
19-Sep-02 RMS Fixed declarations in gdev structure | |
There are several discrepancies between the original GRI-909 Reference | |
Manual of 1969 and the only surviving code sample, the MIT Crystal Growing | |
System of 1972: | |
1. Ref Manual documents two GR's at codes 26-27; MITCS documents six GR's | |
at 30-35. | |
2. Ref Manual documents only unsigned overflow (carry) for arithmetic | |
operator; MITCS uses both unsigned overflow (AOV) and signed overflow | |
(SOV). | |
3. Ref Manual documents a ROM-subroutine multiply operator and mentions | |
but does not document a "fast multiply"; MITCS uses an extended | |
arithmetic operator with multiply, divide, and shifts. The behavior | |
of the extended arithmetic operator can only be inferred partially; | |
the shifts are never used, and there is no indication of how divide | |
overflow is handled. | |
The simulator follows the code in these instances. | |
Outstanding issues: | |
1. Is there any interaction between the byte swapper and the byte packer? | |
2. Is SOV testable even if the FOA is not ADD? | |
3. How does the EAO handle divide overflow? | |
4. What are the other EAO functions beside multiply and divide? | |
*/ | |
#include "sim_defs.h" /* simulator defns */ | |
/* Simulator stop codes */ | |
#define STOP_DEV 1 /* must be 1 */ | |
#define STOP_HALT 2 /* HALT */ | |
#define STOP_IBKPT 3 /* breakpoint */ | |
#define STOP_ILLINT 4 /* illegal intr */ | |
/* Memory */ | |
#define MAXMEMSIZE 32768 /* max memory size */ | |
#define AMASK 077777 /* logical addr mask */ | |
#define MEMSIZE (cpu_unit.capac) /* actual memory size */ | |
#define MEM_ADDR_OK(x) (((t_addr) (x)) < MEMSIZE) | |
/* Architectural constants */ | |
#define SIGN 0100000 /* sign */ | |
#define DMASK 0177777 /* data mask */ | |
#define CBIT (DMASK + 1) /* carry bit */ | |
/* Instruction format */ | |
#define I_M_SRC 077 /* source */ | |
#define I_V_SRC 10 | |
#define I_GETSRC(x) (((x) >> I_V_SRC) & I_M_SRC) | |
#define I_M_OP 017 /* operator */ | |
#define I_V_OP 6 | |
#define I_GETOP(x) (((x) >> I_V_OP) & I_M_OP) | |
#define I_M_DST 077 /* destination */ | |
#define I_V_DST 0 | |
#define I_GETDST(x) (((x) >> I_V_DST) & I_M_DST) | |
#define SF_V_REASON 1 /* SF reason */ | |
/* IO return */ | |
#define IORETURN(f,v) ((f)? (v): SCPE_OK) /* stop on error */ | |
/* Operators */ | |
#define U_ZERO 000 /* zero */ | |
#define U_IR 001 /* instruction reg */ | |
#define U_FSK 002 /* func out/skip */ | |
#define U_TRP 003 /* trap */ | |
#define U_ISR 004 /* intr status */ | |
#define U_MA 005 /* mem addr */ | |
#define U_MEM 006 /* mem data */ | |
#define U_SC 007 /* seq counter */ | |
#define U_SWR 010 /* switch register */ | |
#define U_AX 011 /* arith in 1 */ | |
#define U_AY 012 /* arith in 2 */ | |
#define U_AO 013 /* arith out */ | |
#define U_EAO 014 /* ext arith */ | |
#define U_MSR 017 /* machine status */ | |
#define U_BSW 024 /* byte swap */ | |
#define U_BPK 025 /* byte pack */ | |
/* #define U_GR 026 /* dual general regs */ | |
#define U_GR 030 /* hex general regs */ | |
#define U_RTC 075 /* clock */ | |
#define U_HS 076 /* paper tape */ | |
#define U_TTY 077 /* console */ | |
struct gdev { | |
uint32 (*Src)(uint32); /* source */ | |
t_stat (*Dst)(uint32, uint32); /* dest */ | |
t_stat (*FO)(uint32); /* func out */ | |
uint32 (*SF)(uint32); /* skip func */ | |
}; | |
/* Trap (jump) */ | |
#define TRP_DIR 00 /* direct */ | |
#define TRP_DEF 01 /* defer */ | |
/* Interrupt status */ | |
#define ISR_OFF 01 /* int off */ | |
#define ISR_ON 02 /* int on */ | |
/* Bus modifiers */ | |
#define BUS_COM 002 /* complement */ | |
#define BUS_FNC 014 /* function mask */ | |
#define BUS_P1 004 /* + 1 */ | |
#define BUS_L1 010 /* rotate left */ | |
#define BUS_R1 014 /* rotate right */ | |
/* Memory address modes */ | |
#define MEM_MOD 03 | |
#define MEM_DIR 00 /* direct */ | |
#define MEM_DEF 01 /* defer */ | |
#define MEM_IMM 02 /* immediate */ | |
#define MEM_IDF 03 /* immediate defer */ | |
/* Arithmetic unit */ | |
#define FO_V_FOA 8 /* arith func */ | |
#define FO_M_FOA 03 | |
#define OP_GET_FOA(x) (((x) >> (FO_V_FOA - I_V_OP)) & FO_M_FOA) | |
#define AO_ADD 00 /* add */ | |
#define AO_AND 01 /* and */ | |
#define AO_XOR 02 /* xor */ | |
#define AO_IOR 03 /* or */ | |
#define EAO_MUL 01 /* multiply */ | |
#define EAO_DIV 02 /* divide */ | |
#define EAO_ASR 03 /* arith rshft */ | |
/* Machine status */ | |
#define MSR_V_BOV 15 /* bus carry */ | |
#define MSR_BOV (1u << MSR_V_BOV) | |
#define MSR_V_L 14 /* bus link */ | |
#define MSR_L (1u << MSR_V_L) /* bus link */ | |
#define MSR_V_FOA 8 /* arith func */ | |
#define MSR_M_FOA 03 | |
#define MSR_V_AOV 0 /* arith carry */ | |
#define MSR_AOV (1u << MSR_V_AOV) | |
#define MSR_GET_FOA(x) (((x) >> MSR_V_FOA) & MSR_M_FOA) | |
#define MSR_PUT_FOA(x,n) (((x) & ~(MSR_M_FOA << MSR_V_FOA)) | \ | |
(((n) & MSR_M_FOA) << MSR_V_FOA)) | |
/* Real time clock */ | |
#define RTC_OFF 001 /* off */ | |
#define RTC_ON 002 /* clock on */ | |
#define RTC_OV 010 /* clock flag */ | |
#define RTC_CTR 0103 /* counter */ | |
/* Terminal */ | |
#define TTY_ORDY 002 /* output flag */ | |
#define TTY_IRDY 010 /* input flag */ | |
/* Paper tape */ | |
#define PT_STRT 001 /* start reader */ | |
#define PT_ORDY 002 /* output flag */ | |
#define PT_IRDY 010 /* input flag */ | |
/* Interrupt masks (ISR) */ | |
#define INT_V_TTO 0 /* console out */ | |
#define INT_V_TTI 1 /* console in */ | |
#define INT_V_HSP 2 /* paper tape punch */ | |
#define INT_V_HSR 3 /* paper tape reader */ | |
#define INT_V_RTC 11 /* clock */ | |
#define INT_V_NODEF 16 /* nodefer */ | |
#define INT_V_ON 17 /* enable */ | |
#define INT_TTO (1u << INT_V_TTO) | |
#define INT_TTI (1u << INT_V_TTI) | |
#define INT_HSP (1u << INT_V_HSP) | |
#define INT_HSR (1u << INT_V_HSR) | |
#define INT_RTC (1u << INT_V_RTC) | |
#define INT_NODEF (1u << INT_V_NODEF) | |
#define INT_ON (1u << INT_V_ON) | |
#define INT_PENDING (INT_ON | INT_NODEF) | |
/* Vectors */ | |
#define VEC_BKP 0000 /* breakpoint */ | |
#define VEC_TTO 0011 /* console out */ | |
#define VEC_TTI 0014 /* console in */ | |
#define VEC_HSP 0017 /* paper tape punch */ | |
#define VEC_HSR 0022 /* paper tape reader */ | |
#define VEC_RTC 0100 /* clock */ |