0

そのため、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
4

2 に答える 2

5

あなた自身の答えに加えて、あなたがまだ知っているかもしれないし、知らないかもしれない3つのポイント:

  1. C64 はASCII ではなくPETSCIIを使用します - 似ていますが、同一ではありません。

  2. メモリ領域 $033C-$03FB (192 バイト) はカセット バッファーです。このスペースを一時的なストレージとして使用しても問題ありませんが、テープ操作が発生すると上書きされます。

  3. 表示するバイトの順序を逆にし、ループ内でカウントアップではなくカウントダウンすることで、ルーチンを少し高速化できます。これにより、反復ごとに CMP 命令を節約できます。バイト 0 ~ 4 が必要なため、BPL を使用していることに注意してください。したがって、X がゼロを下回るまで待ってからループを終了します。これにより、メッセージの長さが 127 バイトに制限されますが、コードのボトルネックのほとんどが $FFD2 のカーネル出力ルーチンにあるため、これはおそらくアカデミックです。ただし、CPU サイクルとバイトの両方を節約できるため、(カウントアップおよび比較および分岐の代わりに) カウントダウンおよび分岐手法は 6502 コーディングの一般的なトリックです。

    ; 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 に答える