MacIIROMDiskDriver/RDiskCP/RDiskCP.c
2021-03-31 06:27:34 -04:00

1 line
4.4 KiB
C
Executable File

#include "RDiskCP.h"
static long RDiskCPMacDev() {
int i;
// Check signature and return 0 if doesn't match
// Don't check for length byte at beginning or null byte at endss
for (i = 1; i < sizeof(RDiskSigStr)-1; i++) {
if (RDiskSigPtr[i] != RDiskSigStr[i]) {
// If signature doesn't match,
// fail if not holding R key
if (!((*((char*)0x175)) & 0x80)) { return 0; }
}
}
return 1; // Otherwise return 1 if signature matches
}
static void RDiskCPUpdate(DialogPtr cpDialog, short numItems) {
GrafPtr savePort;
Handle h;
Rect r;
short type;
char startup, ram;
// Get startup and ram from PRAM
RDiskCPReadXPRam(1, 4, &startup);
RDiskCPReadXPRam(1, 5, &ram);
// Save GrafPort and set port to dialog before updating items
GetPort(&savePort);
SetPort(cpDialog);
GetDItem(cpDialog, BootCheckbox+numItems, &type, &h, &r);
SetCtlValue((ControlHandle)h, startup & 0x01 ? 1 : 0);
GetDItem(cpDialog, MountCheckbox+numItems, &type, &h, &r);
SetCtlValue((ControlHandle)h, startup & 0x02 && !(startup & 0x01) ? 1 : 0);
HiliteControl((ControlHandle)h, startup & 0x01 ? 255 : 0);
GetDItem(cpDialog, RAMCheckbox+numItems, &type, &h, &r);
SetCtlValue((ControlHandle)h, startup & 0x03 && ram & 0x01 ? 1 : 0);
HiliteControl((ControlHandle)h, startup & 0x03 ? 0 : 255);
GetDItem(cpDialog, DebugCheckbox+numItems, &type, &h, &r);
SetCtlValue((ControlHandle)h, startup & 0x04 && (startup & 0x01) ? 1 : 0);
HiliteControl((ControlHandle)h, !(startup & 0x01) || !*RDiskDBGDisPos ? 255 : 0);
GetDItem(cpDialog, CDROMCheckbox+numItems, &type, &h, &r);
SetCtlValue((ControlHandle)h, !(startup & 0x08) && (startup & 0x01) ? 1 : 0);
HiliteControl((ControlHandle)h, !(startup & 0x01) || !*RDiskCDROMDisPos ? 255 : 0);
// Restore old GrafPort
SetPort(savePort);
}
static void RDiskCPHitDev(short message, short item, short numItems,
short cpPrivateVal, EventRecord *theEvent,
void *cdevStorageValue, DialogPtr cpDialog) {
char startup, ram;
RDiskCPReadXPRam(1, 4, &startup);
RDiskCPReadXPRam(1, 5, &ram);
switch (item - numItems) {
case BootCheckbox:
if (startup & 0x01) { startup &= 0x0F & ~0x01; }
else { startup = startup & 0x0F | 0x01; }
break;
case MountCheckbox:
if (!(startup & 0x01)) {
if (startup & 0x02) { startup &= 0x0F & ~0x02; }
else { startup = startup & 0x0F | 0x02; }
}
break;
case RAMCheckbox:
if (startup & 0x03) {
if (ram & 0x01) { ram = 0x00; }
else { ram = 0x01; }
}
break;
case DebugCheckbox:
if (startup & 0x01) {
if (startup & 0x04) { startup &= 0x0F & ~0x04; }
else { startup = startup & 0x0F | 0x04; }
}
break;
case CDROMCheckbox:
if (startup & 0x01) {
if (startup & 0x08) { startup &= 0x0F & ~0x08; }
else { startup = startup & 0x0F | 0x08; }
}
break;
};
RDiskCPWriteXPRam(1, 4, &startup);
RDiskCPWriteXPRam(1, 5, &ram);
RDiskCPUpdate(cpDialog, numItems);
}
static void RDiskCPInitDev(short message, short item, short numItems,
short cpPrivateVal, EventRecord *theEvent,
void *cdevStorageValue, DialogPtr cpDialog) {
Str15 ramSize;
Str255 dbgName = "\pMacsBug";
Str255 cdromName = "\pCD-ROM Ext.";
int i;
ramSize[0] = 2;
if (RDiskCPMacDev()) {
ramSize[1] = RDiskRAMReq[0];
ramSize[2] = RDiskRAMReq[1];
} else {
ramSize[1] = '1';
ramSize[2] = '6';
}
if (RDiskCPMacDev() && *RDiskDBGNamePos != 0) {
for (i = 0; i < 255; i++) {
dbgName[i] = (*RDiskDBGNamePos)[i];
}
}
if (RDiskCPMacDev() && *RDiskCDROMNamePos != 0) {
for (i = 0; i < 255; i++) {
cdromName[i] = (*RDiskCDROMNamePos)[i];
}
}
ParamText(ramSize, dbgName, cdromName, 0);
}
pascal long main(short message, short item, short numItems,
short cpPrivateVal, EventRecord *theEvent,
void *cdevStorageValue, DialogPtr cpDialog)
{
long ret = (long)cdevStorageValue;
// Switch to our A4 world
EnterCodeResource();
// Handle message
switch (message) {
case initDev:
RDiskCPInitDev(message, item, numItems,
cpPrivateVal, theEvent,
cdevStorageValue, cpDialog);
// (fall through to return cdevUnset)
case closeDev:
ret = cdevUnset; break;
case macDev:
ret = RDiskCPMacDev(); break;
case updateDev:
case activDev:
case deactivDev:
RDiskCPUpdate(cpDialog, numItems);
break;
case hitDev:
RDiskCPHitDev(message, item, numItems,
cpPrivateVal, theEvent,
cdevStorageValue, cpDialog);
break;
};
// Restore old A4 world and return result
ExitCodeResource();
return ret;
}