Make CD and debug patches explicit

This commit is contained in:
Zane Kaminski 2021-04-01 22:05:21 -04:00
parent 8f8dbc83d5
commit a62d310c6f
5 changed files with 25 additions and 30 deletions

Binary file not shown.

Binary file not shown.

12
entry.s
View File

@ -8,9 +8,9 @@
.GLOBAL RDiskDBGNamePos .GLOBAL RDiskDBGNamePos
.GLOBAL RDiskDBGDisPos .GLOBAL RDiskDBGDisPos
.GLOBAL RDiskDBGDisByte .GLOBAL RDiskDBGDisByte
.GLOBAL RDiskCDROMNamePos .GLOBAL RDiskCDRNamePos
.GLOBAL RDiskCDROMDisPos .GLOBAL RDiskCDRDisPos
.GLOBAL RDiskCDROMDisByte .GLOBAL RDiskCDRDisByte
dc.l 0x00000000, 0x00000000, 0x00000000, 0x00000000 dc.l 0x00000000, 0x00000000, 0x00000000, 0x00000000
dc.l 0x00000000, 0x00000000, 0x00000000, 0x00000000 dc.l 0x00000000, 0x00000000, 0x00000000, 0x00000000
@ -20,15 +20,15 @@ RDiskSig:
.align 4 .align 4
RDiskDBGDisPos: RDiskDBGDisPos:
dc.l 0x00000031 dc.l 0x00000031
RDiskCDROMDisPos: RDiskCDRDisPos:
dc.l 0x00012CAF dc.l 0x00012CAF
RDiskDBGNameAddr: RDiskDBGNameAddr:
dc.l 0x4088002A dc.l 0x4088002A
RDiskCDROMNameAddr: RDiskCDRNameAddr:
dc.l 0x40892C96 dc.l 0x40892C96
RDiskDBGDisByte: RDiskDBGDisByte:
dc.b 0x44 dc.b 0x44
RDiskCDROMDisByte: RDiskCDRDisByte:
dc.b 0x44 dc.b 0x44
RDiskRAMRequired: RDiskRAMRequired:
.ascii "16" .ascii "16"

37
rdisk.c
View File

