; ; JOYCTRL - JOYSTICK MIDI CONTROLLERS WITH MIDI THRU ; NOTE: USES 65C02 INSTRUCTIONS!!! ; XTOUT EQU $C064 YTOUT EQU $C065 PTRIG EQU $C070 ; QHEAD EQU $06 QTAIL EQU $08 ; ORG $6000 ; JMP STARTPGM ; ; PUBLIC VARIABLES: ; XUPDBYTE DFB $02 ;WHICH BYTE OF THE MESSAGE TO UPDATE (1 OR 2) XMSG0 DFB $E0 ;STATUS BYTE OF MESSAGE FOR X AXIS XMSG1 DFB $00 ;DATABYTE 1 XMSG2 DFB $00 ;DATABYTE 2 ; YUPDBYTE DFB $02 YMSG0 DFB $B0 YMSG1 DFB $01 ;MODULATION YMSG2 DFB $00 ; KEYDOWN DFB $00 PB0DOWN DFB $00 PB1DOWN DFB $00 ; ;PRIVATE VARIABLES ; ANOMSG0 DFB $B0 ANOMSG1 DFB 123 ANOMSG2 DFB $00 ; JOYX DFB $00 JOYY DFB $00 JOYXPREV DFB $00 JOYYPREV DFB $00 JOYXPRV2 DFB $00 JOYYPRV2 DFB $00 ; STARTPGM LDA #$13 ;INITIALIZE MIDI INTERFACE STA $C0A8 LDA #$11 STA $C0A8 LDA #$0 ;INITIALIZE VARIABLES STA KEYDOWN STA PB0DOWN STA PB1DOWN ; MAINLOOP LDA $C0A8 ;CHK MIDI AND #$01 ;DID WE GET MIDI DATA BEQ JOY0 ;NO - CONTINUE PROCESSING LDA $C0A9 ;YES- GET MIDI BYTE CMP #$F8 BCS MAINLOOP ;DON'T STORE REALTIME MSGS STA $C0A9 DFB $80 ;BRA DFB $ED ;CHKMIDI ; JOY0 LDX #$00 LDY #$00 LDA #$80 SEC BIT PTRIG JOY1 BIT XTOUT BPL JOY2 INX BNE JOY3 JOY2 NOP NOP JOY3 BIT YTOUT BPL JOY4 INY BNE JOY5 JOY4 NOP NOP JOY5 PHA LDA $C0A8 ;CHECK MIDI AND #$01 BEQ CONT1 LDA $C0A9 ;MIDI THRU CMP #$F8 BCS CONT2A STA $C0A9 CONT0 CLV BVC CONT2 CONT1 NOP NOP CONT2A NOP NOP NOP NOP CONT2 PLA SBC #$01 BCS JOY1 LDA XTABLE,X STA JOYX LDA YTABLE,Y STA JOYY ; CHKM1 LDA $C0A8 ;CHKMIDI AND #$01 ;DID WE GET MIDI DATA BEQ CHKPDL0C ;NO - CONTINUE PROCESSING LDA $C0A9 ;YES- GET MIDI BYTE CMP #$F8 BCS CHKM1 ;DON'T STORE REALTIME MSGS STA $C0A9 DFB $80 ;BRA DFB $ED ;CHKMIDI ; CHKPDL0C LDA JOYX CMP JOYXPREV ;DID PADDLE X CHANGE BEQ CHKM2 CMP JOYXPRV2 ;CHK PREVIOUS 2 VALUES OF PDLX BEQ CHKM2 LDY JOYXPREV STY JOYXPRV2 STA JOYXPREV ; LDY XUPDBYTE ;STORE PADDLE VALUE IN MESSAGE STA XMSG0,Y ; CHKM1A LDA $C0A8 ;CHKMIDI AND #$01 ;DID WE GET MIDI DATA BEQ SEND1 ;NO - CONTINUE PROCESSING LDA $C0A9 ;YES- GET MIDI BYTE CMP #$F8 BCS CHKM1A ;DON'T STORE REALTIME MSGS STA $C0A9 DFB $80 ;BRA DFB $ED ;CHKMIDI ; SEND1 LDA XMSG0 STA $C0A9 WT1 LDA $C0A8 AND #$02 BEQ WT1 LDA XMSG1 STA $C0A9 WT2 LDA $C0A8 AND #$02 BEQ WT2 LDA XMSG2 STA $C0A9 WT3 LDA $C0A8 AND #$02 BEQ WT3 ; CHKM2 LDA $C0A8 ;CHKMIDI AND #$01 ;DID WE GET MIDI DATA BEQ CHKPDL1C ;NO - CONTINUE PROCESSING LDA $C0A9 ;YES- GET MIDI BYTE CMP #$F8 BCS CHKM2 ;DON'T STORE REALTIME MSGS STA $C0A9 DFB $80 ;BRA DFB $ED ;CHKMIDI ; CHKPDL1C LDA JOYY CMP JOYYPREV ;DID PADDLE Y CHANGE BEQ JMPBACK CMP JOYYPRV2 ;CHK PREVIOUS 2 VALUES OF PDLY BEQ JMPBACK LDY JOYYPREV STY JOYYPRV2 STA JOYYPREV ; LDY YUPDBYTE ;STORE PADDLE VALUE IN MESSAGE STA YMSG0,Y ; LDA YMSG0 STA $C0A9 WAIT1 LDA $C0A8 AND #$02 BEQ WAIT1 LDA YMSG1 STA $C0A9 WAIT2 LDA $C0A8 AND #$02 BEQ WAIT2 LDA YMSG2 STA $C0A9 WAIT3 LDA $C0A8 AND #$02 BEQ WAIT3 ; JMPBACK LDA $C061 BMI PB0 LDA $C062 BMI PB1 LDA $C000 BMI KEY JMP MAINLOOP ; PB0 LDA #$01 STA PB0DOWN JSR ALLOFF WAITUP0 LDA $C061 BMI WAITUP0 JMP MAINLOOP ; PB1 LDA #$01 STA PB1DOWN JSR ALLOFF WAITUP1 LDA $C062 BMI WAITUP1 JMP MAINLOOP ; KEY STA KEYDOWN LDA $C010 RTS ; ALLOFF LDA ANOMSG0 STA $C0A9 WA1 LDA $C0A8 AND #$02 BEQ WA1 LDA ANOMSG1 STA $C0A9 WA2 LDA $C0A8 AND #$02 BEQ WA2 LDA ANOMSG2 STA $C0A9 WA3 LDA $C0A8 AND #$02 BEQ WA3 RTS ; XTABLE DFB 0,0,4,4,8,8,12,12,16,16,20,20,24,24,28,28 DFB 32,32,36,36,40,40,44,44,48,48,52,52,56,56,60,60 DFB 64,64,68,68,72,72,76,76,80,80,84,84,88,88,92,92 DFB 96,96,100,100,104,104,108,108,112,112,116,116,120 DFB 120,124,124,124,124,124,124,124,124,124,124 YTABLE DFB 124,124,120,120,116,116,112,112,108,108,104,104,100 DFB 100,96,96,92,92,88,88,84,84,80,80,76,76,72,72,68,68,64 DFB 64,60,60,56,56,52,52,48,48,44,44,40,40,36,36,32,32 DFB 28,28,24,24,20,20,16,16,12,12,8,8,4,4,0,0,0,0,0,0,0,0,0 ;