Atari: fix interrupt handling if extended memory is banked in

Extendend memory is mapped over the main memory in the 0x4000..0x7FFF
area. Many DOSes disable interrupts while extended memory is banked in,
but not all (e.g. SpartaDOS-X).
This change modifies the initial interrupt handler to map in main memory
before chaining to the "worker" handlers.
Since the initial interrupt handler uses a data segment to store the
trampoline to chain to the original handler, introduce a new "LOWBSS"
segment to hold this trampoline. Otherwise the trampoline may end up
inside the 0x4000..0x7FFF area.

Add a link time warning if "LOWCODE" segment lays within the extended
memory window.
This commit is contained in:
Christian Groessler
2018-09-02 23:07:03 +02:00
committed by Oliver Schmidt
parent d199ca1460
commit 1cc4fa9356
9 changed files with 47 additions and 21 deletions

View File

@@ -16,6 +16,8 @@
.segment "ONCE"
initirq:
lda #$4C ; JMP opcode
sta IRQInd
lda VVBLKD
ldx VVBLKD+1
sta IRQInd+1
@@ -45,17 +47,22 @@ IRQStub:
.ifdef CHARGEN_RELOC
lda CHBAS
pha
.endif
.endif
lda PORTB
pha
and #$FE
sta PORTB ; disable ROM
.ifdef __ATARIXL__
and #$FE ; disable ROM
.endif
ora #$10 ; map main memory into $4000..$7FFF area
sta PORTB
.ifdef __ATARIXL__
set_chbase >__CHARGEN_START__
.endif
jsr callirq ; Call the functions
.ifdef __ATARIXL__
pla
sta PORTB ; restore old ROM setting
sta PORTB ; restore old memory settings
.ifdef __ATARIXL__
.ifdef CHARGEN_RELOC
pla
sta CHBAS
@@ -66,6 +73,8 @@ IRQStub:
; ------------------------------------------------------------------------
.data
.segment "LOWBSS"
IRQInd: jmp $0000
IRQInd: .res 3
.end