@ -9,7 +9,7 @@
#include "rdisk.h" #include "rdisk.h"
// Decode keyboard/PRAM settings // Decode keyboard/PRAM settings
static void RDDecodeSettings(Ptr unmountEN, Ptr mountEN, Ptr ramEN, Ptr dbgEN, Ptr cdromEN) { static void RDDecodeSettings(Ptr unmountEN, Ptr mountEN, Ptr ramEN, Ptr dbgEN, Ptr cdrEN) {
// Read PRAM // Read PRAM
char legacy_startup, legacy_ram; char legacy_startup, legacy_ram;
RDiskReadXPRAM(1, 4, &legacy_startup); RDiskReadXPRAM(1, 4, &legacy_startup);
@ -36,15 +36,11 @@ static void RDDecodeSettings(Ptr unmountEN, Ptr mountEN, Ptr ramEN, Ptr dbgEN, P
} }
} }
// MacsBug enabled if bit 2 == 1 or DBGDis addr invalid or not boot // MacsBug enabled if bit 2 == 1 or not boot
*dbgEN = *unmountEN || *dbgEN = *unmountEN || (legacy_startup & 0x04);
(legacy_startup & 0x04) ||
(*RDiskDBGDisPos == 0);
// CDROM enabled if bit 3 == 0 or CDROMDis addr invalid or not boot // CD-ROM enabled if bit 3 == 0 or not boot
*cdromEN = *unmountEN || *cdrEN = *unmountEN || !(legacy_startup & 0x08);
!(legacy_startup & 0x08) ||
(*RDiskCDROMDisPos == 0);
} }
// Switch to 32-bit mode and copy // Switch to 32-bit mode and copy
@ -57,20 +53,19 @@ void C24(Ptr sourcePtr, Ptr destPtr, unsigned long byteCount) {
} }
// Switch to 32-bit mode and patch // Switch to 32-bit mode and patch
void P24(Ptr romdisk, char dbgByte, char cdromByte) { void P24(Ptr romdisk, int32_t index, char patch) {
if (index < 0) { return; } // Don't patch if index < 0
signed char mode = true32b; signed char mode = true32b;
SwapMMUMode(&mode); SwapMMUMode(&mode);
// Patch debug and CD-ROM disable bytes romdisk[index] = patch; // Patch byte
romdisk[0x31] = 0x44;
//if (dbg) { *dbg = 0x44; }
//if (cdrom) { *cdrom = 0x44; }
SwapMMUMode(&mode); SwapMMUMode(&mode);
} }
typedef void (*RDiskPatch_t)(Ptr, char, char); typedef void (*RDiskPatch_t)(Ptr, char, char);
static void patch24(Ptr romdisk, char dbgEN, char cdromEN) { static void patch24(Ptr romdisk, char dbgEN, char cdrEN) {
RDiskPatch_t fun = (RDiskPatch_t)P24; RDiskPatch_t fun = (RDiskPatch_t)P24;
fun(romdisk, dbgEN, cdromEN); if (dbgEN) { fun(romdisk, 0x00000031, 0x44); }
if (cdrEN) { fun(romdisk, 0x00012CAF, 0x44); }
} }
// Figure out the first available drive number >= 5 // Figure out the first available drive number >= 5
@ -134,14 +129,14 @@ OSErr RDOpen(IOParamPtr p, DCtlPtr d) {
// Init is called at beginning of first prime (read/write) call // Init is called at beginning of first prime (read/write) call
static void RDInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { static void RDInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) {
char unmountEN, mountEN, ramEN, dbgEN, cdromEN; char unmountEN, mountEN, ramEN, dbgEN, cdrEN;
// Mark init done // Mark init done
c->initialized = 1; c->initialized = 1;
// Decode settings // Decode settings
RDDecodeSettings(&unmountEN, &mountEN, &ramEN, &dbgEN, &cdromEN); RDDecodeSettings(&unmountEN, &mountEN, &ramEN, &dbgEN, &cdrEN);
// Set debug and CD-ROM enable flags in storage struct // Set debug and CD-ROM enable flags in storage struct
c->dbgEN = dbgEN; c->dbgEN = dbgEN;
c->cdromEN = cdromEN; c->cdrEN = cdrEN;
// If RAM disk enabled, try to allocate RAM disk buffer if not already // If RAM disk enabled, try to allocate RAM disk buffer if not already
if (ramEN & !c->ramdisk) { if (ramEN & !c->ramdisk) {
@ -160,7 +155,7 @@ static void RDInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) {
// Clearing write protect marks RAM disk enabled // Clearing write protect marks RAM disk enabled
c->status.writeProt = 0; c->status.writeProt = 0;
// Patch debug and CD-ROM enable bytes // Patch debug and CD-ROM enable bytes
patch24(c->ramdisk, dbgEN, cdromEN); patch24(c->ramdisk, dbgEN, cdrEN);
} }
} else { // 24-bit mode } else { // 24-bit mode
// Put RAM disk just past 8MB // Put RAM disk just past 8MB
@ -174,7 +169,7 @@ static void RDInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) {
// Clearing write protect marks RAM disk enabled // Clearing write protect marks RAM disk enabled
c->status.writeProt = 0; c->status.writeProt = 0;
// Patch debug and CD-ROM enable bytes // Patch debug and CD-ROM enable bytes
patch24(c->ramdisk, dbgEN, cdromEN); patch24(c->ramdisk, dbgEN, cdrEN);
} }
} }

View File

@ -4,8 +4,8 @@
#define RDiskBuf ((char*)0x40880000) #define RDiskBuf ((char*)0x40880000)
extern uint32_t *RDiskDBGDisPos; extern uint32_t *RDiskDBGDisPos;
extern char *RDiskDBGDisByte; extern char *RDiskDBGDisByte;
extern uint32_t *RDiskCDROMDisPos; extern uint32_t *RDiskCDRDisPos;
extern char *RDiskCDROMDisByte; extern char *RDiskCDRDisByte;
#define BufPtr ((Ptr*)0x10C) #define BufPtr ((Ptr*)0x10C)
#define MemTop ((Ptr*)0x108) #define MemTop ((Ptr*)0x108)
#define MMU32bit ((char*)0xCB2) #define MMU32bit ((char*)0xCB2)
@ -26,7 +26,7 @@ typedef struct RDiskStorage_s {
char initialized; char initialized;
Ptr ramdisk; Ptr ramdisk;
char dbgEN; char dbgEN;
char cdromEN; char cdrEN;
#ifdef RDISK_COMPRESS_ICON_ENABLE #ifdef RDISK_COMPRESS_ICON_ENABLE
char icon[RDISK_ICON_SIZE]; char icon[RDISK_ICON_SIZE];
#endif #endif