Browse Source

Add Beep Function to Sound Driver Interface, Issue #402

work
Wayne Warthen 2 years ago
parent
commit
21b2eee7ab
  1. BIN
      Doc/RomWBW Applications.pdf
  2. BIN
      Doc/RomWBW Disk Catalog.pdf
  3. BIN
      Doc/RomWBW Errata.pdf
  4. BIN
      Doc/RomWBW System Guide.pdf
  5. BIN
      Doc/RomWBW User Guide.pdf
  6. 2
      ReadMe.md
  7. 2
      ReadMe.txt
  8. 13
      Source/Doc/SystemGuide.md
  9. 168
      Source/HBIOS/ay38910.asm
  10. 70
      Source/HBIOS/hbios.asm
  11. 1
      Source/HBIOS/hbios.inc
  12. 94
      Source/HBIOS/sn76489.asm
  13. 73
      Source/HBIOS/spk.asm
  14. 8
      Source/HBIOS/ym2612.asm
  15. 2
      Source/ver.inc
  16. 2
      Source/ver.lib

BIN
Doc/RomWBW Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW Disk Catalog.pdf

Binary file not shown.

BIN
Doc/RomWBW Errata.pdf

Binary file not shown.

BIN
Doc/RomWBW System Guide.pdf

Binary file not shown.

BIN
Doc/RomWBW User Guide.pdf

Binary file not shown.

2
ReadMe.md

@ -3,7 +3,7 @@
**RomWBW ReadMe** \
Version 3.5 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
08 Jul 2024
15 Jul 2024
# Overview

2
ReadMe.txt

@ -1,6 +1,6 @@
RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com)
08 Jul 2024
15 Jul 2024

13
Source/Doc/SystemGuide.md

@ -2015,7 +2015,7 @@ sound will play for the duration defined in HL and then return.
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x57 | A: Status |
| C: Disk Unit | C: Device Attributes |
| C: Sound Unit | C: Device Attributes |
| | D: Device Type |
| | E: Device Number |
| | H: Device Unit Mode |
@ -2038,6 +2038,17 @@ is servicing the specified unit. Both of these values are considered
driver specific. Refer to the associated hardware driver for the values
used.
### Function 0x58 -- Sound Beep (SNDBEEP)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x58 | A: Status |
| C: Sound Unit | |
Play a beep tone on the specified Sound Unit (C). The beep will
normally be about 1/3 second in duration and the tone will be
approximately B5.
`\clearpage`{=latex}
## System (SYS)

168
Source/HBIOS/ay38910.asm

