Added legacy files

This commit is contained in:
Eric Rangell 2018-07-16 18:21:02 -04:00
parent dced8b2879
commit 463a69b5c2
16 changed files with 2044 additions and 1 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

BIN
LEGACY/ANN0TEST.DSK Normal file

Binary file not shown.

226
LEGACY/MFF0DRVR.SC0.txt Normal file
View File

@ -0,0 +1,226 @@
;MFF0DRVR.SC0
;
;-------------------
;MAINLINE CODE
;-------------------
AUXSETUP LDA #>ENTRYPTS ;MOVE WHOLE PROGRAM TO AUX
STA SRCMAINL
STA TGTAUXL
LDA #<ENTRYPTS
STA SRCMAINH
STA TGTAUXH
LDA #>EOF
STA ENDMAINL
LDA #<EOF
STA ENDMAINH
LDA #$01
STA TOAUX
JSR DOAUXMV
RTS
;
PLAYMAIN JMP PLAYIT1
PLAYAUX LDA #>PLAYSTRT ;MOVE PARM AREA TO AUX
STA SRCMAINL
STA TGTAUXL
LDA #<PLAYSTRT
STA SRCMAINH
STA TGTAUXH
LDA #>AUXSETUP ;ALSO MOVE ALL DATA VARIABLES
STA ENDMAINL
LDA #<AUXSETUP
STA ENDMAINH
LDA #$01
STA TOAUX
JSR DOAUXMV
;
LDA #>AUXCODE ;TRANSFER TO AUX PROGRAM
STA XFERADRL
LDA #<AUXCODE
STA XFERADRH
LDA #$01
STA XFTOAUX
LDA #$00
STA USEAUXZP
JMP DOXFER
AUXRTN RTS
; ;TRANSFER BACK TO MAIN MEMORY PROGRAM
AUXCODE JSR PLAYIT1 ;PLAY THE AUX BUFFER
LDA #>PLAYSTRT ;MOVE PARM AREA BACK TO MAIN
STA SRCMAINL
STA TGTAUXL
LDA #<PLAYSTRT
STA SRCMAINH
STA TGTAUXH
LDA #>AUXSETUP
STA ENDMAINL
LDA #<AUXSETUP
STA ENDMAINH
LDA #$00
STA TOAUX
JSR DOAUXMV
;
LDA #>AUXRTN ;TRANSFER BACK TO MAIN PROGRAM
STA XFERADRL
LDA #<AUXRTN
STA XFERADRH
LDA #$00
STA XFTOAUX
LDA #$00
STA USEAUXZP
JMP DOXFER
;
DOAUXMV LDA SRCMAINL
STA $3C
LDA SRCMAINH
STA $3D
LDA ENDMAINL
STA $3E
LDA ENDMAINH
STA $3F
LDA TGTAUXL
STA $42
LDA TGTAUXH
STA $43
LDA TOAUX
BNE AUXMOVE1
CLC
JMP AUXMOVE
AUXMOVE1 SEC
JMP AUXMOVE
;
DOXFER LDA XFERADRL
STA $3ED
LDA XFERADRH
STA $3EE
LDA XFTOAUX
BNE DOXFER1
CLC
JMP DOXFER2
DOXFER1 SEC
DOXFER2 LDA USEAUXZP
BNE DOXFER3
CLV
JMP DOXFER4
DOXFER3 BIT MONRTS ;SET OVERFLOW
DOXFER4 JMP AUXXFER
;=============================
PLAYIT1 LDA PLAYSTRT ;INITIALIZE PTR TO BEGINNING OF AREA
STA PLAYPTR
LDA PLAYSTRT+1
STA PLAYPTR+1
LDA KARALOOK ;12/17/95-KARALOOK LOGIC
BEQ PLAYLOOP
LDA #$8D
JSR COUT
JSR KARASCAN
PLAYLOOP LDY #$00 ;READ 1 BYTE
LDA (PLAYPTR),Y
STA INBYTE
JSR PRCSBYTE
LDA ENDOFTRK
BEQ PLAYLOO1
RTS
PLAYLOO1 JSR CHKKBD
LDA ENDOFTRK
BEQ INCPTR
RTS
INCPTR INC PLAYPTR
BNE INCPTR2
INC PLAYPTR+1
INCPTR2 LDA PLAYPTR
CMP PLAYSTOP
BNE PLAYLOOP
LDA PLAYPTR+1
CMP PLAYSTOP+1
BNE PLAYLOOP
RTS
;-------
; CHKKBD - MAY SET ENDOFTRK
;-------
CHKKBD LDA $C000
BPL NOKEY1
LDA $C010
AND #$7F
CMP #$20
BNE CHKESC
LDA #$01
STA ENDOFTRK
NOKEY1 RTS
CHKESC CMP #$1B
BNE CHKFLAT
WAITKEY LDA #$00
STA PAUSEFLG
WAITKEY1 LDA $C000
BPL WAITKEY1
LDA $C010
AND #$7F
CMP #$1B
BNE ESCDONE
INC PAUSEFLG
ESCDONE RTS
CHKFLAT CMP #$46 ;'F'-CHANGE UCS<->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

