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

ベンチャー企業V社

1976年、大学3回生の夏休みのことです。大学の教授の紹介で小松市にあるベンチャー企業V社に企業実習に参加しました。そのころは、インターンシップという言葉は使われていませんでしたが、大学としての目的は企業で体験して職業としてのソフトウェアを知ることとスキルアップすることにあったと思います。

ベンチャー企業V社は、金沢工業大学の教授が1969年に設立したコンピュータ機器を開発するベンチャー企業です。開発室は小高い丘の林の中に建てられた建物にあり、エアコンは設置されてしませんでした。しかし、窓からそよ風が入ってきたので、そんなに暑さは感じませんでした。社員の皆さんは、とてもやる気が高く熱気に満ちていました。

 

オフコンとは

オフコンとは、オフィスコンピュータを略した呼称で、主に中小企業等での販売管理、財務管理、人事給与などの事務処理を行うために設計された小型のコンピュータです。その頃、ベンチャー企業V社はペントリーというオフコンをR社と共同開発していたようです。CPUにインテル8080を搭載し、ディスプレィモニタ、プリンタ、8インチフロッピーディスクを設置した一体型のオフコンでした。

 

アセンブラとインタプリタ

オフコンの業務アプリケーションをインテル8080アセンブラ言語で開発するのは開発効率が悪いので、PMAPという簡易アセンブラ言語が用意されていました。PMAPで記述したソースプログラムをアセンブルすると中間言語の仮想マシンコードが出力されます。インタプリタでその中間言語を実行する方式となっていました。


Tダイアグラムを用いて、PMAPアプリレーションがどのように実行されるかを説明します。

その前に、Tダイアグラム方式について最初に説明します。

Tダイアグラム 説明

Tダイアグラム 説明

T字型の左側のボックスは入力を示し、右側のボックスは出力を示します。下側のボックスは記述した言語を示します。従って、このT字型は、言語Nで記述したLからMへのコンパイラを示します。

I字型の下側のボックスは記述した言語を示し、上側のボックスは解釈実行する言語を示します。従って、このI字型は、言語Mで記述した言語Lのインタプリタを示します。


PMAPアプリソースは、インテル8080で記述されたアセンブラによってP-codeという中間言語にアセルブルされます。P-codeアプリは、インテル8080で記述されたインタプリタにより解釈実行されます。

Tダイアグラム 例

Tダイアグラム 例


初めて使うインテル8080

私は、PMAPインタプリタから呼ばれる数字入力モジュールを8080アセンブラで開発しました。

8080はインテルの開発した8bitマイクロプロセッサで、ちょうどその当時に話題になり始めていたので8080でプログラミングできることが夢のようでした。

1冊の本を購入して、8080アーキテクチャーと命令セットについて勉強しました。なかなかおもしろいマイクロプロセッサです。

特徴をもったレジスタセットをもっています。

  • 8bit 演算用アキュムレータの A レジスタ
  • 6個の8bit 汎用レジスタの B,C,D,E,H,L レジスタ
  • 汎用レジスタを2個組合わせた16bitペアレジスタ BC,DE,HL レジスタ
    特にHLペアレジスタは、メモリを間接指定するレジスタとして使用できます
  • 16bitのプログラムカウンタでプログラムアドレス空間は64Kバイトにアクセスできます
  • 16bitのスタックポインタがあり、PUSH命令とPOP命令でスタックにレジスタの待避と復元ができます。また、サブルーチンコールのCALL命令で戻り先アドレスをスタックに保存し、サブルーチンから戻るRET命令でスタックからアドレスを取得して呼び出し元に復帰します。

私の担当したモジュールは、画面のXY座標と桁数を指定してテンキーから入力した数字を数値に変換して戻り値とするサブルーチンです。詳細な仕様が決まっておらず、自分で考えてみなさいと指示されましたので、動作仕様を検討しました。事務処理に使用するので10進8桁の精度が必要と考え、32bit精度の演算としました。
電卓のように入力領域の右側から入力した数字が表示され、内部で10進数から2進数への変換を行います。3桁ごとにカンマが表示されるようにもしました。
入力誤りをしたときのために、1桁キャンセルや全桁キャンセルの機能もつけました。

電卓の動作がどうなっているか触りながら、フローチャートを作成してプログラム設計しました。

8080の開発環境

