マシンあたり2台のZ808ビットアヌケヌドマシンはホヌムコンピュヌタヌずどのように違いたしたか

゚ミュレヌタを䜜成する過皋でボムゞャックアヌケヌドマシンに぀いお孊んだこず











最近、䞻にこれらの最初の8ビットアヌケヌドマシンが8ビットのホヌムコンピュヌタヌずデザむンがどのように異なるかを理解するために、小型のボムゞャックマシン゚ミュレヌタヌを䜜成したした。



埌でわかったように、私の故郷での倏のフェアでのボムゞャックのようなアヌケヌドマシンずのミヌティングは、私の運呜を倉えた瞬間の䞀぀でした。 通垞の倏の日に、コむンのすべおの䟛絊をアヌケヌドマシンに費やしおから、家に戻り、頭は花ず効果音でいっぱいになりたした。 これらのゲヌムの仕組みを理解しようずしたした。 そしお、幎の終わりたで、私は攟課埌ずっず自宅のコンピュヌタヌでこれらのアヌケヌドゲヌムのかなり色あせたコピヌを䜜成するこずに時間を費やしたした。 私はスティックからアメリカ軍のラゞオ局を䜜りたかった倪平掋諞島のカヌゎカルトのファンのように芋えたした。



私の最初の頃は、 Pengo゚ミュレヌタを䜜成するこずを考えたした。これは、10代の脳がBomb Jackよりもこのゲヌムのほうがずっず印象的だったからですちなみに、私の貚物のカルトバヌゞョンのPengoです 。 しかし、Pengoアヌケヌド機噚にはサりンドずビデオ甚の新しいチップ゚ミュレヌタヌを䜜成する必芁があり、Bomb Jackには既に持っおいた十分な郚品であるこずが刀明したしたCPUずしおのZ80ずサりンド甚のAY-3-8910。したがっお、Bomb Jackを初めお䜿甚したした。



さらに、Bomb Jackは、Z80゚ミュレヌタにNMIマスク䞍胜割り蟌みサポヌトを最終的に远加する絶奜の機䌚でした。 以前に゚ミュレヌトしたZ80ベヌスのマシンはいずれもNMIを䜿甚しおいなかったため、この機胜を再䜜成するこずにはあたり意味がありたせんでした。ただ動䜜を確認できたせんでした。



Bomb Jackが䜕であるかわからない堎合、このゲヌムは次のようになりたした正しいアスペクト比を遞択したかどうかはわかりたせん。



爆匟ゞックのスクリヌシンショト








WebAssemblyの゚ミュレヌタヌのバヌゞョンは、次の堎所にありたす。



https://floooh.github.io/tiny8bit/bombjack.html



ロヌド手順が完了し、ハむスコアテヌブルが衚瀺されたら、 1を抌しおコむンをドロップし、 Enter たたは矢印ずスペヌスバヌを陀く他のキヌを抌しおゲヌムを開始したす。



ゲヌム内で、 矢印キヌを䜿甚しお方向を倉曎し、 スペヌスバヌを䜿甚しおゞャンプしたす。 空䞭にスペヌスバヌを抌すず、萜䞋速床が遅くなりたす。



゜ヌスコヌドは次のずおりです。



https://github.com/floooh/chips-test/blob/master/examples/sokol/bombjack.c



チップヘッダヌを䜿甚しおZ80およびAY-3-8910の゚ミュレヌションを提䟛し、 sokolヘッダヌをクロスプラットフォヌムラッパヌアプリケヌションの入力、レンダリング、入力、サりンド甚ずしお提䟛したす。



ステップ1調査



「研究」ずいう蚀葉は長すぎたす。Googleの「Bombjackアヌケヌドハヌドりェアの仕様」をヒットしたした。



人気のある80幎代の家庭甚コンピュヌタヌたたは、ただ掻発なコミュニティがしばしば存圚する神秘的な東ペヌロッパのコンピュヌタヌでさえず比范するず、むンタヌネット䞊のボムゞャックに関する情報はほずんどありたせん。



マシンの回路図ず、もちろんMAME゚ミュレヌタヌの゜ヌスコヌドずいう 2぀の非垞に重芁な情報を芋぀けたした。



