diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index f786448e..fe8f4284 100644 --- a/Source/Doc/Architecture.md +++ b/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 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) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index debe3e08..6ddf9c1d 100644 --- a/Source/HBIOS/ay38910.asm +++ b/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 ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 8b8c116e..61a1683e 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 6e25d5f4..3a9933ca 100644 --- a/Source/HBIOS/hbios.inc +++ b/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 diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 220e07e3..0590d256 100644 --- a/Source/HBIOS/sn76489.asm +++ b/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$" diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 168693ce..427bcf4c 100644 --- a/Source/HBIOS/spk.asm +++ b/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: