|
|
1.1 root 1: /* 1.1.1.6 ! root 2: Hatari - main.h ! 3: ! 4: This file is distributed under the GNU Public License, version 2 or at ! 5: your option any later version. Read the file gpl.txt for details. 1.1 root 6: */ 7: 1.1.1.6 ! root 8: #ifndef HATARI_MAIN_H ! 9: #define HATARI_MAIN_H 1.1 root 10: 11: typedef int BOOL; 12: 1.1.1.6 ! root 13: #define PROG_NAME "Hatari v0.30" /* Name, version for window title */ ! 14: #define PROG_VERSION "v0.30" ! 15: #define VERSION_STRING "0.30 " /* Always 6 bytes(inc' NULL) */ 1.1 root 16: #define VERSION_STRING_SIZE 6 /* Size of above(inc' NULL) */ 17: 18: //#define TOTALLY_FINAL_VERSION /* Web release version... */ 19: 20: #define FINAL_VERSION /* Full-speed non-debug version for release */ 21: //#define DEBUG_TO_FILE /* Use debug.txt files */ 22: #define FIND_PERFORMANCE 23: 24: #ifndef FINAL_VERSION 25: #define USE_DEBUGGER /* Debugger version(non-release) */ 26: #define DEBUG_TO_FILE /* Use debug.txt files */ 27: #endif 28: 29: #ifdef TOTALLY_FINAL_VERSION 30: #undef DEBUG_TO_FILE /* Don't use debug files for final release */ 31: #undef FIND_PERFORMANCE 32: #endif 33: 34: #define MAX_FILENAME_LENGTH 256 35: #define MAX_STRING_LENGTH 512 36: 37: 38: #include <stdio.h> 39: #include <stdlib.h> 40: #include <string.h> 41: #include <math.h> 42: #include <time.h> 43: #include <assert.h> 44: 45: 46: #ifndef FALSE 47: #define FALSE 0 48: #define TRUE (!0) 49: #endif 50: 51: #define CALL_VAR(func) { ((void(*)(void))func)(); } 52: 1.1.1.4 root 53: /* Binary conversion macro's */ 1.1 root 54: #define BIN2(a,b) ((a<<1)+(b)) 55: #define BIN3(a,b,c) ((a<<2)+(b<<1)+(c)) 56: #define BIN4(a,b,c,d) ((a<<3)+(b<<2)+(c<<1)+(d)) 57: #define BIN5(a,b,c,d,e) ((a<<4)+(b<<3)+(c<<2)+(d<<1)+(e)) 58: #define BIN6(a,b,c,d,e,f) ((a<<5)+(b<<4)+(c<<3)+(d<<2)+(e<<1)+(f)) 59: #define BIN7(a,b,c,d,e,f,g) ((a<<6)+(b<<5)+(c<<4)+(d<<3)+(e<<2)+(f<<1)+(g)) 60: #define BIN8(a,b,c,d,e,f,g,h) ((a<<7)+(b<<6)+(c<<5)+(d<<4)+(e<<3)+(f<<2)+(g<<1)+(h)) 61: #define BIN10(a,b,c,d,e,f,g,h,i,j) ((a<<9)+(b<<8)+(c<<7)+(d<<6)+(e<<5)+(f<<4)+(g<<3)+(h<<2)+(i<<1)+(j)) 62: #define BIN12(a,b,c,d,e,f,g,h,i,j,k,l) ((a<<11)+(b<<10)+(c<<9)+(d<<8)+(e<<7)+(f<<6)+(g<<5)+(h<<4)+(i<<3)+(j<<2)+(k<<1)+(l)) 63: #define BIN14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) ((a<<13)+(b<<12)+(c<<11)+(d<<10)+(e<<9)+(f<<8)+(g<<7)+(h<<6)+(i<<5)+(j<<4)+(k<<3)+(l<<2)+(m<<1)+(n)) 64: #define BIN16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) ((a<<15)+(b<<14)+(c<<13)+(d<<12)+(e<<11)+(f<<10)+(g<<9)+(h<<8)+(i<<7)+(j<<6)+(k<<5)+(l<<4)+(m<<3)+(n<<2)+(o<<1)+(p)) 65: 1.1.1.4 root 66: /* 68000 operand sizes */ 1.1 root 67: #define SIZE_BYTE 1 68: #define SIZE_WORD 2 69: #define SIZE_LONG 4 70: 71: /* 68000 Register defines */ 72: enum { 73: REG_D0, /* D0.. */ 74: REG_D1, 75: REG_D2, 76: REG_D3, 77: REG_D4, 78: REG_D5, 79: REG_D6, 80: REG_D7, /* ..D7 */ 81: REG_A0, /* A0.. */ 82: REG_A1, 83: REG_A2, 84: REG_A3, 85: REG_A4, 86: REG_A5, 87: REG_A6, 88: REG_A7, /* ..A7(also SP) */ 89: }; 90: 91: /* PC Condition code's */ 1.1.1.4 root 92: #define PC_CARRY 0x0001 /* Bit 0 */ 93: #define PC_AUX 0x0010 /* Bit 4 */ 94: #define PC_ZERO 0x0040 /* Bit 6 */ 95: #define PC_NEG 0x0080 /* Bit 7 */ 96: #define PC_OVERFLOW 0x0800 /* Bit 11 */ 1.1 root 97: 98: /* 68000 Condition code's */ 99: #define SR_AUX 0x0010 100: #define SR_NEG 0x0008 101: #define SR_ZERO 0x0004 102: #define SR_OVERFLOW 0x0002 103: #define SR_CARRY 0x0001 104: 105: #define SR_CLEAR_AUX 0xffef 106: #define SR_CLEAR_NEG 0xfff7 107: #define SR_CLEAR_ZERO 0xfffb 108: #define SR_CLEAR_OVERFLOW 0xfffd 109: #define SR_CLEAR_CARRY 0xfffe 110: 111: #define SR_CCODE_MASK (SR_AUX|SR_NEG|SR_ZERO|SR_OVERFLOW|SR_CARRY) 112: #define SR_MASK 0xFFE0 113: 114: #define SR_TRACEMODE 0x8000 115: #define SR_SUPERMODE 0x2000 116: #define SR_IPL 0x0700 117: 118: #define SR_CLEAR_IPL 0xf8ff 119: #define SR_CLEAR_TRACEMODE 0x7fff 120: #define SR_CLEAR_SUPERMODE 0xdfff 121: 122: /* Emuation condition codes, ordered so can do 'xor al,al' to set XNZVC -0000 */ 123: #define EMU_X 0x0100 124: #define EMU_N 0x0080 125: #define EMU_Z 0x0040 126: #define EMU_V 0x0020 127: #define EMU_C 0x0010 128: 129: #define EMU_CLEAR_X 0xfeff 130: #define EMU_CLEAR_N 0xff7f 131: #define EMU_CLEAR_Z 0xffbf 132: #define EMU_CLEAR_V 0xffdf 133: #define EMU_CLEAR_C 0xffef 134: 135: /* Exception vectors */ 1.1.1.6 ! root 136: #define EXCEPTION_BUSERROR 0x00000008 1.1 root 137: #define EXCEPTION_ADDRERROR 0x0000000c 1.1.1.6 ! root 138: #define EXCEPTION_ILLEGALINS 0x00000010 ! 139: #define EXCEPTION_DIVZERO 0x00000014 ! 140: #define EXCEPTION_CHK 0x00000018 ! 141: #define EXCEPTION_TRAPV 0x0000001c ! 142: #define EXCEPTION_TRACE 0x00000024 ! 143: #define EXCEPTION_LINE_A 0x00000028 ! 144: #define EXCEPTION_LINE_F 0x0000002c ! 145: #define EXCEPTION_HBLANK 0x00000068 ! 146: #define EXCEPTION_VBLANK 0x00000070 ! 147: #define EXCEPTION_TRAP0 0x00000080 ! 148: #define EXCEPTION_TRAP1 0x00000084 ! 149: #define EXCEPTION_TRAP2 0x00000088 ! 150: #define EXCEPTION_TRAP13 0x000000B4 ! 151: #define EXCEPTION_TRAP14 0x000000B8 1.1 root 152: 1.1.1.6 ! root 153: /* Find IPL - don't forget to call MakeSR() before you use it! */ 1.1 root 154: #define FIND_IPL ((SR>>8)&0x7) 155: 156: /* Size of 68000 instructions */ 157: #define MAX_68000_INSTRUCTION_SIZE 10 /* Longest 68000 instruction is 10 bytes(6+4) */ 158: #define MIN_68000_INSTRUCTION_SIZE 2 /* Smallest 68000 instruction is 2 bytes(ie NOP) */ 159: 160: /* 161: All the following processor timings are based on a bog standard 8MHz 68000 as found in all standard ST's 162: 163: Clock cycles per line (50Hz) : 512 164: NOPs per scan line (50Hz) : 128 165: Scan lines per VBL (50Hz) : 313(64 at top,200 screen,49 bottom) 166: 167: Clock cycles per line (60Hz) : 508 168: NOPs per scan line (60Hz) : 127 169: Scan lines per VBL (60Hz) : 315 170: 171: Clock cycles per VBL : 160256 172: NOPs per VBL : 40064 173: 174: Pixels per clock cycle (low res) : 1 175: Pixels per clock cycle (med res) : 2 176: Pixels per clock cycle (high res) : 4 177: Pixels per NOP (low res) : 4 178: Pixels per NOP (med res) : 8 179: Pixels per NOP (high res) : 16 180: */ 1.1.1.6 ! root 181: #define SCREEN_START_HBL 64 /* This is usually the first line of the displayed screen */ 1.1 root 182: #define SCREEN_HEIGHT_HBL 200 /* This is usually the height of the screen */ 183: #define FIRST_VISIBLE_HBL (SCREEN_START_HBL-OVERSCAN_TOP) /* Normal screen starts 64 lines in, top border is 28 lines */ 1.1.1.6 ! root 184: #define NUM_VISIBLE_LINES (OVERSCAN_TOP+SCREEN_HEIGHT_HBL+OVERSCAN_BOTTOM) /* Number of visible screen lines including top/bottom borders */ 1.1 root 185: 186: /* Assumes 32 pixels left+right */ 187: #define SCREENBYTES_LEFT 16 /* Bytes for left border in ST screen */ 1.1.1.6 ! root 188: #define SCREENBYTES_MIDDLE 160 /* Middle(320 pixels) */ ! 189: #define SCREENBYTES_RIGHT 16 /* right border */ 1.1 root 190: #define SCREENBYTES_LINE (SCREENBYTES_LEFT+SCREENBYTES_MIDDLE+SCREENBYTES_RIGHT) 191: 192: /* Overscan values */ 1.1.1.6 ! root 193: #define OVERSCAN_LEFT (SCREENBYTES_LEFT*2) /* Number of pixels in each border */ 1.1 root 194: #define OVERSCAN_RIGHT (SCREENBYTES_RIGHT*2) 1.1.1.6 ! root 195: #define OVERSCAN_TOP 29 ! 196: #define OVERSCAN_BOTTOM 38 ! 197: #define OVERSCAN_MIDDLE 320 /* Number of pixels across screen(low res) */ ! 198: ! 199: #define SCREEN_START_CYCLE 96 /* Cycle first normal pixel appears on */ ! 200: #define SCANLINES_PER_FRAME 313 /* Number of scan lines per frame */ ! 201: #define CYCLES_PER_LINE 512 /* Cycles per horiztonal line scan */ 1.1 root 202: #define CYCLES_PER_FRAME (SCANLINES_PER_FRAME*CYCLES_PER_LINE) /* Cycles per VBL @ 50fps = 160256 */ 1.1.1.6 ! root 203: #define CYCLES_VBL_IN (SCREEN_START_HBL*CYCLES_PER_LINE) /*((28+64)*CYCLES_PER_LINE) */ ! 204: #define CYCLES_PER_SEC (CYCLES_PER_FRAME*50) /* Cycles per second */ ! 205: #define CYCLES_ENDLINE (64+320+88+40) /* DE(Display Enable) */ ! 206: #define CYCLES_HBL (CYCLES_PER_LINE+96) /* Cycles for first HBL - very inaccurate on ST */ ! 207: #define CYCLES_DEBUGGER 3000 /* Check debugger every 'x' cycles */ 1.1 root 208: 209: /* Illegal Opcode used to help emulation. eg. free entries are 8 to 15 inc' */ 210: #define GEMDOS_OPCODE 8 /* Free op-code to intercept GemDOS trap */ 211: #define RUNOLDGEMDOS_OPCODE 9 /* Free op-code to set PC to old GemDOS vector(if doesn't need to intercept) */ 212: #define CONDRV_OPCODE 10 /* Free op-code to intercept set up connected drives */ 213: #define TIMERD_OPCODE 11 /* Free op-code to prevent Timer D starting in GemDOS */ 214: #define VDI_OPCODE 12 /* Free op-code to call VDI handlers AFTER Trap#2 */ 215: #define LINEA_OPCODE 13 /* Free op-code to call handlers AFTER Line-A */ 1.1.1.6 ! root 216: 1.1 root 217: 218: #define PRG_HEADER_SIZE 0x1c /* Size of header at start of ST .prg files */ 219: 220: 221: extern BOOL bQuitProgram; 1.1.1.2 root 222: extern BOOL bEnableDebug; 1.1 root 223: extern BOOL bEmulationActive; 224: extern char szName[]; 225: extern char szBootDiscImage[MAX_FILENAME_LENGTH]; 226: extern char szWorkingDir[MAX_FILENAME_LENGTH]; 227: extern char szCurrentDir[MAX_FILENAME_LENGTH]; 228: 229: extern void Main_MemorySnapShot_Capture(BOOL bSave); 230: extern void Main_SysError(char *Error,char *Title); 231: extern int Main_Message(char *lpText, char *lpCaption /*, unsigned int uType*/); 232: extern void Main_PauseEmulation(void); 233: extern void Main_UnPauseEmulation(void); 234: extern void Main_EventHandler(); 235: 1.1.1.6 ! root 236: #endif /* ifndef HATARI_MAIN_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.