投稿

ラベル(z80)が付いた投稿を表示しています

MZ80を起動せよ!画面バッファを利用した高速書き換えプログラム

イメージ
古いPCやゲーム機のプログラミングをしていると、その描画速度の遅さに四苦八苦することが度々あります。今回のMZ80もそうで、BASICで素直に描画するととんでもなく遅く、お話になりません。 そこで、アセンブラで描画処理の部分を描いてしまえばあとはどうにでもなるのでは?というかエミュレーターでテストできるならアセンブラでガリガリ書けば速度なんとかなるのでは? (MZ80のすごいところは、描画中にメモリアクセスのウェイトをかけていないことです。映像は乱れますが、強引かつ高速に描画を繰り返すことが可能です。) そう考えた結果、潤沢?なメモリを搭載しているMZ80のシステムを利用し、フレームバッファを用意して、スプライト画面・背景画面を合成、描画メモリへ転送するシステムを設計してみました。 メモリ転送とアドレス管理の考察 ■|そもそもMZ80はどうやってテキストを描画しているのか 上記の漫画にも記載したように、MZ80にはz80のメモリエリア上に画面に表示するテキストバッファが割り当てられている設計となっております。 そのメモリエリアはD000h~D3E7hまでの1000byteとなっております。 というのも、表示できる文字数が横に40文字、縦に25行となっているためですね。 そのため、疑似ドットグラフィックはこの2倍の(1文字に2ドット分配置されているため)縦50ドットx横80ドットの解像度として絵を表示することができるのです。 そして今のPCのようにラスターフォントで表示しているのではなく、VRAMには画面に表示するフォントのコードを書き込んでおります。そのため、任意のフォントグラフィックに書き換えて表示するといったような機能は搭載されておりません。  VRAMに書き込まれた文字コードがそのままグラフィックを記録しているROMにアドレスとして読み込まれ、フォントデータが出力される仕組みになっております。  そのため、搭載されているフォントグラフィックROMを差し替えれば、任意の文字グラフィックスに差し替えることが可能です。 ■|書き換え速度の問題と、VRAM転送問題  ゲームを作るうえでカギになるのはこの描画速度です。例えば、PRINT文で書き換えた場合は必ず1Fで1回しか処理されないため、描画速度がどうしても遅くなります。 ましてや、スクロール画面などの画面全体を書き...

MZ80を起動せよ!公式BASICを読みこませてみた結果

イメージ
前回、なんかカセットテープの調子が悪いということで終わりました。 MZ80を起動せよ!モニター修理というか交換しました 読み込まないのはなんで?テープ?回路?コンデンサ?ICの故障? とまあさっぱりわからなくなり、ついに秋葉原のBEEPに飛び込んで相談してきました。 んでちょっと怖い整備係のおじさんにカセットの互換性、在庫状況を尋ねたところ… 1)基本、mz80系でmz700系のカセットテーププログラムは動かない。 2)ここ1~2年、店頭でmz80系のソフトは出ていない。本体も入荷していない。 (ガラスケースの上に鎮座していますが、あれは展示用でしょう。そうであってほしい。) という回答を頂いたため、その時よく出回っていたmz700系のテープを使用することは断念。次に試すのは、MZ-80実機で使用できるという「KM-Z80 BASIC」というもの。 こちら、プログラム的には完全互換を達成しているそうなので、あとはテープに焼いて動けば成功、というわけです。 【KM-Z80をカセットテープに焼いてみる】 というわけでさっそくデータをカセットテープに書き込みたいと思ったのですが、まず焼き込むにはこれをwavデータ、つまり音データにしないといけないのです。 カセットテープに焼き込む まあ音データなんだしカセットに書き込めばいいんでしょカセットデッキ使用してやれば簡単じゃんとか雑なこと考えてテープに録音し、起動させ、モニタコマンドにLOADと打ち込みますが…認識しません! 反応すらしません。理由としてはMZやSharp X1に使用された、特殊なカセットデッキが原因であることは容易に想像がつきます。そのため、カセットデッキの裏の回路に直接電極をつないでPCから音声を再生、8255のピンから正しい信号が出ていることを確認しましたが、やはり認識しませんでした… ちなみに、基板に直接電極をつないで入力をしてみましたが反応せず… 【公式BASICを入手し読み込ませることに】 本来、修理を行うのであれば必ず公式のモノが動くか確認する必要があるのですが、まあ今回それをすっ飛ばしてあたふたしていたのでこれではだめだとホンモノを入手しました 。 それがこちら。ジャンク品ということで出品されていましたが、そもそも出回っているかどうかも怪しいレベルで貴重品...

MZ-80を起動せよ その1 ジャンクなあいつがやってきた

