Browse Source

Initial audio duration code

pull/134/head
b1ackmai1er 6 years ago
parent
commit
0bf6caa437
  1. 28
      Source/Doc/Architecture.md
  2. 25
      Source/HBIOS/ay38910.asm
  3. 2
      Source/HBIOS/hbios.asm
  4. 1
      Source/HBIOS/hbios.inc
  5. 11
      Source/HBIOS/sn76489.asm
  6. 23
      Source/HBIOS/spk.asm

28
Source/Doc/Architecture.md

@ -1438,11 +1438,11 @@ result in a note change.
The following table shows the mapping of the input value in HL
to the corresponding octave and note.
+-------------------------------------------------------+
+-------+---------------------------------------------------------------+
| | OCTAVE |
| Note |-----------------------------------------------+
| Note +---------------------------------------------------------------+
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|-------|-----|-----|-----|-----|-----|-----|-----|-----+
|-------+-------|-------|-------|-------|-------|-------|-------|-------+
| Bb/A# | 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 |
@ -1456,7 +1456,7 @@ to the corresponding octave and note.
| Ab/G# | 40 | 88 | 136 | 184 | 232 | 280 | 328 | 376 |
| A | 44 | 92 | 140 | 188 | 236 | 284 | 332 | 380 |
### Function 0x54 -- Sound Play (SNDPLAY)
### Function 0x54 -- Sound Play SNDPLAY)
| _Entry Parameters_
| B: 0x54
@ -1551,6 +1551,26 @@ SND_SN76489 | 0x01 | SN76489 | E: Left channel port, L: Right channel por
SND_AY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port
SND_BITMODE | 0x03 | I/O PORT | D: Address port, E: Bit mask
### Function 0x56 -- Sound Duration (SNDDUR)
| _Entry Parameters_
| B: 0x56
| C: Audio Device Unit ID
| HL: Duration
| _Returned Values_
| A: Status (0=OK, else error)
This function sets the duration of the note to be played in milliseconds.
If the duration is set to zero, then the play function will operate in a non-blocking
mode. i.e. a tone will start playing and the play function will return. The tone will
continue to play until the next tone is played. I/O PORT are not compatible and will
not play a note if the duration is zero.
For other values, when a tone is played, it will play for the duration defined in HL
and then return.
`\clearpage`{=latex}
System (SYS)

25
Source/HBIOS/ay38910.asm

@ -56,7 +56,8 @@ AY_FNTBL:
.DW AY_NOTE
.DW AY_PLAY
.DW AY_QUERY
.DW AY_DURATION
;
#IF (($ - AY_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n"
!!!!!
@ -432,6 +433,19 @@ AY_QUERY_DEV:
XOR A
RET
;
;======================================================================
; SOUND DRIVER FUNCTION - DURATION
;======================================================================
;
AY_DURATION:
LD (AY_PENDING_DURATION),HL ; SET TONE DURATION
XOR A
RET
;
;======================================================================
; NON-BLOCKING INTERRUPT CODE
;======================================================================
;
AY_DI:
LD A, (AY_READY)
BIT 1, A
@ -457,7 +471,7 @@ AY_WRTPSG:
CALL AY_DI
#IFDEF SBCV2004
LD A,8 ; SBC-V2-004 CHANGE
OUT (112),A ; TO HALF CLOCK SPEED
OUT (RTCIO),A ; TO HALF CLOCK SPEED
#ENDIF
#IF (CPUFAM == CPU_Z180)
IN0 A,(Z180_DCNTL) ; GET WAIT STATES
@ -475,7 +489,7 @@ AY_WRTPSG:
#ENDIF
#IFDEF SBCV2004
LD A,0 ; SBC-V2-004 CHANGE TO
OUT (112),A ; NORMAL CLOCK SPEED
OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF
JP AY_EI
;
@ -487,7 +501,7 @@ AY_RDPSG:
CALL AY_DI
#IFDEF SBCV2004
LD A,8 ; SBC-V2-004 CHANGE
OUT (112),A ; TO HALF CLOCK SPEED
OUT (RTCIO),A ; TO HALF CLOCK SPEED
#ENDIF
#IF (CPUFAM == CPU_Z180)
IN0 A,(Z180_DCNTL) ; GET WAIT STATES
@ -505,7 +519,7 @@ AY_RDPSG:
#ENDIF
#IFDEF SBCV2004
LD A,0 ; SBC-V2-004 CHANGE TO
OUT (112),A ; NORMAL CLOCK SPEED
OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF
JP AY_EI
;
@ -513,6 +527,7 @@ AY_RDPSG:
;
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
;

