Annotation of hatari/src/tos.c, revision 1.1.1.27

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.