; int atexit (void (*f) (void));
;
-; The exit functions
-
- .export _atexit, doatexit
- .import __errno, jmpvec
+ .export _atexit
+ .import exitfunc_table, exitfunc_index
+ .importzp exitfunc_max
+ .import __errno
.include "errno.inc"
-.bss
-ecount: .byte 0 ; Really an index, inc'ed by 2
-efunc: .word 0,0,0,0,0 ; 5 exit functions
-maxcount = * - efunc
-
-.code
+.proc _atexit
-_atexit:
- ldy ecount
- cpy #maxcount ; slot available?
- beq E0 ; jump if no
+ ldy exitfunc_index
+ cpy #exitfunc_max ; Slot available?
+ beq @Error ; Jump if no
; Enter the function into the table
- sta efunc,y
+ sta exitfunc_table,y
iny
txa
- sta efunc,y
+ sta exitfunc_table,y
iny
- sty ecount
+ sty exitfunc_index
; Done, return zero
; Error, no space left
-E0: lda #ENOSPC ; No space left
- sta __errno
- ldx #$00
- stx __errno+1
- dex
- txa
- rts
-
-; Function called from exit
-
-doatexit:
- ldy ecount ; get index
- beq L9 ; jump if done
- dey
- lda efunc,y
- sta jmpvec+2
- dey
- lda efunc,y
- sta jmpvec+1
- sty ecount
- ldy #0 ; number of function parms
- jsr jmpvec
- jmp doatexit ; next one
-
-L9: rts
+@Error: lda #ENOSPC ; No space left
+ sta __errno
+ ldx #$00
+ stx __errno+1
+ dex ; Make return value -1
+ txa
+ rts
+.endproc
--- /dev/null
+;
+; Ullrich von Bassewitz, 26.10.2000
+;
+; Handle exit functions
+;
+
+ .export doatexit, exitfunc_index, exitfunc_table
+ .exportzp exitfunc_max
+ .import jmpvec
+
+.bss
+exitfunc_index: .res 1 ; Index into table, inc'ed by 2
+exitfunc_table: .res 10 ; 5 exit functions
+exitfunc_max = <(* - exitfunc_table)
+
+
+.code
+
+.proc doatexit
+
+ ldy exitfunc_index ; Get index
+ beq @L9 ; Jump if done
+ dey
+ lda exitfunc_table,y
+ sta jmpvec+2
+ dey
+ lda exitfunc_table,y
+ sta jmpvec+1
+ sty exitfunc_index
+ jsr jmpvec ; Call the function
+ jmp doatexit ; Next one
+
+@L9: rts
+
+.endproc
+
+
+