2015.2.28

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

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


[第143回]


●WordStar、F80、L80が動きました

MYCPU80用ZB3BASIC+ZB3DOS(CP/M互換DOS)セットをご購入いただいた長野県のN様から、さっそく「動作の確認をしましたよ」とのメールをいただきました。
「WordStarとF80(Fortran80)、L80がMYCPU80で動きました」とのことです。
うんと若い頃、私は最初はFORTRANからプログラミングを始めたのでしたが、もうすっかり忘れてしまいました。
WordStarも使い方はよくわかっていません。
ですのでN様のようにソフトに詳しい方がこうやってテストをして動作のご確認をしていただきますととても助かります。
N様。さっそくのご連絡のメール有難うございました。
今後ともよろしくお願いいたします。

●シリアル入力ルーチン(2)

[第141回]からの続きです。

お話の順序が逆でした。
まずはどこがどうおかしいのかを説明するのが先でした。

/CPM[Enter]を実行すると、ZB3DOSシステムプログラムがロードされてZB3DOSが起動します。
ところがどういうわけか、そのシステムロードでときどき異常が発生することがありました。
どうもロードでなにかがおきているようでした。

毎回異常が発生するのではなくて、本当にごくたまにおかしな動作をするものですから、その正体を捉えるのはなかなか骨が折れました。
あれこれ手法を変えて繰り返しテストをしていくなかで、たまたま明らかな異常が発生しているところを捉えることができました。

下はアドレスCC00からロードするZB3DOSシステムプログラムをデバッグのために8C00からロードしたあと、メモリ内容をチェックしたときのものです。
異常はデータの先頭部分で発生しています。

logfile mycpu80log\02241731.txt open
mzbdos3ot3 2015.2.20 by Chunichidenko

