SBC8080バスにつながる128kBメモリーボード(1)

先日作成したZ80 CPUボードのようにSBC8080バスにつながる 128kB SRAMメモリーボードを作ってみたいと思います。

メモリーレイアウト案

128kBメモリーは オレンジピコ秋月電子で売っている 628128型の128kB SRAMを使います。(秋月電子で売ってるSOP型も変換基盤でDIPにしてそのうち使いたい…)
128kBのスタティックメモリーが数百円で買えるなんて….

メモリーレイアウトは以下の通りで、ROMを0000h〜3FFFh(16kB)、RAMは固定域として4000h〜7FFFh(16kB)、バンク切り替え領域として8000h〜FFFFh(32kB)にしてみます。(スタック領域として使われている部分を切り替えちゃいますが….)
当初ROM領域は8kBで良いかと思っていたのですが、SBC8080データパックの機械語モニタ+BASICが8kBを超えていたので16kBにしました。

8000h以降はアドレスバスのA15が”H”レベルとなります。その信号と、別に作るバンクレジスタ2bitを合体させて、 628128型メモリーのアドレスバスA16、A15ピンに与えてやることでバンク切り替えしたいと思います。
バンク切り替えした時に切り替えたプログラムもどこかへ行ってしまうと厄介なので、16kBの固定RAM領域を作っておきました。

バンクレジスタの試作

前述のとおりバンクレジスタは2bitあれば良いので、当初はPPI(8255A)で作ることも考えたのですが8回路Dラッチ(74HC573)で行けるのでは?と考えてブレッドボードで回路を試作してLチカをやってみました。

回路図はこちら。

  • Z80/8080のI/O書き込み要求信号(IOWR)とI/Oアドレスデコーダ(この回路図では74HC138)の信号(I/Oアドレス40h)をAND回路であわせ双方が”L”レベル(負論理で”1″)の時にデータバスに出ている情報をラッチさせます。
  • 74HC573のラッチイネーブル(LE)端子は正論理(端子名にオーバーラインなし)なので、”H”レベルとするため 74HC04のNOT回路を通して反転させています。
  • 74HC573はCMOSゲートなのでLEDをそのままつないでいます。

[2018/8/11] 当初掲載した回路図のLEDの向きが逆だったので修正しました…orz

実装したブレッドボードの写真はこちらです。

プログラムはこんな感じで、いつものGrant’s BASICでOUT命令を並べてみました。
試作回路では74HC138でI/Oアドレス40hにデコードしたので、OUT &h40,xx という感じでバンク番号を出力する感じです。(今回はメモリーではなくLEDを光らせているだけですけど….)

10 REM 74HC573 LED BLINK
20 OUT &H40,0
30 GOSUB 1000
40 OUT &H40,1
50 GOSUB 1000
60 OUT &H40,2
70 GOSUB 1000
80 OUT &H40,3
90 GOSUB 1000
100 GOTO 10
1000 REM WAIT
1010 FOR I=1 TO 1000:NEXT
1020 RETURN

LEDが 1 (01) → 2 (10) → 3(11) と思った通りLEDが点灯しました。バンクレジスタの試作は成功です。
手持ち部品に74HC02(NORゲート)がなくて思ったほどコンパクトな回路にはなりませんでした….

次は、128kBメモリーのアドレスバスA16/A15を作ってあげるロジック回路を検討します。

広告

SBC8080 SUBボードへつなぐZ80 CPUボードの作成

Z80ブレッドボードマイコンで8251シリアルLSIが動いたので、次はユニバーサル基板で組んでみようと思います。
ただ、ちょっとズルをしてROM/RAMや8251はSBC8080のSUBボードを使ってみたい…

Z80 CPUボード回路の検討

Z80 CPUボードですが、SBC8080のSUBボードとつなぐことに特化した回路として検討してみました。
本来ならフラットケーブルにアドレスバス、データバスを直結せずバッファをつけるところだと思いますが….そのままいけるかなと。^^)
(ちなみにTwitterでいろいろと意見を頂いたり、実際に組んでみたら失敗に気づいたりしたところを直した版です…)

  • リセット回路は一般的なR/Cの回路にシュミットトリガインバータ(74HC14)を2つ接続しました。SBC8080 SUBボードへRESET(正論理)信号も出したかったので…
  • メモリーREAD/WRITE、I/O READ/WRITEは74HC32で構成しました。
  • クロックは水晶発振子を74HC04で発振させます。
  • SUBボードの8251からの割り込みはインバータ(74HC04)を通してZ80のINTつないでいます。
  • データバスは10kΩでプルアップしておいて、8251からの割り込みが来た時に RST 38h(0xff)が発動するようにしてます。(Twitterで教えていただきました。この対応をするとSBC8080用ソフトが無改造で動きます!!)

配線〜動かない

回路図通りに秋月Bタイプ両面ユニバーサル基板で回路を組みました。
配線は主にAWG28サイズのラッピングワイヤ(単芯)で実施。細いので取り回しがらくちんです。

