ブログの練習

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

Z80をオーバークロックしてみる

2023-07-15 17:44:10 | マイコン

Z80(Z84C0020PEG)をオーバークロックして33MHzで動かすことに成功しましたので、とりあえず備忘録としてまとめておきます。

回路図やプログラム等一式はGitHubに置いてあります。

GitHub - ryomuk/tangnano-5V: 5V tolerant interface for Tang Nano

GitHub - ryomuk/tangnano-5V: 5V tolerant interface for Tang Nano

5V tolerant interface for Tang Nano. Contribute to ryomuk/tangnano-5V development by creating an account on GitHub.

GitHub

 

Tang Nano 20K用のGPIOを5Vトレラントにするアダプタを作ったのでその応用例としてZ80のメモリシステムを作ったというストーリーになっていますが、昔のCPU(Z80に限らず)のメモリシステムをTang Nanoに実装するために5Vインターフェースを作ったというのが正確なところです。

レベル変換用のICはSN74CB3T3245という長い名前のICを使用。レベル変換についていろいろググってたら見つかったこのページ(5V系・3.3V系信号レベル変換)で知りました。

データシートには「レベルシフタ搭載バススイッチ」とあります。5V→3.3Vはレベル変換しますが、基本的には「スイッチ」なので、3.3V→5Vは変換せずに3.3Vの信号がそのまま5V側に出力されます。5VTTLの閾値は1.5V,5VCMOSの閾値は2.5Vなので問題無く動作するということのようです。

レベル変換用ICにはSN74CB3T3245の他に、LBF0108、TXS0108、TXB0108というデバイス(いずれもTexas Instruments製)などもあり、TIのレベル変換関連の資料を見ると最近の資料にはSN74CB3T3245は載っておらず、LBF0108を勧めている感じもあったのですが、実物を入手していろいろ比較した結果、結局SN74CB3T3245が一番良さそうという結論に落ち着きました。

最初に作った変換基板にTangNano20Kを搭載したのがこれ。幅を間違えてしまっていました。

機能的には問題無いはずなのでとりあえずこれを使ってブレッドボードでZ80と接続。

なんとなく動いてるんだけど、メモリがちゃんと認識されてなかったりして不安定。

データシートを読み返していたらクロックはTTLレベルじゃだめでHレベルはVcc-0.6V必要ということを発見。

74AHCT04を使ってクロックを5Vまで引き上げたところわりと安定して動作するようになりました。

この雑な配線でも12MHzで動作。とはいえさすがにこの配線はダメだろうと思ってもう少し真面目に配線しなおしました。

そしたらブレッドボードで27MHzで動作してしまいました。ただちょっと不安定。ブレッドボードでは限界っぽいので基板の到着を待ちます。

基板が完成したので部品を載せ替え。

しかしおかしなことに27MHzでは動作してくれなくなってしまいました。20MHzでは動作するので回路に問題は無さそう。

メモリアクセスのタイミングの問題かなと思い、TangNano側のロジックを変更してみました。メモリはクロックに同期させる方が安定するだろうと思ってクロックエッジでMREQ_nやRD_n、WR_nを見て読み書きしていたのですが、(~MREQ_n & ~RD_n)や(~MREQ_n &~WR_n)のエッジで(クロックとは非同期で)読み書きするように変更したところ問題解決。変なことするよりメモリ本来の動作に忠実に実装する方が良かったようです。

安定して動くようになったのでいよいよオーバークロックの実験。Z84C0020PEGはデータシート上のスペックはDC~20MHzです。

まずは27MHz。電源はTangNano経由のUSB給電という適当な設定。これでもASCIIART.BASは無事完走しました。

データシートには、

とありますので、Vccの電圧は5.5V程度までなら安心して上げられます。

試してみたところ、クロック31.5MHzでVcc=5.55Vで途中で暴走。Vcc=5.6Vだとわりと安定して動作している感じでした。

31.5MHzというのはちょっとキリが悪いので、33MHzに挑戦してみることにしました。データシートを見ると、絶対最大定格は7.0Vです。

そういうことならVcc=6.0Vは大丈夫でしょう。試してみたところあっさり動作しました。

動画はこちら。

