記事の個別表示
タイトル  久々にZ80のプログラムをいじった、その3
本文  
ネットに触発されて、Z80を再びいじる事になった。それは、SIOの入力にM2割込みを使うと言う物だ。作っていじって見ると、幾つかの問題点と改良すべき点が見えて来たので、それら気が付いた点を直してみたい。
改良すべき点は、
1.時計機能が無いので追加した。これは、まえの記事を参照して欲しい。
2.PIOを簡単に使えるようにした。これも、まえの記事を参照して欲しい。

直すべき点は、オバーフロー問題だ。これは、直さないと実用的ではない気がする。
3.参照記事のプログラムでは、入力をオバーフローさせると、取りこぼしが発生する。また、その後の動作が可笑しくなる。そこでプログラム開発用の環境として、Super Akiを使って、環境構築をまず作り、その上でソフトの開発を行った。前回の記事を参照して欲しい。

取りこぼさないと言う条件は、添付のテストファイルをTeraTermのファイル送信を使って送り込む。送信遅延は、ゼロに設定しておく。その時、文字の取りこぼしが無い事。量でもオバーフローする入力に対して、しっかり対応できる事だ。これが目標になる。

プログラムの開発環境が整ったので、SIOのM2割込みプログラムを作り変える事にした。そこが、この記事の主眼点になる。SIOの入力にM2割込みを使うならば、リングバッファーを使うのが一般的な考え方だ。バッファーの大きさをnとすれば、0からカウントしてオバーフローしない様にリングの継ぎ目で元に戻る。やり方は、n-1でANDを取ってやれば良い事になる。つまり、n進カウンターだ。問題は、それでもかまわずに入力が発生してしまうので、「ちょっと待ってくれ」ルーチン、つまりフロー制御を入れる事になる。TeraTermの設定を開くと「Xon/Xoff」と「hardware」が使える事になっている。SuperAkiを使った開発環境は、そう言えば、配線でハードによるフロー制御を準備していなかったという事で、急遽、改良をした。これで、どちらも使える準備が出来た。

Super Aki のRS232Cにフロー制御の為のジャンパーを変更して、配線を追加した。


リングバッファーのイメージ


TeraTermの設定(送信遅延をゼロとする)


明らかにオバーフローする量の入力をTeraTermのファイル送信で送った結果。
取りこぼしも無く、ファイル転送後も可笑しな動作は無さそうだ。

添付のアセンブラ説明。
HZ:   Akiの動作周波数 10MHzは、10、12MHzは、12。10MHzの場合は、38400のボーレイトも可能だ。12MHzの場合は、9600のボーレイトにする。
FLOW: フロー制御 ハードでやるかXoff/Xonでやくかで、H 或いは Xにする
B_SIZE: バッファーサイズ 快適性を考えて、出来るだけ大きくした。都合で40Hとか、小さくしても、動作する。
CTC0: これを時計用途に使った。SIO用には、CTC3が使われている。Aki-80で作る場合は、これを忘れないようにする。
BASIC部分は、「NASCOM ROM BASIC Ver 4.7」で検索を掛け、オリジナルの元のアセンブラをXA80で使える様に「.」などを削除した。その為、前を参考にしつつ、結局、ラベル名を残して、全てを書き変える事になってしまった。XA80は今でも入手できる筈なので、前の記事を参考にアセンブルして欲しい。添付のHEXファイルは、10MHzのSuper Akiでテストした物だ。結果に付いてを良く読んでから、自分のシステムに使うか考えて欲しい。


結果:
1.ハードウエアを使ったフロー制御は、うまく動作したようだ。取りこぼしも無く、32Kのメモリに対してそれを超える情報を流し込んでも、ちゃんと動作した。だが、残念ながら、ただしが付く。そのただしとは、Super Akiで、RS232Cで接続した場合に成功した。プログラムをROMに焼いて、USBーシリアル変換モジュール(秋月のK-14745)を使ったAki-80で実行すると、取りこぼしが発生する。何故だろうと、ネットをググると、どうやら、チップに問題が有りそうだ。つまり、RTS信号を変えても、効果が出るまでに必要以上の時間を食ってしまうようだ。その辺は、リンクの記事をよく読んで欲しい。

2.ソフトによるXoff/Xon制御は、うまく行かなかった。ソフトの組み方が悪いのか、そもそも連続で流れている回線に送信信号を乗せるという事が、無理なのか。送ると受信の文字が重なって、そこで取りこぼしが発生するなど、そもそも無理な話なのか、良く分からない。ネットをググっても、参考になる記事が見つからなかった。もしかしたら、Xoff、つまり送信に待ったを掛ける信号は、割込みプログラムの中に置くのでは無く、Basicの本体から、キャリッジリターン文字を確認した時点で送れば、良いのかも知れない。この辺は、今回試していないが、テスト用のSuper Akiが有れば、試せるだろう。だが、解決できるかどうかの見込みは、薄いと思う。

課題:
1.USBーシリアル変換モジュールに付いて、考え方をまとめた方が良さそうだ。これが使える条件は、小さなプログラムや入力に対して、或いは、入力の都度、時間の掛かる処理でなければ、電源も取れるし非常に便利だ。つまり、大きなBASICのプログラムをファイル送信で受け取るには、問題が有りそうだ。つまり、今回の様に大きなBASICは、RS232Cを付けるのが、良さそうだという事になる。

2.Aki-80にRS232Cが使える様に小さな基板に組み込んだ回路を追加してみたい。次回の宿題だ。

リンク



12345678910...