KZ80-IOB REV1

以前ユニバーサルボードに試作した 8255A(PPI)搭載ボードに、端末(PC/Mac)接続用シリアル(i8251)を一緒に搭載したI/Oボードのプリント基板を起こしてみました。SBC8080バスに接続できるので、KZ80-CPUB/SBC8080 CPUルーズキット等と一緒に使います。

☆端末(PC/Mac)接続用シリアル(i8251)はI/OアドレスによってはSBC8080 SUBルーズキットの8251とバッティングします。

概要

  • SBC8080バスにつながる I/Oボードです。
    • パラレルI/O(8255A)と端末(PC/Mac)接続用シリアルI/O(8251)を搭載しています。
    • 自作のFM音源チップ搭載Arduinoシールドを乗せるためのピンソケットが配備できるようになっています。(他の方は使いみちが無いかも….)
    • 若干回路をみなおして REV1.1 リリース1.0にすると思います。(時期未定ですが…)

回路について

  • 回路図はこちらです。
    • 回路図、ガーバーデータ等はgithubで管理しています。ご覧ください。
  • パラレルI/O(8255A)、シリアルI/O(8251)、FM音源の各チップのアドレスデコードは74HC138で実施しています。128kメモリーボード(KZ80-1MSRAM)のバンク切り替え用I/Oアドレスを80h番地固定にしていることと、SBC8080 SUBルーズキットとの互換性を考えて以下の設定が推奨です。基板上のジャンパピンを各1つ短絡することで設定できます。
    • パラレルI/O(8255A) ・・・・・・ C0h
    • シリアルI/O(8251) ・・・・・・ 00h
    • FM音源 ・・・・・・ 40h

  • シリアルI/O(8251)のクロック用に水晶振動子 4.9152MHzを74HC4060で32分周して153.5kHzを作り出しています。
  • パラレルI/O(8255A)の入出力端子としてポートA+ポートCの4ポート、ポートB+ポートCの4ポートを14ピンヘッダに出しています。
    • REV1では8255AのグループA/Bの組み合わせと合っていません。次のリビジョン(REV1.1)では変更する予定です。

部品組付けについて

  • 部品表はこちらにあります。OpenOffice等の表計算ソフトで読み込める形式となっています。
  • それほど変わった部品はありませんが、トランジスタ2SC1855は1回路分のNOT回路を構成するために使用しています。同等品であれば大丈夫だと思います。トランジスタのパターンが狭くてハンダ付けがしずらいと思います。すいません。

使用例

Lチカ

  • パラレルI/O(8251A)を使用したLEDチカチカをさせた例は以下になります。

  • LEDは以下のように配線してください。8255AのBポートへ出力する例となります。
    • BポートへLレベルを出力したLEDが光ります。

  • 以下がSBC8080データパック付属の機械語モニタで出力する際のプログラム例です。8255AのI/OアドレスはC0hとしています。
8000
MVI A,80
OUT C3
MVI A,AA
OUT C1
RET
EXEC 8000

FM音源装着

  • FM音源(YM2151)ボードを装着した例です。

使用する場合の注意

  • PC/Macを使ったシリアル通信はSBC8080 SUBルーズキットやSBCシリーズと同様 TTLレベルのUSB-シリアルコンバータで接続してください。GNDの位置がシルク上わかりずらいと思いますが「232C」と書かれた側がGNDです。
  • SBC8080 SUBルーズキットといっしょに使用する場合は、端末用シリアルI/O(8251)のI/Oアドレスをズラすか どちらかの8251を外して下さい。

これで、Z80 CPUボード(KZ80-CPUB)、メモリーボード(KZ80-1MSRAM)、I/Oボード(KZ80-IOB)がそろって、3枚一組でマイ・コンピューターとして動作できるようになりました。
ひとまず、このセットを KZ80-I (ケーゼットハチジュー・ワン)と命名したいと思っています。^^)/

広告

KZ80-1MSRAM Rev.1 リリース0.9

以前 手配線でユニバーサルボードに試作した 128kBバンクRAM/ROMボードの基板を起こしてみました。

概要

  • SBC8080バスにつながる 128kBバンクメモリー+ROMボードです。
    • 名称の”1M”は1Mbitということで…^^) 1MBではありません。
    • 若干回路をみなおして リリース1.0にすると思います。(時期未定ですが…)
  • 本基板に関するKiCAD等の回路図/ガーバーデータ、機械語モニタ+TinyBASIC用 ソース、HEXデータはGirhubで管理しています。ご覧ください。
  • メモリーマップは以前の記事でも紹介したとおり、以下のようになっています。

