Z80自作マイコン用PPI(8255A)ボード

SBC6800用パラレルI/F(PIA)ボードが徐々に出来てきましたので、同じような2階建て手法でZ80自作マイコンボード用にもパラレルI/O(PPI)ボードを作ってみたいと思います。

2階建て作戦はラッピングソケット

以前も紹介したとおり、ラッピング用ICソケット作戦での2階建てはZ80マイコン用PPI(8255A)ボードの着手が先でした。

なんとなくできそうというところで満足して配線は放置してましたので、配線を実施したいと思います。

回路図と配線について

Z80自作マイコン用PPIボードの回路図は以下のような感じです。

パラレルI/O LSI 8255Aは3ポートありますが、ポートCは制御用のイメージだったので ポートA、Bそれぞれに4bitづつわりふって14pin フラットケーブル用ボックスヘッダへ配線する予定です。

また、先日のArduino FM音源ボード用アダプタも積みたいので 間に板バネ40pin ICソケットを挟んで3階建てにする感じです。

確認用のLEDチカチカ

とりあえずZ80 CPU8255Aとアドレスデコード用の74HC128、ポートAの分のボックスヘッダへの配線を実施してLチカで確認してみました。

プログラムはZ80 ASMでかいたものをgistへUPしています。

フラットケーブルで接続

いちいち確認用にブレッドボード用ワイヤでつないでいるとたいへんなので、14pinフラットケーブルで接続できるようにしてみました。
(そんなにLチカばかりするのか?という疑問は置いておいて….)

ちなみに先日作ったSBC6303+PIA(MC68B21P)ボードも14pinボックスヘッダの配線を合わせておいたので フラットケーブルでLチカ可能です。
便利w

今後は Lチカだけではなくて、なにかを制御してみたいと思います。
SRAMをたくさん並べて、バンクメモリーを作るとFM音源の楽曲データがたくさん保持できるなぁとか….

広告

Z80版 YM2151 VGMファイル プレーヤー

前回作成したZ80マイコン用 YM2151音源のプレーヤをZ80アセンブラで作成してみました。

作成と言っても、こちらのサイトのArduinoスケッチをストレートコンバートしたものです。 ^^)>

Arduino で YAMAHA YM2151 を VGM ファイルで演奏させる
http://another.maple4ever.net/archives/2441/

Z80版プレーヤ アセンブラソース

作成したZ80マイコン用 YM2151音源のプレーヤのソースは こちらです。(ちょっと長いです)
gistにUPしています。数十年ぶりにZ80 CPUのインストラクションを調べながら作ったので無駄なコードがたくさんあると思います。

  • 音楽データはArduino用ヘッダファイルに16進形式でサンプル音楽が入っているので、別Z80 ASMファイルへawkでコンバートしました。
  • 音楽データは 9000hから配置することで決め打ちにしています。
  • Z80のI/O番地 20hにYM2151を配置したので 20h/21hへデータを出力しています。
  • 休符のためのウェイトルーチンは私の作ったZ80マイコン用に調整したので他の環境の場合は再調整が必要です。

アセンブリ

Windows上で、zmacを使ってクロスアセンブルしました。

> zmac --oo lst,hex Z80-VGM-PLAY.ASM

インテルHEX形式のオブジェクトが生成されますので、これを流し込めばOK!
先日紹介した機械語モニターのLコマンドで流し込みします。

ちょっと音楽ファイルはファイルが大きめなので、TeraTERMの設定で1文字づつウェイトを入れながら流し込まないとZ80マイコンで取りこぼしてしまいました。1文字1ms待つ設定にしたら、昔のマイコンのカセットテープばりに時間がかかりますw

実行

機械語モニターのLコマンドでロードが完了したら、8000hから始まるプログラムを実行します。

G8000

BASICではDATA文の途中で演奏が止まってしまいましたが、Z80機械語で作ったプレーヤーでは最後まで演奏できました!!

YM2151 FM音源LSIをZ80で動かす

知り合いの方からYM2151 FM音源チップと専用DAC YM3012をいただきました。
いつもLEDチカチカだけでは つまらないのでマイコンで音楽を奏でてみたい!

まずはArduino+ブレッドボードで…

