interruptor support by Stefan Haubenthal

git-svn-id: svn://svn.cc65.org/cc65/trunk@5055 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cpg
2011-06-13 16:42:45 +00:00
parent 79fad36b41
commit 6d0db06931

View File

@@ -5,14 +5,15 @@
; Mark Keates ; Mark Keates
; Freddy Offenga ; Freddy Offenga
; Christian Groessler ; Christian Groessler
; Stefan Haubenthal
; ;
.export _exit .export _exit
.export __STARTUP__ : absolute = 1 ; Mark as startup .export __STARTUP__ : absolute = 1 ; Mark as startup
.import initlib, donelib, callmain .import initlib, donelib
.import zerobss, pushax .import callmain, zerobss, callirq
.import _main, __filetab, getfd .import __INTERRUPTOR_COUNT__
.import __STARTUP_LOAD__, __ZPSAVE_LOAD__ .import __STARTUP_LOAD__, __ZPSAVE_LOAD__
.import __RESERVED_MEMORY__ .import __RESERVED_MEMORY__
@@ -51,12 +52,12 @@ L1: lda sp,x
jsr zerobss jsr zerobss
; setup the stack ; Setup the stack
tsx tsx
stx spsave stx spsave
; report memory usage ; Report memory usage
lda APPMHI lda APPMHI
sta appmsav ; remember old APPMHI value sta appmsav ; remember old APPMHI value
@@ -73,18 +74,31 @@ L1: lda sp,x
sta APPMHI+1 sta APPMHI+1
sta sp+1 ; setup runtime stack part 2 sta sp+1 ; setup runtime stack part 2
; If we have IRQ functions, chain our stub into the IRQ vector
lda #<__INTERRUPTOR_COUNT__
beq NoIRQ1
lda VVBLKI
ldx VVBLKI+1
sta IRQInd+1
stx IRQInd+2
lda #6
ldy #<IRQStub
ldx #>IRQStub
jsr SETVBV
; Call module constructors ; Call module constructors
jsr initlib NoIRQ1: jsr initlib
; set left margin to 0 ; Set left margin to 0
lda LMARGN lda LMARGN
sta old_lmargin sta old_lmargin
ldy #0 ldy #0
sty LMARGN sty LMARGN
; set keyb to upper/lowercase mode ; Set keyb to upper/lowercase mode
ldx SHFLOK ldx SHFLOK
stx old_shflok stx old_shflok
@@ -103,22 +117,32 @@ L1: lda sp,x
_exit: jsr donelib ; Run module destructors _exit: jsr donelib ; Run module destructors
; Reset the IRQ vector if we chained it.
pha ; Save the return code on stack
lda #<__INTERRUPTOR_COUNT__
beq NoIRQ2
lda #6
ldy IRQInd+1
ldx IRQInd+2
jsr SETVBV
; Restore system stuff ; Restore system stuff
ldx spsave NoIRQ2: ldx spsave
txs ; Restore stack pointer txs ; Restore stack pointer
; restore left margin ; Restore left margin
lda old_lmargin lda old_lmargin
sta LMARGN sta LMARGN
; restore kb mode ; Restore kb mode
lda old_shflok lda old_shflok
sta SHFLOK sta SHFLOK
; restore APPMHI ; Restore APPMHI
lda appmsav lda appmsav
sta APPMHI sta APPMHI
@@ -133,7 +157,7 @@ L2: lda zpsave,x
dex dex
bpl L2 bpl L2
; turn on cursor ; Turn on cursor
inx inx
stx CRSINH stx CRSINH
@@ -142,6 +166,21 @@ L2: lda zpsave,x
rts rts
; ------------------------------------------------------------------------
; The IRQ vector jumps here, if condes routines are defined with type 2.
IRQStub:
cld ; Just to be sure
jsr callirq ; Call the functions
jmp IRQInd ; Jump to the saved IRQ vector
; ------------------------------------------------------------------------
; Data
.data
IRQInd: jmp $0000
; *** end of main startup code ; *** end of main startup code
.segment "ZPSAVE" .segment "ZPSAVE"