【问题标题】:Using xa65 assembler to create Commodore 64 .prg使用 xa65 汇编器创建 Commodore 64 .prg
【发布时间】:2015-01-31 10:37:57
【问题描述】:

我正在尝试学习 6510 汇编,因为我正在运行 Debian xa65 是我想要使用的汇编器。

到目前为止,我已经编写了一段看起来像这样的代码:

*=$0801
.byte $0c, $08, $0a, $00, $9e, $20
.byte $34, $30, $39, $36, $00, $00
.byte $00

*=$1000
INC 53280
INC 53281
JMP $1000

现在,第一个 .byte 部分应该在加载后“自动启动”程序。这是我从教程中发现的,据我所知,它只会运行 SYS 4096,使 CPU 开始执行地址为 $1000 的代码

其余的代码应该只是开始闪烁 C64 的外边框和内边框并永远重复。

组装时,我只需运行以下命令:

xa test.s -o test.prg

然后我尝试将 test.prg 加载到 VICE 中进行测试。使用 LOAD "TEST.PRG",8,1: 并且即使文件加载它也不会自动启动,如果我键入 RUN: 并且如果我键入 LIST: 则不会发生任何事情:-唯一的结果是著名的 READY。光标像往常一样愉快地闪烁。

我试图删除自动启动的东西并只组装从 *=$1000 开始的代码,但我得到了相同的结果。尝试从 SYS 4096 开始也会导致 READY,仅此而已。

我确定我没有正确使用 xa 汇编程序,但我不知道如何为 C64 创建合适的 PRG 文件以供使用。我做错了什么?

【问题讨论】:

  • FWIW 序列$34, $30, $39, $36 只是4096 的ASCII (PETSCII) 编码如果你想在其他地方加载你的机器代码,你可以改变它。 $9ESYS 的基本令牌。 $0a $00 是行号 (10)。 $0c, $08 是下一行的开始地址。

标签: assembly c64 commodore 6510


【解决方案1】:

当我遇到您的问题时,我试图弄清楚如何使 xa65 填充其输出,并且已经了解了它的工作原理。这是我发现的。

正如 jester 所说,您的代码不会位于 $1000,因为设置 PC 不会执行任何填充。使用.dsb 指令在xa65 中支持填充,但必须为该指令指定多个字节,而不是像某些汇编程序的.org 指令允许的那样仅指定一个地址。由于汇编器允许进行简单的算术运算,因此字节数由<desired address> - PC 给出。

添加缺少的 .prg 地址标头并将您的第二台 PC 更改更改为填充指令会导致输出行为符合预期。但是,这仍然不能使其自动启动。不过,LOAD "TEST.PRG",8,1:RUN 确实有效。

.byte $01, $08 ; Load this .prg into $0801

*=$0801
.byte $0c, $08, $0a, $00, $9e, $20
.byte $34, $30, $39, $36, $00, $00
.byte $00

.dsb $1000 - * ; Pad with zeroes from PC to $1000

INC 53280
INC 53281
JMP $1000

FWIW,如何使用填充方法在 xa65 的文档中并不是很明显(至少对我而言)。

【讨论】:

  • 非常感谢 - 这让我度过了一天(或者更确切地说是一夜)
【解决方案2】:

据我所知,$0801basic 程序的起始地址,它不会自动启动任何东西。要自动启动,您必须耍花招。

只需为$1000 组装并使用sys 4096 启动您的程序。装配助手经常使用的区域是 $c000 (sys 49152),因为它不会干扰正常的 basic 程序。


我不熟悉xa65,但根据我的测试,如果您分配给*,它不会填充文件。因此,您期望位于$1000 的代码不会存在,实际上它就在前一个块之后。此外,c64 prg 格式需要前两个字节的起始地址,xa64 似乎也没有填写。我已经设法让它发挥作用:

*=$0FFE
.byte $00, $10
INC 53280
INC 53281
JMP $1000

sys 4096开头。

PS:VICE 有内置监视器(机器级调试器)。

【讨论】:

  • 我编辑了我的问题,还包括我确实尝试从 SYS 4096 开始。是的,$0801 之后的数据应该是执行 SYS 4096 的基本程序;)
  • 啊,是的,我看到它是sys 4096 的字节编码版本。它不会自动启动,但run 应该会启动它。
【解决方案3】:

我个人使用 CC65 包中的 CA65,并为此找到了合适的宏。

如果您想知道“为什么这么难”,其中一个问题是,您需要将地址(机器代码开始的位置)转换为 base-10 petscii 字符串。

在这里您可以看到 VIC-20 的类似解决方案,它实际上说明了那些神秘的 .byte 是什么: http://techtinkering.com/2013/05/10/adding-a-basic-stub-to-a-vic-20-assembly-language-program/

(我认为在 C64 上也是如此)

我个人使用以下宏在 CA65 中创建基本存根:

.macro Address address, digits
.ifblank digits
    dig=5
.else
    dig=digits
.endif
.if dig>4
    .byte <(((address / 1000) .mod 10) + $30)
.endif
.byte <(((address / 100 ) .mod 10) + $30)
.byte <(((address / 10  ) .mod 10) + $30)
.byte <(((address) .mod 10) + $30)

.endmacro

使用数字 arg,您可以将数字数量设置为 4,否则您将获得类似 SYS 04096 的代码(没什么大不了的,但希望避免在 1k 介绍中浪费额外的字节 :-))

对于 .byte $01, $08 - xa65 是否支持 .word 类型,它将以“最低有效字节优先”格式插入 16 位值?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多