Использование ассемблера 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-битное значение в формате "младший байт первый"?