前回紹介した80系機械語モニタ GWMON-80用に Grant’s Z80 マイコンでも使用しているモトローラMC6850シリアルLSI用のI/Oモジュールを作成してみたいと思います。
I/Oモジュールの仕様について
以下のREADME.mdの後半にも書かれているとおり、I/Oモジュールとしては4つのサブルーチンが必要です。
https://github.com/kuninet/glitchworks_monitor/blob/master/README.md#writing-io-modules
サブルーチン名 | 説明 |
SETUP | ・スタックポインタの設定 ・デバイスの初期化 |
CINNE | ・エコーなし1文字入力 |
CIN | ・エコーあり1文字入力 |
COUT | ・1文字出力 |
今回は、i8251汎用I/Oモジュール(io_modules/i8251.asm)をベースにポーリング型のシリアル通信の実装をしてみます。
SETUPルーチン
まずはSETUPルーチンです。上記の表にもあるとおりZ80/8080システムとしての初期設定を実施します。
シリアルデバイスのI/Oポート定義
シリアルデバイスのI/OポートアドレスをEQUで定義します。今回はGrant’s Z80マイコンの仕様にあわせて以下のように、制御ポート80h、データポート81hとします。
CTLPRT equ 80H DATPRT equ 81H
スタックポインターの設定
スタックポインターは通常 最上位アドレスFFFFhからへ設定します。今回 バンク切り替えしないシステムではそのままでOKですが、私が作った128k SRAMボード(KZ80-1MSRAM)の場合は固定RAM領域が7FFFhですので、自分の環境にあった設定に変更します。
SETUP: LXI SP, 0FFFFH
シリアルデバイスの初期化
つづいてシリアルデバイスの初期化を行います。INIUART$に定義されたデータを制御ポートへ指定バイト数分出力するルーチンになっています。MC6850の初期化はi8251よりもシンプルでリセット(03h)と通信設定「割り込みなし、8bitノンパリティ、64分周」(16h)にします。
送出バイト数も忘れず 2へ修正します。
MVI B, 02H ; length of ini string INURT: MOV A, M : : ;Init string for the 6850, x64 clock, 8N1 INIUART: db 03H,16H
CINNE(エコーなし一文字入力)ルーチン
エコーなし1文字入力ルーチンでは、MC6850のコントロールポート(80h)をREADしてステータスレジスタの値に01hのビット(受信OK)が立っていたらデータポート(81h)から読み込むようにします。
CINNE: IN CTLPRT ANI 01H JZ CINNE IN DATPRT RET
CIN(エコーあり一文字入力)ルーチン
エコーあり一文字入力は i8251.asmを真似て エコーなし一文字入力ルーチンをCallした後 データポートへ1文字出力することにします。
(後述する出力可フラグをチェックしたほうがベターかも…)
CIN: CALL CINNE OUT DATPRT
COUT(一文字出力)ルーチン
エコーあり一文字出力は、MC6850のコントロールポート(80h)をREADしてステータスレジスタの値に02hのビット(送信OK)が立っていたらデータポート(81h)へ出力するようにします。
一文字入力と一文字出力のReadyフラグが8251とMC6850では逆になってますが大枠としては同じロジックでいけそうです。
COUT: PUSH B MOV B, A COUT1: IN CTLPRT ANI 02H JZ COUT1 MOV A, B OUT DATPRT POP B RET
Grant’s Z80 ユニバーサル基板マイコンで 稼働テスト!
ここまで対応したI/Oモジュールを、GWMON-80のメインモジュール(monitor.asm)と合体させて、CP/MのMAC.COMでアセンブリしたものを、GWごろに作成したGrant’s Z80 ユニバーサル基板マイコン用のROMとして焼いて動かして、無事稼働しました!!
シリアルのスピードは115200bpsですが、ポーリング型でも意外と取りこぼし無く動きます。今後 SBC8080データパックのソースを参考にさせていただいて 割り込み駆動型などへも挑戦してみたいと思います。^^)>
今回修正したソースは、以下のgithubにもUPしています。前回のビルドスクリプトを改良してMC6850用モジュールビルドも自動化していきたいと思います。
https://github.com/kuninet/glitchworks_monitor/blob/master/io_modules/MC6850.asm
コメント