Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String DASM汇编程序中的ASCII到C64屏幕代码_String_Assembly_6502_Commodore - Fatal编程技术网

String DASM汇编程序中的ASCII到C64屏幕代码

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

我正在通过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
    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屏幕代码。我们都去过那里。您有几个选择:

  • 不要直接写入屏幕内存,而是使用内核CHROUT例程(可能通过更高级别的字符串输出例程)。然后你需要担心的是ASCII和PETSCII之间的差异,但这是另一个睡觉时间的故事。此外,这对文本很好,但对游戏来说很糟糕,因为与直接写入相比,内核是s-l-o-w

  • 编写一个小的转换例程,在程序启动时运行,吃掉字符串表,并输出转换后的屏幕代码等价物。快速高效,前提是字符串都在一起,并且您没有编写基于ROM的应用程序(无法进行就地转换)

  • 编写一个DASM预处理器,在构建脚本中在DASM之前运行,基本上执行与上面#2相同的转换,但在汇编程序看到源代码之前转换为源代码。这可能有点粗糙,在咀嚼之前,您必须确保备份原始源代码

  • 获取DASM源代码并对其进行修补,以调用新数据类型(对于屏幕代码)的用户出口,该数据类型与#2相同,但在汇编过程中处于动态状态。非常粗糙

  • 在字符串中使用小写字母,这将在汇编过程中转换为大写屏幕代码。您可能忽略了这样一个事实,即您看到的是字符串中字符的移位表示,在默认显示模式下,它是图形符号

  • 从所有5个选项的经验来看,我选择了#2

    另外:切换到,哪个

    • 更新,并积极维护
    • 提供更强大的功能
    • 与VICE很好地集成以进行调试

    我编程6510已经有一段时间了。(如果你不保存保存每个C64内存的单个字节…)也考虑用0字节终止你的字符串,而不是终止在X登记器中达到的长度。使它比计算字符串长度更方便:D

    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号,听起来是个不错的练习。你能详细说明一下“只要你的琴弦都在一起”吗?我