From 772bdd28812dc73cac90017f567b83829eff9228 Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Sat, 11 Jul 2020 22:41:51 -0400 Subject: [PATCH] Fixed System 7.5 bug --- Makefile | 2 +- RDisk1M5-6.dsk | Bin 1572864 -> 1572864 bytes baserom.bin | Bin 524288 -> 524288 bytes bin/driver.bin | Bin 1965 -> 1691 bytes bin/rom.bin | Bin 2097152 -> 2097152 bytes entry.s | 6 - rdisk.c | 378 ++++++++++++++++++++++++++++--------------------- rdisk.h | 26 +--- 8 files changed, 225 insertions(+), 187 deletions(-) diff --git a/Makefile b/Makefile index e7ad809..fedc7c9 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ obj/entry_rel.sym: obj obj/entry.o obj/rdisk.o: rdisk.c obj - $(CC) -c -O1 $< -o $@ + $(CC) -c -Os $< -o $@ obj/rdisk.s: obj obj/rdisk.o $(OBJDUMP) -d obj/rdisk.o > $@ diff --git a/RDisk1M5-6.dsk b/RDisk1M5-6.dsk index a5655d662e92e9a0593c4ecd42d4492a90de36f0..0a1e62beee662475fb5d585162335b2ef836e700 100644 GIT binary patch delta 104 zcmZo@NN50}7RDB)7UmX~7S)GgVj=fS`S@iU1G` kZl9|n6sI5v5<&s(Jg!1OEDXdVKr9NxV%vFK#lP$V01Xfu%>V!Z delta 104 zcmZo@NN50}7RDB)7UmX~7S)GgVkT@^e$$=c)(* zvEcT(DnfAzf?lP?C7F2&KBdXosd-6>$rV6d diff --git a/bin/driver.bin b/bin/driver.bin index db6de75f0a2ca5dfeea871294ec1ee50f3fbed2b..ee4e7a63b3e256b97ea28cb2e7b74db4c0bf79da 100755 GIT binary patch literal 1691 zcmb_dO-vg{6#mw0oQ15St>uD65t(cqV}8WCv?!KpCCh@E#ia`cQHazkOA0nWE?yao zNMseG5(#J`gc ze&5WzH{ZVZ%`EWbRyEi&H8%t3w^1AezU|xPVPwjv%J+Z7={7Ru@*F>EBXJTO>f=W$ z9_~$hv?BzMz@a)J#?+KcQ(sUa85t!a>>C*^7gpfWRqEX=1)*RVnGYQfUE||D>8XVY z;7tB#mg4eVd*CIh@RpQg3M4rN(eY@1G(MU)GVeRy-6`vQ$4h{6Sg8s2#y*2Dp0t9W z$V_O`;fv)G3x#Gj17Bd^OuqeVfEU=vXr4{NWmRqM1Mye1!Om<+fU7gh0q#zlK~1L$ zQJaR;(F%WO7mjphMZilVK7AUVQ#i#LU#S-xF_72Pz}etgBhxVn&(_+kn^h0y*nqid z{ciqdWY!#x{no^+{dW3oeS(y2`TZDo|+GTHuPg$@?-{e2k|(FInI8?Kb%B+)}1%({78S zdU1u<3Du>mDo9dLOWEM!f>%MEiPHEm2v?nxY;3b#;1)R=H#E+Cpb;WlJDvqGf~-X0 zr)ouQq(p5lP9_63pZ-0Fw01hiC%oZSqOUTXP~kq2#Yd21#4~}?o2&(L(D9_|x`LqU zN4>Wx-?o4HvRF>HIdJp>SZAM;`CDv5g%(q$pj9cSW^Yq59vj_ROf0 z+Xv3O{9!9Caaa2sQZPzo#_2ssy?>F~1M)Og!PZ=@rLtEG?L+Uy?`bM&MxczSbQdf_ zRjQT4#$_i%Kig5`JLVPoKbqJGw?Nd3;Vcdn6mvb?47W?&ExkzfCFKj?ADjR5SXR9# z-$#Sv?Ml=f%aWcY!j~ND8M0Pvi>6lnrVO+f$e zIB6a=#4CkIiT19PdZxRxGqIx(f==Yggeb z`<1KNolMQy)qL8mL@h_f$TvpMuXzK#mB+?K8Xq41ad@e;RC?O`R^r+FKdCLzr2SOZ eKX-a8ot~JVZ<=Exsr1a;WXfWL{jV|SoAWPe5vw2o literal 1965 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 diff --git a/entry.s b/entry.s index c513a8f..a64a11b 100644 --- a/entry.s +++ b/entry.s @@ -56,11 +56,5 @@ ImmedRTS: rts Queued: - tst.w %D0 - ble.b MyIODone - clr.w %D0 - rts - -MyIODone: move.l JIODone, -(%SP) rts diff --git a/rdisk.c b/rdisk.c index b2c69c8..3f2f3e0 100644 --- a/rdisk.c +++ b/rdisk.c @@ -8,7 +8,90 @@ #include "rdisk.h" -const char RDiskIcon[285] = { +#ifdef RDISK_COMPRESS_ICON +#include +const char const RDiskIconCompressed[92] = { + -1 * (80 - 1), 0b00000000, /* + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, */ + -1 * (4 - 1), 0b11111111, /* + 0b11111111, 0b11111111, 0b11111111, 0b11111111, */ + (40 - 1), + 0b11111111, 0b11111111, 0b11111111, 0b11111111, + 0b10000000, 0b00000000, 0b00000000, 0b00000001, + 0b10001111, 0b00011110, 0b00111100, 0b01111001, + 0b10001001, 0b00010010, 0b00100100, 0b01001001, + 0b10001001, 0b00010010, 0b00100100, 0b01001001, + 0b10001001, 0b00010010, 0b00100100, 0b01001001, + 0b10001111, 0b00011110, 0b00111100, 0b01111001, + 0b11000000, 0b00000000, 0b00000000, 0b00000001, + 0b01010101, 0b01010101, 0b11010101, 0b01010101, + 0b01111111, 0b11111111, 0b01111111, 0b11111111, + -1 * (8 - 1), 0b00000000, /* + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, */ + + -1 * (80 - 1), 0b00000000, /* + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, */ + -1 * (32 - 1), 0b11111111, /* + 0b11111111, 0b11111111, 0b11111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111111, 0b11111111, + 0b11111111, 0b11111111, 0b11111111, 0b11111111, */ + (8 - 1), + 0b01111111, 0b11111111, 0b11111111, 0b11111111, + 0b01111111, 0b11111111, 0b11111111, 0b11111111, + -1 * (8 - 1), 0b00000000, /* + 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00000000, 0b00000000, 0b00000000, 0b00000000, */ + (29 - 1), + 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] = { // Icon 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, @@ -79,35 +162,38 @@ const char RDiskIcon[285] = { 'W', 'o', 'r', 'k', 's', 'h', 'o', 'p', ' ', 'R', 'O', 'M', ' ', 'D', 'i', 's', 'k', 0 }; +#endif -static void RDiskDecodeSettings(RDiskStorage_t *c, char *enable, char* boot, char* mount, char* ram) { - char rKey, aKey, legacy_startup, legacy_ram; - // Read PRAM and keys - RDiskReadXPRAM(1, 4, &legacy_startup); - RDiskReadXPRAM(1, 5, &legacy_ram); - rKey = RDiskIsRPressed(); - aKey = RDiskIsAPressed(); +static void RDiskDecodeSettings(RDiskStorage_t *c, Ptr unmount, Ptr mount, Ptr ram) { // Decode settings if (c->postBoot) { - *enable = 1; - *boot = 1; // Boot set so first access works + *unmount = 0; *mount = 1; *ram = 0; - } else if (rKey) { // R boots from ROM disk - *enable = 1; - *boot = 1; + } else if (RDiskIsRPressed()) { // R boots from ROM disk + *unmount = 0; *mount = 0; - *ram = aKey; // A enables RAM disk - } else if (legacy_startup) { - *enable = 1; - *boot = (legacy_startup & 0xFD) && (legacy_startup != 0xFD); - *mount = !*boot && legacy_startup & 0x02; - *ram = legacy_ram; + *ram = RDiskIsAPressed(); // A enables RAM disk } else { - *enable = 0; - *boot = 0; - *mount = 0; - *ram = 0; + // Read PRAM + char legacy_startup, legacy_ram; + RDiskReadXPRAM(1, 4, &legacy_startup); + RDiskReadXPRAM(1, 5, &legacy_ram); + if (legacy_startup == 1) { + *unmount = 0; + *mount = 0; + *ram = legacy_ram; + } else if (legacy_startup == 2 || legacy_startup == 3 || + legacy_startup == 4 || legacy_startup == 5 || + legacy_startup == 6 || legacy_startup == 7) { + *unmount = 1; + *mount = 1; + *ram = legacy_ram & 1; + } else { + *unmount = 1; + *mount = 0; + *ram = 0; + } } } @@ -119,91 +205,72 @@ void RDiskCopy24(Ptr sourcePtr, Ptr destPtr, unsigned long byteCount) { SwapMMUMode(&mode); } +// Figure out the first available drive number >= 5 +static int RDiskFindDrvNum() { + DrvQElPtr dq; + int drvNum = 5; + for (dq = (DrvQElPtr)(GetDrvQHdr())->qHead; dq; dq = (DrvQElPtr)dq->qLink) { + if (dq->dQDrive >= drvNum) { drvNum = dq->dQDrive + 1; } + } + return drvNum; +} + #pragma parameter __D0 RDiskOpen(__A0, __A1) OSErr RDiskOpen(IOParamPtr p, DCtlPtr d) { - DrvQElPtr dq; int drvNum; - Ptr copy24; RDiskStorage_t *c; + char legacy_startup, legacy_ram; // Do nothing if already opened if (d->dCtlStorage) { return noErr; } - // Figure out first available drive number - drvNum = 1; - for (dq = (DrvQElPtr)(GetDrvQHdr())->qHead; dq; dq = (DrvQElPtr)dq->qLink) { - if (dq->dQDrive >= drvNum) { drvNum = dq->dQDrive + 1; } - } - // Allocate storage struct d->dCtlStorage = NewHandleSysClear(sizeof(RDiskStorage_t)); if (!d->dCtlStorage) { return openErr; } - - // Allocate copy function buffer and copy RDiskCopy24 to it - copy24 = NewPtrSys(64); - if (!copy24) { DisposeHandle(d->dCtlStorage); return openErr; } - BlockMove(&RDiskCopy24, copy24, 64); // Lock our storage struct and get master pointer HLock(d->dCtlStorage); c = *(RDiskStorage_t**)d->dCtlStorage; - // Initialize storage struct fields - //c->initialized = 0; - //c->removed = 0; - //c->postBoot = 0; - //c->ramdisk = NULL; - c->copy24 = (RDiskCopy_t)copy24; + // Find first available drive number + drvNum = RDiskFindDrvNum(); // Set drive status - c->status.writeProt = -1; - c->status.diskInPlace = 8; // 8 means nonejectable disk + 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.dQDrive = drvNum; + c->status.dQFSID = 0; c->status.dQRefNum = d->dCtlRefNum; c->status.driveSize = RDiskSize / 512; c->status.driveS1 = (RDiskSize / 512) >> 16; - // Set driver flags - /*d->dCtlFlags |= dReadEnableMask | dWritEnableMask | - dCtlEnableMask | dStatEnableMask | - dNeedLockMask;*/ // 0x4F + #ifdef RDISK_COMPRESS_ICON + // Decompress icon + char *src = &RDiskIconCompressed[0]; + char *dst = &c->icon[0]; + UnpackBits(&src, &dst, 285); + #endif // Add drive to drive queue and return RDiskAddDrive(c->status.dQRefNum, drvNum, (DrvQElPtr)&c->status.qLink); return noErr; } -static OSErr RDiskInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { - char rdiskEN, mountEN, bootEN, ramEN; +static void RDiskInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { + char unmountEN, mountEN, ramEN; // Mark init done c->initialized = 1; // Decode settings - RDiskDecodeSettings(c, &rdiskEN, &bootEN, &mountEN, &ramEN); + RDiskDecodeSettings(c, &unmountEN, &mountEN, &ramEN); - // If ROM disk not enabled, remove drive from drive queue - if (!rdiskEN) { - QHdrPtr head = GetDrvQHdr(); - DrvQElPtr dq = (DrvQElPtr)head->qHead; - // Remove our drive from the system drive queue - // Loop through entire drive queue, searching for our deive - while ((dq != (DrvQElPtr)(head->qTail)) && - (dq->dQRefNum != d->dCtlRefNum)) { - dq = (DrvQElPtr)(dq->qLink); - } - // If we found our drive, remove it from the queue - if (dq->dQRefNum == d->dCtlRefNum) { - Dequeue((QElemPtr)dq, head); - } - // Mark drive removed and offline - c->removed = 1; - c->status.diskInPlace = 0; // 0 means no disk in drive - return offLinErr; - } - - // If RAM disk enabled, try to allocate RAM disk buffer - if (ramEN) { + // If RAM disk enabled, try to allocate RAM disk buffer if not already + if (ramEN & !c->ramdisk) { if (*MMU32bit) { // 32-bit mode unsigned long minBufPtr, newBufPtr; // Compute if there is enough high memory @@ -220,11 +287,12 @@ static OSErr RDiskInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { c->status.writeProt = 0; } } else { // 24-bit mode + // Get address of copy24 routine + RDiskCopy_t copy24 = (RDiskCopy_t)RDiskCopy24; // Put RAM disk just past 8MB - c->ramdisk = (char*)(8 * 1024 * 1024); + c->ramdisk = (Ptr)(8 * 1024 * 1024); // Copy ROM disk image to RAM disk - ((RDiskCopy_t)StripAddress(c->copy24))( - RDiskBuf, StripAddress(c->ramdisk), RDiskSize); + 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? @@ -234,133 +302,125 @@ static OSErr RDiskInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { } } - // If boot disabled... - if (!bootEN) { - // Set drive offline - c->status.diskInPlace = 0; // 0 means no disk in drive - // Enable accRun to post disk inserted event if mount enabled - if (mountEN) { - d->dCtlDelay = 150; - d->dCtlFlags |= dNeedTimeMask; - } - return offLinErr; + // Unmount if not booting from ROM disk + if (unmountEN) { + c->status.diskInPlace = 0; // 0 == no disk in drive } - return noErr; + // 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.) + } } #pragma parameter __D0 RDiskPrime(__A0, __A1) OSErr RDiskPrime(IOParamPtr p, DCtlPtr d) { RDiskStorage_t *c; char cmd; - char *disk; - long offset; + Ptr disk; // Return disk offline error if dCtlStorage null - if (!d->dCtlStorage) { return offLinErr; } + if (!d->dCtlStorage) { return notOpenErr; } // Dereference dCtlStorage to get pointer to our context c = *(RDiskStorage_t**)d->dCtlStorage; + + // Initialize if this is the first prime call + if (!c->initialized) { RDiskInit(p, d, c); } + // Return disk offline error if virtual disk not inserted if (!c->status.diskInPlace) { return offLinErr; } - // Initialize if this is the first prime call - if (!c->initialized) { - OSErr ret = RDiskInit(p, d, c); - if (ret != noErr) { return ret; } - } - // Get pointer to RAM or ROM disk buffer - disk = c->ramdisk ? c->ramdisk : RDiskBuf; - // Add offset to buffer pointer according to positioning mode - switch (p->ioPosMode & 0x000F) { - case fsAtMark: offset = d->dCtlPosition; break; - case fsFromStart: offset = p->ioPosOffset; break; - case fsFromMark: offset = d->dCtlPosition + p->ioPosOffset; break; - default: break; - } - disk += offset; - // Bounds checking disabled - if (offset >= RDiskSize || p->ioReqCount >= RDiskSize || - offset + p->ioReqCount >= RDiskSize) { return posErr; } + disk = (c->ramdisk ? c->ramdisk : RDiskBuf) + d->dCtlPosition; + // Bounds checking + if (d->dCtlPosition >= RDiskSize || p->ioReqCount >= RDiskSize || + d->dCtlPosition + p->ioReqCount >= RDiskSize) { return paramErr; } // Service read or write request cmd = p->ioTrap & 0x00FF; if (cmd == aRdCmd) { // Read - // Return immediately if verify operation requested - //FIXME: follow either old (verify) or new (read uncached) convention - if (p->ioPosMode & rdVerifyMask) { - return noErr; - } // Read from disk into buffer. if (*MMU32bit) { BlockMove(disk, p->ioBuffer, p->ioReqCount); } else { - ((RDiskCopy_t)StripAddress(c->copy24))( - disk, StripAddress(p->ioBuffer), p->ioReqCount); + // Get address of copy24 routine and then copy + RDiskCopy_t copy24 = (RDiskCopy_t)RDiskCopy24; + copy24(disk, StripAddress(p->ioBuffer), p->ioReqCount); } - // Update count - p->ioActCount = p->ioReqCount; - d->dCtlPosition = offset + p->ioReqCount; - p->ioPosOffset = d->dCtlPosition; - return noErr; } else if (cmd == aWrCmd) { // Write // Fail if write protected or RAM disk buffer not set up if (c->status.writeProt || !c->ramdisk) { return wPrErr; } // Write from buffer into disk. if (*MMU32bit) { BlockMove(p->ioBuffer, disk, p->ioReqCount); } else { - ((RDiskCopy_t)StripAddress(c->copy24))( - StripAddress(p->ioBuffer), disk, p->ioReqCount); + // Get address of copy24 routine and then copy + RDiskCopy_t copy24 = (RDiskCopy_t)RDiskCopy24; + copy24(StripAddress(p->ioBuffer), disk, p->ioReqCount); } - // Update count and position/offset - p->ioActCount = p->ioReqCount; - d->dCtlPosition = offset + p->ioReqCount; - p->ioPosOffset = d->dCtlPosition; - return noErr; - } else { return noErr; } - //FIXME: Should we fail if cmd isn't read or write? + } else { return noErr; } //FIXME: Fail if cmd isn't read or write? + + // Update count and position/offset, then return + d->dCtlPosition += p->ioReqCount; + p->ioActCount = p->ioReqCount; + return noErr; } #pragma parameter __D0 RDiskControl(__A0, __A1) OSErr RDiskControl(CntrlParamPtr p, DCtlPtr d) { RDiskStorage_t *c; // Fail if dCtlStorage null - if (!d->dCtlStorage) { return controlErr; } + if (!d->dCtlStorage) { return notOpenErr; } // Dereference dCtlStorage to get pointer to our context c = *(RDiskStorage_t**)d->dCtlStorage; // Handle control request based on csCode switch (p->csCode) { - case 6: // Format - if (!c->status.diskInPlace || c->status.writeProt || !c->ramdisk) { + case kFormat: + if (!c->status.diskInPlace || c->status.writeProt || !c->ramdisk) { return controlErr; - } else { - char zero[64]; - for (int i = 0; i < sizeof(zero); i++) { zero[i] = 0; } - for (int i = 0; i < RDiskSize / 64; i++) { - if (*MMU32bit) { BlockMove(zero, c->ramdisk, sizeof(zero)); } - else { - ((RDiskCopy_t)StripAddress(c->copy24))( - StripAddress(zero), c->ramdisk, sizeof(zero)); - } + } + long zero[16]; + zero[0] = 0; + for (int i = 0; i < 256; i++) { + if (*MMU32bit) { BlockMove(zero, c->ramdisk, sizeof(zero)); } + else { + // Get address of copy24 routine and then copy + RDiskCopy_t copy24 = (RDiskCopy_t)RDiskCopy24; + copy24((Ptr)zero, c->ramdisk, sizeof(zero)); } } return noErr; - case 5: // Verify (after format) - if (!c->status.diskInPlace || c->status.writeProt || !c->ramdisk) { - return controlErr; - } else { 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); } + return controlErr; // Eject not allowed so return error case accRun: - // Disable accRun - d->dCtlFlags &= ~dNeedTimeMask; - // If drive present in drive queue, set drive online - if (!c->removed) { - c->status.diskInPlace = 8; // 8 means nonejectable disk - PostEvent(diskEvt, c->status.dQDrive); - } + d->dCtlFlags &= ~dNeedTimeMask; // Disable accRun + c->status.diskInPlace = 8; // 8 is nonejectable disk + PostEvent(diskEvt, c->status.dQDrive); // Post disk inserted event return noErr; - case 21: case 22: // Get icon - *(Ptr*)&p->csParam = (Ptr)&RDiskIcon; + case kDriveIcon: case kMediaIcon: // Get icon + #ifdef RDISK_COMPRESS_ICON + *(Ptr*)p->csParam = (Ptr)c->icon; + #else + *(Ptr*)p->csParam = (Ptr)RDiskIcon; + #endif return noErr; - case 128: + case kDriveInfo: + // high word (bytes 2 & 3) clear + // byte 1 = primary + fixed media + internal + // byte 0 = drive type (0x10 is RAM disk) / (0x11 is ROM disk) + if (c->status.writeProt) { *(long*)p->csParam = 0x00000410; } + else { *(long*)p->csParam = 0x00000411; } + return noErr; + case 24: // Return SCSI partition size + *(long*)p->csParam = RDiskSize / 512; + return noErr; + case 2351: // Enable post-boot mode c->postBoot = 1; return noErr; default: return controlErr; @@ -371,17 +431,14 @@ OSErr RDiskControl(CntrlParamPtr p, DCtlPtr d) { OSErr RDiskStatus(CntrlParamPtr p, DCtlPtr d) { RDiskStorage_t *c; // Fail if dCtlStorage null - if (!d->dCtlStorage) { return statusErr; } + if (!d->dCtlStorage) { return notOpenErr; } // Dereference dCtlStorage to get pointer to our context c = *(RDiskStorage_t**)d->dCtlStorage; // Handle status request based on csCode switch (p->csCode) { - case drvStsCode: + case kDriveStatus: BlockMove(*d->dCtlStorage, &p->csParam, sizeof(DrvSts2)); return noErr; - case 128: // Get size - *((long*)p->csParam) = RDiskSize; - return noErr; default: return statusErr; } } @@ -391,7 +448,6 @@ OSErr RDiskClose(IOParamPtr p, DCtlPtr d) { // If dCtlStorage not null, dispose of it and its contents if (!d->dCtlStorage) { return noErr; } RDiskStorage_t *c = *(RDiskStorage_t**)d->dCtlStorage; - if (c->copy24) { DisposePtr((Ptr)c->copy24); } HUnlock(d->dCtlStorage); DisposeHandle(d->dCtlStorage); d->dCtlStorage = NULL; diff --git a/rdisk.h b/rdisk.h index b0b7929..ffae652 100644 --- a/rdisk.h +++ b/rdisk.h @@ -35,31 +35,19 @@ void RDiskBreak() = { 0xA9FF }; typedef void (*RDiskCopy_t)(Ptr, Ptr, unsigned long); +//#define RDISK_COMPRESS_ICON typedef struct RDiskStorage_s { DrvSts2 status; char initialized; - char removed; - char postBoot; - char *ramdisk; - RDiskCopy_t copy24; -} RDiskStorage_t; - -/* - - -typedef void (*RDiskCopy_t)(Ptr, Ptr, unsigned long); -typedef void (*RDiskFormat_t)(Ptr); - -typedef struct RDiskStorage_s { - DrvSts2 status; - char initialized; - char removed; + char installed; char postBoot; Ptr ramdisk; - char copy24[64] __attribute__ ((aligned (4))) ; - char format24[64] __attribute__ ((aligned (4))) ; + #ifdef RDISK_COMPRESS_ICON + char icon[285]; + #endif } RDiskStorage_t; -*/ +#define PackBits_Repeat(count) ((-1) * (count - 1)) +#define PackBits_Literal(count) (count - 1) #endif