blob: 45dba797b08108bb44d1cecb116d7853a71a8424 [file] [log] [blame] [raw]
/* 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