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)

広告

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

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