mirror of
https://github.com/garrettsworkshop/ROMBUSDriver.git
synced 2024-12-26 11:30:11 +00:00
Add ROM disk driver stuff
This commit is contained in:
parent
e02ef0f8d9
commit
776be92c56
189
Makefile
189
Makefile
@ -1,21 +1,24 @@
|
||||
# path to RETRO68
|
||||
RETRO68=~/Retro68-build/toolchain
|
||||
|
||||
PREFIX=$(RETRO68)/bin/m68k-apple-macos
|
||||
PREFIX=m68k-apple-macos
|
||||
AS=$(PREFIX)-as
|
||||
CC=$(PREFIX)-gcc
|
||||
LD=$(PREFIX)-ld
|
||||
OBJCOPY=$(PREFIX)-objcopy
|
||||
OBJDUMP=$(PREFIX)-objdump
|
||||
CFLAGS=-march=68030 -c -Os
|
||||
|
||||
all: bin/rom16M_swap.bin obj/rdisk7M5.s obj/driver7M5.s obj/entry_rel.sym obj/driver_abs.sym
|
||||
all: bin/IIxIIcxSE30/IIxIIcxSE30_8M.bin bin/IIci/IIci_8M.bin bin/IIfx/IIfx_8M.bin bin/IIsi/IIsi_8M.bin bin/GWSys71_8M.bin bin/GWSys6_8M.bin bin/GWSys7Diagnostics_8M.bin obj/rdisk.s obj/driver.s obj/driver_abs.sym
|
||||
|
||||
obj:
|
||||
mkdir obj
|
||||
|
||||
mkdir $@
|
||||
bin:
|
||||
mkdir bin
|
||||
mkdir $@
|
||||
bin/IIsi: bin
|
||||
mkdir $@
|
||||
bin/IIxIIcxSE30: bin
|
||||
mkdir $@
|
||||
bin/IIci: bin
|
||||
mkdir $@
|
||||
bin/IIfx: bin
|
||||
mkdir $@
|
||||
|
||||
|
||||
obj/entry.o: entry.s obj
|
||||
@ -25,63 +28,137 @@ obj/entry_rel.sym: obj obj/entry.o
|
||||
$(OBJDUMP) -t obj/entry.o > $@
|
||||
|
||||
|
||||
obj/rdisk7M5.o: rdisk.c obj
|
||||
$(CC) -Wall -DRDiskSize=7864320 $(CFLAGS) $< -o $@
|
||||
obj/rdisk.o: rdisk.c obj
|
||||
$(CC) -Wall -march=68030 -c -Os $< -o $@
|
||||
|
||||
obj/rdisk7M5.s: obj obj/rdisk7M5.o
|
||||
$(OBJDUMP) -d obj/rdisk7M5.o > $@
|
||||
obj/rdisk.s: obj obj/rdisk.o
|
||||
$(OBJDUMP) -d obj/rdisk.o > $@
|
||||
|
||||
obj/driver.o: obj obj/entry.o obj/rdisk.o
|
||||
$(LD) -Ttext=40851D70 -o $@ obj/entry.o obj/rdisk.o
|
||||
|
||||
obj/driver.s: obj obj/driver.o
|
||||
$(OBJDUMP) -d obj/driver.o > $@
|
||||
|
||||
obj/driver_abs.sym: obj obj/driver.o
|
||||
$(OBJDUMP) -t obj/driver.o > $@
|
||||
|
||||
|
||||
obj/spi.o: spi.c obj
|
||||
$(CC) -Wall $(CFLAGS) $< -o $@
|
||||
bin/driver.bin: bin obj/driver.o
|
||||
$(OBJCOPY) -O binary obj/driver.o $@
|
||||
|
||||
obj/spi.s: obj obj/spi.o
|
||||
$(OBJDUMP) -d obj/spi.o > $@
|
||||
|
||||
|
||||
obj/sdmmc.o: sdmmc.c obj
|
||||
$(CC) -Wall $(CFLAGS) -Os $< -o $@
|
||||
|
||||
obj/sdmmc.s: obj obj/sdmmc.o
|
||||
$(OBJDUMP) -d obj/sdmmc.o > $@
|
||||
|
||||
|
||||
|
||||
obj/driver7M5.o: obj obj/entry.o obj/rdisk7M5.o
|
||||
$(LD) -Ttext=40851D70 -o $@ obj/entry.o obj/rdisk7M5.o obj/spi.o obj/sdmmc.o
|
||||
|
||||
obj/driver7M5.s: obj obj/driver7M5.o
|
||||
$(OBJDUMP) -d obj/driver7M5.o > $@
|
||||
|
||||
obj/driver_abs.sym: obj obj/driver7M5.o
|
||||
$(OBJDUMP) -t obj/driver7M5.o > $@
|
||||
|
||||
|
||||
bin/driver7M5.bin: bin obj/driver7M5.o
|
||||
$(OBJCOPY) -O binary obj/driver7M5.o $@
|
||||
|
||||
bin/rom8M.bin: bin baserom.bin RDisk7M5.dsk bin bin/driver7M5.bin obj/driver_abs.sym obj/entry_rel.sym
|
||||
cp baserom.bin $@ # Copy base rom
|
||||
bin/baserom_romdisk_ramtest.bin: bin roms/baserom.bin bin/driver.bin obj/driver_abs.sym obj/entry_rel.sym
|
||||
cp roms/baserom.bin $@ # Copy base rom
|
||||
# Patch driver
|
||||
dd if=bin/driver7M5.bin of=$@ bs=1 seek=335248 skip=32 conv=notrunc # Copy driver code
|
||||
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
|
||||
cat obj/entry_rel.sym | grep "DOpen" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335224 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "DPrime" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335226 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "DControl" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335228 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "DStatus" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335230 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "DClose" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335232 count=2 conv=notrunc
|
||||
dd if=RDisk7M5.dsk of=$@ bs=1024 seek=512 count=7680 conv=notrunc # copy disk image
|
||||
cat obj/entry_rel.sym | grep "[0-9]\s*DOpen" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335224 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "[0-9]\s*DPrime" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335226 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "[0-9]\s*DControl" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335228 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "[0-9]\s*DStatus" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335230 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "[0-9]\s*DClose" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335232 count=2 conv=notrunc
|
||||
|
||||
bin/rom8M_swap.bin: bin bin/rom8M.bin
|
||||
dd if=bin/rom8M.bin of=$@ conv=swab # swap bytes
|
||||
bin/baserom_romdisk_noramtest.bin: bin bin/baserom_romdisk_ramtest.bin
|
||||
cp bin/baserom_romdisk_ramtest.bin $@ # Copy base rom
|
||||
# Disable RAM test
|
||||
printf '\x4E\xD6' | dd of=$@ bs=1 seek=288736 count=2 conv=notrunc
|
||||
printf '\x4E\xD6' | dd of=$@ bs=1 seek=289016 count=2 conv=notrunc
|
||||
|
||||
bin/iisi_swap.bin: bin iisi.bin
|
||||
dd if=iisi.bin of=$@ conv=swab # swap bytes
|
||||
|
||||
bin/rom16M_swap.bin: bin/iisi_swap.bin bin/rom8M_swap.bin
|
||||
cat bin/rom8M_swap.bin > $@
|
||||
cat bin/iisi_swap.bin >> $@
|
||||
bin/GWSys71_8M.bin: bin bin/baserom_romdisk_noramtest.bin disks/RDisk7M5.dsk
|
||||
# Copy base rom with ROM disk driver
|
||||
cp bin/baserom_romdisk_noramtest.bin $@
|
||||
# Patch ROM disk driver parameter table
|
||||
printf '\x00\x01\x2A\x29' | dd of=$@ bs=1 seek=335260 count=4 conv=notrunc # Patch CDR patch offset
|
||||
printf '\x40\x89\x2A\x14' | dd of=$@ bs=1 seek=335268 count=4 conv=notrunc # Patch CDR name address
|
||||
printf '\x44' | dd of=$@ bs=1 seek=335273 count=1 conv=notrunc # Patch CDR disable byte
|
||||
printf '\x00\x78\x00\x00' | dd of=$@ bs=1 seek=335276 count=4 conv=notrunc # Patch ROM disk size
|
||||
# Copy ROM disk image
|
||||
dd if=disks/RDisk7M5.dsk of=$@ bs=1024 seek=512 conv=notrunc
|
||||
|
||||
|
||||
bin/GWSys6_4M.bin: bin bin/baserom_romdisk_noramtest.bin disks/RDisk3M5.dsk
|
||||
# Copy base rom with ROM disk driver
|
||||
cp bin/baserom_romdisk_noramtest.bin $@
|
||||
# Patch ROM disk driver parameter table
|
||||
printf '\xFF\xFF\xFF\xFF' | dd of=$@ bs=1 seek=335260 count=4 conv=notrunc # Patch CDR patch offset
|
||||
printf '\x00\x00\x00\x00' | dd of=$@ bs=1 seek=335268 count=4 conv=notrunc # Patch CDR name address
|
||||
printf '\x44' | dd of=$@ bs=1 seek=335273 count=1 conv=notrunc # Patch CDR disable byte
|
||||
printf '\x00\x38\x00\x00' | dd of=$@ bs=1 seek=335276 count=4 conv=notrunc # Patch ROM disk size
|
||||
# Copy ROM disk image
|
||||
dd if=disks/RDisk3M5.dsk of=$@ bs=1024 seek=512 conv=notrunc
|
||||
|
||||
bin/GWSys6_8M.bin: bin/GWSys6_4M.bin
|
||||
cat bin/GWSys6_4M.bin > $@
|
||||
cat bin/GWSys6_4M.bin >> $@
|
||||
|
||||
|
||||
bin/GWSys7Diagnostics_8M.bin: bin bin/baserom_romdisk_ramtest.bin disks/RDisk7M5-diagnostics.dsk
|
||||
# Copy base rom with ROM disk driver
|
||||
cp bin/baserom_romdisk_ramtest.bin $@
|
||||
# Patch ROM disk driver parameter table
|
||||
printf '\xFF\xFF\xFF\xFF' | dd of=$@ bs=1 seek=335260 count=4 conv=notrunc # Patch CDR patch offset
|
||||
printf '\x00\x00\x00\x00' | dd of=$@ bs=1 seek=335268 count=4 conv=notrunc # Patch CDR name address
|
||||
printf '\x44' | dd of=$@ bs=1 seek=335273 count=1 conv=notrunc # Patch CDR disable byte
|
||||
printf '\x00\x78\x00\x00' | dd of=$@ bs=1 seek=335276 count=4 conv=notrunc # Patch ROM disk size
|
||||
# Copy ROM disk image
|
||||
dd if=disks/RDisk7M5-diagnostics.dsk of=$@ bs=1024 seek=512 conv=notrunc
|
||||
|
||||
|
||||
bin/IIxIIcxSE30/IIxIIcxSE30_512k.bin: bin/IIxIIcxSE30 roms/IIxIIcxSE30.bin
|
||||
cat roms/IIxIIcxSE30.bin > $@; cat roms/IIxIIcxSE30.bin >> $@
|
||||
|
||||
bin/IIxIIcxSE30/IIxIIcxSE30_1M.bin: bin/IIxIIcxSE30 bin/IIxIIcxSE30/IIxIIcxSE30_512k.bin
|
||||
cat bin/IIxIIcxSE30/IIxIIcxSE30_512k.bin > $@; cat bin/IIxIIcxSE30/IIxIIcxSE30_512k.bin >> $@
|
||||
|
||||
bin/IIxIIcxSE30/IIxIIcxSE30_2M.bin: bin/IIxIIcxSE30 bin/IIxIIcxSE30/IIxIIcxSE30_1M.bin
|
||||
cat bin/IIxIIcxSE30/IIxIIcxSE30_1M.bin > $@; cat bin/IIxIIcxSE30/IIxIIcxSE30_1M.bin >> $@
|
||||
|
||||
bin/IIxIIcxSE30/IIxIIcxSE30_4M.bin: bin/IIxIIcxSE30 bin/IIxIIcxSE30/IIxIIcxSE30_2M.bin
|
||||
cat bin/IIxIIcxSE30/IIxIIcxSE30_2M.bin > $@; cat bin/IIxIIcxSE30/IIxIIcxSE30_2M.bin >> $@
|
||||
|
||||
bin/IIxIIcxSE30/IIxIIcxSE30_8M.bin: bin/IIxIIcxSE30 bin/IIxIIcxSE30/IIxIIcxSE30_4M.bin
|
||||
cat bin/IIxIIcxSE30/IIxIIcxSE30_4M.bin > $@; cat bin/IIxIIcxSE30/IIxIIcxSE30_4M.bin >> $@
|
||||
|
||||
|
||||
bin/IIci/IIci_1M.bin: bin/IIci roms/IIci.bin
|
||||
cat roms/IIci.bin > $@; cat roms/IIci.bin >> $@
|
||||
|
||||
bin/IIci/IIci_2M.bin: bin/IIci bin/IIci/IIci_1M.bin
|
||||
cat bin/IIci/IIci_1M.bin > $@; cat bin/IIci/IIci_1M.bin >> $@
|
||||
|
||||
bin/IIci/IIci_4M.bin: bin/IIci bin/IIci/IIci_2M.bin
|
||||
cat bin/IIci/IIci_2M.bin > $@; cat bin/IIci/IIci_2M.bin >> $@
|
||||
|
||||
bin/IIci/IIci_8M.bin: bin/IIci bin/IIci/IIci_4M.bin
|
||||
cat bin/IIci/IIci_4M.bin > $@; cat bin/IIci/IIci_4M.bin >> $@
|
||||
|
||||
|
||||
bin/IIfx/IIfx_1M.bin: bin/IIfx roms/IIfx.bin
|
||||
cat roms/IIfx.bin > $@; cat roms/IIfx.bin >> $@
|
||||
|
||||
bin/IIfx/IIfx_2M.bin: bin/IIfx bin/IIfx/IIfx_1M.bin
|
||||
cat bin/IIfx/IIfx_1M.bin > $@; cat bin/IIfx/IIfx_1M.bin >> $@
|
||||
|
||||
bin/IIfx/IIfx_4M.bin: bin/IIfx bin/IIfx/IIfx_2M.bin
|
||||
cat bin/IIfx/IIfx_2M.bin > $@; cat bin/IIfx/IIfx_2M.bin >> $@
|
||||
|
||||
bin/IIfx/IIfx_8M.bin: bin/IIfx bin/IIfx/IIfx_4M.bin
|
||||
cat bin/IIfx/IIfx_4M.bin > $@; cat bin/IIfx/IIfx_4M.bin >> $@
|
||||
|
||||
|
||||
bin/IIsi/IIsi_1M.bin: bin/IIsi roms/IIsi.bin
|
||||
cat roms/IIsi.bin > $@; cat roms/IIsi.bin >> $@
|
||||
|
||||
bin/IIsi/IIsi_2M.bin: bin/IIsi bin/IIsi/IIsi_1M.bin
|
||||
cat bin/IIsi/IIsi_1M.bin > $@; cat bin/IIsi/IIsi_1M.bin >> $@
|
||||
|
||||
bin/IIsi/IIsi_4M.bin: bin/IIsi bin/IIsi/IIsi_2M.bin
|
||||
cat bin/IIsi/IIsi_2M.bin > $@; cat bin/IIsi/IIsi_2M.bin >> $@
|
||||
|
||||
bin/IIsi/IIsi_8M.bin: bin/IIsi bin/IIsi/IIsi_4M.bin
|
||||
cat bin/IIsi/IIsi_4M.bin > $@; cat bin/IIsi/IIsi_4M.bin >> $@
|
||||
|
||||
|
||||
.PHONY: clean
|
||||
|
1
RDiskCP/GW ROM Disk.hqx
Normal file
1
RDiskCP/GW ROM Disk.hqx
Normal file
File diff suppressed because one or more lines are too long
1
RDiskCP/RDiskCP.c
Normal file
1
RDiskCP/RDiskCP.c
Normal file
@ -0,0 +1 @@
|
||||
#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 & 0x01) || !(startup & 0x02)) && (ram & 0x01) ? 1 : 0);
HiliteControl((ControlHandle)h, (startup & 0x01) || !(startup & 0x02) ? 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 & 0x01) || !(startup & 0x02)) {
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;
}
|
1
RDiskCP/RDiskCP.c.hqx
Normal file
1
RDiskCP/RDiskCP.c.hqx
Normal file
File diff suppressed because one or more lines are too long
1
RDiskCP/RDiskCP.h
Normal file
1
RDiskCP/RDiskCP.h
Normal file
@ -0,0 +1 @@
|
||||
#ifndef RDISKCP_H
#define RDISKCP_H
#include <A4Stuff.h>
#define BootCheckbox 3
#define BootCaption 6
#define MountCheckbox 5
#define MountCaption 8
#define RAMCheckbox 7
#define RAMCaption 10
#define DebugCheckbox 13
#define DebugCaption 14
#define CDROMCheckbox 15
#define CDROMCaption 16
#define RDiskSigPtr ((char*)0x40851D90)
#define RDiskSigStr "\5RDisk" // sizeof(RDiskSigStr) == 7
#define RDiskDBGNamePos ((char**)0x40851DA0)
#define RDiskDBGDisPos ((char**)0x40851D98)
#define RDiskDBGDisByte ((char*)0x40851DA8)
#define RDiskCDROMNamePos ((char**)0x40851DA4)
#define RDiskCDROMDisPos ((char**)0x40851D9C)
#define RDiskCDROMDisByte ((char*)0x40851DA9)
#define RDiskRAMReq ((char*)0x40851DAA)
#pragma parameter __D0 RDiskCPReadXPRam(__D0, __D1, __A0)
short RDiskCPReadXPRam(short size, short offset, char *where) =
{0x4840, 0x3001, 0xA051};
#pragma parameter __D0 RDiskCPWriteXPRam(__D0, __D1, __A0)
short RDiskCPWriteXPRam(short size, short offset, char *where) =
{0x4840, 0x3001, 0xA052};
#endif
|
1
RDiskCP/RDiskCP.h.hqx
Normal file
1
RDiskCP/RDiskCP.h.hqx
Normal file
@ -0,0 +1 @@
|
||||
(This file must be converted with BinHex 4.0)
:#9*%DA0V3e!ZD!"849K868e$3`%!!!!$q!!!!4j-8L0TCQjNC@BJ8N4*8dY$8&p
)$50NC@CTEQ8J8N4*8dY$8&p)$3dMD@jME(9NC5!m3646G(9QCLjS2Jd0)f4PCQP
ZC5"#Efpd3fKPBfYLEhJJ-`dMC'9QD@jP)%*[Eh4$BA"dD@pZ)$B0)f4PCQPZC5"
0Eh9ZG%0SC@0VBQpi)$80)f4PCQPZC5"0Eh9ZG%0KF(4TEfiJ1!dMC'9QD@jP)&*
"680SC@0VBQpi)$F0)f4PCQPZC5"538e$BA"dD@pZ)$%`$50NC@CTEQ8J4'9LG@G
$D'9MDf*[H#!a-`dMC'9QD@jP)%4PBR9R3f&`G'P[EL!a0!dMC'9QD@jP)%0%8Np
03fKPBfYLEhJJ-680)f4PCQPZC5"$4&*2680KF(4TEfiJ-6B0$50NC@CTEQ8J8N4
TFfY6D@G3G()J+#KMD'&b+LN`H$3`1$8a4$N`+3dMC'9QD@jP)&*%DA0V8fPR8h4
b)#*F09*%DA0V)L![,b"cDATPEfBS8N4TFfY6D@G6G()T)$dp)$F0$50NC@CTEQ8
J8N4TFfY%3NG1B@eP8'pc)#JSBfKKFLSU+6"i0$!i06&%36!T$50NC@CTEQ8J8N4
TFfY%3NG%DA03Eh-J+#KMD'&b+LST-(Jd-$Je-83j1#N0)f4PCQPZC5"54'PcDd4
#4d4TFd*jG'8J+#KMD'&b+LN`H$3`1$8a4%%i+3dMC'9QD@jP)&*%DA0V3d456de
1B@eP8'pc)#JSBfKKFLSU+6"i0$!i06&%363T$50NC@CTEQ8J8N4TFfY$4&*2684
TFe"[Fb!S+'0SBA)U+LN`H$3`1$8a4$P$+3dMC'9QD@jP)&*%DA0V3d456de%DA0
#HA4P)#JSBfKKFLST-(Jd-$Je-84"15N0)f4PCQPZC5"54'PcDe*"69*PF5!S+'0
SBA)U+6"i0$!i06&%38%T$3dMF(*KCfeK)("KFQ&YCA4PFL"IAd3`)&*%DA0V3e"
5C@&N@&"5B@dSAep%-#`JAep%-5`JAep"-#N0FfK[FR3J8N4TFfY$8&*PB@4B8&*
KE5KcD'pbG#"cDATP,#"cD'pbG#"[CQCcCA3X)'0SBA)J+RGSCA*P+5!p$3Pl-(J
d1$3`,#!`H$-`-$%X)$"i36!e-Adl$3dMF(*KCfeK)("KFQ&YCA4PFL"IAd3`)&*
%DA0V3e"AFQPdC9K38Q&Y+&pI4$!X)&pI4$%X)&pI36!T$A0SEh*d)&*%DA0V3e"
AFQPdC9K38Q&Y+(0SEh*d)(0THQ8X)(0SEh*d)'pQCR0PG#`JBfKKFL!UGfKPFQ8
T)$dJ$3Pl-(Jd1$3`,#!`H$-`-$%X)$"i36!e-Rdl$3dMC@jND@B0TQX!!!%!!!!
"!!!!!!!!!!!H!3")9d*3!3+#i9Ve9d*D6eT2AH3$U#iH(f!+i6X#rFS*8N4TFfY
$8#jS!J!!!%**6N&6594i!3!!!!"!!!!!!!!!3NP1390*9(J"!!!!!%!!!!!!!!!
!!!!!!!!!!!!!!!$FrS,E!!!$q!!!!4i5#!%!!!#q%J-!!!!!!3j!CQ0,@8h)Z*P
,!33S8!%%mV5$!5#!@8d#5T!!CajB!M&m!)#e@8eB!L&mIrpX6`%GI'C2`p42CB-
"@%qYBr)#3QhjVZ%45'd"qEa-!IqL%4!I!@FSi5-"qEK-!Iq8*!&R'Z%M!IQd6!(
rKL6@i5-"qE"-!3!!!3!!!!%!!!!!!!!!!"i!!!!!!!!!!!!F!"lrrbjV:
|
126
RDiskCP/RDiskCP.hqx
Normal file
126
RDiskCP/RDiskCP.hqx
Normal file
@ -0,0 +1,126 @@
|
||||
(This file must be converted with BinHex 4.0)
|
||||
:"e*%DA0V3e!!68e38Ne03d-"!*!$&[i!!!@q4cKMEfpX!*!$!3#3!a`!!"CU!!!
|
||||
@KJ#3!hJ!N!-'!*!$1!!"!$!!!J!F!129M!#3"%#!QJS!!$2`!F92k!#3!f"@H2r
|
||||
r!FkKH!!!"'`!N!-'!!)!N!-#!"`*6'PLFQ&bD@9c-CLRN!!!N"m#!"`*6'PLFQ&
|
||||
bD@9c-CLRN!!!N"m#!#J!q2r`!*!&!G58!*!'-XB##!!!!3V,@!#3%#"YC@je!*!
|
||||
%*!$Yr`%!!3#3$Jp$E'9KFL"'D@aP)'ePER8!N!3",3#3"3-!!3!#!*!$MJP54'P
|
||||
cDd03,Q-!N"EFAP$i!3%!N!N#!!)!N!11$&*%DA0V3e!ZFR0bB`#3%paH5'J"!3#
|
||||
3#30!!J!!$Qi06@&M5'9KC'9bFcBi5`#3%UZmEmN"!3#3#34!!J!!#rN*3646G(9
|
||||
QCLjS!*!@Ul((UJ!"!*!*"3!#!*!$MJP54'PcDd03,QJ!N"EFAP"b!3%!N![%!!)
|
||||
!AJ#3!`3!!4pG!!!%E!#3!`%!N!3*8N4TFfY$8#jM!*!C"J#3"3(FAP$i!*!$"+Z
|
||||
aakS!N!-$Ula[b3#3!`AFAP"b!&`!AJ"R!!%!!3#3#3%!N!3-8N4TFfY$8#jbFh*
|
||||
M!*!F!YaH5'J!N!5VX3#3"aK[b3l`!!AFA1kQ3cJ!N!J"$!$M4C!!!*!(!J#3#3(
|
||||
rN!B!!J#3$8!!id@3!!%SLR#!5!#3"4)!3`!#!*!(5!#3!dJ!N!8)!!%!#!#3"L%
|
||||
-!*!0*!$M4C!!!!5VXFHU!*!$!kZmEmN!N!-&h&j3FJ"F!*!(*!$M4C!!!*!A-!#
|
||||
3"bJ!id@3!!!"!+3!%`$R!1hY2!#3"a!!N!m`!10&N!!!*!!!!R%"K3*f!!!#F3*
|
||||
fIrm"K!*e!REqlEkY!*!'"@)!!!i)!*!$B!!!"D)!!!KQ!*!'"'`!N!F'!*!84@G
|
||||
&E3#3!`%!N!-'rj!%!*!$&P*%DA0V!%9T!*!$!J#3!e!!N!-J!*!$&Nj@!!!LI%#
|
||||
&(C&d!'!NF!!3-5!!3H`!!")`)!")JE*!C`i31!&e!N!!J'B%F!"J$&*#-%*`"E(
|
||||
!CG4`!8jH6R@08N4TFfY$8%eKBd4PGJ!!4A3!N!-"!!%!N!-@!*!%4@N!N!-0!!!
|
||||
"Y!#3!iJ!!!'B6PErkNMR%#!NEJ!)0Li!$(!"FJ4"l[rl5%!`!D"4F!&b"8(ZrqY
|
||||
)3$!"S&&)E[rXU(3[#UKc,`S`!eC!2`")E[r`5'lrr%KZrr+TM5mZrr`),J!!rrY
|
||||
Q"(!!B!*`!6m!U@-[#M!$@N!r!%KZrr")E[rm5'lrmUQ0,blrr!JZ!!(rqfF)##i
|
||||
!!2rlC`4`!'!#F!%r!+PM,blrr!JZ!!$rqfB%F!"J"$!m!2mr!+PG,`S`!ej!2`"
|
||||
)E[r`5'lrr%KZrr+TM5mZrr`3,[rl!N!!!fF)##i!!2rVCJ4`!'!#F!%r!+PM,bl
|
||||
rr"!ZrrX#3!!$CJB`2!$rB!*`!$m!U9d[#R!0d%-r!%KZrr")E[rm5'lrmUQ0,bl
|
||||
rr!JZ!!,rqfF)##i!!2rlCJ4`!'!#F!%r!+PM,blrr!JZ!!$rqfF%F!"J"$!m!2m
|
||||
r!+PG,`T`$p"$2`")E[r`5'lrr%KZrr+TM5mZrr`),J!$rrYQ#!JZ!!$rqfB%F!"
|
||||
J!R!"2`#TBbmZrr`),J!!rrYR"(!!B!3`2!$r2`#TA5mZrqbSFdcI"!K1ANjeM9*
|
||||
%DA0V3e"9F'4KG'8!!%9T!*!$6`!!!9B!!!'X!!!'X8j@rrj`!A)%3HlrrdK!-!'
|
||||
J8A!"FJ9"l[rq5%!`!D"4-#i!#T!!EJ!-9d"R'&9!Cca93'GUA8"R!!#)98"R!!#
|
||||
`B!!!f"!Zrrm#3!!"C`S#,J!1rrpJ!!$%%#lrr`*!!!m!3!!"(8$rrf!!!,!3,[r
|
||||
r!N!!!@B!!+33,[rr!N!!!QF+!Li!$IrrB!!!N!!3,[rr!N!!$`"!!!)G32rrB(`
|
||||
3,[rr!N!!!fGb%#lrrJ*!!!&R"N)ZrrjJBKem!!(rrQ"D%#lrr`*!!!&R8"!Zrrm
|
||||
#3!!%C`J#,J!,rrpJ2K!Zrrm#3!!2!%!!""e!rrpJ,"!Zrrm#3!!"Cb)3,[rr!N!
|
||||
!#'F)!Li!"rrrB"!3,[rr!N!!$`"!!!JG32rrF!&b"%(Zrrp)3$!"S&*`!A)&3Hl
|
||||
rrNK!-!'J8MmZ!!`[,J!B6U`!!%jH6R@08N4TFfY$8%KTG%4PGJ!!4B%!N!-0!!%
|
||||
!!!&!!*!%4@N!N!04!*!$B!!!!Xi!!!XH6PErm#m+*(a!K4f4(A`!![r`6U`!!%U
|
||||
!C`iGDJ!'rr%GDJ!(rr*J$"em!$(rm4em!$,rmNKZrr")H8#)!#T)H8#*,*C#TkQ
|
||||
,*&p1ANjeMP*%DA0V3e"*EQPd4'9f!*!$4B%!N!-#!!%!N!-8!*!%4@S!N!06!*!
|
||||
$XJ!!!di!!!dK6PB!!%MR(c!k,J!D1#i!&LiZ!"!QEJ!-*'i!##B,6U`!!#`!-!8
|
||||
-3!!)BQM33$!l!!C1q`!#!")!4!!X!&i!1!!i!$J!AJ!`,`S[#bm(2bi!&$m%2bi
|
||||
!'$m&6U`!!%r[!"4f!f!Z6U`!!#B!B#Br"#m+6U`!!&a2B"S[#Lm,,`Fr,J!82`3
|
||||
r,J!B2`91V!!!6qm!&#!'`B`[3`!i60m-q%jH)&p2l`!86Y#%E@&TEJ#3!d@"!*!
|
||||
$6`!"!*!$MJ#3"%@"!*!$$3!"!*!$G!#3"%@"!*!$!J!"!*!$D!#3"%@"!*!$83!
|
||||
"!*!$A!#3"%@"!*!$9!!"!*!$)!#3"%9S8eP05!!!"%!!N!-8!*!9!3#3"aB!N!-
|
||||
%!*!$2!#3!`S!N!18!*!$$J#3!m!!N!-L!!!"*J#3!c!!!!&F!*!$1J!!!9m!N!-
|
||||
m!!!"PIq3"!!!!CB!!J#3!`2rN!2q!*!#3!``!N!-,!*!&!J!"!*!'!CJ!N!-
|
||||
3!!!#4!#3!ai!!!*R!*!$,!!!!XF!N!-b!!!#h!#3!cB!!!,b!*!$6!!!!bd!N!0
|
||||
L!!!$C`#3!hJ!!!1M!*!$PJ!!!r!!N!1Z!!!%,J#3!m3!!!4S!*!$j!!!"+i!N!2
|
||||
q!!!%l!!!!43!!!8S!!!"-J!!"A3!!!&+!!!&Y3!!!@!!!!Aa!!!"IJ!!"N!!!!'
|
||||
@!!!'QJ!!!C`!!!DZrj!%!!!'V`!)!*!$$[q3!rS!N!8+!*!$53#3!`X!N!8$!*!
|
||||
$5J#3!`F!![q3!qX!N!0,!*!$"`!#rj!$q`#3!d`!N!-,!!,rN!2`!*!$6Iq3!rF
|
||||
!![q3!r)!N!-S!*!$C`!#rj!$r!#3!dlrN!2k!!,rN!2X!!%!N!B(+!#3!`3!!!G
|
||||
a!*!$%J!!"j3!N!-J!!!(X`#3!d3!!!IN!*!$@!!!#"J!N!0S!!!)43#3!f`!!!K
|
||||
P!*!$H!!!#)%!N!1-!!!)YJ#3!j`!!!MT!*!$RJ!!#3F!N!1S!!!*)3#3!lJ!!!P
|
||||
&!*!$[J!!#@-!N!2!!!!*J`#3!mS!!!QF!*!$h!!!#G%!N!2X!!!+"!#3!qi!!!S
|
||||
N!*!$q!!!#Md!!!%+!!!+FJ!!!4S!!!Uc!!!"+!!!#YF!!!%f!!!+p`!!!8)!!!X
|
||||
Erj!%!!!,(!!&!*!$8!#3!`X"!J#3!`S!N!0*!*!$#`%#!*!$$!#3!`lrN!2k!3)
|
||||
!N!-B!*!$5J#3!`F!![q3!ri!N!0,!*!$"`!#rj!%!!%!N!B,Q!#3!`B!!![I!*!
|
||||
$$!!!$!8!N!-5!!!-&J#3!aS!!!`Z!*!$)!!!$&N!N!-Q!!!-K!#3!bJ!!!b1!*!
|
||||
$,J!!$+)!N!-d!!!-Z3#3!dJ!!!dHrj!%!!!0(`!#!*!$!rq3!ri!N!8+!*!$8[q
|
||||
3!qi!![q3!r!!!3#3"Jfq!*!$(!!!$F!!N!-H!!!0r`#3!b3!!!iS!*!$5!!!$N`
|
||||
!N!0L!!!1q!#3!fB!!!mL!*!$EJ!!$hN!N!0f!!!2R`#3!hS!!!qj!*!$P!!!%'%
|
||||
!N!1B!!!3GJ#3!j`!!"#$rj!%!!!3K!!*!*!$93#3!`X!N!8&!*!$8!#3!`X"!J#
|
||||
3!aJ!N!0*!*!$#`#3"33!N!0@!*!$#`%#!*!$&!#3!eIrN!2Y!*!&"`#3!ed!N!0
|
||||
N!*!&#`#3!`lrN!2k!*!&#J#3!ei!N!-$!*!&"J#3!em!N!-$!*!&!`!"rj!%!*!
|
||||
$"J#3!`%!N!-(!!(rN!2m!*!$"J#3!`%!N!-'!!(rN!2l!*!$!J#3!`%!N!-'!!,
|
||||
rN!2p!*!$"!#3!c)!"`#3!`ArN!2m!*!("[q3!rX!N!-'!*!$"`#3!fX!N!-)!*!
|
||||
$#!#3!`%!N!--!*!$#3#3!fJ!N!-X!*!$#J#3!`B!N!-`!*!$#`#3!`B!N!-a!!$
|
||||
rN!2q!!(rN!2p!!,rN!2h!*!$&J#3!`J!"!#3!aF!N!-,!*!('!#3!`X!N!-#!*!
|
||||
$'3#3!`X!N!-%!*!$'J#3!`X!N!-'!!,rN!2i!*!$%J#3!`i!!`#3!a-!N!0Q!*!
|
||||
(&!#3!`X!N!-%!*!$&Iq3!rF!N!-'!!,rN!2e!*!$(3#3!`S!!J#3!ai!N!-,!*!
|
||||
((rq3!rF!N!-#!!$rN!2f!!,rN!2e!!(rN!2c!*!$#!#3!`%!N!-'!!,rN!2d!*!
|
||||
$)J#3!`J!!3#3!b2rN!2c!*!&![q3!r)!N!-Q!*!$"!!#!*!$*`#3!`X!N!FS!*!
|
||||
$#`#3!`)!!2q3!qm!!3#3!fS!![q3!r!!N!-l!*!$0!!0!*!$22q3!qm!N!Fprj!
|
||||
$l`#3!`3!N!-qrj!$l`#3!`J!N!-rrj!$l`#3!``!N!0!rj!$l`#3!a!!N!0"rj!
|
||||
$l`#3!a3!N!0#rj!$l`#3!aJ!N!0$rj!$l`#3!a`!N!0%rj!$l`#3!b!!N!0&rj!
|
||||
$l`#3!b3!N!0'rj!$l`#3!bJ!N!0(rj!$l`#3!b`!N!0)rj!$l`#3!c!!!2q3!r%
|
||||
!!Iq3!r!!![q3!rN!N!-2!*!$E!!D!*!$%!#3!`X!N!F4rj!$q!#3!`)!N!-Erj!
|
||||
$p`#3!a!!N!-Frj!$pJ#3!aJ!N!-Jrj!$pJ#3!a`!N!-Krj!$p!#3!b!!N!-Nrj!
|
||||
$p!#3!bJ!N!-Prj!$mJ#3!c!!N!-Trj!$mJ#3!c3!N!-U!*!$#`#3!cJ!N!-Vrj!
|
||||
$p!#3!cS!N!-X!*!$#`#3!d)!N!-Y!*!$#`#3!d3!N!-Z!*!$"J#3!dB!N!-[!*!
|
||||
$"`#3!dF!N!-`!*!$#`#3!dJ!N!-a!*!$#`#3!dS!N!-b!*!$!`#3!d`!N!-c!*!
|
||||
$!`#3!e!!N!-d!*!$!`#3!e3!N!-e!*!$#`#3!eJ!N!-f!*!$#`#3!eS!N!-h!*!
|
||||
$C`#3!e`!N!-i!*!$C`#3!f!!N!-j!*!$C`#3!f3!N!-krj!$m3#3!fJ!!2q3!rS
|
||||
!!Iq3!rN!!Iq3!qi!N!-3!*!$!3#3!`B!![q3!q`!N!0B!*!$%!!&!*!$@3#3!`S
|
||||
!N!G9!*!$!J#3!`)!N!0D!*!$!J#3!`B!N!0Erj!$mJ#3!`S!N!0F!*!$#J#3!`i
|
||||
!!2q3!qd!!Iq3!q`$H%!b-3!"FP*%DA0V3e"0B@0%CAB!!k"SC()!!)&54'PcDdK
|
||||
NFJ!$BA0TC`!$eh*KE9*PFA9TFQ9N!!(#F'&dBfK'D@aP6Q&YC3!$b("KG'0S4QP
|
||||
XC8jKE@9@CA*TCRN!!Ie`BA4MD%CTE'9#HA4P!!0iF'&dBfK'D@aP3RPdC8*PCQp
|
||||
bC3!#(h"KG'0S4QPXC8*jG'9"CR4PFJ!"D@N!!6e54'PcDd039A"NBA4P!!$jBh"
|
||||
%D@&XEfF!!'0(FQ&Q8'pbG!!#X@4PGQPMC3!!6A"[FR4#DA4c!!)Q3QPd6@&`!!#
|
||||
cBQ&cC8&NC()!!(jbEhG#HA4PF`!#+f*[G@jNF`!!Ie*PBh3!!bpdEh!!!!aXC@C
|
||||
d!!)LBQpdG'pY!!(@FQPRD(3!!#4`Eh*d8Q9MG!!#-(CTFe*REJ!#$e*PCfP[EJ!
|
||||
$3A*REP0THQ8!!mjbCfj#3Qpi!!1NBfaTF&*REJ!"Q@*V8'&d!!1U8'&dG'9bEJ!
|
||||
$BA"KG!!$&'CTE'a3BA3!!F"`ENa[B`!"T&"[D@jd!!&fGJ!"D'J!!UY`EP0THQ8
|
||||
!!KP`ENe[C'8!!Ip`EP"KG!!"&h"Z9QPc!!,HG(K'Efjd!!*9G(K'B@0P!!+jCQP
|
||||
XE'9b!!)aG(K0Ef4P!!,MG(K6DATP!!1lFh"&H(4bB3!$AfCR3fpXEh)!!cKLDd0
|
||||
[E'pb!!1pBfpXFN*TG!!#aR"KG&0dFQ9dBfJ!!h4`D@06BACP!!1KFQGZ8f&fC3!
|
||||
!$("[E(P6BACP!!%bCh*KCP"bEf0c!!-M8843FQpMF`!!4h4PH(43FQpM!!#0E'P
|
||||
ZC9"bEf-!!,PbC@0d8(*[B`!"$R*5C@0d8(*[B`!!N@pfB@a3FQpM!!-KBA*M8(*
|
||||
[B`!!m("[E(P3FQpM!!1"FQGZ8(*[B`!!UQ*TG(03FQpM!!2ZBfpYE@9ZG&"bEf-
|
||||
!!MYdH%ePBA03FQpM!!,NCf9d8'PM8(*[B`!#FA"eG&"TBe"bEf-!!'pZG@e*G'9
|
||||
YF`!$BR*KE3!$KA0dBA*dGA!!!'pdHA"P!!&bFJ!!cA0KGQ93Eh*d!!''8N4TFfY
|
||||
$8%KTG%4PGJ!!S'PdC@d!!U&54'PcDd035@jTG%4PGJ!$"A*KE90THQ8!!,0YB@P
|
||||
Z!!"(8f9d3h9bFQ9ZG%%d!!0,E@9cFf&RC3!!2Q0`8(*TGQ&dC9CKE!!!E(4SC89
|
||||
fC@jd!!1P4ACPER45C@0[FQ3!!0PhD'&d!!"6GfKPEJ!"6hGSCA*P!!%XE@pND@C
|
||||
TCA*c!!$0Bf4PGP0dEh*KCf9@B@aeC3!"HQpXC%%d!!2UFQ9d!,kVZZX!N$d"!"J
|
||||
!N!8@8N4TFfY$8%eKBd4PGJ!!!3!B!*!%!CK54'PcDd039A"NBA4P!!!"!"J!N!3
|
||||
'X9*%DA0V3e")DA4%CAB!!!%!'J#3"!XH8N4TFfY$8%PZDA4%CAB!#J!"!"!!!3!
|
||||
!$5&YB@PZ!-N!N!2Ym$`!!!%H!!!"$P"'E(-!N!AYm$3!!!)X!*!$a&"-Fh3!N!S
|
||||
"(!#3!`*38f9Rrrm!N!NF!!!"!&"6C@F!!3#3#!2`!!!4iQpLDQ3IA3#3#"A5!*!
|
||||
$Y'*bGh-IA3!!jf3!!!%!N!-%h!!!!p`!N!2L!*!$!@%!N!3"B3#3"!&K!*!%!@%
|
||||
!N!3"B3#3!`G54'PcDd03!J#3!de08&*0680$!3$rN!3!N!84!!"069"568e$3`%
|
||||
!rj!%!*!5h&c[Q`!!&[i!!!@q!!&K!*!%!@%!N!3"B3#3"!&K!*!%!@%!N!3"B3#
|
||||
3"!&K!*!%!@%!N!3"B3#3"!&K!*!%!@%!N!3"B3#3"!&K!*!%!@%!N!3"B3#3"!&
|
||||
K!*!%!@%!N!3"B3#3"!&K!*!%!@%!N!3"B3#3"!&K!*!%!J!$!*!$5J!"!!N'6@p
|
||||
ZB@0[!*!F"!!S!!S"`J+!!#J!#J(#!S!!N"!"!*!%!J#3"5J!"!%!rrm!N!Mrr`'
|
||||
3"3#3""i"!3#3#*QC!*!&-!!&!*!($8eKBdKPB@4PFR-f1%X!N"`+!!)!N!X8!!3
|
||||
!N!J"!*!-$!!%!3!!!3!"!3#3"JF!!J#3#!F!!J#3"`)%!!)""d4bEh"XCA3!N2N
|
||||
""P0[Fh9YD3#3q`S!"!#3#l`!"!!"#dGA)&*265"%DA0V!*!dFQ4cDf0NCAB!N%K
|
||||
MC'9fm#!!N!HF!2B"2!(F!3#3!`[#!*!$MJ#3$!%!N!-%h!!!!p`!N!2L!10'b!U
|
||||
S!*!$(!$5!!*`FQ9Q!!S!'R"@CA)!N!1H8e45)`#3!kS!!2rr!*!$"J#3"3(rr`#
|
||||
3!eS!N!8#rrm!N!1'!*!&"rrr!*!$ZJ#3"32rr`#3!mJ!N!8%rrm!N!2J!*!&"[r
|
||||
r!*!$m!#3"3Mrr`#3!rX!N!8*rrm!!!%'!*!&b2rr!!!$$J#3"3Arr`!!!a`!N"!
|
||||
$m2rr!*!$9!#3"!p3FQpUC@0d)&CPFR0TEfkbk3:
|
34
RDiskCP/RDiskCP.rsrc.hqx
Normal file
34
RDiskCP/RDiskCP.rsrc.hqx
Normal file
@ -0,0 +1,34 @@
|
||||
(This file must be converted with BinHex 4.0)
|
||||
:$&*%DA0V3e!ZFR0bB`"bFh*M8P0&4#'!!*!'#UM`C3#3"!%!N!-*N`!!#*-!!!%
|
||||
98dP8C90*9%`"!*!'"BR#!3!,!90*9'96594-!J!-8N4TFfY$8#jbFh*M!J)!N!0
|
||||
bFh*M8P0&4#'!rj!%!!"bFh*M8P0&4#'!rj!%!*!5h&c[T!#3"JUS8dP8C90*9%`
|
||||
'!*!'"C'#!3!,!90*9'9`BA9Xr`#3"J@E3J%!#`&6594PFfKXBJ%!N!B&NS)"!!X
|
||||
"8dP8CA0SE')#!*!'"C1#!J!,!90*9'9cD'aL!`#3"J@9JJ3!#`&6594PFfKXBJ3
|
||||
!N!B&QB)!3!#3!`S!!Irr!&F!h`&#!*!$J!#382q3#2L)N!D2q)lSlSlSlSrrL*!
|
||||
'M`rrN!F!N!Y!!*!8rrq!!CYY`!&rr`#3&[q3#(rr!*!%!3#38Iq3")!!!!'2(Ma
|
||||
jL4)N5BN5*%Q*%L4*MaimHF!!!!&99G99Irprr`#3@2q3)(rrN!0rrj!$!*!+!J#
|
||||
3r`#33[q3%2L)N!k2q)MZlSL1lZL)lZk)MZlSMrL)lZk)MZlSL1lZL)lZk)riL1l
|
||||
ZL)lZk)MZlSL1lZL2q)MZlSL1lZL)lZk)MZlSMrL)lZk)MZlSL1lZL)lZk)rrL*!
|
||||
1M`q"N!D2ri'3"Sm2rj!($rq3"`#3)`GMC'9f!*!'((*NFfX!N!-"4P*&4J#3"2!
|
||||
J5801)`#3"2!J!*!$Z`#l!*!&)!!J%3'J!))"!!S!N!8J!##3!!!%!*!&)!!J!*!
|
||||
&)!!J!*!&)!!J!*!Zrj!%J!!!!BmH2(Q*%L4*L4)N5BN5*%Q2(Maj`!!!!999e99
|
||||
rrhrr!*!XS!#$r`#3!`3!!2rr!*!$63"0!*-!B!#9!8%4!D!!JU!!MJ%!#J#3"!,
|
||||
3!N#B!"i!N`"J!*8"5!#6!'!!P3&"!*-!B!#9!8%!!!APL!'!!!APL!'!!+!!Mk!
|
||||
!Jrm!!!%!N"B#Dp!!N+d#E2!!N$S#DJ!2!*!&!3!H!#8"')9*)*!54f&bFQ9dG#G
|
||||
c)&G[FQYcD'p`$5#3%e*265"%DA0V)&0PG(4TEQGc!*!'!`%(!#-"*m!#!)!!N!8
|
||||
V!&`!23%p"4*#Efpd)'CbEfdJ8Np0)'4TFfX!N!8j!'m!43%qL#&"E(GKHA-JBQp
|
||||
[G#"cHA0dC@dJCR*[E5"56ddJC'PcDbi!N!C+!&`!A!%p"3j0Eh9ZG#"56ddJC'P
|
||||
cD`#3"9J!E`"N!6k)+8e[G@jd)'4TFfXJGfKPEL"LEfpdD@jR)'CbEfdJEh4SCA)
|
||||
JC(*TGQ8Z!*!'D3"F!(X"23824@jKBQaP)&*"65"NDA0V!*!'G`"[!)-"2SJU3@a
|
||||
XEhFJGh*TG'PZCb"dEb"56ddJC'PcDbiJAM"03L"538dJFQ9a*f3Z!*!&cJ"F!0S
|
||||
"2BJQ3fKKEQGPFb"hD@aX)(4KDf8JC@CQC@0d)'&QG'9b)(*PBQp[G#i!N!8R!&`
|
||||
!+!%p`!)!J3#3"FS!A!$,!6h!!J#"!*!&L!"F!)N"2F!#!)%!N!@-!&`!QJ%p"3p
|
||||
&EQ&LE'8JC'9LG@GRCA)!N!DD!'m!TJ%qL#*&EQ&LE'8J*eia*b"hD'9Z)'*[Eh4
|
||||
TEQFJCR*[E5"56ddZ!*!&U`"F!,N"23894@jKBQaP)%0%,9*265"cGA"`Eh*d!*!
|
||||
'Z3"[!-8"2SJL4@jKBQaP)#GH-LFJGfKPEL"LEfpdD@jR)'CbEfdJ8Np0,J!!!3#
|
||||
3!`Q6!!!)N`!!!48!dqYN$CJ!N!-F!3B!#QjbBh3!N!0DD@0c0!#3!fCTBh-M!*!
|
||||
$FNP$6L-!N!0q4P*&4J#3!iT#6N4-!*!$PQPME$3!N!1L8%P$9!!"!+jYB@0S!*!
|
||||
$aR*NFfX!N!254%P86!#3!pl`)2rr!*!)m#$rr`#3!`i!N!6`)2rr!*!$NJ#3"2!
|
||||
JrrmJ!!$@!*!%m#$rr`!!!pi!N!6`)2rr!!!$k3#3"2!Jrrm!!!(D!*!&J2rr!!!
|
||||
%#3$6rVJ!JIrr!!!%d!$6rXM`)2rr!!!%b!#3#J8K!*!%m#$rr`!!"L8!drm!$Np
|
||||
hEQ9b)(*PFfpeFQ0P8D8!:
|
13
checksum.py
Normal file
13
checksum.py
Normal file
@ -0,0 +1,13 @@
|
||||
import sys
|
||||
import struct
|
||||
|
||||
with open(sys.argv[1], mode='rb') as file:
|
||||
file.read(4) # discard first four bytes
|
||||
rombin = file.read() # read rest of file
|
||||
cksum = 0
|
||||
count = 0;
|
||||
for i in struct.unpack('>' + str(len(rombin)/2) + 'H', rombin):
|
||||
cksum += i
|
||||
count += 1
|
||||
cksum &= 0xFFFFFFFF
|
||||
print(hex(cksum))
|
BIN
disks/RDisk7M5.dsk
Normal file
BIN
disks/RDisk7M5.dsk
Normal file
Binary file not shown.
14
entry.s
14
entry.s
@ -4,13 +4,6 @@
|
||||
.EQU kioResult, 16
|
||||
.EQU kcsCode, 26
|
||||
.EQU JIODone, 0x08FC
|
||||
.GLOBAL RDiskSig
|
||||
.GLOBAL RDiskDBGNamePos
|
||||
.GLOBAL RDiskDBGDisPos
|
||||
.GLOBAL RDiskDBGDisByte
|
||||
.GLOBAL RDiskCDRNamePos
|
||||
.GLOBAL RDiskCDRDisPos
|
||||
.GLOBAL RDiskCDRDisByte
|
||||
|
||||
dc.l 0x00000000, 0x00000000, 0x00000000, 0x00000000
|
||||
dc.l 0x00000000, 0x00000000, 0x00000000, 0x00000000
|
||||
@ -21,11 +14,11 @@ RDiskSig:
|
||||
RDiskDBGDisPos:
|
||||
dc.l 0x00000031
|
||||
RDiskCDRDisPos:
|
||||
dc.l 0x00012CAF
|
||||
dc.l 0xFFFFFFFF
|
||||
RDiskDBGNameAddr:
|
||||
dc.l 0x4088002A
|
||||
RDiskCDRNameAddr:
|
||||
dc.l 0x40892C96
|
||||
dc.l 0x00000000
|
||||
RDiskDBGDisByte:
|
||||
dc.b 0x44
|
||||
RDiskCDRDisByte:
|
||||
@ -34,6 +27,9 @@ RDiskRAMRequired:
|
||||
.ascii "16"
|
||||
|
||||
.align 4
|
||||
RDiskSize:
|
||||
dc.l 0x00780000
|
||||
|
||||
DOpen:
|
||||
movem.l %A0-%A1, -(%SP)
|
||||
bsr RDOpen
|
||||
|
89
old/Makefile
Normal file
89
old/Makefile
Normal file
@ -0,0 +1,89 @@
|
||||
# path to RETRO68
|
||||
RETRO68=~/Retro68-build/toolchain
|
||||
|
||||
PREFIX=$(RETRO68)/bin/m68k-apple-macos
|
||||
AS=$(PREFIX)-as
|
||||
CC=$(PREFIX)-gcc
|
||||
LD=$(PREFIX)-ld
|
||||
OBJCOPY=$(PREFIX)-objcopy
|
||||
OBJDUMP=$(PREFIX)-objdump
|
||||
CFLAGS=-march=68030 -c -Os
|
||||
|
||||
all: bin/rom16M_swap.bin obj/rdisk7M5.s obj/driver7M5.s obj/entry_rel.sym obj/driver_abs.sym
|
||||
|
||||
obj:
|
||||
mkdir obj
|
||||
|
||||
bin:
|
||||
mkdir bin
|
||||
|
||||
|
||||
obj/entry.o: entry.s obj
|
||||
$(AS) $< -o $@
|
||||
|
||||
obj/entry_rel.sym: obj obj/entry.o
|
||||
$(OBJDUMP) -t obj/entry.o > $@
|
||||
|
||||
|
||||
obj/rdisk7M5.o: rdisk.c obj
|
||||
$(CC) -Wall -DRDiskSize=7864320 $(CFLAGS) $< -o $@
|
||||
|
||||
obj/rdisk7M5.s: obj obj/rdisk7M5.o
|
||||
$(OBJDUMP) -d obj/rdisk7M5.o > $@
|
||||
|
||||
|
||||
obj/spi.o: spi.c obj
|
||||
$(CC) -Wall $(CFLAGS) $< -o $@
|
||||
|
||||
obj/spi.s: obj obj/spi.o
|
||||
$(OBJDUMP) -d obj/spi.o > $@
|
||||
|
||||
|
||||
obj/sdmmc.o: sdmmc.c obj
|
||||
$(CC) -Wall $(CFLAGS) -Os $< -o $@
|
||||
|
||||
obj/sdmmc.s: obj obj/sdmmc.o
|
||||
$(OBJDUMP) -d obj/sdmmc.o > $@
|
||||
|
||||
|
||||
|
||||
obj/driver7M5.o: obj obj/entry.o obj/rdisk7M5.o
|
||||
$(LD) -Ttext=40851D70 -o $@ obj/entry.o obj/rdisk7M5.o obj/spi.o obj/sdmmc.o
|
||||
|
||||
obj/driver7M5.s: obj obj/driver7M5.o
|
||||
$(OBJDUMP) -d obj/driver7M5.o > $@
|
||||
|
||||
obj/driver_abs.sym: obj obj/driver7M5.o
|
||||
$(OBJDUMP) -t obj/driver7M5.o > $@
|
||||
|
||||
|
||||
bin/driver7M5.bin: bin obj/driver7M5.o
|
||||
$(OBJCOPY) -O binary obj/driver7M5.o $@
|
||||
|
||||
bin/rom8M.bin: bin baserom.bin RDisk7M5.dsk bin bin/driver7M5.bin obj/driver_abs.sym obj/entry_rel.sym
|
||||
cp baserom.bin $@ # Copy base rom
|
||||
# Patch driver
|
||||
dd if=bin/driver7M5.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
|
||||
cat obj/entry_rel.sym | grep "DOpen" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335224 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "DPrime" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335226 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "DControl" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335228 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "DStatus" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335230 count=2 conv=notrunc
|
||||
cat obj/entry_rel.sym | grep "DClose" | cut -c5-8 | xxd -r -p - | dd of=$@ bs=1 seek=335232 count=2 conv=notrunc
|
||||
dd if=RDisk7M5.dsk of=$@ bs=1024 seek=512 count=7680 conv=notrunc # copy disk image
|
||||
|
||||
bin/rom8M_swap.bin: bin bin/rom8M.bin
|
||||
dd if=bin/rom8M.bin of=$@ conv=swab # swap bytes
|
||||
|
||||
bin/iisi_swap.bin: bin iisi.bin
|
||||
dd if=iisi.bin of=$@ conv=swab # swap bytes
|
||||
|
||||
bin/rom16M_swap.bin: bin/iisi_swap.bin bin/rom8M_swap.bin
|
||||
cat bin/rom8M_swap.bin > $@
|
||||
cat bin/iisi_swap.bin >> $@
|
||||
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -fr bin obj
|
84
old/entry.s
Normal file
84
old/entry.s
Normal file
@ -0,0 +1,84 @@
|
||||
.EQU killCode, 1
|
||||
.EQU noQueueBit, 9
|
||||
.EQU kioTrap, 6
|
||||
.EQU kioResult, 16
|
||||
.EQU kcsCode, 26
|
||||
.EQU JIODone, 0x08FC
|
||||
.GLOBAL RDiskSig
|
||||
.GLOBAL RDiskDBGNamePos
|
||||
.GLOBAL RDiskDBGDisPos
|
||||
.GLOBAL RDiskDBGDisByte
|
||||
.GLOBAL RDiskCDRNamePos
|
||||
.GLOBAL RDiskCDRDisPos
|
||||
.GLOBAL RDiskCDRDisByte
|
||||
|
||||
dc.l 0x00000000, 0x00000000, 0x00000000, 0x00000000
|
||||
dc.l 0x00000000, 0x00000000, 0x00000000, 0x00000000
|
||||
|
||||
RDiskSig:
|
||||
.ascii "\5RDisk\0"
|
||||
.align 4
|
||||
RDiskDBGDisPos:
|
||||
dc.l 0x00000031
|
||||
RDiskCDRDisPos:
|
||||
dc.l 0x00012CAF
|
||||
RDiskDBGNameAddr:
|
||||
dc.l 0x4088002A
|
||||
RDiskCDRNameAddr:
|
||||
dc.l 0x40892C96
|
||||
RDiskDBGDisByte:
|
||||
dc.b 0x44
|
||||
RDiskCDRDisByte:
|
||||
dc.b 0x44
|
||||
RDiskRAMRequired:
|
||||
.ascii "16"
|
||||
|
||||
.align 4
|
||||
DOpen:
|
||||
movem.l %A0-%A1, -(%SP)
|
||||
bsr RDOpen
|
||||
movem.l (%SP)+, %A0-%A1
|
||||
rts
|
||||
|
||||
DClose:
|
||||
movem.l %A0-%A1, -(%SP)
|
||||
bsr RDClose
|
||||
movem.l (%SP)+, %A0-%A1
|
||||
rts
|
||||
|
||||
DPrime:
|
||||
movem.l %A0-%A1, -(%SP)
|
||||
bsr RDPrime
|
||||
movem.l (%SP)+, %A0-%A1
|
||||
bra.b IOReturn
|
||||
|
||||
DControl:
|
||||
movem.l %A0-%A1, -(%SP)
|
||||
bsr RDCtl
|
||||
movem.l (%SP)+, %A0-%A1
|
||||
cmpi.w #killCode, kcsCode(%A0)
|
||||
bne.b IOReturn
|
||||
rts
|
||||
|
||||
DStatus:
|
||||
movem.l %A0-%A1, -(%SP)
|
||||
bsr RDStat
|
||||
movem.l (%SP)+, %A0-%A1
|
||||
|
||||
IOReturn:
|
||||
move.w kioTrap(%A0), %D1
|
||||
btst #noQueueBit, %D1
|
||||
beq.b Queued
|
||||
|
||||
NotQueued:
|
||||
tst.w %D0
|
||||
ble.b ImmedRTS
|
||||
clr.w %D0
|
||||
|
||||
ImmedRTS:
|
||||
move.w %D0, kioResult(%A0)
|
||||
rts
|
||||
|
||||
Queued:
|
||||
move.l JIODone, -(%SP)
|
||||
rts
|
353
rdisk.c
Normal file
353
rdisk.c
Normal file
@ -0,0 +1,353 @@
|
||||
#include <Memory.h>
|
||||
#include <Devices.h>
|
||||
#include <Files.h>
|
||||
#include <Disks.h>
|
||||
#include <Errors.h>
|
||||
#include <Events.h>
|
||||
#include <OSUtils.h>
|
||||
|
||||
#include "rdisk.h"
|
||||
|
||||
// Decode keyboard/PRAM settings
|
||||
static void RDDecodeSettings(Ptr unmountEN, Ptr mountEN, Ptr ramEN, Ptr dbgEN, Ptr cdrEN) {
|
||||
// Sample R and A keys repeatedly
|
||||
char r = 0, a = 0;
|
||||
long tmax = TickCount() + 60;
|
||||
for (long i = 0; i < 1000000; i++) {
|
||||
a |= RDiskIsAPressed();
|
||||
r |= RDiskIsRPressed() | a;
|
||||
if (r) { break; }
|
||||
if (TickCount() > tmax) { break; }
|
||||
}
|
||||
|
||||
// Read PRAM
|
||||
char legacy_startup, legacy_ram;
|
||||
RDiskReadXPRAM(1, 4, &legacy_startup);
|
||||
RDiskReadXPRAM(1, 5, &legacy_ram);
|
||||
|
||||
// Decode settings: unmount (don't boot), mount (after boot), RAM disk
|
||||
if (r) { // R boots from ROM disk
|
||||
*unmountEN = 0; // Don't unmount so we boot from this drive
|
||||
*mountEN = 0; // No need to mount later since we are boot disk
|
||||
*ramEN = a; // A enables RAM disk
|
||||
*dbgEN = 0;
|
||||
*cdrEN = 0;
|
||||
} else {
|
||||
if (legacy_startup & 0x01) { // Boot from ROM disk
|
||||
*unmountEN = 0; // Don't unmount so we boot from this drive
|
||||
*mountEN = 0; // No need to mount later since we are boot disk
|
||||
*ramEN = legacy_ram & 0x01; // Allocate RAM disk if bit 0 == 1
|
||||
*dbgEN = legacy_startup & 0x04; // MacsBug enabled if bit 2 == 1
|
||||
*cdrEN = legacy_startup & 0x08; // CD-ROM enabled if bit 3 == 1
|
||||
} else if (!(legacy_startup & 0x02)) { // Mount ROM disk
|
||||
*unmountEN = 1; // Unmount to not boot from our disk
|
||||
*mountEN = 1; // Mount in accRun
|
||||
*ramEN = legacy_ram & 0x01; // Allocate RAM disk if bit 0 == 1
|
||||
*dbgEN = 1; // CD-ROM ext. always enabled in mount mode
|
||||
*cdrEN = 1; // MacsBug always enabled in mount mode
|
||||
} else {
|
||||
*unmountEN = 1; // Unmount
|
||||
*mountEN = 0; // Don't mount again
|
||||
*ramEN = 0; // Don't allocate RAM disk
|
||||
*dbgEN = 1; // CD-ROM ext. always enabled in unmount mode
|
||||
*cdrEN = 1; // MacsBug always enabled in unmount mode
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Switch to 32-bit mode and copy
|
||||
#pragma parameter C24(__A0, __A1, __D0)
|
||||
void __attribute__ ((noinline)) C24(Ptr sourcePtr, Ptr destPtr, unsigned long byteCount) {
|
||||
signed char mode = true32b;
|
||||
SwapMMUMode(&mode);
|
||||
BlockMove(sourcePtr, destPtr, byteCount);
|
||||
SwapMMUMode(&mode);
|
||||
}
|
||||
|
||||
// Switch to 32-bit mode and get
|
||||
#pragma parameter __D0 G24(__A2)
|
||||
char __attribute__ ((noinline)) G24(Ptr pos) {
|
||||
long ret;
|
||||
signed char mode = true32b;
|
||||
SwapMMUMode(&mode);
|
||||
ret = *pos; // Peek
|
||||
SwapMMUMode(&mode);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Switch to 32-bit mode and set
|
||||
#pragma parameter S24(__A2, __D3)
|
||||
void __attribute__ ((noinline)) S24(Ptr pos, char patch) {
|
||||
signed char mode = true32b;
|
||||
SwapMMUMode(&mode);
|
||||
*pos = patch; // Poke
|
||||
SwapMMUMode(&mode);
|
||||
}
|
||||
|
||||
// Figure out the first available drive number >= 5
|
||||
static int RDFindDrvNum() {
|
||||
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 RDOpen(__A0, __A1)
|
||||
OSErr RDOpen(IOParamPtr p, DCtlPtr d) {
|
||||
int drvNum;
|
||||
RDiskStorage_t *c;
|
||||
char legacy_startup;
|
||||
|
||||
// Do nothing if already opened
|
||||
if (d->dCtlStorage) { return noErr; }
|
||||
|
||||
// Do nothing if inhibited
|
||||
RDiskReadXPRAM(1, 4, &legacy_startup);
|
||||
if (legacy_startup & 0x80) { return noErr; }
|
||||
|
||||
// Allocate storage struct
|
||||
d->dCtlStorage = NewHandleSysClear(sizeof(RDiskStorage_t));
|
||||
if (!d->dCtlStorage) { return openErr; }
|
||||
|
||||
// Lock our storage struct and get master pointer
|
||||
HLock(d->dCtlStorage);
|
||||
c = *(RDiskStorage_t**)d->dCtlStorage;
|
||||
|
||||
// Find first available drive number
|
||||
drvNum = RDFindDrvNum();
|
||||
|
||||
// Get debug and CD-ROM disable settings from ROM table
|
||||
c->dbgDisByte = RDiskDBGDisByte;
|
||||
c->cdrDisByte = RDiskCDRDisByte;
|
||||
|
||||
// Set drive status
|
||||
//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;
|
||||
//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;
|
||||
|
||||
// Decompress icon
|
||||
#ifdef RDISK_COMPRESS_ICON_ENABLE
|
||||
char *src = &RDiskIconCompressed[0];
|
||||
char *dst = &c->icon[0];
|
||||
UnpackBits(&src, &dst, RDISK_ICON_SIZE);
|
||||
#endif
|
||||
|
||||
// Add drive to drive queue and return
|
||||
RDiskAddDrive(c->status.dQRefNum, drvNum, (DrvQElPtr)&c->status.qLink);
|
||||
return noErr;
|
||||
}
|
||||
|
||||
// Init is called at beginning of first prime (read/write) call
|
||||
static void RDInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) {
|
||||
char unmountEN, mountEN, ramEN, dbgEN, cdrEN;
|
||||
// Mark init done
|
||||
c->initialized = 1;
|
||||
// Decode settings
|
||||
RDDecodeSettings(&unmountEN, &mountEN, &ramEN, &dbgEN, &cdrEN);
|
||||
|
||||
// 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
|
||||
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
|
||||
*BufPtr = (Ptr)newBufPtr;
|
||||
// Set RAM disk buffer pointer.
|
||||
c->ramdisk = *BufPtr;
|
||||
// Copy ROM disk image to RAM disk
|
||||
BlockMove(RDiskBuf, c->ramdisk, RDiskSize);
|
||||
// Clearing write protect marks RAM disk enabled
|
||||
c->status.writeProt = 0;
|
||||
}
|
||||
} else { // 24-bit mode
|
||||
// Put RAM disk just past 8MB
|
||||
c->ramdisk = (Ptr)(8 * 1024 * 1024);
|
||||
// Copy ROM disk image to RAM disk
|
||||
//FIXME: what if we don't have enough RAM?
|
||||
// Will this wrap around and overwrite low memory?
|
||||
// That's not the worst, since the system would just crash,
|
||||
// but it would be better to switch to read-only status
|
||||
copy24(RDiskBuf, c->ramdisk, RDiskSize);
|
||||
// Clearing write protect marks RAM disk enabled
|
||||
c->status.writeProt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Patch
|
||||
if (RDiskDBGDisPos < RDiskSize) {
|
||||
if (c->ramdisk && !dbgEN) {
|
||||
poke24(c->ramdisk + RDiskDBGDisPos, c->dbgDisByte);
|
||||
} else if (dbgEN) {
|
||||
peek24(RDiskBuf + RDiskDBGDisPos, c->dbgDisByte);
|
||||
}
|
||||
}
|
||||
if (RDiskCDRDisPos < RDiskSize) {
|
||||
if (c->ramdisk && !cdrEN) {
|
||||
poke24(c->ramdisk + RDiskCDRDisPos, c->cdrDisByte);
|
||||
} else if (cdrEN) {
|
||||
peek24(RDiskBuf + RDiskCDRDisPos, c->cdrDisByte);
|
||||
}
|
||||
}
|
||||
|
||||
// Unmount if not booting from ROM disk
|
||||
if (unmountEN) { c->status.diskInPlace = 0; }
|
||||
|
||||
// If mount enabled, enable accRun to post disk inserted event later
|
||||
if (mountEN) {
|
||||
d->dCtlDelay = 150; // Set accRun delay (150 ticks is 2.5 sec.)
|
||||
d->dCtlFlags |= dNeedTimeMask; // Enable accRun
|
||||
}
|
||||
}
|
||||
|
||||
#pragma parameter __D0 RDPrime(__A0, __A1)
|
||||
OSErr RDPrime(IOParamPtr p, DCtlPtr d) {
|
||||
RDiskStorage_t *c;
|
||||
char cmd;
|
||||
Ptr disk;
|
||||
|
||||
// Return disk offline error if dCtlStorage null
|
||||
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) { RDInit(p, d, c); }
|
||||
|
||||
// Return disk offline error if virtual disk not inserted
|
||||
if (!c->status.diskInPlace) { return offLinErr; }
|
||||
|
||||
// Get pointer to RAM or ROM disk buffer
|
||||
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
|
||||
// Read from disk into buffer.
|
||||
if (*MMU32bit) { BlockMove(disk, p->ioBuffer, p->ioReqCount); }
|
||||
else { copy24(disk, StripAddress(p->ioBuffer), p->ioReqCount); }
|
||||
if (!c->ramdisk && RDiskDBGDisPos >= d->dCtlPosition &&
|
||||
RDiskDBGDisPos < d->dCtlPosition + p->ioReqCount) {
|
||||
p->ioBuffer[RDiskDBGDisPos - d->dCtlPosition] = c->dbgDisByte;
|
||||
}
|
||||
if (!c->ramdisk && RDiskCDRDisPos >= d->dCtlPosition &&
|
||||
RDiskCDRDisPos < d->dCtlPosition + p->ioReqCount) {
|
||||
p->ioBuffer[RDiskCDRDisPos - d->dCtlPosition] = c->cdrDisByte;
|
||||
}
|
||||
} 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 { copy24(StripAddress(p->ioBuffer), disk, p->ioReqCount); }
|
||||
} 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 RDCtl(__A0, __A1)
|
||||
OSErr RDCtl(CntrlParamPtr p, DCtlPtr d) {
|
||||
RDiskStorage_t *c;
|
||||
// Fail if dCtlStorage null
|
||||
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 killCode:
|
||||
return noErr;
|
||||
case kFormat:
|
||||
if (!c->status.diskInPlace || c->status.writeProt ||
|
||||
!c->ramdisk) { return controlErr; }
|
||||
long long z = 0;
|
||||
Ptr pz;
|
||||
if (*MMU32bit) { pz = (Ptr)&z; }
|
||||
else { pz = StripAddress((Ptr)&z); }
|
||||
for (int i = 0; i < 4095; i++) {
|
||||
copy24(c->ramdisk + i * sizeof(z), pz, sizeof(z));
|
||||
}
|
||||
return noErr;
|
||||
case kVerify:
|
||||
if (!c->status.diskInPlace) { return controlErr; }
|
||||
return noErr;
|
||||
case kEject:
|
||||
// "Reinsert" disk if ejected illegally
|
||||
if (c->status.diskInPlace) {
|
||||
PostEvent(diskEvt, c->status.dQDrive);
|
||||
}
|
||||
return controlErr; // Eject not allowed so return error
|
||||
case accRun:
|
||||
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 kDriveIcon: case kMediaIcon: // Get icon
|
||||
#ifdef RDISK_COMPRESS_ICON_ENABLE
|
||||
*(Ptr*)p->csParam = (Ptr)c->icon;
|
||||
#else
|
||||
*(Ptr*)p->csParam = (Ptr)RDiskIcon;
|
||||
#endif
|
||||
return noErr;
|
||||
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 = 0x00000411; }
|
||||
else { *(long*)p->csParam = 0x00000410; }
|
||||
return noErr;
|
||||
case 24: // Return SCSI partition size
|
||||
*(long*)p->csParam = RDiskSize / 512;
|
||||
return noErr;
|
||||
case 2351: // Post-boot
|
||||
c->initialized = 1; // Skip initialization
|
||||
d->dCtlDelay = 30; // Set accRun delay (30 ticks is 0.5 sec.)
|
||||
d->dCtlFlags |= dNeedTimeMask; // Enable accRun
|
||||
return noErr;
|
||||
default: return controlErr;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma parameter __D0 RDStat(__A0, __A1)
|
||||
OSErr RDStat(CntrlParamPtr p, DCtlPtr d) {
|
||||
//RDiskStorage_t *c;
|
||||
// Fail if dCtlStorage null
|
||||
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 kDriveStatus:
|
||||
BlockMove(*d->dCtlStorage, &p->csParam, sizeof(DrvSts2));
|
||||
return noErr;
|
||||
default: return statusErr;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma parameter __D0 RDClose(__A0, __A1)
|
||||
OSErr RDClose(IOParamPtr p, DCtlPtr d) {
|
||||
// If dCtlStorage not null, dispose of it
|
||||
if (!d->dCtlStorage) { return noErr; }
|
||||
//RDiskStorage_t *c = *(RDiskStorage_t**)d->dCtlStorage;
|
||||
HUnlock(d->dCtlStorage);
|
||||
DisposeHandle(d->dCtlStorage);
|
||||
d->dCtlStorage = NULL;
|
||||
return noErr;
|
||||
}
|
206
rdisk.h
Normal file
206
rdisk.h
Normal file
@ -0,0 +1,206 @@
|
||||
#ifndef RDISK_H
|
||||
#define RDISK_H
|
||||
|
||||
#define RDiskBuf ((char*)0x40880000)
|
||||
#define BufPtr ((Ptr*)0x10C)
|
||||
#define MemTop ((Ptr*)0x108)
|
||||
#define MMU32bit ((char*)0xCB2)
|
||||
|
||||
#define RDiskDBGDisPos (*(const unsigned long*)0x40851D98)
|
||||
#define RDiskCDRDisPos (*(const unsigned long*)0x40851D9C)
|
||||
#define RDiskDBGDisByte (*(const char*)0x40851DA8)
|
||||
#define RDiskCDRDisByte (*(const char*)0x40851DA9)
|
||||
#define RDiskSize (*(const unsigned long*)0x40851DAC)
|
||||
|
||||
#define RDISK_COMPRESS_ICON_ENABLE
|
||||
|
||||
#pragma parameter __D0 RDiskReadXPRAM(__D0, __D1, __A0)
|
||||
OSErr RDiskReadXPRAM(short numBytes, short whichByte, Ptr dest) = {0x4840, 0x3001, 0xA051};
|
||||
|
||||
#pragma parameter __D0 RDiskAddDrive(__D1, __D0, __A0)
|
||||
OSErr RDiskAddDrive(short drvrRefNum, short drvNum, DrvQElPtr dq) = {0x4840, 0x3001, 0xA04E};
|
||||
|
||||
static inline char RDiskIsRPressed() { return *((volatile char*)0x175) & 0x80; }
|
||||
static inline char RDiskIsAPressed() { return *((volatile char*)0x174) & 0x01; }
|
||||
|
||||
#define RDISK_ICON_SIZE (285)
|
||||
typedef struct RDiskStorage_s {
|
||||
DrvSts2 status;
|
||||
char initialized;
|
||||
#ifdef RDISK_COMPRESS_ICON_ENABLE
|
||||
char icon[RDISK_ICON_SIZE+8];
|
||||
#endif
|
||||
} RDiskStorage_t;
|
||||
|
||||
typedef void (*RDiskCopy_t)(Ptr, Ptr, unsigned long);
|
||||
#define copy24(s, d, b) { RDiskCopy_t f = C24; f(s, d, b); }
|
||||
|
||||
typedef char (*RDiskPeek_t)(Ptr);
|
||||
#define peek24(a, d) { RDiskPeek_t f = G24; d = f(a); }
|
||||
|
||||
typedef void (*RDiskPoke_t)(Ptr, char);
|
||||
#define poke24(a, d) { RDiskPoke_t f = S24; f(a, d); }
|
||||
|
||||
#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 <Quickdraw.h>
|
||||
const char RDiskIconCompressed[RDISK_COMPRESSED_ICON_SIZE] = {
|
||||
PackBits_Repeat(76), 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, */
|
||||
PackBits_Repeat(4), 0b11111111, /*
|
||||
0b11111111, 0b11111111, 0b11111111, 0b11111111, */
|
||||
PackBits_Literal(36),
|
||||
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,
|
||||
PackBits_Repeat(12), 0b00000000, /*
|
||||
0b00000000, 0b00000000, 0b00000000, 0b00000000,
|
||||
0b00000000, 0b00000000, 0b00000000, 0b00000000,
|
||||
0b00000000, 0b00000000, 0b00000000, 0b00000000, */
|
||||
|
||||
PackBits_Repeat(76), 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, */
|
||||
PackBits_Repeat(32), 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, */
|
||||
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, */
|
||||
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 RDiskIcon[RDISK_ICON_SIZE] = {
|
||||
// Icon
|
||||
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,
|
||||
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,
|
||||
0b00000000, 0b00000000, 0b00000000, 0b00000000,
|
||||
0b00000000, 0b00000000, 0b00000000, 0b00000000,
|
||||
0b00000000, 0b00000000, 0b00000000, 0b00000000,
|
||||
// Mask
|
||||
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,
|
||||
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,
|
||||
0b01111111, 0b11111111, 0b11111111, 0b11111111,
|
||||
0b01111111, 0b11111111, 0b11111111, 0b11111111,
|
||||
0b00000000, 0b00000000, 0b00000000, 0b00000000,
|
||||
0b00000000, 0b00000000, 0b00000000, 0b00000000,
|
||||
0b00000000, 0b00000000, 0b00000000, 0b00000000,
|
||||
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
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
BIN
roms/baserom.bin
Executable file
BIN
roms/baserom.bin
Executable file
Binary file not shown.
Loading…
Reference in New Issue
Block a user