目次

CP/Mシミュレータ

 PC8801に接続していたEPSONのフロッピーディスクが
 動作しなくなったので、CP/Mを動かすことが不可能に
 なりました。

 MSXのシミュレータ、エミュレータがあるのだから
 CP/Mのシミュレータ、エミュレータもあるのでは
 ないのかと考え、WEBで検索してみました。

 多数のCP/Mシミュレータ、エミュレータがあったので
 Altair8800をシミュレートするSIMHを利用することに
 しました。

 必要なファイルは、ZIPファイル形式の圧縮したファイルで
 次のWEBサイトからダウンロードできます。

 http://schorn.ch/altair.html



 書いてある英文から、2つのZIPファイルをダウンロードして
 ディレクトリを新規作成後、次の3ファイルをディレクトリに
 コピーせよとなっています。

 「cpm2」の内容は、以下。

d tracks[0-7] 254
attach dsk0 cpm2.dsk
attach dsk1 app.dsk
attach hdsk0 i.dsk
;demo how to use other disk formats in CP/M 2
;it will mount as drive J:
attach hdsk1 appleiicpm.dsk
set hdsk1 format=apple-d2
set cpu 64k
set cpu noitrap
set cpu z80
set cpu altairrom
set cpu nonbanked
reset cpu
set sio ansi
set sio nosleep
boot dsk

 ディスクに関係するパラメータを設定しているようです。

 ディスクドライブは3ドライブで、A、B、Iとなっています。
 CP/Mでは、ディスクドライブは0がカレントで、AからPには
 1から16までの番号をつけて管理します。
 この設定では、ディスクイメージを利用し、A、Bを使える他
 ハードディスクを用意しています。

 CP/Mの管理下にあるディスクがA、B、Iの3種類だというので
 後ほど、そうなっているかを調べます。

 コメントされている英文には、ドライブJがあると書いています。
 ドライブJは、appleiicpm.dskに割り当てられててあるようです。
 こちらも後ほど調べてみます。

 CP/Mが最も使われた時期には、ハードディスクは高価で簡単には
 利用できなかったのですが、今ではハードディスクは安価な記憶
 装置なので、フロッピーディスクをエミュレートするファイルの
 格納場所と割り切っているようです。

 フロッピーディスクと同じならば、フォーマットしないと使えない
 はず。コマンドが用意されているかを調べて、使ってみます。

 ディレクトリとして、CPMを新規作成して、必要なファイルを
 コピーしてみました。



 Altair8800のシミュレートをするので、「altairz80.exe」を
 ダブルクリックして、動作開始。



 DOS窓が起動して、入力待ちになりました。



 「CP/M2.2」を動かすので、シミュレータの「do」コマンドを使います。
 「do cpm2」とタイプ。



 CP/Mの環境が起動しました。




 「64k CP/M」と表示されているので、Z80のメモリ空間64kバイト
 すべてを利用できるようです。


 ビルトインコマンドの「DIR」をタイプしてみます。



 カレントディスクに含まれる、ファイル一覧が表示されました。
 ディスクイメージ(仮想ディスクファイル)を利用していると
 思われるので、ディレクトリの中のファイルを見てみます。

 「cpm2.dsk」を除いた3ファイルが、一時的に使われている
 仮想ディスクファイルなのでしょう。

 ビルトインコマンドの「TYPE」でMACファイルの内容を表示してみます。



 「BOOT.MAC」を見ると、ブートに必要な機械語は0FF00Hから格納
 されているようです。

 「cpm2」で割り当てられている4ドライブにアクセスしてみます。



 ドライブBの場合、1行3ファイルの情報を「:」で区切って
 表示されています。

 ドライブI、Jは、フォーマットしないでも使えるよう。

 ドライブBに、ビルトインコマンドの「PIP」を利用して
 ファイルを転送できるかを確認してみます。



 フォーマットは、「XFORMAT」を利用します。

 CP/Mのフロッピーディスクに関連するパラメータを表示して
 いるので、ディスクの容量を計算できます。

 128 bytes x 254 X 32 = 1024 bytes x 254 x 4 = 1040384
 となり、1Mバイト弱になります。

 フォーマットされると、ディレクトリ内容を保存する領域が
 確保されるので、「DIR」でファイルに関係する情報を取得
 できようになります。

 フォーマットされると、ファイル転送の「PIP」コマンドを
 利用可能になりました。

 コピーしたファイルの内容を「TYPE」で表示して確認します。



 間違いなくコピーされています。

 終了は、「HALT」→「exit」とタイプします。



 HALTが、CP/Mのエミュレーション終了で、exitがDOS窓
 を閉じることの指示になります。

 CP/Mは、Disk Operating Systemなので、システムコールを
 利用して、ディスクファイルへのアクセスができます。
 ここから先は、システムコールを利用したアセンブリ言語を
 作成し、感触を確かめてみます。

 CP/Mのテキストエディタは、WordMaster、WordStarが有名でした。
 エミュレータは、Windowsのひとつのディレクトリを占有して仮想
 ディスクをアクセスできます。この仮想ディスクとファイル交換
 するために、R.COM、W.COMがあります。

 R.COM、W.COMでWindowsのDOS窓でアクセスできるファイルを
 リード、ライトできるので、CP/Mのテキストエディタを使わ
 ないことに。

 Windowsで使い慣れているテキストエディタを利用し
 アセンブリ言語のソースファイルを作成します。

 CP/Mのシステムコールは、レジスタCに機能コードを、レジスタAか
 レジスタペアDEにパラメータを設定して0005hをコールします。
 これをZ80のアセンブリ言語コードでテストします。


