然后我开始在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
谢谢
答案 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。您可以看到它反映在配置文件中。
祝你好运!