Super Cassette Visionエミュ、完成するといいなあ日記 2005/11/2 某スレッドで、実機が手に入ったらやってみたいなあ、とか書いてたら、 駿河屋で在庫が見つかってしまったので、結局手を出すことになってしまいました。 こちらは暫く忙しくて何も出来ずにいたのですが、同時期に解析を開始された Enriさんが、もう物凄い勢いで解析進められてまして。 このままでは話題においていかれそうなので、急遽作業を進めることにしました。 取り敢えず、簡単なところでディスアセンブラの開発から。 Enriさんと333さんがuPD7801のニーモニックの調査を進められてますので、 せめてお手伝いでも、ということで。 2005/11/3 休日で纏まった時間が取れましたので、吸出し回路を作成。 YPRIO-1という、プリンタポートを使用したI/Oボードが手元にありますので、 これを使用することにします。 やっていることは単純で、データバスにIN/OUT各8bitを接続、OUT 8bitで RD,WR, 74HC4040*2のRESET,CLOCKを駆動するだけです。 カードエッジコネクタが丁度よいピン数のものがなかったので、4ピン多い ものを使用しています。 カートリッジ挿すときは、特に注意しないと危険ですね。 テスタで配線確認はしていますが、実際の吸出し試験はまだ手付かず。 後は、自作プログラムを実機で動作させるために、SRAMカートリッジを作成しないと いけないですね。 CPU内蔵ROMを吸い出すためには、どうしても自作プログラムを走らせないと。 2005/11/4-5 吸出し実験。 吸出しプログラムの方は、アドレスやデータバスの配線が順番通りでないのを 補正すること以外は特になし。 別段戸惑うようなこともなく、あっさり成功しました。 手持ちのソフトを片っ端から吸い出してやります。 2005/11/6 注文していたベーシック入門が届いたので、マニュアルを読んでみました。 こんなでも一応PEEK関数が用意されていますから、RX-78とかPV-2000の要領で 吸い出すことも可能っぽいですね。 で、BASIC上でダンププログラムを作ってみたのですが・・・ 操作性めたくそ悪っ。 この上でコーディングするのって、ものすげえ苦行なんですが。 IF-THENはあってもIF-THEN-ELSEがないのも不便。 それでも一応吸いだし完了。 チェックサムもあっているようですね。 2005/11/15-16 以前吸い出したソフトのうち、幾つか正しく吸い出せていない臭いので、 吸出しソフトに簡単にエラーチェックの仕組みを追加して、再吸出し。 スカイキッドとポールポジション2だけ、どうしても化けるなあ・・・ 端子が磨り減りきっているし、実機に挿しても中々認識してくれないし、 まあ仕方がないですね。 後日、入手できるようであればもう1本購入するとしますか。 2005/11/16 IC collectionの小松様のご好意により、UPD7801の資料を頂戴しました。 本当に有難う御座います。 資料を読んでみると、結構勘違いしていた箇所が多いのに驚いています。 2005/11/17-19 頂いた資料の整理。 命令表の作成と、それを元にした完全な逆アセンブラの作成。 命令表を作成するのにテキストでは不便なので、OpenOfficeをインストールして エクセル形式で作成することに。 平行して、エミュレータ自体のソースを殴り書きし始めています。 CPU以外の仕様については、Enriさん、333さんの解析内容を全面的に 頼らせていただいています。多謝、多謝。 2005/11/20 ベーシック入門で表示した文字一覧を参考にして、フォントを作成しました。 ドット単位で見ると細かい違いはあるかと思いますが、大体似たような フォントにはなっているかと。 2005/11/21-22 大体のソースが揃ってきましたので、取り敢えずビルドが通る形に整理しました。 描画はテキスト画面のみですが、一部のゲームについてはタイトル画面っぽい ものが表示されるようになっています。 とにもかくにも、CPUが回り始めました。 いやっほー。 処理を追いかけていて気になったのが、いかのような処理。 多分VSYNC待ちか何かだと思うのですが・・・ MKって読み込み時はINT状態の取得にも使えるんですかねえ、うーん。 9f4 64,db,20 d. offi mk,20h 9f7 fc . jr 9f4h 9f8 64,cb,20 d. oni mk,20h 9fb fc . jr 9f8h 9fc 8 . ret 2005/11/22-24 MKのb5の件は、Enriさんのご指摘の通りでした。 しかし、VSYNCの立ち上がり、立ち下がりの両エッジで割込みを掛けるというのも トリッキーですねえ。 スプライトの実装実験。 表示、非表示の判断方法がよく判らないので、暫定的に表示位置が0,0の場合は 非表示としてみる。 連結条件は位置のLSBが1であることのようですが、それだけでもないらしい。 連結されるスプライトは、Y+16の位置にNO+1, X+16にNO+8, X+16,Y+16にNO+9。 サウンドのコマンド受け取り部実装。 パラメータが存在する場合は、最後の1byte以外に対してINTF1を発生させる 必要があるようです。 パレットおよび表示位置の調査。 BASIC入門上でテキストとスプライトの表示位置の関係や表示範囲を確認。 また画面をビデオキャプチャして、各パレットの色を確認しました。 ここまでで、画面が化け化けながらも、一応ルパン三世が何となく動作している ような雰囲気に。 実質Enriさん、333さん向けですが、一応参考程度にリリースしておきますか。 2005/12/3-10 国際ロボット展の修羅場が終わりましたので、開発再開です。 この1週間は、ひたすらテキスト画面、特にブロック画面周りを弄っていました。 テキスト画面とブロック画面の指定方法がいまいちはっきりしないのですが、 取り敢えず幾つかのゲームでそれなりに表示されるように条件を調整しています。 また文字フォントのうち記号以外のイメージが、スプライト転送用として BIOS内に用意されていますので、テキスト画面の表示にもBIOSから生成した 文字フォントを利用するように変更しました。 スプライト化けについては、今のところ進展なし。 うーむ、せめてルパンだけでも綺麗に表示できるようにしたいんですが。 後は、m5用に実装したSN76489ANをベースに、サウンドの仮実装を進めています。 現状は、0,2のコマンドのみの実装となっています。 0 (パラメータなし) リセット、発声停止 1 p0 p1 p2 効果音発声 2 音色? 周波数 ボリューム? 周波数を指定して発生 1 p0 p1 p2が正体不明。 多分効果音なんですが、同じ値を指定してピーポーピーポーとか複数の音から 構成される音を再生しているところをみると、チップ内に幾つかの波形が 用意されているのかもしれません。 CPUのPC3からの信号は、今のところ正体不明。 L->HにしてINTF1待ちしている処理があったので、取り敢えずリセットと しておきました。 バッファが一杯で0コマンドが実行できないときの強制リセットかな? 2005/12/11-13 エレベータファイトが、タイトル画面でボタンを押して、ゲームスタート 直後にまたタイトル画面に戻ってしまう件がどうしても気になったので、 週末から調査していました。 タイトルに戻ってしまうのは、ゲームスタート直後にPC=0に戻ってしまうから。 PC=0に戻ってしまうタイミングは、割込み発生直後。 割り込みのフックがある$fff1-$ffffが$0でクリアされているため、 割込みが発生してフック先にジャンプ、ずっとNOPでPC=$ffffを超えてしまって、 またPC=0に戻っている。 $fff1-辺りはBLOCK命令でつぶされている。 このBLOCK命令周りの処理を見ると、ワーキングレジスタ上の値をカウンタ として処理をループしている。 この終了条件がうまく機能していないから、ずっとBLOCKを実行し続けて、 DEが$fff1あたりまで到達してしまっている。 ループの終了条件がうまく機能しないのは、Vが$ff以外を指していて、 値が変更できないROM領域をカウント値にしてしまっているから。 Vの値を変更している処理をおっかけると、EX命令を2回実行したところで Vの値が変化してしまっている。 なぜEX命令でデータが化けるのか、、、 レジスタの配列のサイズが間違ってて、データ破壊してるやんけorz あーみっともない。 で、この辺りを修正したら、一気に色々動くようになりました。 ついでに、OFFA,OFFI,ONA,ONI辺りのPSWの更新処理が正しくなかったので これらも直しています。 これで、CPU周りは大体信用できるようになったかなと思います、多分。 2005/12/17-31 スプライト周りの調査を続けています。 スプライト連結時に、16x16を4枚重ねて4色にするか、32x32で単色にするか。 スプライトを上下または左右に半分だけ表示するか。 なんだか色々な機能が存在しているみたいですが、条件がまだよく判っていません。 あとはCPU周りのニーモニックの再チェック。 MAMEのUPD7810コアを参考にしていますが、結構ニーモニックの細かい実装に 問題が多いみたいですね。 今年は取り敢えずここまで。 2006/1/1-14 引き続きCPUの見直し中。 GTA等で演算前後の値が一致した際のキャリー操作など、細かい修正を何箇所か。 また、SIRQやタイマー周りのコードが判り難かったので、可読性向上目的で 実装を修正しています。 ただ、ベースボールでボールがどこまでも飛んでいくなど、まだまだCPUに起因 するっぽい不具合が残っているようです。 実装だけ見直してても、この先あまり進展がなさそうなので、ちゃんとゲームの 処理を解析しないといけないですね。 あと、今回からROMイメージにヘッダを定義するようになりました。 バンク切り替えの8KB SRAMの有無の指定を行うためで、以下のフォーマットに なります。 db id[4] 'SCV^Z' (54h,53h,56h,1ah) db backup 0=no sram, 1=buttery backuped sram db reserver[11] ヘッダがなければ単純にSRAMなしと判断されますので、カートリッジ上のROMを 吸い出した生データでも従来どおり動作可能です。 Enriさんがここ数日でテキスト画面の解析を随分と進められていますので、 セミグラフィック周りなど解析結果を取り入れています。 それにしても、相変わらず凄い勢いです。見習わねば。 2006/1/15-16 以前吸い出したROMのうち、バンクがあるものについて再度吸い出しを行いました。 それで気が付いた点として、ドラえもんやスカイキッドなど、バンクROMが 通常の8KBではなく32KBあるタイプがあるということ。 更に、ポールポジションや熱闘プロレスなどは別のタイプのようです。 取り敢えず、32KB+32KBのタイプについてサポートしました。 これに伴いヘッダを拡張しています。 db id[4] 'SCV^Z' (54h,53h,56h,1ah) db ctype 0 = 16KB, 32KB, 32KB + 8KB 1 = 32KB + 8KB SRAM 2 = 32KB + 32KB db reserver[11] ドラゴンスレイヤーも吸い出し直したところ、動作するようになりました。 ただ、これとポップ&チップス、ウィリーレーサーだけ、どうもテキストと ブロックの範囲指定がおかしいみたいなので、暫定的にパッチで範囲変更をする ようにしました。 本当はもっと細かい条件があるっぽいのですが、不具合の発生するソフトが 少ないんで、パッチの方が楽なんですよ(苦笑) その他、Enriさんからご指摘いただいた不具合のうち、スプライトの色が0の 場合は透明、4枚重ね時の優先順位が逆、の2点を修正しています。 X,Y何れかのみに連結時は同じパターンを表示する、というのは必ずしも 常に正しい訳ではないみたいです。 エレベータファイトだと、異なるパターンを2枚重ねしてキャラを2色表示する 場合もあれば、地形なんかは横に同じパターンを連結する場合もあります。 詳しい条件はよく判りませんが、取り敢えずエレベータファイトがそこそこ 綺麗に表示できるような条件を仕込んでおきました。 それにしても、遂にドラゴンスレイヤーとベーシック入門が動くようになった ことが何よりも嬉しいです。 ようやくここまで来たんだなあと、感慨深いものがありますね。 2005/1/17 ようやっと、CPUの(多分)最後の虫が取れました。 INR/INRW/DCR/DCRWのキャリーフラグの処理の問題です。 これらの命令はスキップ条件がキャリーなのに、命令の前後でPSWのキャリーは 変化しないという余りに謎仕様でして。 後のUPD78C10などでは、ちゃんとPSWの更新もなされるようになっています。 これまで、命令表の作成はUPD7801の資料を、個々のニーモニックの動作詳細は UPD78C10の資料を参考にしていたので、中々問題に気付きませんでした。 しかし、幾らなんでもこりゃ反則でしょう(苦笑) ただ修正の効果は絶大で、大半のソフトが(画面化けを除けば)それなりに ちゃんと動作するようになりました。 これで漸く先が見えてきたような気がします。 熱血カンフーロードがそれなりに動き出していますので、ついでにPCM再生の 解析も行いました。コマンドフォーマットは 1F 06 64 01 00 [512 bytes]で、 512 bytesの分がPCMデータとなります。 データフォーマット自体は、Enriさんのご指摘どおり1bit PCMのようです。 しかし、対応ソフトがこれだけしか吸い出せてないから、他のソフトでちゃんと 再生できるかが不安です。 本当にデータは固定長なのか、06 64 01 00の部分が何を意味するのか・・・ 2005/1/18 マッピーがフリーズする件について。 直接フリーズする原因になっているのは、以下の個所です。 838c ldaw 0b0h 838e table 838f jb $ffb0の値をインデックスにテープルからジャンプ先を取得しているのですが、 ここで$ffb0におかしな値が入っているため、メモリがない領域にジャンプして フリーズししてしまいます。 処理をトレースして$ffb0の値が破壊される原因を調べてみたところ、単純に スタックが溢れてしまったからのようです。 スタックが溢れる原因を考えたのですが、どうやらサウンドチップがデータを 受け取った際に、すぐにack信号を返していたのが原因のようです。 ack信号はintf1に繋がっていて、サウンドチップがデータを受け取ると 割り込みが発生します。 で、call先のルーチンでサウンドチップにデータを書き込んで、retする前に ack信号が来て割り込みが発生して、更にスタックを消費してしまった結果、 遂にスタック領域外の$ffb0まで潰してしまったと考えられます。 そこで、データを受け取ってからack信号を返すまで、100clock(根拠レス) 待機するようにしたところ、無事フリーズしなくなりました。 スタースピーダーが、ゲーム開始直後にフリーズする件について。 これは、PCMデータをサウンドチップに書き込んで、ack信号が返ってくるのを 無限に待ちつづけていました。 カンフーロードの場合PCM再生は、$1f, $06, $64, $01, $00, [256bytes] というコマンドフォーマットであることを確認しましたが、 スタースピーダーでは $1f, $04, $64, $01, $00, [サイズ不定] という コマンドフォーマットのようです。 このPCMの波形データ長は不定で、必要なだけデータを送ったら、PC3を 立ち上げてコマンド終了を通達しています。 また、コマンド実行時でないときPC3が立ち上がるとack信号が返りますが、 コマンド実行時はack信号を返さずに、そこまで送られたデータでコマンドを 実行するようです。 この仕様に合わせて、サウンド周りの実装を修正しました。 また、スタースピーダーではPC3の値を操作するために、以下のような処理を 行っています。 a777 mvi a,dfh a779 mov mc,a a77b mviw v.a9h, 0h a77e mvi a,d7h a780 mov mc,a a782 mvi a,dfh a784 mov mc,a ここで、mcのb3が0の場合、pc3にはsak信号が出力されます。 以前対応した、pc5の値を変更するのにio/~m信号を使うのと同じ要領です。 これをサポートするために、sak, to, io/~m信号を処理するようにupd7801の 実装を修正しています。 以上の修正で、スタート時にフリーズしなくなりました。 その他、サウンドがちょっと刺々しく聴こえたので、簡単なローパスフィルタを 掛けるようにしたのと、テキスト・スプライト画面の重ねあわせでX方向に ずれがあったので、ドラゴンスレイヤーを参考に位置調整をしています。 これで、吸い出せてないソフト以外だと、将棋入門が正常動作しないのが 残っているだけかな? 2006/1/19-20 upd7801のシリアルi/oの処理について、勘違いがあったので修正しました。 mov a,sやmov s,aはシリアルレジスタの読み書きだけするのであって、 外部との信号のやりとりは、sioで8発クロックが発生したときでした。 まあシリアルi/oを使用しているソフトもなさそうなので、動作的には特に 意味はないですが、upd7801コアの再利用性の見地から修正しておきます。 熱血カンフーロードでpcm再生が乱れることがある問題を調査しました。 どうやら実際は波形データは不定長で、終端に$fe, $00がくることで 波形データの終端判定をしているようです。 (スタースピーダーではデータ中にも$fe, $00が混じってたりしますが) 熱血カンフーロードでは、一定期間int1によるackが返らないと、そこで データ転送を打ち切ります。 ackが返り続ける限りはずっと転送を続けますので、$fe, $00を受け取ったら upd1771側でackを返さないようになっているのかな? スタースピーダーでは、ソフト側で転送バイト数をカウントして、最後まで 転送したらpc3で終了を通知?しています。こちらでは終端の$fe, $00まで 毎回ずっとackが返るのを待っています。 纏めると、$fe, $00に対しては通常よりゆっくりackが返るということ??? 取り敢えず、終端の$00に対してackを返すか否かを、ソフト毎に挙動を 変えてやる事で対応しておきます。 また、サウンド周りのコードが混乱していたので、upd1771のi/oおよび波形 生成処理部と、サウンドバッファの更新管理部にクラスを整理を行いました。 これで随分見通しが良くなったかと思います。 2006/1/24 Enriさんが解析を進められていた、2色スプライトの実装を行いました。 やっぱり私も、実機上でプログラム実行できるような環境を構築しないと いけないですね。 私の方では、X,Y連結時に同じパターンが表示される条件の調査を行いました。 また、スプライトを上下左右に半分だけ表示する機能があるのですが、 この機能を使用しているソフト毎に大体ちゃんと表示できるように、 適宜判定処理を追加しています。 たとえばルパン3世で、上下左右分割をすることで蝙蝠を羽ばたかせたり、 熱血カンフーロードで右向き、左向きの頭のいずれかを選択して表示したり するのに使用しています。 まだ多少怪しいところもありますが、表示の問題はこれで大体解決ついたかと 思います。 2006/1/25 スプライトの上下、左右分割表示の判定を修正しました。 また、このときY方向の連結フラグの処理を修正しました。 ちょっと複雑ですが、以下のような感じです。 ATB+3のbit7が1の場合、スプライトを左右に分割します。 X連結フラグ=0のときは左半分、=1のときは右半分。 X連結フラグはクリアされます。 但し、ATB+3のbit6が1の場合、更に上下に分割します。 Y連結フラグ=0のときは上半分、=1のときは下半分。 このときY連結フラグはクリアされます。 で、従来は常時X,Y連結フラグをクリアしていましたが、ATB+3のbit6が0のときは Y連結フラグはクリアせずに、そのままY方向に連結してやります。 また、スプライト連結時のスプライト番号の処理を整理しました。 判ってしまえば割と単純で、ATB+3で指定された番号がnoだとすると、 下は(no|1), 右は(no|8), 右下は(no|9)番のスプライトが連結されます。 2色スプライトでは、no^((X連結?8:0)|(Y連結?1:0))番が重ねて表示されます。 これで、今度こそスプライトの表示の問題は解決したんじゃないかと。 2006/1/27 スタースピーダーを実機でプレイしてみると、eSCVで再生されないPCMが ある模様。 それでupd1771cのアクセスログを取ってみると、前に出力されたPCMが殆ど 再生される前に、次のデータが来てしまっているのが原因でした。 そこで、前回のPCMを再生中は次のデータが来てもACKを返さないように するとともに、全波形を受け取ってから再生するのではなく、データが来る 端から再生をするように修正しました。 熱血カンフーロードで、画面最上部にゴミスプライトが表示される件。 原因がよく判らなかったので、パッチで無理やりスプライトの表示範囲外と してやりました。まあ他のソフトで誤爆しなけりゃいいや。 2006/1/28 PC6を使用してバンク切り替えを行うソフトのために、吸出し回路を修正 しましたので、早速実験をしてみました。 乱闘プロレス、ワイワイモンスターランドは128KB。 ポールポジション2は96KBで、PC5=0,PC6=0の領域が空きとなっています。 ドラゴンボールは64KBでPC6のみでバンク切り替えを行うようです。 で、eSCV側でも対応してみたのですが。 ワイワイモンスターランドはどうもPCM再生でフリーズすることがあり。 出来る限り対応するようにしましたが、デモプレイでフリーズする 不具合が残っています。 乱闘プロレスは、何故か勝手に体力が減ってすぐに試合終了。まだCPUに 不具合が残っているとは思いたくないんですが。 ドラゴンボール、ポールポジションは動作せず。 端子部がへたっていますので、吸出しミスの可能性もあり、要調査。 2006/1/29 演奏コマンドのフォーマットは「$02 音色 分周比 音量」 ベーシック入門を使用して、音色パラメータの調査を行いました。 基本的にはbit4-1でデチューン、bit7-5で音色指定を行うようです。 ただしパラメータによっては、自動的に周波数を変動させたり、ホワイト ノイズを出力する機能もあるようです。 どうもこの辺は規則性が見当たらないのが難点。 取り敢えず、音色毎の波形をPCに取り込んで、その値を正規化したデータを そのままeSCVで使用するようにしました。 またデチューンによる周波数の変動や、基準クロックについても、録音した 波形を解析して決定しています。 これで、基本的なBGM再生については、ほぼ実機どおりの音が再生される ようになった筈です。 せっかく実機をテレビに繋ぎましたので、ついでにパレットの再調整。 正確な値は不明ですが、私のテレビではこのような色に映っています。 また、画面を2倍表示する際に、画面を横に1.5倍にするようにしました。 1倍表示時は、ドット幅が広くなったり狭くなったりして見苦しいので、 従来どおり1:1で表示します。 2006/1/30 ノイズの波形調査のため、BASIC入門からUPD1771Cに自由にコマンドを 送出する方法を調べてみました。 UPD1771Cは何かコマンドが来ると、コマンド長分だけINTF1でACKを返して パラメータを要求します。 で、ベーシック入門のINTF1の割込みルーチンは以下の通り。 88a4 push v 88a6 push h 88a8 lhld ff8ah 88ac ldax h+ 88ad mov 3600h,a 88b1 shld ff8ah 88b5 pop h 88b7 pop v 88b9 ei 88bb reti 要は、$ff8aにパラメータが格納されているアドレスを指定して、最初の コマンドデータ1バイトを$3600に送出すれば、ACKが返らなくなるまで 勝手に残りのパラメータを送出してくれます。 例えば、以下のような処理で実際にコマンドを発行しています。 87ff lxi h,ff80h コマンド列の格納アドレスを 8802 shld ff8ah $ff80にセットする 8806 mvi a, 2h 8808 stax h+ 8809 mvi a,80h 880b stax h+ 880c mvi a,a0h 880e stax h+ 880f mov a,b 8810 stax h+ $ff80から$02,$80,$a0,$a0を格納 8811 call 8894h 8894 lhld ff8ah 最初の1バイトをUPD1771Cに送出 8898 ldax h+ 8899 shld ff8ah 889d mov 3600h,a 88a1 ei 88a3 ret しかし、BASIC入門でPEEK命令を使用して$ff80-$ff8bにデータを書き込んでも、 いつの間にかデータが消えてしまっています。 これは、以下の処理が定期的に実行されているためのようです。 a7e5 lxi h,f9feh a7e8 lxi d,ff80h a7eb mvi c, bh a7ed block という訳で、$ff80-$ff8bに書き込みたいデータは、実際には$f9fe-$fa09に 書き込んでやる必要があります。 10 POKE &hf9fe,[p0] 20 POKE &hf9ff,[p1] 30 POKE &hfa00,[p2] 40 POKE &hf9fe,&h80 50 POKE &hf9fe,&hff 60 POKE &h3601,1 というプログラムを実行すると、$3600に$01,p0,p1,p2というノイズコマンドを 送出することができました。 2006/1/31-2/1 ノイズコマンドの解析中。 ノイズコマンドは、どうやら10bytesの模様。 パラメータの意味は、大体以下のような感じです。 $01,$80/$e0,WN波長,WN音量,矩形波波長,矩形波減衰,?,矩形波音量,?,? $80/$e0は何かのモード指定? WNはホワイトノイズ風の波形。 矩形波減衰は、1パルス内でボリュームを減衰させるもの。 ホワイトノイズというより周期ノイズっぽいかな? 波形自体動的に変化するっぽいけど、取り敢えず1波形のサンプルを配列として 持たせてやって、簡易的に再生できるように。 2006/3/8 暫く忙しくて放置中でした。 乱闘プロレスで体力が勝手になくなってしまう件は、DAAのキャリーフラグの 処理の問題でした。 ついでにL0, L1フラグの挙動にも問題がありましたので、修正しています。 ワイワイモンスターランドで、PCM再生時にフリーズすることがある件。 ワイワイモンスターランドでは、PCMコマンド中にPC3が入力されても、 PCMコマンドを中止しないのですが、コマンド送出が5bytes以下のときにPC3が 入った場合は、コマンドを中止する必要があったようです。 2006/3/9-10 エレベータファイトで、画面両端の灰色の垂直な壁の上端が、スクロール時に 表示が乱れる件。 スプライトの表示の際に、上から何ライン表示しないかという設定があります。 これが、縦にスプライト接続したとき、下側のスプライトにも影響するようです。 従来下側は全ライン表示としていたため、このような不具合が発生していました。 ルパン3世の面の最後の扉の開閉なんかも同様です。 数字キー入力に関して、フルキーの数字キーは効いていたのですが、10キー側の キーが有効になっていませんでした。 私自身はノートパソコンのみなので、全然気付いていなかったり(苦笑) これはさくっと修正しておきます。 ワイワイモンスターランドのPCM問題で試行錯誤しているうちに、ルパン3世で ポーズしたときにフリーズするようになってしまっていました。 サウンドコマンド送出中に、PC3で前のコマンドを中断して、ポーズ音の 再生コマンドを送出する際に、PC3が効かなくなってしまっていたのが原因です。 ついでに、ワイワイモンスターランドで長いPCM再生中にポーズを掛けたときに PCM再生が乱れる問題がありましたので、部分的に修正しています。 2006/3/11 土曜に秋葉のスーパーポテトを覗いたところ、ゾルゲ市蔵氏の謎のゲーム魔境の 古本を発見。そーいやスーパーカセットビジョンも載ってたっけ、ということで 一応確保しておきました。 で、帰りのバスの中で見てみたところ、スーパーサンスーピュータの画面が eSCVだとちゃんと表示できていないっぽいことに気付いてみたり。 2006/3/13 という訳で、スーパーサンスーピュータ。 どうせテキストの表示範囲だろうなあと、適当にパッチを当ててみたらビンゴ。 他のソフトも確認してみたところ、スタースピーダーのレース画面で上の方に タイムやスピードが表示される欄が表示できていないようなので、これも修正。 ついでに先日来のPCM再生の修正のため、スタースピーダーでPCMが途切れる 問題を発見したので、これも修正しておきます。 将棋入門、ドラゴンボール、ポールポジションの未動作3作。 秋葉で設定復活剤を買ってきたので、端子を清掃して再吸出ししました。 結果、全滅。うーん。 で、将棋入門についてふと気が付いて、メモリアクセスの履歴チェック。 あーこれ、32KB ROMに8KB SRAMがついてるっぽいや。 そりゃそうだ、128Bytesで将棋の思考ルーチンが組める訳がない(苦笑) で、BASIC入門なんかと同じタイプに変更したら、あっさり動作しました。 ただバッテリバックアップはしないので、そこだけ特殊処理を追加してます。 2006/4/14 溶接展の会期中ですが、Enriさんに解析していただいたテキスト範囲の判定を 実装せずに放置するのもなんですので、軽く更新しておきます。 いままでパッチで誤魔化していた部分が、パッチなしでどのソフトでも正しく 表示できるようになったは目出度いですね。 2006/5/5 GW休暇中ですが、どうにも作業が捗らず。 帰省前にルパン3世のサウンドを録音してきていたので、サイレンの音の波形を 取り込んで鳴らせるようしておきました。 $01,$80/$e0,WN波長,WN音量,矩形波波長,矩形波減衰,?,矩形波音量,?,? のフォーマットで、WN音量も矩形波音量も0の場合、6番目のパラメータである 矩形波減衰を矩形波波長に置き換えて、(多分)固定ボリュームで矩形波もどきを 出力する場合があるようです。 但し、6番目のパラメータが8の場合、ルパン3世のサイレンの音のように微妙に 濁った波形が出力されます。この波形がどう生成されるか判らなかったので、 サンプリングした波形を配列として持たせています。 2006/6/14 GWの作業も含めてリリースが滞っていましたので、思い立ったときにリリース。 せっかくなので、描画処理やイベント駆動の高速化、最近使ったファイルの 処理の修正をしています。