Yie Ar Kung Fu - example self-decrypting loader and returning to Basic II's RUN routine at &BD13, by pushing that address onto the stack so RTS will go to it at the end and start the Basic program.
0DE8 LDY #0 \ 0DEA STY &70 \ 0DEC LDA &0E00,Y \ decrypt PAGE &E 0DEF EOR #&FF \ by EORing bytes with &FF 0DF1 DEC &0DF5 \ and a byte going &CB down to &CC 0DF4 EOR #&CC 0DF6 EOR &70 \ and a byte going 0 up to &FF 0DF8 INC &70 0DFA STA &0E00,Y 0DFD INY 0DFE BNE &0DEC
The next bit can be 'zapped' by typing the following, which is a Basic version of the above code:
*LOAD YIE3 1DE8 Y%=203:Z%=0:FORX%=0TO&FF:X%?&1E00=X%?&1E00 EOR&FF EORY% EORZ%:Y%=(Y%-1) AND&FF:Z%=(Z%+1)AND&FF:NEXT *SAVE YIE3Z 1DE8+118 DE8 DE8
File YIE3Z now contains the decrypted code. By the time we get here the code is decrypted
0E00 LDA #3 \Disable Escape and clear memory on Break 0E02 STA &0258 \*FX200,3 equivalent 0E05 LDA #&B3 \&56B13 0E07 STA &12 \is the TOP of the Basic control program 0E09 LDA #&56 0E0B STA &13 0E0D LDA #&BD \&BD13 is the Basic II rom RUN routine 0E0F PHA \so when we RTS at the end of this 0E10 LDA #&13 \it will be like typing RUN to start 0E12 PHA \the game 0E13 LDA #&CC \value used later for decryption 0E15 PHA \pushed on stack 0E16 LDX #&16 \fill &E00-&E16 with &16 to corrupt 0E18 TXA \program to prying eyes 0E19 STA &0E00,X 0E1C DEX 0E1D BPL &0E19 0E1F LDA #140 \*FX140,12 0E21 LDX #12 \*TAPE equivalent 0E23 JSR OSbyte 0E26 LDX #&4D \string at &E4D 0E28 LDY #&0E 0E2A JSR OScli \do *LOAD YIE3??? 5200 0E2D LDY #0 0E2F LDX #&47 \prepare to decrypt &47 pages 0E31 PLA \retrieve value stacked earlier 0E32 STA &0E39 0E35 LDA &1100,Y 0E38 EOR #3 \this is EOR #&CC see line &E32 0E3A STA &1100,Y \in Basic this would be 0E3D INY \FORX%=&1100TO&47FF:?X%=?X% EOR&CC:NEXT 0E3E BNE &1E35 0E40 INC &0E37 \increment hi byte of source address 0E43 EE 3C 0E INC &0E3C \increment hi byte of destination address 0E46 DEX 0E47 BNE &0E35 \loop till all pages done 0E49 STY &0E39 \so instruction at &E38 is EOR #0 0E4C RTS \return to &BD13 - Basic RUN
The next bit is the OSCLI string - *L. YIE3??? 5200
0E48 ** ** ** ** ** 4C 2E 20 L. 0E50 59 49 45 33 7F 7F 7F 20 YIE3... 0E58 35 32 30 30 0D ** ** ** 5200.
Mr Spock 26 Mar 2004