KZ80/SBC80系 128kBメモリーボード REV2

KZ80-CPUBやSBC80系のCPUボードとSBC8080バスでつながって動作する128kB SRAM&ROMボード KZ80-1MSRAMのREV2を作りました。

基板データ等配布先について

いつもどおりREV2に関するKiCADデータや関連ソフトウェアはgithubで公開しています。以下をご覧ください。
https://github.com/kuninet/Z80_1MRAMB/releases/tag/2.0
ちなみに、バンク切り替えイメージなどまとまった解説はgithub wikiに書いています。そちらも併せてご覧ください。
https://github.com/kuninet/Z80_1MRAMB/wiki

REV1からの改良点

REV1からの改良点は以下のとおりです。

  • 起動時、リセット時に初期バンク番号を バンク1へ固定
    • REV1では起動時、リセット時にメモリーバンク番号が不定でした。これは設計当初から固定RAM域(4000h-7FFFh)をあてにして機械語モニターを起動させ、ソフトウェアで初期バンク番号を決定するという方式を考えていたためです。
    • この方式だと、機械語モニターへ命令追加しないとCPUボードによって初期バンク番号が違ってしまうという状態でした。
    • そこで、メモリーバンクレジスタのICを74HC573(Octalラッチ)から74HC74(D-FF)へ変更しました。実験回路として検討したときの回路図は以下になります。
    • CPUリセット信号パルスを74HC74のDフリップフロップのリセット/セット端子へ与えることでメモリーバンク番号 “01”に初期設定されるようにしています。
  • 64kB フルRAM切替回路
    • いままでバンク0の指定はバンク01に読み替えることで意味がないものでしたが、そこを見直して64kB切り替えの指定としました。
    • 動作原理としては、上記 回路図のメモリーバンクレジスタの出力が “00”(つまり両方Lレベル)となった際の信号と、ROM/RAM選択の74HC139デコーダの信号をあわせてROM/SRAMの#CEへ供給することでフルRAM化を実現しています。(バンクレジスタが00だとSRAMしか選択されなくなります)
    • フルRAMに切り替わったことを確認できるようにLEDも追加しました。(バンク0=フルRAMなので無用かもですけど….^^)>)
  • バンクレジスタI/Oアドレス選択ジャンパ
    • いままでバンクレジスタのI/Oアドレスは80h固定でしたが、ジャンパにより00h、40h、80h、C0hの切り替えが可能となりました。
    • 基板スペース等の関係でアドレスデコーダを74HC138にできなかったのが心残りですが….

今後について

リセット時のRAM構成がハード的に安定したことと、フルRAM切り替え回路が作成できたので、CP/Mを動かしてみたいと思います。参考にするのはいつもお世話になっている以下のGrant氏のページです。
http://searle.hostei.com/grant/cpm/

広告

KZ80-IOB REV1.1

KZ80-CPUB(CPUボード)や SBC8080 CPUルーズキットと組み合わせて動くI/O基板のREV1.1基板ができました。
githubで リリース1として固めました
https://github.com/kuninet/Z80_IOB/releases/tag/1

REV1.1基板の変更点

リリースノートにも書きましたが、以下のREV1基板の課題を修正しています。

  1. PPI(8255A)への入出力端子x2のポートA+C、ポートB+Cの組み合わせを修正しました。
    1. グループA : ポートA(PA7〜PA0)+ポートC(UPPER)(PC7〜PC4)
    2. グループB : ポートB(PB7〜PB0)+ポートC(LOWER)(PC3〜PC0)
  2. PPI(8255A)への入出力端子x2の物理配置間隔を修正、2×7ピンボックスヘッダを2つ並べて組み付け可能
  3. シリアル接続用L型 1×6ピンヘッダの端子説明シルク添付
  4. NOT回路用 トランジスタ(2SC1855)のランドパターン変更。
  5. ICのランドパターンと貫通ビアが接近部分修正。
  6. SBC8080バスの電源+5V、GNDの部分に電解コンデンサを装備。

