Перебирая байты и выводя их на экран как ascii - PullRequest
0 голосов
/ 14 марта 2019

Итак, я пытаюсь вывести ASCII на экран, сохраняя коды ascciASCII в байтовом массиве, но он просто выводит много мусора на экран.

; 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

Ответы [ 2 ]

5 голосов
/ 14 марта 2019

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

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

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

  3. Вы можете немного ускорить свою процедуру, изменив порядок отображаемых байтов и начав обратный отсчет в цикле, а не вверх, что сохраняет вам инструкцию CMP на каждой итерации. Обратите внимание, что мы используем BPL, так как нам нужны байты 0-4, и поэтому мы ждем, пока X не опустится ниже нуля, прежде чем покинуть цикл. Это ограничивает длину сообщения до 127 байт, но тогда, поскольку большая часть узкого места в вашем коде находится в процедуре печати Kernal в $ 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
    
0 голосов
/ 14 марта 2019

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

...