突発的に、楽がきエミュを作ってみようの日記 2004/8/10 MAXLOADでPV-2000を買ってしまったので、突発的に楽がきエミュの開発を決定。 謎日記シリーズも、EmuZ-2500, CP/M Player, Emu5に続いて、これで4つ目。 uonesterも合せると、5つ目のエミュレータということになる。 取り敢えず、Enri氏の解析結果を参考に、一通り実装。 Emu5で部品は全て揃っているので、基本的にはメモリマップとI/Oマップを修正 してやるだけ。 IRQは、取り敢えずTMS9918Aから直結されていると仮定する。 後はROMの吸出しが完了してから、IRQ/NMIやキーボード周りの解析をしよう。 2004/8/11 ROMの吸出しの方法を検討。 プリンタポートやシリアルポートが標準で付いていないので、別の方法で PC側にデータを送信する必要がある。 カートリッジのコネクタに、0xc000-0xffffをアクセスするとLになる/CS2が 出ている(カートリッジのROMの/CE用)ので、これをトリガにしてアドレスバスの A0-A4をDFFにラッチするような回路を作成する。 例えば、DMY=PEEK(&HC000+DATA)とすると、DATAがDFFにラッチされる。 これを5bitのパラレル出力として使用する。 PC側は、パラレルポートのステータス信号として、この5bitを受け取る。 (敢えて双方向モードは使用しない) 回路としては、A0-A4を74HC273で記憶するだけ。 273はクロックの立上がりで記憶するので、/CS2にNOTを噛ましておいて、 /CS2の立下りで記憶するようにする。 問題点として、IPLが勝手に0xc000-0xffffの領域にアクセスしにいくようなことが あると、予期せぬデータが出力されてしまうことになる。 この辺りは、実験してみないことには何とも言えない。 カートリッジの吸出しについては、m5のmoriyaさん方式を採用。 カードエッジコネクタからA0-A13, D0-D7, /CS2, VCC, GNDを取り出して、 適当な16KBのEP-ROMのピン配列にあわせてピンヘッダに接続。 これをROMライタにセットして吸い出すだけ。 2004/8/16 帰省先から帰還する際に、秋葉に寄って部品の買出し。 2.54mmピッチのカードエッジが付いた基板が、店頭から無くなっていることに驚く。 ラジオセンターもラジオ会館も千石さんも全滅。(秋月さんや鈴商さんはお休み) 数年前までは、普通に置いてあったような気がするんだけど。 仕方が無い、千石さんで買ったISAの生基板を、Pカッターで切断して使用しよう。 しかし3000円以上とは、ちと高いなあ。 で、74HC273を買うつもりで、何故か間違えて74HC373を買ってきてしまう。 あかんやん。 2004/8/18 必要な部品を通販で発注。 当たり前だけど、代引+送料の方が圧倒的に高い。うむう。 部品が届いたらすぐ実験できるように、今から半田付けだけは済ませておこう。 2004/8/19 部品が届いた・・・んだけど、74HC273を注文したのに74HC237が届いている。 クレームのメールを入れて、エスプガルーダをプレイしてから不貞寝。 2004/8/21 部品が届いたので実験。 回路自体は動いてるんだけど、ノイズ対策をしていないので、馬鹿にならない 率でデータが化けてしまう。 幸いデータの取りこぼしはないようなので、データを3回送信して、多数決で 補正をするように。 正常にデータが吸い出せたようなので、早速実行。 そのままだと画面が出ないんだけど、NMIを2回発生させたら、BASICの起動 メニューが出るところまではきた。 うむ、第一歩。 2004/8/22 割り込み周りの実装。 取り敢えず、NMIは毎フレーム、INTは6フレームに1回発生させることで、 I/Oのログを見る限りではキーを連続的に読みにくるように。 しかし、何故か画面に出力されないので調べてみると、どうも最初の1回目の INTが終了していないらしい。 よくよく調べてみると、INTの返りにRETIを使わずにRETを使っている模様。 仮想マシンはRETIが来ないと次のINTを受け付けない実装になっているので、 CPU内でCALLの階層を調べて、INTに対するRETが発生したらRETI扱いと することに。 これで、まともにキー操作できるようになった模様。 詳しいことは、後日実機をばらして調査することにする。 キーボード周り。 エミュレータ上でトライ&エラーでキーマップを調べてやる。 取り敢えず、これだけでBASICを使う分には問題なさげ。 カートリッジの吸出しをしていないから確認していないけど、多分対応 できているのではないかと思う。 という訳で、公開開始。HPC/PPC版はまた後日。 2004/8/25 フルスクリーンサポート。 HPC2000/PPC2002サポート。 やり慣れた作業なんで、特筆するような事はないです。 2005/4/2-3 eRX-78で確立したビデオキャプチャを利用したデータ吸出し手法を、PV-2000でも 試してみました。 但し、カートリッジを挿入するとそちらのソフトが起動してしまうので、BASICが 起動してからカートリッジを挿入するという、ちょっと無茶をしています。 動作確認してみましたが、ものによってはタイトル画面が出る程度。 割り込み周りなど、エミュレータ側の実装の問題が原因っぽい。 2005/4/4 eRX-78のソースをベースに、再実装を行いました。 新しいスケルトンに具体的な処理を貼り付けてやるだけなので、割とさっくり。 m5の方も、いずれ同様に再実装したいところ。 NMIについては、従来では1フレームごとに強制的に発生させていましたが、 TMS9918のINTによって駆動するように変更しました。 TMS9918の設定によって、NMIを停止することができるようになります。 キーボード周りのINTについては、Enriさんのご指摘通り、$20のINT許可フラグを 実装しています。 が、やっぱりキーを連続入力したときの動作に問題があるようです。 まあ、実機のキーボードがあんなだからなあ。 ANKキーについては、キーが押されたら他のキーを無効にする処理か必要かも。 割り込み周りの修正でロックンロープが動作するようになりましたが、ミスター パックンはタイトル画面の表示および敵の挙動がおかしい、スーパーコブラは敵が 出現する辺りで暴走、パチンコUFOは全く起動せず。 2005/4/7 起動しないソフトについて色々処理を追っかけた結果、どうやら吸出しミスが あった模様。ぐんにょり。 データレコーダの実装で苦戦中です。 $60のbit0がシグナルの入出力っぽいのですが、時間を計りながらon/offすることで 波形を出力とか、bit0の状態が変化する時間を計ってパルス幅を取得するとか、 どうもそういう処理ではない模様。 $60のbit1が立つのを待っている処理があるので、ハードウェアで波形の入出力を 行って、そのready信号としてbit1を使用しているのかも。 でも、300bpsか1200bpsか判定して、CPUを空回しする処理も存在するし。うーん。 2005/5/20 途中でX-07に浮気したりしながら、漸くデータレコーダをサポートしました。 結局、wavで入出力するのではなく、$60のbit0の入出力をそのままbit列として 保存、読み込みするようにしています。 データレコーダ駆動中はCPUをフル回転しますので、セーブ、ロードは一瞬です。 1byteを入出力するルーチンがIPL内に存在するのですが、出力時と入力時で 1bitずれるみたいで、出力時は0, bit0-7, parity, 1, 1なのに対して、入力時は 1,0,bit0-7,parity,1として扱っています。 出力時は1byte出力ルーチンで全部セーブするのですが、入力時は何故か60bitの ヘッダの次の1byteだけ1bit入力ルーチンでロード、このとき1bitずれるようです。 最初は1byte入出力ルーチンで仮想I/Oを叩くようにして、byte単位で記録する ようにするつもりだったのですが、この辺の兼ね合いで断念しました。 最終的に、IPLにパッチを当てずに、I/Oの実装だけでサポートできてよかったです。 あとは実機のテープを取り込んだものをどのように変換するかですが。 手元に実機のテープがないのでこれは保留とします。 キーを連続して押したときに、前に押したキーが複数個入力されてしまう問題。 これは、win32側でkeydownが発生したときに、割り込みを発生させるように vmに通知しているのですが、このとき前のキーがリリースされていないと、 IPL内の割り込み処理でキーマトリックスを検索して、先に前のキーを拾ってしまう ことが原因ではないかと思われます。 これについては、win32側で対応します。 if((0x30 <= code && code <= 0x5a) || (0xba <= code && code <= 0xe2)) { _memset(key_status + 0x30, 0, 0x5a - 0x30 + 1); _memset(key_status + 0xba, 0, 0xe2 - 0xba + 1); } key_status[code] = 0x80; if(!(0x9 <= code && code <=0x11)) vm->key_down(); こんな感じで、キーが押されると前のキーを強制的にリリースされたことにする、 またシフトキーなどは押されても通知しない、とすることで一応スムーズに キー入力ができるようになりました。 ついでに、BackSpaceを左ボタンに割り当てるように変更しています。 後はROMの吸出し方法の確立をして、PV-2000の開発はクローズの予定です。