First Commit of my working state
[simh.git] / Ibm1130 / ibm1130_defs.h
1 /*
2 * (C) Copyright 2002, Brian Knittel.
3 * You may freely use this program, but: it offered strictly on an AS-IS, AT YOUR OWN
4 * RISK basis, there is no warranty of fitness for any purpose, and the rest of the
5 * usual yada-yada. Please keep this notice and the copyright in any distributions
6 * or modifications.
7 *
8 * This is not a supported product, but I welcome bug reports and fixes.
9 * Mail to sim@ibm1130.org
10 */
11
12 /* ibm1130_defs.h: IBM-1130 simulator definitions
13 */
14
15 #include "sim_defs.h" /* main SIMH defns (include path should include .., or make a copy) */
16 #include "sim_console.h" /* more SIMH defns (include path should include .., or make a copy) */
17
18 #include <setjmp.h>
19 #include <assert.h>
20 #include <stdlib.h>
21
22 #if defined(VMS)
23 # include <unistd.h> /* to pick up 'unlink' */
24 #endif
25
26 #define MIN(a,b) (((a) <= (b)) ? (a) : (b))
27 #define MAX(a,b) (((a) >= (b)) ? (a) : (b))
28
29 #ifndef _WIN32
30 int strnicmp (const char *a, const char *b, int n);
31 int strcmpi (const char *a, const char *b);
32 #endif
33
34 /* #define GUI_SUPPORT uncomment to compile the GUI extensions. It's defined in the windows ibm1130.mak makefile */
35
36 /* ------------------------------------------------------------------------ */
37 /* Architectural constants */
38
39 #define MAXMEMSIZE (32768) /* 32Kwords */
40 #define INIMEMSIZE (16384) /* 16Kwords */
41 #define MEMSIZE (cpu_unit.capac)
42
43 #define ILL_ADR_FLAG 0x40000000 /* an impossible 1130 address */
44
45 /* ------------------------------------------------------------------------ */
46 /* Global state */
47
48 extern int cgi; /* TRUE if we are running as a CGI program */
49 extern int cgiwritable; /* TRUE if we can write the disk images back to the image file in CGI mode */
50 extern int sim_gui;
51
52 extern uint16 M[]; /* core memory, up to 32Kwords (note: don't even think about trying 64K) */
53 extern uint16 ILSW[]; /* interrupt level status words */
54 extern int32 IAR; /* instruction address register */
55 extern int32 prev_IAR; /* instruction address register at start of current instruction */
56 extern int32 SAR, SBR; /* storage address/buffer registers */
57 extern int32 OP, TAG, CCC; /* instruction decoded pieces */
58 extern int32 CES; /* console entry switches */
59 extern int32 ACC, EXT; /* accumulator and extension */
60 extern int32 ARF; /* arithmetic factor register, a nonaddressable internal CPU register */
61 extern int32 RUNMODE; /* processor run/step mode */
62 extern int32 ipl; /* current interrupt level (-1 = not handling irq) */
63 extern int32 iplpending; /* interrupted IPL's */
64 extern int32 tbit; /* trace flag (causes level 5 IRQ after each instr) */
65 extern int32 V, C; /* condition codes */
66 extern int32 wait_state; /* wait state (waiting for an IRQ) */
67 extern int32 wait_lamp; /* alternate indicator to light the wait lamp on the GUI */
68 extern int32 int_req; /* sum of interrupt request levels active */
69 extern int32 int_lamps; /* accumulated version of int_req - gives lamp persistence */
70 extern int32 int_mask; /* current active interrupt mask (ipl sensitive) */
71 extern int32 mem_mask;
72 extern int32 cpu_dsw; /* CPU device status word */
73 extern int32 sim_int_char; /* interrupt character */
74 extern int32 con_dsw; /* has program stop and int run bits */
75 extern t_bool running;
76 extern t_bool power;
77 extern t_bool cgi; /* TRUE if we are running as a CGI program */
78 extern t_bool cgiwritable; /* TRUE if we can write to the disk image file in CGI mode */
79 extern t_stat reason; /* CPU execution loop control */
80
81 #define WAIT_OP 1 /* wait state causes: wait instruction, invalid instruction*/
82 #define WAIT_INVALID_OP 2
83
84 #define MODE_SS 3 /* RUNMODE values. SS and SMC are not implemented in this simulator */
85 #define MODE_SMC 2
86 #define MODE_INT_RUN 1
87 #define MODE_RUN 0
88 #define MODE_SI -1
89 #define MODE_DISP -2
90 #define MODE_LOAD -3
91
92 /* ------------------------------------------------------------------------ */
93 /* debugging */
94 /* ------------------------------------------------------------------------ */
95
96 #define ENABLE_DEBUG_PRINT
97 #define ENABLE_DEBUG_TO_LOG
98
99 #ifdef ENABLE_DEBUG_PRINT
100 # define DEBUG_PRINT debug_print
101 #else
102 # ifdef ENABLE_DEBUG_TO_LOG
103 # define DEBUG_PRINT trace_io
104 # else
105 # define DEBUG_PRINT if (0) debug_print
106 # endif
107 #endif
108
109 void debug_print(char *fmt, ...);
110
111 /* ------------------------------------------------------------------------ */
112 /* memory IO routines */
113
114 int32 ReadW (int32 a);
115 void WriteW (int32 a, int32 d);
116
117 /* ------------------------------------------------------------------------ */
118 /* handy macros */
119
120 #define CLRBIT(v,b) ((v) &= ~(b))
121 #define SETBIT(v,b) ((v) |= (b))
122 #define BETWEEN(v,a,b) (((v) >= (a)) && ((v) <= (b)))
123
124 /* ------------------------------------------------------------------------ */
125 /* Simulator stop codes */
126
127 #define STOP_WAIT 1 /* wait, no events */
128 #define STOP_INVALID_INSTR 2 /* bad instruction */
129 #define STOP_IBKPT 3 /* simulator breakpoint */
130 #define STOP_INCOMPLETE 4 /* simulator coding not complete here */
131 #define STOP_POWER_OFF 5 /* no power */
132 #define STOP_DECK_BREAK 6 /* !BREAK in deck file */
133 #define STOP_PHASE_BREAK 7 /* phase load break */
134 #define STOP_CRASH 8 /* program has crashed badly */
135 #define STOP_TIMED_OUT 9 /* simulation time limit exceeded */
136 #define STOP_IMMEDIATE 10 /* simulator stop key pressed (immediate stop) */
137 #define STOP_BREAK 11 /* simulator break key pressed */
138 #define STOP_STEP 12 /* step count expired */
139 #define STOP_OTHER 13 /* other reason, probably error returned by sim_process_event() */
140
141 #define IORETURN(f,v) ((f)? (v): SCPE_OK) /* cond error return */
142
143 #define INT_REQ_5 0x01 /* bits for interrupt levels (ipl, iplpending, int_req, int_mask) */
144 #define INT_REQ_4 0x02
145 #define INT_REQ_3 0x04
146 #define INT_REQ_2 0x08
147 #define INT_REQ_1 0x10
148 #define INT_REQ_0 0x20
149
150 #define XIO_UNUSED 0x00 /* XIO commands */
151 #define XIO_WRITE 0x01
152 #define XIO_READ 0x02
153 #define XIO_SENSE_IRQ 0x03
154 #define XIO_CONTROL 0x04
155 #define XIO_INITW 0x05
156 #define XIO_INITR 0x06
157 #define XIO_SENSE_DEV 0x07
158
159 #define XIO_FAILED 0x20 /* fake function to record error */
160
161 /* ILSW bits - set by appropriate device whenever an interrupt is outstanding */
162
163 #define ILSW_0_1442_CARD 0x8000 /* ILSW 0 is not really defined on the 1130 */
164
165 #define ILSW_1_1132_PRINTER 0x8000 /* had these backwards! */
166 #define ILSW_1_SCA 0x4000
167
168 #define ILSW_2_1131_DISK 0x8000
169
170 #define ILSW_2_2310_DRV_1 0x4000
171 #define ILSW_2_2310_DRV_2 0x2000
172 #define ILSW_2_2310_DRV_3 0x1000
173 #define ILSW_2_2310_DRV_4 0x0800 /* can have 2310 or 2311 */
174
175 #define ILSW_2_2311_DRV_1_DISK_1 0x4000
176 #define ILSW_2_2311_DRV_1_DISK_2 0x2000
177 #define ILSW_2_2311_DRV_1_DISK_3 0x1000
178 #define ILSW_2_2311_DRV_1_DISK_4 0x0800
179
180 #define ILSW_2_2311_DRV_1_DISK_5 0x0400
181 #define ILSW_2_2311_DRV_2_DISK_1 0x0200
182 #define ILSW_2_2311_DRV_2_DISK_2 0x0100
183 #define ILSW_2_2311_DRV_2_DISK_3 0x0080
184 #define ILSW_2_2311_DRV_2_DISK_4 0x0040
185 #define ILSW_2_2311_DRV_2_DISK_5 0x0020
186
187 #define ILSW_2_SAC_BIT_11 0x0010
188 #define ILSW_2_SAC_BIT_12 0x0008
189 #define ILSW_2_SAC_BIT_13 0x0004
190 #define ILSW_2_SAC_BIT_14 0x0002
191 #define ILSW_2_SAC_BIT_15 0x0001
192
193 #define ILSW_3_1627_PLOTTER 0x8000
194 #define ILSW_3_SAC_BIT_01 0x4000
195 #define ILSW_3_SAC_BIT_02 0x2000
196 #define ILSW_3_SAC_BIT_03 0x1000
197 #define ILSW_3_2250_DISPLAY 0x0800
198 #define ILSW_3_SYSTEM7 0x0800
199 #define ILSW_3_SAC_BIT_05 0x0400
200 #define ILSW_3_SAC_BIT_06 0x0200
201 #define ILSW_3_SAC_BIT_07 0x0100
202 #define ILSW_3_SAC_BIT_08 0x0080
203 #define ILSW_3_SAC_BIT_09 0x0040
204 #define ILSW_3_SAC_BIT_10 0x0020
205 #define ILSW_3_SAC_BIT_11 0x0010
206 #define ILSW_3_SAC_BIT_12 0x0008
207 #define ILSW_3_SAC_BIT_13 0x0004
208 #define ILSW_3_SAC_BIT_14 0x0002
209 #define ILSW_3_SAC_BIT_15 0x0001
210
211 #define ILSW_4_1134_TAPE 0x8000
212 #define ILSW_4_1055_TAPE 0x8000
213 #define ILSW_4_CONSOLE 0x4000
214 #define ILSW_4_1442_CARD 0x2000
215 #define ILSW_4_2501_CARD 0x1000
216 #define ILSW_4_1403_PRINTER 0x0800
217 #define ILSW_4_1231_MARK 0x0400
218 #define ILSW_4_SAC_BIT_06 0x0200
219 #define ILSW_4_SAC_BIT_07 0x0100
220 #define ILSW_4_SAC_BIT_08 0x0080
221 #define ILSW_4_SAC_BIT_09 0x0040
222 #define ILSW_4_SAC_BIT_10 0x0020
223 #define ILSW_4_SAC_BIT_11 0x0010
224 #define ILSW_4_T2741_TERMINAL 0x0010 /* APL\1130 nonstandard serial interface uses this bit */
225 #define ILSW_4_SAC_BIT_12 0x0008
226 #define ILSW_4_SAC_BIT_13 0x0004
227 #define ILSW_4_SAC_BIT_14 0x0002
228 #define ILSW_4_SAC_BIT_15 0x0001
229
230 #define ILSW_5_INT_RUN_PROGRAM_STOP 0x8000 /* this replaces both ILSW_5_INT_RUN and ILSW_5_PROGRAM_STOP */
231 #define ILSW_5_SAC_BIT_01 0x4000
232 #define ILSW_5_SAC_BIT_02 0x2000
233 #define ILSW_5_SAC_BIT_03 0x1000
234 #define ILSW_5_SAC_BIT_04 0x0800
235 #define ILSW_5_SAC_BIT_05 0x0400
236 #define ILSW_5_SAC_BIT_06 0x0200
237 #define ILSW_5_SAC_BIT_07 0x0100
238 #define ILSW_5_SAC_BIT_08 0x0080
239 #define ILSW_5_SAC_BIT_09 0x0040
240 #define ILSW_5_SAC_BIT_10 0x0020
241 #define ILSW_5_SAC_BIT_11 0x0010
242 #define ILSW_5_SAC_BIT_12 0x0008
243 #define ILSW_5_SAC_BIT_13 0x0004
244 #define ILSW_5_SAC_BIT_14 0x0002
245 #define ILSW_5_SAC_BIT_15 0x0001
246
247 /* CPU DSW bits */
248
249 #define CPU_DSW_PROGRAM_STOP 0x8000
250 #define CPU_DSW_INT_RUN 0x4000
251
252 /* prototypes: xio handlers */
253
254 void xio_1131_console (int32 addr, int32 func, int32 modify); /* console keyboard and printer */
255 void xio_1142_card (int32 addr, int32 func, int32 modify); /* standard card reader/punch */
256 void xio_1134_papertape (int32 addr, int32 func, int32 modify); /* paper tape reader/punch */
257 void xio_disk (int32 addr, int32 func, int32 modify, int drv); /* internal CPU disk */
258 void xio_1627_plotter (int32 addr, int32 func, int32 modify); /* XY plotter */
259 void xio_1132_printer (int32 addr, int32 func, int32 modify); /* standard line printer */
260 void xio_1131_switches (int32 addr, int32 func, int32 modify); /* console buttons & switches */
261 void xio_1231_optical (int32 addr, int32 func, int32 modify); /* optical mark page reader */
262 void xio_2501_card (int32 addr, int32 func, int32 modify); /* alternate high-speed card reader */
263 void xio_sca (int32 addr, int32 func, int32 modify); /* synchronous communications adapter */
264 void xio_system7 (int32 addr, int32 func, int32 modify); /* system/7 interprocessor IO link */
265 void xio_1403_printer (int32 addr, int32 func, int32 modify); /* alternate high-speed printer */
266 void xio_2250_display (int32 addr, int32 func, int32 modify); /* vector display processor */
267 void xio_t2741_terminal (int32 addr, int32 func, int32 modify); /* IO selectric via nonstandard serial interface for APL */
268 void xio_error (char *msg);
269
270 void bail (char *msg);
271 t_stat load_cr_boot (int drv, int switches);
272 t_stat cr_boot (int unitno, DEVICE *dptr);
273 t_stat cr_rewind (void);
274 t_stat cr_detach (UNIT *uptr);
275 void calc_ints (void); /* recalculate interrupt bitmask */
276 void trace_io (char *fmt, ...); /* debugging printout */
277 void trace_both (char *fmt, ...); /* debugging printout */
278 t_stat register_cmd (char *name, t_stat (*action)(int32 flag, char *ptr), int arg, char *help);
279 void scp_panic (char *msg); /* bail out of simulator */
280 char *upcase(char *str);
281 void break_simulation (t_stat reason); /* let a device halt the simulation */
282 char hollerith_to_ascii (uint16 hol); /* for debugging use only */
283 t_bool gdu_active (void);
284 void remark_cmd (char *remark);
285 void stuff_cmd (char *cmd);
286 t_bool stuff_and_wait (char *cmd, int timeout, int delay);
287 void update_gui (t_bool force);
288 void sim_init (void);
289 t_stat register_cmd (char *name, t_stat (*action)(int32 flag, char *ptr), int arg, char *help);
290 t_stat basic_attach (UNIT *uptr, char *cptr);
291 char * quotefix (char * cptr);
292
293 /* GUI interface routines */
294 t_bool keyboard_is_busy (void);
295 void forms_check (int set); /* device notification to console lamp display */
296 void print_check (int set);
297 void keyboard_selected (int select);
298 void disk_ready (int ready);
299 void disk_unlocked (int unlocked);
300 void gui_run(int running);
301 char *read_cmdline (char *ptr, int size, FILE *stream);
302
303 #ifdef GUI_SUPPORT
304 # define GUI_BEGIN_CRITICAL_SECTION begin_critical_section();
305 # define GUI_END_CRITICAL_SECTION end_critical_section();
306 void begin_critical_section (void);
307 void end_critical_section (void);
308 #else
309 # define GUI_BEGIN_CRITICAL_SECTION
310 # define GUI_END_CRITICAL_SECTION
311 #endif