Prev: 64000 Up: Map Next: 65060
65000: Unencrypt all LOADed game data
Used by the routine at 23820.
The code here was copied at 23820 after the first tape data block was loaded - the first part here is a copy of this.
Avalon's data (as stored on tape) is encrypted using a simple algorithm.
The game memory from 25001 to 64000 is unencrypted in the instructions from 65023.
65000 LD SP,65530 Put the stack pointer (nearly) at the top of RAM
65003 LD IX,25001 IX = address pointer at start of data block to LOAD
65007 LD DE,39000 Data block length (code up to RAM address 64000)
65010 LD A,255 Indicates a data block to load (rather than header)
65012 SCF Sets the carry flag, which tells the ROM routine to perform a LOAD
The next 4 instructions are in the ROM loading routine just before 1377, executed here just before the jump there at 65020 (as it's not loading a header block)
65013 INC D
65014 EX AF,AF'
65015 DEC D
65016 DI
65017 LD HL,65023 This is the address that the code in the following instructions (starting from 65023) will be at after the copy at the start of this routine.
65020 JP 1377 Launch the ROM loading routine
Unencrypt all game code and data. A reverse encoding of this would've been done before the data was saved to tape.
65023 LD HL,25001 Start address
65026 LD DE,39000 Number of bytes to work through
Unencryption loop:
65029 LD A,(HL) Get byte
65030 XOR %01100110 XOR to reverse the bits
65032 RRCA Rotate right/divide by 2
65033 XOR L A second XOR to reverse the bytes, using the low byte of the address pointer
65034 LD (HL),A Re-store the unencrypted byte into memory
65035 INC HL Move to the next memory address
65036 DEC DE Decrement the number-of-bytes counter
65037 LD A,D Check for zero
65038 OR E
65039 JR NZ,65029 If not, continue to unencrypt the data
Data in memory is now unpacked/unencrypted
65041 LD A,2
65043 LD (23659),A Enable screen character rows 22 & 23 for INPUT/errors
65046 EI Enable interrupts
65047 JP 62283 Jump to the code input routine
Unused data
65050 DEFB 32,32,32,32,32,32,32,32
65058 DEFB 32,32
Prev: 64000 Up: Map Next: 65060