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 屏幕代码 的相关文章

  • 需要Python字长函数示例

    我的家庭作业有点困难 我本来应该编写一个函数 limitWords 将输入限制为 20 个单词 如果输入超过 20 个单词 则将输入截断为仅 20 个单词 我使用 len text split 作为计算单词的方法 因此 20 个或更少的部分
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • 将 NSAttributedString 的子字符串替换为另一个 NSAttributedString

    我想替换一个子字符串 例如 replace of an NSAttributedString和另外一个NSAttributedString 我正在寻找一种等效的方法NSString s stringByReplacingOccurrence
  • INT 13h 无法读取超出特定扇区的数据

    我正在为我的操作系统编写内核 在将磁盘扇区加载到内存时遇到问题 以下是从磁盘加载扇区的函数代码部分 mov ax 0x3000 mov es ax mov ax 0x0201 mov bx word ptr bp 6 bx 0x000 0x
  • 出现错误:字符串未被识别为 C# 中的有效日期时间

    出现如下错误 mscorlib dll 中发生类型为 System FormatException 的未处理异常附加信息 字符串未被识别为有效的日期时间 我正在使用这段代码 string datetime DateTime Parse en
  • 比较两个字符串时如何不包含换行符

    我正在比较两个字符串的更新 我做了一个 string1 string2 结果却有所不同 我把它们放在 添加监视 中 我发现唯一的区别是一个有换行符 另一个没有换行符 string1 This is a test nThis is a tes
  • 正则表达式:如何从字符串中获取单词(C#)

    我的输入由用户发布的字符串组成 我想做的是创建一本包含单词以及它们的使用频率的字典 这意味着我想解析一个字符串 删除所有垃圾 并获取单词列表作为输出 例如 假设输入是 LOLOLOL YOU VE BEEN PWN3D 1einszwei
  • “HH:MM:SS”中的秒数

    获取 hh mm ss 等字符串表示形式的秒数的最佳方法是什么 显然 Integer parseInt s substring 3600 Integer parseInt s substring 60 Integer parseInt s
  • 如何在 AVX/AVX2 中递增向量

    我想使用内在函数来增加 SIMD 向量的元素 最简单的方法似乎是为每个元素加 1 如下所示 note vec inc之前已设置为1 vec mm256 add epi16 vec vec inc 但是是否有任何特殊指令来增加向量 类似于in
  • 如何在汇编中使用 ReadString?

    mov edx offset Prompt1 call WriteString mov ecx 32 mov edx offset String1 call ReadString 现在 我该如何访问String1 如何将其移入寄存器以便对其
  • 在 C++ 中,std::string::push_back() 的摊余复杂度是 O(1) 吗?

    我知道标准指定它适用于向量 但是字符串呢 是的 它是摊销常数时间 请参见第 716 页的表 101本文件的 http www open std org jtc1 sc22 wg21 docs papers 2012 n3485 pdf 表
  • 在现代 x86-64 上计算 64 位整数的整数 Log10 的最快方法是什么?

    标题 我找到了大量 32 位示例 但没有找到完整的 64 位示例 使用这个帖子 https codegolf stackexchange com questions 47290 fastest way to compute order of
  • 如何在Python中不使用库函数将字符串转换为整数?

    我正在尝试转换 a 546 to a 546 不使用任何库函数 我能想到的 最纯粹 gt gt gt a 546 gt gt gt result 0 gt gt gt for digit in a result 10 for d in 01
  • 处理器在操作码​​和数据之间有何不同? [复制]

    这个问题在这里已经有答案了 我正在尝试编写一个反汇编程序 我想知道处理器如何区分操作码和数据字节 例如 这是 Hello World 的字节表示 0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x
  • 根据 R 中的字符串模式选择行

    假设我有以下数据 df lt data frame name c TO for Turnover for people HC people Hello world beenie man apple pears TO is number c
  • Google 地图查询返回的 JSON 包含像 \x26 这样的编码字符(如何解码?)

    在 Java 应用程序中 我获取 JSON 来自 Google 地图 其中包含以下字符 x26我想将其转换为其原始字符 据我所知 这是一个 UTF 8 表示法 但我不完全确定 在源 JSON 中 可能会出现各种编码字符 例如 x3c div
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • C++11 内部 std::string 表示形式 (libstdc++)

    std string 在 c 11 libstdc 中如何内部表示 在深入研究实现时 我发现 A string looks like this Rep M length basic string
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i

随机推荐