;
; Atari XL shadow RAM timer IRQ #2 handler
;
; Christian Groessler, chris@groessler.org, 2019
;

;DEBUG           =       1

.ifdef __ATARIXL__

SHRAM_HANDLERS  =       1
                .include        "atari.inc"
                .include        "romswitch.inc"
                .import         __CHARGEN_START__
                .export         set_VTIMR2_handler


.segment "LOWBSS"

VTIMR2_handler: .res    3


.segment "BSS"

old_VTIMR2_handler:
                .res    2


.segment "LOWCODE"

; timer interrupt handler:
; disable ROM, call user handler, enable ROM again

my_VTIMR2_handler:
                disable_rom_quick
                jsr     VTIMR2_handler
                enable_rom_quick
                pla
                rti

.segment "CODE"

; install or remove VTIMR2 handler
; input: CF - 0/1 for remove/install handler
;        AX - pointer to handler (if CF=1)
; registers destroyed

set_VTIMR2_handler:

                bcc     @remove

; install vector

                stx     VTIMR2_handler+2
                sta     VTIMR2_handler+1        ; save passed vector in low memory
                lda     #$4C                    ; "JMP" opcode
                sta     VTIMR2_handler

                lda     VTIMR2
                sta     old_VTIMR2_handler
                lda     VTIMR2+1
                sta     old_VTIMR2_handler+1

                lda     #<my_VTIMR2_handler
                php
                sei
                sta     VTIMR2
                lda     #>my_VTIMR2_handler
                sta     VTIMR2+1
                plp
                rts

@remove:        php
                sei
                lda     old_VTIMR2_handler
                sta     VTIMR2
                lda     old_VTIMR2_handler+1
                sta     VTIMR2+1
                plp
                rts

.endif  ; .ifdef __ATARIXL__
