为什么我的Commodore 64仿真器上的字符偏移了0x40?

 shao4224 发布于 2022-12-21 20:42

清除屏幕后,我有一些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

这是输出的屏幕截图

这是输出的屏幕截图

感谢评论中的每个人!

旁注来帮助别人

您可以通过PLOT设置光标位置来设置CHROUT将输出的行和列

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

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有