遍历字节并将它们打印为 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 位置就是问题所在
除了您自己的回答之外,还有三点您可能已经知道也可能还不知道:
C64 使用 PETSCII 而不是 ASCII - 它相似,但不相同。
内存区域 $033C-$03FB(192 字节)是磁带缓冲区 - 可以使用 space 临时存储,但当磁带时它会被覆盖发生操作。
您可以通过反转要显示的字节的顺序并在循环中倒数而不是倒数来稍微加快您的例程 - 这可以在每次迭代中节省一条 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
所以我试图通过存储 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 位置就是问题所在
除了您自己的回答之外,还有三点您可能已经知道也可能还不知道:
C64 使用 PETSCII 而不是 ASCII - 它相似,但不相同。
内存区域 $033C-$03FB(192 字节)是磁带缓冲区 - 可以使用 space 临时存储,但当磁带时它会被覆盖发生操作。
您可以通过反转要显示的字节的顺序并在循环中倒数而不是倒数来稍微加快您的例程 - 这可以在每次迭代中节省一条 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