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