将 assemble 某些指令自动填充到预定地址

Automatic padding to assemble certain instructions into predetermined addresses

我想使用 CA65 来 assemble 需要 运行 自己的 6502 ROM,即没有其他内核可用。我希望我的程序从 $C000 开始。但这意味着我还需要将 [=14=] $C0 放入 $FFFC 处的重置向量中。有没有办法让 CA65 在程序末尾和重置向量之间用零填充我的程序?

即我想做的是写一些类似

的东西
        .org $C000

reset:  ;; Some code from here
        NOP

irq:    ;; more code
        NOP

        .org $FFFC
        ;; What do I put here for padding?!?!

        .addr reset
        .addr irq

得到一个.prg文件,可以直接作为从$C000一直到$FFFF.

的连续ROM区

我想我能做的一件事就是写

        .repeat 123
        .byte 0
        .endrepeat

但这意味着我每次更改程序时都必须更新该数字。

原来 CC65 wiki a page on .ORG 在试图阻止我这样做的同时,还展示了一个使用 .res 和一些 PC 算法的巧妙解决方案:

  .org $C000

reset:  ;; Some code from here
        NOP

irq:    ;; more code
        NOP

        .res $FFFC-*
        .org $FFFC

        .addr reset
        .addr irq

您可以通过在 ld65 配置中定义另一个段来填充空 space 直到指定地址:

ResetAddress: load=RAM1, type=ro, start=FFFC;

然后在代码中,只需执行:

.segment "ResetAddress"
.addr reset
.addr irq
.code
.proc reset
    ;Reset code goes here
.endproc
.proc irq
    ;IRQ code goes here
.endproc

在到达 "ResetAddress" 段的指定起始地址之前,应该用零填充(默认情况下)。如果您只需要对齐到 $100,请改用 align=$100。

我可以看到这种方法的唯一缺点是,它可能相当 "cc65-specific"。

至于之前的 .repeat ... .endrepeat 答案,不推荐,但你也可以让它更灵活:

.MACRO  PadBlock
.LOCAL start
start:
.REPEAT 256-<start
        .byte [=11=]
.ENDREP
.ENDMACRO