#assembly #6502 #c64
#сборка #6502 #c64
Вопрос:
Итак, я пытаюсь вывести ASCII на экран, сохраняя ASCIASCIICODES в массиве байтов, но это просто выводит на экран много мусора.
; Message: hello
*=$033C
BYTE $48,$45,$49,$49,$4F
*=$1000
START
JSR PRINT_MESSAGE
EXIT
RTS
PRINT_MESSAGE
LDX #$00 ; initialize x to 0
LDA $033C,X ; grab byte
JSR $FFD2 ; render text in A with Subroutine:CLRCHN
INX ; Incriment X
CPX #$05 ; We stop at 5
BNE $1006 ; Else we loop
RTS
Ответ №1:
В дополнение к вашему собственному ответу, три момента, которые вы можете знать, а можете и не знать:
-
C64 использует PETSCII вместо ASCII — это похоже, но не идентично.
-
Область памяти $ 033C-$ 03FB (192 байта) является буфером кассеты — это нормально использовать это пространство для временного хранения, но оно будет перезаписано при выполнении операции с лентой.
-
Вы можете немного ускорить свою процедуру, изменив порядок отображаемых байтов и начав обратный отсчет в вашем цикле, а не в сторону увеличения, что экономит вам инструкции CMP на каждой итерации. Обратите внимание, что мы используем BTL, поскольку нам нужны байты 0-4, и поэтому мы ждем, пока X не упадет ниже нуля, прежде чем выходить из цикла. Это ограничивает длину сообщения 127 байтами, но, поскольку большая часть узкого места в вашем коде находится в процедуре печати ядра в $ FFD2, это, вероятно, академично. Однако метод обратного отсчета и ответвления (вместо обратного отсчета, сравнения и ответвления) является распространенным при написании кода 6502, поскольку он экономит как циклы процессора, так и байты.
; Message: hello *=$033C BYTE $4F,$49,$49,$45,$48 *=$1000 START JSR PRINT_MESSAGE EXIT RTS PRINT_MESSAGE LDX #$04 ; initialize x to message length GETCHAR LDA $033C,X ; grab byte JSR $FFD2 ; render text in A with Subroutine:CLRCHN DEX ; decrement X BPL GETCHAR ; loop until X goes negative RTS
Комментарии:
1. Вау, спасибо за потрясающий ответ, я полный новичок, когда дело доходит до сборки (как для 6502, так и в целом), в моем списке задач есть карта памяти, чтобы я знал, где я могу сохранить свой код, не заставляя c64 взорваться 🙂 И совет о скорости приятно знать, у нас с коллегой небольшое соревнование по поводу того, кто сделает лучшую сборку 6502, так что это поразит его воображение, спасибо: D
Ответ №2:
Я понял это, расположение памяти, которое я использовал для своего массива байтов, было причиной проблемы