diff --git a/libsrc/atari/shadow_ram_handlers.s b/libsrc/atari/shadow_ram_handlers.s new file mode 100644 index 000000000..d3532b238 --- /dev/null +++ b/libsrc/atari/shadow_ram_handlers.s @@ -0,0 +1,175 @@ +; +; Atari XL shadow RAM handlers +; +; Christian Groessler, chris@groessler.org, 2013 +; + +.if .defined(__ATARIXL__) + + .include "atari.inc" + .include "save_area.inc" + .import __CHARGEN_START__ + + .export sram_init + .export KEYBDV_wrapper + +.macro disable_rom + lda PORTB + and #$fe + sta PORTB +.endmacro +.macro enable_rom + lda PORTB + ora #1 + sta PORTB +.endmacro + +.segment "INIT" + +; Turn off ROMs, install system and interrupt wrappers, set new chargen pointer + +sram_init: + +; disable all interrupts + sei + ldx #0 + stx NMIEN ; disable NMI + + disable_rom + +; setup interrupt vectors + lda #my_IRQ_han + sta $ffff + + lda #my_RESET_han + sta $fffd + + lda #my_NMI_han + sta $fffb + +; setup pointers to CIOV and SIOV wrappers + lda #$4C ; JMP opcode + sta CIOV + lda #my_CIOV + sta CIOV+2 + lda #$4C ; JMP opcode + sta SIOV + lda #my_SIOV + sta SIOV+2 + +; set new chargen + lda #>__CHARGEN_START__ + sta CHBAS + sta CHBASE + +; enable interrupts + lda #$40 + sta NMIEN + cli + + rts + + +.segment "LOWCODE" + +.macro int_wrap orgvec + .local ret + pha + enable_rom + lda #>ret + pha + lda #(kret-1) + pha + lda #<(kret-1) + pha + enable_rom + lda KEYBDV+5 + pha + lda KEYBDV+4 + pha + rts ; call keyboard handler +kret: pha + disable_rom + pla + rts + +.if 0 + .import KEYBDV_wrapper + .import cursor,mul40 + +_cgetc: + jsr setcursor +.if .not .defined(__ATARIXL__) + jsr @1 +.else + jsr KEYBDV_wrapper +.endif + ldx #0 + rts + +.if .not .defined(__ATARIXL__) +@1: lda KEYBDV+5 + pha + lda KEYBDV+4 + pha + lda #12 + sta ICAX1Z ; fix problems with direct call to KEYBDV + rts +.endif +.endif + +.endif ; .if .defined(__ATARIXL__)