首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ca65汇编程序和ld65链接器

ca65汇编程序和ld65链接器
EN

Stack Overflow用户
提问于 2018-08-11 00:37:19
回答 3查看 1.8K关注 0票数 4

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

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

代码语言:javascript
复制
;--------------------------------------
; 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 2.s

并生成"basic2.o“

我读了链接器ld65的文档,它让我很困惑

我已经尝试过了,但没有成功:

1-使用命令

代码语言:javascript
复制
ld65 basic2.o

错误是:

代码语言:javascript
复制
ld65: Error: Memory configuration missing

2-使用命令

代码语言:javascript
复制
ld65 -C c64-asm.cfg basic2.o

错误是:

代码语言:javascript
复制
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

谢谢

EN

回答 3

Stack Overflow用户

发布于 2018-08-15 11:52:05

文档有点分散,但是如果你仔细看的话,它们都在那里。

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

代码语言:javascript
复制
__LOADADDR__: type = import;

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

一种方法是在命令行上使用--start-addr作为Laurent和the docs suggest,但这很麻烦。相反,您可以让您的汇编语言源码将其导出。我不太了解CC65,但是:

代码语言:javascript
复制
.org    $0801
.export LOADADDR = *

此外,您还可以使用以下命令在一行中构建:

代码语言:javascript
复制
cl65.exe -o basic2.prg -t c64 -C c64-asm.cfg basic2.s
票数 3
EN

Stack Overflow用户

发布于 2018-08-17 03:26:13

链接器的完整命令是:

代码语言:javascript
复制
ld65 --lib c64.lib -C c64-asm.cfg -o basic.prg basic1.o   

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

票数 0
EN

Stack Overflow用户

发布于 2018-10-17 20:55:01

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

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

make.cmd

代码语言:javascript
复制
@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"

请注意,该文件有两个用于ca65.exeld65.exe的子命令。这是汇编器和链接器。还要注意,我在链接器中引用了一个配置文件。您将在-C "mon.cfg"中看到这一点。这个配置文件告诉汇编器/链接器我有哪种类型的计算机,内存映射在哪里,等等。我相信ca65已经内置了对像C64这样的流行计算机的引用。因此,在链接过程中可能不需要该配置文件。

但是,作为参考,下面是我使用的配置文件:

mon.cfg

代码语言:javascript
复制
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。您可以在配置文件中看到这一点。

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51790718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档