Added an interrupt facility similar to that on the C128 and Plus/4

git-svn-id: svn://svn.cc65.org/cc65/trunk@2956 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz
2004-03-23 21:50:15 +00:00
parent 461696e15f
commit 5f3ed8826f
2 changed files with 52 additions and 8 deletions

View File

@@ -5,10 +5,11 @@
; ;
.export _exit .export _exit
.import initlib, donelib .import initlib, donelib, condes
.import zerobss, push0 .import zerobss, push0
.import callmain .import callmain
.import RESTOR, BSOUT, CLRCH .import RESTOR, BSOUT, CLRCH
.import __IRQFUNC_TABLE__, __IRQFUNC_COUNT__
.import __RAM_START__, __RAM_SIZE__ ; Linker generated .import __RAM_START__, __RAM_SIZE__ ; Linker generated
.include "zeropage.inc" .include "zeropage.inc"
@@ -76,14 +77,41 @@ L1: lda sp,x
jsr initlib jsr initlib
; If we have IRQ functions, chain our stub into the IRQ vector
lda #<__IRQFUNC_COUNT__
beq NoIRQ1
lda IRQVec
ldx IRQVec+1
sta IRQInd+1
stx IRQInd+2
lda #<IRQStub
ldx #>IRQStub
sei
sta IRQVec
stx IRQVec+1
cli
; Push arguments and call main ; Push arguments and call main
jsr callmain NoIRQ1: jsr callmain
; Call module destructors. This is also the _exit entry. ; Back from main (This is also the _exit entry). Reset the IRQ vector if we
; chained it.
_exit: pha ; Save the return code _exit: pha ; Save the return code on stack
jsr donelib ; Run module destructors lda #<__IRQFUNC_COUNT__
beq NoIRQ2
lda IRQInd+1
ldx IRQInd+2
sei
sta IRQVec
stx IRQVec+1
cli
; Run module destructors
NoIRQ2: jsr donelib
; Copy back the zero page stuff ; Copy back the zero page stuff
@@ -109,6 +137,16 @@ L2: lda zpsave,x
jmp RESTOR jmp RESTOR
; ------------------------------------------------------------------------
; The IRQ vector jumps here, if condes routines are defined with type 2.
IRQStub:
cld ; Just to be sure
ldy #<(__IRQFUNC_COUNT__*2)
lda #<__IRQFUNC_TABLE__
ldx #>__IRQFUNC_TABLE__
jsr condes ; Call the functions
jmp IRQInd ; Jump to the saved IRQ vector
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Data ; Data
@@ -116,6 +154,7 @@ L2: lda zpsave,x
.data .data
zpsave: .res zpspace zpsave: .res zpspace
IRQInd: jmp $0000
.bss .bss

View File

@@ -20,6 +20,11 @@ FEATURES {
type = destructor, type = destructor,
label = __DESTRUCTOR_TABLE__, label = __DESTRUCTOR_TABLE__,
count = __DESTRUCTOR_COUNT__; count = __DESTRUCTOR_COUNT__;
# condes functions with type 2 are called in the interrupt
CONDES: segment = RODATA,
type = 2,
label = __IRQFUNC_TABLE__,
count = __IRQFUNC_COUNT__;
} }
SYMBOLS { SYMBOLS {
__STACKSIZE__ = $800; # 2K stack __STACKSIZE__ = $800; # 2K stack