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形式をメモリロードできる機能を追加しないとダメかもです。

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音源の楽曲データがたくさん保持できるなぁとか….

SBC6800ルーズキットに32kB RAMとPIA(MC68B21P)

以前、SBC6303ルーズキットの拡張コネクタから線を延ばしてブレッドボードでパラレルI/O(PIA-MC68B21P)の稼働を確認しました。

一番最初に作った SBC6800は拡張コネクタが無いのでLチカができませんし、RAM拡張もできません。
しかし、ラッピング用ICソケットで嵩上げしたら2階建てにできるので色々と子基板に装備できるはず!
(@vintagechipsさんのこちらのツィートを見て、「これだ!」と思ったのが始まり..)

子基板の作成と32kB化

まずはMC6800とメモリーの足を延ばして2階建てにしてみようと思いました。
ただ、地元の部品店では40pin のラッピング用ICソケットはありましたが、20pin 300milのラッピング用ICソケットの在庫が無く、代わりに買ってきたのがラッピング用ピンヘッダです。

ただこれだとラッピング用ICソケットと足の高さがいまいち合わないので、SBC6800子基板の間はラッピング用ピンヘッダ、子基板上には普通の40pin 600milと28pin 300milのICソケットを装着して頑張って配線してみました。
本当は28pin 300mil→600milで 14pin分 配線頑張って SRAM 32kB化のつもりが、40pin+28pinで68pinも配線が必要となりました。(T-T)
先に全部のピンヘッダをはんだ付けしたんですが、実は28pin 300milの内側が狭くてはんだ付けがたいへんでした。片側ずつ作るべきでした。

ひとまずSBC6800 32kB化完成した写真がこちらです。
☆ラッピング用ICソケットは太くて 丸ピンICソケットには刺さらないので、SBC6800の6800 CPUとRAMのソケットは板バネICソケットである必要があります。

この段階ではパラレルI/O MC68B21Pを載せようという野望でICソケットだけつけてありました。
SBC6800からの改造ポイントとしては、SRAM(62256)の足3本(A13,A14,A15)を配線することで32kB化を実施しています。
($0000-$7FFFをRAMとするのでA15が”L”か”H”かでコントロールです)

  • A13 → 62256 A13 (26番ピン)
  • A14 → 62256 A14 (1番ピン)
  • A15 → 62267 #CE (20番ピン)

子基板にしたのでSBC6800が無改造で済むのが嬉しい。嫌になったらデフォルト構成に戻れます。

ちなみにMIKBUGのワーク領域も $1Fxx→$7Fxxへ移動したものをEEPROMへ書き込んでいます。
これはソースを修正してリアセンブリして TL866CSで焼くだけなので簡単。ついでに電大版TinyBASICもいっしょにROMに焼いておきました。

ちなみに、メモリーテストも6800アセンブラで書いて実行してみました。
SBC6303のメモリーチェックのソースを拝借してSBC6800用に修正しました。

  • メモリーの端から端までチェックすると、MIKBUGのワークまで壊すので $7F02〜5のあたりに、実行前に設定が必要です。($0100〜$7EFFとか….)
  • いつものMIKBUGの実行アドレスは $7F48〜へ変更してます。

こちらが実行画面です。うまくいきました。

子基板のパラレルI/O(PIA)のあたりの回路図

子基板にパラレルI/O(PIA)も載せたいと思ったので、そのあたりの回路図を書きました。(32kBメモリー(62256)は省略です…)
できればSBC6303と同じような拡張コネクタも装備してみたい。配線がたくさんあってちょっとめげますが…

パラレルI/O(PIA)のあたりの配線 〜 Lチカ

またもLチカネタとなりますが….
子基板の回路図のうちパラレルI/Oのあたりだけ配線してLチカしてみました。
(まだ40ピンボックスヘッダの配線はしてません….のんびりやります….)

LEDチカチカ用のユニバーサル基板も別途作成して、これで思う存分Lチカができますw

ユニバーサル基板にラッピングワイヤ を使用して配線してみました。
単芯なので配線しやすいですが、被覆が熱に弱いので短時間ではんだ付けする必要があります….

余談….

ちなみに色々と作っていて手持ちのハンダが切れたので、地元の部品店で久々に千住金属製の巻ハンダ(スパークルハンダ)を買いました。
はんだ付けしたときの光り具合が最高です。はんだ付けしてて気持ちいいです。

SBC6303ルーズキットでYM2151 FM音源

ArduinoとZ80自作マイコンで動いたFM音源 YM2151をSBC6303でも動かしてみたいと思います。

拡張基板の作成

Arduinoのシールドとして作ったYM2151 FM音源ボード を載せる子基板を作成しました。
…実は以前作った拡張RAMボードに載せようとおもって40pinヘッダをずらそうと奮闘して壊してしまったのでイチから作り直しました。

拡張RAM以外の部分のFM音源シールドを接続する回路図はこんな感じです。

  • 68系はメモリーマップドI/Oなので拡張RAMのRDWRはSBC6303の拡張コネクタに出力していただいていますのでZ80より回路は更に簡単です。74HC138によるアドレスのデコードだけです。
    • アドレスもなんとなく$C000あたりにしてみました。

各基板はこんな感じです。

演奏ソフト BASIC 〜 MC6800 ASM

電大版TinyBASICで試しに演奏ソフトを書いてみました。音楽データは$3000からLILBUGのLコマンドで配置しておきます。
WAITがインチキですけど音が出たので一安心。

1 REM -------------------
2 REM YM2151 PLAY FOR SBC6303
3 REM -------------------
4 REM 
10 W=$3000:X=$4393
20 FOR I=W TO X
30 GOSUB 100
40 NEXT I
50 END
100 REM - HANTEI - 
110 IF #(I)=$54 GOTO 200
120 IF #(I)=$61 GOTO 300
130 IF #(I)=$62 GOTO 310
140 IF #(I)=$63 GOTO 320
150 IF #(I)=$64 GOTO 320
160 IF #(I)=$66 GOTO 50
170 GOSUB 330:RET
200 REM - PLAY - 
210 I=I+1:#($C000)=#(I) 
220 I=I+1:#($C001)=#(I)
230 RET
299 REM - WAIT -
300 FOR J=1 TO 1 : NEXT J:RET
310 FOR J=1 TO 2 : NEXT J:RET
320 FOR J=1 TO 3 : NEXT J:RET
330 FOR J=1 TO 4 : NEXT J:RET

やはりZ80マイコンのときといっしょで、アセンブラで書かないとちゃんとした演奏はできなさそう。
MC6800のアセンブラ表とにらめっこしながらArduinoやZ80のアセンブラソースとほぼ同じコードを書いてみました。
Z80のつもりで書くと16bitレジスタペアが少ないとか、分岐命令が+/-127バイト程度だったりとかヒッカカリポイントは多数…

通称prontfデバグと、LILBUGのT(トレース)コマンドで無事稼働しました。
ソースをまたgistにUPしました。長いですが以下のようなソースになります。

アセンブリはクロスアセンブラASを使ってMac上で実施しました。
(ソースファイル名はPLAY.ASM)

$ asl -cpu 6800 -L PLAY.ASM
$ p2hex -r \$-\$ -F Moto PLAY.p

音楽データは FCB命令でバイナリデータを並べたものを別途準備。
MacのCoolTERMを使用して1文字あたり1msのウェイトを入れてLILBUGのLコマンドへ転送しました。

MC6800のコードで書いたのはSBC6800でも将来動いたら良いなぁという気持ちもあったりしたのです。
無事 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