From 5f3ed8826fb7e694fb36b339191a5fccfdd34b75 Mon Sep 17 00:00:00 2001 From: cuz Date: Tue, 23 Mar 2004 21:50:15 +0000 Subject: [PATCH] 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 --- libsrc/c64/crt0.s | 55 +++++++++++++++++++++++++++++++++++++------- src/ld65/cfg/c64.cfg | 5 ++++ 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/libsrc/c64/crt0.s b/libsrc/c64/crt0.s index f75a5c46b..20f0827f6 100644 --- a/libsrc/c64/crt0.s +++ b/libsrc/c64/crt0.s @@ -5,10 +5,11 @@ ; .export _exit - .import initlib, donelib + .import initlib, donelib, condes .import zerobss, push0 .import callmain .import RESTOR, BSOUT, CLRCH + .import __IRQFUNC_TABLE__, __IRQFUNC_COUNT__ .import __RAM_START__, __RAM_SIZE__ ; Linker generated .include "zeropage.inc" @@ -76,21 +77,48 @@ L1: lda sp,x 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 + sei + sta IRQVec + stx IRQVec+1 + cli + ; Push arguments and call main - jsr callmain +NoIRQ1: jsr callmain + +; Back from main (This is also the _exit entry). Reset the IRQ vector if we +; chained it. + +_exit: pha ; Save the return code on stack + lda #<__IRQFUNC_COUNT__ + beq NoIRQ2 + lda IRQInd+1 + ldx IRQInd+2 + sei + sta IRQVec + stx IRQVec+1 + cli -; Call module destructors. This is also the _exit entry. +; Run module destructors -_exit: pha ; Save the return code - jsr donelib ; Run module destructors +NoIRQ2: jsr donelib ; Copy back the zero page stuff ldx #zpspace-1 -L2: lda zpsave,x - sta sp,x - dex +L2: lda zpsave,x + sta sp,x + dex bpl L2 ; Place the program return code into ST @@ -109,6 +137,16 @@ L2: lda zpsave,x 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 @@ -116,6 +154,7 @@ L2: lda zpsave,x .data zpsave: .res zpspace +IRQInd: jmp $0000 .bss diff --git a/src/ld65/cfg/c64.cfg b/src/ld65/cfg/c64.cfg index 6c5ff8da8..417f84e14 100644 --- a/src/ld65/cfg/c64.cfg +++ b/src/ld65/cfg/c64.cfg @@ -20,6 +20,11 @@ FEATURES { type = destructor, label = __DESTRUCTOR_TABLE__, 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 { __STACKSIZE__ = $800; # 2K stack -- 2.39.5