復活!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    | 
