mirror of
https://github.com/erangell/A2NoSlotMIDI.git
synced 2024-12-27 09:31:17 +00:00
326 lines
6.8 KiB
Plaintext
326 lines
6.8 KiB
Plaintext
; 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
|