回路について

  • 回路図はこちらです。
    • 回路図、ガーバーデータ等はgithubで管理しています。ご覧ください。
  • 74HC139でROM/RAMの切り替えとバンク切り替え用I/Oアドレスのデコードを行っています。
    • メモリーはROMが16kB、固定RAM域が16kB、バンクメモリ域が32kBとなっています。
  • 74HC573でバンクメモリー番号を保持しています。バンク番号はI/Oアドレス80hへ1、2,3のバンク番号を出力することで切り替えできます。(☆前回の試作のI/Oアドレスから変更しています。FM音源ボードとぶつかってしまって…(>_<))
    • 実際の128kBメモリーのアドレスバス A15、A16のコントロールは74HC543の出力をゲートICでデコードして接続しています。
    • バンク番号0(ゼロ)はバンク1へ読み替えて出力するようにしています。

部品組付けについて

  • 部品表はこちらにあります。OpenOffice等の表計算ソフトで読み込める形式となっています。
  • 1Mbit SRAMはHM628128、ROMは28C256型を想定しています。
    • 秋月電子で売っているSOPの1M bit SRAMでもDIP変換すれば使えるものがあります。☆ビンアサインがHM628128と異なるSRAMもあるようですので注意してください。

ソフトウェアについて

  • バンクメモリーの切り替えは、8080マシン語で書くと以下のようなコードとなります。
4000
MVI A,1  ← バンク番号を指定
OUT 80h
RET
EXEC 4000
8000
DEFINE 01,02,03   ← 適当な値を入力して 別々のRAMが選択されていることを確認
DUMP 8000
  • バンクメモリーの領域がSBC8080 SUBルーズキットのもともとのRAM領域となっているため、SBC8080データパックの機械語モニタ+TinyBASICなどのワークエリア、スタック域等を固定RAM域へズラす必要があります。
    • 参考として、機械語モニタ+TinyBASIC(PTBEXSA.ASM)のワークエリア、スタック域等の変更箇所は以下になります。
    • (10/21追記) こちらのソース/アセンブリ後のHEXファイルはgithubに添付しました。

[各種アドレスの変更]

FTOP    EQU 4000H
LTOP    EQU 5000H
VTOP    EQU 07000H
STACK   EQU 07E00H

[機械語モニタのTOPアドレス変更]

main:
    LXI H,-484
    DAD SP
    SPHL
    LXI H,482
    DAD SP
    XCHG;;
    LXI H,16384       ;<-- ココ
    CALL    CCPINT

こちらを変更した際のメモリーマップは以下のようになります。

想定している用途

  • わたしはバンク切り替えできるメモリーエリアにFM音源の演奏データを入れて、複数データを切り替えながら演奏してみたい! という用途で作りました。
  • 一時点でアクセスできるメモリーは64kBですが、64kBの壁を超えてメモリーにデータを置くことができますので、いろいろと楽しい使い方ができるのでは?と思っています。

KZ80-CPUB Rev.1

以前 ユニバーサル基板で作った Z80 CPUボード(SBC8080バス直結) のプリント基板を起こしました。

githubにガーバーデータを含めたデータを公開しています。
また、オレンジピコさんでも基板を販売していただけることとなりました。

概要

  • SBC8080バスにつながる Z80 CPUボードです
    • ☆SBC8080との完全互換ではありません。
    • 外部リセット端子がつながってません
    • DMA関係の配線がされてません。(#BUSREQ/#BUSACK未配線や#IOR/W、#MEMR/WのHiZ未対応とか…)
  • 単体ではメモリー/ROM/シリアル等がありませんので、SBC8080 SUBルーズキット等と組み合わせてご使用下さい。

回路図について

  • 以前ユニバーサルボードで作成したときと回路は一緒です。プリント基板化に伴いバイパスコンデンサ、電源端子等も正しく書き加えました。

部品組み付けについて

  • 部品表はこちらに OpenOffice等の表計算ソフトデータとしてUPしてありますのでご覧ください。
  • Z80 CPUは CMOSタイプの Z84C0020PEC で動作確認しています。
  • ロジックICのインバータのみCMOSタイプ(74HC04 or 74HCU04)必須です。
  • 電解コンデンサは極性にご注意。(タンタルだと爆発の危険も…)

ソフトウェアについて

基板のデータ等

各種ライセンス等

  • girhubの方のライセンス文書にも書きましたが、MIT License のもとで公開します。

KiCADの回路図描きの練習から始めて、プリントパターンエディタの使い方の練習、オートルーターのセッティングなど色々とありましたので、今後じわじわとBLOGにまとめて行ければと思っています。

BASICで3Dグラフィック

TwitterでBASICで3Dグラフィックを出している方がいらっしゃいまして….

MC68000系のBASICではあったのですが、最近作っていた8080系のマイコンのBASICイケるかもと思いトライしてみました。

SBC8085で3Dグラフィック

SBC8085 (あ、製作記事書いてない…)と SBC8080データパックのGrant’s BASICで試してみました。
参考にさせていただいたソースとの違いが、50行目の追加(PI=3.14)と800行目をちょっと修正しました。あと16進定数は “&H”へ修正。
TeraTERMでTEK4010端末エミュレーションというもので別窓が開いてグラフィックが出ます。マイコンでグラフィックが ! ! ちょっと感動 ! !
(エスケープシーケンスみたいな感じでBASICからはキャラクター文字列が飛んできている感じ。)

SBC8085は3MHz駆動でシリアルコンソールも9600でして28分程度かかりました。

SBC80系 Z80マイコン(10MHz)でトライ

SBC80系バスにつながるZ80マイコン(10MHz)でもチャレンジしてみまして….
11分16秒ぐらいで描画できました。(下はさきほどとほとんど同じ画像ですな…^^) )
MZ-2000とおなじぐらいのスピードが出ました。

