/* i7070_defs.h: IBM 7070 simulator definitions 

   Copyright (c) 2006, 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"
/* 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, int *base, int *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




