From 19bf5c98fedff6fc77df2e11f5f0862293536343 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Thu, 1 Apr 2021 03:46:40 -0400 Subject: [PATCH] New strategy for patching ROM disk debug/CD --- bin/driver7M5.bin | Bin 1817 -> 1837 bytes bin/rom8M.bin | Bin 8388608 -> 8388608 bytes rdisk.c | 40 ++++++++++++++++++++-------------------- rdisk.h | 8 +++++--- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/bin/driver7M5.bin b/bin/driver7M5.bin index 12c3eb8374fe6f50f5804349d547ce89cb7c6b6d..fef9a0b225a25f14859fbec44e771afe9cdffbdc 100755 GIT binary patch delta 776 zcmYjNK}Zx)82;YOtZv(2!{AD6Hv1Y@+ty`AB53I}&Pt4f$ab*o5Ka^`1yX~gY_hN; zY8V76mJ~?rF@qplFLr6|&>q~%4+ykQWo zf1Ag^nE4IWs|YRqkH~`n*=oJUe+iIy0|YUr<)0(HFnzH!l{l^%0SUjt2g*EU{T;`*t zV6No@Q9Gi&NJMpXSkFQ0R&&x^f9t!tl@(tx)6?!E5mia;+1%Zm1!$IpcV?S>KtQE> zEmm2--bU|t^nrQ>Q>R6pY04QR1uotc7qk@Uz?wdzbLc6%XM zn8aoXgY6+ml7O@1iy9 z=hP9<+Ab6-&|En~nNDTSkCP{LNT+&`G;|gep@+(Ysvc+>;akklJ3AKJg_E{?H%a$@ tYNCRAB4@ACaCwk2i<+}HystL?yz@S=v+8|j=j%#JI7WzHIUm|2e*rR+(BJ?7 delta 675 zcmZutO=uHQ7@W6ngHb{#B`Hf{;$ul9)RGjb54(U#P=}>bam%VDQ9-l%>C6CsmQwi

+Z=MbXo*};b=op%NFYnC3YF93WMTp_UmazDmrKaUF!H|cs|~O;I)MW| z0wE7<$px@}Dm-burH9wBJ;FEef^X>!q!2doyEz8FiNHBxjk=t>)HPBjHsRNss$lM_ z)cjF&(fxP@Rc>Z;Kb1x_;1-krGW~i+`~UTf_MqNncl1F&qs<>~vxCl}tT2&fjpy!5 z6MGs@PxIJY(D_#RDZOeD`InM|32S>)br~m)} diff --git a/bin/rom8M.bin b/bin/rom8M.bin index 2a3571d8cfb1d8d0123a8911cc16de14ba16b4ee..c8cc38dbcbc8f6af9edeca3a295f4a9f25f35eb0 100755 GIT binary patch delta 1293 zcmYk&QEU@+90%~<|E{-{QsAiT#IjxgJ8z@wYC937Oo7{V=At5n566g2YAwGQW?)Urue)s$T z|E}x$Tu+&mg|b-o%}ZBX4JHiS5ovJ3yie7AB%S|%#Ljq8POYzre|b^x05OW#EC1_A z%spzAc9mu_>o*YXnN0<>BNUu}OypS6B5E6ZA5x<%SN6)Tl_J>=@nibQ)^E66dw(B3 z>nG$xOZf{+`Ac5@X{R{HK)xR zKf8`@rGr<|^j&w61yxz?z4dtU6cJA||J_p!E|HI}RYxP&ZtQR7r`!99=L@FJi#lp5 zNh3}|v?1zC#fcC8pr2H-*;z|;#!FZbEy+Hd|7qY(OToJ`8E5bl?!q5RQ8Y)3@d)8e z0&>g=c{%T-Q*4su8CH`9%RMrr+~2jxXfG1BQXj6?zUy144Q)bw!IGTN#v+|3wY!Vv zI=Qq;Se%;c;gVXSbFl$yaIIgeT_pcr4o=tN$xwnCgNy{bM;#+xyA6f=c&3u% zs8iAT+w?k}&@ZJFFW_g98E zTGUMLX8vA|{`n>UE1uQ-A9((_@NJv4mN9qXx+>jbUtQEBXn;oW!!iiKatOi-SP82@ zhSd;)XP^nf&d9hc-~*dC;I8I$#~dpcCTI1qpZol8}OKcoEja zORxc6hF4%Cq+t{Ez^m{YY=$kc6?EtY12WJD+u(J015D@#3%0`m?0`Xd6SA-q-h#K` z9T(a0tfW6F3YW|PY?;IDiZEeT zDNBi%n9V2Z!)E$mVq(l<(1iFT7~{hp7XM{0KJ3NB#4OPmVq#*P-)q6_!H3VoIlps$ zIp>s0C2z@9R%N5?DSJONmm(?oVBo4pvQzfYvT|6=GdD)6(~WXg?agz^jr?PxB$VIs zUq`UA7BNRRFAVpkPdYO@yQQ)eH9wvW?rF2P_3L92_~b8YP>_EhS%85vA{x_Y!nzunp|+L^YKx|m!LsdlE?#c))bIcpQ>p>KZ?UG2OfcYY(6 z@fN()dorHNH`)vtYP51qn^r>YZtIYkzbw-t?AK;(m-_F@{<-xy*w7)H{7Q_x$YpC> zbZs!XSV^{+TW94;J$LX4_w)tg63)rr3r)gZ405W_;O5+Gol?`vQM|sBGIDDvPww{# zH+sLdC?%Tp;GfC)Xu#dg`ZrVCFuVBw8)g^RH$3hhetpI4A|GDSb=46osl7U#{oMUB zC)aJp_vGdJaE5c`yECOim)=;!r@dC18cX}CBbq*V@>E;ikoo`);nYam?;6oiY<7W7A3%1}^ z)Z;cZ;C2Mih$h^DAnrs6VQfVNQ8YuN1s3i?46WFPyU~Vw(2nisz`bzijH3%XuoL&8 z8@sR@_alJ^um=y~Av}y8>_rm2NFj|rJc38@7;N+-gU2y|L1gg+hOiIAcoI)x1f$rG z19%$G;8`5Rb9f$yki%iTfFn4H7m-H+V>pJFa2(@!87FWO4qm|oUd1G)a0;(s8Z$VJ R*HOe9cysweZ1%{H{{ZIShPVI# diff --git a/rdisk.c b/rdisk.c index 17973f1..51a7b29 100644 --- a/rdisk.c +++ b/rdisk.c @@ -36,7 +36,7 @@ static void RDDecodeSettings(Ptr unmountEN, Ptr mountEN, Ptr ramEN, Ptr dbgEN, P } } - // MacsBug enabled if bit 3 == 1 or DBGDis addr invalid or not boot + // MacsBug enabled if bit 2 == 1 or DBGDis addr invalid or not boot *dbgEN = *unmountEN || (legacy_startup & 0x04) || (*RDiskDBGDisPos == 0); @@ -48,14 +48,25 @@ static void RDDecodeSettings(Ptr unmountEN, Ptr mountEN, Ptr ramEN, Ptr dbgEN, P } // Switch to 32-bit mode and copy -#pragma parameter RDCopy24(__A0, __A1, __D0) -void RDCopy24(Ptr sourcePtr, Ptr destPtr, unsigned long byteCount) { +#pragma parameter C24(__A0, __A1, __D0) +void C24(Ptr sourcePtr, Ptr destPtr, unsigned long byteCount) { signed char mode = true32b; SwapMMUMode(&mode); BlockMove(sourcePtr, destPtr, byteCount); SwapMMUMode(&mode); } +// Switch to 32-bit mode and patch +void P24(Ptr ramdisk, char dbgEN, char cdromEN) { + if (!ramdisk) { return; } + signed char mode = true32b; + SwapMMUMode(&mode); + // Patch debug and CD-ROM disable bytes + if (!dbgEN) { ramdisk[*RDiskDBGDisPos] = *RDiskDBGDisByte; } + if (!cdromEN) { ramdisk[*RDiskCDROMDisPos] = *RDiskCDROMDisByte; } + SwapMMUMode(&mode); +} + // Figure out the first available drive number >= 5 static int RDFindDrvNum() { DrvQElPtr dq; @@ -126,8 +137,6 @@ static void RDInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { c->dbgEN = dbgEN; c->cdromEN = cdromEN; - char dis = 0x44; - // If RAM disk enabled, try to allocate RAM disk buffer if not already if (ramEN & !c->ramdisk) { if (*MMU32bit) { // 32-bit mode @@ -144,33 +153,24 @@ static void RDInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { BlockMove(RDiskBuf, c->ramdisk, RDiskSize); // Clearing write protect marks RAM disk enabled c->status.writeProt = 0; - - // Patch debug and CD-ROM enable bytes - BlockMove(&c->ramdisk[*RDiskDBGDisPos], &dis, 1); - BlockMove(&c->ramdisk[*RDiskCDROMDisPos], &dis, 1); } } else { // 24-bit mode // Put RAM disk just past 8MB c->ramdisk = (Ptr)(8 * 1024 * 1024); // Copy ROM disk image to RAM disk - copy24(RDiskBuf, c->ramdisk, RDiskSize); - // Clearing write protect marks RAM disk enabled - c->status.writeProt = 0; //FIXME: what if we don't have enough RAM? // Will this wrap around and overwrite low memory? // That's not the worst, since the system would just crash, // but it would be better to switch to read-only status - // Patch debug and CD-ROM enable bytes - copy24(&c->ramdisk[*RDiskDBGDisPos], &dis, 1); - copy24(&c->ramdisk[*RDiskCDROMDisPos], &dis, 1); + copy24(RDiskBuf, c->ramdisk, RDiskSize); + // Clearing write protect marks RAM disk enabled + c->status.writeProt = 0; } - // Patch debug and CD-ROM enable bytes - //if (!c->dbgEN) { - //} - //if (!c->cdromEN) { - //} } + // Patch debug and CD-ROM enable bytes + patch24(c->ramdisk, dbgEN, cdromEN); + // Unmount if not booting from ROM disk if (unmountEN) { c->status.diskInPlace = 0; } diff --git a/rdisk.h b/rdisk.h index e947293..efd6492 100644 --- a/rdisk.h +++ b/rdisk.h @@ -19,9 +19,6 @@ OSErr RDiskAddDrive(short drvrRefNum, short drvNum, DrvQElPtr dq) = {0x4840, 0x3 static inline char RDiskIsRPressed() { return *((char*)0x175) & 0x80; } static inline char RDiskIsAPressed() { return *((char*)0x174) & 0x01; } -typedef void (*RDiskCopy_t)(Ptr, Ptr, unsigned long); -#define copy24(s, d, b) { RDiskCopy_t copy24 = (RDiskCopy_t)RDCopy24; copy24(s, d, b); } - //#define RDISK_COMPRESS_ICON_ENABLE #define RDISK_ICON_SIZE (285) typedef struct RDiskStorage_s { @@ -35,6 +32,11 @@ typedef struct RDiskStorage_s { #endif } RDiskStorage_t; +typedef void (*RDiskCopy_t)(Ptr, Ptr, unsigned long); +#define copy24(s, d, b) { RDiskCopy_t copy24 = (RDiskCopy_t)C24; copy24(s, d, b); } +typedef void (*RDiskPatch_t)(Ptr, char, char); +#define patch24(s, d, b) { RDiskPatch_t patch24 = (RDiskPatch_t)P24; patch24(s, d, b); } + #define PackBits_Repeat(count) (-1 * (count - 1)) #define PackBits_Literal(count) (count - 1)