Grant’s 6chipマイコンで挑戦

シリアルスピードが影響しているかも?と思い、GWごろに手作りしたZ80マイコンでも同じBASICプログラムを試してみました。
なんとクロックが7.3728MHzとちょっと遅いはずですが最速wの11分14秒ぐらいでグラフィックが完成!
やはり文字列でドット位置の情報が飛んできているのでシリアルのスピードも効いてくるみたいです。

このBASICのグラフィックデモってMZシリーズの宣伝で雑誌でよく見かけた気がします。
当時PC-8001ユーザーだった私は、高精細グラフィックが出ているMZシリーズがうらやましかった思い出がありまして、マイコンでグラフィックが出て感無量です。
(T-T)

SBC68系 128kB バンクメモリボード(3)

SBC68系 128kBバンクメモリーボードのハードウェアができた(はず)なので、メモリーチェックプログラムとかLILBUGへバンク切り替えコマンドを追加してみたいと思います。

メモリーチェックプログラム

SBC6303データパックに拡張32kBメモリーボード用のチェックプログラムがありますので、そちらを参考にバンク切り替えしながらメモリーチェックを実施するプログラムを作ってみます。
以下がgistへUPしたソースです。

  • 今回のRAMボードで$A000-$BFFFに8kBのメモリーも配備したので、プログラムは$B000へ配置しました。
  • バンク切り替えにはHD6303のI/OポートP10〜P12を使用します。3bitの出力に1〜7までのバンク番号(0の場合はバンク1を選択)を出力することで切り替えできます。

実行結果はこんな感じです。うまくチェックできたみたいです。

LILBUGコマンド拡張してバンク切り替えコマンド

バンク切り替えのためにプログラムをいちいちロードしたりして切り替えるのが面倒なのでLILBUGコマンドを作ってみたいと思います。
LILBUGのマニュアルを読んでみると外部コマンドテーブルを作る事ができそう。ユーザーコマンドに該当がなければROM内のLILBUG標準コマンドが実行されるみたいです。

バンク切り替えはBコマンドとかにしたかったのですが、ブレークポイントで使われているため “K”コマンドということにしてみました。

使い方ですが、まずは LILBUGで $B000からGコマンドで実行してください。ユーザー用コマンドテーブルのポインタを更新してバンクメモリーをバンク1へ初期化してLILBUGへ移行します。

! G B000

コマンドの書式は ” K△n “(△:スペース)はバンク切り替えします。nはバンク番号で入力と共に切り替わります。(確認とかナシ)
バンク番号を入れず ” K△[CR] ” だと現在のバンク番号を表示します。

ソースはこちらもgistへ上げました。こちらです。
こちらのプログラムも$B000のRAMに配置しました。ROM化は LILBUG ROMに手が入るなぁと思ってちょっと考え中です。

LILBUGは MIKBUGと違っていろいろと拡張性が考えられているので使いやすいですね!

SBC68系 128kB バンクメモリボード(2)

ユニバーサル基板に試作

回路が固まりましたので、実際にユニバーサル基板にしてみます。
データバスを配線し始めた頃の写真です。

基板裏の配線はいつもどおり、ちょっと太めのスズメッキ線で配線します。
このとき最近SBC80系バスばかり配線していて+5V/GNDが反対側の端子だということに気づかなかったのは内緒です。

配線が終わって記念写真です。
IC間の配線はAWG28、30のワイヤラッピング線を使用しました。ICソケットも今回は全部板バネ式です。(32ピンソケットもSOP型からDIP型へ変換した128kB RAMを使いたかったので細ピンヘッダが入る板バネ式にしました。)

稼働確認

SBC6303と40ピンフラットケーブルでつなぎます。
LILBUGは基本内蔵RAMがあれば起動するので、ちょっと安心です。いつもだとここで応答が無い!!と悩むので….

