如何通过CC65将C64程序重定位至更高内存段?
CC65 调整C64程序内存段的方法
当前你的程序CODE段起始于$0840、结束于$4ED3,确实会和C64$3000开始的字符RAM重叠。CC65没有直接的#pragma指令调整内存段,但可以通过以下两种方式修改代码的加载地址:
1. 修改链接配置文件
C64默认使用c64.cfg配置文件,复制一份自定义配置(比如命名为my_c64.cfg),找到段定义部分,修改CODE段的起始地址:
SEGMENTS { ZEROPAGE: load = $0002, type = zp, define = yes; LOADADDR: load = $07FF, type = ro; EXEHDR: load = $0801, type = ro; STARTUP: load = $080D, type = ro; CODE: load = $C000, type = ro; // 替换为更高的目标地址,比如$C000 RODATA: load = *, type = ro; DATA: load = *, type = rw; INIT: load = *, type = ro; BSS: load = *, type = bss, define = yes; ONCE: load = *, type = bss; }
编译时指定该配置文件:
cl65 -o program.prg -C my_c64.cfg program.c
2. 使用编译链接参数直接指定
无需修改配置文件,用--start-addr参数覆盖CODE段的起始地址:
cl65 -o program.prg --start-addr $C000 program.c
注意事项
- 选择地址时避开C64硬件占用区域:$D000-$DFFF是I/O寄存器,$E000-$FFFF是ROM(无RAM扩展时不可用)。常用安全地址如$C000、$8000(需确认是否与图形RAM/扩展冲突)。
- 修改后重新查看映射文件,确认所有段的地址范围不再与字符RAM重叠。
- 若程序中有直接访问低地址RAM的硬编码,需同步调整。
你的当前映射文件:
Segment list: ------------- Name Start End Size Align ---------------------------------------------------- ZEROPAGE 000002 00001B 00001A 00001 LOADADDR 0007FF 000800 000002 00001 EXEHDR 000801 00080C 00000C 00001 STARTUP 00080D 00083F 000033 00001 CODE 000840 004ED3 004694 00001 <--- RODATA 004ED4 004ED9 000006 00001 DATA 004EDA 004F1D 000044 00001 INIT 004F1E 004F39 00001C 00001 BSS 004F3A 004F44 00000B 00001 ONCE 004F3A 004F5F 000026 00001
内容的提问来源于stack exchange,提问作者KungPhoo
相关产品推荐
相关产品推荐

