From 8600f9ef0e29799f774235ac6ff63b24e1a1160f Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Mon, 29 Jun 2020 21:08:50 -0400 Subject: [PATCH] With boot patch --- Makefile | 9 ++++++-- bin/driver.bin | Bin 1662 -> 1708 bytes bin/rom.bin | Bin 2097152 -> 2097152 bytes entry.s | 58 ++++++++++++++++++++++++++++++------------------- rdisk.c | 36 ++++++++++++++++++++---------- rdisk.h | 5 +++-- 6 files changed, 70 insertions(+), 38 deletions(-) diff --git a/Makefile b/Makefile index 55a73ac..f6d44ed 100644 --- a/Makefile +++ b/Makefile @@ -45,8 +45,13 @@ bin/driver.bin: bin obj/driver.o $(OBJCOPY) -O binary obj/driver.o $@ -bin/rom.bin: baserom.bin RDisk1M5.dsk bin bin/driver.bin obj/entry_rel.sym - cp baserom.bin $@ # copy base rom +bin/rom.bin: baserom.bin RDisk1M5.dsk bin bin/driver.bin obj/driver_abs.sym obj/entry_rel.sym + cp baserom.bin $@ # Copy base rom + # Patch boot + printf '\x4E' | dd of=$@ bs=1 seek=5888 count=1 conv=notrunc # Copy JSR opcode into IsFloppy boot routine + printf '\xF9' | dd of=$@ bs=1 seek=5889 count=1 conv=notrunc # Copy JSR opcode second byte + cat obj/driver_abs.sym | grep "BootCheckEntry" | cut -c1-8 | xxd -r -p - | dd of=$@ bs=1 seek=5890 count=4 conv=notrunc + # Patch driver dd if=bin/driver.bin of=$@ bs=1 seek=335248 skip=32 conv=notrunc # Copy driver code printf '\x78' | dd of=$@ bs=1 seek=335168 count=1 conv=notrunc # Set resource flags printf '\x4F' | dd of=$@ bs=1 seek=335216 count=1 conv=notrunc # Set driver flags diff --git a/bin/driver.bin b/bin/driver.bin index fb6f22e853d4cd17933a967ae399e45b4a9b8c09..d03cd03a17276e1c316d81415afd39c5f3e8f652 100755 GIT binary patch delta 1014 zcmZ`&O=uHA6#jPe<0@;d60}H3#x!qih$Au~@XAxc+VWBX!XPR0@fT zQbmkf@tli@;z6u}ieUAm7cWW=y%fCEKdOiae@fT4TZ?$`@aE0?-kX{CeKRv7-&uG$ zQI`AcUyusR$-jbRF3~1!JNJm64PKKuuw{axQtqccu1#We9|S@?$dzUz-#?M?+{qcr zY|h)}L~;);S#H+Nt?-_6(A81+B?0pbvVP^viPr9F`ZGL7y_TTy7NNFXR`u38rS+cXo86J;O6T1pw^@eDCw$EuzS=h%^)kyFlLKc%9Q& zjLjcEQ?8F;o(zZtRLFZw2-CEcNLxZbMd*y4lJAj!$YKa9n^+$hQKI=Oj_6pWxgGT^ zfqIIPnXCa}G@}wl6`^H=BzllE4gS@XqR>&_oWk{Slv#z!O-WA)rNh9b{6~m7EjAZO zDNv6E*sI+JxRMfNCH;EZeh09WAiW*(R{$?YMi0QQ8+mpRwzT4)$4_0CM@PLDvUtFw@Fxh1uI{wrE?lb+?fH9@G&Cs4!gtQ_* z6p0~8zFcvDvD_NeHvLa@BR|V1!V`UP>RGKzts_Fd+^|dJ z#aup0m-Z*`RedU)e8gqCj(S}{=BFDJGuamJmWkad=gl8~V|*o>8oualUAnRXjr3Ln z^olB`%(gFfE|?9EdDp~)EU!oD*69C2qMx?Z3bubhBdO2Bdvhgg%J@$9jqJ-v%(p}M E4b9CL&j0`b delta 937 zcmYjQOH30{6g@NjSj(u@G^8=4KF79{vFTL&qzhvngP)-xwHk@QhA~Qqk0}!rV+gUB zs6iK2tqWsZbYuL)1xjLKViaAeTUihmlCVM9z`~7$fOiHE7w_GB?s<3aedoS;wPjhl zm(cZDjGqI(HBY;c9au%~#s85wVIxCc~H zNecrPfycQyh!pYX1HLpMTqZ_=QZ#`dnY8rAJT9jNNpASQwDJ>RX~8!$;vELu7#lwi zd>H%G>9rfh+udIUDcS_t3hA5;@e!bs)D(yg`zSgD%7V-k#40T@PFAk8sD}{(RH%pT z^Vza}{^UF)t;mfFZKdRUz~z(Aww5AItQ#V$gLibqtdI2}SicvcH(l_Vah9Wxd0&s` z7f6L*N0(5W z*(HO{xF8&f=Q6JlHm}JE$fV5!x#56_|09~A=pxxSSb+mTy`Xzt8^L`dym`wh9dQa% zS$1r#@LJujjlxDVOV~4u^8|H935@3ErI~rM5A6nwFYA14gLkPO6>B_JQdd42Ub=v& zHKtt6(=}JK16L-D-?SFWqwWLM@*HYt9zhatI4`kN+lNRYrM&3gUln3GsRus#wRV(` Lc&f)*J!gc!tJC$2 diff --git a/bin/rom.bin b/bin/rom.bin index 15d5f6dd1b390c5e6da1332fc7ef9d5575b82a34..6a06eff469b13617c7a12a758420ecaec6d4952b 100755 GIT binary patch delta 1189 zcmZ{jUuauZ9LK-+CO5mS*Djl}i8Z~syNhX?grsPdC`E44Y^I@0veMEO6ys)-HkIzO zB`~Czt7EQ;7|>y1_>dP7eHz=ODuUIg`QnSRhxt&DLj6ZK#0USB#qYhfhz~w|&hP$y z=XcKi{l4cM%d!NEwEdpKAI63Lch7tL7d?J~h{Q$QYaYLJ*3+DViI;E*C*{P_Ts>1P zPC-PntLv$m$>Oo>!r4VYsdfH>Tw}tiR zATZ)Wp|R^p|M7$`?YXkPJLevq*zmca%yUg&rDt!6`_7*Stf8_U3XEX|p z*POo=&ABCDww2ooJ`v6hj%y3>IlqCJjg;~+genl9q*bfHD|!ri6~Y^OdL)YYuqYbX zPw524UZ-{0Hg9mON4svFZ+fHHrvM@Y7OkrSVTW6Z+!Fbh8NHiNDOYJf)}jdON3zO2bOd{l8rqn8BRsWThUg(UpC$cw&re-m{BIi>= z;|1W&($5g{TwLjvQ(%o%bRKpJF!Yq5=;?2EIzIqfN|3)_@mPQx*Va#=({t^M=h2Z5 zeI+OZP6`-BSu$eOM{xYx(=0n$Fh_t8U2Cd$nZYD<&0Fp?K+UbRN?DXPo zC|vUCY%B2@C6V=+6Ro%{yBJ=8=c5}{-*6m(EAzakx>gD=*|EwUCst!jaXJs3`@9TX z*YY1MmA7@L8189Cs1@x>B#H!W)3O6MKXjaWN))p&WD%Z9-RU~)h)&71BmXCQxwP9+ z#E92m=WFfhWDgsX3U51&+}N8RbL)D=l%z`UIW={9Ry2*{rcV{|*aUDBN_ zyTp)4Ezau_1a zVDP}vLzNfyO`M(tioap$C182qiGO zkQD(zM=kLw(c&E~Da~}2lhT2wvY)bTMMRxxmw%Gfiwk!F=Y-2yap*68E~$2N+9aag z?f%HB)w0&we&fX&TA|SM%uj3 zhISdq=0%ZXlgc4b>^+(T{#@eDStIz2-?U>nThs z(gAd~U#ml-_ds^4$&tC<+O`i7Z3iMLj+`}Y1K*jd88k!XulczFYd3tU9C!`NTwp!P z>6O$oRAIL=26E(`^}Xw#_3XxOQ5*(WM94L_*IMs2rncJt^~URc#~(DdN42bfXBnQQ zol${C_a@VwN#zgy4cOQ2=hF}J0aG%uo`;t|bJdpV0HQUV4~*VSyjq?;vts{A-05gc z+SSi)Awd@sB?VhGRXezOjwCWVbtXL>j%!u54uyWYEuAlz)W3L*Nr#1;yF{mcV=pcA zmR;=R-j$t`(7lztlgN6%ke%~x(5QJo(3m)%&?Q19HV_ICBtk@(P>F|#jl?D*LTo0s h5Dybk;t`^sh!Jt(QDQ6c7~y~aaU!{x&QNK diff --git a/entry.s b/entry.s index 57206af..d8caacc 100644 --- a/entry.s +++ b/entry.s @@ -1,51 +1,65 @@ +.EQU killCode, 1 +.EQU noQueueBit, 9 +.EQU kioTrap, 6 +.EQU kioResult, 16 +.EQU kcsCode, 26 +.EQU JIODone, 0x08FC + dc.l 0x00000000, 0x00000000, 0x00000000, 0x00000000 dc.l 0x00000000, 0x00000000, 0x00000000, 0x00000000 .ascii "\9GWROMDisk\0" .align 4 -.EQU killCode, 1 -.EQU noQueueBit, 9 - -.EQU kioTrap, 6 -.EQU kioResult, 16 -.EQU kcsCode, 26 - -.EQU JIODone, 0x08FC +BootCheckEntry: + * Boot if reference number == -5 + cmp #-5, 8(%A2) + beq.b BootCheckRet + * Otherwise don't boot if reference number != -50 + cmp #-50, 8(%A2) + bne.b BootCheckRet + * Call to check PRAM + movem.l %A0-%A7/%D0-%D7, -(%SP) + jsr RDiskBootCheckPRAM + cmp #0, %D0 + movem.l (%SP)+, %A0-%A7/%D0-%D7 +BootCheckRet: + rts + jmp BootCheckEntry DOpen: - movem.l %A0-%A1,-(%SP) + movem.l %A0-%A1, -(%SP) bsr RDiskOpen - movem.l (%SP)+,%A0-%A1 + movem.l (%SP)+, %A0-%A1 rts DClose: - movem.l %A0-%A1,-(%SP) + movem.l %A0-%A1, -(%SP) bsr RDiskClose - movem.l (%SP)+,%A0-%A1 + movem.l (%SP)+, %A0-%A1 rts DPrime: - movem.l %A0-%A1,-(%SP) + movem.l %A0-%A1, -(%SP) bsr RDiskPrime - movem.l (%SP)+,%A0-%A1 + movem.l (%SP)+, %A0-%A1 bra.b IOReturn DControl: - movem.l %A0-%A1,-(%SP) + movem.l %A0-%A1, -(%SP) bsr RDiskControl - movem.l (%SP)+,%A0-%A1 + movem.l (%SP)+, %A0-%A1 cmpi.w #killCode, kcsCode(%A0) bne.b IOReturn rts DStatus: - movem.l %A0-%A1,-(%SP) + movem.l %A0-%A1, -(%SP) bsr RDiskStatus - movem.l (%SP)+,%A0-%A1 + movem.l (%SP)+, %A0-%A1 IOReturn: - move.w kioTrap(%A0),%D1 - btst #noQueueBit,%D1 + move.w kioTrap(%A0), %D1 + btst #noQueueBit, %D1 beq.b Queued NotQueued: @@ -54,7 +68,7 @@ NotQueued: clr.w %D0 ImmedRTS: - move.w %D0,kioResult(%A0) + move.w %D0, kioResult(%A0) rts Queued: @@ -64,5 +78,5 @@ Queued: rts MyIODone: - move.l JIODone,-(%SP) + move.l JIODone, -(%SP) rts diff --git a/rdisk.c b/rdisk.c index ba9b783..106cc7b 100644 --- a/rdisk.c +++ b/rdisk.c @@ -78,6 +78,13 @@ const long RDiskIcon[65] = { 0 }; +#pragma parameter __D0 RDiskBootCheckPRAM() +short RDiskBootCheckPRAM() { + char mount; + RDiskReadXPRAM(1, 4, &mount); + return mount == 0x5D; +} + // Switch to 24-bit mode and copy void RDiskCopy24(Ptr sourcePtr, Ptr destPtr, unsigned long byteCount) { char mode = true32b; @@ -116,7 +123,9 @@ OSErr RDiskOpen(IOParamPtr p, DCtlPtr d) { c = *(RDiskStorage_t**)d->dCtlStorage; // Initialize storage struct fields - c->init_done = 0; + c->initialized = 0; + c->offline = 0; + c->forceMount = 0; c->ramdisk = NULL; c->copy24 = (RDiskCopy_t)copy24; @@ -138,22 +147,22 @@ OSErr RDiskOpen(IOParamPtr p, DCtlPtr d) { return noErr; } -OSErr RDiskInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { - char startup = 0, ram = 0; +static OSErr RDiskInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { + char mount = 0, ram = 0; // Mark init done - c->init_done = 1; + c->initialized = 1; // Read PRAM - RDiskReadXPRAM(1, 4, &startup); + RDiskReadXPRAM(1, 4, &mount); RDiskReadXPRAM(1, 5, &ram); // Either enable ROM disk or remove ourselves from the drive queue - if (startup || RDiskIsRPressed()) { // If ROM disk boot set in PRAM or R pressed,*/ + if (c->forceMount || mount || RDiskIsRPressed()) { // If ROM disk boot set in PRAM or R pressed, // Set ROM disk attributes c->status.writeProt = -1; // Set write protected // If RAM disk set in PRAM or A pressed, enable RAM disk - if (ram || RDiskIsAPressed() || c->mount) { + if (ram || RDiskIsAPressed()) { // If RAM disk set in PRAM or A pressed // Try to allocate RAM disk buffer if (*MMU32bit) { // 32-bit mode unsigned long minBufPtr, newBufPtr; @@ -161,7 +170,7 @@ OSErr RDiskInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { minBufPtr = ((unsigned long)*MemTop / 2) + 1024; newBufPtr = (unsigned long)*BufPtr - RDiskSize; if (newBufPtr > minBufPtr && (unsigned long)*BufPtr > newBufPtr) { - // Allocate RAM disk buffer by lowering BufPtrå + // Allocate RAM disk buffer by lowering BufPtra *BufPtr = (Ptr)newBufPtr; // Set RAM disk buffer pointer. c->ramdisk = *BufPtr; @@ -200,9 +209,8 @@ OSErr RDiskInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { // If we found our driver, remove it from the queue if (dq->dQRefNum == d->dCtlRefNum) { Dequeue((QElemPtr)dq, head); - DisposeHandle(d->dCtlStorage); } - d->dCtlStorage = NULL; + c->offline = 1; // Return disk offline error return offLinErr; } @@ -219,9 +227,11 @@ OSErr RDiskPrime(IOParamPtr p, DCtlPtr d) { if (!d->dCtlStorage) { return offLinErr; } // Dereference dCtlStorage to get pointer to our context c = *(RDiskStorage_t**)d->dCtlStorage; + // Return disk offline error if marked offline + if (c->offline) { return offLinErr; } // Initialize if this is the first prime call - if (!c->init_done) { + if (!c->initialized) { OSErr ret = RDiskInit(p, d, c); if (ret != noErr) { return ret; } } @@ -291,7 +301,7 @@ OSErr RDiskControl(CntrlParamPtr p, DCtlPtr d) { case 21: case 22: *(Ptr*)&p->csParam = (Ptr)&RDiskIcon; return noErr; - case 128: c->mount = 1; return noErr; + case 128: c->forceMount = 1; return noErr; default: return controlErr; } } @@ -303,6 +313,8 @@ OSErr RDiskStatus(CntrlParamPtr p, DCtlPtr d) { if (!d->dCtlStorage) { return statusErr; } // Dereference dCtlStorage to get pointer to our context c = *(RDiskStorage_t**)d->dCtlStorage; + // Fail if offline + if (c->offline) { return statusErr; } // Handle status request based on csCode switch (p->csCode) { case drvStsCode: diff --git a/rdisk.h b/rdisk.h index b0ae4d5..29b2fff 100644 --- a/rdisk.h +++ b/rdisk.h @@ -37,10 +37,11 @@ typedef void (*RDiskCopy_t)(Ptr, Ptr, unsigned long); typedef struct RDiskStorage_s { DrvSts2 status; - unsigned long init_done; + char initialized; + char offline; + char forceMount; char *ramdisk; RDiskCopy_t copy24; - char mount; } RDiskStorage_t; #endif