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

Я хотел бы использовать 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

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


person Cactus    schedule 20.02.2015    source источник


Ответы (2)


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

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

  .org $C000

reset:  ;; Some code from here
        NOP

irq:    ;; more code
        NOP

        .res $FFFC-*
        .org $FFFC

        .addr reset
        .addr irq
person Cactus    schedule 20.02.2015