Browse Source

Initial audio duration code

pull/134/head
b1ackmai1er 6 years ago
parent
commit
0bf6caa437
  1. 58
      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

58
Source/Doc/Architecture.md

@ -1438,25 +1438,25 @@ result in a note change.
The following table shows the mapping of the input value in HL The following table shows the mapping of the input value in HL
to the corresponding octave and note. to the corresponding octave and note.
+-------------------------------------------------------+
| | OCTAVE |
| 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 |
| 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)
+-------+---------------------------------------------------------------+
| | OCTAVE |
| 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 |
| 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)
| _Entry Parameters_ | _Entry Parameters_
| B: 0x54 | 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_AY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port
SND_BITMODE | 0x03 | I/O PORT | D: Address port, E: Bit mask 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} `\clearpage`{=latex}
System (SYS) System (SYS)

25
Source/HBIOS/ay38910.asm

@ -56,7 +56,8 @@ AY_FNTBL:
.DW AY_NOTE .DW AY_NOTE
.DW AY_PLAY .DW AY_PLAY
.DW AY_QUERY .DW AY_QUERY
.DW AY_DURATION
;
#IF (($ - AY_FNTBL) != (SND_FNCNT * 2)) #IF (($ - AY_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n" .ECHO "*** INVALID SND FUNCTION TABLE ***\n"
!!!!! !!!!!
@ -432,6 +433,19 @@ AY_QUERY_DEV:
XOR A XOR A
RET RET
; ;
;======================================================================
; SOUND DRIVER FUNCTION - DURATION
;======================================================================
;
AY_DURATION:
LD (AY_PENDING_DURATION),HL ; SET TONE DURATION
XOR A
RET
;
;======================================================================
; NON-BLOCKING INTERRUPT CODE
;======================================================================
;
AY_DI: AY_DI:
LD A, (AY_READY) LD A, (AY_READY)
BIT 1, A BIT 1, A
@ -457,7 +471,7 @@ AY_WRTPSG:
CALL AY_DI CALL AY_DI
#IFDEF SBCV2004 #IFDEF SBCV2004
LD A,8 ; SBC-V2-004 CHANGE LD A,8 ; SBC-V2-004 CHANGE
OUT (112),A ; TO HALF CLOCK SPEED
OUT (RTCIO),A ; TO HALF CLOCK SPEED
#ENDIF #ENDIF
#IF (CPUFAM == CPU_Z180) #IF (CPUFAM == CPU_Z180)
IN0 A,(Z180_DCNTL) ; GET WAIT STATES IN0 A,(Z180_DCNTL) ; GET WAIT STATES
@ -475,7 +489,7 @@ AY_WRTPSG:
#ENDIF #ENDIF
#IFDEF SBCV2004 #IFDEF SBCV2004
LD A,0 ; SBC-V2-004 CHANGE TO LD A,0 ; SBC-V2-004 CHANGE TO
OUT (112),A ; NORMAL CLOCK SPEED
OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF #ENDIF
JP AY_EI JP AY_EI
; ;
@ -487,7 +501,7 @@ AY_RDPSG:
CALL AY_DI CALL AY_DI
#IFDEF SBCV2004 #IFDEF SBCV2004
LD A,8 ; SBC-V2-004 CHANGE LD A,8 ; SBC-V2-004 CHANGE
OUT (112),A ; TO HALF CLOCK SPEED
OUT (RTCIO),A ; TO HALF CLOCK SPEED
#ENDIF #ENDIF
#IF (CPUFAM == CPU_Z180) #IF (CPUFAM == CPU_Z180)
IN0 A,(Z180_DCNTL) ; GET WAIT STATES IN0 A,(Z180_DCNTL) ; GET WAIT STATES
@ -505,7 +519,7 @@ AY_RDPSG:
#ENDIF #ENDIF
#IFDEF SBCV2004 #IFDEF SBCV2004
LD A,0 ; SBC-V2-004 CHANGE TO LD A,0 ; SBC-V2-004 CHANGE TO
OUT (112),A ; NORMAL CLOCK SPEED
OUT (RTCIO),A ; NORMAL CLOCK SPEED
#ENDIF #ENDIF
JP AY_EI JP AY_EI
; ;
@ -513,6 +527,7 @@ AY_RDPSG:
; ;
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_READY .DB 0 ; BIT 0 -> NZ DRIVER IS READY TO RECEIVE PLAY COMMAND 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 ; 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 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 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_MAX .EQU 3 ; UP TO 2 UNITS
SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES 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_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_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_SNDQUERY SUBCOMMANDS ; BF_SNDQUERY SUBCOMMANDS
BF_SNDQ_STATUS .EQU 0 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 LD A, L ; GET LOWER 4 BITS FOR COMMAND 1
AND $F AND $F
OR B ; A NOW CONATINS FIRST PERIOD COMMAND
OR B ; A NOW CONTAINS FIRST PERIOD COMMAND
AUDTRACE(SNT_REGWR) AUDTRACE(SNT_REGWR)
AUDTRACE_A AUDTRACE_A
@ -299,6 +299,10 @@ SN7_APPLY_PRD:
POP DE POP DE
RET RET
SN7_DURATION:
LD (SN7_PENDING_DURATION),HL ; SET TONE DURATION
XOR A
RET
SN7_FNTBL: SN7_FNTBL:
.DW SN7_RESET .DW SN7_RESET
@ -307,7 +311,8 @@ SN7_FNTBL:
.DW SN7_NOTE .DW SN7_NOTE
.DW SN7_PLAY .DW SN7_PLAY
.DW SN7_QUERY .DW SN7_QUERY
.DW SN7_DURATION
;
#IF (($ - SN7_FNTBL) != (SND_FNCNT * 2)) #IF (($ - SN7_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n" .ECHO "*** INVALID SND FUNCTION TABLE ***\n"
!!!!! !!!!!
@ -317,6 +322,8 @@ SN7_PENDING_PERIOD
.DW 0 ; PENDING PERIOD (10 BITS) .DW 0 ; PENDING PERIOD (10 BITS)
SN7_PENDING_VOLUME SN7_PENDING_VOLUME
.DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED) .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$"

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 ; DRIVER FUNCTION TABLE AND INSTANCE DATA
; ;
SP_FNTBL: SP_FNTBL:
@ -13,6 +19,7 @@ SP_FNTBL:
.DW SP_NOTE .DW SP_NOTE
.DW SP_PLAY .DW SP_PLAY
.DW SP_QUERY .DW SP_QUERY
.DW SP_DURATION
; ;
#IF (($ - SP_FNTBL) != (SND_FNCNT * 2)) #IF (($ - SP_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n" .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_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS)
SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS) SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS)
SP_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS)
; ;
;====================================================================== ;======================================================================
; DRIVER INITIALIZATION ; DRIVER INITIALIZATION
@ -303,9 +311,22 @@ BE_END:
POP IX POP IX
RET ; ALWAYS EXITS WITH SUCCESS STATUS (A=0) 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 ; FOR SP_BEEPER ROUTINE, FIRST WORD LOADED INTO DE, SECOND INTO HL
; ;
;======================================================================
;
#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:

Loading…
Cancel
Save