清除屏幕后,我有一些6502代码将字符串打印到屏幕内存.不幸的是,如果我打印一个字符串,例如"HELLO WORLD",它会出现乱码.我发现这是因为大写字符从0x01开始,而不是0x41,正如我在这里从PETSCII代码中想到的那样.
我可以通过从我的字符串中减去0x40来解决这个问题,但是除了字母之外的所有内容都是不正确的,例如空格.我只是不确定为什么字符发生器将0x01转换为字符'A'而不是0x41.它将0x41变成一个倒置的铲形标志(就像在一副牌上),它上面的所有东西似乎都是边界字符和奇怪的符号.
在环顾四周后,我在PETSCII的维基百科页面上找到了这个引用,它似乎说明了我试图解决的问题,但我不确定如何修复它,无法在任何地方找到任何信息......
实际的字符发生器ROM使用了一组不同的分配.例如,要通过直接选择屏幕内存来在屏幕上显示字符"@ABC",可以选择小数值0,1,2和3而不是64,65,66和67.
我在Mac OS X上运行VICE x64仿真器,而且我正在使用64位的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
Run Code Online (Sandbox Code Playgroud)
这是输出的屏幕截图
感谢评论中的每个人!
您可以通过PLOT设置光标位置来设置CHROUT将输出的行和列
小智 8
您可能直接将ASCII代码写入屏幕内存,这就是它偏移40美元的原因.
要在PETSCII中使用它们,需要在64tass中添加"-a"选项.但仅凭这一点还不够.您的示例现在将被$ c0(大写的PETSCII字母)抵消.将文本更改为小写仍然会产生40美元的偏移(小写PETSCII).
您需要在屏幕上写入"屏幕"代码.幸运的是,如果你这样做,就会在64tass中进行内置转换:
.enc screen ; switch to screen code encoding
hello .text "hello world"
.byte 0
.enc none
Run Code Online (Sandbox Code Playgroud)
但请记住,屏幕代码中"@"为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"
Run Code Online (Sandbox Code Playgroud)
用不太旧的64tass编译它,将"{clr}"和"{swlc}"转换为控制代码147和14.并且不要忘记"-a"开关以启用Unicode支持,否则汇编器不会对字符串进行任何翻译并将其逐字复制(作为原始字节).