;
.export _exit
- .import __hinit, initconio, zerobss, push0, doatexit
+ .import initlib, donelib
+ .import zerobss, push0
.import _main
.include "pet.inc"
.exportzp tmp1, tmp2, tmp3, tmp4
.exportzp regbank, zpspace
-sp = $02 ; stack pointer
-sreg = $04 ; secondary register/high 16 bit for longs
-regsave = $06 ; slot to save/restore (E)AX into
-ptr1 = $0A ;
-ptr2 = $0C
-ptr3 = $0E
-ptr4 = $10
-tmp1 = $12
-tmp2 = $13
-tmp3 = $14
-tmp4 = $15
-regbank = $16 ; 6 byte register bank
-zpspace = $1A ; Zero page space allocated
+.zeropage
+
+zpstart = *
+sp: .res 2 ; Stack pointer
+sreg: .res 2 ; Secondary register/high 16 bit for longs
+regsave: .res 2 ; slot to save/restore (E)AX into
+ptr1: .res 2
+ptr2: .res 2
+ptr3: .res 2
+ptr4: .res 2
+tmp1: .res 1
+tmp2: .res 1
+tmp3: .res 1
+tmp4: .res 1
+regbank: .res 6 ; 6 byte register bank
+
+zpspace = * - zpstart ; Zero page space allocated
+
+.code
; ------------------------------------------------------------------------
; BASIC header with a SYS call
; ------------------------------------------------------------------------
; Actual code
- ldy #zpspace-1
-L1: lda sp,y
- sta zpsave,y ; Save the zero page locations we need
- dey
+ ldx #zpspace-1
+L1: lda sp,x
+ sta zpsave,x ; Save the zero page locations we need
+ dex
bpl L1
; Close open files
lda MEMSIZE+1
sta sp+1 ; Set argument stack ptr
-; Initialize the heap
+; Call module constructors
- jsr __hinit
-
-; Initialize conio stuff
-
- jsr initconio
+ jsr initlib
; Pass an empty command line
ldy #4 ; Argument size
jsr _main ; call the users code
-; fall thru to exit...
+; Call module destructors. This is also the _exit entry.
+
+_exit: jsr donelib ; Run module destructors
-_exit: jsr doatexit ; call exit functions
+; Restore system stuff
ldx spsave
txs ; Restore stack pointer
; Copy back the zero page stuff
- ldy #zpspace-1
-L2: lda zpsave,y
- sta sp,y
- dey
+ ldx #zpspace-1
+L2: lda zpsave,x
+ sta sp,x
+ dex
bpl L2
; Back to basic