From 48532231c9781ba485ba7c397a9d012edd8d9c61 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 28 Nov 2021 07:44:10 +0800 Subject: [PATCH] Update VGMPLAY.ASM Cosmetic cleanup --- Source/Apps/VGM/VGMPLAY.ASM | 345 ++++++++++++++++++++---------------- 1 file changed, 196 insertions(+), 149 deletions(-) diff --git a/Source/Apps/VGM/VGMPLAY.ASM b/Source/Apps/VGM/VGMPLAY.ASM index 9c7b747d..61638c72 100644 --- a/Source/Apps/VGM/VGMPLAY.ASM +++ b/Source/Apps/VGM/VGMPLAY.ASM @@ -1,4 +1,6 @@ +;------------------------------------------------------------------------------ ; SN76489 + AY-3-8910 + YM2162 VGM player for CP/M +;------------------------------------------------------------------------------ ; ; Based on VGM player by J.B. Langston ; https://github.com/jblang/SN76489 @@ -8,10 +10,14 @@ ; YM2162/YM3484, GD3 support, VGM Chip identification, ; default file type, basic file size checking added by Phil Summers ; -; Compile with: +; Assemble with: ; ; TASM -80 -b VGMPLAY.ASM VGMPLAY.COM - +; +;------------------------------------------------------------------------------ +; Device and system specific definitions +;------------------------------------------------------------------------------ +; P8X180 .EQU 0 ; System configuration RC2014 .EQU 0 SBCECB .EQU 1 @@ -67,6 +73,10 @@ RTCIO .EQU 070H D50 .EQU 500 ; 900 ;735 D60 .EQU 600 ; 1000 ;882 +;------------------------------------------------------------------------------ +; VGM Codes +;------------------------------------------------------------------------------ + 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_YM2612_W .EQU 052H ; YM2612 WRITE VALUE DD @@ -75,6 +85,10 @@ VGM_W735 .EQU 062H ; WAIT 735 SAMPLES (1/60TH SECOND) VGM_W882 .EQU 063H ; WAIT 882 SAMPLES (1/50TH SECOND) VGM_ESD .EQU 066H ; END OF SOUND DATA +;------------------------------------------------------------------------------ +; Generic CP/M definitions +;------------------------------------------------------------------------------ + BOOT .EQU 0000H ; boot location BDOS .EQU 0005H ; bdos entry point FCB .EQU 005CH ; file control block @@ -91,6 +105,10 @@ CR .EQU 0DH ; carriage return LF .EQU 0AH ; line feed EOS .EQU '$' ; end of string marker +;------------------------------------------------------------------------------ +; Program Start +;------------------------------------------------------------------------------ + .ORG 100H LD (OLDSTACK),SP ; save old stack pointer @@ -99,9 +117,64 @@ EOS .EQU '$' ; end of string marker LD DE,MSG_WELC ; Welcome Message 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 - 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 CP ' ' ; is blanks JR NZ,HASEXT ; then assume @@ -116,7 +189,8 @@ HASEXT: LD C,OPENF ; Open File LD DE,FCB CALL BDOS INC A - JP Z,ERR + LD DE,MSG_NOFILE + JP Z,EXIT_ERR XOR A ; Read VGM file into memory LD (FCBCR), A @@ -144,8 +218,13 @@ RLOOP RDONE LD C, CLOSEF ; Close the file LD DE, FCB 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 A,(HL) CP 'V' @@ -229,144 +308,8 @@ GD3_NXT2: LD A,(HL) ; Print English Title JR GD3_NXT2 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. ;------------------------------------------------------------------------------ @@ -505,7 +448,109 @@ WAIT1 CP 70H ; WAIT 0-15 SAMPLES UNK: CALL PRTDOT CALL PRTHEX JP NEXT +; +;------------------------------------------------------------------------------ +; Display VGM Devices detected during playback. +;------------------------------------------------------------------------------ +; +VGMDEVICES: 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: RET +; +;------------------------------------------------------------------------------ +; Mute Devices. +;------------------------------------------------------------------------------ +; +VGMMUTE: 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 +; + RET +; +;------------------------------------------------------------------------------ +; Hardware specific routines. +;------------------------------------------------------------------------------ +; SLOWIO: #IFDEF SBCV2004 PUSH AF @@ -515,7 +560,7 @@ SLOWIO: POP AF #ENDIF RET - +; FASTIO: #IFDEF SBCV2004 LD A,(HB_RTCVAL) @@ -534,11 +579,14 @@ MSG_PO .DB "Played on : ",0 MSG_YM: .DB "xYM-2612 ",0 MSG_SN: .DB "xSN76489 ",0 MSG_AY: .DB "xAY-3-8910 ",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 ;------------------------------------------------------------------------------ - +; VGMPOS .DW 0 VGMDLY .DW 0 @@ -552,5 +600,4 @@ STACK ; top of stack ;------------------------------------------------------------------------------ VGMDATA - .END