From 20ad992a7b925f0714e220d9b0bf61533ab5dd8a Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 2 May 2020 00:42:11 +0800 Subject: [PATCH] Initial ay-3-8910 driver --- Source/Doc/Architecture.md | 14 +- Source/HBIOS/Config/SBC_std_zpp.asm | 65 +++ Source/HBIOS/ay.asm | 10 +- Source/HBIOS/ay38910.asm | 660 ++++++++++++++++++++++++++++ Source/HBIOS/hbios.asm | 11 + Source/HBIOS/hbios.inc | 2 +- 6 files changed, 749 insertions(+), 13 deletions(-) create mode 100644 Source/HBIOS/Config/SBC_std_zpp.asm create mode 100644 Source/HBIOS/ay38910.asm diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index 8a7ecfc9..f7523d5e 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -1410,7 +1410,7 @@ the maximum supported value, and it corresponds to note C7. | _Entry Parameters_ | B: 0x54 | C: Audio Device Unit ID -| E: Channel +| D: Channel | _Returned Values_ | A: Status (0=OK, else error) @@ -1431,7 +1431,7 @@ HBIOS B=54 C=00 D=01 ; Play note on Channel 1 ### Function 0x55 -- Sound Query (SNDQUERY) | _Entry Parameters_ -| B: 0x54 +| B: 0x55 | C: Audio Device Unit ID | E: Subfunction @@ -1444,7 +1444,7 @@ key aspects of the specific Audio Device. #### SNDQUERY Subfunction 0x01 -- Get count of audio channels supported (SNDQ_CHCNT) | _Entry Parameters_ -| B: 0x54 +| B: 0x55 | E: 0x01 | _Returned Values_ @@ -1452,10 +1452,10 @@ key aspects of the specific Audio Device. | B: Count of standard tone channels | C: Count of noise tone channels -#### SNDQUERY Subfunction 0x01 -- Get current volume setting (SNDQ_VOL) +#### SNDQUERY Subfunction 0x02 -- Get current volume setting (SNDQ_VOL) | _Entry Parameters_ -| B: 0x54 +| B: 0x55 | E: 0x02 | _Returned Values_ @@ -1466,7 +1466,7 @@ key aspects of the specific Audio Device. #### SNDQUERY Subfunction 0x03 -- Get current period setting (SNDQ_PERIOD) | _Entry Parameters_ -| B: 0x54 +| B: 0x55 | E: 0x03 | _Returned Values_ @@ -1476,7 +1476,7 @@ key aspects of the specific Audio Device. #### SNDQUERY Subfunction 0x04 -- Get device details (SNDQ_DEV) | _Entry Parameters_ -| B: 0x54 +| B: 0x55 | E: 0x04 | _Returned Values_ diff --git a/Source/HBIOS/Config/SBC_std_zpp.asm b/Source/HBIOS/Config/SBC_std_zpp.asm new file mode 100644 index 00000000..88e22a66 --- /dev/null +++ b/Source/HBIOS/Config/SBC_std_zpp.asm @@ -0,0 +1,65 @@ +; +;================================================================================================== +; SBC STANDARD CONFIGURATION +;================================================================================================== +; +#include "cfg_sbc.asm" +; +CPUOSC .SET 10000000 ; CPU OSC FREQ IN MHZ +; +FDENABLE .SET TRUE ; TRUE FOR FLOPPY DEVICE SUPPORT +FDMODE .SET FDMODE_DIO3 ; FDMODE_DIO, FDMODE_DIDE, FDMODE_DIO3 +INTMODE .SET 2 ; 0=NONE, 1=INT MODE 1, 2=INT MODE 2 +; + +; +SDENABLE .SET FALSE ; TRUE FOR SD DEVICE SUPPORT +SDMODE .SET SDMODE_PPI ; SDMODE_JUHA, SDMODE_PPI, SDMODE_DSD +; +PRPENABLE .SET FALSE ; TRUE FOR PROPIO BOARD SUPPORT (VIDEO, KBD, & SD CARD) +; +VGAENABLE .SET FALSE ; TRUE FOR VGA BOARD VIDEO & KBD SUPPORT +VGASIZ .SET V80X25 ; DEFAULT VGA FORMAT IF ACTIVE +CVDUENABLE .SET FALSE ; TRUE FOR CVDU BOARD VIDEO & KBD SUPPORT +VDUENABLE .SET TRUE ; TRUE FOR VDU BOARD VIDEO & KBD SUPPORT +VDUSIZ .SET V80X24B ; DEFAULT VDU FORMAT IF ACTIVE +TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .SET TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +USELZSA2 .SET TRUE ; USE COMPRESSED FONTS. +; +CRTACT .SET FALSE ; TRUE TO ACTIVATE CRT AT STARTUP (BOOT ON CRT) + +PIO_4P .SET FALSE ; TRUE FOR ECB-4PIO PIO SUPPORT +PIO_ZP .SET FALSE ; TRUE FOR ECB-ZILOG PERIPHERALS BOARD +PPI_SBC .SET FALSE ; TRUE FOR SBC V2 8255 (IF NOT BEING USED FOR PPIDE) + +RFENABLE .SET TRUE ; TRUE FOR RAM FLOPPY SUPPORT +RFCNT .SET 2 ; NUMBER OF RAM FLOPPY UNITS (MAX IS 4) + +SIOENABLE .SET FALSE ; TRUE FOR ZILOG SIO SUPPORT + +SPKENABLE .SET TRUE ; TRUE FOR RTC LATCH IOBIT SOUND +AYENABLE .SET FALSE ; TRUE FOR AY PSG SOUND +AY38910ENABLE .EQU TRUE + +WBWDEBUG .SET FALSE + +UFENABLE .SET TRUE +FORCECON .SET 2 ; USB-FIFO + +BT_REC_TYPE .SET BT_REC_SBCRI ; SAFE MODE INPUT METHOD + +DSRTCCHG .SET TRUE ; DSRTC: FORCE BATTERY CHARGE ON (USE WITH CAUTION!!!) +BATCOND .SET TRUE + +CTCENABLE .SET TRUE ; ENABLE ZILOG CTC SUPPORT +CTCBASE .SET $B0 ; CTC BASE I/O ADDRESS + +UARTCASSPD .SET SER_600_8N1 ; ECB CASSETTE UART DEFAULT SPEED +;PPIDETRACE .SET 0 +PPIDECNT .SET 3 +DSKYENABLE .SET FALSE + +;BOOTTYPE .SET BT_AUTO +BOOT_TIMEOUT .SET 30 +;BOOT_DEFAULT .SET '8' \ No newline at end of file diff --git a/Source/HBIOS/ay.asm b/Source/HBIOS/ay.asm index 85d9b9e2..7deabcf0 100644 --- a/Source/HBIOS/ay.asm +++ b/Source/HBIOS/ay.asm @@ -90,7 +90,7 @@ AY_BEEP: CALL LDELAY ; HALF SECOND RET ; -; WRITE DATA E TO PSG REG A +; WRITE DATA E TO PSG REG D ; AY_WRTPSG: HB_DI @@ -100,10 +100,10 @@ AY_WRTPSG: OR %00110000 ; FORCE SLOW OPERATION (I/O W/S=3) OUT0 (Z180_DCNTL),A ; AND UPDATE DCNTL #ENDIF - LD A,D - OUT (AY_RSEL),A - LD A,E - OUT (AY_RDAT),A + LD A,D ; SELECT THE REGISTER WE + OUT (AY_RSEL),A ; WANT TO WRITE TO + LD A,E ; WRITE THE VALUE TO + OUT (AY_RDAT),A ; THE SELECTED REGISTER #IF (CPUFAM == CPU_Z180) POP AF ; GET SAVED DCNTL VALUE OUT0 (Z180_DCNTL),A ; AND RESTORE IT diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm new file mode 100644 index 00000000..13695c93 --- /dev/null +++ b/Source/HBIOS/ay38910.asm @@ -0,0 +1,660 @@ +;====================================================================== +; +; AY-3-8910 / YM2149 SOUND DRIVER +; +;====================================================================== +; +#IF (AYMODE == AYMODE_SCG) +AY_RSEL .EQU $9A +AY_RDAT .EQU $9B +AY_ACR .EQU $9C +#ENDIF +; +#IF (AYMODE == AYMODE_N8) +AY_RSEL .EQU $9C +AY_RDAT .EQU $9D +AY_ACR .EQU N8_DEFACR +#ENDIF +; +#IF (AYMODE == AYMODE_RCZ80) +AY_RSEL .EQU $D8 +AY_RDAT .EQU $D0 +#ENDIF +; +#IF (AYMODE == AYMODE_RCZ180) +AY_RSEL .EQU $68 +AY_RDAT .EQU $60 +#ENDIF +; +;====================================================================== +; +; REGISTERS +; +AY_R0CHAP .EQU $00 +AY_R1CHAP .EQU $01 +AY_R2CHBP .EQU $02 +AY_R3CHBP .EQU $03 +AY_R7ENAB .EQU $07 +AY_R8AVOL .EQU $08 +AY_R9BVOL .EQU $09 +; +;====================================================================== +; +; DRIVER FUNCTION TABLE AND INSTANCE DATA +; +AY_FNTBL: + .DW AY_RESET + .DW AY_VOLUME + .DW AY_PERIOD + .DW AY_NOTE + .DW AY_PLAY + .DW AY_QUERY + +#IF (($ - AY_FNTBL) != (SND_FNCNT * 2)) + .ECHO "*** INVALID SND FUNCTION TABLE ***\n" + !!!!! +#ENDIF +; +AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE +; +;====================================================================== +; +; DEVICE CAPABILITIES AND CONFIGURATION + +AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS +AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS +; +AY_CLKDIVIDER .EQU 2 +AY_CLK .EQU CPUOSC / AY_CLKDIVIDER +SN7RATIO .EQU AY_CLK * 100 / 32 + + +AY_FIRST_NOTE .EQU 5827 ; A1# +AY_LAST_NOTE .EQU 209300 ; C7 + +A1S .EQU SN7RATIO / AY_FIRST_NOTE +C7 .EQU SN7RATIO / AY_LAST_NOTE + + .ECHO "AY-3-8910: range of A1# (period: " + .ECHO A1S + .ECHO ") to C7 (period: " + .ECHO C7 + .ECHO ")\n" + +#INCLUDE "audio.inc" + +;====================================================================== +; +; DRIVER INITIALIZATION (THERE IS NO PRE-INITIALIZATION) +; +; ANNOUNCE DEVICE ON CONSOLE. ACTIVATE DEVICE IF REQUIRED. +; SETUP FUNCTION TABLES. SETUP THE DEVICE. +; ANNOUNCE DEVICE WITH BEEP. SET VOLUME OFF. +; RETURN SUCCESS STATUS +; +AY38910_INIT: + CALL NEWLINE ; ANNOUNCE + PRTS("AY: IO=0x$") + LD A,AY_RSEL + CALL PRTHEXBYTE +; +#IF ((AYMODE == AYMODE_SCG) | (AYMODE == AYMODE_N8)) + ; ACTIVATE DEVICE + LD A,$FF ; BIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED + OUT (AY_ACR),A ; SET INIT AUX CONTROL REG +#ENDIF +; + LD IY, AY_IDAT ; SETUP FUNCTION TABLE + LD BC, AY_FNTBL ; POINTER TO INSTANCE DATA + LD DE, AY_IDAT ; BC := FUNCTION TABLE ADDRESS + CALL SND_ADDENT ; DE := INSTANCE DATA PTR +; + CALL AY_RESET ; SET DEFAULT CHIP CONFIGURATION +; CALL AY_BEEP ; PLAY INITIALIZATION BEEP +; CALL AY_VOLUME_OFF ; MAKE QUIET +; + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - RESET +;====================================================================== +; +AY_RESET: + AUDTRACE(TRACE_INIT) +; + LD D,AY_R7ENAB ; SET MIXER CONTROL / IO ENABLE + LD E,$FF ; $FF - 11 111 111 + CALL AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A DISABLE + +; CALL AY_VOLUME_OFF ; TURN VOLUME OFF +; RET ; AND RETURN SUCCESS + +AY_VOLUME_OFF: + AUDTRACE(TRACE_VOLUME_OFF) + + LD B,AY_TONECNT ; NUMBER OF CHANNELS + LD D,AY_R8AVOL ; BASE REGISTER FOR VOLUME + LD E,$00 ; AMPLITUDE 0 +AY_V: + CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS + INC D + DJNZ AY_V +; + XOR A ; SIGNAL SUCCESS + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - VOLUME +;====================================================================== +; +AY_VOLUME: + AUDDEBUG("AY3VOL ") + AUDTRACE_L + AUDDEBUG("\r\n") + LD A,L ; SAVE VOLUME + LD (PENDING_VOLUME), A +; + XOR A ; SIGNAL SUCCESS + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - PERIOD +;====================================================================== +; +AY_PERIOD: + AUDDEBUG("AY3PRD ") + AUDTRACE_HL + AUDDEBUG("\r\n") + + INC HL ; MAXIMUM TONE PERIOD IS 12-BITS + LD A, H ; ALLOWED RANGE IS 0001-0FFF (4095) + CP $10 ; SO OFFSET AND CHECK OF OVERFLOW + JP NC, AY_QUERY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE + + LD (PENDING_PERIOD), HL ; SAVE AND + XOR A ; SIGNAL SUCCESS + RET + +AY_QUERY_PERIOD1: + LD L, $FF + LD H, L ; REQUESTED PERIOD IS LARGER + LD (PENDING_PERIOD), HL ; THAN THE DEVICE CAN SUPPORT + OR L ; SO SIGNAL FAILURE + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - NOTE +;====================================================================== +; +AY_NOTE: + AUDDEBUG("AY3NOT ") + AUDTRACE_L + AUDDEBUG("\r\n") + + 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 + LD DE, SIZ_AY3NOTETBL + SBC HL, DE + JR NC, AY_NOTE1 ; INCOMING HL DOES NOT MAP INTO AY3NOTETBL + + ADD HL, DE ; RESTORE HL + LD E, L ; HL = AY3NOTETBL + HL + LD D, H + LD HL, AY3NOTETBL + ADD HL, DE + + LD A, (HL) ; RETRIEVE PERIOD COUNT FROM AY3NOTETBL + INC HL + LD H, (HL) + LD L, A + + JR AY_PERIOD ; APPLY PERIOD + +AY_NOTE1: + OR $FF ; NOT IMPLEMENTED YET + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - PLAY +;====================================================================== +; +AY_PLAY: + AUDDEBUG("AY3PLY ") + AUDTRACE_D + AUDDEBUG("\r\n") +; + LD A, (PENDING_PERIOD + 1) ; CHECK THE HIGH BYTE OF THE PERIOD + CP $FF + JR Z, AY_PLAY1 ; PERIOD IS TOO LARGE, UNABLE TO PLAY + CALL AY_APPLY_VOL + CALL AY_APPLY_PRD +; + XOR A ; SIGNAL SUCCESS + RET +; +AY_PLAY1: ; TURN CHANNEL VOL TO OFF AND STOP PLAYING + LD A, (PENDING_VOLUME) + PUSH AF + XOR A + LD (PENDING_VOLUME), A + CALL AY_APPLY_VOL + POP AF + LD (PENDING_VOLUME), A +; + OR $FF ; SIGNAL FAILURE + RET +; +;====================================================================== +; SOUND DRIVER FUNCTION - QUERY AND SUBFUNCTIONS +;====================================================================== +; +AY_QUERY: + LD A, E + CP BF_SNDQ_CHCNT ; SUB FUNCTION 01 + JR Z, AY_QUERY_CHCNT +; + CP BF_SNDQ_VOLUME ; SUB FUNCTION 02 + JR Z, AY_QUERY_VOLUME +; + CP BF_SNDQ_PERIOD ; SUB FUNCTION 03 + JR Z, AY_QUERY_PERIOD +; + CP BF_SNDQ_DEV ; SUB FUNCTION 04 + JR Z, AY_QUERY_DEV +; + OR $FF ; SIGNAL FAILURE + RET +; +AY_QUERY_CHCNT: + LD B, AY_TONECNT ; RETURN NUMBER OF + LD C, AY_NOISECNT ; TONE AND NOISE + XOR A ; CHANNELS IN BC + RET +; +AY_QUERY_PERIOD: + LD HL, (PENDING_PERIOD) ; RETURN 16-BIT PERIOD + XOR A ; IN HL REGISTER + RET +; +AY_QUERY_VOLUME: + LD A, (PENDING_VOLUME) ; RETURN 8-BIT VOLUME + LD L, A ; IN L REGISTER + XOR A + LD H, A + RET +; +AY_QUERY_DEV: + LD B, BF_SND_AY38910 ; RETURN DEVICE IDENTIFIER + LD DE, (AY_RSEL*256)+AY_RDAT ; AND ADDRESS AND DATA PORT + XOR A + RET +; +;====================================================================== +; APPLY VOLUME TO CHANNEL IN D REGISTER +;====================================================================== +; +AY_APPLY_VOL: + PUSH DE + PUSH BC + PUSH AF +; + LD A,D ; LIMIT CHANNEL 0-2 + AND $3 ; AND INDEX TO THE + ADD A,AY_R8AVOL ; CHANNEL VOLUME + LD D,A ; REGISTER +; + AUDTRACE(TRACE_REG_WR) + AUDTRACE_A + AUDTRACE(TRACE_NEWLINE) +; + LD A, (PENDING_VOLUME) ; MAP THE VOLUME + RRCA ; FROM 00-FF + RRCA ; TO 00-0F + RRCA + RRCA + AND $0F + LD E,A +; + CALL AY_WRTPSG ; SET VOL (E) IN CHANNEL REG (D) +; + POP AF + POP BC + POP DE + RET +; +;====================================================================== +; APPLY PERIOD TO CHANNEL IN D REGISTER +;====================================================================== +; +AY_APPLY_PRD: + PUSH DE + PUSH BC + PUSH AF +; + LD A,D ; LIMIT CHANNEL 0-2 + AND $3 ; AND INDEX TO THE + ADD A,A ; CHANNEL REGISTER + LD D,A ; FOR THE TONE PERIOD +; + AUDTRACE(TRACE_REG_WR) + AUDTRACE_A + AUDTRACE(TRACE_NEWLINE) +; + LD HL,(PENDING_PERIOD) ; WRITE THE LOWER + LD E,L ; 8-BITS OF THE PERIOD + CALL AY_WRTPSG + INC D + LD E,H ; WRITE THE UPPER + CALL AY_WRTPSG ; 8-BITS OF THE PERIOD +; + + POP AF + POP BC + POP DE + RET +; +;====================================================================== +; +; WRITE DATA IN E REGISTER TO DEVICE REGISTER D +; INTERRUPTS DISABLE DURING WRITE. WRITE IN SLOW MODE IF Z180 CPU. +; +;====================================================================== +; +AY_WRTPSG: + HB_DI +#IF (CPUFAM == CPU_Z180) + IN0 A,(Z180_DCNTL) ; GET WAIT STATES + PUSH AF ; SAVE VALUE + OR %00110000 ; FORCE SLOW OPERATION (I/O W/S=3) + OUT0 (Z180_DCNTL),A ; AND UPDATE DCNTL +#ENDIF + LD A,D ; SELECT THE REGISTER WE + OUT (AY_RSEL),A ; WANT TO WRITE TO + LD A,E ; WRITE THE VALUE TO + OUT (AY_RDAT),A ; THE SELECTED REGISTER +#IF (CPUFAM == CPU_Z180) + POP AF ; GET SAVED DCNTL VALUE + OUT0 (Z180_DCNTL),A ; AND RESTORE IT +#ENDIF + HB_EI + RET +; +;====================================================================== +; +PENDING_PERIOD + .DW 0 ; PENDING PERIOD (10 BITS) +PENDING_VOLUME + .DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED) + +#IF AUDIOTRACE +TRACE_INIT .DB "\r\nAY_INIT CALLED\r\n$" +TRACE_VOLUME_OFF .DB "\r\nAY_VOLUME_OFF\r\n$" +TRACE_VOLUME_SET .DB "\r\nAY_VOLUME_SET CH: $" +TRACE_PLAY .DB "\r\nPLAY\r\n$" +TRACE_VOLUME .DB ", VOL: $" +TRACE_PORT_WR .DB "\r\nOUT AY-3-8910 $" +TRACE_PERIOD_SET .DB "\r\nAY_PERIOD_SET CH: $" +TRACE_PERIOD .DB ", PERIOD: $" +TRACE_NEWLINE .DB "\r\n$" +#ENDIF + +; THE FREQUENCY BY QUATER TONE STARTING AT A1# +AY3NOTETBL: + .DW A1S + .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 + +SIZ_AY3NOTETBL .EQU $ - AY3NOTETBL + .ECHO "SN76489 approx " + .ECHO SIZ_AY3NOTETBL / 2 / 4 /12 + .ECHO " Octaves. Last note index supported: " + + .ECHO SIZ_AY3NOTETBL / 2 + .ECHO "\n" diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 708b57ef..3e058bd1 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1677,6 +1677,9 @@ HB_INITTBL: #IF (SN76489ENABLE) .DW SN76489_INIT #ENDIF +#IF (AY38910ENABLE) + .DW AY38910_INIT +#ENDIF #IF (ASCIENABLE) .DW ASCI_INIT #ENDIF @@ -3352,6 +3355,14 @@ SIZ_SN76489 .EQU $ - ORG_SN76489 .ECHO SIZ_SN76489 .ECHO " bytes.\n" #ENDIF +#IF (AY38910ENABLE) +ORG_AY38910 .EQU $ + #INCLUDE "ay38910.asm" +SIZ_AY38910 .EQU $ - ORG_AY38910 + .ECHO "AY38910 occupies " + .ECHO SIZ_AY38910 + .ECHO " bytes.\n" +#ENDIF ; #DEFINE USEDELAY #INCLUDE "util.asm" diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index a0f22099..a07e8a27 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -72,7 +72,7 @@ BF_SNDQ_DEV .EQU BF_SNDQ_STATUS + 4 ; RETURN DEVICE TYPE CODE AND IO PORTS - TY BF_SNDDEV .EQU 0 ; TYPES OF SOUND DRIVERS BF_SND_SN76489 .EQU BF_SNDDEV + 1 -BF_SND_SNAY38910 .EQU BF_SNDDEV + 2 +BF_SND_AY38910 .EQU BF_SNDDEV + 2 ; BF_SYS .EQU $F0