MYCPU80に接続しました(19200bps)
0001 001E - z
1000 00C3 - 
*** mycpu80 zb3basic ****
>dm 8c00,8cff
8C00  C3 3B CC C3 00 01 C3 74-74 CC C3 77 D0 C3 90 D0  テ;フテ..テttフテwミテ.ミ
8C10  C3 AC D0 C3 CB D0 C3 35-D1 C3 3B D1 C3 4C D1 C3  テャミテヒミテ5ムテ;ムテLムテ
8C20  5F D1 C3 0D CE C3 73 D2-C3 68 D0 C3 77 D3 00 00  _ムテ.ホテsメテhミテwモ..
8C30  00 00 00 00 00 00 00 00-00 00 00 00 C5 11 80 00  ............ナ...
8C40  CD 57 D4 AF 32 85 E8 3E-03 32 35 E9 F5 11 98 D3  ヘWヤッ2..>.25....モ
8C50  CD 24 D4 F1 F5 C6 41 5F-CD 0F D4 CD A4 D3 F1 5F  ヘ$ヤ..ニA_ヘ.ヤヘ、モ._
8C60  CD 33 D4 CD 7B D4 CD A9-D3 3A 35 E9 3D F2 48 CC  ヘ3ヤヘ{ヤヘゥモ:5.=.Hフ
8C70  C1 79 32 35 E9 AF 32 84-E8 32 85 E8 67 6F 22 80  チy25.ッ2..2..go".
8C80  E8 22 82 E8 31 00 F8 11-80 00 CD 57 D4 CD A9 D3  ."..1.....ヘWヤヘゥモ
8C90  3A 35 E9 5F CD 33 D4 CA-A3 CC CD 59 D3 AF 32 35  :5._ヘ3ヤハ」フヘYモッ25
8CA0  E9 C3 8C CC 21 FF 00 22-FE E9 3A 35 E9 C6 41 5F  .テ.フ!.."..:5.ニA_
8CB0  CD 0F D4 1E 3E CD 0F D4-11 FE E9 CD 27 D4 CD A9  ヘ.ヤ.>ヘ.ヤ...ヘ'ヤヘゥ
8CC0  D3 7E B7 CA A9 CC 47 23-7E FE 20 C2 D4 CC 05 CA  モ~キハゥフG#~. ツヤフ.ハ
8CD0  A9 CC C3 C6 CC 48 E5 7E-FE 61 DA E3 CC FE 7B D2  ゥフテニフH.~.aレ.フ.{メ
8CE0  E3 CC E6 DF 77 23 0D C2-D6 CC 36 00 E1 78 FE 02  .フ.゚w#.ツヨフ6..x..
8CF0  C2 13 CD 23 7E FE 3A 2B-C2 79 D1 7E D6 41 5F F5  ツ.ヘ#~.:+ツyム~ヨA_.
>/close
logfile closed at Tue Feb 24 17:43:32 2015
open new logfile

下は上のデータの先頭部分のアセンブルリストです。
              ;
              ;************** ZCCP ENTRY **********
              ;
CC00 C33BCC     JMP CCPENTRY0
CC03 C30001   TRNS0J:JMP TRNS0
CC06 C374CC     JMP CCPENTRY
CC09 C377D0     JMP RENSB1
CC0C C390D0     JMP RENSB2
CC0F C3ACD0     JMP RENSB22
CC12 C3CBD0     JMP RENSB3
CC15 C335D1     JMP OLDDRVSET
CC18 C33BD1     JMP NEWDRVSET
CC1B C34CD1     JMP DIRDT2WK
CC1E C35FD1     JMP WK2DIRDT
CC21 C30DCE     JMP DIR_NOFILE
CC24 C373D2     JMP USRCMD73;end
CC27 C368D0     JMP SAMENMSB
CC2A C377D3     JMP ERR05
              ;
アドレスCC06はC374CCですが、そこがC3、74、74、CCになっています。
74がダブってしまったために、それ以後が全部1バイト後ろにずれてしまっています。
これではまともに実行できるわけはありません。
これはあまりに異常です。

なぜこんなことがおきてしまったのでしょう。
データロードプログラムのどこかに異常の原因があるに違いないと睨みました。
そこでプログラムの動作をじっくり再確認してみたところ、[第141回]に書きましたように、TK−80モニタプログラムのシリアル入力ルーチンに問題があることに気が付きました。

もう一度その部分のプログラムリストを示します。
もとがTK−80のモニタプログラムなので「シリアル入力」になっていますが、実際にシリアル入力するのはボード上のPIC16F88で、MYCPU80本体はPIC16F88からのパラレルデータを入力します。

                              ;
              ;SERIAL INPUT ROUTINE
              ;
                ORG $02A0
              ;
02A0 DB98     SIN:IN 98
02A2 0F         RRC
02A3 DAA002     JC SIN
02A6 3EFE       MVI A,FE;BUSY
02A8 D398       OUT 98
02AA DB94       IN 94
02AC 4F         MOV C,A
02AD 3EFF       MVI A,FF;READY
02AF D398       OUT 98
02B1 79         MOV A,C
02B2 C9         RET
              ;


下がタイミングチャートです(こちらも[第141回]でお見せしました)。


D0 INはPIC16F88のRB0の出力を受けるMYCPU80側のライン(アドレス98のD0入力)です。
PIC16F88からのストローブ信号です。
D0 OUTはPIC16F88のRB1に向けて出力するMYCPU80側のライン(アドレス98のD0出力)です。
MYCPU80からのREADY/BUSY信号です。

PIC16F88はWindowsパソコンから送られてきたデータをFT232RLを介して受信すると、パラレルデータに変換してそれをI/Oアドレス94のラインに出力します。
そしてそれをCPUに知らせるためにSTB信号(D0 IN)をアクティブ(L)にします。
CPU側はSTB信号がLになったのを見てBUSY(D0 OUT)をLにしてから、データを読み込みます。
ここがそもそもよくありませんでした。

ここは順序が逆でした。
データを読んでからBUSYをLにすべきです。
でもまあもとはシリアルデータですから、ここは実際には問題ではありません。
問題はそのあとです。

PIC16F88はBUSY(D0 OUT)がLになったのを見て、STB信号(D0 IN)をHにして処理を終了するのですが、CPUの側はデータを読み込むとさっさとBUSY(D0 OUT)をHにして処理を終了してしまいます。
ここが問題でした。

PICはSTB信号(D0 IN)をLにしたあとはBUSY(D0 OUT)をずっと監視しているはずなので、そういう動作でもとりあえずはうまくいっていました。
MYCPU80組立キットに付属のTK−80モニタプログラムだけのシステムでしたらボーレートは2400bpsと低速ですので、まず問題にはなりませんでした。
ところがZB3BASIC+ZB3DOS(CP/M互換DOS)システムでボーレートを19200bpsと高速にしたために、もとのままのプログラムではその速度にはついていけなくなったため、プログラムを大幅に変更いたしました。
そのためちょっと都合の悪いことがおきてしまう可能性がでてきたのですが、うかつにも私はそのことに気が付いていなかったのでした。

上では「PICはSTB信号(D0 IN)をLにしたあとはBUSY(D0 OUT)をずっと監視しているはずなので」と書きましたが、実はZB3BASIC+ZB3DOSシステムのために新しく書いたプログラムはそこのところが違っていました。

説明が長くなってしまいますので、途中ですが今回はここまでといたします。
この続きは次回にいたします。

MYCPU80でCP/Mを![第143回]
2015.2.28upload

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