processor 6502 include vcs.h include macro.h SEG.U RAM ORG $80 Chan0Offset ds 1 Chan1Offset ds 1 Chan0HoldCt ds 1 Chan1HoldCt ds 1 Chan0End ds 1 Chan1End ds 1 SEG CODE ORG $f000 Start CLEAN_START LDA #$ff STA Chan0Offset STA Chan1Offset Frame VERTICAL_SYNC ; 42 ticks of TIM64T for VBLANK LDA #43 STA TIM64T ; channel 0 LDX Chan0HoldCt CPX #$02 ; if more than 1 then branch to Chan0Held BCS Chan0Held INC Chan0Offset LDY Chan0Offset LDX Chan0Hold,Y CPX #$ff BEQ Chan0WaitEnd STX Chan0HoldCt LDA Chan0Control,Y STA AUDC0 LDA Chan0Frequency,Y STA AUDF0 LDA Chan0Volume,Y STA AUDV0 JMP Chan0Held Chan0WaitEnd STX Chan0End DEC Chan0Offset JMP Chan0Processed Chan0Held DEC Chan0HoldCt Chan0Processed ; channel 1 LDX Chan1HoldCt CPX #$02 ; if more than 1 then branch to Chan1Held BCS Chan1Held INC Chan1Offset LDY Chan1Offset LDX Chan1Hold,Y CPX #$ff BEQ Chan1WaitEnd STX Chan1HoldCt LDA Chan1Control,Y STA AUDC1 LDA Chan1Frequency,Y STA AUDF1 LDA Chan1Volume,Y STA AUDV1 JMP Chan1Held Chan1WaitEnd STX Chan1End DEC Chan1Offset JMP Chan1Processed Chan1Held DEC Chan1HoldCt Chan1Processed CheckEnd LDA Chan0End CMP #$ff BNE WaitVBLANK EOR Chan1End BEQ Restart JMP WaitVBLANK Restart JMP Start WaitVBLANK LDA INTIM BNE WaitVBLANK STA WSYNC STA VBLANK ; 192 scalines of display LDX #192 DisplayWait STA WSYNC DEX BNE DisplayWait ; 30 scalines of overscan LDX #30 LDA #2 STA VBLANK OverScanWait STA WSYNC DEX BNE OverScanWait ; start a new frame JMP Frame Chan0Control hex 00 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 00 00 Chan0Frequency hex 00 13 17 1a 17 14 13 14 1a 17 1d 17 13 10 0e 09 09 09 09 09 09 09 09 09 08 08 00 00 Chan0Volume hex 00 09 09 09 09 09 09 09 09 09 09 09 09 09 09 04 07 0a 04 07 0a 04 07 0a 0a 0b 0a 00 Chan0Hold hex 0a 11 09 09 09 09 11 09 09 11 11 11 11 11 41 03 05 09 03 05 09 03 05 09 05 81 02 01 ff Chan1Control hex 00 04 04 04 04 0c 0c 0c 04 0c 0c 04 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 0c 00 0c 00 Chan1Frequency hex 00 13 17 15 1a 07 09 08 1f 09 0b 1f 0c 0b 0e 0c 0f 0e 11 0f 13 11 14 13 1d 17 13 10 0e 0b 0a 0b 0a 0b 0a 0b 0c 0d 00 Chan1Volume hex 00 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 09 02 05 02 05 02 05 04 0b 00 Chan1Hold hex 0a 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 11 11 11 11 41 03 0d 03 0d 03 0d 05 81 01 ff org $fffc .word Start .word Start