Перебор байтов и вывод их на экран в формате ascii

#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:

В дополнение к вашему собственному ответу, три момента, которые вы можете знать, а можете и не знать:

  1. C64 использует PETSCII вместо ASCII — это похоже, но не идентично.

  2. Область памяти $ 033C-$ 03FB (192 байта) является буфером кассеты — это нормально использовать это пространство для временного хранения, но оно будет перезаписано при выполнении операции с лентой.

  3. Вы можете немного ускорить свою процедуру, изменив порядок отображаемых байтов и начав обратный отсчет в вашем цикле, а не в сторону увеличения, что экономит вам инструкции 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:

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