我开始在WIndows上使用ca65汇编器和ld65链接器为运行在副仿真器上的Commodore C64计算机创建二进制代码。
我将这个小小的"hello world“源代码写在文件"basic2.s”上。
;--------------------------------------
; 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-使用命令
ld65 basic2.o错误是:
ld65: Error: Memory configuration missing2-使用命令
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谢谢
发布于 2018-08-15 11:52:05
文档有点分散,但是如果你仔细看的话,它们都在那里。
当您指定配置时,它将确定输出对象的格式。而在c64-asm.cfg中是:
__LOADADDR__: type = import;此配置期望导出LOADADDR,以便可以构建PRG标头。如果您使用c64.lib (etc)链接,则会将其导出(硬编码为$801)。否则,您需要自己提供它。
一种方法是在命令行上使用--start-addr作为Laurent和the docs suggest,但这很麻烦。相反,您可以让您的汇编语言源码将其导出。我不太了解CC65,但是:
.org $0801
.export LOADADDR = *此外,您还可以使用以下命令在一行中构建:
cl65.exe -o basic2.prg -t c64 -C c64-asm.cfg basic2.s发布于 2018-08-17 03:26:13
链接器的完整命令是:
ld65 --lib c64.lib -C c64-asm.cfg -o basic.prg basic1.o 这将生成具有2字节加载地址头的basic.prg文件。
发布于 2018-10-17 20:55:01
下面是我如何设置我的构建环境。我正在为我设计的自定义6502 SBC (不是Commodore 64)编写代码,但技术非常相似。我有一个叫做"mon.asm“的小程序(用于监视器)。另外,在我的项目目录中,我有两个工作目录,分别称为tmp和dist。Tmp是存放*.o (对象)文件和其他临时工作文件的位置。dist文件夹是我完成的二进制文件的存放位置(实际上是我刻录到EEPROM的文件)。
首先,我设置了一个make.cmd作业来设置环境变量、汇编、链接等。这个作业清理我的文件夹并构建/链接二进制文件。
make.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"请注意,该文件有两个用于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。您可以在配置文件中看到这一点。
祝好运!
https://stackoverflow.com/questions/51790718
复制相似问题