在CP / M上构建ROM映像

时间:2013-02-22 11:33:16

标签: intel-8080 cpm

我正在尝试在CP / M上使用古老的M80和L80工具来构建ROM映像。 (这是为了CP / M仿真器,因此我使用CP / M工具。)

不幸的是L80似乎非常粗糙--- AFAICT它只是将每个目标文件加载到其绝对地址,修复它,然后将所有内容从0x0100转储到磁盘。这意味着基于其自己工作空间之外的地址的目标文件似乎根本不起作用(仅产生错误消息)。我的ROM的基地址为0xd000,远远超出此范围。

有谁知道是否有可能使用M80和L80来做这件事,如果是的话,怎么样?或者,任何人都可以推荐(并指向我!)CP / M汇编程序/链接器套件,它将会是什么?

(请注意,如果可能的话,我想避免交叉编译。)

2 个答案:

答案 0 :(得分:1)

如果您只是组装一个文件,那么您可以使用M80的.phase指令让汇编程序找到输出。

  .phase 0D000h

如果你想构建几个源文件并在最后链接它们,那么你仍然可以使用M80,但是你需要DRI的链接器LINK.COM,它可以在http://www.cpm.z80.de/download/pli80_13.zip中找到。要使用的LINK命令行是

LINK result=module1,module2,module3[LD000

(我认为最近的L80相当于

L80 /P:D000,module1,module2,module3,result/N/E

但是你必须从结果文件的开头删除0xCF00字节。)

答案 1 :(得分:1)

老问题,但这可能适用于仍在寻找的人。我在 CP/M 2.2 上运行 1980 M80/L80 的 Ampro Little Board 上检查了这一点。

您可以在起始 .MAC 文件中使用 ASEG(绝对)指令,指定 0D000H 作为组织,然后引用外部模块。只要这些外部模块不包含 DSEG 或 PSEG 指令,您就应该能够将它们全部链接在一起,并将 0D000H 作为起始地址。例如

; TEST.MAC
        ASEG
        ORG 0D000H
public  tstart
tstart: 
        ...
        call myfoo##   ; call routine myfoo in external module foo.rel
        ...
        end tstart

组装:

M80 TEST,=TEST

将其与 foo.rel 链接并在输出上使用 /X 以生成 .HEX 文件 (TEST.HEX):

L80 TEST,FOO,TEST/N/X/E

如果您检查生成的 .HEX 文件,您应该看到起始地址是 0D000H。 顺便说一句:如果您不使用 /X 选项,那么带有 /N/E 的 L80 将生成一个 .COM,其中所有代码都使用 0D000H 的偏移量链接,除非您还包含一个 .phase 指令。例如:

; TEST.MAC
        ASEG
        ORG 100H
        .phase 0D000H
public  tstart
tstart: 
        ...
        call myfoo##   ; call routine myfoo in external module foo.rel
        ...
        end tstart

链接以生成 .COM 而不是 .HEX:

L80 TEST,FOO,TEST/N/E   <== note no '/X'

您无法运行它,但您可以认为 .COM 文件实际上是一个 .BIN 填充到最近的 128 字节边界(假设您的 CP/M 使用分配 128 字节块的典型方法)。您可以通过执行 .COM 文件的转储来确认结果。如果代码很短,它还可能包含未被您的代码覆盖的 L80 加载程序代码的剩余部分。

请注意,您还可以使用 org 0100H 的 ASEG 方法来制作常规 CP/M .COM。在这种情况下,假设代码的开头是 100H,则不需要使用 .phase。