部品実装例

部品実装例は以下になります。

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

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

80系機械語モニタ GWMON-80

8080/8085/Z80で稼働する機械語モニター GWMON-80を最近よく使わせてもらっています。

機械語モニタ GWMON-80について

  • 機械語モニタGWMON-80はgithubで公開されています。なんと2018年にメンテされている機械語モニターです。素晴らしい。
  • 機能は以下の通りで、シンプルなものとなっています。
    • Z80のクロスコンパイラなどで出力されるインテルHEX形式データのロード機能を持っています。
    • LEDチカチカさせたりZ80でI/Oポートをよく叩く私としてはIN/OUT命令が装備されているのがお気に入りです。
 
D XXXX YYYY Dump memory from XXXX to YYYY 
E XXXX Edit memory starting at XXXX (type an X and press enter to exit entry) 
G XXXX GO starting at address XXXX (JMP in, no RET) 
I XX Input from I/O port XX and display as hex 
O XX YY Output to I/O port XX byte YY 
L Load an Intel HEX file into memory 

ビルド方法について

ビルド用バッチファイル

  • README.mdを読んでいただけると分かりますが、ビルドはモニター本体(MONITOR.ASM)と自分の環境に合ったI/Oモジュール(xxxx.ASM)を1つのファイルへ合体させてCP/Mのアセンブラでアセンブルすることとなっています。ビルド方法はプロジェクト範囲外ということで好きにやってくださいってことでした。
  • そこでビルドについて検討して、Windows10 Pro環境で以下のツールを使うことでアセンブルができました。手作業で毎回ビルドするとコマンドを忘れがちなのでWindowsのバッチファイルを作成しました。gistにUPしています。
  • ちなみに、他のクロスアセンブラでも若干のソース修正が必要ですが可能です。The MacroAssembla(ASL)では ラベルに”$”が使えなかったり、文字列の指定を “(ダブルクォート)に変更することでアセンブリ可能でした。
  • このビルド用バッチではgithubからソース類をもってきて、スタートアドレス/スタックポインタアドレス等の変更を行った後、CP/M ExecuterでMAC.COM(マクロアセンブラ)を起動する流れとなっています。
  • 依存関係を元に必要なビルドだけを実施できるとカッコイイですが、そこはまた今後の課題ということで ^^)>
  • KZ80-CPUB+SBC8080 SUBやSBC8080+SUBボードで使用している8251用のI/Oモジュールを合体させるスクリプトになっています。
  • KZ80-1MSRAM用にスタックポインタをFFFFh→7FFFhへ変更したソースも生成しています。

バッチファイルを動作させるディレクトリ

  • バッチファイルを動作させるディレクトリは、以下の構造を想定しています。
.
│ build.bat
├─build\
│ [build terget Dir]
├─cpm32_04\
│ │ [CP/M Executer Dir]
│ ├─src
│ └─utl
├─glitchworks_monitor\ [GWMON-80 git checkout Dir]
│ └─io_modules
├─mac-b\ [ CP/M MacroAssembla MAC.COM]
└─src\ 
  • cpm32_04ディレクトリはCP/M program EXEcutor for Win32を展開したディレクトリ、mac-bディレクトリはMAC BINARY (8080 Macro Assembla)を展開したディレクトリです。

ビルドバッチファイルの実行

  • ビルドバッチファイルを実行すると build\ ディレクトリにモニターのソースが生成されMAC.COMでアセンブルされた リストファイル(.PRN)とインテルHEX形式のオブジェクト(.HEX)が生成されます。
 
> build.bat

動くとこんな感じ

  • 機械語モニターを動かすとこんな感じです。

つぎは…

ビルドができたので、つづいて別のシリアルチップ用にI/Oモジュールを書いてみたいと思います。Grant’s Z80コンピューターで使ってるモトローラMC6850チップ用のモジュールを作ってみたいと思っています。