たた、回路図にない詳现を芋぀けるこずができたVHDL゜ヌスから、 FGPAにBomb Jackを実装するプロゞェクトもありたす。



アヌケヌドマシン゚ミュレヌタヌは通垞、機噚のさたざたな郚分がどのように盞互䜜甚するかを蚘述する単なるマクロの集たりであり、 ゜ヌスコヌドの倚くではないため、MAME゜ヌスを理解するこずは困難です 。



それにもかかわらず、機噚のマクロ蚘述、特にコメントは、ハヌドりェアの動䜜を理解するのに非垞に有甚であるこずが刀明したした、そしお、それらがあたりにも暗号化された堎所たずえば、 ビデオのデコヌドの郚分 、詊行錯誀の方法だけでなく、十分でしたコンセプトの詳现な研究。



ハヌドりェアの抂芁



Bomb Jackハヌドりェアの最も興味深い点は、実際には電気テヌプで接続された2台のコンピュヌタヌであるずいうこずです。Z80CPUずビデオデコヌド装眮を備えたメむンボヌドず、独自のZ80 CPUず3台のサりンドカヌド はい、 3サりンドチップAY-3-8910。



ビデオデコヌド装眮は集積回路ずしお実装されおいたせん-それは、倚くの小さな汎甚チップですその回路は、デバむスの回路図の10ペヌゞのうち6぀を占有したす。 ゚ミュレヌタヌを䜜成するずき、私は簡単な方法に進むこずにしたしたビデオデコヌド機噚の個々の郚分を゚ミュレヌトする代わりに、その動䜜のみを゚ミュレヌトし、入力デヌタから察応する出力を䜜成し、機噚自䜓が真ん䞭にどのように機胜するかを本圓に心配したせんでした。



このような単玔化された゜リュヌションは、1぀のプログラムのみを実行するように蚭蚈された個別のアヌケヌドマシンに非垞に適しおいたす。 ゲヌムが起動しお正しく動䜜する堎合、゚ミュレヌションは「十分に良い」ず芋なすこずができたす。



さらに、この単玔化されたアプロヌチは、ほずんどの家庭甚コンピュヌタヌの゚ミュレヌションずの重芁な違いですたずえば、C64やAmstrad CPCなどのマシンでは、クロックサむクルたで非垞に正確な゚ミュレヌションが必芁なため、䞀郚のゲヌムやグラフィックのビデオシステムは、デモは正垞に機胜したした。



たた、既補のCPUおよびサりンドチップ゚ミュレヌタヌは実際にはBomb Jackには䞍芁です。たずえば、マシンサむクルの分数の実装でZ80 CPUを操䜜するのは過剰であり、呜什レベルでのより単玔で高速な断片化で十分です。



メむンボヌド



通垞、新しい゚ミュレヌタを䜜成するずきに最初に芋぀けようずするのは、メモリ割り圓おスキヌムですROMずRAM、ビデオメモリ、特別なアドレス、たたは入出力ポヌトの領域。



Bomb Jackメむンボヌドには、4 MHzで動䜜するZ80 CPUずいう「興味深い」チップが1぀だけありたす。 メむンボヌドの残りのすべおの領域は、ビデオデコヌド装眮で占められおいたすRAMチップずROMチップのペアを陀く。



16ビットのアドレス空間は次のずおりです。





I / Oポヌト領域は次のずおりです。 䞀郚のポヌトは曞き蟌み専甚であり、䞀郚は読み取り専甚であり、䞀郚のポヌトは読み取りおよび曞き蟌み時に異なる機胜を持ちたす。





以䞋は、ここで蚀及する䟡倀がありたす。





Z80の特城の1぀は、デバむスI / Oの個別の16ビットアドレス空間であるため、メモリ割り圓おスキヌムのI / OはZ80を搭茉したマシンでは少し異垞です。 これは、貎重なメモリアドレス空間を節玄するために行われたす。 メモリ割り圓おスキヌムのI / Oは、通垞6502プロセッサを搭茉したコンピュヌタヌで芋られたす。



回路図を芋るずこれが確認できたす。メむンボヌドのCPUでIORQピンは怜出されず、MREQピンのみが接続されおいたすメモリぞの読み取りたたは曞き蟌みの初期化に䜿甚されたす。



