Browse Source

Update Scales.asm

pull/312/head
b1ackmai1er 3 years ago
parent
commit
285bc6611f
  1. 284
      Source/Apps/TEST/sound/Scales.asm

284
Source/Apps/TEST/sound/Scales.asm

@ -1,22 +1,173 @@
;
;------------------------------------------------------------------------------
; Play Scales using HBIOS
;------------------------------------------------------------------------------
;
FCB .EQU $5C ; Location of default FCB
BDOS .EQU $0005
.ORG $0100
STEP .EQU 4 ; NOTE STEP I.E. 1 SEMITONE
; SCALES ON ALL THREE CHANNELS
.ORG $0100
;
LD (OLDSTACK),SP ; save old stack pointer
LD SP,STACK ; set new stack pointer
;
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 ;
; JR SKIP
NO_ARG: LD C,A ; GET & DISPLAY # CHANNELS
LD B,$55
LD E,1
RST 08
LD A,B
CALL PRTHEX
call CRLF
LD B,3
NEXTCH0 LD A,B
DEC A
LD (CHANNEL),A
PUSH BC ; ACROSS
CALL SCALE ; ALL
POP BC ; CHANNELS
DJNZ NEXTCH0
LD B,1
;
CALL TST_TONE
; CALL TST_VOL
;
EXIT: LD SP, (OLDSTACK) ; Exit to CP/M
RST 00H
DI
HALT
; CONSTANT TONE ON ALL THREE CHANNELS, SCALE VOLUME
SKIP:
;------------------------------------------------------------------------------
; FOR EACH CHANNEL PLAY SCALES FROM HIGHEST TO LOWEST. B = # CHANNELS
;------------------------------------------------------------------------------
TST_TONE: LD A,(DEVICE) ; C CONTAINS DEVICE
LD C,A ; THROUGH THIS LOOP
;
PUSH BC
LD B,50H ; RESET DEVICE
RST 08
POP BC
;
PUSH BC
LD B,51H ; VOLUME HALF
LD L,80H
RST 08
POP BC
;
LD A,B
TST_TONE_LP: DEC A
LD (CHANNEL),A ; SAVE CURRENT CHANNEL
CALL SCALES ; PLAY SCALE
DJNZ TST_TONE_LP
;
PUSH BC
LD B,50H ; RESET DEVICE
RST 08
POP BC
;
RET
;
;------------------------------------------------------------------------------
;
SCALES: PUSH BC
PUSH AF
LD HL,380 ; START NOTE
LD (NOTE),HL ; Top of Octave 7 is 343
;
NEXT0: PUSH BC
LD BC,(NOTE)
CALL PRTHEXWORD
CALL PRTDOT
POP BC
;
LD B,53H ; NOTE
LD HL,(NOTE)
PUSH BC
RST 08
POP BC
OR A ; DID DRIVER FAIL
JR Z,NEXT4 ; THIS NOTE ?
LD A,'n'
CALL FAILMSG
JR SKIP
;
NEXT4: LD B,57H ; DURATION
LD HL,1000
PUSH BC
RST 08
POP BC
LD B,54H ; PLAY
LD A,(CHANNEL)
LD D,A
PUSH BC
RST 08
POP BC
;
OR A ; DID DRIVER FAIL
JR Z,NEXT2 ; THIS NOTE ?
LD A,'p'
CALL FAILMSG
JR SKIP
;
NEXT2: CALL DELAY
CALL CRLF
;
SKIP: LD HL,(NOTE)
DEC HL
LD (NOTE),HL
INC HL
LD A,H
OR L
DEC HL
JR NZ,NEXT0
;
LD B,51H ; VOLUME
LD L,00H
PUSH BC
RST 08
POP BC
;
LD B,54H ; PLAY
LD A,(CHANNEL)
LD D,A
PUSH BC
RST 08
POP BC
PUSH BC
LD C, 6 ; check for keypress
LD E, 0FFH
CALL BDOS
POP BC
OR A
JP NZ,EXIT
POP AF
POP BC
;
RET
;
FAILMSG: PUSH AF
PUSH BC ; YES SO DISPLAY
CALL PRTCHR
CALL CRLF
POP BC
POP AF
RET
;
;------------------------------------------------------------------------------
; CONSTANT TONE ON ALL CHANNELS, SCALE VOLUME
;------------------------------------------------------------------------------
TST_VOL:
LD HL,332+48 ; TONE
LD (NOTE),HL
;
@ -26,31 +177,46 @@ NEXTCH1 LD A,B
LD (CHANNEL),A
PUSH BC ; ACROSS
CALL TONE ; ALL
LD C, 6 ; KEYPRESS
LD E, 0FFH
CALL BDOS
POP BC ; CHANNELS
OR A
JP NZ,EXIT
DJNZ NEXTCH1
RET
TONE: LD B,50H ; RESET
LD C,0
TONE: LD A,(DEVICE)
LD C,A
LD B,50H ; RESET
PUSH BC
RST 08
POP BC
;
NEXT1: LD B,51H ; VOLUME
LD C,0
LD A,(VOLUME)
LD L,A
PUSH BC
RST 08
POP BC
;
LD B,53H ; NOTE
LD C,0
LD HL,(NOTE)
PUSH BC
RST 08
POP BC
;
LD B,54H ; PLAY
LD C,0
LD A,(CHANNEL)
LD D,A
PUSH BC
RST 08
POP BC
;
CALL DELAY
;
@ -60,75 +226,23 @@ NEXT1: LD B,51H ; VOLUME
JR NZ,NEXT1
;
LD B,51H ; VOLUME
LD C,0
LD L,00H
PUSH BC
RST 08
POP BC
;
LD B,54H ; PLAY
LD C,0
PUSH BC
LD A,(CHANNEL)
LD D,A
POP BC
RST 08
;
RET
;
;
;
SCALE: LD B,50H ; RESET
LD C,0
RST 08
;
LD B,51H ; VOLUME
LD C,0
LD L,80H
RST 08
;
LD HL,380
LD (NOTE),HL
;
NEXT0: LD B,53H ; NOTE
LD C,0
LD HL,(NOTE)
RST 08
;
LD B,54H ; PLAY
LD C,0
LD A,(CHANNEL)
LD D,A
RST 08
;
OR A
JR Z,NEXT2
LD C,9
LD DE,BADFLAG
CALL 5
JR NEXT3
;
NEXT2: CALL DELAY
;
NEXT3: LD HL,(NOTE)
DEC HL
LD A,L
LD (NOTE),A
LD A,H
LD (NOTE+1),A
OR L
;
JR NZ,NEXT0
;
LD B,51H ; VOLUME
LD C,0
LD L,00H
RST 08
;
LD B,54H ; PLAY
LD C,0
LD A,(CHANNEL)
LD D,A
RST 08
;
RET
;
;;
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
DELAY: LD HL,-1
DELAY1: DEC HL
LD A,H
@ -136,10 +250,16 @@ DELAY1: DEC HL
JR NZ,DELAY1
RET
;
BADFLAG .DB '*', $0D, $0A, '$'
NOTE .DW 128
VOLUME .DB 0
CHANNEL .DB 0
#INCLUDE "printing.inc"
;
BADFLAG .DB '*','$'
DEVICE .DB 0
NOTE .DW 128
VOLUME .DB 0
CHANNEL .DB 0
OLDSTACK .DW 0 ; original stack pointer
.DS 40H ; space for stack
STACK ; top of stack
;
.END

Loading…
Cancel
Save