More untested Ensoniq audio code.

This commit is contained in:
Bobbi Webber-Manners 2022-09-29 13:48:49 -04:00
parent ad8693244a
commit 75e0df40ea

View File

@ -133,10 +133,45 @@ WORD08
* Called from Ensoniq interrupt handler - process audio queue * Called from Ensoniq interrupt handler - process audio queue
* * Called at 100Hz
ENSQIRQ ENSQIRQ INC COUNTER ; Increment centisecond timer
* TODO: IMPLEMENT THIS!!! INC :CNT ; Find every 5th cycle
RTS CMP #5
BNE :NOT20HZ
STZ :CNT
LDX #3 ; Process four audio queues
:L1 LDA OSCTIMES,X ; Time remaining on current note
BEQ :NONOTE ; No note playing
DEC OSCTIMES,X
BRA :NOTE
:NONOTE LDY #$00 ; Zero volume
LDA #$00 ; Zero freq
JSR ENSQNOTE ; Silence channel Y
:NOTE CLV ; Means remove from queue
JSR REMHND ; Remove byte from queue
BCS :EMPTY ; Nothing in queue
PHY ; Amplitude
JSR REMHND ; Remove byte from queue
PHY ; Frequency
JSR REMHND ; Remove byte from queue
TYA ; Duration
STA OSCTIMES,X
PLA ; Recover frequency
PLY ; Recover amplitude
JSR ENSQNOTE ; Start note playing
:EMPTY DEX
BNE :L1 ; Next audio queue
:NOT20HZ
* TODO: Envelope processing on all cycles (AT 100Hz)
:RTS RTS
:CNT DB $00 ; Used to determine 20Hz cycles
COUNTER DW $0000 ; Centisecond counter
* Time remaining for current note, in 1/20th of second
OSCTIMES DB $00
DB $00
DB $00
DB $00
* Initialize Ensoniq * Initialize Ensoniq
@ -167,21 +202,25 @@ ENSQINIT LDA ENSQSNDCTL ; Get settings
LDX #$E1 ; DOC Osc Enable register $E1 LDX #$E1 ; DOC Osc Enable register $E1
LDY #8 ; Four oscillators enabled LDY #8 ; Four oscillators enabled
JSR ENSQWRTDOC JSR ENSQWRTDOC
LDX #$00 ; Amplitude ; Fall through
* Silence all channels
ENSQSILENT LDY #$00 ; Amplitude
LDA #$80 ; Frequency LDA #$80 ; Frequency
LDY #$03 LDX #$03
:L3 JSR ENSQOSCIL ; Initialize channel Y :L1 JSR ENSQNOTE ; Initialize channel Y
DEY STZ OSCTIMES,X ; No note playing
BPL :L3 DEX
BPL :L1
RTS RTS
* Configure Ensoniq oscillator * Configure Ensoniq oscillator
* On entry: Y - oscillator number 0-3 , A - frequency, X - amplitude * On entry: X - oscillator number 0-3 , A - frequency, Y - amplitude
* Preserves all registers * Preserves all registers
* TODO: ALWAYS USES OSCILLATOR CHANNEL 0 FOR NOW * TODO: ALWAYS USES OSCILLATOR CHANNEL 0 FOR NOW
ENSQOSCIL PHA ENSQNOTE PHA
PHY
PHX PHX
PHY
LDX #$00 ; DOC register $00 (Freq Lo) LDX #$00 ; DOC register $00 (Freq Lo)
TAY ; Frequency value LS byte TAY ; Frequency value LS byte
JSR ENSQWRTDOC JSR ENSQWRTDOC
@ -189,7 +228,7 @@ ENSQOSCIL PHA
LDY #$00 ; Frequency value MS byte LDY #$00 ; Frequency value MS byte
JSR ENSQWRTDOC JSR ENSQWRTDOC
LDX #$40 ; DOC register $40 (Volume) LDX #$40 ; DOC register $40 (Volume)
PLY ; Frequency value orig in X PLY ; Amplitude value
PHY PHY
JSR ENSQWRTDOC JSR ENSQWRTDOC
LDX #$80 ; DOC register $80 (Wavetable) LDX #$80 ; DOC register $80 (Wavetable)
@ -201,8 +240,8 @@ ENSQOSCIL PHA
LDX #$C0 ; DOC register $C0 (WT size) LDX #$C0 ; DOC register $C0 (WT size)
LDY #$00 ; For 256 byte wavetable LDY #$00 ; For 256 byte wavetable
JSR ENSQWRTDOC JSR ENSQWRTDOC
PLX
PLY PLY
PLX
PLA PLA
RTS RTS