ボムゞッチャIORQ






これは、゚ミュレヌタヌのメむンボヌドのCPUタむマヌ機胜に察するI / O芁求を心配する必芁はなく、メモリ芁求のみを凊理するこずを意味したす。



回路図を調べたずころ、メむンボヌドのCPUに関する別の興味深い詳现を芋぀けたした。



NMIピンのみが接続され、INTピンは垞に高レベルのクロック信号を維持し、非アクティブのたたです぀たり、「通垞の」マスクされた割り蟌みは実行されず、マスクされおいない割り蟌みのみが発生したす。



ボムゞッチャIORQ






これは、Z80を搭茉した車にずっおも非垞に珍しいこずです。 私が扱っおいたすべおのZ80ベヌスのホヌムコンピュヌタヌでは、逆のこずが圓おはたりたした。マスク可胜な割り蟌みのみを䜿甚し、マスク䞍可胜な割り蟌みは䜿甚したせんでした。 マスクされた割り蟌みZ80は、「䞍正な父芪」であるIntel 8080たたは競合他瀟であるMOS 6502のプリミティブ割り蟌みシステムず比范しお、非垞に柔軟で深刻な改善です。しかし、この柔軟性の向䞊は、同時に割り蟌みの゜ヌスずしおの堎合を陀き、 Z80ファミリの他のチップが䜿甚されたす。このチップには、バスで接続されたずきに、すでに耇雑な割り蟌みプロトコルが組み蟌たれおいたす。



たあ、機噚に぀いおの十分な詳现は、゚ミュレヌタに移りたしょう



起動手順



メモリ構成を決定した埌の次のステップは、゚ミュレヌトされたCPUを゚ミュレヌトされたメモリ割り圓おスキヌムに接続し、ビデオメモリの内容の䜕らかの芖芚化を蚘録し、CPUサむクルを開始するこずです。



驚くべきこずに、このような倧たかなアプロヌチは、ロヌド手順を実行しお画面に䜕かを衚瀺するのに十分です。 Bomb Jack゚ミュレヌタを蚭蚈するずき、0x9000〜0x93FFの範囲の1KBビデオメモリの内容を32x32バむトマトリックスずしお取埗したした。 バむトが0のずき、黒ピクセルのブロックを8x8でレンダリングし、それ以倖の堎合は癜ピクセルのブロックをレンダリングしたした。



次に、゚ミュレヌトされたCPUを実行し、最高の結果を期埅したした。 芋よ ある皮の読みやすい画像が珟れたした



ボムゞッチャブブツ1






ボムゞッチャブブツ2






䞊の画像は起動時のハヌドりェアテスト画面のように芋え、䞋の画像は起動手順が完了した埌に衚瀺されるスコア蚘録画面のように芋えたす。



ボムゞッチャブブツ3






ボムゞッチャブブツ4






...しかし、90床回転したしたこれは論理的です。なぜなら、アヌケヌドマシンの画面は倚くの堎合、垂盎の「瞊」向きであったためです。



玠晎らしい、始たりは有望です



次のステップは、これらの癜いブロックをカラヌピクセルに倉換する方法を理解するこずですこれは倧きなステップです。詳现に぀いおは、ビデオのデコヌドに関するセクションで説明したす。



最初はすべおが非垞に迅速に行われ、テスト画面では、読み蟌み䞭にピクセルず色が衚瀺されたした埌で、色のデコヌドが完党に間違っおいるこずに気づきたした...



ボムゞッチャブブツ5






しかし、蚘録画面が衚瀺されるず、黒い画面が衚瀺されたした。 「黒」ではないように背景色をハックするず、ピクセルはレンダリングされたすが、カラヌパレット党䜓が黒であるこずがわかりたした。 うヌん...



ボムゞッチャブブツ5






この画面を数分間芋お、ハむスコア画面の色の䞀郚がアニメヌション化されおいるこずを思い出したした。アニメヌションがある堎合は、䜕らかのタむマヌがあるはずです。 この機噚構成の時間の論理的な゜ヌスは、ディスプレむのVSYNC信号、およびCPUのNMIピンに接続されたVSYNCですVSYNCではなく、VBLANK、VSYNC信号ず巊䞊隅に移動する陰極線ビヌムの間の短い瞬間です。



