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

2024-04-29

我正在通过 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

Because my editor (notepad++ on win 10) uses ascii-like char-codes, the "HELLO" in message is bits 48 45 4C 4C 4F. This gives the following output in the top left corner of the screen: enter image description here

通过查看 Commodore 屏幕代码表,我猜这是正确的here http://sta.c64.org/cbm64scr.html.

如果我将第 6 行更改为lda hexmsg,x然后我就得到了我想要的,这个词HELLO.

我还不太熟悉 DASM 汇编器,并且很难找到它的完整文档(如果存在)。我发现的大多数教程只是让你声明message .byte "HELLO"或类似的东西,它之所以起作用,是因为他们使用的汇编器会自动将类似 ASCII 的文本字符串自动转换为 Commodore 字符串,但 DASM 似乎并没有这样做。

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


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

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

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

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

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

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

根据所有 5 个选项的经验,我选择了#2。

另外:切换到踢汇编器 http://www.theweb.dk/KickAssembler/Main.html#frontpage, which

  • 较新,并且得到积极维护
  • 提供更强大的功能
  • 与 VICE 很好地集成以进行调试
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DASM 汇编器中的 ASCII 到 C64 屏幕代码 的相关文章

随机推荐