チップをゆずってくれた方のArduinoスケッチで、まずはYM2151 FM音源チップ+DAC YM3012が鳴るか試してみたいと思いました。
いつもどおり、ブレッドボードで仮組みしてみます。アンプは4回路入っているものだったら1つで済みます。たぶん音にこだわらなければ 何でも良いです。私はLMC660AINを使いました。250円ぐらいだったかな…

h1romas4/arduino-vgmplayer
https://github.com/h1romas4/arduino-vgmplayer

回路図はこちらとほぼ同じです。

無事チップは稼働しました!! なんか音色が懐かしいです。
出力はLINE出力なのでCDラジカセのLINE入力へ。LINE入力装備の機器も手持ちが少なくなって厳しくなってきました….

Arduinoのスケッチを読むとわかりますが、データバス(D0〜D7)とRD/WRIC(リセット)とA0(アドレスバス)を、ホストとなるマイコンになったつもりでHレベルにしたりLレベルにしたりという操作をソフトウェアで頑張っています。

Arduino用 YM2151シールドの作成

ブレッドボードで試作した回路といっしょのものをYM2151シールドとして、秋月電子で購入した Arduino用ユニバーサル基板に作成してみます。
この基板、安いですがわりと大きめでちょっと余裕をもった部品配置にできそうです。
DACとアンプICの間は太い線で…と思ったらちょっと太すぎました。あとDACのあたりに大きめのコンデンサをつけるのを忘れて、裏面に10μFの表面実装部品を急遽はんだ付けしました。手持ちが合って良かった….

こちらも はんだ付けの不良2箇所があったのですが修正して無事音楽を奏でることが出来ました。
※配線作業は8時間ぐらい…

Z80自作マイコンでFM音源を鳴らしたい!!

FM音源といえば8ビットマイコン時代から装備した機器があったので、先日自作したZ80マイコンに装備したみたい!!という野望が当初からありました。

拡張端子が無い問題

先日自作したZ80マイコンにはSBC6303のような拡張バスを接続する端子は装備していませんでした。(CPUとROM/RAM/ACIAで基板がギリギリ…)

そこで、地元の部品店でも売っていた 40PラッピングICソケットで嵩上げしてみたいと思います。
ちなみに、まだ作成途中ですが 40PラッピングICソケットで嵩上げして8255A基板を作ろうとしている写真がこちら。

Z80自作マイコン用 Arduinoシールドアダプタ

名前が長いですけど、Arduinoで動かしたYM2151基板をそのままZ80マイコンにつなげてしまうアダプタを作成しました。

  • 40Pラッピング用ICソケットでZ80 CPUを嵩上げ。(外部I/O端子の代わりです)
  • 電源(5V/GND)とデータバス(D0〜D7)をYM2151シールド向け端子へ接続。
  • Z80のRD(READ)とWR(WRITE)をIOREQと合わせてIORDIOWRを作ります。外部デバイスとのI/O命令が出たという信号です。
  • I/Oアドレスのデコードに74HC138を使用してアドレスバス (A7、A6、A5)をデコードします。(IOREQは)RDWR側で入れたのでちょっと手抜き..
    • YM2151 FM音源チップのCE(チップイネーブル)はArduinoで動かすときはGNDへ常時落としていましたが、Z80につなぐにあたって真面目にI/Oアドレスをデコードすることにしたので、YM2151シールド上のジャンパでGNDか別ピンにまわすか選べるようにしました。(YM2151シールドの黄色いジャンパです)

Z80自作マイコン用 Arduinoシールドアダプタの回路図はこんな感じです。
左側はZ80 CPUの信号線です。

Z80マイコンへシールドアダプタとシールドを装備

Z80マイコンへシールドアダプタとシールドを装備すると3階建てになっちゃいました。
2Fと3Fの基板はちょっと小さめなので支えるものが少なくて不安定ですが….

BASICで音楽演奏!!

さて、そもそもZ80からコントロールして音が出るか?というところが不安です。ArduinoではC言語ですが、同じようなロジックでBASICを組んでみました。音楽データを読み込みつつ、OUT命令を出しまくるやつです。音楽になるかどうかは分かりませんが、音は鳴るはず…
※実はユニバーサル基板で作成する前に、ブレッドボードで試作してみましたがまったく音が出ずちょっと凹んでいたのは内緒です。

参考にさせていただいたこちらのサイトC言語ヘッダファイルに音楽データのバイナリデータが定義されています。これをBASICのDATA文で定義して I/Oアドレス 20h/21hへ送れば音が出るはず。

