438 lines
11 KiB
C
438 lines
11 KiB
C
/* i7090_defs.h: IBM 7090 simulator definitions
|
|
|
|
Copyright (c) 2005, 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"
|
|
|
|
#define PAMASK (MAXMEMSIZE - 1) /* physical addr mask */
|
|
#define MEM_ADDR_OK(x) (((uint16) (x&077777)) < MEMSIZE)
|
|
#define ReadP(x) (M[x])
|
|
#define WriteP(x,y) if (MEM_ADDR_OK (x)) M[x] = y
|
|
extern t_uint64 M[MAXMEMSIZE];
|
|
extern t_uint64 assembly[NUM_CHAN];
|
|
|
|
/* Processor specific masks */
|
|
#define ONEBIT 00200000000000LL
|
|
#define PMASK 00377777777777LL
|
|
#define RMASK 00000000777777LL
|
|
#define LMASK 00777777000000LL
|
|
#define AMSIGN 02000000000000LL
|
|
#define AMMASK 01777777777777LL
|
|
#define AQSIGN 01000000000000LL
|
|
#define AQMASK 00777777777777LL
|
|
#define APSIGN 00400000000000LL
|
|
#define PREMASK 00700000000000LL
|
|
#define AMASK 00000000077777LL
|
|
#define TMASK 00000000700000LL
|
|
#define DMASK 00077777000000LL
|
|
#define MSIGN 00400000000000LL
|
|
#define WMASK 00777777777777LL
|
|
#define FPCMASK 00377000000000LL
|
|
#define FPMMASK 00000777777777LL
|
|
#define FPOBIT 00001000000000LL
|
|
#define FPNBIT 00000400000000LL
|
|
#define FPMQERR 00000001000000LL /* Bit 17 */
|
|
#define FPACERR 00000002000000LL /* Bit 16 */
|
|
#define FPOVERR 00000004000000LL /* Bit 15 */
|
|
#define FPSPERR 00000010000000LL /* Bit 14 */
|
|
#define FPDPERR 00000040000000LL /* Bit 12 */
|
|
|
|
/* 7090 specific channel functions */
|
|
/* Reset the channel, clear any pending device */
|
|
void chan_rst(int chan, int type);
|
|
|
|
/* Issue a command to a channel */
|
|
int chan_cmd(uint16 dev, uint16 cmd);
|
|
|
|
/* Give channel a command, any executing command is aborted */
|
|
int chan_start(int chan, uint16 addr);
|
|
|
|
/* Give channel a new address to start working at */
|
|
int chan_load(int chan, uint16 addr);
|
|
|
|
/* return the channels current command address */
|
|
void chan_store(int chan, uint16 addr);
|
|
|
|
/* Nop for the momement */
|
|
void chan_store_diag(int chan, uint16 addr);
|
|
|
|
/* Channel data handling */
|
|
int chan_write(int chan, t_uint64 *data, int flags);
|
|
int chan_read(int chan, t_uint64 *data, int flags);
|
|
|
|
void chan_proc();
|
|
|
|
extern uint16 dev_pulse[NUM_CHAN]; /* Device pulse */
|
|
#define PUNCH_1 000001
|
|
#define PUNCH_2 000002
|
|
#define PUNCH_M 000003
|
|
#define PRINT_I 000004
|
|
#define PRINT_1 000010
|
|
#define PRINT_2 000020
|
|
#define PRINT_3 000040
|
|
#define PRINT_4 000100
|
|
#define PRINT_5 000200
|
|
#define PRINT_6 000400
|
|
#define PRINT_7 001000
|
|
#define PRINT_8 002000
|
|
#define PRINT_9 004000
|
|
#define PRINT_10 010000
|
|
#define PRINT_M 017770
|
|
|
|
/* Opcodes */
|
|
#define OP_TXI 1
|
|
#define OP_TIX 2
|
|
#define OP_TXH 3
|
|
#define OP_STR 5
|
|
#define OP_TNX 6
|
|
#define OP_TXL 7
|
|
|
|
/* Positive opcodes */
|
|
#define OP_HTR 0000
|
|
#define OP_TRA 0020
|
|
#define OP_TTR 0021
|
|
#define OP_TRCA 0022
|
|
#define OP_TRCC 0024
|
|
#define OP_TRCE 0026
|
|
#define OP_TRCG 0027
|
|
#define OP_TEFA 0030
|
|
#define OP_TEFC 0031
|
|
#define OP_TEFE 0032
|
|
#define OP_TEFG 0033
|
|
#define OP_TLQ 0040
|
|
#define OP_IIA 0041
|
|
#define OP_TIO 0042
|
|
#define OP_OAI 0043
|
|
#define OP_PAI 0044
|
|
#define OP_TIF 0046
|
|
#define OP_IIR 0051
|
|
#define OP_RFT 0054
|
|
#define OP_SIR 0055
|
|
#define OP_RNT 0056
|
|
#define OP_RIR 0057
|
|
#define OP_TCOA 0060
|
|
#define OP_TCOB 0061
|
|
#define OP_TCOC 0062
|
|
#define OP_TCOD 0063
|
|
#define OP_TCOE 0064
|
|
#define OP_TCOF 0065
|
|
#define OP_TCOG 0066
|
|
#define OP_TCOH 0067
|
|
#define OP_TSX 0074
|
|
#define OP_TZE 0100
|
|
#define OP_TIA 0101
|
|
#define OP_CVR 0114
|
|
#define OP_TPL 0120
|
|
#define OP_XCA 0131
|
|
#define OP_TOV 0140
|
|
#define OP_TQP 0162
|
|
#define OP_TQO 0161
|
|
#define OP_MPY 0200
|
|
#define OP_VLM 0204
|
|
#define OP_DVH 0220
|
|
#define OP_DVP 0221
|
|
#define OP_VDH 0224
|
|
#define OP_VDP 0225
|
|
#define OP_FDH 0240
|
|
#define OP_FDP 0241
|
|
#define OP_FMP 0260
|
|
#define OP_DFMP 0261
|
|
#define OP_FAD 0300
|
|
#define OP_DFAD 0301
|
|
#define OP_FSB 0302
|
|
#define OP_DFSB 0303
|
|
#define OP_FAM 0304
|
|
#define OP_DFAM 0305
|
|
#define OP_FSM 0306
|
|
#define OP_DFSM 0307
|
|
#define OP_ANS 0320
|
|
#define OP_ERA 0322
|
|
#define OP_CAS 0340
|
|
#define OP_ACL 0361
|
|
#define OP_HPR 0420
|
|
#define OP_OSI 0442
|
|
#define OP_ADD 0400
|
|
#define OP_ADM 0401
|
|
#define OP_SUB 0402
|
|
#define OP_IIS 0440
|
|
#define OP_LDI 0441
|
|
#define OP_DLD 0443
|
|
#define OP_OFT 0444
|
|
#define OP_RIS 0445
|
|
#define OP_ONT 0446
|
|
#define OP_LDA 0460 /* 704 only */
|
|
#define OP_CLA 0500
|
|
#define OP_CLS 0502
|
|
#define OP_ZET 0520
|
|
#define OP_XEC 0522
|
|
#define OP_LXA 0534
|
|
#define OP_LAC 0535
|
|
#define OP_RSCA 0540
|
|
#define OP_RSCC 0541
|
|
#define OP_RSCE 0542
|
|
#define OP_RSCG 0543
|
|
#define OP_STCA 0544
|
|
#define OP_STCC 0545
|
|
#define OP_STCE 0546
|
|
#define OP_STCG 0547
|
|
#define OP_LDQ 0560
|
|
#define OP_ECA 0561
|
|
#define OP_LRI 0562
|
|
#define OP_ENB 0564
|
|
#define OP_STZ 0600
|
|
#define OP_STO 0601
|
|
#define OP_SLW 0602
|
|
#define OP_STI 0604
|
|
#define OP_STA 0621
|
|
#define OP_STD 0622
|
|
#define OP_STT 0625
|
|
#define OP_STP 0630
|
|
#define OP_SXA 0634
|
|
#define OP_SCA 0636
|
|
#define OP_SCHA 0640
|
|
#define OP_SCHC 0641
|
|
#define OP_SCHE 0642
|
|
#define OP_SCHG 0643
|
|
#define OP_SCDA 0644
|
|
#define OP_SCDC 0645
|
|
#define OP_SCDE 0646
|
|
#define OP_SCDG 0647
|
|
#define OP_ELD 0670
|
|
#define OP_EAD 0671
|
|
#define OP_EDP 0672
|
|
#define OP_EMP 0673
|
|
#define OP_CPY 0700 /* 704 only */
|
|
#define OP_PAX 0734
|
|
#define OP_PAC 0737
|
|
#define OP_PXA 0754
|
|
#define OP_PCA 0756
|
|
#define OP_NOP 0761
|
|
#define OP_RDS 0762
|
|
#define OP_LLS 0763
|
|
#define OP_BSR 0764
|
|
#define OP_LRS 0765
|
|
#define OP_WRS 0766
|
|
#define OP_ALS 0767
|
|
#define OP_WEF 0770
|
|
#define OP_ARS 0771
|
|
#define OP_REW 0772
|
|
#define OP_AXT 0774
|
|
#define OP_DRS 0775
|
|
#define OP_SDN 0776
|
|
|
|
/* Negative opcodes */
|
|
#define OP_ESNT 04021
|
|
#define OP_TRCB 04022
|
|
#define OP_TRCD 04024
|
|
#define OP_TRCF 04026
|
|
#define OP_TRCH 04027
|
|
#define OP_TEFB 04030
|
|
#define OP_TEFD 04031
|
|
#define OP_TEFF 04032
|
|
#define OP_TEFH 04033
|
|
#define OP_RIA 04042
|
|
#define OP_PIA 04046
|
|
#define OP_IIL 04051
|
|
#define OP_LFT 04054
|
|
#define OP_SIL 04055
|
|
#define OP_LNT 04056
|
|
#define OP_RIL 04057
|
|
#define OP_TCNA 04060
|
|
#define OP_TCNB 04061
|
|
#define OP_TCNC 04062
|
|
#define OP_TCND 04063
|
|
#define OP_TCNE 04064
|
|
#define OP_TCNF 04065
|
|
#define OP_TCNG 04066
|
|
#define OP_TCNH 04067
|
|
#define OP_TNZ 04100
|
|
#define OP_TIB 04101
|
|
#define OP_CAQ 04114
|
|
#define OP_TMI 04120
|
|
#define OP_XCL 04130
|
|
#define OP_TNO 04140
|
|
#define OP_CRQ 04154
|
|
#define OP_DUFA 04301
|
|
#define OP_DUAM 04305
|
|
#define OP_DUFS 04303
|
|
#define OP_DUSM 04307
|
|
#define OP_DUFM 04261
|
|
#define OP_DFDH 04240
|
|
#define OP_DFDP 04241
|
|
#define OP_MPR 04200
|
|
#define OP_UFM 04260
|
|
#define OP_UFA 04300
|
|
#define OP_UFS 04302
|
|
#define OP_UAM 04304
|
|
#define OP_USM 04306
|
|
#define OP_ANA 04320
|
|
#define OP_LAS 04340
|
|
#define OP_SBM 04400
|
|
#define OP_CAL 04500
|
|
#define OP_ORA 04501
|
|
#define OP_NZT 04520
|
|
#define OP_LXD 04534
|
|
#define OP_LDC 04535
|
|
#define OP_RSCB 04540
|
|
#define OP_RSCD 04541
|
|
#define OP_RSCF 04542
|
|
#define OP_RSCH 04543
|
|
#define OP_STCB 04544
|
|
#define OP_STCD 04545
|
|
#define OP_STCF 04546
|
|
#define OP_STCH 04547
|
|
#define OP_ECQ 04561
|
|
#define OP_LPI 04564
|
|
#define OP_STQ 04600
|
|
#define OP_SRI 04601
|
|
#define OP_ORS 04602
|
|
#define OP_DST 04603
|
|
#define OP_SPI 04604
|
|
#define OP_SLQ 04620
|
|
#define OP_STL 04625
|
|
#define OP_SCD 04636
|
|
#define OP_SXD 04634
|
|
#define OP_SCHB 04640
|
|
#define OP_SCHD 04641
|
|
#define OP_SCHF 04642
|
|
#define OP_SCHH 04643
|
|
#define OP_SCDB 04644
|
|
#define OP_SCDD 04645
|
|
#define OP_SCDF 04646
|
|
#define OP_SCDH 04647
|
|
#define OP_ESB 04671
|
|
#define OP_EUA 04672
|
|
#define OP_EST 04673
|
|
#define OP_CAD 04700 /* 704 only */
|
|
#define OP_PDX 04734
|
|
#define OP_PDC 04737
|
|
#define OP_PXD 04754
|
|
#define OP_PCD 04756
|
|
#define OP_SPOP 04761
|
|
#define OP_LGL 04763
|
|
#define OP_BSF 04764
|
|
#define OP_LGR 04765
|
|
#define OP_RUN 04772
|
|
#define OP_RQL 04773
|
|
#define OP_AXC 04774
|
|
#define OP_TRS 04775
|
|
|
|
/* Positive 0760 opcodes */
|
|
#define OP_CLM 000000
|
|
#define OP_LBT 000001
|
|
#define OP_CHS 000002
|
|
#define OP_SSP 000003
|
|
#define OP_ENK 000004
|
|
#define OP_IOT 000005
|
|
#define OP_COM 000006
|
|
#define OP_ETM 000007
|
|
#define OP_RND 000010
|
|
#define OP_FRN 000011
|
|
#define OP_DCT 000012
|
|
#define OP_RCT 000014
|
|
#define OP_LMTM 000016
|
|
#define OP_RDCA 001352
|
|
#define OP_RDCB 002352
|
|
#define OP_RDCC 003352
|
|
#define OP_RDCD 004352
|
|
#define OP_RDCE 005352
|
|
#define OP_RDCF 006352
|
|
#define OP_RDCG 007352
|
|
#define OP_RDCH 010352
|
|
#define OP_RICA 001350
|
|
#define OP_RICB 002350
|
|
#define OP_RICC 003350
|
|
#define OP_RICD 004350
|
|
#define OP_RICE 005350
|
|
#define OP_RICF 006350
|
|
#define OP_RICG 007350
|
|
#define OP_RICH 010350
|
|
#define OP_SLF 000140
|
|
#define OP_SLN1 000141
|
|
#define OP_SLN2 000142
|
|
#define OP_SLN3 000143
|
|
#define OP_SLN4 000144
|
|
#define OP_SLN5 000145
|
|
#define OP_SLN6 000146
|
|
#define OP_SLN7 000147
|
|
#define OP_SLN8 000150
|
|
#define OP_SWT1 000161
|
|
#define OP_SWT2 000162
|
|
#define OP_SWT3 000163
|
|
#define OP_SWT4 000164
|
|
#define OP_SWT5 000165
|
|
#define OP_SWT6 000166
|
|
#define OP_BTTA 001000
|
|
#define OP_BTTB 002000
|
|
#define OP_BTTC 003000
|
|
#define OP_BTTD 004000
|
|
#define OP_BTTE 005000
|
|
#define OP_BTTF 006000
|
|
#define OP_BTTG 007000
|
|
#define OP_BTTH 010000
|
|
#define OP_PSE 0
|
|
|
|
/* Negative 0760 opcodes */
|
|
#define OP_ETTA 001000
|
|
#define OP_ETTB 002000
|
|
#define OP_ETTC 003000
|
|
#define OP_ETTD 004000
|
|
#define OP_ETTE 005000
|
|
#define OP_ETTF 006000
|
|
#define OP_ETTG 007000
|
|
#define OP_ETTH 010000
|
|
#define OP_PBT 000001
|
|
#define OP_EFTM 000002
|
|
#define OP_SSM 000003
|
|
#define OP_LFTM 000004
|
|
#define OP_ESTM 000005
|
|
#define OP_ECTM 000006
|
|
#define OP_LTM 000007
|
|
#define OP_LSNM 000010
|
|
#define OP_ETT 000011
|
|
#define OP_RTT 000012
|
|
#define OP_EMTM 000016
|
|
#define OP_SLT1 000141
|
|
#define OP_SLT2 000142
|
|
#define OP_SLT3 000143
|
|
#define OP_SLT4 000144
|
|
#define OP_SLT5 000145
|
|
#define OP_SLT6 000146
|
|
#define OP_SLT7 000147
|
|
#define OP_SLT8 000150
|
|
#define OP_SWT7 000161
|
|
#define OP_SWT8 000162
|
|
#define OP_SWT9 000163
|
|
#define OP_SWT10 000164
|
|
#define OP_SWT11 000165
|
|
#define OP_SWT12 000166
|
|
#define OP_MSE 0
|
|
|
|
/* Special Ops -0761 */
|
|
#define OP_SEA 000041
|
|
#define OP_SEB 000042
|
|
#define OP_IFT 000043
|
|
#define OP_EFT 000044
|
|
#define OP_ESM 000140
|
|
#define OP_TSM 000141
|
|
|