String DASM汇编程序中的ASCII到C64屏幕代码
我正在通过C64模拟器学习6502 micro的组装。当前正在尝试将字符串输出到屏幕。这是我的密码:String DASM汇编程序中的ASCII到C64屏幕代码,string,assembly,6502,commodore,String,Assembly,6502,Commodore,我正在通过C64模拟器学习6502 micro的组装。当前正在尝试将字符串输出到屏幕。这是我的密码: processor 6502 org $1000 ldx #$00 ;using x register as column counter print: lda message,x;load a with x bit from message sta $0400,x ;store this bit in row 0 col 0 address
processor 6502
org $1000
ldx #$00 ;using x register as column counter
print:
lda message,x;load a with x bit from message
sta $0400,x ;store this bit in row 0 col 0 address
inx ;x++
cpx #$05 ;is x >= 5?
bne print ;if not x >= 5, loop again
rts ;return from program
message dc "HELLO"
hexmsg dc $08,$05,$0c,$0c,$0f
因为我的编辑器(win 10上的记事本+)使用类似ascii的字符代码,所以消息中的“HELLO”
是位48 45 4C 4C 4F。这将在屏幕的左上角提供以下输出:
通过查看commodore屏幕代码表,我想这是正确的
如果我将第6行更改为lda hexmsg,x
,那么我得到的正是我想要的,即单词HELLO
我还不太熟悉DASM汇编程序,并且很难找到它的完整文档(如果存在的话)。我发现的大多数教程都有声明message.byte“HELLO”
或类似的东西,这是因为他们使用的汇编程序会自动将类似ascii的文本字符串转换为commodore字符串,但DASM似乎没有这样做
有人知道我可以让DASM这样做的方法吗,或者推荐另一种简单地在汇编程序中键入字符串的方法,而不是手动将字符串作为一组十六进制数据键入?Aha,ASCII编码与Commodore屏幕代码。我们都去过那里。您有几个选择:
- 更新,并积极维护
- 提供更强大的功能
- 与VICE很好地集成以进行调试
processor 6502
org $1000
printstring:
ldx #$00
printstrlp:
lda message,x
cmp #0
beq quitstr
cmp #32 ;' ' character
beq noconv
cmp #33 ;! character
beq noconv
cmp #42 ;* character
beq noconv
cmp #48 ;numbers 0-9
bcs numconv
conv:
sec
sbc #$40
noconv:
sta $0400,x
inx
bne printstrlp
quitstr:
rts
numconv:
cmp #58
bcc noconv
jmp conv
message dc "** HELLO C64 WORLD! **",0
这是DASM aseembler的补丁版本。
您可以使用
SCRU
和SCRL
指令转换ASCII->屏幕代码转换
label SCRU "string"
label SCRL "string"
SCRU
用于生成大写文本,即使输入的是小写SCRL
保留大小写。如果有帮助,下面是一个小python脚本。
只需使用python3 str_conv.py code.asm消息调用它
import argparse
导入操作系统
映射=[
“@”,“A”,“B”,“C”,“D”,“E”,“F”,“G”,“H”,“I”,“J”,“K”,“L”,“M”,“N”,“O”,“P”,“Q”,“R”,“S”,
‘T’、‘U’、‘V’、‘W’、‘X’、‘Y’、‘Z’、‘[’、‘‘‘‘’、‘‘‘’、‘‘‘’、‘‘‘’、‘‘’、‘‘‘’、‘‘‘、‘‘、‘‘、‘‘、‘‘‘‘、‘‘‘‘、‘‘‘、‘‘、‘,
'\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
':', ';', '', '?'
]
如果名称=“\uuuuu main\uuuuuuuu”:
parser=argparse.ArgumentParser(description='Convert ASCII to C64屏幕代码〕
parser.add_参数('file',help='assembly source code')
parser.add_参数('label',help='label used in DASM')
args=parser.parse_args()
filepath=os.path.join(os.getcwd(),args.file)
backup=os.path.join(os.getcwd(),args.file)+“.bck”
重命名(文件路径,备份)
label=args.label
新代码=[]
发现=错误
对于行_nb,枚举中的行(打开(备份)):
如果第行中的line.find(“\\b{}\\b.format(label))和'''
text=line[line.find(“”)+1:line.rfind(““”)]
new_line=“{}:\t.byte.”格式(标签)
对于i,枚举中的字符(文本):
new_line+=“{}{}”.format(mapping.index(char),”,“if i!=len(text)-1 else”\n)
打印(行号,新行号)
新的_代码.append(“;{}”.format(line))
新的\u代码。追加(新的\u行)
找到=真
其他:
新代码追加(行)
如果未找到:
打印(“找不到标签{}!”。格式(标签))
其他:
打开(文件路径,“w”)作为新的\u文件:
对于新代码中的行:
新建_文件。写入(行)
打印(“完成!”)
BTW,这是我能找到的关于DASM的最好的文档:。我很确定您的问题的根源是在源代码中使用大写字母。这些字符显示为大写还是图形字符取决于C64的当前图形模式。试着用小写字母,我希望你会看到你所期望的大写字母。哈哈,我喜欢“粗糙”和“非常粗糙”的声音。不过,我现在就试试2号,听起来是个不错的练习。你能详细说明一下“只要你的琴弦都在一起”吗?我