イメージ
お久しぶりの更新でございます。今回新しくというか何を血迷ったのか一体型PCを入手しました。それがこちら。 今回の 犠牲者 患者。 MZ-80K2C 状態はいいようで最悪。見たことない状態の症状が出ています。しかしメモリはフル実装、テープレコーダはゴムまできちんと残っているという奇跡の状態。キーの入力もきちんと取得しているようで、つぶれている画面にはかすかに文字が入力されているようなもので確認できました。 この2段組みメモリがいい。 そして問題のこの症状。 twitterにてこの状態であることを伝えると、多くの方からMZ80についての情報をいただくことができましたが、その中で非常に気になるコメントが。 「偏向ヨークが壊れているため、ブラウン管ごと交換が必要である」 それもう魅力半減やん。 衝撃的な一言です。つまり修理不可能ということを告げられショックに打ちのめされていたところに、もう一つ情報が伝えられます。 「ヨークコイルがそんな簡単に壊れるはずがない。壊れているのは垂直偏向回路」 もはや専門用語のお祭りで何が何だかわかりません。詳しく調べてみると、ブラウン管には根元にコイルが巻き付けてあり、このコイルが映像を表示する光のビームを曲げることにより映像を映し出している、ということだそうです。わかりやすいのがオシロスコープ。古いオシロスコープを開けると中にはブラウン管が入っており、そこにコイルが巻いてあります。そこに波形信号を与えることにより信号を目に見えるようにしているのです。昔理科の実験で電子の動きを見る装置に磁石を近づけると中のビームが曲がるというのがありましたが、あの仕組みを使っているようです。 つまるところ、この写真のように横一線になっているのは縦に光の線を揺らす回路が壊れて、ビームが曲がらずこのようになる、ということのようです。 そこで垂直偏向回路がだめ、という指摘をくださった方に回路図をお見せしてどこがだめかと尋ねたところ、問題の部分にあるicとトランジスタの交換の型番などを教えていただきましてさっそく修理に挑戦です。 ■|感電しながら修理に挑戦。まずはコンデンサの交換から こういう古い機械はまずコンデンサはダメになっているものです。今はないコンデンサを専門に扱っていたお店のおっちゃん曰く、 ...

パラレルEEPROMプログラマ(arduinoで使用)を作成してみた その2

イメージ
arduinoでパラレルEEPROMリーダ・ライターもどきを作ってみた  前回(上のリンクから読めます)、ブレッドボード上で作成したEEPROMプログラマ。書き込みが不安定なのと、広範囲をリセットしたり、読み込みをするのによくトラブルが頻発しました。今回作ったのもところどころバグが発生してしまう(書き損じが起こる、途中で止まるなど)症状があるのですが、ブレッドボード上という不安定な環境からユニバーサル基板の上にきちんと組みなおし、本格的な使用用途に耐えられるようにしました。(しかしプログラムがまだ不完全で、大規模なデータ書き込みは非常に手間であります。どうしたものか・・・) 外見はこんな感じです。  一見シンプルで単純に見えます。確かに構造はびっくりするほどシンプルなので回路図を書かずとも作れるという。しかし相手はパラレル構造なので配線は地獄を見ます。 書き込みにはArduinoのシリアルモニターからコマンド入力で操作します。 ■単純につないではいけない?信号判定と電圧降下  また、今回整流ダイオードの代わりにLEDを使用したんです。そしたら動いてるところもばっちり見えて楽しいだろうなと考えまして。(誤作動していても目で見てわかりますし。)  そしたら、「 電圧降下 」というものが発生することを初めて知りました。これ何なのかといいますと、ある一定のものを回路の間に挟むと その挟んだものの抵抗 によって電圧がどんどん下がるというもの。ケーブルもその仲間に入るので、取り回しを長くしてしまうとどんどん電圧が下がるわけですね。もちろんLEDだって抵抗はあるので、その現象はばっちり起こります。そのため最初LEDを間に挟んでROMから出力された信号を74HC165で受け取る際にトラブルが起こるわけです。今回のライターでROMからデータを出力すると、大体4V~3.6Vほどの電圧で出力されました。そこでもって74HC165のHIGHと判定する電圧の高さは3.4Vほど。あれ?クリアしてるじゃんと思うのですが、この二つの間にLEDを挟むと2.4Vまで電圧が下がるんですよ。そうなると165側ではLOWと判定されてしまいせっかくのHIGHやLOWの信号はすべてLOWと読み取られてしまうんですね。じゃあLEDをつなぐことはできないのかというとそうではなくて、真ん...

SRAMにDIPで直接データを書き込む装置をarduinoを使って作ってみた

イメージ
今回も今回でスパゲッティ。 ちなみに横のZ80にはワイヤーが足りず繋げませんでした(´・ω・`) 先日、EEPROMにデータを書き込む装置をArduinoで作りましたが、まだROMをつないであれこれできるほどZ80について理解しているわけではありませんし、どんどんプログラムを書き込んでは実験して…というのを繰り返すにはあの装置は(主にワイヤーが邪魔で)非常に不便です。そんな時、SRAMに毎回DIPで書き込んでそのたびに実験するという装置をyoutubeで見かけたのでこれだと思い作ってみたのですが、思ったように書き込むまで手間取ったのでメモがてら装置について説明しようと思います。 ■SRAMに書き込む動作と読み出す動作  SRAMに書き込む動作はROMに比べれば非常にシンプルです。まず、今回使ったSRAMの TC55257DPL-85L のピン配列を見てみます。 DIPtypeのピン配列。 この中で動作切り替えに使うのはCE、OE、R/Wのたった3ピン。各ピンの機能は、 CE : SRAMを使用可能か否かを切り替える。 OE : SRAMからデータを読み出す R/W : 読み出し・書き出しをコントロールする。クロックに近い? といった感じになっています。ちなみにI/Oはデータバスで、Aがアドレスバスを指しています。+5V駆動なので、Arduinoの5Vピンにつなげば動かせるという手軽さ。ステキ!  では、データを書き込むときにはこれらのピンをどういう風に動かせばいいかといいますと、 アドレスピンにアドレスデータを入力 OEピンはHIGH(動かさない)に CEピンをLOWにし、SRAMを起動する R/WをLOWにし、データを受け付ける状態に I/Oピンにデータを出力(ここでデータが書き込まれる) CEピンをHIGHにし、SRAMを止める R/WをHIGHに I/Oへのデータ出力をOFF アドレスピンへの出力をOFF といった手順で書き込めるようです。EEPROMと大きく違うところは、データを書き込んでいる間もアドレスバスからの出力をやめないというところでしょうか。  では、読み出しはどうするかというと アドレスピンにアドレスデータを出力 R/WピンをHIGHに CEピンを...

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に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ではピン数が足りなくて...