These include simulators for the IBM 701, IBM 702, IBM 704, IBM 705, IBM 705/3, IBM 709, IBM 1410/IBM 7010, IBM 7070, IBM 7080, IBM 7090 and IBM7094. These basically were a collection of machines that shared a common set it peripherals, Each group had its own instruction set, hence different simulators. IBM 701 -> i701 IBM 702/705/705/3/7080 -> i7080 IBM 7070/7074 -> i7070 IBM 1410/7010 -> i7010 IBM 704 -> i704 IBM 704/709/7090/7094 -> i7090 The i7090 can be set to simulate a IBM 704 however you end up disabling almost everything, since the 704 did not have any channels. A build option exists that allows this one to be built without all the extra features. The i7090 simulator’s implementation of the IBM 7094 is a more complete implementation of the IBM 7094 which can run CTSS while the existing simh I7094 can’t.
241 lines
8.5 KiB
C
241 lines
8.5 KiB
C
/* i7070_defs.h: IBM 7070 simulator definitions
|
|
|
|
Copyright (c) 2006-2016, Richard Cornwell
|
|
|
|
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
|
|
RICHARD CORNWELL 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.
|
|
|
|
*/
|
|
|
|
#include "sim_defs.h" /* simulator defns */
|
|
|
|
#include "i7000_defs.h"
|
|
/* Simulator stop codes */
|
|
|
|
#define STOP_IONRDY 1 /* I/O dev not ready */
|
|
#define STOP_HALT 2 /* HALT */
|
|
#define STOP_IBKPT 3 /* breakpoint */
|
|
#define STOP_UUO 4 /* invalid opcode */
|
|
#define STOP_INDLIM 5 /* indirect limit */
|
|
#define STOP_XECLIM 6 /* XEC limit */
|
|
#define STOP_IOCHECK 7 /* IOCHECK */
|
|
#define STOP_MMTRP 8 /* mm in trap */
|
|
#define STOP_INVLIN 9 /* 7750 invalid line number */
|
|
#define STOP_INVMSG 10 /* 7750 invalid message */
|
|
#define STOP_NOOFREE 11 /* 7750 No free output buffers */
|
|
#define STOP_NOIFREE 12 /* 7750 No free input buffers */
|
|
|
|
/* Trap codes */
|
|
|
|
|
|
/* Conditional error returns */
|
|
|
|
/* Memory */
|
|
|
|
#define MEM_ADDR_OK(x) (((uint32) (x)) < MEMSIZE)
|
|
extern t_uint64 M[MAXMEMSIZE];
|
|
|
|
/* Arithmetic */
|
|
|
|
/* Instruction format */
|
|
|
|
/* Globally visible flags */
|
|
#define DMASK 0x0FFFFFFFFFFLL
|
|
#define IMASK 0x000FFFF0000LL
|
|
#define IMASK2 0x00FFFFF0000LL
|
|
#define XMASK 0x00F00000000LL
|
|
#define XMASK2 0x0F000000000LL
|
|
#define AMASK 0x0000000FFFFLL
|
|
#define OMASK 0x0FF00000000LL
|
|
#define SMASK 0xF0000000000LL
|
|
#define PSIGN 0x90000000000LL
|
|
#define MSIGN 0x60000000000LL
|
|
#define ASIGN 0x30000000000LL
|
|
#define NINES 0x09999999999LL /* All nines */
|
|
#define FNINES 0x00099999999LL /* Floating point all nines */
|
|
#define EMASK 0x0FF00000000LL /* Floating point exponent */
|
|
#define FMASK 0x000FFFFFFFFLL /* Floating point mantisa mask */
|
|
#define NMASK 0x000F0000000LL /* Floating point normalize mask */
|
|
|
|
/* 7604 channel commands */
|
|
#define CHN_ALPHA_MODE 000 /* Recieve alpha words */
|
|
#define CHN_NUM_MODE 001 /* Recieve numeric words */
|
|
#define CHN_WRITE 002 /* Channel direction */
|
|
#define CHN_LAST 004 /* Last transfer */
|
|
#define CHN_MODE 0170 /* Mode of channel */
|
|
#define CHN_NORMAL 000 /* Normal mode */
|
|
#define CHN_COMPRESS 010 /* Compress leading zeros */
|
|
#define CHN_RECORD 020 /* Dectect record marks */
|
|
#define CHN_SEGMENT 040 /* Search for next segment */
|
|
#define CHN_ALPHA 0100 /* Alpha read only */
|
|
#define CHN_RM_FND 0200 /* Record mark read */
|
|
|
|
/* 7070 channel specific functions */
|
|
|
|
/* Issue a command to a channel */
|
|
int chan_cmd(uint16 dev, uint16 cmd, uint16 addr);
|
|
|
|
/* Decimal helper functions */
|
|
int dec_add(t_uint64 *a, t_uint64 b);
|
|
void dec_add_noov(t_uint64 *a, t_uint64 b);
|
|
void dec_comp(t_uint64 *a);
|
|
int dec_cmp(t_uint64 a, t_uint64 b);
|
|
void mul_step(t_uint64 *a, t_uint64 b, int c);
|
|
void div_step(t_uint64 b);
|
|
void bin_dec(t_uint64 *a, uint32 b, int s, int l);
|
|
uint32 dec_bin_idx(t_uint64 a);
|
|
uint32 dec_bin_lim(t_uint64 a, uint32 b);
|
|
int get_rdw(t_uint64 a, uint32 *base, uint32 *limit);
|
|
void upd_idx(t_uint64 *a, uint32 b);
|
|
int scan_irq();
|
|
|
|
/* Opcodes */
|
|
#define OP_HB 0x000
|
|
#define OP_B 0x001
|
|
#define OP_BLX 0x002
|
|
#define OP_CD 0x003
|
|
#define OP_EXMEM 0x004
|
|
#define OP_DIAGC 0x008
|
|
#define OP_DIAGT 0x009
|
|
#define OP_BZ1 0x010
|
|
#define OP_BV1 0x011
|
|
#define OP_ST1 0x012
|
|
#define OP_ZA1 0x013
|
|
#define OP_A1 0x014
|
|
#define OP_C1 0x015
|
|
#define OP_ZAA 0x016
|
|
#define OP_AA 0x017
|
|
#define OP_AS1 0x018
|
|
#define OP_AAS1 0x019
|
|
#define OP_BZ2 0x020
|
|
#define OP_BV2 0x021
|
|
#define OP_ST2 0x022
|
|
#define OP_ZA2 0x023
|
|
#define OP_A2 0x024
|
|
#define OP_C2 0x025
|
|
#define OP_AS2 0x028
|
|
#define OP_AAS2 0x029
|
|
#define OP_BZ3 0x030
|
|
#define OP_BV3 0x031
|
|
#define OP_ST3 0x032
|
|
#define OP_ZA3 0x033
|
|
#define OP_A3 0x034
|
|
#define OP_C3 0x035
|
|
#define OP_AS3 0x038
|
|
#define OP_AAS3 0x039
|
|
#define OP_BL 0x040
|
|
#define OP_BFLD 0x041
|
|
#define OP_BXN 0x044
|
|
#define OP_XL 0x045
|
|
#define OP_XZA 0x046
|
|
#define OP_XA 0x047
|
|
#define OP_XSN 0x048
|
|
#define OP_BIX 0x049
|
|
#define OP_SC 0x050
|
|
#define OP_BSWITCH 0x051
|
|
#define OP_M 0x053
|
|
#define OP_INQ 0x054
|
|
#define OP_PC 0x055
|
|
#define OP_ENA 0x056
|
|
#define OP_ENB 0x057
|
|
#define OP_PRTST 0x060
|
|
#define OP_BSW21 0x061
|
|
#define OP_BSW22 0x062
|
|
#define OP_BSW23 0x063
|
|
#define OP_PR 0x064
|
|
#define OP_RS 0x065
|
|
#define OP_LL 0x066
|
|
#define OP_LE 0x067
|
|
#define OP_LEH 0x068
|
|
#define OP_UREC 0x069
|
|
#define OP_FBV 0x070
|
|
#define OP_FR 0x071
|
|
#define OP_FM 0x073
|
|
#define OP_FA 0x074
|
|
#define OP_FZA 0x075
|
|
#define OP_FAD 0x076
|
|
#define OP_FAA 0x077
|
|
#define OP_TAPP1 0x081
|
|
#define OP_TAPP2 0x082
|
|
#define OP_TAPP3 0x083
|
|
#define OP_TAPP4 0x084
|
|
#define OP_TRNP 0x088
|
|
#define OP_CHNP1 0x093
|
|
#define OP_CHNP2 0x094
|
|
#define OP_CHNP3 0x096
|
|
#define OP_CHNP4 0x097
|
|
#define OP_HP 0x100
|
|
#define OP_NOP 0x101
|
|
#define OP_CS 0x103
|
|
#define OP_DIAGS 0x108
|
|
#define OP_DIAGR 0x109
|
|
#define OP_BM1 0x110
|
|
#define OP_ZST1 0x111
|
|
#define OP_STD1 0x112
|
|
#define OP_ZS1 0x113
|
|
#define OP_S1 0x114
|
|
#define OP_CA 0x115
|
|
#define OP_ZSA 0x116
|
|
#define OP_SA 0x117
|
|
#define OP_SS1 0x118
|
|
#define OP_BM2 0x120
|
|
#define OP_ZST2 0x121
|
|
#define OP_STD2 0x122
|
|
#define OP_ZS2 0x123
|
|
#define OP_S2 0x124
|
|
#define OP_SS2 0x128
|
|
#define OP_BM3 0x130
|
|
#define OP_ZST3 0x131
|
|
#define OP_STD3 0x132
|
|
#define OP_ZS3 0x133
|
|
#define OP_S3 0x134
|
|
#define OP_SS3 0x138
|
|
#define OP_BH 0x140
|
|
#define OP_BE 0x141
|
|
#define OP_BCX 0x143
|
|
#define OP_BXM 0x144
|
|
#define OP_XU 0x145
|
|
#define OP_XZS 0x146
|
|
#define OP_XS 0x147
|
|
#define OP_XLIN 0x148
|
|
#define OP_BDX 0x149
|
|
#define OP_CSC 0x150
|
|
#define OP_D 0x153
|
|
#define OP_ENS 0x156
|
|
#define OP_EAN 0x157
|
|
#define OP_PRION 0x161
|
|
#define OP_PRIOF 0x162
|
|
#define OP_RG 0x165
|
|
#define OP_FBU 0x170
|
|
#define OP_FD 0x173
|
|
#define OP_FS 0x174
|
|
#define OP_FDD 0x175
|
|
#define OP_FADS 0x176
|
|
#define OP_FSA 0x177
|
|
#define OP_TAP1 0x181
|
|
#define OP_TAP2 0x182
|
|
#define OP_TAP3 0x183
|
|
#define OP_TAP4 0x184
|
|
#define OP_TRN 0x188
|
|
#define OP_CHN1 0x193
|
|
#define OP_CHN2 0x194
|
|
#define OP_CHN3 0x196
|
|
#define OP_CHN4 0x197
|
|
|
|
|
|
|
|
|