blob: 76b3bc39b832b50c0ab87e151308801fef9a80f8 [file] [log] [blame] [raw]
/* id4_defs.h: Interdata 4 simulator definitions
Copyright (c) 1993-2001, 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.
07-Oct-00 RMS Overhauled I/O subsystem
14-Apr-99 RMS Changed t_addr to unsigned
The author gratefully acknowledges the help of Carl Friend, who provided
key documents about the Interdata 4. Questions answered to date:
1. Do device interrupt enables mask interrupt requests or prevent
interrupt requests? A: Mask interrupt requests.
2. Does SLHA set C from shift out of bit <0> or bit <1>? A: From <1>.
3. What is the limit on device numbers? A: 256. How big must the
interrupt request and enable arrays be? A: 8 x 32b.
4. Does BXH subtract or add the second argument?
5. Do BXH and BXLE do a logical or arithmetic compare? A: Logical.
6. Do ACH and SCH produce normal GL codes, or do they take into account
prior GL codes?
*/
#include "sim_defs.h" /* simulator defns */
/* Simulator stop codes */
#define STOP_RSRV 1 /* must be 1 */
#define STOP_HALT 2 /* HALT */
#define STOP_IBKPT 3 /* breakpoint */
#define STOP_WAIT 4 /* wait */
/* Memory */
#define MAXMEMSIZE 65536 /* max memory size */
#define MEMSIZE (cpu_unit.capac) /* actual memory size */
#define AMASK (MAXMEMSIZE - 1) /* address mask */
#define MEM_ADDR_OK(x) (((t_addr) (x)) < MEMSIZE)
#define ReadW(x) M[(x) >> 1]
#define WriteW(x,d) if (MEM_ADDR_OK (x)) M[(x) >> 1] = d
#define ReadB(x) ((M[(x) >> 1] >> (((x) & 1)? 0: 8)) & 0xFF)
#define WriteB(x,d) if (MEM_ADDR_OK (x)) M[(x) >> 1] = \
(((x) & 1)? ((M[(x) >> 1] & ~0xFF) | (d)): \
((M[(x) >> 1] & 0xFF) | ((d) << 8)))
/* Architectural constants */
#define SIGN 0x8000 /* sign bit */
#define DMASK 0xFFFF /* data mask */
#define MAGMASK 0x7FFF /* magnitude mask */
#define OP_4B 0x40 /* 2 byte vs 4 byte */
#define CC_C 0x8 /* carry */
#define CC_V 0x4 /* overflow */
#define CC_G 0x2 /* greater than */
#define CC_L 0x1 /* less than */
#define CC_MASK (CC_C | CC_V | CC_G | CC_L)
#define PSW_WAIT 0x8000 /* wait */
#define PSW_EXI 0x4000 /* ext intr enable */
#define PSW_MCI 0x2000 /* machine check enable */
#define PSW_DFI 0x1000 /* divide fault enable */
#define PSW_FDI 0x0400 /* flt divide fault enable */
#define FDOPSW 0x28 /* flt div fault old PSW */
#define FDNPSW 0x2C /* flt div fault new PSW */
#define ILOPSW 0x30 /* illegal op old PSW */
#define ILNPSW 0x34 /* illegal op new PSW */
#define MCOPSW 0x38 /* machine check old PSW */
#define MCNPSW 0x3C /* machine check new PSW */
#define EXOPSW 0x40 /* external intr old PSW */
#define EXNPSW 0x44 /* external intr new PSW */
#define IDOPSW 0x48 /* int div fault old PSW */
#define IDNPSW 0x4C /* int div fault new PSW */
/* I/O operations */
#define IO_ADR 0x0 /* address select */
#define IO_RD 0x1 /* read */
#define IO_WD 0x2 /* write */
#define IO_OC 0x3 /* output command */
#define IO_SS 0x5 /* sense status */
/* Device return codes: data byte is <7:0> */
#define IOT_V_EXM 8 /* set V flag */
#define IOT_EXM (1u << IOT_V_EXM)
#define IOT_V_REASON 9 /* set reason */
/* Device command byte */
#define CMD_V_INT 6 /* interrupt control */
#define CMD_M_INT 0x3
#define CMD_IENB 1 /* enable */
#define CMD_IDIS 2 /* disable */
#define CMD_ICOM 3 /* complement */
#define CMD_GETINT(x) (((x) >> CMD_V_INT) & CMD_M_INT)
/* Device status byte */
#define STA_BSY 0x8 /* busy */
#define STA_EX 0x4 /* examine status */
#define STA_EOM 0x2 /* end of medium */
#define STA_DU 0x1 /* device unavailable */
/* Device numbers */
#define DEV_LOW 0x01 /* lowest intr dev */
#define DEV_MAX 0xFF /* highest intr dev */
#define DEVNO (DEV_MAX + 1) /* number of devices */
#define INTSZ ((DEVNO + 31) / 32) /* number of interrupt words */
#define DS 0x01 /* display and switches */
#define TT 0x02 /* teletype */
#define PT 0x03 /* paper tape */
#define CD 0x04 /* card reader */
/* I/O macros */
#define INT_V(d) (1u << ((d) & 0x1F))
#define SET_INT(d) int_req[(d)/32] = int_req[(d)/32] | INT_V (d)
#define CLR_INT(d) int_req[(d)/32] = int_req[(d)/32] & ~INT_V (d)
#define SET_ENB(d) int_enb[(d)/32] = int_enb[(d)/32] | INT_V (d)
#define COM_ENB(d) int_enb[(d)/32] = int_enb[(d)/32] ^ INT_V (d)
#define CLR_ENB(d) int_enb[(d)/32] = int_enb[(d)/32] & ~INT_V (d)
#define IORETURN(f,v) ((f)? (v): SCPE_OK) /* stop on error */