4

我开始在 Windows 上使用 ca65 汇编器和 ld65 链接器为在 VICE 模拟器上运行的 Commodore C64 计算机创建二进制代码。

我在文件“basic2.s”上写了这个小的“hello world”源代码

;--------------------------------------
; objetivo: assembly a header BASIC program
;           to run binary code
;
; assembler: ca65
; http://cc65.github.io/doc
;
; v101-c101 2018-08-09 13:50:53 A.Alonso
;-----------------------------------------------------
PRINTTOKEN   = $99
SYSTOKEN     = $9e
chrout       = $ffd2

            .org  $0801
            ;
Linea10:    .word Linea20
            .word 10
            .byte PRINTTOKEN
            .byte 39," NOMBRE PROGRAMA  ",39
            .byte 0
            ;--
Linea20:     .word LineaEnd
            .word 20
            .byte SYSTOKEN
            .byte " 2089"
            .byte 0
            ;--
LineaEnd:   .word 0    ; fin de lineas
            .word 0    ; fin de programa
            ;--
            ;
Main:       ldx #0
ciclo1:     lda saludo,x
            jsr chrout
            inx
            cpx #<(saludofin-saludo)
            bcc ciclo1
salida:     rts
saludo:    .byte "--- HOLA MUNDO! -----"
saludofin: .byte 0

我可以使用以下命令进行组装:

ca65 -t c64 basic2.s

并生成“basic2.o”

我阅读了链接器 ld65 的文档,这令人困惑

我试过不成功:

1-带命令

ld65 basic2.o

错误是:

ld65: Error: Memory configuration missing

2-带命令

ld65 -C c64-asm.cfg basic2.o

错误是:

ld65: Warning: c64-asm.cfg(21): Segment `LOADADDR' does not exist
Unresolved external `__LOADADDR__' referenced in:
  c64-asm.cfg(5)
ld65: Error: 1 unresolved external(s) found - cannot create output file

谢谢

4

3 回答 3

3

文档有点零散,但如果你足够努力的话,它就在那里。

当您指定配置时,它会确定输出对象的格式。在 c64-asm.cfg 中是:

__LOADADDR__: type = import;

此配置期望导出 LOADADDR 以便它可以构建 PRG 标头。如果您与 c64.lib (等)链接,则将其导出(硬编码为 801 美元)。否则,您需要自己提供。

一种方法是在命令行上使用 --start-addr 作为 Laurent H. 和文档建议,但这很繁琐。相反,您可以获取汇编语言源来导出它。我不太了解CC65,但是:

.org    $0801
.export LOADADDR = *

此外,您可以在一行中构建:

cl65.exe -o basic2.prg -t c64 -C c64-asm.cfg basic2.s
于 2018-08-15T03:52:04.590 回答
0

以下是我如何设置构建环境。我正在为我设计的自定义 6502 SBC(不是 Commodore 64)编写代码,但技术非常相似。我有一个名为“mon.asm”的小程序(用于监视器)。此外,在我的项目目录中,我有几个名为tmpand的工作目录dist。Tmp 是 *.o(对象)文件和其他临时工作文件所在的位置。dist 文件夹是我完成的二进制文件所在的位置(我实际刻录到 EEPROM 的文件)。

首先,我设置了一个make.cmd作业来设置环境变量、汇编、链接等。该作业清理我的文件夹并构建/链接二进制文件。

制作.cmd

@echo off

REM Set some local variables
set loc=..\bin\cc65-snapshot-win32\bin
set dist=dist
set tmp=tmp

REM Clean
del /Q "%dist%"
del /Q "%tmp%"

REM Assemble and Link
"%loc%\ca65.exe" -D mon "mon.asm" -o "%tmp%\mon.o"
"%loc%\ld65.exe" -C "mon.cfg" "%tmp%\mon.o" -o "%dist%\mon.bin" -Ln "%tmp%\mon.lbl"

请注意, file 有几个用于ca65.exe和的子命令ld65.exe。那是汇编器和链接器。另请注意,我在链接器中引用了一个配置文件。你会在-C "mon.cfg". 该配置文件告诉汇编器/链接器我拥有什么类型的计算机,内存映射的位置等。我相信 ca65 已经为 C64 等流行计算机提供了参考。因此,您的链接过程中可能不需要该配置文件。

但是,作为参考,这是我正在使用的配置文件:

mon.cfg

MEMORY {
    ZP:         start = $0000, size = $0100, type = rw;
    RAM:        start = $0000, size = $4000, fill = no, type = rw;
    ROM:        start = $8000, size = $8000, fill = yes, file = %O;
    VEC:        start = $FFFA, size = $0006, fill = no, type = ro;
}

SEGMENTS {
    ZEROPAGE:   load = ZP, type = zp;
    CODE:       load = ROM, type = ro;
}

同样,您甚至可能不需要配置文件。查看有关使用 C64 指令的文档。但是供您参考,我设计的 6502 计算机具有 16K 的 RAM 和 32K 的 ROM。您可以在配置文件中看到这一点。

祝你好运!

于 2018-10-17T12:55:00.617 回答
0

链接器的完整命令是:

ld65 --lib c64.lib -C c64-asm.cfg -o basic.prg basic1.o   

这将生成带有 2 字节加载地址标头的 basic.prg 文件。

于 2018-08-16T19:26:13.343 回答