2014.11.18

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

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


[第68回]


●MYCPU80の送受信プログラムについて

MYCPU80をご購入いただいたお客様からご質問のメールをいただきました。

MYCPU80(TK80回路)操作説明書の9章モニタプログラムリスト
の「SIRIAL OUTPUT ROUTINE」がよくわからないのですが、お聞きしてよいでしょうか。(INPUTもですが)
下記のコメント欄に推測と疑問点を記入していますが、教えてもらえませんか。

                 記
SOUT:MOV C,A       // 送信する1バイトデータ(例えば80)の入ったAレジスタをCレジスタに転送する。
SOUT2:IN 98    // アドレス98のI/Oデバイスから1バイトデータがAに入ってくる。→何が入るのか?。
            // XXXX XX1Xがパソコン→USB→PIC→Aレジスタ(受付が出来るまで待つ?)
ANI 02
JZ SOUT2
MOV A,C                // A←80
OUT 94                   // PICにデータA(=80)を出力する。PICは、いつパソコンに送信するのか?。
MVI A,F9; I/Oaddress 94 "out" & STROBE ON      // F=I/Oaddress 94 "out" , 9=STROBE ON か?。
OUT 98       // A(=F9?)をアドレス98のI/Oデバイスに出力する。→なんのために?。
SOUT3:IN 98           // Aには何が入ってくるのか?。
ANI 02                     // A=XXXX XX0Xになるのを待つ?。
JNZ SOUT3
MVI A,FB; I/Oaddress 94 "out" & STROBE OFF      // F=I/Oaddress 94 "out" , B=STROBE ON か?。
OUT 98                   // A(=F9?)をアドレス98のI/Oデバイスに出力する。→なんのために?。
RET 

メールでご返事をさしあげようと思ったのですが、説明が長くなってしまいそうですので、ホームページ上でお答えすることにいたしました。

引用されたプログラムリストにご質問が重なってしまっていますので、ちょっとわかりにくくなっています。
下に引用元のプログラムリストを示します。

              ;SERIAL OUTPUT ROUTINE
              ;
027C 4F       SOUT:MOV C,A
027D DB98     SOUT2:IN 98
027F E602       ANI 02
0281 CA7D02     JZ SOUT2
0284 79         MOV A,C
0285 D394       OUT 94
0287 3EF9       MVI A,F9; I/Oaddress 94 "out" & STROBE ON
0289 D398       OUT 98
028B DB98     SOUT3:IN 98
028D E602       ANI 02
028F C28B02     JNZ SOUT3
0292 3EFB       MVI A,FB; I/Oaddress 94 "out" & STROBE OFF
0294 D398       OUT 98
0296 C9         RET
              ;

コメントは「SERIAL OUTPUT ROUTINE」になっていますが、これはオリジナルのTK−80ではカセットテープレコーダーにプログラム(データ)を録音するために、パラレルデータをシリアルデータに変換して8255から出力していたプログラム部分ですので、そのコメントになっています。
MYCPU80ではプログラムをカセットテープレコーダーに録音するのではなくて、データは一旦パラレルデータのままPIC16F88に送信し、そこから先はPIC16F88がRS232C−USB変換IC(FT232RL)を経由してUSBでWindowsパソコンに送信します。
USBの部分ではシリアル通信ですけれど、そこはPIC18F88とFT232RLの仕事で、MYCPU80本体としてはですからパラレルOUTです。

参考までに「受信プログラム」のリストを下に示します。

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


その部分の回路図を下に示します。



回路図のままではごちゃごちゃしていてわかりにくいかも知れません。
PIC16F88にデータを送信する場合には、8ビットパラレルデータはI/Oアドレス94HからOUTします。
受信する場合にも同じI/Oアドレス94HからINします。
送信する場合にはパラレルデータのほかに制御線としてI/Oアドレス98Hのビット1をOUT、INそれぞれ1本ずつ使います(データ受信の場合にはビット0を使います)。
送信の場合にはそのほかにビットデータ送出をアクティブにするためにI/Oアドレス98Hのビット2を0にします(受信の場合にはビット2は1にします)。

このような送信(受信)方法をハンドシェイク方式といいます。
過去記事を調べてみましたら「TTLでCPUをつくろう」[第181回]あたりに説明がありました。
そこでは送信ではなくて受信についての説明になっていますが、考え方は同じです。
ハンドシェイク方式は1バイトの送信(受信)のたびに相手の状態を確認するため通信に時間がかかりますが、相手の処理速度がわからないようなときでも確実に通信することができます。
送信の場合にはPIC16F88が受信可(I/Oアドレス98Hのビット1入力が1)であることを確認してからデータをI/Oアドレス94HにOUTします。
そのあと送信データをアクティブにすると同時に、データが出力されたことをPIC16F88に知らせるためにI/Oアドレス98Hのビット2とビット1を0にします。
PIC16F88はデータを受け取るとI/Oアドレス98Hのビット1入力のラインを0にするので、それを確認してI/Oアドレス98Hのビット1を1にします。
このときビット2も1にしても構わないのですが、ここでは0のままになっています。
送受信を交互に頻繁に行なうような場合には、ここは1にしておくべきでしょう。
ただここでの本来の機能としてはプログラム(データ)を記録保存するために連続したデータを送信することですから、その目的のためにはここは0のままにしておくほうが送信のたびにデータラインがばたつくことがなくなりますからより安全側になります。

受信の場合も送信の場合と考え方は全く同じです。
CPU側とPIC16F88側の役割を逆にして考えてみてください。

MYCPU80でCP/Mを![第68回]
2014.11.18upload

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