# This config file provides a single big upper memory block (HIDDEN_RAM).
# To achieve this, it relocates the character generator from $E000 to CHARGEN.
# The runtime library must be compiled with CHARGEN_RELOC for this config
# file to work. See libsrc/atari/Makefile.inc.

FEATURES {
    STARTADDRESS: default = $2400;
}
SYMBOLS {
    __EXEHDR__:       type = import;
    __SYSTEM_CHECK__: type = import;                # force inclusion of "system check" load chunk
    __AUTOSTART__:    type = import;                # force inclusion of autostart "trailer"
    __STACKSIZE__:    type = weak,   value = $0800; # 2k stack
    __CHARGENSIZE__:  type = weak,   value = $0400;
    __STARTADDRESS__: type = export, value = %S;
}
MEMORY {
    ZP:         file = "", define = yes, start = $0082,                   size = $007E;

# just $FFFF
    HEADER:     file = %O,               start = $0000,                   size = $0002;

# "system check" load chunk
    SYSCHKHDR:  file = %O,               start = $0000,                   size = $0004;
    SYSCHKCHNK: file = %O,               start = $2E00,                   size = $0300;
    SYSCHKTRL:  file = %O,               start = $0000,                   size = $0006;

# "shadow RAM preparation" load chunk
    SRPREPHDR:  file = %O,               start = $0000,                   size = $0004;
    SRPREPCHNK: file = %O, define = yes, start = %S,                      size = $7C20 - %S - $07FF;  # $07FF: space for temp. chargen buffer, 1K aligned
    SRPREPTRL:  file = %O,               start = $0000,                   size = $0006;

# "main program" load chunk
    MAINHDR:    file = %O,               start = $0000,                   size = $0004;
    MAIN:       file = %O, define = yes, start = %S + __LOWBSS_SIZE__,    size = $D000 - __STACKSIZE__ - %S - __LOWBSS_SIZE__;

# defines entry point into program
    TRAILER:    file = %O,               start = $0000,                   size = $0006;

# address of relocated character generator
    CHARGEN:    file = "", define = yes, start = $D800,                   size = __CHARGENSIZE__;

# memory beneath the ROM
    HIDDEN_RAM: file = "", define = yes, start = $D800 + __CHARGENSIZE__, size = $FFFA - $D800 - __CHARGENSIZE__;
}
SEGMENTS {
    ZEROPAGE:    load = ZP,                           type = zp;
    EXTZP:       load = ZP,                           type = zp,                optional = yes;

    EXEHDR:      load = HEADER,                       type = ro;

    SYSCHKHDR:   load = SYSCHKHDR,                    type = ro,                optional = yes;
    SYSCHK:      load = SYSCHKCHNK,                   type = rw,  define = yes, optional = yes;
    SYSCHKTRL:   load = SYSCHKTRL,                    type = ro,                optional = yes;

    SRPREPHDR:   load = SRPREPHDR,                    type = ro;
    LOWBSS:      load = SRPREPCHNK,                   type = bss, define = yes;  # shared btw. SRPREPCHNK and MAIN, not zero initialized
    SRPREP:      load = SRPREPCHNK,                   type = rw,  define = yes;
    SHADOW_RAM:  load = SRPREPCHNK, run = HIDDEN_RAM, type = rw,  define = yes, optional = yes;
    SHADOW_RAM2: load = SRPREPCHNK, run = HIDDEN_RAM, type = rw,  define = yes, optional = yes;
    SRPREPTRL:   load = SRPREPTRL,                    type = ro;

    MAINHDR:     load = MAINHDR,                      type = ro;
    STARTUP:     load = MAIN,                         type = ro,  define = yes;
    LOWCODE:     load = MAIN,                         type = ro,  define = yes, optional = yes;
    ONCE:        load = MAIN,                         type = ro,                optional = yes;
    CODE:        load = MAIN,                         type = ro,  define = yes;
    RODATA:      load = MAIN,                         type = ro;
    DATA:        load = MAIN,                         type = rw;
    INIT:        load = MAIN,                         type = bss, define = yes, optional = yes;
    BSS:         load = MAIN,                         type = bss, define = yes;
    AUTOSTRT:    load = TRAILER,                      type = ro;
}
FEATURES {
    CONDES: type    = constructor,
            label   = __CONSTRUCTOR_TABLE__,
            count   = __CONSTRUCTOR_COUNT__,
            segment = ONCE;
    CONDES: type    = destructor,
            label   = __DESTRUCTOR_TABLE__,
            count   = __DESTRUCTOR_COUNT__,
            segment = RODATA;
    CONDES: type    = interruptor,
            label   = __INTERRUPTOR_TABLE__,
            count   = __INTERRUPTOR_COUNT__,
            segment = RODATA,
            import  = __CALLIRQ__;
}
