; 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
done: rts
+.endproc
+
+
; --------------------------------------------------------------------------
; Data. The getbyte routine is placed in the data segment cause it's patched
; at runtime.
getbyt: lda $FFFF,y
rts
+jmpvec: jmp $FFFF
+
+