|
|
1.1 root 1: /*
1.1.1.6 root 2: Hatari - tos.c
1.1 root 3:
1.1.1.22 root 4: This file is distributed under the GNU General Public License, version 2
5: or at your option any later version. Read the file gpl.txt for details.
1.1 root 6:
1.1.1.6 root 7: Load TOS image file into ST memory, fix/setup for emulator.
8:
1.1.1.18 root 9: The Atari ST TOS needs to be patched to help with emulation. Eg, it
10: references the MMU chip to set memory size. This is patched to the
11: sizes we need without the complicated emulation of hardware which
12: is not needed (as yet). We also patch DMA devices and Hard Drives.
13:
14: NOTE: TOS versions 1.06 and 1.62 were not designed for use on a
15: real STfm. These were for the STe machine ONLY. They access the
16: DMA/Microwire addresses on boot-up which (correctly) cause a
17: bus-error on Hatari as they would in a real STfm. If a user tries
18: to select any of these images we bring up an error. */
1.1.1.16 root 19: const char TOS_fileid[] = "Hatari tos.c : " __DATE__ " " __TIME__;
1.1 root 20:
1.1.1.8 root 21: #include <SDL_endian.h>
1.1.1.4 root 22:
1.1 root 23: #include "main.h"
1.1.1.9 root 24: #include "configuration.h"
1.1 root 25: #include "file.h"
1.1.1.4 root 26: #include "gemdos.h"
27: #include "hdc.h"
1.1.1.10 root 28: #include "ioMem.h"
29: #include "log.h"
1.1 root 30: #include "m68000.h"
31: #include "memorySnapShot.h"
32: #include "stMemory.h"
1.1.1.18 root 33: #include "str.h"
1.1 root 34: #include "tos.h"
35: #include "vdi.h"
1.1.1.18 root 36: #include "falcon/dsp.h"
37: #include "clocks_timings.h"
1.1.1.25 root 38: #include "screen.h"
39: #include "video.h"
1.1 root 40:
1.1.1.27! root 41: #include "faketosData.c"
! 42:
! 43: #define TEST_PRG_BASEPAGE 0x1000
! 44: #define TEST_PRG_START (TEST_PRG_BASEPAGE + 0x100)
! 45:
1.1.1.14 root 46: bool bIsEmuTOS;
47: Uint16 TosVersion; /* eg. 0x0100, 0x0102 */
1.1.1.10 root 48: Uint32 TosAddress, TosSize; /* Address in ST memory and size of TOS image */
1.1.1.16 root 49: bool bTosImageLoaded = false; /* Successfully loaded a TOS image? */
50: bool bRamTosImage; /* true if we loaded a RAM TOS image */
1.1.1.27! root 51: bool bUseTos = true; /* false if we run in TOS-less test mode */
! 52: const char *psTestPrg; /* Points to the name of the PRG that should be used for testing */
1.1.1.23 root 53: unsigned int ConnectedDriveMask = 0x00; /* Bit mask of connected drives, eg 0x7 is A,B,C */
1.1.1.16 root 54: int nNumDrives = 2; /* Number of drives, default is 2 for A: and B: - Strictly, this is the highest mapped drive letter, in-between drives may not be allocated */
1.1.1.10 root 55:
1.1 root 56: /* Possible TOS file extensions to scan for */
1.1.1.12 root 57: static const char * const pszTosNameExts[] =
1.1.1.6 root 58: {
1.1.1.12 root 59: ".img",
60: ".rom",
61: ".tos",
62: NULL
1.1 root 63: };
64:
1.1.1.6 root 65: /* Flags that define if a TOS patch should be applied */
66: enum
1.1 root 67: {
1.1.1.12 root 68: TP_ALWAYS, /* Patch should alway be applied */
1.1.1.13 root 69: TP_HDIMAGE_OFF, /* Apply patch only if HD emulation is off */
1.1.1.22 root 70: TP_ANTI_STE, /* Apply patch only if running on plain ST */
1.1.1.24 root 71: TP_ANTI_PMMU, /* Apply patch only if no PMMU is available */
1.1.1.27! root 72: TP_FIX_040, /* Apply patch only if CPU is 68040 */
1.1.1.24 root 73: TP_FIX_060, /* Apply patch only if CPU is 68060 */
1.1.1.26 root 74: TP_VDIRES, /* Apply patch only if VDI is used */
1.1.1.6 root 75: };
1.1.1.3 root 76:
1.1.1.6 root 77: /* This structure is used for patching the TOS ROMs */
1.1.1.7 root 78: typedef struct
1.1 root 79: {
1.1.1.12 root 80: Uint16 Version; /* TOS version number */
81: Sint16 Country; /* TOS country code: -1 if it does not matter, 0=US, 1=Germany, 2=France, etc. */
82: const char *pszName; /* Name of the patch */
83: int Flags; /* When should the patch be applied? (see enum above) */
84: Uint32 Address; /* Where the patch should be applied */
85: Uint32 OldData; /* Expected first 4 old bytes */
86: Uint32 Size; /* Length of the patch */
87: const void *pNewData; /* Pointer to the new bytes */
1.1.1.6 root 88: } TOS_PATCH;
89:
1.1.1.10 root 90: static const char pszDmaBoot[] = "boot from DMA bus";
1.1.1.27! root 91: static const char pszMouse[] = "big VDI resolutions mouse driver";
1.1.1.10 root 92: static const char pszRomCheck[] = "ROM checksum";
93: static const char pszNoSteHw[] = "disable STE hardware access";
1.1.1.12 root 94: static const char pszNoPmmu[] = "disable PMMU access";
1.1.1.24 root 95: static const char pszFix060[] = "replace code for 68060";
1.1.1.27! root 96: static const char pszFix040[] = "replace code for 68040";
1.1.1.24 root 97: static const char pszFalconExtraRAM[] = "enable extra TT RAM on Falcon";
1.1.1.26 root 98: static const char pszAtariLogo[] = "draw Atari Logo";
99: static const char pszSTbook[] = "disable MCU access on ST-Book";
1.1.1.27! root 100: static const char pszNoSparrowHw[] = "disable Sparrow hardware access";
1.1.1.6 root 101:
1.1.1.9 root 102: //static Uint8 pRtsOpcode[] = { 0x4E, 0x75 }; /* 0x4E75 = RTS */
1.1.1.10 root 103: static const Uint8 pNopOpcodes[] = { 0x4E, 0x71, 0x4E, 0x71, 0x4E, 0x71, 0x4E, 0x71,
1.1.1.6 root 104: 0x4E, 0x71, 0x4E, 0x71, 0x4E, 0x71, 0x4E, 0x71, 0x4E, 0x71, 0x4E, 0x71,
1.1.1.12 root 105: 0x4E, 0x71, 0x4E, 0x71, 0x4E, 0x71, 0x4E, 0x71, 0x4E, 0x71, 0x4E, 0x71 }; /* 0x4E71 = NOP */
1.1.1.10 root 106: static const Uint8 pMouseOpcode[] = { 0xD3, 0xC1 }; /* "ADDA.L D1,A1" (instead of "ADDA.W D1,A1") */
1.1.1.13 root 107: static const Uint8 pRomCheckOpcode206[] = { 0x60, 0x00, 0x00, 0x98 }; /* BRA $e00894 */
1.1.1.27! root 108: static const Uint8 pRomCheckOpcode207[] = { 0x60, 0x00, 0x00, 0x98 }; /* BRA $e00892 */
1.1.1.13 root 109: static const Uint8 pRomCheckOpcode306[] = { 0x60, 0x00, 0x00, 0xB0 }; /* BRA $e00886 */
110: static const Uint8 pRomCheckOpcode404[] = { 0x60, 0x00, 0x00, 0x94 }; /* BRA $e00746 */
1.1.1.10 root 111: static const Uint8 pBraOpcode[] = { 0x60 }; /* 0x60XX = BRA */
1.1 root 112:
1.1.1.26 root 113: /*
114: * Routine for drawing the Atari logo.
115: * When this function is called, A0 contains a pointer to a 96x86x1 image.
116: * We cannot use the vdi yet (the screen workstation has not yet been opened),
117: * but we can take into account extended VDI modes.
118: */
119: static const Uint8 pAtariLogo[] = {
120: 0x3e, 0x3c, 0x00, 0x01, /* move.w #planes, d7; number will be patched below */
121: 0x2c, 0x3c, 0, 0, 1, 64, /* move.l #linewidth, d6; number will be patched below */
122: 0x22, 0x78, 0x04, 0x4e, /* movea.l (_v_bas_ad).w,a1 */
123: 0xd3, 0xc6, /* adda.l d6,a1 ; start drawing at 5th line */
124: 0xd3, 0xc6, /* adda.l d6,a1 */
125: 0xd3, 0xc6, /* adda.l d6,a1 */
126: 0xd3, 0xc6, /* adda.l d6,a1 */
127: 0xd3, 0xc6, /* adda.l d6,a1 */
128: 0x30, 0x3c, 0x00, 0x55, /* move.w #$0055,d0 ; 86 lines of data */
129: /* logocol1: */
130: 0x72, 0x05, /* moveq.l #5,d1 ; 6 words of data per line */
131: 0x24, 0x49, /* movea.l a1,a2 */
132: /* logocol2: */
133: 0x34, 0x18, /* move.w (a0)+,d2 */
134: 0x36, 0x07, /* move.w d7,d3 */
135: 0x53, 0x43, /* subq.w #1,d3 */
136: /* logocol3: */
137: 0x34, 0xc2, /* move.w d2,(a2)+ */
138: 0x51, 0xcb, 0xff, 0xfc, /* dbf d3,logocol3 */
139: 0x51, 0xc9, 0xff, 0xf2, /* dbf d1,logocol2 */
140: 0xd3, 0xc6, /* adda.l d6,a1 */
141: 0x51, 0xc8, 0xff, 0xe8, /* dbf d0,logocol1 */
142: 0x4e, 0x71, /* nops to end of original routine */
143: 0x4e, 0x71,
144: 0x4e, 0x71,
145: 0x4e, 0x71,
146: 0x4e, 0x71,
147: 0x4e, 0x71,
148: 0x4e, 0x71,
149: 0x4e, 0x71
150: };
151:
1.1.1.25 root 152: static const Uint8 p060movep1[] = { /* replace MOVEP */
1.1.1.24 root 153: 0x70, 0x0c, /* moveq #12,d0 */
154: 0x42, 0x30, 0x08, 0x00, /* loop: clr.b 0,(d0,a0) */
155: 0x55, 0x40, /* subq #2,d0 */
156: 0x4a, 0x40, /* tst.w d0 */
157: 0x66, 0xf6, /* bne.s loop */
158: };
1.1.1.25 root 159: static const Uint8 p060movep2[] = { /* replace MOVEP */
1.1.1.24 root 160: 0x41, 0xf8, 0xfa, 0x26, /* lea 0xfffffa26.w,a0 */
161: 0x20, 0xfc, 0x00, 0x00, 0x00, 0x88, /* move.l #$00000088,(a0)+ */
162: 0x20, 0xbc, 0x00, 0x01, 0x00, 0x05, /* move.l #$00010005,(a0) */
163: 0x4a, 0x38, 0x0a, 0x87 /* tst.b $a87.w */
164: };
1.1.1.25 root 165: static const Uint8 p060movep3_1[] = { /* replace MOVEP */
1.1.1.24 root 166: 0x4e, 0xb9, 0x00, 0xe7, 0xf0, 0x00, /* jsr $e7f000 */
167: 0x4e, 0x71 /* nop */
168: };
1.1.1.25 root 169: static const Uint8 p060movep3_2[] = { /* replace MOVEP $28(a2),d7 */
1.1.1.24 root 170:
171: 0x00, 0x7c, 0x07, 0x00, /* ori #$700,sr */
172: 0x1e, 0x2a, 0x00, 0x28, /* move.b $28(a2),d7 */
173: 0xe1, 0x4f, /* lsl.w #8,d7 */
174: 0x1e, 0x2a, 0x00, 0x2a, /* move.b $2a(a2),d7 */
175: 0x48, 0x47, /* swap d7 */
176: 0x1e, 0x2a, 0x00, 0x2c, /* move.b $2c(a2),d7 */
177: 0xe1, 0x4f, /* lsl.w #8,d7 */
178: 0x1e, 0x2a, 0x00, 0x2e, /* move.b $2e(a2),d7 */
179: 0x4e, 0x75 /* rts */
180: };
181:
182: static const Uint8 pFalconExtraRAM_1[] = {
183: 0x4e, 0xb9, 0x00, 0xe7, 0xf1, 0x00 /* jsr $e7f100 */
184: };
185: static const Uint8 pFalconExtraRAM_2[] = { /* call maddalt() to declare the extra RAM */
186: 0x20, 0x38, 0x05, 0xa4, /* move.l $05a4.w,d0 */
187: 0x67, 0x18, /* beq.s $ba2d2 */
188: 0x04, 0x80, 0x01, 0x00, 0x00, 0x00, /* subi.l #$1000000,d0 */
189: 0x2f, 0x00, /* move.l d0,-(sp) */
190: 0x2f, 0x3c, 0x01, 0x00, 0x00, 0x00, /* move.l #$1000000,-(sp) */
191: 0x3f, 0x3c, 0x00, 0x14, /* move.w #$14,-(sp) */
192: 0x4e, 0x41, /* trap #1 */
193: 0x4f, 0xef, 0x00, 0x0a, /* lea $a(sp),sp */
194: 0x70, 0x03, /* moveq #3,d0 */
195: 0x4e, 0xf9, 0x00, 0xe0, 0x0b, 0xd2 /* jmp $e00bd2 */
196: };
197:
1.1.1.27! root 198: /* patch for cpu type detection */
! 199: static unsigned char const pCputype040[58] = {
! 200: 0x20, 0xfc, 0x00, 0x00, 0x00, 0x28, /* move.l #40,(a0)+ */
! 201: 0x4e, 0x71, /* nop */
! 202: 0xf5, 0x18, /* pflusha */
! 203: 0x4e, 0x71, /* nop */
! 204: 0x4e, 0x71, 0x4e, 0x71,
! 205: 0x4e, 0x71, 0x4e, 0x71,
! 206: 0x4e, 0x71, 0x4e, 0x71,
! 207: 0x4e, 0x71, 0x4e, 0x71,
! 208: 0x4e, 0x71, 0x4e, 0x71,
! 209: 0x4e, 0x71, 0x4e, 0x71,
! 210: 0x4e, 0x71, 0x4e, 0x71,
! 211: 0x4e, 0x71, 0x4e, 0x71,
! 212: 0x4e, 0x71, 0x4e, 0x71,
! 213: 0x4e, 0x71, 0x4e, 0x71,
! 214: 0x4e, 0x71, 0x4e, 0x71,
! 215: 0x4e, 0x71
! 216: };
! 217: static unsigned char const pCputype060[58] = {
! 218: 0x20, 0xfc, 0x00, 0x00, 0x00, 0x3c, /* move.l #60,(a0)+ */
! 219: 0x4e, 0x71, /* nop */
! 220: 0xf5, 0x18, /* pflusha */
! 221: 0x4e, 0x71, /* nop */
! 222: 0x4e, 0x71, 0x4e, 0x71,
! 223: 0x4e, 0x71, 0x4e, 0x71,
! 224: 0x4e, 0x71, 0x4e, 0x71,
! 225: 0x4e, 0x71, 0x4e, 0x71,
! 226: 0x4e, 0x71, 0x4e, 0x71,
! 227: 0x4e, 0x71, 0x4e, 0x71,
! 228: 0x4e, 0x71, 0x4e, 0x71,
! 229: 0x4e, 0x71, 0x4e, 0x71,
! 230: 0x4e, 0x71, 0x4e, 0x71,
! 231: 0x4e, 0x71, 0x4e, 0x71,
! 232: 0x4e, 0x71, 0x4e, 0x71,
! 233: 0x4e, 0x71
! 234: };
! 235:
! 236: static unsigned char const pCacheflush[10] = {
! 237: 0x4e, 0x71, 0x4e, 0x71, 0x4e, 0x71, /* nops */
! 238: 0xf4, 0xf8, /* cpusha bc */
! 239: 0x4e, 0x71 /* nop */
! 240: };
! 241: static unsigned char const pCacheflush2[14] = {
! 242: 0x4e, 0x71, /* nop */
! 243: 0xf4, 0xf8, /* cpusha bc */
! 244: 0x4e, 0x71, 0x4e, 0x71, 0x4e, 0x71, /* nops */
! 245: 0x4e, 0x71, 0x4e, 0x71 /* nops */
! 246: };
! 247: static unsigned char const pCacheflush3[12] = {
! 248: 0x4e, 0x71, /* nop */
! 249: 0xf4, 0xf8, /* cpusha bc */
! 250: 0x4e, 0x71, 0x4e, 0x71, /* nops */
! 251: 0x4e, 0x71, 0x4e, 0x71 /* nops */
! 252: };
! 253: static unsigned char const pCacheflush4[12] = {
! 254: 0x4e, 0x71, /* nop */
! 255: 0xf4, 0x98, /* cinva ic */
! 256: 0x4e, 0x71, 0x4e, 0x71, /* nops */
! 257: 0x4e, 0x71, 0x4e, 0x71 /* nops */
! 258: };
! 259: static unsigned char const pColdboot1[10] = {
! 260: 0x4d, 0xfa, 0x00, 0x08, /* lea.l $00E00064(pc),a6 */
! 261: 0x4e, 0xf9, 0x00, 0xe7, 0xb0, 0x00 /* jmp $00E7B000 */
! 262: };
! 263: static unsigned char const pColdboot2[6] = {
! 264: 0x4e, 0xf9, 0x00, 0xe7, 0xb0, 0xf4 /* jmp $00E7B0F4 */
! 265: };
! 266: static unsigned char const pColdboot3[] = {
! 267: 0x40, 0xc7, /* move.w sr,d7 */
! 268: 0x00, 0x7c, 0x07, 0x00, /* ori.w #$0700,sr */
! 269: 0x4e, 0x7a, 0x10, 0x06, /* movec dtt0,d1 */
! 270: 0x70, 0x00, /* moveq.l #0,d0 */
! 271: 0x4e, 0x7b, 0x00, 0x02, /* movec d0,cacr */
! 272: 0x4e, 0x71, /* nop */
! 273: 0xf4, 0xd8, /* cinva bc */
! 274: 0x4e, 0x71, /* nop */
! 275: 0x20, 0x3c, 0x00, 0xff, 0xe0, 0x40, /* move.l #$00FFE040,d0 */
! 276: 0x4e, 0x7b, 0x00, 0x06, /* movec d0,dtt0 */
! 277: 0x4e, 0x71, /* nop */
! 278: 0xf5, 0x18, /* pflusha */
! 279: 0x4e, 0x71, /* nop */
! 280: 0x7c, 0x00, /* moveq.l #0,d6 */
! 281: 0x4e, 0x7a, 0x08, 0x07, /* movec srp,d0 */
! 282: 0x4a, 0x80, /* tst.l d0 */
! 283: 0x67, 0x32, /* beq.s $00E7B062 */
! 284: 0xb0, 0xbc, 0x05, 0x00, 0x00, 0x00, /* cmp.l #$05000000,d0 */
! 285: 0x64, 0x2a, /* bcc.s $00E7B062 */
! 286: 0xb0, 0xbc, 0x00, 0xe0, 0x00, 0x00, /* cmp.l #$00E00000,d0 */
! 287: 0x65, 0x08, /* bcs.s $00E7B048 */
! 288: 0xb0, 0xbc, 0x01, 0x00, 0x00, 0x00, /* cmp.l #$01000000,d0 */
! 289: 0x65, 0x1a, /* bcs.s $00E7B062 */
! 290: /* e7b048 : */
! 291: 0x20, 0x40, /* movea.l d0,a0 */
! 292: 0x0c, 0xa8, 0x54, 0x52, 0x45, 0x45, 0xff, 0xe8, /* cmpi.l #$54524545,-24(a0) */
! 293: 0x66, 0x00, 0x00, 0x0e, /* bne.w $00E7B062 */
! 294: 0x0c, 0xa8, 0x4b, 0x45, 0x45, 0x50, 0xff, 0xec, /* cmpi.l #$4B454550,-20(a0) */
! 295: 0x66, 0x02, /* bne.s $00E7B062 */
! 296: 0x7c, 0x01, /* moveq.l #1,d6 */
! 297: /* e7b062 : */
! 298: 0x4e, 0x71, /* nop */
! 299: 0x4e, 0x7b, 0x10, 0x06, /* movec d1,dtt0 */
! 300: 0x4e, 0x71, /* nop */
! 301: 0xf5, 0x18, /* pflusha */
! 302: 0x4e, 0x71, /* nop */
! 303: 0x4a, 0x86, /* tst.l d6 */
! 304: 0x67, 0x2e, /* beq.s $00E7B0A0 */
! 305: 0x20, 0x08, /* move.l a0,d0 */
! 306: 0x4e, 0x7b, 0x08, 0x07, /* movec d0,srp */
! 307: 0x4e, 0x7b, 0x08, 0x06, /* movec d0,urp */
! 308: 0x20, 0x3c, 0x00, 0x00, 0xc0, 0x00, /* move.l #$0000C000,d0 */
! 309: 0x4e, 0x7b, 0x00, 0x03, /* movec d0,tc */
! 310: 0x70, 0x00, /* moveq.l #0,d0 */
! 311: 0x4e, 0x7b, 0x00, 0x04, /* movec d0,itt0 */
! 312: 0x4e, 0x7b, 0x00, 0x05, /* movec d0,itt1 */
! 313: 0x4e, 0x7b, 0x00, 0x06, /* movec d0,dtt0 */
! 314: 0x4e, 0x7b, 0x00, 0x07, /* movec d0,dtt1 */
! 315: 0x4e, 0x71, /* nop */
! 316: 0xf5, 0x18, /* pflusha */
! 317: 0x4e, 0x71, /* nop */
! 318: 0x60, 0x32, /* bra.s $00E7B0D2 */
! 319: /* e7b0a0 : */
! 320: 0x20, 0x3c, 0x00, 0xff, 0xe0, 0x00, /* move.l #$00FFE000,d0 */
! 321: 0x4e, 0x7b, 0x00, 0x04, /* movec d0,itt0 */
! 322: 0x20, 0x3c, 0x00, 0xff, 0xe0, 0x40, /* move.l #$00FFE040,d0 */
! 323: 0x4e, 0x7b, 0x00, 0x06, /* movec d0,dtt0 */
! 324: 0x70, 0x00, /* moveq.l #0,d0 */
! 325: 0x4e, 0x7b, 0x00, 0x05, /* movec d0,itt1 */
! 326: 0x4e, 0x7b, 0x00, 0x07, /* movec d0,dtt1 */
! 327: 0x70, 0x00, /* moveq.l #0,d0 */
! 328: 0x4e, 0x7b, 0x00, 0x03, /* movec d0,tc */
! 329: 0x4e, 0x7b, 0x08, 0x07, /* movec d0,srp */
! 330: 0x4e, 0x7b, 0x08, 0x06, /* movec d0,urp */
! 331: 0x4e, 0x71, /* nop */
! 332: 0xf5, 0x18, /* pflusha */
! 333: 0x4e, 0x71, /* nop */
! 334: /* e7b0d2 : */
! 335: 0x20, 0x3c, 0x00, 0x00, 0x80, 0x00, /* move.l #$00008000,d0 */
! 336: 0x4e, 0x7b, 0x00, 0x02, /* movec d0,cacr */
! 337: 0x46, 0xc7, /* move.w d7,sr */
! 338: 0x4e, 0xd6, /* jmp (a6) */
! 339: /* e7b0e0 : */
! 340: 0x08, 0xb8, 0x00, 0x05, 0x82, 0x66, /* bclr #5,($FFFF8266).w */
! 341: 0x08, 0xb8, 0x00, 0x06, 0x82, 0x66, /* bclr #6,($FFFF8266).w */
! 342: 0x08, 0xb8, 0x00, 0x00, 0x82, 0x0a, /* bclr #0,($FFFF820A).w */
! 343: 0x4e, 0xd0, /* jmp (a0) */
! 344: /* e7b0f4 : */
! 345: 0x00, 0x7c, 0x07, 0x00, /* ori.w #$0700,sr */
! 346: 0x72, 0x00, /* moveq.l #0,d1 */
! 347: 0x41, 0xf8, 0x98, 0x00, /* lea.l ($FFFF9800).w,a0 */
! 348: 0x30, 0x3c, 0x00, 0xff, /* move.w #$00FF,d0 */
! 349: 0x20, 0xc1, /* move.l d1,(a0)+ */
! 350: 0x51, 0xc8, 0xff, 0xfc, /* dbf d0,$00E7B102 */
! 351: 0x41, 0xf8, 0x82, 0x40, /* lea.l ($FFFF8240).w,a0 */
! 352: 0x70, 0x07, /* moveq.l #7,d0 */
! 353: 0x20, 0xc1, /* move.l d1,(a0)+ */
! 354: 0x51, 0xc8, 0xff, 0xfc, /* dbf d0,$00E7B10E */
! 355: 0x70, 0x00, /* moveq.l #0,d0 */
! 356: 0x4e, 0x7b, 0x00, 0x02, /* movec d0,cacr */
! 357: 0x4e, 0x71, /* nop */
! 358: 0x4e, 0x71, /* nop */
! 359: 0xf4, 0xd8, /* cinva bc */
! 360: 0x4e, 0x71, /* nop */
! 361: 0x41, 0xf8, 0x00, 0x08, /* lea.l ($00000008).w,a0 */
! 362: 0x20, 0x3c, 0x00, 0x00, 0x06, 0x00, /* move.l #$00000600,d0 */
! 363: 0x90, 0x88, /* sub.l a0,d0 */
! 364: 0xe4, 0x88, /* lsr.l #2,d0 */
! 365: 0x42, 0x81, /* clr.l d1 */
! 366: /* e7b132 : */
! 367: 0x20, 0xc1, /* move.l d1,(a0)+ */
! 368: 0x53, 0x80, /* subq.l #1,d0 */
! 369: 0x66, 0xfa, /* bne.s $00E7B132 */
! 370: 0x4e, 0x71, /* nop */
! 371: 0xf5, 0x18, /* pflusha */
! 372: 0x4e, 0x71, /* nop */
! 373: 0x20, 0x3c, 0x00, 0xff, 0xe0, 0x00, /* move.l #$00FFE000,d0 */
! 374: 0x4e, 0x7b, 0x00, 0x04, /* movec d0,itt0 */
! 375: 0x20, 0x3c, 0x00, 0xff, 0xe0, 0x40, /* move.l #$00FFE040,d0 */
! 376: 0x4e, 0x7b, 0x00, 0x06, /* movec d0,dtt0 */
! 377: 0x70, 0x00, /* moveq.l #0,d0 */
! 378: 0x4e, 0x7b, 0x00, 0x05, /* movec d0,itt1 */
! 379: 0x4e, 0x7b, 0x00, 0x07, /* movec d0,dtt1 */
! 380: 0x4e, 0x71, /* nop */
! 381: 0x70, 0x00, /* moveq.l #0,d0 */
! 382: 0x4e, 0x7b, 0x00, 0x03, /* movec d0,tc */
! 383: 0x4e, 0x71, /* nop */
! 384: 0x4e, 0x7b, 0x08, 0x07, /* movec d0,srp */
! 385: 0x4e, 0x7b, 0x08, 0x06, /* movec d0,urp */
! 386: 0x4e, 0x71, /* nop */
! 387: 0x4e, 0xf9, 0x00, 0xe0, 0x00, 0x30, /* jmp $00E00030 */
! 388: /* e7b176 : */
! 389: 0x4e, 0x7a, 0x00, 0x02, /* movec cacr,d0 */
! 390: 0x08, 0x80, 0x00, 0x0f, /* bclr #15,d0 */
! 391: 0x67, 0x0a, /* beq.s $00E7B18A */
! 392: 0x4e, 0x7b, 0x00, 0x02, /* movec d0,cacr */
! 393: 0x4e, 0x71, /* nop */
! 394: 0xf4, 0x98, /* cinva ic */
! 395: 0x4e, 0x71, /* nop */
! 396: 0x4e, 0xf9, 0xde, 0xad, 0xfa, 0xce, /* jmp $DEADFACE */
! 397: /* e7b190 : */
! 398: 0x20, 0x02, 0x10, 0x21, /* dc.l 0x20021021 */
! 399: 0x00, 0xe7, 0xb1, 0x9c, /* dc.l 0x00e7b19c */
! 400: 0x00, 0xe7, 0xb1, 0xa0, /* dc.l 0x00e7b1a0 */
! 401: /* e7b19c : */
! 402: 0x73, 0x00, /* dc.w 0x7300 (nf_id) */
! 403: 0x4e, 0x75, /* rts */
! 404: /* e7b1a0 : */
! 405: 0x73, 0x01, /* dc.w 0x7301 (nf_call) */
! 406: 0x4e, 0x75 /* rts */
! 407: };
! 408:
1.1.1.6 root 409: /* The patches for the TOS: */
1.1.1.10 root 410: static const TOS_PATCH TosPatches[] =
1.1.1.6 root 411: {
1.1.1.13 root 412: { 0x100, -1, pszDmaBoot, TP_HDIMAGE_OFF, 0xFC03D6, 0x610000D0, 4, pNopOpcodes }, /* BSR $FC04A8 */
1.1.1.6 root 413:
1.1.1.13 root 414: { 0x102, -1, pszDmaBoot, TP_HDIMAGE_OFF, 0xFC0472, 0x610000E4, 4, pNopOpcodes }, /* BSR.W $FC0558 */
1.1.1.6 root 415: { 0x102, 0, pszMouse, TP_ALWAYS, 0xFD0030, 0xD2C147F9, 2, pMouseOpcode },
416: { 0x102, 1, pszMouse, TP_ALWAYS, 0xFD008A, 0xD2C147F9, 2, pMouseOpcode },
417: { 0x102, 2, pszMouse, TP_ALWAYS, 0xFD00A8, 0xD2C147F9, 2, pMouseOpcode },
418: { 0x102, 3, pszMouse, TP_ALWAYS, 0xFD0030, 0xD2C147F9, 2, pMouseOpcode },
419: { 0x102, 6, pszMouse, TP_ALWAYS, 0xFCFEF0, 0xD2C147F9, 2, pMouseOpcode },
420: { 0x102, 8, pszMouse, TP_ALWAYS, 0xFCFEFE, 0xD2C147F9, 2, pMouseOpcode },
421:
1.1.1.13 root 422: { 0x104, -1, pszDmaBoot, TP_HDIMAGE_OFF, 0xFC0466, 0x610000E4, 4, pNopOpcodes }, /* BSR.W $FC054C */
1.1.1.6 root 423:
1.1.1.13 root 424: { 0x106, -1, pszDmaBoot, TP_HDIMAGE_OFF, 0xE00576, 0x610000E4, 4, pNopOpcodes }, /* BSR.W $E0065C */
1.1.1.10 root 425:
1.1.1.13 root 426: { 0x162, -1, pszDmaBoot, TP_HDIMAGE_OFF, 0xE00576, 0x610000E4, 4, pNopOpcodes }, /* BSR.W $E0065C */
1.1.1.10 root 427:
1.1.1.13 root 428: { 0x205, -1, pszDmaBoot, TP_HDIMAGE_OFF, 0xE006AE, 0x610000E4, 4, pNopOpcodes }, /* BSR.W $E00794 */
1.1.1.6 root 429: /* An unpatched TOS 2.05 only works on STEs, so apply some anti-STE patches... */
1.1.1.11 root 430: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE00096, 0x42788900, 4, pNopOpcodes }, /* CLR.W $FFFF8900 */
431: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE0009E, 0x31D88924, 4, pNopOpcodes }, /* MOVE.W (A0)+,$FFFF8924 */
432: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE000A6, 0x09D10AA9, 28, pNopOpcodes },
433: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE003A0, 0x30389200, 4, pNopOpcodes }, /* MOVE.W $ffff9200,D0 */
434: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE004EA, 0x61000CBC, 4, pNopOpcodes },
435: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE00508, 0x61000C9E, 4, pNopOpcodes },
436: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE007A0, 0x631E2F3C, 1, pBraOpcode },
437: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE00928, 0x10388901, 4, pNopOpcodes }, /* MOVE.B $FFFF8901,D0 */
438: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE00944, 0xB0388901, 4, pNopOpcodes }, /* CMP.B $FFFF8901,D0 */
439: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE00950, 0x67024601, 1, pBraOpcode },
440: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE00968, 0x61000722, 4, pNopOpcodes },
441: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE00CF2, 0x1038820D, 4, pNopOpcodes }, /* MOVE.B $FFFF820D,D0 */
442: { 0x205, -1, pszNoSteHw, TP_ANTI_STE, 0xE00E00, 0x1038820D, 4, pNopOpcodes }, /* MOVE.B $FFFF820D,D0 */
443: { 0x205, 0, pszNoSteHw, TP_ANTI_STE, 0xE03038, 0x31C0860E, 4, pNopOpcodes },
444: { 0x205, 0, pszNoSteHw, TP_ANTI_STE, 0xE034A8, 0x31C0860E, 4, pNopOpcodes },
445: { 0x205, 0, pszNoSteHw, TP_ANTI_STE, 0xE034F6, 0x31E90002, 6, pNopOpcodes },
1.1.1.6 root 446:
447: /* E007FA MOVE.L #$1FFFE,D7 Run checksums on 2xROMs (skip) */
448: /* Checksum is total of TOS ROM image, but get incorrect results */
449: /* as we've changed bytes in the ROM! So, just skip anyway! */
1.1.1.13 root 450: { 0x206, -1, pszRomCheck, TP_ALWAYS, 0xE007FA, 0x2E3C0001, 4, pRomCheckOpcode206 },
451: { 0x206, -1, pszDmaBoot, TP_HDIMAGE_OFF, 0xE00898, 0x610000E0, 4, pNopOpcodes }, /* BSR.W $E0097A */
1.1.1.26 root 452: { 0x206, -1, pszAtariLogo, TP_VDIRES, 0xE0076C, 0x1038044c, sizeof( pAtariLogo ), pAtariLogo },
453:
1.1.1.27! root 454: { 0x207, -1, pszNoSparrowHw, TP_ALWAYS, 0xE02D90, 0x08F80005, 6, pNopOpcodes }, /* BSET #5,$ffff8e0d.w */
! 455: { 0x207, -1, pszRomCheck, TP_ALWAYS, 0xE007F8, 0x2E3C0001, 4, pRomCheckOpcode207 },
! 456: { 0x207, -1, pszDmaBoot, TP_HDIMAGE_OFF, 0xE008DC, 0x610000E0, 4, pNopOpcodes }, /* BSR.W $E009BE */
! 457: { 0x207, -1, pszAtariLogo, TP_VDIRES, 0xE0076A, 0x1038044c, sizeof(pAtariLogo), pAtariLogo },
! 458:
1.1.1.26 root 459: { 0x208, -1, pszDmaBoot, TP_HDIMAGE_OFF, 0xE00806, 0x610000E8, 4, pNopOpcodes }, /* BSR.W $E008F0 */
460: { 0x208, -1, pszAtariLogo, TP_VDIRES, 0xE006B4, 0x1038044c, sizeof( pAtariLogo ), pAtariLogo },
461: { 0x208, -1, pszSTbook, TP_ALWAYS, 0xE00066, 0x303900d0, 18, pNopOpcodes },
462: { 0x208, -1, pszSTbook, TP_ALWAYS, 0xE000D6, 0x4a7900d0, 6, pNopOpcodes },
463: { 0x208, -1, pszSTbook, TP_ALWAYS, 0xE009FE, 0x303900d0, 14, pNopOpcodes },
1.1 root 464:
1.1.1.13 root 465: { 0x306, -1, pszRomCheck, TP_ALWAYS, 0xE007D4, 0x2E3C0001, 4, pRomCheckOpcode306 },
1.1.1.24 root 466: { 0x306, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE00068, 0xF0394000, 24, pNopOpcodes }, /* pmove : TC=0 TT0=0 TT1=0 -> disable MMU */
467: { 0x306, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE01702, 0xF0394C00, 32, pNopOpcodes }, /* pmove : CRP=80000002 00000700 TC=80f04445 TT0=017e8107 TT1=807e8507 -> */
1.1.1.25 root 468: { 0x306, -1, pszFix060, TP_FIX_060, 0xe024dc, 0x01C80000, 12, p060movep1 },
469: { 0x306, -1, pszFix060, TP_FIX_060, 0xe024fa, 0x01C80000, 12, p060movep1 },
1.1.1.26 root 470: { 0x306, -1, pszAtariLogo, TP_VDIRES, 0xE00754, 0x1038044c, sizeof( pAtariLogo ), pAtariLogo },
1.1.1.12 root 471:
1.1.1.24 root 472: { 0x400, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE00064, 0xF0394000, 24, pNopOpcodes }, /* pmove : TC=0 TT0=0 TT1=0 -> disable MMU */
1.1.1.22 root 473: { 0x400, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE0148A, 0xF0394C00, 32, pNopOpcodes },
1.1.1.24 root 474: { 0x400, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE03948, 0xF0394000, 24, pNopOpcodes }, /* pmove : TC=0 TT0=0 TT1=0 -> disable MMU */
1.1.1.13 root 475: { 0x400, -1, pszRomCheck, TP_ALWAYS, 0xE00686, 0x2E3C0007, 4, pRomCheckOpcode404 },
1.1.1.27! root 476: { 0x400, -1, pszFix040, TP_FIX_040, 0xE003BE, 0x7200347C, sizeof(pCputype040), pCputype040 },
! 477: { 0x400, -1, pszFix040, TP_FIX_040, 0xE00614, 0x4E7B0002, 4, pNopOpcodes },
! 478: { 0x400, -1, pszFix040, TP_FIX_040, 0xE0072C, 0x203C0000, sizeof(pCacheflush), pCacheflush },
! 479: { 0x400, -1, pszFix040, TP_FIX_040, 0xE00836, 0x4E7A0002, sizeof(pCacheflush2), pCacheflush2 },
! 480: { 0x400, -1, pszFix040, TP_FIX_040, 0xE01894, 0x4E7A1002, sizeof(pCacheflush3), pCacheflush3 },
! 481: { 0x400, -1, pszFix040, TP_FIX_040, 0xE01916, 0x4E7B0002, 4, pNopOpcodes },
! 482: { 0x400, -1, pszFix040, TP_FIX_040, 0xE00054, 0x203c0000, sizeof(pColdboot1), pColdboot1 },
! 483: { 0x400, -1, pszFix040, TP_FIX_040, 0xE03934, 0x46FC2700, sizeof(pColdboot2), pColdboot2 },
! 484: { 0x400, -1, pszFix040, TP_FIX_040, 0xE7B000, 0xFFFFFFFF, sizeof(pColdboot3), pColdboot3 },
! 485: { 0x400, -1, pszFix040, TP_FIX_040, 0xE098AC, 0x4E7A2002, sizeof(pCacheflush4), pCacheflush4 },
! 486: { 0x400, -1, pszFix040, TP_FIX_040, 0xE23636, 0x4E7B7002, 4, pNopOpcodes },
! 487: { 0x400, -1, pszFix040, TP_FIX_040, 0xE41634, 0x4E7B7002, 4, pNopOpcodes },
! 488: { 0x400, -1, pszFix060, TP_FIX_060, 0xE003BE, 0x7200347C, sizeof(pCputype060), pCputype060 },
! 489: { 0x400, -1, pszFix060, TP_FIX_060, 0xE00614, 0x4E7B0002, 4, pNopOpcodes },
! 490: { 0x400, -1, pszFix060, TP_FIX_060, 0xE0072C, 0x203C0000, sizeof(pCacheflush), pCacheflush },
! 491: { 0x400, -1, pszFix060, TP_FIX_060, 0xE00836, 0x4E7A0002, sizeof(pCacheflush2), pCacheflush2 },
! 492: { 0x400, -1, pszFix060, TP_FIX_060, 0xE01894, 0x4E7A1002, sizeof(pCacheflush3), pCacheflush3 },
! 493: { 0x400, -1, pszFix060, TP_FIX_060, 0xE01916, 0x4E7B0002, 4, pNopOpcodes },
! 494: { 0x400, -1, pszFix060, TP_FIX_060, 0xE00054, 0x203c0000, sizeof(pColdboot1), pColdboot1 },
! 495: { 0x400, -1, pszFix060, TP_FIX_060, 0xE03934, 0x46FC2700, sizeof(pColdboot2), pColdboot2 },
! 496: { 0x400, -1, pszFix060, TP_FIX_060, 0xE7B000, 0xFFFFFFFF, sizeof(pColdboot3), pColdboot3 },
! 497: { 0x400, -1, pszFix060, TP_FIX_060, 0xE098AC, 0x4E7A2002, sizeof(pCacheflush4), pCacheflush4 },
! 498: { 0x400, -1, pszFix060, TP_FIX_060, 0xE23636, 0x4E7B7002, 4, pNopOpcodes },
! 499: { 0x400, -1, pszFix060, TP_FIX_060, 0xE41634, 0x4E7B7002, 4, pNopOpcodes },
1.1.1.25 root 500: { 0x400, -1, pszFix060, TP_FIX_060, 0xE0258A, 0x01C80000, 12, p060movep1 },
501: { 0x400, -1, pszFix060, TP_FIX_060, 0xE025DA, 0x41F8FA01, 20, p060movep2 },
1.1.1.13 root 502:
1.1.1.24 root 503: { 0x401, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE0006A, 0xF0394000, 24, pNopOpcodes }, /* pmove : TC=0 TT0=0 TT1=0 -> disable MMU */
1.1.1.22 root 504: { 0x401, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE014A8, 0xF0394C00, 32, pNopOpcodes },
1.1.1.24 root 505: { 0x401, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE03946, 0xF0394000, 24, pNopOpcodes }, /* pmove : TC=0 TT0=0 TT1=0 -> disable MMU */
1.1.1.13 root 506: { 0x401, -1, pszRomCheck, TP_ALWAYS, 0xE006A6, 0x2E3C0007, 4, pRomCheckOpcode404 },
1.1.1.27! root 507: { 0x401, -1, pszFix040, TP_FIX_040, 0xE003C4, 0x7200347C, sizeof(pCputype040), pCputype040 },
! 508: { 0x401, -1, pszFix040, TP_FIX_040, 0xE00634, 0x4E7B0002, 4, pNopOpcodes },
! 509: { 0x401, -1, pszFix040, TP_FIX_040, 0xE0074C, 0x203C0000, sizeof(pCacheflush), pCacheflush },
! 510: { 0x401, -1, pszFix040, TP_FIX_040, 0xE00856, 0x4E7A0002, sizeof(pCacheflush2), pCacheflush2 },
! 511: { 0x401, -1, pszFix040, TP_FIX_040, 0xE01892, 0x4E7A1002, sizeof(pCacheflush3), pCacheflush3 },
! 512: { 0x401, -1, pszFix040, TP_FIX_040, 0xE01914, 0x4E7B0002, 4, pNopOpcodes },
! 513: { 0x401, -1, pszFix040, TP_FIX_040, 0xE0005A, 0x203c0000, sizeof(pColdboot1), pColdboot1 },
! 514: { 0x401, -1, pszFix040, TP_FIX_040, 0xE03932, 0x46FC2700, sizeof(pColdboot2), pColdboot2 },
! 515: { 0x401, -1, pszFix040, TP_FIX_040, 0xE7B000, 0xFFFFFFFF, sizeof(pColdboot3), pColdboot3 },
! 516: { 0x401, -1, pszFix040, TP_FIX_040, 0xE098A2, 0x4E7A2002, sizeof(pCacheflush4), pCacheflush4 },
! 517: { 0x401, -1, pszFix040, TP_FIX_040, 0xE11B28, 0x4E7B0002, 4, pNopOpcodes },
! 518: { 0x401, -1, pszFix040, TP_FIX_040, 0xE11BB0, 0x4E7B7002, 4, pNopOpcodes },
! 519: { 0x401, -1, pszFix040, TP_FIX_040, 0xE11CAC, 0x4E7B0002, 4, pNopOpcodes },
! 520: { 0x401, -1, pszFix040, TP_FIX_040, 0xE12512, 0x4E7B5002, 4, pNopOpcodes },
! 521: { 0x401, -1, pszFix040, TP_FIX_040, 0xE12888, 0x4E7B6002, 4, pNopOpcodes },
! 522: { 0x401, -1, pszFix040, TP_FIX_040, 0xE128D4, 0x4E7B6002, 4, pNopOpcodes },
! 523: { 0x401, -1, pszFix040, TP_FIX_040, 0xE12938, 0x4E7B6002, 4, pNopOpcodes },
! 524: { 0x401, -1, pszFix040, TP_FIX_040, 0xE12B50, 0x4E7B5002, 4, pNopOpcodes },
! 525: { 0x401, -1, pszFix040, TP_FIX_040, 0xE12BD0, 0x4E7B5002, 4, pNopOpcodes },
! 526: { 0x401, -1, pszFix040, TP_FIX_040, 0xE12C48, 0x4E7B2002, 4, pNopOpcodes },
! 527: { 0x401, -1, pszFix040, TP_FIX_040, 0xE12CC6, 0x4E7B0002, 4, pNopOpcodes },
! 528: { 0x401, -1, pszFix040, TP_FIX_040, 0xE12D2E, 0x4E7B0002, 4, pNopOpcodes },
! 529: { 0x401, -1, pszFix040, TP_FIX_040, 0xE12DF0, 0x4E7B0002, 4, pNopOpcodes },
! 530: { 0x401, -1, pszFix040, TP_FIX_040, 0xE17AA6, 0x4E7B0002, 4, pNopOpcodes },
! 531: { 0x401, -1, pszFix040, TP_FIX_040, 0xE17B3E, 0x4E7B0002, 4, pNopOpcodes },
! 532: { 0x401, -1, pszFix040, TP_FIX_040, 0xE23840, 0x4E7B7002, 4, pNopOpcodes },
! 533: { 0x401, -1, pszFix040, TP_FIX_040, 0xE42670, 0x4E7B7002, 4, pNopOpcodes },
! 534: { 0x401, -1, pszFix060, TP_FIX_060, 0xE003C4, 0x7200347C, sizeof(pCputype060), pCputype060 },
! 535: { 0x401, -1, pszFix060, TP_FIX_060, 0xE00634, 0x4E7B0002, 4, pNopOpcodes },
! 536: { 0x401, -1, pszFix060, TP_FIX_060, 0xE0074C, 0x203C0000, sizeof(pCacheflush), pCacheflush },
! 537: { 0x401, -1, pszFix060, TP_FIX_060, 0xE00856, 0x4E7A0002, sizeof(pCacheflush2), pCacheflush2 },
! 538: { 0x401, -1, pszFix060, TP_FIX_060, 0xE01892, 0x4E7A1002, sizeof(pCacheflush3), pCacheflush3 },
! 539: { 0x401, -1, pszFix060, TP_FIX_060, 0xE01914, 0x4E7B0002, 4, pNopOpcodes },
! 540: { 0x401, -1, pszFix060, TP_FIX_060, 0xE0005A, 0x203c0000, sizeof(pColdboot1), pColdboot1 },
! 541: { 0x401, -1, pszFix060, TP_FIX_060, 0xE03932, 0x46FC2700, sizeof(pColdboot2), pColdboot2 },
! 542: { 0x401, -1, pszFix060, TP_FIX_060, 0xE7B000, 0xFFFFFFFF, sizeof(pColdboot3), pColdboot3 },
! 543: { 0x401, -1, pszFix060, TP_FIX_060, 0xE098A2, 0x4E7A2002, sizeof(pCacheflush4), pCacheflush4 },
! 544: { 0x401, -1, pszFix060, TP_FIX_060, 0xE11B28, 0x4E7B0002, 4, pNopOpcodes },
! 545: { 0x401, -1, pszFix060, TP_FIX_060, 0xE11BB0, 0x4E7B7002, 4, pNopOpcodes },
! 546: { 0x401, -1, pszFix060, TP_FIX_060, 0xE11CAC, 0x4E7B0002, 4, pNopOpcodes },
! 547: { 0x401, -1, pszFix060, TP_FIX_060, 0xE12512, 0x4E7B5002, 4, pNopOpcodes },
! 548: { 0x401, -1, pszFix060, TP_FIX_060, 0xE12888, 0x4E7B6002, 4, pNopOpcodes },
! 549: { 0x401, -1, pszFix060, TP_FIX_060, 0xE128D4, 0x4E7B6002, 4, pNopOpcodes },
! 550: { 0x401, -1, pszFix060, TP_FIX_060, 0xE12938, 0x4E7B6002, 4, pNopOpcodes },
! 551: { 0x401, -1, pszFix060, TP_FIX_060, 0xE12B50, 0x4E7B5002, 4, pNopOpcodes },
! 552: { 0x401, -1, pszFix060, TP_FIX_060, 0xE12BD0, 0x4E7B5002, 4, pNopOpcodes },
! 553: { 0x401, -1, pszFix060, TP_FIX_060, 0xE12C48, 0x4E7B2002, 4, pNopOpcodes },
! 554: { 0x401, -1, pszFix060, TP_FIX_060, 0xE12CC6, 0x4E7B0002, 4, pNopOpcodes },
! 555: { 0x401, -1, pszFix060, TP_FIX_060, 0xE12D2E, 0x4E7B0002, 4, pNopOpcodes },
! 556: { 0x401, -1, pszFix060, TP_FIX_060, 0xE12DF0, 0x4E7B0002, 4, pNopOpcodes },
! 557: { 0x401, -1, pszFix060, TP_FIX_060, 0xE17AA6, 0x4E7B0002, 4, pNopOpcodes },
! 558: { 0x401, -1, pszFix060, TP_FIX_060, 0xE17B3E, 0x4E7B0002, 4, pNopOpcodes },
! 559: { 0x401, -1, pszFix060, TP_FIX_060, 0xE23840, 0x4E7B7002, 4, pNopOpcodes },
! 560: { 0x401, -1, pszFix060, TP_FIX_060, 0xE42670, 0x4E7B7002, 4, pNopOpcodes },
1.1.1.25 root 561: { 0x401, -1, pszFix060, TP_FIX_060, 0xE02588, 0x01C80000, 12, p060movep1 },
562: { 0x401, -1, pszFix060, TP_FIX_060, 0xE025D8, 0x41F8FA01, 20, p060movep2 },
1.1.1.13 root 563:
1.1.1.24 root 564: { 0x402, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE0006A, 0xF0394000, 24, pNopOpcodes }, /* pmove : TC=0 TT0=0 TT1=0 -> disable MMU */
1.1.1.22 root 565: { 0x402, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE014A8, 0xF0394C00, 32, pNopOpcodes },
1.1.1.24 root 566: { 0x402, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE03946, 0xF0394000, 24, pNopOpcodes }, /* pmove : TC=0 TT0=0 TT1=0 -> disable MMU */
1.1.1.13 root 567: { 0x402, -1, pszRomCheck, TP_ALWAYS, 0xE006A6, 0x2E3C0007, 4, pRomCheckOpcode404 },
1.1.1.27! root 568: { 0x402, -1, pszFix040, TP_FIX_040, 0xE003C4, 0x7200347C, sizeof(pCputype040), pCputype040 },
! 569: { 0x402, -1, pszFix040, TP_FIX_040, 0xE00634, 0x4E7B0002, 4, pNopOpcodes },
! 570: { 0x402, -1, pszFix040, TP_FIX_040, 0xE0074C, 0x203C0000, sizeof(pCacheflush), pCacheflush },
! 571: { 0x402, -1, pszFix040, TP_FIX_040, 0xE00856, 0x4E7A0002, sizeof(pCacheflush2), pCacheflush2 },
! 572: { 0x402, -1, pszFix040, TP_FIX_040, 0xE01892, 0x4E7A1002, sizeof(pCacheflush3), pCacheflush3 },
! 573: { 0x402, -1, pszFix040, TP_FIX_040, 0xE01914, 0x4E7B0002, 4, pNopOpcodes },
! 574: { 0x402, -1, pszFix040, TP_FIX_040, 0xE0005A, 0x203c0000, sizeof(pColdboot1), pColdboot1 },
! 575: { 0x402, -1, pszFix040, TP_FIX_040, 0xE03932, 0x46FC2700, sizeof(pColdboot2), pColdboot2 },
! 576: { 0x402, -1, pszFix040, TP_FIX_040, 0xE7B000, 0xFFFFFFFF, sizeof(pColdboot3), pColdboot3 },
! 577: { 0x402, -1, pszFix040, TP_FIX_040, 0xE098AC, 0x4E7A2002, sizeof(pCacheflush4), pCacheflush4 },
! 578: { 0x402, -1, pszFix040, TP_FIX_040, 0xE11B76, 0x4E7B0002, 4, pNopOpcodes },
! 579: { 0x402, -1, pszFix040, TP_FIX_040, 0xE11BFE, 0x4E7B7002, 4, pNopOpcodes },
! 580: { 0x402, -1, pszFix040, TP_FIX_040, 0xE11CFA, 0x4E7B0002, 4, pNopOpcodes },
! 581: { 0x402, -1, pszFix040, TP_FIX_040, 0xE12560, 0x4E7B5002, 4, pNopOpcodes },
! 582: { 0x402, -1, pszFix040, TP_FIX_040, 0xE128D6, 0x4E7B6002, 4, pNopOpcodes },
! 583: { 0x402, -1, pszFix040, TP_FIX_040, 0xE12922, 0x4E7B6002, 4, pNopOpcodes },
! 584: { 0x402, -1, pszFix040, TP_FIX_040, 0xE12986, 0x4E7B6002, 4, pNopOpcodes },
! 585: { 0x402, -1, pszFix040, TP_FIX_040, 0xE12B9E, 0x4E7B5002, 4, pNopOpcodes },
! 586: { 0x402, -1, pszFix040, TP_FIX_040, 0xE12C1E, 0x4E7B5002, 4, pNopOpcodes },
! 587: { 0x402, -1, pszFix040, TP_FIX_040, 0xE12C96, 0x4E7B2002, 4, pNopOpcodes },
! 588: { 0x402, -1, pszFix040, TP_FIX_040, 0xE12D14, 0x4E7B0002, 4, pNopOpcodes },
! 589: { 0x402, -1, pszFix040, TP_FIX_040, 0xE12D7C, 0x4E7B0002, 4, pNopOpcodes },
! 590: { 0x402, -1, pszFix040, TP_FIX_040, 0xE12E3E, 0x4E7B0002, 4, pNopOpcodes },
! 591: { 0x402, -1, pszFix040, TP_FIX_040, 0xE17AF4, 0x4E7B0002, 4, pNopOpcodes },
! 592: { 0x402, -1, pszFix040, TP_FIX_040, 0xE17B8C, 0x4E7B0002, 4, pNopOpcodes },
! 593: { 0x402, -1, pszFix040, TP_FIX_040, 0xE25078, 0x4E7B7002, 4, pNopOpcodes },
! 594: { 0x402, -1, pszFix040, TP_FIX_040, 0xE444B0, 0x4E7B7002, 4, pNopOpcodes },
! 595: { 0x402, -1, pszFix060, TP_FIX_060, 0xE003C4, 0x7200347C, sizeof(pCputype060), pCputype060 },
! 596: { 0x402, -1, pszFix060, TP_FIX_060, 0xE00634, 0x4E7B0002, 4, pNopOpcodes },
! 597: { 0x402, -1, pszFix060, TP_FIX_060, 0xE0074C, 0x203C0000, sizeof(pCacheflush), pCacheflush },
! 598: { 0x402, -1, pszFix060, TP_FIX_060, 0xE00856, 0x4E7A0002, sizeof(pCacheflush2), pCacheflush2 },
! 599: { 0x402, -1, pszFix060, TP_FIX_060, 0xE01892, 0x4E7A1002, sizeof(pCacheflush3), pCacheflush3 },
! 600: { 0x402, -1, pszFix060, TP_FIX_060, 0xE01914, 0x4E7B0002, 4, pNopOpcodes },
! 601: { 0x402, -1, pszFix060, TP_FIX_060, 0xE0005A, 0x203c0000, sizeof(pColdboot1), pColdboot1 },
! 602: { 0x402, -1, pszFix060, TP_FIX_060, 0xE03932, 0x46FC2700, sizeof(pColdboot2), pColdboot2 },
! 603: { 0x402, -1, pszFix060, TP_FIX_060, 0xE7B000, 0xFFFFFFFF, sizeof(pColdboot3), pColdboot3 },
! 604: { 0x402, -1, pszFix060, TP_FIX_060, 0xE098AC, 0x4E7A2002, sizeof(pCacheflush4), pCacheflush4 },
! 605: { 0x402, -1, pszFix060, TP_FIX_060, 0xE11B76, 0x4E7B0002, 4, pNopOpcodes },
! 606: { 0x402, -1, pszFix060, TP_FIX_060, 0xE11BFE, 0x4E7B7002, 4, pNopOpcodes },
! 607: { 0x402, -1, pszFix060, TP_FIX_060, 0xE11CFA, 0x4E7B0002, 4, pNopOpcodes },
! 608: { 0x402, -1, pszFix060, TP_FIX_060, 0xE12560, 0x4E7B5002, 4, pNopOpcodes },
! 609: { 0x402, -1, pszFix060, TP_FIX_060, 0xE128D6, 0x4E7B6002, 4, pNopOpcodes },
! 610: { 0x402, -1, pszFix060, TP_FIX_060, 0xE12986, 0x4E7B6002, 4, pNopOpcodes },
! 611: { 0x402, -1, pszFix060, TP_FIX_060, 0xE12922, 0x4E7B6002, 4, pNopOpcodes },
! 612: { 0x402, -1, pszFix060, TP_FIX_060, 0xE12B9E, 0x4E7B5002, 4, pNopOpcodes },
! 613: { 0x402, -1, pszFix060, TP_FIX_060, 0xE12C1E, 0x4E7B5002, 4, pNopOpcodes },
! 614: { 0x402, -1, pszFix060, TP_FIX_060, 0xE12C96, 0x4E7B2002, 4, pNopOpcodes },
! 615: { 0x402, -1, pszFix060, TP_FIX_060, 0xE12D14, 0x4E7B0002, 4, pNopOpcodes },
! 616: { 0x402, -1, pszFix060, TP_FIX_060, 0xE12D7C, 0x4E7B0002, 4, pNopOpcodes },
! 617: { 0x402, -1, pszFix060, TP_FIX_060, 0xE12E3E, 0x4E7B0002, 4, pNopOpcodes },
! 618: { 0x402, -1, pszFix060, TP_FIX_060, 0xE17AF4, 0x4E7B0002, 4, pNopOpcodes },
! 619: { 0x402, -1, pszFix060, TP_FIX_060, 0xE17B8C, 0x4E7B0002, 4, pNopOpcodes },
! 620: { 0x402, -1, pszFix060, TP_FIX_060, 0xE25078, 0x4E7B7002, 4, pNopOpcodes },
! 621: { 0x402, -1, pszFix060, TP_FIX_060, 0xE444B0, 0x4E7B7002, 4, pNopOpcodes },
1.1.1.25 root 622: { 0x402, -1, pszFix060, TP_FIX_060, 0xE02588, 0x01C80000, 12, p060movep1 },
623: { 0x402, -1, pszFix060, TP_FIX_060, 0xE025D8, 0x41F8FA01, 20, p060movep2 },
1.1.1.13 root 624:
1.1.1.24 root 625: { 0x404, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE0006A, 0xF0394000, 24, pNopOpcodes }, /* pmove : TC=0 TT0=0 TT1=0 -> disable MMU */
626: { 0x404, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE014E6, 0xF0394C00, 32, pNopOpcodes }, /* pmove : CRP=80000002 00000700 TC=80f04445 TT0=017e8107 TT1=807e8507 -> */
627: { 0x404, -1, pszNoPmmu, TP_ANTI_PMMU, 0xE039A0, 0xF0394000, 24, pNopOpcodes }, /* pmove : TC=0 TT0=0 TT1=0 -> disable MMU */
1.1.1.13 root 628: { 0x404, -1, pszRomCheck, TP_ALWAYS, 0xE006B0, 0x2E3C0007, 4, pRomCheckOpcode404 },
1.1.1.23 root 629: { 0x404, -1, pszDmaBoot, TP_ALWAYS, 0xE01C9E, 0x62FC31FC, 2, pNopOpcodes }, /* Just a delay */
630: { 0x404, -1, pszDmaBoot, TP_ALWAYS, 0xE01CB2, 0x62FC31FC, 2, pNopOpcodes }, /* Just a delay */
1.1.1.27! root 631: { 0x404, -1, pszFix040, TP_FIX_040, 0xE003C4, 0x7200347C, sizeof(pCputype040), pCputype040 },
! 632: { 0x404, -1, pszFix040, TP_FIX_040, 0xE0063E, 0x4E7B0002, 4, pNopOpcodes },
! 633: { 0x404, -1, pszFix040, TP_FIX_040, 0xE00756, 0x203C0000, sizeof(pCacheflush), pCacheflush },
! 634: { 0x404, -1, pszFix040, TP_FIX_040, 0xE00860, 0x4E7A0002, sizeof(pCacheflush2), pCacheflush2 },
! 635: { 0x404, -1, pszFix040, TP_FIX_040, 0xE018D0, 0x4E7A1002, sizeof(pCacheflush3), pCacheflush3 },
! 636: { 0x404, -1, pszFix040, TP_FIX_040, 0xE01952, 0x4E7B0002, 4, pNopOpcodes },
! 637: { 0x404, -1, pszFix040, TP_FIX_040, 0xE0005A, 0x203c0000, sizeof(pColdboot1), pColdboot1 },
! 638: { 0x404, -1, pszFix040, TP_FIX_040, 0xE0398C, 0x46FC2700, sizeof(pColdboot2), pColdboot2 },
! 639: { 0x404, -1, pszFix040, TP_FIX_040, 0xE7B000, 0xFFFFFFFF, sizeof(pColdboot3), pColdboot3 },
! 640: { 0x404, -1, pszFix040, TP_FIX_040, 0xE0990C, 0x4E7A2002, sizeof(pCacheflush4), pCacheflush4 },
! 641: { 0x404, -1, pszFix040, TP_FIX_040, 0xE11BD6, 0x4E7B0002, 4, pNopOpcodes },
! 642: { 0x404, -1, pszFix040, TP_FIX_040, 0xE11C5E, 0x4E7B7002, 4, pNopOpcodes },
! 643: { 0x404, -1, pszFix040, TP_FIX_040, 0xE11D5A, 0x4E7B0002, 4, pNopOpcodes },
! 644: { 0x404, -1, pszFix040, TP_FIX_040, 0xE125C0, 0x4E7B5002, 4, pNopOpcodes },
! 645: { 0x404, -1, pszFix040, TP_FIX_040, 0xE12936, 0x4E7B6002, 4, pNopOpcodes },
! 646: { 0x404, -1, pszFix040, TP_FIX_040, 0xE12982, 0x4E7B6002, 4, pNopOpcodes },
! 647: { 0x404, -1, pszFix040, TP_FIX_040, 0xE129E6, 0x4E7B6002, 4, pNopOpcodes },
! 648: { 0x404, -1, pszFix040, TP_FIX_040, 0xE12BFE, 0x4E7B5002, 4, pNopOpcodes },
! 649: { 0x404, -1, pszFix040, TP_FIX_040, 0xE12C7E, 0x4E7B5002, 4, pNopOpcodes },
! 650: { 0x404, -1, pszFix040, TP_FIX_040, 0xE12CF6, 0x4E7B2002, 4, pNopOpcodes },
! 651: { 0x404, -1, pszFix040, TP_FIX_040, 0xE12D74, 0x4E7B0002, 4, pNopOpcodes },
! 652: { 0x404, -1, pszFix040, TP_FIX_040, 0xE12DDC, 0x4E7B0002, 4, pNopOpcodes },
! 653: { 0x404, -1, pszFix040, TP_FIX_040, 0xE12E9E, 0x4E7B0002, 4, pNopOpcodes },
! 654: { 0x404, -1, pszFix040, TP_FIX_040, 0xE17B54, 0x4E7B0002, 4, pNopOpcodes },
! 655: { 0x404, -1, pszFix040, TP_FIX_040, 0xE17BEC, 0x4E7B0002, 4, pNopOpcodes },
! 656: { 0x404, -1, pszFix040, TP_FIX_040, 0xE250D8, 0x4E7B7002, 4, pNopOpcodes },
! 657: { 0x404, -1, pszFix040, TP_FIX_040, 0xE44510, 0x4E7B7002, 4, pNopOpcodes },
! 658: { 0x404, -1, pszFix060, TP_FIX_060, 0xE003C4, 0x7200347C, sizeof(pCputype060), pCputype060 },
! 659: { 0x404, -1, pszFix060, TP_FIX_060, 0xE0063E, 0x4E7B0002, 4, pNopOpcodes },
! 660: { 0x404, -1, pszFix060, TP_FIX_060, 0xE00756, 0x203C0000, sizeof(pCacheflush), pCacheflush },
! 661: { 0x404, -1, pszFix060, TP_FIX_060, 0xE00860, 0x4E7A0002, sizeof(pCacheflush2), pCacheflush2 },
! 662: { 0x404, -1, pszFix060, TP_FIX_060, 0xE018D0, 0x4E7A1002, sizeof(pCacheflush3), pCacheflush3 },
! 663: { 0x404, -1, pszFix060, TP_FIX_060, 0xE01952, 0x4E7B0002, 4, pNopOpcodes },
! 664: { 0x404, -1, pszFix060, TP_FIX_060, 0xE0005A, 0x203c0000, sizeof(pColdboot1), pColdboot1 },
! 665: { 0x404, -1, pszFix060, TP_FIX_060, 0xE0398C, 0x46FC2700, sizeof(pColdboot2), pColdboot2 },
! 666: { 0x404, -1, pszFix060, TP_FIX_060, 0xE7B000, 0xFFFFFFFF, sizeof(pColdboot3), pColdboot3 },
! 667: { 0x404, -1, pszFix060, TP_FIX_060, 0xE0990C, 0x4E7A2002, sizeof(pCacheflush4), pCacheflush4 },
! 668: { 0x404, -1, pszFix060, TP_FIX_060, 0xE11BD6, 0x4E7B0002, 4, pNopOpcodes },
! 669: { 0x404, -1, pszFix060, TP_FIX_060, 0xE11C5E, 0x4E7B7002, 4, pNopOpcodes },
! 670: { 0x404, -1, pszFix060, TP_FIX_060, 0xE11D5A, 0x4E7B0002, 4, pNopOpcodes },
! 671: { 0x404, -1, pszFix060, TP_FIX_060, 0xE125C0, 0x4E7B5002, 4, pNopOpcodes },
! 672: { 0x404, -1, pszFix060, TP_FIX_060, 0xE12936, 0x4E7B6002, 4, pNopOpcodes },
! 673: { 0x404, -1, pszFix060, TP_FIX_060, 0xE12982, 0x4E7B6002, 4, pNopOpcodes },
! 674: { 0x404, -1, pszFix060, TP_FIX_060, 0xE129E6, 0x4E7B6002, 4, pNopOpcodes },
! 675: { 0x404, -1, pszFix060, TP_FIX_060, 0xE12BFE, 0x4E7B5002, 4, pNopOpcodes },
! 676: { 0x404, -1, pszFix060, TP_FIX_060, 0xE12C7E, 0x4E7B5002, 4, pNopOpcodes },
! 677: { 0x404, -1, pszFix060, TP_FIX_060, 0xE12CF6, 0x4E7B2002, 4, pNopOpcodes },
! 678: { 0x404, -1, pszFix060, TP_FIX_060, 0xE12D74, 0x4E7B0002, 4, pNopOpcodes },
! 679: { 0x404, -1, pszFix060, TP_FIX_060, 0xE12DDC, 0x4E7B0002, 4, pNopOpcodes },
! 680: { 0x404, -1, pszFix060, TP_FIX_060, 0xE12E9E, 0x4E7B0002, 4, pNopOpcodes },
! 681: { 0x404, -1, pszFix060, TP_FIX_060, 0xE17B54, 0x4E7B0002, 4, pNopOpcodes },
! 682: { 0x404, -1, pszFix060, TP_FIX_060, 0xE17BEC, 0x4E7B0002, 4, pNopOpcodes },
! 683: { 0x404, -1, pszFix060, TP_FIX_060, 0xE250D8, 0x4E7B7002, 4, pNopOpcodes },
! 684: { 0x404, -1, pszFix060, TP_FIX_060, 0xE44510, 0x4E7B7002, 4, pNopOpcodes },
1.1.1.25 root 685: { 0x404, -1, pszFix060, TP_FIX_060, 0xE025E2, 0x01C80000, 12, p060movep1 },
686: { 0x404, -1, pszFix060, TP_FIX_060, 0xE02632, 0x41F8FA01, 20, p060movep2 },
687: { 0x404, -1, pszFix060, TP_FIX_060, 0xE02B1E, 0x007c0700, 8, p060movep3_1 },
688: { 0x404, -1, pszFix060, TP_FIX_060, 0xE7F000, 0xFFFFFFFF, sizeof( p060movep3_2 ), p060movep3_2 },
1.1.1.24 root 689: { 0x404, -1, pszFalconExtraRAM, TP_ALWAYS, 0xE0096E, 0x70036100, 6, pFalconExtraRAM_1 },
690: { 0x404, -1, pszFalconExtraRAM, TP_ALWAYS, 0xE7F100, 0xFFFFFFFF, sizeof( pFalconExtraRAM_2 ), pFalconExtraRAM_2 },
1.1.1.13 root 691:
1.1.1.22 root 692: { 0x492, -1, pszNoPmmu, TP_ANTI_PMMU, 0x00F946, 0xF0394000, 24, pNopOpcodes },
693: { 0x492, -1, pszNoPmmu, TP_ANTI_PMMU, 0x01097A, 0xF0394C00, 32, pNopOpcodes },
694: { 0x492, -1, pszNoPmmu, TP_ANTI_PMMU, 0x012E04, 0xF0394000, 24, pNopOpcodes },
1.1.1.13 root 695:
1.1.1.6 root 696: { 0, 0, NULL, 0, 0, 0, 0, NULL }
697: };
1.1 root 698:
699:
700:
1.1.1.6 root 701: /*-----------------------------------------------------------------------*/
1.1.1.13 root 702: /**
703: * Save/Restore snapshot of local variables ('MemorySnapShot_Store' handles type)
704: */
1.1.1.14 root 705: void TOS_MemorySnapShot_Capture(bool bSave)
1.1.1.6 root 706: {
1.1.1.12 root 707: /* Save/Restore details */
708: MemorySnapShot_Store(&TosVersion, sizeof(TosVersion));
709: MemorySnapShot_Store(&TosAddress, sizeof(TosAddress));
710: MemorySnapShot_Store(&TosSize, sizeof(TosSize));
711: MemorySnapShot_Store(&ConnectedDriveMask, sizeof(ConnectedDriveMask));
712: MemorySnapShot_Store(&nNumDrives, sizeof(nNumDrives));
1.1 root 713: }
714:
1.1.1.3 root 715:
716: /*-----------------------------------------------------------------------*/
1.1.1.13 root 717: /**
718: * Patch TOS to skip some TOS setup code which we don't support/need.
719: *
720: * So, how do we find these addresses when we have no commented source code?
721: * - For the "Boot from DMA bus" patch:
722: * Scan at start of rom for tst.w $482, boot call will be just above it.
1.1.1.27! root 723: *
! 724: * Set logpatch_addr if patch for that is needed.
1.1.1.13 root 725: */
1.1.1.27! root 726: static void TOS_FixRom(Uint32 *logopatch_addr)
1.1 root 727: {
1.1.1.12 root 728: int nGoodPatches, nBadPatches;
729: short TosCountry;
730: const TOS_PATCH *pPatch;
731:
1.1.1.13 root 732: /* We can't patch RAM TOS images (yet) */
733: if (bRamTosImage && TosVersion != 0x0492)
1.1.1.12 root 734: {
735: Log_Printf(LOG_DEBUG, "Detected RAM TOS image, skipping TOS patches.\n");
736: return;
737: }
738:
739: nGoodPatches = nBadPatches = 0;
740: TosCountry = STMemory_ReadWord(TosAddress+28)>>1; /* TOS country code */
741: pPatch = TosPatches;
742:
743: /* Apply TOS patches: */
744: while (pPatch->Version)
745: {
746: /* Only apply patches that suit to the actual TOS version: */
747: if (pPatch->Version == TosVersion
748: && (pPatch->Country == TosCountry || pPatch->Country == -1))
749: {
1.1.1.22 root 750: #if ENABLE_WINUAE_CPU
1.1.1.25 root 751: bool use_mmu = ConfigureParams.System.bMMU &&
752: ConfigureParams.System.nCpuLevel == 3;
1.1.1.22 root 753: #else
754: bool use_mmu = false;
755: #endif
1.1.1.27! root 756: /* Only apply the patch if it is really needed: */
! 757: if (pPatch->Flags == TP_ALWAYS
! 758: || (pPatch->Flags == TP_HDIMAGE_OFF && !ACSI_EMU_ON
! 759: && !ConfigureParams.Ide[0].bUseDevice
! 760: && ConfigureParams.System.bFastBoot)
! 761: || (pPatch->Flags == TP_ANTI_STE && Config_IsMachineST())
! 762: || (pPatch->Flags == TP_ANTI_PMMU && !use_mmu)
! 763: || (pPatch->Flags == TP_VDIRES && bUseVDIRes)
! 764: || (pPatch->Flags == TP_FIX_060 && ConfigureParams.System.nCpuLevel > 4)
! 765: || (pPatch->Flags == TP_FIX_040 && ConfigureParams.System.nCpuLevel == 4)
! 766: )
1.1.1.12 root 767: {
1.1.1.27! root 768: /* Make sure that we really patch the right place by comparing data: */
! 769: if(STMemory_ReadLong(pPatch->Address) == pPatch->OldData)
1.1.1.12 root 770: {
771: /* Now we can really apply the patch! */
1.1.1.13 root 772: Log_Printf(LOG_DEBUG, "Applying TOS patch '%s'.\n", pPatch->pszName);
773: memcpy(&RomMem[pPatch->Address], pPatch->pNewData, pPatch->Size);
1.1.1.12 root 774: nGoodPatches += 1;
1.1.1.26 root 775: if (strcmp(pPatch->pszName, pszAtariLogo) == 0)
1.1.1.27! root 776: *logopatch_addr = pPatch->Address;
1.1.1.12 root 777: }
778: else
779: {
1.1.1.27! root 780: Log_Printf(LOG_DEBUG, "Failed to apply TOS patch '%s' at %x (expected %x, found %x).\n",
! 781: pPatch->pszName, pPatch->Address, pPatch->OldData, STMemory_ReadLong(pPatch->Address));
! 782: nBadPatches += 1;
1.1.1.12 root 783: }
784: }
785: else
786: {
1.1.1.27! root 787: Log_Printf(LOG_DEBUG, "Skipped patch '%s'.\n", pPatch->pszName);
1.1.1.12 root 788: }
789: }
790: pPatch += 1;
791: }
1.1.1.3 root 792:
1.1.1.26 root 793: Log_Printf(LOG_DEBUG, "Applied %i TOS patches, %i patches failed.\n",
794: nGoodPatches, nBadPatches);
1.1.1.18 root 795: }
796:
797:
798: /*-----------------------------------------------------------------------*/
799: /**
1.1.1.13 root 800: * Assert that TOS version matches the machine type and change the system
801: * configuration if necessary.
802: * For example TOSes 1.06 and 1.62 are for the STE ONLY and so don't run
803: * on a real ST, TOS 3.0x is TT only and TOS 4.x is Falcon only.
804: * These TOS version access illegal memory addresses on machine they were
805: * not designed for and so cause the OS to lock up. So, if user selects one
806: * of these, switch to the appropriate machine type.
807: */
808: static void TOS_CheckSysConfig(void)
809: {
1.1.1.22 root 810: int oldCpuLevel = ConfigureParams.System.nCpuLevel;
1.1.1.21 root 811: MACHINETYPE oldMachineType = ConfigureParams.System.nMachineType;
1.1.1.25 root 812: #if ENABLE_WINUAE_CPU
813: FPUTYPE oldFpuType = ConfigureParams.System.n_FPUType;
814: #endif
815:
1.1.1.26 root 816: if (((TosVersion == 0x0106 || TosVersion == 0x0162) && ConfigureParams.System.nMachineType != MACHINE_STE)
1.1.1.22 root 817: || (TosVersion == 0x0162 && ConfigureParams.System.nCpuLevel != 0))
1.1.1.13 root 818: {
1.1.1.14 root 819: Log_AlertDlg(LOG_ERROR, "TOS versions 1.06 and 1.62 are for Atari STE only.\n"
1.1.1.13 root 820: " ==> Switching to STE mode now.\n");
821: IoMem_UnInit();
822: ConfigureParams.System.nMachineType = MACHINE_STE;
1.1.1.18 root 823: ClocksTimings_InitMachine ( ConfigureParams.System.nMachineType );
1.1.1.25 root 824: Video_SetTimings ( ConfigureParams.System.nMachineType , ConfigureParams.System.VideoTimingMode );
1.1.1.13 root 825: IoMem_Init();
1.1.1.26 root 826: Configuration_ChangeCpuFreq ( 8 );
1.1.1.17 root 827: ConfigureParams.System.nCpuLevel = 0;
1.1.1.13 root 828: }
1.1.1.25 root 829: else if ((TosVersion & 0x0f00) == 0x0300 && !Config_IsMachineTT())
1.1.1.13 root 830: {
1.1.1.14 root 831: Log_AlertDlg(LOG_ERROR, "TOS versions 3.0x are for Atari TT only.\n"
1.1.1.13 root 832: " ==> Switching to TT mode now.\n");
833: IoMem_UnInit();
834: ConfigureParams.System.nMachineType = MACHINE_TT;
1.1.1.18 root 835: ClocksTimings_InitMachine ( ConfigureParams.System.nMachineType );
1.1.1.25 root 836: Video_SetTimings ( ConfigureParams.System.nMachineType , ConfigureParams.System.VideoTimingMode );
1.1.1.13 root 837: IoMem_Init();
1.1.1.26 root 838: Configuration_ChangeCpuFreq ( 32 );
1.1.1.13 root 839: ConfigureParams.System.nCpuLevel = 3;
840: }
1.1.1.27! root 841: else if (((TosVersion & 0x0f00) == 0x0400 || TosVersion == 0x0207)
! 842: && !Config_IsMachineFalcon())
1.1.1.13 root 843: {
1.1.1.27! root 844: Log_AlertDlg(LOG_ERROR, "TOS version %x.%02x is for Atari Falcon only.\n"
! 845: " ==> Switching to Falcon mode now.\n",
! 846: TosVersion >> 8, TosVersion & 0xff);
1.1.1.13 root 847: IoMem_UnInit();
848: ConfigureParams.System.nMachineType = MACHINE_FALCON;
1.1.1.18 root 849: ClocksTimings_InitMachine ( ConfigureParams.System.nMachineType );
1.1.1.25 root 850: Video_SetTimings ( ConfigureParams.System.nMachineType , ConfigureParams.System.VideoTimingMode );
1.1.1.18 root 851: #if ENABLE_DSP_EMU
852: ConfigureParams.System.nDSPType = DSP_TYPE_EMU;
1.1.1.25 root 853: DSP_Enable();
1.1.1.18 root 854: #endif
1.1.1.13 root 855: IoMem_Init();
1.1.1.26 root 856: Configuration_ChangeCpuFreq ( 16 );
1.1.1.13 root 857: ConfigureParams.System.nCpuLevel = 3;
858: }
1.1.1.19 root 859: else if (TosVersion <= 0x0104 &&
1.1.1.25 root 860: (ConfigureParams.System.nCpuLevel > 0 || !Config_IsMachineST()))
1.1.1.17 root 861: {
1.1.1.19 root 862: Log_AlertDlg(LOG_ERROR, "TOS versions <= 1.4 work only in\n"
863: "ST mode and with a 68000 CPU.\n"
1.1.1.22 root 864: " ==> Switching to ST mode with 68000 now.\n");
1.1.1.17 root 865: IoMem_UnInit();
866: ConfigureParams.System.nMachineType = MACHINE_ST;
1.1.1.18 root 867: ClocksTimings_InitMachine ( ConfigureParams.System.nMachineType );
1.1.1.25 root 868: Video_SetTimings ( ConfigureParams.System.nMachineType , ConfigureParams.System.VideoTimingMode );
1.1.1.17 root 869: IoMem_Init();
1.1.1.26 root 870: Configuration_ChangeCpuFreq ( 8 );
1.1.1.17 root 871: ConfigureParams.System.nCpuLevel = 0;
872: }
1.1.1.27! root 873: else if (TosVersion < 0x0300 && (Config_IsMachineTT() || Config_IsMachineFalcon()))
1.1.1.13 root 874: {
1.1.1.19 root 875: Log_AlertDlg(LOG_ERROR, "This TOS version does not work in TT/Falcon mode.\n"
1.1.1.13 root 876: " ==> Switching to STE mode now.\n");
877: IoMem_UnInit();
878: ConfigureParams.System.nMachineType = MACHINE_STE;
1.1.1.18 root 879: ClocksTimings_InitMachine ( ConfigureParams.System.nMachineType );
1.1.1.25 root 880: Video_SetTimings ( ConfigureParams.System.nMachineType , ConfigureParams.System.VideoTimingMode );
1.1.1.13 root 881: IoMem_Init();
1.1.1.26 root 882: Configuration_ChangeCpuFreq ( 8 );
1.1.1.17 root 883: ConfigureParams.System.nCpuLevel = 0;
1.1.1.13 root 884: }
1.1.1.22 root 885: else if ((TosVersion & 0x0f00) == 0x0400 && ConfigureParams.System.nCpuLevel < 2)
1.1.1.14 root 886: {
1.1.1.22 root 887: Log_AlertDlg(LOG_ERROR, "TOS versions 4.x require a CPU >= 68020.\n"
1.1.1.14 root 888: " ==> Switching to 68020 mode now.\n");
889: ConfigureParams.System.nCpuLevel = 2;
1.1.1.21 root 890: }
1.1.1.25 root 891: #if ENABLE_WINUAE_CPU
892: else if ((TosVersion & 0x0f00) == 0x0300 &&
893: (ConfigureParams.System.nCpuLevel < 2 || ConfigureParams.System.n_FPUType == FPU_NONE))
894: {
895: Log_AlertDlg(LOG_ERROR, "TOS versions 3.0x require a CPU >= 68020 with FPU.\n"
896: " ==> Switching to 68030 mode with FPU now.\n");
897: ConfigureParams.System.nCpuLevel = 3;
898: ConfigureParams.System.n_FPUType = FPU_68882;
899: }
900: #else
1.1.1.22 root 901: else if ((TosVersion & 0x0f00) == 0x0300 && ConfigureParams.System.nCpuLevel < 3)
902: {
1.1.1.25 root 903: Log_AlertDlg(LOG_ERROR, "TOS versions 3.0x require a CPU >= 68020 with FPU.\n"
904: " ==> Switching to 68030 mode with FPU now.\n");
1.1.1.22 root 905: ConfigureParams.System.nCpuLevel = 3;
906: }
1.1.1.25 root 907: #endif
908:
1.1.1.21 root 909: /* TOS version triggered changes? */
910: if (ConfigureParams.System.nMachineType != oldMachineType)
911: {
912: #if ENABLE_WINUAE_CPU
1.1.1.25 root 913: if (Config_IsMachineTT())
1.1.1.21 root 914: {
915: ConfigureParams.System.bCompatibleFPU = true;
916: ConfigureParams.System.n_FPUType = FPU_68882;
917: } else {
918: ConfigureParams.System.n_FPUType = FPU_NONE; /* TODO: or leave it as-is? */
919: }
1.1.1.22 root 920: if (TosVersion < 0x200)
921: {
922: ConfigureParams.System.bAddressSpace24 = true;
923: ConfigureParams.System.bMMU = false;
924: }
1.1.1.21 root 925: #endif
1.1.1.18 root 926: M68000_CheckCpuSettings();
1.1.1.14 root 927: }
1.1.1.25 root 928: else if (ConfigureParams.System.nCpuLevel != oldCpuLevel
929: #if ENABLE_WINUAE_CPU
930: || ConfigureParams.System.n_FPUType != oldFpuType
931: #endif
932: )
1.1.1.22 root 933: {
934: M68000_CheckCpuSettings();
935: }
1.1.1.19 root 936: if (TosVersion < 0x0104 && ConfigureParams.HardDisk.bUseHardDiskDirectories)
937: {
938: Log_AlertDlg(LOG_ERROR, "Please use at least TOS v1.04 for the HD directory emulation "
939: "(all required GEMDOS functionality isn't completely emulated for this TOS version).");
940: }
1.1.1.25 root 941: if (Config_IsMachineFalcon() && bUseVDIRes && !bIsEmuTOS)
942: {
1.1.1.27! root 943: Log_AlertDlg(LOG_ERROR, "Please use EmuTOS instead of TOS v4 "
! 944: "for proper extended VDI resolutions support on Falcon.");
1.1.1.25 root 945: }
1.1.1.13 root 946: }
947:
948:
949: /**
1.1.1.27! root 950: * Load TOS Rom image file and do some basic sanity checks.
! 951: * Returns pointer to allocated memory with TOS data, or NULL for error.
1.1.1.13 root 952: */
1.1.1.27! root 953: static uint8_t *TOS_LoadImage(void)
1.1.1.6 root 954: {
1.1.1.27! root 955: uint8_t *pTosFile = NULL;
1.1.1.12 root 956: long nFileSize;
1.1.1.6 root 957:
1.1.1.20 root 958: /* Load TOS image into memory so that we can check its version */
1.1.1.12 root 959: TosVersion = 0;
1.1.1.13 root 960: pTosFile = File_Read(ConfigureParams.Rom.szTosImageFileName, &nFileSize, pszTosNameExts);
1.1.1.12 root 961:
962: if (!pTosFile || nFileSize <= 0)
963: {
964: Log_AlertDlg(LOG_FATAL, "Can not load TOS file:\n'%s'", ConfigureParams.Rom.szTosImageFileName);
1.1.1.24 root 965: free(pTosFile);
1.1.1.27! root 966: return NULL;
1.1.1.12 root 967: }
968:
969: TosSize = nFileSize;
970:
971: /* Check for RAM TOS images first: */
972: if (SDL_SwapBE32(*(Uint32 *)pTosFile) == 0x46FC2700)
973: {
1.1.1.13 root 974: int nRamTosLoaderSize;
1.1.1.12 root 975: Log_Printf(LOG_WARN, "Detected a RAM TOS - this will probably not work very well!\n");
976: /* RAM TOS images have a 256 bytes loader function before the real image
1.1.1.13 root 977: * starts (34 bytes for TOS 4.92). Since we directly copy the image to the right
978: * location later, we simply skip this additional header here: */
979: if (SDL_SwapBE32(*(Uint32 *)(pTosFile+34)) == 0x602E0492)
980: nRamTosLoaderSize = 0x22;
981: else
982: nRamTosLoaderSize = 0x100;
983: TosSize -= nRamTosLoaderSize;
984: memmove(pTosFile, pTosFile + nRamTosLoaderSize, TosSize);
1.1.1.16 root 985: bRamTosImage = true;
1.1.1.12 root 986: }
987: else
988: {
1.1.1.16 root 989: bRamTosImage = false;
1.1.1.12 root 990: }
991:
1.1.1.13 root 992: /* Check for EmuTOS ... (0x45544F53 = 'ETOS') */
993: bIsEmuTOS = (SDL_SwapBE32(*(Uint32 *)&pTosFile[0x2c]) == 0x45544F53);
994:
1.1.1.12 root 995: /* Now, look at start of image to find Version number and address */
996: TosVersion = SDL_SwapBE16(*(Uint16 *)&pTosFile[2]);
997: TosAddress = SDL_SwapBE32(*(Uint32 *)&pTosFile[8]);
1.1.1.26 root 998: if (TosVersion == 0x206 && SDL_SwapBE16(*(Uint16 *)&pTosFile[30]) == 0x186A)
999: TosVersion = 0x208;
1.1.1.12 root 1000:
1001: /* Check for reasonable TOS version: */
1.1.1.18 root 1002: if (TosVersion == 0x000 && TosSize == 16384)
1003: {
1004: /* TOS 0.00 was a very early boot loader ROM which could only
1005: * execute a boot sector from floppy disk, which was used in
1006: * the very early STs before a full TOS was available in ROM.
1007: * It's not very useful nowadays, but we support it here, too,
1008: * just for fun. */
1009: TosAddress = 0xfc0000;
1010: }
1.1.1.24 root 1011: else if (TosVersion < 0x100 || TosVersion >= 0x500 || TosSize > 1024*1024L
1012: || (TosAddress == 0xfc0000 && TosSize > 224*1024L)
1013: || (bRamTosImage && TosAddress + TosSize > STRamEnd)
1014: || (!bRamTosImage && TosAddress != 0xe00000 && TosAddress != 0xfc0000))
1.1.1.12 root 1015: {
1016: Log_AlertDlg(LOG_FATAL, "Your TOS image seems not to be a valid TOS ROM file!\n"
1017: "(TOS version %x, address $%x)", TosVersion, TosAddress);
1.1.1.24 root 1018: free(pTosFile);
1.1.1.27! root 1019: return NULL;
1.1.1.12 root 1020: }
1021:
1.1.1.13 root 1022: /* Assert that machine type matches the TOS version. Note that EmuTOS can
1023: * handle all machine types, so we don't do the system check there: */
1024: if (!bIsEmuTOS)
1025: TOS_CheckSysConfig();
1026:
1.1.1.24 root 1027: #if ENABLE_WINUAE_CPU
1.1.1.25 root 1028: /* 32-bit addressing is supported only by CPU >= 68020, TOS v3, TOS v4 and EmuTOS */
1029: if (ConfigureParams.System.nCpuLevel < 2 || (TosVersion < 0x0300 && !bIsEmuTOS))
1030: {
1.1.1.24 root 1031: ConfigureParams.System.bAddressSpace24 = true;
1.1.1.25 root 1032: M68000_CheckCpuSettings();
1033: }
1.1.1.26 root 1034: else if (ConfigureParams.Memory.TTRamSize_KB)
1.1.1.24 root 1035: {
1036: switch (ConfigureParams.System.nMachineType)
1037: {
1038: case MACHINE_TT:
1039: if (ConfigureParams.System.bAddressSpace24)
1040: {
1041: /* Print a message and force 32 bit addressing (keeping 24 bit with TT RAM would crash TOS) */
1042: Log_AlertDlg(LOG_ERROR, "Enabling 32-bit addressing for TT-RAM access.\nThis can cause issues in some programs!\n");
1043: ConfigureParams.System.bAddressSpace24 = false;
1.1.1.25 root 1044: M68000_CheckCpuSettings();
1.1.1.24 root 1045: }
1046: break;
1047: case MACHINE_FALCON:
1048: if (ConfigureParams.System.bAddressSpace24)
1049: {
1050: /* Print a message, but don't force 32 bit addressing as 24 bit addressing is also possible under Falcon */
1051: /* So, if Falcon is in 24 bit mode, we just don't add TT RAM */
1052: Log_AlertDlg(LOG_ERROR, "You need to disable 24-bit addressing to use TT-RAM in Falcon mode.\n");
1053: }
1054: break;
1055: default:
1056: break;
1057: }
1058: }
1059: #endif
1.1.1.13 root 1060:
1.1.1.27! root 1061: return pTosFile;
! 1062: }
! 1063:
! 1064:
! 1065: /**
! 1066: * Set the name of the program that should be tested (without TOS)
! 1067: */
! 1068: void TOS_SetTestPrgName(const char *testprg)
! 1069: {
! 1070: psTestPrg = testprg;
! 1071: }
! 1072:
! 1073:
! 1074: /**
! 1075: * Create a fake TOS ROM that just jumps to test code in memory
! 1076: */
! 1077: static uint8_t *TOS_FakeRomForTesting(void)
! 1078: {
! 1079: uint8_t *pFakeTosMem;
! 1080:
! 1081: /* We don't have a proper memory detection code in above init code,
! 1082: * so we have to disable the MMU emulation in this TOS-less mode */
! 1083: ConfigureParams.System.bFastBoot = true;
! 1084:
! 1085: TosVersion = 0;
! 1086: TosAddress = 0xe00000;
! 1087: TosSize = sizeof(FakeTos_data);
! 1088:
! 1089: pFakeTosMem = malloc(TosSize);
! 1090: if (!pFakeTosMem)
! 1091: return NULL;
! 1092:
! 1093: memcpy(pFakeTosMem, FakeTos_data, TosSize);
! 1094:
! 1095: return pFakeTosMem;
! 1096: }
! 1097:
! 1098: /**
! 1099: * Load TOS Rom image file into ST memory space and fix image so it can be
! 1100: * emulated correctly. Pre TOS 1.06 are loaded at 0xFC0000 and later ones
! 1101: * at 0xE00000.
! 1102: *
! 1103: * Return zero if all OK, non-zero value for error.
! 1104: */
! 1105: int TOS_InitImage(void)
! 1106: {
! 1107: uint8_t *pTosFile = NULL;
! 1108: Uint32 logopatch_addr = 0;
! 1109:
! 1110: bTosImageLoaded = false;
! 1111:
! 1112: /* Calculate end of RAM */
! 1113: STRamEnd = ConfigureParams.Memory.STRamSize_KB * 1024;
! 1114:
! 1115: if (bUseTos)
! 1116: {
! 1117: pTosFile = TOS_LoadImage();
! 1118: if (!pTosFile)
! 1119: return -1;
! 1120: }
! 1121: else
! 1122: {
! 1123: pTosFile = TOS_FakeRomForTesting();
! 1124: if (!pTosFile)
! 1125: return -1;
! 1126: }
! 1127:
1.1.1.13 root 1128: /* (Re-)Initialize the memory banks: */
1129: memory_uninit();
1.1.1.26 root 1130: memory_init(STRamEnd, ConfigureParams.Memory.TTRamSize_KB*1024, TosAddress);
1.1.1.13 root 1131:
1132: /* Clear Upper memory (ROM and IO memory) */
1133: memset(&RomMem[0xe00000], 0, 0x200000);
1.1.1.12 root 1134:
1.1.1.24 root 1135: /* Copy loaded image into memory */
1136: if (bRamTosImage)
1137: memcpy(&STRam[TosAddress], pTosFile, TosSize);
1138: else
1139: memcpy(&RomMem[TosAddress], pTosFile, TosSize);
1.1.1.27! root 1140: free(pTosFile);
! 1141: pTosFile = NULL;
1.1.1.12 root 1142:
1143: Log_Printf(LOG_DEBUG, "Loaded TOS version %i.%c%c, starting at $%x, "
1144: "country code = %i, %s\n", TosVersion>>8, '0'+((TosVersion>>4)&0x0f),
1145: '0'+(TosVersion&0x0f), TosAddress, STMemory_ReadWord(TosAddress+28)>>1,
1146: (STMemory_ReadWord(TosAddress+28)&1)?"PAL":"NTSC");
1147:
1148: /* Are we allowed VDI under this TOS? */
1.1.1.27! root 1149: if (bUseVDIRes)
1.1.1.12 root 1150: {
1.1.1.27! root 1151: if (TosVersion == 0x0100)
! 1152: {
! 1153: /* Warn user */
! 1154: Log_AlertDlg(LOG_ERROR, "To use extended VDI resolutions, you must select a TOS >= 1.02.");
! 1155: /* And select non VDI */
! 1156: bUseVDIRes = ConfigureParams.Screen.bUseExtVdiResolutions = false;
! 1157: }
! 1158: else
! 1159: {
! 1160: /* needs to be called after TosVersion is set, but
! 1161: * before STMemory_SetDefaultConfig() is called
! 1162: */
! 1163: VDI_SetResolution(ConfigureParams.Screen.nVdiColors,
! 1164: ConfigureParams.Screen.nVdiWidth,
! 1165: ConfigureParams.Screen.nVdiHeight);
! 1166: }
1.1.1.12 root 1167: }
1168:
1169: /* Fix TOS image, modify code for emulation */
1.1.1.27! root 1170: if (ConfigureParams.Rom.bPatchTos && !bIsEmuTOS && bUseTos)
1.1.1.19 root 1171: {
1.1.1.27! root 1172: TOS_FixRom(&logopatch_addr);
1.1.1.19 root 1173: }
1174: else
1175: {
1176: Log_Printf(LOG_DEBUG, "Skipped TOS patches.\n");
1177: }
1.1.1.12 root 1178:
1.1.1.27! root 1179: /*
! 1180: * patch some values into the "Draw logo" patch.
! 1181: * Needs to be called after final VDI resolution has been determined.
! 1182: */
! 1183: if (logopatch_addr != 0)
! 1184: {
! 1185: STMemory_WriteWord(logopatch_addr + 2, VDIPlanes);
! 1186: STMemory_WriteLong(logopatch_addr + 6, VDIWidth * VDIPlanes / 8);
! 1187: }
! 1188:
1.1.1.12 root 1189: /* Set connected devices, memory configuration, etc. */
1190: STMemory_SetDefaultConfig();
1.1.1.6 root 1191:
1.1.1.27! root 1192: /* Load test program (has to be done after memory has been cleared */
! 1193: if (!bUseTos)
! 1194: {
! 1195: if (psTestPrg)
! 1196: {
! 1197: Log_Printf(LOG_DEBUG, "Loading '%s' to 0x%x.\n",
! 1198: psTestPrg, TEST_PRG_START);
! 1199: GemDOS_LoadAndReloc(psTestPrg, TEST_PRG_BASEPAGE);
! 1200: }
! 1201: else
! 1202: {
! 1203: /* Jump to same address again */
! 1204: STMemory_WriteLong(TEST_PRG_START, 0x4ef80000 | TEST_PRG_START);
! 1205: }
! 1206: }
1.1.1.6 root 1207:
1.1.1.16 root 1208: bTosImageLoaded = true;
1.1.1.12 root 1209: return 0;
1.1 root 1210: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.