|
|
|
@ -24,6 +24,9 @@ SP_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE |
|
|
|
SP_TONECNT .EQU 1 ; COUNT NUMBER OF TONE CHANNELS |
|
|
|
SP_NOISECNT .EQU 0 ; COUNT NUMBER OF NOISE CHANNELS |
|
|
|
; |
|
|
|
; FOR OTHER DRIVERS, THE PERIOD VALUE FOR THE TONE IS STORED AT PENDING_PERIOD |
|
|
|
; FOR THE SPK DRIVER THE ADDRESS IN THE TONE TABLE IS STORED IN PENDING_PERIOD |
|
|
|
; |
|
|
|
SP_PENDING_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS) |
|
|
|
SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS) |
|
|
|
; |
|
|
|
@ -77,17 +80,39 @@ SP_STUB: |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
SP_NOTE: |
|
|
|
; CALL PRTHEXWORDHL |
|
|
|
; CALL PC_COLON |
|
|
|
PUSH HL |
|
|
|
PUSH DE ; ON ENTRY L IS A NOTE INDEX |
|
|
|
LD H,0 ; CONVERT THIS NOTE INDEX |
|
|
|
ADD HL,HL ; TO THE ASSOCIATED ENTRY |
|
|
|
ADD HL,HL ; IN THE TUNE TABLE. |
|
|
|
PUSH DE ; ON ENTRY HL IS A NOTE INDEX |
|
|
|
LD A,L |
|
|
|
AND 00000011B |
|
|
|
JR Z,SP_NOTE1 |
|
|
|
; |
|
|
|
LD HL,$FFFF ; QUARTER NOTES |
|
|
|
JR SP_NOTE2 ; NOT SUPPORTED |
|
|
|
; |
|
|
|
; LD A,L |
|
|
|
; AND 11111100B |
|
|
|
; LD L,A |
|
|
|
; |
|
|
|
SP_NOTE1: |
|
|
|
; LD H,0 ; CONVERT THIS NOTE INDEX |
|
|
|
; ADD HL,HL ; TO THE ASSOCIATED ENTRY |
|
|
|
; ADD HL,HL ; IN THE TUNE TABLE. |
|
|
|
; SRL H |
|
|
|
; RR L |
|
|
|
; SRL H |
|
|
|
; RR L |
|
|
|
LD DE,SP_TUNTBL ; SAVE THIS ADDRESS AS |
|
|
|
ADD HL,DE ; THE PERIOD |
|
|
|
SP_NOTE2: |
|
|
|
; CALL PRTHEXWORDHL |
|
|
|
; CALL NEWLINE |
|
|
|
LD (SP_PENDING_PERIOD),HL |
|
|
|
POP DE |
|
|
|
POP HL |
|
|
|
RET |
|
|
|
|
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; SOUND DRIVER FUNCTION - QUERY AND SUBFUNCTIONS |
|
|
|
@ -132,14 +157,24 @@ SP_QUERY_DEV: |
|
|
|
RET |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; INITIALIZE THE TONE TABLE |
|
|
|
; INITIALIZE THE TONE TABLE - ONLY ACCURATE FOR 1MHZ INCREMENTS |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
SP_SETTBL: |
|
|
|
LD A,(CB_CPUMHZ) ; GET CPU SPEED. |
|
|
|
LD C,A |
|
|
|
; |
|
|
|
LD B,SP_NOTCNT ; SET NUMBER OF NOTES TO |
|
|
|
LD HL,(CB_CPUKHZ) ; GET CPU SPEED. |
|
|
|
LD DE,1000 ; CONVERT TO MHZ |
|
|
|
CALL DIV16 |
|
|
|
; |
|
|
|
LD DE,900 ; IF MHZ IS WITHIN 10% OF |
|
|
|
SBC HL,DE ; NEXT INTEGER INCREMENT |
|
|
|
JP M,SP_SETTBL3 ; THEN BUMP UP. I.E. 9.928MHZ |
|
|
|
INC C ; BECOMES 10MHZ |
|
|
|
; |
|
|
|
SP_SETTBL3: |
|
|
|
; LD A,C |
|
|
|
; CALL PRTHEXBYTE |
|
|
|
; |
|
|
|
LD B,SP_NOTCNT ; SET NUMBER OF NOTES TO |
|
|
|
LD HL,SP_TUNTBL+2 ; ADJUST AND START POINT |
|
|
|
; |
|
|
|
SP_SETTBL2: |
|
|
|
@ -179,6 +214,13 @@ SP_SETTBL1: ; 1MHZ NOTE |
|
|
|
SP_PLAY: |
|
|
|
LD HL,(SP_PENDING_PERIOD) ; SELECT NOTE |
|
|
|
; |
|
|
|
LD A,$FF ; EXIT WITH ERROR |
|
|
|
CP H ; STATUS IF INVALID |
|
|
|
JR NZ,SP_PLAY1 ; PERIOD ($FFFF) |
|
|
|
CP L |
|
|
|
RET Z |
|
|
|
; |
|
|
|
SP_PLAY1: |
|
|
|
LD E,(HL) ; LOAD 1ST ARG |
|
|
|
INC HL ; IN DE |
|
|
|
LD D,(HL) |
|
|
|
@ -261,7 +303,7 @@ BE_AGAIN: |
|
|
|
BE_END: |
|
|
|
HB_EI |
|
|
|
POP IX |
|
|
|
RET |
|
|
|
RET ; ALWAYS EXITS WITH SUCCESS STATUS (A=0) |
|
|
|
; |
|
|
|
; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). FOR SP_BEEPER, FIRST WORD LOADED INTO DE, SECOND INTO HL |
|
|
|
; |
|
|
|
@ -269,6 +311,10 @@ BE_END: |
|
|
|
; |
|
|
|
; https://www.retrobrewcomputers.org/lib/exe/fetch.php?media=boards:sbc:sbc_v2:sbc_v2-004:spk_beep_tuntbl.xlsx |
|
|
|
; |
|
|
|
SP_TUN: |
|
|
|
.DW -$1, $FFFF ; C0 |
|
|
|
.DW -$1, $FFFF ; C |
|
|
|
.DW -$1, $FFFF ; D0 |
|
|
|
SP_TUNTBL: |
|
|
|
.DW $13, $191A ; D |
|
|
|
.DW $14, $17B3 ; E0 |
|
|
|
|