自动填充以将某些指令组装到预定地址中

时间:2015-02-20 09:59:57

标签: assembly 6502 c64 ca65

我想使用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文件,该文件可以直接用作从$C000一直到$FFFF的连续ROM区域。

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

        .repeat 123
        .byte 0
        .endrepeat

但这意味着每次更改程序时都必须更新该号码。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

原来CC65维基有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