===== Disassembly of the 2Mhz Time Cruncher V5.1 ===== While browsing through the Web Archive, I had found a machine code monitor disassembly listing for the Time Cruncher V5. The original Time crunch was by Matcham/Network, but Version 5 came along and was done by Tim Rogers (of Stoat and Tim fame). This is probably a modified version of the 2Mhz cruncher, done way back in 1991. So if you can, go disassemble it in a M/C monitor and if works 100% try it out. Feel free to make improvements with the tool. Time Cruncher V5.1 Disassembly. ; Some areas of code are relocated before being used. For these parts, ; I have shown both addresses in the disassembly. ; BASIC PRG ( 1991 SYS2066 ) 0801 .BY $0B,$08,$C7,$07,$9E,$32,$30,$36 0809 .BY $36,$00,$00,$00,$00,$00,$00,$00 0811 .BY $00 ; Start of machine code 0812 A2 FF LDX #$FF 0814 9A TXS 0815 A9 06 LDA #$06 0817 8D 20 D0 STA $D020 ; blue border 081A 20 33 0B JSR $0B33 ; Display text below on screen ; 2MHz TIME CRUNCH V5.1 ; ; LOAD: 081D .BY $93,$0E,$08,$05,$32,$6D,$68,$5A 0825 .BY $20,$74,$49,$4D,$45,$20,$63,$52 082D .BY $55,$4E,$43,$48,$20,$76,$35,$2E 0835 .BY $31,$20,$20,$20,$20,$20,$20,$20 083D .BY $0D,$20,$20,$20,$20,$20,$20,$20 0845 .BY $20,$20,$20,$20,$20,$20,$20,$20 084D .BY $20,$20,$20,$20,$20,$20,$20,$20 0855 .BY $20,$20,$20,$20,$20,$20,$20,$20 085D .BY $0D,$0D,$6C,$4F,$41,$44,$20,$3A 0865 .BY $00 ; A lot of extra spaces above! ; 0866 20 B1 0A JSR $0AB1 ; Input filename 0869 AD 7E 04 LDA $047E ; get 1st charcter 086C F0 04 BEQ $0872 086E C9 24 CMP #$24 ; @ character 0870 D0 05 BNE $0877 0872 EA NOP ; unused place for JMP 0873 EA NOP ; Is for access to disk commands 0874 EA NOP ; but removed form this dissasembly 0875 F0 9B BEQ $0812 ; Restart 0877 8A TXA 0878 48 PHA 0879 20 30 0B JSR $0B30 ; Display text below on screen ; SAVE@: 087C .BY $73,$41,$56,$45,$40,$3A,$00 ; 0883 20 B1 0A JSR $0AB1 ; Input filename 0886 E8 INX 0887 E8 INX ; add two to filename length 0888 86 8E STX $8E ; Store filename length 088A 20 30 0B JSR $0B30 ; Display text below on screen ; RUN $____ 088D .BY $20,$6A,$6D,$70,$20,$24,$A4,$A4 0895 .BY $A4,$A4,$9D,$9D,$9D,$9D,$00 ; 089C 20 EA 0A JSR $0AEA ; Input two character hex number 089F 8D 22 0F STA $0F22 ; store 08A2 20 EA 0A JSR $0AEA ; Input two character hex number 08A5 8D 21 0F STA $0F21 ; store 08A8 20 30 0B JSR $0B30 ; Display text below on screen ; $01=$__ 08AB .BY $20,$24,$30,$31,$3D,$24,$A4,$A4 08B3 .BY $9D,$9D,$00 ; 08B6 20 EA 0A JSR $0AEA ; Input two character hex number 08B9 8D 0F 0F STA $0F0F ; store 08BC 20 30 0B JSR $0B30 ; Display text below on screen ; STEP $01-$08=$__ 08BF .BY $73,$54,$45,$50,$20,$24,$30,$31 08C7 .BY $2D,$24,$30,$38,$0D,$20,$20,$20 08CF .BY $20,$20,$24,$A4,$A4,$9D,$9D,$00 ; 08D7 20 EA 0A JSR $0AEA ; Input two character hex number 08DA F0 51 BEQ $092D ; if 0 restart 08DC C9 09 CMP #$09 08DE B0 4D BCS $092D ; if more than 8 restart 08E0 AA TAX 08E1 8D B8 0D STA $0DB8 ; store 08E4 8D DA 0D STA $0DDA ; store 08E7 69 07 ADC #$07 ; add 7 08E9 8D 2B 0F STA $0F2B ; store 08EC A9 01 LDA #$01 08EE 0A ASL 08EF CA DEX 08F0 D0 FC BNE $08EE 08F2 8D 15 0C STA $0C15 ; store bit position 08F5 20 30 0B JSR $0B30 ; Display text below on screen ; SPACE=CRUNCH - RUN/STOP=RESTART 08F8 .BY $0D,$73,$50,$41,$43,$45,$20,$3D 0900 .BY $20,$63,$52,$55,$4E,$43,$48,$20 0908 .BY $20,$2D,$20,$20,$72,$55,$4E,$2F 0910 .BY $73,$54,$4F,$50,$20,$3D,$20,$72 0918 .BY $45,$53,$54,$41,$52,$54,$00 ; 091F A9 10 LDA #$10 0921 2C 01 DC BIT $DC01 0924 10 07 BPL $092D 0926 D0 F9 BNE $0921 0928 F0 06 BEQ $0930 ; if space then continue 092A 20 42 F6 JSR $F642 092D 4C 12 08 JMP $0812 ; restart 0930 20 E3 0A JSR $0AE3 ; Get character under cursor 0933 E6 CC INC $CC ; cursor off 0935 68 PLA 0936 A2 7E LDX #$7E 0938 A0 04 LDY #$04 093A 20 BD FF JSR $FFBD ; set load filename on screen $047E ; Load file to compress 093D A9 08 LDA #$08 093F 85 B8 STA $B8 0941 85 BA STA $BA 0943 A2 01 LDX #$01 0945 0A ASL ; change A to #$10 0946 86 FB STX $FB 0948 85 FC STA $FC ; start to load file at $1001 094A A9 60 LDA #$60 094C 85 B9 STA $B9 094E 20 D5 F3 JSR $F3D5 0951 A5 BA LDA $BA 0953 20 09 ED JSR $ED09 0956 A5 B9 LDA $B9 0958 20 C7 ED JSR $EDC7 095B 20 13 EE JSR $EE13 095E 20 13 EE JSR $EE13 ; ignore start address of file 0961 20 13 EE JSR $EE13 0964 78 SEI 0965 A0 00 LDY #$00 0967 E6 01 INC $01 0969 91 FB STA ($FB),Y 096B C6 01 DEC $01 096D 8D 20 D0 STA $D020 ; change border colour 0970 E6 FB INC $FB 0972 D0 04 BNE $0978 0974 E6 FC INC $FC 0976 F0 B2 BEQ $092A 0978 24 90 BIT $90 097A 50 E5 BVC $0961 097C 20 EF ED JSR $EDEF 097F 20 42 F6 JSR $F642 ; start compression of file 0982 78 SEI 0983 A9 00 LDA #$00 0985 85 C6 STA $C6 ; clear keyboard 0987 8D 11 D0 STA $D011 ; blank screen 098A EE 30 D0 INC $D030 ; 2MHz mode on (if c128) 098D 85 01 STA $01 ; switch out roms 098F 20 63 0B JSR $0B63 ; move whole file to the end of memory 0992 20 B8 0C JSR $0CB8 ; do compression 0995 A9 37 LDA #$37 0997 85 01 STA $01 ; switch on roms 0999 A9 FC LDA #$FC 099B 8D 30 D0 STA $D030 ; 2MHz mode off 099E A9 1B LDA #$1B 09A0 8D 11 D0 STA $D011 ; unblank screen 09A3 20 30 0B JSR $0B30 ; Display text below on screen ; OLD END=$ 09A6 .BY $0D,$20,$6F,$4C,$44,$20,$65,$4E 09AE .BY $44,$3D,$24,$00 ; 09B2 A5 FC LDA $FC 09B4 E9 07 SBC #$07 09B6 AA TAX 09B7 A5 FB LDA $FB 09B9 20 14 0B JSR $0B14 ; Display 4 character hex number 09BC 20 30 0B JSR $0B30 ; Display text below on screen ; NEW END=$ 09BF .BY $91,$20,$6E,$45,$57,$20,$65,$4E 09C7 .BY $44,$3D,$24,$00 ; 09CB A5 AF LDA $AF 09CD E9 05 SBC #$05 09CF AA TAX 09D0 A5 AE LDA $AE 09D2 20 14 0B JSR $0B14 ; Display 4 character hex number 09D5 20 30 0B JSR $0B30 ; Display text below on screen ; 1-SAVE 2-RUN 3-NEW FILE 4-RESET 09D8 .BY $0D,$31,$3E,$73,$41,$56,$45,$20 09E0 .BY $32,$3E,$72,$55,$4E,$20,$33,$3E 09E8 .BY $6E,$45,$57,$20,$66,$49,$4C,$45 09F0 .BY $20,$34,$3E,$72,$65,$73,$65,$74 09F8 .BY $00 ; Check for 1234 key option 09F9 A9 00 LDA #$00 09FB 85 CC STA $CC ; cursor on 09FD A9 06 LDA #$06 09FF 8D 20 D0 STA $D020 ; Blue border 0A02 20 E4 FF JSR $FFE4 0A05 AA TAX 0A06 20 E3 0A JSR $0AE3 ; Get character under cursor 0A09 E6 CC INC $CC ; cursor off 0A0B E0 31 CPX #$31 ; option 1 0A0D F0 36 BEQ $0A45 ; Save file 0A0F E0 32 CPX #$32 ; option 2 0A11 F0 0B BEQ $0A1E ; Run file 0A13 E0 33 CPX #$33 ; option 3 0A15 F0 2B BEQ $0A42 ; New file 0A17 E0 34 CPX #$34 ; option 4 0A19 D0 DE BNE $09F9 0A1B 4C E2 FC JMP $FCE2 ; Reset ; Run newly compressed file 0A1E 78 SEI 0A1F A0 16 LDY #$16 ; move code into place 0A21 B9 2E 0A LDA $0A2E,Y 0A24 99 FF 00 STA $00FF,Y 0A27 88 DEY 0A28 D0 F7 BNE $0A21 0A2A E6 01 INC $01 0A2C 4C 00 01 JMP $0100 ; Continuation of running newly compressed file code ; to be run from $0100 ; move compressed file from $0E00-$FFFF to $0800-$F9FF and run it 0A2F/0100 B9 00 0E LDA $0E00,Y 0A32/0103 99 00 08 STA $0800,Y 0A35/0106 C8 INY 0A36/0107 D0 F7 BNE $0A2F/$0100 0A38/0109 EE 05 01 INC $0105 0A3B/010C EE 02 01 INC $0102 0A3E/010F D0 EF BNE $0A2F/$0100 0A40/0111 C6 01 DEC $01 0A42/0113 4C 12 08 JMP $0812 ; Save compressed file 0A45 A9 40 LDA #$40 ; zero char 0A47 8D CC 04 STA $04CC ; put on screen 0A4A A5 8E LDA $8E ; Filename length 0A4C A2 CC LDX #$CC 0A4E A0 04 LDY #$04 0A50 20 BD FF JSR $FFBD ; Set save filename on screen $04CC 0A53 E6 CC INC $CC 0A55 A9 61 LDA #$61 0A57 85 B9 STA $B9 0A59 20 D5 F3 JSR $F3D5 0A5C A5 BA LDA $BA 0A5E 20 0C ED JSR $ED0C 0A61 A5 B9 LDA $B9 0A63 20 B9 ED JSR $EDB9 0A66 A9 01 LDA #$01 0A68 85 8B STA $8B 0A6A 20 DD ED JSR $EDDD 0A6D A9 0E LDA #$0E ; Save from $0E01 0A6F 85 8C STA $8C 0A71 A9 08 LDA #$08 ; Save to reload at $0801 0A73 20 DD ED JSR $EDDD 0A76 78 SEI 0A77 A0 00 LDY #$00 0A79 E6 01 INC $01 0A7B B1 8B LDA ($8B),Y 0A7D C6 01 DEC $01 0A7F 20 DD ED JSR $EDDD 0A82 8D 20 D0 STA $D020 ; change border 0A85 E6 8B INC $8B 0A87 D0 02 BNE $0A8B 0A89 E6 8C INC $8C 0A8B A5 8B LDA $8B 0A8D C5 AE CMP $AE 0A8F A5 8C LDA $8C 0A91 E5 AF SBC $AF 0A93 90 E1 BCC $0A76 0A95 20 FE ED JSR $EDFE 0A98 24 B9 BIT $B9 0A9A 30 11 BMI $0AAD 0A9C A5 BA LDA $BA 0A9E 20 0C ED JSR $ED0C 0AA1 A5 B9 LDA $B9 0AA3 29 EF AND #$EF 0AA5 09 E0 ORA #$E0 0AA7 20 B9 ED JSR $EDB9 0AAA 20 FE ED JSR $EDFE 0AAD 58 CLI 0AAE 4C F9 09 JMP $09F9 ; Check for 1234 key option ; Input filename 0AB1 A2 00 LDX #$00 0AB3 86 C6 STX $C6 ; clear buffer 0AB5 86 CC STX $CC ; cursor on 0AB7 86 8D STX $8D 0AB9 20 E4 FF JSR $FFE4 0ABC C9 03 CMP #$03 ; RUN STOP key 0ABE F0 82 BEQ $0A42 ; If so then restart 0AC0 A6 8D LDX $8D 0AC2 F0 08 BEQ $0ACC ; branch if X = 0 0AC4 C9 14 CMP #$14 ; Delete key 0AC6 F0 18 BEQ $0AE0 0AC8 C9 0D CMP #$0D ; Return key 0ACA F0 17 BEQ $0AE3 ; If so then End input 0ACC 29 7F AND #$7F ; Remove high byte 0ACE C9 20 CMP #$20 ; ignore spaces 0AD0 90 E7 BCC $0AB9 0AD2 E0 10 CPX #$10 ; upto 16 characters 0AD4 F0 E3 BEQ $0AB9 0AD6 E8 INX 0AD7 0A ASL 0AD8 C9 82 CMP #$82 0ADA 6A ROR 0ADB 20 D2 FF JSR $FFD2 ; display character 0ADE 90 D7 BCC $0AB7 0AE0 CA DEX ; reduce filename length 0AE1 10 F8 BPL $0ADB ; branch back (always) ; Get character under cursor 0AE3 A4 D3 LDY $D3 ; Cursor column number 0AE5 B1 D1 LDA ($D1),Y ; Get value of character on screen 0AE7 30 FC BMI $0AE5 ; Wait until cursor off 0AE9 60 RTS ; continue ; Input two character hex number 0AEA A9 00 LDA #$00 0AEC 85 C6 STA $C6 0AEE 20 F5 0A JSR $0AF5 ; do 1st character 0AF1 0A ASL 0AF2 0A ASL 0AF3 0A ASL 0AF4 0A ASL ; shift 1st and do 2nd 0AF5 85 8B STA $8B 0AF7 20 E4 FF JSR $FFE4 0AFA C9 03 CMP #$03 ; RUN STOP key 0AFC F0 C0 BEQ $0ABE ; If so then restart 0AFE AA TAX 0AFF E9 30 SBC #$30 0B01 C9 0A CMP #$0A 0B03 90 06 BCC $0B0B ; test for number 0B05 E9 07 SBC #$07 0B07 C9 10 CMP #$10 0B09 B0 EC BCS $0AF7 ; test for letter 0B0B A8 TAY 0B0C 8A TXA 0B0D 20 D2 FF JSR $FFD2 ; output character 0B10 98 TYA 0B11 05 8B ORA $8B 0B13 60 RTS ; Display 4 character hex number in AX ; (A very elegant piece of code in my opinion) 0B14 48 PHA 0B15 8A TXA 0B16 20 1A 0B JSR $0B1A ; display 2 character hex number in A 0B19 68 PLA 0B1A 48 PHA 0B1B 4A LSR 0B1C 4A LSR 0B1D 4A LSR 0B1E 4A LSR 0B1F 20 25 0B JSR $0B25 ; display 1 character hex number 0B22 68 PLA 0B23 29 0F AND #$0F 0B25 C9 0A CMP #$0A 0B27 90 02 BCC $0B2B ; if number then branch 0B29 69 06 ADC #$06 0B2B 69 30 ADC #$30 0B2D 4C D2 FF JMP $FFD2 ; output character ; Display text just after JSR on screen 0B30 20 E3 0A JSR $0AE3 ; Get character under cursor 0B33 68 PLA ; get low memory loc after JSR 0B34 A8 TAY ; store low in Y 0B35 68 PLA ; get high memory loc after JSR 0B36 85 8C STA $8C ; store high byte 0B38 A2 01 LDX #$01 0B3A 8E 86 02 STX $0286 ; white characters 0B3D CA DEX 0B3E 86 8B STX $8B ; store #$00 0B40 A9 0D LDA #$0D ; Return char 0B42 20 D2 FF JSR $FFD2 ; Output Return 0B45 90 09 BCC $0B50 ; Jump to $0B50 0B47 C8 INY ; incrememnt pointer 0B48 D0 02 BNE $0B4C 0B4A E6 8C INC $8C ; and high byte in necess 0B4C B1 8B LDA ($8B),Y ; read next memory loc in A 0B4E F0 05 BEQ $0B55 ; Is A = #$00, if yes branch 0B50 20 D2 FF JSR $FFD2 ; Output char in A 0B53 90 F2 BCC $0B47 ; Jump to $0B47 0B55 A9 03 LDA #$03 0B57 8D 86 02 STA $0286 ; cyan characters 0B5A 8D 87 02 STA $0287 ; and cursor 0B5D A5 8C LDA $8C 0B5F 48 PHA ; push return address after 0B60 98 TYA ; text back onto the stack 0B61 48 PHA 0B62 60 RTS ; Move whole file to the end of memory 0B63 A0 00 LDY #$00 0B65 98 TYA 0B66 38 SEC 0B67 E5 FB SBC $FB 0B69 08 PHP 0B6A 18 CLC 0B6B 69 01 ADC #$01 0B6D 85 FD STA $FD 0B6F 98 TYA 0B70 69 10 ADC #$10 0B72 28 PLP 0B73 E5 FC SBC $FC 0B75 85 FE STA $FE 0B77 A5 FB LDA $FB 0B79 A6 FC LDX $FC 0B7B 85 02 STA $02 0B7D CA DEX 0B7E 86 03 STX $03 0B80 CE 87 0B DEC $0B87 0B83 B1 02 LDA ($02),Y 0B85 99 00 00 STA $0000,Y 0B88 C8 INY 0B89 D0 F8 BNE $0B83 0B8B E0 10 CPX #$10 0B8D B0 EE BCS $0B7D 0B8F 8C 87 0B STY $0B87 0B92 A5 FC LDA $FC 0B94 E9 07 SBC #$07 0B96 A6 FB LDX $FB 0B98 8E 28 0E STX $0E28 0B9B 8D 2A 0E STA $0E2A 0B9E D0 02 BNE $0BA2 0BA0 E9 01 SBC #$01 0BA2 CA DEX 0BA3 8E 3D 0E STX $0E3D 0BA6 8D 3E 0E STA $0E3E 0BA9 60 RTS ; Do compression part 2 (main part) ; Relocated to $0002-$00FF before being used 0BAA/0002 85 28 STA $28 0BAC/0004 86 74 STX $74 0BAE/0006 8A TXA 0BAF/0007 E5 71 SBC $71 0BB1/0009 AA TAX 0BB2/000A A5 75 LDA $75 0BB4/000C E5 72 SBC $72 0BB6/000E F0 02 BEQ $0BBA/$0012 0BB8/0010 A2 FF LDX #$FF 0BBA/0012 A0 00 LDY #$00 0BBC/0014 C8 INY 0BBD/0015 CA DEX 0BBE/0016 F0 06 BEQ $0BC6/$001E 0BC0/0018 B1 71 LDA ($71),Y 0BC2/001A D1 74 CMP ($74),Y 0BC4/001C F0 F6 BEQ $0BBC/$0014 0BC6/001E 88 DEY 0BC7/001F C0 00 CPY #$00 0BC9/0021 90 02 BCC $0BCD/$0025 0BCB/0023 D0 0A BNE $0BD7/$002F 0BCD/0025 A6 74 LDX $74 0BCF/0027 A9 00 LDA #$00 0BD1/0029 A0 00 LDY #$00 0BD3/002B 84 74 STY $74 0BD5/002D F0 49 BEQ $0C20/$0078 0BD7/002F A6 75 LDX $75 0BD9/0031 E8 INX 0BDA/0032 D0 0F BNE $0BEB/$0043 0BDC/0034 98 TYA 0BDD/0035 65 74 ADC $74 0BDF/0037 90 0A BCC $0BEB/$0043 0BE1/0039 85 3D STA $3D 0BE3/003B 98 TYA 0BE4/003C E9 FF SBC #$FF 0BE6/003E C5 20 CMP $20 0BE8/0040 90 E3 BCC $0BCD/$0025 0BEA/0042 A8 TAY 0BEB/0043 84 20 STY $20 0BED/0045 A6 74 LDX $74 0BEF/0047 A5 75 LDA $75 0BF1/0049 86 89 STX $89 0BF3/004B 85 93 STA $93 0BF5/004D C0 FE CPY #$FE 0BF7/004F 90 D6 BCC $0BCF/$0027 0BF9/0051 B0 35 BCS $0C30/$0088 ; 0BFB/0053 A6 71 LDX $71 0BFD/0055 A4 72 LDY $72 0BFF/0057 E8 INX 0C00/0058 D0 03 BNE $0C05/$005D 0C02/005A C8 INY 0C03/005B F0 63 BEQ $0C68/$00C0 0C05/005D 84 75 STY $75 0C07/005F A9 00 LDA #$00 0C09/0061 C6 01 DEC $01 0C0B/0063 EE 20 D0 INC $D020 ; change border 0C0E/0066 85 01 STA $01 0C10/0068 85 20 STA $20 0C12/006A 85 74 STA $74 0C14/006C A9 08 LDA #$08 ; STEP bit position 0C16/006D 85 DE STA $DE 0C18/0070 AD 00 FF LDA $FF00 0C1B/0073 DD 00 FF CMP $FF00,X 0C1E/0076 F0 8A BEQ $0BAA/$0002 0C20/0078 E8 INX 0C21/0079 D0 F8 BNE $0C1B/$0073 0C23/007B E6 75 INC $75 0C25/007D F0 04 BEQ $0C2B/$0083 0C27/007F C6 DE DEC $DE 0C29/0081 D0 F0 BNE $0C1B/$0073 0C2B/0083 A4 20 LDY $20 0C2D/0085 F0 3B BEQ $0C6A/$00C2 0C2F/0087 38 SEC 0C30/0088 A9 00 LDA #$00 0C32/008A E5 20 SBC $20 0C34/008C 08 PHP 0C35/008D 18 CLC 0C36/008E E5 71 SBC $71 0C38/0090 85 DA STA $DA 0C3A/0092 A9 00 LDA #$00 0C3C/0094 E5 72 SBC $72 0C3E/0096 28 PLP 0C3F/0097 E9 00 SBC #$00 0C41/0099 85 DB STA $DB 0C43/009B C0 02 CPY #$02 0C45/009D B0 08 BCS $0C4F/$00A7 0C47/009F AA TAX 0C48/00A0 D0 1D BNE $0C67/$00BF 0C4A/00A2 20 5E 0D JSR $0D5E 0C4D/00A5 D0 0A BNE $0C59/$00B1 0C4F/00A7 D0 05 BNE $0C56/$00AE 0C51/00A9 20 A1 0D JSR $0DA1 0C54/00AC F0 03 BEQ $0C59/$00B1 0C56/00AE 20 C3 0D JSR $0DC3 0C59/00B1 A5 20 LDA $20 0C5B/00B3 38 SEC 0C5C/00B4 65 71 ADC $71 0C5E/00B6 85 71 STA $71 0C60/00B8 90 99 BCC $0BFB/$0053 0C62/00BA E6 72 INC $72 0C64/00BC D0 95 BNE $0BFB/$0053 0C66/00BE 60 RTS ; 0C67/00BF 88 DEY 0C68/00C0 B1 71 LDA ($71),Y 0C6A/00C2 8D FF FF STA $FFFF 0C6D/00C5 E6 C3 INC $C3 0C6F/00C7 D0 02 BNE $0C73/$00CB 0C71/00C9 E6 C4 INC $C4 0C73/00CB E6 CE INC $CE 0C75/00CD A2 00 LDX #$00 0C77/00CF E8 INX 0C78/00D0 D0 03 BNE $0C7D/$00D5 0C7A/00D2 20 2A 0D JSR $0D2A 0C7D/00D5 98 TYA 0C7E/00D6 F0 DB BEQ $0C5B/$00B3 0C80/00D8 08 PHP ; Filler 0C81/00D9 .BY $00,$00,$00,$00,$00,$00,$00,$00 0C89/00E1 .BY $00,$00,$00,$00,$00,$00,$00,$00 0C91/00E9 .BY $00,$00,$00,$00,$00,$00,$00,$00 0C99/00F1 .BY $00,$00,$00,$00,$00,$00,$00,$00 0CA1/00F9 .BY $00,$00,$00,$00,$00,$00,$00 ; Swap $0002-$00FF and $0BAA-$0CA7 0CA8 A2 02 LDX #$02 0CAA B5 00 LDA $00,X 0CAC BC A8 0B LDY $0BA8,X 0CAF 94 00 STY $00,X 0CB1 9D A8 0B STA $0BA8,X 0CB4 E8 INX 0CB5 D0 F3 BNE $0CAA 0CB7 60 RTS ; Do compression part 1 0CB8 A5 FD LDA $FD 0CBA A6 FE LDX $FE 0CBC 8D 19 0C STA $0C19 0CBF 8E 1A 0C STX $0C1A 0CC2 A9 2C LDA #$2C 0CC4 A2 0F LDX #$0F ; position to store compressed code 0CC6 8D 6B 0C STA $0C6B 0CC9 8E 6C 0C STX $0C6C 0CCC 20 A8 0C JSR $0CA8 ; Swap $0002-$00FF and $0BAA-$0CA7 0CCF 20 53 00 JSR $0053 0CD2 20 2C 0D JSR $0D2C 0CD5 A5 D9 LDA $D9 0CD7 8D 39 0E STA $0E39 ; store value in decompression routine 0CDA A9 08 LDA #$08 0CDC 38 SEC 0CDD E5 D8 SBC $D8 0CDF D0 0A BNE $0CEB 0CE1 A5 C3 LDA $C3 0CE3 D0 02 BNE $0CE7 0CE5 C6 C4 DEC $C4 0CE7 C6 C3 DEC $C3 0CE9 A9 08 LDA #$08 0CEB 8D 3A 0E STA $0E3A ; store value in decompression routine 0CEE A5 C3 LDA $C3 0CF0 48 PHA 0CF1 E9 45 SBC #$45 0CF3 8D 3B 0E STA $0E3B ; store value in decompression routine 0CF6 A5 C4 LDA $C4 0CF8 48 PHA 0CF9 E9 07 SBC #$07 0CFB 8D 3C 0E STA $0E3C ; store value in decompression routine 0CFE A5 C4 LDA $C4 0D00 E9 0D SBC #$0D 0D02 8D 34 0E STA $0E34 0D05 20 A8 0C JSR $0CA8 ; Swap $0002-$00FF and $0BAA-$0CA7 0D08 68 PLA 0D09 85 AF STA $AF 0D0B 68 PLA 0D0C 85 AE STA $AE 0D0E 60 RTS ; More decompression code 0D0F 20 2C 0D JSR $0D2C 0D12 A5 DD LDA $DD 0D14 F0 F8 BEQ $0D0E 0D16 A2 04 LDX #$04 0D18 20 82 0D JSR $0D82 0D1B 86 DD STX $DD 0D1D A9 FD LDA #$FD 0D1F A2 08 LDX #$08 0D21 20 82 0D JSR $0D82 0D24 A9 07 LDA #$07 0D26 A2 03 LDX #$03 0D28 D0 58 BNE $0D82 0D2A E6 DD INC $DD 0D2C A5 CE LDA $CE 0D2E C9 06 CMP #$06 0D30 B0 08 BCS $0D3A 0D32 A2 00 LDX #$00 0D34 86 CE STX $CE 0D36 A2 03 LDX #$03 0D38 D0 48 BNE $0D82 0D3A E9 06 SBC #$06 0D3C C9 10 CMP #$10 0D3E B0 0F BCS $0D4F 0D40 A2 04 LDX #$04 0D42 20 82 0D JSR $0D82 0D45 86 CE STX $CE 0D47 18 CLC 0D48 20 69 0D JSR $0D69 0D4B A9 03 LDA #$03 0D4D D0 31 BNE $0D80 0D4F A2 08 LDX #$08 0D51 20 82 0D JSR $0D82 0D54 86 CE STX $CE 0D56 38 SEC 0D57 20 69 0D JSR $0D69 0D5A A9 03 LDA #$03 0D5C D0 22 BNE $0D80 0D5E 20 0F 0D JSR $0D0F 0D61 A5 DA LDA $DA 0D63 A2 08 LDX #$08 0D65 20 82 0D JSR $0D82 0D68 38 SEC 0D69 66 D9 ROR $D9 0D6B C6 D8 DEC $D8 0D6D D0 10 BNE $0D7F 0D6F A5 D9 LDA $D9 0D71 A0 00 LDY #$00 0D73 91 C3 STA ($C3),Y 0D75 A9 08 LDA #$08 0D77 85 D8 STA $D8 0D79 E6 C3 INC $C3 0D7B D0 02 BNE $0D7F 0D7D E6 C4 INC $C4 0D7F 60 RTS ; More decompression code 0D80 A2 02 LDX #$02 0D82 6A ROR 0D83 66 D9 ROR $D9 0D85 C6 D8 DEC $D8 0D87 D0 14 BNE $0D9D 0D89 85 DC STA $DC 0D8B A5 D9 LDA $D9 0D8D A0 00 LDY #$00 0D8F 91 C3 STA ($C3),Y 0D91 A9 08 LDA #$08 0D93 85 D8 STA $D8 0D95 A5 DC LDA $DC 0D97 E6 C3 INC $C3 0D99 D0 02 BNE $0D9D 0D9B E6 C4 INC $C4 0D9D CA DEX 0D9E D0 E2 BNE $0D82 0DA0 60 RTS ; More decompression code 0DA1 20 0F 0D JSR $0D0F 0DA4 A5 DA LDA $DA 0DA6 A2 08 LDX #$08 0DA8 A4 DB LDY $DB 0DAA D0 06 BNE $0DB2 0DAC 20 82 0D JSR $0D82 0DAF 18 CLC 0DB0 90 0B BCC $0DBD 0DB2 20 82 0D JSR $0D82 0DB5 A5 DB LDA $DB 0DB7 A2 03 LDX #$03 ; STEP value 0DB9 20 82 0D JSR $0D82 0DBC 38 SEC 0DBD 20 69 0D JSR $0D69 0DC0 8A TXA 0DC1 F0 BD BEQ $0D80 0DC3 20 0F 0D JSR $0D0F 0DC6 A5 DA LDA $DA 0DC8 A2 08 LDX #$08 0DCA A4 DB LDY $DB 0DCC D0 06 BNE $0DD4 0DCE 20 82 0D JSR $0D82 0DD1 18 CLC 0DD2 90 0B BCC $0DDF 0DD4 20 82 0D JSR $0D82 0DD7 A5 DB LDA $DB 0DD9 A2 03 LDX #$03 ; STEP value 0DDB 20 82 0D JSR $0D82 0DDE 38 SEC 0DDF 20 69 0D JSR $0D69 0DE2 A5 20 LDA $20 0DE4 38 SEC 0DE5 E9 03 SBC #$03 0DE7 C9 10 CMP #$10 0DE9 B0 08 BCS $0DF3 0DEB A2 04 LDX #$04 0DED 20 82 0D JSR $0D82 0DF0 18 CLC 0DF1 90 06 BCC $0DF9 0DF3 A2 08 LDX #$08 0DF5 20 82 0D JSR $0D82 0DF8 38 SEC 0DF9 20 69 0D JSR $0D69 0DFC A9 01 LDA #$01 0DFE D0 80 BNE $0D80 ; ; Extraction code $0E00 - $0F2C ; Normally located at $0800 - $092C ; ; BASIC PRG ( 1991 SYS2061 ) 0E00/0800 .BY $00,$0A,$08,$C7,$07,$9E,$32,$30 0E08/0808 .BY $36,$31,$00,$00,$00 0E0D/080D A9 00 LDA #$00 0E0F/080F 20 44 E5 JSR $E544 ; clear screen 0E12/0812 78 SEI 0E13/0813 A2 FF LDX #$FF 0E15/0815 9A TXS ; clear stack 0E16/0816 BD 37 08 LDA $0837,X 0E19/0819 9D F8 00 STA $00F8,X ; relocate decompression code 0E1C/081C CA DEX 0E1D/081D D0 F7 BNE $0E16/$0816 0E1F/081F 8E 11 D0 STX $D011 ; blank screen 0E22/0822 EE 30 D0 INC $D030 ; 2MHz mode on (if c128) 0E25/0825 86 01 STX $01 0E27/0827 A9 00 LDA #$00 ; replaced by pointer to 0E29/0829 A0 00 LDY #$00 ; end of program 0E2B/082B 85 2D STA $2D 0E2D/082D 84 2E STY $2E 0E2F/082F 85 AE STA $AE 0E31/0831 84 AF STY $AF 0E33/0833 A0 00 LDY #$00 ; Value is changed 0E35/0835 4C 00 01 JMP $0100 ; Zero page bytes (are changed from zeros) 0E38/00F9 .BY $00,$00,$00,$00,$00,$00,$00 ; Decompression code at $0100 0E3F/0100 BD 2C 09 LDA $092C,X 0E42/0103 9D E8 07 STA $07E8,X 0E45/0106 E8 INX 0E46/0107 D0 F7 BNE $0E3F/$0100 0E48/0109 EE 02 01 INC $0102 0E4B/010C EE 05 01 INC $0105 0E4E/010F 88 DEY 0E4F/0110 D0 EE BNE $0E3F/$0100 0E51/0112 A2 02 LDX #$02 0E53/0114 20 9D 01 JSR $019D 0E56/0117 F0 2C BEQ $0E84/$0145 0E58/0119 C9 06 CMP #$06 0E5A/011B 90 12 BCC $0E6E/$012F 0E5C/011D 29 01 AND #$01 0E5E/011F A8 TAY 0E5F/0120 20 9A 01 JSR $019A 0E62/0123 69 06 ADC #$06 0E64/0125 90 08 BCC $0E6E/$012F 0E66/0127 AA TAX 0E67/0128 20 9D 01 JSR $019D 0E6A/012B 85 F9 STA $F9 0E6C/012D 10 E3 BPL $0E51/$0112 0E6E/012F 85 8B STA $8B 0E70/0131 A5 FC LDA $FC 0E72/0133 38 SEC 0E73/0134 E5 8B SBC $8B 0E75/0136 85 FC STA $FC 0E77/0138 85 8C STA $8C 0E79/013A A5 FD LDA $FD 0E7B/013C E9 00 SBC #$00 0E7D/013E 85 FD STA $FD 0E7F/0140 85 8D STA $8D 0E81/0142 20 86 01 JSR $0186 0E84/0145 A6 F9 LDX $F9 0E86/0147 F0 04 BEQ $0E8C/$014D 0E88/0149 C6 F9 DEC $F9 0E8A/014B 10 C5 BPL $0E51/$0112 0E8C/014D 20 9D 01 JSR $019D 0E8F/0150 F0 09 BEQ $0E9A/$015B 0E91/0152 20 9A 01 JSR $019A 0E94/0155 A2 02 LDX #$02 0E96/0157 86 8B STX $8B 0E98/0159 90 1B BCC $0EB5/$0176 0E9A/015B E8 INX 0E9B/015C 20 9D 01 JSR $019D 0E9E/015F F0 09 BEQ $0EA9/$016A 0EA0/0161 E8 INX 0EA1/0162 20 9D 01 JSR $019D 0EA4/0165 20 9A 01 JSR $019A 0EA7/0168 69 01 ADC #$01 0EA9/016A 69 03 ADC #$03 0EAB/016C 85 8B STA $8B 0EAD/016E E8 INX 0EAE/016F 20 9D 01 JSR $019D 0EB1/0172 C8 INY 0EB2/0173 20 9A 01 JSR $019A 0EB5/0176 65 FE ADC $FE 0EB7/0178 85 8C STA $8C 0EB9/017A A5 8D LDA $8D 0EBB/017C 65 FF ADC $FF 0EBD/017E 85 8D STA $8D 0EBF/0180 38 SEC 0EC0/0181 20 86 01 JSR $0186 0EC3/0184 F0 8C BEQ $0E51/$0112 ; branch always ; 0EC5/0186 A4 8B LDY $8B 0EC7/0188 A5 FE LDA $FE 0EC9/018A E5 8B SBC $8B 0ECB/018C 85 FE STA $FE 0ECD/018E B0 02 BCS $0ED1/$0192 0ECF/0190 C6 FF DEC $FF 0ED1/0192 B1 8C LDA ($8C),Y 0ED3/0194 91 FE STA ($FE),Y 0ED5/0196 88 DEY 0ED6/0197 D0 F9 BNE $0ED1/$0192 0ED8/0199 60 RTS ; 0ED9/019A BE EA 01 LDX $01EA,Y 0EDC/019D A9 00 LDA #$00 0EDE/019F 85 8D STA $8D 0EE0/01A1 A4 FB LDY $FB 0EE2/01A3 F0 0C BEQ $0EF0/$01B1 0EE4/01A5 06 FA ASL $FA 0EE6/01A7 2A ROL 0EE7/01A8 26 8D ROL $8D 0EE9/01AA C6 FB DEC $FB 0EEB/01AC CA DEX 0EEC/01AD 10 F2 BPL $0EE0/$01A1 0EEE/01AF A8 TAY 0EEF/01B0 60 RTS ; 0EF0/01B1 85 8E STA $8E 0EF2/01B3 B1 FC LDA ($FC),Y 0EF4/01B5 85 FA STA $FA 0EF6/01B7 A9 08 LDA #$08 0EF8/01B9 85 FB STA $FB 0EFA/01BB A5 8E LDA $8E 0EFC/01BD A4 FC LDY $FC 0EFE/01BF D0 02 BNE $0F02/$01C3 0F00/01C1 C6 FD DEC $FD 0F02/01C3 C6 FC DEC $FC 0F04/01C5 C0 E7 CPY #$E7 0F06/01C7 D0 DC BNE $0EE4/$01A5 0F08/01C9 A4 FD LDY $FD 0F0A/01CB C0 07 CPY #$07 0F0C/01CD D0 D6 BNE $0EE4/$01A5 0F0E/01CF A9 33 LDA #$33 ; set value of $01 register 0F10/01D1 85 01 STA $01 0F12/01D3 CE 30 D0 DEC $D030 ; 2MHz mode off 0F15/01D6 A9 1B LDA #$1B 0F17/01D8 8D 11 D0 STA $D011 ; unblank screen 0F1A/01DB 58 CLI 0F1B/01DC A9 00 LDA #$00 0F1D/01DE 8D 00 08 STA $0800 0F20/01E1 20 33 33 JSR $3333 ; JSR to start address of file 0F23/01E4 20 8E A6 JSR $A68E 0F26/01E7 4C AE A7 JMP $A7AE 0F29/01EA .BY $03 0F2A/01EB .BY $07 0F2B/01EC .BY $0A ; STEP plus 7 0F2C/01ED .BY $00 ; The end