; covox_isr.s - POKEY timer-1 IRQ handler for the manual COVOX test.
;
; OS convention (XL/XE): the OS IRQ dispatcher has ALREADY pushed A before
; it JMPs through VTIMR1 ($0210); the stock vector is just "PLA; RTI".
; So on entry A is already saved.  We clobber A freely, save/restore X
; (the only other register we touch), and exit with PLA (recovering the
; OS-saved A) then RTI.
;
; Shared state is defined in C (BSS): _covox_tab[256], _covox_idx,
; _covox_dac_a, _covox_dac_b.  COVOX base is $D280; POKMSK is $10;
; IRQEN/IRQST live at $D20E.

        .export _covox_isr
        .import _covox_tab
        .import _covox_idx
        .import _covox_dac_a
        .import _covox_dac_b

COVOX   = $D280
POKMSK  = $0010
IRQEN   = $D20E

.segment "CODE"

_covox_isr:
        txa                     ; save X (A already pushed by OS)
        pha
        ldx _covox_idx
        lda _covox_tab,x        ; next sample byte
        ldx _covox_dac_a
        sta COVOX,x             ; DAC A  (CH1/CH2)
        ldx _covox_dac_b
        sta COVOX,x             ; DAC B  (CH4/CH3)
        lda _covox_idx          ; advance index by 4 (4x decimation)
        clc                     ;   256/4 = 64, so it wraps cleanly to 0
        adc #4
        sta _covox_idx
        lda POKMSK
        sta IRQEN               ; re-arm IRQEN (acknowledges timer-1 latch)
        pla                     ; restore X
        tax
        pla                     ; recover OS-saved A
        rti