文字列出力

 文字列出力は、レジスタペアDEに文字列が含まれている  メモリのアドレスを格納し、レジスタCに機能番号09hを  設定して、BDOSコールします。  アセンブリ言語ソースコードは、以下。 ;+++++++++++++++++++++++++++++++++++++++++++++ ; show strings "Hello World !" with BDOS call ;+++++++++++++++++++++++++++++++++++++++++++++ CR EQU 0dh LF EQU 0ah BDOS EQU 0005h org 100h START: ; set function number LD C,09H ; set string pointer LD DE,MSG ; system call CALL BDOS ; return CP/M RET org 200h MSG: DB CR,LF,'Hello World !',CR,LF,'$' END  ファイル名を「test01.mac」とします。  Z80のアセンブリ言語をコンパイル、リンクするには  MicrosoftのM80.COM、L80.COMを使います。  ファイルリード→アセンブル→リンクの手順は、以下。  ここまで進めて、気がつきました。Altair 8800は、i8080を利用  しているので、Z80のプログラムを実行できません。  8080のニモニックで書き直して、アセンブル、リンクしてみます。  ソースコードは、以下。 ;+++++++++++++++++++++++++++++++++++++++++++++ ; show strings "Hello World !" with BDOS call ;+++++++++++++++++++++++++++++++++++++++++++++ CR EQU 0dh LF EQU 0ah BDOS EQU 0005h org 100h START: ; set function number MVI C,09H ; set string pointer LXI D,MSG ; system call CALL BDOS ; return CP/M RET org 200h MSG: DB CR,LF,'Hello World !',CR,LF,'$' END  利用するアセンブラは、ASM.COMです。  ASMではHEXファイルを生成するので、COMファイルに  変換するために、LOAD.COMを使います。  LOADは、「荷をもってくる」くらいの意味ですが  CP/Mでは、HEXファイルからCOMファイルに変換する  プログラムになります。  COMファイルは、OSであるCP/Mで扱う「荷」と  みなしているのでしょう。  一連の操作をバッチファイルにもできますが  ここでは、このままで進めます。

1文字入力

 1文字入力と1文字出力のシステムコールの機能  番号は、各々01H、02Hになります。  ソースコードは、以下。 ;+++++++++++++++++++++++++++++++++++++++++++++ ; get one charactor and put it with BDOS call ;+++++++++++++++++++++++++++++++++++++++++++++ CR EQU 0dh LF EQU 0ah BDOS EQU 0005h org 100h START: ; get one charactor MVI C,01H ; system call CALL BDOS ; PUSH PSW ; put one charactor MVI C,02H MOV E,A ; system call CALL BDOS ; POP PSW ; return CP/M RET END  ディレクトリからソースファイルを入力し、アセンブル→  COMファイル生成→動作テストと操作してみました。  コンソールにエコーバックしているので小文字の  'a'、'b'をタイプした結果です。  i8080のアセンブラであるASM.COMは、Intel表記しか  受け付けないので、Zilog表記から変換するフィルタ  を書いて対応します。  フィルタプログラムは、AWK、Tcl/Tk、Python等の  スクリプト言語を利用したスクリプトで書いておく  とよいでしょう。  CP/MのBDOSコールを使うときは、コーリングシーケンス  が決まっているので、コピーして必要な部分だけを編集  してしまう方法もとれます。  CP/MのBDOSコールを利用して、システムを書いていくには  アセンブリ言語の知識が必要です。  i8080、Z80のアセンブリ言語の知識を持っているのは  1960年前後の10年間に誕生した人くらいでしょう。

MBASIC利用

 高級言語のBASICを利用してみます。  CP/M起動後、MBASICを動かすのは、次のようにタイプ。  プログラム領域としては、32kバイト程度は使えるよう。  簡単なプログラムを入力し、動かしてみます。  高級言語のBASICが動くなら、i8080、Z80を考えずに  自分がやりたいことに集中できます。  CP/Mシミュレータ上のMBASICで、システムの仕様を  検証してから、IchigoJamをはじめとするマイコン  のBASICコードに変換すれば、開発効率を飛躍的に  向上させることが可能だと考えられます。
目次

inserted by FC2 system