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

时间:2019-03-13 22:41:15

标签: assembly 6502 c64

所以我试图通过存储ascciASCII码将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

2 个答案:

答案 0 :(得分:4)

进一步回答您可能不知道的三点:

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

  2. $ 033C- $ 03FB(192字节)的存储区是盒带缓冲区-可以使用该空间进行临时存储,但是在执行磁带操作时它将被覆盖。

    < / li>
  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
    

答案 1 :(得分:0)

我弄清楚了,我用于字节数组的内存位置就是问题的出路