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

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

[第71回]

●BIOSを修正

[第69回]での検討によって、BIOSのコンソールステータス取得ルーチンの変更が必要であることがわかりました。
キーが押されているときに、Aレジスタにキーコードを入力してリターンするのではなくて、Aレジスタのビット0を1にしてリターンするように直します。



[第67回]で修正したCPM22H.TXTをもとにして上記修正を行ないます。
3823のRET NZを、JP NZ,CONSTJ2に変更します。
そして3825のRETの下に、
CONSTJ2:OR 01
        RET
の2行を追加します。
これをCPM22I.TXTとしてセーブします。

CPM22I.TXTをZASM.EXEでアセンブルしてCPM22I.BINを作りました。



CPM22I.BINをND80ZVにロードして、FNC0BT1.COMを実行してみました。
今回もZB3.EXEはテスト用に細工をしたものを使いました。

logfile nd80zlog\03230755.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld cpm22i.bin,bc00
loading CPM22I.BIN ...1715(5909)bytes loaded,from BC00 to D314
>jp d233
[00][00]
[00]a[00]>[00]f[00]n[00]c[00]0[00]b[00]t[00]1[00][00][00]
[00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00
]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[
00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]
0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [
00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]
0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[0
0]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0
[00]0[61]00 0161[00]a[00]a[00] [00][00]0[00]0[61]00 0161[00]a[00]a[00] [00][61]0
061 0161[00]a[00]a[61] 0161[00]a[61]a 0161[00]a[00]a[00] [00][00]0[00]0[00]0[61]
0 0161[00]a[00]a[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [
00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]
0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[0
0]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][62]0
062 0162[00]b[00]b[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00]
 [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[0
0]0[00] [00][00]0[62]062 0162[00]b[00]b[00] [00][62]0062 0162[00]b[62]b 0162[00]
b[00]b[00] [00][62]0062 0162[00]b[00]b[00] [00][62]0062 0162[00]b[00]b[00] [00][
00]0[00]0[00]0[00]0[00] [62]0163[00]c[00]c[00] [00][00]0[00]0[00]0[00]0[00] [00]
[00]0[00]0[00]0[00]0[00] [00][63]0063 0163[00]c[00]c[00] [00][00]0[00]0[63]00 01
63[00]c[63]c 0163[00]c[00]c[00] [00][63]0063 0163[00]c[63]c 0163[00]c[00]c[00] [
00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[63] 0163[00]c[00]c[00] [00]
[00]0[00]0[00]0[00]0[00] [00][00]0[63]063 0163[00]c[00]c[00] [00][00]0[00]0[00]0
[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00
]0[64]00 0164[00]d[64]d 0164[00]d[64]d 0164[00]d[00]d[00] [00][64]0064 0164[00]d
[00]d[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[64] 0164[00]d[00
]d[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[
00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]
0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [
00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]
0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[00]0[00]0[00] [00][00]0[00]0[0
0]0[1A]0 01
a>[00]^[1A]Z[00]^[00]Z[00]^[00]Z[00][00][00]
[00][00][00][00]?[00][00]
[00][00]
[00]a[00]>[00]^[00]D>a>^D>

ERR:23 
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Fri Mar 23 07:56:49 2012

CP/Mにエントリするとコマンドなどの表示が1文字ずつ行なわれ、その間にZB3.EXE側でキー入力のチェックが入るためちょっと見にくいです。
[00]を無視して表示をひろってみると、下のように読めます。


>jp d233

a>fnc0bt1


今回は[62](b)や[64](d)も表示されるようになりました。
そして表示の最後のところでは、[1A](Ctrl−z)の入力が受け付けられてブレイクしています。
うまくいったようです(ここではうまくいったように見えていますが、実は、たまたまうまくいっただけだったことが後になってわかりました)。

通常のZB3.EXEに戻して、同じことをしてみました。

logfile nd80zlog\03230756.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>jp d233

a>fnc0bt1
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0061 0161aa 0000 0000 0000 0161aa 0061 0161aa 0161aa 0061 0161aa 0161a
a 0061 0161aa 0000 0161aa 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
 0000 0000 0000 0162bb 0162bb 0062 0162bb 0062 0162bb 0062 0162bb 0062 0162bb 00
62 0162bb 0000 0162bb 0000 0000 0063 0163cc 0000 0163cc 0000 0000 0163cc 0163cc 
0163cc 0000 0163cc 0000 0163cc 0163cc 0000 0000 0000 0000 0000 0000 0000 0000 00
00 0164dd 0000 0164dd 0000 0164dd 0064 0164dd 0064 0164dd 0000 0164dd 0164dd 000
0 0000 0000 0000 0000 0000 0000 01
a>^Z
?

a>^D>a>^D>

ERR:23 
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Fri Mar 23 07:59:37 2012

ここでもうまくいったようですが…。

●Ctrl−S、Ctrl−Cを試してみたのですが…

前回、ファンクションコール0BHは、Ctrl−S([Ctrl]キーを押しながら[S]キーを押す)の入力でポーズし、そのあとCtrl−C([Ctrl]キーを押しながら[C]キーを押す)の入力でブレイクするように作られている、と書きました。
FNC0BT1.COMはCtrl−Z([Ctrl]キーを押しながら[Z]キーを押す)の入力でブレイクするようにプログラムしてあるのですが、それを使わないで代わりにCtrl−SとCtrl−Cを使ってもブレイクするかどうかを試してみることにしました。
なお、CPM22I.BINはシステムの都合でCtrl−Cの代わりにCtrl−D([Ctrl]キーを押しながら[D]キーを押す)を使います。

うまくいくはずだったのですが…。
なんと、想定外の結果になってしまいました。

logfile nd80zlog\03250740.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>jp d233

a>dir
A: FNC0BTST COM : FNC0BT2  COM : FNC0BT3  COM : FNC0BT4  COM
A: FNC0BT1  COM
a>fnc0bt1
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 0000 0161aa 0161aa 0161aa 0061 0161aa 0061 0161aa 0000 0161a
a 0161aa 0161aa 0161aa 0061 0161aa 0000 0000 0000 0000 0000 0000 0000 0162bb 006
2 0162bb 0062 0162bb 0000 0162bb 0000 0162bb 0162bb 0063 0163cc 0000 0000 0000 0
000 0000 0163cc 0063 0163cc 0000 0163cc 0063 0163cc 0000 0163cc 0063 0163cc 0063
 0163cc 0000 0000 0000 0000 0000 0164dd 0000 0000 0064 0164dd 0000 0064 0164dd 0
000 0164dd 0000 0164dd 0000 0000 0000 0000 0000 0000 0000 0000 0104 0000 0000 00
00 0000 0000 0000 0000 0000 0104 0000 0104 0000 0104 0004 0104 0004 0104 0004 01
04 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00
00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00
00 0000 0

Ctrl−Sでポーズはするのですが、どういうわけかCtrl−Dを受けつけてくれません。
上で書きましたように、都合によりCtrl−Cの代わりにCtrl−Dを使っていますが、そのことには間違いはありません。
それは確認済みです。
Ctrl−Dの入力コードの04が入力文字コードとして表示されてしまっています。
ありえないことがおきてしまっています。
Ctrl−Dは、[第69回][第70回]でお見せしたCKCONSOLルーチンで検出されるはずなのですが…。
もう一度その部分をお見せします。



1372行のCP CNTRLCで検出しています。
CTRLCは本来はコード03ですが、都合でコード04(Ctrl−D)に変更しています([第20回])。

それだけではなくて、Ctrl−Zの入力でシステムが暴走してしまう、という「おまけ」までついてしまいました。

●テストプログラムにバグがありました

もっとも、Ctrl−Zで暴走するという件につきましては、テストプログラムにバグがあることがわかりました。
バクというのも恥ずかしい、初歩的なミスでありました。
プログラムリストは[第68回]にありますが、Ctrl−Zを検出する部分にミスがありました。

; BDOS function0B test
;2012/3/22
;
        ORG $8100
        FCALL=$8005
        CHARBUF=$C70E
;
LOOP:LD C,0B
        CALL FCALL
        PUSH AF
        CALL B2HEXDP
        LD A,(CHARBUF)
        CP 1A;^Z
        RET Z
        CALL B2HEXDP
        POP AF
        OR A
        JP NZ,KEYIN
NEXT:CALL SPDP
        JP LOOP
KEYIN:LD C,01
        CALL FCALL
        CALL ADP
        JP NEXT
;

CP 1A;^Z
RET Z
が間違っているところです。
ここは下のようにしなければいけませんでした。

LOOP:LD C,0B
        CALL FCALL
        PUSH AF
        CALL B2HEXDP
        LD A,(CHARBUF)
	CP 1A;^Z
	JP NZ,LOOP2
	POP AF
	RET
LOOP2:CALL B2HEXDP
        POP AF
        OR A
        JP NZ,KEYIN
NEXT:CALL SPDP
        JP LOOP
KEYIN:LD C,01
        CALL FCALL
        CALL ADP
        JP NEXT
;

その少し前のところにPUSH AFがありますから、ここでいきなりRET Zにしてしまうと、スタックが食い違ってしまって、正しい戻り先にリターンできなくて、異常な動作をすることになります。
まことにお恥ずかしいミスでした。

ここは当然修正しまして、その結果Ctrl−Zは受け付けられるようになったのですが、しかし、Ctrl−SとCtrl−Dによるブレイクは相変わらず受け付けられませんでした。

ここにも、意外な落とし穴がありました。
しつこく追求して、やっとみつけた、意外な落とし穴とは?
というところで、本日は時間がなくなってしまいました。
この続きは次回にいたします。

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

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