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

今回はSBC8080バスにつながる128kBメモリーボードの回路を検討して、ユニバーサル基板で試作するところまでをまとめます。

シリアルLSIは搭載するか?

当初の目論見では、128kメモリーボードにシリアルLSI 8251を搭載しようと考えていました。
しかし、ターゲットのユニバーサル基板をいつもの秋月電子タイプB基板にするつもりで部品配置を考えたところスペース的に載らないという結論となり断念しました。

よって、シリアル通信のためにSBC8080 SUBボードからRAM/ROMを外して使用します。

ROM/RAM切り替えとI/Oアドレス切り替え

アドレス0000h〜3FFFhの 16kB ROMと 128k RAMの切り替えについては A15、A14を74HC139でデコードできそうです。(出力が4つなのでうまいこと16kBづつデコードできそう)
ちなみに、ROMには負論理のCS端子、128kB RAMには正論理の CS1端子があるのでそれぞれ74HC139の同じ出力をつないで上げれば切り替えができそうです。
(最初は74HC04のNOTゲートでひっくり返そうと思ってました…^^)>)

バンクレジスタ部分のI/Oアドレスですが、もともとのSBC8080 SUBボードでも74HC139でデコードしていますので、メモリーデコードで使用した74HC139の余った部分のデコーダで40hへデコードできそうです。

その後は前回の回路図同様 IO書き込み信号(IOWR)と NORゲート(74HC02)を通してラッチ(74HC573)のラッチイネーブル(LE)端子へつなぎます。

回路図全体

回路図の全体図はこちらです。

  • バンク切り替えの状況を目で見て確認したかったのでNOTゲート(74HC04)をつなげた先にLEDをつけました。
  • メモリーのA16,A15のコントロールは前回検討した回路そのままです。

ユニバーサル基板での試作

この回路図に従って、秋月電子ユニバーサル基板タイプBへ 試作を実施します。
引き回したケーブルはマルツパーツでたたき売りしていたAWG28サイズの単芯ラッピングワイヤ(赤)と 地元部品店で購入したAWG28サイズの青、緑、白のラッピングワイヤです。

こちらは、データバス、アドレスバスまで配線して力尽きた写真…

裏面の電源関係は0.5mmのスズメッキ線で配線しました。

完成記念写真がこちらです。
以前作ったZ80 CPUボード、SBC8080 SUBボード(ROM/RAM外し)と一緒に稼働させます。

無事 機械語モニタも起動して RAM領域の 4000hや8000hに書き込みができました。

また、下記のような機械語プログラムでバンク切り替えの稼働も確認できました

4000
MVI A,1  ← バンク番号を指定
OUT 40h
RET
EXEC 4000
8000
DEFINE 01,02,03   ← 適当な値を入力して 別々のRAMが選択されていることを確認
DUMP 8000

SBC8080でもメモリーボードが稼働

ちなみに、CPUボードをSBC8080へ繋ぎ変えてみて稼働することを確認しています。

余談 : KiCADの74HC139シンボルに惑わされ…

スムーズにいったように書いてますが、実はKiCADの74HC139シンボルに惑わされて痛恨の配線ミスをしています。
以下は配線するときに作っていた回路図で、74HC139へつなぐアドレスバス A7,A6とA15,A14の線をつなぐ場所が反転しています。よく見るとKiCADのシンボルでは端子名がA、BではなくA1、A0となっていて デコード表との関係がわかりやすくなっているようです。これだとI/Oアドレスのデコードは80hになりまして…最初は「バンク切り替えが動かん!!」と悩みました…orz

ちゃんとデータシートを確認して端子番号を確認しなきゃという教訓でした….

広告

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

前回、メモリーバンク切り替えのためのバンクレジスタの試作がうまくいきましたので、つぎは128kBメモリーのアドレス線A16/A15をコントロールする方法について検討してみます。

メモリーアドレス線コントロール案