各配線についてテスターで導通検査してZ80やロジックICを挿入し、作ったボードとSBC8080 SUBボードをフラットケーブルでつないでから電源をつないでみましたが動きませんでした。

  • 水晶発振子が50kHzぐらいしか発信しない
    • 写真をみていただくとロジックICが1つ少ないのですが….当初ロジックICをけちって74HC14で水晶発信できると思いこんで組んでました。これは失敗でテスターの周波数カウンタで確認したところ50kHzぐらいでしか発振してませんでした。74HC04へ変更しました。
  • リセット回路はやっぱシュミットトリガで….
    • こちらは必須ではなかったかもしれませんが、C/Rのリセット回路からZ80のリセット端子へつなぐところのインバータはシュミットトリガが良いと思いICを追加しました。

ここまで変更してみましたがどうも、シリアルコンソールにはうんともすんとも反応がありません。
ためしに、CPUボードをSBC8080へ戻すとちゃんと動きます。(あたりまえですが….)

ロジアナで波形を確認

データがフラットケーブル上流れているのかを見てみたくて、Analog Discovery 2のロジアナ機能で状況を観測してみました。

フラットケーブルは3階建てにするために秋月40pinフラットケーブルに1つ追加でコネクタを圧着していましたので、そこへロジアナ用のケーブルをブレットボードワイヤで中継して接続しました。
観測した波形はこんな感じでした。以外ちゃんとした波形が出ている雰囲気….

配線をいろいろといじっているうちに….発見

実はいろいろと試していると、ごくまれにシリアルコンソールにTinyBASICの起動メッセージが出ます。
いまいち発生条件がわからず….

これはノイズか接触不良か電源の関係でふらつき??、リセット回路がイマイチ?のあたりが原因と思って、SUBボードの電源配線を独立させて太い線へ変更したり、ラッピングワイヤ・ケーブルでジャンパして+5Vのラインを遠くのロジックICにつないでいるところを太いケーブルへ変更したりしていたところ….

40pinボックスヘッダにつないでいたアドレスバス A12のケーブルが外れました ….. orz

このケーブルを再度 しっかりとはんだ付けしたところ、SBC8080用TinyBASICがZ80 CPUで動きました!!

恒例の動作確認

最終的な基板の状態はこんな感じです。

というわけで恒例の動作確認です。最初はBASICで1から10まで足し算を….

続いて、8255基板経由で LEDチカチカ確認ボードのLEDを光らせてみます。
今回はSBC8080のモニターが持っている1ラインアセンブラ機能で確認しました。

LED点灯のためのASMソースはこんな感じです。(16進数に”h”とか付けないんですね…)

MVI A,80
OUT 83
MVI A,AA
OUT 81
RET

無事 Z80 CPUボードが稼働することが確認できました!!!

ブレッドボードZ80マイコンにシリアルLSI 8251をつなぐ

ことしのGWあたりから作って実験していたブレッドボードZ80マイコンですが、Gran’s氏のマイコン回路を参考に作ったのでシリアルチップが68系のMC6850です。
SBC8080で8251を使っていたので、やっぱりZ80に80系のシリアルをつなげてみたくなりました。

ブレッドボードZ80マイコン 再配線

8255Aをつないだりして実験していた関係もあり、ジャングル配線になって なにやら不安定っぽかったブレッドボードZ80マイコンですが、秋月電子から通販で買ったブレッドボードx3構成に作り直してみました。

GWごろに作ったときより、だいぶ短いケーブルでつなぐことができた気がします…^^);;
ワイヤストリッパーも手に入れたので配線スピードがだいぶ上がりました。

シリアルLSIを8251へ

やっぱりZ80なので80系のシリアルチップで動かしてみたい!ということで、SBC8080の部品を買う時に買ってあった8251をつないでみます。

回路はほぼSBC8080のサブ基板といっしょです。

  • データバスをD0-D7を接続しました。
  • チップ選択信号 CSはいつもの74HC138でA13〜15をデコード。
  • 読み/書き(RDWR)は8255AのときといっしょでZ80のI/O要求(IORQ)信号と74HC32でORをとります。
  • 8251の送受信クロックはSBC8080の回路といっしょです。(SBC6800のPIC12F1822でも良かったかも)
  • Z80の主クロックは7.23728MHzでしたが、8251がμPD8251AFCのため最大周波数は5MHzでしたので、4.9152MHzの水晶振動子へ差し替えました。
  • RxRDY端子によるZ80への割り込みは負論理へ変換するため74HC04のNOT回路を通しました。

SBC8080用 機械語モニタで動作確認

SBC8080のデータパックに入っている機械語モニタのHEXファイル “MON80SA.HEX” をEEPROMへ焼いて起動してみました。

起動すると、機械語モニターの初期メッセージと共に入力待ちになります。
起動は成功ですが入力をうけつけてくれませんでした。

Z80の割り込みモード設定が必要

Z80マイコンはシンプル構成で、割り込みコントローラはついてません。

Z80は割り込みモードを3種類持っているみたいで 割り込みモード0は8080互換で割り込みコントローラ接続が前提の模様。
割り込みモード1にすると割り込み時に0038hが呼ばれてソフトコントロールできるとのこと。
幸い機械語モニタの割り込みルーチンは0038hから記述されているのでZ80を割り込みモード1にすると良さげです。

問題は機械語モニタのソースは8080ASMで書かれているため、Z80で拡張された割り込みモード設定はアセンブリできません。
そこでZ80の “IM 1″(割り込みモード1へ設定)のコードを 16進数で定義する作戦としました。
変更箇所は以下の初期化部分です。(画像ですいません…)

この変更で無事 受信割り込みが動くようになりモニターが使えるようになりました!!

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が交互に光りました!! うれしい!!