;MFF0DRVR.SC2
;
PHTEMPO1 CMP #TEMPO1
         BNE PHTEMPO2
         LDA INBYTE
         CMP #$03
         BNE STORMLEN
         LDA #TEMPO2
         STA PHASE
         RTS
PHTEMPO2 CMP #TEMPO2
         BNE PHTEMPO3
         LDA INBYTE
         STA TMPOHI
         LDA #TEMPO3
         STA PHASE
         RTS
PHTEMPO3 CMP #TEMPO3
         BNE PHTEMPO4
         LDA INBYTE
         STA TMPOMED
         LDA #TEMPO4
         STA PHASE
         RTS
PHTEMPO4 CMP #TEMPO4
         BNE PHKYSIG1
         LDA INBYTE
         STA TMPOLO
         LDA RESOLUTN
         STA RESHI
         LDA RESOLUTN+1
         STA RESLO
         LDA DOTMPOCG
         BEQ TMPODONE 
         JSR TEMPOCHG
         JSR METRONOM
         LDA NEWSPEED
         CLC
         ADC SPEEDINC
         BMI BADSPEED
         BEQ BADSPEED
         STA SPEED
         LDA PRNTSPED
         BEQ TMPODONE 
         LDA #$A0
         JSR COUT
         LDA SPEED
         JSR PRINTHEX
         LDA #$A0
         JSR COUT
TMPODONE JSR SPEEDDEC
         JSR METRPOKE
         LDA #DELTA0
         STA PHASE
         RTS
BADSPEED LDA NEWSPEED
         STA SPEED
         JSR SPEEDDEC
         JSR METRPOKE
         LDA #DELTA0
         STA PHASE
         RTS
PHKYSIG1 CMP #KEYSIG1
         BNE PHKYSIG2
         LDA #KEYSIG2
         STA PHASE
         RTS
PHKYSIG2 CMP #KEYSIG2
         BNE PHKYSIG3
         LDA INBYTE
         BEQ NOCHANGE        ;DON'T DO FOR C MAJOR/A MINOR
         AND #$80            ;SET UPPERCASE SHARPS ($00)
         ASL A
         ROL A
         STA DISPMODE        ;OR LOWERCASE FLATS ($01)
NOCHANGE LDA #KEYSIG3
         STA PHASE
         LDA #$00
         STA FLATKEY
         LDA INBYTE
         BPL STORSF
         INC FLATKEY
         EOR #$FF
         CLC
         ADC #$01
STORSF   STA KEYNUMSF
         RTS
;
BADPHASE JSR PRINTHEX
         BRK
PHKYSIG3 CMP #KEYSIG3
         BNE BADPHASE
         LDA #'M'
         STA KEYSIGP4
         LDA INBYTE
         BNE MINORKEY
         LDA FLATKEY
         BNE MAJFLAT
         LDA KEYNUMSF 
         ASL A
         TAX
         LDA MAJORSHP,X
         STA KEYSIGP2
         INX
         LDA MAJORSHP,X
         STA KEYSIGP3
         CLV
         BVC PRNTKYSG
MAJFLAT  LDA KEYNUMSF 
         ASL A
         TAX
         LDA MAJORFLT,X
         STA KEYSIGP2
         INX
         LDA MAJORFLT,X
         STA KEYSIGP3
         CLV
         BVC PRNTKYSG
MINORKEY LDA #'m'
         STA KEYSIGP4
         LDA FLATKEY
         BNE MINFLAT
         LDA KEYNUMSF 
         ASL A
         TAX
         LDA MINORSHP,X
         STA KEYSIGP2
         INX
         LDA MINORSHP,X
         STA KEYSIGP3
         CLV
         BVC PRNTKYSG
MINFLAT  LDA KEYNUMSF 
         ASL A
         TAX
         LDA MINORFLT,X
         STA KEYSIGP2
         INX
         LDA MINORFLT,X
         STA KEYSIGP3
         CLV
         BVC PRNTKYSG
PRNTKYSG LDY #16
         LDX #74
PRKYLP   LDA KEYSIGP1-70,X
         JSR POKE80
         DEX
         CPX #69
         BNE PRKYLP
         LDA #DELTA0
         STA PHASE
         RTS
;
FLATKEY  DFB $00
KEYNUMSF DFB $00
MAJORSHP ASC 'C G D A E B F#C#'
MAJORFLT ASC 'C F BbEbAbDbGbCb'
MINORSHP ASC 'A E B F#C#G#D#A#'
MINORFLT ASC 'A D G C F BbEbAb'
;
;--------
;MIDIPOKE - DISPLAYS NOTE ON/OFFS USING 1ST 16 LINES OF SCREEN 
;--------
; A = STATUS BYTE (9X OR 8X)
; X = 1ST DATA BYTE (NOTE NUMBER 00-7F)
; Y = 2ND DATA BYTE (VELOCITY 00-7F)
;--------
MIDIPOKE STA STSBYTE         ;SAVE INPUT DATA
         AND #$0F
         STA MIDICHNL        ;EXTRACT CHANNEL
         STX NOTENUM
         STY VELOCITY
         TXA                 ;CHECK IF NOTE IS IN RANGE OF DISPLAY
         CMP #24
         BCC MIDIEXIT
         CMP #104
         BCS MIDIEXIT
         SEC                 ;SUBTRACT 24 TO GET OFFSET IN CHARACTER TABLE
         SBC #24
         STA XCOORD         
         LDA STSBYTE
         AND #$F0
         CMP #$80
         BEQ NOTEOFF         ;CHECK IF NOTE OFF
         CMP #$90
         BEQ NOTEON