そしお、私はただこのすべおを実装しおいたせん...



翌倜、NMI凊理の最初のバヌゞョンをZ80゚ミュレヌションに远加し、それをメむンボヌドのCPUタむマヌ機胜の最初のカりンタヌvsync / vblankに接続するず、突然倚くのこずが起こり始めたした



たず、色がレコヌド画面に衚瀺され、そのうちのいく぀かがアニメヌション化されたした。



ボムゞッチャNMI 1






数秒埌、さらに゚キサむティングなこずが始たりたした ハむスコ​​アが消え、最初のマップの奇劙な芖芚化が衚瀺されたした。 これが泚目を集めるためのアヌケヌドマシンのデモモヌドであるこずは明らかでした。架空のボムゞャックがこれらの爆匟を集めた地図にゞャンプするず消えるカラヌアニメヌションの爆匟がいく぀か芋られたした。



ボムゞッチャNMI 2






色はただ完党に間違っおいたしたが、ただ進行䞭です



残りのビデオデコヌドを行うのに適切なタむミングです。



ビデオアむロン



Bomb Jackのビデオ凊理機噚は、1984幎の8ビットマシンで非垞に匷力に芋えたした256x256ピクセルの解像床にもかかわらず、1284096色を同時に衚瀺し、最倧24個のハヌドりェアスプラむト16x16サむズをレンダリングできたしたたたは32x32ピクセルごずの色で。



圓時の8ビットの家庭甚コンピュヌタヌのディスプレむ解像床はほが同じでしたが、倚くの色の制限がありたした。 ZX SpectrumおよびAmstrad CPCのBomb Jackバヌゞョンをアヌケヌドマシンのバヌゞョンず比范するず、これらの制限は非垞に明確に衚瀺されたす。



ZX Spectrumのバヌゞョンは、ピクセル解像床は非垞に良奜256x192でしたが、色は非垞に少なく、Spectrumの兞型的な「色の競合」効果がありたしたただし、開発者は目立たないように努力したした。



ボムゞッチャクZX






Amstrad CPCのバヌゞョンはフルカラヌですが、より倚くの色を取埗するために、開発者は䜎解像床衚瀺モヌド160x200に切り替える必芁がありたした。 この結果、ゞャックずモンスタヌは刀読できないピクセルの束に倉わりたした。



ボムゞッチャCPC






これを、アヌケヌドマシンのバヌゞョンず比范しおください。アヌケヌドマシンは、ZX Spectrumず同じピクセル解像床でしたが、はるかに倚くの色ずピクセルごずの色解像床が向䞊しおいたした。



ボムゞャックアヌケヌド






ここで興味深いのは、アヌケヌドバヌゞョンのグラフィックが優れおいるこずです。より匷力なハヌドりェアで動䜜するためグラフィックデヌタを栌玍するためのROMが増えたすが、「コンピュヌティングパワヌ」はほが同じですが、デバむスの開発者が集䞭できるためですある特定の皮類のゲヌム専甚のマシンを補造しおおり、汎甚の汎甚ホヌムコンピュヌタヌを䜜成する必芁はありたせんでした。



ディスプレむハヌドりェアの動䜜は次のずおりです少なくずも私の高レベルの解釈では。



3局のディスプレむ



完成したボムゞャックのビデオ信号は、3぀のレむダヌ背景レむダヌ、フロントレむダヌ、スプラむトレむダヌから結合されたす。



このようなレむダヌシステムには、䞻に2぀の利点がありたす。





ビデオアむロンは、8ビットの家庭甚コンピュヌタで芋たものずはたったく異なりたすが、MAMEではこのタむプの機噚の䞀般化された補助クラスが実装されおいるため、アヌケヌドマシンでは非垞に䞀般的であるず掚枬できたす。



背景レむダヌ



背景レむダヌは、ROMに埋め蟌たれた5぀の背景画像のうち1぀をレンダリングできたす。 背景画像は、アドレス0x9E00に1〜5の倀を曞き蟌むこずで遞択されたす倀0は特別で、完党に黒い背景をレンダリングするようです。



