CP/M用のプログラムを8080アセンブラを使って作る方法は以下のようなパターンが考えられます。
EDなどのCP/M上のエディタで8080のアセンブラを書きASM.COMでアセンブルする方法
ASMはMac上のエディタで作成して、それをCP/Mに転送してASM.COMでアセンブする方法。CP/Mの改行コードはDOSと同じCR+LFです。
ASMをMac上のエディタで作成して、Mac上のasm8080でアセンブルしてHEXファイルをCP/Mに転送する方法
hex2binを使ってcomまでMac上で作ってcomを転送することもできます。
$ asm8080 hello.asm
$ hex2bin -m 80 -p 0 -e com hello.hex
hex2bin v2.5, Copyright (C) 2017 Jacques Pelletier & contributors
Allocate_Memory_and_Rewind:
Lowest address: 00000100
Highest address: 00000211
Starting address: 00000100
Max Length: 274
Binary file start = 00000100
Records start = 00000100
Highest address = 00000211
Pad Byte = 0
Extended
Highest address: 0000027F
Max Length: 384
これでも良いのですが、asm8080が吐くbinファイルはパディングされてませんが、中身はcomと同じものなのでbinをそのままでも大丈夫そうです。
cpm8266のxmodemコマンド(xs,xr)はlrzszではうまく動かないことがあったので、Mac用のコマンドを簡単に作ってみました。
送信のxs.cは128バイトのあまり部分に0x1aを埋めていますが、xr.cはそのままにしてます。xmodemでバイナリを送信する時にバイナリの終端に0x1aがあると削られてファイルが壊れます。おそらく当時はこの問題が起きないように圧縮するなり、なんらかのテキストエンコードで送っていたのではないでしょうか。
xmodemは最後のブロックのあまりに0x1aを埋めるのですが、受信している時にそのブロックが最後かはわからず、次のブロックのリクエストがSOHではなくてEOTだと、その前のブロックが最後だったのがわかる仕組みになっています。なので0x1aを削る処理はEOTを受けてからしかできず、面倒なんので実装しませんでした。
xmodemでは受信側が最初のバイトの送信を行います。xr.cは自分がバイトを送信した後にシーケンスが続くので普通に実装しましたが、xs.cは送られてきているデータを処理することを考えてkqueueを使っています。今の所あまり必要なさそうですが、またいじる時にはなにかの役に立つかもしれません。
2022/7: xs,xrコマンドに標準入力のサポートを入れました。引数が一つでデバイス名がない場合は標準入出力で処理します。
Z80のニモニック(命令の文字列)は8080と違っているので、Z80では別のツールを使う必要があります。
Z80の事は以下のページに詳しく書いてありました。
マイクロソフトがCP/M用のアセンブラとして販売していた、MACRO-80は8080とZ80に対応していて中間ファイルの生成をおこない、LINK-80でバイナリにしていました。MACRO-80の最終バージョンは3.44だったようです。
8080の最初の頃の開発環境はPDP-11などクロスアセンブラでした。CP/Mが出てきた事で、セルフでの開発ができるようになりました。CP/Mは非常に重要なターニングポイントであったと思われます。