From a44f8668e97b53446db3c3bc659f0d30a7394483 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Fri, 26 Jun 2020 05:21:49 -0400 Subject: [PATCH] Fixed some bugs regarding ramdisk mode --- bin/driver.bin | Bin 1428 -> 1542 bytes bin/rom.bin | Bin 2097152 -> 2097152 bytes rdisk.c | 20 ++++++++++++-------- rdisk.h | 1 + 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/bin/driver.bin b/bin/driver.bin index 2b43aed49e90fc795ea8acdd044c93f1cf3d121e..b5551d7e46578011a83f9c441857b28f07a63130 100755 GIT binary patch delta 728 zcmaJ;O=uHA6#n){P3uyF4H!yk$2D%kHe^e+lH-`>un8rGLNA`yVw0w=A=CzX2qcjz z(NiVGg9ph$gw`Tydh*nGk?K_`#Y@0TMMX;wJr&otTLis$c=OHo-kbM*GqZa3fwD4r zWnsJ{AyqW@(Y^(7!(oD9!^<(%&G)UP7hNVnfiA)RgJ=L;+zj3%sSA$d&{}E!kgy4?8R>cs|!oR{$AX z?TNNoG28LV`KZz|tLB?_H7jrJOtWE~%A8@8LmsVH#oqG8cY+d3KrQ%9&Pu!nG$I#D zvLUpYr!_c#$dYxp$BF8y}L!jzYLdn4-r*&ED+FkbQIHLd}@fAWT102$6(Zwod z58PR#|2;`>M2QyD5m3j-DQiTW{bi2OUL_cZmkq&7EJE&qSB7GA8QrPZ{Qlt88$Y2q zqV`Ryte%*(U{8hU1mRLhM})B8@V#|+f7{j5T(w!085{eL9H%zcm~1>Y$dCa;a%2bM zj;!_mpPFRguNrJlpCQKhc&Fc=Di%IkM-+z?KT^dBWAcBC5A#bDJPU%(#8<9fefKZ zh)M)0YC1TD8*A;56c<5gbh2)W6mf}&(9%T*2M6(d7whmo-tT)K|Bv^-Pd83KTDXk4 zp@>YyIKbd0gbj}@`5#G39??7q&gI7bXQU_ncAA`3N}!Pvf~mOc^7E%mqMad0)O}`> zRElfaBM7N2$owcN6{^W2xqv?jkX0M#aZiw|gtD4@2)y58N#g(7_B8+r{lWaeXc&WZ zV?0TBjHdB=(6niPZ^?iDEum2Zaw5iKI>U?(X{LrC@6jVA_oq^-yT3AvnF_0l0hScU zdTm>ojv>60hu>x_>v{b_?gt+b?s*7Q#Rgc*RsiXyce($oSBr&12d&TepDiaTO;ifnZzfio(CXF|6>;mS2m4$6wmv2L?&@v8F|9LK*iv!m-a>84w5rtaI(#$}XUv4lNN>mJ5M)}eihr+rRA`u8(jEXW3(LvgNGZNIL!{>e9@6UVR-@GwRlQS&} zT!AkL1;nINT#O`rtEX?J`fqRM1;3JP96H25LYK*#)E@v3vCR4ym%JFQPljMBm zBk*R6g*oSkxhfNIV7)w4)=j+}HS5FDnm(&PFVChN>s!ODTcxtb(5u1GTm0@58)p2k zIH{u_a@MPBEU(Q0rC?*8=2jz`vCXCh7Yhrut8*!(M}>E71kMy=2`l%coZP1iy{lGE ziY&vE-83FD&G^)l7o1BOHU?$&5J>SQ9~*_I)MmV+J8#5uw}+zX>tp?y^dx4W?|H-R zy3)_m@YwC(qJczg1+Da*3vw4^(nZ-GE!G7!#mg7Swu{$LCu!iQdY@FVG^Wv7P-?ad zZWYxMz*BsOR7e5`begwyma_ZyUF82IMvp{^HKw9n?xRUrDQNA_Y6$F@9Z|ShC)^YT zX?oysND9@2T=8exP2c&!Z;&k0$|b5S91UrpawR|~NT&lTf}~k1-dVQyS8YGVb{oYE zV}1Xz)2NM=E|%_wXrK^6f@RwpwQP;o|I~yK{;Hv((a+!`+Q4qJH=fJBHGU8W#MgLk z-hTeXMEcq=it~Q4nO~|D7yaTUcUVly;)7dLZ6Z-cR1;33hHw$b2#GjO)Dm@sn>az# g6AgriI7yr$8VN6PnrI@<5Y0pj(Yi6!=9_>28^(b3uK)l5 delta 873 zcmXxiPiWI{6bJC{Fa5J@i?i0L@z2)ZvMr8In=%D^Pzkk%SVkPvi3gDgqj9d5q84_T zYep+h5Qien)9BGZJ9HupMYIaS^rpxdB1}Y>h@glE4`O_&diXs0ULWs~mpG2Y98Z~* zg|e^gzaMzswhR3$K9~h#6}6KPZg`oc{LTEsUM8Ia!{w({w*e*IOKm#G9v%KY;|S3n zy({PbP;*81r+LCG@G)N#PxxA@Q?}aI3;EtDh&JZ~UTwaX`9=fes#lYechQ=EVm;%! z^|^1{C*IES(@?9w09&X;_$XQ{oz~l=ZdJ^}<-yd*xzU5Uk@JADD#yDF^&lTXYrPwI z&j-@QTWGgW#G}|D=vXW1V0MT{>$dlr8B@> zIEn^|L9q8y^wG^KNxgqXlFfo9YK>Zx`9QxI*?s6MB$|BH`l$9IWX%@UC}P%4FIl=n zzpnQ9f@OUQNYg28ML7-5Q6hX&2>t!Ynr zYpj=aC%6;&Wr}0zH|hlGqMtR!mi9LD}mXf_d<+SChyk}PSA%z}B;trAOgEHf?XqW2f#u+DDnYI5chK-0E3G7)==7A4y*-bp}X~G!T(Ak|xqjB(jFI mkhLU4){!t-Pg=ramdisk = *BufPtr; + // Copy ROM disk image to RAM disk + BlockMove(RDiskBuf, c->ramdisk, RDiskSize); + c->ramdisk_valid = 1; + } else { + // Enable accRun to allocate and copy later + d->dCtlFlags |= dNeedTimeMask; + d->dCtlDelay = 0x10; } - // Enable accRun to allocate and copy later - d->dCtlFlags |= dNeedTimeMask; - d->dCtlDelay = 0x10; } return noErr; } else { // Otherwise if R not held down and ROM boot not set in PRAM, // Remove our driver from the drive queue DrvQElPtr dq; - QHdrPtr QHead = (QHdrPtr)0x308; + QHdrPtr QHead = DrvQHdr; // Loop through entire drive queue, searching for our device or stopping at the end. dq = (DrvQElPtr)QHead->qHead; @@ -157,7 +161,7 @@ OSErr RDiskPrime(IOParamPtr p, DCtlPtr d) { } // Get pointer to RAM or ROM disk buffer - disk = RDiskBuf; // c->ramdisk && c->ramdisk_valid ? c->ramdisk : RDiskBuf; + disk = c->ramdisk && c->ramdisk_valid ? c->ramdisk : RDiskBuf; // Add offset to buffer pointer according to positioning mode switch (p->ioPosMode & 0x000F) { case fsAtMark: offset = d->dCtlPosition; break; @@ -167,9 +171,9 @@ OSErr RDiskPrime(IOParamPtr p, DCtlPtr d) { } disk += offset; // Bounds checking - if (offset >= RDiskSize || p->ioReqCount >= RDiskSize || + /*if (offset >= RDiskSize || p->ioReqCount >= RDiskSize || offset + p->ioReqCount >= RDiskSize || - disk + offset < disk) { return posErr; } + disk + offset < disk) { return posErr; }*/ // Service read or write request cmd = p->ioTrap & 0x00FF; @@ -191,7 +195,6 @@ OSErr RDiskPrime(IOParamPtr p, DCtlPtr d) { p->ioPosOffset = d->dCtlPosition; return noErr; } else if (cmd == aWrCmd) { // Write - return wPrErr; // Fail if write protected or RAM disk buffer not set up if (c->drvsts.writeProt || !c->ramdisk || !c->ramdisk_valid) { return wPrErr; } // Write from buffer into disk. @@ -213,6 +216,7 @@ OSErr RDiskAccRun(CntrlParamPtr p, DCtlPtr d, RDiskStorage_t *c) { // Disable accRun d->dCtlDelay = 0; d->dCtlFlags &= ~dNeedTimeMask; + RDiskBreak(); // Set RAM disk buffer if our disk is writable and no RAM buffer set if (!c->drvsts.writeProt && !c->ramdisk) { diff --git a/rdisk.h b/rdisk.h index 3feca3c..aa43b96 100644 --- a/rdisk.h +++ b/rdisk.h @@ -7,6 +7,7 @@ #define MemTop ((Ptr*)0x108) #define MMU32bit ((char*)0xCB2) #define JIODone ((char*)0x8FC) +#define DrvQHdr ((QHdrPtr)0x308) #pragma parameter __D0 RDReadXPRAM(__D0, __D1, __A0) OSErr RDiskReadXPRAM(short numBytes, short whichByte, void *dest) = {0x4840, 0x3001, 0xA051};