2010-03-21 17:10:17 +00:00
|
|
|
SYMBOLS {
|
2010-11-12 14:17:35 +00:00
|
|
|
__STACKSIZE__: type = weak, value = $0300; # 3 pages stack
|
2010-03-21 17:10:17 +00:00
|
|
|
}
|
2000-10-31 18:08:25 +00:00
|
|
|
MEMORY {
|
2010-11-12 19:59:02 +00:00
|
|
|
ZP: file = "", start = $0002, size = $001A, type = rw, define = yes;
|
2003-05-02 13:47:43 +00:00
|
|
|
|
|
|
|
# INES Cartridge Header
|
2010-11-12 19:59:02 +00:00
|
|
|
HEADER: file = %O, start = $0000, size = $0010, fill = yes;
|
2003-05-02 13:47:43 +00:00
|
|
|
|
|
|
|
# 2 16K ROM Banks
|
|
|
|
# - startup
|
|
|
|
# - code
|
|
|
|
# - rodata
|
|
|
|
# - data (load)
|
NES memory map amend (16k prg, 8k chr default)
The configuration file and runtime (crt0.s) provided for the default NES
ROM layout (2x16k PRG, 8k CHR) incorrectly added interrupts (IRQ1, IRQ2,
TIMERIRQ) which are not supported by the NES hardware. For example, see
the NESdev wiki, which makes no reference to these interrupts.
https://wiki.nesdev.com/w/index.php/CPU_memory_map
The VECTORS region was also incorrectly set to 0xFFF6, which would have
left the 0xFFF4 normally unspecified. This did not result in any error,
however, since cc65 simply placed ROMV directly after ROM0 regardless of
start address.
(This layout may be due to a copy-and-paste from the PC-Engine
configuration, whose interrupt registers start at 0xFFF6, begins with
the three interrupts listed above, followed by NMI and START, and does
not end with a final IRQ interrupt.)
Despite the absence of any actual error, since START is still placed at
0xFFFC, this patch removes the nonexistent interrupts and also correctly
aligns the ROM0 and ROMV regions. It also has the (admittedly very
minor) benefit of freeing up 6 additional bytes for ROM0.
2016-12-20 11:12:08 +00:00
|
|
|
ROM0: file = %O, start = $8000, size = $7FFA, fill = yes, define = yes;
|
2003-05-02 13:47:43 +00:00
|
|
|
|
|
|
|
# Hardware Vectors at End of 2nd 8K ROM
|
NES memory map amend (16k prg, 8k chr default)
The configuration file and runtime (crt0.s) provided for the default NES
ROM layout (2x16k PRG, 8k CHR) incorrectly added interrupts (IRQ1, IRQ2,
TIMERIRQ) which are not supported by the NES hardware. For example, see
the NESdev wiki, which makes no reference to these interrupts.
https://wiki.nesdev.com/w/index.php/CPU_memory_map
The VECTORS region was also incorrectly set to 0xFFF6, which would have
left the 0xFFF4 normally unspecified. This did not result in any error,
however, since cc65 simply placed ROMV directly after ROM0 regardless of
start address.
(This layout may be due to a copy-and-paste from the PC-Engine
configuration, whose interrupt registers start at 0xFFF6, begins with
the three interrupts listed above, followed by NMI and START, and does
not end with a final IRQ interrupt.)
Despite the absence of any actual error, since START is still placed at
0xFFFC, this patch removes the nonexistent interrupts and also correctly
aligns the ROM0 and ROMV regions. It also has the (admittedly very
minor) benefit of freeing up 6 additional bytes for ROM0.
2016-12-20 11:12:08 +00:00
|
|
|
ROMV: file = %O, start = $FFFA, size = $0006, fill = yes;
|
2003-05-02 13:47:43 +00:00
|
|
|
|
|
|
|
# 1 8k CHR Bank
|
2010-11-12 19:59:02 +00:00
|
|
|
ROM2: file = %O, start = $0000, size = $2000, fill = yes;
|
2003-05-02 13:47:43 +00:00
|
|
|
|
|
|
|
# standard 2k SRAM (-zeropage)
|
|
|
|
# $0100-$0200 cpu stack
|
|
|
|
# $0200-$0500 3 pages for ppu memory write buffer
|
|
|
|
# $0500-$0800 3 pages for cc65 parameter stack
|
2010-11-12 19:59:02 +00:00
|
|
|
SRAM: file = "", start = $0500, size = __STACKSIZE__, define = yes;
|
2003-05-02 13:47:43 +00:00
|
|
|
|
|
|
|
# additional 8K SRAM Bank
|
|
|
|
# - data (run)
|
|
|
|
# - bss
|
|
|
|
# - heap
|
2013-02-12 20:55:19 +00:00
|
|
|
RAM: file = "", start = $6000, size = $2000, define = yes;
|
2000-10-31 18:08:25 +00:00
|
|
|
}
|
|
|
|
SEGMENTS {
|
2016-03-06 20:26:22 +00:00
|
|
|
ZEROPAGE: load = ZP, type = zp;
|
2005-01-08 21:08:04 +00:00
|
|
|
HEADER: load = HEADER, type = ro;
|
2016-03-17 20:31:43 +00:00
|
|
|
STARTUP: load = ROM0, type = ro, define = yes;
|
|
|
|
LOWCODE: load = ROM0, type = ro, optional = yes;
|
|
|
|
ONCE: load = ROM0, type = ro, optional = yes;
|
|
|
|
CODE: load = ROM0, type = ro, define = yes;
|
|
|
|
RODATA: load = ROM0, type = ro, define = yes;
|
|
|
|
DATA: load = ROM0, run = RAM, type = rw, define = yes;
|
2003-05-02 13:47:43 +00:00
|
|
|
VECTORS: load = ROMV, type = rw;
|
|
|
|
CHARS: load = ROM2, type = rw;
|
2016-03-17 20:31:43 +00:00
|
|
|
BSS: load = RAM, type = bss, define = yes;
|
2000-10-31 18:08:25 +00:00
|
|
|
}
|
2000-11-20 23:04:30 +00:00
|
|
|
FEATURES {
|
2013-02-12 20:55:19 +00:00
|
|
|
CONDES: type = constructor,
|
|
|
|
label = __CONSTRUCTOR_TABLE__,
|
|
|
|
count = __CONSTRUCTOR_COUNT__,
|
2016-03-06 20:26:22 +00:00
|
|
|
segment = ONCE;
|
2013-02-12 20:55:19 +00:00
|
|
|
CONDES: type = destructor,
|
|
|
|
label = __DESTRUCTOR_TABLE__,
|
|
|
|
count = __DESTRUCTOR_COUNT__,
|
|
|
|
segment = RODATA;
|
|
|
|
CONDES: type = interruptor,
|
|
|
|
label = __INTERRUPTOR_TABLE__,
|
|
|
|
count = __INTERRUPTOR_COUNT__,
|
|
|
|
segment = RODATA,
|
2012-11-03 21:59:15 +00:00
|
|
|
import = __CALLIRQ__;
|
2001-03-10 14:24:58 +00:00
|
|
|
}
|