]> git.sur5r.net Git - cc65/commitdiff
Reduced the size of the moveinit subroutine.
authorGreg King <gregdk@users.sf.net>
Wed, 7 Oct 2015 18:56:14 +0000 (14:56 -0400)
committerGreg King <gregdk@users.sf.net>
Wed, 7 Oct 2015 18:56:14 +0000 (14:56 -0400)
Made other changes that were recommended by Oliver.
* Changed its name from move_init to moveinit.
* Used self-modifying code in the subroutine.
* The INIT segment doesn't need to be optional (it's used by the start-up file).

cfg/c64-overlay.cfg
cfg/c64.cfg
libsrc/c64/crt0.s
libsrc/common/moveinit.s

index 58612e18ed02b511bc2b6b2e4b1b40a4bfeb47a2..5d0f611cb4bf27949621d7bf99410d4134de920b 100644 (file)
@@ -46,7 +46,7 @@ SEGMENTS {
     DATA:     load = RAM,             type = rw;
     ZPSAVE:   load = RAM,             type = bss, define = yes;
     BSS:      load = RAM,             type = bss, define = yes;
-    INIT:     load = MOVE, run = RAM, type = ro,  define = yes, optional = yes;
+    INIT:     load = MOVE, run = RAM, type = ro,  define = yes;
     OVL1ADDR: load = OVL1ADDR,        type = ro;
     OVERLAY1: load = OVL1,            type = ro,  define = yes, optional = yes;
     OVL2ADDR: load = OVL2ADDR,        type = ro;
index 861e19faf78cd846fbf82454ebd5faf5ce8133b4..e4e275f2ed1a38b81388d40aebae95c779264a79 100644 (file)
@@ -25,7 +25,7 @@ SEGMENTS {
     DATA:     load = RAM,             type = rw;
     ZPSAVE:   load = RAM,             type = bss, define = yes;
     BSS:      load = RAM,             type = bss, define = yes;
-    INIT:     load = MOVE, run = RAM, type = ro,  define = yes, optional = yes;
+    INIT:     load = MOVE, run = RAM, type = ro,  define = yes;
 }
 FEATURES {
     CONDES: type    = constructor,
index 5a69f158488f9a3ff12494da4622dcfc8bed9d94..4953d4ade3533725d00f7a5085bcd60d3f4558eb 100644 (file)
@@ -3,12 +3,11 @@
 ;
 
         .export         _exit
-        .exportzp       init_load_, init_run_
         .export         __STARTUP__ : absolute = 1      ; Mark as startup
 
         .import         initlib, donelib
-        .import         move_init, zerobss, callmain
-        .import         RESTOR, BSOUT, CLRCH
+        .import         moveinit, zerobss, callmain
+        .import         BSOUT
         .import         __HIMEM__                       ; from configure file
         .importzp       ST
 
 ; ------------------------------------------------------------------------
 ; Startup code
 
-; Two zero-page pointers are needed before any zero-page stuff is saved.
-; Choose locations that are not used by anything.
-
-init_load_      :=      FREKZP
-init_run_       :=      FREKZP+2
-
-
 .segment        "STARTUP"
 
 Start:
@@ -49,17 +41,17 @@ Start:
 ; Allow some re-entrancy by skipping the next task if it already was done.
 ; This often can let us rerun the program without reloading it.
 
-        ldx     moveinit
+        ldx     move_init
         beq     L0
 
 ; Move the INIT segment from where it was loaded (over ZPSAVE and BSS)
 ; into where it must be run (in the heap).
 
-        jsr     move_init
-        dec     moveinit        ; set to false
+        jsr     moveinit
+        dec     move_init       ; set to false
 
 ; Save space by putting the rest of the start-up code in the INIT segment,
-; which can be re-used by the heap.
+; which can be re-used by the heap and the C stack.
 
 L0:     jsr     initstart
 
@@ -134,7 +126,7 @@ L1:     lda     sp,x
 
 mmusave:.res    1
 spsave: .res    1
-moveinit:
+move_init:
         .byte   1
 
 .segment        "ZPSAVE"
index e9cd5fb64f1c7c979aa4b2d745ffc10456ff5ab8..2186adf0e05c7ee1240ae674abb1fe6840064bc6 100644 (file)
@@ -1,16 +1,19 @@
 ;
-; 2015-10-04, Greg King
+; 2015-10-07, Greg King
 ;
 
-        .export         move_init
+        .export         moveinit
 
         .import         __INIT_LOAD__, __INIT_RUN__, __INIT_SIZE__ ; Linker-generated
-        .importzp       init_load_, init_run_
 
         .macpack        cpu
         .macpack        generic
 
 
+; Put this in the DATA segment because it is self-modifying code.
+
+.data
+
 ; Move the INIT segment from where it was loaded (over the bss segments)
 ; into where it must be run (in the heap).  The two areas might overlap; and,
 ; the segment is moved upwards.  Therefore, this code starts at the highest
 ; carry.  Both the low-byte sums and the carries will be done when the pointers
 ; are indexed by the .Y register.
 
-move_init:
-        lda     #<__INIT_LOAD__
-        ldx     #>__INIT_LOAD__ + >__INIT_SIZE__
-        sta     init_load_
-        stx     init_load_+1
-        lda     #<__INIT_RUN__
-        ldx     #>__INIT_RUN__ + >__INIT_SIZE__
-        sta     init_run_
-        stx     init_run_+1
+moveinit:
 
 ; First, move the last, partial page.
 ; Then, move all of the full pages.
 
-        ldx     #>__INIT_SIZE__ + 1     ; number of pages, including partial
         ldy     #<__INIT_SIZE__         ; size of partial page
-.if     .cpu & CPU_ISET_65SC02
-        bra     L3
-.else
-        jmp     L3
-.endif
-
-L1:     dec     init_load_+1
-        dec     init_run_+1
-
-L2:     dey
-        lda     (init_load_),y
-        sta     (init_run_),y
+        ldx     #>__INIT_SIZE__ + (<__INIT_SIZE__ <> 0)  ; number of pages, including partial
+
+L1:     dey
+init_load:
+        lda     __INIT_LOAD__ + (__INIT_SIZE__ & $FF00) - $0100 * (<__INIT_SIZE__ = 0),y
+init_run:
+        sta     __INIT_RUN__  + (__INIT_SIZE__ & $FF00) - $0100 * (<__INIT_SIZE__ = 0),y
         tya
-L3:     bnz     L2                      ; page not finished
+        bnz     L1                      ; page not finished
 
+        dec     init_load+2
+        dec     init_run+2
         dex
         bnz     L1                      ; move next page
         rts