# linker config. to produce a NEC PC-Engine 8K, 16K, or 32K image (.bin)
SYMBOLS {
    __CARTSIZE__:  type = weak, value = $2000; # $2000, $4000, or $8000
    __STACKSIZE__: type = weak, value = $0300; # 3 pages stack
}
MEMORY {
    ZP:   file = "", start =  $0000,                size = $0100,                 define = yes;
    # RAM bank
    MAIN: file = "", start =  $2200,                size = $1E00 - __STACKSIZE__, define = yes;
    # ROM banks, before swapping, and after mapping
    ROM:  file = %O, start = $10000 - __CARTSIZE__, size = __CARTSIZE__, fill = yes, fillval = $FF;
}
SEGMENTS {
    ZEROPAGE: load = ZP,              type = zp;
    EXTZP:    load = ZP,              type = zp,  optional = yes;
    APPZP:    load = ZP,              type = zp,  optional = yes;
    DATA:     load = ROM, run = MAIN, type = rw,                  define = yes;
    INIT:     load = MAIN,            type = bss, optional = yes;
    BSS:      load = MAIN,            type = bss,                 define = yes;
    RODATA:   load = ROM,             type = ro;
    CODE:     load = ROM,             type = ro;
    LOWCODE:  load = ROM,             type = ro,  optional = yes;
    ONCE:     load = ROM,             type = ro,  optional = yes;
    STARTUP:  load = ROM,             type = ro,  start = $FFF6 - $0066;
    VECTORS:  load = ROM,             type = ro,  start = $FFF6;
}
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__;
}
