Fantasia Diamond - decryption and use of events to poke the real execute address into the cassette header area.
1E50 LDY #&5A \FOR Y=&5A TO 0 STEP-1 1E52 LDA &2FFF,Y \Y?&6FF=Y?&2FFF 1E55 EOR #&42 \EOR 42 1E57 STA &06FF,Y 1E5A DEY 1E5B BNE &1E52 \NEXT 1E5D JMP &0702
This decrypts data stored at &3000-&335A and relocates it to page 7:
0700 EQUW &3E \real execute address
0701 EQUB &00 \is &3E00
0702 LDA #&30
0704 STA &0716
0707 STA &071B
070A LDA #&00
070C STA &071A
070F STA &0715
0712 LDY #&5A \FOR Y=&305A TO &35000
0714 LDA &1900,Y \Y?addr=Y?addr
0717 EOR #55 \EOR 55
0719 STA &1150,Y
071C INY
071D BNE &0714
071F INC &0716
0722 INC &071B
0725 LDA &0716
0728 CMP #&35
072A BNE &0714 \NEXT
072C SEI
072D LDA #&32 \first event routine
072F STA &0221 \at &3225
0732 LDA #&25
0734 STA &0220
0737 CLI
0738 LDA #14 \*FX14,4
073A LDX #4 \enable start of vertical sync
073C LDY #&00 \event
073E JSR OSbyte
0741 LDA #&31 \push return
0743 PHA \address onto stack
0744 LDA #&50 \&3150
0746 PHA NVB DIZC
0747 LDA #&11 \push flags %00010001
0749 PHA
074A LDA &0730 \?&730=&21
074D EOR #51 \EOR51=3
074F STA &0258 \disable Escape, clear memory on break
\*FX200,3 equivalent
0752 RTI \return from interrupt
\flags register and program counter pulled from stack
The next section of code to be executed is at &3150 because that was the address pushed onto the stack
3150 SEI \disable interrupts 3151 LDY #&0D \ 3153 LDX &FFB7 \low byte of default vector table 3156 INX 3157 INX 3158 INX 3159 INX \+4 315A STX &70 315C LDA &FFB8 \high byte of vector table 315F STA &71 3161 LDA (&70),Y \Copy default vectors 3163 STA &0204,Y \into page 2 3166 DEY \makes sure no naughty user 3167 BNE &3161 \vectors have been set up! 3169 CLI 316A LDA #4 \Enter OSFSC with A=4 316C LDX #&74 \and XY pointing to filename 316E LDY #&31 \equivalent to *RUN 3170 JMP (&021E) 3174 EQUS"FD"+CHR$&D \file to run
The next section, itself an event, sets up the second event routine.
3225 PHP \preserve flags 3226 PHA \and A 3227 LDY #&1E \FOR Y=&1E TO 1 STEP-1 3229 LDA &32FF,Y \X?&94F=X?&32FF 322C STA &094F,Y 322F DEY 3230 BNE &3229 \NEXT 3232 LDA #&50 \event routine 3234 STA &0220 \at &950 3237 LDA #&09 3239 STA &0221 323C PLA 323D PLP 323E RTS
The second event routine that runs while the tape file is being *RUN.
0950 PHP \preserve flags 0951 PHA \and A 0952 LDA &0700 \store real execute 0955 STA &03C3 \address in cassette block header 0958 LDA &0701 \area of memory so the game 095B STA &03C2 \will execute at this address 095E PLA \and not the one of the file 095F PLP 0960 RTS
Mr Spock 31 Mar 2004