@ -127,6 +127,7 @@ AY_FNTBL:
.DW AY_QUERY
.DW AY_DURATION
.DW AY_DEVICE
.DW AY_BEEP
;
#IF (($ - AY_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n"
@ -156,7 +157,6 @@ AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS
;
; ANNOUNCE DEVICE ON CONSOLE. ACTIVATE DEVICE IF REQUIRED.
; SETUP FUNCTION TABLES. SETUP THE DEVICE.
; ANNOUNCE DEVICE WITH BEEP. SET VOLUME OFF.
; RETURN INITIALIZATION STATUS
;
AY38910_INIT:
@ -221,77 +221,22 @@ AY38910_INIT:
LD A,$FF ; UNSUCCESSFULL INIT
RET
;
AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE
AY_FND:
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_INIT ; SET DEFAULT CHIP CONFIGURATION
;
LD E,$08 ; SET VOLUME TO 50%
CALL AY_SETV ; ON ALL CHANNELS
;
; LD DE,(AY_R2CHBP*256)+$55 ; BEEP ON CHANNEL B (CENTER)
; CALL AY_WRTPSG ; R02 = $55 = 01010101
LD DE,(AY_R3CHBP*256)+$00
CALL AY_WRTPSG ; R03 = $00 = XXXX0000
;
#IF (SYSTIM != TM_NONE)
LD A, TICKFREQ / 3 ; SCHEDULE IN 1/3 SECOND TO TURN OFF SOUND
LD (AY_TIMTIK), A
;
; RESET THE AY_TIMER BYPASS
LD HL,AY_TIMER1
LD (AY_TIMER + 1),HL
;
; HOOK THE TICK VECTOR
LD HL,(VEC_TICK + 1) ; GET CUR TICKS VECTOR
LD (AY_TIMHOOK + 1),HL ; SAVE IT INTERNALLY
LD HL,AY_TIMER ; INSTALL TIMER HOOK HANDLER
LD (VEC_TICK + 1),HL
;
LD A, $02 ; NOT READY & IN INTERUPT HANDLER
LD (AY_READY), A
#ELSE
CALL LDELAY ; HALF SECOND DELAY
LD E,$00 ; SET VOLUME OFF
CALL AY_SETV ; ON ALL CHANNELS
LD A, $01 ; READY & NOT IN INTERUPT HANDLER
LD (AY_READY), A
#ENDIF
;
CALL AY_RESET ; SET DEFAULT CHIP CONFIGURATION
XOR A ; SUCCESSFULL INIT
RET
;
#IF (SYSTIM != TM_NONE)
AY_TIMER:
JP AY_TIMER1 ; SELF MODIFIED TO BYPASS HANDLER
AY_TIMER1:
LD A,(AY_TIMTIK)
DEC A
LD (AY_TIMTIK), A
JR NZ,AY_TIMHOOK
;
LD E,$00 ; SET VOLUME OFF
CALL AY_SETV ; ON ALL CHANNELS
LD A, $01 ; READY & NOT IN INTERUPT HANDLER
LD (AY_READY), A
;
; MAKE AY_TIMER A NO-OP HANDLER
LD HL,(AY_TIMHOOK + 1)
LD (AY_TIMER + 1),HL
;
AY_TIMHOOK:
JP 0 ; OVERWRITTEN WITH NEXT HANDLER
;
AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP
#ENDIF
;
;======================================================================
; INITIALIZE DEVICE
;======================================================================
;
AY_INIT:
; HANDLE R7 SPECIAL
#IF (AYMODE == AYMODE_NABU)
; I/O B=INPUT, I/O A=OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE
LD DE,(AY_R7ENAB*256)+$78 ; SET MIXER CONTROL / IO ENABLE. $78 - 01 111 000
@ -299,29 +244,21 @@ AY_INIT:
; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE
LD DE,(AY_R7ENAB*256)+$F8 ; SET MIXER CONTROL / IO ENABLE. $F8 - 11 111 000
#ENDIF
JP AY_WRTPSG
;
AY_CHKREDY:
LD A, (AY_READY)
BIT 0, A
RET NZ
POP HL ; REMOVE LAST RETURN ADDRESS
OR $FF
RET ; RETURN NZ
;
;======================================================================
; SET VOLUME ALL CHANNELS
;======================================================================
;
AY_SETV:
PUSH BC
LD B,AY_TONECNT ; NUMBER OF CHANNELS
LD D,AY_R8AVOL ; BASE REGISTER FOR VOLUME
AY_SV: CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS
INC D
DJNZ AY_SV
POP BC
CALL AY_WRTPSG ; SETUP R7
;
; THEN JUST SET ALL OTHER REGISTERS TO ZERO
LD E,0 ; VALUE ZERO
LD D,0 ; START W/ R0
LD B,7 ; DO 7 REGISTERS (R0-R6)
CALL AY_INIT1 ; DO IT
INC D ; SKIP R7
LD B,6 ; DO 6 MORE REGISTERS (R8-R13)
; FALL THRU TO DO IT
;
AY_INIT1:
CALL AY_WRTPSG ; WRITE REGISTER
INC D ; BUMP TO NEXT
DJNZ AY_INIT1 ; LOOP
RET
;
;======================================================================
@ -333,25 +270,15 @@ AY_SV: CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS
;
AY_RESET:
AUDTRACE(AYT_INIT)
CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY
;
PUSH DE
PUSH HL
CALL AY_INIT ; SET DEFAULT CHIP CONFIGURATION
;
AUDTRACE(AYT_VOLOFF)
LD E,0 ; SET VOLUME OFF
CALL AY_SETV ; ON ALL CHANNELS
;
; RESET DEFAULTS IN CASE OF AN IN-PLACE HBIOS RESTART
LD HL,0
LD (AY_PENDING_PERIOD),HL ; SET TONE PERIOD TO ZERO
LD (AY_PENDING_DURATION),HL; SET DURATION TO ZERO
XOR A ; SIGNAL SUCCESS
LD (AY_PENDING_VOLUME),A ; SET VOLUME TO ZERO
LD H,A
LD L,A
LD (AY_PENDING_PERIOD),HL ; SET TONE PERIOD TO ZERO
;
POP HL
POP DE
RET
RET ; DONE, A=0 ABOVE
;
;======================================================================
; SOUND DRIVER FUNCTION - VOLUME
@ -414,12 +341,14 @@ AY_PLAY:
AUDTRACE(AYT_PLAY)
AUDTRACE_D
AUDTRACE_CR
CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY
;
LD A, (AY_PENDING_PERIOD + 1) ; CHECK THE HIGH BYTE OF THE PERIOD
INC A
JR Z, AY_PLAY1 ; PERIOD IS TOO LARGE, UNABLE TO PLAY
JR NZ, AY_PLAY1 ; PERIOD IS OK, CONTINUE
OR $FF ; ELSE TOO LARGE, SIGNAL FAILURE
RET ; AND RETURN
;
AY_PLAY1:
PUSH HL
PUSH DE
LD A,D ; LIMIT CHANNEL 0-2
@ -432,7 +361,7 @@ AY_PLAY:
AUDTRACE_CR
;
LD HL,AY_PENDING_PERIOD ; WRITE THE LOWER
ld E,(HL) ; 8-BITS OF THE TONE PERIOD
LD E,(HL) ; 8-BITS OF THE TONE PERIOD
CALL AY_WRTPSG
INC D ; NEXT REGISTER
INC HL ; NEXT BYTE
@ -467,18 +396,6 @@ AY_PLAY:
XOR A ; SIGNAL SUCCESS
RET
;
AY_PLAY1:
PUSH DE ; TURN VOLUME OFF TO STOP PLAYING
LD A,D ; LIMIT CHANNEL 0-2
AND $3 ; AND INDEX TO THE
ADD A,AY_R8AVOL ; CHANNEL VOLUME
LD D,A ; REGISTER
LD E,0
CALL AY_WRTPSG ; SET VOL (E) IN CHANNEL REG (D)
POP DE
OR $FF ; SIGNAL FAILURE
RET
;
;======================================================================
; SOUND DRIVER FUNCTION - QUERY AND SUBFUNCTIONS
;======================================================================
@ -546,22 +463,11 @@ AY_DEVICE:
RET
;
;======================================================================
; NON-BLOCKING INTERRUPT CODE
; SOUND DRIVER FUNCTION - BEEP
;======================================================================
;
AY_DI:
LD A, (AY_READY)
BIT 1, A
RET NZ
HB_DI
RET
;
AY_EI:
LD A, (AY_READY)
BIT 1, A
RET NZ
HB_EI
RET
AY_BEEP:
JP SND_BEEP ; DEFER TO GENERIC CODE IN HBIOS
;
;======================================================================
;
@ -571,7 +477,6 @@ AY_EI:
;======================================================================
;
AY_WRTPSG:
CALL AY_DI
#IFDEF SBCV2004
LD A,(HB_RTCVAL) ; GET CURRENT RTC LATCH VALUE
OR %00001000 ; SBC-V2-004 CHANGE
@ -595,14 +500,13 @@ AY_WRTPSG:
LD A,(HB_RTCVAL) ; SBC-V2-004 CHANGE TO
OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF
JP AY_EI
RET
;
;======================================================================
;
; READ FROM REGISTER D AND RETURN WITH RESULT IN E
;
AY_RDPSG:
CALL AY_DI
#IFDEF SBCV2004
LD A,(HB_RTCVAL) ; GET CURRENT RTC LATCH VALUE
OR %00001000 ; SBC-V2-004 CHANGE
@ -626,15 +530,13 @@ AY_RDPSG:
LD A,(HB_RTCVAL) ; SBC-V2-004 CHANGE TO
OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF
JP AY_EI
RET
;
;======================================================================
;
AY_PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS) ; ORDER
AY_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS) ; SIGNIFICANT
AY_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS)
AY_READY .DB 0 ; BIT 0 -> NZ DRIVER IS READY TO RECEIVE PLAY COMMAND
; BIT 1 -> NZ EXECUTING WITHIN TIMER HANDLER = DO NOT DIS/ENABLE INT
;
#IF AUDIOTRACE
AYT_INIT .DB "\r\nAY_INIT\r\n$"

