X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fc64%2Fcrt0.s;h=ab44e9033837cf805a71b3ebc3b742e9f563c34d;hb=2823bc1e6644a1150060564d12947aa2fdd8c7b1;hp=a513b1f7380b42df1cc942cd26e2817479520e36;hpb=577247df58f2cb3e2f57bcb662adace504b069a9;p=cc65 diff --git a/libsrc/c64/crt0.s b/libsrc/c64/crt0.s index a513b1f73..ab44e9033 100644 --- a/libsrc/c64/crt0.s +++ b/libsrc/c64/crt0.s @@ -2,83 +2,68 @@ ; Startup code for cc65 (C64 version) ; - .export _exit + .export _exit .export __STARTUP__ : absolute = 1 ; Mark as startup - .import initlib, donelib, callirq - .import zerobss - .import callmain + .import initlib, donelib + .import zerobss + .import callmain .import RESTOR, BSOUT, CLRCH - .import __INTERRUPTOR_COUNT__ - .import __RAM_START__, __RAM_SIZE__ ; Linker generated - .import __STACKSIZE__ ; Linker generated + .import __RAM_START__, __RAM_SIZE__ ; Linker generated + .import __STACKSIZE__ ; Linker generated + .importzp ST .include "zeropage.inc" - .include "c64.inc" + .include "c64.inc" ; ------------------------------------------------------------------------ ; Startup code -.segment "STARTUP" +.segment "STARTUP" Start: ; Save the zero page locations we need - ldx #zpspace-1 -L1: lda sp,x - sta zpsave,x - dex - bpl L1 + ldx #zpspace-1 +L1: lda sp,x + sta zpsave,x + dex + bpl L1 ; Switch to second charset - lda #14 - jsr BSOUT + lda #14 + jsr BSOUT ; Switch off the BASIC ROM - lda $01 - pha ; Remember the value - and #$F8 - ora #$06 ; Enable kernal+I/O, disable basic - sta $01 + lda $01 + pha ; Remember the value + and #$F8 + ora #$06 ; Enable kernal+I/O, disable basic + sta $01 ; Clear the BSS data - jsr zerobss + jsr zerobss ; Save system settings and setup the stack pla - sta mmusave ; Save the memory configuration - - tsx - stx spsave ; Save the system stack ptr - - lda #<(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__) - sta sp - lda #>(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__) - sta sp+1 ; Set argument stack ptr - -; If we have IRQ functions, chain our stub into the IRQ vector - - 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 + sta mmusave ; Save the memory configuration + + tsx + stx spsave ; Save the system stack ptr + + lda #<(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__) + sta sp + lda #>(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__) + sta sp+1 ; Set argument stack ptr ; Call module constructors -NoIRQ1: jsr initlib + jsr initlib ; Push arguments and call main @@ -86,65 +71,41 @@ NoIRQ1: jsr initlib ; Back from main (This is also the _exit entry). Run module destructors -_exit: jsr donelib - - -; Reset the IRQ vector if we chained it. - - pha ; Save the return code on stack - lda #<__INTERRUPTOR_COUNT__ - beq NoIRQ2 - lda IRQInd+1 - ldx IRQInd+2 - sei - sta IRQVec - stx IRQVec+1 - cli +_exit: pha ; Save the return code on stack + jsr donelib ; Copy back the zero page stuff -NoIRQ2: ldx #zpspace-1 -L2: lda zpsave,x - sta sp,x - dex - bpl L2 + ldx #zpspace-1 +L2: lda zpsave,x + sta sp,x + dex + bpl L2 ; Place the program return code into ST - pla - sta ST + pla + sta ST ; Restore system stuff - ldx spsave - txs ; Restore stack pointer - ldx mmusave - stx $01 ; Restore memory configuration + ldx spsave + txs ; Restore stack pointer + ldx mmusave + stx $01 ; Restore memory configuration -; Reset changed vectors, back to basic +; Back to basic - jmp RESTOR - -; ------------------------------------------------------------------------ -; 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 + rts ; ------------------------------------------------------------------------ ; Data -.data - -IRQInd: jmp $0000 - .segment "ZPSAVE" -zpsave: .res zpspace +zpsave: .res zpspace .bss -spsave: .res 1 -mmusave:.res 1 +spsave: .res 1 +mmusave:.res 1