ブログの練習

ブログを書く練習です。
最近はレトロな計算機(電卓、マイコン、パソコンなど)
に関することを書き始めました。

Zilog Z8671 BASIC/Debug

2022-06-07 14:17:28 | マイコン
Zilog Z8671 (Z8 MCU with BASIC/Debug Interpreter)です。BASICインタプリタのROMが内蔵されたZ8ファミリーのマイコンです。運良く入手することが出来たので動作確認してみました。ググると情報がいくつか見つかり、主に下記サイトを参考にさせていただきました。
Z8671を動かす | Electrelic by Electrelicさん
Z8 – 電脳伝説 by 電脳伝説さん
Z8 – レトロな雰囲気 by tomi9さん
まずはHardware Application Note (Zilog "z8671 seven chip computer hardware application note", Sept. 1981)に忠実に作ろうと思ったんだけど、Z6132なる32Kbitの疑似SRAMを使っていたので早々にあきらめ、おなじみのHM6116に変更。
最初はブレッドボードかユニバーサル基板に組もうかと考えていたところなのですが、
電脳伝説さん(&tomi9さん)のSBCZ8の基板が440円という安さで売られているのでそれを購入して流用することにしました。
SBCZ8はRAMがx800H~xFFFHに配置されているようだったのですが、そこにはボーレート設定用のROMを置きたいので入れ替える必要がありそう。
/CEを入れ替えようと思ったんだけど、基板のパターンを見たら/WEを入れ替える方が簡単だったので、ROMとRAMの物理的な位置と/WEを入れ替えて解決。ところがパターンカットするときに/CEの線も切ってしまったので、結局/CEを入れ替えるのと労力はあまり変わらず。まあいいか。
最初、何でA8~11をプルダウンしているんだろうと思っていたのですが、Handbook (Zilog Z8 Family Design Handbook)に記載あり。起動時にI/Oポートをアドレスバスとして使用する設定をする前にメモリにアクセスしに行くため。なるほど言われてみればそうですね。Z8681は起動時に外部ROMにはアクセスしないのでプルダウンは不要。チップ横の抵抗を省略出来ました。
せっかく内蔵BASICなのに、ボーレートの設定だけのために外付けROMを付けるのはなんだかなあ、と思っていたところ、上記のElectrelicさんのブログにD0~2をプルアップ&プルダウンして値を入れればいいという話を発見。ROMを省略できました。
RXDの6.8Kは何なんだろうと思っていたら、tomi9さんのブログに「USBシリアルを接続すると、PowerONリセットがRXDからの電流の回り込みでVCCに電圧が加わりリセットできないのでRXDに抵抗が追加してあります。」という記述を発見。なるほど納得。



とりあえず完成したので起動。してみたが動かず・・・おかしいなあ。
オシロで/AS, /DS, /CE, TXDの信号を見てみるとそれなりの信号は出ている。が、良くみるとTXDの動きが遅すぎる。XTAL1, XTAL2をみたら周波数が数KHz。これはおかしい。水晶がちゃんと発振していないようだ。水晶にソケットとか付けたのがまずかったのかなあと思ったものの、せっかくソケットなので水晶を入れ替えてみる。手持ちの4MHzだとちゃんと発振。10MHzは発振せず。ああ、やっぱりそういう微妙なところか。
SBCZ8のコンデンサは15pだったんだけど、Applicatio Noteは22pFだったので、その差も気になる。

データシートを確認しようと思い、Handbookを確認したところ、C<=15pFって書いてあるじゃん!Application Noteは何で22pFなのよ。

15pFと22pFでそんなに変わるかなあ、と思いながらコンデンサを交換。結果、あっさり発振成功。(このあたりは写真や記録を撮っていなかったので画像無し)

お約束のマンデルブロ集合でベンチマークでも走らすか、と思って以前MCS8051のベンチマークに使ったASCIIART.BASを見てみたら浮動小数点演算していることに気付く。
マンデルブロ集合の計算なんだからそりゃそうだよね。しかしZ8671のBASICは16bitの整数型なのだ。整数型BASIC用のベンチマークは無いのかな?と思ってはせりんさんのサイト(ASCIIART(マンデルブロ集合)ベンチマーク)を見ても、みんな浮動小数点演算が前提だった。
仕方ないので固定小数点版をやっつけで作ってみました。
最初小数部8bitでやってたらいろいろ溢れて試行錯誤の結果小数部6bitで動きました。
16bitの符号付き整数を小数部6bitの固定小数点に変換しながら計算。
最初小数部8bitでやったら計算途中で溢れてNG。7bitだと一応動くけど、溢れる可能性があるので6bitにしました。
この実装も結構インチキなのですが、計算に使われる変数値が±5.0以下みたいなのでとりあえず動いているという感じです。
発散判定は整数部だけでやってます。(真面目にやっても時間がかかるわりにそれほど差が無いので。)
CHR関数的なものが無いので、10~15はIF文で"A"~"F"をPRINT。FOR文も無いのでIFとGOTOで代用。
プログラムはこんな感じ。
(【2023/1/5 追記
下記コードはオーバーフローしてる箇所があるっぽいので、整数型BASIC用のプログラムとしては別の記事(Fairchild F8 Family (F3850))に書いたやつの方がいいかもしれないです。)

10 F=64: M=F-1: REM for Fixed Floating Point (F=1.0, M is a bit mask for fraction part)
20 Y=-12
30 X=-39
40 C=X*3: REM 0.0458*F
50 D=Y*16/3: REM 0.08333*F
60 A=C
70 B=D
80 I=0
100 Q=B/F
130 IF B>=0 THEN S=AND(B,M): GOTO 150
140 S=-AND(-B,M)
150 T=(A+B)*(A-B)/F+C
160 B=2*(A*Q+A*S/F)+D
170 A=T
180 P=A/F: Q=B/F
190 IF (P*P+Q*Q)>4 THEN GOTO 220
200 I=I+1:IF I<=15 THEN GOTO 100
210 PRINT " ";: GOTO 300
220 IF I<10 THEN PRINT I;: GOTO 300
230 IF I=10 THEN PRINT "A";: GOTO 300
240 IF I=11 THEN PRINT "B";: GOTO 300
250 IF I=12 THEN PRINT "C";: GOTO 300
260 IF I=13 THEN PRINT "D";: GOTO 300
270 IF I=14 THEN PRINT "E";: GOTO 300
280 IF I=15 THEN PRINT "F";
300 X=X+1:IF X<=39 THEN GOTO 40
310 PRINT
320 Y=Y+1:IF Y<=12 THEN GOTO 30

結果です。クロックは7.3728MHz、実行時間は1897秒(31分37秒)。かなり遅いです。でもレトロマイコンは遅いほど味わい深いのでこれでいいのだ。


動作時も消費電力は5V×50mAと小さめ。円高で値上げされそうなので駆け込みで買ったFLIRで測定。52度ぐらいとそれほど高温ではない。

さて次は何をやろうかな?
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« CASIO AL-1000 | トップ | Toshiba BC-1201 »
最新の画像もっと見る

コメントを投稿

マイコン」カテゴリの最新記事