70
Source/HBIOS/hbios.asm

@ -3492,11 +3492,12 @@ DBG_NOTE:
;
#ENDIF
;
; DIAGNOSTIC ROUTINE TO PLAY A BEEP
;
#IFDEF TESTING
CALL SND_BEEP
#ENDIF
; MAKE A LITTLE NOISE...
LD B,BF_SNDBEEP ; HBIOS BEEP FUNCTION
LD C,0 ; SOUND UNIT 0
LD A,(SND_CNT) ; GET SOUND UNIT COUNT
OR A ; CHECK FOR ZERO
CALL NZ,HB_DISPATCH ; DO IT IF WE HAVE A SOUND UNIT
;
;--------------------------------------------------------------------------------------------------
; TRANSITION TO USER LAND
@ -3841,7 +3842,7 @@ HB_DISPATCH1:
JP C,DSKY_DISPATCH
CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER
JP C,VDA_DISPATCH
CP BF_SND + $08 ; $50-$58: SOUND DRIVERS
CP BF_SND + $10 ; $50-$5F: SOUND DRIVERS
JP C,SND_DISPATCH
CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0
JR C,HB_DISPERR ; ERROR IF LESS THAN BF_SYS
@ -4439,7 +4440,7 @@ SND_ADDENT:
; WORD DRIVER FUNCTION TABLE ADDRESS
; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS)
;
SND_FNCNT .EQU 8 ; NUMBER OF SND FUNCS (FOR RANGE CHECK)
SND_FNCNT .EQU 9 ; NUMBER OF SND FUNCS (FOR RANGE CHECK)
SND_MAX .EQU 5 ; UP TO 5 UNITS
SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES
;
@ -4452,47 +4453,48 @@ SND_TBL .FILL SND_SIZ,0 ; SPACE FOR ENTRIES
; SPEAKER BEEP ROUTINE
;--------------------------------------------------------------------------------------------------
;
;;; RELOCATE
;
; ROUTINE TO BEEP THE DEFAULT SOUND UNIT
; NEED TO CHECK FOR EXISTENCE OF SOUND UNIT
; ROUTINE TO BEEP A SOUND UNIT
; THE SOUND DRIVERS CAN DEFER THEIR BEEP FUNCTION TO THIS FUNCTION
; ON ENTRY, B = SOUND UNIT
; WHICH CHANNEL SHOULD BE USED? IS THERE A GOOD DEFAULT CHANNEL?
;
SND_BEEP:
; CHECK FOR AT LEAST 1 SOUND DEVICE
LD A,(SND_CNT) ; GET SOUND UNIT COUNT
OR A ; CHECK FOR ZERO
RET Z ; BAIL OUT IF NO SOUND UNITS
; PLAY A BEEP ON SOUND DEVICE UNIT 0
; RESET THE SOUND DEVICE TO START
LD B,$50 ; SOUND RESET FUNCTION
LD C,0 ; SOUND UNIT NUMBER
CALL SND_DISPATCH ; DO IT
CALL SND_BEEP_DISP ; DO IT
;
; SET VOLUME TO MAX
LD B,$51 ; VOLUME
LD C,0 ; SOUND UNIT NUMBER
LD L,$FF ; MAX
CALL SND_DISPATCH ; DO IT
CALL SND_BEEP_DISP ; DO IT
;
; SET NOTE TO PLAY
LD B,$53 ; SELECT NOTE
LD C,0 ; SOUND UNIT NUMBER
;LD HL,0 ; A0#
LD HL,244 ; B5 (CLOSE TO 1 KHZ)
CALL SND_DISPATCH ; DO IT
;LD B,$56 ; DURATION
;LD C,0 ; SOUND UNIT NUMBER
;LD HL,500 ; 1/2 SECOND
;CALL SND_DISPATCH ; DO IT
CALL SND_BEEP_DISP ; DO IT
;
; START PLAYING THE SOUND
LD B,$54 ; PLAY SOUND
LD C,0 ; SOUND UNIT NUMBER
LD D,0 ; CHANNEL 0
CALL SND_DISPATCH ; DO IT
LD DE,15625 ; PLAY FOR 1/4 SECOND
CALL SND_BEEP_DISP ; DO IT
;
; WAIT A BIT FOR SOUND TO PLAY
LD DE,23436 ; PLAY FOR 1/3 SECOND
CALL VDELAY ; WAIT WHILE TONE IS PLAYED
;CALL LDELAY ; LET SOUND PLAY 1/2 SECOND
;
LD B,$50 ; SOUND RESET FUNCTION
LD C,0 ; SOUND UNIT NUMBER
CALL SND_DISPATCH ; DO IT
CALL SND_BEEP_DISP ; DO IT
;
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
SND_BEEP_DISP:
; CALL SOUND DISPATCHER PRESERVING BC ACROSS CALL
PUSH BC
CALL SND_DISPATCH
POP BC
RET
;
;--------------------------------------------------------------------------------------------------
; SYSTEM FUNCTION DISPATCHER
;--------------------------------------------------------------------------------------------------

