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