]> git.sur5r.net Git - cc65/commitdiff
Working on the condes feature
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 21 Nov 2000 10:51:53 +0000 (10:51 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 21 Nov 2000 10:51:53 +0000 (10:51 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@464 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/runtime/Makefile
libsrc/runtime/condes.s

index f800c1d0b9522b7e4cd3c078eb9f0fdea3fa9cca..3fb6dfca7938ea31fa6b80b7835472b3b110a4a0 100644 (file)
@@ -67,7 +67,6 @@ OBJS =        add.o           \
        incsp6.o        \
        incsp7.o        \
        incsp8.o        \
-       jmpvec.o        \
                ladd.o          \
                laddeq.o        \
                laddeqsp.o      \
index 099c3e4bf8049fd992c85fb79bfef6f5d4598329..e9409753500e8c46d809e598c73a8689cfebbe75 100644 (file)
@@ -4,17 +4,62 @@
 ; CC65 runtime: Support for calling module constructors/destructors
 ;
 ; The condes routine must be called with the table address in a/x and the
-; number of vectors in the table in y. The current implementation limits
-; the table size to 128 bytes (64 vectors) but this shouldn't be problem
-; for now and may be changed later.
+; size of the table in y. The current implementation limits the table size
+; to 254 bytes (127 vectors) but this shouldn't be problem for now and may
+; be changed later.
 ;
+; libinit and libdone call condes with the predefined module constructor and
+; destructor tables, they must be called from the platform specific startup
+; code.
+;
+; The function does also export jmpvec as general purpose jump vector that
+; lies in the data segment so it's address may be patched at runtime.
+;
+
+               .export libinit, libdone, condes
+               .export jmpvec
+
+               .import __CONSTRUCTOR_TABLE__, __CONSTRUCTOR_COUNT__
+       .import __DESTRUCTOR_TABLE__, __DESTRUCTOR_COUNT__
+
 
-               .export condes
-               .import jmpvec
 
 .code
 
-condes:        sta     getbyt+1
+; --------------------------------------------------------------------------
+; Initialize library modules
+
+.proc  libinit
+
+       lda     #<__CONSTRUCTOR_TABLE__
+       ldx     #>__CONSTRUCTOR_TABLE__
+       ldy     #<(__CONSTRUCTOR_COUNT__*2)
+       bne     condes
+       rts
+
+.endproc
+
+
+; --------------------------------------------------------------------------
+; Cleanup library modules
+
+.proc  libdone
+
+       lda     #<__DESTRUCTOR_TABLE__
+       ldx     #>__DESTRUCTOR_TABLE__
+       ldy     #<(__DESTRUCTOR_COUNT__*2)
+       bne     condes
+       rts
+
+.endproc
+
+
+; --------------------------------------------------------------------------
+; Generic table call handler
+
+.proc  condes
+
+       sta     getbyt+1
        stx     getbyt+2
        sty     index
 
@@ -32,6 +77,9 @@ loop: ldy     index
 
 done:  rts
 
+.endproc
+
+
 ; --------------------------------------------------------------------------
 ; Data. The getbyte routine is placed in the data segment cause it's patched
 ; at runtime.
@@ -45,3 +93,6 @@ index:        .byte   0
 getbyt:        lda     $FFFF,y
        rts
 
+jmpvec:        jmp     $FFFF
+
+