2
Source/HBIOS/hbios.asm

@ -2296,7 +2296,7 @@ SND_ADDENT:
; WORD DRIVER FUNCTION TABLE ADDRESS
; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS)
;
SND_FNCNT .EQU 6 ; NUMBER OF SND FUNCS (FOR RANGE CHECK)
SND_FNCNT .EQU 7 ; NUMBER OF SND FUNCS (FOR RANGE CHECK)
SND_MAX .EQU 3 ; UP TO 2 UNITS
SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES
;

1
Source/HBIOS/hbios.inc

@ -62,6 +62,7 @@ BF_SNDPRD .EQU BF_SND + 2 ; REQUEST SOUND PERIOD - HL CONTAINS DRIVER SPECIFIC V
BF_SNDNOTE .EQU BF_SND + 3 ; REQUEST NOTE - L CONTAINS NOTE - EACH VALUE IS QUARTER NOTE
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_SNDQUERY SUBCOMMANDS
BF_SNDQ_STATUS .EQU 0

11
Source/HBIOS/sn76489.asm

@ -262,7 +262,7 @@ SN7_APPLY_PRD:
LD A, L ; GET LOWER 4 BITS FOR COMMAND 1
AND $F
OR B ; A NOW CONATINS FIRST PERIOD COMMAND
OR B ; A NOW CONTAINS FIRST PERIOD COMMAND
AUDTRACE(SNT_REGWR)
AUDTRACE_A
@ -299,6 +299,10 @@ SN7_APPLY_PRD:
POP DE
RET
SN7_DURATION:
LD (SN7_PENDING_DURATION),HL ; SET TONE DURATION
XOR A
RET
SN7_FNTBL:
.DW SN7_RESET
@ -307,7 +311,8 @@ SN7_FNTBL:
.DW SN7_NOTE
.DW SN7_PLAY
.DW SN7_QUERY
.DW SN7_DURATION
;
#IF (($ - SN7_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n"
!!!!!
@ -317,6 +322,8 @@ 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$"

23
Source/HBIOS/spk.asm

@ -4,6 +4,12 @@
;
;======================================================================
;
; LIMITATIONS - CPU FREQUENCY ADJUSTMENT LIMITED TO 1MHZ RESOLUTION
; QUARTER TONES NOT SUPPORTED
; DURATION FIXED TO 1 SECOND.
; NO VOLUME ADJUSTMENT DUE TO HARDWARE LIMITATION
;======================================================================
;
; DRIVER FUNCTION TABLE AND INSTANCE DATA
;
SP_FNTBL:
@ -13,6 +19,7 @@ SP_FNTBL:
.DW SP_NOTE
.DW SP_PLAY
.DW SP_QUERY
.DW SP_DURATION
;
#IF (($ - SP_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n"
@ -31,6 +38,7 @@ SP_RTCIOMSK .EQU 00000100B
;
SP_PENDING_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS)
SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS)
SP_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS)
;
;======================================================================
; DRIVER INITIALIZATION
@ -303,9 +311,22 @@ BE_END:
POP IX
RET ; ALWAYS EXITS WITH SUCCESS STATUS (A=0)
;
; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED).
;======================================================================
; SOUND DRIVER FUNCTION - DURATION
;======================================================================
;
SP_DURATION:
LD (SP_PENDING_DURATION),HL; SET TONE PERIOD TO ZERO
XOR A
RET
;
;======================================================================
;
; STANDARD ONE SECOND TONE TABLES AT 1MHZ.
; FOR SP_BEEPER ROUTINE, FIRST WORD LOADED INTO DE, SECOND INTO HL
;
;======================================================================
;
#DEFINE SP_TONESET(SP_FREQ) .DW SP_FREQ/100, 12500000/SP_FREQ
;
SP_TUNTBL:

Loading…
Cancel
Save