]> git.sur5r.net Git - cc65/blobdiff - libsrc/atari/crt0.s
Normalized style.
[cc65] / libsrc / atari / crt0.s
index 85a3ffcde65b2cb1a4a4bdf9c26bdca92d25ab31..f1c7b864e8ffd1d10bd189863eed957650c032dd 100644 (file)
@@ -8,28 +8,26 @@
 ;       Stefan Haubenthal
 ;
 
-        .export         _exit
         .export         __STARTUP__ : absolute = 1      ; Mark as startup
+        .export         _exit, start
 
         .import         initlib, donelib
         .import         callmain, zerobss
-        .import         __STARTUP_LOAD__, __BSS_LOAD__
         .import         __RESERVED_MEMORY__
+        .import         __RAM_START__, __RAM_SIZE__
+.ifdef __ATARIXL__
+        .import         __STACKSIZE__
+        .import         sram_init
+        .import         scrdev
+        .import         findfreeiocb
+        .forceimport    sramprep                        ; force inclusion of the "shadow RAM preparation" load chunk
+        .include        "save_area.inc"
+.endif
 
         .include        "zeropage.inc"
         .include        "atari.inc"
 
 ; ------------------------------------------------------------------------
-; EXE header
-
-.segment        "EXEHDR"
-
-        .word   $FFFF
-        .word   __STARTUP_LOAD__
-        .word   __BSS_LOAD__ - 1
-
-; ------------------------------------------------------------------------
-; Actual code
 
 .segment        "STARTUP"
 
 
 ; Real entry point:
 
+start:
+
+.ifdef __ATARIXL__
+        jsr     sram_init
+.endif
+
 ; Clear the BSS data
 
         jsr     zerobss
 ; Setup the stack
 
         tsx
-        stx     spsave
+        stx     SP_save
+
+.ifdef __ATARIXL__
+
+        lda     #<(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__)
+        sta     sp
+        lda     #>(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__)
+        sta     sp+1
+
+.else
 
 ; Report memory usage
 
         lda     APPMHI
-        sta     appmsav                 ; remember old APPMHI value
+        sta     APPMHI_save             ; remember old APPMHI value
         lda     APPMHI+1
-        sta     appmsav+1
+        sta     APPMHI_save+1
 
         sec
         lda     MEMTOP
@@ -66,6 +79,8 @@
         sta     APPMHI+1
         sta     sp+1                    ; setup runtime stack part 2
 
+.endif
+
 ; Call module constructors
 
         jsr     initlib
 ; Set left margin to 0
 
         lda     LMARGN
-        sta     old_lmargin
+        sta     LMARGN_save
         ldy     #0
         sty     LMARGN
 
 ; Set keyb to upper/lowercase mode
 
         ldx     SHFLOK
-        stx     old_shflok
+        stx     SHFLOK_save
         sty     SHFLOK
 
 ; Initialize conio stuff
 
-        dey                             ; Set X to $FF
-        sty     CH
+        dey                     ; Set Y to $FF
+        sty     CH              ; remove keypress which might be in the input buffer
 
 ; Push arguments and call main
 
@@ -98,26 +113,71 @@ _exit:  jsr     donelib         ; Run module destructors
 
 ; Restore system stuff
 
-        ldx     spsave
+        ldx     SP_save
         txs                     ; Restore stack pointer
 
 ; Restore left margin
 
-        lda     old_lmargin
+        lda     LMARGN_save
         sta     LMARGN
 
 ; Restore kb mode
 
-        lda     old_shflok
+        lda     SHFLOK_save
         sta     SHFLOK
 
 ; Restore APPMHI
 
-        lda     appmsav
+        lda     APPMHI_save
         sta     APPMHI
-        lda     appmsav+1
+        lda     APPMHI_save+1
         sta     APPMHI+1
 
+.ifdef __ATARIXL__
+
+; Atari XL target stuff...
+
+        lda     PORTB_save
+        sta     PORTB
+        lda     RAMTOP_save
+        sta     RAMTOP
+        lda     MEMTOP_save
+        sta     MEMTOP
+        lda     MEMTOP_save+1
+        sta     MEMTOP+1
+
+
+; Issue a GRAPHICS 0 call (copied'n'pasted from TGI drivers) in
+; order to restore screen memory to its defailt location just
+; before the ROM.
+
+        jsr     findfreeiocb
+
+        ; Reopen it in Graphics 0
+        lda     #OPEN
+        sta     ICCOM,x
+        lda     #OPNIN | OPNOT
+        sta     ICAX1,x
+        lda     #0
+        sta     ICAX2,x
+        lda     #<scrdev
+        sta     ICBAL,x
+        lda     #>scrdev
+        sta     ICBAH,x
+        lda     #3
+        sta     ICBLL,x
+        lda     #0
+        sta     ICBLH,x
+        jsr     CIOV_org
+; No error checking here, shouldn't happen(tm), and no way to
+; recover anyway.
+
+        lda     #CLOSE
+        sta     ICCOM,x
+        jsr     CIOV_org
+
+.endif
+
 ; Turn on cursor
 
         ldx     #0
@@ -133,13 +193,9 @@ _exit:  jsr     donelib         ; Run module destructors
 
 .bss
 
-spsave:         .res    1
-appmsav:        .res    1
-old_shflok:     .res    1
-old_lmargin:    .res    1
-
-
-.segment "AUTOSTRT"
-        .word   RUNAD                   ; defined in atari.inc
-        .word   RUNAD+1
-        .word   __STARTUP_LOAD__ + 1
+SP_save:        .res    1
+SHFLOK_save:    .res    1
+LMARGN_save:    .res    1
+.ifndef __ATARIXL__
+APPMHI_save:    .res    2
+.endif