1
Source/HBIOS/hbios.inc

@ -74,6 +74,7 @@ BF_SNDPLAY .EQU BF_SND + 4 ; INITIATE THE REQUESTED SOUND COMMAND
BF_SNDQUERY .EQU BF_SND + 5 ; E IS SUBFUNCTION
BF_SNDDURATION .EQU BF_SND + 6 ; REQUEST DURATION HL MILLISECONDS
BF_SNDDEVICE .EQU BF_SND + 7 ; SOUND DEVICE INFO REQUEST
BF_SNDBEEP .EQU BF_SND + 8 ; PLAY A BEEP SOUND ON DEVICE
;
; BF_SNDQUERY SUBCOMMANDS
BF_SNDQ_STATUS .EQU 0

94
Source/HBIOS/sn76489.asm

@ -49,10 +49,6 @@ SN7_IDAT .EQU 0
SN7_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS
SN7_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS
SN7_CHCNT .EQU SN7_TONECNT + SN7_NOISECNT
CHANNEL_0_SILENT .EQU $9F
CHANNEL_1_SILENT .EQU $BF
CHANNEL_2_SILENT .EQU $DF
CHANNEL_3_SILENT .EQU $FF
;
#INCLUDE "audio.inc"
;
@ -78,52 +74,67 @@ SN76489_INIT:
LD A, SN76489_PORT_RIGHT
CALL PRTHEXBYTE
CALL SN7_VOLUME_OFF
CALL SN7_RESET
XOR A ; SIGNAL SUCCESS
RET
;
;======================================================================
; SN76489 DRIVER - SOUND ADAPTER (SND) FUNCTIONS
; INITIALIZE DEVICE
;======================================================================
;
SN7_RESET:
AUDTRACE(SNT_INIT)
CALL SN7_VOLUME_OFF
XOR A ; SIGNAL SUCCESS
RET
SN7_VOLUME_OFF:
AUDTRACE(SNT_VOLOFF)
SN7_INIT:
;
#IFDEF SBCV2004
LD A,(HB_RTCVAL)
OR %00001000 ; SBC-V2-004+ CHANGE
OUT (RTCIO),A ; TO HALF CLOCK SPEED
#ENDIF
LD A, CHANNEL_0_SILENT
OUT (SN76489_PORT_LEFT), A
OUT (SN76489_PORT_RIGHT), A
LD A, CHANNEL_1_SILENT
OUT (SN76489_PORT_LEFT), A
OUT (SN76489_PORT_RIGHT), A
LD A, CHANNEL_2_SILENT
OUT (SN76489_PORT_LEFT), A
OUT (SN76489_PORT_RIGHT), A
LD A, CHANNEL_3_SILENT
OUT (SN76489_PORT_LEFT), A
OUT (SN76489_PORT_RIGHT), A
;
LD HL,SN7_REG_INIT ; POINT TO REG INIT TBL
LD B,SN7_REG_CNT ; BYTES IN TABLE
SN7_INIT1
LD A,(HL)
INC HL ; BUMP FOR NEXT TIME
OUT (SN76489_PORT_LEFT), A ; WRITE LEFT PORT
OUT (SN76489_PORT_RIGHT), A ; WRITE RIGHT PORT
DJNZ SN7_INIT1 ; LOOP TILL DONE
;
#IFDEF SBCV2004
LD A,(HB_RTCVAL)
AND %11110111 ; SBC-V2-004+ CHANGE TO
OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF
;
RET
;
SN7_REG_INIT:
.DB $80,$00 ; TONE 1 FREQ (2 BYTES)
.DB $9F ; TONE 1 ATTENTUATION
.DB $A0,$00 ; TONE 2 FREQ (2 BYTES)
.DB $BF ; TONE 2 ATTENTUATION
.DB $C0,$00 ; TONE 3 FREQ (2 BYTES)
.DB $DF ; TONE 3 ATTENTUATION
.DB $E0 ; NOISE CONTROL
.DB $FF ; NOISE ATTENTUATION
SN7_REG_CNT .EQU $ - SN7_REG_INIT
;
;======================================================================
; SN76489 DRIVER - SOUND ADAPTER (SND) FUNCTIONS
;======================================================================
;
SN7_RESET:
AUDTRACE(SNT_INIT)
;
CALL SN7_INIT ; HARDWARE INIT
;
; RESET DEFAULTS IN CASE OF AN IN-PLACE HBIOS RESTART
LD HL,0
LD (SP_PENDING_PERIOD),HL
LD (SP_PENDING_DURATION),HL
XOR A
LD (SP_PENDING_VOLUME),A
;
XOR A
RET
; BIT MAPPING
@ -391,6 +402,9 @@ SN7_DEVICE:
XOR A
RET
SN7_BEEP:
JP SND_BEEP ; DEFER TO GENERIC CODE IN HBIOS
SN7_FNTBL:
.DW SN7_RESET
.DW SN7_VOLUME
@ -400,18 +414,16 @@ SN7_FNTBL:
.DW SN7_QUERY
.DW SN7_DURATION
.DW SN7_DEVICE
.DW SN7_BEEP
;
#IF (($ - SN7_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n"
!!!!!
#ENDIF
SN7_PENDING_PERIOD
.DW 0 ; PENDING PERIOD (10 BITS)
SN7_PENDING_VOLUME
.DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED)
SN7_PENDING_DURATION
.DW 0 ; PENDING DURATION (16 BITS)
SN7_PENDING_PERIOD .DW 0 ; PENDING PERIOD (10 BITS)
SN7_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED)
SN7_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS)
STR_MESSAGELT .DB "\r\nSN76489: LEFT IO=0x$"
STR_MESSAGERT .DB ", RIGHT IO=0x$"

