GWMON-80用 MC6850 I/Oモジュール作成

GWMON-80

前回紹介した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

コメント