mvac7 / SDCC_startup_MSX32kROM4000

Startup file (CRT) for developing a MSX 32K ROM using Small Device C Compiler (SDCC).
6 stars 0 forks source link

Initialize global variables #2

Open mvac7 opened 2 years ago

mvac7 commented 2 years ago

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

mvac7 commented 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
mvac7 commented 2 years ago

https://github.com/sehugg/cvlibc/blob/master/libcv/src/crt0-msx.s

mvac7 commented 2 years ago

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
mvac7 commented 2 years ago

sdasz80 - ASxxxx Cross Assembler

https://github.com/0cjs/ASxxxx

ASxxxx Cross Assembler Documentation

ASZ80 Assembler

mvac7 commented 2 years ago

https://www.cpcwiki.eu/forum/programming/cpctelerasdcc-initialization-of-variables-and-arrays-in-headerfile/

mvac7 commented 2 years ago

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
mvac7 commented 2 years ago

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

mvac7 commented 2 years ago

another CRT with initialization of global variables https://github.com/sndpl/skeleton-sdcc-msx/blob/master/startups/crt0msx.16k.4000.s