]> git.sur5r.net Git - cc65/blobdiff - libsrc/runtime/condes.s
Fixed problems that were introduced with r4287.
[cc65] / libsrc / runtime / condes.s
index 77d0b1c00707c175b1dffa1a069aa0b9c1796cf0..c94e41252285292f8aac50e6d28e80ba0f05e6d3 100644 (file)
@@ -4,9 +4,9 @@
 ; CC65 runtime: Support for calling module constructors/destructors
 ;
 ; The condes routine must be called with the table address in a/x and the
-; 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.
+; size of the table (which must not be zero!) 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
 
                .export initlib, donelib, condes
 
-        .import callax
                .import __CONSTRUCTOR_TABLE__, __CONSTRUCTOR_COUNT__
        .import __DESTRUCTOR_TABLE__, __DESTRUCTOR_COUNT__
 
         .macpack        cpu
 
-.code
-
 ; --------------------------------------------------------------------------
 ; Initialize library modules
 
+.segment        "INIT"
+
 .proc  initlib
 
-       lda     #<__CONSTRUCTOR_TABLE__
-       ldx     #>__CONSTRUCTOR_TABLE__
-       ldy     #<(__CONSTRUCTOR_COUNT__*2)
-       bne     condes
-       rts
+       ldy     #<(__CONSTRUCTOR_COUNT__*2)
+               beq     exit
+       lda     #<__CONSTRUCTOR_TABLE__
+       ldx     #>__CONSTRUCTOR_TABLE__
+        jmp     condes
+exit:   rts
 
 .endproc
 
 ; --------------------------------------------------------------------------
 ; Cleanup library modules
 
+.code
+
 .proc  donelib
 
-       lda     #<__DESTRUCTOR_TABLE__
-       ldx     #>__DESTRUCTOR_TABLE__
-       ldy     #<(__DESTRUCTOR_COUNT__*2)
-       bne     condes
-       rts
+       ldy     #<(__DESTRUCTOR_COUNT__*2)
+       beq     exit
+       lda     #<__DESTRUCTOR_TABLE__
+       ldx     #>__DESTRUCTOR_TABLE__
+       jmp     condes
+exit:   rts
 
 .endproc
 
 
 ; --------------------------------------------------------------------------
-; Generic table call handler
+; Generic table call handler. The code uses self modifying code and goes
+; into the data segment for this reason.
+; NOTE: The routine must not be called if the table is empty!
+
+.data
 
 .proc  condes
 
-       sta     getbyt+1
-       stx     getbyt+2
-       sty     index
-
-loop:  ldy     index
-       beq     done
-       dey
-       jsr     getbyt
-        tax
-       dey
-       jsr     getbyt
-       sty     index
-       jsr     callax
-.if (.cpu .bitand ::CPU_ISET_65SC02)
-       bra     loop
-.else
-       jmp     loop
-.endif
-
-done:  rts
+       sta     fetch1+1
+       stx     fetch1+2
+       sta     fetch2+1
+       stx     fetch2+2
+loop:   dey
+fetch1: lda     $FFFF,y                 ; Patched at runtime
+        sta     jmpvec+2
+       dey
+fetch2: lda     $FFFF,y                 ; Patched at runtime
+        sta     jmpvec+1
+               sty     index+1
+jmpvec: jsr            $FFFF                   ; Patched at runtime
+index:         ldy     #$FF                    ; Patched at runtime
+               bne     loop
+        rts
 
 .endproc
 
 
-; --------------------------------------------------------------------------
-; Data. The getbyte routine is placed in the data segment cause it's patched
-; at runtime.
-
-.bss
-
-index: .byte   0
-
-.data
-
-getbyt:        lda     $FFFF,y
-       rts
-
-