Used threshold: $1A0 (TAP byte $34) (Initial timer value $7A0, checked if it has dropped below $600 when tape interrupt occurs) Used pulsewidths (in TAP bytes): Bit 0 = ~$46 Bit 1 = ~$21 Dataformat (first turbofile, main loader) (MSbF): .---------.----------------------.--------.-----------------.---------------.---------------.--------.-----------------------.---------. | pause | pilot ~8119 * ~$46 | sync | start LO & HI | end LO & HI | exe LO & HI | data | trailer ~512 * ~$46 | pause | '---------'----------------------'--------'-----------------'---------------'---------------'--------'-----------------------'---------' - Pilot, ~8119 bit 0 pulses. - Sync, 0x85. - 2 bytes, LO & HI byte of the files first address. - 2 bytes, LO & HI byte of the files last address. - 2 bytes, LO & HI byte of the files execution address. - n bytes, data. - No checksum! - Trailer, ~512 bit 0 pulses. Dataformat (rest of the turbofiles) (MSbF): .---------.------------------.--------.--------.-----------------------.---------. | pause | pilot n * ~$46 | sync | file | trailer ~512 * ~$46 | pause | '---------'------------------'--------'--------'-----------------------'---------' / \ _ ___/ \___ _ .-----------------.---------------.---------------.---------------. | headerblock 0 | datablock 1 | datablock 2 | datablock n | '-----------------'---------------'---------------'---------------' - Pilot, first file has as much as 8119 bit 0 pulses. Remaining files have between 1730-1834 pulses, with the beginning of the pulsestream distorted. Loader doesn't count pilotpulses. - Sync, 0x85. - Headerblock: C2 D7 C2 27 31 39 39 30 A0 00 A0 00 A0 00 00 0A 00 0A 00 0A 00 A0 00 A0 00 A0 85 42 4C *i *b *c *1 *2 *3 *4 *c - Datablocks: C2 D7 C2 27 31 39 39 30 A0 00 A0 00 A0 00 00 0A 00 0A 00 0A 00 A0 00 A0 00 A0 85 42 4C *i *b *c *d *x - Trailer, ~512 bit 0 pulses. *i = File ID *b = Block ID (0 for header, 1++ for data) *c = Checksum (the previous 4 bytes XORed together *1 = Start address LO byte *2 = Start address HI byte *3 = Last address LO byte *4 = Last address HI byte *d = Data (maximum of 256 bytes per datablock) *x = Checksum (databytes from the current block XORed together) Notes: - Loader itself syncs to blocks by looking for 85 42 4C *i *b *c. - Files are compressed. Decompressor is embedded inside the main loader. .C:0351 78 SEI .C:0352 A9 2F LDA #$2F .C:0354 85 00 STA $00 .C:0356 A9 05 LDA #$05 ; BASIC on, KERNAL off, motor on .C:0358 85 01 STA $01 .C:035a A9 00 LDA #$00 .C:035c 85 03 STA $03 ; Clear start address LO byte .C:035e 85 02 STA $02 ; Clear databyte .C:0360 A9 7F LDA #$7F ; Mask out all interrupts .C:0362 8D 0D DC STA $DC0D .C:0365 8D 0D DD STA $DD0D .C:0368 A9 90 LDA #$90 ; Tape causes IRQ .C:036a 8D 0D DC STA $DC0D .C:036d A9 11 LDA #$11 ; CIA 1 Timer A: Force load, Start .C:036f 8D 0E DC STA $DC0E .C:0372 A2 D4 LDX #$D4 ; IRQ at $03D4 .C:0374 A9 03 LDA #$03 .C:0376 8E FE FF STX $FFFE .C:0379 8D FF FF STA $FFFF .C:037c A9 A0 LDA #$A0 ; CIA 1 Timer A countdown $07A0 .C:037e 8D 04 DC STA $DC04 .C:0381 A9 07 LDA #$07 .C:0383 8D 05 DC STA $DC05 .C:0386 58 CLI .C:0387 A0 85 LDY #$85 ; Wait for sync .C:0389 C4 02 CPY $02 .C:038b D0 FC BNE $0389 .C:038d 20 CC 03 JSR $03CC ; Get start address LO byte .C:0390 A8 TAY .C:0391 20 CC 03 JSR $03CC ; Get start address HI byte .C:0394 85 04 STA $04 .C:0396 20 CC 03 JSR $03CC ; Get end address LO byte .C:0399 85 05 STA $05 .C:039b 20 CC 03 JSR $03CC ; Get end address HI byte .C:039e 85 06 STA $06 .C:03a0 20 CC 03 JSR $03CC ; Get execution address LO byte .C:03a3 85 07 STA $07 .C:03a5 20 CC 03 JSR $03CC ; Get execution address HI byte .C:03a8 85 08 STA $08 .C:03aa A9 FE LDA #$FE ; Reset bitcount .C:03ac 85 02 STA $02 .C:03ae 0A ASL A ; Wait for byte .C:03af B0 FE BCS $03AF .C:03b1 91 03 STA ($03),Y ; Store byte .C:03b3 8D 20 D0 STA $D020 ; Blink screen .C:03b6 A9 00 LDA #$00 .C:03b8 8D 20 D0 STA $D020 .C:03bb C8 INY .C:03bc D0 02 BNE $03C0 .C:03be E6 04 INC $04 .C:03c0 C4 05 CPY $05 .C:03c2 A5 04 LDA $04 .C:03c4 E5 06 SBC $06 .C:03c6 90 E2 BCC $03AA .C:03c8 78 SEI .C:03c9 6C 07 00 JMP ($0007) ; Execute file // Get byte .C:03cc A9 FE LDA #$FE ; Reset bitcount .C:03ce 85 02 STA $02 .C:03d0 0A ASL A ; Wait for byte .C:03d1 B0 FE BCS $03D1 .C:03d3 60 RTS // IRQ .C:03d4 AD 05 DC LDA $DC05 ; Get CIA 1 Timer A HI byte .C:03d7 A2 11 LDX #$11 ; CIA 1 Timer A: Force load, Start .C:03d9 8E 0E DC STX $DC0E .C:03dc C9 06 CMP #$06 ; Timer dropped below $0600 (threshold $34)? .C:03de 26 02 ROL $02 ; Store bit .C:03e0 B0 0B BCS $03ED ; All 8 bits in? .C:03e2 BA TSX ; Clear carry on return to signal for byte ready .C:03e3 BD 01 01 LDA $0101,X .C:03e6 29 FE AND #$FE .C:03e8 9D 01 01 STA $0101,X .C:03eb A5 02 LDA $02 .C:03ed 2C 0D DC BIT $DC0D ; Ack interrupt .C:03f0 40 RTI >C:03f1 42 57 42 2d 4c 4f 41 44 20 20 20 "BWB-LOAD " ----------------------------------------------------------- .C:a680 78 SEI .C:a681 A2 35 LDX #$35 ; Motor off .C:a683 86 01 STX $01 .C:a685 8D 1A D0 STA $D01A ; Clear display interrupts .C:a688 8D 04 DD STA $DD04 ; CIA 2 Timer A countdown $9000 .C:a68b A9 90 LDA #$90 .C:a68d 8D 05 DD STA $DD05 .C:a690 A9 7F LDA #$7F ; Disable VIC interrupts .C:a692 8D 19 D0 STA $D019 .C:a695 8D 0D DC STA $DC0D ; Mask out all interrupts .C:a698 8D 0D DD STA $DD0D .C:a69b 2C 0D DC BIT $DC0D ; Ack pending interrupts .C:a69e A2 06 LDX #$06 ; IRQ to $A706 .C:a6a0 A0 A7 LDY #$A7 .C:a6a2 8E FE FF STX $FFFE .C:a6a5 8C FF FF STY $FFFF .C:a6a8 58 CLI .C:a6a9 A2 01 LDX #$01 .C:a6ab 20 7C A7 JSR $A77C .C:a6ae 78 SEI .C:a6af A9 60 LDA #$60 .C:a6b1 AD 16 A8 LDA $A816 .C:a6b4 A2 53 LDX #$53 .C:a6b6 A0 00 LDY #$00 .C:a6b8 A9 20 LDA #$20 ; Motor off .C:a6ba 85 01 STA $01 .C:a6bc B9 00 1B LDA $1B00,Y .C:a6bf 99 00 AB STA $AB00,Y .C:a6c2 C8 INY .C:a6c3 D0 F7 BNE $A6BC .C:a6c5 EE BE A6 INC $A6BE .C:a6c8 EE C1 A6 INC $A6C1 .C:a6cb CA DEX .C:a6cc 10 EE BPL $A6BC .C:a6ce A2 3F LDX #$3F .C:a6d0 BD 00 6F LDA $6F00,X .C:a6d3 9D 00 FF STA $FF00,X .C:a6d6 CA DEX .C:a6d7 10 F7 BPL $A6D0 .C:a6d9 A9 25 LDA #$25 ; Motor off .C:a6db 85 01 STA $01 .C:a6dd 58 CLI .C:a6de A9 7F LDA #$7F .C:a6e0 8D 0D DC STA $DC0D .C:a6e3 2C 0D DC BIT $DC0D .C:a6e6 4C 00 CD JMP $CD00 ----------------------------------------------------------- >C:a6e8 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 >C:a6f8 33 33 33 33 33 33 33 33 ----------------------------------------------------------- .C:a700 4C 7C A7 JMP $A77C .C:a703 4C 26 AA JMP $AA26 .C:a706 48 PHA ; IRQ runs here .C:a707 A9 10 LDA #$10 ; Check tape interrupt .C:a709 2C 0D DC BIT $DC0D ; * .C:a70c F0 28 BEQ $A736 ; Didn't happen yet .C:a70e AD 05 DC LDA $DC05 .C:a711 86 F2 STX $F2 .C:a713 A2 11 LDX #$11 ; CIA 1 Timer A: Force load, Start .C:a715 8E 0E DC STX $DC0E .C:a718 C9 06 CMP #$06 ; Bit 0 or 1? .C:a71a 26 F6 ROL $F6 .C:a71c A9 00 LDA #$00 ; * .C:a71e 10 1D BPL $A73D ; Find sync? .C:a720 B0 10 BCS $A732 ; All 8 bits in yet? .C:a722 A5 F5 LDA $F5 .C:a724 E6 F5 INC $F5 .C:a726 29 1F AND #$1F .C:a728 AA TAX .C:a729 A5 F6 LDA $F6 .C:a72b 9D 80 01 STA $0180,X .C:a72e A9 FE LDA #$FE .C:a730 85 F6 STA $F6 .C:a732 A6 F2 LDX $F2 .C:a734 68 PLA .C:a735 40 RTI .C:a736 CE 19 D0 DEC $D019 .C:a739 58 CLI .C:a73a 4C 03 AB JMP $AB03 // Find sync .C:a73d A5 F6 LDA $F6 ; Found sync? .C:a73f C9 85 CMP #$85 .C:a741 D0 EF BNE $A732 .C:a743 8D 1D A7 STA $A71D ; -> Sync found .C:a746 F0 E6 BEQ $A72E // Decompression finished .C:a748 C6 FD DEC $FD .C:a74a A0 F0 LDY #$F0 .C:a74c B9 D0 00 LDA $00D0,Y .C:a74f 91 FC STA ($FC),Y .C:a751 C8 INY .C:a752 D0 F8 BNE $A74C .C:a754 68 PLA .C:a755 68 PLA .C:a756 60 RTS .C:a757 A4 FF LDY $FF ; Everything decompressed? .C:a759 C0 FF CPY #$FF ; * .C:a75b D0 09 BNE $A766 .C:a75d A4 FE LDY $FE .C:a75f C0 FF CPY #$FF ; * .C:a761 D0 03 BNE $A766 .C:a763 4C 48 A7 JMP $A748 ; -> Decompression finished .C:a766 38 SEC .C:a767 8D 7A A7 STA $A77A .C:a76a A0 00 LDY #$00 .C:a76c B1 FE LDA ($FE),Y .C:a76e A4 FE LDY $FE .C:a770 D0 02 BNE $A774 .C:a772 C6 FF DEC $FF .C:a774 C6 FE DEC $FE .C:a776 2A ROL A .C:a777 85 FB STA $FB .C:a779 A9 00 LDA #$00 .C:a77b 60 RTS .C:a77c 8E B6 A9 STX $A9B6 ; -> file ID compare .C:a77f A9 0D LDA #$0D .C:a781 8D 0A A7 STA $A70A ; -> Enable tape interrupt checking .C:a784 A9 90 LDA #$90 ; Tape causes IRQ .C:a786 8D 0D DC STA $DC0D .C:a789 A9 05 LDA #$05 ; Motor on .C:a78b 85 01 STA $01 .C:a78d A9 00 LDA #$00 .C:a78f 8D BE A9 STA $A9BE ; -> block ID compare .C:a792 20 85 A9 JSR $A985 ; Find correct file & block .C:a795 EE BE A9 INC $A9BE ; -> Next block ID .C:a798 20 66 A9 JSR $A966 ; Get byte .C:a79b 8D C2 A7 STA $A7C2 ; -> Start address LO .C:a79e 20 66 A9 JSR $A966 ; Get byte .C:a7a1 8D C3 A7 STA $A7C3 ; -> Start address HI .C:a7a4 20 66 A9 JSR $A966 ; Get byte .C:a7a7 85 F7 STA $F7 ; End address LO .C:a7a9 20 66 A9 JSR $A966 ; Get byte .C:a7ac 85 F8 STA $F8 ; End address HI .C:a7ae 20 66 A9 JSR $A966 ; Get byte .C:a7b1 A5 F3 LDA $F3 ; Check header checksum .C:a7b3 F0 06 BEQ $A7BB .C:a7b5 20 CB A9 JSR $A9CB ; Error notification .C:a7b8 4C 8D A7 JMP $A78D // Load block .C:a7bb 20 85 A9 JSR $A985 ; Find correct file & block .C:a7be 20 66 A9 JSR $A966 ; Get byte .C:a7c1 99 FF FF STA $FFFF,Y ; * .C:a7c4 C8 INY .C:a7c5 D0 21 BNE $A7E8 .C:a7c7 20 66 A9 JSR $A966 ; Get byte .C:a7ca A5 F3 LDA $F3 ; Check block checksum .C:a7cc F0 06 BEQ $A7D4 .C:a7ce 20 CB A9 JSR $A9CB ; Error notification .C:a7d1 4C BB A7 JMP $A7BB ; Load next block .C:a7d4 EE C3 A7 INC $A7C3 .C:a7d7 EE BE A9 INC $A9BE ; -> Next block ID .C:a7da A5 F7 LDA $F7 .C:a7dc CD C2 A7 CMP $A7C2 .C:a7df A5 F8 LDA $F8 .C:a7e1 ED C3 A7 SBC $A7C3 .C:a7e4 B0 D5 BCS $A7BB .C:a7e6 90 1F BCC $A807 ; Decompress file .C:a7e8 18 CLC .C:a7e9 98 TYA .C:a7ea 6D C2 A7 ADC $A7C2 .C:a7ed 45 F7 EOR $F7 .C:a7ef D0 CD BNE $A7BE .C:a7f1 AD C3 A7 LDA $A7C3 .C:a7f4 69 00 ADC #$00 .C:a7f6 45 F8 EOR $F8 .C:a7f8 D0 C4 BNE $A7BE .C:a7fa 20 66 A9 JSR $A966 ; Get byte .C:a7fd A5 F3 LDA $F3 ; Check block checksum .C:a7ff F0 06 BEQ $A807 ; Decompress file .C:a801 20 CB A9 JSR $A9CB ; Error notification .C:a804 4C BB A7 JMP $A7BB // Decompress file .C:a807 A9 25 LDA #$25 ; Motor off .C:a809 8D 0A A7 STA $A70A ; -> Disable tape interrupt checking .C:a80c 85 01 STA $01 .C:a80e A9 7F LDA #$7F ; Mask off interrupts .C:a810 8D 0D DC STA $DC0D .C:a813 2C 0D DC BIT $DC0D ; Ack pending interrupts .C:a816 C6 F8 DEC $F8 .C:a818 A0 E9 LDY #$E9 .C:a81a B1 F7 LDA ($F7),Y .C:a81c 99 10 00 STA $0010,Y .C:a81f C8 INY .C:a820 C0 F0 CPY #$F0 .C:a822 D0 F6 BNE $A81A .C:a824 B1 F7 LDA ($F7),Y .C:a826 99 D0 00 STA $00D0,Y .C:a829 C8 INY .C:a82a D0 F8 BNE $A824 .C:a82c A5 F9 LDA $F9 .C:a82e 8D 60 A7 STA $A760 .C:a831 A5 FA LDA $FA .C:a833 8D 5A A7 STA $A75A .C:a836 A2 00 LDX #$00 .C:a838 A5 FC LDA $FC .C:a83a 85 F7 STA $F7 .C:a83c A5 FD LDA $FD .C:a83e 85 F8 STA $F8 .C:a840 8E CD A8 STX $A8CD .C:a843 8A TXA .C:a844 A2 03 LDX #$03 .C:a846 06 FB ASL $FB .C:a848 D0 03 BNE $A84D .C:a84a 20 67 A7 JSR $A767 .C:a84d 2A ROL A .C:a84e CA DEX .C:a84f D0 F5 BNE $A846 .C:a851 A8 TAY .C:a852 F0 51 BEQ $A8A5 .C:a854 C9 07 CMP #$07 .C:a856 D0 28 BNE $A880 .C:a858 06 FB ASL $FB .C:a85a D0 03 BNE $A85F .C:a85c 20 67 A7 JSR $A767 .C:a85f B0 12 BCS $A873 .C:a861 8A TXA .C:a862 A2 04 LDX #$04 .C:a864 06 FB ASL $FB .C:a866 D0 03 BNE $A86B .C:a868 20 67 A7 JSR $A767 .C:a86b 2A ROL A .C:a86c CA DEX .C:a86d D0 F5 BNE $A864 .C:a86f 69 07 ADC #$07 .C:a871 D0 0D BNE $A880 .C:a873 A2 08 LDX #$08 .C:a875 06 FB ASL $FB .C:a877 D0 03 BNE $A87C .C:a879 20 67 A7 JSR $A767 .C:a87c 2A ROL A .C:a87d CA DEX .C:a87e D0 F5 BNE $A875 .C:a880 8D 87 A8 STA $A887 .C:a883 38 SEC .C:a884 A5 FE LDA $FE .C:a886 E9 00 SBC #$00 .C:a888 85 FE STA $FE .C:a88a B0 02 BCS $A88E .C:a88c C6 FF DEC $FF .C:a88e 38 SEC .C:a88f A5 FC LDA $FC .C:a891 ED 87 A8 SBC $A887 .C:a894 85 FC STA $FC .C:a896 B0 02 BCS $A89A .C:a898 C6 FD DEC $FD .C:a89a AC 87 A8 LDY $A887 .C:a89d B1 FE LDA ($FE),Y .C:a89f 88 DEY .C:a8a0 91 FC STA ($FC),Y .C:a8a2 98 TYA .C:a8a3 D0 F8 BNE $A89D .C:a8a5 06 FB ASL $FB .C:a8a7 D0 03 BNE $A8AC .C:a8a9 20 57 A7 JSR $A757 .C:a8ac B0 3C BCS $A8EA .C:a8ae A2 08 LDX #$08 .C:a8b0 06 FB ASL $FB .C:a8b2 D0 03 BNE $A8B7 .C:a8b4 20 67 A7 JSR $A767 .C:a8b7 2A ROL A .C:a8b8 CA DEX .C:a8b9 D0 F5 BNE $A8B0 .C:a8bb A0 02 LDY #$02 .C:a8bd 8C 87 A8 STY $A887 .C:a8c0 8D C7 A8 STA $A8C7 .C:a8c3 18 CLC .C:a8c4 A5 FC LDA $FC .C:a8c6 69 00 ADC #$00 .C:a8c8 85 F9 STA $F9 .C:a8ca A5 FD LDA $FD .C:a8cc 69 00 ADC #$00 .C:a8ce 85 FA STA $FA .C:a8d0 38 SEC .C:a8d1 A5 FC LDA $FC .C:a8d3 ED 87 A8 SBC $A887 .C:a8d6 85 FC STA $FC .C:a8d8 B0 02 BCS $A8DC .C:a8da C6 FD DEC $FD .C:a8dc AC 87 A8 LDY $A887 .C:a8df 88 DEY .C:a8e0 B1 F9 LDA ($F9),Y .C:a8e2 91 FC STA ($FC),Y .C:a8e4 98 TYA .C:a8e5 D0 F8 BNE $A8DF .C:a8e7 4C 40 A8 JMP $A840 .C:a8ea 06 FB ASL $FB .C:a8ec D0 03 BNE $A8F1 .C:a8ee 20 67 A7 JSR $A767 .C:a8f1 B0 33 BCS $A926 .C:a8f3 A0 03 LDY #$03 .C:a8f5 8C 87 A8 STY $A887 .C:a8f8 06 FB ASL $FB .C:a8fa D0 03 BNE $A8FF .C:a8fc 20 67 A7 JSR $A767 .C:a8ff 90 0F BCC $A910 .C:a901 A2 08 LDX #$08 .C:a903 06 FB ASL $FB .C:a905 D0 03 BNE $A90A .C:a907 20 67 A7 JSR $A767 .C:a90a 2A ROL A .C:a90b CA DEX .C:a90c D0 F5 BNE $A903 .C:a90e F0 B0 BEQ $A8C0 .C:a910 8A TXA .C:a911 A2 0C LDX #$0C .C:a913 06 FB ASL $FB .C:a915 D0 03 BNE $A91A .C:a917 20 67 A7 JSR $A767 .C:a91a 2A ROL A .C:a91b 2E CD A8 ROL $A8CD .C:a91e CA DEX .C:a91f D0 F2 BNE $A913 .C:a921 EE CD A8 INC $A8CD .C:a924 D0 9A BNE $A8C0 .C:a926 06 FB ASL $FB .C:a928 D0 03 BNE $A92D .C:a92a 20 67 A7 JSR $A767 .C:a92d B0 0C BCS $A93B .C:a92f 06 FB ASL $FB .C:a931 D0 03 BNE $A936 .C:a933 20 67 A7 JSR $A767 .C:a936 69 04 ADC #$04 .C:a938 A8 TAY .C:a939 D0 BA BNE $A8F5 .C:a93b 06 FB ASL $FB .C:a93d D0 03 BNE $A942 .C:a93f 20 67 A7 JSR $A767 .C:a942 B0 13 BCS $A957 .C:a944 8A TXA .C:a945 A2 02 LDX #$02 .C:a947 06 FB ASL $FB .C:a949 D0 03 BNE $A94E .C:a94b 20 67 A7 JSR $A767 .C:a94e 2A ROL A .C:a94f CA DEX .C:a950 D0 F5 BNE $A947 .C:a952 18 CLC .C:a953 69 06 ADC #$06 .C:a955 D0 E1 BNE $A938 .C:a957 A2 08 LDX #$08 .C:a959 06 FB ASL $FB .C:a95b D0 03 BNE $A960 .C:a95d 20 67 A7 JSR $A767 .C:a960 2A ROL A .C:a961 CA DEX .C:a962 D0 F5 BNE $A959 .C:a964 F0 D2 BEQ $A938 // Get byte .C:a966 A5 F4 LDA $F4 .C:a968 C5 F5 CMP $F5 .C:a96a F0 FC BEQ $A968 .C:a96c E6 F4 INC $F4 .C:a96e 29 1F AND #$1F .C:a970 AA TAX .C:a971 BD 80 01 LDA $0180,X .C:a974 AA TAX .C:a975 45 F3 EOR $F3 .C:a977 85 F3 STA $F3 .C:a979 78 SEI .C:a97a 8D 20 D0 STA $D020 ; Blink screen .C:a97d A9 00 LDA #$00 .C:a97f 8D 20 D0 STA $D020 .C:a982 58 CLI .C:a983 8A TXA .C:a984 60 RTS // Find correct file & block .C:a985 A9 00 LDA #$00 .C:a987 8D 1D A7 STA $A71D .C:a98a 85 F6 STA $F6 .C:a98c 85 F3 STA $F3 .C:a98e 85 F4 STA $F4 .C:a990 85 F5 STA $F5 .C:a992 20 66 A9 JSR $A966 ; Get byte .C:a995 49 42 EOR #$42 ; Check block header 1? .C:a997 D0 EC BNE $A985 .C:a999 20 66 A9 JSR $A966 ; Get byte .C:a99c 49 4C EOR #$4C ; Check block header 2? .C:a99e D0 E5 BNE $A985 .C:a9a0 20 66 A9 JSR $A966 ; Get byte .C:a9a3 8D B4 A9 STA $A9B4 ; -> file ID .C:a9a6 20 66 A9 JSR $A966 ; Get byte .C:a9a9 8D BC A9 STA $A9BC ; -> block ID .C:a9ac 20 66 A9 JSR $A966 ; Get byte .C:a9af A5 F3 LDA $F3 ; Check ID confirmation checksum .C:a9b1 D0 10 BNE $A9C3 .C:a9b3 A9 00 LDA #$00 ; * Check file ID .C:a9b5 C9 00 CMP #$00 ; * file ID compare .C:a9b7 90 CC BCC $A985 .C:a9b9 D0 08 BNE $A9C3 ; Need to rewind .C:a9bb A9 00 LDA #$00 ; * Check block ID .C:a9bd C9 00 CMP #$00 ; * block ID compare .C:a9bf 90 C4 BCC $A985 .C:a9c1 F0 05 BEQ $A9C8 .C:a9c3 20 CB A9 JSR $A9CB ; Error notification .C:a9c6 30 BD BMI $A985 .C:a9c8 A0 00 LDY #$00 .C:a9ca 60 RTS // Error notification .C:a9cb A9 25 LDA #$25 ; Motor off .C:a9cd 85 01 STA $01 .C:a9cf A0 00 LDY #$00 .C:a9d1 8C 07 DD STY $DD07 .C:a9d4 C8 INY .C:a9d5 8C 06 DD STY $DD06 .C:a9d8 C8 INY .C:a9d9 8C 20 D0 STY $D020 .C:a9dc 20 FC A9 JSR $A9FC .C:a9df A9 11 LDA #$11 ; CIA 2 Timer A: Force load, Start .C:a9e1 8D 0E DD STA $DD0E .C:a9e4 09 48 ORA #$48 ; CIA 2 Timer B: Count Timer A underflow pulses, .C:a9e6 8D 0F DD STA $DD0F ; Force load, One-shot, Start .C:a9e9 A9 01 LDA #$01 .C:a9eb 2C 0F DD BIT $DD0F .C:a9ee D0 F9 BNE $A9E9 .C:a9f0 A9 25 LDA #$25 ; Motor off .C:a9f2 85 01 STA $01 .C:a9f4 A0 00 LDY #$00 ; Disable CIA 2 timers .C:a9f6 8C 0E DD STY $DD0E .C:a9f9 8C 0F DD STY $DD0F .C:a9fc A9 F0 LDA #$F0 ; -> BEQ (PLAY) .C:a9fe 20 03 AA JSR $AA03 .C:aa01 A9 D0 LDA #$D0 ; -> BNE (STOP) .C:aa03 8D 19 AA STA $AA19 .C:aa06 A0 03 LDY #$03 .C:aa08 8C 25 AA STY $AA25 .C:aa0b 2C 11 D0 BIT $D011 .C:aa0e 30 FB BMI $AA0B .C:aa10 2C 11 D0 BIT $D011 .C:aa13 10 FB BPL $AA10 .C:aa15 A9 10 LDA #$10 ; Wait for PLAY/STOP to be pressed .C:aa17 24 01 BIT $01 .C:aa19 F0 EB BEQ $AA06 ; * BNE .C:aa1b CE 25 AA DEC $AA25 .C:aa1e 10 EB BPL $AA0B .C:aa20 A9 05 LDA #$05 ; Motor on .C:aa22 85 01 STA $01 .C:aa24 60 RTS .C:aa25 00 BRK .C:aa26 A9 25 LDA #$25 ; Motor off .C:aa28 85 01 STA $01 .C:aa2a 20 FC A9 JSR $A9FC .C:aa2d 20 FC A9 JSR $A9FC .C:aa30 A9 0B LDA #$0B .C:aa32 8D 11 D0 STA $D011 .C:aa35 60 RTS