レトロな(2) AltairZ80シミュレータ上のCP/MでHello World.

Joseph Halfmoon

前回はLinux上のAltairZ80シミュレータ上のCP/M2.2の使い方を調べてみました。今回は定石通り、Hello WorldをCP/M上でやってみたいと思います。使用するのは古き良き時代のアセンブラ、デジタル・リサーチのASMであります。シミュレータはZ80ですが、ニーモニックは懐かしのインテル8080とな。

※「レトロな」投稿順index

前回も長々と書きました。Windows11上のWSL2上のUbuntu20.04LTS上のAltairZ80シミュレータ上のCP/M 2.2なんであります。「今は亡き」デジタルリサーチ社のCP/Mはもともとインテル8080用のオペレーティングシステムです。今は亡きティム様の以下の偉業によって旧デジタルリサーチ社の資産を動かしてみることができるようになっており。

Tim Olmstead Memorial Digital Research CP/M Library

コマケー話、16進数表現

C言語の普及にともなって16進数リテラルは、

0x00

みたいな記法を用いるようになって久しいです。しかしこの老人がマイコンを学び始めた太古の昔(の80系)は異なりました。

00h

などと書いておりました。16進なのでAからFまでの文字も用いるのですが、AからFまでが先頭にくる場合は、

0ABh

のように頭に0を置くのがお作法でした。インテルニーモニックに慣れ親しんだものにとっては故郷の方言というべきか。今回使用のアセンブラはそれです。

8080とZ80、8085

インテル8080、8ビットCPUは、インベータ・ゲームで大ブレークを果たしたことで知られるとおり、デジタルな世の中の最初の1里塚的なCPUでした。しかし、当時のN-MOSのLSIは3電源を必要としました。メンドクセー。ということでその後継機種が2種。本家インテルは8085という単電源機種を出荷。8085は命令セットはほぼほぼ8080と同じ(2命令のみ追加)です。一方、元インテルの8080設計者が設立のザイログ社も単電源化した8080の上位互換(追加命令多数)のZ80を開発。世間的には80系8ビットの本流はZ80の側に流れた感じであります。

機械語レベルでZ80はインテル8080の上位互換ですが、アセンブラレベルのニーモニックは異なります。ぱっと見で分かるのはインテルはMOVと書くけど、ザイログはLDと書くと。著作権的な配慮だったらしいです、マニュアルの。

今回使用させていただいているAltairZ80シミュレータは、8080CPUを使用した初期の「パソコン(マイコン)」の偉大な金字塔 Altair社のマシンをシミュレートしているのですが、CPUはZ80に取り換えた「新式」バージョンのシミュレータみたいです。今回はオリジナルCP/Mの8080用のアセンブラを動かしてみるので、インテルニーモニックです。

エディタはLinux上のnanoね

CP/M上には悪名高い?EDエディタがあり、昔使ってましたが今は忘れてます(思い出したくない?)今回の環境にはスクリーンエディタの嚆矢ともいえるWM(ワードマスター)も含まれてました。忘却力の年寄が太古の時代のスクリーンエディタのキーストロークなど覚えているわけありません。いまさらだしな~。

ということで、ソースの編集は、Linux上でnanoエディタで行うことにいたしました。なお、nanoにはCP/Mにピッタンコの機能があるのです。

helloNANO

nanoでファイルセーブするときに CTRL-O キーを押しますが、そのとき、以下のようなメニューが出るのをお気づきでしたか?nanoSaveDOS

手元の環境では MetaキーはALTキーであったので、ALT+D押すとこんな感じです。 DOS Formatとな。nanoSaveDOS_2

これでCP/M世界用に行末 CR+LF にすることができました。DOSの行末がCR+LFになったのは元はといえばCP/M由来かと。

CP/Mは大文字小文字関係ねーケド

さて、CP/M上では大文字小文字は関係ねーです。皆、大文字で認識される世界。昔のMS-DOSと同じね。しかし、うっかりLinux上で小文字のファイル名でファイルを作ってしまったので、以下のようにしたら以下のように怒られました。トホホ。RhelloAsmERROR

CP/M内からLinux上のファイルをGetするつもりなら、大文字のファイル名にしておく方が良いみたいです。

いよいよアセンブル

ソースファイルさえできてしまえば、アセンブルは簡単。Iディスク(今回環境では8Mバイトの「大きな」HDDらしいっす)から、ブートのAディスク上の各種コマンドを呼んでいきます。

    1. Rコマンドで、外のLinux環境からソースファイルをリード。
    2. ASMコマンドでソースファイルをアセンブル(拡張子は.ASMが既定。)
    3. LOADコマンドでアセンブル結果のインテルHEXフォーマットのオブジェクトファイルをCP/MがローダブルなCOM形式(単なる100H番地スタートのバイナリ)に変換。

こんな感じ。helloASM

ASMによって生成されるのは、まずはアセンブラリスティングファイル、拡張子PRNです。

helloPRN

ちょっとTABストップがデコボコしてしまったのは、現代的なnanoでは1タブ4空白設定であったものを1タブ8空白のCP/Mの伝統的な世界に持ち込んでしまったためみたいデス。知らんけど。今度は気をつけよう。

インテルHEXファイルが以下に。伝統の”:”始まりデス。まあ、インテルHEXもいくつか形式ありーの。その中でも一番簡単なやつね。helloHEX

Hello World

生成された HELLO.COM を実行するときは、helloっと(大文字小文字関係ない。)HelloWorld

8080アセンブラを何十年かぶりに動かしましたな。

レトロな(1) CPM 2.2とAltairZ80シミュレータの操作方法 その1 へ戻る

レトロな(3) AltairZ80シミュレータ上のCP/MでDDT へ進む