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.13 by gbeauche, 2004-12-19T09:26:30Z vs.
Revision 1.17 by gbeauche, 2006-05-03T21:45:14Z

# Line 1 | Line 1
1   /*
2   *  rsrc_patches.cpp - Resource patches
3   *
4 < *  SheepShaver (C) 1997-2004 Christian Bauer and Marc Hellwig
4 > *  SheepShaver (C) 1997-2005 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
# 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 554 | Line 560 | void CheckLoad(uint32 type, int16 id, ui
560                          p[(base + 0x06) >> 1] = htons(0x0020);
561                          D(bug(" patch 2 applied\n"));
562                  }
563 +
564 +        } else if (type == FOURCC('C','O','D','E') && id == 27 && size == 25024) {
565 +                D(bug("CODE 27 found [Apple Personal Diagnostics]\n"));
566 +
567 +                // Don't access FCBs directly in Apple Personal Diagnostics (MacOS 9)
568 +                // FIXME: this should not be called in the first place, use UTResolveFCB?
569 +                static const uint8 dat[] = {0x2d, 0x78, 0x03, 0x4e, 0xff, 0xf8, 0x20, 0x6e, 0xff, 0xf8};
570 +                base = find_rsrc_data((uint8 *)p, size, dat, sizeof(dat));
571 +                if (base
572 +                        && ReadMacInt16(0x3f6) == 4 /* FSFCBLen */
573 +                        && p[(base + 0x1a) >> 1] == htons(0x605e)
574 +                        && p[(base + 0x80) >> 1] == htons(0x7000))
575 +                {
576 +                        p[(base + 0x1a) >> 1] = htons(0x6064);
577 +                        D(bug(" patch1 applied\n"));
578 +                }
579          }
580   }
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 +
598 +
599 + /*
600   *  Native Resource Manager patches
601   */
602  
# Line 580 | Line 618 | void check_load_invoc(uint32 type, int16
618   }
619  
620   #ifdef __BEOS__
621 + static
622 + #else
623 + extern "C"
624 + #endif
625 + void named_check_load_invoc(uint32 type, uint32 name, uint32 h)
626 + {
627 +        if (h == 0)
628 +                return;
629 +        uint32 p = ReadMacInt32(h);
630 +        if (p == 0)
631 +                return;
632 +        uint32 size = ReadMacInt32(p - 2 * 4) & 0xffffff;
633 +
634 +        CheckLoad(type, (char *)Mac2HostAddr(name), Mac2HostAddr(p), size);
635 + }
636 +
637 + #ifdef __BEOS__
638   static asm void **get_resource(register uint32 type, register int16 id)
639   {
640          // Create stack frame
# Line 744 | Line 799 | static asm void **r_get_resource(registe
799          addi    r1,r1,56+12
800          blr
801   }
802 +
803 + static asm void **get_named_resource(register uint32 type, register uint32 name)
804 + {
805 +        // Create stack frame
806 +        mflr    r0
807 +        stw             r0,8(r1)
808 +        stwu    r1,-(56+12)(r1)
809 +
810 +        // Save type/ID
811 +        stw             r3,56(r1)
812 +        stw             r4,56+4(r1)
813 +
814 +        // Call old routine
815 +        lwz             r0,XLM_GET_NAMED_RESOURCE
816 +        lwz             r2,XLM_RES_LIB_TOC
817 +        mtctr   r0
818 +        bctrl
819 +        lwz             r2,XLM_TOC              // Get TOC
820 +        stw             r3,56+8(r1)             // Save handle
821 +
822 +        // Call CheckLoad
823 +        lwz             r3,56(r1)
824 +        lwz             r4,56+4(r1)
825 +        lwz             r5,56+8(r1)
826 +        bl              named_check_load_invoc
827 +        lwz             r3,56+8(r1)             // Restore handle
828 +
829 +        // Return to caller
830 +        lwz             r0,56+12+8(r1)
831 +        mtlr    r0
832 +        addi    r1,r1,56+12
833 +        blr
834 + }
835 +
836 + static asm void **get_1_named_resource(register uint32 type, register uint32 name)
837 + {
838 +        // Create stack frame
839 +        mflr    r0
840 +        stw             r0,8(r1)
841 +        stwu    r1,-(56+12)(r1)
842 +
843 +        // Save type/ID
844 +        stw             r3,56(r1)
845 +        stw             r4,56+4(r1)
846 +
847 +        // Call old routine
848 +        lwz             r0,XLM_GET_1_NAMED_RESOURCE
849 +        lwz             r2,XLM_RES_LIB_TOC
850 +        mtctr   r0
851 +        bctrl
852 +        lwz             r2,XLM_TOC              // Get TOC
853 +        stw             r3,56+8(r1)             // Save handle
854 +
855 +        // Call CheckLoad
856 +        lwz             r3,56(r1)
857 +        lwz             r4,56+4(r1)
858 +        lwz             r5,56+8(r1)
859 +        bl              named_check_load_invoc
860 +        lwz             r3,56+8(r1)             // Restore handle
861 +
862 +        // Return to caller
863 +        lwz             r0,56+12+8(r1)
864 +        mtlr    r0
865 +        addi    r1,r1,56+12
866 +        blr
867 + }
868   #else
869   // Routines in asm_linux.S
870   extern "C" void get_resource(void);
# Line 751 | Line 872 | extern "C" void get_1_resource(void);
872   extern "C" void get_ind_resource(void);
873   extern "C" void get_1_ind_resource(void);
874   extern "C" void r_get_resource(void);
875 + extern "C" void get_named_resource(void);
876 + extern "C" void get_1_named_resource(void);
877   #endif
878  
879   void PatchNativeResourceManager(void)
# Line 844 | Line 967 | void PatchNativeResourceManager(void)
967          WriteMacInt32(tvec, (uint32)r_get_resource);
968   #endif
969   #endif
970 +
971 +        // Patch native GetNamedResource()
972 +        upp = ReadMacInt32(0x1484);
973 +        tvec = ReadMacInt32(upp + 5 * 4);
974 +        D(bug(" GetNamedResource() entry %08x, TOC %08x\n", ReadMacInt32(tvec), ReadMacInt32(tvec + 4)));
975 +        WriteMacInt32(XLM_GET_NAMED_RESOURCE, ReadMacInt32(tvec));
976 + #if EMULATED_PPC
977 +        WriteMacInt32(tvec, NativeFunction(NATIVE_GET_NAMED_RESOURCE));
978 + #else
979 + #ifdef __BEOS__
980 +        tvec2 = (uint32 *)get_named_resource;
981 +        WriteMacInt32(tvec, tvec2[0]);
982 +        WriteMacInt32(tvec + 4, tvec2[1]);
983 + #else
984 +        WriteMacInt32(tvec, (uint32)get_named_resource);
985 + #endif
986 + #endif
987 +
988 +        // Patch native Get1NamedResource()
989 +        upp = ReadMacInt32(0x0e80);
990 +        tvec = ReadMacInt32(upp + 5 * 4);
991 +        D(bug(" Get1NamedResource() entry %08x, TOC %08x\n", ReadMacInt32(tvec), ReadMacInt32(tvec + 4)));
992 +        WriteMacInt32(XLM_GET_1_NAMED_RESOURCE, ReadMacInt32(tvec));
993 + #if EMULATED_PPC
994 +        WriteMacInt32(tvec, NativeFunction(NATIVE_GET_1_NAMED_RESOURCE));
995 + #else
996 + #ifdef __BEOS__
997 +        tvec2 = (uint32 *)get_1_named_resource;
998 +        WriteMacInt32(tvec, tvec2[0]);
999 +        WriteMacInt32(tvec + 4, tvec2[1]);
1000 + #else
1001 +        WriteMacInt32(tvec, (uint32)get_1_named_resource);
1002 + #endif
1003 + #endif
1004   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines