1 |
|
/* |
2 |
|
* rom_patches.cpp - ROM patches |
3 |
|
* |
4 |
< |
* SheepShaver (C) 1997-2002 Christian Bauer and Marc Hellwig |
4 |
> |
* SheepShaver (C) 1997-2004 Christian Bauer and Marc Hellwig |
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 |
62 |
|
const uint32 CHECK_LOAD_PATCH_SPACE = 0x2fcf00; |
63 |
|
const uint32 PUT_SCRAP_PATCH_SPACE = 0x2fcf80; |
64 |
|
const uint32 GET_SCRAP_PATCH_SPACE = 0x2fcfc0; |
65 |
< |
const uint32 ADDR_MAP_PATCH_SPACE = 0x2fd000; |
65 |
> |
const uint32 ADDR_MAP_PATCH_SPACE = 0x2fd100; |
66 |
|
|
67 |
|
// Global variables |
68 |
|
int ROMType; // ROM type |
311 |
|
|
312 |
|
|
313 |
|
/* |
314 |
+ |
* Check that requested ROM patch space is really available |
315 |
+ |
*/ |
316 |
+ |
|
317 |
+ |
static bool check_rom_patch_space(uint32 base, uint32 size) |
318 |
+ |
{ |
319 |
+ |
size = (size + 3) & -4; |
320 |
+ |
for (int i = 0; i < size; i += 4) { |
321 |
+ |
uint32 x = ntohl(*(uint32 *)(ROM_BASE + base + i)); |
322 |
+ |
if (x != 0x6b636b63 && x != 0) |
323 |
+ |
return false; |
324 |
+ |
} |
325 |
+ |
return true; |
326 |
+ |
} |
327 |
+ |
|
328 |
+ |
|
329 |
+ |
/* |
330 |
|
* List of audio sifters installed in ROM and System file |
331 |
|
*/ |
332 |
|
|
713 |
|
return false; |
714 |
|
|
715 |
|
// Check that other ROM addresses point to really free regions |
716 |
< |
if (ntohl(*(uint32 *)(ROM_BASE + CHECK_LOAD_PATCH_SPACE)) != 0x6b636b63) |
716 |
> |
if (!check_rom_patch_space(CHECK_LOAD_PATCH_SPACE, 0x40)) |
717 |
|
return false; |
718 |
< |
if (ntohl(*(uint32 *)(ROM_BASE + PUT_SCRAP_PATCH_SPACE)) != 0x6b636b63) |
718 |
> |
if (!check_rom_patch_space(PUT_SCRAP_PATCH_SPACE, 0x40)) |
719 |
|
return false; |
720 |
< |
if (ntohl(*(uint32 *)(ROM_BASE + GET_SCRAP_PATCH_SPACE)) != 0x6b636b63) |
720 |
> |
if (!check_rom_patch_space(GET_SCRAP_PATCH_SPACE, 0x40)) |
721 |
|
return false; |
722 |
< |
if (ntohl(*(uint32 *)(ROM_BASE + ADDR_MAP_PATCH_SPACE)) != 0x6b636b63) |
722 |
> |
if (!check_rom_patch_space(ADDR_MAP_PATCH_SPACE - 10 * 4, 0x100)) |
723 |
|
return false; |
724 |
|
|
725 |
|
// Apply patches |
871 |
|
lp[8] = htonl(0x00800002); // TLB total size/TLB assoc |
872 |
|
break; |
873 |
|
// case 11: // X704? |
874 |
< |
case 12: // ??? |
874 |
> |
case 12: // 7400, 7410 |
875 |
> |
case 0x800c: |
876 |
|
lp[0] = htonl(0x1000); // Page size |
877 |
|
lp[1] = htonl(0x8000); // Data cache size |
878 |
|
lp[2] = htonl(0x8000); // Inst cache size |
1663 |
|
D(bug("scc_init_caller %08lx\n", base + 12)); |
1664 |
|
wp = (uint16 *)(ROM_BASE + base + 12); |
1665 |
|
loc = ntohs(wp[1]) + ((uintptr)wp - ROM_BASE) + 2; |
1666 |
< |
static const uint8 scc_init_dat[] = {0x08, 0x38, 0x00, 0x03, 0x0d, 0xd3, 0x67, 0x12, 0x20, 0x78, 0x01, 0xdc, 0x22, 0x78, 0x01, 0xd8}; |
1667 |
< |
if ((base = find_rom_data(loc, loc + 0x80, scc_init_dat, sizeof(scc_init_dat))) != loc) return false; |
1666 |
> |
static const uint8 scc_init_dat[] = {0x20, 0x78, 0x01, 0xdc, 0x22, 0x78, 0x01, 0xd8}; |
1667 |
> |
if ((base = find_rom_data(loc, loc + 0x80, scc_init_dat, sizeof(scc_init_dat))) == 0) return false; |
1668 |
|
D(bug("scc_init %08lx\n", base)); |
1669 |
|
wp = (uint16 *)(ROM_BASE + base); |
1670 |
|
*wp++ = htons(M68K_EMUL_OP_RESET); |
2305 |
|
WriteMacInt16(dce + dCtlFlags, SonyDriverFlags); |
2306 |
|
} |
2307 |
|
|
2308 |
< |
#if DISABLE_SCSI && 0 |
2308 |
> |
#if DISABLE_SCSI && HAVE_SIGSEGV_SKIP_INSTRUCTION |
2309 |
|
// Fake SCSIGlobals |
2310 |
|
WriteMacInt32(0xc0c, SheepMem::ZeroPage()); |
2311 |
|
#endif |