diff --git a/.gitignore b/.gitignore index c74aaae..72420d2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,7 @@ obj/ RDiskCP/RDiskCP.rsrc RDiskCP/GW ROM Disk RDiskCP/RDiskCP +bin/IIsi/ +bin/IIci/ +bin/IIfx/ +bin/IIxIIcxSE30/ diff --git a/Makefile b/Makefile index 46dd626..9ad83f5 100644 --- a/Makefile +++ b/Makefile @@ -5,13 +5,22 @@ LD=$(PREFIX)-ld OBJCOPY=$(PREFIX)-objcopy OBJDUMP=$(PREFIX)-objdump -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/GWSys6T_2M.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 @@ -21,37 +30,146 @@ obj/entry_rel.sym: obj obj/entry.o $(OBJDUMP) -t obj/entry.o > $@ -obj/rdisk7M5.o: rdisk.c obj - $(CC) -Wall -DRDiskSize=7864320 -march=68030 -c -Os $< -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/driver7M5.o: obj obj/entry.o obj/rdisk7M5.o - $(LD) -Ttext=40851D70 -o $@ obj/entry.o obj/rdisk7M5.o +obj/driver.o: obj obj/entry.o obj/rdisk.o + $(LD) -Ttext=40851D70 -o $@ obj/entry.o obj/rdisk.o -obj/driver7M5.s: obj obj/driver7M5.o - $(OBJDUMP) -d obj/driver7M5.o > $@ +obj/driver.s: obj obj/driver.o + $(OBJDUMP) -d obj/driver.o > $@ -obj/driver_abs.sym: obj obj/driver7M5.o - $(OBJDUMP) -t obj/driver7M5.o > $@ +obj/driver_abs.sym: obj obj/driver.o + $(OBJDUMP) -t obj/driver.o > $@ -bin/driver7M5.bin: bin obj/driver7M5.o - $(OBJCOPY) -O binary obj/driver7M5.o $@ +bin/driver.bin: bin obj/driver.o + $(OBJCOPY) -O binary obj/driver.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/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/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 + # Compute checksum + #python checksum.py $@ | cut -c3-10 | xxd -r -p - | dd of=$@ bs=1 seek=0 count=4 conv=notrunc + printf '\x36\x9D\x3E\x51' | dd of=$@ bs=1 seek=0 count=4 conv=notrunc # Insert fake checksum (BMoW) + + +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 + # Compute checksum + #python checksum.py $@ | cut -c3-10 | xxd -r -p - | dd of=$@ bs=1 seek=0 count=4 conv=notrunc + printf '\x36\x9D\x3E\x51' | dd of=$@ bs=1 seek=0 count=4 conv=notrunc # Insert fake checksum (BMoW) + +bin/GWSys6_8M.bin: bin/GWSys6_4M.bin + cat bin/GWSys6_4M.bin > $@ + cat bin/GWSys6_4M.bin >> $@ + + +bin/GWSys6T_2M.bin: bin bin/baserom_romdisk_ramtest.bin disks/RDisk1M5.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\x18\x00\x00' | dd of=$@ bs=1 seek=335276 count=4 conv=notrunc # Patch ROM disk size + # Copy ROM disk image + dd if=disks/RDisk1M5.dsk of=$@ bs=1024 seek=512 conv=notrunc + # Compute checksum + #python checksum.py $@ | cut -c3-10 | xxd -r -p - | dd of=$@ bs=1 seek=0 count=4 conv=notrunc + printf '\x36\x9D\x3E\x51' | dd of=$@ bs=1 seek=0 count=4 conv=notrunc # Insert fake checksum (BMoW) + + +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 diff --git a/bin/GWSys6T_2M.bin b/bin/GWSys6T_2M.bin new file mode 100755 index 0000000..ab4c012 Binary files /dev/null and b/bin/GWSys6T_2M.bin differ diff --git a/bin/GWSys6_4M.bin b/bin/GWSys6_4M.bin new file mode 100755 index 0000000..160efd6 Binary files /dev/null and b/bin/GWSys6_4M.bin differ diff --git a/bin/GWSys6_8M.bin b/bin/GWSys6_8M.bin new file mode 100644 index 0000000..241b50e Binary files /dev/null and b/bin/GWSys6_8M.bin differ diff --git a/bin/rom8M.bin b/bin/GWSys71_8M.bin similarity index 99% rename from bin/rom8M.bin rename to bin/GWSys71_8M.bin index 2ee4537..88c50ff 100755 Binary files a/bin/rom8M.bin and b/bin/GWSys71_8M.bin differ diff --git a/bin/baserom_romdisk_noramtest.bin b/bin/baserom_romdisk_noramtest.bin new file mode 100755 index 0000000..39402ad Binary files /dev/null and b/bin/baserom_romdisk_noramtest.bin differ diff --git a/bin/baserom_romdisk_ramtest.bin b/bin/baserom_romdisk_ramtest.bin new file mode 100755 index 0000000..19a666b Binary files /dev/null and b/bin/baserom_romdisk_ramtest.bin differ diff --git a/bin/driver.bin b/bin/driver.bin new file mode 100755 index 0000000..4fe7b45 Binary files /dev/null and b/bin/driver.bin differ diff --git a/bin/driver7M5.bin b/bin/driver7M5.bin deleted file mode 100755 index acbd2c4..0000000 Binary files a/bin/driver7M5.bin and /dev/null differ diff --git a/checksum.py b/checksum.py new file mode 100644 index 0000000..7ba5d19 --- /dev/null +++ b/checksum.py @@ -0,0 +1,11 @@ +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 + for i in struct.unpack('>' + str(len(rombin)/2) + 'H', rombin): + cksum += i; + cksum &= 0xFFFFFFFF + print(hex(cksum)) diff --git a/RDisk1M5.dsk b/disks/RDisk1M5.dsk similarity index 56% rename from RDisk1M5.dsk rename to disks/RDisk1M5.dsk index 2f5e744..2d83e06 100644 Binary files a/RDisk1M5.dsk and b/disks/RDisk1M5.dsk differ diff --git a/disks/RDisk3M5.dsk b/disks/RDisk3M5.dsk new file mode 100644 index 0000000..46cbfc2 Binary files /dev/null and b/disks/RDisk3M5.dsk differ diff --git a/RDisk7M5.dsk b/disks/RDisk7M5.dsk similarity index 100% rename from RDisk7M5.dsk rename to disks/RDisk7M5.dsk diff --git a/entry.s b/entry.s index f41607d..4bfcf09 100644 --- a/entry.s +++ b/entry.s @@ -21,11 +21,11 @@ RDiskSig: RDiskDBGDisPos: dc.l 0x00000031 RDiskCDRDisPos: -dc.l 0x00012A29 +dc.l 0xFFFFFFFF RDiskDBGNameAddr: dc.l 0x4088002A RDiskCDRNameAddr: -dc.l 0x40892A14 +dc.l 0x00000000 RDiskDBGDisByte: dc.b 0x44 RDiskCDRDisByte: @@ -34,6 +34,9 @@ RDiskRAMRequired: .ascii "16" .align 4 +RDiskSize: +dc.l 0x00780000 + DOpen: movem.l %A0-%A1, -(%SP) bsr RDOpen diff --git a/rdisk.c b/rdisk.c index 95dcaf3..c01f69c 100644 --- a/rdisk.c +++ b/rdisk.c @@ -118,6 +118,10 @@ OSErr RDOpen(IOParamPtr p, DCtlPtr d) { // 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 @@ -182,24 +186,19 @@ static void RDInit(IOParamPtr p, DCtlPtr d, RDiskStorage_t *c) { } } - // Get debug and CD-ROM disable settings from ROM table - c->dbgDisPos = *(long*)0x40851D98; - c->cdrDisPos = *(long*)0x40851D9C; - c->dbgDisByte = *(char*)0x40851DA8; - c->cdrDisByte = *(char*)0x40851DA9; // Patch - if (c->dbgDisPos < RDiskSize) { + if (RDiskDBGDisPos < RDiskSize) { if (c->ramdisk && !dbgEN) { - poke24(c->ramdisk + c->dbgDisPos, c->dbgDisByte); + poke24(c->ramdisk + RDiskDBGDisPos, c->dbgDisByte); } else if (dbgEN) { - peek24(RDiskBuf + c->dbgDisPos, c->dbgDisByte); + peek24(RDiskBuf + RDiskDBGDisPos, c->dbgDisByte); } } - if (c->cdrDisPos < RDiskSize) { + if (RDiskCDRDisPos < RDiskSize) { if (c->ramdisk && !cdrEN) { - poke24(c->ramdisk + c->cdrDisPos, c->cdrDisByte); + poke24(c->ramdisk + RDiskCDRDisPos, c->cdrDisByte); } else if (cdrEN) { - peek24(RDiskBuf + c->cdrDisPos, c->cdrDisByte); + peek24(RDiskBuf + RDiskCDRDisPos, c->cdrDisByte); } } @@ -242,13 +241,13 @@ OSErr RDPrime(IOParamPtr p, DCtlPtr d) { // Read from disk into buffer. if (*MMU32bit) { BlockMove(disk, p->ioBuffer, p->ioReqCount); } else { copy24(disk, StripAddress(p->ioBuffer), p->ioReqCount); } - if (!c->ramdisk && c->dbgDisPos >= d->dCtlPosition && - c->dbgDisPos < d->dCtlPosition + p->ioReqCount) { - p->ioBuffer[c->dbgDisPos - d->dCtlPosition] = c->dbgDisByte; + if (!c->ramdisk && RDiskDBGDisPos >= d->dCtlPosition && + RDiskDBGDisPos < d->dCtlPosition + p->ioReqCount) { + p->ioBuffer[RDiskDBGDisPos - d->dCtlPosition] = c->dbgDisByte; } - if (!c->ramdisk && c->cdrDisPos >= d->dCtlPosition && - c->cdrDisPos < d->dCtlPosition + p->ioReqCount) { - p->ioBuffer[c->cdrDisPos - d->dCtlPosition] = c->cdrDisByte; + 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 diff --git a/rdisk.h b/rdisk.h index c21013d..cb98c2c 100644 --- a/rdisk.h +++ b/rdisk.h @@ -6,6 +6,12 @@ #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) @@ -22,8 +28,6 @@ typedef struct RDiskStorage_s { DrvSts2 status; char initialized; Ptr ramdisk; - long dbgDisPos; - long cdrDisPos; char dbgDisByte; char cdrDisByte; #ifdef RDISK_COMPRESS_ICON_ENABLE diff --git a/roms/IIci.bin b/roms/IIci.bin new file mode 100755 index 0000000..ae719ec Binary files /dev/null and b/roms/IIci.bin differ diff --git a/roms/IIfx.bin b/roms/IIfx.bin new file mode 100755 index 0000000..93ea3de Binary files /dev/null and b/roms/IIfx.bin differ diff --git a/roms/IIxIIcxSE30.bin b/roms/IIxIIcxSE30.bin new file mode 100755 index 0000000..65f7f5b Binary files /dev/null and b/roms/IIxIIcxSE30.bin differ diff --git a/baserom.bin b/roms/baserom.bin similarity index 99% rename from baserom.bin rename to roms/baserom.bin index 381d762..e072710 100755 Binary files a/baserom.bin and b/roms/baserom.bin differ diff --git a/iisi.bin b/roms/iisi.bin similarity index 100% rename from iisi.bin rename to roms/iisi.bin