画面をクリアした後、文字列を画面メモリに出力する 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が出力する行と列を設定できます