cc65 / cc65

cc65 - a freeware C compiler for 6502 based systems

Home Page:https://cc65.github.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

cx16.cfg missing second Zeropage range and golden space (Feature request)

m00dawg opened this issue · comments

I noticed the default cx16.cfg included with ca65 doesn't have allocations for the 2nd ZP range or GOLDEN though the X16 memory map would allow for this (https://github.com/X16Community/x16-docs/blob/master/X16%20Reference%20-%2007%20-%20Memory%20Map.md#ram-contents). The sections have dual purpose depending on if the BAISC math or BASIC functions are being used, though could still be usable. The GOLDEN area is untouched so could be useful as bss.

Here's what I was thinking:

FEATURES {
    STARTADDRESS: default = $0801;
}
SYMBOLS {
    __LOADADDR__:     type = import;
    __EXEHDR__:       type = import;
    __STACKSIZE__:    type = weak,   value = $0800; # 2k stack
    __HIMEM__:        type = weak,   value = $9F00;
}
MEMORY {
    ZP:       file = "", define = yes, start = $0022,                size = $0080 - $0022;
    # Overwrites the math and BASIC area
    ZP_EXT:   file = "", define = yes, start = $00A9,                size = $00FF - $00A9;
    LOADADDR: file = %O,               start = %S - 2,               size = $0002;
    HEADER:   file = %O, define = yes, start = %S,                   size = $000D;
    MAIN:     file = %O, define = yes, start = __HEADER_LAST__,      size = __HIMEM__ - __HEADER_LAST__;
    BSS:      file = "",               start = __ONCE_RUN__,         size = __HIMEM__ - __ONCE_RUN__ - __STACKSIZE__;
    GOLDEN:   start = $0400,  size = $0400;
}
SEGMENTS {
    ZEROPAGE: load = ZP,       type = zp;
    EXTZP:    load = ZP_EXT,       type = zp,                optional = yes;
    LOADADDR: load = LOADADDR, type = ro;
    EXEHDR:   load = HEADER,   type = ro;
    STARTUP:  load = MAIN,     type = ro;
    LOWCODE:  load = MAIN,     type = ro,                optional = yes;
    CODE:     load = MAIN,     type = ro;
    RODATA:   load = MAIN,     type = ro;
    DATA:     load = MAIN,     type = rw;
    INIT:     load = MAIN,     type = rw;
    ONCE:     load = MAIN,     type = ro,  define = yes;
    BSS:      load = BSS,      type = bss, define = yes;
    GOLDEN:   load = GOLDEN,   type = bss, define = yes;
}
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__;
}

That's actually what I use in my own programs though having these built in would be one less thing for a programmer to have to add?