因此,我试图通过将ascciASCIIcode存储在字节数组中来将ASCII打印到屏幕上,但是它只是在屏幕上呈现了很多杂色。
; 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
Run Code Online (Sandbox Code Playgroud)
根据您自己的答案,您可能会或可能不会知道三点:
$ 033C- $ 03FB(192字节)的存储区是盒带缓冲区-可以使用该空间进行临时存储,但是在执行磁带操作时它将被覆盖。
您可以通过反转要显示的字节顺序并在循环中向下而不是向上计数来加快例程的速度,从而在每次迭代时节省CMP指令。请注意,我们使用BPL是因为我们想要0-4字节,因此我们要等到X降到零以下再离开循环。这将消息长度限制为127个字节,但是由于代码中的大部分瓶颈位于$ FFD2的内核打印例程中,因此可能是学术上的。但是,递减计数和分支技术(而不是递增计数和比较和分支)是6502编码中的常见技巧,因为它既节省了CPU周期,又节省了字节。
; 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
Run Code Online (Sandbox Code Playgroud)