遍历字节并将它们打印为 ascii 屏幕

Iterating over bytes and printing them to screen as ascii

所以我试图通过存储 ascciASCII 代码将 ASCII 打印到屏幕上 在一个字节数组中,但它只会在屏幕上呈现大量垃圾。

; Message: hello
*=3C        
        BYTE ,,,,F 
*=00
START
    JSR            PRINT_MESSAGE
EXIT
    RTS
PRINT_MESSAGE
    LDX #[=10=]        ; initialize x to 0
    LDA 3C,X     ; grab byte
    JSR $FFD2       ; render text in A with Subroutine:CLRCHN
    INX             ; Incriment X
    CPX #        ; We stop at 5
    BNE 06       ; Else we loop
    RTS

我想通了,我用于字节数组的 mem 位置就是问题所在

除了您自己的回答之外,还有三点您可能已经知道也可能还不知道:

  1. C64 使用 PETSCII 而不是 ASCII - 它相似,但不相同。

  2. 内存区域 $033C-$03FB(192 字节)是磁带缓冲区 - 可以使用 space 临时存储,但当磁带时它会被覆盖发生操作。

  3. 您可以通过反转要显示的字节的顺序并在循环中倒数而不是倒数来稍微加快您的例程 - 这可以在每次迭代中节省一条 CMP 指令。请注意,我们使用 BPL 是因为我们需要字节 0-4,因此我们在离开循环之前等到 X 降到零以下。这将消息长度限制为 127 个字节,但是由于代码中的大部分瓶颈都在 $FFD2 处的内核打印例程中,这可能是学术性的。然而,倒数和分支技术(而不是计数和比较和分支)是 6502 编码中的常见技巧,因为它节省了 CPU 个周期和字节。

    ; Message: hello
    *=3C        
        BYTE F,,,,
    *=00
    START
        JSR            PRINT_MESSAGE
    EXIT
        RTS
    PRINT_MESSAGE
        LDX #        ; initialize x to message length
    GETCHAR
        LDA 3C,X     ; grab byte
        JSR $FFD2       ; render text in A with Subroutine:CLRCHN
        DEX             ; decrement X
        BPL GETCHAR     ; loop until X goes negative
        RTS