1 |
|
/* |
2 |
|
* rom_patches.cpp - ROM patches |
3 |
|
* |
4 |
< |
* Basilisk II (C) 1997-2000 Christian Bauer |
4 |
> |
* Basilisk II (C) 1997-2001 Christian Bauer |
5 |
|
* |
6 |
|
* This program is free software; you can redistribute it and/or modify |
7 |
|
* it under the terms of the GNU General Public License as published by |
54 |
|
|
55 |
|
|
56 |
|
/* |
57 |
+ |
* Convenience functions for retrieving a particular 16-bit word from |
58 |
+ |
* a 32-bit word value. |
59 |
+ |
* |
60 |
+ |
* gb-- probably put those elsewhere... |
61 |
+ |
*/ |
62 |
+ |
|
63 |
+ |
#define HiWord(X) (((X) >> 16) & 0xffff) |
64 |
+ |
#define LoWord(X) ((X) & 0xffff) |
65 |
+ |
|
66 |
+ |
|
67 |
+ |
/* |
68 |
|
* Search ROM for byte string, return ROM offset (or 0) |
69 |
|
*/ |
70 |
|
|
829 |
|
// Read version |
830 |
|
ROMVersion = ntohs(*(uint16 *)(ROMBaseHost + 8)); |
831 |
|
|
832 |
< |
#if REAL_ADDRESSING |
833 |
< |
// Real addressing mode requires a 32-bit clean ROM |
832 |
> |
#if REAL_ADDRESSING || DIRECT_ADDRESSING |
833 |
> |
// Real and direct addressing modes require a 32-bit clean ROM |
834 |
|
return ROMVersion == ROM_VERSION_32; |
835 |
|
#else |
836 |
|
// Virtual addressing mode works with 32-bit clean Mac II ROMs and Classic ROMs |
1232 |
|
|
1233 |
|
#if REAL_ADDRESSING |
1234 |
|
// Move system zone to start of Mac RAM |
1235 |
< |
lp = (uint32 *)(ROMBaseHost + 0x50a); |
1236 |
< |
*lp++ = htonl(RAMBaseMac); |
1237 |
< |
*lp = htonl(RAMBaseMac + 0x1800); |
1235 |
> |
wp = (uint16 *)(ROMBaseHost + 0x50a); |
1236 |
> |
*wp++ = htons(HiWord(RAMBaseMac + 0x2000)); |
1237 |
> |
*wp++ = htons(LoWord(RAMBaseMac + 0x2000)); |
1238 |
> |
*wp++ = htons(HiWord(RAMBaseMac + 0x3800)); |
1239 |
> |
*wp = htons(LoWord(RAMBaseMac + 0x3800)); |
1240 |
|
#endif |
1241 |
|
|
1242 |
|
#if !ROM_IS_WRITE_PROTECTED |
1243 |
< |
#if defined(AMIGA) |
1243 |
> |
#if defined(USE_SCRATCHMEM_SUBTERFUGE) |
1244 |
|
// Set fake handle at 0x0000 to scratch memory area (so broken Mac programs won't write into Mac ROM) |
1245 |
< |
extern uint32 ScratchMem; |
1245 |
> |
extern uint8 *ScratchMem; |
1246 |
> |
const uint32 ScratchMemBase = Host2MacAddr(ScratchMem); |
1247 |
|
wp = (uint16 *)(ROMBaseHost + 0xccaa); |
1248 |
|
*wp++ = htons(0x203c); // move.l #ScratchMem,d0 |
1249 |
< |
*wp++ = htons(ScratchMem >> 16); |
1250 |
< |
*wp = htons(ScratchMem); |
1249 |
> |
*wp++ = htons(ScratchMemBase >> 16); |
1250 |
> |
*wp = htons(ScratchMemBase); |
1251 |
|
#else |
1252 |
|
#error System specific handling for writable ROM is required here |
1253 |
|
#endif |
1259 |
|
*wp++ = htons(M68K_NOP); |
1260 |
|
*wp = htons(M68K_NOP); |
1261 |
|
#endif |
1262 |
< |
|
1262 |
> |
|
1263 |
> |
#if REAL_ADDRESSING && !defined(AMIGA) |
1264 |
> |
// gb-- Temporary hack to get rid of crashes in Speedometer |
1265 |
> |
wp = (uint16 *)(ROMBaseHost + 0xdba2); |
1266 |
> |
if (ntohs(*wp) == 0x662c) // bne.b #$2c |
1267 |
> |
*wp = htons(0x602c); // bra.b #$2c |
1268 |
> |
#endif |
1269 |
> |
|
1270 |
|
// Don't write to VIA in InitTimeMgr |
1271 |
|
wp = (uint16 *)(ROMBaseHost + 0xb0e2); |
1272 |
|
*wp++ = htons(0x4cdf); // movem.l (sp)+,d0-d5/a0-a4 |
1462 |
|
if (ROMSize > 0x80000) { |
1463 |
|
|
1464 |
|
// BlockMove() |
1465 |
< |
static const uint8 ptest_dat[] = {0xa0, 0x8d, 0x0c, 0x81, 0x00, 0x00, 0x0c, 0x00, 0x6d, 0x06, 0x4e, 0x71, 0xf4, 0xf8}; |
1466 |
< |
base = find_rom_data(0x87000, 0x87800, ptest_dat, sizeof(ptest_dat)); |
1467 |
< |
D(bug("ptest %08lx\n", base)); |
1465 |
> |
static const uint8 bmove_dat[] = {0x20, 0x5f, 0x22, 0x5f, 0x0c, 0x38, 0x00, 0x04, 0x01, 0x2f}; |
1466 |
> |
base = find_rom_data(0x87000, 0x87800, bmove_dat, sizeof(bmove_dat)); |
1467 |
> |
D(bug("block_move %08lx\n", base)); |
1468 |
|
if (base) { // ROM15/22/23/26/27/32 |
1469 |
< |
wp = (uint16 *)(ROMBaseHost + base + 8); |
1470 |
< |
*wp = htons(M68K_NOP); |
1469 |
> |
wp = (uint16 *)(ROMBaseHost + base + 4); |
1470 |
> |
*wp++ = htons(M68K_EMUL_OP_BLOCK_MOVE); |
1471 |
> |
*wp++ = htons(0x7000); |
1472 |
> |
*wp = htons(M68K_RTS); |
1473 |
|
} |
1474 |
|
|
1475 |
|
// SANE |
1601 |
|
*wp++ = htons(base >> 16); |
1602 |
|
*wp = htons(base & 0xffff); |
1603 |
|
|
1581 |
– |
#if EMULATED_68K |
1582 |
– |
// Replace BlockMove() |
1583 |
– |
wp = (uint16 *)(ROMBaseHost + find_rom_trap(0xa02e)); // BlockMove() |
1584 |
– |
*wp++ = htons(M68K_EMUL_OP_BLOCK_MOVE); |
1585 |
– |
*wp++ = htons(0x7000); |
1586 |
– |
*wp = htons(M68K_RTS); |
1587 |
– |
#endif |
1588 |
– |
|
1604 |
|
// Look for double PACK 4 resources |
1605 |
|
if ((base = find_rom_resource(FOURCC('P','A','C','K'), 4)) == 0) return false; |
1606 |
|
if ((base = find_rom_resource(FOURCC('P','A','C','K'), 4, true)) == 0 && FPUType == 0) |