実際、この機噚は7皮類の画像をレンダリングできるように芋えたすが、ゲヌムでは5皮類しか䜿甚できたせん。ひそかに、ROMで以前に怜出されなかった画像デヌタを芋぀けたいず思っおいたした。 しかし、悲しいかな、圌らはそこにいたせんはい、私は圌らをそこに探す最初の人ではないず思いたす。



他の2぀のレむダヌがない堎合の最初のマップの背景レむダヌは次のずおりです。



爆匟ゞャックの背景






背景レむダヌは16x16ピクセルのタむルから組み立おられたす。



タむルから背景画像を䜜成する利点は、同じタむルを耇数回䜿甚できるため、ROMに保存できるデヌタが少なくなるこずです。 青い空、ピラミッドの䞀郚、ピラミッドの䞋の砂が同じタむルを䜿甚しおいるこずに泚意しおください。



爆匟ゞッチャの背景タむル






メモリを節玄するために、背景レむダヌの機噚はさらに別のトリックを実装しおいたす-タむルを氎平方向に回転させるこずができたす。 ゜フトりェアがこのハヌドりェア機胜を䜿甚しないず仮定したため、実装でこれをほずんど芋逃したしたが、3番目のカヌドの背景に小さなバグがあるこずに気付きたした。



爆匟ゞッチャの背景3






5番目のマップでも同じトリックを䜿甚したしたが、䜕を探すべきかわからない堎合、気付くのが少し難しくなりたす。



爆匟ゞッチャの背景5








フロントレむダヌ



背景レむダヌの䞊にある「フロントレむダヌ」は、画面のすべおの固定郚分をレンダリングしたすが、CPUによっお曎新する必芁がありたす䞻にテキスト、プラットフォヌム、爆匟。 レむアりトは、RAM1 KB RAMず1 KBカラヌRAMのフラグメントから読み取られたす。



最初のマップの分離されたフロントレむダヌは次のようになりたす。



爆匟ゞッチャの前景






フロントレむダヌもタむルおよび背景で構成されたすが、より小さな8x8タむルを䜿甚したす。



爆匟ゞッチャの背景タむル






背景ず前面を別々のレむダヌに分割する䞻な利点は、前面芁玠を䜜成たたは削陀するずきに、CPUが背景ピクセルの保存ず埩元を心配する必芁がないこずです。



スプラむトレむダヌ



最埌に、ハヌドりェアスプラむトがフロントレむダヌ䞊にレンダリングされたす。 画面内を移動するものはすべおスプラむトに実装されおいたす。Bomb Jack機噚は最倧24個のスプラむトをレンダリングでき、各スプラむトのサむズは16x16たたは32x32ピクセルです。同時に、スプラむトはピクセル単䜍の粟床で配眮できたす。



ボムゞャックスプラむト








8x8タむルデコヌダヌ



ビデオデコヌド装眮の䞭心には、128芁玠のカラヌパレットず8x8ピクセルのタむルデコヌダヌがありたす。タむルデコヌダヌのタスクは、タむルの64ピクセルのそれぞれに察しお7ビットカラヌパレットむンデックスを生成するこずです。



これらの8x8タむルは、16x16バックグラりンドタむル、8x8フロントレむダヌタむル、16x16たたは32x32ハヌドりェアスプラむトなど、画面䞊のすべおの構成芁玠です。



フロントレむダヌをレンダリングするためのこの8x8タむルデコヌダヌのブロック図を次に瀺したす理解したずおり。



爆匟ゞャックタむルのデコヌド






トップダりンブロック図の説明





これは、3぀の衚瀺レむダヌのそれぞれで䜿甚される䞀般的なタむルデコヌドスキヌムですが、各レむダヌのデコヌドは少し異なりたす。





タむルビットレむダヌの倖芳をよりよく理解するために、ROMドラむブタむルをPNGフファむルに倉換すおる小さんなCスヌプロブログラムを䜜成したしたんピクセルあたり3ビットを8グレヌスケヌルレベルに倉換。



以䞋に、フロントレむダヌのROMドラむブタむル瀺したす。数字ずテキストフォント、プラットフォヌムタむル、爆匟半分に分割、ボンゞャックスクリヌンセヌバヌのロゎの䞀郚、および画面䞊郚に衚瀺されるスコア乗数のデヌタが衚瀺されたすちなみに、画面党䜓も回転するため、すべおが90床回転したす



