From 75c25c813db95fc0f7d6e0261e5a75a7e6575cb2 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 9 May 2020 09:14:53 +0800 Subject: [PATCH] ay-3-8910 updates Implement full BBC Micro note table Note table now calculated at assembly based on selected frequency. Code optimization --- Source/HBIOS/ay38910.asm | 409 ++++++++++++++++++++++++++------------- Source/HBIOS/sn76489.asm | 4 +- 2 files changed, 275 insertions(+), 138 deletions(-) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index c4bb8d48..8dfc7843 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -69,11 +69,12 @@ SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS ; -;AY_PHICLK .EQU 3579500 ; MSX NTSC COLOUR BURST FREQ = 315/88 +AY_PHICLK .EQU 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88 ;AY_PHICLK .EQU 3500000 ; ZX SPECTRUM 3.5MHZ ;AY_PHICLK .EQU 4000000 ; RETROBREW SCB-SCG -;AY_CLKDIV .EQU 2 -;AY_CLK .EQU AY_PHICLK / AY_CLKDIV +AY_CLKDIV .EQU 2 +AY_CLK .EQU AY_PHICLK / AY_CLKDIV +AY_RATIO .EQU AY_CLK * 100 / 16 ; #INCLUDE "audio.inc" ; @@ -97,8 +98,7 @@ AY38910_INIT: OUT (AY_ACR),A ; SET INIT AUX CONTROL REG #ENDIF ; - LD D,AY_R2CHBP ; SIMPLE HARDWARE PROBE - LD E,$55 + LD DE,(AY_R2CHBP*256)+$55 ; SIMPLE HARDWARE PROBE CALL AY_WRTPSG ; WRITE AND CALL AY_RDPSG ; READ TO A LD A,$55 ; SOUND CHANNEL @@ -120,11 +120,9 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE LD E,$07 ; SET VOLUME TO 50% CALL AY_SETV ; ON ALL CHANNELS ; -; LD D,AY_R2CHBP ; BEEP ON CHANNEL B (CENTER) -; LD E,$55 +; LD DE,(AY_R2CHBP*256)+$55 ; BEEP ON CHANNEL B (CENTER) ; CALL AY_WRTPSG ; R02 = $55 = 01010101 - LD D,AY_R3CHBP - LD E,$00 + LD DE,(AY_R3CHBP*256)+$00 CALL AY_WRTPSG ; R03 = $00 = XXXX0000 ; CALL LDELAY ; HALF SECOND DELAY @@ -140,8 +138,7 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE ;====================================================================== ; AY_INIT: - LD D,AY_R7ENAB ; SET MIXER CONTROL / IO ENABLE - LD E,$F8 ; $F8 - 11 111 000 + LD DE,(AY_R7ENAB*256)+$F8 ; SET MIXER CONTROL / IO ENABLE. $F8 - 11 111 000 CALL AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE RET ; @@ -236,12 +233,12 @@ AY_NOTE: LD H,0 ADD HL, HL ; SHIFT RIGHT (MULT 2) -INDEX INTO AY3NOTETBL TABLE OF WORDS ; ; TEST IF HL IS LARGER THAN AY3NOTETBL SIZE - OR A ; CLEAR CARRY FLAG +; OR A ; CLEAR CARRY FLAG LD DE, SIZ_AY3NOTETBL - SBC HL, DE - JR NC, AY_NOTE1 ; INCOMING HL DOES NOT MAP INTO AY3NOTETBL +; SBC HL, DE +; JR NC, AY_NOTE1 ; INCOMING HL DOES NOT MAP INTO AY3NOTETBL ; - ADD HL, DE ; RESTORE HL +; ADD HL, DE ; RESTORE HL LD DE, AY3NOTETBL ; HL = AY3NOTETBL + HL ADD HL, DE ; @@ -464,133 +461,273 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $" #ENDIF ; ;====================================================================== -; FREQUENCY TONE TABLE (SEMITONE CURRENTLY) +; BBC MICRO QUARTER TONE FREQUENCY TABLE ;====================================================================== ; -; MSX TABLE PERIOD OCTAVE NOTE MIDI# -; AY3NOTETBL: -; .DW 6842 ;0 12 -; .DW 6458 ;0 13 -; .DW 6096 ;0 14 -; .DW 5751 ;0 15 -; .DW 5430 ;0 16 -; .DW 5124 ;0 17 -; .DW 4838 ;0 18 -; .DW 4566 ;0 19 -; .DW 4309 ;0 20 - .DW 4068 ;0 A0 21 - .DW 3839 ;0 22 - .DW 3624 ;0 23 - .DW 3421 ;1 24 - .DW 3228 ;1 25 - .DW 3047 ;1 26 - .DW 2876 ;1 27 - .DW 2715 ;1 28 - .DW 2563 ;1 29 - .DW 2419 ;1 30 - .DW 2283 ;1 31 - .DW 2155 ;1 32 - .DW 2034 ;1 33 - .DW 1920 ;1 34 - .DW 1812 ;1 35 - .DW 1710 ;2 36 - .DW 1614 ;2 37 - .DW 1524 ;2 38 - .DW 1438 ;2 39 - .DW 1357 ;2 40 - .DW 1281 ;2 41 - .DW 1209 ;2 42 - .DW 1141 ;2 43 - .DW 1077 ;2 44 - .DW 1017 ;2 45 - .DW 960 ;2 46 - .DW 906 ;2 47 - .DW 855 ;3 48 - .DW 807 ;3 49 - .DW 762 ;3 50 - .DW 719 ;3 51 - .DW 679 ;3 52 - .DW 641 ;3 53 - .DW 605 ;3 54 - .DW 571 ;3 55 - .DW 539 ;3 56 - .DW 508 ;3 57 - .DW 480 ;3 58 - .DW 453 ;3 59 - .DW 428 ;4 60 - .DW 404 ;4 61 - .DW 381 ;4 62 - .DW 360 ;4 63 - .DW 339 ;4 64 - .DW 320 ;4 65 - .DW 302 ;4 66 - .DW 285 ;4 67 - .DW 269 ;4 68 - .DW 254 ;4 69 - .DW 240 ;4 70 - .DW 226 ;4 71 - .DW 214 ;5 72 - .DW 202 ;5 73 - .DW 190 ;5 74 - .DW 180 ;5 75 - .DW 170 ;5 76 - .DW 160 ;5 77 - .DW 151 ;5 78 - .DW 143 ;5 79 - .DW 135 ;5 80 - .DW 127 ;5 81 - .DW 120 ;5 82 - .DW 113 ;5 83 - .DW 107 ;6 84 - .DW 101 ;6 85 - .DW 95 ;6 86 - .DW 90 ;6 87 - .DW 85 ;6 88 - .DW 80 ;6 89 - .DW 76 ;6 90 - .DW 71 ;6 91 - .DW 67 ;6 92 - .DW 64 ;6 93 - .DW 60 ;6 94 - .DW 57 ;6 95 - .DW 53 ;7 96 - .DW 50 ;7 97 - .DW 48 ;7 98 - .DW 45 ;7 99 - .DW 42 ;7 100 - .DW 40 ;7 101 - .DW 38 ;7 102 - .DW 36 ;7 103 - .DW 34 ;7 104 - .DW 32 ;7 105 - .DW 30 ;7 106 - .DW 28 ;7 107 - .DW 27 ;8 108 - .DW 25 ;8 109 - .DW 24 ;8 110 - .DW 22 ;8 111 - .DW 21 ;8 112 - .DW 20 ;8 113 - .DW 19 ;8 114 - .DW 18 ;8 115 - .DW 17 ;8 116 - .DW 16 ;8 117 - .DW 15 ;8 118 - .DW 14 ;8 119 - .DW 13 ;9 120 - .DW 13 ;9 121 - .DW 12 ;9 122 - .DW 11 ;9 123 - .DW 11 ;9 124 - .DW 10 ;9 125 - .DW 9 ;9 126 - .DW 9 ;9 127 - .DW 8 ;9 128 + .DW AY_RATIO / 5827 ; A#1 INDEX 0 = A#1 AS PER BBC MANUAL +; .DW AY_RATIO / 5912 +; .DW AY_RATIO / 5998 +; .DW AY_RATIO / 6085 + .DW AY_RATIO / 6174 ; B1 INDEX 1 = B1 AS PER BBC MANUAL + .DW AY_RATIO / 6263 + .DW AY_RATIO / 6354 + .DW AY_RATIO / 6447 + .DW AY_RATIO / 6541 ; C2 + .DW AY_RATIO / 6636 + .DW AY_RATIO / 6732 + .DW AY_RATIO / 6830 + .DW AY_RATIO / 6930 ; C#2 + .DW AY_RATIO / 7030 + .DW AY_RATIO / 7133 + .DW AY_RATIO / 7236 + .DW AY_RATIO / 7342 ; D2 + .DW AY_RATIO / 7448 + .DW AY_RATIO / 7557 + .DW AY_RATIO / 7667 + .DW AY_RATIO / 7778 ; D#2 + .DW AY_RATIO / 7891 + .DW AY_RATIO / 8006 + .DW AY_RATIO / 8123 + .DW AY_RATIO / 8241 ; E2 + .DW AY_RATIO / 8361 + .DW AY_RATIO / 8482 + .DW AY_RATIO / 8606 + .DW AY_RATIO / 8731 ; F2 + .DW AY_RATIO / 8858 + .DW AY_RATIO / 8987 + .DW AY_RATIO / 9117 + .DW AY_RATIO / 9250 ; F#2 + .DW AY_RATIO / 9384 + .DW AY_RATIO / 9521 + .DW AY_RATIO / 9659 + .DW AY_RATIO / 9800 ; G2 + .DW AY_RATIO / 9942 + .DW AY_RATIO / 10087 + .DW AY_RATIO / 10234 + .DW AY_RATIO / 10383 ; G#2 + .DW AY_RATIO / 10534 + .DW AY_RATIO / 10687 + .DW AY_RATIO / 10842 + .DW AY_RATIO / 11000 ; A2 + .DW AY_RATIO / 11160 + .DW AY_RATIO / 11322 + .DW AY_RATIO / 11487 + .DW AY_RATIO / 11654 ; A#2 + .DW AY_RATIO / 11824 + .DW AY_RATIO / 11996 + .DW AY_RATIO / 12170 + .DW AY_RATIO / 12347 ; B2 + .DW AY_RATIO / 12527 + .DW AY_RATIO / 12709 + .DW AY_RATIO / 12894 + .DW AY_RATIO / 13081 ; C3 + .DW AY_RATIO / 13272 + .DW AY_RATIO / 13465 + .DW AY_RATIO / 13660 + .DW AY_RATIO / 13859 ; C#3 + .DW AY_RATIO / 14061 + .DW AY_RATIO / 14265 + .DW AY_RATIO / 14473 + .DW AY_RATIO / 14683 ; D3 + .DW AY_RATIO / 14897 + .DW AY_RATIO / 15113 + .DW AY_RATIO / 15333 + .DW AY_RATIO / 15556 ; D#3 + .DW AY_RATIO / 15783 + .DW AY_RATIO / 16012 + .DW AY_RATIO / 16245 + .DW AY_RATIO / 16481 ; E3 + .DW AY_RATIO / 16721 + .DW AY_RATIO / 16964 + .DW AY_RATIO / 17211 + .DW AY_RATIO / 17461 ; F3 + .DW AY_RATIO / 17715 + .DW AY_RATIO / 17973 + .DW AY_RATIO / 18234 + .DW AY_RATIO / 18500 ; F#3 + .DW AY_RATIO / 18769 + .DW AY_RATIO / 19042 + .DW AY_RATIO / 19319 + .DW AY_RATIO / 19600 ; G3 + .DW AY_RATIO / 19885 + .DW AY_RATIO / 20174 + .DW AY_RATIO / 20468 + .DW AY_RATIO / 20765 ; G#3 + .DW AY_RATIO / 21067 + .DW AY_RATIO / 21374 + .DW AY_RATIO / 21685 + .DW AY_RATIO / 22000 ; A3 + .DW AY_RATIO / 22320 + .DW AY_RATIO / 22645 + .DW AY_RATIO / 22974 + .DW AY_RATIO / 23308 ; A#3 + .DW AY_RATIO / 23647 + .DW AY_RATIO / 23991 + .DW AY_RATIO / 24340 + .DW AY_RATIO / 24694 ; B3 + .DW AY_RATIO / 25053 + .DW AY_RATIO / 25418 + .DW AY_RATIO / 25787 + .DW AY_RATIO / 26163 ; C4 + .DW AY_RATIO / 26543 + .DW AY_RATIO / 26929 + .DW AY_RATIO / 27321 + .DW AY_RATIO / 27718 ; C#4 + .DW AY_RATIO / 28121 + .DW AY_RATIO / 28530 + .DW AY_RATIO / 28945 + .DW AY_RATIO / 29366 ; D4 + .DW AY_RATIO / 29794 + .DW AY_RATIO / 30227 + .DW AY_RATIO / 30667 + .DW AY_RATIO / 31113 ; D#4 + .DW AY_RATIO / 31565 + .DW AY_RATIO / 32024 + .DW AY_RATIO / 32490 + .DW AY_RATIO / 32963 ; E4 + .DW AY_RATIO / 33442 + .DW AY_RATIO / 33929 + .DW AY_RATIO / 34422 + .DW AY_RATIO / 34923 ; F4 + .DW AY_RATIO / 35431 + .DW AY_RATIO / 35946 + .DW AY_RATIO / 36469 + .DW AY_RATIO / 36999 ; F#4 + .DW AY_RATIO / 37538 + .DW AY_RATIO / 38084 + .DW AY_RATIO / 38638 + .DW AY_RATIO / 39200 ; G4 + .DW AY_RATIO / 39770 + .DW AY_RATIO / 40348 + .DW AY_RATIO / 40935 + .DW AY_RATIO / 41530 ; G#4 + .DW AY_RATIO / 42135 + .DW AY_RATIO / 42747 + .DW AY_RATIO / 43369 + .DW AY_RATIO / 44000 ; A4 + .DW AY_RATIO / 44640 + .DW AY_RATIO / 45289 + .DW AY_RATIO / 45948 + .DW AY_RATIO / 46616 ; A#4 + .DW AY_RATIO / 47294 + .DW AY_RATIO / 47982 + .DW AY_RATIO / 48680 + .DW AY_RATIO / 49388 ; B4 + .DW AY_RATIO / 50107 + .DW AY_RATIO / 50836 + .DW AY_RATIO / 51575 + .DW AY_RATIO / 52325 ; C5 + .DW AY_RATIO / 53086 + .DW AY_RATIO / 53858 + .DW AY_RATIO / 54642 + .DW AY_RATIO / 55437 ; C#5 + .DW AY_RATIO / 56243 + .DW AY_RATIO / 57061 + .DW AY_RATIO / 57891 + .DW AY_RATIO / 58733 ; D5 + .DW AY_RATIO / 59587 + .DW AY_RATIO / 60454 + .DW AY_RATIO / 61333 + .DW AY_RATIO / 62225 ; D#5 + .DW AY_RATIO / 63130 + .DW AY_RATIO / 64049 + .DW AY_RATIO / 64980 + .DW AY_RATIO / 65926 ; E5 + .DW AY_RATIO / 66884 + .DW AY_RATIO / 67857 + .DW AY_RATIO / 68844 + .DW AY_RATIO / 69846 ; F5 + .DW AY_RATIO / 70862 + .DW AY_RATIO / 71892 + .DW AY_RATIO / 72938 + .DW AY_RATIO / 73999 ; F#5 + .DW AY_RATIO / 75075 + .DW AY_RATIO / 76167 + .DW AY_RATIO / 77275 + .DW AY_RATIO / 78399 ; G5 + .DW AY_RATIO / 79539 + .DW AY_RATIO / 80696 + .DW AY_RATIO / 81870 + .DW AY_RATIO / 83061 ; G#5 + .DW AY_RATIO / 84269 + .DW AY_RATIO / 85495 + .DW AY_RATIO / 86738 + .DW AY_RATIO / 88000 ; # A5 + .DW AY_RATIO / 89280 + .DW AY_RATIO / 90579 + .DW AY_RATIO / 91896 + .DW AY_RATIO / 93233 ; A#5 + .DW AY_RATIO / 94589 + .DW AY_RATIO / 95965 + .DW AY_RATIO / 97361 + .DW AY_RATIO / 98777 ; B5 + .DW AY_RATIO / 100213 + .DW AY_RATIO / 101671 + .DW AY_RATIO / 103150 + .DW AY_RATIO / 104650 ; C6 + .DW AY_RATIO / 106172 + .DW AY_RATIO / 107717 + .DW AY_RATIO / 109283 + .DW AY_RATIO / 110873 ; C#6 + .DW AY_RATIO / 112486 + .DW AY_RATIO / 114122 + .DW AY_RATIO / 115782 + .DW AY_RATIO / 117466 ; D6 + .DW AY_RATIO / 119174 + .DW AY_RATIO / 120908 + .DW AY_RATIO / 122667 + .DW AY_RATIO / 124451 ; D#6 + .DW AY_RATIO / 126261 + .DW AY_RATIO / 128097 + .DW AY_RATIO / 129961 + .DW AY_RATIO / 131851 ; E6 + .DW AY_RATIO / 133769 + .DW AY_RATIO / 135715 + .DW AY_RATIO / 137689 + .DW AY_RATIO / 139691 ; F6 + .DW AY_RATIO / 141723 + .DW AY_RATIO / 143785 + .DW AY_RATIO / 145876 + .DW AY_RATIO / 147998 ; F#6 + .DW AY_RATIO / 150150 + .DW AY_RATIO / 152334 + .DW AY_RATIO / 154550 + .DW AY_RATIO / 156798 ; G6 + .DW AY_RATIO / 159079 + .DW AY_RATIO / 161393 + .DW AY_RATIO / 163740 + .DW AY_RATIO / 166122 ; G#6 + .DW AY_RATIO / 168538 + .DW AY_RATIO / 170990 + .DW AY_RATIO / 173477 + .DW AY_RATIO / 176000 ; A6 + .DW AY_RATIO / 178560 + .DW AY_RATIO / 181157 + .DW AY_RATIO / 183792 + .DW AY_RATIO / 186466 ; A#6 + .DW AY_RATIO / 189178 + .DW AY_RATIO / 191929 + .DW AY_RATIO / 194721 + .DW AY_RATIO / 197553 ; B6 + .DW AY_RATIO / 200427 + .DW AY_RATIO / 203342 + .DW AY_RATIO / 206300 + .DW AY_RATIO / 209300 ; C7 + .DW AY_RATIO / 212345 + .DW AY_RATIO / 215433 + .DW AY_RATIO / 218567 + .DW AY_RATIO / 221746 ; C#7 + .DW AY_RATIO / 224971 + .DW AY_RATIO / 228244 + .DW AY_RATIO / 231564 + .DW AY_RATIO / 234932 ; D7 + .DW AY_RATIO / 238349 + .DW AY_RATIO / 241816 SIZ_AY3NOTETBL .EQU $ - AY3NOTETBL .ECHO "AY-3-8910 approx " - .ECHO SIZ_AY3NOTETBL / 2 / 12 + .ECHO SIZ_AY3NOTETBL / 2 / 4 / 12 .ECHO " Octaves. Last note index supported: " .ECHO SIZ_AY3NOTETBL / 2 diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 524b253d..a59a5b1d 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -363,7 +363,7 @@ SNT_REGWR .DB "\r\nOUT SN76489, $" ; THE FREQUENCY BY QUARTER TONE STARTING AT A1# SN7NOTETBL: - .DW A1S + .DW A1S ; 5827 .DW SN7RATIO / 5912 .DW SN7RATIO / 5998 .DW SN7RATIO / 6085 @@ -611,7 +611,7 @@ SN7NOTETBL: .DW SN7RATIO / 200426 .DW SN7RATIO / 203342 .DW SN7RATIO / 206299 - .DW C7 + .DW C7 ; 209300 SIZ_SN7NOTETBL .EQU $ - SN7NOTETBL .ECHO "SN76489 approx "