我正在尝试学习 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中以对其进行测试。PRG",8,1:即使文件加载它不会自动启动,如果我键入 RUN: 也不会发生任何事情,如果我键入 LIST: - 唯一的结果是著名的 READY。光标像往常一样非常愉快地闪烁。
我试图删除自动启动的东西,只组装从 *=$1000 开始的代码,但我得到了相同的结果。尝试从 SYS 4096 开始也会导致 READY,仅此而已。
我确定我没有正确使用 xa 汇编程序,但我无法弄清楚如何为 C64 创建适当的 PRG 文件以供使用。我做错了什么?
当我遇到您的问题并了解它的工作原理时,我正试图弄清楚如何使 xa65 填充其输出。 这是我的发现。
正如 jester 所说,您的代码不会$1000
,因为设置 PC 不会执行任何填充。 xa65 使用 .dsb
指令支持填充,但必须为指令指定字节数,而不是像某些汇编程序的 .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 的文档中并不明显(至少对我来说)。
据我所知,$0801
是basic
程序的开始地址,它不会自动启动任何东西。要自动启动,您必须玩弄技巧。
只需组装$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内置监视器(机器级调试器)。
我个人使用 CC65 包中的 CA65,并为此找到了一个合适的宏。
如果你想知道"为什么这这么难",其中一个问题是,你需要将地址(机器代码开始的地方)转换为base-10 petsci字符串。
在这里,您可以看到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 arg,您可以将位数设置为 4,否则您将获得类似 SYS 04096 的代码(没什么大不了的,但希望避免在 1k 介绍中浪费额外的字节 :-) )
至于 .byte $01、$08 - xa65 是否支持 .word 类型,它将以"最低有效字节优先"格式插入 16 位值?