突発的にPV-1000エミュが作りたくなったぞ日記 2006/6/23-24 EnriさんがPV-1000のカートリッジを解析された由。 なんでもPV-2000と殆ど同じで、一部コントロール信号が増えているだけとのこと。 だったらPV-2000をちょっと改造したら簡単に吸い出せそうだなあ、という訳で、 急遽私もPV-1000の解析に参戦することにしました。 PV-1000の本体も秋葉のスーパーポテトで確保してましたので、寝るのを中断して 早速ばらしてみました。 NEC D780C-1, NEC D4016C-2 7404,74S04,74LS05,74LS32,74LS74,74LS163 水晶は1789772 基板の裏面にNEC D65010G031…またNECかい(汗 …Z80+TMS9918とかだったら楽だったんやけどなあ。 カードエッジコネクタに出ている、バス制御のコントロール信号は以下の通り。 A15=MREQ A16=RD, B16=WR A17=IORQ 謎のD65010G031に内蔵されているという訳でないならば、本体側にはBIOSはないと 思ってもいいのかな? しかしまあ、ジャンパーケーブルだらけでえらい汚い基板です。 こんなんでは製造コストどうだったのだろう。 2006/6/24 ちょっと仮眠を取って、早速PV-2000の本体を改造。 Z-80のRDを引っ張ってきて、カードエッジコネクタのA16に繋いでやるだけです。 で、早速吸出し実験。 PV-2000にカートリッジを刺してやって、いつものビデオキャプチャ法を使って PCにデータを転送してやります。 ターピン、スーパーコブラについてはあっさり吸出し成功。 パチンコUFOはまったく吸い出せず。 実際は$000-$1fffなのに、PV-2000上では$8000-$9fffとなっているから、 カートリッジ側でAD14,15辺りをデコードしてて、それで読めないのかも。 PV-2000を更に改造するか、別途吸出し回路を作成するかは後日検討とします。 カートリッジも吸い出せましたので、例によってCPUとメモリだけ実装した エミュレータを作成して、CPUを回してみて、I/Oやメモリのアクセスログを 眺めてみます。 I/Oは$f8-$ffにOUT、$fc/$fdからIN。 用途はまだ不明。 $b800-$bfffがRAMの模様。載っているRAMがD4016C-2だから、容量的にはそれで いいっぽい。(D65010G031内にはメモリはない?) 出力内容を見ると、$b800-$bbffがテキスト画面、$bc00-$bfffがスプライトの パターン定義かな? 2006/6/25 >出力される内容を見ると、$b800-$bbffがテキスト画面、$bc00-$bfffがPCGか >スプライトのパターン定義かな? これの検証のため、取り敢えずPASOPIAからフォントROMを引っ張ってきて、 テキスト画面の描画処理を追加してみる。 ターピンで確認してみると、何となくタイトル画面やゲーム画面っぽいものが 映っているらしい。 しかしこれ、HIGH SCOREとかKONAMIとか、テキストとして表示されている個所も あれば、ゲーム画面の壁などグラフィックとして表示されるべき個所もあり。 …もしかして、スプライトじゃなくて多色PCGだったりしますか?(汗) PCG?部分をもうちょっと詳しく調査。 PCGのパターンは8byteで8x8、を更に4枚1組で使用することで多色PCGを実現して いるっぽい? vramのデータが$e0以上のとき、$bc00+(vram-$e0)*32から始まるパターンを4枚 重ねて表示、それが2枚目は赤色、4枚目は白色、なのかな? 取り敢えず、これでターピンのタイトル画面はちゃんと表示できる模様。 メインサイトにPV-1000のページを作成して、ここまでの作業結果のスクリーン ショットを何枚か貼って、今日はここまで。 2006/6/26 PCGのデータは、8bytes*4組で1枚。 最初の8bytesから順にATR?,R,G,Bで8色表示を実現しています。 $bc00-$bfffだと32パターンまでとなりますので、VRAM上のデータが$e0-$ffで ちょうど収まる枚数ですね。 ターピンのゲーム画面の壁の部分はVRAM上では$21-$26が入っていますが、 壁に相当するパターンがメモリに登録されている気配はなし。 もしかしてこれ、プリセットなパターンなのかもしれない。 ということで、フォントを多色フォントデータに拡張して、壁のパターンを 適当にでっちあげてみる。 ついでに、スーパーコブラのタイトル画面でも、$80-$89で水色の0-9が、 $8b,$8dで水色のH,Pが表示されるようなので、これも追加してみる。 一応これでターピンのゲーム画面がそれっぽく表示されるようになったけど、 本当にこれでいいのかしらん? 更に、ジョイスティックの読み込みまわりの解析。 OUT $FDは、ジョイスティックのカラム指定。 IN $FDは、ジョイスティックのステータス。 カラムのb0が1のとき、 b0=SELECT #1 b1=START #1 b2=SELECT #2 b3=START #2 カラムのb1が1のとき、 b0=DOWN #1 b1=RIGHT #1 b2=DOWN #2 b3=RIGHT #2 カラムのb2が1のとき、 b0=LEFT #1 b1=UP #1 b2=LEFT #2 b3=UP #2 カラムのb3が1のとき、 b0=TRIG1 #1 b1=TRIG2 #1 b2=TRIG1 #2 b3=TRIG2 #2 以上の実装で、ターピンがなんとなくプレイ出来るような、出来ないような。 折角なのでEnriさん向けに仮リリースしておきます。 しかし、自機や敵までテキストVRAMのPCGで動かすとは思いませんでした。 これ、本気でスプライトが存在していないのかしら。 現在の課題は$fcの値。 何かのステータスみたいなんだけど、BLANK? キー入力の更新フラグ? どれも微妙にしっくりこない。 今は255を常に返すようにしていますが、これだとスーパーコブラがタイトル画面の ままで先に進まなくなります。 2006/6/28 ROMカートリッジ内には確かにパターンデータが存在するのに、そのデータを VDPやRAMに転送する処理が見当たらない訳ですが。 まさか、VDPが直接ROMカートリッジ内のデータを参照して描画してるんじゃない だろうな?と急に無体なことを思いついてしまいまして、実験してみました。 …当りだったorz 一体どんなマシンなんだよこれ。 FCなんかもカートリッジ内のROMにBGのパターンが入ってますけど、プログラムの ROMとは別のバスに繋がっている訳で。 PV-1000の場合はプログラムとパターンが同じROMに入っていて、いったいCPUと VDPのバスマスタ権の調停ってどうなってるんだろう…