]> git.sur5r.net Git - cc65/blobdiff - libsrc/c64/crt0.s
Changed the solution for the PLOT problem with old -02 kernals to that used
[cc65] / libsrc / c64 / crt0.s
index 607f779be27cc49ce0a0c167a46daf9cac4e7fc4..18ef109048821c6860eb4b6fedbbc99c7d44f36a 100644 (file)
@@ -1,33 +1,33 @@
 ;
 ; Startup code for cc65 (C64 version)
-;
-; This must be the *first* file on the linker command line
 ;
 
        .export         _exit
-       .import         initlib, donelib
-               .import         zerobss, push0
-       .import         _main
+        .export         __STARTUP__ : absolute = 1      ; Mark as startup
+       .import         initlib, donelib, callirq
+               .import         zerobss
+       .import         callmain
         .import         RESTOR, BSOUT, CLRCH
+       .import         __INTERRUPTOR_COUNT__
        .import         __RAM_START__, __RAM_SIZE__     ; Linker generated
 
         .include        "zeropage.inc"
        .include        "c64.inc"
 
 
-.code
-
 ; ------------------------------------------------------------------------
+; Place the startup code in a special segment.
+
+.segment               "STARTUP"
+
 ; BASIC header with a SYS call
 
-       .org    $7FF
         .word   Head            ; Load address
 Head:   .word   @Next
-        .word   1000            ; Line number
+        .word   .version        ; Line number
         .byte   $9E,"2061"      ; SYS 2061
         .byte   $00             ; End of BASIC line
 @Next:  .word   0               ; BASIC end marker
-       .reloc
 
 ; ------------------------------------------------------------------------
 ; Actual code
@@ -47,64 +47,112 @@ L1:        lda     sp,x
        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
+
 ; Clear the BSS data
 
        jsr     zerobss
 
-; Save system stuff and setup the stack
+; Save system settings and setup the stack
+
+        pla
+        sta    mmusave         ; Save the memory configuration
 
                tsx
                stx     spsave          ; Save the system stack ptr
 
-       lda     $01
-       sta     mmusave         ; Save the memory configuration
-       and     #$F8
-               ora     #$06            ; Enable kernal+I/O, disable basic
-       sta     $01
-
        lda     #<(__RAM_START__ + __RAM_SIZE__)
        sta     sp
        lda     #>(__RAM_START__ + __RAM_SIZE__)
                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
+       ldx     #>IRQStub
+       sei
+       sta     IRQVec
+       stx     IRQVec+1
+       cli
+
 ; Call module constructors
 
-       jsr     initlib
+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
+; Back from main (This is also the _exit entry). Run module destructors
 
-; Call module destructors. This is also the _exit entry.
+_exit:  jsr    donelib
 
-_exit: jsr     donelib         ; Run module destructors
 
-; Restore system stuff
+; Reset the IRQ vector if we chained it.
 
-       ldx     spsave
-       txs                     ; Restore stack pointer
-               lda     mmusave
-       sta     $01             ; Restore memory configuration
+        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
 
 ; Copy back the zero page stuff
 
-               ldx     #zpspace-1
-L2:    lda     zpsave,x
-       sta     sp,x
-       dex
+NoIRQ2: ldx    #zpspace-1
+L2:    lda     zpsave,x
+       sta     sp,x
+       dex
                bpl     L2
 
+; Place the program return code into ST
+
+       pla
+       sta     ST
+
+; Restore system stuff
+
+       ldx     spsave
+       txs                     ; Restore stack pointer
+               ldx     mmusave
+       stx     $01             ; Restore memory configuration
+
 ; Reset changed vectors, 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
+
+; ------------------------------------------------------------------------
+; Data
 
 .data
 
+IRQInd: jmp     $0000
+
+.segment        "ZPSAVE"
+
 zpsave:        .res    zpspace
 
 .bss