-----------The Great American---------- --------Cross-Country Road Race-------- A 4am crack 2014-05-20 --------------------------------------- "The Great American Cross-Country Road Race" is a 1985 arcade game designed by Alex DeMeo, adapted for Apple II by Ivan Manley of Synergistic Software, and distributed by Activision, Inc. COPYA copies the disk, but the copy does not work. Booting the copy gets as far as saying "Please stand by while program is loading," then grinds the disk and crashes. EDD 4 bit copy fares no better. The boot process does not sound like DOS 3.3, ProDOS, or Pascal. It loads sequential tracks (slowly), displays an animated "Activision" title screen with the "Please stand by" message, grinds the disk, and crashes. There *is* a disk catalog on track $11 with a single file named "BOOT", but it does not appear to be a valid file. Copy ][+ shows both its starting address and file length as 0: CATALOG DISK SLOT 6 DRIVE 1 DISK VOLUME 254 B 004 BOOT A0, L0 (A$0000, L$0000) SECTORS FREE:144 USED:416 TOTAL:560 Inspecting it with the Copy ][+ sector editor shows a mix of data and code, but nothing that could be construed as a boot process (no RWTS, nothing disk- related at all). Time for boot tracing with AUTOTRACE. [S6D1=original disk] [S5D1=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 Well that went swimmingly. Despite its custom loading process (and fake disk catalog), this disk appears to use a standard boot0 and DOS 3.3-derived RWTS routine. Let's find out where it all goes wrong. ]BLOAD BOOT1,A$2600 ]CALL -151 *B600<2600.2EFFM *B700L ; standard RWTS parameter table ; initialization 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 ; I checked, and $B7E0 contains $03 at ; this point, so we're setting up to ; read 3 sectors B70E- AD E0 B7 LDA $B7E0 B711- 8D E1 B7 STA $B7E1 ; start reading at T00,S0C B714- A9 00 LDA #$00 B716- 8D EC B7 STA $B7EC B719- A9 0C LDA #$0C B71B- 8D ED B7 STA $B7ED ; I checked, and $B7E7 contains $A3 at ; this point, so we'll be storing the ; sectors in $A000..$A2FF 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 B738- 8D EB B7 STA $B7EB ; standard multi-sector read routine B73B- 20 93 B7 JSR $B793 B73E- A2 FF LDX #$FF B740- 9A TXS B741- 4C C8 BF JMP $BFC8 B744- 20 89 FE JSR $FE89 ; jump to the code we just read B747- 4C 00 A0 JMP $A000 OK, this is where I need to interrupt the boot process, so I can inspect the code at $A000 instead of letting it run willy-nilly. *9600 *A070 A070- FF Now I can replace the entire nibble check with three lines of custom code to put the correct value in $A070 and exit: A0BF- A9 FF LDA #$FF A0C1- 8D 70 A0 STA $A070 A0C4- 60 RTS T00,S0A,$BF change "BD 89 C0 A9 56 85" to "A9 FF 8D 70 A0 60" Quod erat liberandum. --------------------------------------- A 4am crack No. 41 -------------------EOF-----------------