2013.5.8
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第391回]


●ファンクション0〜ファンクション2

前回のバッチ処理プログラムの作業まででとりあえずCP/M互換DOSプログラムの作成作業は完了しました。
同時並行で進めておりました取扱説明書も大体のところは出来ました。
ただ。
説明書を書き進めていくなかで、プログラムにおかしなところがぽろぽろ出てくるものですから、このところその修正作業に多くの時間を費やしてしまっています。
本日もリブートの動作やらカレントドライブの設定などに納得いかないところがみつかってしまい、その追求にほぼ1日を費やしてしまいました。

ホームページの過去記事を参照しながら説明書を書いていきますと、間違っているところや、落ちているところなどがみつかって、そのフォローもしなくてはなりません。
今回の記事もその例です。

ファンクション0はシステムリセット(リブート)です。
これはまだ書いていませんでした。
確認してみましたら、システムプログラムもそのところは後回しにしたままで、手をつけていませんでした。
とは言いましても、このファンクションはただリブートすればよいだけなので(実質的に0000番地へのジャンプと同じ)、それほど世話はありません。

その関連で「応用CP/M」(村瀬康治著。アスキー出版局。[第2回]参照)をあらためて読んでみましたら、ファンクション02の機能にも落ちがあることがわかりました。
ファンクション02はコンソール出力(画面表示)なのですが、同書によりますとただ出力するだけではなくて、[Ctrl]+[S]で一時停止し、[Ctrl]+[Q]で出力を再開、また停止中に[Ctrl]+[C]の入力でユーザープログラムの打ち切りになるなどの機能があることがわかりました。
そのほかの機能もあるようなのですが、とりあえず[Ctrl]+[S]、[Ctrl]+[Q]および[Ctrl]+[B]を実装しました。
[Ctrl]+[B]については後で説明をいたします。

それで、そのテストプログラムなのですが、同書のテストプログラムがそのものずばりでしたので、そのままいただいてしまうことにいたしました。

●テストプログラムVFTST0−2

下がそのソースプログラムです。

;;FUNCTION 0,1,2 TEST
;2013/5/4 5/5
;
	ORG $0100
     FCALL=$0005
;
START:LD C,02
	LD E,2A;'*'
	CALL FCALL
	LD C,01
	CALL FCALL
	LD (BUFF),A
	CP 12;^R
	JP Z,RESET
	LD C,02
	LD E,3A;':'
	CALL FCALL
	LD B,00
LOOP:LD A,(BUFF)
	LD C,02
	LD E,A
	CALL FCALL
	DEC B
	JP NZ,LOOP
	LD E,0D
	CALL FCALL
	LD E,0A
	CALL FCALL
	JP START
;
RESET:LD C,00
	CALL FCALL
;
BUFF:NOP
;
 

こちらがアセンブルリストです。

2013/5/5  9:32  vftst0-2.txt
END=013C
              ;;FUNCTION 0,1,2 TEST
              ;2013/5/4 5/5
              ;
              	ORG $0100
                   FCALL=$0005
              ;
0100 0E02     START:LD C,02
0102 1E2A     	LD E,2A;'*'
0104 CD0500   	CALL FCALL
0107 0E01     	LD C,01
0109 CD0500   	CALL FCALL
010C 323C01   	LD (BUFF),A
010F FE12     	CP 12;^R
0111 CA3701   	JP Z,RESET
0114 0E02     	LD C,02
0116 1E3A     	LD E,3A;':'
0118 CD0500   	CALL FCALL
011B 0600     	LD B,00
011D 3A3C01   LOOP:LD A,(BUFF)
0120 0E02     	LD C,02
0122 5F       	LD E,A
0123 CD0500   	CALL FCALL
0126 05       	DEC B
0127 C21D01   	JP NZ,LOOP
012A 1E0D     	LD E,0D
012C CD0500   	CALL FCALL
012F 1E0A     	LD E,0A
0131 CD0500   	CALL FCALL
0134 C30001   	JP START
              ;
0137 0E00     RESET:LD C,00
0139 CD0500   	CALL FCALL
              ;
013C 00       BUFF:NOP
              ;
BUFF         =013C  FCALL        =0005  LOOP         =011D  
RESET        =0137  START        =0100   

プログラムをスタートすると * を表示して入力待ちになります。
このとき[Ctrl]+[R]を入力するとプログラムが打ち切られてリブートします。

RESET:のところにファンクション00へのコールがありますが、その先が書いてありません。
普通はこういうプログラムを書くとここで暴走してしまいますが、この場合に限ってこういう書き方でも構いません。
なぜならファンクション00はシステムリセットなので、結果としてユーザープログラムの実行はここで打ち切られてしまうため、ここに戻ってきて続きが実行されることはないからです。

それ以外の何かキーを押すと : に続いてその文字が256個表示されたあと、ふたたび最初に戻って * が表示されます。
256個の文字を表示しているときに[Ctrl]+[S]を入力すると、表示がそこで停止して入力待ちになります。
ここで[Ctrl]+[Q]を入力すると、表示が再開されます。
また表示停止中に[Ctrl]+[B]を入力すると、プログラムの実行が打ち切られてコマンド入力待ちの状態に戻ります。

こちらがVFTST0−2を実行したときの画面です。



●[Ctrl]+[B]

CP/Mではコマンド入力待ちのときに[Ctrl]+[C]を入力すると強制的にリブートします。
考えてみるとおかしな機能で、なぜそういうものが必要なのか理解に苦しみます。
CP/Mはフロッピーディスクが主体のシステムで、頻繁に書込み禁止になってしまったらしく、それを解除するために使われたということかも知れません。
上記のファンクション02実行中の入力は単にプログラムの実行を中止するだけでリブートではありません。
それはさておき、どちらも同じ[Ctrl]+[C]なのですが、残念なことにCP/M互換DOSでは使うことができません。
CP/M互換DOSはWindows側のプログラムがキー入力、画面表示、ディスクアクセスの役を担っています。
Windows側のCCPということがいえると思います。
そのWindows側のプログラムはBorlandC++で書いているのですが、こちらはもとはZB3BASICのために書いたもので、かなり複雑なつくりになっています。
その作成の過程で[Ctrl]+[C]はシステムの強制ブレークとして扱ってきましたので、それをもとから直さないことには[Ctrl]+[C]をCP/Mのリブート用に使うことはできません。
そこに手をつけますと、収拾がつかなくなってしまう可能性がありますし、CP/Mのこの機能については、ちょっと?(はてな)という感じでもありますから、上に書きましたように、CP/M互換DOSでは[Ctrl]+[B]を使うことにしました。

ワンボードマイコンでCP/Mを![第391回]
2013.5.8upload

前へ
次へ
ホームページトップへ戻る