Автоматическое заполнение, чтобы собрать определенные инструкции в заранее определенные адреса
Я хотел бы использовать 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