Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 使用xa65汇编程序创建Commodore 64.prg_Assembly_C64_Commodore_6510 - Fatal编程技术网

Assembly 使用xa65汇编程序创建Commodore 64.prg

Assembly 使用xa65汇编程序创建Commodore 64.prg,assembly,c64,commodore,6510,Assembly,C64,Commodore,6510,我试图学习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部分用于在加载后“自动启动”程序。这是我从一个教程中发现的,据我所知,它只会运行SYS4096,使

我试图学习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部分用于在加载后“自动启动”程序。这是我从一个教程中发现的,据我所知,它只会运行SYS4096,使CPU开始执行地址为$1000的代码

代码的其余部分应该只是开始闪烁C64的外部和内部边界,并永远重复

组装时,我只需运行以下操作:

xa test.s -o test.prg
然后我尝试将test.prg加载到VICE中来测试它。使用LOAD“TEST.PRG”,8,1:时,即使文件加载时没有自动启动,如果我键入RUN:则不会发生任何事情,如果我键入LIST,则会发生相同的情况:-唯一的结果是著名的READY。光标像往常一样愉快地闪烁着

我试图删除autostart的东西,只汇编了从*=$1000开始的代码,但得到了相同的结果。尝试从SYS 4096开始也会导致READY(准备就绪),仅此而已


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

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

只需组装1000美元的
,然后使用
sys4096
启动您的程序。汇编助手经常使用的区域是
$c000
sys 49152
),因为这不会干扰正常的
基本程序


我不熟悉
xa65
,但根据我的测试,如果您将其分配给
*
,它不会填充文件。因此,您期望的1000美元的代码不会出现,事实上,它就在前一个块之后。此外,c64 prg格式要求在前两个字节上有一个起始地址,
xa64
似乎无法填充这两个字节。我已经设法使这项工作得以开展:

*=$0FFE
.byte $00, $10
INC 53280
INC 53281
JMP $1000
从系统4096开始


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

当我遇到你的问题时,我正试图弄清楚如何让xa65填充它的输出,后来我就知道了它是如何工作的。这是我发现的

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

添加缺少的.prg地址头并将第二个PC更改更改更改为padding指令将导致输出的行为符合预期。但是,这仍然不能使其自动启动<代码>加载“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,如何使用padding方法在xa65的文档中不是很明显(至少对我来说是这样)。

我个人使用CC65软件包中的CA65,并且已经找到了一个合适的宏

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

在这里,您可以看到类似的解决方案,用于VIC-20,这实际上说明了这些谜团。字节是:

(我想在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)
。宏地址,数字
.如果是空白数字
挖掘=5
其他的
数字
.endif
.如果挖掘>4

.byte我编辑了我的问题,其中还包括我确实尝试从SYS 4096开始。是的,0801美元之后的数据应该是执行SYS 4096;)的基本程序啊,是的,我看到这是一个字节编码版本的
sys4096
。它不会自动启动,但
run
应该会启动它。非常感谢-这让我白天(或者晚上)的FWIW序列
$34、$30、$39、$36
只是
4096
的ASCII(PETSCII)编码。如果你想在其他地方加载你的机器代码,你可以更改它。
$9E
SYS
的基本标记。
$0a$00
是行号(10)。
$0c,$08
是下一行开头的地址。