使用xa65汇编器创建Commodore 64 .prg文件

12

我正在尝试学习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文件。我做错了什么?


1
顺便提一下,序列“$34、$30、$39、$36”只是ASCII(PETSCII)编码的简单表示形式,代表数字“4096”。如果你想在其他地方加载你的机器码,你可以更改这个序列。"$9E"是Basic中"SYS"的标记。"$0a $00"是行号(10)。"$0c、$08"是下一行开始的地址。 - JeremyP
3个回答

8
我在研究如何让xa65填充其输出时,遇到了你的问题,并从中学到了如何工作。这是我找到的信息。
正如Jester所说,由于设置PC不执行任何填充,因此您的代码不会在$1000处。使用.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

就我个人而言,xa65的文档中如何使用填充方法并不是显而易见的。


1
非常感谢 - 这让我的一天(或者说晚上)变得更美好。 - Waxhead

6
据我所记,$0801basic 程序的起始地址,并且不会自动启动任何东西。要自动启动,你需要玩一些技巧。
只需汇编到 $1000 并使用 sys 4096 启动程序即可。常用的汇编助手区域是 $c000sys 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的基本程序 ;) - Waxhead
啊,我明白了,这是 sys 4096 的字节编码版本。它不会自动启动,但是可以用 run 命令来启动它。 - Jester

1

个人使用CC65软件包中的CA65,并找到了适合此用途的宏。

如果你想知道“为什么这样很难”,其中一个问题是,你需要将地址(机器码开始的地方)转换为十进制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

的意思是结束宏定义。
使用digits参数,您可以将数字设置为4位,否则您将得到类似SYS 04096的代码(这没什么大不了的,但是希望避免在1k intro中浪费那个额外的字节 :-))。
至于.byte $01, $08 - xa65是否支持.word类型,它会以“最低有效字节优先”的格式插入16位值?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接