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

Comparing SheepShaver/src/rsrc_patches.cpp (file contents):
Revision 1.15 by gbeauche, 2005-01-30T21:48:19Z vs.
Revision 1.18 by gbeauche, 2006-05-03T21:53:33Z

# Line 168 | Line 168 | void CheckLoad(uint32 type, int16 id, ui
168                                          p[5] = htons(0x6010);   // bra
169                                          D(bug(" patch 7 applied\n"));
170                                  }
171 +                        } else if (PM(0,0x2f3c) && PM(1,0x7665) && PM(2,0x7273) && PM(3,0x3f3c) && PM(4,0x0001) && PM(10,0x2041) && PM(11,0x2248) && PM(12,0x2050) && PM(20,0x7066) && PM(21,0xa9c9)) {
172 +                                // Check when vers 1 is installed (for safe abort if MacOS < 8.1 is used with a NewWorld ROM)
173 +                                p[10] = htons(M68K_EMUL_OP_CHECK_SYSV);
174 +                                p[11] = htons(0x4a81);  // tst.l        d1
175 +                                p[12] = htons(0x670e);  // beq.s        <SysError #dsOldSystem>
176 +                                D(bug(" patch 9 applied\n"));
177                          }
178                          p++;
179                  }
# Line 575 | Line 581 | void CheckLoad(uint32 type, int16 id, ui
581  
582  
583   /*
584 + *  Resource patches via GetNamedResource() and Get1NamedResource()
585 + */
586 +
587 + void CheckLoad(uint32 type, const char *name, uint8 *p, uint32 size)
588 + {
589 +        uint16 *p16;
590 +        uint32 base;
591 +        D(bug("vCheckLoad %c%c%c%c (%08x) name \"%*s\", data %p, size %d\n", type >> 24, (type >> 16) & 0xff, (type >> 8) & 0xff, type & 0xff, type, name[0], &name[1], p, size));
592 +
593 +        // Don't modify resources in ROM
594 +        if ((uintptr)p >= (uintptr)ROMBaseHost && (uintptr)p <= (uintptr)(ROMBaseHost + ROM_SIZE))
595 +                return;
596 +
597 +        if (type == FOURCC('D','R','V','R') && strncmp(&name[1], ".AFPTranslator", name[0]) == 0) {
598 +                D(bug(" DRVR .AFPTranslator found\n"));
599 +                
600 +                // Don't access ROM85 as it it was a pointer to a ROM version number (8.0, 8.1)
601 +                static const uint8 dat[] = {0x3a, 0x2e, 0x00, 0x0a, 0x55, 0x4f, 0x3e, 0xb8, 0x02, 0x8e, 0x30, 0x1f, 0x48, 0xc0, 0x24, 0x40, 0x20, 0x40};
602 +                base = find_rsrc_data(p, size, dat, sizeof(dat));
603 +                if (base) {
604 +                        p16 = (uint16 *)(p + base + 4);
605 +                        *p16++ = htons(0x303c);         // move.l       #ROM85,%d0
606 +                        *p16++ = htons(0x028e);
607 +                        *p16++ = htons(M68K_NOP);
608 +                        *p16++ = htons(M68K_NOP);
609 +                        D(bug("  patch 1 applied\n"));
610 +                }
611 +        }
612 + }
613 +
614 +
615 + /*
616   *  Native Resource Manager patches
617   */
618  
# Line 596 | Line 634 | void check_load_invoc(uint32 type, int16
634   }
635  
636   #ifdef __BEOS__
637 + static
638 + #else
639 + extern "C"
640 + #endif
641 + void named_check_load_invoc(uint32 type, uint32 name, uint32 h)
642 + {
643 +        if (h == 0)
644 +                return;
645 +        uint32 p = ReadMacInt32(h);
646 +        if (p == 0)
647 +                return;
648 +        uint32 size = ReadMacInt32(p - 2 * 4) & 0xffffff;
649 +
650 +        CheckLoad(type, (char *)Mac2HostAddr(name), Mac2HostAddr(p), size);
651 + }
652 +
653 + #ifdef __BEOS__
654   static asm void **get_resource(register uint32 type, register int16 id)
655   {
656          // Create stack frame
# Line 760 | Line 815 | static asm void **r_get_resource(registe
815          addi    r1,r1,56+12
816          blr
817   }
818 +
819 + static asm void **get_named_resource(register uint32 type, register uint32 name)
820 + {
821 +        // Create stack frame
822 +        mflr    r0
823 +        stw             r0,8(r1)
824 +        stwu    r1,-(56+12)(r1)
825 +
826 +        // Save type/ID
827 +        stw             r3,56(r1)
828 +        stw             r4,56+4(r1)
829 +
830 +        // Call old routine
831 +        lwz             r0,XLM_GET_NAMED_RESOURCE
832 +        lwz             r2,XLM_RES_LIB_TOC
833 +        mtctr   r0
834 +        bctrl
835 +        lwz             r2,XLM_TOC              // Get TOC
836 +        stw             r3,56+8(r1)             // Save handle
837 +
838 +        // Call CheckLoad
839 +        lwz             r3,56(r1)
840 +        lwz             r4,56+4(r1)
841 +        lwz             r5,56+8(r1)
842 +        bl              named_check_load_invoc
843 +        lwz             r3,56+8(r1)             // Restore handle
844 +
845 +        // Return to caller
846 +        lwz             r0,56+12+8(r1)
847 +        mtlr    r0
848 +        addi    r1,r1,56+12
849 +        blr
850 + }
851 +
852 + static asm void **get_1_named_resource(register uint32 type, register uint32 name)
853 + {
854 +        // Create stack frame
855 +        mflr    r0
856 +        stw             r0,8(r1)
857 +        stwu    r1,-(56+12)(r1)
858 +
859 +        // Save type/ID
860 +        stw             r3,56(r1)
861 +        stw             r4,56+4(r1)
862 +
863 +        // Call old routine
864 +        lwz             r0,XLM_GET_1_NAMED_RESOURCE
865 +        lwz             r2,XLM_RES_LIB_TOC
866 +        mtctr   r0
867 +        bctrl
868 +        lwz             r2,XLM_TOC              // Get TOC
869 +        stw             r3,56+8(r1)             // Save handle
870 +
871 +        // Call CheckLoad
872 +        lwz             r3,56(r1)
873 +        lwz             r4,56+4(r1)
874 +        lwz             r5,56+8(r1)
875 +        bl              named_check_load_invoc
876 +        lwz             r3,56+8(r1)             // Restore handle
877 +
878 +        // Return to caller
879 +        lwz             r0,56+12+8(r1)
880 +        mtlr    r0
881 +        addi    r1,r1,56+12
882 +        blr
883 + }
884   #else
885   // Routines in asm_linux.S
886   extern "C" void get_resource(void);
# Line 767 | Line 888 | extern "C" void get_1_resource(void);
888   extern "C" void get_ind_resource(void);
889   extern "C" void get_1_ind_resource(void);
890   extern "C" void r_get_resource(void);
891 + extern "C" void get_named_resource(void);
892 + extern "C" void get_1_named_resource(void);
893   #endif
894  
895   void PatchNativeResourceManager(void)
# Line 860 | Line 983 | void PatchNativeResourceManager(void)
983          WriteMacInt32(tvec, (uint32)r_get_resource);
984   #endif
985   #endif
986 +
987 +        // Patch native GetNamedResource()
988 +        upp = ReadMacInt32(0x1484);
989 +        tvec = ReadMacInt32(upp + 5 * 4);
990 +        D(bug(" GetNamedResource() entry %08x, TOC %08x\n", ReadMacInt32(tvec), ReadMacInt32(tvec + 4)));
991 +        WriteMacInt32(XLM_GET_NAMED_RESOURCE, ReadMacInt32(tvec));
992 + #if EMULATED_PPC
993 +        WriteMacInt32(tvec, NativeFunction(NATIVE_GET_NAMED_RESOURCE));
994 + #else
995 + #ifdef __BEOS__
996 +        tvec2 = (uint32 *)get_named_resource;
997 +        WriteMacInt32(tvec, tvec2[0]);
998 +        WriteMacInt32(tvec + 4, tvec2[1]);
999 + #else
1000 +        WriteMacInt32(tvec, (uint32)get_named_resource);
1001 + #endif
1002 + #endif
1003 +
1004 +        // Patch native Get1NamedResource()
1005 +        upp = ReadMacInt32(0x0e80);
1006 +        tvec = ReadMacInt32(upp + 5 * 4);
1007 +        D(bug(" Get1NamedResource() entry %08x, TOC %08x\n", ReadMacInt32(tvec), ReadMacInt32(tvec + 4)));
1008 +        WriteMacInt32(XLM_GET_1_NAMED_RESOURCE, ReadMacInt32(tvec));
1009 + #if EMULATED_PPC
1010 +        WriteMacInt32(tvec, NativeFunction(NATIVE_GET_1_NAMED_RESOURCE));
1011 + #else
1012 + #ifdef __BEOS__
1013 +        tvec2 = (uint32 *)get_1_named_resource;
1014 +        WriteMacInt32(tvec, tvec2[0]);
1015 +        WriteMacInt32(tvec + 4, tvec2[1]);
1016 + #else
1017 +        WriteMacInt32(tvec, (uint32)get_1_named_resource);
1018 + #endif
1019 + #endif
1020   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines