Автоматическое заполнение, чтобы собрать определенные инструкции в заранее определенные адреса

Я хотел бы использовать CA65 для сборки ПЗУ 6502, которое должно работать самостоятельно, т.е. другого доступного ядра нет. Я бы хотел, чтобы моя программа начиналась с $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,

Я думаю, что я мог бы написать

        .repeat 123
        .byte 0
        .endrepeat

но это означало бы необходимость обновлять это число каждый раз, когда я меняю свою программу.

2 ответа

Решение

Оказывается, на вики- странице CC65 есть страница на.ORG, которая, пытаясь отговорить меня от этого, также показывает изящное решение, использующее .res и немного компьютерной арифметики:

  .org $C000

reset:  ;; Some code from here
        NOP

irq:    ;; more code
        NOP

        .res $FFFC-*
        .org $FFFC

        .addr reset
        .addr irq

Вы можете заполнить пустое пространство до указанного адреса, определив другой сегмент в вашей конфигурации 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 долларов, используйте вместо этого выравнивание = 100 долларов.

Единственный недостаток, который я вижу в этом подходе, это, скорее всего, "специфичность для cc65".

Что касается предыдущего ответа.repeat....endrepeat, я бы не рекомендовал этого, но вы можете сделать его более гибким:

.MACRO  PadBlock
.LOCAL start
start:
.REPEAT 256-<start
        .byte $00
.ENDREP
.ENDMACRO
Другие вопросы по тегам