CP/Mシミュレータで懐かしのインテル8080アセンブラを使う

CP/Mシミュレータ

2017年5月、Altair 8800 simulatorを使用して懐かしいCP/Mを使うことができました。

懐かしいインテル8080アセンブラを書いてみます。

Intel 8080 Diagram

Intel 8080 Diagram

懐かしのインテル8080アセンブラ

初めてマイクロプロセッサi8080のアセンブラを書いたのは、1976年のことです。ベンチャー企業V社でi8080との衝撃の出会いです。

ベンチャー企業V社でインテル8080を使う

趣味でも、TK-80トレーニングキットで休日にプログラミングしていました。命令コード表を参照しながらハンドアセンブルして機械語に変換していました。

TK-80トレーニングキットで趣味のプログラミング

最後に、8bitマイクロプロセッサZ80でプログラミングしたのは1980年代ですので、35年ぶりぐらいにインテル8080のアセンブラを書いたことになります。

当時は、オブジェクトコードを手で直接パッチを当てることをしていましたので、機械語コードを記憶するほど使い込んでいました。しかし、今では命令セットの記憶も曖昧です。命令セット表を見ながらプログラミングしてみると、なんとなく思い出しました。

プログラム仕様

キーボードから入力したキーコードを16進数で表示する。10回繰り返して終了する。

プログラム実行

プログラム実行

CP/Mは、ASCIIコードを採用しています。

  • 数字の’0′ : 16進数で0x30
  • 数字の’1′ : 16進数で0x31
  • アルファベットの’A’ : 16進数で0x41
  • アルファベットの’O’ : 16進数で0x4F
  • アルファベットの’P’ : 16進数で0x50

プログラムコード

キーコードダンプのプログラムを下記に示します。

キーボード入力と画面表示は、CP/M BDOSファンクションコールを使用します。

【プログラム説明】

CP/Mのプログラムは、0100hから開始します。

  • 最初に、繰り返し回数 COUNT ← 10とします。
  • ===LOOP===
  • | コンソール文字入力(CONINP)で、Aレジスタにキーコードを入力します。
  • | コンソールストリング出力(STROUT)で、MSGKEYを表示します。
  • | 8bitヘキサ変換(CV8BIT)で、Aレジスタを16進数文字列に変換してOUTBUFに格納します。
  • | コンソールストリング出力(STROUT)で、OUTBUFを表示します。
  • 繰り返し回数 COUNT をデクリメントして、ゼロになるまで上記を繰り返します。
  • 終了して、CP/Mに制御を戻します。

 

■ 8bitヘキサ変換(CV8BIT) :Aレジスタ[7-0]を16進数文字列変換してHLアドレスから格納

  • AレジスタをBレジスタに待避します。
  • Aレジスタを4回ローテイトして上位4bitと下位4bitを入れ替えます。
  • 0Fhでマスクして、Aレジスタ[7-4]を下位4bitに入れます。
  • 4bitヘキサ変換(CV4BIT)で16進文字列に変換して、アドレスHLに格納してHLをインクリメントします。
  • AレジスタをBレジスタから元に戻します。
  • 0Fhでマスクして、Aレジスタ[3-0]を下位4bitに入れます。
  • 4bitヘキサ変換(CV4BIT)で16進文字列に変換して、アドレスHLに格納します。

 

■ 4bitヘキサ変換(CV4BIT) :Aレジスタ[3-0]を16進数文字列変換

  • 00~09のとき、’0’を足します → (‘0’~’9’)
  • 0A~0Fのとき、(‘A’-‘0’-10) + ‘0’を足します  → (‘A’~’F’)

ASCIIコードの’0’~’9’と’A’~’F’は、連続する文字コードを割り当てていることを利用しています。

プログラムのビルド

CP/Mの8080アセンブラ ASMを使用して、ソースコード KEYCD.ASMをビルドします。拡張子 .ASM は、省略します。

CP/M ASM アセンブル

CP/M ASM アセンブル

ディレクトリをみると .PRNと .HEXを生成しました。


拡張子 .PRN のファイルを確認します。

アドレスと機械語とソースコードを並べたリストファイルです。


拡張子 .HEX のファイルを確認します。

機械語がインテルHEXフォーマットで記録されています。


LOADコマンドで、.HEXファイルを実行形式の .COMに変換します。

CP/M LOADコマンド

CP/M LOADコマンド

 

ディレクトリをみると .COMを生成しました。


KEYCD.COMを実行します。

プログラム実行結果

プログラム実行結果

 

最後に

Altair 8800 simulatorを使用してCP/Mで、久しぶりにインテル8080アセンブラでプログラムを書きました。

大学生から新入社員だったころに、熱中してi8080プログラミングしていたころを思い出しました。

「我が青春の8bitマイコン8080」と、言えるでしょう!