BASICのソースはgistに上げました。リンクはこちらです。(DATA文が長いので、リンク先を見てください。)

こちらの動画のように無事(?)音が出ました。

BASICのDATA文の制約で16進数が直接記述できないとか、DATA文の長さ??制約で途中で演奏が止まっちゃったりしてますけど、自作Z80マイコンで無事 FM音源から音が出て感動です!!

音源装備という点だけは、かつてメインマイコンだったPC-8001を超えた?!かな!?(w

Z80ブレッドボードマイコンで8255A(2)

8255Aは生きているか?

前回の投稿で 生死が不明wの8255Aをテストしてみたいと思います。

こちらのページで、Arduinoを使って8255Aの各信号線をコントロールしてLEDをチカチカさせてました。
真似してみました。

Increasing Digital I/O Pins of Arduino uno Using 8255 Peripheral Programmable Interface with Arduino

Z80マイコンとは別のブレッドボードで回路を作って、会社の人からもらったArduino互換機で動かしてみると、無事うごきました!! 8255Aは生きているみたいです。

LEDを1つずつ点灯させてみよう

LEDを1つづつ点灯させてみようと 一時点では 1つのピンだけ “1”を出力するようにしてみました。
すると、全点灯した後1つづつ消灯するのです…あれれ?? 8255Aの該当ピンの出力がLになったところが光っていてHレベルのところは消えてます。
試しに、「1つのピンだけ “1”を出力」と「1つのピンだけ “0”を出力」を交互にやってみました。

もとのArduinoのスケッチをもとに、ちょっとだけ修正して動かしたときのソースはこちら。

ををを、L (つまり”0″) になったポートが光っとる〜♪

はい…Twitterで教えていただいたとおり、8255Aの出力がLとなったときに電位差が生じてLEDが光るのでHにしたら同電位だから光らないのです。あああ、考えてみたらそのとおりでした。LEDは 8255A -> LED -> Vcc(+5v)という接続なので…..
思い込みはイカンです。^^)>

Z80マイコンでも8255AでLチカ

8255Aの動きは会得 ^^) しましたので、Z80マイコン側でもBASICプログラムを以下のように変更して実行してみました。
(光らせたいビットを0にした数字へ変更です…)

無事LEDが交互に光りました!! うれしい!!

Z80ブレッドボードマイコンで8255A(1)

前回の投稿の回路図にも描いた通り、Z80ブレッドボードマイコンに8255AをつけてLEDチカチカ(Lチカ)をさせてみました。
いろいろと基本がなってなかったのでハマりましたが無事可動しました!

8255Aを2つ持っていた

ちょっとまえに作ったZ80マイコンにI/Oがつけられないものかなぁと思っていたところ、数十年前に購入してPC-8001へFDドライブを接続できないかと買ってあった8255Aが2つ部品箱に転がっていたのを思いだしました。
静電対策をして無かったので生きているかどうかが不安….

8255A を接続するための検討

ひとまず以下の方の回路図などを参考にさせていただき配線してみました。

デカ回路図(B/W gif image, 43KBytes)

自分のZ80ブレッドボードマイコンの接続では以下のようにしました。

  • Grant氏の32k版回路図ではROMが8kBのため74HCT32でアドレスデコードしていましたが、ROMもRAMも今回の私の場合は32kBなのでアドレスバスのA15(8000h)のH/Lでコントロールで良いと思い回路を簡略化しました。
  • ROMのアドレスデコードで使っていた74HCT32のロジックが2つ浮いたので、IOREQRDWRをあわせた信号線を作って8255AのRDWRへつなぎました。これでZ80がIO要求をしているときにREAD/WRITEがされるはず。
  • 8255AのCEのために74HCT138を1つ追加してアドレスデコードすることにしました。もともとの回路ではリアルチップの6850はI/Oの80h番地に配備されているため そちらも合わせて74HCT138でデコードするかたちにしてみました。

接続イメージのブロック図はこんな感じ。

ちなみに回路図は、前回の投稿にも添付した こちらのイメージです。(たぶん)

なんか動かない….

