Browse Source

Update spk.asm

Align note table to architrecture standard.
Quarter notes not supported - returns error status.
Round detected cpu frequency up
pull/134/head
b1ackmai1er 6 years ago
parent
commit
88b6c7c477
  1. 66
      Source/HBIOS/spk.asm

66
Source/HBIOS/spk.asm

@ -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

Loading…
Cancel
Save