335
LEGACY/MFF0DRVR.SC1.txt Normal file
View File

@ -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

262
LEGACY/MFF0DRVR.SC2.txt Normal file
View File

@ -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

79
LEGACY/MFF0DRVR.SC3.txt Normal file
View File

@ -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

93
LEGACY/MFF0DRVR.SC4.txt Normal file
View File

@ -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

157
LEGACY/MFF0DRVR.SC5.txt Normal file
View File

@ -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

98
LEGACY/MFF0DRVR.SC6.txt Normal file
View File

@ -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

128
LEGACY/MFF0DRVR.SC7.txt Normal file
View File

@ -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

112
LEGACY/MFF0DRVR.SRC.txt Normal file
View File

@ -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

325
LEGACY/MFF0PLAY.SRC.txt Normal file
View File

@ -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 #<MAINBUFR
STA A1H
LDA #>MAINEND
STA A2L
LDA #<MAINEND
STA A2H
LDA #>AUX1BUFR
STA A4L
LDA #<AUX1BUFR
STA A4H
SEC ;MAIN TO AUX
JSR AUXMOVE
RTS
;--------
XFERAUX2 LDA #>MAINBUFR
STA A1L
LDA #<MAINBUFR
STA A1H
LDA #>MAINEND
STA A2L
LDA #<MAINEND
STA A2H
LDA #>AUX2BUFR
STA A4L
LDA #<AUX2BUFR
STA A4H
SEC ;MAIN TO AUX
JSR AUXMOVE
RTS
;--------
PLAYAUX1 LDA DEBUG
BEQ SKIP2
LDA #'1'
JSR $FDF0
;
SKIP2 LDA USERSTOP
BEQ AUX1OK
RTS
AUX1OK LDA #>AUX1BUFR
STA DRVRSTRT
LDA #<AUX1BUFR
STA DRVRSTRT+1
LDA #>AUX1END
CLC
ADC #$01
STA DRVREND
LDA #<AUX1END
ADC #$00
STA DRVREND+1
JSR DRVRAUX
LDA DRVREOT
BEQ AUX1DONE
LDA #$01
STA EOFFLAG
STA USERSTOP
AUX1DONE RTS
;--------
PLAYAUX2 LDA DEBUG
BEQ SKIP3
LDA #'2'
JSR $FDF0
;
SKIP3 LDA USERSTOP
BEQ AUX2OK
RTS
AUX2OK LDA #>AUX2BUFR
STA DRVRSTRT
LDA #<AUX2BUFR
STA DRVRSTRT+1
LDA #>AUX2END
CLC
ADC #$01
STA DRVREND
LDA #<AUX2END
ADC #$00
STA DRVREND+1
JSR DRVRAUX
LDA DRVREOT
BEQ AUX2DONE
LDA #$01
STA EOFFLAG
STA USERSTOP
AUX2DONE RTS
;--------
PLAYMAIN LDA DEBUG
BEQ SKIP4
LDA #'M'
JSR $FDF0
;
SKIP4 LDA USERSTOP
BEQ MAINOK
RTS
MAINOK LDA #>MAINBUFR
STA DRVRSTRT
LDA #<MAINBUFR
STA DRVRSTRT+1
LDA #>MAINEND
CLC
ADC #$01
STA DRVREND
LDA #<MAINEND
ADC #$00
STA DRVREND+1
JSR DRVRMAIN
LDA DRVREOT
BEQ MAINDONE
LDA #$01
STA EOFFLAG
STA USERSTOP
MAINDONE RTS

