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 ; |
; ;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
前へ
次へ
ホームページトップへ戻る