X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fpet%2Fcrt0.s;h=23ff90ea353d4ca1bcfe34d602e0cff6f0588b82;hb=20eb942ab921667124c9d4323c6030bc269f5d35;hp=21bdf0107034f900d15cd2e07896e9081372afe8;hpb=7c436aec1d19b3aa6bbaa90fe9ef5bdda5dd252f;p=cc65 diff --git a/libsrc/pet/crt0.s b/libsrc/pet/crt0.s index 21bdf0107..23ff90ea3 100644 --- a/libsrc/pet/crt0.s +++ b/libsrc/pet/crt0.s @@ -1,62 +1,39 @@ ; ; Startup code for cc65 (PET version) -; -; This must be the *first* file on the linker command line ; .export _exit - .import __hinit, initconio, zerobss, push0, doatexit - .import _main - + .export __STARTUP__ : absolute = 1 ; Mark as startup + .import initlib, donelib, callirq + .import zerobss, push0 + .import callmain + .import CLRCH, BSOUT + .import __INTERRUPTOR_COUNT__ + + .include "zeropage.inc" .include "pet.inc" .include "../cbm/cbm.inc" ; ------------------------------------------------------------------------ -; Define and export the ZP variables for the C64 runtime - - .exportzp sp, sreg, regsave - .exportzp ptr1, ptr2, ptr3, ptr4 - .exportzp tmp1, tmp2, tmp3, tmp4 - .exportzp regbank, zpspace - -.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 +; Place the startup code in a special segment. -.code +.segment "STARTUP" -; ------------------------------------------------------------------------ ; BASIC header with a SYS call - .org $3FF .word Head ; Load address Head: .word @Next - .word 1000 ; Line number + .word .version ; Line number .byte $9E,"1037" ; SYS 1037 .byte $00 ; End of BASIC line @Next: .word 0 ; BASIC end marker - .reloc ; ------------------------------------------------------------------------ ; Actual code ldx #zpspace-1 L1: lda sp,x - sta zpsave,x ; Save the zero page locations we need + sta zpsave,x ; Save the zero page locations we need dex bpl L1 @@ -64,11 +41,19 @@ L1: lda sp,x jsr CLRCH -; Switch to second charset +; Switch to second charset. The routine that is called by BSOUT to switch the +; character set will use FNLEN as temporary storage - YUCK! Since the +; initmainargs routine, which parses the command line for arguments needs this +; information, we need to save and restore it here. +; Thanks to Stefan Haubenthal for this information! + lda FNLEN + pha ; Save FNLEN lda #14 ; sta $E84C ; See PET FAQ jsr BSOUT + pla + sta FNLEN ; Restore FNLEN ; Clear the BSS data @@ -84,44 +69,84 @@ L1: lda sp,x lda MEMSIZE+1 sta sp+1 ; Set argument stack ptr -; Initialize the heap +; If we have IRQ functions, chain our stub into the IRQ vector - jsr __hinit + lda #<__INTERRUPTOR_COUNT__ + beq NoIRQ1 + lda IRQVec + ldx IRQVec+1 + sta IRQInd+1 + stx IRQInd+2 + lda #IRQStub + sei + sta IRQVec + stx IRQVec+1 + cli -; Initialize conio stuff +; Call module constructors - jsr initconio +NoIRQ1: jsr initlib -; Pass an empty command line +; Push arguments and call main() - jsr push0 ; argc - jsr push0 ; argv + jsr callmain - ldy #4 ; Argument size - jsr _main ; call the users code +; Call module destructors. This is also the _exit entry. -; fall thru to exit... +_exit: pha ; Save the return code on stack + jsr donelib -_exit: jsr doatexit ; call exit functions +; Reset the IRQ vector if we chained it. - ldx spsave - txs ; Restore stack pointer + lda #<__INTERRUPTOR_COUNT__ + beq NoIRQ2 + lda IRQInd+1 + ldx IRQInd+2 + sei + sta IRQVec + stx IRQVec+1 + cli ; Copy back the zero page stuff - ldx #zpspace-1 +NoIRQ2: ldx #zpspace-1 L2: lda zpsave,x sta sp,x dex bpl L2 +; Store the program return code into ST + + pla + sta ST + +; Restore the stack pointer + + ldx spsave + txs ; Restore stack pointer + ; Back to basic rts +; ------------------------------------------------------------------------ +; The IRQ vector jumps here, if condes routines are defined with type 2. + +IRQStub: + cld ; Just to be sure + jsr callirq ; Call the functions + jmp IRQInd ; Jump to the saved IRQ vector + +; ------------------------------------------------------------------------ +; Data .data +IRQInd: jmp $0000 + +.segment "ZPSAVE" + zpsave: .res zpspace .bss