From 5461cac9273fa79c264605a97df4e06362a08111 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Thu, 16 Jul 2020 02:27:38 -0400 Subject: [PATCH] New format routine, removed postBoot --- bin/driver.bin | Bin 1771 -> 1673 bytes bin/rom.bin | Bin 2097152 -> 2097152 bytes rdisk.c | 65 +++++++++++++++++++++++-------------------------- rdisk.h | 60 +++++++++++++++++---------------------------- 4 files changed, 52 insertions(+), 73 deletions(-) diff --git a/bin/driver.bin b/bin/driver.bin index e70c6111a15aa71892ed830a5b4db180316e05dd..071952e72c17660720dc101e62dafc979e30d948 100755 GIT binary patch delta 961 zcmY*XZ%7ki82{bv)EQ@9QaM8A>#^qigA-#gMB+BZ&cmh#5<$TQb*E->loLN3ZGuMn zC3R9#Ao~yn1z{yoUt)c&kf@M8L_!3SL5n^JMYNvVl!_M~p1;56d7t0&rEI!vHW<0t zz3xIRu6{!1B#QWdElzVRT`t62ZH^@lfWtmx=XQlKKWDL)W0%!WRq(q5rS+(`DWg1+ zMY$xUPe@5tBzLg(bkko?_d3FJ@B7Pqw`At7Rk2%3n#WTLSDk1K**Q1(Jr0BrQXsZ8 zz!QpKXUGg!^I*uDGe(y{j%cZYz?_a^)BNBjl>&`G)92+Z9^3^ zL2lPqm^7YKFdM{M>J*u&lDfu0$^t(=5b4QI02ol*#d2JVI3ywxdUZv0E e&)<8%hL`BBE6{y_=%z!koW22qv^m?G_0wlzD6DOM~r8p%1H1J{8f>#~4Z>z2TN3)`E0<{)y5uaOT`^-}x6i ze(U&1FWo))NP<(bw$M0-9TWeTgpfnkfc;+Q%Lw_&&44*(Ew7`^GKk9T z5)zT)R6ZC#G4<|+(!|7x*{Qknz}e-#kYc4$6OyV%Z>cq=L)9)pi6e6V>2KaWUCn%< zvBV(@U3Sf%jRx2SbfwE@mvi3%Qi7d%W0_4t40fzN2RzdpFNCcG#6l(ux=NH%FLWv6fTQ^ zkdo{#p`E#7&0BY@n$>8``-WXqZu`LPd?+ZIs+Ar-Z~Y9gqLBEp{+F;PeQ*?7kg^OG z8aIF_XJ#SVGDSqhNw!2)KCNd(y_!^Y?Bi8Ts?#m-fszmfhzZj9oiDAk!kpl4m~fw& zFeUOT9t=?fpy|U%0YpjChk3PlIcZ*TtOdXoFCdd7gX*Sm_@^T3L7@Epgj}g%{SV$sz1isAX?Nn*obg)5~Ob zJjyZh(GCKneY(;o_f7)*hYKWgYrnX}jCF(+8A9@;2;j-I4YkUt@{bNz&oo z3x1-omEe1#9|!A1-*+lYF}~&5sdwl^G1hD~tSz;eCVaoy#@DW|N&_7sM&fS;CZhVL z^h$LE>-25lnPQ;iUsH^BoshW~G~Hpo6aOhu(ffm=?*D3j1vN8FVBobT)X~4`@Y32e zZI53-cVMvBqui!Q>DBmPS$<#})FTAy Tkr-4CH(yrk&95KJp9%j0HGmhL diff --git a/bin/rom.bin b/bin/rom.bin index 21b96d7f227d253a97523f1741107120cf668ceb..1003a197d570c1a0cb307559f67a01da55aa0ee7 100755 GIT binary patch delta 1195 zcmY+De`p(J7{|YNxoa=;*4}Ej#+fE>kJuk+)|QS!8Ed&@V_uJ%c7r0a38%QbwT&gz zw)Br$;rlljCxHE|3#e#P^z$*M~O(NYCmIQF;X;|KEr+{K!s+pd>c;e{z8I>8$O%IC-n7=m>+zaAC47bK+{P1MzEA@BltiHh5bzvf>v&&_d^OQ&Ey zYIEQM)uL*}ua-`Kp`D9>cFh@r-O%UYD%74h1ZWI2AHksOYH-wX|tZv~rx zvVLJfjYE+a5dt#6QhNe1Ikyv?_jBLocCvE~3Dn9Qc3qQYnOfql1hvu5jz1|?!vyt+xx%Ev7^5TP-_8C) zMQ&!-$QHBr$=*oMUaBZJIz9gSX&S~z*>g#~LorfrrK(&iKiwjBES$$+<#z=sytCt1 zSN?C;u!irkC2L69^RgD~CWT7bvU$vi)7T!7<*h%A8({V(J+kN zRlyIE;Pe!-{^-2St&%Ff%e}gq#R1Lx>cAvo-u;0|B)kXYcX>aOW!^oqVejtPWqryk zP9w^tzr^Zb)QS%{;JxL63?Z1ndO{)g5DmoBL?f}6*he%GA>tWgKk+OPCYp)Jt&_3n2S5A++R098 delta 1202 zcmYk5acCP=9LK+x%e6^&i`SU8*=&=SGt1hv3mG<1wPha*ClYrDFI zYKn}*q?qAW)Pl%TCTRWi9zu`HH!N)~k?a|8EHnw~FfSoOq2}@*D*0 zF9n`@c>io{4@oR<)Y2NdOr2UUy9i%1pRc?(b8PiURLeipu$8Y|b@P}mpS!?wFn7Y)VKXts<`LqdZ3utF3*jUp zB?x1EJaD8x3049&t*lU4TvoEe8y-Lii`M5*Pu(+D%zI|dY_(Qw-O9>0ZQy3w5oA?S zbKgGh`~# zHE4a}?rGhVKA=s+(w3EMe95GNqZ`cUt`apA@0WihzxDFh)P7Ljr1sr>W!06qur&V~ z-BV1rJ1uiZ$;L_ITe}iljc`mF+3R4^{nlZi*(k)Mebq^9(zk_2vW}enmaO|VQs;iT zU7X-$vHzmhQ~I4tZ~tO^0VOd(dffG{bilK*i4;xyY#D}AAdOL zqf~TyXm3K-{Mw%Uhi+=yeAm)e@niZ&?e#!93E6C=9dtLf;%ei!m=ry6Bj)IrpP$5_ zyUJtt#2k7Q3fb?wypostBoot) { - *unmount = 0; // Don't unmount - *mount = 0; // No need to post event since it's already been done - *ram = 0; - } else if (RDiskIsRPressed()) { // R boots from ROM disk + if (RDiskIsRPressed()) { // R boots from ROM disk *unmount = 0; // Don't unmount so we boot from this drive *mount = 0; // No need to mount later since we are boot disk *ram = RDiskIsAPressed(); // A enables RAM disk @@ -23,12 +20,12 @@ static void RDiskDecodeSettings(RDiskStorage_t *c, Ptr unmount, Ptr mount, Ptr r char legacy_startup, legacy_ram; RDiskReadXPRAM(1, 4, &legacy_startup); RDiskReadXPRAM(1, 5, &legacy_ram); - if (legacy_startup & 1) { + if (legacy_startup & 1) { // Boot from ROM disk *unmount = 0; // Don't unmount so we boot from this drive *mount = 0; // No need to mount later since we are boot disk *ram = legacy_ram & 1; - } else if (legacy_startup & 2) { - *unmount = 1; // Unmount to not boot from ouur disks + } else if (legacy_startup & 2) { // Mount ROM disk + *unmount = 1; // Unmount to not boot from our disk *mount = 1; // Mount in accRun *ram = legacy_ram & 1; } else { @@ -40,6 +37,7 @@ static void RDiskDecodeSettings(RDiskStorage_t *c, Ptr unmount, Ptr mount, Ptr r } // Switch to 32-bit mode and copy +#pragma parameter RDiskCopy24(__A0, __A1, __D0) void RDiskCopy24(Ptr sourcePtr, Ptr destPtr, unsigned long byteCount) { char mode = true32b; SwapMMUMode(&mode); @@ -83,23 +81,23 @@ OSErr RDiskOpen(IOParamPtr p, DCtlPtr d) { drvNum = RDiskFindDrvNum(); // Set drive status - c->status.track = 0; + //c->status.track = 0; c->status.writeProt = -1; // nonzero is write protected c->status.diskInPlace = 8; // 8 is nonejectable disk c->status.installed = 1; // drive installed - c->status.sides = 0; // drive installed - c->status.qType = 1; + //c->status.sides = 0; + //c->status.qType = 1; c->status.dQDrive = drvNum; - c->status.dQFSID = 0; + //c->status.dQFSID = 0; c->status.dQRefNum = d->dCtlRefNum; c->status.driveSize = RDiskSize / 512; - c->status.driveS1 = (RDiskSize / 512) >> 16; + //c->status.driveS1 = (RDiskSize / 512) >> 16; - #ifdef RDISK_COMPRESS_ICON_ENABLE // Decompress icon + #ifdef RDISK_COMPRESS_ICON_ENABLE char *src = &RDiskIconCompressed[0]; char *dst = &c->icon[0]; - UnpackBits(&src, &dst, 285); + UnpackBits(&src, &dst, RDISK_ICON_SIZE); #endif // Add drive to drive queue and return @@ -107,12 +105,11 @@ OSErr RDiskOpen(IOParamPtr p, DCtlPtr d) { return noErr; } +// Init is called at beginning of first prime (read/write) call static void RDiskInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { char unmountEN, mountEN, ramEN; - // Mark init done c->initialized = 1; - // Decode settings RDiskDecodeSettings(c, &unmountEN, &mountEN, &ramEN); @@ -148,14 +145,12 @@ static void RDiskInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { } // Unmount if not booting from ROM disk - if (unmountEN) { - c->status.diskInPlace = 0; // 0 == no disk in drive - } + if (unmountEN) { c->status.diskInPlace = 0; } // If mount enabled, enable accRun to post disk inserted event later if (mountEN) { - d->dCtlFlags |= dNeedTimeMask; // Enable accRun d->dCtlDelay = 150; // Set accRun delay (150 ticks is 2.5 sec.) + d->dCtlFlags |= dNeedTimeMask; // Enable accRun } } @@ -211,25 +206,25 @@ OSErr RDiskControl(CntrlParamPtr p, DCtlPtr d) { c = *(RDiskStorage_t**)d->dCtlStorage; // Handle control request based on csCode switch (p->csCode) { + case killCode: + return noErr; case kFormat: - if (!c->status.diskInPlace || c->status.writeProt || !c->ramdisk) { - return controlErr; - } - long zero[16]; - zero[0] = 0; - for (int i = 0; i < 256; i++) { - if (*MMU32bit) { BlockMove(zero, c->ramdisk, sizeof(zero)); } - else { copy24((Ptr)zero, c->ramdisk, sizeof(zero)); } + if (!c->status.diskInPlace || c->status.writeProt || + !c->ramdisk) { return controlErr; } + long zero[32]; + for (int i = 0; i < 32; i++) { zero[i] = 0; } + for (int i = 0; i < 32; i++) { + copy24((Ptr)zero, c->ramdisk + i * sizeof(zero), sizeof(zero)); } return noErr; case kVerify: if (!c->status.diskInPlace) { return controlErr; } return noErr; - case killCode: - return noErr; case kEject: // "Reinsert" disk if ejected illegally - if (c->installed) { PostEvent(diskEvt, c->status.dQDrive); } + if (c->status.diskInPlace) { + PostEvent(diskEvt, c->status.dQDrive); + } return controlErr; // Eject not allowed so return error case accRun: d->dCtlFlags &= ~dNeedTimeMask; // Disable accRun @@ -254,9 +249,9 @@ OSErr RDiskControl(CntrlParamPtr p, DCtlPtr d) { *(long*)p->csParam = RDiskSize / 512; return noErr; case 2351: // Post-boot - c->postBoot = 1; // Enable post-boot mode + c->initialized = 1; // Skip initialization + d->dCtlDelay = 30; // Set accRun delay (30 ticks is 0.5 sec.) d->dCtlFlags |= dNeedTimeMask; // Enable accRun - d->dCtlDelay = 150; // Set accRun delay (150 ticks is 2.5 sec.) return noErr; default: return controlErr; } @@ -280,7 +275,7 @@ OSErr RDiskStatus(CntrlParamPtr p, DCtlPtr d) { #pragma parameter __D0 RDiskClose(__A0, __A1) OSErr RDiskClose(IOParamPtr p, DCtlPtr d) { - // If dCtlStorage not null, dispose of it and its contents + // If dCtlStorage not null, dispose of it if (!d->dCtlStorage) { return noErr; } RDiskStorage_t *c = *(RDiskStorage_t**)d->dCtlStorage; HUnlock(d->dCtlStorage); diff --git a/rdisk.h b/rdisk.h index 51f3f6c..8340303 100644 --- a/rdisk.h +++ b/rdisk.h @@ -1,60 +1,42 @@ -#ifndef RDTRAPS_H -#define RDTRAPS_H +#ifndef RDISK_H +#define RDISK_H #define RDiskSize (0x00180000L) #define RDiskBuf ((char*)0x40880000) #define BufPtr ((Ptr*)0x10C) #define MemTop ((Ptr*)0x108) #define MMU32bit ((char*)0xCB2) -#define JIODone ((char*)0x8FC) #pragma parameter __D0 RDiskReadXPRAM(__D0, __D1, __A0) -OSErr RDiskReadXPRAM(short numBytes, short whichByte, void *dest) = {0x4840, 0x3001, 0xA051}; +OSErr RDiskReadXPRAM(short numBytes, short whichByte, Ptr dest) = {0x4840, 0x3001, 0xA051}; -// Other definition of RDiskAddDrive with register calling convention -//#pragma parameter __D0 RDiskAddDrive(__D1, __D0, __A0) -//OSErr RDiskAddDrive(short numBytes, short whichByte, void *dest) = {0x4840, 0x3001, 0xA04E}; +#pragma parameter __D0 RDiskAddDrive(__D1, __D0, __A0) +OSErr RDiskAddDrive(short drvrRefNum, short drvNum, DrvQElPtr dq) = {0x4840, 0x3001, 0xA04E}; -OSErr RDiskAddDrive(short drvrRefNum, short drvNum, DrvQElPtr dq) { - __asm__ __volatile__ ( - "clr.l %%D0 \n\t" - "move.w %1,%%D0 \n\t" - "swap %%D0 \n\t" - "move.w %0,%%D0 \n\t" - "movea.l %2,%%A0 \n\t" - ".word 0xA04E \n\t" - : /* outputs */ - : "g"(drvrRefNum), "g"(drvNum), "g"(dq) /* inputs */ - : /* clobbered */); -} - -inline char RDiskIsRPressed() { return *((char*)0x175) & 0x80; } -inline char RDiskIsAPressed() { return *((char*)0x174) & 0x01; } - -void RDiskBreak() = { 0xA9FF }; +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)RDiskCopy24; copy24(s, d, b); } //#define RDISK_COMPRESS_ICON_ENABLE +#define RDISK_ICON_SIZE (285) typedef struct RDiskStorage_s { DrvSts2 status; char initialized; - char installed; - char postBoot; Ptr ramdisk; #ifdef RDISK_COMPRESS_ICON_ENABLE - char icon[285]; + char icon[RDISK_ICON_SIZE]; #endif } RDiskStorage_t; -#define copy24(s, d, b) { RDiskCopy_t copy24 = (RDiskCopy_t)RDiskCopy24; copy24(s, d, b); } - -#define PackBits_Repeat(count) ((-1) * (count - 1)) +#define PackBits_Repeat(count) (-1 * (count - 1)) #define PackBits_Literal(count) (count - 1) +#define RDISK_COMPRESSED_ICON_SIZE (87) #ifdef RDISK_COMPRESS_ICON_ENABLE #include -const char const RDiskIconCompressed[92] = { +const char const RDiskIconCompressed[RDISK_COMPRESSED_ICON_SIZE] = { PackBits_Repeat(76), 0b00000000, /* 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, @@ -77,8 +59,7 @@ const char const RDiskIconCompressed[92] = { 0b00000000, 0b00000000, 0b00000000, 0b00000000, */ PackBits_Repeat(4), 0b11111111, /* 0b11111111, 0b11111111, 0b11111111, 0b11111111, */ - PackBits_Literal(40), - 0b11111111, 0b11111111, 0b11111111, 0b11111111, + PackBits_Literal(36), 0b10000000, 0b00000000, 0b00000000, 0b00000001, 0b10001111, 0b00011110, 0b00111100, 0b01111001, 0b10001001, 0b00010010, 0b00100100, 0b01001001, @@ -122,20 +103,23 @@ const char const RDiskIconCompressed[92] = { 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, */ - PackBits_Literal(8), - 0b01111111, 0b11111111, 0b11111111, 0b11111111, - 0b01111111, 0b11111111, 0b11111111, 0b11111111, + PackBits_Literal(1), 0b01111111, + PackBits_Repeat(3), 0b11111111, /* + 0b01111111, 0b11111111, 0b11111111, 0b11111111, */ + PackBits_Literal(1), 0b01111111, + PackBits_Repeat(3), 0b11111111, /* + 0b01111111, 0b11111111, 0b11111111, 0b11111111, */ PackBits_Repeat(12), 0b00000000, /* 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, */ - (29 - 1), + PackBits_Literal(29), 27, 'G', 'a', 'r', 'r', 'e', 't', 't', '\'', 's', ' ', 'W', 'o', 'r', 'k', 's', 'h', 'o', 'p', ' ', 'R', 'O', 'M', ' ', 'D', 'i', 's', 'k', 0 }; #else -const char const RDiskIcon[285] = { +const char const RDiskIcon[RDISK_ICON_SIZE] = { // Icon 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000,