/* 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
   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.

*/

#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];

/* 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();


/* SPRA device pulses */
extern uint16	 dev_pulse[NUM_CHAN];			/* Device pulse */
#define PUNCH_1	00001
#define PUNCH_2	00002
#define PUNCH_M 00003
#define PRINT_I	00004
#define PRINT_1	00010
#define PRINT_2	00020
#define PRINT_3	00040
#define PRINT_4	00100
#define PRINT_5	00200
#define PRINT_6	00400
#define PRINT_7	01000
#define PRINT_8	02000
#define PRINT_9	04000
#define PRINT_M 07770

/* 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

