Tape Recovery Case Study #1

Background
In this case we will analyse a corrupted tape where three games are stored at. The fundamental analysis were done to determine whether it was Audio Waveform or Data in the signal. The result was presented in 3 different games:

  • Kickstart II (Case Study #3)
  • The Mystery Of The Nile (Case Study #2)
  • Super Zaxxon (Case Study #1)

The interesting part was to allocate the actual errors and find out where the errors were at to answer why the games did not load or start correctly.
All this possible using 3 different analysis methods.

Prologue
In this case I was very lucky to wash up the tape one time and realise last part of physical tape had been taking a bath in some kind of sticky liquid. I did not want to analyse what kind of liquid it could have been but one thing is for sure, it wasn't human made! We're speaking of Alien Liquid Data. First I carefully aired the tape to realise this was not going to be an easy task to get rid of all the Alien Liquid Data. I had to take it one step ahead to let the whole tapemass swing around in a nice water solution. Too bad I wasn't able to make any actual pictures from this process due a nonfunctional SD Card(how ironic in a way), but yes time was critical and I did not want to risk losing data. In a way I found this funny. After all I was in the process to recover data from a tape and then I got dataloss but in a digital way.


C64 ROM-TAPE HEADER

C64 ROM-TAPE HEADER

C64 ROM-TAPE DATA

NOVALOAD SPECIAL

NOVALOAD SPECIAL

NOVALOAD SPECIAL

NOVALOAD SPECIAL

NOVALOAD SPECIAL

NOVALOAD SPECIAL

NOVALOAD SPECIAL

NOVALOAD SPECIAL


Backtrace and Structure
The ROM-TAPE Header tells us the name of the game. "SUPER ZAXXON", as mentioned in earlier documentation it's repeated twice, as we can see in the Data Signal
Following ROM-TAPE DATA contains the Init for NOVALOAD and loads up the typical NOVALOADER screen with the signature sound.

Even if it loads from 0801-08B0, we can ignore the first part that basically says, "10 SYS 2061" and 2061 decimal is indeed $080D hexadecimal, we are on the right track
080d a9 93 lda #$93
080f 20 d2 ff jsr $ffd2
0812 a9 8e lda #$8e
0814 20 d2 ff jsr $ffd2
0817 a9 00 lda #$00
0819 8d 20 d0 sta $d020
081c a9 0b lda #$0b
081e 8d 21 d0 sta $d021
0821 a2 0f ldx #$0f
0823 bd 41 03 lda $0341,x
0826 29 3f and #$3f
0828 9d 4e 05 sta $054e,x
082b a9 01 lda #$01
082d 9d 4e d9 sta $d94e,x
0830 bd a1 08 lda $08a1,x
0833 9d a4 07 sta $07a4,x
0836 a9 0f lda #$0f
0838 9d a4 db sta $dba4,x
083b ca dex
083c 10 e5 bpl $0823
083e 78 sei
083f d8 cld
0840 a9 05 lda #$05
0842 85 01 sta $01
0844 a9 1f lda #$1f
0846 8d 0d dc sta $dc0d
0849 8d 0d dd sta $dd0d
084c ad 0d dc lda $dc0d
084f ad 0d dd lda $dd0d
0852 a9 f0 lda #$f0
0854 8d 00 d4 sta $d400
0857 8d 06 d4 sta $d406
085a a9 0f lda #$0f
085c 8d 18 d4 sta $d418
085f 85 ab sta $ab
0861 a9 00 lda #$00
0863 8d 04 d4 sta $d404
0866 8d 05 d4 sta $d405
0869 8d 0b d4 sta $d40b
086c 8d 12 d4 sta $d412
086f 85 a7 sta $a7
0871 85 a5 sta $a5
0873 a9 21 lda #$21
0875 8d 04 d4 sta $d404
0878 a9 55 lda #$55
087a 85 aa sta $aa
087c a9 f4 lda #$f4
087e 8d 04 dc sta $dc04
0881 a9 03 lda #$03
0883 8d 05 dc sta $dc05
0886 a9 90 lda #$90
0888 8d 0d dc sta $dc0d
088b a9 51 lda #$51
088d 8d fe ff sta $fffe
0890 a9 03 lda #$03
0892 8d ff ff sta $ffff
0895 a9 f6 lda #$f6
0897 85 7a sta $7a
0899 a9 03 lda #$03
089b 85 7b sta $7b
089d 58 cli
089e 4c e5 03 jmp $03e5
08a1 0e 0f 16 asl $160f
08a4 01 0c ora ($0c,x)
08a6 0f ???
08a7 01 04 ora ($04,x)
--08a9 20 0e 32 jsr $320e ;2
--08ac 30 30 bmi $08de ;0 0
--08ae 30 34 bmi $08e4 ;0 4
--08b0 37 ??? ;7

If we analyse the code segments we can see a significant data string "N200047" which is an indicator. This indicates the expected checksum for NOVALOAD.
Super_Zaxxon_NOVALOAD
The NOVALOAD checksum from the code segment is parsed on the screen

So far we have managed the easy part
The next part that is being loaded is the Loader "NOVALOADER SPECIAL", and the Loading Screen. Since NOVALOAD is an IRQ-LOADER it can both play music and show a scroller, as the game is loading. This part is loaded from $E000-$E6FF
Super_Zaxxon_Loading_Screen

Before the game is loaded there are some control segments here and there. Just to make sure the pulses are correctly and still running in the background NOVALOAD will load everything. The actual Game Data is loaded from the last Chunk $3900-CFFF, but not executed until the past Chunk is loaded $0800-2EFF. That part is overwriting NOVALOAD and all the "junk" not needed anymore.
If everything went fine and the correct string 200047 is "there". We're ready to play another great Commodore 64 game.

Super_Zaxxon_Title_Screen

Conclusion
Even if this game had its position LAST on the tape, it was the most easy "data" to Recover. So don't judge the book by its cover, always do things 100% and spend that little extra time to achieve best result possible.
Best Regards,
Xiny6581