4

画面をクリアした後、文字列を画面メモリに出力する 6502 コードがあります。残念ながら、「HELLO WORLD」などの文字列を出力すると、文字化けしてしまいます。これは、ここの PETSCII コードから考えた 0x41 ではなく、大文字が 0x01 で始まるためであることがわかりました。

文字列から 0x40 を減算することでこれを修正できますが、スペースなど、文字以外のすべてが正しくありません。文字ジェネレーターが 0x01 を 0x41 ではなく文字 'A' に変換する理由がわかりません。0x41 を逆スペード記号 (トランプのデッキのように) に変換し、その上にあるものはすべて境界文字と奇妙な記号のように見えます。

しばらく見回した後、私が解決しようとしている問題を述べているように見える PETSCII のウィキペディアのページでこの引用を見つけましたが、それを修正する方法がわからず、どこにも情報が見つかりません...

実際のキャラクタ ジェネレータ ROM は、異なる割り当てセットを使用していました。たとえば、画面メモリを直接 POKE して画面に文字 "@ABC" を表示するには、64、65、66、および 67 ではなく、10 進数の値 0、1、2、および 3 を POKE します。

私は Mac OS X の VICE x64 エミュレーターで実行しており、64tass の OS X ポートでアセンブルしています。

これは、0x40 を減算しないアセンブリ コードです。

*=$c000

BORDER = $d020
INNER = $d021

start   lda #0
        sta BORDER
        lda #0
        sta INNER

        jsr clear
        jsr string

loop    
        jmp loop


clear   ; clear screen
        lda #$00
        tax
        lda #$20
clrloop 
        sta $0400, x ; clear each memory "row"
        sta $0500, x
        sta $0600, x
        sta $0700, x
        dex
        bne clrloop  ; clear if x != 0
        rts

string  ; load string
        ldx #$0
strloop lda hello, x ; load each byte in turn
        cmp #0       ; if we reached a null byte, break
        beq strexit
        sta $0400, x
        inx
        jmp strloop
strexit rts


hello   .text "HELLO WORLD"
        .byte 0

ここに出力のスクリーンショットがあります

ここに出力のスクリーンショットがあります

コメントの皆さん、ありがとう!

他の人を助けるための補足事項

PLOTでカーソル位置を設定することにより、CHROUTが出力する行と列を設定できます

http://sta.c64.org/cbm64krnfunc.html

4

1 に答える 1

8

画面メモリに ASCII コードを直接書き込んでいる可能性があります。そのため、40 ドルオフセットされています。

それらを PETSCII に含めるには、「-a」オプションを 64tass に追加する必要があります。しかし、それだけでは十分ではありません。あなたの例は、$c0 (大文字の PETSCII 文字) だけオフセットされます。テキストを小文字に変更しても、40 ドルのオフセット (小文字の PETSCII) が得られます。

画面に「画面」コードを書き込む必要があります。幸いなことに、次のようにすると、64tass に変換が組み込まれています。

        .enc screen            ; switch to screen code encoding
hello   .text "hello world"
        .byte 0
        .enc none

ただし、「@」はスクリーン コードでは 0 であるため、ループが終了することに注意してください。テキストは小文字ですが、デフォルトのフォントが大文字であるため、大文字になります。$d018 を $16 に設定して小文字のフォントに切り替えると、書いた内容と一致します。

適切な PETSCII の例は次のようになります。

    *=$c000

    lda #0
    sta $d020 ; border
    sta $d021 ; background

    ldx #0
lp  lda hello,x
    beq end
    jsr $ffd2 ;print character
    inx
    bne lp
end rts

hello .null "{clr}{swlc}HELLO WORLD"

"{clr}" と "{swlc}" を制御コード 147 と 14 に変換する、あまり古くない 64tass でコンパイルします。Unicode サポートを有効にするための "-a" スイッチを忘れないでください。文字列の変換を行い、それを逐語的に (生のバイトとして) コピーします。

于 2014-09-10T18:03:57.697 に答える