MIDIEXIT RTS
NOTEON   LDA VELOCITY
         BEQ NOTEOFF         ;IF 90 WITH VEL 0 IT IS A NOTEOFF
         LDX XCOORD          ;NEED TO PRESERVE X UNTIL POKENOTE
         LDA MASKDRUM        
         BMI NOTDRUM         ;MASKDRUM FF=DISPLAY AS NORMAL NOTES
         LDA MIDICHNL
         CMP #$09            ;CHECK IF THIS IS A DRUM NOTE
         BNE NOTDRUM         
         LDA MASKDRUM
         BEQ NOTEOFF         ;MASKDRUM 00=DON'T DISPLAY DRUM PART
         LDA #'*'
         STA DISPNOTE        ;MASKDRUM 01=PRINT * FOR DRUM PART
         CLV
         BVC POKENOTE
NOTDRUM  LDA DISPMODE        ;CHECK IF UPPER CASE SHARP/LOWER CASE FLAT
         BNE LCFMODE
         LDA UCSNOTES,X
         STA DISPNOTE
         CLV
         BVC POKENOTE
LCFMODE  LDA LCFNOTES,X
         STA DISPNOTE
POKENOTE LDY MIDICHNL        ;VERTICAL COORD
         LDA USEINVRS        ;PARM-WHETHER USER WANTS INVERSE DISPLAY
         BNE INVERT
         LDA DISPNOTE
         JMP POKE80
INVERT   LDA DISPNOTE
         AND #$7F            ;INVERT ALL KEYS
;         AND WHITEKEY,X      ;CREATE INVERSE IF IT IS A WHITE PIANO KEY
         JMP POKE80
NOTEOFF  LDA #' '
         STA DISPNOTE
         LDX XCOORD
         JMP POKENOTE
;
DISPNOTE DFB $00
STSBYTE  DFB $00
MIDICHNL DFB $00
NOTENUM  DFB $00
VELOCITY DFB $00
XCOORD   DFB $00
;
;                            UPPER CASE SHARPS: cCdDefFgGaAb
;
UCSNOTES DFB $E3,$83,$E4,$84,$E5,$E6,$86,$E7,$87,$E1,$81,$E2
         DFB $E3,$83,$E4,$84,$E5,$E6,$86,$E7,$87,$E1,$81,$E2
         DFB $E3,$83,$E4,$84,$E5,$E6,$86,$E7,$87,$E1,$81,$E2
         DFB $E3,$83,$E4,$84,$E5,$E6,$86,$E7,$87,$E1,$81,$E2
         DFB $E3,$83,$E4,$84,$E5,$E6,$86,$E7,$87,$E1,$81,$E2
         DFB $E3,$83,$E4,$84,$E5,$E6,$86,$E7,$87,$E1,$81,$E2
         DFB $E3,$83,$E4,$84,$E5,$E6,$86,$E7,$87,$E1,$81,$E2
;
;                            LOWER CASE FLATS:  CdDeEFgGaAbB
;
LCFNOTES DFB $83,$E4,$84,$E5,$85,$86,$E7,$87,$E1,$81,$E2,$82
         DFB $83,$E4,$84,$E5,$85,$86,$E7,$87,$E1,$81,$E2,$82
         DFB $83,$E4,$84,$E5,$85,$86,$E7,$87,$E1,$81,$E2,$82
         DFB $83,$E4,$84,$E5,$85,$86,$E7,$87,$E1,$81,$E2,$82
         DFB $83,$E4,$84,$E5,$85,$86,$E7,$87,$E1,$81,$E2,$82
         DFB $83,$E4,$84,$E5,$85,$86,$E7,$87,$E1,$81,$E2,$82
         DFB $83,$E4,$84,$E5,$85,$86,$E7,$87,$E1,$81,$E2,$82
;
;12/30/95:TOOK OUT TO SAVE SPACE
;        THE 7F IS ANDED WITH CHAR TO MAKE IT WHITE (INVERSE)
;
;WHITEKEY DFB $7F,$FF,$7F,$FF,$7F,$7F,$FF,$7F,$FF,$7F,$FF,$7F
;         DFB $7F,$FF,$7F,$FF,$7F,$7F,$FF,$7F,$FF,$7F,$FF,$7F
;         DFB $7F,$FF,$7F,$FF,$7F,$7F,$FF,$7F,$FF,$7F,$FF,$7F
;         DFB $7F,$FF,$7F,$FF,$7F,$7F,$FF,$7F,$FF,$7F,$FF,$7F
;         DFB $7F,$FF,$7F,$FF,$7F,$7F,$FF,$7F,$FF,$7F,$FF,$7F
;         DFB $7F,$FF,$7F,$FF,$7F,$7F,$FF,$7F,$FF,$7F,$FF,$7F
;         DFB $7F,$FF,$7F,$FF,$7F,$7F,$FF,$7F,$FF,$7F,$FF,$7F
;
         CHN MFF0DRVR.SC3