23
LEGACY/MIDIDRVR.SC0.txt Normal file
View File

@ -0,0 +1,23 @@
;MIDIDRVR.SC0
;
TESTDAT1 DFB $90,$3C,$40,$40,$40,$43,$40
TESTDAT2 DFB $90,$3C,$00,$40,$00,$43,$00
QUIETMSG DFB $B0,$78,$00,$B0,$79,$00,$B0,$7B,$00
DFB $B1,$78,$00,$B1,$79,$00,$B1,$7B,$00
DFB $B2,$78,$00,$B2,$79,$00,$B2,$7B,$00
DFB $B3,$78,$00,$B3,$79,$00,$B3,$7B,$00
DFB $B4,$78,$00,$B4,$79,$00,$B4,$7B,$00
DFB $B5,$78,$00,$B5,$79,$00,$B5,$7B,$00
DFB $B6,$78,$00,$B6,$79,$00,$B6,$7B,$00
DFB $B7,$78,$00,$B7,$79,$00,$B7,$7B,$00
DFB $B8,$78,$00,$B8,$79,$00,$B8,$7B,$00
DFB $B9,$78,$00,$B9,$79,$00,$B9,$7B,$00
DFB $BA,$78,$00,$BA,$79,$00,$BA,$7B,$00
DFB $BB,$78,$00,$BB,$79,$00,$BB,$7B,$00
DFB $BC,$78,$00,$BC,$79,$00,$BC,$7B,$00
DFB $BD,$78,$00,$BD,$79,$00,$BD,$7B,$00
DFB $BE,$78,$00,$BE,$79,$00,$BE,$7B,$00
DFB $BF,$78,$00,$BF,$79,$00,$BF,$7B,$00
;----------------
; END OF PROGRAM
;----------------

195
LEGACY/MIDIDRVR.SRC.txt Normal file
View File

