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