ブレッドボード上の配線を変更した後、BASICのOUT命令を数十年ぶりに使って動かしてみます。
8255AはI/Oの0番地に配備したので、初期設定は3番地へ 80hを出力すると8255AのA/B/Cポート全部が「出力」になるはず。
あとはLEDをPA0とPA1に接続したので….プログラムはこんな感じ…

交互にLEDが点滅するかと思ったんですがウンともスンとも言わないので、8255Aのリセットピンの接続を手動(w)でVcc (+5V)につないだりGNDにつないだりしていると何故か点灯!! やったと思って動画をとったのがこちら….

交互にLEDが点灯せず同時に点いたりと謎の動きをしています。
また電源再投入すると消灯しっぱなしだったりとなにか安定しません….
8255Aが数十年の時を経て壊れているのか? とおもい、チップ自体のテストをしてみようと思いました。
(Z80のときといっしょの展開….w)

というわけで続く…

Z80ブレッドボードマイコンの回路図をKiCADで

回路図を描いてみたい

最近は 数千円で小さい基板を製造できるという話を聞いていて、KiCADを覚えたいと思い本を数冊かいました。


一人で始めるプリント基板作り[完全フリーKiCad付き]


プリント基板作りの基礎と実例集(トランジスタ技術SPECIAL for フレッシャーズ )

どちらもちょっと発売された年度は古いんですけど、感じをつかむのにはよいかなぁと思います。
練習の題材として、Z80ブレッドボードでいろいろと回路をいじってi8255Aなどをつなげてみていたりしたので、整理する意味で回路図を作って見たいと思いました。

書き始めた図がこちら….

Z80の部品が標準のライブラリには無かったので自作してみました。ベースをA4横のレイアウトにしたせいもありますが、このあとどんどんBusyになってしまってA3とかでスタートすれば良かったと後悔しました。
また全部の部品をとりあえず配置してみてから配線をするのが良かったと思います。今回は作図の練習のつもりだったので、いきあたりばったりで進めてしまいました….

ちなみにスライドシェアにKiCADについて、わかりやすくまとまった資料があります。

KiCadで雑に基板を作る チュートリアル

回路図エディタはDrawソフトとは違う

回路図エディタの見た目が一般的なDrawソフトっぽいので、Excelの図形やVisioノリで操作しようとしてしまったんですけど、全く操作性が違ってました。

  • 配置した部品どうしを配線したあとに移動すると線を整理するのがたいへん
    • 部品を配置したあとに「移動」や「ドラグ」で部品の場所を調整できます。ただしすでに接続した配線が外れたり、斜めになったりしますので、部品の大まかな位置を決めるため全部の部品を図上に置いて調整してから配線するのが良いと思いました。
  • 配線のラベルなどはキーボードの方が楽です。
    • KiCADはマウスでの操作もできますが、キーボード操作のほうがストレスないかもしれません。バス配線の各ラベル(アドレスバスのA0、A1…など)を追加していく場合マウス操作ではストレスがたまりますが、カーソルキーとLコマンドを連打するとあまり頭を使わなくて良いので楽でした。

こんな感じの回路図をつくってみた

いまのブレッドボードZ80マイコンの回路図(こうしたい! というのも含んでますが…)を作ってみたのが以下の図です。
みようみまねで作ったのですが、かなりきれいに描けてちょっとうれしいです。

このままプリント基板を起こすと大きなものになりそうなので、また小分けにした回路図にしてみたいと思いますが…^^)

Z80でマイコンをつくる (6)残りの配線〜動かない〜動いた!!

電源ラインはスズメッキ線で配線

ブレッドボードで稼働したZ80マイコン を秋月電子の片面ユニバーサル基板で作ってみよう作戦。
電源ラインは、古式ゆかしく0.5mmぐらいのスズメッキ線でVcc側、GND側を配線しました。
ここはGrant氏の回路図には出ていません。(一言、電源などはちゃんと配線やっといてね、みたいな記載があります)
シリアルICのHD63A50やZ80 CPUは普通のICと違う電源ピンなので配線もちょっと違いますが….

残りの配線を実施

各IC間の配線ですが、ポリウレタン被覆線によるデータバスx8本の一筆書き配線につづいて、アドレスバスx16本の配線・ハンダ付けを実施しました。念のため1本づつ各ICソケットの該当ポートが疎通しているか地味にチェックを実施。大丈夫そうです。ハンダ付けしてあちこち間違うと直すのが大変そうだったので(途中のICに線材を巻きつけたりしてましたし…) 地味にチェックしつつ進みました。

