diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..30b836e Binary files /dev/null and b/.DS_Store differ diff --git a/LEGACY/ANN0TEST.DSK b/LEGACY/ANN0TEST.DSK new file mode 100644 index 0000000..962f25e Binary files /dev/null and b/LEGACY/ANN0TEST.DSK differ diff --git a/LEGACY/MFF0DRVR.SC0.txt b/LEGACY/MFF0DRVR.SC0.txt new file mode 100644 index 0000000..c2dbf61 --- /dev/null +++ b/LEGACY/MFF0DRVR.SC0.txt @@ -0,0 +1,226 @@ +;MFF0DRVR.SC0 +; +;------------------- +;MAINLINE CODE +;------------------- +AUXSETUP LDA #>ENTRYPTS ;MOVE WHOLE PROGRAM TO AUX + STA SRCMAINL + STA TGTAUXL + LDA #EOF + STA ENDMAINL + LDA #PLAYSTRT ;MOVE PARM AREA TO AUX + STA SRCMAINL + STA TGTAUXL + LDA #AUXSETUP ;ALSO MOVE ALL DATA VARIABLES + STA ENDMAINL + LDA #AUXCODE ;TRANSFER TO AUX PROGRAM + STA XFERADRL + LDA #PLAYSTRT ;MOVE PARM AREA BACK TO MAIN + STA SRCMAINL + STA TGTAUXL + LDA #AUXSETUP + STA ENDMAINL + LDA #AUXRTN ;TRANSFER BACK TO MAIN PROGRAM + STA XFERADRL + LDA #LCF + BNE TESTTMPO + LDA DISPMODE + EOR #$01 + STA DISPMODE + RTS +TESTTMPO CMP #$54 ;'T'-TEMPO CHGS + BNE CHKDRUM + LDA DOTMPOCG + EOR #$01 + STA DOTMPOCG + RTS +CHKDRUM CMP #$44 ;'D'-MASK DRUMS + BNE CHKLEFT + DEC MASKDRUM + LDA MASKDRUM + CMP #$FE + BNE DRUMDONE + LDA #$01 + STA MASKDRUM +DRUMDONE RTS +CHKLEFT CMP #$08 + BNE CHKRIGHT + DEC SPEED + LDA SPEED + BMI LEFTBAD + BEQ LEFTBAD + DEC SPEEDINC + JSR SPEEDDEC + JSR METRPOKE + LDA PRNTSPED + BEQ LEFTDONE + LDA #$A0 + JSR COUT + LDA SPEED + JSR PRINTHEX + LDA #$A0 + JSR COUT +LEFTDONE RTS +LEFTBAD INC SPEED + RTS +CHKRIGHT CMP #$15 + BNE NOKEY + INC SPEED + LDA SPEED + BMI RIGHTBAD + BEQ RIGHTBAD + INC SPEEDINC + JSR SPEEDDEC + JSR METRPOKE + LDA PRNTSPED + BEQ NOKEY + LDA #$A0 + JSR COUT + LDA SPEED + JSR PRINTHEX + LDA #$A0 + JSR COUT +NOKEY RTS +RIGHTBAD DEC SPEED + RTS +; +;========= +; PRCSBYTE - MAY SET ENDOFTRK +;========= + CHN MFF0DRVR.SC1 diff --git a/LEGACY/MFF0DRVR.SC1.txt b/LEGACY/MFF0DRVR.SC1.txt new file mode 100644 index 0000000..0485c8b --- /dev/null +++ b/LEGACY/MFF0DRVR.SC1.txt @@ -0,0 +1,335 @@ +;MFF0DRVR.SC1 +;------- +PRCSBYTE LDA PHASE + CMP #DELTA0 + BNE PHDELT1 + LDA #$00 + STA DELTATIM + STA DELTATIM+1 + STA DELTATIM+2 + STA DELTATIM+3 + LDA INBYTE + STA DELTATIM + BEQ DELTAEQ0 ;GET DELTA TIME + BPL DELTA7F + LDA #DELTA1 ;IF >127 - MORE TO FETCH + STA PHASE + RTS +DELTAEQ0 LDA #GETINST ;IF 0 - WILL GET INSTRUCTION NEXT TIME + STA PHASE + RTS +DELTA7F JSR COUNT + LDA #GETINST ;IF <=127 - DELAY, THEN GET INSTRUCTION NEXT TIME + STA PHASE + RTS +; ;NEED TO CONVERT DELTA TIME BYTES TO COUNTER +COUNT LDA DELTATIM + STA DELTACTR + LDA #$00 + STA DELTACTR+1 + LDA DELTATIM+1 ;USE ONLY FIRST 2 BYTES OF DELTATIM + BEQ DOCOUNT + AND #$7F ;IF NON-ZERO HI BYTE, MOVE LO BIT + LSR A + STA DELTACTR+1 + BCC DOCOUNT + LDA DELTACTR + ORA #$80 ;TO HI BIT OF LO BYTE + STA DELTACTR +DOCOUNT DEC DELTACTR + LDA DELTACTR + CMP #$FF + BNE DECR1 + DEC DELTACTR+1 +DECR1 LDA DELTACTR+1 + CMP #$FF + BEQ DONECNT + LDA SPEED + JSR MONWAIT + CLV + BVC DOCOUNT +DONECNT RTS +; +PHDELT1 CMP #DELTA1 + BNE PHDELT2 + LDA DELTATIM + STA DELTATIM+1 + LDA INBYTE + STA DELTATIM + BPL DELT1A + LDA #DELTA2 + STA PHASE + RTS +DELT1A JSR COUNT + LDA #GETINST + STA PHASE + RTS +;------- +PHDELT2 CMP #DELTA2 + BNE PHDELT3 + LDA DELTATIM+1 + STA DELTATIM+2 + LDA DELTATIM + STA DELTATIM+1 + LDA INBYTE + STA DELTATIM + BPL DELT2A + LDA #DELTA3 + STA PHASE + RTS +DELT2A JSR COUNT + LDA #GETINST + STA PHASE + RTS +;------- +PHDELT3 CMP #DELTA3 + BNE PHINST + LDA DELTATIM+2 + STA DELTATIM+3 + LDA DELTATIM+1 + STA DELTATIM+2 + LDA DELTATIM + STA DELTATIM+1 + LDA INBYTE + STA DELTATIM + BPL DELT3A + LDA PLAYPTR+1 + JSR PRINTHEX + LDA PLAYPTR + JSR PRINTHEX + BRK +DELT3A JSR COUNT + LDA #GETINST + STA PHASE + RTS +;------- +PHINST CMP #GETINST + BEQ PHINST0 + JMP PHDATA3 +PHINST0 LDA PAUSEFLG ;12/8/95-STEP THRU EVENTS WITH ESC + BEQ PHINST1 + JSR WAITKEY +PHINST1 LDA INBYTE + BPL RUNNING +; + CMP #$F0 + BCS CHKF0 +; + STA LASTSTAT + STA XMITSTS + CMP #$E0 + BCS TWOBYTES + CMP #$C0 + BCC TWOBYTES +; + LDA #1 + STA DBYTES + LDA #DATA1 + STA PHASE + RTS +; +TWOBYTES LDA #2 + STA DBYTES + LDA #DATA2 + STA PHASE + RTS +; +CHKF0 BNE CHKF7 + LDA #SYSX0 + STA PHASE + LDA #$F0 + JSR XMITBYTE + RTS +; +XMITBYTE JSR XMITONE ;ANNUNCIATOR MIDI DRIVER + RTS +; +CHKF7 CMP #$F7 + BNE CHKFF + LDA #SYSX0 + STA PHASE + RTS +; +CHKFF CMP #$FF + BNE INVAL + LDA #META0 + STA PHASE + RTS +; +INVAL BRK +; +RUNNING LDA LASTSTAT + STA XMITSTS + LDA INBYTE + STA XMITBYT1 + LDA #$FF + STA XMITBYT2 + LDA DBYTES + CMP #1 + BEQ SENDMSG + LDA #DATA3 + STA PHASE + RTS +; +PHDATA3 CMP #DATA3 + BNE PHDATA2 + LDA INBYTE + STA XMITBYT2 + LDA #$FF + STA XMITBYT3 + JMP SENDMSG +; +PHDATA2 CMP #DATA2 + BNE PHDATA1 + LDA INBYTE + STA XMITBYT1 + LDA #DATA2B + STA PHASE + RTS +; +PHDATA1 CMP #DATA1 + BNE PHDATA2B + LDA INBYTE + STA XMITBYT1 + LDA #$FF + STA XMITBYT2 + JMP SENDMSG +; +PHDATA2B CMP #DATA2B + BNE PHSYSX + LDA INBYTE + STA XMITBYT2 + LDA #$FF + STA XMITBYT3 + JMP SENDMSG +; +SENDMSG LDX #$01 +SEND0 LDA XMITMSG,X + CMP #$FF + BEQ SEND2 + JSR XMITONE ;ANNUNCIATOR MIDI DRIVER + INX + BNE SEND0 +SEND2 LDA PIANOSCR ;ADDED 12/9/95-PIANO SCREEN OPTION + BEQ SENDEXIT + LDA XMITSTS + LDX XMITBYT1 + LDY XMITBYT2 + JSR MIDIPOKE +SENDEXIT LDA #DELTA0 + STA PHASE + RTS +; +PHSYSX CMP #SYSX0 + BNE PHSYSX1 + LDA INBYTE + STA SYSXLEN + BPL GOODSLEN + LDA PLAYPTR+1 + JSR PRINTHEX + LDA PLAYPTR + JSR PRINTHEX + BRK ;SYSX OVER 127 BYTES NOT SUPPORTED +GOODSLEN LDA #SYSX1 + STA PHASE + RTS +PHSYSX1 CMP #SYSX1 + BNE PHMETA0 + LDA INBYTE + JSR XMITBYTE + DEC SYSXLEN + LDA SYSXLEN + BNE MORESYSX + LDA #DELTA0 + STA PHASE +MORESYSX RTS +;-------- +PHMETA0 CMP #META0 + BNE PHMETA1 +; + LDA #$00 + STA TEXTEVT + LDA INBYTE + CMP #$2F + BNE CHKTEXT + LDA #$01 + STA ENDOFTRK + RTS +; +CHKTEXT CMP #$0F + BCS CHKTMPO + LDA #$01 + STA TEXTEVT + LDA #META1 + STA PHASE + RTS +; +CHKTMPO CMP #$51 + BNE CHKKYSG + LDA #TEMPO1 + STA PHASE + RTS +; +CHKKYSG CMP #$59 + BNE OTHER + LDA #KEYSIG1 + STA PHASE + RTS +; +OTHER LDA #META1 + STA PHASE + RTS +; +PHMETA1 CMP #META1 + BNE PHMETA2 +STORMLEN LDA INBYTE + STA METALEN + BPL GOODMLEN + LDA PLAYPTR+1 + JSR PRINTHEX + LDA PLAYPTR+2 + JSR PRINTHEX + BRK ;META OVER 127 BYTES NOT SUPPORTED +GOODMLEN LDA #META2 + STA PHASE + RTS +PHMETA2 CMP #META2 + BNE PHTEMPO1 + LDA TEXTEVT + BEQ NOTTEXT + LDA LYRICS + BEQ NOTTEXT ;BYPASS IF USER DOESNT WANT LYRICS + LDA INBYTE + CMP #$0D + BEQ PRCSCR +NOTUC ORA #$80 ;DISPLAY IN NORMAL TEXT + JSR COUT +NOTTEXT DEC METALEN + LDA METALEN + BNE MOREMETA + LDA #DELTA0 + STA PHASE +MOREMETA RTS +; +PRCSCR ORA #$80 ;PRINT CR + JSR COUT + LDA KARALOOK + BEQ NOKARA + JSR KARASCAN ;KARAOKE LOGIC TO SCAN AHEAD ONE LINE & PRINT LINE 24 +NOKARA JMP NOTTEXT +; +PRINTHEX PHA ;CLONE OF $FDDA BUT USING $FDF0 OUTPUT + LSR A + LSR A + LSR A + LSR A + JSR PRNTHEX1 + PLA + AND #$0F +PRNTHEX1 ORA #$B0 + CMP #$BA + BCC PRNTHEX2 + ADC #$06 +PRNTHEX2 JMP COUT +; + CHN MFF0DRVR.SC2 diff --git a/LEGACY/MFF0DRVR.SC2.txt b/LEGACY/MFF0DRVR.SC2.txt new file mode 100644 index 0000000..8958fda --- /dev/null +++ b/LEGACY/MFF0DRVR.SC2.txt @@ -0,0 +1,262 @@ +;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 diff --git a/LEGACY/MFF0DRVR.SC3.txt b/LEGACY/MFF0DRVR.SC3.txt new file mode 100644 index 0000000..263b7f2 --- /dev/null +++ b/LEGACY/MFF0DRVR.SC3.txt @@ -0,0 +1,79 @@ +;*** POKE80 +;*** STORES ANY BYTE DIRECTLY ON 80 COLUMN SCREEN +;*** USING PROTOCOL DESCRIBED IN "INSIDE THE APPLE //E" +;-------- +; POKE80 +;-------- +; A = CHARACTER TO POKE ON SCREEN +; X = X COORDINATE (0-79) +; Y = Y COORDINATE (0-23) +;-------- +POKE80 CPX #80 ;VALIDATE X,Y COORDINATES + BCC POKE80A + CPY #24 + BCC POKE80A + RTS +POKE80A PHP ;SAVE INTERRUPT STATUS + PHA ;SAVE USER'S DATA BYTE + STA SAVEA + STX SAVEX + STY SAVEY + SEI ;DISABLE INTERRUPTS + LDA $C018 + STA STAT80ST ;SAVE STATUS OF 80STORE AND PAGE2 FLAGS + LDA $C01C + STA STATPAG2 + STA $C001 ;TURN 80STORE ON TO USE PAGE2 TO SWITCH MAIN->AUX + LDA $28 + STA SAVEBASL ;SAVE CURRENT SCREEN BASE ADDRESS + LDA $29 + STA SAVEBASH + TYA ;MULTIPLY Y BY 2 FOR LOOKUP IN BASE TABLE + ASL A + TAY + LDA BASTABLE,Y ;GET LINE ADDRESS AND STORE IT IN ZP VECTOR + STA $28 + INY + LDA BASTABLE,Y + STA $29 + TXA ;DIVIDE X BY 2 TO GET OFFSET FROM LINE BASE + LSR A + TAY ;PUT IT IN Y FOR THE INDIRECT ADDRESSING LATER + BCC EVENCOL ;CHECK CARRY TO DETERMINE IF X WAS ODD OR EVEN + STA $C054 ;ODD - TURN PAGE 2 OFF + BCS STORBYTE +EVENCOL STA $C055 ;EVEN - TURN PAGE 2 ON +STORBYTE PLA + STA ($28),Y ;POKE THE CHARACTER ON THE SCREEN + LDA STAT80ST + BPL OFF80ST + STA $C001 ;80STOREON + BMI RSTRPAG2 +OFF80ST STA $C000 ;80STOREOFF +RSTRPAG2 LDA STATPAG2 + BPL OFFPAG2 + STA $C055 ;PAGE2ON + BMI RSTRBASE +OFFPAG2 STA $C054 ;PAGE2OFF +RSTRBASE LDA SAVEBASL ;RESTORE ZP BASE VECTOR + STA $28 + LDA SAVEBASH + STA $29 + LDX SAVEX + LDY SAVEY + LDA SAVEA + PLP ;RESTORE INTERRUPT STATUS + RTS +; +STAT80ST DFB $00 +STATPAG2 DFB $00 +SAVEBASL DFB $00 +SAVEBASH DFB $00 +SAVEA DFB $00 +SAVEX DFB $00 +SAVEY DFB $00 +BASTABLE DFB $00,$04,$80,$04,$00,$05,$80,$05,$00,$06,$80,$06,$00,$07,$80,$07 + DFB $28,$04,$A8,$04,$28,$05,$A8,$05,$28,$06,$A8,$06,$28,$07,$A8,$07 + DFB $50,$04,$D0,$04,$50,$05,$D0,$05,$50,$06,$D0,$06,$50,$07,$D0,$07 +; + CHN MFF0DRVR.SC4 diff --git a/LEGACY/MFF0DRVR.SC4.txt b/LEGACY/MFF0DRVR.SC4.txt new file mode 100644 index 0000000..03bd5de --- /dev/null +++ b/LEGACY/MFF0DRVR.SC4.txt @@ -0,0 +1,93 @@ +;------------ +;MFF0DRVR.SC4 - KARAOKE SCAN AHEAD LOGIC +;------------ +; THIS LOGIC IS CALLED WHENEVER A CARRIAGE RETURN ($0D) IS FOUND. +; IT WILL SCAN AHEAD IN THE BUFFER TO FIND THE NEXT CARRIAGE RETURN +; BY LOOKING FOR TEXT META EVENTS. IT WILL PRINT UP TO 79 CHARACTERS. +; IT WILL EXIT WHEN EITHER A NEW CARRIAGE RETURN IS FOUND, 79 CHARACTERS +; HAVE BEEN PRINTED, THE END OF TRACK MARKER (FF 2F) IS FOUND, OR THE +; POINTER REACHES THE END OF THE CURRENT BUFFER. +; +MYPTR EQU $08 +MYXCOORD DFB $00 +MYENDFLG DFB $00 +MYBYTE DFB $00 +MYLENGTH DFB $00 +MYSTOP DFB $00 +; +KARASCAN LDA PLAYPTR ;SET OUR POINTER TO CURRENT POSITION + STA MYPTR + LDA PLAYPTR+1 + STA MYPTR+1 + LDA #$00 + STA MYXCOORD + STA MYENDFLG + LDA PLAYSTOP+1 + STA MYSTOP +KARALOOP LDY #$00 + LDA (MYPTR),Y + CMP #$FF + BEQ FOUNDFF +KARALOO1 JSR INCMYPT + LDA MYENDFLG + BEQ KARALOOP +KARADONE LDA #$8D ;PRINT CR + JSR COUT + RTS +; +FOUNDFF JSR INCMYPT + LDA MYENDFLG + BNE KARADONE + LDA MYBYTE + CMP #$2F + BEQ KARADONE + CMP #$10 + BCS KARALOO1 ;NOT TEXT EVENT + JSR INCMYPT + LDA MYENDFLG + BNE KARADONE + LDA MYBYTE + BMI KARALOO1 ;DON'T SUPPORT META > 127 CHARS-LOOK FOR MORE + BEQ KARALOO1 ;TEXT LEN OF 0 + STA MYLENGTH +PRLOOP JSR INCMYPT + LDA MYENDFLG + BNE KARADONE + JSR PRINT24 ;PRINT THE CHAR + LDA MYENDFLG + BNE KARADONE + DEC MYLENGTH + LDA MYLENGTH + BNE PRLOOP + BEQ KARALOO1 +; +INCMYPT INC MYPTR + BNE INCMYP2 + INC MYPTR+1 + LDA MYPTR+1 + CMP MYSTOP + BCC INCMYP2 + INC MYENDFLG + RTS +INCMYP2 LDY #$00 + LDA (MYPTR),Y + STA MYBYTE + RTS +; +PRINT24 LDY #23 + LDX MYXCOORD + LDA MYBYTE + CMP #$0D + BEQ SETEND + CMP #$20 ;DON'T PRINT CONTROL CHARS + BCC PRINT24A + ORA #$80 + JSR COUT + INX + STX MYXCOORD + CPX #79 + BNE PRINT24A +SETEND INC MYENDFLG +PRINT24A RTS +; + CHN MFF0DRVR.SC5 diff --git a/LEGACY/MFF0DRVR.SC5.txt b/LEGACY/MFF0DRVR.SC5.txt new file mode 100644 index 0000000..5d4eca6 --- /dev/null +++ b/LEGACY/MFF0DRVR.SC5.txt @@ -0,0 +1,157 @@ +; TEMPOCHG.SRC +; +; THIS SUBROUTINE IS USED TO CALCULATE THE SPEED VALUE TO BE USED WHEN +; A TEMPO CHANGE META EVENT IS FOUND. +; INPUT: +; RESOLUTION (2 BYTES) = LAST 2 BYTES OF MIDI FILE HEADER +; NEWTEMPO (3 BYTES) = VALUES FROM THE FF 51 03 META EVENT +; OUTPUT: +; NEWSPEED (1 BYTE) = NEW SPEED VALUE. YOUR PROGRAM MAY WANT TO +; ADJUST THIS BASED ON USER'S PREFERENCES. +; +TEMPOCHG JSR TMPOSTRT + JMP LOOKUP +DIVISION JMP DIVIDE +; +; PUBLIC VARIABLES +RESHI DFB $00 +RESLO DFB $00 +TMPOHI DFB $00 +TMPOMED DFB $00 +TMPOLO DFB $00 +NEWSPEED DFB $00 +; +; PRIVATE VARIABLES +DIVIDEND DFB $00,$00,$00,$00 +DIVISOR DFB $00,$00 +QUOTIENT DFB $00,$00,$00,$00 +REMAINDR DFB $00,$00 +TEMPDIV DFB $00,$00,$00 +TEMPDSR DFB $00,$00 +; +TMPOSTRT LDA #$00 + STA DIVIDEND + LDA TMPOHI + STA DIVIDEND+1 + LDA TMPOMED + STA DIVIDEND+2 + LDA TMPOLO + STA DIVIDEND+3 + LDA RESHI + STA DIVISOR + LDA RESLO + STA DIVISOR+1 +; +DIVIDE CLD + LDA #$00 + STA QUOTIENT + STA QUOTIENT+1 + STA QUOTIENT+2 + STA QUOTIENT+3 + STA REMAINDR + STA REMAINDR+1 + STA TEMPDIV + STA TEMPDIV+1 + STA TEMPDIV+2 + LDA DIVISOR + STA TEMPDSR + LDA DIVISOR+1 + STA TEMPDSR+1 + LDA TEMPDSR + BNE NODIV0 + LDA TEMPDSR+1 + BNE NODIV0 + BRK +; +NODIV0 LDY #32 ;DIVIDEND WILL BE SHIFTED 32 TIMES +DIVLOOP ASL DIVIDEND+3 + ROL DIVIDEND+2 + ROL DIVIDEND+1 + ROL DIVIDEND ;MOVE 1 BIT TO TEMPORARY DIVIDEND + ROL TEMPDIV+2 + ROL TEMPDIV+1 + ROL TEMPDIV ;NOW CHECK IF TEMPDSR < TEMPDIV + LDA TEMPDIV + BNE NOTLESS + LDA TEMPDIV+1 + CMP TEMPDSR + BCC LESS + BNE NOTLESS + LDA TEMPDIV+2 + CMP TEMPDSR+1 + BCS NOTLESS +LESS CLC ;STORE A 0 IN THE QUOTIENT + ROL QUOTIENT+3 + ROL QUOTIENT+2 + ROL QUOTIENT+1 + ROL QUOTIENT + CLV + BVC NEXTBIT +NOTLESS SEC ;SUBTRACT TEMPDSR FROM TEMPDIV + LDA TEMPDIV+2 + SBC TEMPDSR+1 + STA TEMPDIV+2 + LDA TEMPDIV+1 + SBC TEMPDSR + STA TEMPDIV+1 + LDA TEMPDIV + SBC #$00 + STA TEMPDIV + SEC ;AND STORE A 1 IN THE QUOTIENT + ROL QUOTIENT+3 + ROL QUOTIENT+2 + ROL QUOTIENT+1 + ROL QUOTIENT +NEXTBIT DEY + BNE DIVLOOP ;WHEN DONE, QUOTIENT HAS RESULT, TDIV HAS RMDR + LDA TEMPDIV+1 + STA REMAINDR + LDA TEMPDIV+2 + STA REMAINDR+1 + RTS +; +LOOKUP LDY #2 ;LOOKUP QUOTIENT IN TEMPO TABLE-STARTING WITH 2 +; ;BECAUSE IF LESS THAN VALUE OF 2 SHOULD USE 1 + LDA QUOTIENT + BEQ Q3BYT +QBIG LDY #127 + CLV + BVC STORSPED +Q3BYT LDA QUOTIENT+1 + BNE QBIG +; ;WE HAVE A 2 BYTE QUOTIENT TO LOOK UP +Q2LOOP LDA QUOTIENT+2 + CMP TEMPOHI,Y + BCC FOUNDSP + BNE NEXTSPED + LDA QUOTIENT+3 + CMP TEMPOLO,Y + BCC FOUNDSP +NEXTSPED INY + CPY #128 + BCC Q2LOOP +FOUNDSP DEY +STORSPED STY NEWSPEED + RTS +; +; THE FOLLOWING DATA WAS CREATED BY BASIC PROGRAM "TEMPOCALC" +; IT REPRESENTS THE EVALUATION OF FUNCTION .4889*(26+27*A+5*A*A) FROM 0-127 +; +TEMPOHI DFB 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2 + DFB 3,3,4,4,4,5,5,6,6,7,7,8,8,9,10,10 + DFB 11,12,12,13,14,15,15,16,17,18,19,19,20,21,22,23 + DFB 24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,41 + DFB 42,43,45,46,47,49,50,51,53,54,56,57,59,60,62,63 + DFB 65,66,68,70,71,73,75,76,78,80,82,83,85,87,89,91 + DFB 93,94,96,98,100,102,104,106,108,110,112,114,116,119,121,123 + DFB 125,127,130,132,134,136,139,141,143,146,148,150,153,155,158,160 +TEMPOLO DFB 12,28,48,74,104,139,179,224,18,73,133,197,11,85,164,248 + DFB 81,175,18,121,230,87,206,73,201,78,216,103,250,147,48,211 + DFB 122,38,215,141,71,7,204,149,99,55,15,236,206,180,160,145 + DFB 134,128,127,132,141,154,173,197,225,3,41,84,132,185,243,50 + DFB 118,190,12,94,181,17,114,216,67,179,39,161,31,162,42,183 + DFB 73,224,123,28,193,108,27,207,136,70,9,208,157,110,69,32 + DFB 0,229,207,190,177,170,167,170,177,189,206,228,254,30,67,108 + DFB 154,206,6,67,133,203,23,104,189,23,119,219,68,178,36,156 +; + CHN MFF0DRVR.SC6 diff --git a/LEGACY/MFF0DRVR.SC6.txt b/LEGACY/MFF0DRVR.SC6.txt new file mode 100644 index 0000000..c931fad --- /dev/null +++ b/LEGACY/MFF0DRVR.SC6.txt @@ -0,0 +1,98 @@ +; MFF0DRVR.SC6 +; +; CALL THIS IMMEDIATELY AFTER CALLING TEMPOCHG +; +METRONOM LDA #$03 ;DIVIDEND=60MEG SECONDS + STA DIVIDEND + LDA #$20 + STA DIVIDEND+1 + LDA #$00 + STA DIVIDEND+2 + STA DIVIDEND+3 + LDA QUOTIENT+2 ;DIVISOR = PREVIOUS QUOTIENT + STA DIVISOR + LDA QUOTIENT+3 + STA DIVISOR+1 + JSR DIVISION + LDA QUOTIENT ;DIVIDEND=PREV QUOTIENT + STA DIVIDEND + LDA QUOTIENT+1 + STA DIVIDEND+1 + LDA QUOTIENT+2 + STA DIVIDEND+2 + LDA QUOTIENT+3 + STA DIVIDEND+3 + LDA RESHI ;DIVISOR=RESOLUTION + STA DIVISOR + LDA RESLO + STA DIVISOR+1 + JSR DIVISION + LDA QUOTIENT+3 + STA $50 + LDA QUOTIENT+2 + STA $51 + JSR HEXDEC + LDA DEC3 + STA METRTMP1 + LDA DEC4 + STA METRTMP2 + LDA DEC5 + STA METRTMP3 + RTS +SPEEDDEC LDA SPEED + STA $50 + LDA #$00 + STA $51 + JSR HEXDEC + LDA DEC3 + STA METRSPD1 + LDA DEC4 + STA METRSPD2 + LDA DEC5 + STA METRSPD3 + RTS +METRPOKE LDY #23 + LDX #0 +METRPLOO LDA METRDISP,X + JSR POKE80 + INX + CPX #11 + BCC METRPLOO + RTS +;======================================================== +; CONVERTS HEX IN ($50,$51) TO DECIMAL +; FROM APPLE PROGRAMMERS HANDBOOK P. 225 +;======================================================== +HEXDEC LDA #$0A + STA $53 + LDY #$04 +HEXDEC0 LDX #$10 + LDA #$00 + STA $52 + CLC +HEXDEC1 ROL $50 + ROL $51 + ROL $52 + DEX + BMI HEXDEC2 + LDA $52 + SEC + SBC $53 + BCC HEXDEC1 + STA $52 + BCS HEXDEC1 +HEXDEC2 CLC + ROR $52 + LDA $52 + ORA #$B0 + STA DEC1,Y + DEY + BPL HEXDEC0 + RTS +DEC1 DFB $B0 +DEC2 DFB $B0 +DEC3 DFB $B0 +DEC4 DFB $B0 +DEC5 DFB $B0 +; + CHN MFF0DRVR.SC7 diff --git a/LEGACY/MFF0DRVR.SC7.txt b/LEGACY/MFF0DRVR.SC7.txt new file mode 100644 index 0000000..600d4c0 --- /dev/null +++ b/LEGACY/MFF0DRVR.SC7.txt @@ -0,0 +1,128 @@ +;------------------------------------------------------------------------- +; APPLE MIDI DRIVER THROUGH ANNUNCIATOR 0 +; COPYRIGHT 1998, ERIC RANGELL +;------------------------------------------------------------------------- +; THIS DRIVER IMPLEMENTS ASYNCHRONOUS SERIAL DATA TRANSMISSION +; THROUGH THE APPLE ANNUNCIATOR 0 OUTPUT PORT OF THE GAME CONNECTOR +; USING 32 CYCLES PER BIT TO ACHIEVE A 31.25K MIDI BAUD RATE. +; +; THE OUTPUT IS INITIALIZED TO A HIGH LOGIC VOLTAGE. WHEN IT GOES +; LOW FOR 32 MICROSECONDS, THAT INDICATES THE START BIT OF A MIDI BYTE. +; THEN 8 BYTES OF DATA ARE TRANSMITTED, FOLLOWED BY A HIGH STOP BIT. +; THE DATA BYTES REPRESENT MIDI MESSAGES WHICH CAN BE INTERPRETED BY +; ANY MUSICAL INSTRUMENT THAT IMPLEMENTS MIDI. +; +;------------------------------------------------------------------------- +; +AN0OFF EQU $C058 ;APPLE ADDRESSES THAT CONTROL ANNUNCIATOR OUTPUTS +AN0ON EQU $C059 +AN1OFF EQU $C05A +AN1ON EQU $C05B +AN2OFF EQU $C05C +AN2ON EQU $C05D +AN3OFF EQU $C05E +AN3ON EQU $C05F +; +TEMPA DFB $00 +TEMPX DFB $00 +;--------------------------------------------------------------------------- +XMITONE STA TEMPA ;SAVE A AND X REGISTERS + STX TEMPX +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT7+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT6+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT5+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT4+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT3+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT2+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT1+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT0+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + JSR XMITBITS ;SEND THE BYTE OUT + LDX TEMPX + LDA TEMPA ;RESTORE X AND A + RTS +;----------------------------------------------------------------------- +XMITBITS BIT AN0OFF ;4 CYCLES - TRANSMIT START BIT - ALWAYS LOW + JSR DELAY22 ;6+22 +BIT0 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT1 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT2 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT3 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT4 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT5 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT6 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT7 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 + BIT AN0ON ;4 ;TRANSMIT STOP BIT - ALWAYS HIGH + JSR DELAY22 ;6+22 + RTS +;----------------------------------------------------------------------- +DELAY22 NOP ;WAIT 22 CYCLES + NOP + NOP + NOP + NOP + NOP + NOP + NOP + RTS +;---------------- +; END OF PROGRAM +;---------------- +;================================================== +EOF BRK diff --git a/LEGACY/MFF0DRVR.SRC.txt b/LEGACY/MFF0DRVR.SRC.txt new file mode 100644 index 0000000..1f022a7 --- /dev/null +++ b/LEGACY/MFF0DRVR.SRC.txt @@ -0,0 +1,112 @@ +; +; MFF0 PLAYER - PLAYS A SPECIFIC AREA OF AUX OR MAIN MEMORY +; +; + ORG $0800 +; +ENTRYPTS JMP AUXSETUP ;COPY CODE TO AUX MEM + JMP PLAYMAIN ;PLAY FROM MAIN MEMORY + JMP PLAYAUX ;PLAY FROM AUX MEMORY + JMP DOAUXMV ;FOR USER - TO DO AUXMOVE + JMP DOXFER ;FOR USER - TO XFER +;---------------- +; PARAMETERS +;---------------- +PLAYSTRT DW $2000 ;STARTING ADDRESS OF PLAYBACK - SET BY CALLER +PLAYSTOP DW $7800 ;ENDING ADDRESS OF PLAYBACK+1 - SET BY CALLER +PHASE DFB $00 ;CURRENT PHASE OF PROCESSING +ENDOFTRK DFB $00 ;SIGNALS THAT END OF TRACK (00 FF 2F 00) REACHED +;---------------- +; USER PARAMETERS FOR AUXMOVE +;---------------- +SRCMAINL DFB $00 +SRCMAINH DFB $00 +ENDMAINL DFB $00 +ENDMAINH DFB $00 +TGTAUXL DFB $00 +TGTAUXH DFB $00 +TOAUX DFB $00 +;---------------- +; USER PARAMETERS FOR TRANSFER +;---------------- +XFERADRL DFB $00 +XFERADRH DFB $00 +XFTOAUX DFB $00 +USEAUXZP DFB $00 +;-------- +LYRICS DFB $01 ;PRINT LYRICS +PRNTSPED DFB $00 ;PRINT SPEED +PIANOSCR DFB $01 ;PIANO DISPLAY ON +DISPMODE DFB $01 ; 00 = UPPERCASE SHARPS, NONZERO = LOWERCASE FLATS +MASKDRUM DFB $01 ; DISPLAY CHANNEL 9 (DRUMS) WITH * +USEINVRS DFB $00 ; WHETHER TO USE INVERSE LETTERS - FOR PIANO DISPLAY +KARALOOK DFB $00 ; WHETHER TO USE KARAOKE LOOKAHEAD +RESOLUTN DFB $00,$F0 ; RESOLUTION FROM MIDI HEADER -USED FOR TEMPO CHGS +SPEEDINC DFB $00 ; USER'S AMOUNT TO ADD OR SUBTRACT FROM SPEED +DOTMPOCG DFB $01 ; PROCESS TEMPO CHANGES +METRDISP ASC 'MM' ;METRONOME DISPLAY +METRTMP1 ASC '1' +METRTMP2 ASC '2' +METRTMP3 ASC '0' +METRFILL ASC ' SP' +METRSPD1 ASC '0' +METRSPD2 ASC '2' +METRSPD3 ASC '7' +KEYSIGP1 ASC '(' +KEYSIGP2 ASC 'C' +KEYSIGP3 ASC ' ' +KEYSIGP4 ASC 'M' +KEYSIGP5 ASC ')' +;------------------- +; INTERNAL VARIABLES +;------------------- +INBYTE DFB $00 ;VALUE OF CURRENT BYTE +PAUSEFLG DFB $00 +DELTATIM DFB $00,$00,$00,$00 +DELTACTR DFB $00,$00 +LASTSTAT DFB $00 +DBYTES DFB $00 +XMITMSG ASC 'X' +XMITSTS DFB $00 +XMITBYT1 DFB $00 +XMITBYT2 DFB $00 +XMITBYT3 DFB $00 +SYSXLEN DFB $00 +TEXTEVT DFB $00 +METALEN DFB $00 +;--------------------- +PLAYPTR EQU $06 ;POINTER TO CURRENT BYTE BEING READ +SPEED EQU $FF ;SPEED OF PLAYBACK - USED IN $FCA8 WAIT ROUTINE +; +COUT EQU $FDF0 ;USE MONITOR OUTPUT ROUTINE BECAUSE MAY PRINT FROM AUX MEM +MONWAIT EQU $FCA8 ;MONITOR DELAY ROUTINE +AUXMOVE EQU $C311 ;AUX MEM MOVE +AUXXFER EQU $C314 ;AUX MEM TRANSFER CONTROL +MONRTS EQU $FF58 ;ADDRESS OF RTS INSTRUCTION USED TO SET OVERFLOW FLAG +;------------ +; PROGRAM PHASE NAMES: +;------------ +DELTA0 EQU $00 +DELTA1 EQU $01 +DELTA2 EQU $02 +DELTA3 EQU $03 +GETINST EQU $04 +DATA1 EQU $05 +DATA2 EQU $06 +DATA2B EQU $07 +DATA3 EQU $08 +SYSX0 EQU $09 +SYSX1 EQU $0A +SYSX2 EQU $0B +META0 EQU $10 +META1 EQU $11 +META2 EQU $12 +TEMPO1 EQU $13 +TEMPO2 EQU $14 +TEMPO3 EQU $15 +TEMPO4 EQU $16 +KEYSIG1 EQU $17 +KEYSIG2 EQU $18 +KEYSIG3 EQU $19 +;------------------- + CHN MFF0DRVR.SC0 diff --git a/LEGACY/MFF0PLAY.SRC.txt b/LEGACY/MFF0PLAY.SRC.txt new file mode 100644 index 0000000..0d69061 --- /dev/null +++ b/LEGACY/MFF0PLAY.SRC.txt @@ -0,0 +1,325 @@ +; MFF0 PLAYER - ALSO DISPLAYS MIDI KARAOKE LYRICS +; +; T0 CONTAINS THE MIDI FILE DATA STRIPPED OF HEADER +;-------------- +; MEMORY USAGE +;-------------- +AUXMOVE EQU $C311 +A1L EQU $3C ;AUXMOVE SOURCE START +A1H EQU $3D +A2L EQU $3E ;AUXMOVE SOURCE END +A2H EQU $3F +A4L EQU $42 ;AUXMOVE DESTINATION +A4H EQU $43 +; +MAINBUFR EQU $2000 ; MAIN BUFFER +MAINEND EQU $757F +MAINLEN EQU $5580 +AUX1BUFR EQU $1500 ; AUX1 BUFFER +AUX1END EQU $6A7F +AUX1LEN EQU $5580 +AUX2BUFR EQU $6A80 ; AUX2 BUFFER +AUX2END EQU $BFFF +AUX2LEN EQU $5580 +MTHDLEN EQU $0016 ; MFF0 HEADER LENGTH (22 BYTES) +;-------- +; LINKAGE AREA TO MFF0DRVR.OBJ +;-------- +DRVRSTRT EQU $80F +DRVREND EQU $811 +DRVREOT EQU $814 +DRVRINIT EQU $800 +DRVRMAIN EQU $803 +DRVRAUX EQU $806 +;-------- + ORG $75FD ; MLI BUFFER + JMP MAINLINE ; PROGRAM +FILEBUFR DS $400 ;MLI FILE BUFFER FOR OPEN FILE +EOFFLAG DFB $00 ;LOADMAIN WILL SET THIS TO 1 WHEN EOF REACHED +USERSTOP DFB $00 ;DETECTS IF STOPPED BEFORE END OF SEQUENCE +DEBUG DFB $00 ;DEBUG MODE - PRINTS LOAD & PLAY RESULTS +PATHNAME DFB 62 ;USER POKES LENGTH IN HERE ($7903) + ASC '/ ' ;USER POKES PATHNAME IN HERE, ENDING IN $00 + ASC ' ' + ASC ' ' + ASC ' ' + ASC ' ' + ASC ' ' + ASC ' ' + DFB $00 +; +; +;ALGORITHM: +;========== +;WHILE NOT EOF +; LOAD MAIN, +; IF EOF +; MODE=PLAYMAIN +; ELSE +; TRANSFER MAIN TO AUX1 +; LOAD MAIN, +; IF EOF +; MODE=AUX1MAIN +; ELSE +; TRANSFER MAIN TO AUX2 +; LOAD MAIN +; MODE=AUX1AUX2MAIN +; +;MODE PLAYMAIN +; PLAY MAIN +; +;MODE AUX1MAIN +; PLAY AUX1 +; PLAY MAIN +; +;MODE AUX1AUX2MAIN +; PLAY AUX1 +; PLAY AUX2 +; PLAY MAIN +; +;======== +;MAINLINE +;======== +MAINLINE JSR MIDIINIT + JSR DRVRINIT + JSR OPENFILE + JSR READHEAD +PLAYLOOP JSR LOADMAIN + LDA EOFFLAG + BNE MAINONLY +; + JSR XFERAUX1 + JSR LOADMAIN + LDA EOFFLAG + BNE AUX1MAIN +; + JSR XFERAUX2 + JSR LOADMAIN + JSR A1A2MAIN + LDA EOFFLAG + BEQ PLAYLOOP + JMP EXITPGM +;======= +MIDIINIT BIT $C059 ;AN0ON + LDA #$00 + STA USERSTOP + STA $C001 ; 80STOREON + STA $C056 ; HIRES OFF + STA $C054 ; TEXT PAGE IN MAIN RAM + RTS +;------- +MAINONLY JSR PLAYMAIN + JMP EXITPGM +;------- +AUX1MAIN JSR PLAYAUX1 + JSR PLAYMAIN + JMP EXITPGM +;------- +A1A2MAIN JSR PLAYAUX1 + JSR PLAYAUX2 + JSR PLAYMAIN + RTS +;------- +EXITPGM JSR CLOSEFIL + RTS +;------------------- +;==END OF MAINLINE== +;------------------- +;-------- +;OPENFILE +;-------- +MLI EQU $BF00 +OPENCMD EQU $C8 +READCMD EQU $CA +CLOSECMD EQU $CC +PRINTERR EQU $FDDA +; +OPENPARM DFB $03 + DW PATHNAME + DW FILEBUFR +OPENREF DFB $00 +; +RHEADPRM DFB $04 +RHEADREF DFB $00 +HDATADRS DW MAINBUFR +HREQLEN DW MTHDLEN +HACTLEN DW $0000 +; +READPARM DFB $04 +READREF DFB $00 +DATAADRS DW MAINBUFR +REQLEN DW MAINLEN +ACTLEN DW $0000 +; +CLOSEPRM DFB $01 +CLOSEREF DFB $00 +; +OPENFILE JSR MLI + DFB OPENCMD + DW OPENPARM + BCS MLIERROR + LDA OPENREF + STA READREF + STA RHEADREF + STA CLOSEREF + RTS +; +MLIERROR JSR PRINTERR + BRK +;-------- +CLOSEFIL JSR MLI + DFB CLOSECMD + DW CLOSEPRM + BCS MLIERROR + RTS +;-------- +LOADMAIN LDA USERSTOP + BEQ LOADMAI1 + RTS +LOADMAI1 JSR MLI + DFB READCMD + DW READPARM + BCC GOODREAD ;NO MLI ERROR + CMP #$4C ; DID WE READ PAST EOF? + BEQ MARKEOF + BNE MLIERROR +GOODREAD LDA DEBUG + BEQ SKIP1 + LDA #'R' + JSR $FDF0 + LDA ACTLEN+1 + JSR $FDDA + LDA ACTLEN + JSR $FDDA +SKIP1 LDA REQLEN ;COMPARE ACTUAL LEN TO REQUESTED LEN + CMP ACTLEN ;TO CHECK FOR EOF CONDITION + BNE MARKEOF + LDA REQLEN+1 + CMP ACTLEN+1 + BNE MARKEOF + RTS +MARKEOF LDA #$1 + STA EOFFLAG + RTS +;-------- +READHEAD JSR MLI + DFB READCMD + DW RHEADPRM + BCC GOODHEAD ;NO MLI ERROR + CMP #$4C ; DID WE READ PAST EOF? + BEQ MARKEOF + BNE MLIERROR +GOODHEAD RTS +;-------- +XFERAUX1 LDA #>MAINBUFR + STA A1L + LDA #MAINEND + STA A2L + LDA #AUX1BUFR + STA A4L + LDA #MAINBUFR + STA A1L + LDA #MAINEND + STA A2L + LDA #AUX2BUFR + STA A4L + LDA #AUX1BUFR + STA DRVRSTRT + LDA #AUX1END + CLC + ADC #$01 + STA DRVREND + LDA #AUX2BUFR + STA DRVRSTRT + LDA #AUX2END + CLC + ADC #$01 + STA DRVREND + LDA #MAINBUFR + STA DRVRSTRT + LDA #MAINEND + CLC + ADC #$01 + STA DRVREND + LDA #AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT7+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT6+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT5+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT4+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT3+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT2+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT1+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + ASL A ;SHIFT BIT INTO CARRY + TAX ;SAVE CURRENT IMAGE OF DATA BYTE + LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD + ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS + STA BIT0+1 ;MODIFY THE XMITBITS SUBROUTINE + TXA ;RESTORE ACCUMULATOR +; + JSR XMITBITS ;SEND THE BYTE OUT + LDX TEMPX + LDA TEMPA ;RESTORE X AND A + RTS +;----------------------------------------------------------------------- +XMITBITS BIT AN0OFF ;4 CYCLES - TRANSMIT START BIT - ALWAYS LOW + JSR DELAY22 ;6+22 +BIT0 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT1 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT2 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT3 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT4 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT5 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT6 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 +BIT7 BIT AN0OFF ;4 + JSR DELAY22 ;6+22 + BIT AN0ON ;4 ;TRANSMIT STOP BIT - ALWAYS HIGH + JSR DELAY22 ;6+22 + RTS +;----------------------------------------------------------------------- +DELAY22 NOP ;WAIT 22 CYCLES + NOP + NOP + NOP + NOP + NOP + NOP + NOP + RTS +;----------------------------------------------------------------------- +TESTMSG1 LDA #7 + STA NUMBYTES + LDA #>TESTDAT1 + STA DATAPTR + LDA #TESTDAT2 + STA DATAPTR + LDA #QUIETMSG + STA DATAPTR + LDA #