1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
;
; 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"
.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__
|