爆匟ゞャック前景タむルROM






次に、背景のROMタむルを怜蚎したす。実際には、16×16タむルを8×8タむルにデコヌドしおいるため、あたりはっきりしおいたせん。各16×16タむルは、4぀の隣接する8×8タむルかなら䜜成さんくれたす。 ただし、マップ2からギリシャ神殿の䞀郚、マップ3から城、マップ4から高局ビルを認識できたす。



爆匟ゞャックの背景タむルROM






そしお最埌に、ROMスプラむトタむル。16x16スプラむトが䞊半分を占め、32x32スプラむトが䞋半分を占めたす。



爆匟ゞャックスプラむトタむルROM






Bomb Jackスクリヌンセヌバヌの興味深いハックは、ロゎが前面のタむルずスプラむトから組み立おられおいるこずです。開発者はフロントタむルROMを䜿い果たしおいたず思いたすが、スプラむトROMにはあたりスペヌスが残っおいたせん。



ボムゞャックスプラッシュ1






ボムゞャックスプラッシュ2






ボムゞャックスプラッシュ3






スプラむト機噚



爆匟ゞャックのスプラむト装眮は、圓時の家庭甚コンピュヌタヌで䜿甚されおいたものず比范しお非垞に匷力です。





スプラむトシステムのピクセルずスプラむトをデコヌドする堎合、背景およびフロントレむダヌず同じ8x8ベヌスタむルが䜿甚されたす。



スプラむト属性は、0x9820から0x987Fのアドレス範囲にありたす-96バむト、スプラむトごずに4バむト。私が芋た限り、この゚リアは録音専甚です。少なくずもCPUは、このメモリ範囲ぞの読み取りアクセスを実行したせん。



各スプラむトは4バむトで蚘述されたす





バむト1のビット4ず5が䜕をするのかは明確ではありたせん、MAMEのコメントは次のように述べおいたす。



e ? (, )

f ? (, (B)?)








メモリI / Oポヌト



メむンボヌドの入力/出力ポヌトに関するいく぀かの泚意。 䞊蚘のように、I / Oポヌトは次のようになりたす。





䞊蚘で既に怜蚎したアドレス0x9E00背景画像の遞択、およびアドレス0xB800コマンドサりンドカヌドは次のセクションで怜蚎したす。 0xB000から0xB005のアドレスのたた



アドレス0xB000および0xB001から読み取るず、2぀のゞョむスティックの珟圚の状態が返されたす。 プリセットバむトは、閉じられたゞョむスティックスむッチを瀺したす。





残りの3ビットは無芖されたす。



0xB002から読み取るず、コむンアクセプタヌず[スタヌト]ボタンのステヌタスが返されたす。





アドレス0xB004および0xB005から読み取るず、アヌケヌドマシンの動䜜を構成するために䜿甚されるディップスむッチの状態が返されたす。





最埌に、アドレスB003からの読み取りにより、゜フトりェアりォッチドッグが実装されたす。 CPUはしばしばこのアドレスから読み取る必芁がありたす。そうしないず、アヌケヌドマシンがハヌドりェアリセットを実行したす。 䜕らかの理由でゲヌムがクラッシュした堎合、機噚は自動的に再起動したす。



いく぀かのI / Oポヌトアドレスに曞き蟌むこずができたす。





ゲヌムをプレむするずき、私はその䜿甚を芋たこずがないので、画面反転機胜は少し混乱しおいたす。 しかし、私は圌が䜕をしおいるのかに぀いおの予感がありたすが、それを確認するには、コヌドを曞く必芁がありたす。 アヌケヌドマシンが「カクテルテヌブル」構成の堎合、2人のプレむダヌが向かい合っお座りたす。 したがっお、ゲヌムがプレヌダヌ1からプレヌダヌ2に切り替わるず、この関数は画面を反転させるこずを提案したした。 ただし、゚ミュレヌタに2プレむダヌモヌドをただ実装しおいたせん。



サりンドボヌド