@ -0,0 +1,195 @@
;-------------------------------------------------------------------------
; 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.
;
; ENTRY POINTS:
;
; $9000 = INITIALIZE - TURNS ON ANNUNCIATOR 0 - MUST BE CALLED ONCE
; $9003 = APPLESOFT CALL TO SEND ONE MIDI BYTE. POKE THE BYTE IN $9004.
; $9005 = ASSEMBLY CALL TO SEND ONE MIDI BYTE FROM ACCUMULATOR
; $9008 = APPLESOFT OR ASSEMBLY CALL TO SEND SEVERAL BYTES AT ONCE:
; THE CALLER POPULATES LOCATION $D7 WITH THE NUMBER OF BYTES TO BE
; TRANSMITTED, AND A POINTER IN $CE,CF (LO,HI) WITH THE ADDRESS OF
; THE DATA BYTES, THEN CALLS THE ENTRY POINT "SENDMSG" TO TRANSMIT
; THE MESSAGE.
; $900B = SEND A TEST MESSAGE - C MAJOR CHORD NOTE ONS
; $900E = SEND A TEST MESSAGE - C MAJOR CHORD NOTE OFFS
;-------------------------------------------------------------------------
ORG $9000
;
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
;
; CALLER MUST POPULATE THE FOLLOWING TWO ZERO PAGE LOCATIONS FOR SENDMSG:
;
NUMBYTES EQU $D7 ;NUMBER OF BYTES TO BE TRANSMITTED NOW (1-256)
; ;THE VALUE 0 WILL TRANSMIT 256 BYTES.
DATAPTR EQU $CE ;POINTER TO THE BYTES TO BE TRANSMITTED NOW
;---------------------------------------------------------------------------
START JMP INIT ;MAIN ENTRY POINT - INITIALIZES ANNUNCIATORS
SENDFP LDA #$90 ;ENTRY POINT FOR APPLESOFT: POKE BYTE AND CALL
SENDONE JMP XMITONE ;ENTRY POINT FOR TRANSMITTING ONE BYTE FROM ACCUM
SENDMSG JMP XMITMSG ;ENTRY POINT FOR TRANSMITTING A MIDI MESSAGE
ALLNOFF JMP QUIET ;TURN ALL NOTES OFF
TEST1 JMP TESTMSG1 ;SEND TEST MESSAGE 1 - C MAJOR CHORD ON
TEST2 JMP TESTMSG2 ;SEND TEST MESSAGE 2 - C MAJOR CHORD OFF
SAVENBYT DFB $00 ;SAVE AREA FOR NUMBYTES
TEMPA DFB $00
TEMPX DFB $00
;---------------------------------------------------------------------------
INIT BIT AN0ON
RTS
;---------------------------------------------------------------------------
XMITMSG LDA NUMBYTES ;SAVE NUMBER OF BYTES
STA SAVENBYT ;BECAUSE WE WILL CLOBBER IT
LDY #$00 ;Y WILL BE AN INDEX INTO THE DATA AREA
XMITLOOP LDA (DATAPTR),Y ;GET A DATA BYTE
JSR XMITONE
INY ;POINT TO NEXT BYTE
DEC NUMBYTES ;DECREMENT COUNTER
LDA NUMBYTES ;CHECK IF ZERO
BNE XMITLOOP ;LOOP UNTIL DONE SENDING ALL BYTES
LDA SAVENBYT
STA NUMBYTES ;RESTORE ORIGINAL VALUE OF NUMBYTES
RTS
;---------------------------------------------------------------------------
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
;-----------------------------------------------------------------------
TESTMSG1 LDA #7
STA NUMBYTES
LDA #>TESTDAT1
STA DATAPTR
LDA #<TESTDAT1
STA DATAPTR+1
JSR SENDMSG
RTS
;-----------------------------------------------------------------------
TESTMSG2 LDA #7
STA NUMBYTES
LDA #>TESTDAT2
STA DATAPTR
LDA #<TESTDAT2
STA DATAPTR+1
JSR SENDMSG
RTS
;-----------------------------------------------------------------------
QUIET LDA #$90
STA NUMBYTES
LDA #>QUIETMSG
STA DATAPTR
LDA #<QUIETMSG
STA DATAPTR+1
JSR SENDMSG
RTS
;-----------------------------------------------------------------------
CHN MIDIDRVR.SC0

9
LEGACY/README.md Normal file
View File

@ -0,0 +1,9 @@
# A2NoSlotMIDI - Legacy files
Older Videos:
https://www.youtube.com/watch?v=fdgd4MUtWYE
https://www.youtube.com/watch?v=tNYEfkiOkMA
Source code in this directory was originally assembled with EDASM

View File

@ -7,7 +7,8 @@ See NoSlotMidi.pptx for Kansasfest 2018 Lightning Talk presentation about this p
DSK directory contains Apple 140K disk images of compiled code.
SRC directory contains current source code
SRC directory contains current source code.
See LEGACY directory for previous versions of source code, disk images, and videos.
Submit your ideas for lesson plans as pull requests to the LESSONS directory.