清除屏幕后,我有一些 6502 代码可以将字符串打印到屏幕内存。不幸的是,如果我打印一个字符串,例如“HELLO WORLD”,它会出现乱码。我发现这是因为大写字符从 0x01 开始,而不是我从这里的 PETSCII 代码中想到的 0x41 。
我可以通过从我的字符串中减去 0x40 来解决这个问题,但是除了字母之外的所有内容都不正确,例如空格。我只是不确定为什么字符生成器将 0x01 变成字符“A”而不是 0x41。它将 0x41 变成了一个倒黑桃符号(就像一副纸牌上一样),它上面的所有东西似乎都是边框字符和奇怪的符号。
环顾了一会后,我在 PETSCII 的维基百科页面上找到了这句话,这似乎说明了我要解决的问题,但我不知道如何解决它,也无法在任何地方找到任何信息......
实际的字符生成器 ROM 使用了一组不同的赋值。例如,要通过直接戳屏幕内存在屏幕上显示字符“@ABC”,可以戳十进制值 0、1、2 和 3,而不是 64、65、66 和 67。
我在 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 将输出到哪一行和哪一列