-----------------Batman---------------- A 4am crack 2015-08-02 --------------------------------------- Name: Batman Genre: arcade Year: 1988 Publisher: Data East Media: double-sided 5.25-inch floppy OS: Quick-DOS Previous cracks: Asimov has an uncredited crack Side B just says "Batman S2!!" and halts. So I'll start with side A. ~ Chapter 0 In Which Various Automated Tools Fail In Interesting Ways COPYA immediate disk read error Locksmith Fast Disk Backup unable to read any track EDD 4 bit copy (no sync, no count) no read errors, but copy just reboots Copy ][+ nibble editor all tracks use standard prologues (address: D5 AA 96, data: D5 AA AD) but modified epilogues (address: FF FF EB, data: FF FF EB) Disk Fixer ["O" -> "Input/Output Control"] set Address Epilogue to "FF FF EB" set Data Epilogue to "FF FF EB" Success! All tracks readable! T00 -> custom bootloader T11 -> DOS 3.3 disk catalog Why didn't COPYA work? modified epilogue bytes (every track) Why didn't Locksmith FDB work? modified epilogue bytes (every track) Why didn't my EDD copy work? probably a nibble check during boot Next steps: 1. Super Demuffin 2. Patch RWTS (if necessary) 3. Find nibble check and bypass it ~ Chapter 1 In Which We Choose The Right Tool For The Job I'm going to use Super Demuffin here (instead of my usual go-to conversion tool, Advanced Demuffin). The disk is uses a custom bootloader called "Quick- DOS". It's different enough from the standard DOS 3.3 bootloader that my automated tools can't capture the RWTS. But luckily, the RWTS modifications are minor -- custom epilogue bytes, same on every track -- so Super Demuffin will work just fine. When you first run Super Demuffin, it asks for the parameters of the original disk. In this case, the prologue bytes are the same, but the epilogues are "FF FF EB" instead of "DE AA EB". --v-- SUPER-DEMUFFIN AND FAST COPY Modified by: The Saltine/Coast to Coast Address prologue: D5 AA 96 Address epilogue: FF FF EB DISK ^^^^^ ORIGINAL change from DE AA ---+++++ Data prologue: D5 AA AD Data epilogue: FF FF EB ^^^^^ change from DE AA ---+++++ Ignore write errors while demuffining! D - Edit parameters - Advance to next parm - Exit edit mode R - Restore DOS 3.3 parameters O - Edit Original disk's parameters C - Edit Copy disk's parameters G - Begin demuffin process --^-- Pressing "G" switches to the Locksmith Fast Disk Copy UI. It assumes that both disks are in slot 6, and that drive 1 is the original and drive 2 is the copy. [S6,D1=original disk] [S6,D2=blank disk] --v-- LOCKSMITH 7.0 FAST DISK BACKUP R................................... W*********************************** HEX 00000000000000001111111111111111222 TRK 0123456789ABCDEF0123456789ABCDEF012 0................................... 1................................... 2................................... 3................................... 4................................... 5................................... 6................................... 7................................... 8................................... 9................................... A................................... B................................... C................................... D................................... 12 E................................... F................................... [ ] PRESS [RESET] TO EXIT --^-- ]PR#6 ...reboots endlessly... Let's go find that nibble check. ~ Chapter 2 In Which Fake Is The New Real [S6,D1=original disk] [S5,D1=my work disk] ]PR#5 CAPTURING BOOT0 ...reboots slot 6... ...reboots slot 5... SAVING BOOT0 ]BLOAD BOOT0,A$800 ]CALL -151 *801L ; check if this is the first run (DOS ; 3.3 does the same thing) 0801- A5 27 LDA $27 0803- C9 09 CMP #$09 ; branch if it's not 0805- D0 27 BNE $082E ; first-time initialization path 0807- 78 SEI ; read/write language card RAM bank 2 0808- AD 83 C0 LDA $C083 080B- AD 83 C0 LDA $C083 ; set up jump to $Cx5C so we can re-use ; the disk controller ROM routine to ; read more sectors 080E- A5 2B LDA $2B 0810- 4A LSR 0811- 4A LSR 0812- 4A LSR 0813- 4A LSR 0814- 09 C0 ORA #$C0 0816- 85 3F STA $3F ; also set low-level reset vector 0818- 8D FD FF STA $FFFD 081B- A9 5C LDA #$5C 081D- 85 3E STA $3E 081F- A9 00 LDA #$00 0821- 8D FC FF STA $FFFC 0824- 18 CLC ; first page is in $08BF 0825- AD BF 08 LDA $08BF ; sector count is in $08C0 0828- 6D C0 08 ADC $08C0 082B- 8D BF 08 STA $08BF 082E- AE C0 08 LDX $08C0 ; branch when done 0831- F0 15 BEQ $0848 ; logicla-to-physical sector mapping 0833- BD C1 08 LDA $08C1,X 0836- 85 3D STA $3D 0838- CE C0 08 DEC $08C0 083B- AD BF 08 LDA $08BF 083E- 85 27 STA $27 0840- CE BF 08 DEC $08BF 0843- A6 2B LDX $2B ; read a sector (exits through $0801) 0845- 6C 3E 00 JMP ($003E) ; execution continues here (from $0831) 0848- 2C 51 C0 BIT $C051 084B- 2C 54 C0 BIT $C054 084E- 2C 52 C0 BIT $C052 0851- 8D 0C C0 STA $C00C 0854- 8D 00 C0 STA $C000 ; hmm 0857- 20 00 D3 JSR $D300 This is where I need to interrupt the boot. *9600