---------------Dinosaurs--------------- A 4am crack 2014-05-27 --------------------------------------- "Dinosaurs" is a 1984 educational game programmed by Julie Harris and distributed by Advanced Ideas, Inc. COPYA fails immediately with a disk read error. EDD 4 bit copy gives no errors, but the copy does not work. It loads several tracks (way more than enough for DOS), then fills the screen with garbage characters and reboots. Turning to my trusty Copy ][+ sector editor, I press "P" to get to the Sector Editor Patcher, and select "DOS 3.3 PATCHED". This option ignores checksum bytes and epilogue sequences -- as long as the address and data prologue are standard ("D5 AA 96" and "D5 AA AD", respectively), this will allow me to read each sector. And lo and behold, it works! I can read the data from every sector on every track. Track 0 feels like a DOS 3.3 RWTS, but I don't see a DOS 3.3 disk catalog on track $11 or anywhere else. The boot doesn't sound like it's loading a full DOS from tracks 2, 1, and 0. It swings out further than that and loads a bunch of tracks sequentially. Based on my limited experience cracking other disks, I would guess that this disk has - Standard prologue bytes before the address and data fields [otherwise Copy ][+ sector editor would give read errors, even with the "DOS 3.3 PATCHED" option] - Non-standard epilogue bytes after the address and data fields [otherwise COPYA would work] - Some secondary protection [otherwise the bit copy created with EDD 4 would work] I would also guess that it uses direct RWTS calls to read (and maybe write to) the disk. The easiest way to convert the disk to standard epilogue bytes is to use COPYA with a patched RWTS that accepts any epilogue bytes on read but includes standard epilogue bytes on write. [S6,D1=DOS 3.3 master disk] ]PR#6 ... ]CALL -151 *B942:18 *3D0G ]RUN COPYA [S6,D1=original disk] [S6,D2=blank disk] ...read read read... ...grind grind grind... ...write write write... Now I have a copy of the game in a standard disk format that can be read by any tools. That is, I can copy the copy without patching the DOS 3.3 RWTS beforehand. I can sector edit the disk without messing with the Sector Editor Patcher. There are two problems with this copy: 1. Depending on how the original disk was written, this copy may or may not be able to read itself. I may need to patch the disk's RWTS to deal with the fact that the disk is now in a standard format. 2. Even if it can read itself, it won't run. The copies I tried to make -- even the bit copies -- just rebooted endlessly, which means there is some code being executed during boot to check if the disk is original. (Hint: it's not.) Just by booting the copy, I can rule out problem #1. The disk seems to read itself just fine. It makes it exactly as far as the failed bit copy -- far enough to figure out that it's not an original disk, fill the screen with garbage, and reboot. Time for boot tracing with AUTOTRACE. [S6,D1=original disk] [S5,D1=my work disk] ]PR#5 ... CAPTURING BOOT0 ...reboots slot 6... ...reboots slot 5... SAVING BOOT0 CAPTURING BOOT1 ...reboots slot 6... ...reboots slot 5... SAVING BOOT1 SAVING RWTS ]BLOAD BOOT1,A$2600 ]CALL -151 *B600<2600.2EFFM *B700L ; set up RWTS parameter table in ; preparation for a multi-sector read B700- 8E E9 B7 STX $B7E9 B703- 8E F7 B7 STX $B7F7 B706- A9 01 LDA #$01 B708- 8D F8 B7 STA $B7F8 B70B- 8D EA B7 STA $B7EA B70E- AD E0 B7 LDA $B7E0 B711- 8D E1 B7 STA $B7E1 ; starting at T09,S02 B714- A9 09 LDA #$09 B716- 8D EC B7 STA $B7EC B719- A9 02 LDA #$02 B71B- 8D ED B7 STA $B7ED B71E- AC E7 B7 LDY $B7E7 B721- 88 DEY B722- 8C F1 B7 STY $B7F1 B725- A9 01 LDA #$01 B727- 8D F4 B7 STA $B7F4 B72A- 8A TXA B72B- 4A LSR B72C- 4A LSR B72D- 4A LSR B72E- 4A LSR B72F- AA TAX B730- A9 00 LDA #$00 B732- 9D F8 04 STA $04F8,X B735- 9D 78 04 STA $0478,X ; do the read B738- 20 93 B7 JSR $B793 B73B- A2 FF LDX #$FF B73D- 9A TXS B73E- 8E EB B7 STX $B7EB ; hmm B741- 4C 30 8A JMP $8A30 I need to know what's at $8A30. I'll need to interrupt the boot at $B741 and redirect it to a routine under my control. *9600 *8A30L ; setting up the RWTS parameter table ; again for another sector read into ; $8B00 8A30- A9 8B LDA #$8B 8A32- 8D F1 B7 STA $B7F1 8A35- A9 00 LDA #$00 8A37- 8D EB B7 STA $B7EB 8A3A- A9 B7 LDA #$B7 8A3C- A0 E8 LDY #$E8 ; do the read 8A3E- 20 B5 B7 JSR $B7B5 ; jump there immediately 8A41- 4C 00 8B JMP $8B00 Sigh. This means I need another level of boot tracing so I can interrupt the boot at $8A41 and see what's at $8B00. *C500G ... *9600