使用 xa65 汇编程序创建 Commodore 64 .prg
Using xa65 assembler to create Commodore 64 .prg
我正在尝试学习 6510 汇编,因为我是 运行宁 Debian xa65 是我想使用的汇编器。
到目前为止,我已经编写了一段代码,如下所示:
*=01
.byte [=10=]c, , [=10=]a, [=10=], e,
.byte , , , , [=10=], [=10=]
.byte [=10=]
*=00
INC 53280
INC 53281
JMP 00
现在,第一个 .byte 部分应该 "autostart" 程序一旦加载。这是我从教程中找到的东西,据我所知,它只会 运行 SYS 4096 使 CPU 开始执行地址 $1000
处的代码
其余代码应该简单地开始闪烁 C64 的外部和内部边界并永远重复。
组装时,我只是 运行 以下内容:
xa test.s -o test.prg
然后我尝试将 test.prg 加载到 VICE 中进行测试。使用 LOAD "TEST.PRG",8,1: 并且即使文件加载它也不会自动启动,如果我键入 运行: 也不会发生任何事情,如果我键入 LIST: 也一样 - 唯一的结果是著名的 READY .并且光标像往常一样非常愉快地闪烁。
我试图删除自动启动的东西并只组装从 *=$1000 开始的代码,但我得到了相同的结果。尝试从 SYS 4096 开始也会导致 READY,仅此而已。
我确定我没有正确使用 xa 汇编器,但我不知道如何创建一个适合 C64 使用的 PRG 文件。我做错了什么?
据我所知,01
是 basic
程序的起始地址,它不会自动启动任何东西。要自动启动,你必须玩点把戏。
assemble 00
并使用 sys 4096
启动您的程序。汇编助手经常使用的区域是 $c000
(sys 49152
),因为它不会干扰正常的 basic
程序。
我不熟悉 xa65
,但根据我的测试,如果您分配给 *
,它不会填充文件。因此,您期望位于 00
的代码不会在那里,实际上它就在前一个块之后。此外,c64 prg 格式需要前两个字节的起始地址,xa64
似乎也没有填写。我已经设法让这个工作:
*=[=10=]FFE
.byte [=10=],
INC 53280
INC 53281
JMP 00
从 sys 4096
开始。
PS: VICE 内置监视器(机器级调试器)。
当我遇到你的问题时,我正试图弄清楚如何让 xa65 填充它的输出,并且后来了解了它是如何工作的。这是我的发现。
正如小丑所说,您的代码不会在 00
,因为设置 PC 不会执行任何填充。使用 .dsb
指令在 xa65 中支持填充 ,但必须为该指令指定多个字节,而不是像一些汇编器的 .org
指令那样只是一个地址允许。由于汇编程序允许进行简单的算术运算,因此字节数由 <desired address> - PC
.
给出
添加缺少的 .prg 地址 header 并将您的第二台 PC 更改更改为填充指令会导致输出按预期运行。但是,这仍然不能使其自动启动。不过,LOAD "TEST.PRG",8,1:
和 RUN
确实有效。
.byte , ; Load this .prg into 01
*=01
.byte [=10=]c, , [=10=]a, [=10=], e,
.byte , , , , [=10=], [=10=]
.byte [=10=]
.dsb 00 - * ; Pad with zeroes from PC to 00
INC 53280
INC 53281
JMP 00
FWIW,如何使用填充方法在 xa65 的文档中并不是很明显(至少对我而言)。
我个人使用 CC65 包中的 CA65,并为此找到了合适的宏。
如果您想知道 "why is this so hard",问题之一是您需要将地址(机器代码开始的地方)转换为 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) + )
.endif
.byte <(((address / 100 ) .mod 10) + )
.byte <(((address / 10 ) .mod 10) + )
.byte <(((address) .mod 10) + )
.endmacro
使用数字 arg,您可以将数字的数量设置为 4,否则您将得到类似 SYS 04096 的代码(没什么大不了的,但想避免在 1k 介绍中浪费额外的字节:-))
至于 .byte $01, $08 - xa65 是否支持 .word 类型,它将以 "least significant byte first" 格式插入 16 位值?
我正在尝试学习 6510 汇编,因为我是 运行宁 Debian xa65 是我想使用的汇编器。
到目前为止,我已经编写了一段代码,如下所示:
*=01
.byte [=10=]c, , [=10=]a, [=10=], e,
.byte , , , , [=10=], [=10=]
.byte [=10=]
*=00
INC 53280
INC 53281
JMP 00
现在,第一个 .byte 部分应该 "autostart" 程序一旦加载。这是我从教程中找到的东西,据我所知,它只会 运行 SYS 4096 使 CPU 开始执行地址 $1000
处的代码其余代码应该简单地开始闪烁 C64 的外部和内部边界并永远重复。
组装时,我只是 运行 以下内容:
xa test.s -o test.prg
然后我尝试将 test.prg 加载到 VICE 中进行测试。使用 LOAD "TEST.PRG",8,1: 并且即使文件加载它也不会自动启动,如果我键入 运行: 也不会发生任何事情,如果我键入 LIST: 也一样 - 唯一的结果是著名的 READY .并且光标像往常一样非常愉快地闪烁。
我试图删除自动启动的东西并只组装从 *=$1000 开始的代码,但我得到了相同的结果。尝试从 SYS 4096 开始也会导致 READY,仅此而已。
我确定我没有正确使用 xa 汇编器,但我不知道如何创建一个适合 C64 使用的 PRG 文件。我做错了什么?
据我所知,01
是 basic
程序的起始地址,它不会自动启动任何东西。要自动启动,你必须玩点把戏。
assemble 00
并使用 sys 4096
启动您的程序。汇编助手经常使用的区域是 $c000
(sys 49152
),因为它不会干扰正常的 basic
程序。
我不熟悉 xa65
,但根据我的测试,如果您分配给 *
,它不会填充文件。因此,您期望位于 00
的代码不会在那里,实际上它就在前一个块之后。此外,c64 prg 格式需要前两个字节的起始地址,xa64
似乎也没有填写。我已经设法让这个工作:
*=[=10=]FFE
.byte [=10=],
INC 53280
INC 53281
JMP 00
从 sys 4096
开始。
PS: VICE 内置监视器(机器级调试器)。
当我遇到你的问题时,我正试图弄清楚如何让 xa65 填充它的输出,并且后来了解了它是如何工作的。这是我的发现。
正如小丑所说,您的代码不会在 00
,因为设置 PC 不会执行任何填充。使用 .dsb
指令在 xa65 中支持填充 ,但必须为该指令指定多个字节,而不是像一些汇编器的 .org
指令那样只是一个地址允许。由于汇编程序允许进行简单的算术运算,因此字节数由 <desired address> - PC
.
添加缺少的 .prg 地址 header 并将您的第二台 PC 更改更改为填充指令会导致输出按预期运行。但是,这仍然不能使其自动启动。不过,LOAD "TEST.PRG",8,1:
和 RUN
确实有效。
.byte , ; Load this .prg into 01
*=01
.byte [=10=]c, , [=10=]a, [=10=], e,
.byte , , , , [=10=], [=10=]
.byte [=10=]
.dsb 00 - * ; Pad with zeroes from PC to 00
INC 53280
INC 53281
JMP 00
FWIW,如何使用填充方法在 xa65 的文档中并不是很明显(至少对我而言)。
我个人使用 CC65 包中的 CA65,并为此找到了合适的宏。
如果您想知道 "why is this so hard",问题之一是您需要将地址(机器代码开始的地方)转换为 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) + )
.endif
.byte <(((address / 100 ) .mod 10) + )
.byte <(((address / 10 ) .mod 10) + )
.byte <(((address) .mod 10) + )
.endmacro
使用数字 arg,您可以将数字的数量设置为 4,否则您将得到类似 SYS 04096 的代码(没什么大不了的,但想避免在 1k 介绍中浪费额外的字节:-))
至于 .byte $01, $08 - xa65 是否支持 .word 类型,它将以 "least significant byte first" 格式插入 16 位值?