Использование ассемблера xa65 для создания Commodore 64 .prg

Я пытаюсь изучить сборку 6510, и так как я использую Debian, xa65 - это ассемблер, который я хочу использовать.

Я до сих пор написал кусок кода, который выглядит так:

*=$0801
.byte $0c, $08, $0a, $00, $9e, $20
.byte $34, $30, $39, $36, $00, $00
.byte $00

*=$1000
INC 53280
INC 53281
JMP $1000

Теперь первый раздел.byte предназначен для "автозапуска" программы после загрузки. Это то, что я нашел из учебника, и насколько я понимаю, он будет запускать только SYS 4096, заставляя ЦПУ начать выполнение кода по адресу $1000

Остальная часть кода должна просто начать мерцать внешнюю и внутреннюю границу C64 и повторяться вечно.

При сборке я просто запускаю следующее:

xa test.s -o test.prg

и затем я пытаюсь загрузить test.prg в VICE, чтобы проверить его. с НАГРУЗКОЙ "TEST.PRG",8,1: и даже если файл загружается, он не запускается автоматически, ничего не происходит, если я набираю RUN: и то же самое, если я печатаю LIST: - единственный результат - знаменитый ГОТОВ. и курсор мигает очень счастливо, как обычно.

Я попытался удалить материал автозапуска и собрал только код, начинающийся с *=$1000, но я получил те же результаты. Попытка начать с SYS 4096 также приводит к ГОТОВНОСТИ и больше ничего.

Я уверен, что не правильно использую ассемблер xa, но я не могу понять, как создать правильный файл PRG для использования в C64. Что я делаю неправильно?

3 ответа

Решение

Я пытался выяснить, как сделать xa65 pad своим выводом, когда натолкнулся на ваш вопрос и с тех пор узнал, как он работает. Вот что я нашел.

Как сказал шут, ваш код не будет $1000 так как настройка ПК не выполняет никаких дополнений. Заполнение поддерживается в xa65 с помощью .dsb директива, но для директивы должно быть указано количество байтов, а не просто адрес, как у некоторых ассемблеров .org Директива позволяет. Поскольку ассемблер учитывает простую арифметику, число байтов определяется как <desired address> - PC,

Добавление отсутствующего заголовка адреса.prg и изменение второго изменения вашего ПК на директиву padding приводит к выводу, который ведет себя как ожидалось. Тем не менее, это все еще не делает его автозапуск. LOAD "TEST.PRG",8,1: а также RUN работает, хотя.

.byte $01, $08 ; Load this .prg into $0801

*=$0801
.byte $0c, $08, $0a, $00, $9e, $20
.byte $34, $30, $39, $36, $00, $00
.byte $00

.dsb $1000 - * ; Pad with zeroes from PC to $1000

INC 53280
INC 53281
JMP $1000

FWIW, как использовать метод padding, было не сразу очевидно в документации по xa65 (для меня, по крайней мере).

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

Просто собрать для $1000 и начать свою программу, используя sys 4096, Часто используемая область для помощников по сборке была $c000 (sys 49152) так как это не мешает нормальному basic программы.


Я не знаком с xa65 но, согласно моим тестам, он не дополняет файл, если вы назначаете *, Таким образом, код, который вы ожидаете быть в $1000 не будет там, на самом деле это просто после предыдущего блока. Кроме того, формат c64 prg ожидает начальный адрес в первых двух байтах, который xa64 кажется, не заполнить либо. Мне удалось заставить это работать:

*=$0FFE
.byte $00, $10
INC 53280
INC 53281
JMP $1000

Начать с sys 4096,

PS: VICE имеет встроенный монитор (отладчик уровня машины).

Лично я использую CA65 из пакета CC65, и нашел подходящий макрос для этого.

Если вам интересно, "почему это так сложно", то одна из проблем заключается в том, что вам нужно преобразовать адрес (с которого начинается машинный код) в строку Base-10 petscii.

Здесь вы можете увидеть похожее решение для VIC-20, которое на самом деле рассказывает, что это за загадки.byte: http://techtinkering.com/2013/05/10/adding-a-basic-stub-to-a-vic-20-assembly-language-program/

(Я полагаю, это то же самое на C64)

Лично я использую следующий макрос для создания базовой заглушки в CA65:

.macro Address address, digits
.ifblank digits
    dig=5
.else
    dig=digits
.endif
.if dig>4
    .byte <(((address / 1000) .mod 10) + $30)
.endif
.byte <(((address / 100 ) .mod 10) + $30)
.byte <(((address / 10  ) .mod 10) + $30)
.byte <(((address) .mod 10) + $30)

.endmacro

С цифрами arg, вы можете установить количество цифр до 4, в противном случае вы получите код, такой как SYS 04096 (ничего страшного, но хотел бы избежать траты этого лишнего байта в вводной части 1k:-))

Что касается.byte $01, $08 - поддерживает ли xa65 тип.word, который вставит 16-битное значение в формате "младший байт первый"?

Другие вопросы по тегам