4

清除屏幕后,我有一些 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 将输出到哪一行和哪一列

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"

使用不太旧的 64tass 编译它,将“{clr}”和“{swlc}”转换为控制代码 147 和 14。不要忘记启用 Unicode 支持的“-a”开关,否则汇编器不会对字符串进行任何翻译,并将其逐字复制(作为原始字节)。

于 2014-09-10T18:03:57.697 回答