| /* i7094_sys.c: IBM 7094 simulator interface | |
| Copyright (c) 2003-2011, 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. | |
| 31-Dec-11 RMS Added SPI, SPI | |
| 16-Jul-10 RMS Added SPUx, SPTx, SPRx | |
| 29-Oct-06 RMS Added additional expanded core instructions | |
| 08-Jun-06 RMS Added Dave Pitts' binary loader | |
| */ | |
| #include "i7094_defs.h" | |
| #include <ctype.h> | |
| #include "i7094_dat.h" | |
| extern DEVICE cpu_dev; | |
| extern DEVICE ch_dev[NUM_CHAN]; | |
| extern DEVICE mt_dev[NUM_CHAN]; | |
| extern DEVICE drm_dev; | |
| extern DEVICE dsk_dev; | |
| extern DEVICE com_dev, coml_dev; | |
| extern DEVICE cdr_dev, cdp_dev; | |
| extern DEVICE lpt_dev; | |
| extern DEVICE clk_dev; | |
| extern UNIT cpu_unit; | |
| extern REG cpu_reg[]; | |
| uint32 cvt_code_to_ascii (uint32 c, int32 sw); | |
| uint32 cvt_ascii_to_code (uint32 c, int32 sw); | |
| /* SCP data structures and interface routines | |
| sim_name simulator name string | |
| sim_PC pointer to saved PC register descriptor | |
| sim_emax number of words for examine | |
| sim_devices array of pointers to simulated devices | |
| sim_stop_messages array of pointers to stop messages | |
| sim_load binary loader | |
| */ | |
| char sim_name[] = "IBM 7094"; | |
| REG *sim_PC = &cpu_reg[0]; | |
| int32 sim_emax = 1; | |
| DEVICE *sim_devices[] = { | |
| &cpu_dev, | |
| &clk_dev, | |
| &ch_dev[0], | |
| &ch_dev[1], | |
| &ch_dev[2], | |
| &ch_dev[3], | |
| &ch_dev[4], | |
| &ch_dev[5], | |
| &ch_dev[6], | |
| &ch_dev[7], | |
| &mt_dev[0], | |
| &mt_dev[1], | |
| &mt_dev[2], | |
| &mt_dev[3], | |
| &mt_dev[4], | |
| &mt_dev[5], | |
| &mt_dev[6], | |
| &mt_dev[7], | |
| &cdr_dev, | |
| &cdp_dev, | |
| &lpt_dev, | |
| &dsk_dev, | |
| &drm_dev, | |
| &com_dev, | |
| &coml_dev, | |
| NULL | |
| }; | |
| char ch_bkpt_msg[] = "Channel A breakpoint, CLC: xxxxxx"; | |
| const char *sim_stop_messages[] = { | |
| "Unknown error", | |
| "HALT instruction", | |
| "Breakpoint", | |
| "Undefined instruction", | |
| "Divide check", | |
| "Nested XEC limit exceeded", | |
| "Address stop", | |
| "Non-existent channel", | |
| "Illegal instruction for 7909 channel", | |
| "Illegal instruction for non-7909 channel", | |
| "Non-existent device", | |
| "Undefined channel instruction", | |
| "Write to protected device", | |
| "Illegal instruction for device", | |
| "Invalid 7631 track format", | |
| "7750 buffer pool empty on input", | |
| "7750 buffer pool empty on output", | |
| "7750 invalid line number", | |
| "7750 invalid message", | |
| ch_bkpt_msg | |
| }; | |
| /* Modify channel breakpoint message */ | |
| t_stat ch_bkpt (uint32 ch, uint32 clc) | |
| { | |
| ch_bkpt_msg[8] = 'A' + ch; | |
| sprintf (&ch_bkpt_msg[27], "%06o", clc); | |
| return STOP_CHBKPT; | |
| } | |
| /* Binary loader, not implemented */ | |
| t_stat sim_load (FILE *fileref, char *cptr, char *fnam, int flag) | |
| { | |
| extern t_stat binloader (FILE *fd, char *file, int loadpt); | |
| if (flag == 0) | |
| return binloader (fileref, cptr, 0); | |
| return SCPE_NOFNC; | |
| } | |
| /* Symbol tables */ | |
| #define I_V_FL 39 /* inst class */ | |
| #define I_M_FL 017 /* class mask */ | |
| #define I_NOP INT64_C(0000000000000000) /* no operand */ | |
| #define I_MXR INT64_C(0010000000000000) /* addr(tag) */ | |
| #define I_MXN INT64_C(0020000000000000) /* *addr(tag) */ | |
| #define I_MXV INT64_C(0030000000000000) /* var mul/div */ | |
| #define I_MXC INT64_C(0040000000000000) /* convert */ | |
| #define I_DNP INT64_C(0050000000000000) /* decr, no oper */ | |
| #define I_DEC INT64_C(0060000000000000) /* decrement */ | |
| #define I_SNS INT64_C(0070000000000000) /* sense */ | |
| #define I_IMM INT64_C(0100000000000000) /* 18b immediate */ | |
| #define I_TAG INT64_C(0110000000000000) /* tag only */ | |
| #define I_IOX INT64_C(0120000000000000) /* IO channel */ | |
| #define I_TCH INT64_C(0130000000000000) /* transfer channel */ | |
| #define I_I9N INT64_C(0140000000000000) /* 7909 with nostore */ | |
| #define I_I9S INT64_C(0150000000000000) /* 7909 */ | |
| #define I_SPX INT64_C(0160000000000000) /* SPU, SPR */ | |
| #define IFAKE_7607 INT64_C(0001000000000000) /* fake op extensions */ | |
| #define IFAKE_7909 INT64_C(0002000000000000) | |
| #define DFAKE (DMASK|IFAKE_7607|IFAKE_7909) | |
| #define I_N_NOP 000 | |
| #define I_N_MXR 001 | |
| #define I_N_MXN 002 | |
| #define I_N_MXV 003 | |
| #define I_N_MXC 004 | |
| #define I_N_DNP 005 | |
| #define I_N_DEC 006 | |
| #define I_N_SNS 007 | |
| #define I_N_IMM 010 | |
| #define I_N_TAG 011 | |
| #define I_N_IOX 012 | |
| #define I_N_TCH 013 | |
| #define I_N_I9N 014 | |
| #define I_N_I9S 015 | |
| #define I_N_SPX 016 | |
| #define INST_P_XIT 0 /* exit */ | |
| #define INST_P_SKP 1 /* do not print */ | |
| #define INST_P_PRA 2 /* print always */ | |
| #define INST_P_PNZ 3 /* print if nz */ | |
| #define INST_P_PNT 4 /* print if nz, term */ | |
| static const t_uint64 masks[15] = { | |
| INT64_C(03777700000000), INT64_C(03777700000000), | |
| INT64_C(03777700000000), INT64_C(03777700000000), | |
| INT64_C(03777400000000), INT64_C(03700000000000), | |
| INT64_C(03700000000000), INT64_C(03777700077777), | |
| INT64_C(03777700000000), INT64_C(03777700000000), | |
| INT64_C(03700000200000), INT64_C(03700000200000), | |
| INT64_C(03760000200000), INT64_C(03740000200000), | |
| INT64_C(03777700077760) }; | |
| static const uint32 fld_max[15][3] = { /* addr,tag,decr limit */ | |
| { INST_M_ADDR, INST_M_TAG, 0 }, | |
| { INST_M_ADDR, INST_M_TAG, 0 }, | |
| { INST_M_ADDR, INST_M_TAG, 0 }, | |
| { INST_M_ADDR, INST_M_TAG, INST_M_VCNT }, | |
| { INST_M_ADDR, INST_M_TAG, INST_M_CCNT }, | |
| { INST_M_ADDR, INST_M_TAG, INST_M_DEC }, | |
| { INST_M_ADDR, INST_M_TAG, INST_M_DEC }, | |
| { 0, INST_M_TAG, 0 }, | |
| { RMASK, 0, 0 }, | |
| { INST_M_ADDR, INST_M_TAG, 0 }, | |
| { INST_M_ADDR, 1, INST_M_DEC }, | |
| { INST_M_ADDR, 1, 0 }, | |
| { INST_M_ADDR, 1, 0 }, | |
| { INST_M_ADDR, 1, 0 }, | |
| { INST_M_4B, INST_M_TAG, 0 } | |
| }; | |
| static const uint32 fld_fmt[15][3] = { /* addr,tag,decr print */ | |
| { INST_P_PNT, INST_P_PNT, INST_P_XIT }, /* nop: all optional */ | |
| { INST_P_PRA, INST_P_PNT, INST_P_XIT }, /* mxr: tag optional */ | |
| { INST_P_PRA, INST_P_PNT, INST_P_XIT }, /* mxn: tag optional */ | |
| { INST_P_PRA, INST_P_PNZ, INST_P_PRA }, /* mxv: tag optional */ | |
| { INST_P_PRA, INST_P_PNZ, INST_P_PRA }, /* cvt: tag optional */ | |
| { INST_P_PNT, INST_P_PNT, INST_P_PNT }, /* dnp: all optional */ | |
| { INST_P_PRA, INST_P_PRA, INST_P_PRA }, /* dec: print all */ | |
| { INST_P_SKP, INST_P_PNT, INST_P_XIT }, /* sns: skip addr, tag opt */ | |
| { INST_P_PRA, INST_P_XIT, INST_P_XIT }, /* immediate: addr only */ | |
| { INST_P_PNZ, INST_P_PRA, INST_P_XIT }, /* tag: addr optional */ | |
| { INST_P_PRA, INST_P_PNZ, INST_P_PRA }, /* iox: tag optional */ | |
| { INST_P_PRA, INST_P_PNT, INST_P_XIT }, /* tch: tag optional */ | |
| { INST_P_PRA, INST_P_PNT, INST_P_XIT }, /* i9n: tag optional */ | |
| { INST_P_PRA, INST_P_PNT, INST_P_XIT }, /* i9s: tag optional */ | |
| { INST_P_PNZ, INST_P_PNT, INST_P_XIT } /* SPx: tag optional */ | |
| }; | |
| static const t_uint64 ind_test[15] = { | |
| 0, 0, INST_IND, 0, 0, 0, 0, 0, | |
| 0, 0, CHI_IND, CHI_IND, CHI_IND, CHI_IND, 0 | |
| }; | |
| static const char *opcode[] = { | |
| "TXI", "TIX", "TXH", | |
| "STR", "TNX", "TXL", | |
| "HTR", "TRA", "TTR", | |
| "CLM", "LBT", "CHS", | |
| "SSP", "ENK", "IOT", | |
| "COM", "ETM", "RND", | |
| "FRN", "DCT", "RCT", | |
| "LMTM", "SLF", "SLN1", | |
| "SLN2", "SLN3", "SLN4", | |
| "SWT1", "SWT2", "SWT3", | |
| "SWT4", "SWT5", "SWT6", | |
| "BTTA", "BTTB", "BTTC", | |
| "BTTD", "BTTE", "BTTF", | |
| "BTTG", "BTTH", | |
| "RICA", "RICB", "RICC", | |
| "RICD", "RICE", "RICF", | |
| "RICG", "RICH", | |
| "RDCA", "RDCB", "RDCC", | |
| "RDCD", "RDCE", "RDCF", | |
| "RDCG", "RDCH", | |
| "SPUA", "SPUB", "SPUC", | |
| "SPUD", "SPUE", "SPUF", | |
| "SPUG", "SPUH", | |
| "SPTA", "SPTB", "SPTC", | |
| "SPTD", "SPTE", "SPTF", | |
| "SPTG", "SPTH", | |
| "SPRA", "SPRB", "SPRC", | |
| "SPRD", "SPRE", "SPRF", | |
| "SPRG", "SPRH", | |
| "TRCA", "TRCC", | |
| "TRCE", "TRCG", | |
| "TEFA", "TEFC", | |
| "TEFE", "TEFG", | |
| "TLQ", "IIA", "TIO", | |
| "OAI", "PAI", "TIF", | |
| "IIR", "RFT", "SIR", | |
| "RNT", "RIR", | |
| "TCOA", "TCOB", "TCOC", | |
| "TCOD", "TCOE", "TCOF", | |
| "TCOG", "TCOH", "TSX", | |
| "TZE", "CVR", "TPL", | |
| "XCA", "TOV", | |
| "TQO", "TQP", | |
| "MPY", "VLM", "VLM1", | |
| "DVH", "DVP", | |
| "VDH", "VDP", | |
| "VDH2", "VDP2", | |
| "FDH", "FDP", | |
| "FMP", "DFMP", | |
| "FAD", "DFAD", | |
| "FSB", "DFSB", | |
| "FAM", "DFAM", | |
| "FSM", "DFSM", | |
| "ANS", "ERA", | |
| "CAS", "ACL", | |
| "ADD", "ADM", | |
| "SUB", "SBM", | |
| "HPR", "IIS", "LDI", | |
| "OSI", "DLD", "OFT", | |
| "RIS", "ONT", | |
| "CLA", "CLS", | |
| "ZET", "XEC", | |
| "LXA", "LAC", | |
| "RCHA", "RCHC", | |
| "RCHE", "RCHG", | |
| "LCHA", "LCHC", | |
| "LCHE", "LCHG", | |
| "RSCA", "RSCC", | |
| "RSCE", "RSCG", | |
| "STCA", "STCC", | |
| "STCE", "STCG", | |
| "LDQ", "ENB", | |
| "STZ", "STO", "SLW", | |
| "STI", "STA", "STD", | |
| "STT", "STP", | |
| "SXA", "SCA", | |
| "SCHA", "SCHC", | |
| "SCHE", "SCHG", | |
| "SCDA", "SCDC", | |
| "SCDE", "SCDG", | |
| "PAX", "PAC", | |
| "PXA", "PCA", | |
| "PSE", "NOP", "RDS", | |
| "LLS", "BSR", "LRS", | |
| "WRS", "ALS", "WEF", | |
| "ARS", "REW", "AXT", | |
| "SDN", | |
| "CLM", "PBT", "EFTM", | |
| "SSM", "LFTM", "ESTM", | |
| "ECTM", "LTM", "LSNM", | |
| "EMTM", "SLT1", "SLT2", | |
| "SLT3", "SLT4", | |
| "ETTA", "ETTB", "ETTC", | |
| "ETTD", "ETTE", "ETTF", | |
| "ETTG", "ETTH", | |
| "ESNT", | |
| "TRCB", "TRCD", | |
| "TRCF", "TRCH", | |
| "TEFB", "TEFD", | |
| "TEFF", "TEFH", | |
| "RIA", "PIA", | |
| "IIL", "LFT", "SIL", | |
| "LNT", "RIL", | |
| "TCNA", "TCNB", "TCNC", | |
| "TCND", "TCNE", "TCNF", | |
| "TCNG", "TCNH", | |
| "TNZ", "CVR", "TMI", | |
| "XCL", "TNO", "CRQ", | |
| "MPR", "DFDH", "DFDP", | |
| "UFM", "DUFM", | |
| "UFA", "DUFA", | |
| "UFS", "DUFS", | |
| "UAM", "DUAM", | |
| "USM", "DUSM", | |
| "ANA", "LAS", | |
| "CAL", "ORA", "NZT", | |
| "LXD", "LXC", | |
| "RCHB", "RCHD", | |
| "RCHF", "RCHH", | |
| "LCHB", "LCHD", | |
| "LCHF", "LCHH", | |
| "RSCB", "RSCD", | |
| "RSCF", "RSCH", | |
| "STCB", "STCD", | |
| "STCF", "STCH", | |
| "STQ", "SRI", "ORS", "DST", | |
| "SPI", | |
| "SLQ", "STL", | |
| "SXD", "SCD", | |
| "SCHB", "SCHD", | |
| "SCHF", "SCHH", | |
| "SCDB", "SCDD", | |
| "SCDF", "SCDH", | |
| "PDX", "PDC", | |
| "PXD", "PCD", | |
| "MSE", "LGL", "BSF", | |
| "LGR", "RQL", "RUN", | |
| "AXC", | |
| "TIA", "TIB", | |
| "LRI", "LPI", | |
| "SEA", "SEB", | |
| "IFT", "EFT", | |
| "IOCD", "IOCDN", "TCH", | |
| "IORP", "IORPN", | |
| "IORT", "IORTN", | |
| "IOCP", "IOCPN", | |
| "IOCT", "IOCTN", | |
| "IOSP", "IOSPN", | |
| "IOST", "IOSTN", | |
| "WTR", "XMT", | |
| "TCH", "LIPT", | |
| "CTL", "CTLN", | |
| "CTLR", "CTLRN", | |
| "CTLW", "CTLWN", | |
| "SNS", | |
| "LAR", "SAR", "TWT", | |
| "CPYP", | |
| "CPYD", "TCM", | |
| "LIP", "TDC", "LCC", | |
| "SMS", "ICC", | |
| NULL | |
| }; | |
| static const t_uint64 opc_v[] = { | |
| INT64_C(0100000000000)+I_DEC, INT64_C(0200000000000)+I_DEC, INT64_C(0300000000000)+I_DEC, | |
| INT64_C(0500000000000)+I_DNP, INT64_C(0600000000000)+I_DEC, INT64_C(0700000000000)+I_DEC, | |
| INT64_C(0000000000000)+I_MXN, INT64_C(0002000000000)+I_MXN, INT64_C(0002100000000)+I_MXN, | |
| INT64_C(0076000000000)+I_SNS, INT64_C(0076000000001)+I_SNS, INT64_C(0076000000002)+I_SNS, | |
| INT64_C(0076000000003)+I_SNS, INT64_C(0076000000004)+I_SNS, INT64_C(0076000000005)+I_SNS, | |
| INT64_C(0076000000006)+I_SNS, INT64_C(0076000000007)+I_SNS, INT64_C(0076000000010)+I_SNS, | |
| INT64_C(0076000000011)+I_SNS, INT64_C(0076000000012)+I_SNS, INT64_C(0076000000014)+I_SNS, | |
| INT64_C(0076000000016)+I_SNS, INT64_C(0076000000140)+I_SNS, INT64_C(0076000000141)+I_SNS, | |
| INT64_C(0076000000142)+I_SNS, INT64_C(0076000000143)+I_SNS, INT64_C(0076000000144)+I_SNS, | |
| INT64_C(0076000000161)+I_SNS, INT64_C(0076000000162)+I_SNS, INT64_C(0076000000163)+I_SNS, | |
| INT64_C(0076000000164)+I_SNS, INT64_C(0076000000165)+I_SNS, INT64_C(0076000000166)+I_SNS, | |
| INT64_C(0076000001000)+I_SNS, INT64_C(0076000002000)+I_SNS, INT64_C(0076000003000)+I_SNS, | |
| INT64_C(0076000004000)+I_SNS, INT64_C(0076000005000)+I_SNS, INT64_C(0076000006000)+I_SNS, | |
| INT64_C(0076000007000)+I_SNS, INT64_C(0076000010000)+I_SNS, | |
| INT64_C(0076000001350)+I_SNS, INT64_C(0076000002350)+I_SNS, INT64_C(0076000003350)+I_SNS, | |
| INT64_C(0076000004350)+I_SNS, INT64_C(0076000005350)+I_SNS, INT64_C(0076000006350)+I_SNS, | |
| INT64_C(0076000007350)+I_SNS, INT64_C(0076000010350)+I_SNS, | |
| INT64_C(0076000001352)+I_SNS, INT64_C(0076000002352)+I_SNS, INT64_C(0076000003352)+I_SNS, | |
| INT64_C(0076000004352)+I_SNS, INT64_C(0076000005352)+I_SNS, INT64_C(0076000006352)+I_SNS, | |
| INT64_C(0076000007352)+I_SNS, INT64_C(0076000010352)+I_SNS, | |
| INT64_C(0076000001340)+I_SNS, INT64_C(0076000002340)+I_SNS, INT64_C(0076000003340)+I_SNS, | |
| INT64_C(0076000004340)+I_SNS, INT64_C(0076000005340)+I_SNS, INT64_C(0076000006340)+I_SNS, | |
| INT64_C(0076000007340)+I_SNS, INT64_C(0076000010340)+I_SNS, | |
| INT64_C(0076000001360)+I_SNS, INT64_C(0076000002360)+I_SNS, INT64_C(0076000003360)+I_SNS, | |
| INT64_C(0076000004360)+I_SNS, INT64_C(0076000005360)+I_SNS, INT64_C(0076000006360)+I_SNS, | |
| INT64_C(0076000007360)+I_SNS, INT64_C(0076000010360)+I_SNS, | |
| INT64_C(0076000001360)+I_SNS, INT64_C(0076000002360)+I_SNS, INT64_C(0076000003360)+I_SNS, | |
| INT64_C(0076000004360)+I_SNS, INT64_C(0076000005360)+I_SNS, INT64_C(0076000006360)+I_SNS, | |
| INT64_C(0076000007360)+I_SNS, INT64_C(0076000010360)+I_SNS, | |
| INT64_C(0002200000000)+I_MXN, INT64_C(0002400000000)+I_MXN, | |
| INT64_C(0002600000000)+I_MXN, INT64_C(0002700000000)+I_MXN, | |
| INT64_C(0003000000000)+I_MXN, INT64_C(0003100000000)+I_MXN, | |
| INT64_C(0003200000000)+I_MXN, INT64_C(0003300000000)+I_MXN, | |
| INT64_C(0004000000000)+I_MXN, INT64_C(0004100000000)+I_NOP, INT64_C(0004200000000)+I_MXR, | |
| INT64_C(0004300000000)+I_NOP, INT64_C(0004400000000)+I_NOP, INT64_C(0004600000000)+I_MXR, | |
| INT64_C(0005100000000)+I_IMM, INT64_C(0005400000000)+I_IMM, INT64_C(0005500000000)+I_IMM, | |
| INT64_C(0005600000000)+I_IMM, INT64_C(0005700000000)+I_IMM, | |
| INT64_C(0006000000000)+I_MXN, INT64_C(0006100000000)+I_MXN, INT64_C(0006200000000)+I_MXN, | |
| INT64_C(0006300000000)+I_MXN, INT64_C(0006400000000)+I_MXN, INT64_C(0006500000000)+I_MXN, | |
| INT64_C(0006600000000)+I_MXN, INT64_C(0006700000000)+I_MXN, INT64_C(0007400000000)+I_MXR, | |
| INT64_C(0010000000000)+I_MXN, INT64_C(0011400000000)+I_MXC, INT64_C(0012000000000)+I_MXN, | |
| INT64_C(0013100000000)+I_NOP, INT64_C(0014000000000)+I_MXN, | |
| INT64_C(0016100000000)+I_MXN, INT64_C(0016200000000)+I_MXN, | |
| INT64_C(0020000000000)+I_MXN, INT64_C(0020400000000)+I_MXV, INT64_C(0020500000000)+I_MXV, | |
| INT64_C(0022000000000)+I_MXN, INT64_C(0022100000000)+I_MXN, | |
| INT64_C(0022400000000)+I_MXV, INT64_C(0022500000000)+I_MXV, | |
| INT64_C(0022600000000)+I_MXV, INT64_C(0022700000000)+I_MXV, | |
| INT64_C(0024000000000)+I_MXN, INT64_C(0024100000000)+I_MXN, | |
| INT64_C(0026000000000)+I_MXN, INT64_C(0026100000000)+I_MXN, | |
| INT64_C(0030000000000)+I_MXN, INT64_C(0030100000000)+I_MXN, | |
| INT64_C(0030200000000)+I_MXN, INT64_C(0030300000000)+I_MXN, | |
| INT64_C(0030400000000)+I_MXN, INT64_C(0030500000000)+I_MXN, | |
| INT64_C(0030600000000)+I_MXN, INT64_C(0030700000000)+I_MXN, | |
| INT64_C(0032000000000)+I_MXN, INT64_C(0032200000000)+I_MXN, | |
| INT64_C(0034000000000)+I_MXN, INT64_C(0036100000000)+I_MXN, | |
| INT64_C(0040000000000)+I_MXN, INT64_C(0040100000000)+I_MXN, | |
| INT64_C(0040200000000)+I_MXN, INT64_C(0440000000000)+I_MXN, | |
| INT64_C(0042000000000)+I_NOP, INT64_C(0044000000000)+I_MXN, INT64_C(0044100000000)+I_MXN, | |
| INT64_C(0044200000000)+I_MXN, INT64_C(0044300000000)+I_MXN, INT64_C(0044400000000)+I_MXN, | |
| INT64_C(0044500000000)+I_MXN, INT64_C(0044600000000)+I_MXN, | |
| INT64_C(0050000000000)+I_MXN, INT64_C(0050200000000)+I_MXN, | |
| INT64_C(0052000000000)+I_MXN, INT64_C(0052200000000)+I_MXN, | |
| INT64_C(0053400000000)+I_MXR, INT64_C(0053500000000)+I_MXR, | |
| INT64_C(0054000000000)+I_MXN, INT64_C(0054100000000)+I_MXN, | |
| INT64_C(0054200000000)+I_MXN, INT64_C(0054300000000)+I_MXN, | |
| INT64_C(0054400000000)+I_MXN, INT64_C(0054500000000)+I_MXN, | |
| INT64_C(0054600000000)+I_MXN, INT64_C(0054700000000)+I_MXN, | |
| INT64_C(0054000000000)+I_MXN, INT64_C(0054100000000)+I_MXN, | |
| INT64_C(0054200000000)+I_MXN, INT64_C(0054300000000)+I_MXN, | |
| INT64_C(0054400000000)+I_MXN, INT64_C(0054500000000)+I_MXN, | |
| INT64_C(0054600000000)+I_MXN, INT64_C(0054700000000)+I_MXN, | |
| INT64_C(0056000000000)+I_MXN, INT64_C(0056400000000)+I_MXN, | |
| INT64_C(0060000000000)+I_MXN, INT64_C(0060100000000)+I_MXN, INT64_C(0060200000000)+I_MXN, | |
| INT64_C(0060400000000)+I_MXN, INT64_C(0062100000000)+I_MXN, INT64_C(0062200000000)+I_MXN, | |
| INT64_C(0062500000000)+I_MXN, INT64_C(0063000000000)+I_MXN, | |
| INT64_C(0063400000000)+I_MXR, INT64_C(0063600000000)+I_MXR, | |
| INT64_C(0064000000000)+I_MXN, INT64_C(0064000000000)+I_MXN, | |
| INT64_C(0064200000000)+I_MXN, INT64_C(0064300000000)+I_MXN, | |
| INT64_C(0064400000000)+I_MXN, INT64_C(0064500000000)+I_MXN, | |
| INT64_C(0064600000000)+I_MXN, INT64_C(0064700000000)+I_MXN, | |
| INT64_C(0073400000000)+I_TAG, INT64_C(0073700000000)+I_TAG, | |
| INT64_C(0075400000000)+I_TAG, INT64_C(0075600000000)+I_TAG, | |
| INT64_C(0076000000000)+I_MXR, INT64_C(0076100000000)+I_NOP, INT64_C(0076200000000)+I_MXR, | |
| INT64_C(0076300000000)+I_MXR, INT64_C(0076400000000)+I_MXR, INT64_C(0076500000000)+I_MXR, | |
| INT64_C(0076600000000)+I_MXR, INT64_C(0076700000000)+I_MXR, INT64_C(0077000000000)+I_MXR, | |
| INT64_C(0077100000000)+I_MXR, INT64_C(0077200000000)+I_MXR, INT64_C(0077400000000)+I_MXR, | |
| INT64_C(0077600000000)+I_MXR, | |
| INT64_C(0476000000000)+I_SNS, INT64_C(0476000000001)+I_SNS, INT64_C(0476000000002)+I_SNS, | |
| INT64_C(0476000000003)+I_SNS, INT64_C(0476000000004)+I_SNS, INT64_C(0476000000005)+I_SNS, | |
| INT64_C(0476000000006)+I_SNS, INT64_C(0476000000007)+I_SNS, INT64_C(0476000000010)+I_SNS, | |
| INT64_C(0476000000016)+I_SNS, INT64_C(0476000000141)+I_SNS, INT64_C(0476000000142)+I_SNS, | |
| INT64_C(0476000000143)+I_SNS, INT64_C(0476000000144)+I_SNS, | |
| INT64_C(0476000001000)+I_SNS, INT64_C(0476000002000)+I_SNS, INT64_C(0476000003000)+I_SNS, | |
| INT64_C(0476000004000)+I_SNS, INT64_C(0476000005000)+I_SNS, INT64_C(0476000006000)+I_SNS, | |
| INT64_C(0476000007000)+I_SNS, INT64_C(0476000010000)+I_SNS, | |
| INT64_C(0402100000000)+I_MXN, | |
| INT64_C(0402200000000)+I_MXN, INT64_C(0402400000000)+I_MXN, | |
| INT64_C(0402600000000)+I_MXN, INT64_C(0402700000000)+I_MXN, | |
| INT64_C(0403000000000)+I_MXN, INT64_C(0403100000000)+I_MXN, | |
| INT64_C(0403200000000)+I_MXN, INT64_C(0403300000000)+I_MXN, | |
| INT64_C(0404200000000)+I_NOP, INT64_C(0404600000000)+I_NOP, | |
| INT64_C(0405100000000)+I_IMM, INT64_C(0405400000000)+I_IMM, INT64_C(0405500000000)+I_IMM, | |
| INT64_C(0405600000000)+I_IMM, INT64_C(0405700000000)+I_IMM, | |
| INT64_C(0406000000000)+I_MXN, INT64_C(0406100000000)+I_MXN, INT64_C(0406200000000)+I_MXN, | |
| INT64_C(0406300000000)+I_MXN, INT64_C(0406400000000)+I_MXN, INT64_C(0406500000000)+I_MXN, | |
| INT64_C(0406600000000)+I_MXN, INT64_C(0406700000000)+I_MXN, | |
| INT64_C(0410000000000)+I_MXN, INT64_C(0411400000000)+I_MXC, INT64_C(0412000000000)+I_MXN, | |
| INT64_C(0413000000000)+I_NOP, INT64_C(0414000000000)+I_MXN, INT64_C(0415400000000)+I_MXC, | |
| INT64_C(0420000000000)+I_MXN, INT64_C(0424000000000)+I_MXN, INT64_C(0424100000000)+I_MXN, | |
| INT64_C(0426000000000)+I_MXN, INT64_C(0426100000000)+I_MXN, | |
| INT64_C(0430000000000)+I_MXN, INT64_C(0430100000000)+I_MXN, | |
| INT64_C(0430200000000)+I_MXN, INT64_C(0430300000000)+I_MXN, | |
| INT64_C(0430400000000)+I_MXN, INT64_C(0430500000000)+I_MXN, | |
| INT64_C(0430600000000)+I_MXN, INT64_C(0430700000000)+I_MXN, | |
| INT64_C(0432000000000)+I_MXN, INT64_C(0434000000000)+I_MXN, | |
| INT64_C(0450000000000)+I_MXN, INT64_C(0450100000000)+I_MXN, INT64_C(0452000000000)+I_MXN, | |
| INT64_C(0453400000000)+I_MXR, INT64_C(0453500000000)+I_MXR, | |
| INT64_C(0454000000000)+I_MXN, INT64_C(0454100000000)+I_MXN, | |
| INT64_C(0454200000000)+I_MXN, INT64_C(0454300000000)+I_MXN, | |
| INT64_C(0454400000000)+I_MXN, INT64_C(0454500000000)+I_MXN, | |
| INT64_C(0454600000000)+I_MXN, INT64_C(0454700000000)+I_MXN, | |
| INT64_C(0454000000000)+I_MXN, INT64_C(0454100000000)+I_MXN, | |
| INT64_C(0454200000000)+I_MXN, INT64_C(0454300000000)+I_MXN, | |
| INT64_C(0454400000000)+I_MXN, INT64_C(0454500000000)+I_MXN, | |
| INT64_C(0454600000000)+I_MXN, INT64_C(0454700000000)+I_MXN, | |
| INT64_C(0460000000000)+I_MXN, INT64_C(0460100000000)+I_MXN, INT64_C(0460200000000)+I_MXN, INT64_C(0460300000000)+I_MXN, | |
| INT64_C(0460400000000)+I_MXN, | |
| INT64_C(0462000000000)+I_MXN, INT64_C(0462500000000)+I_MXN, | |
| INT64_C(0463400000000)+I_MXR, INT64_C(0463600000000)+I_MXR, | |
| INT64_C(0464000000000)+I_MXN, INT64_C(0464000000000)+I_MXN, | |
| INT64_C(0464200000000)+I_MXN, INT64_C(0464300000000)+I_MXN, | |
| INT64_C(0464400000000)+I_MXN, INT64_C(0464500000000)+I_MXN, | |
| INT64_C(0464600000000)+I_MXN, INT64_C(0464700000000)+I_MXN, | |
| INT64_C(0473400000000)+I_TAG, INT64_C(0473700000000)+I_TAG, | |
| INT64_C(0475400000000)+I_TAG, INT64_C(0475600000000)+I_TAG, | |
| INT64_C(0476000000000)+I_MXR, INT64_C(0476300000000)+I_MXR, INT64_C(0476400000000)+I_MXR, | |
| INT64_C(0476500000000)+I_MXR, INT64_C(0477300000000)+I_MXR, INT64_C(0477200000000)+I_MXR, | |
| INT64_C(0477400000000)+I_MXR, | |
| INT64_C(0010100000000)+I_MXN, INT64_C(0410100000000)+I_MXN, | |
| INT64_C(0056200000000)+I_MXN, INT64_C(0456400000000)+I_MXN, | |
| INT64_C(0476100000041)+I_SNS, INT64_C(0476100000042)+I_SNS, | |
| INT64_C(0476100000043)+I_SNS, INT64_C(0476100000044)+I_SNS, | |
| INT64_C(01000000000000)+I_IOX, INT64_C(01000000200000)+I_IOX, INT64_C(01100000000000)+I_TCH, | |
| INT64_C(01200000000000)+I_IOX, INT64_C(01200000200000)+I_IOX, | |
| INT64_C(01300000000000)+I_IOX, INT64_C(01300000200000)+I_IOX, | |
| INT64_C(01400000000000)+I_IOX, INT64_C(01400000200000)+I_IOX, | |
| INT64_C(01500000000000)+I_IOX, INT64_C(01500000200000)+I_IOX, | |
| INT64_C(01600000000000)+I_IOX, INT64_C(01600000200000)+I_IOX, | |
| INT64_C(01700000000000)+I_IOX, INT64_C(01700000200000)+I_IOX, | |
| INT64_C(02000000000000)+I_TCH, INT64_C(02000000200000)+I_IOX, | |
| INT64_C(02100000000000)+I_TCH, INT64_C(02100000200000)+I_TCH, | |
| INT64_C(02200000000000)+I_I9N, INT64_C(02220000000000)+I_TCH, | |
| INT64_C(02200000200000)+I_I9N, INT64_C(02220000200000)+I_TCH, | |
| INT64_C(02240000000000)+I_I9N, INT64_C(02260000000000)+I_TCH, | |
| INT64_C(02240000200000)+I_I9N, | |
| INT64_C(02300000000000)+I_I9S, INT64_C(02300000200000)+I_I9S, | |
| INT64_C(02340000000000)+I_I9S, | |
| INT64_C(02400000000000)+I_IOX, | |
| INT64_C(02500000000000)+I_IOX, INT64_C(02500000200000)+I_IOX, | |
| INT64_C(02600000200000)+I_I9S, INT64_C(02640000000000)+I_I9S, INT64_C(02640000200000)+I_I9S, | |
| INT64_C(02700000000000)+I_I9S, INT64_C(02700000200000)+I_IOX, | |
| 0 | |
| }; | |
| /* Symbolic decode | |
| Inputs: | |
| *of = output stream | |
| addr = current PC | |
| *val = pointer to values | |
| *uptr = pointer to unit | |
| sw = switches | |
| Outputs: | |
| return = status code | |
| */ | |
| /* Use scp.c provided fprintf function */ | |
| #define fprintf Fprintf | |
| #define fputs(_s,f) Fprintf(f,"%s",_s) | |
| #define fputc(_c,f) Fprintf(f,"%c",_c) | |
| t_stat fprint_sym (FILE *of, t_addr addr, t_value *val, | |
| UNIT *uptr, int32 sw) | |
| { | |
| uint32 i, j, k, l, fmt, c, fld[3]; | |
| DEVICE *dptr; | |
| t_uint64 inst; | |
| inst = val[0]; | |
| if (uptr == NULL) | |
| uptr = &cpu_unit; | |
| dptr = find_dev_from_unit (uptr); | |
| if (dptr == NULL) | |
| return SCPE_IERR; | |
| if (sw & SWMASK ('C')) { /* character? */ | |
| c = (uint32) (inst & 077); | |
| fprintf (of, "%c", cvt_code_to_ascii (c, sw)); | |
| return SCPE_OK; | |
| } | |
| if (sw & SWMASK ('S')) { /* string? */ | |
| for (i = 36; i > 0; i = i - 6) { | |
| c = (uint32) ((inst >> (i - 6)) & 077); | |
| fprintf (of, "%c", cvt_code_to_ascii (c, sw)); | |
| } | |
| return SCPE_OK; | |
| } | |
| if (!(sw & (SWMASK ('M')|SWMASK ('I')|SWMASK ('N'))) || /* M, N or I? */ | |
| (dptr->dwidth != 36)) | |
| return SCPE_ARG; | |
| /* Instruction decode */ | |
| fld[0] = ((uint32) inst & 0777777); | |
| fld[1] = GET_TAG (inst); /* get 3 fields */ | |
| fld[2] = GET_DEC (inst); | |
| if (sw & SWMASK ('I')) /* decode as 7607? */ | |
| inst |= IFAKE_7607; | |
| if (sw & SWMASK ('N')) /* decode as 7909? */ | |
| inst |= IFAKE_7909; | |
| for (i = 0; opc_v[i] > 0; i++) { /* loop thru ops */ | |
| j = (int32) ((opc_v[i] >> I_V_FL) & I_M_FL); /* get class */ | |
| if ((opc_v[i] & DFAKE) == (inst & masks[j])) { /* match? */ | |
| if (inst & ind_test[j]) /* indirect? */ | |
| fprintf (of, "%s*", opcode[i]); | |
| else fprintf (of, "%s", opcode[i]); /* opcode */ | |
| for (k = 0; k < 3; k++) | |
| fld[k] = fld[k] & fld_max[j][k]; | |
| for (k = 0; k < 3; k++) { /* loop thru fields */ | |
| fmt = fld_fmt[j][k]; /* get format */ | |
| if (fmt == INST_P_XIT) | |
| return SCPE_OK; | |
| switch (fmt) { /* case on format */ | |
| case INST_P_PNT: /* print nz, else term */ | |
| for (l = k, c = 0; l < 3; l++) | |
| c |= fld[k]; | |
| if (c == 0) | |
| return SCPE_OK; | |
| case INST_P_PNZ: /* print non-zero */ | |
| fputc (k? ',': ' ', of); | |
| if (fld[k]) | |
| fprintf (of, "%-o", fld[k]); | |
| break; | |
| case INST_P_PRA: /* print always */ | |
| fputc (k? ',': ' ', of); | |
| fprintf (of, "%-o", fld[k]); | |
| break; | |
| case INST_P_SKP: /* skip */ | |
| break; | |
| } /* end switch */ | |
| } /* end for k */ | |
| return SCPE_OK; /* done */ | |
| } /* end if */ | |
| } /* end for i */ | |
| return SCPE_ARG; | |
| } | |
| /* Convert character to code to ASCII | |
| -b BCD | |
| -a business-chain */ | |
| uint32 cvt_code_to_ascii (uint32 c, int32 sw) | |
| { | |
| if (sw & SWMASK ('B')) { | |
| if (sw & SWMASK ('A')) | |
| return bcd_to_ascii_a[c]; | |
| else return bcd_to_ascii_h[c]; | |
| } | |
| else if (sw & SWMASK ('A')) | |
| return nine_to_ascii_a[c]; | |
| else return nine_to_ascii_h[c]; | |
| } | |
| /* Symbolic input | |
| Inputs: | |
| *cptr = pointer to input string | |
| addr = current PC | |
| uptr = pointer to unit | |
| *val = pointer to output values | |
| sw = switches | |
| Outputs: | |
| status = error status | |
| */ | |
| t_stat parse_sym (char *cptr, t_addr addr, UNIT *uptr, t_value *val, int32 sw) | |
| { | |
| uint32 i, j, c; | |
| t_uint64 fld[3]; | |
| t_bool ind; | |
| t_stat r; | |
| char gbuf[CBUFSIZE]; | |
| while (isspace (*cptr)) cptr++; | |
| if ((sw & SWMASK ('C')) || ((*cptr == '\'') && cptr++)) { /* character? */ | |
| if (cptr[0] == 0) /* must have 1 char */ | |
| return SCPE_ARG; | |
| val[0] = (t_value) cvt_ascii_to_code (cptr[0] & 0177, sw); | |
| return SCPE_OK; | |
| } | |
| if ((sw & SWMASK ('S')) || ((*cptr == '"') && cptr++)) { /* sixbit string? */ | |
| if (cptr[0] == 0) /* must have 1 char */ | |
| return SCPE_ARG; | |
| for (i = 0; i < 6; i++) { | |
| c = cptr[0] & 0177; | |
| if (c) | |
| val[0] = (val[0] << 6) | ((t_value) cvt_ascii_to_code (c, sw)); | |
| else { | |
| val[0] = val[0] << (6 * (6 - i)); | |
| break; | |
| } | |
| } | |
| return SCPE_OK; | |
| } | |
| cptr = get_glyph (cptr, gbuf, 0); /* get opcode */ | |
| j = strlen (gbuf); /* get length */ | |
| if (gbuf[j - 1] == '*') { /* indirect? */ | |
| ind = TRUE; | |
| gbuf[j - 1] = 0; | |
| } | |
| else ind = FALSE; | |
| for (i = 0; (opcode[i] != NULL) && (strcmp (opcode[i], gbuf) != 0) ; i++) ; | |
| if (opcode[i] == NULL) | |
| return SCPE_ARG; | |
| j = (uint32) ((opc_v[i] >> I_V_FL) & I_M_FL); /* get class */ | |
| val[0] = opc_v[i] & DMASK; | |
| if (ind) { | |
| if (ind_test[j]) | |
| val[0] |= ind_test[j]; | |
| else return SCPE_ARG; | |
| } | |
| for (i = 0; i < 3; i++) /* clear inputs */ | |
| fld[i] = 0; | |
| for (i = 0; (i < 3) && *cptr; i++) { /* parse inputs */ | |
| if (i < 2) /* get glyph */ | |
| cptr = get_glyph (cptr, gbuf, ','); | |
| else cptr = get_glyph (cptr, gbuf, 0); | |
| if (gbuf[0]) { /* anything? */ | |
| fld[i] = get_uint (gbuf, 8, fld_max[j][i], &r); | |
| if ((r != SCPE_OK) || (fld_max[j][i] == 0)) | |
| return SCPE_ARG; | |
| } | |
| } | |
| if (*cptr != 0) /* junk at end? */ | |
| return SCPE_ARG; | |
| val[0] = val[0] | fld[0] | (fld[1] << INST_V_TAG) | (fld[2] << INST_V_DEC); | |
| return SCPE_OK; | |
| } | |
| /* Convert ASCII to character code | |
| -b BCD */ | |
| uint32 cvt_ascii_to_code (uint32 c, int32 sw) | |
| { | |
| if (sw & SWMASK ('B')) | |
| return ascii_to_bcd[c]; | |
| else return ascii_to_nine[c]; | |
| } |