36963a6aaab011f2ae94f3bac0c1abd2a07513ed
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
8 * This is not a supported product, but I welcome bug reports and fixes.
9 * Mail to sim@ibm1130.org
12 /* ibm1130_defs.h: IBM-1130 simulator definitions
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) */
23 # include <unistd.h> /* to pick up 'unlink' */
26 #define MIN(a,b) (((a) <= (b)) ? (a) : (b))
27 #define MAX(a,b) (((a) >= (b)) ? (a) : (b))
30 int strnicmp (const char *a
, const char *b
, int n
);
31 int strcmpi (const char *a
, const char *b
);
34 /* #define GUI_SUPPORT uncomment to compile the GUI extensions. It's defined in the windows ibm1130.mak makefile */
36 /* ------------------------------------------------------------------------ */
37 /* Architectural constants */
39 #define MAXMEMSIZE (32768) /* 32Kwords */
40 #define INIMEMSIZE (16384) /* 16Kwords */
41 #define MEMSIZE (cpu_unit.capac)
43 #define ILL_ADR_FLAG 0x40000000 /* an impossible 1130 address */
45 /* ------------------------------------------------------------------------ */
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 */
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
;
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 */
81 #define WAIT_OP 1 /* wait state causes: wait instruction, invalid instruction*/
82 #define WAIT_INVALID_OP 2
84 #define MODE_SS 3 /* RUNMODE values. SS and SMC are not implemented in this simulator */
86 #define MODE_INT_RUN 1
92 /* ------------------------------------------------------------------------ */
94 /* ------------------------------------------------------------------------ */
96 #define ENABLE_DEBUG_PRINT
97 #define ENABLE_DEBUG_TO_LOG
99 #ifdef ENABLE_DEBUG_PRINT
100 # define DEBUG_PRINT debug_print
102 # ifdef ENABLE_DEBUG_TO_LOG
103 # define DEBUG_PRINT trace_io
105 # define DEBUG_PRINT if (0) debug_print
109 void debug_print(char *fmt
, ...);
111 /* ------------------------------------------------------------------------ */
112 /* memory IO routines */
114 int32
ReadW (int32 a
);
115 void WriteW (int32 a
, int32 d
);
117 /* ------------------------------------------------------------------------ */
120 #define CLRBIT(v,b) ((v) &= ~(b))
121 #define SETBIT(v,b) ((v) |= (b))
122 #define BETWEEN(v,a,b) (((v) >= (a)) && ((v) <= (b)))
124 /* ------------------------------------------------------------------------ */
125 /* Simulator stop codes */
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() */
141 #define IORETURN(f,v) ((f)? (v): SCPE_OK) /* cond error return */
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
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
159 #define XIO_FAILED 0x20 /* fake function to record error */
161 /* ILSW bits - set by appropriate device whenever an interrupt is outstanding */
163 #define ILSW_0_1442_CARD 0x8000 /* ILSW 0 is not really defined on the 1130 */
165 #define ILSW_1_1132_PRINTER 0x8000 /* had these backwards! */
166 #define ILSW_1_SCA 0x4000
168 #define ILSW_2_1131_DISK 0x8000
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 */
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
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
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
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
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
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
249 #define CPU_DSW_PROGRAM_STOP 0x8000
250 #define CPU_DSW_INT_RUN 0x4000
252 /* prototypes: xio handlers */
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
);
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
);
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
);
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);
309 # define GUI_BEGIN_CRITICAL_SECTION
310 # define GUI_END_CRITICAL_SECTION