toolchain: gsinit зануляет _DATA (C-семантика статиков) + sprinter-cc --max-allocs
Все четыре crt0 (default/small/minimal/banked): gsinit теперь зануляет _DATA и _BSS через общий zero_area, затем копирует _INITIALIZER. Явные `= 0` у глобалов/статиков больше не нужны (они жгли байты _INITIALIZER в образе). crt0-приватные переменные, записываемые ДО gsinit (_estex_startup_ix и др.), перенесены из _DATA в _CODE (RAM). sprinter-cc: новая опция --max-allocs N → SDCC --max-allocs-per-node (агрессивнее аллокация регистров, меньше/быстрее код ценой времени компиляции). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+31
-15
@@ -27,6 +27,8 @@
|
||||
.globl s__INITIALIZER
|
||||
.globl l__INITIALIZER
|
||||
.globl s__INITIALIZED
|
||||
.globl s__DATA
|
||||
.globl l__DATA
|
||||
.globl s__BSS
|
||||
.globl l__BSS
|
||||
|
||||
@@ -300,10 +302,13 @@ gpn_skip:
|
||||
;; =========================================================================
|
||||
;; Runtime data (HOME's _DATA / _BSS)
|
||||
;; =========================================================================
|
||||
.area _DATA
|
||||
.area _CODE
|
||||
;; Written BEFORE gsinit runs (gsinit zeroes _DATA), so these live in
|
||||
;; _CODE — RAM on the Sprinter, always mapped.
|
||||
_estex_startup_ix::
|
||||
.ds 2
|
||||
|
||||
.area _DATA
|
||||
_argc::
|
||||
.ds 2
|
||||
_argv::
|
||||
@@ -326,32 +331,43 @@ progname_buf:
|
||||
.ds 128 ; ESTEX APPINFO app_path target
|
||||
|
||||
;; =========================================================================
|
||||
;; gsinit — copy _INITIALIZER -> _INITIALIZED, then zero _BSS.
|
||||
;; gsinit — zero _DATA + _BSS, then copy _INITIALIZER -> _INITIALIZED.
|
||||
;; _DATA is zeroed because C guarantees zero-valued statics — this lets
|
||||
;; code drop explicit `= 0` initializers that burn _INITIALIZER bytes.
|
||||
;; =========================================================================
|
||||
.area _GSINIT
|
||||
gsinit::
|
||||
ld bc, #l__INITIALIZER
|
||||
.area _CODE
|
||||
;; zero_area — fill BC bytes at HL with 0 (BC may be zero).
|
||||
zero_area:
|
||||
ld a, b
|
||||
or a, c
|
||||
jr Z, gsinit_bss
|
||||
ld de, #s__INITIALIZED
|
||||
ld hl, #s__INITIALIZER
|
||||
ldir
|
||||
gsinit_bss:
|
||||
ld bc, #l__BSS
|
||||
ld a, b
|
||||
or a, c
|
||||
jr Z, gsinit_done
|
||||
ld hl, #s__BSS
|
||||
ret Z
|
||||
ld (hl), #0
|
||||
dec bc
|
||||
ld a, b
|
||||
or a, c
|
||||
jr Z, gsinit_done
|
||||
ret Z
|
||||
ld d, h
|
||||
ld e, l
|
||||
inc de
|
||||
ldir
|
||||
ret
|
||||
|
||||
.area _GSINIT
|
||||
gsinit::
|
||||
ld hl, #s__DATA
|
||||
ld bc, #l__DATA
|
||||
call zero_area
|
||||
ld hl, #s__BSS
|
||||
ld bc, #l__BSS
|
||||
call zero_area
|
||||
ld bc, #l__INITIALIZER
|
||||
ld a, b
|
||||
or a, c
|
||||
jr Z, gsinit_done
|
||||
ld de, #s__INITIALIZED
|
||||
ld hl, #s__INITIALIZER
|
||||
ldir
|
||||
gsinit_done:
|
||||
|
||||
.area _GSFINAL
|
||||
|
||||
Reference in New Issue
Block a user