128kB SRAMのうち8000h以上のアドレスについて3分割してバンクメモリーとして使いたいと考えています。
Z80ではアドレスバスとしてはA0〜A15の16本(16bit分)しかコントロールできませんので、前回試作したバンクレジスタの2bitと合わせて上手くコントロールしたいと思います。
想定している真理値表は以下のとおりで、考慮した点は以下になります。

  • アドレスバス A15が “L” (つまり0000h〜7FFFh)へアクセスする場合は メモリーのA16/A15共に”L”にする。
    • バンクレジスタに何が出力されていても無視です。
    • このメモリー領域はROMとRAMで半分づつつかいますが、そのコントロールはCSをコントロールする別の回路にします。
  • バンクレジスタへ誤って 0x00を出力された場合でも、デフォルトのバンク1を選択するようにします。
Z80 A15 バンクレジスタ DA1 バンクレジスタ DA0 128kメモリー A16 128kメモリー A15 備考
L x x L L 0000h〜7FFFhまで
H L L L H バンクレジスタに0(ゼロ)がセットされた場合
H L H L L バンク1
H H L H L バンク2
H H H H H バンク3

これによって以下のように128kB SRAMの全体を有効活用できるようになると考えています。

ロジック回路による実現方法

上記の真理値表を使って実際のロジック回路を検討してみます。
Mac上のLogisimを使ってパソコン上で検討しました。

Logisimは真理値表から回路図生成もできまして、オプションで「2入力ゲートを使う」とか「NAND優先」というオプションもあります。
上図はそれで生成してもらった回路です。^^)>
74HC00 x1個と74HC04 x1個の2つのゲートICでコントロールできそうです!

次は実際の基板を作るための回路図を検討します。

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ボードが稼働することが確認できました!!!

SBC8080ルーズキットにパラレルI/O 8255Aをつなぐ

SBC8080にパラレルI/OとFM音源用コネクタを増設する計画です。まずはパラレルI/O LSI 8255Aから…

パラレルI/O 8255Aの回路図

SBC8080は拡張コネクタに8080CPUや8228/8224などの周辺チップからの制御信号線や+5V/GNDなどがでています。
Z80のときよりもさらに楽チンで、IOWIORなどのI/Oチップ用読み書き信号も出ていますし、Z80マイコンのときには手を抜いて作らなかったRESET信号も、ちゃんと拡張コネクタにでています。
よってI/Oポートのアドレスデコード(A7〜A5)を74HC138でおこなってあげれば、あとは拡張コネクタへパラレルI/O 8255Aを接続するだけです。超簡単です。
(8080CPUのファミリーLSIだから、あたりまえですか….)

ちなみに動作確認はいつものLEDを使用します。
LEDチカチカ専用基板wとは14pinフラットケーブルで接続します。

8255A用基板配線実施

8255Aを載せる基板の配線を実施します。
そのうちFM音源も接続したいのでそのためのピンソケットもいっしょに….
外部機器とは14pin フラットケーブルで接続することにしたいのでボックスヘッダもつけます。

SBC8080はSBC6303同様 40pin フラットケーブルで他ボードと接続されています。
先日 フラットケーブルの圧着工具を買いましたので秋月フラットケーブルに1つコネクタを追加して3つ口にしておいたケーブルを使用します。

EEPROMの下駄がサブ基板にあって 高さあるため、今回作ったボードを固定するスペーサーが無いので バラック状態で確認します。
とほほ…

BASICでLチカ

8080のニーモニックは忘却の彼方なので、Z80マイコンでも使ったGrant’s BASICのOUT命令で試してみます。

  • 83hが制御ポートで OUT 命令で80hを出力するとAポートもBポートも出力に設定。
  • 81hがBポートの制御です。データの16進数のビットがOFFとなったポートのLEDが点きます。
OUT &h83,&h80
OUT &h81,&hAA
OUT &h81,&h55

うまくLEDがつきました!!

SBC8080ルーズキットを組み立てる

満を持して登場した「世界初のマイクロプロセッサ8080 CPU用ルーズキット SBC8080」を組み立てました。
部品点数は多いですが着実に部品を組み付ければ確実に動く…はずでした…^^)

