Сборка образов ROM на CP/M

Я пытаюсь использовать почтенные инструменты M80 и L80 на CP/M для создания образа ROM. (Это для эмулятора CP/M, поэтому я использую инструменты CP/M.)

К сожалению, L80 кажется довольно грубым - AFAICT просто загружает каждый объектный файл по его абсолютному адресу, исправляет его, а затем выгружает все с 0x0100 на диск. Это означает, что объектные файлы, которые основаны на адресах вне его собственного рабочего пространства, вообще не работают (просто выдают сообщение об ошибке). Мой ПЗУ имеет базовый адрес 0xd000, что намного выше этого.

Кто-нибудь знает, возможно ли использовать M80 и L80 для этого, и если да, то как? В качестве альтернативы кто-нибудь может порекомендовать (и указать мне!) Набор ассемблера / компоновщика CP/M, который будет?

(Обратите внимание, что я бы хотел избежать кросс-компиляции, если это возможно.)

2 ответа

Решение

Если вы просто собираете один файл, то вы можете использовать директиву Mp.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 байтов из начала результирующего файла).

Старый вопрос, но это может сработать для тех, кто все еще ищет. Я проверил это на моей Ampro Little Board, работающей под управлением M80 / L80 1980 года на CP / M 2.2.

Вы можете использовать директиву ASEG (абсолютную) в своем начальном файле .MAC, указать 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, то L80 с / N / E создаст .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-байтовых блоков). Вы можете подтвердить результат, выполнив DUMP файла .COM. Если код был очень коротким, он также может включать остатки кода загрузчика L80, которые не были перезаписаны вашим кодом.

Обратите внимание, что вы также можете использовать подход ASEG с org 0100H для создания обычного CP / M .COM. В этом случае вам не нужно использовать .phase, если начало вашего кода находится в 100H.

Другие вопросы по тегам