2015.1.13

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第100回]


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

ファンクション01とファンクション02については前回テストしましたが、以前にND80Z3.5(ND80ZV)用のZB3DOS(CP/M互換DOS)のテストを行なったときには別のプログラムでもテストをしています。
前回のテストはファンクション01が中心でしたが、今回のテストではファンクション02がメインです。
今回のテストではファンクション0のテストも行ないます。
ファンクション0はシステムリセット(リブート)です。

今回のテストプログラムはVFTST0−2です。
VFTST0−2は「ワンボードマイコンでCP/Mを!」[第391回]でテストをしています。

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

下はVFTST0−2のアセンブルリストです。

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   


VFTST0−2の動作は「ワンボードマイコンでCP/Mを!」[第391回]で説明していますが、説明不足のところもありますので、あらためて説明をします。

プログラムをスタートすると * を表示して入力待ちになります。
このとき[Ctrl]+[R]を入力する([Ctrl]キーと[R]キーを同時に押す)とプログラムが打ち切られてリブートします。
入力にはファンクション01がコールされていますが[Ctrl]+[R]でリブートするのはファンクション01の機能ではなくてプログラムがそのように書かれているからです。
[Ctrl]+[R](コード12)を検出するとRESET:にジャンプします。
RESET:ではファンクション0がコールされます。
CALL FCALLの後ろにはリターン後のプログラムの続きは書いてありませんが、ファンクション0の実行によって以後のプログラムの実行は打ち切られてシステムがリブートしますので、何も書いておく必要はありません。

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

●[Ctrl]+[R](ファンクション0)と[Ctrl]+[P]、[Ctrl]+[Q]、[Ctrl]+[C](ファンクション02)のテスト

まずは[Ctrl]+[R](ファンクション0)と[Ctrl]+[P]、[Ctrl]+[Q]、[Ctrl]+[C]のテストを行ないました。
下がそのときの画像です。



画面からだけではちょっとわかりにくいですが、画面中ほどで最初のVFTST0−2[Enter]を入力し、VFTST0−2がスタートして*が表示されています。
ここで[Ctrl]+[R]を入力しました。
画面には表示されませんがMYCPU80本体のLEDがしばらく激しく点滅してシステムプログラムがリロードされる様子が見えました。
リロードが完了すると
Z>
と表示されて入力待ちになりました。
ここでもう一度VFTST0−2[Enter]を入力しました。
今度は a を入力しましたので、a が連続して表示されています。
途中で[Ctrl]+[P]を入力して表示を停止させたあと[Ctrl]+[Q]を入力すると表示が再開されましたが、上の画像ではそのことは確認できません(そういう動作をするということで、ご納得くださいませ)。
2行目の表示の途中で[Ctrl]+[P]を入力して表示を停止させたあと[Ctrl]+[C]を入力しました。
今度はシステムのリロードは行なわれないでVFTST0−2の実行が中止されて
Z>
と表示されて入力待ちになりました。

オリジナルのCP/Mではファンクション02の実行中に[Ctrl]+[S]の入力で表示が一時停止します。
「ワンボードマイコンでCP/Mを!」[第391回]でも「ファンクション02を実行してコンソール出力(画面表示)を行なっているときに、[Ctrl]+[S]を入力すると表示を一時停止します」と書いています。
しかしその後にさらにシステムプログラムの実装を進めていく過程で[Ctrl]+[S]では都合が悪いことがわかりましたので、代わりに[Ctrl]+[P]を使うようにシステムプログラムを変更しました(「ワンボードマイコンでCP/Mを!」[第400回]参照)。

「ワンボードマイコンでCP/Mを!」[第391回]では「ファンクション02を実行してコンソール出力(画面表示)を行なっているときに、[Ctrl]+[S]の入力(現在のシステムでは[Ctrl]+[P]の入力)で表示を一時停止させたあと、[Ctrl]+[B]を入力するとプログラムの実行が中止されてシステムに戻ります」と書いています。
しかしやっぱり[Ctrl]+[B]ではCP/M互換という観点からはしっくりしないと考えましたので、ZB3DOS(CP/M互換DOS)の正規リリース時点で、[Ctrl]+[C]でプログラムを中止してシステムに戻るようにシステムを変更しました。

●そのほかの特殊コードの表示

ファンクション02はEレジスタに通常の表示文字コードの代わりに08,09,0A,0Dを入れてコールするとそれぞれ次の動作をします。
E=08 カーソルが1字分前に戻る([BackSpace]の動作)
E=09 カーソルがタブ位置に移動する([Tab]の動作)
E=0A カーソルが行の先頭に戻るとともに1行改行する(CR&LFの動作。オリジナルのCP/MではLFの動作)
E=0D カーソルが行の先頭に戻る(CRの動作。改行はされない)

以上の動作を確認するためにVFTST0−2で試してみたのですが入力文字コードが連続して表示されるために今回の目的には不向きでした。
そこで新しくテストプログラム(MF02TST)を作って実行しました。

●テストプログラムMF02TST

下はMF02TSTのアセンブルリストです。
今回はMYCPU80でテストしますから8080ニーモニックで書いてからASM80でアセンブルしました。

2015/1/13  14:54  mf02tst.txt
END=0144
              ;;;FUNCTION02 TEST from VFTST1
              ;;; 15/1/13
              ;
                   ORG $0100
                   FCALL=$0005
              ;
