From b2e129445206a7384704058e07c4e9850c02090f Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 20 Jun 2022 20:07:06 -0700 Subject: [PATCH] Correct AY38910 Off By 1 Octave Issue I think this update corrects a long-standing issue in which the AY38910 driver played notes off by one octave. --- Source/Doc/Architecture.md | 24 ++++----- Source/HBIOS/ay38910.asm | 99 +++++++++++++++++++------------------- Source/HBIOS/hbios.asm | 39 +++++++++++++++ Source/ver.inc | 2 +- Source/ver.lib | 2 +- 5 files changed, 103 insertions(+), 63 deletions(-) diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index ed9a33e5..25988625 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -1399,7 +1399,7 @@ If the driver is able to generate the requested note, a success (0) is returned, otherwise a non-zero error state will be returned. The sound chip resolution and its oscillator limit the range and -accuracy of the notes played. The typically range of the AY-3-8910 +accuracy of the notes played. The typical range of the AY-3-8910 is six octaves, Bb2/A#2-A7, where each value is a unique tone. Values above and below can still be played but each quarter tone step may not result in a note change. @@ -1409,18 +1409,18 @@ to the corresponding octave and note. | Note | Oct 0 | Oct 1 | Oct 2 | Oct 3 | Oct 4 | Oct 5 | Oct 6 | Oct 7 | |:----- | -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -| Bb/A# | 0 | 48 | 96 | 144 | 192 | 240 | 288 | 336 | +| C | X | 8 | 56 | 104 | 152 | 200 | 248 | 296 | +| C#/Db | X | 12 | 60 | 108 | 156 | 204 | 252 | 300 | +| D | X | 16 | 64 | 112 | 160 | 208 | 256 | 304 | +| D#/Eb | X | 20 | 68 | 116 | 164 | 212 | 260 | 308 | +| E | X | 24 | 72 | 120 | 168 | 216 | 264 | 312 | +| F | X | 28 | 76 | 124 | 172 | 220 | 268 | 316 | +| F#/Gb | X | 32 | 80 | 128 | 176 | 224 | 272 | 320 | +| G | X | 36 | 84 | 132 | 180 | 228 | 276 | 324 | +| G#/Ab | X | 40 | 88 | 136 | 184 | 232 | 280 | 328 | +| A | X | 44 | 92 | 140 | 188 | 236 | 284 | 332 | +| A#/Bb | 0 | 48 | 96 | 144 | 192 | 240 | 288 | 336 | | B | 4 | 52 | 100 | 148 | 196 | 244 | 292 | 340 | -| C | 8 | 56 | 104 | 152 | 200 | 248 | 296 | 344 | -| C#/Db | 12 | 60 | 108 | 156 | 204 | 252 | 300 | 348 | -| D | 16 | 64 | 112 | 160 | 208 | 256 | 304 | 352 | -| Eb/D# | 20 | 68 | 116 | 164 | 212 | 260 | 308 | 356 | -| E | 24 | 72 | 120 | 168 | 216 | 264 | 312 | 360 | -| F | 28 | 76 | 124 | 172 | 220 | 268 | 316 | 364 | -| F#/Gb | 32 | 80 | 128 | 176 | 224 | 272 | 320 | 368 | -| G | 36 | 84 | 132 | 180 | 228 | 276 | 324 | 372 | -| Ab/G# | 40 | 88 | 136 | 184 | 232 | 280 | 328 | 376 | -| A | 44 | 92 | 140 | 188 | 236 | 284 | 332 | 380 | ### Function 0x54 -- Sound Play (SNDPLAY) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 1d596dbd..c591e3b8 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -327,7 +327,8 @@ AY_NOTE: LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE LD L, A ; - LD A,AY_SCALE-1 ; THE NOTE TABLE PERIOD DATA HAS BEEN + ;LD A,AY_SCALE - 1 ; THE NOTE TABLE PERIOD DATA HAS BEEN + LD A,AY_SCALE ; THE NOTE TABLE PERIOD DATA HAS BEEN ADD A,C ; PRESCALED TO MAINTAIN RANGE SO ALLOW LD B,A ; FOR THIS WHEN CHANGING OCTAVE AY_NOTE1: @@ -617,51 +618,51 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $" ; ASSUMING A CLOCK OF 1843200 THIS MAPS TO A0# ; AY3NOTETBL: - .DW AY_RATIO / 2913 - .DW AY_RATIO / 2956 - .DW AY_RATIO / 2999 - .DW AY_RATIO / 3042 - .DW AY_RATIO / 3086 - .DW AY_RATIO / 3131 - .DW AY_RATIO / 3177 - .DW AY_RATIO / 3223 - .DW AY_RATIO / 3270 - .DW AY_RATIO / 3318 - .DW AY_RATIO / 3366 - .DW AY_RATIO / 3415 - .DW AY_RATIO / 3464 - .DW AY_RATIO / 3515 - .DW AY_RATIO / 3566 - .DW AY_RATIO / 3618 - .DW AY_RATIO / 3670 - .DW AY_RATIO / 3724 - .DW AY_RATIO / 3778 - .DW AY_RATIO / 3833 - .DW AY_RATIO / 3889 - .DW AY_RATIO / 3945 - .DW AY_RATIO / 4003 - .DW AY_RATIO / 4061 - .DW AY_RATIO / 4120 - .DW AY_RATIO / 4180 - .DW AY_RATIO / 4241 - .DW AY_RATIO / 4302 - .DW AY_RATIO / 4365 - .DW AY_RATIO / 4428 - .DW AY_RATIO / 4493 - .DW AY_RATIO / 4558 - .DW AY_RATIO / 4624 - .DW AY_RATIO / 4692 - .DW AY_RATIO / 4760 - .DW AY_RATIO / 4829 - .DW AY_RATIO / 4899 - .DW AY_RATIO / 4971 - .DW AY_RATIO / 5043 - .DW AY_RATIO / 5116 - .DW AY_RATIO / 5191 - .DW AY_RATIO / 5266 - .DW AY_RATIO / 5343 - .DW AY_RATIO / 5421 - .DW AY_RATIO / 5499 - .DW AY_RATIO / 5579 - .DW AY_RATIO / 5661 - .DW AY_RATIO / 5743 + .DW AY_RATIO / 2913 ; A0#/B0b 178977250 / 2913 = 61440; PROOF: 61440 >> 3 = 7680, 3579545 / 7680 / 16 = 29.13 + .DW AY_RATIO / 2956 ; + .DW AY_RATIO / 2999 ; + .DW AY_RATIO / 3042 ; + .DW AY_RATIO / 3086 ; B0 + .DW AY_RATIO / 3131 ; + .DW AY_RATIO / 3177 ; + .DW AY_RATIO / 3223 ; + .DW AY_RATIO / 3270 ; C1 + .DW AY_RATIO / 3318 ; + .DW AY_RATIO / 3366 ; + .DW AY_RATIO / 3415 ; + .DW AY_RATIO / 3464 ; C1#/D1b + .DW AY_RATIO / 3515 ; + .DW AY_RATIO / 3566 ; + .DW AY_RATIO / 3618 ; + .DW AY_RATIO / 3670 ; D1 + .DW AY_RATIO / 3724 ; + .DW AY_RATIO / 3778 ; + .DW AY_RATIO / 3833 ; + .DW AY_RATIO / 3889 ; D1#/E1b + .DW AY_RATIO / 3945 ; + .DW AY_RATIO / 4003 ; + .DW AY_RATIO / 4061 ; + .DW AY_RATIO / 4120 ; E1 + .DW AY_RATIO / 4180 ; + .DW AY_RATIO / 4241 ; + .DW AY_RATIO / 4302 ; + .DW AY_RATIO / 4365 ; F1 + .DW AY_RATIO / 4428 ; + .DW AY_RATIO / 4493 ; + .DW AY_RATIO / 4558 ; + .DW AY_RATIO / 4624 ; F1#/G1b + .DW AY_RATIO / 4692 ; + .DW AY_RATIO / 4760 ; + .DW AY_RATIO / 4829 ; + .DW AY_RATIO / 4899 ; G1 + .DW AY_RATIO / 4971 ; + .DW AY_RATIO / 5043 ; + .DW AY_RATIO / 5116 ; + .DW AY_RATIO / 5191 ; G1#/A1b + .DW AY_RATIO / 5266 ; + .DW AY_RATIO / 5343 ; + .DW AY_RATIO / 5421 ; + .DW AY_RATIO / 5499 ; A1 + .DW AY_RATIO / 5579 ; + .DW AY_RATIO / 5661 ; + .DW AY_RATIO / 5743 ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index c3dc3a0c..ebec4a4d 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2826,6 +2826,45 @@ INITSYS4: LDCTL (C),HL #ENDIF ; +#IFDEF TESTING +; +; ROUTINE TO BEEP THE DEAULT SOUND UNIT (NOT FINISHED) +; NEED TO CHECK FOR EXISTENCE OF SOUND UNIT 0 +; NEED TO TEST AGAINST ALL SOUND DRIVERS +; CAN SPEAKER DRIVER BE MODIFIED TO PLAY ARBITRARY DURATION? +; WHICH CHANNEL SHOULD BE USED? IS THERE A GOOD DEFAULT CHANNEL? +; +SNDUNIT .EQU 0 +; +HB_BEEP: + LD B,$50 ; SOUND RESET FUNCTION + LD C,SNDUNIT ; SOUND UNIT NUMBER + CALL SND_DISPATCH ; DO IT + LD B,$51 ; VOLUME + LD C,SNDUNIT ; SOUND UNIT NUMBER + LD L,$FF ; MAX + CALL SND_DISPATCH ; DO IT + LD B,$53 ; SELECT NOTE + LD C,SNDUNIT ; SOUND UNIT NUMBER + ;LD HL,0 ; A0# + LD HL,200 ; C4 + CALL SND_DISPATCH ; DO IT + ;LD B,$56 ; DURATION + ;LD C,SNDUNIT ; SOUND UNIT NUMBER + ;LD HL,500 ; 1/2 SECOND + ;CALL SND_DISPATCH ; DO IT + LD B,$54 ; PLAY SOUND + LD C,SNDUNIT ; SOUND UNIT NUMBER + LD D,1 ; CHANNEL 0 + CALL SND_DISPATCH ; DO IT + LD DE,15625 ; PLAY FOR 1/4 SECOND + CALL VDELAY + LD B,$50 ; SOUND RESET FUNCTION + LD C,SNDUNIT ; SOUND UNIT NUMBER + CALL SND_DISPATCH ; DO IT +; +#ENDIF +; #IFNDEF ROMBOOT ; ; COPY OS IMAGE: BID_USR: --> BID_USR:0 diff --git a/Source/ver.inc b/Source/ver.inc index db0222ef..c828db0f 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.173" +#DEFINE BIOSVER "3.1.1-pre.174" diff --git a/Source/ver.lib b/Source/ver.lib index ef0cffc3..74d6ea37 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.173" + db "3.1.1-pre.174" endm