続いてシリアルチップ HD63A50のあたりの配線と、RAM/ROMのCE(Chip Enable)、OE(OutputEnable)、WE(WriteEnable)、あたりの配線を実施。
ROMのCE(Chip Enable)について元の回路図(32kB RAM版)ではROMが8kBなので真面目にA13〜15のアドレス線をOR回路でデコードしてましたが、今回はATC28C256 (256kbit / 32kB)にしたのでA15をCEに直接入れるように回路を変更しました。(アドレス0000h〜7FFFhはROMで、8000h〜FFFFhはRAMという感じでアドレスの頭1ビットで判定です。)

リセット回路と水晶発振子回路、ロジックICの未使用入力

ちょっと忘れていたのがリセットボタンで タクトスイッチを装備する場所をあまり真面目に検討していませんでした。
今回はCPUクロックとシリアルクロックはちゃんと水晶発振子+74HCT04で発振回路を組もうと思っていたので、そちらも抵抗器やらセラミックコンデンサやらけっこう場所をとります。頑張って部品を配置したので、ちょっと窮屈な配置&配線になっちゃいました。

またリセット回路はちゃんと電解コンデンサ+抵抗器でジワジワと電圧が立ち上がるようにした方が本当は良いのですが、ここはGrant氏の回路図のままです。電源のACアダプタを接続したあとリセットスイッチを押すと起動する仕組みです。
ロジックICの未使用入力端子は、ユニバーサル基板版ではすべてGNDへ落とすことにしました。

配線が終わってスイッチON 〜 動かず

配線終了してテスターで各所の配線を再確認した後、74HCT04だけ装着してクロック発振の確認を実施。テスターの周波数カウンターでちゃんと7.3728MHzあたりで発振していることが確認できました。
一つ深呼吸して Z80 CPU、ROM、RAM、シリアルチップ、ロジックICを装着してスイッチON! してみましたがシリアル端末には無応答でした。
Z80 CPUは追加購入したものだっので、例の 1Hzフリーランボードで動作確認したところ正常稼働することが確認できました。

作業後 寝る直前まで 虫めがねで基板裏の配線をチェックしたところ、1箇所配線漏れをみつけました。
EEPROMの27番ピン(WE)です。元回路図でVcc(+5V)へ接続しています。データシートを確認しても、この端子がHレベルであることが前提のようです。

基板裏写真をよーーーく見ると、EEPROMの27番ピンが未結線です….(と自分だけわかるコメント….)

この日はタイムアップということで対応は翌日に…..

ROMの配線漏れとバイパスコンデンサ追加で稼働!!

翌日に、EEPROMの27番ピン(WE)を隣の28番ピン(Vcc)と結線して動作確認しましたがやはりシリアル端末には無応答です。基板を良く見てみるとバイパスコンデンサの接続が不十分でした。

写真ではCPUの陰で見えませんがZ80 CPUのバイパスコンデンサ(0.1μF)はICソケット内に配置しています。動かない!と言っている時点ではRAMとROMのVcc近傍にバイパスコンデンサ(0.1μF)を配置していました。
追加でシリアルチップ HD63A50のVcc近く(12番ピン近く)と ロジックIC x2個のVcc近くにバイパスコンデンサ(0.1μF)を接続して試したところ無事稼働しました!! うれしい!! バイパスコンデンサは重要なんだなぁ。

下の図は無事稼働したZ80機械語モニターです。実はブレッドボード版マイコン〜ユニバーサル基板版の製作途中で 知人から教えてもらったZ80機械語モニターを移植(というほどではなく、変数をRAM配置したりしただけ…)していたのでした。

まとめ….仕上げ

完成写真はこちらです。
もうちょとだけ部品が追加してありまして、知人から電源のところにコンデンサがいるのでは?と指摘をいただきまして、100μFの電解コンデンサをDCジャックの近傍に接続しています。(SBC6800/SBC6809でもDCジャックの近傍に電解コンデンサが…^^);;)

最初に所有したマイコン PC-8001と同じZ80で….クロックがほぼ倍、RAMもSRAMですけど同じ32kBということで、グラフィックは出ないものの自分の手で組み上げることが出来て たいへん感慨深いものがありました。
うれしいです。