ca65汇编器和ld65链接器

时间:2018-08-10 16:37:19

标签: assembly 6502 c64 commodore

然后我开始在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

谢谢

3 个答案:

答案 0 :(得分:2)

文档有点分散,但是如果您看上去很努力的话,它们就全部存在了。

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

__LOADADDR__: type = import;

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

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

.org    $0801
.export LOADADDR = *

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

cl65.exe -o basic2.prg -t c64 -C c64-asm.cfg basic2.s

答案 1 :(得分:0)

链接程序的完整命令为:

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

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

答案 2 :(得分:0)

以下是我进行构建环境设置的方式。我正在为我设计的自定义6502 SBC(不是Commodore 64)编码,但是技术非常相似。我有一个名为“ mon.asm”的小程序(用于监视器)。另外,在我的项目目录中,我有几个工作目录,分别称为-- Test data: DECLARE @Source TABLE ([Tab_ID] int identity(1,1), [Varchar] varchar(13)); DECLARE @Target TABLE ([Tab_ID] int, [Int] int); INSERT INTO @Source VALUES ('£19,000,000'), ('10$'), ('Cat'), ('999'); DECLARE @i int = (SELECT COUNT(*) FROM @Source); DECLARE @varchar varchar(13); WHILE @i > 0 BEGIN SELECT @varchar = [Varchar] FROM @Source WHERE [Tab_ID] = @i; WHILE PATINDEX('%[^0-9]%', @varchar) > 0 SET @varchar = REPLACE(@varchar, SUBSTRING(@varchar, PATINDEX('%[^0-9]%', @varchar), 1), '' ); INSERT INTO @Target([Tab_ID], [Int]) SELECT @i, CAST(@varchar as int); SET @i -= 1; END SELECT * FROM @Target ORDER BY [Tab_ID] ASC; 。 Tmp是* .o(目标)文件和其他临时工作文件所在的位置。 dist文件夹是我完成的二进制文件(实际上是我刻录到EEPROM的文件)所在的位置。

首先,我设置了一个tmp作业来设置环境变量,汇编,链接等。此作业会清理我的文件夹并建立/链接二进制文件。

make.cmd

dist

请注意,该文件具有用于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中看到它。该配置文件告诉汇编器/链接器我拥有什么类型的计算机,内存的映射位置等。我相信ca65已经为诸如C64之类的流行计算机内置了引用。因此,您在链接过程中可能不需要该配置文件。

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

mon.cfg

ld65.exe

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

祝你好运!