LOADADDR: file = %O, start = %S - 2, size = $0002;
HEADER: file = %O, define = yes, start = %S, size = $000D;
MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __OVERLAYSTART__ - __STACKSIZE__ - __HEADER_LAST__;
- MOVE: file = %O, start = __INITBSS_LOAD__, size = __HIMEM__ - __BSS_RUN__;
- INIT: file = "", start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__;
+ INIT: file = %O, start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__;
OVL1ADDR: file = "%O.1", start = __OVERLAYSTART__ - 2, size = $0002;
OVL1: file = "%O.1", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
OVL2ADDR: file = "%O.2", start = __OVERLAYSTART__ - 2, size = $0002;
OVL9: file = "%O.9", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
}
SEGMENTS {
- ZEROPAGE: load = ZP, type = zp;
- LOADADDR: load = LOADADDR, type = ro;
- EXEHDR: load = HEADER, type = ro;
- STARTUP: load = MAIN, type = ro;
- LOWCODE: load = MAIN, type = ro, optional = yes;
- CODE: load = MAIN, type = ro;
- RODATA: load = MAIN, type = ro;
- DATA: load = MAIN, type = rw;
- INITBSS: load = MAIN, type = bss, define = yes;
- BSS: load = MAIN, type = bss, define = yes;
- INIT: load = MOVE, run = INIT, type = ro, define = yes;
- OVL1ADDR: load = OVL1ADDR, type = ro;
- OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes;
- OVL2ADDR: load = OVL2ADDR, type = ro;
- OVERLAY2: load = OVL2, type = ro, define = yes, optional = yes;
- OVL3ADDR: load = OVL3ADDR, type = ro;
- OVERLAY3: load = OVL3, type = ro, define = yes, optional = yes;
- OVL4ADDR: load = OVL4ADDR, type = ro;
- OVERLAY4: load = OVL4, type = ro, define = yes, optional = yes;
- OVL5ADDR: load = OVL5ADDR, type = ro;
- OVERLAY5: load = OVL5, type = ro, define = yes, optional = yes;
- OVL6ADDR: load = OVL6ADDR, type = ro;
- OVERLAY6: load = OVL6, type = ro, define = yes, optional = yes;
- OVL7ADDR: load = OVL7ADDR, type = ro;
- OVERLAY7: load = OVL7, type = ro, define = yes, optional = yes;
- OVL8ADDR: load = OVL8ADDR, type = ro;
- OVERLAY8: load = OVL8, type = ro, define = yes, optional = yes;
- OVL9ADDR: load = OVL9ADDR, type = ro;
- OVERLAY9: load = OVL9, type = ro, define = yes, optional = yes;
+ ZEROPAGE: load = ZP, type = zp;
+ LOADADDR: load = LOADADDR, type = ro;
+ EXEHDR: load = HEADER, type = ro;
+ STARTUP: load = MAIN, type = ro;
+ LOWCODE: load = MAIN, type = ro, optional = yes;
+ CODE: load = MAIN, type = ro;
+ RODATA: load = MAIN, type = ro;
+ DATA: load = MAIN, type = rw;
+ INITBSS: load = MAIN, type = rw;
+ BSS: load = MAIN, type = bss, define = yes;
+ INIT: load = INIT, type = ro;
+ OVL1ADDR: load = OVL1ADDR, type = ro;
+ OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes;
+ OVL2ADDR: load = OVL2ADDR, type = ro;
+ OVERLAY2: load = OVL2, type = ro, define = yes, optional = yes;
+ OVL3ADDR: load = OVL3ADDR, type = ro;
+ OVERLAY3: load = OVL3, type = ro, define = yes, optional = yes;
+ OVL4ADDR: load = OVL4ADDR, type = ro;
+ OVERLAY4: load = OVL4, type = ro, define = yes, optional = yes;
+ OVL5ADDR: load = OVL5ADDR, type = ro;
+ OVERLAY5: load = OVL5, type = ro, define = yes, optional = yes;
+ OVL6ADDR: load = OVL6ADDR, type = ro;
+ OVERLAY6: load = OVL6, type = ro, define = yes, optional = yes;
+ OVL7ADDR: load = OVL7ADDR, type = ro;
+ OVERLAY7: load = OVL7, type = ro, define = yes, optional = yes;
+ OVL8ADDR: load = OVL8ADDR, type = ro;
+ OVERLAY8: load = OVL8, type = ro, define = yes, optional = yes;
+ OVL9ADDR: load = OVL9ADDR, type = ro;
+ OVERLAY9: load = OVL9, type = ro, define = yes, optional = yes;
}
FEATURES {
CONDES: type = constructor,
LOADADDR: file = %O, start = %S - 2, size = $0002;
HEADER: file = %O, define = yes, start = %S, size = $000D;
MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __STACKSIZE__ - __HEADER_LAST__;
- MOVE: file = %O, start = __INITBSS_LOAD__, size = __HIMEM__ - __BSS_RUN__;
- INIT: file = "", start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__;
+ INIT: file = %O, start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__;
}
SEGMENTS {
- ZEROPAGE: load = ZP, type = zp;
- LOADADDR: load = LOADADDR, type = ro;
- EXEHDR: load = HEADER, type = ro;
- STARTUP: load = MAIN, type = ro;
- LOWCODE: load = MAIN, type = ro, optional = yes;
- CODE: load = MAIN, type = ro;
- RODATA: load = MAIN, type = ro;
- DATA: load = MAIN, type = rw;
- INITBSS: load = MAIN, type = bss, define = yes;
- BSS: load = MAIN, type = bss, define = yes;
- INIT: load = MOVE, run = INIT, type = ro, define = yes;
+ ZEROPAGE: load = ZP, type = zp;
+ LOADADDR: load = LOADADDR, type = ro;
+ EXEHDR: load = HEADER, type = ro;
+ STARTUP: load = MAIN, type = ro;
+ LOWCODE: load = MAIN, type = ro, optional = yes;
+ CODE: load = MAIN, type = ro;
+ RODATA: load = MAIN, type = ro;
+ DATA: load = MAIN, type = rw;
+ INITBSS: load = MAIN, type = rw;
+ BSS: load = MAIN, type = bss, define = yes;
+ INIT: load = INIT, type = ro, define = yes;
}
FEATURES {
CONDES: type = constructor,
.export __STARTUP__ : absolute = 1 ; Mark as startup
.import initlib, donelib
- .import moveinit, zerobss, callmain
+ .import zerobss, callmain
.import BSOUT
.import __MAIN_START__, __MAIN_SIZE__ ; Linker generated
.import __STACKSIZE__ ; from configure file
Start:
-; Switch to the second charset.
-
- lda #14
- jsr BSOUT
-
; Switch off the BASIC ROM.
lda $01
tsx
stx spsave ; Save the system stack ptr
-; Allow some re-entrancy by skipping the next task if it already was done.
-; This sometimes can let us rerun the program without reloading it.
-
- ldx move_init
- beq L0
-
-; Move the INIT segment from where it was loaded (over the bss segments)
-; into where it must be run (over the BSS segment).
-
- jsr moveinit
- dec move_init ; Set to false
-
; Save space by putting some of the start-up code in the INIT segment,
; which can be re-used by the BSS segment, the heap and the C stack.
-L0: jsr runinit
+ jsr init
; Clear the BSS data.
.segment "INIT"
-runinit:
+init:
; Save the zero-page locations that we need.
sta sp
stx sp+1 ; Set argument stack ptr
+; Switch to the second charset.
+
+ lda #14
+ jsr BSOUT
+
; Call the module constructors.
jmp initlib
; ------------------------------------------------------------------------
; Data
-.data
-
-; These two variables were moved out of the BSS segment, and into DATA, because
-; we need to use them before INIT is moved off of BSS, and before BSS is zeroed.
+.segment "INITBSS"
mmusave:.res 1
spsave: .res 1
-
-move_init:
- .byte 1
-
-.segment "INITBSS"
-
zpsave: .res zpspace
+++ /dev/null
-;
-; 2015-10-07, Greg King
-;
-
- .export moveinit
-
- .import __INIT_LOAD__, __INIT_RUN__, __INIT_SIZE__ ; Linker-generated
-
- .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 (over the BSS segment). The two areas might overlap;
-; and, the segment is moved upwards. Therefore, this code starts at the highest
-; address, and decrements to the lowest address. The low bytes of the starting
-; pointers are not sums. The high bytes are sums; but, they do not include the
-; carry. Both the low-byte sums and the carries will be done when the pointers
-; are indexed by the .Y register.
-
-moveinit:
-
-; First, move the last, partial page.
-; Then, move all of the full pages.
-
- ldy #<__INIT_SIZE__ ; size of partial page
- 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
- bnz L1 ; page not finished
-
- dec init_load+2
- dec init_run+2
- dex
- bnz L1 ; move next page
- rts