From: Greg King Date: Wed, 7 Oct 2015 18:56:14 +0000 (-0400) Subject: Reduced the size of the moveinit subroutine. X-Git-Tag: V2.16~215^2~3 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=8a880580dc08238fd4f05e18e27c23316d47a167;p=cc65 Reduced the size of the moveinit subroutine. 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). --- diff --git a/cfg/c64-overlay.cfg b/cfg/c64-overlay.cfg index 58612e18e..5d0f611cb 100644 --- a/cfg/c64-overlay.cfg +++ b/cfg/c64-overlay.cfg @@ -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; diff --git a/cfg/c64.cfg b/cfg/c64.cfg index 861e19faf..e4e275f2e 100644 --- a/cfg/c64.cfg +++ b/cfg/c64.cfg @@ -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, diff --git a/libsrc/c64/crt0.s b/libsrc/c64/crt0.s index 5a69f1584..4953d4ade 100644 --- a/libsrc/c64/crt0.s +++ b/libsrc/c64/crt0.s @@ -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 @@ -19,13 +18,6 @@ ; ------------------------------------------------------------------------ ; 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" diff --git a/libsrc/common/moveinit.s b/libsrc/common/moveinit.s index e9cd5fb64..2186adf0e 100644 --- a/libsrc/common/moveinit.s +++ b/libsrc/common/moveinit.s @@ -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 @@ -19,36 +22,24 @@ ; 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