我正在尝试学习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文件来使用的。我做错了什么?
答案 0 :(得分:5)
据我记忆,$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有内置显示器(机器级调试器)。
答案 1 :(得分:5)
当我遇到你的问题时,我试图弄清楚如何让xa65填充它的输出,并且从那时起就知道它是如何工作的。这是我发现的。
正如jester所说,你的代码不会在$1000
,因为设置PC不会执行任何填充。使用.dsb
指令在xa65中支持填充 ,但必须为指令指定一些字节,而不是像某些汇编程序'.org
指令允许的那样。由于汇编程序允许简单算术,因此字节数由<desired address> - PC
给出。
添加缺少的.prg地址标头并将第二次PC更改更改为padding指令会导致输出行为符合预期。但是,这仍然不能使其自动启动。不过,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 :(得分:1)
我个人使用CC65包中的CA65,并为此找到了合适的宏。
如果您想知道&#34;为什么这么困难&#34;,其中一个问题是,您需要将地址(机器代码启动的位置)转换为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类型,它将在&#34;最低有效字节中插入16位值&#34;格式?