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

Comparing BasiliskII/src/rom_patches.cpp (file contents):
Revision 1.17 by gbeauche, 2000-09-22T17:17:21Z vs.
Revision 1.26 by gbeauche, 2006-04-30T17:27:55Z

# Line 1 | Line 1
1   /*
2   *  rom_patches.cpp - ROM patches
3   *
4 < *  Basilisk II (C) 1997-2000 Christian Bauer
4 > *  Basilisk II (C) 1997-2005 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
# Line 40 | Line 40
40  
41   // Global variables
42   uint32 UniversalInfo;           // ROM offset of UniversalInfo
43 < uint32 PutScrapPatch;           // Mac address of PutScrap() patch
43 > uint32 PutScrapPatch = 0;       // Mac address of PutScrap() patch
44 > uint32 GetScrapPatch = 0;       // Mac address of GetScrap() patch
45   uint32 ROMBreakpoint = 0;       // ROM offset of breakpoint (0 = disabled, 0x2310 = CritError)
46   bool PrintROMInfo = false;      // Flag: print ROM information in PatchROM()
47 + bool PatchHWBases = true;       // Flag: patch hardware base addresses
48  
49   static uint32 sony_offset;              // ROM offset of .Sony driver
50   static uint32 serd_offset;              // ROM offset of SERD resource (serial drivers)
# Line 52 | Line 54 | static uint32 debugutil_offset;                // ROM
54   // Prototypes
55   uint16 ROMVersion;
56  
55
57   /*
58 < *      Convenience functions for retrieving a particular 16-bit word from
58 < *      a 32-bit word value.
59 < *      
60 < *      gb-- probably put those elsewhere...
58 > *  Macros used to extract one of the 16-bit words from a 32-bit word value
59   */
60  
61   #define HiWord(X) (((X) >> 16) & 0xffff)
# Line 1001 | Line 999 | static bool patch_rom_classic(void)
999          *wp++ = htons(M68K_NOP);
1000          *wp = htons(M68K_NOP);
1001  
1002 <        wp = (uint16 *)(ROMBaseHost + 0x2be8);  // 60Hz handler (handles everything)
1002 >        wp = (uint16 *)(ROMBaseHost + 0x2be4);  // 60Hz handler (handles everything)
1003 >        *wp++ = htons(M68K_NOP);
1004 >        *wp++ = htons(M68K_NOP);
1005          *wp++ = htons(M68K_EMUL_OP_IRQ);
1006          *wp++ = htons(0x4a80);          // tst.l        d0
1007          *wp = htons(0x67f4);            // beq          0x402be2
# Line 1032 | Line 1032 | static bool patch_rom_32(void)
1032          bp = ROMBaseHost + UniversalInfo + 18;          // productKind
1033          *bp = PrefsFindInt32("modelid");
1034  
1035 + #if !ROM_IS_WRITE_PROTECTED
1036 + #if defined(USE_SCRATCHMEM_SUBTERFUGE)
1037 +        // Set hardware base addresses to scratch memory area
1038 +        if (PatchHWBases) {
1039 +                extern uint8 *ScratchMem;
1040 +                const uint32 ScratchMemBase = Host2MacAddr(ScratchMem);
1041 +                
1042 +                D(bug("LMGlob\tOfs/4\tBase\n"));
1043 +                base = ROMBaseMac + UniversalInfo + ReadMacInt32(ROMBaseMac + UniversalInfo); // decoderInfoPtr
1044 +                wp = (uint16 *)(ROMBaseHost + 0x94a);
1045 +                while (*wp != 0xffff) {
1046 +                        int16 ofs = ntohs(*wp++);                       // offset in decoderInfo (/4)
1047 +                        int16 lmg = ntohs(*wp++);                       // address of LowMem global
1048 +                        D(bug("0x%04x\t%d\t0x%08x\n", lmg, ofs, ReadMacInt32(base + ofs*4)));
1049 +                        
1050 +                        // Fake address only if this is not the ASC base
1051 +                        if (lmg != 0xcc0)
1052 +                                WriteMacInt32(base + ofs*4, ScratchMemBase);
1053 +                }
1054 +        }
1055 + #else
1056 + #error System specific handling for writable ROM is required here
1057 + #endif
1058 + #endif
1059 +
1060          // Make FPU optional
1061          if (FPUType == 0) {
1062                  bp = ROMBaseHost + UniversalInfo + 22;  // defaultRSRCs
# Line 1240 | Line 1265 | static bool patch_rom_32(void)
1265   #endif
1266  
1267   #if !ROM_IS_WRITE_PROTECTED
1268 < #if defined(AMIGA) || defined(USE_SCRATCHMEM_SUBTERFUGE)
1268 > #if defined(USE_SCRATCHMEM_SUBTERFUGE)
1269          // Set fake handle at 0x0000 to scratch memory area (so broken Mac programs won't write into Mac ROM)
1270          extern uint8 *ScratchMem;
1271          const uint32 ScratchMemBase = Host2MacAddr(ScratchMem);
# Line 1462 | Line 1487 | static bool patch_rom_32(void)
1487          if (ROMSize > 0x80000) {
1488  
1489                  // BlockMove()
1490 <                static const uint8 ptest_dat[] = {0xa0, 0x8d, 0x0c, 0x81, 0x00, 0x00, 0x0c, 0x00, 0x6d, 0x06, 0x4e, 0x71, 0xf4, 0xf8};
1491 <                base = find_rom_data(0x87000, 0x87800, ptest_dat, sizeof(ptest_dat));
1492 <                D(bug("ptest %08lx\n", base));
1490 >                static const uint8 bmove_dat[] = {0x20, 0x5f, 0x22, 0x5f, 0x0c, 0x38, 0x00, 0x04, 0x01, 0x2f};
1491 >                base = find_rom_data(0x87000, 0x87800, bmove_dat, sizeof(bmove_dat));
1492 >                D(bug("block_move %08lx\n", base));
1493                  if (base) {             // ROM15/22/23/26/27/32
1494 <                        wp = (uint16 *)(ROMBaseHost + base + 8);
1495 <                        *wp = htons(M68K_NOP);
1494 >                        wp = (uint16 *)(ROMBaseHost + base + 4);
1495 >                        *wp++ = htons(M68K_EMUL_OP_BLOCK_MOVE);
1496 >                        *wp++ = htons(0x7000);
1497 >                        *wp = htons(M68K_RTS);
1498                  }
1499  
1500                  // SANE
# Line 1599 | Line 1626 | static bool patch_rom_32(void)
1626          *wp++ = htons(base >> 16);
1627          *wp = htons(base & 0xffff);
1628  
1629 < #if EMULATED_68K
1630 <        // Replace BlockMove()
1631 <        wp = (uint16 *)(ROMBaseHost + find_rom_trap(0xa02e));   // BlockMove()
1632 <        *wp++ = htons(M68K_EMUL_OP_BLOCK_MOVE);
1633 <        *wp++ = htons(0x7000);
1634 <        *wp = htons(M68K_RTS);
1635 < #endif
1629 >        // Install GetScrap() patch for clipboard data exchange (the patch is activated by EMUL_OP_INSTALL_DRIVERS)
1630 >        GetScrapPatch = ROMBaseMac + sony_offset + 0xd00;
1631 >        base = ROMBaseMac + find_rom_trap(0xa9fd);
1632 >        wp = (uint16 *)(ROMBaseHost + sony_offset + 0xd00);
1633 >        *wp++ = htons(M68K_EMUL_OP_GET_SCRAP);
1634 >        *wp++ = htons(M68K_JMP);
1635 >        *wp++ = htons(base >> 16);
1636 >        *wp = htons(base & 0xffff);
1637  
1638          // Look for double PACK 4 resources
1639          if ((base = find_rom_resource(FOURCC('P','A','C','K'), 4)) == 0) return false;
# Line 1620 | Line 1648 | static bool patch_rom_32(void)
1648          *wp++ = htons(M68K_NOP);
1649          *wp = htons(M68K_NOP);
1650  
1651 <        wp = (uint16 *)(ROMBaseHost + 0xa29a);  // 60Hz handler (handles everything)
1651 >        wp = (uint16 *)(ROMBaseHost + 0xa296);  // 60Hz handler (handles everything)
1652 >        *wp++ = htons(M68K_NOP);
1653 >        *wp++ = htons(M68K_NOP);
1654          *wp++ = htons(M68K_EMUL_OP_IRQ);
1655          *wp++ = htons(0x4a80);          // tst.l        d0
1656          *wp = htons(0x67f4);            // beq          0x4080a294

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines