From e409391f14f509495a7966d2ba66198ec7c3c8a3 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 19 Dec 2022 21:54:17 +0800 Subject: [PATCH] Update Scales.asm --- Source/Apps/TEST/sound/Scales.asm | 160 +++++++++++++++++++++--------- 1 file changed, 112 insertions(+), 48 deletions(-) diff --git a/Source/Apps/TEST/sound/Scales.asm b/Source/Apps/TEST/sound/Scales.asm index c63850b3..46bbb19f 100644 --- a/Source/Apps/TEST/sound/Scales.asm +++ b/Source/Apps/TEST/sound/Scales.asm @@ -1,49 +1,60 @@ ; ;------------------------------------------------------------------------------ -; Play Scales using HBIOS +; PLAY SCALES USING HBIOS ;------------------------------------------------------------------------------ ; FCB .EQU $5C ; Location of default FCB BDOS .EQU $0005 - -STEP .EQU 4 ; NOTE STEP I.E. 1 SEMITONE - +; .ORG $0100 ; LD (OLDSTACK),SP ; save old stack pointer LD SP,STACK ; set new stack pointer +; +;------------------------------------------------------------------------------ +; GET DEVICE # FROM COMMAND LINE +;------------------------------------------------------------------------------ ; LD A,(FCB+1) ; GET FIRST CHAR - CP '/' ; IS IT INDICATING AN ARGUMENT - LD A,0 ; ASSUME DEVICE 0 - JR NZ,NO_ARG ; - LD A,(FCB+2) ; GET NEXT CHARACTER - SUB '0' ; CALCULATE DEVICE # - LD (DEVICE),A ; - -NO_ARG: LD C,A ; GET & DISPLAY # CHANNELS + SUB ' ' + JR Z,NO_ARG + SUB '0'-' ' + JP C,EXIT +; +;------------------------------------------------------------------------------ +; DISPLAY DEVICE AND NUMBER OF CHANNELS +;------------------------------------------------------------------------------ +; +NO_ARG: LD (DEVICE),A ; + LD DE,TXT_DEV ; DEVICE: + CALL PRTSTR + CALL PRTDECB + LD C,A ; GET DEVICE ID + LD A,':' + CALL PRTCHR LD B,$55 + PUSH BC + LD E,4 + RST 08 + LD DE,TXT_NAME + LD A,B + RRCA \ RRCA \ RRCA \ RRCA + CALL PRTIDXDEA ; SHOW NAME + LD DE,TXT_CH + CALL PRTSTR +; + POP BC ; GET & DISPLAY # CHANNELS LD E,1 RST 08 LD A,B - CALL PRTHEX - call CRLF - - LD B,1 -; - CALL TST_TONE -; CALL TST_VOL + CALL PRTDECB + CALL CRLF ; NUMBER OF CHANNELS IS IN B ; -EXIT: LD SP, (OLDSTACK) ; Exit to CP/M - RST 00H - DI - HALT - ;------------------------------------------------------------------------------ -; FOR EACH CHANNEL PLAY SCALES FROM HIGHEST TO LOWEST. B = # CHANNELS +; LOOP THROUGH EACH CHANNEL ;------------------------------------------------------------------------------ -TST_TONE: LD A,(DEVICE) ; C CONTAINS DEVICE +CH__TONE: LD A,(DEVICE) ; C CONTAINS DEVICE LD C,A ; THROUGH THIS LOOP ; PUSH BC @@ -52,15 +63,17 @@ TST_TONE: LD A,(DEVICE) ; C CONTAINS DEVICE POP BC ; PUSH BC - LD B,51H ; VOLUME HALF - LD L,80H + LD B,51H ; VOLUME FULL + LD L,0FFH RST 08 POP BC ; LD A,B TST_TONE_LP: DEC A LD (CHANNEL),A ; SAVE CURRENT CHANNEL - CALL SCALES ; PLAY SCALE + CALL TST_SCALES ; SCALES TEST +; CALL TST_VOLUME ; VOLUME TEST + CALL CRLF DJNZ TST_TONE_LP ; PUSH BC @@ -68,23 +81,45 @@ TST_TONE_LP: DEC A RST 08 POP BC ; - RET +;------------------------------------------------------------------------------ +; RESTORE STACK & EXIT +;------------------------------------------------------------------------------ ; +EXIT: LD SP, (OLDSTACK) ; Exit to CP/M + RST 00H + DI + HALT +; +;------------------------------------------------------------------------------ +; PLAY SCALES FROM HIGHEST HBIOS NOTE TO LOWEST ;------------------------------------------------------------------------------ ; -SCALES: PUSH BC +TST_SCALES: PUSH BC PUSH AF - +; LD HL,380 ; START NOTE LD (NOTE),HL ; Top of Octave 7 is 343 + + LD B,51H ; VOLUME HIGH + LD L,0FFH + PUSH BC + RST 08 + POP BC ; NEXT0: PUSH BC - LD BC,(NOTE) - CALL PRTHEXWORD - CALL PRTDOT +; + LD DE,TXT_TSTCH ; DISPLAY CHANNEL + CALL PRTSTR + LD A,(CHANNEL) + CALL PRTDECB +; + LD DE,TXT_NOTE ; DISPLAY NOTE + CALL PRTSTR + LD HL,(NOTE) + CALL PRTDECW POP BC ; - LD B,53H ; NOTE + LD B,53H ; SET NOTE LD HL,(NOTE) PUSH BC RST 08 @@ -93,7 +128,7 @@ NEXT0: PUSH BC OR A ; DID DRIVER FAIL JR Z,NEXT4 ; THIS NOTE ? - LD A,'n' + LD DE,TXT_BAD_N CALL FAILMSG JR SKIP ; @@ -111,9 +146,9 @@ NEXT4: LD B,57H ; DURATION POP BC ; OR A ; DID DRIVER FAIL - JR Z,NEXT2 ; THIS NOTE ? + JR Z,NEXT2 ; TO PLAY ? - LD A,'p' + LD DE,TXT_BAD_N CALL FAILMSG JR SKIP ; @@ -131,7 +166,7 @@ SKIP: LD HL,(NOTE) JR NZ,NEXT0 ; LD B,51H ; VOLUME - LD L,00H + LD L,00H ; OFF PUSH BC RST 08 POP BC @@ -145,7 +180,7 @@ SKIP: LD HL,(NOTE) PUSH BC LD C, 6 ; check for keypress - LD E, 0FFH + LD E,0FFH CALL BDOS POP BC OR A @@ -157,17 +192,18 @@ SKIP: LD HL,(NOTE) RET ; FAILMSG: PUSH AF - PUSH BC ; YES SO DISPLAY - CALL PRTCHR + PUSH BC + CALL PRTSTR CALL CRLF POP BC POP AF RET ; ;------------------------------------------------------------------------------ -; CONSTANT TONE ON ALL CHANNELS, SCALE VOLUME +; CONSTANT TONE ON ALL CHANNELS, SCALE VOLUME ;------------------------------------------------------------------------------ -TST_VOL: +; +TST_VOLUME: LD HL,332+48 ; TONE LD (NOTE),HL ; @@ -241,8 +277,9 @@ NEXT1: LD B,51H ; VOLUME RET ;; ;------------------------------------------------------------------------------ +; LONG DELAY ;------------------------------------------------------------------------------ - +; DELAY: LD HL,-1 DELAY1: DEC HL LD A,H @@ -250,9 +287,37 @@ DELAY1: DEC HL JR NZ,DELAY1 RET ; +;------------------------------------------------------------------------------ +; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY 0 +; A REGISTER DEFINES THE nTH STRING IN THE LIST TO PRINT AND DE POINTS +; TO THE START OF THE STRING LIST. +;------------------------------------------------------------------------------ +; +PRTIDXDEA: LD C,A + OR A +PRTIDXDEA1: JR Z,PRTIDXDEA3 ; FOUND TARGET SO EXIT +PRTIDXDEA2: LD A,(DE) ; LOOP UNIT + INC DE ; WE REACH + OR A ; END OF STRING + JR NZ,PRTIDXDEA2 + DEC C ; AT STRING END. SO GO + JR PRTIDXDEA1 ; CHECK FOR INDEX MATCH +PRTIDXDEA3: CALL PRTSTR ; DISPLAY THE STRING + RET +; #INCLUDE "printing.inc" ; -BADFLAG .DB '*','$' +TXT_CH .DB "CHANNELS: ",0 +TXT_TSTCH .DB "CHANNEL: ",0 +TXT_BAD_N .DB " BAD NOTE",0 +TXT_BAD_P .DB " PLAY ERROR",0 +TXT_NOTE .DB " NOTE: ",0 +TXT_DEV .DB "DEVICE: ",0 +TXT_NAME .DB "SN76489 ",0 + .DB "AY-3-8910 ",0 + .DB "I/O PORT ",0 + .DB "YM2612 ",0 +MODE .DB 0 ; scales mode or volume mode DEVICE .DB 0 NOTE .DW 128 VOLUME .DB 0 @@ -262,4 +327,3 @@ OLDSTACK .DW 0 ; original stack pointer STACK ; top of stack ; .END -