インテル8080の開発環境は、ミニコンピュータを使用したクロス開発環境でした。

  • 紙テープのパンチ

コーディングシートを見ながら、ASR33というテレタイプライタで紙テープにパンチします。パンチミスやプログラムミスを修正するときは、紙テープをハサミで切断して新しくパンチした紙テープとのりで接着します。紙テープを切り貼りしてプログラムを修正するわけです。何回か修正を繰り返していると、紙テープがボロボロになってきます。そのときは、テレタイプライタの複写機能を使用して古い紙テープを読み込みながら新しい紙テープにパンチすることにより、きれいな紙テープができあがります。

パンチカードの場合は、カードの差し替えでしたが、紙テープの場合は少し面倒な作業となります。

  • アセンブルの方法

紙テープをミニコンピュータの紙テープリーダにセットして、8080クロスアセンブラを実行してアセンブルしてオブジェクトコードを生成します。アセンブルエラーがあった場合は、プリンタに印刷されます。タイプミスやプログラムミスがある場合は、紙テープを修正して、もう一度クロスアセンブルします。エラーがない場合は、オブジェクトコードが紙テープにパンチ出力されます。

  • プログラムの実行

オフコンの紙テープリーダにオブジェクトコードの紙テープをセットして、紙テープを読み込み、実行します。正しく動作しない場合は原因を追及するためにデバッグします。

そのときに、デバッガが役に立ちます。この会社の社員の方が開発したそうです。この当時はソースコードデバッガなどなく、アセンブル結果のアドレスとオブジェクトコードのリストを見ながらのデバッグになります。

以下のような主な機能がありました。

  • 指定したアドレスにブレークポイントを設定
  • レジスタの値の参照
  • レジスタに値の設定
  • メモリの値の参照
  • メモリに値の設定

このデバッガを使いながら、ブレークポイントごとに止めて正しく動作しているか確認できるわけです。

このデバッガの仕組みを図で説明します。

デバッガー説明

デバッガー説明

 

図のようなプログラムをデバッグするとします。左端欄がアドレスで中央欄がアセンブルした命令コードのオブジェクトです。
ユーザーがブレークポイントをアドレス0104番地に設定すると、アドレス0104番地から3バイトの内容をデバッガに保存して、デバッガへのJUMP命令(3バイト命令でC3 LL HH)を埋め込みます。

プログラムを実行すると、ブレークポイントに埋め込んだJUMP命令でデバッガに飛び込みます。デバッガでレジスタの値の参照などしてデバッグします。

デバッガからユーザープログラムに戻る場合は、まずブレークポイントのアドレス0104番地から3バイトの内容を元のコードに戻します。次に、ブレークポイントのアドレス0104番地にJUMPすることにより、ブレークポイントからユーザープログラムを継続実行します。

プログラムのバグを発見すると、紙テープをパンチしてソースコードを修正します。

オブジェクトコードのパッチ方式

このように、プログラムのバグを発見した場合は、ソースコードの紙テープを切り貼りしてから修正して、クロスアセンブルしてオブジェクトテープを出力して、ターゲットマシンで読み込みすることになり、大きな回り道となります。

そこで、現場ではオブジェクトコードを手で直接パッチを当てることが行われていました。

  1. 修正するソースコードをハンドアセンブルしてオジェクトコードに変換します
  2. 修正するアドレスから3バイトのコードをつぶしてパッチ領域へのJUMP命令に書き換えます
  3. パッチ領域でつぶした3バイトのコードに続きハンドアセンブルしたコードを埋め込み、JUMP命令の直後にJUMPして戻ります。

このように、オブジェクトコードを直接修正して、JUMPすることにより修正した新しいコードを実行することができます。

命令コードを削除するだけの場合はNOP命令を埋め込むことによってオブジェクトコードを削除することができます。

企業実習から学んだこと

最新のインテル8080のアセンブラ言語を経験することができて本当によかったと思います。

オブジェクトコードのパッチ方式は、パッチコードをソースコードに反映することを怠ると、最新ソースが存在しないことになりトラブルの原因となります。十分気をつけないと大変なことになります。しかし、この当時のマイクロプロセッサの開発環境は貧弱なので、有用な方法でした。

プログラムの修正がこんなに大変なので、最初のプログラム設計は十分に行う必要があると痛感しました。