2015.2.25

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

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


[第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
              ;

MYCPU80は本体基板の上に乗せた小基板上のUSB−RS232C変換IC、FT232RLを介してUSB信号からRS232Cに変換した信号をPIC16F88で受け取ります。
PIC16F88はRS232C受信データをパラレルに変換してMYCPU80回路に渡します。
上のプログラムはTK−80モニタのその部分のプログラムリストです。
この部分はTK−80モニタプログラムのデータLOADサブルーチンですが、ZB3BASICもこのサブルーチンをコールしています。
ND80ZV(ND80Z3.5)用のZB3DOS(CP/M互換DOS)もこのサブルーチンをコールしています。
MYCPU80のZB3DOS(CP/M互換DOS)はこのサブルーチンをコールする代わりに同じプログラムをMBIOS内に組み込んでコールしています。

プログラムだけではなにをやっているかよくわからないかと思いますので、その部分の回路図を下に示します。

余分なところをカットしたのですが、それでもまだ余分なところが沢山あって見にくいかと思います。
ここで必要なラインはPIC16F88のRB1に入っているラインとRB0から出ているラインです。

下がこの回路で行なわれる、さきほどのシリアル受信プログラムのタイミングチャートです。


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

なにしろ5年以上も前に書いたプログラムですので、私はてっきりこの部分はハンドシェークだと思っていました。
よく見ると違っていたのですよねえ。
CPUはPICからのストローブ信号がLになったのを見てBUSY信号をLにしてからデータを読み込みます。
図の縦のラインがデータ読み込みタイミングです。
PICはBUSY信号がLになったのを見るとストローブをHにします。
ちょっと見るとハンドシェークのように見えますが、そうではありません。
ここが問題でした。

説明の途中ですが、本日は時間がなくなってしまいました。
この続きは次回にいたします。

MYCPU80でCP/Mを![第141回]
2015.2.25upload

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