diff --git a/Source/HBIOS/audio.inc b/Source/HBIOS/audio.inc index 2b69513b..09469326 100644 --- a/Source/HBIOS/audio.inc +++ b/Source/HBIOS/audio.inc @@ -6,10 +6,11 @@ #DEFINE AUDTRACE_E PUSH AF \ LD A, E \ CALL PRTHEXBYTE \ POP AF #DEFINE AUDTRACE_L PUSH AF \ LD A, L \ CALL PRTHEXBYTE \ POP AF #DEFINE AUDTRACE_HL CALL PRTHEXWORDHL -#DEFINE AUDTRACE_DE PUSH DE \ PUSH DE \ POP HL \ CALL PRTHEXWORDHL \ POP DE +#DEFINE AUDTRACE_BC PUSH HL \ PUSH BC \ POP HL \ CALL PRTHEXWORDHL \ POP HL +#DEFINE AUDTRACE_DE PUSH HL \ PUSH DE \ POP HL \ CALL PRTHEXWORDHL \ POP HL #DEFINE AUDTRACE_IY PUSH HL \ PUSH IY \ POP HL \ CALL PRTHEXWORDHL \ POP HL -#DEFINE AUDDEBUG(S) CALL PRTSTRD \ .TEXT S \ .TEXT "$" ; $$$$$$ PRINT STRING S TO CONSOLE - PRTD("HELLO") - NO TRAILING $ REQUIRED +#DEFINE AUDDEBUG(S) push hl \ CALL PRTSTRD \ .TEXT S \ .TEXT "$" \ pop hl ; $$$$$$ PRINT STRING S TO CONSOLE - PRTD("HELLO") - NO TRAILING $ REQUIRED #DEFINE AUDTRACE_CR AUDDEBUG("\r\n$") @@ -20,6 +21,7 @@ #DEFINE AUDTRACE_D #DEFINE AUDTRACE_E #DEFINE AUDTRACE_L +#DEFINE AUDTRACE_BC #DEFINE AUDTRACE_HL #DEFINE AUDTRACE_DE #DEFINE AUDTRACE_IY diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index f8181983..8f90e360 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -26,19 +26,6 @@ SN7CLKDIVIDER .EQU 4 SN7CLK .EQU CPUOSC / SN7CLKDIVIDER SN7RATIO .EQU SN7CLK * 100 / 32 - -SN7_FIRST_NOTE .EQU 5827 ; A1# -SN7_LAST_NOTE .EQU 209300 ; C7 - -A1S .EQU SN7RATIO / SN7_FIRST_NOTE -C7 .EQU SN7RATIO / SN7_LAST_NOTE - - .ECHO "SN76489: range of A1# (period: " - .ECHO A1S - .ECHO ") to C7 (period: " - .ECHO C7 - .ECHO ")\n" - #INCLUDE "audio.inc" SN76489_INIT: @@ -112,22 +99,19 @@ SN7_VOLUME: XOR A ; SIGNAL SUCCESS RET - - SN7_NOTE: AUDTRACE(SNT_NOTE) AUDTRACE_HL AUDTRACE_CR - LD H,0 - ADD HL, HL ; SHIFT RIGHT (MULT 2) -INDEX INTO SN7NOTETBL TABLE OF WORDS - ; TEST IF HL IS LARGER THAN SN7NOTETBL SIZE - OR A ; CLEAR CARRY FLAG - LD DE, SIZ_SN7NOTETBL - SBC HL, DE - JR NC, SN7_NOTE1 ; INCOMING HL DOES NOT MAP INTO SN7NOTETBL + LD B, H + LD C, L + LD DE, 48 - ADD HL, DE ; RESTORE HL + CALL _DIV16 + ; BC IS OCTAVE COUNT + ; HL is NOTE WITIN ACTAVE + ADD HL, HL LD DE, SN7NOTETBL ADD HL, DE @@ -136,10 +120,57 @@ SN7_NOTE: LD H, (HL) LD L, A - JR SN7_PERIOD ; APPLY PERIOD - + INC C SN7_NOTE1: - OR $FF ; NOT IMPLEMENTED YET + DEC C + JR Z, SN7_NOTE2 + SRL H + RR L + JR SN7_NOTE1 + +SN7_NOTE2: + LD A, L + OR H + JR NZ, SN7_PERIOD + + LD H, $FF + LD L, $FF + JR SN7_PERIOD + +; Divide 16-bit values (with 16-bit result) +; In: Divide BC by divider DE +; Out: BC = result, HL = rest +; +_DIV16: + LD HL, 0 + LD A, B + LD B, 8 +DIV16_LOOP1: + RLA + ADC HL, HL + SBC HL, DE + JR NC, DIV16_NOADD1 + ADD HL, DE +DIV16_NOADD1: + DJNZ DIV16_LOOP1 + RLA + CPL + LD B, A + LD A, C + LD C, B + LD B, 8 +DIV16_LOOP2: + RLA + ADC HL, HL + SBC HL, DE + JR NC, DIV16_NOADD2 + ADD HL, DE +DIV16_NOADD2: + DJNZ DIV16_LOOP2 + RLA + CPL + LD B, C + LD C, A RET SN7_PERIOD: @@ -147,11 +178,17 @@ SN7_PERIOD: AUDTRACE_HL AUDTRACE_CR - LD A, H - CP $04 - JP NC, SN7_QUERY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE + ; LD A, H ; IF ZERO - ERROR + ; OR L + ; JR Z, SN7_QUERY_PERIOD1 + + LD (SN7_PENDING_PERIOD), HL ;ASSUME SUCCESS + + OR A ; IF >= 401 ERROR + LD DE, $401 + SBC HL, DE + JR NC, SN7_QUERY_PERIOD1 - LD (SN7_PENDING_PERIOD), HL XOR A ; SIGNAL SUCCESS RET @@ -361,257 +398,60 @@ SNT_PLAY .DB "\r\nSN7_PLAY CH: $" SNT_REGWR .DB "\r\nOUT SN76489, $" #ENDIF -; THE FREQUENCY BY QUARTER TONE STARTING AT A1# +; THE FREQUENCY BY QUARTER TONE STARTING AT A0# +; OCATVE 0 - not suported by this driver +; FIRST PLAYABLE NOTE WILL BE $2E - 2 quater tones below a1# +; A1# is $30 + SN7NOTETBL: - .DW A1S ; 5827 - .DW SN7RATIO / 5912 - .DW SN7RATIO / 5998 - .DW SN7RATIO / 6085 - .DW SN7RATIO / 6174 - .DW SN7RATIO / 6264 - .DW SN7RATIO / 6355 - .DW SN7RATIO / 6447 - .DW SN7RATIO / 6541 - .DW SN7RATIO / 6636 - .DW SN7RATIO / 6733 - .DW SN7RATIO / 6831 - .DW SN7RATIO / 6930 - .DW SN7RATIO / 7031 - .DW SN7RATIO / 7133 - .DW SN7RATIO / 7237 - .DW SN7RATIO / 7342 - .DW SN7RATIO / 7449 - .DW SN7RATIO / 7557 - .DW SN7RATIO / 7667 - .DW SN7RATIO / 7778 - .DW SN7RATIO / 7891 - .DW SN7RATIO / 8006 - .DW SN7RATIO / 8122 - .DW SN7RATIO / 8241 - .DW SN7RATIO / 8361 - .DW SN7RATIO / 8482 - .DW SN7RATIO / 8606 - .DW SN7RATIO / 8731 - .DW SN7RATIO / 8858 - .DW SN7RATIO / 8987 - .DW SN7RATIO / 9118 - .DW SN7RATIO / 9250 - .DW SN7RATIO / 9385 - .DW SN7RATIO / 9521 - .DW SN7RATIO / 9660 - .DW SN7RATIO / 9800 - .DW SN7RATIO / 9943 - .DW SN7RATIO / 10087 - .DW SN7RATIO / 10234 - .DW SN7RATIO / 10383 - .DW SN7RATIO / 10534 - .DW SN7RATIO / 10687 - .DW SN7RATIO / 10843 - .DW SN7RATIO / 11000 - .DW SN7RATIO / 11160 - .DW SN7RATIO / 11322 - .DW SN7RATIO / 11487 - .DW SN7RATIO / 11654 - .DW SN7RATIO / 11824 - .DW SN7RATIO / 11995 - .DW SN7RATIO / 12170 - .DW SN7RATIO / 12347 - .DW SN7RATIO / 12527 - .DW SN7RATIO / 12709 - .DW SN7RATIO / 12894 - .DW SN7RATIO / 13081 - .DW SN7RATIO / 13271 - .DW SN7RATIO / 13464 - .DW SN7RATIO / 13660 - .DW SN7RATIO / 13859 - .DW SN7RATIO / 14061 - .DW SN7RATIO / 14265 - .DW SN7RATIO / 14473 - .DW SN7RATIO / 14683 - .DW SN7RATIO / 14897 - .DW SN7RATIO / 15113 - .DW SN7RATIO / 15333 - .DW SN7RATIO / 15556 - .DW SN7RATIO / 15782 - .DW SN7RATIO / 16012 - .DW SN7RATIO / 16245 - .DW SN7RATIO / 16481 - .DW SN7RATIO / 16721 - .DW SN7RATIO / 16964 - .DW SN7RATIO / 17211 - .DW SN7RATIO / 17461 - .DW SN7RATIO / 17715 - .DW SN7RATIO / 17973 - .DW SN7RATIO / 18234 - .DW SN7RATIO / 18500 - .DW SN7RATIO / 18769 - .DW SN7RATIO / 19042 - .DW SN7RATIO / 19319 - .DW SN7RATIO / 19600 - .DW SN7RATIO / 19885 - .DW SN7RATIO / 20174 - .DW SN7RATIO / 20468 - .DW SN7RATIO / 20765 - .DW SN7RATIO / 21067 - .DW SN7RATIO / 21373 - .DW SN7RATIO / 21684 - .DW SN7RATIO / 22000 - .DW SN7RATIO / 22320 - .DW SN7RATIO / 22645 - .DW SN7RATIO / 22974 - .DW SN7RATIO / 23308 - .DW SN7RATIO / 23647 - .DW SN7RATIO / 23991 - .DW SN7RATIO / 24340 - .DW SN7RATIO / 24694 - .DW SN7RATIO / 25053 - .DW SN7RATIO / 25418 - .DW SN7RATIO / 25787 - .DW SN7RATIO / 26163 - .DW SN7RATIO / 26544 - .DW SN7RATIO / 26930 - .DW SN7RATIO / 27321 - .DW SN7RATIO / 27718 - .DW SN7RATIO / 28121 - .DW SN7RATIO / 28530 - .DW SN7RATIO / 28945 - .DW SN7RATIO / 29366 - .DW SN7RATIO / 29793 - .DW SN7RATIO / 30226 - .DW SN7RATIO / 30666 - .DW SN7RATIO / 31113 - .DW SN7RATIO / 31566 - .DW SN7RATIO / 32025 - .DW SN7RATIO / 32490 - .DW SN7RATIO / 32963 - .DW SN7RATIO / 33442 - .DW SN7RATIO / 33929 - .DW SN7RATIO / 34422 - .DW SN7RATIO / 34923 - .DW SN7RATIO / 35431 - .DW SN7RATIO / 35946 - .DW SN7RATIO / 36469 - .DW SN7RATIO / 36999 - .DW SN7RATIO / 37537 - .DW SN7RATIO / 38083 - .DW SN7RATIO / 38637 - .DW SN7RATIO / 39200 - .DW SN7RATIO / 39770 - .DW SN7RATIO / 40349 - .DW SN7RATIO / 40936 - .DW SN7RATIO / 41530 - .DW SN7RATIO / 42134 - .DW SN7RATIO / 42747 - .DW SN7RATIO / 43369 - .DW SN7RATIO / 44000 - .DW SN7RATIO / 44640 - .DW SN7RATIO / 45289 - .DW SN7RATIO / 45948 - .DW SN7RATIO / 46616 - .DW SN7RATIO / 47294 - .DW SN7RATIO / 47982 - .DW SN7RATIO / 48680 - .DW SN7RATIO / 49388 - .DW SN7RATIO / 50106 - .DW SN7RATIO / 50835 - .DW SN7RATIO / 51575 - .DW SN7RATIO / 52325 - .DW SN7RATIO / 53086 - .DW SN7RATIO / 53858 - .DW SN7RATIO / 54642 - .DW SN7RATIO / 55437 - .DW SN7RATIO / 56243 - .DW SN7RATIO / 57061 - .DW SN7RATIO / 57891 - .DW SN7RATIO / 58733 - .DW SN7RATIO / 59587 - .DW SN7RATIO / 60454 - .DW SN7RATIO / 61333 - .DW SN7RATIO / 62225 - .DW SN7RATIO / 63130 - .DW SN7RATIO / 64048 - .DW SN7RATIO / 64980 - .DW SN7RATIO / 65925 - .DW SN7RATIO / 66884 - .DW SN7RATIO / 67857 - .DW SN7RATIO / 68844 - .DW SN7RATIO / 69846 - .DW SN7RATIO / 70862 - .DW SN7RATIO / 71893 - .DW SN7RATIO / 72938 - .DW SN7RATIO / 73999 - .DW SN7RATIO / 75075 - .DW SN7RATIO / 76167 - .DW SN7RATIO / 77275 - .DW SN7RATIO / 78399 - .DW SN7RATIO / 79539 - .DW SN7RATIO / 80696 - .DW SN7RATIO / 81870 - .DW SN7RATIO / 83061 - .DW SN7RATIO / 84269 - .DW SN7RATIO / 85495 - .DW SN7RATIO / 86738 - .DW SN7RATIO / 88000 - .DW SN7RATIO / 89280 - .DW SN7RATIO / 90579 - .DW SN7RATIO / 91896 - .DW SN7RATIO / 93233 - .DW SN7RATIO / 94589 - .DW SN7RATIO / 95965 - .DW SN7RATIO / 97361 - .DW SN7RATIO / 98777 - .DW SN7RATIO / 100214 - .DW SN7RATIO / 101671 - .DW SN7RATIO / 103150 - .DW SN7RATIO / 104650 - .DW SN7RATIO / 106172 - .DW SN7RATIO / 107716 - .DW SN7RATIO / 109283 - .DW SN7RATIO / 110873 - .DW SN7RATIO / 112486 - .DW SN7RATIO / 114122 - .DW SN7RATIO / 115782 - .DW SN7RATIO / 117466 - .DW SN7RATIO / 119175 - .DW SN7RATIO / 120908 - .DW SN7RATIO / 122667 - .DW SN7RATIO / 124451 - .DW SN7RATIO / 126261 - .DW SN7RATIO / 128098 - .DW SN7RATIO / 129961 - .DW SN7RATIO / 131851 - .DW SN7RATIO / 133769 - .DW SN7RATIO / 135715 - .DW SN7RATIO / 137689 - .DW SN7RATIO / 139691 - .DW SN7RATIO / 141723 - .DW SN7RATIO / 143784 - .DW SN7RATIO / 145876 - .DW SN7RATIO / 147998 - .DW SN7RATIO / 150151 - .DW SN7RATIO / 152335 - .DW SN7RATIO / 154550 - .DW SN7RATIO / 156798 - .DW SN7RATIO / 159079 - .DW SN7RATIO / 161393 - .DW SN7RATIO / 163740 - .DW SN7RATIO / 166122 - .DW SN7RATIO / 168538 - .DW SN7RATIO / 170990 - .DW SN7RATIO / 173477 - .DW SN7RATIO / 176000 - .DW SN7RATIO / 178560 - .DW SN7RATIO / 181157 - .DW SN7RATIO / 183792 - .DW SN7RATIO / 186466 - .DW SN7RATIO / 189178 - .DW SN7RATIO / 191930 - .DW SN7RATIO / 194722 - .DW SN7RATIO / 197553 - .DW SN7RATIO / 200426 - .DW SN7RATIO / 203342 - .DW SN7RATIO / 206299 - .DW C7 ; 209300 + .DW SN7RATIO / 2913 + .DW SN7RATIO / 2956 + .DW SN7RATIO / 2999 + .DW SN7RATIO / 3042 + .DW SN7RATIO / 3086 + .DW SN7RATIO / 3131 + .DW SN7RATIO / 3177 + .DW SN7RATIO / 3223 + .DW SN7RATIO / 3270 + .DW SN7RATIO / 3318 + .DW SN7RATIO / 3366 + .DW SN7RATIO / 3415 + .DW SN7RATIO / 3464 + .DW SN7RATIO / 3515 + .DW SN7RATIO / 3566 + .DW SN7RATIO / 3618 + .DW SN7RATIO / 3670 + .DW SN7RATIO / 3724 + .DW SN7RATIO / 3778 + .DW SN7RATIO / 3833 + .DW SN7RATIO / 3889 + .DW SN7RATIO / 3945 + .DW SN7RATIO / 4003 + .DW SN7RATIO / 4061 + .DW SN7RATIO / 4120 + .DW SN7RATIO / 4180 + .DW SN7RATIO / 4241 + .DW SN7RATIO / 4302 + .DW SN7RATIO / 4365 + .DW SN7RATIO / 4428 + .DW SN7RATIO / 4493 + .DW SN7RATIO / 4558 + .DW SN7RATIO / 4624 + .DW SN7RATIO / 4692 + .DW SN7RATIO / 4760 + .DW SN7RATIO / 4829 + .DW SN7RATIO / 4899 + .DW SN7RATIO / 4971 + .DW SN7RATIO / 5043 + .DW SN7RATIO / 5116 + .DW SN7RATIO / 5191 + .DW SN7RATIO / 5266 + .DW SN7RATIO / 5343 + .DW SN7RATIO / 5421 + .DW SN7RATIO / 5499 + .DW SN7RATIO / 5579 + .DW SN7RATIO / 5661 + .DW SN7RATIO / 5743 SIZ_SN7NOTETBL .EQU $ - SN7NOTETBL .ECHO "SN76489 approx "