1 /* pMARS -- a portable Memory Array Redcode Simulator
2  * Copyright (C) 1993-1996 Albert Ma, Na'ndor Sieben, Stefan Strack and Mintardjo Wangsawidjaja
3  * Copyright (C) 2000 Ilmari Karonen
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */
19 
20 /*
21  * global.h: global header
22  * $Id: global.h,v 1.5 2000/12/25 00:56:41 iltzu Exp $
23  *
24  * 10-23-98 Pentium optimized version 30% faster than the original
25  *          Ken Espiritu   (kespirit@cesun1.ce.vt.edu)
26  */
27 
28 #include "config.h"
29 #include <stdio.h>
30 #ifndef INT_MAX
31 #include <limits.h>
32 #endif
33 #if defined(__STDC__) || defined(__MSDOS__)
34 #include <stdlib.h>
35 #endif
36 
37 /* *********************************************************************
38    System dependent definitions or declarations
39    ********************************************************************* */
40 #if defined(__STDC__)  || defined(DOS16)
41 #define NEW_STYLE
42 #endif
43 
44 /* Generic Pointer type */
45 #if defined(NEW_STYLE)
46 typedef void *pointer_t;
47 #else
48 typedef char *pointer_t;
49 #endif
50 
51 #if defined(DOS16)
52 
53 /* ***** Turbo C FAR model ***** */
54 #if defined(__TURBOC__)
55 
56 #include <alloc.h>
57 #define MALLOC(x)     malloc((size_t)(x))
58 #define REALLOC(x, y) realloc((pointer_t)(x), (size_t)(y))
59 #define FREE(x)       free((pointer_t)(x))
60 
61 #endif                                /* __TURBOC__ */
62 
63 
64 /* ***** Microsoft/Quick C FAR model ***** */
65 #if defined(_MSC_VER)
66 
67 /* Need to test these predefined macros */
68 #include <malloc.h>
69 
70 #define MALLOC(x)     _fmalloc((size_t)(x))
71 #define REALLOC(x, y) _frealloc((pointer_t)(x), (size_t)(y))
72 #define FREE(x)       _ffree((pointer_t)(x))
73 
74 #define DOSFARMODEL
75 
76 #endif                                /* _MSC_VER */
77 
78 #endif                                /* DOS16 */
79 
80 
81 /***** Others which don't have MALLOC() defined. *****/
82 
83 #if !defined(MALLOC)
84 
85 #define MALLOC(x)     malloc((size_t)(x))
86 #define REALLOC(x, y) realloc((pointer_t)(x), (size_t)(y))
87 #define FREE(x)       free((pointer_t)(x))
88 
89 #endif                                /* ! MALLOC */
90 
91 /***** Miscellaneous *****/
92 
93 /* Some old compilers do not have NULL defined */
94 #ifndef NULL
95 
96 #ifdef DOSFARMODEL
97 #define NULL 0L
98 #else
99 #define NULL 0
100 #endif                                /* DOSFARMODEL */
101 
102 #endif                                /* NULL */
103 
104 /* unsigned types (renamed to avoid conflict with possibly predefined types) */
105 typedef unsigned char uChar;
106 typedef unsigned short uShrt;
107 typedef unsigned long uLong;
108 
109 /* FALSE, TRUE */
110 #ifndef TRUE
111 enum {
112   FALSE, TRUE
113 };
114 #endif
115 
116 /* global error output macro */
117 #ifdef MACGRAPHX
118 #define errout(s) macputs(s)
119 #else
120 #define errout(s) fputs(s,stderr)
121 #endif
122 
123 /* ************************************************************************
124    pmars global structures and definitions
125    ************************************************************************ */
126 
127 /* Version and date */
128 
129 #define PMARSVER  92
130 #define PMARSDATE "25/12/00"
131 
132 #ifdef VMS                        /* Must change codes to work with VMS error
133                                  * handling */
134 extern  PMARS_FATAL, PMARS_BADCOMLIN, PMARS_PARSEERR;
135 #define GRAPHERR   1                /* no grphx yet */
136 #define NOT386     1                /* if this error occurs, I don't wanna hear
137                                  * about it. */
138 #define MEMERR   292                /* %SYS-E-INSFMEM */
139 #define SERIOUS  &PMARS_FATAL        /* %PMARS-F-FATAL */
140 #define FNOFOUND 98962                /* %RMS-E-FNF */
141 #define CLP_NOGOOD &PMARS_BADCOMLIN        /* %PMARS-E-BADCOMLIN */
142 #define PARSEERR &PMARS_PARSEERR/* ENDABORT */
143 #define USERABORT 44                /* %SYS-E-ABORT */
144 #else                                /* everyone else */
145 /* return code:
146    0: success
147    Negative number: System error such as insufficient space, etc
148    Positive number: User error such as number too big, file not found, etc */
149 #define GRAPHERR  -4                /* graphic error */
150 #define NOT386    -3                /* trying to execute 386 code on lesser
151                                  * machine */
152 #define MEMERR    -2                /* insufficient memory, cannot free, etc. */
153 #define SERIOUS   -1                /* program logic error */
154 #define FNOFOUND   1                /* File not found */
155 #define CLP_NOGOOD 2                /* command line argument error */
156 #define PARSEERR   3                /* File doesn't assemble correctly */
157 #define USERABORT  4                /* user stopped program from cdb, etc. */
158 #endif
159 
160 /* these are used as return codes of internal functions */
161 #define SUCCESS    0
162 #define WARNING    0
163 
164 /* used by eval.c */
165 #define OVERFLOW  1
166 #define OK_EXPR   0
167 #define BAD_EXPR -1
168 #define DIV_ZERO -2
169 
170 /* used by cdb.c */
171 #define NOBREAK 0
172 #define BREAK   1
173 #define STEP    2
174 
175 #define SKIP    1                /* cmdMod settings for cdb: skip next command */
176 #define RESET   2                /* clear command queue */
177 
178 #define UNSHARED -1                /* P-space is private */
179 #define PIN_APPEARED -2
180 
181 /* used by sim.c and asm.c */
182 #ifdef NEW_MODES
183 #define INDIR_A(x) (0x80 & (x))
184 #define RAW_MODE(x) (0x7F & (x))
185 #define SYM_TO_INDIR_A(x) ( ((x) - 3) | 0x80)        /* turns index into
186                                                  * addr_sym[] to INDIR_A code */
187 #define INDIR_A_TO_SYM(x) ( RAW_MODE(x) + 3 )        /* vice versa */
188 #endif
189 
190 /* used by many */
191 #define STDOUT stdout
192 
193 #ifdef DOS16
194 #define MAXCORESIZE   8192
195 #else
196 #ifdef SMALLMEM
197 #define MAXCORESIZE   65535
198 #else
199 #define MAXCORESIZE   ((INT_MAX>>1)+1)
200 #endif
201 #endif
202 
203 #define MAXTASKNUM    INT_MAX
204 #define MAXROUND      INT_MAX
205 #define MAXCYCLE      LONG_MAX
206 #ifdef DOS16
207 #define MAXWARRIOR         8
208 #else
209 #define MAXWARRIOR        36
210 #endif
211 #define MAXINSTR         1000
212 
213 #define MAXSEPARATION MAXCORESIZE/MAXWARRIOR
214 
215 #define MAXALLCHAR 256
216 
217 /* The following holds the order in which opcodes, modifiers, and addr_modes
218    are represented as in parser. The enumerated field should start from zero */
219 enum addr_mode {
220   IMMEDIATE,                        /* # */
221   DIRECT,                        /* $ */
222   INDIRECT,                        /* @ */
223   PREDECR,                        /* < */
224   POSTINC                        /* > */
225 };
226 
227 enum op {
228   MOV, ADD, SUB, MUL, DIV, MOD, JMZ,
229   JMN, DJN, CMP, SLT, SPL, DAT, JMP,
230   SEQ,  SNE, NOP, LDP, STP
231 };                                /* has to match asm.c:opname[] */
232 
233 enum modifier {
234   mA,                                /* .A */
235   mB,                                /* .B */
236   mAB,                                /* .AB */
237   mBA,                                /* .BA */
238   mF,                                /* .F */
239   mX,                                /* .X */
240   mI                                /* .I */
241 };
242 
243 
244 #ifdef SMALLMEM
245 typedef unsigned short ADDR_T;
246 #define ISNEG(x) ((x)==0xFFFF)        /* use for unsigned ADDR_T */
247 #else
248 typedef int ADDR_T;
249 #define ISNEG(x) ((x)<0)
250 #endif
251 
252 typedef unsigned char FIELD_T;
253 typedef unsigned long U32_T;        /* unsigned long (32 bits) */
254 typedef long S32_T;
255 
256 
257 /* Memory structure */
258 typedef struct mem_struct {
259   ADDR_T  A_value, B_value;
260   FIELD_T opcode;
261   FIELD_T A_mode, B_mode;
262   FIELD_T debuginfo;
263 
264 }       mem_struct;
265 
266 /* Warrior structure */
267 typedef struct warrior_struct {
268   long    pSpaceIDNumber;
269 #ifdef DOS16
270   ADDR_T far *taskHead, far * taskTail;
271 #else
272   ADDR_T *taskHead, *taskTail;
273 #endif
274   int     tasks;
275   ADDR_T  lastResult;
276   int     pSpaceIndex;
277   ADDR_T  position;                /* load position in core */
278   int     instLen;                /* Length of instBank */
279   int     offset;                /* Offset value specified by 'ORG' or 'END'.
280                                  * 0 is default */
281   short   score[MAXWARRIOR * 2 - 1];
282 
283   char   *name;                        /* warrior name */
284   char   *version;
285   char   *date;
286   char   *fileName;                /* file name */
287   char   *authorName;                /* author name */
288   mem_struct *instBank;
289 
290   struct warrior_struct *nextWarrior;
291 
292 }       warrior_struct;
293 
294 /* ***********************************************************************
295    pmars global variable declarations
296    *********************************************************************** */
297 
298 extern int errorcode;
299 extern int errorlevel;
300 extern char errmsg[MAXALLCHAR];
301 
302 /* Some parameters */
303 extern int warriors;
304 extern ADDR_T coreSize;
305 extern int taskNum;
306 extern ADDR_T instrLim;
307 extern ADDR_T separation;
308 extern int rounds;
309 extern long cycles;
310 
311 extern int cmdMod;
312 extern S32_T seed;
313 
314 extern int SWITCH_b;
315 extern int SWITCH_e;
316 extern int SWITCH_k;
317 extern int SWITCH_8;
318 extern int SWITCH_f;
319 extern ADDR_T SWITCH_F;
320 extern int SWITCH_V;
321 extern int SWITCH_o;
322 extern int SWITCH_Q;
323 extern char *SWITCH_eq;
324 #ifdef VMS
325 extern int SWITCH_D;
326 #endif
327 #ifdef PERMUTATE
328 extern int SWITCH_P;
329 #endif
330 
331 extern int inCdb;
332 extern int debugState;
333 extern int copyDebugInfo;
334 #if defined(DOSTXTGRAPHX) || defined(DOSGRXGRAPHX) || defined(LINUXGRAPHX) \
335     || defined(XWINGRAPHX) || defined(SDLGRAPHX) || defined(STDGRAPHX)
336 extern int inputRedirection;
337 #endif
338 #if defined(XWINGRAPHX)
339 extern int xWinArgc;
340 extern char **xWinArgv;
341 #endif
342 extern mem_struct INITIALINST;        /* initialize to DAT.F $0,$0 */
343 
344 extern warrior_struct warrior[MAXWARRIOR];
345 #ifdef DOS16
346 extern ADDR_T far *pSpace[MAXWARRIOR];
347 #else
348 extern ADDR_T *pSpace[MAXWARRIOR];
349 #endif
350 extern ADDR_T pSpaceSize;
351 
352 /* ***********************************************************************
353    display define's, declarations and typedefs
354    *********************************************************************** */
355 
356 #if defined(DOSTXTGRAPHX) || defined(DOSGRXGRAPHX) || defined(LINUXGRAPHX) \
357     || defined(XWINGRAPHX) || defined(SDLGRAPHX) || defined(STDGRAPHX)
358 
359 #if !defined(LINUXGRAPHX)        /* vga.h already defines TEXT to be 0 */
360 #define         TEXT 0
361 #endif
362 #define         GRX 1
363 #define         SPEEDLEVELS 9
364 #define         NORMAL_ATTR 0x0700
365 extern int displayLevel;
366 extern int displayMode;
367 extern int displaySpeed;
368 extern int SWITCH_v;
369 
370 #if defined(LINUXGRAPHX)        /* needed for correct keyboard handling */
371 extern struct termios tio_orig;
372 extern int console_fd;
373 #endif
374 
375 #if defined(CURSESGRAPHX)
376 #include <curses.h>
377 #if defined(A_NORMAL) || defined(A_BOLD) || defined(A_REVERSE)
378 #define ATTRIBUTE
379 #endif                                /* A_* */
380 
381 extern int refreshInterval;
382 extern int refIvalAr[SPEEDLEVELS];
383 
384 #else
385 
386 extern int keyDelay;
387 extern int keyDelayAr[SPEEDLEVELS];
388 extern unsigned long loopDelay;
389 extern unsigned long loopDelayAr[SPEEDLEVELS];
390 
391 #endif                                /* CURSESGRAPHX */
392 #endif                                /* DOSTXTGRAPHX and DOSGRXGRAPHX and
393                                  * LINUXGRAPHX */
394 
395 
396 /* ***********************************************************************
397    function prototypes
398    *********************************************************************** */
399 
400 #ifdef NEW_STYLE
401 
402 extern int
403         parse_param(int argc, char *argv[]);
404 extern int eval_expr(char *expr, long *result);
405 extern int assemble(char *fName, int aWarrior);
406 extern void disasm(mem_struct * cells, ADDR_T n, ADDR_T offset);
407 extern void simulator1(void);
408 extern char *locview(ADDR_T loc, char *outp);
409 extern int cdb(char *msg);
410 extern int score(int warnum);
411 extern void sort_by_score(int *idxV, int *scrV);
412 extern int deaths(int warnum);
413 extern void results(FILE * outp);
414 extern void sort_by_score();
415 extern void Exit(int code);
416 extern void reset_regs(void);
417 extern void set_reg(char regChr, long val);
418 
419 #if defined(DOSTXTGRAPHX) || defined(DOSGRXGRAPHX) || defined(LINUXGRAPHX) \
420     || defined(XWINGRAPHX) || defined(SDLGRAPHX) || defined(STDGRAPHX)
421 extern void decode_vopt(int option);
422 #ifndef LINUXGRAPHX
423 extern void grputs(char *str);
424 extern void aputs5(char *str, int attribute);
425 #endif
426 
427 #if defined(LINUXGRAPHX)
428 extern char *svga_gets(char *s, int maxstr);
429 extern void svga_puts(char *s);
430 extern void svga_display_close(int wait);
431 extern void svga_write_menu(void);
432 extern void svga_open_graphics(void);
433 extern void svga_clear(void);
434 extern void svga_update(int curPanel);
435 extern void svga_clear_arena(void);
436 extern int svga_getch(void);
437 #endif
438 
439 #if defined(XWINGRAPHX)
440 extern void xWin_puts(char *s);
441 extern void xWin_write_menu(void);
442 extern void xWin_clear(void);
443 extern void xWin_update(int curPanel);
444 extern void xWin_display_close(int wait);
445 extern char *xWin_gets(char *s, int maxstr);
446 extern void xWin_resize(void);
447 #endif
448 
449 #if defined(SDLGRAPHX)
450 void  sdlgr_clear_arena (void);
451 void  sdlgr_refresh (int what);	/* -1: all, 0: core, >0 all text panels. */
452 void  sdlgr_relayout ();
453 void  sdlgr_write_menu (void);
454 void  sdlgr_update (int nextpanel);
455 void  sdlgr_clear (void);
456 void  sdlgr_puts (const char *s);
457 char *sdlgr_gets (char *buf, int maxbuf, const char *prompt);
458 void  sdlgr_display_clear (void);
459 void  sdlgr_open_graphics (void);
460 void  sdlgr_display_close (int wait);
461 int   sdlgr_text_lines (void);
462 void  sdlgr_set_displayLevel(int level);
463 void  sdlgr_set_displaySpeed(int speed);
464 void  sdlgr_set_displayMode(int mode);
465 #endif
466 
467 #if defined(STDGRAPHX)
468 void stdio_open_graphics(void);
469 void stdio_display_close(int wait);
470 void stdio_clear_arena(void);
471 void stdio_display_clear(void);
472 void stdio_write_menu(void);
473 void stdio_update(int nextpanel);
474 void stdio_clear(void);
475 void stdio_puts(const char *s);
476 int stdio_text_lines(void);
477 char *stdio_gets(char *buf, int maxbuf, const char *prompt);
478 void stdio_set_displayMode(int newmode);
479 void stdio_set_displayLevel(int newmode);
480 void stdio_set_displaySpeed(int newmode);
481 #endif
482 #endif
483 
484 #ifdef DOS16
485 extern char *cellview(mem_struct far * cell, char *outp, int emptyDisp);
486 #else
487 extern char *cellview(mem_struct * cell, char *outp, int emptyDisp);
488 #endif
489 
490 #else
491 
492 extern int
493         parse_param();
494 extern int
495         eval_expr();
496 extern int assemble();
497 extern void disasm();
498 extern void simulator1();
499 extern char *locview();
500 extern char *cellview();
501 extern int cdb();
502 extern int score();
503 extern int deaths();
504 extern void results();
505 extern void Exit();
506 extern void reset_regs();
507 extern void set_reg();
508 
509 #if defined(CURSESGRAPHX)
510 extern void decode_vopt();
511 extern void aputs5();
512 #endif
513 
514 #if defined (LINUXGRAPHX)
515 extern char *svga_gets();
516 extern void svga_puts();
517 extern void svga_display_close();
518 extern void svga_write_menu();
519 extern void svga_open_graphics();
520 extern void svga_clear();
521 extern void svga_update();
522 extern void svga_clear_arena();
523 extern int svga_getch();
524 #endif
525 
526 #if defined(XWINGRAPHX)
527 extern void xWin_puts();
528 extern void xWin_write_menu();
529 extern void xWin_clear();
530 extern void xWin_update();
531 extern void xWin_display_close();
532 extern char *xWin_gets();
533 extern void xWin_resize();
534 #endif
535 
536 #if defined(STDGRAPHX)
537 #error STDGRAPHX can only be compiled using an ANSI C compiler
538 #endif
539 #if defined(SDLGRAPHX)
540 #error "SDLGRAPHX can only be compiled using an ANSI C compiler."
541 #endif
542 #endif
543