サりンドカヌド自䜓は、Z80 CPU3 MHzの呚波数で動䜜、3぀のサりンドチップ1.5 MHzの呚波数で動䜜するAY-38910、およびRAMずROMを備えたフル機胜のコンピュヌタヌです。 サりンドカヌドのメモリ割り圓おスキヌムは非垞に単玔に芋えたす。





0x8000アドレスより䞊のメモリ割り圓おスキヌムには興味深いものがないため、CPUの最䞊䜍アドレスコンタクトは接続されおいたせん。



ボムドックサりンドA15






特別なアドレス0x6000は、メモリにあるI / Oポヌト8ビットラッチであり、実際のRAMに察応しおいたせん。 これは、メむンボヌドの0xB800にあるポヌトず同じです。 これは、メむンカヌドずサりンドカヌドの間の通信チャネルです。



3぀のサりンドチップは、メモリポヌトではなく、これらのZ80出力呜什によっお制埡されたす。 AY-3-8910は2぀のI / Oポヌトのみを開いおおり、最初のポヌトはレゞスタ番号の保存に䜿甚され、2番目のポヌトは最初のポヌトで指定されたレゞスタの内容の曞き蟌みたたは読み取りに䜿甚されたす。



I / O回路は次のずおりです。





サりンドチップAY-3-8910に関するいく぀かの蚀葉



これはかなり暙準的なデバむスであり、圓時の家庭甚コンピュヌタヌたずえば、Amstrad CPC、ZX Spectrum 128、MSXコンピュヌタヌなどで非垞に人気がありたす。 AY-3-8910は倚くのバリ゚ヌションずクロヌンを生み出したしたたずえば、Yamaha YM2149は、それ自䜓がより匷力なサりンドチップのファミリヌ党䜓の基瀎ずなりたした。



AY-3-8910には、3チャンネルの方圢信号、1チャンネルを3チャンネルずミックスできるノむズゞェネレヌタヌ、および1゚ンベロヌプゞェネレヌタヌがありたす。 3぀のチャンネルすべおに゚ンベロヌプゞェネレヌタヌが1぀しかなかったため、特に有甚ではなく、ほずんどのゲヌムはCPUを䜿甚しおトヌンずボリュヌムを倉調したした。



これは、AY-3-8910チップが高品質のサりンドを䜜成するためにより倚くのCPU介入を必芁ずするこずを意味したすたずえば、C64コンピュヌタヌのスタンドアロンSIDチップずは異なりたす。



3぀のかなりシンプルなサりンドチップずそれらを制埡するCPUで䜕ができるかを芋るのは驚くべきこずです。 Bomb Jackの音楜ず効果音は、ほずんどの家庭甚コンピュヌタヌゲヌムで聞いたよりもはるかに豊かです。



このサりンドカヌドで本圓に興味深いのは、メむンボヌドからコマンドを受け取る方法だけです。



サりンドコマンドラッチ



「サりンドラッチ」は、メむンカヌドずサりンドカヌドに共通のシングルバむトストレヌゞ8ビットラッチです。 ラッチは、メむンボヌドのアドレス0xB800ずサりンドカヌドのアドレス0x6000に結び付けられおいたす。



VSYNCを䜿甚しおNMI割り蟌みがオンになるず、サりンドカヌドは非垞に簡単な割り蟌みサヌビス手順を実行し、ハヌドりェアラッチを読み取り、通垞のメモリアドレスに曞き蟌み、「信号ビット」を蚭定したす。これにより、「メむンルヌプ」に新しいサりンドコマンドが受信されたこずを通知したす。



  ex af,af' ;0066 exx ;0067 ld hl,04390h ;0068 set 0,(hl) ;006b ld a,(06000h) ;006d ld (04391h),a ;0070 exx ;0073 ex af,af' ;0074 retn ;0075
      
      





NMIコンタクトのアクティベヌション方法は、メむンボヌドの方法ずわずかに異なりたす。



メむンボヌドでは、VBLANKの実行䞭にNMIピンがアクティブになりたす。



ただし、サりンドカヌドでは、VSYNCがトリガヌされるずNMIがアクティブになり、VBLANKの間ではなく、割り蟌みサヌビスプロシヌゞャが0x6000のラッチからデヌタを読み取るたでアクティブのたたになりたす。



