diff --git a/Source/HBIOS/nascom.asm b/Source/HBIOS/nascom.asm index 9278a227..33077a7f 100644 --- a/Source/HBIOS/nascom.asm +++ b/Source/HBIOS/nascom.asm @@ -4430,7 +4430,7 @@ PLAY: CALL GETINT ; GET OCTAVE LD H,0 ADD HL,HL ; X2 ADD HL,HL ; X4 - LD DE,SPK_TUNTBL ; POINT TO NOTE ENTRY + LD DE,FRQDURTBL ; POINT TO NOTE ENTRY ADD HL,DE ; ITS IN HL EX (SP),HL ; RESTORE SYNTAX POINTER @@ -4455,41 +4455,34 @@ PLAY: CALL GETINT ; GET OCTAVE SPK_BEEP: ; PUSH AF ; SAVE DURATION + CALL SET_DUR_TBL + LD A,(HL) ; LOAD 1ST ARG INC HL ; IN DE - LD E,A - LD A,(HL) - INC HL - LD D,A -; -; SRL D ; DE / 8 -; RRC E -; SRL D -; RRC E -; SRL D ; DE IS FREQUECY OF -; RRC E ; NOTE IN OCTAVE 7 - - LD A,7+3 - SUB B - LD C,A -SPK_OCTDIV: + LD E,A ; WHICH IS THE + LD A,(HL) ; FREQUENCY FOR + INC HL ; THE EIGTH + LD D,A ; OCTAVE + + LD A,7 ; DIVIDE THE + SUB B ; FREQENCY BASE + LD C,A ; ON THE OCTAVE +SPK_OCTDIV: ; REQUESTED SRL D RRC E DJNZ SPK_OCTDIV SPK_OCTOK: - LD A,(HL) ; LOAD 2ND ARG INC HL ; IN BC - LD C,A - LD A,(HL) + LD C,A ; WHICH IS THE + LD A,(HL) ; DURATION INC HL LD B,A PUSH BC ; SETUP ARG IN HL POP HL CALL SPK_BEEPER ; PLAY - CALL TEST_FRQ ; RET ; @@ -4563,19 +4556,21 @@ BE_END: POP IX RET -TEST_FRQ: - PUSH HL - PUSH DE - LD BC,500 - PUSH BC ; BC CONTAINS FREQUENCY ; -; ADJUST DURATION BASED ON PROCESSOR SPEED +; SETUP THE ONE SECOND TONE DURATION TABLE BASED ON PROCESSOR SPEED AND TONE FREQUENCY ; ; DURATION = (CPUKHZ / 8) / FREQUENCY ; DURATION = (CPUKHZ * 1000 / 8 ) / FREQUENCY ; DURATION = (CPUKHZ * 125 ) / FREQUENCY ; DURATION = (CPUKHZ * 256 / 2 - CPUKHZ - (2 * CPUKHZ) ) / FREQUENCY +SET_DUR_TBL: + PUSH IX + PUSH IY + PUSH HL + PUSH DE + PUSH BC + LD B,BF_SYSGET ; GET CPU SPEED LD C,BF_SYSGET_CPUINFO ; FROM HBIOS RST 08 @@ -4603,13 +4598,22 @@ FRQ_ADJ1: DEC DE FRQ_ADJ2: - EX DE,HL ; SETUP REGISTERS FOR DIVIDE - PUSH DE - POP IX - POP BC ; RESTORE FREQUENCY (DIVISOR) + PUSH HL ; DEHL = CPUKHZ / 8) / FREQUENCY + POP IX ; HLIX = DENOMINATOR + EX DE,HL + + LD IY,FRQDURTBL ; POINT TO THE TABLE WE + LD C,12 ; WANT TO READ AND UPDATE +TBL_LP: PUSH BC + + LD C,(IY+0) ; READ THE FREQUENCY + LD B,(IY+1) ; FROM THE TABLE IN BC + + PUSH IX ; STORE DENOMINATOR FOR NEXT LOOP + PUSH HL DIV_3216: ; HLIX = HLIX / BC, DE = REMAINDER - LD DE,0 + LD DE,0 LD A,32 DIV_LP: ADD IX,IX ADC HL,HL @@ -4624,20 +4628,42 @@ DIV_LP: ADD IX,IX DIV_CANSUB: EX DE,HL DEC A - JR NZ, DIV_LP + JR NZ, DIV_LP ; IX = RESULT + + PUSH IX ; SAVE RESULT IN TABLE + POP DE + LD (IY+2),E + LD (IY+3),D + + LD DE,4 ; POINT TO NEXT TABLE + ADD IY,DE ; ENTRY TO UPDATE -; PUSH HL -; POP BC -; CALL PRTHEXWORD -; PUSH IX -; POP BC -; CALL PRTHEXWORD + POP HL ; RETREIVE THE DENOMINATOR + POP IX ; FOR THE NEXT LOOP + POP BC ; RETREIVE THE + DJNZ TBL_LP ; LOOP COUNTER + + POP BC POP DE POP HL + POP IY + POP IX RET + LD A,' ' + CALL MONOUT + + LD HL,(FRQDURTBL+12) + PUSH HL + POP BC + CALL PRTHEXWORD + LD HL,(FRQDURTBL+14) + PUSH HL + POP BC + CALL PRTHEXWORD + PRTHEXBYTE: PUSH AF PUSH DE @@ -4699,25 +4725,24 @@ HEXCONV: DAA RET ; -; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). FOR SPK_BEEPER, FIRST WORD LOADED INTO DE, SECOND INTO HL -; EXCEL SPREADSHEET FOR CALCULATION CAN BE FOUND HERE: -; https://www.retrobrewcomputers.org/lib/exe/fetch.php?media=boards:sbc:sbc_v2:sbc_v2-004:spk_beep_tuntbl.xlsx +; ONE OCTAVE TONE TABLE IN FREQUENCY, DURATION FORMAT. TO COMPENSATE FOR DIFFERENT +; CPU FREQUENCIES THE DURATION IS CALCULATED AND POPULATED AT STARTUP. DIFFERENT OCTAVE +; AND DURATIONS ARE CALCULATE BY MODIFYING THE VALUES READ FROM THIS TABLE. ; -; FIRST WORD = C8 * 8 -; -SPK_TUNTBL: - .DW $82D0, $012A ; C - .DW $8A97, $0111 ; C# - .DW $92D5, $010A ; D - .DW $9B90, $00FB ; D# - .DW $A4D0, $00ED ; E - .DW $AE9D, $00DF ; F - .DW $B8FF, $00D3 ; F# - .DW $C3FF, $00C7 ; G - .DW $CFA7, $00BC ; G# - .DW $DC00, $00B1 ; A - .DW $E914, $00A7 ; A# - .DW $F6F1, $009E ; B +FRQDURTBL: + .DW $105A, $0 ; C + .DW $1152, $0 ; C# + .DW $125A, $0 ; D + .DW $1372, $0 ; D# + .DW $149A, $0 ; E + .DW $15D3, $0 ; F + .DW $171F, $0 ; F# + .DW $1875, $0 ; G + .DW $19F4, $0 ; G# + .DW $1B80, $0 ; A + .DW $1D22, $0 ; A# + .DW $1EDE, $0 ; B + SLACK .EQU (BAS_END - $) .FILL SLACK,00H