Browse Source

Merge pull request #279 from b1ackmai1er/dev

VGMPLAY cosmetic cleanup
pull/283/head
Wayne Warthen 4 years ago
committed by GitHub
parent
commit
a29139dccb
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 431
      Source/Apps/VGM/VGMPLAY.ASM

431
Source/Apps/VGM/VGMPLAY.ASM

@ -1,4 +1,6 @@
;------------------------------------------------------------------------------
; SN76489 + AY-3-8910 + YM2162 VGM player for CP/M ; SN76489 + AY-3-8910 + YM2162 VGM player for CP/M
;------------------------------------------------------------------------------
; ;
; Based on VGM player by J.B. Langston ; Based on VGM player by J.B. Langston
; https://github.com/jblang/SN76489 ; https://github.com/jblang/SN76489
@ -8,10 +10,16 @@
; YM2162/YM3484, GD3 support, VGM Chip identification, ; YM2162/YM3484, GD3 support, VGM Chip identification,
; default file type, basic file size checking added by Phil Summers ; default file type, basic file size checking added by Phil Summers
; ;
; Compile with:
; Bugs: YM2612 Mute not working.
;
; Assemble with:
; ;
; TASM -80 -b VGMPLAY.ASM VGMPLAY.COM ; TASM -80 -b VGMPLAY.ASM VGMPLAY.COM
;
;------------------------------------------------------------------------------
; Device and system specific definitions
;------------------------------------------------------------------------------
;
P8X180 .EQU 0 ; System configuration P8X180 .EQU 0 ; System configuration
RC2014 .EQU 0 RC2014 .EQU 0
SBCECB .EQU 1 SBCECB .EQU 1
@ -63,10 +71,26 @@ RTCIO .EQU 070H
#DEFCONT \ nop #DEFCONT \ nop
#DEFCONT \ ld a,val #DEFCONT \ ld a,val
#DEFCONT \ out (YMDAT),a #DEFCONT \ out (YMDAT),a
#DEFCONT \ nop
#DEFCONT \ nop
#DEFINE setreg2(reg,val) \
#DEFCONT \ ld a,reg
#DEFCONT \ out (YM2SEL),a
#DEFCONT \ nop
#DEFCONT \ nop
#DEFCONT \ ld a,val
#DEFCONT \ out (YM2DAT),a
#DEFCONT \ nop
#DEFCONT \ nop
D50 .EQU 500 ; 900 ;735 D50 .EQU 500 ; 900 ;735
D60 .EQU 600 ; 1000 ;882 D60 .EQU 600 ; 1000 ;882
;------------------------------------------------------------------------------
; VGM Codes
;------------------------------------------------------------------------------
VGM_GG_W .EQU 04FH ; GAME GEAR PSG STEREO. WRITE DD TO PORT 0X06 VGM_GG_W .EQU 04FH ; GAME GEAR PSG STEREO. WRITE DD TO PORT 0X06
VGM_PSG_W .EQU 050H ; PSG (SN76489/SN76496) WRITE VALUE DD VGM_PSG_W .EQU 050H ; PSG (SN76489/SN76496) WRITE VALUE DD
VGM_YM2612_W .EQU 052H ; YM2612 WRITE VALUE DD VGM_YM2612_W .EQU 052H ; YM2612 WRITE VALUE DD
@ -75,6 +99,10 @@ VGM_W735 .EQU 062H ; WAIT 735 SAMPLES (1/60TH SECOND)
VGM_W882 .EQU 063H ; WAIT 882 SAMPLES (1/50TH SECOND) VGM_W882 .EQU 063H ; WAIT 882 SAMPLES (1/50TH SECOND)
VGM_ESD .EQU 066H ; END OF SOUND DATA VGM_ESD .EQU 066H ; END OF SOUND DATA
;------------------------------------------------------------------------------
; Generic CP/M definitions
;------------------------------------------------------------------------------
BOOT .EQU 0000H ; boot location BOOT .EQU 0000H ; boot location
BDOS .EQU 0005H ; bdos entry point BDOS .EQU 0005H ; bdos entry point
FCB .EQU 005CH ; file control block FCB .EQU 005CH ; file control block
@ -89,7 +117,10 @@ READF .EQU 20 ; BDOS sequential read function
CR .EQU 0DH ; carriage return CR .EQU 0DH ; carriage return
LF .EQU 0AH ; line feed LF .EQU 0AH ; line feed
EOS .EQU '$' ; end of string marker
;------------------------------------------------------------------------------
; Program Start
;------------------------------------------------------------------------------
.ORG 100H .ORG 100H
@ -99,9 +130,64 @@ EOS .EQU '$' ; end of string marker
LD DE,MSG_WELC ; Welcome Message LD DE,MSG_WELC ; Welcome Message
CALL PRTSTR CALL PRTSTR
LD A,(FCB+1) ; Get first char of filename
CALL READVGM ; Read in the VGM file
CALL VGMINFO ; Check and display VGM Information
LD HL, (VGMDATA + 34H) ; Determine start of VGM
LD A, H ; data.
OR L
JR NZ, _S1
LD HL, 000CH ; Default location (40H - 34H)
_S1 LD DE, VGMDATA + 34H
ADD HL, DE
LD (VGMPOS), HL
LD HL,D60 ; VGM delay (60hz)
LD (VGMDLY), HL
MAINLOOP CALL PLAY ; Play one frame
LD C,6 ; Check for keypress
LD E,0FFH
CALL BDOS
OR A
JR NZ,EXIT
LD HL,(VGMDLY) ; Frame delay
L1 LD B,FRAME_DLY
DJNZ $
DEC HL
LD A,H
OR L
JR NZ,L1
JR MAINLOOP
;
;------------------------------------------------------------------------------
; Program Exit
;------------------------------------------------------------------------------
;
EXIT
#IFDEF SBCV2004
CALL FASTIO
#ENDIF
CALL VGMDEVICES ; Display devices used
CALL VGMMUTE ; Mute Devices
LD DE,MSG_EXIT
EXIT_ERR: CALL PRTSTR ; Generic message or error
LD SP, (OLDSTACK) ; Exit to CP/M
RST 00H
;
;------------------------------------------------------------------------------
; Read VGM file into memory
;------------------------------------------------------------------------------
;
READVGM: LD A,(FCB+1) ; Get first char of filename
CP ' ' ; Compare to blank CP ' ' ; Compare to blank
JP Z,ERR ; If so, missing filename
LD DE,MSG_NOFILE ; If blank, missing filename
JP Z,EXIT_ERR ; so exit
LD A,(FCB+9) ; If the filetype LD A,(FCB+9) ; If the filetype
CP ' ' ; is blanks CP ' ' ; is blanks
JR NZ,HASEXT ; then assume JR NZ,HASEXT ; then assume
@ -116,7 +202,8 @@ HASEXT: LD C,OPENF ; Open File
LD DE,FCB LD DE,FCB
CALL BDOS CALL BDOS
INC A INC A
JP Z,ERR
LD DE,MSG_NOFILE
JP Z,EXIT_ERR
XOR A ; Read VGM file into memory XOR A ; Read VGM file into memory
LD (FCBCR), A LD (FCBCR), A
@ -144,8 +231,13 @@ RLOOP
RDONE LD C, CLOSEF ; Close the file RDONE LD C, CLOSEF ; Close the file
LD DE, FCB LD DE, FCB
CALL BDOS CALL BDOS
LD DE,MSG_BADF ; Check valid file
RET
;
;------------------------------------------------------------------------------
; Display VGM information.
;------------------------------------------------------------------------------
;
VGMINFO: LD DE,MSG_BADF ; Check valid file
LD HL,VGMDATA LD HL,VGMDATA
LD A,(HL) LD A,(HL)
CP 'V' CP 'V'
@ -229,144 +321,8 @@ GD3_NXT2: LD A,(HL) ; Print English Title
JR GD3_NXT2 JR GD3_NXT2
GD3_NXT3: CALL CRLF GD3_NXT3: CALL CRLF
SKIP_GD3: LD HL, (VGMDATA + 34H) ; Determine start of VGM
LD A, H ; data.
OR L
JR NZ, _S1
LD HL, 000CH ; Default location (40H - 34H)
_S1 LD DE, VGMDATA + 34H
ADD HL, DE
LD (VGMPOS), HL
LD HL,D60 ; VGM delay (60hz)
LD (VGMDLY), HL
MAINLOOP CALL PLAY ; Play one frame
LD C,6 ; Check for keypress
LD E,0FFH
CALL BDOS
OR A
JR NZ,EXIT
LD HL,(VGMDLY) ; Frame delay
L1 LD B,FRAME_DLY
DJNZ $
DEC HL
LD A,H
OR L
JR NZ,L1
JR MAINLOOP
EXIT
#IFDEF SBCV2004
CALL FASTIO
#ENDIF
LD DE,MSG_PO
CALL PRTSTR
LD A,(IX+0)
PUSH AF
AND %00000011
srl a
ADC A,'0'
CP '0'
JR Z,NOSN
CALL PRTCHR
LD DE,MSG_SN
CALL PRTSTR
NOSN: POP AF
srl a
srl a
PUSH AF
AND %00000011
srl a
ADC A,'0'
CP '0'
JR Z,NOAY
CALL PRTCHR
LD DE,MSG_AY
CALL PRTSTR
NOAY: POP AF
srl a
srl a
PUSH AF
AND %00000011
srl a
ADC A,'0'
CP '0'
JR Z,NOYM
CALL PRTCHR
LD DE,MSG_YM
CALL PRTSTR
NOYM: LD A, 9FH ; Mute all channels on psg
OUT (PSGREG), A
OUT (PSG2REG), A
LD A, 0BFH
OUT (PSGREG), A
OUT (PSG2REG), A
LD A, 0DFH
OUT (PSGREG), A
OUT (PSG2REG), A
LD A, 0FFH
OUT (PSGREG), A
OUT (PSG2REG), A
LD A, 8 ; Mute all channels on ay
OUT (RSEL), A
OUT (RSEL2), A
XOR A
OUT (RDAT), A
OUT (RDAT2), A
LD A, 9
OUT (RSEL), A
OUT (RSEL2), A
XOR A
OUT (RDAT), A
OUT (RDAT2), A
LD A, 10
OUT (RSEL), A
OUT (RSEL2), A
XOR A
OUT (RDAT), A
OUT (RDAT2), A
CALL FASTIO
setreg($22,$00) ; lfo off
setreg($27,$00) ; note off ch 0
setreg($28,$01) ; note off ch 1
setreg($28,$02) ; note off ch 2
setreg($28,$03) ; note off ch 3
setreg($28,$04) ; note off ch 4
setreg($28,$05) ; note off ch 5
setreg($28,$06) ; note off ch 6
setreg($28,$01) ; note off ch 1
setreg($2b,$00) ; dac off
setreg($28,$00) ; key off
LD DE,MSG_EXIT
EXIT_ERR: CALL PRTSTR
LD SP, (OLDSTACK)
RST 00H
ERR LD C, PRINTF
LD DE, NOFILE
CALL BDOS
RST 00H
NOFILE .DB "File not found", CR, LF, EOS
MSG_MEM .DB "File to big", CR, LF, EOS
MSG_EXIT .DB "FINISHED.",CR,LF,0
SKIP_GD3: RET
;
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; VGM Player. ; VGM Player.
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
@ -374,7 +330,7 @@ PLAY
#IFDEF SBCV2004 #IFDEF SBCV2004
CALL SLOWIO CALL SLOWIO
#ENDIF #ENDIF
LD IX,DEV_FLAG
LD IX,VGM_DEV
LD HL, (VGMPOS) ; Start processing VGM commands LD HL, (VGMPOS) ; Start processing VGM commands
NEXT LD A, (HL) NEXT LD A, (HL)
INC HL INC HL
@ -392,6 +348,8 @@ NEXT LD A, (HL)
NEXT1 CP VGM_GG_W ; Game Gear SN76489 stereo. Ignored NEXT1 CP VGM_GG_W ; Game Gear SN76489 stereo. Ignored
JR NZ, PSG JR NZ, PSG
LD IX,VGM_DEV
SET 6,(IX+0)
INC HL INC HL
JR NEXT JR NEXT
@ -400,7 +358,7 @@ PSG CP VGM_PSG_W ; Write byte to SN76489.
LD A, (HL) LD A, (HL)
INC HL INC HL
OUT (PSGREG), A OUT (PSGREG), A
LD IX,DEV_FLAG
LD IX,VGM_DEV
SET 0,(IX+0) SET 0,(IX+0)
JR NEXT JR NEXT
@ -409,7 +367,7 @@ PSG2 CP 30H ; Write byte to second SN76489.
LD A, (HL) LD A, (HL)
INC HL INC HL
OUT (PSG2REG), A OUT (PSG2REG), A
LD IX,DEV_FLAG
LD IX,VGM_DEV
SET 1,(IX+0) SET 1,(IX+0)
JR NEXT JR NEXT
@ -426,14 +384,14 @@ AY CP 0A0H
LD A, (HL) LD A, (HL)
INC HL INC HL
OUT (RDAT2), A OUT (RDAT2), A
LD IX,DEV_FLAG
LD IX,VGM_DEV
SET 2,(IX+0) SET 2,(IX+0)
JR NEXT JR NEXT
AY1 OUT (RSEL), A AY1 OUT (RSEL), A
LD A, (HL) LD A, (HL)
INC HL INC HL
OUT (RDAT), A OUT (RDAT), A
LD IX,DEV_FLAG
LD IX,VGM_DEV
SET 3,(IX+0) SET 3,(IX+0)
JR NEXT JR NEXT
@ -441,19 +399,18 @@ AY1 OUT (RSEL), A
YM: CP 052H YM: CP 052H
JR NZ, YM2 JR NZ, YM2
LD A,(HL) LD A,(HL)
OUT (YMSEL),A OUT (YMSEL),A
INC HL INC HL
LD A,(HL) LD A,(HL)
OUT (YMDAT),A OUT (YMDAT),A
INC HL INC HL
LD IX,DEV_FLAG
LD IX,VGM_DEV
SET 4,(IX+0) SET 4,(IX+0)
JP NEXT JP NEXT
;
YM2: CP 053H YM2: CP 053H
JR NZ, PCM
JR NZ,WAITNN
LD A,(HL) LD A,(HL)
OUT (YM2SEL),A OUT (YM2SEL),A
@ -461,12 +418,11 @@ YM2: CP 053H
LD A,(HL) LD A,(HL)
OUT (YM2DAT),A OUT (YM2DAT),A
INC HL INC HL
LD IX,DEV_FLAG
LD IX,VGM_DEV
SET 4,(IX+0) SET 4,(IX+0)
JP NEXT JP NEXT
PCM:
WAITNN CP 61H ; Wait nn samples
;
WAITNN: CP 61H ; Wait nn samples
JR NZ, WAIT60 JR NZ, WAIT60
LD A, (HL) LD A, (HL)
INC HL INC HL
@ -477,21 +433,21 @@ WAITNN CP 61H ; Wait nn samples
LD H, D LD H, D
LD (VGMDLY), HL LD (VGMDLY), HL
RET RET
;
WAIT60 CP VGM_W735 ; Wait 735 samples (60Hz) WAIT60 CP VGM_W735 ; Wait 735 samples (60Hz)
JR NZ, WAIT50 JR NZ, WAIT50
LD (VGMPOS), HL LD (VGMPOS), HL
LD HL, D50 LD HL, D50
LD (VGMDLY), HL LD (VGMDLY), HL
RET RET
;
WAIT50 CP VGM_W882 ; Wait 882 samples (50Hz) WAIT50 CP VGM_W882 ; Wait 882 samples (50Hz)
JR NZ, WAIT1 JR NZ, WAIT1
LD (VGMPOS), HL LD (VGMPOS), HL
LD HL, D60 LD HL, D60
LD (VGMDLY), HL LD (VGMDLY), HL
RET RET
;
WAIT1 CP 70H ; WAIT 0-15 SAMPLES WAIT1 CP 70H ; WAIT 0-15 SAMPLES
JR C, UNK ; CODES 70-7FH JR C, UNK ; CODES 70-7FH
CP 80H CP 80H
@ -501,11 +457,130 @@ WAIT1 CP 70H ; WAIT 0-15 SAMPLES
LD H, 0 LD H, 0
LD (VGMDLY), HL LD (VGMDLY), HL
RET RET
UNK: CALL PRTDOT
CALL PRTHEX
;
UNK: LD IX,VGM_DEV ; Set flag for
SET 6,(IX+0) ; unknown device
INC HL ; Try and skip
JP NEXT JP NEXT
;
;------------------------------------------------------------------------------
; Display VGM Devices detected during playback.
;------------------------------------------------------------------------------
;
VGMDEVICES: LD DE,MSG_PO ; Played on ...
CALL PRTSTR
;
LD A,(IX+0)
PUSH AF
;
LD DE,MSG_SN ; SN76489 Devices
CALL CHKDEV
;
POP AF
SRL A
SRL A
PUSH AF
;
LD DE,MSG_AY ; AY-3-8910 Devices
CALL CHKDEV
;
POP AF
SRL A
SRL A
PUSH AF
;
LD DE,MSG_YM ; YM-2612 Devices
CALL CHKDEV
;
POP AF
SRL A
SRL A
; PUSH AF
;
LD DE,MSG_UNK ; Unknown Device Code detected
; CALL CHKDEV
;
CHKDEV: AND %00000011 ; Display
SRL A ; number of
ADC A,'0' ; devices
CP '0'
RET Z ; Skip if not
CALL PRTCHR ; used.
CALL PRTSTR
RET
;
;------------------------------------------------------------------------------
; Mute Devices.
;------------------------------------------------------------------------------
;
VGMMUTE: LD A,(IX+0) ; Only mute devices used.
AND %00000011
JR Z,SKIP1
LD A, 9FH ; Mute all channels on psg
OUT (PSGREG), A
OUT (PSG2REG), A
LD A, 0BFH
OUT (PSGREG), A
OUT (PSG2REG), A
LD A, 0DFH
OUT (PSGREG), A
OUT (PSG2REG), A
LD A, 0FFH
OUT (PSGREG), A
OUT (PSG2REG), A
SKIP1: LD A,(IX+0)
AND %00001100
JR Z,SKIP2
LD A, 8 ; Mute all channels on ay
OUT (RSEL), A
OUT (RSEL2), A
XOR A
OUT (RDAT), A
OUT (RDAT2), A
LD A, 9
OUT (RSEL), A
OUT (RSEL2), A
XOR A
OUT (RDAT), A
OUT (RDAT2), A
LD A, 10
OUT (RSEL), A
OUT (RSEL2), A
XOR A
OUT (RDAT), A
OUT (RDAT2), A
CALL FASTIO
SKIP2: LD A,(IX+0)
AND %00110000
JP Z,SKIP3
setreg($22,$00) ; lfo off
setreg($27,$00) ; Disable independant Channel 3
setreg($28,$00) ; note off ch 1
setreg($28,$01) ; note off ch 2
setreg($28,$02) ; note off ch 3
setreg($28,$04) ; note off ch 4
setreg($28,$05) ; note off ch 5
setreg($28,$06) ; note off ch 6
setreg($2b,$00) ; dac off
setreg($b4,$00) ; sound off ch 1-3
setreg($b5,$00)
setreg($b6,$00)
setreg2($b4,$00) ; sound off ch 4-6
setreg2($b5,$00)
setreg2($b6,$00)
SKIP3: RET
;
;------------------------------------------------------------------------------
; Hardware specific routines.
;------------------------------------------------------------------------------
;
SLOWIO: SLOWIO:
#IFDEF SBCV2004 #IFDEF SBCV2004
PUSH AF PUSH AF
@ -515,7 +590,7 @@ SLOWIO:
POP AF POP AF
#ENDIF #ENDIF
RET RET
;
FASTIO: FASTIO:
#IFDEF SBCV2004 #IFDEF SBCV2004
LD A,(HB_RTCVAL) LD A,(HB_RTCVAL)
@ -523,9 +598,17 @@ FASTIO:
OUT (RTCIO),A ; NORMAL CLOCK SPEED OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF #ENDIF
RET RET
;
;------------------------------------------------------------------------------
; External routines.
;------------------------------------------------------------------------------
;
#INCLUDE "printing.inc" #INCLUDE "printing.inc"
;
;------------------------------------------------------------------------------
; Strings and constants.
;------------------------------------------------------------------------------
;
MSG_WELC: .DB "VGM Player for RomWBW v0.2, 27-Nov-2021",CR,LF MSG_WELC: .DB "VGM Player for RomWBW v0.2, 27-Nov-2021",CR,LF
; .DB "J.B. Langston/Marco Maccaferri/Phil Summers",CR,LF ; .DB "J.B. Langston/Marco Maccaferri/Phil Summers",CR,LF
.DB 0 .DB 0
@ -534,15 +617,20 @@ MSG_PO .DB "Played on : ",0
MSG_YM: .DB "xYM-2612 ",0 MSG_YM: .DB "xYM-2612 ",0
MSG_SN: .DB "xSN76489 ",0 MSG_SN: .DB "xSN76489 ",0
MSG_AY: .DB "xAY-3-8910 ",0 MSG_AY: .DB "xAY-3-8910 ",0
MSG_UNK .DB "xUnsupported device encountered", CR, LF, 0
MSG_EXIT: .DB "FINISHED.",CR,LF,0
MSG_NOFILE: .DB "File not found", CR, LF, 0
MSG_MEM: .DB "File to big", CR, LF, 0
;
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; Variables ; Variables
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
;
VGMPOS .DW 0 VGMPOS .DW 0
VGMDLY .DW 0 VGMDLY .DW 0
VGMUNK_F .DB 0 ; Flag for unknown device
VGM_DEV .DB %00000000 ; UUYYAASS
DEV_FLAG .DB %00000000 ; 000YAASS
OLDSTACK .DW 0 ; original stack pointer OLDSTACK .DW 0 ; original stack pointer
.DS 40H ; space for stack .DS 40H ; space for stack
STACK ; top of stack STACK ; top of stack
@ -552,5 +640,4 @@ STACK ; top of stack
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
VGMDATA VGMDATA
.END .END

Loading…
Cancel
Save