以上、Z84C0020PEGをVcc=6.0V, Clock=33MHzで動かしてASCIIART.BASを36秒で完走したお話でした。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

CH32V003でBASICインタプリタを動かしてみる

2023-06-30 15:13:52 | マイコン

秋月電子で売ってる40円のマイコン(CH32V003J4M6)がTwitterで話題になっていてちょっと気になっていたのですが、かんぱぱさん(@kanpapa)のブログにArduino IDEでの使い方がまとめられていて簡単に使えそうだったので試しに買ってみることにしました。

 

40円RISC-Vマイコン(CH32V003)をArduino IDEでLチカをしてみました | きょうのかんぱぱ

秋月電子さんに新商品のマイコンが入荷したようです。1個40円の32ビットRISC...

きょうのかんぱぱ

 

40円は税込価格で本体は37円。1個づつ個別包装です。袋とシリカゲルで数円分ぐらいかかってるのではないだろうか。書き込みにはWCH−LinkEエミュレーターなるものが必要とのことなので別途購入しましたが、これも750円と安価です。

スペックを見ると、

  • プログラムメモリ:16kB
  • RAM:2KB

とあります。このくらいあればBASICインタプリタが動くのではと思い、試してみることにしました。

とりあえず端末と通信できないことにはどうにもならないので、まずは通信周りについて調査。WCH-LinkEエミュレータにTX、RXなる端子があるのでこれを使えばUART通信ができるのかな?と思ってググってみたところ、こちらのブログとGitHubに関連情報を見つけました。

 

CH32V003をArduinoで使おう(CH32V203も) - Qiita

CH32V003 が Arduino で使えるようになりました。それでは、ArduinoIDEで使えるようにしましょう。ArduinoIDEに設定するファイル→環境設定追加のボードマネージャ ...

Qiita

 
 

arduino_core_ch32/variants/CH32V00x/CH32V003F4/PeripheralPins.c at main · openwch/arduino_core_ch32

Core library for CH32duino. Contribute to openwch/arduino_core_ch32 development by creating an account on GitHub.

GitHub

 

これによると、TXはPD_5=Pin 8、RXはPD_6=Pin 1のようです。

WCH-LinkEのTXをCH32のRX(Pin 1)、WCH-LinkEのRXをCH32のTX(Pin 8)に継げます。(ややこしいです。いつも混乱します。)

Pin 8はプログラム用の信号入力SWDIOも継がっているので共用になります。そのせいでトラブル発生。プログラムを書き替えようとしても継がらなくなってしまいました。

そういえば秋月のFAQに何か書いてあったような気がします。

32ビットRISC-Vマイコン CH32V003J4M6の質問と回答

なるほど。でもこれだけのためにMounRiver Studioを使うのは大袈裟だなあと思っていたところ、WCH-LinkUtilityにもこの機能があることを発見。こちらを使って無事クリアすることができました。

しかしすぐには動いてくれず、CH32→PCは継がるのに、PC→CH32の通信が出来ないという状態。原因を見つけるのに結構苦労したのですが、Serial.available()が常に-1なのが原因でした。RXにデータが来てるかどうかのチェックを、

if(Serial.available() > 0){
  c = Serial.read();
}

ではなく、

c = Serial.read();
if(c > 0){
  ...
}

とすることで通信できるようになりました。Arduino用の環境がCH32V003F4用に作られているせいなのかもしれませんがよくわかりません。

ともかくUARTで通信ができるようになったので、いよいよBASICインタプリタの実装に移ります。1から作るのは大変なので何か使えるものはないかと探してみたところ、電脳伝説さん(@vintagechips)の著書「タイニーBASICをCで書く」に掲載されている豊四季Tiny BASICがコンパクトで良さそうだったので試してみることにしました。ソースは本に記載されているサイトからダウンロードしたのですが、GitHubにほぼ同じものが公開されていました。

 

GitHub - vintagechips/ttbasic_arduino: TOYOSHIKI Tiny BASIC for Arduino. Tested in Arduino Uno.

TOYOSHIKI Tiny BASIC for Arduino. Tested in Arduino Uno. - GitHub - vintagechips/ttbasic_arduino: TOYOSHIKI Tiny BASIC for Arduino. Tested in Arduino Uno.