0100 3E00     	MVI A,00
0102 F5       LOOP:PUSH PSW
0103 57       	MOV D,A
0104 CD3B01   	CALL HEX1
0107 5F       	MOV E,A
0108 7A       	MOV A,D
0109 0F       	RRC
010A 0F       	RRC
010B 0F       	RRC
010C 0F       	RRC
010D CD3B01   	CALL HEX1
0110 D5       	PUSH D
0111 5F       	MOV E,A
0112 0E02     	MVI C,02
0114 CD0500   	CALL FCALL
0117 D1       	POP D
0118 0E02     	MVI C,02
011A CD0500   	CALL FCALL
011D 1E3A     	MVI E,3A;':'
011F 0E02     	MVI C,02
0121 CD0500   	CALL FCALL
0124 F1       	POP PSW
0125 5F       	MOV E,A
0126 F5       	PUSH PSW
0127 0E02     	MVI C,02
0129 CD0500   	CALL FCALL
012C 1E2C     	MVI E,2C
012E 0E02     	MVI C,02
0130 CD0500   	CALL FCALL
0133 F1       	POP PSW
0134 3C       	INR A
0135 FE20     	CPI 20
0137 C20201   	JNZ LOOP
013A C9       	RET
013B E60F     HEX1:ANI 0F
013D C630     	ADI 30
013F FE3A     	CPI 3A
0141 D8       	RC;0-9
0142 C607     	ADI 07;A-F
0144 C9       	RET
              ;
FCALL        =0005  HEX1         =013B  LOOP         =0102  


入力するコードは00から1Fまでです。
最初にAレジスタに00を入れてスタートします。
Aレジスタの値を16進数で表示してから : を表示します(このときもファンクション02をコールします)。
そのあと、Aレジスタの値をEレジスタに入れてファンクション02をコールします。
最後に , を表示してからAレジスタを+1します。
Aレジスタの値が20になったら処理を終了します。

下はMF02TSTを実行したときの画面です。



00〜07までは(Eレジスタに入れてファンクション02をコールしても)何も表示されません。
08では : が , で上書きされています。
[BackSpace]の動作です。
09では : と , の間が空いています。
[Tab]の動作です。
0Aでは改行が行なわれました。
が…。
これはまずいですね。
そのあとの0B、0C、0Dの結果が消されてしまっています。
おそらく0Dの実行によってカーソルが行の先頭に戻ったためだと思いますが、これではそこのところは推測するしかありません。
そのあとのコード0Eから1Aまでは何も表示されていません。
ちなみにコード1Aは[Ctrl]+[Z]です。
そのあとの1B〜1Fでは記号が表示されていますがこれはファンクション02の機能ではなくてWindowsでの表示によるものです。

上のテストではコード0Dによって表示が上書きされてしまいましたので、MF02TSTを少し書き換えてテストをしてみました。
MF02TSTを書き換えて作ったプログラムはMF02TST2です。

●テストプログラムMF02TST2

下はMF02TST2のアセンブルリストです。

2015/1/13  15:54  mf02tst2.txt
END=014B
              ;;;FUNCTION02 TEST /2
              ;;; 15/1/13
              ;
                   ORG $0100
                   FCALL=$0005
              ;
0100 3E08     	MVI A,08
0102 F5       LOOP:PUSH PSW
0103 57       	MOV D,A
0104 CD4201   	CALL HEX1
0107 5F       	MOV E,A
0108 7A       	MOV A,D
0109 0F       	RRC
010A 0F       	RRC
010B 0F       	RRC
010C 0F       	RRC
010D CD4201   	CALL HEX1
0110 D5       	PUSH D
0111 5F       	MOV E,A
0112 0E02     	MVI C,02
0114 CD0500   	CALL FCALL
0117 D1       	POP D
0118 0E02     	MVI C,02
011A CD0500   	CALL FCALL
011D 1E3A     	MVI E,3A;':'
011F 0E02     	MVI C,02
0121 CD0500   	CALL FCALL
0124 F1       	POP PSW
0125 5F       	MOV E,A
0126 F5       	PUSH PSW
0127 0E02     	MVI C,02
0129 CD0500   	CALL FCALL
012C 1E2C     	MVI E,2C
012E 0E02     	MVI C,02
0130 CD0500   	CALL FCALL
0133 1E0A     	MVI E,0A
0135 0E02     	MVI C,02
0137 CD0500   	CALL FCALL
013A F1       	POP PSW
013B 3C       	INR A
013C FE0E     	CPI 0E
013E C20201   	JNZ LOOP
0141 C9       	RET
0142 E60F     HEX1:ANI 0F
0144 C630     	ADI 30
0146 FE3A     	CPI 3A
0148 D8       	RC;0-9
0149 C607     	ADI 07;A-F
014B C9       	RET
              ;
FCALL        =0005  HEX1         =0142  LOOP         =0102  


今回は08から0Dまでのテストです。
, を表示したあと改行するように変更しました。
下はMF02TST2を実行したときの画面です。



0B、0Cでは何も表示されません。
0Dでは 0 が , で上書きされています。
カーソルが行の先頭に戻ったことがわかります。

MYCPU80でCP/Mを![第100回]
2015.1.13upload

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