LILBUGが起動したので、さらに電大版TinyBASICを起動して HD6303内蔵I/Oの初期化&バンク切り替えを実験です。
電大版TinyBASICはメモリー直接アクセスのPEEK/POKE書式を装備していて便利です。

#(0)=$FF
#(2)=xx  (xx:バンク番号 1〜7)

内蔵I/O PORT1の初期化は以下のように、SBC6303データパックのBLINK.ASMを参考に実施しました。

  • 0番地にPORT1のデータの方向をセット。今回は全ビット出力としました。
  • 2番地へPORT1へ出力するデータを設定します。ここは数字で1〜7でバンク番号を指定します。

LILBUGのMコマンドで バンクメモリアドレス($4000〜$7FFF)のデータを変更してはバンク切り替えを実施して、別々のメモリー領域が出現することを確認しました。メモリーボード完成です!!

次は、メモリーチェックプログラムとか、LILBUGのユーザーコマンドとしてバンク切り替えコマンドを作ってみたいと思います。

SBC68系 128kB バンクメモリボード(1)

Z80/8080 CPU用に128kB メモリーボードを作成して動いたので、次はSBC68系の128kB メモリーボードを作ってみたいと思います。

メモリーマップの検討

SBC68系はZ80/8080系と違ってメモリーマップドI/O、つまりメモリーアドレス上にI/O機器がつながっています。
伝統的に$0000〜$7FFFまではRAM。$8000台はI/O、$A000はスタック用RAM、$E000〜とか後ろの方はブートベクタの関係もあってROMにするのが通例です。
当初はPIAやACIA、自分で搭載したFM音源チップなどをすべて$C000台持っていってメモリー領域を確保するという案も検討しましたが、それだとSBC6800/SBC6809の基板にパターンカット等を実施する必要がありちょっとポリシーに反する感じ。以下の方針としました。

  • 固定RAM領域は $0000〜$3FFFの16kBとする。(もともと8kBなのでこれでも余ると思いました)
  • バンクメモリは $4000〜$7FFFの16kBで、7バンク準備。(ここまで128kB SRAMを使用)
  • $A000からのメモリー領域をオリジナルのMIKBUGや電大版BASICがスタックとして使っている(MC6810想定)のため、余ってきている8kB SRAMを配備することにする。

メモリーマップのイメージはこんな感じです。

バンク切り替えコントロール回路

固定RAM領域($0000〜$3FFF)と バンク切り替え領域はどちらも同容量(16kB)としましたので、128kB SRAMを8分割して使用することになります。よって前回と違ってメモリーの3本のアドレスバス信号線(A14、A15、A16)をうまいことコントロールすることにします。
またバンクレジスタ機能は今回はSBC6303のI/Oポートによってコントロールすることにします。(独自のラッチは作りません)

  • CPUが固定RAM領域($0000〜$3FFF)にアクセスする場合はバンクレジスタの値に関わらず A14=A15=A16=”L”とする。
  • CPUがバンクメモリ領域($4000〜$7FFF)にアクセスする場合は、バンクレジスタの示すアドレスを使用する。
    • ただしバンクレジスタに0(ゼロ)が設定されている場合は デフォルトのバンク1(A16=A15=”L”、A14=”H”)とする。

上記を満たすロジック回路を、今回もLogisimを使って2入力ゲートICでシミュレートしてみました。

ゲートIC x3で実現できそうです。

回路図の検討

バンクメモリなどのコントロール回路が決まったので、128k SRAM、8kSRAMをコントロールする回路図を書いてみました。

  • 128kB SRAMの CS1へはアドレスバスのA15を入れます。$0000〜7FFFまでのアドレスならA15=”L”なので…(CS2はVccへ)
  • 8kB SRAMの CS1にはA13、A14、A15を74HC138でデコードした線をつなぎます。(こちらもCS2はVccへ)
  • バンク切り替えコントロール回路へは SBC6303のI/O出力 P10、P11、P12ピンを接続。アドレスバス A14、A15をORゲートを通して 両方”L”のときに”L”を出力させてつなぎます。(74HC138のデコードの代替です)
  • バンク切り替え状況が目で見てわかるように SBC6303のI/O出力 P10、P11、P12ピンにNOTゲート経由でLEDを接続します。

実は….

実は上記の回路図は修正して正しく動いている(と思う)版です。
基板作成当初の回路図では何を勘違いしたか固定RAM領域のデコード部分が間違ってました…orz
修正した箇所はこちら..
(もともとは固定RAM領域の判断に74HC138のO0端子を使ってました…それだと$0000-1FFFしかデコードできてない….)

固定RAM領域の $2000-3FFFFへ書き込むと 間違って バンクRAMの $6000-7FFFへ書き込まれるという事になってしまっていました….
余っていた74HC32のORゲートを使うことで事なきを得ました。良かった〜♬