2

我想用 CA65 组装一个需要自己运行的 6502 ROM,即没有其他可用的内核。我希望我的程序从$C000. 但这意味着我还需要$00 $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可以直接用作连续ROM区域的文件,从$C000一路到$FFFF.

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

        .repeat 123
        .byte 0
        .endrepeat

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

4

2 回答 2

3

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

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”。

至于以前的 .repeat ... .endrepeat 答案,不建议这样做,但您也可以使其更灵活:

.MACRO  PadBlock
.LOCAL start
start:
.REPEAT 256-<start
        .byte $00
.ENDREP
.ENDMACRO
于 2015-02-28T23:31:37.500 回答
1

原来 CC65 wiki在 .ORG 上有一个页面,虽然试图劝阻我不要这样做,但也显示了一个使用.res和一些 PC 算法的巧妙解决方案:

  .org $C000

reset:  ;; Some code from here
        NOP

irq:    ;; more code
        NOP

        .res $FFFC-*
        .org $FFFC

        .addr reset
        .addr irq
于 2015-02-20T10:10:19.557 回答