DASM汇编器中的ASCII至C64屏幕代码

nex*_*006 4 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
    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
Run Code Online (Sandbox Code Playgroud)

因为我的编辑器(胜利10上的notepad ++)使用类似ascii的字符代码,所以"HELLO"输入message是48 45 4C 4C 4F。这将在屏幕的左上角提供以下输出: 在此处输入图片说明

我想这是正确的,请看这里的commodore屏幕代码表。

如果将第6行更改为,lda hexmsg,x那么我将得到确切的字眼HELLO

我对DASM汇编器不是很熟悉,无法找到它的完整文档(如果存在)。我发现的大多数教程都只有您声明message .byte "HELLO"或类似的内容,它之所以起作用,是因为他们使用的汇编器会自动将类似ascii的文本字符串自动转换为准字符串,但DASM似乎不这样做。

有谁知道我可以让DASM执行此操作的方法,还是推荐另一种方法来简单地将字符串键入汇编器,而不是手动将我的字符串作为一堆十六进制数据输入?

Eig*_*uru 5

啊哈,ASCII编码与Commodore屏幕代码。我们都去过那里。您有几种选择:

  1. 不要直接写入屏幕内存,而应使用Kernal CHROUT例程(可能通过更高级别的字符串输出例程)。然后,您只需要担心ASCII和PETSCII之间的区别,但这又是另一个故事了。同样,这对于文本来说很好,但是对于游戏来说很烂,因为与直接写入相比,内核的速度很慢。

  2. 编写一个小的转换例程,该例程在程序启动时运行,吃掉您的字符串表,并吐出等效的转换屏幕代码。只要您的字符串都在一起并且您没有编写基于ROM的应用程序(该应用程序将无法进行就地转换),便可以快速高效地进行操作。

  3. 在您的构建脚本中编写一个运行在DASM之前的DASM预处理程序,基本上执行与上面#2相同的转换,但是在汇编程序看到之前将其转换为源代码。这可能有点陈旧,您必须确保在备份原始源之前对其进行备份。

  4. 获取DASM源代码并对其进行修补,以调用与第二种相同但在组装过程中即时进行的新数据类型(用于屏幕代码)的用户出口。非常陈旧。

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

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

另外:切换到KickAssembler,这

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


小智 5

自从我对6510进行编程以来已经有一段时间了。(如果没有按下来保存C64存储器的每个单个字节。使其比计算字符串长度更方便: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
Run Code Online (Sandbox Code Playgroud)