diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 74678e2c..3125b00c 100644 --- a/Source/HBIOS/spk.asm +++ b/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