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