GitHub

 

Arduino用に作られているのでそのままコンパイル可能ですが、プログラム領域256byteではASCIIART.BASが入らないので512に変更しました。

#define SIZE_LIST 512 //List buffer size

最適化オプションが"Smallest (-Os default)"だと2kBほどサイズオーバーになり、"smallest (-Os) with LTO"だと16kB以内に収まりました。しかし、with LTOの方だと通信周りがちゃんと動かないようで、最初の1文字"T"が出て止まってしまいました。通信周りを直すか、別の開発環境を使えばうまくいくような気もしますが、とりあえずASCIIART.BASを走らせることを優先しようと思い、インタプリタの機能を削って小さくすることにしました。

やったことは、

  1. エラーメッセージの文字数削減
  2. ASCIIART.BASで使っていない機能を削る

です。

"2."の方はかなり乱暴で、配列、INPUT、GOSUB、RETURN、STOP、REM、RND、ABSを削りました。

これでやっと、

Sketch uses 16184 bytes (98%) of program storage space. Maximum is 16384 bytes.

Global variables use 1512 bytes (73%) of dynamic memory, leaving 536 bytes for local variables. Maximum is 2048 bytes.

に収まって無事起動。Serial.read, Serial.available周りに修正が必要かと思っていたのですが何も変更せずに動作しました。 ASCIIART.BASの方は、以前にFairchild F8 Family (F3850)Zilog Z8671 BASIC/Debug用に作った整数型BASIC用のプログラムをくっつけて作りました。

10 F=50
20 FOR Y=-12 TO 12
30 FOR X=-39 TO 39
40 C=X*229/100
50 D=Y*416/100
60 A=C; B=D
70 I=0
90 Q=B/F; S=B-Q*F
100 T=(A*A-B*B)/F+C
110 B=2*(A*Q+A*S/F)+D
120 A=T
130 P=A/F; Q=B/F
140 IF (P*P+Q*Q)>4 GOTO 200
150 I=I+1;IF I<=15 GOTO 90
160 PRINT " ",
170 GOTO 300
200 IF I<10 PRINT I,; GOTO 300
210 IF I=10 PRINT "A",; GOTO 300
220 IF I=11 PRINT "B",; GOTO 300
230 IF I=12 PRINT "C",; GOTO 300
240 IF I=13 PRINT "D",; GOTO 300
250 IF I=14 PRINT "E",; GOTO 300
260 IF I=15 PRINT "F",
300 NEXT X
310 PRINT
320 NEXT Y

動作している様子です。8秒です。さすが21世紀のマイコンは速いですね。

今回は動作させることを最優先にしたので機能を削るという乱暴な方法で実装しましたが、おそらくライブラリが余計なメモリを食っているような気がするので、開発環境を精査すれば16KBもあればフルセットで実装できると思います。

※追記(2023/6/30)

Serial関連のライブラリがかなりメモリを食ってる感じなのでそこを自分で書き直すのが良さそうかも。

※追記(2023/7/1)

メーカー推奨の開発環境MounRiver Studioだとフルセットでもオブジェクトサイズ9KB以下に収まりました。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

EX-80 (その3) 修理の巻

2022-12-20 19:20:59 | マイコン
EX-80を修理してみました。結構紆余曲折もあり、自分でも何をやったか忘れてしまいそうなので備忘録として記録を残しておきます。

まずは「LEDが点灯しない」という、症状がわかりやすいところから始めました。


回路図によると、コモン側は74155のパルスをバッファ経由でトランジスタ2SC1959に与えてドライブ、セグメント側は9368でドライブしています。セグメント側の信号は確認できたので、コモン側にプローブを継げて測定したところ、74155の信号は確認できましたが、トランジスタが動いていない様子。


試しにエミッタとコレクタを短絡させたら点灯しました。


トランジスタが4つとも壊れているというのは考えにくいのですが、半田付け時に全部壊してしまったということもありえなくはないです。とりあえず1つ外して調べてみましたが、正常っぽいです。ピンの順番はECB。


と、ここで違和感を感じて基板をよく見たところ、あれ?逆じゃない?


マニュアルで確認。


シルクがこんな感じなので、前後を間違って逆につけてしまうのもわからないでもないですが、ちゃんと確認しようよ。


逆にして載せたら点灯。


全部点きました。


しかしキー入力を受け付けません。リセットも効かない。LEDの表示がFFFF FFEFとかになります。キー入力のスキャン信号を見てみることにしました。


出てないなあ。


拡張ROMのソケットからアドレスバスを見てみます。


一応それっぽい波形が出ていて何かは動いているっぽい。(A0~A3)


次にリセット時の挙動を見てみます。


リセット時のアドレスバスが毎回違う。というか、リセットされていない?(A0~A2, RESET)


TMP9080をSBC8080に載せてみたらちゃんと動いたので、CPUは生きているようです。良かった。


CPU周辺を眺めていたところ、J1, J2のジャンパー線(どちらも未接続)が気になりました。


マニュアルで調べたら、接続しろって書いてありますけど!どういうこと?


継げたらリセット時に0000 0001 と表示されるようになりました。0000 0000 じゃないのが気になりますが、とりあえず進捗あり。


VRAMクリアのルーチンも動いているようで、TV画面もすっきりしたものが表示されるようになりました。


この段階での動作の様子がこれ。反応のあるキーはあるんだけどまともには動いていません。


初心に返って、マニュアルの「トラブル対策」を読んで確認します。1)→OK。2)→トランジスタが逆でした。3)→OK。4)→OK。5)→OK。6)→あやしい。いもハンダ多数あり。


半田付けはかなり汚い。僕が小学生の頃に組み立てたMK-80(TK-80互換機)もこんな感じだったな。気になるところを何箇所か半田付けし直してみました。


修正前の写真を撮り忘れたんだけど、PA1の信号線がLEDのトランジスタのベースにくっついてる箇所があって、これを修正したら1, 9, RET (PA1の信号線につながっているキー)を押したときにLEDが異常な点灯消灯をすることが無くなりました。(これって僕がトランジスタの向き直したときにやっちゃったのかなあ。)


しかしまだリセット時の挙動が不安定で、キー入力も効きません。ADALM2000をつなげてアドレスバスの動きを追ってみることにしました。


ADALM2000用のソフトScopyはかなり使いにくくてバグっぽい現象(parallelデコーダで9bit以上の数値が表示できない)もあり、やりたいことはほとんど出来ず。それっぽいアドレスでループしていることがわかった程度。


このあとマスクROMのbit化けを疑って、ダンプリストとマニュアルのリストを比べてみましたが化けているところはありませんでした。(これはかなりの徒労でした。。。)
アドレスバスとデータバスをトレースできるツールをTang NanoかTeensy 4.1あたりで作ろうかと思って、秋月に74LVC541(5V→3.3Vバッファ)を注文。届くまでやることが無いので、試しに8224, 9080, 8228を手持ちのNEC製のICに取り替えて試したところ、


動いちゃいました。えっ!?


動作の様子。


切り分けをしたら、どうやらクロックジェネレーターTDP8224が原因だった模様。


TV画面はこんな感じです。アドレスとデータがちゃんと表示されてるっぽい。
縞々が出ていますが、これはかなり明確な症状なので、調べればすぐに原因がわかりそう。


こちらはステップ動作時に表示される画面。メモリ値、レジスタ値、ニーモニックまで表示されているみたいです。モニターROMが1KBもあり、TK-80の384byteのモニターに比べるとかなり高機能っぽい。こういう情報が見れるのならステップ動作でデバッグもやり易そう。そういえばTK-80でステップ動作なんてさせたことは無かったなあ。


その後の調べでTDP8224をSBC8080に載せたらちゃんと動くので、何らかのマージンの問題とかの可能性あり。いずれにしてもTDP8224が完全に壊れているというわけではないのは良かったです。



今回は回路図とマニュアルに助けられました。マニュアルが無かったらJ1, J2のジャンパーのあたりで止まってたかも。一方、中途半端に動いていたので遠回りしてしまった感あり。全く動かないという状態ならアドレスバスとか調べないで最初にクロック回りを疑ってたかも。
次は縞々の修理かな。

【2022/12/20 17:00 追記】
シマシマ問題の調査をしようと思ってキャラジェネに下駄はかせたら直ってしまった。どういうこと? 単純な接触不良(ICとソケット間)とかだったってこと? でもカタカナの横には出てなかったからなあ。



以前の画面。カタカナの横には出てなかった。


【2022/12/20 19:200 追記】
TwitterでEX-80のリセット時の画面は白地に黒のはずとのリプライをいただいたので確認したところ、GNDの位置を間違えていたことが発覚。壊れなくて良かったです。これにより、同期がかなりシビアだった現象も解消。ちゃんと同期がとれるようになりました。


ここの抵抗の左側が全部GNDだと思いこんでいたので、この下の抵抗の足に継げていたのでした。





















コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

EX-80 (その2) Mask ROM TMM331AP

2022-12-15 11:15:43 | マイコン
EX-80の修理を始める前に、ROMの中身を確認しておくことにしました。
Toshiba TMM331AP、2k x 8 bitのマスクROMです。マニュアルによるとピン配置はこちら。


EPROMの2716とはピン配置が違うので、アダプタ的なものを作る必要があるかなあと思いながら、Retro Chip Tester Professionalのデーターベースを調べたところ、untested ではありますが supportedでした。すごい!


Intel 2316Aとコンパチなようです。


ちなみに、コモドールの2316というものもあり、そちらは2716とコンパチ。ややこしいです。


ありました。


3本の/CEはデフォルトで全部Lになっています。これはこのままでOK。


ちなみに、CEのパターンを自動検出するモードもあります。


OKボタン長押しでダンプします。


SDメモリに保存されました。


中身も大丈夫そうでした。


Chip Tester Pro にも2316という項目があるけど、Aが付いてないし、これはコモドールのやつ用な気がする。TMM331で試すのは嫌だったので、試しに2716を読ませたら読めているようでした。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Toshiba EX-80

2022-12-14 15:08:45 | マイコン
EX-80を入手しました。以前にマニュアルを入手していて、それに回路図やモニタプログラムのソースが記載されているので、そのうちクローンを作りたいと思っていたところなのですが、本物を入手できました。
CPUは8080の東芝版、TMP9080AC。金脚CerDIPです。その横にはシステムコントローラー8228の東芝版、TDP8228P。クロックジェネレーターも東芝版のTDP8224P。


その右側のTMM331APはモニタープログラムのマスクROM(2k x 8bit)、TMM314Pは1k x 4bitのRAM、2つで1kByteです。拡張用のソケットもあるし、こうして見るとEX-80はTK-80よりワンボードマイコンとしての規模は大きかったんですね。TVインターフェースも付いてるし。


その横にはI/Oポート8255の東芝版、TMP9555Cです。これも金脚のCerDIP。豪華です。


上の方に行くと、8251の東芝版、TMP9551C。USARTの通信用LSIです。


その横にあるホワイトセラミックのICはT3477A。これは見たことのないICなので調べてみたところ、EX-80用のキャラクタジェネレーターでした。大文字のアルファベット、数字、記号、カタカナの文字データが入っています。


もう1つ、RFモジュレータの下にあるのも見なれないIC。TC5003P。これは同期信号発生用(TV Sync Generator)とのことです。


とりあえず電源を入れてみました。電源は+5V, +12V, -5Vの3電源です。マニュアルには+5Vは2.5A以上とありましたが、まあ大丈夫だろうと思って2Aの電源を使用。1.27Aなのでまだ余裕あり。


残念ながら、電源を入れてもLEDは点灯せず。


しかし画面には何か出ているような気配。


同期を調整したら文字が出てました。

SW2(BIT/CHAR切り替え)をBIT側にしたらちゃんとピクセルになりました。VRAMからTV出力あたりの回路は正常に動いていそうです。


サーマルカメラの画像。LED周辺の温度が低いので、どこかで断線してるとかかなあ。しかし作業部屋の気温低すぎだな。


回路図付きのマニュアルという超強力なアイテムがあり、部品もほとんど標準ロジックなので、電卓の修理とかに比べると簡単そうではあります。


とりあえず今日はここまで。



コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする