【问题标题】:Compiling a simple program using ca65使用ca65编译一个简单的程序
【发布时间】:2019-07-28 14:08:42
【问题描述】:

我开始使用 Rodney Zaks 的书 Programming the 6502 学习 6502 组装。其中有示例代码,我希望能够在我的 macbook 上运行它。我希望代码能够以书中介绍的形式运行,但我不确定。

我已经下载了 ca65 汇编程序,但是遇到了一些麻烦。命令ca65 3_1.as 有效,但随后使用ld65 -o example 3_1.o(我认为这是正确的)导致错误:ld65: Error: Memory configuration missing

文件3_1.as的代码如下。

谁能建议如何解决我的问题?

(作为一个小问题,目前我猜 100 美元和 200 美元实际上不包含任何值,所以即使程序可以运行,也不会进行实际添加,这是正确的吗?)

CLC      ; CLEAR CARRY BIT
CLD      ; CLEAR DECIMAL BIT

ADR1 = $100 ; WHERE IN MEMORY ARE THESE THINGS
ADR2 = $200
ADR3 = $300 

LDA ADR1 ; LOAD CONTENTS OF ADR1 INTO ACCUMULATOR
ADC ADR2 ; ADD CONTENTS OF ADR2 INTO ACCUMULATOR 
STA ADR3 ; TRANSFER CONTENT OF ACC TO ADR3

【问题讨论】:

  • 这听起来像是一个安装问题。至于添加,一些东西仍然在那些内存位置,即使你不知道输入和输出将是什么,cpu 也会很好地添加它们。
  • 我已经尝试卸载,然后再次安装,但我没有运气。通过添加一个包含内存地址的配置文件,我设法使错误消失。但是,我现在收到一个新错误:“exec 格式错误”。作为一种解决方法,我稍微修改了代码,现在使用github.com/skilldrick/6502js 编译并运行它
  • 目前我猜 100 美元和 200 美元实际上不包含任何值 - 内存和寄存器 总是 包含一个值。寄存器和内存的开机或程序启动状态可能无法得到任何保证,但从该地址加载会得到一个值。 (即使你的 6502 没有连接那么多 RAM,我认为它会在将地址放在地址总线上后读取一些值。模拟的 6502 可能只会读取零。)

标签: assembly 6502 ca65


【解决方案1】:

要修复链接器错误,您需要provide a target system,它将提供内存配置。

例如,这不是默认设置有点傻:

ld65 -t none -o example 3_1.o

请注意,您也可以使用一个命令进行组合和链接。见my answer here

【讨论】:

  • 谢谢 nick,奇怪的是这不是默认值。我现在可以编译它,但是当我尝试运行它时出现错误“exec format error: ./example” - 我现在需要另一个程序来执行此操作吗?
  • 没错,您的 Mac 无法运行 6502 二进制文件。您需要使用模拟器(例如 Apple II 或 C64)并使用它来运行您的输出文件。我链接到的另一个答案构建了一个 C64 对象。不要忘记使用“-t”选择正确的目标,您可能需要在代码中使用“.org”提供起始地址。
  • 好的,我会调查的,谢谢。最后一件事,对不起。所以我的程序会将ADR1和2的内容相加,然后移动到ADR3。那么是否有一种快速简便的方法来查询 ADR3 以查看其内容,以确保它给出了正确的答案?或者在保持程序简单的同时这真的不可能吗?
  • 如何做到这一点是特定于平台的。例如,在 Apple II 上,您可以在代码末尾添加(首先可选“LDA ADR3”,尽管在您的情况下不需要,因为 ADR3 已经在 A 中,然后)“JSR $FDDA”。这调用了一个 ROM 例程,它将 A 的内容作为十六进制数字打印在文本屏幕上。或者在您的代码运行后,在 BASIC 中,您将使用 PRINT PEEK (768) 以十进制打印 ADR3。对于 C64 平台,您必须研究如何做类似的事情。
  • 这是非常有用的信息,我发现虽然网上有很多很好的资源来解释如何编写 6502 asm,但有时并不清楚如何运行它并在开始时查看结果作为一个绝对的初学者。我想我会安装一个 Apple II 模拟器并尝试你的建议,谢谢。 ADR3和(768)是什么关系?
【解决方案2】:

这是一个更完整的程序,可以添加到已经很好的答案中。我注意到作者也没有放置启动程序的地方。不同类型的汇编器在处理 ORG 语句之类的语法方面存在细微差别。有些是“.Org”,意思是在这里启动程序并在内存中组装。 “*=”也可以表示同一件事(有时两者都有效)。该程序应该可以在 commodore 64 上运行。通过一些调整,它也可以在 Apple ][ 上运行(将 charout 更改为 ffda 和起始位置)。我肯定会推荐 C64 用于编码增长,因为它具有更多有趣的硬件功能。它还拥有庞大的全球编码场景。这是一个链接,其中包含大量磁盘杂志和超出基础知识的 ML 教程。似乎没有书能做到这一点,并且倾向于只坚持句法方法。如果您想用控制室和运行飞机部件等这些东西做任何大事,这远非有用。

https://csdb.dk/release/?id=8717

.ORG = 080D ; 
CLC      ; CLEAR CARRY BIT
CLD      ; CLEAR DECIMAL BIT
LDA #$94 ; load accumulator with 94
STA ADR1 ; move 94 into adr1 (both combined is adr1 = 94)
LDA #$32 ; load accumulator with 32
STA ADR2 ; move 32(in Acc.) into adr1 (both lines is adr2 = Acc, or adr2 = 32)

LDA ADR1 ; LOAD CONTENTS OF ADR1 INTO ACCUMULATOR
ADC ADR2 ; ADD CONTENTS OF ADR2 INTO ACCUMULATOR 
STA ADR3 ; TRANSFER CONTENT OF ACC TO ADR3
JSR CHAROUT; print the result

RTS ; return from the program

; declarations can be in confusing places and still work.
; I just saw a program where the declarations were after the code
; and before the subroutines.
;-------------------------------------------
ADR1 = $100 ; WHERE IN MEMORY ARE THESE THINGS
ADR2 = $200
ADR3 = $300 
CHAROUT = $ffd2 ; character out routine commodore 64. (prints a byte to screen)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多