実は並行してSBC6303BL(ブートローダ)も作ってまして、そちらはマイクロSDに保存するブートイメージファイル名の先頭にブランクを入れて悩むという恥ずかしい状態で…さほどネタはありませんです。そのうち記事書きます。

部材到着

スイッチサイエンスさんから、SBC8080基板などなどが届きました。
今回は”SBC(シングルボードコンピューター)”といいながら、CPUボード+サブボード(ROM/RAM+シリアル)という構成です。最初から40pinフラットケーブルが活躍します。

SBC6303を作ったときに40pinボックスヘッダやフラットケーブルはゲット済み。
8080CPUや周辺チップは基板とは別に若松通商へお願いしてました。

作成開始~動かず

技術資料に沿ってCPUボード、サブボードの作成を実施します。
それほどはまりどころは無いはずですが、いつもどおりウッカリものなので40pin ICソケットを上下さかさまにつけてしまい、無理に外してハマってりしていました。(一度外すとスルーホールにハンダが残って、板バネICソケットだとピンが上に抜けてきまして…(>_<) )
次からはちゃんと丸ピンのICソケットにしようと心に誓いました。

記念写真を撮って、起動してみましたがシリアルコンソールには何も出ません。
以下を確認してみました。

  • 電源として+5V、-5V、+12Vは出ているか
    • 8080CPUは5V単一電源のZ80と違って3電源となっています。+5Vと+12Vはまぁまぁいい感じ。サブボードにもちゃんと供給されていました。ただ-5Vが-3.7Vぐらいとちょっと低め。でもTK-80もそのぐらいだったという情報をいただいてちょっと安心したり…(あやうくダイオードを張替るところでした)

  • 8224につながったクロックが発振しているか。
    • テスターの周波数カウンターで計測したところ2MHzぐらいが出てました。
  • 8251シリアルチップのクロックは出ているか?
    • ちゃんと発振して153.6kHzが出ている感じです。
  • 写真をよく見るとわかりますがパイロットランプのLEDをつけ忘れていますw このあたりはご愛嬌。

EEPROMが?

起動用のROMですが、データパックの “PTBEXSA.HEX”(機械語モニタつきBASIC)をEEPROMに焼きました。
68系と違ってROMは0000h番地から配置なのでその点だけ注意でした。

実はTwitterで先達の方がEEPROMでハマっていたのは見ていたのですがピンときてませんでした。

動かないSBC8080の回路図をみながら地道に1本づつテスターであたっていて、ハタと気づいたんですが…
私が今回使ったのも 28C256型のEEPROM。技術資料で使用しているのはUV-EPROM(紫外線消去型)の27C256型。
そういえば 、EEPROMとUV-EPROMでは一部のピンアサインが異なっています。

ピン UV-EPROM
27C256型
EEPROM
28C256型
ピン:1 Vpp(+5V) アドレスバス A14
ピン:27 アドレスバス A14 WE (書き込み許可)

アドレスバスA14のピンが違っています。これだとアドレスが正しく指定できません。また、EEPROMのWE (書き込み許可)はライターでの書き込み時に使用するピンなので+5VにつないであげればOKのはず。

手元に27C256型 UV-EPROMはあるのですが 紫外線ランプなどのEPROM消去機材がないので…..以下写真のような下駄を急遽作成しました。1番ピンと27番ピンを逆に接続して残りのピンは同じピンへ接続すれば良いはず。ユニバーサル基板を切って細ピンヘッダとICソケットを装着して作成してみました。

下駄を装着して1回目は起動しませんでしたが、どうもWE (書き込み許可)ピンがフラフラしたせいか中身が壊れてしまっていたようで、再度 PROMライタで機械語モニタ+BASICのHEXファイルを書き込みなおしたところ無事に起動しました!!

むかし雑誌に載っていたNEC TK-80(トレーニングキット)を見ながら指をくわえていた組なので、手元で8080CPUが動いて感激です!!

今後…

今後はFM音源チップを鳴らしてみたいとか8255AをつないでLチカしてみたいとか色々と野望は膨らみますが….
まずは機械語モニタにLコマンドを実装してIntel HEX形式をメモリロードできる機能を追加しないとダメかもです。