ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/rom_patches.cpp
(Generate patch)

Comparing SheepShaver/src/rom_patches.cpp (file contents):
Revision 1.45 by gbeauche, 2008-01-01T09:47:38Z vs.
Revision 1.46 by asvitkine, 2009-08-18T18:26:10Z

# Line 224 | Line 224 | static uint32 rsrc_ptr = 0;
224   // id = 4711 means "find any ID"
225   static uint32 find_rom_resource(uint32 s_type, int16 s_id = 4711, bool cont = false)
226   {
227 <        uint32 lp = ROM_BASE + 0x1a;
227 >        uint32 lp = ROMBase + 0x1a;
228          uint32 x = ReadMacInt32(lp);
229 <        uint32 header_size = ReadMacInt8(ROM_BASE + x + 5);
229 >        uint32 header_size = ReadMacInt8(ROMBase + x + 5);
230  
231          if (!cont)
232                  rsrc_ptr = x;
# Line 234 | Line 234 | static uint32 find_rom_resource(uint32 s
234                  return 0;
235  
236          for (;;) {
237 <                lp = ROM_BASE + rsrc_ptr;
237 >                lp = ROMBase + rsrc_ptr;
238                  rsrc_ptr = ReadMacInt32(lp);
239                  if (rsrc_ptr == 0)
240                          break;
241  
242                  rsrc_ptr += header_size;
243  
244 <                lp = ROM_BASE + rsrc_ptr + 4;
244 >                lp = ROMBase + rsrc_ptr + 4;
245                  uint32 data = ReadMacInt32(lp);
246                  uint32 type = ReadMacInt32(lp + 4);
247                  int16 id = ReadMacInt16(lp + 8);
# Line 258 | Line 258 | static uint32 find_rom_resource(uint32 s
258  
259   static uint32 find_rom_trap(uint16 trap)
260   {
261 <        uint32 lp = ROM_BASE + ReadMacInt32(ROM_BASE + 0x22);
261 >        uint32 lp = ROMBase + ReadMacInt32(ROMBase + 0x22);
262  
263          if (trap > 0xa800)
264                  return ReadMacInt32(lp + 4 * (trap & 0x3ff));
# Line 759 | Line 759 | static bool patch_nanokernel_boot(void)
759          lp[0x9c >> 2] = htonl(KernelDataAddr);                  // LA_InfoRecord
760          lp[0xa0 >> 2] = htonl(KernelDataAddr);                  // LA_KernelData
761          lp[0xa4 >> 2] = htonl(KernelDataAddr + 0x1000); // LA_EmulatorData
762 <        lp[0xa8 >> 2] = htonl(ROM_BASE + 0x480000);             // LA_DispatchTable
763 <        lp[0xac >> 2] = htonl(ROM_BASE + 0x460000);             // LA_EmulatorCode
762 >        lp[0xa8 >> 2] = htonl(ROMBase + 0x480000);              // LA_DispatchTable
763 >        lp[0xac >> 2] = htonl(ROMBase + 0x460000);              // LA_EmulatorCode
764          lp[0x360 >> 2] = htonl(0);                                              // Physical RAM base (? on NewWorld ROM, this contains -1)
765 <        lp[0xfd8 >> 2] = htonl(ROM_BASE + 0x2a);                // 68k reset vector
765 >        lp[0xfd8 >> 2] = htonl(ROMBase + 0x2a);         // 68k reset vector
766  
767          // Skip SR/BAT/SDR init
768          loc = 0x310000;
# Line 775 | Line 775 | static bool patch_nanokernel_boot(void)
775          if ((base = find_rom_data(0x3101b0, 0x3105b0, sr_init_dat, sizeof(sr_init_dat))) == 0) return false;
776          D(bug("sr_init %08lx\n", base));
777          lp = (uint32 *)(ROMBaseHost + loc + 8);
778 <        *lp = htonl(0x48000000 | ((base - loc - 8) & 0x3fffffc));       // b            ROM_BASE+0x3101b0
778 >        *lp = htonl(0x48000000 | ((base - loc - 8) & 0x3fffffc));       // b            ROMBase+0x3101b0
779          lp = (uint32 *)(ROMBaseHost + base);
780          *lp++ = htonl(0x80200000 + XLM_KERNEL_DATA);            // lwz  r1,(pointer to Kernel Data)
781          *lp++ = htonl(0x3da0dead);              // lis  r13,0xdead      (start of kernel memory)
# Line 1303 | Line 1303 | dr_found:
1303                  D(bug(" patching absolute branch at %08x\n", loc));
1304                  *lp = htonl(0x48000000 + 0xf000 - (loc & 0xffff));                              // b    DR_CACHE_BASE+0x1f000
1305                  lp = (uint32 *)(ROMBaseHost + 0x37f000);
1306 <                *lp++ = htonl(0x3c000000 + ((ROM_BASE + base) >> 16));                  // lis  r0,xxx
1307 <                *lp++ = htonl(0x60000000 + ((ROM_BASE + base) & 0xffff));               // ori  r0,r0,xxx
1306 >                *lp++ = htonl(0x3c000000 + ((ROMBase + base) >> 16));                   // lis  r0,xxx
1307 >                *lp++ = htonl(0x60000000 + ((ROMBase + base) & 0xffff));                // ori  r0,r0,xxx
1308                  *lp++ = htonl(0x7c0803a6);                                                                              // mtlr r0
1309                  *lp = htonl(POWERPC_BLR);                                                                               // blr
1310          }
# Line 1428 | Line 1428 | static bool patch_nanokernel(void)
1428          while (ntohl(*lp) != 0x7d5a03a6) lp--;
1429          *lp++ = htonl(0x7d4903a6);                                      // mtctr        r10
1430          *lp++ = htonl(0x7daff120);                                      // mtcr r13
1431 <        *lp = htonl(0x48000000 + ((0x318000 - ((uintptr)lp - (uintptr)ROMBaseHost)) & 0x03fffffc));     // b            ROM_BASE+0x318000
1431 >        *lp = htonl(0x48000000 + ((0x318000 - ((uintptr)lp - (uintptr)ROMBaseHost)) & 0x03fffffc));     // b            ROMBase+0x318000
1432          uint32 npc = (uintptr)(lp + 1) - (uintptr)ROMBaseHost;
1433  
1434          lp = (uint32 *)(ROMBaseHost + 0x318000);
1435          *lp++ = htonl(0x81400000 + XLM_IRQ_NEST);       // lwz  r10,XLM_IRQ_NEST
1436          *lp++ = htonl(0x394affff);                                      // subi r10,r10,1
1437          *lp++ = htonl(0x91400000 + XLM_IRQ_NEST);       // stw  r10,XLM_IRQ_NEST
1438 <        *lp = htonl(0x48000000 + ((npc - 0x31800c) & 0x03fffffc));      // b            ROM_BASE+0x312c2c
1438 >        *lp = htonl(0x48000000 + ((npc - 0x31800c) & 0x03fffffc));      // b            ROMBase+0x312c2c
1439  
1440          // Patch FEOA opcode, selector 0x0A (virtual->physical page index)
1441          static const uint8 fe0a_0a_dat[] = {0x55, 0x23, 0xa3, 0x3e, 0x4b};
# Line 1480 | Line 1480 | static bool patch_nanokernel(void)
1480  
1481   /*
1482          // Disable FE0A/FE06 opcodes
1483 <        lp = (uint32 *)(ROM_BASE + 0x3144ac);
1483 >        lp = (uint32 *)(ROMBase + 0x3144ac);
1484          *lp++ = htonl(POWERPC_NOP);
1485          *lp += 8;
1486   */
# Line 1754 | Line 1754 | static bool patch_68k(void)
1754          static const uint8 ext_cache_dat[] = {0x4e, 0x7b, 0x00, 0x02};
1755          if ((base = find_rom_data(0x1d0, 0x230, ext_cache_dat, sizeof(ext_cache_dat))) == 0) return false;
1756          D(bug("ext_cache %08lx\n", base));
1757 <        loc = ReadMacInt32(ROM_BASE + base + 6);
1757 >        loc = ReadMacInt32(ROMBase + base + 6);
1758          wp = (uint16 *)(ROMBaseHost + loc + base + 6);
1759          *wp = htons(M68K_RTS);
1760 <        loc = ReadMacInt32(ROM_BASE + base + 12);
1760 >        loc = ReadMacInt32(ROMBase + base + 12);
1761          wp = (uint16 *)(ROMBaseHost + loc + base + 12);
1762          *wp = htons(M68K_RTS);
1763  
# Line 1788 | Line 1788 | static bool patch_68k(void)
1788          for (;;) {
1789                  D(bug(" %08lx\n", (uintptr)lp - (uintptr)ROMBaseHost));
1790                  while ((ntohl(*lp) & 0xff000000) == 0xff000000) {
1791 <                        *lp = htonl((ntohl(*lp) & (ROM_SIZE-1)) + ROM_BASE);
1791 >                        *lp = htonl((ntohl(*lp) & (ROM_SIZE-1)) + ROMBase);
1792                          lp++;
1793                  }
1794                  while (!ntohl(*lp)) lp++;
# Line 2068 | Line 2068 | static bool patch_68k(void)
2068          D(bug("scsi_mgr %08lx\n", base));
2069          wp = (uint16 *)(ROMBaseHost + base);
2070          *wp++ = htons(0x21fc);                  // move.l       #xxx,0x624      (SCSIAtomic)
2071 <        *wp++ = htons((ROM_BASE + base + 18) >> 16);
2072 <        *wp++ = htons((ROM_BASE + base + 18) & 0xffff);
2071 >        *wp++ = htons((ROMBase + base + 18) >> 16);
2072 >        *wp++ = htons((ROMBase + base + 18) & 0xffff);
2073          *wp++ = htons(0x0624);
2074          *wp++ = htons(0x21fc);                  // move.l       #xxx,0xe54      (SCSIDispatch)
2075 <        *wp++ = htons((ROM_BASE + base + 22) >> 16);
2076 <        *wp++ = htons((ROM_BASE + base + 22) & 0xffff);
2075 >        *wp++ = htons((ROMBase + base + 22) >> 16);
2076 >        *wp++ = htons((ROMBase + base + 22) & 0xffff);
2077          *wp++ = htons(0x0e54);
2078          *wp++ = htons(M68K_RTS);
2079          *wp++ = htons(M68K_EMUL_OP_SCSI_ATOMIC);
# Line 2142 | Line 2142 | static bool patch_68k(void)
2142          D(bug("check_load %08lx\n", base));
2143          wp = (uint16 *)(ROMBaseHost + base);
2144          *wp++ = htons(M68K_JMP);
2145 <        *wp++ = htons((ROM_BASE + CHECK_LOAD_PATCH_SPACE) >> 16);
2146 <        *wp = htons((ROM_BASE + CHECK_LOAD_PATCH_SPACE) & 0xffff);
2145 >        *wp++ = htons((ROMBase + CHECK_LOAD_PATCH_SPACE) >> 16);
2146 >        *wp = htons((ROMBase + CHECK_LOAD_PATCH_SPACE) & 0xffff);
2147          wp = (uint16 *)(ROMBaseHost + CHECK_LOAD_PATCH_SPACE);
2148          *wp++ = htons(0x2f03);                  // move.l       d3,-(a7)
2149          *wp++ = htons(0x2078);                  // move.l       $07f0,a0
# Line 2173 | Line 2173 | static bool patch_68k(void)
2173          memcpy((void *)(ROMBaseHost + sony_offset + 0x200), cdrom_driver, sizeof(cdrom_driver));
2174  
2175          // Install serial drivers
2176 <        gen_ain_driver( ROM_BASE + sony_offset + 0x300);
2177 <        gen_aout_driver(ROM_BASE + sony_offset + 0x400);
2178 <        gen_bin_driver( ROM_BASE + sony_offset + 0x500);
2179 <        gen_bout_driver(ROM_BASE + sony_offset + 0x600);
2176 >        gen_ain_driver( ROMBase + sony_offset + 0x300);
2177 >        gen_aout_driver(ROMBase + sony_offset + 0x400);
2178 >        gen_bin_driver( ROMBase + sony_offset + 0x500);
2179 >        gen_bout_driver(ROMBase + sony_offset + 0x600);
2180  
2181          // Copy icons to ROM
2182 <        SonyDiskIconAddr = ROM_BASE + sony_offset + 0x800;
2182 >        SonyDiskIconAddr = ROMBase + sony_offset + 0x800;
2183          memcpy(ROMBaseHost + sony_offset + 0x800, SonyDiskIcon, sizeof(SonyDiskIcon));
2184 <        SonyDriveIconAddr = ROM_BASE + sony_offset + 0xa00;
2184 >        SonyDriveIconAddr = ROMBase + sony_offset + 0xa00;
2185          memcpy(ROMBaseHost + sony_offset + 0xa00, SonyDriveIcon, sizeof(SonyDriveIcon));
2186 <        DiskIconAddr = ROM_BASE + sony_offset + 0xc00;
2186 >        DiskIconAddr = ROMBase + sony_offset + 0xc00;
2187          memcpy(ROMBaseHost + sony_offset + 0xc00, DiskIcon, sizeof(DiskIcon));
2188 <        CDROMIconAddr = ROM_BASE + sony_offset + 0xe00;
2188 >        CDROMIconAddr = ROMBase + sony_offset + 0xe00;
2189          memcpy(ROMBaseHost + sony_offset + 0xe00, CDROMIcon, sizeof(CDROMIcon));
2190  
2191          // Patch driver install routine
# Line 2269 | Line 2269 | static bool patch_68k(void)
2269          static const uint8 via_int_dat[] = {0x70, 0x7f, 0xc0, 0x29, 0x1a, 0x00, 0xc0, 0x29, 0x1c, 0x00};
2270          if ((base = find_rom_data(0x13000, 0x1c000, via_int_dat, sizeof(via_int_dat))) == 0) return false;
2271          D(bug("via_int %08lx\n", base));
2272 <        uint32 level1_int = ROM_BASE + base;
2272 >        uint32 level1_int = ROMBase + base;
2273          wp = (uint16 *)(ROMBaseHost + base);    // Level 1 handler
2274          *wp++ = htons(0x7002);                  // moveq        #2,d0 (60Hz interrupt)
2275          *wp++ = htons(M68K_NOP);
# Line 2301 | Line 2301 | static bool patch_68k(void)
2301          wp = (uint16 *)(ROMBaseHost + PUT_SCRAP_PATCH_SPACE);
2302          *wp++ = htons(M68K_EMUL_OP_PUT_SCRAP);
2303          *wp++ = htons(M68K_JMP);
2304 <        *wp++ = htons((ROM_BASE + put_scrap) >> 16);
2305 <        *wp++ = htons((ROM_BASE + put_scrap) & 0xffff);
2306 <        base = ROM_BASE + ReadMacInt32(ROM_BASE + 0x22);
2304 >        *wp++ = htons((ROMBase + put_scrap) >> 16);
2305 >        *wp++ = htons((ROMBase + put_scrap) & 0xffff);
2306 >        base = ROMBase + ReadMacInt32(ROMBase + 0x22);
2307          WriteMacInt32(base + 4 * (0xa9fe & 0x3ff), PUT_SCRAP_PATCH_SPACE);
2308  
2309          // Patch GetScrap() for clipboard exchange with host OS
# Line 2311 | Line 2311 | static bool patch_68k(void)
2311          wp = (uint16 *)(ROMBaseHost + GET_SCRAP_PATCH_SPACE);
2312          *wp++ = htons(M68K_EMUL_OP_GET_SCRAP);
2313          *wp++ = htons(M68K_JMP);
2314 <        *wp++ = htons((ROM_BASE + get_scrap) >> 16);
2315 <        *wp++ = htons((ROM_BASE + get_scrap) & 0xffff);
2316 <        base = ROM_BASE + ReadMacInt32(ROM_BASE + 0x22);
2314 >        *wp++ = htons((ROMBase + get_scrap) >> 16);
2315 >        *wp++ = htons((ROMBase + get_scrap) & 0xffff);
2316 >        base = ROMBase + ReadMacInt32(ROMBase + 0x22);
2317          WriteMacInt32(base + 4 * (0xa9fd & 0x3ff), GET_SCRAP_PATCH_SPACE);
2318  
2319          // Patch SynchIdleTime()
# Line 2336 | Line 2336 | static bool patch_68k(void)
2336          D(bug("Searching for sound components with type sdev in ROM\n"));
2337          uint32 thing = find_rom_resource(FOURCC('t','h','n','g'));
2338          while (thing) {
2339 <                thing += ROM_BASE;
2339 >                thing += ROMBase;
2340                  D(bug(" found %c%c%c%c %c%c%c%c\n", ReadMacInt8(thing), ReadMacInt8(thing + 1), ReadMacInt8(thing + 2), ReadMacInt8(thing + 3), ReadMacInt8(thing + 4), ReadMacInt8(thing + 5), ReadMacInt8(thing + 6), ReadMacInt8(thing + 7)));
2341                  if (ReadMacInt32(thing) == FOURCC('s','d','e','v') && ReadMacInt32(thing + 4) == FOURCC('s','i','n','g')) {
2342                          WriteMacInt32(thing + 4, FOURCC('a','w','g','c'));
# Line 2394 | Line 2394 | void InstallDrivers(void)
2394          if (ROMType == ROMTYPE_NEWWORLD || ROMType == ROMTYPE_GOSSAMER) {
2395  
2396                  // Force installation of floppy driver with NewWorld and Gossamer ROMs
2397 <                r.a[0] = ROM_BASE + sony_offset;
2397 >                r.a[0] = ROMBase + sony_offset;
2398                  r.d[0] = (uint32)SonyRefNum;
2399                  Execute68kTrap(0xa43d, &r);             // DrvrInstallRsrvMem()
2400                  r.a[0] = ReadMacInt32(ReadMacInt32(0x11c) + ~SonyRefNum * 4);   // Get driver handle from Unit Table
2401                  Execute68kTrap(0xa029, &r);             // HLock()
2402                  uint32 dce = ReadMacInt32(r.a[0]);
2403 <                WriteMacInt32(dce + dCtlDriver, ROM_BASE + sony_offset);
2403 >                WriteMacInt32(dce + dCtlDriver, ROMBase + sony_offset);
2404                  WriteMacInt16(dce + dCtlFlags, SonyDriverFlags);
2405          }
2406  
# Line 2412 | Line 2412 | void InstallDrivers(void)
2412          Execute68kTrap(0xa000, &r);             // Open()
2413  
2414          // Install disk driver
2415 <        r.a[0] = ROM_BASE + sony_offset + 0x100;
2415 >        r.a[0] = ROMBase + sony_offset + 0x100;
2416          r.d[0] = (uint32)DiskRefNum;
2417          Execute68kTrap(0xa43d, &r);             // DrvrInstallRsrvMem()
2418          r.a[0] = ReadMacInt32(ReadMacInt32(0x11c) + ~DiskRefNum * 4);   // Get driver handle from Unit Table
2419          Execute68kTrap(0xa029, &r);             // HLock()
2420          uint32 dce = ReadMacInt32(r.a[0]);
2421 <        WriteMacInt32(dce + dCtlDriver, ROM_BASE + sony_offset + 0x100);
2421 >        WriteMacInt32(dce + dCtlDriver, ROMBase + sony_offset + 0x100);
2422          WriteMacInt16(dce + dCtlFlags, DiskDriverFlags);
2423  
2424          // Open disk driver
# Line 2431 | Line 2431 | void InstallDrivers(void)
2431          if (!PrefsFindBool("nocdrom")) {
2432  
2433                  // Install CD-ROM driver
2434 <                r.a[0] = ROM_BASE + sony_offset + 0x200;
2434 >                r.a[0] = ROMBase + sony_offset + 0x200;
2435                  r.d[0] = (uint32)CDROMRefNum;
2436                  Execute68kTrap(0xa43d, &r);             // DrvrInstallRsrvMem()
2437                  r.a[0] = ReadMacInt32(ReadMacInt32(0x11c) + ~CDROMRefNum * 4);  // Get driver handle from Unit Table
2438                  Execute68kTrap(0xa029, &r);             // HLock()
2439                  dce = ReadMacInt32(r.a[0]);
2440 <                WriteMacInt32(dce + dCtlDriver, ROM_BASE + sony_offset + 0x200);
2440 >                WriteMacInt32(dce + dCtlDriver, ROMBase + sony_offset + 0x200);
2441                  WriteMacInt16(dce + dCtlFlags, CDROMDriverFlags);
2442  
2443                  // Open CD-ROM driver
# Line 2448 | Line 2448 | void InstallDrivers(void)
2448          }
2449  
2450          // Install serial drivers
2451 <        r.a[0] = ROM_BASE + sony_offset + 0x300;
2451 >        r.a[0] = ROMBase + sony_offset + 0x300;
2452          r.d[0] = (uint32)-6;
2453          Execute68kTrap(0xa43d, &r);             // DrvrInstallRsrvMem()
2454          r.a[0] = ReadMacInt32(ReadMacInt32(0x11c) + ~(-6) * 4); // Get driver handle from Unit Table
2455          Execute68kTrap(0xa029, &r);             // HLock()
2456          dce = ReadMacInt32(r.a[0]);
2457 <        WriteMacInt32(dce + dCtlDriver, ROM_BASE + sony_offset + 0x300);
2457 >        WriteMacInt32(dce + dCtlDriver, ROMBase + sony_offset + 0x300);
2458          WriteMacInt16(dce + dCtlFlags, 0x4d00);
2459  
2460 <        r.a[0] = ROM_BASE + sony_offset + 0x400;
2460 >        r.a[0] = ROMBase + sony_offset + 0x400;
2461          r.d[0] = (uint32)-7;
2462          Execute68kTrap(0xa43d, &r);             // DrvrInstallRsrvMem()
2463          r.a[0] = ReadMacInt32(ReadMacInt32(0x11c) + ~(-7) * 4); // Get driver handle from Unit Table
2464          Execute68kTrap(0xa029, &r);             // HLock()
2465          dce = ReadMacInt32(r.a[0]);
2466 <        WriteMacInt32(dce + dCtlDriver, ROM_BASE + sony_offset + 0x400);
2466 >        WriteMacInt32(dce + dCtlDriver, ROMBase + sony_offset + 0x400);
2467          WriteMacInt16(dce + dCtlFlags, 0x4e00);
2468  
2469 <        r.a[0] = ROM_BASE + sony_offset + 0x500;
2469 >        r.a[0] = ROMBase + sony_offset + 0x500;
2470          r.d[0] = (uint32)-8;
2471          Execute68kTrap(0xa43d, &r);             // DrvrInstallRsrvMem()
2472          r.a[0] = ReadMacInt32(ReadMacInt32(0x11c) + ~(-8) * 4); // Get driver handle from Unit Table
2473          Execute68kTrap(0xa029, &r);             // HLock()
2474          dce = ReadMacInt32(r.a[0]);
2475 <        WriteMacInt32(dce + dCtlDriver, ROM_BASE + sony_offset + 0x500);
2475 >        WriteMacInt32(dce + dCtlDriver, ROMBase + sony_offset + 0x500);
2476          WriteMacInt16(dce + dCtlFlags, 0x4d00);
2477  
2478 <        r.a[0] = ROM_BASE + sony_offset + 0x600;
2478 >        r.a[0] = ROMBase + sony_offset + 0x600;
2479          r.d[0] = (uint32)-9;
2480          Execute68kTrap(0xa43d, &r);             // DrvrInstallRsrvMem()
2481          r.a[0] = ReadMacInt32(ReadMacInt32(0x11c) + ~(-9) * 4); // Get driver handle from Unit Table
2482          Execute68kTrap(0xa029, &r);             // HLock()
2483          dce = ReadMacInt32(r.a[0]);
2484 <        WriteMacInt32(dce + dCtlDriver, ROM_BASE + sony_offset + 0x600);
2484 >        WriteMacInt32(dce + dCtlDriver, ROMBase + sony_offset + 0x600);
2485          WriteMacInt16(dce + dCtlFlags, 0x4e00);
2486   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines