投稿

z80がリセットされない問題

イメージ
先日、Z80の動きをArduinoで見れるようにする装置というものを作りましたがあの装置に問題がありました。それは、CPUをリセットできないというものでして… ■CPUのリセットとはどういうことか  Z80やその他さまざまなCPUは、電源が入るとメモリの1番地、要は一番最初のデータから順番に読み込んでいきます。その命令をCPUの中にあるレジスタという記憶部分にしまったり、ジャンプ命令などでアドレスバスの出力やらデータの入出力を行います。そしてその途中でクロックを止めたり電源を切ったとしても、その時のデータがCPUの中に残っていると次に電源を入れた時に前回の途中から始めてしまうことがあるわけです。  そこでこのZ80にはRESET端子というものが備わっていて、この端子を0V(アクティブ状態、)にするとCPUの中のデータやらもろもろが初期状態に戻り、また一から作動できる・・・というようになっています。 が、 今回自分の作った回路では何回もRESET端子に入力しても信号がうまく伝わってくれません。これでは思うように実験ができない。そこで、腹をくくってZ80のマニュアルを読み直してみました。全部英語。日本語版がほしい…(´・ω・`) ■リセット信号とクロック入力  Z80のマニュアルを読んでみると、リセット信号をZ80が読み込んで理解し、リセットするにはリセット信号とは別で クロック信号を3クロック以上入力しなくてはならない ということが書いてありました。インターネット上には様々なZ80のピン配列や命令表はありますが、それは見かけなかったなぁ…(あ、でも某ホームページを隅から隅まで読めばきっと書いてあったかも…)  というわけで、もう一度今回はリセット信号をきちんと認識するかどうかのチェックだけなので簡単な実験装置を作りました。 RESET実験後に3Mhzの水晶発振器を取り付けました。 リセット信号は5Vラインにつながっている線をGNDにつなぐだけでいいので、動いているアドレス信号がまた0番地から始まれば成功というわけでして。リセット端子をアクティブモード(0V)にし、そのまま3クロック入力するとアドレス信号やM1信号などがすべて初期状態に戻りました。これでプログラムの実験などもまともにできるように!  やはり、説明書はきちんと読む...

arduinoでパラレルEEPROMリーダ・ライターもどきを作ってみた

イメージ
今回作ったマシンはこちら。相変わらずのスパゲッティ。 z80コンピューターを作るうえでSRAMとEEPROMは用意できましたが、肝心のプログラムをEEPROMに書き込まなくては自分の思うように動いてもらえません。しかし、UVEPROMにしろEEPROMにしろ書き込み装置はどうやら手ごろな値段で売ってはいないようなので「ひとまず何か書き込める装置をつくろう」と思いarduinoにやらせてみることにしました。  今回書き込むROMはAT28C256という32KBのEEPROMです。(UVタイプは書き直すのに殺菌灯とかいうおっそろしいものを使わないといけないそうなのでやめておきました。)  まず書き込み・読み込みアドレス指定のために74HC595を二つつないで16ビットアドレス書き込みを可能にます。データバス読み込みに74HC165、74HC595を使います。そして、ROMの読み込み・書き込みモード切替用に3本のピンを別で直接arduinoにつなぎます。(基本的に5Vのみで動かしており、アンペアの許容範囲を考えていないので下手をすると壊れてしまうかも…)  アドレスバスの指定はすべて入力のみなので特に問題はないのですが、データバスは入出力両方ともおこなうためこのままでは595から入力したデータが165に流れてしまいうまく書き込めない、または逆も起こってデータが読み込めないということが起こりえますというか起こりました。なので、書き込み側の回路にはLEDを整流ダイオードの代わりに挟み、読み込み側には1.5kΩの抵抗を挟むことによりこれを防止しています。(しかし完全ではないようで、時々書き込みに失敗します。) ■ROMを読み込む際の74HC165の処理 ROM内に書き込んだ内容を読み取る際には74HC165を使いますが、既存のarduinoにあるshiftin関数を使うと1ビット目を飛ばして読み込みを開始してしまうため、まず1ビット目を強制的に読み込むプログラムを作る必要がありましたが、 こちらのサイト のプログラムをベースに最下位ビットから順番に読み込むプログラムを作成しました。(大変参考になるサイトで、今回の計画もこのサイトがなければもっと難しいものになったと思います。)読み込んだビットを変数の中に書き込む方法としては、「ビット演算子」を使...

74HC595を使ってarduinoの16ビットパラレル出力に挑んでみた

イメージ
今回の実験台、74HC595さんです。 前回、EEPROMとSRAMを手に入れたお話をしましたがこのICを使うには中にデータを書き込まないといけません。となると、各ピンにそれぞれデータを送らないといけないのでarduino unoさんではピンが足りません。  そこで、この74HC595というICを使うと本来一本一本つながないといけないところが3本で済み、しかもIC同士をつなげることによって8ピン出力から16、24と増やしていけるそうなので、これだと思い手を出してみたのですが予想どおりになかなか動いてくれなかったのでその動くまでとどうしたら動かせるのかを記載しておきたいと思います。 ■74HC595とはどういったICなのか  まず 74HC595の取扱説明書 を見てみますと、「8ビットのシリアル入力データをパラレル出力にする」と書いてあります。つまり、一本のピンから出力された例えば「00110100」というデータを各ピンに数字を一個ずつ(0か1か、つまりONかOFFか)割り当てる機能を持っているということで、1ビットずつ読み込んでいったデータを並べて一気に出力してくれるというわけです。まさに今の状況にうってつけです。  アドレスバスはz80の最大本数16本でも、このICを二つ使えば事足りるというわけ。(データバスは別ですが・・・)  また、このICは出力のみなのでもしz80のアドレスデータをarduinoに読み込むのであれば別の読み込み用のパラレル⇒シリアルICを用意しなくてはなりません。それでも、IC同士をつなげることができるので3本で事足りるというわけなのですが…ここが曲者でした。 ■74HC595のピンの役割 Texas Instruments社のデータシート より74HC595のピン配置 上の画像はこの74HC595のピン配置図なのですが、Vccは5V電源をつなぐ部分、GNDは電源のマイナス部分につなぐところです。そしてQA~QHがそれぞれA0(アドレスバスPIN1番)~A7(アドレスバスPIN7番)になります。それ以外のピンの役割についてはこのようになっています。 SRCLK  : クロック信号入力ピン。1ビット読み込むごとに、このピンの HIGH 、 LOW を切り替える。 RCLK  : ラッチ動...

arduinoにz80の疑似ROMとRAMを担当させてみようとしたら、DIPタイプのパラレルSRAMとEEPROMを入手したお話

イメージ
右の本、超良書です。 前回、クロック入力と電源をarduinoにさせることによってz80の動作を見ることができる装置を作りましたが、あのままでは単純に「動くところ」だけしか見ることができません。そこで、まだ余っているarduinoのピンにメモリアドレスのピンと、アドレスバスのピンをつなげようとしたのですが、 ピンがどうやっても足りません。(見ればわかるか・・・) そこでひとまず余っているアナログピンを(たったの三本!)arduinoとつないであげます。3本しかないので、A0~A2の3ビット、つまりアドレスの7番地までしか確保できません。 まあすごく短いプログラムなら何とかなるだろうと考え、 こちらのサイト を参考にしまして、実行したい命令を見よう見まねでハンドアセンブルしようとしたのですが、何が何だかわかりませんでした。 そこでひとまず意味の分かるアセンブラ命令を機械語と配置まで決めてくれるソフトを探していたのですが、みんな古くて今のパソコンで動いてくれません。なので、開発ソフトはないのかと探していたらもろもろを解決してくれる最高のサイトを見つけました。 アセンブラでソフトを開発しよう というサイトです。 本当に助かりました。このなかに古いウインドウズをエミュレートする部分があるのですが、そのexeファイルをコンパイラとかの入っているフォルダに入れるのを忘れないでください。動きませんから。 さて、いざ書いたプログラムも本当に動いているのか確かめたいけど、まずはこのPC6001エミュレーターとやらの使い方をわからないといけない。それはちょっとしんどいです。すごく面白そうだし、そちらにはまってしまって抜け出せない可能性もあるし。 と、ここでとあるサイトのことを思い出しました。TK80というコンピューターが昔あったのですがそのコンピューターをWEB上で再現してしまったというものです。それが こちら 。すごい人がいるんですね…。こうなってみたいものです。 それから、操作方法は こちらのサイト と、 こちらの動画 を見ていただくとお分かりいただけると思います。 では、これをどうするかというと、先ほどのアセンブラソフトで出力された16進数を指定された番地にエミュレーター上で書き込んでいって、実行。その結果が思い通りだったらプログラミングは成...

Z80はどう動いているのか見れる装置をarduinoで作ってみた

イメージ
このかたちのIC が一番好き。 z80といえば、かつて様々なマイコンに搭載されたことで有名なCPUですが、これいまでも秋葉原でふつうに(2017年現在)ラジオデパートで買うことができるんです。ついでにUVEPROM?も売ってるし、mc68000も売っているので、せっかくならと一つ買ってみました。  今回入手したのは、TOSHIBAのTMPZ84C00AP-6というものです。DIPようなので、ボードの上で簡単に実験することができます。と言っても、今回の目的は 「とにかくCPUってどう動いてるのかを見る」 なので、データバスやアドレスバスがどんな信号を出しているのかを見れるようにするのが目的です。そこで、手動クロックで操作できるようにしたいのですがただボタンをつなげただけではチャタリングというのが発生して1クロックずつ動いてくれないらしいのです。じゃあその信号をarduinoから出したらいいのでは?と考えまして、デジタルピンと5V供給ピン、CLKピン、GNDをつなぎましたが・・・ いざ電源投入 動かない。なんで?データバスにつなげたLEDが反応しない。ひとまずグーグルでピン配列についてもう一度確認すると、どうやらいくつかのピンに電圧をかけてあげないとz80は周辺機器待ちとなって動かないようです。そんなことになってるんだ。すごい。 というわけで、HALTやらWAITやらのピンを入力が必要なものは入力し、出力されるものの先にはLEDをつないであげました。(これ、逆流防止にもなって結構いいかも。) そんなこんなで出来上がったのがこちら。 LEDがひたすらぴかぴか光ります。 PCとはシリアル通信で、クロックの自動入力モードと、半クロックづつ入力できるモードとを切り替えたり、0011010というメモリだけ入力できるようにした回路と、電源を管理できるようにしております。また、シリアルモニタでM1ピンの動きを監視し、手動ですが任意のタイミングでメモリを入力できます。(1byteのみですが。) 詳しい方に見てもらったら怒られそうなモノになりましたが、いまCPUがなにをしているのか手に取るようにわかるので見ていて飽きません。クロックの速さも自由自在ですし。 ただ、arduin unoではピン数が足りなくて...

ファミコンのAV改造に挑んでみた

イメージ
技術の進歩ってすごい。 先日ミニファミコンが発売され大いに賑わいましたが、 https://www.amazon.co.jp/dp/B01M1VMFUA/ref=cm_sw_r_cp_awdb_mHyHybXSAMM31 このミニファミコンどうやら中に30本入っていてそれしか遊べない仕様になっていると聞き 「それじゃあこれと同じぐらいの金額で実機で遊んだほうがいいじゃんというか実機の紅白ファミコンで遊びたい」 と考えまして早速行きつけのジャンク屋さんでファミコンを買ってまいりました。 やっぱりこれでしょ。  んでもってインターネットで調べるとやはりというか様々な方が改造に挑戦しております。配線図も載っていたので、一番簡単なやつをモデルに作ってみました。 ひとまずファミコンをバラすと中はこんな感じになってます。 意外とシンプルな内部構造。でもロマンにあふれてる( `ー´)ノ アクセスするのはこっちではなくこの裏側なんですけどね。真ん中に大きなicが二つあります。これがあの有名なapple2にも載っていたMOS6502のカスタムチップです。もう一つはグラフィックを処理しているCPUかな?いずれにしろ、あのMacintoshの基板に比べたら雲泥の差ですね… こちら1984に発売されたmacintosh128kの基板。ファミコンから1年後に発売されたんですね。 画像はWikipedia(https://ja.wikipedia.org/wiki/Macintosh_128K)より。  それはおいといて、さっそく改造していきます。今回自分が手に入れたタイプはRF出力回路がむき出しだったため初期型だったようです。なのでけっこう回路図が公開されていました。やったね。なので、そこは省略させていただきまして…出来上がったのがこちら。 なんかおかしいとおもったそこのあなた。そうです。これ、一人専用になってしまっているんです。というのも穴をあけるのに力尽きてしまい、中途半端なところでストップしております。とほほ。 試しにDQ2をプレイ。今やっても面白いです。 まあでもなかなかいい画質で出力されてますし、結果オーライってことで。

Macintosh Plusを起動せよ その6

イメージ
お久しぶりです。いつの間にか年を越していて驚きました。 前回、MOから起動できるのでは?と考えたもののどうすればこのMOディスクが起動ディスクになるのかわかりません。すると、フォロワーさんで非常にレトロマックに詳しい方が「Silverlining6でディスクをフォーマットし、SCSIケーブルの40番をカットしてリセット信号が出ないようにすればいい」ということを教えてもらいまして、無事にMOより起動することができました( `ー´)ノ こうなってくると人間いろいろ欲が出てくるもので、MOの容量は230MBしかないのですが使っているパソコンはもともと800kbのフロッピーで動かせるぐらいのものですから、(しかももう発売されてから30年は立っている代物。)それまでの容量とは比べ物にならない広大な記憶容量を手に入れたわけです。フロッピー起動ではきつかったものでもすべてMOにインストールしてしまえば扱いもかんたんというわけでして。 ひとまず起動OSを日本語のものに変えようと思い立ち、(試しに入れたものが英語OSだった)いろいろといじっていましたら… 人人人人人人 <ボンッ!!!!> VVVVVVVVVV という音とともにMOドライブが停止!部屋中に焦げ臭いにおいが…。 慌てて電源を引き抜くも、すでに時遅し。電源部分のどこかの部品がお釈迦になられたようです。せっかく起動が安定して、これからいろいろできるところだったのに。  とにかくどこがイカれたのかあのプラスチックの燃えたような独特のにおいをたどると、やはり電源部分がおかしくなったようです。 さらによく見てみると、はじっこにある変な黒いチップのようなものから白い粉が噴き出ています。 どうやら電源が入らなくなったのはこの部品のためのようです。しかしこれなんだ?ヒューズだったらガラス管の中に入っているはず…と思案に暮れて基板を眺めていると、問題の部品の横に「F1 2A 125V」の文字。まさかこれのFって文字はヒューズを表しているのか!と気が付いたものの、確信が持てずに悶々としていた私は何を血迷ったのかG3の電源ユニットとMOドライブを無理やりつないで(電気を拝借して)つないでしまったんです。 最初はうまく起動しましたが、だんだん様子がおかしくなって、最後にケーブル同士がショートを起こして...