Assembly 自动填充将某些指令组合成预定地址

Assembly 自动填充将某些指令组合成预定地址,assembly,6502,c64,ca65,Assembly,6502,C64,Ca65,我想使用CA65来组装一个6502 ROM,它需要自己运行,也就是说,没有其他内核可用。我希望我的计划从$C000开始。但这意味着我还需要将$00$C0放入$FFFC处的重置向量中。有没有办法让CA65在程序结束和重置向量之间用零填充我的程序 i、 我想做的是写一些 .org $C000 reset: ;; Some code from here NOP irq: ;; more code NOP .org $FFFC

我想使用CA65来组装一个6502 ROM,它需要自己运行,也就是说,没有其他内核可用。我希望我的计划从$C000开始。但这意味着我还需要将$00$C0放入$FFFC处的重置向量中。有没有办法让CA65在程序结束和重置向量之间用零填充我的程序

i、 我想做的是写一些

        .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在试图劝阻我这么做的同时,还显示了一个使用.res和一些PC算法的简洁解决方案:

  .org $C000

reset:  ;; Some code from here
        NOP

irq:    ;; more code
        NOP

        .res $FFFC-*
        .org $FFFC

        .addr reset
        .addr irq

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

复位地址: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

如前所述。重复。endrepeat答案,不建议这样做,但您也可以使其更灵活:

.MACRO  PadBlock
.LOCAL start
start:
.REPEAT 256-<start
        .byte $00
.ENDREP
.ENDMACRO