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.26 by gbeauche, 2004-02-15T17:20:36Z vs.
Revision 1.30 by gbeauche, 2004-06-22T17:10:06Z

# Line 1058 | Line 1058 | static bool patch_nanokernel_boot(void)
1058   static bool patch_68k_emul(void)
1059   {
1060          uint32 *lp;
1061 <        uint32 base;
1061 >        uint32 base, loc;
1062  
1063          // Overwrite twi instructions
1064          static const uint8 twi_dat[] = {0x0f, 0xff, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x01, 0x0f, 0xff, 0x00, 0x02};
# Line 1122 | Line 1122 | static bool patch_68k_emul(void)
1122          // Extra routine for 68k emulator start
1123          lp = (uint32 *)(ROM_BASE + 0x36f900);
1124          *lp++ = htonl(0x7c2903a6);                                      // mtctr        r1
1125 #if EMULATED_PPC
1126        *lp++ = htonl(NativeOpcode(NATIVE_DISABLE_INTERRUPT));
1127 #else
1125          *lp++ = htonl(0x80200000 + XLM_IRQ_NEST);       // lwz          r1,XLM_IRQ_NEST
1126          *lp++ = htonl(0x38210001);                                      // addi         r1,r1,1
1127          *lp++ = htonl(0x90200000 + XLM_IRQ_NEST);       // stw          r1,XLM_IRQ_NEST
1131 #endif
1128          *lp++ = htonl(0x80200000 + XLM_KERNEL_DATA);// lwz              r1,XLM_KERNEL_DATA
1129          *lp++ = htonl(0x90c10018);                                      // stw          r6,0x18(r1)
1130          *lp++ = htonl(0x7cc902a6);                                      // mfctr        r6
# Line 1156 | Line 1152 | static bool patch_68k_emul(void)
1152          // Extra routine for Mixed Mode
1153          lp = (uint32 *)(ROM_BASE + 0x36fa00);
1154          *lp++ = htonl(0x7c2903a6);                                      // mtctr        r1
1159 #if EMULATED_PPC
1160        *lp++ = htonl(NativeOpcode(NATIVE_DISABLE_INTERRUPT));
1161 #else
1155          *lp++ = htonl(0x80200000 + XLM_IRQ_NEST);       // lwz          r1,XLM_IRQ_NEST
1156          *lp++ = htonl(0x38210001);                                      // addi         r1,r1,1
1157          *lp++ = htonl(0x90200000 + XLM_IRQ_NEST);       // stw          r1,XLM_IRQ_NEST
1165 #endif
1158          *lp++ = htonl(0x80200000 + XLM_KERNEL_DATA);// lwz              r1,XLM_KERNEL_DATA
1159          *lp++ = htonl(0x90c10018);                                      // stw          r6,0x18(r1)
1160          *lp++ = htonl(0x7cc902a6);                                      // mfctr        r6
# Line 1190 | Line 1182 | static bool patch_68k_emul(void)
1182          // Extra routine for Reset/FC1E opcode
1183          lp = (uint32 *)(ROM_BASE + 0x36fb00);
1184          *lp++ = htonl(0x7c2903a6);                                      // mtctr        r1
1193 #if EMULATED_PPC
1194        *lp++ = htonl(NativeOpcode(NATIVE_DISABLE_INTERRUPT));
1195 #else
1185          *lp++ = htonl(0x80200000 + XLM_IRQ_NEST);       // lwz          r1,XLM_IRQ_NEST
1186          *lp++ = htonl(0x38210001);                                      // addi         r1,r1,1
1187          *lp++ = htonl(0x90200000 + XLM_IRQ_NEST);       // stw          r1,XLM_IRQ_NEST
1199 #endif
1188          *lp++ = htonl(0x80200000 + XLM_KERNEL_DATA);// lwz              r1,XLM_KERNEL_DATA
1189          *lp++ = htonl(0x90c10018);                                      // stw          r6,0x18(r1)
1190          *lp++ = htonl(0x7cc902a6);                                      // mfctr        r6
# Line 1224 | Line 1212 | static bool patch_68k_emul(void)
1212          // Extra routine for FE0A opcode (QuickDraw 3D needs this)
1213          lp = (uint32 *)(ROM_BASE + 0x36fc00);
1214          *lp++ = htonl(0x7c2903a6);                                      // mtctr        r1
1227 #if EMULATED_PPC
1228        *lp++ = htonl(NativeOpcode(NATIVE_DISABLE_INTERRUPT));
1229 #else
1215          *lp++ = htonl(0x80200000 + XLM_IRQ_NEST);       // lwz          r1,XLM_IRQ_NEST
1216          *lp++ = htonl(0x38210001);                                      // addi         r1,r1,1
1217          *lp++ = htonl(0x90200000 + XLM_IRQ_NEST);       // stw          r1,XLM_IRQ_NEST
1233 #endif
1218          *lp++ = htonl(0x80200000 + XLM_KERNEL_DATA);// lwz              r1,XLM_KERNEL_DATA
1219          *lp++ = htonl(0x90c10018);                                      // stw          r6,0x18(r1)
1220          *lp++ = htonl(0x7cc902a6);                                      // mfctr        r6
# Line 1266 | Line 1250 | static bool patch_68k_emul(void)
1250          return false;
1251   dr_found:
1252          lp++;
1253 <        *lp = htonl(0x48000000 + 0xf000 - (((uint32)lp - ROM_BASE) & 0xffff));          // b    DR_CACHE_BASE+0x1f000
1254 <        lp = (uint32 *)(ROM_BASE + 0x37f000);
1255 <        *lp++ = htonl(0x3c000000 + ((ROM_BASE + 0x46d0a4) >> 16));              // lis  r0,xxx
1256 <        *lp++ = htonl(0x60000000 + ((ROM_BASE + 0x46d0a4) & 0xffff));   // ori  r0,r0,xxx
1257 <        *lp++ = htonl(0x7c0903a6);                                                                              // mtctr        r0
1258 <        *lp = htonl(POWERPC_BCTR);                                                                              // bctr
1253 >        loc = (uint32)lp - ROM_BASE;
1254 >        if ((base = powerpc_branch_target(ROM_BASE + loc)) == 0) base = ROM_BASE + loc;
1255 >        static const uint8 dr_ret_dat[] = {0x80, 0xbf, 0x08, 0x14, 0x53, 0x19, 0x4d, 0xac, 0x7c, 0xa8, 0x03, 0xa6};
1256 >        if ((base = find_rom_data(base - ROM_BASE, 0x380000, dr_ret_dat, sizeof(dr_ret_dat))) == 0) return false;
1257 >        D(bug("dr_ret %08lx\n", base));
1258 >        if (base != loc) {
1259 >                // OldWorld ROMs contain an absolute branch
1260 >                D(bug(" patching absolute branch at %08x\n", (uint32)lp - ROM_BASE));
1261 >                *lp = htonl(0x48000000 + 0xf000 - (((uint32)lp - ROM_BASE) & 0xffff));          // b    DR_CACHE_BASE+0x1f000
1262 >                lp = (uint32 *)(ROM_BASE + 0x37f000);
1263 >                *lp++ = htonl(0x3c000000 + ((ROM_BASE + base) >> 16));                  // lis  r0,xxx
1264 >                *lp++ = htonl(0x60000000 + ((ROM_BASE + base) & 0xffff));               // ori  r0,r0,xxx
1265 >                *lp++ = htonl(0x7c0803a6);                                                                              // mtlr r0
1266 >                *lp = htonl(POWERPC_BLR);                                                                               // blr
1267 >        }
1268          return true;
1269   }
1270  
# Line 1388 | Line 1381 | static bool patch_nanokernel(void)
1381          uint32 npc = (uint32)(lp + 1) - ROM_BASE;
1382  
1383          lp = (uint32 *)(ROM_BASE + 0x318000);
1391 #if EMULATED_PPC
1392        *lp++ = htonl(NativeOpcode(NATIVE_ENABLE_INTERRUPT));
1393        *lp = htonl(0x48000000 + ((npc - 0x318004) & 0x03fffffc));      // b            ROM_BASE+0x312c2c
1394 #else
1384          *lp++ = htonl(0x81400000 + XLM_IRQ_NEST);       // lwz  r10,XLM_IRQ_NEST
1385          *lp++ = htonl(0x394affff);                                      // subi r10,r10,1
1386          *lp++ = htonl(0x91400000 + XLM_IRQ_NEST);       // stw  r10,XLM_IRQ_NEST
1387          *lp = htonl(0x48000000 + ((npc - 0x31800c) & 0x03fffffc));      // b            ROM_BASE+0x312c2c
1399 #endif
1388  
1389   /*
1390          // Disable FE0A/FE06 opcodes
# Line 2228 | Line 2216 | static bool patch_68k(void)
2216          lp = (uint32 *)(ROM_BASE + ntohl(*lp));
2217          lp[0xa9fd & 0x3ff] = htonl(GET_SCRAP_PATCH_SPACE);
2218  
2231 #if __BEOS__
2219          // Patch SynchIdleTime()
2220          if (PrefsFindBool("idlewait")) {
2221                  wp = (uint16 *)(ROM_BASE + find_rom_trap(0xabf7) + 4);  // SynchIdleTime()
2222                  D(bug("SynchIdleTime at %08lx\n", wp));
2223 <                if (ntohs(*wp) == 0x2078) {
2223 >                if (ntohs(*wp) == 0x2078) {                                                             // movea.l      ExpandMem,a0
2224                          *wp++ = htons(M68K_EMUL_OP_IDLE_TIME);
2225                          *wp = htons(M68K_NOP);
2226 <                } else {
2226 >                }
2227 >                else if (ntohs(*wp) == 0x70fe)                                                  // moveq        #-2,d0
2228 >                        *wp++ = htons(M68K_EMUL_OP_IDLE_TIME_2);
2229 >                else {
2230                          D(bug("SynchIdleTime patch not installed\n"));
2231                  }
2232          }
2243 #endif
2233  
2234          // Construct list of all sifters used by sound components in ROM
2235          D(bug("Searching for sound components with type sdev in ROM\n"));
# Line 2305 | Line 2294 | void InstallDrivers(void)
2294                  WriteMacInt16(dce + dCtlFlags, SonyDriverFlags);
2295          }
2296  
2297 < #if DISABLE_SCSI && 0
2297 > #if DISABLE_SCSI && HAVE_SIGSEGV_SKIP_INSTRUCTION
2298          // Fake SCSIGlobals
2299          WriteMacInt32(0xc0c, SheepMem::ZeroPage());
2300   #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines