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** \ **RomWBW ReadMe** \
Version 3.5 \ Version 3.5 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
08 Jul 2024
15 Jul 2024
# Overview # Overview

2
ReadMe.txt

@ -1,6 +1,6 @@
RomWBW ReadMe RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com) 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** | | **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------| |----------------------------------------|----------------------------------------|
| B: 0x57 | A: Status | | B: 0x57 | A: Status |
| C: Disk Unit | C: Device Attributes |
| C: Sound Unit | C: Device Attributes |
| | D: Device Type | | | D: Device Type |
| | E: Device Number | | | E: Device Number |
| | H: Device Unit Mode | | | 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 driver specific. Refer to the associated hardware driver for the values
used. 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} `\clearpage`{=latex}
## System (SYS) ## System (SYS)

168
Source/HBIOS/ay38910.asm

@ -127,6 +127,7 @@ AY_FNTBL:
.DW AY_QUERY .DW AY_QUERY
.DW AY_DURATION .DW AY_DURATION
.DW AY_DEVICE .DW AY_DEVICE
.DW AY_BEEP
; ;
#IF (($ - AY_FNTBL) != (SND_FNCNT * 2)) #IF (($ - AY_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n" .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. ; ANNOUNCE DEVICE ON CONSOLE. ACTIVATE DEVICE IF REQUIRED.
; SETUP FUNCTION TABLES. SETUP THE DEVICE. ; SETUP FUNCTION TABLES. SETUP THE DEVICE.
; ANNOUNCE DEVICE WITH BEEP. SET VOLUME OFF.
; RETURN INITIALIZATION STATUS ; RETURN INITIALIZATION STATUS
; ;
AY38910_INIT: AY38910_INIT:
@ -221,77 +221,22 @@ AY38910_INIT:
LD A,$FF ; UNSUCCESSFULL INIT LD A,$FF ; UNSUCCESSFULL INIT
RET 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 BC, AY_FNTBL ; POINTER TO INSTANCE DATA
LD DE, AY_IDAT ; BC := FUNCTION TABLE ADDRESS LD DE, AY_IDAT ; BC := FUNCTION TABLE ADDRESS
CALL SND_ADDENT ; DE := INSTANCE DATA PTR 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 XOR A ; SUCCESSFULL INIT
RET 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 ; INITIALIZE DEVICE
;====================================================================== ;======================================================================
; ;
AY_INIT: AY_INIT:
; HANDLE R7 SPECIAL
#IF (AYMODE == AYMODE_NABU) #IF (AYMODE == AYMODE_NABU)
; I/O B=INPUT, I/O A=OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE ; 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 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 ; 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 LD DE,(AY_R7ENAB*256)+$F8 ; SET MIXER CONTROL / IO ENABLE. $F8 - 11 111 000
#ENDIF #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 RET
; ;
;====================================================================== ;======================================================================
@ -333,25 +270,15 @@ AY_SV: CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS
; ;
AY_RESET: AY_RESET:
AUDTRACE(AYT_INIT) AUDTRACE(AYT_INIT)
CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY
;
PUSH DE
PUSH HL
CALL AY_INIT ; SET DEFAULT CHIP CONFIGURATION 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 XOR A ; SIGNAL SUCCESS
LD (AY_PENDING_VOLUME),A ; SET VOLUME TO ZERO 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 ; SOUND DRIVER FUNCTION - VOLUME
@ -414,12 +341,14 @@ AY_PLAY:
AUDTRACE(AYT_PLAY) AUDTRACE(AYT_PLAY)
AUDTRACE_D AUDTRACE_D
AUDTRACE_CR 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 LD A, (AY_PENDING_PERIOD + 1) ; CHECK THE HIGH BYTE OF THE PERIOD
INC A 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 HL
PUSH DE PUSH DE
LD A,D ; LIMIT CHANNEL 0-2 LD A,D ; LIMIT CHANNEL 0-2
@ -432,7 +361,7 @@ AY_PLAY:
AUDTRACE_CR AUDTRACE_CR
; ;
LD HL,AY_PENDING_PERIOD ; WRITE THE LOWER 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 CALL AY_WRTPSG
INC D ; NEXT REGISTER INC D ; NEXT REGISTER
INC HL ; NEXT BYTE INC HL ; NEXT BYTE
@ -467,18 +396,6 @@ AY_PLAY:
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET 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 ; SOUND DRIVER FUNCTION - QUERY AND SUBFUNCTIONS
;====================================================================== ;======================================================================
@ -546,22 +463,11 @@ AY_DEVICE:
RET 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: AY_WRTPSG:
CALL AY_DI
#IFDEF SBCV2004 #IFDEF SBCV2004
LD A,(HB_RTCVAL) ; GET CURRENT RTC LATCH VALUE LD A,(HB_RTCVAL) ; GET CURRENT RTC LATCH VALUE
OR %00001000 ; SBC-V2-004 CHANGE OR %00001000 ; SBC-V2-004 CHANGE
@ -595,14 +500,13 @@ AY_WRTPSG:
LD A,(HB_RTCVAL) ; SBC-V2-004 CHANGE TO LD A,(HB_RTCVAL) ; SBC-V2-004 CHANGE TO
OUT (RTCIO),A ; NORMAL CLOCK SPEED OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF #ENDIF
JP AY_EI
RET
; ;
;====================================================================== ;======================================================================
; ;
; READ FROM REGISTER D AND RETURN WITH RESULT IN E ; READ FROM REGISTER D AND RETURN WITH RESULT IN E
; ;
AY_RDPSG: AY_RDPSG:
CALL AY_DI
#IFDEF SBCV2004 #IFDEF SBCV2004
LD A,(HB_RTCVAL) ; GET CURRENT RTC LATCH VALUE LD A,(HB_RTCVAL) ; GET CURRENT RTC LATCH VALUE
OR %00001000 ; SBC-V2-004 CHANGE OR %00001000 ; SBC-V2-004 CHANGE
@ -626,15 +530,13 @@ AY_RDPSG:
LD A,(HB_RTCVAL) ; SBC-V2-004 CHANGE TO LD A,(HB_RTCVAL) ; SBC-V2-004 CHANGE TO
OUT (RTCIO),A ; NORMAL CLOCK SPEED OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF #ENDIF
JP AY_EI
RET
; ;
;====================================================================== ;======================================================================
; ;
AY_PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS) ; ORDER AY_PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS) ; ORDER
AY_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS) ; SIGNIFICANT AY_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS) ; SIGNIFICANT
AY_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS) 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 #IF AUDIOTRACE
AYT_INIT .DB "\r\nAY_INIT\r\n$" AYT_INIT .DB "\r\nAY_INIT\r\n$"

70
Source/HBIOS/hbios.asm

@ -3492,11 +3492,12 @@ DBG_NOTE:
; ;
#ENDIF #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 ; TRANSITION TO USER LAND
@ -3841,7 +3842,7 @@ HB_DISPATCH1:
JP C,DSKY_DISPATCH JP C,DSKY_DISPATCH
CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER
JP C,VDA_DISPATCH JP C,VDA_DISPATCH
CP BF_SND + $08 ; $50-$58: SOUND DRIVERS
CP BF_SND + $10 ; $50-$5F: SOUND DRIVERS
JP C,SND_DISPATCH JP C,SND_DISPATCH
CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0 CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0
JR C,HB_DISPERR ; ERROR IF LESS THAN BF_SYS JR C,HB_DISPERR ; ERROR IF LESS THAN BF_SYS
@ -4439,7 +4440,7 @@ SND_ADDENT:
; WORD DRIVER FUNCTION TABLE ADDRESS ; WORD DRIVER FUNCTION TABLE ADDRESS
; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA 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_MAX .EQU 5 ; UP TO 5 UNITS
SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES 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 ; 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? ; WHICH CHANNEL SHOULD BE USED? IS THERE A GOOD DEFAULT CHANNEL?
; ;
SND_BEEP: 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 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 B,$51 ; VOLUME
LD C,0 ; SOUND UNIT NUMBER
LD L,$FF ; MAX 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 B,$53 ; SELECT NOTE
LD C,0 ; SOUND UNIT NUMBER
;LD HL,0 ; A0#
LD HL,244 ; B5 (CLOSE TO 1 KHZ) 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 B,$54 ; PLAY SOUND
LD C,0 ; SOUND UNIT NUMBER
LD D,0 ; CHANNEL 0 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 VDELAY ; WAIT WHILE TONE IS PLAYED
;CALL LDELAY ; LET SOUND PLAY 1/2 SECOND
;
LD B,$50 ; SOUND RESET FUNCTION 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 RET ; DONE
; ;
SND_BEEP_DISP:
; CALL SOUND DISPATCHER PRESERVING BC ACROSS CALL
PUSH BC
CALL SND_DISPATCH
POP BC
RET
;
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
; SYSTEM FUNCTION DISPATCHER ; 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_SNDQUERY .EQU BF_SND + 5 ; E IS SUBFUNCTION
BF_SNDDURATION .EQU BF_SND + 6 ; REQUEST DURATION HL MILLISECONDS BF_SNDDURATION .EQU BF_SND + 6 ; REQUEST DURATION HL MILLISECONDS
BF_SNDDEVICE .EQU BF_SND + 7 ; SOUND DEVICE INFO REQUEST 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_SNDQUERY SUBCOMMANDS
BF_SNDQ_STATUS .EQU 0 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_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS
SN7_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS SN7_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS
SN7_CHCNT .EQU SN7_TONECNT + SN7_NOISECNT 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" #INCLUDE "audio.inc"
; ;
@ -78,52 +74,67 @@ SN76489_INIT:
LD A, SN76489_PORT_RIGHT LD A, SN76489_PORT_RIGHT
CALL PRTHEXBYTE CALL PRTHEXBYTE
CALL SN7_VOLUME_OFF
CALL SN7_RESET
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET 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 #IFDEF SBCV2004
LD A,(HB_RTCVAL) LD A,(HB_RTCVAL)
OR %00001000 ; SBC-V2-004+ CHANGE OR %00001000 ; SBC-V2-004+ CHANGE
OUT (RTCIO),A ; TO HALF CLOCK SPEED OUT (RTCIO),A ; TO HALF CLOCK SPEED
#ENDIF #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 #IFDEF SBCV2004
LD A,(HB_RTCVAL) LD A,(HB_RTCVAL)
AND %11110111 ; SBC-V2-004+ CHANGE TO AND %11110111 ; SBC-V2-004+ CHANGE TO
OUT (RTCIO),A ; NORMAL CLOCK SPEED OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF #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 RET
; BIT MAPPING ; BIT MAPPING
@ -391,6 +402,9 @@ SN7_DEVICE:
XOR A XOR A
RET RET
SN7_BEEP:
JP SND_BEEP ; DEFER TO GENERIC CODE IN HBIOS
SN7_FNTBL: SN7_FNTBL:
.DW SN7_RESET .DW SN7_RESET
.DW SN7_VOLUME .DW SN7_VOLUME
@ -400,18 +414,16 @@ SN7_FNTBL:
.DW SN7_QUERY .DW SN7_QUERY
.DW SN7_DURATION .DW SN7_DURATION
.DW SN7_DEVICE .DW SN7_DEVICE
.DW SN7_BEEP
; ;
#IF (($ - SN7_FNTBL) != (SND_FNCNT * 2)) #IF (($ - SN7_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n" .ECHO "*** INVALID SND FUNCTION TABLE ***\n"
!!!!! !!!!!
#ENDIF #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_MESSAGELT .DB "\r\nSN76489: LEFT IO=0x$"
STR_MESSAGERT .DB ", RIGHT IO=0x$" STR_MESSAGERT .DB ", RIGHT IO=0x$"

73
Source/HBIOS/spk.asm

@ -13,14 +13,15 @@
; DRIVER FUNCTION TABLE AND INSTANCE DATA ; DRIVER FUNCTION TABLE AND INSTANCE DATA
; ;
SP_FNTBL: SP_FNTBL:
.DW SP_STUB ; SP_RESET
.DW SP_STUB ; SP_VOLUME
.DW SP_RESET
.DW SP_VOLUME
.DW SP_PERIOD .DW SP_PERIOD
.DW SP_NOTE .DW SP_NOTE
.DW SP_PLAY .DW SP_PLAY
.DW SP_QUERY .DW SP_QUERY
.DW SP_DURATION .DW SP_DURATION
.DW SP_DEVICE .DW SP_DEVICE
.DW SP_BEEP
; ;
#IF (($ - SP_FNTBL) != (SND_FNCNT * 2)) #IF (($ - SP_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n" .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 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 ; 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_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS)
SP_TBLRDY .DB 0 ; IF != 0, NOTE TABLE IS READY SP_TBLRDY .DB 0 ; IF != 0, NOTE TABLE IS READY
; ;
@ -60,17 +61,9 @@ SP_INIT:
PRTS("SPK: IO=0x$") PRTS("SPK: IO=0x$")
LD A,RTCIO LD A,RTCIO
CALL PRTHEXBYTE 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_SETTBL ; SETUP TONE TABLE
CALL SP_PLAY ; PLAY DEFAULT NOTE
CALL SP_RESET ; RESET PARAMETERS
; ;
XOR A XOR A
RET RET
@ -79,17 +72,24 @@ SP_INIT:
; SOUND DRIVER FUNCTION - RESET ; 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 ; SOUND DRIVER FUNCTION - VOLUME
;====================================================================== ;======================================================================
; ;
;SP_VOLUME:
; XOR A ; SIGNAL SUCCESS
; RET
SP_VOLUME:
XOR A ; SIGNAL SUCCESS
RET
; ;
;====================================================================== ;======================================================================
; SOUND DRIVER FUNCTION - PERIOD ; SOUND DRIVER FUNCTION - PERIOD
@ -97,7 +97,6 @@ SP_INIT:
; ;
SP_PERIOD: SP_PERIOD:
LD (SP_PENDING_PERIOD), HL ; SAVE AND RETURN SUCCESSFUL LD (SP_PENDING_PERIOD), HL ; SAVE AND RETURN SUCCESSFUL
SP_STUB:
XOR A XOR A
RET RET
; ;
@ -362,16 +361,40 @@ SP_DEVICE:
RET 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. ; STANDARD ONE SECOND TONE TABLES AT 1MHZ.
; FOR SP_BEEPER ROUTINE, FIRST WORD LOADED INTO DE, SECOND INTO HL ; 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 #DEFINE SP_TONESET(SP_FREQ) .DW SP_FREQ/100, 12500000/SP_FREQ
; ;
SP_TUNTBL: SP_TUNTBL:
SP_TONESET(1635) ; C0
SP_TONESET(1635) ; C0 ; DE=16, HL=7645
SP_TONESET(1732) ; C SP_TONESET(1732) ; C
SP_TONESET(1835) ; D0 SP_TONESET(1835) ; D0
SP_TONESET(1945) ; D SP_TONESET(1945) ; D
@ -419,7 +442,7 @@ SP_TUNTBL:
SP_TONESET(22000) ; A3 SP_TONESET(22000) ; A3
SP_TONESET(23308) ; A SP_TONESET(23308) ; A
SP_TONESET(24694) ; B3 SP_TONESET(24694) ; B3
SP_TONESET(26163) ; C4
SP_TONESET(26163) ; C4 ; DE=261, HL=477
SP_TONESET(27718) ; C SP_TONESET(27718) ; C
SP_TONESET(29366) ; D4 SP_TONESET(29366) ; D4
SP_TONESET(31113) ; D SP_TONESET(31113) ; D
@ -442,6 +465,7 @@ SP_TUNTBL:
SP_TONESET(83061) ; G SP_TONESET(83061) ; G
SP_TONESET(88000) ; A5 SP_TONESET(88000) ; A5
SP_TONESET(93233) ; A SP_TONESET(93233) ; A
SP_NOTE_B5:
SP_TONESET(98777) ; B5 SP_TONESET(98777) ; B5
SP_TONESET(104650) ; C6 SP_TONESET(104650) ; C6
SP_TONESET(110873) ; C SP_TONESET(110873) ; C
@ -467,7 +491,6 @@ SP_TUNTBL:
SP_TONESET(352000) ; A7 SP_TONESET(352000) ; A7
SP_TONESET(372931) ; A SP_TONESET(372931) ; A
SP_TONESET(395107) ; B7 SP_TONESET(395107) ; B7
SP_NOTE_C8:
SP_TONESET(418601) ; C8 SP_TONESET(418601) ; C8
SP_TONESET(443492) ; C SP_TONESET(443492) ; C
SP_TONESET(469863) ; D8 SP_TONESET(469863) ; D8
@ -479,7 +502,7 @@ SP_NOTE_C8:
SP_TONESET(664488) ; G SP_TONESET(664488) ; G
SP_TONESET(704000) ; A8 SP_TONESET(704000) ; A8
SP_TONESET(745862) ; A SP_TONESET(745862) ; A
SP_TONESET(790213) ; B8
SP_TONESET(790213) ; B8 ; DE=7902, HL=15
; ;
SP_NOTCNT .EQU ($-SP_TUNTBL) / 4 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_QUERY
.DW YM_DURATION .DW YM_DURATION
.DW YM_DEVICE .DW YM_DEVICE
.DW YM_BEEP
; ;
#IF (($ - YM_FNTBL) != (SND_FNCNT * 2)) #IF (($ - YM_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n" .ECHO "*** INVALID SND FUNCTION TABLE ***\n"
@ -197,6 +198,13 @@ YM_DEVICE: LD D,SNDDEV_YM2612 ; D := DEVICE TYPE
RET RET
; ;
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; Sound driver function - BEEP
;------------------------------------------------------------------------------
;
YM_BEEP:
JP SND_BEEP ; DEFER TO GENERIC CODE IN HBIOS
;
;------------------------------------------------------------------------------
; Sound driver function - RESET ; Sound driver function - RESET
; Initialize device. Set volume off. Reset volume and tone variables. ; Initialize device. Set volume off. Reset volume and tone variables.
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------

2
Source/ver.inc

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

2
Source/ver.lib

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

Loading…
Cancel
Save