目次
前
CP/Mシミュレータ
PC8801に接続していたEPSONのフロッピーディスクが
動作しなくなったので、CP/Mを動かすことが不可能に
なりました。
MSXのシミュレータ、エミュレータがあるのだから
CP/Mのシミュレータ、エミュレータもあるのでは
ないのかと考え、WEBで検索してみました。
多数のCP/Mシミュレータ、エミュレータがあったので
Altair8800をシミュレートするSIMHを利用することに
しました。
必要なファイルは、ZIPファイル形式の圧縮したファイルで
次のWEBサイトからダウンロードできます。
http://schorn.ch/altair.html
書いてある英文から、2つのZIPファイルをダウンロードして
ディレクトリを新規作成後、次の3ファイルをディレクトリに
コピーせよとなっています。
- altairz80.exe
- cpm2.dsk
- cpm2
「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」をタイプしてみます。
カレントディスクに含まれる、ファイル一覧が表示されました。
ディスクイメージ(仮想ディスクファイル)を利用していると
思われるので、ディレクトリの中のファイルを見てみます。
- app.dsk
- appleiicpm.dsk
- cpm2.dsk
- i.dsk
「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コードに変換すれば、開発効率を飛躍的に
向上させることが可能だと考えられます。
目次
前