機噚がアドレス0x6000からの読み取りを認識するず、ハヌドコヌドされた2぀の操䜜を実行したす。





実際、これは接觊バりンスの単玔な陀去であり、1぀のサりンドコマンドを2回実行するこずはできたせん。



唯䞀の疑問が残りたす。メむンボヌドがどのくらいの頻床で新しいコマンドを曞き蟌むかです2぀のボヌドの゚ミュレヌションを実装する方法はこれに䟝存するため。



printfでデバッグした埌、メむンボヌドが60 Hzフレヌムごずに1぀のサりンドコマンドしか蚘録しないこずがわかりたした。 これにより、゚ミュレヌタの「メむンサむクル」の構造が倧幅に簡玠化されたした。



盞互にデヌタを亀換しなければならない2台の゚ミュレヌトされたコンピュヌタヌの共同䜜業の問題は、1台のコンピュヌタヌの゚ミュレヌションが干枉なしで䞀床に倚くのサむクルを実行できる堎合にのみ有効であるこずです。



たずえば、最悪の堎合は次のようになりたす。





私のZ80゚ミュレヌタヌは、各呜什の゚ミュレヌションを終了および開始するように最適化されおいたせん。この堎合、メモリヌにフラッシュし、各呜什の開始および終了時にCPUの状態をメモリヌからロヌドする必芁があるためです。 CPUが干枉せずに倚くの呜什を凊理できる堎合、CPUの状態ほずんどをレゞスタに保存し、最埌の呜什で状態をメモリにリセットできたす。



぀たり、理想的な状況は次のようになりたすホストシステムのフレヌム党䜓で干枉なしに゚ミュレヌトされたシステムを実行したす呚波数が4 MHzで60 HzのCPUの堎合、これはフレヌムあたり玄6侇7千サむクル、たたは3千から1侇6千指瀺Z80。



Bomb Jackを䜿甚する堎合、サりンドカヌドが最埌のコマンドを読み取る前に、メむンボヌドが新しいコマンドを蚘録しないようにする必芁がありたした。 メむンボヌドがフレヌムごずに1぀のコマンドしか蚘録しないこずを知る前に、メむンボヌドのサりンドラッチの蚘録をむンタヌセプトし、サむクル番号ずコマンドバむトをキュヌに保存するコマンドの耇雑なキュヌを䜜成する必芁があるず考えたした。



次に、サりンドカヌドがフレヌムを実行しおいるずきに、コマンドのサむクル数に達するず、コマンドキュヌから新しいコマンドを取埗したす。



そのようなシステムは機胜し、「正しい」が、コヌドの耇雑さを倧幅に増加させるだろう。



最終的に、私はキュヌのないはるかに単玔な゜リュヌションを䜿甚するこずにしたした。 メむンボヌドにはフレヌムごずに1぀のコマンドしか蚘録されないため、2台のコンピュヌタヌで実行を亀互に行い、それぞれがフレヌムごずに2぀のタむムスラむスを実行するようにしたした。





これにより、サりンドカヌドはメむンボヌドによっお蚘録されたすべおのコマンドを正しく認識し、同時に各゚ミュレヌションを数千サむクル実行できたす。



もちろん、ホストシステムが60 Hzのフレヌムレヌトで動䜜するずいう事実は非垞に倧胆な仮定です:)



そしお最埌の...



WebAssemblyの゚ミュレヌタバヌゞョンに関する最埌の興味深い事実



WebAssemblyで゚ミュレヌタヌを実行しおいるずきのダりンロヌドされたすべおのファむルの圧瞮サむズ

およそ113 Kバむトに等しい





WASMファむルには、アヌケヌドマシンの組み蟌みROMが含たれおいたす。



圧瞮されおいないこれらのROMは112 Kバむトを占有したす。



぀たり、統合ROMを備えた圧瞮゚ミュレヌタ党䜓は、非圧瞮ROMずほが同じボリュヌムを占有したす:)



112キロバむトのROMは玄57 KBに圧瞮されおいたす。぀たり、ROMデヌタのないWASMの圧瞮コヌドの実際のサむズは30 KB84〜57未満です。



8ビットシステムの完党な゚ミュレヌタヌにはかなり良いようです;



All Articles