0

所以我试图通过将 ascciASCIIcodes 存储在一个字节数组中来将 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
4

2 回答 2

5

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

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

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

  3. 您可以通过颠倒要显示的字节顺序并在循环中倒计时而不是向上倒计时来稍微加快例程 - 这可以在每次迭代中为您节省 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
    
于 2019-03-14T11:54:47.343 回答
0

我想通了,我用于字节数组的内存位置是问题的过程

于 2019-03-13T22:58:09.027 回答