Open mvac7 opened 2 years ago
.area _GSINIT
gsinit::
ld bc, #l__INITIALIZER
ld a, b
or a, c
jr Z, gsinit_next
ld de, #s__INITIALIZED
ld hl, #s__INITIALIZER
ldir
gsinit_next:
.area _GSFINAL
ret
HelloWorld.c
const char text01[] = "TEXT ROM32K CRT";
char text02[] = "Hello World!";
Compile:
sdcc -mz80 -o build\ --code-loc 0x4061 --data-loc 0xC000 --use-stdout --no-std-crt0 crt0_MSX32kROM4000.rel src\HelloWorld.c
HelloWorld.asm
.area _CODE
.area _INITIALIZER
__xinit__text02:
.ascii "Hello World!"
.db 0x00
.area _CABS (ABS)
HelloWorld.noi
DEF l__INITIALIZED 0xD
DEF l__INITIALIZER 0xD
DEF s__CODE 0x4061
DEF s__DATA 0xC000
DEF s__INITIALIZED 0xC000
DEF s__GSFINAL 0xC00D
DEF s__GSINIT 0xC00D
DEF s__HOME 0xC00D
DEF s__INITIALIZER 0xC00D
https://github.com/0cjs/ASxxxx
ASxxxx Cross Assembler Documentation
Se definen dos zonas de la memoria, una para el código y otro para los datos.
User Base Address Definitions
_CODE = 0x4061
_DATA = 0xc000
La zona donde se encuentra la inicialización de las variables _INITIALIZER
se generan en el área DATA y debería poderse definir dentro del CODE, para que en el caso de generar una ROM, estos se incluyan dentro.
Esto afecta a la rutina de inicialización de las variables, que se definen en las areas _GSINIT
y _GSFINAL
y por tanto, el compilador las coloca fuera de la ROM, por lo que al intentar ejecutarse no encuentra nada y se cuelga.
No he encontrado confirmación, pero en el CRT0 por defecto para Z80, se define al principio, el orden y la zona donde se deberían generar las diferentes areas, pero al compilar no se aplica.
;; Ordering of segments for the linker.
.area _HOME
.area _CODE
.area _INITIALIZER
.area _GSINIT
.area _GSFINAL
.area _DATA
.area _INITIALIZED
.area _BSEG
.area _BSS
.area _HEAP
I have found a new CRT which I think solves the problem: (corresponding to mori0091's libmsx)
https://github.com/mori0091/libmsx/blob/main/crt0/32k.4000/crt0.s
another CRT with initialization of global variables https://github.com/sndpl/skeleton-sdcc-msx/blob/master/startups/crt0msx.16k.4000.s
crt0.s - Generic crt0.s for a Z80 https://sourceforge.net/p/sdcc/code/HEAD/tree/tags/sdcc-4.1.0/sdcc/device/lib/z80/crt0.s