73
Source/HBIOS/spk.asm

@ -13,14 +13,15 @@
; DRIVER FUNCTION TABLE AND INSTANCE DATA
;
SP_FNTBL:
.DW SP_STUB ; SP_RESET
.DW SP_STUB ; SP_VOLUME
.DW SP_RESET
.DW SP_VOLUME
.DW SP_PERIOD
.DW SP_NOTE
.DW SP_PLAY
.DW SP_QUERY
.DW SP_DURATION
.DW SP_DEVICE
.DW SP_BEEP
;
#IF (($ - SP_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n"
@ -37,8 +38,8 @@ SP_RTCIOMSK .EQU 00000100B
; FOR OTHER DRIVERS, THE PERIOD VALUE FOR THE TONE IS STORED AT PENDING_PERIOD
; FOR THE SPK DRIVER THE ADDRESS IN THE TONE TABLE IS STORED IN PENDING_PERIOD
;
SP_PENDING_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS)
SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS)
SP_PENDING_PERIOD .DW 0 ; PENDING PERIOD (16 BITS)
SP_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS)
SP_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS)
SP_TBLRDY .DB 0 ; IF != 0, NOTE TABLE IS READY
;
@ -60,17 +61,9 @@ SP_INIT:
PRTS("SPK: IO=0x$")
LD A,RTCIO
CALL PRTHEXBYTE
;
; RESET DEFAULTS IN CASE OF AN IN-PLACE HBIOS RESTART
LD HL,SP_NOTE_C8
LD (SP_PENDING_PERIOD),HL
LD A,$FF
LD (SP_PENDING_VOLUME),A
XOR A
LD (SP_PENDING_DURATION),A
;
;
CALL SP_SETTBL ; SETUP TONE TABLE
CALL SP_PLAY ; PLAY DEFAULT NOTE
CALL SP_RESET ; RESET PARAMETERS
;
XOR A
RET
@ -79,17 +72,24 @@ SP_INIT:
; SOUND DRIVER FUNCTION - RESET
;======================================================================
;
;SP_RESET:
; XOR A ; SUCCESSFULL RESET
; RET
SP_RESET:
; RESET DEFAULTS IN CASE OF AN IN-PLACE HBIOS RESTART
LD HL,0
LD (SP_PENDING_PERIOD),HL ; SET TONE PERIOD TO ZERO
LD (SP_PENDING_DURATION),HL; SET DURATION TO ZERO
XOR A ; SIGNAL SUCCESS
LD (SP_PENDING_VOLUME),A ; SET VOLUME TO ZERO
;
XOR A ; SUCCESSFULL RESET
RET
;
;======================================================================
; SOUND DRIVER FUNCTION - VOLUME
;======================================================================
;
;SP_VOLUME:
; XOR A ; SIGNAL SUCCESS
; RET
SP_VOLUME:
XOR A ; SIGNAL SUCCESS
RET
;
;======================================================================
; SOUND DRIVER FUNCTION - PERIOD
@ -97,7 +97,6 @@ SP_INIT:
;
SP_PERIOD:
LD (SP_PENDING_PERIOD), HL ; SAVE AND RETURN SUCCESSFUL
SP_STUB:
XOR A
RET
;
@ -362,16 +361,40 @@ SP_DEVICE:
RET
;
;======================================================================
; SOUND DRIVER FUNCTION - BEEP
;======================================================================
;
SP_BEEP:
LD HL,SP_NOTE_B5 ; B5 (CLOSE TO 1 KHZ)
LD (SP_PENDING_PERIOD),HL
;LD A,$FF
;LD (SP_PENDING_VOLUME),A
;XOR A
;LD (SP_PENDING_DURATION),A
;
CALL SP_PLAY ; PLAY DEFAULT NOTE
CALL SP_RESET ; RESET DRIVER
;
XOR A
RET
;
;======================================================================
;
; STANDARD ONE SECOND TONE TABLES AT 1MHZ.
; FOR SP_BEEPER ROUTINE, FIRST WORD LOADED INTO DE, SECOND INTO HL
; THE PARAMETER TO SP_TONESET IS (FREQ * 100)
; DE: FREQUENCY IN HZ
; HL: T-STATES PER HALF-CYCL E / 4 AT 1 MHZ CPU SPEED
; EX. MIDDLE C IS 261.63 HZ, 523.26 HALF CYCLES PER SECOND
; 1,000,000 / 523.26 / 4 = 477
; OR ALTERNATIVELY 12,500,000 / 26163 = 477
;
;======================================================================
;
#DEFINE SP_TONESET(SP_FREQ) .DW SP_FREQ/100, 12500000/SP_FREQ
;
SP_TUNTBL:
SP_TONESET(1635) ; C0
SP_TONESET(1635) ; C0 ; DE=16, HL=7645
SP_TONESET(1732) ; C
SP_TONESET(1835) ; D0
SP_TONESET(1945) ; D
@ -419,7 +442,7 @@ SP_TUNTBL:
SP_TONESET(22000) ; A3
SP_TONESET(23308) ; A
SP_TONESET(24694) ; B3
SP_TONESET(26163) ; C4
SP_TONESET(26163) ; C4 ; DE=261, HL=477
SP_TONESET(27718) ; C
SP_TONESET(29366) ; D4
SP_TONESET(31113) ; D
@ -442,6 +465,7 @@ SP_TUNTBL:
SP_TONESET(83061) ; G
SP_TONESET(88000) ; A5
SP_TONESET(93233) ; A
SP_NOTE_B5:
SP_TONESET(98777) ; B5
SP_TONESET(104650) ; C6
SP_TONESET(110873) ; C
@ -467,7 +491,6 @@ SP_TUNTBL:
SP_TONESET(352000) ; A7
SP_TONESET(372931) ; A
SP_TONESET(395107) ; B7
SP_NOTE_C8:
SP_TONESET(418601) ; C8
SP_TONESET(443492) ; C
SP_TONESET(469863) ; D8
@ -479,7 +502,7 @@ SP_NOTE_C8:
SP_TONESET(664488) ; G
SP_TONESET(704000) ; A8
SP_TONESET(745862) ; A
SP_TONESET(790213) ; B8
SP_TONESET(790213) ; B8 ; DE=7902, HL=15
;
SP_NOTCNT .EQU ($-SP_TUNTBL) / 4
;

8
Source/HBIOS/ym2612.asm

@ -55,6 +55,7 @@ YM_FNTBL: .DW YM_RESET
.DW YM_QUERY
.DW YM_DURATION
.DW YM_DEVICE
.DW YM_BEEP
;
#IF (($ - YM_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n"
@ -197,6 +198,13 @@ YM_DEVICE: LD D,SNDDEV_YM2612 ; D := DEVICE TYPE
RET
;
;------------------------------------------------------------------------------
; Sound driver function - BEEP
;------------------------------------------------------------------------------
;
YM_BEEP:
JP SND_BEEP ; DEFER TO GENERIC CODE IN HBIOS
;
;------------------------------------------------------------------------------
; Sound driver function - RESET
; Initialize device. Set volume off. Reset volume and tone variables.
;------------------------------------------------------------------------------

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 5
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "3.5.0-dev.55"
#DEFINE BIOSVER "3.5.0-dev.56"
#define rmj RMJ
#define rmn RMN
#define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 5
rup equ 0
rtp equ 0
biosver macro
db "3.5.0-dev.55"
db "3.5.0-dev.56"
endm

Loading…
Cancel
Save