;
; Ullrich von Bassewitz, 06.06.1998
;
; int atexit (void (*f) (void));
;

        .export         _atexit
        .destructor     doatexit, 17
        .import         callax

        .include        "errno.inc"

        .macpack        cpu

; ---------------------------------------------------------------------------

.proc   _atexit

        ldy     exitfunc_index
        cpy     #exitfunc_max           ; Slot available?
        beq     @Error                  ; Jump if no

; Enter the function into the table

        sta     exitfunc_table,y
        iny
        txa
        sta     exitfunc_table,y
        iny
        sty     exitfunc_index

; Done, return zero

        lda     #0
        tax
        rts

; Error, no space left

@Error: lda     #ENOSPC         ; No space left
        jsr     __seterrno
        ldx     #$FF            ; Return -1
        txa
        rts

.endproc



; ---------------------------------------------------------------------------

.code

.proc   doatexit

        ldy     exitfunc_index          ; Get index
        beq     @L9                     ; Jump if done
        dey
        lda     exitfunc_table,y
        tax
        dey
        lda     exitfunc_table,y
        sty     exitfunc_index
        jsr     callax                  ; Call the function
.if (.cpu .bitand ::CPU_ISET_65SC02)
        bra     doatexit
.else
        jmp     doatexit                ; Next one
.endif

@L9:    rts

.endproc



; ---------------------------------------------------------------------------

.bss
exitfunc_index: .res    1       ; Index into table, inc'ed by 2
exitfunc_table: .res    10      ; 5 exit functions
exitfunc_max    = <(* - exitfunc_table)


