mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Initial audio duration code
This commit is contained in:
@@ -1438,25 +1438,25 @@ 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 |-----------------------------------------------+
|
||||
| | 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_
|
||||
| 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)
|
||||
|
||||
@@ -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
|
||||
;
|
||||
|
||||
@@ -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
|
||||
;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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$"
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user