独自のプラットフォヌム。 パヌト0.2理論。 通蚳CHIP8

はじめに


こんにちは䞖界 今日、蚀語仕様 CHIP8の翻蚳がありたす。 この蚘事には、理論的な郚分のみが含たれおいたす。


* COSMAC ELFのすべおの栄光*

コスマックELF


CHIP8ずは䜕ですか


CHIP8は、 RCA COSMAC VIPで䜿甚するために70幎代にJoseph Weisbeckerによっお開発されたむンタヌプリタ型プログラミング蚀語です。 その埌、 COSMAC ELF 、 Telmac 1800 、ETI 660、DREAM 6800で䜿甚されたした。31 35呜什により、64 x 32ピクセルの解像床でシンプルなサりンド、モノクログラフィックスを出力でき、16個のナヌザヌボタンも䜿甚できたした。 今日、CHIP-8ぱミュレヌションの基本的なスキルを教えるために䜿甚されたす解釈ではありたせん。 しばしば誀っお「゚ミュレヌタ」ず呌ばれるCHIP-8むンタヌプリタヌは、増え続けるプラットフォヌムのプラットフォヌムに存圚したす。 この豊富なむンタヌプリタヌは、CHIP-8むンタヌプリタヌずシステム゚ミュレヌタヌの蚭蚈の類䌌性に関連しおいたす。 ゚ミュレヌタヌを理解したい人は、倚くの堎合、CHIP-8むンタヌプリタヌを䜜成するこずから始めたす。



その単玔さのために、倚数のゲヌムずプログラムがCHIP-8で䜜成されたした。 これは、プログラマヌが倚くの堎合プログラミング蚀語に限定されないこずを蚌明しおいたす。


CHIP-8呜什はメモリに盎接保存されたした。 最新のコンピュヌタヌでは、バむナリデヌタをメモリに手動で入力するこずなく保存できたす。 COSMAC VIP仕様では、コヌドが512バむト0x200のオフセットでメモリにロヌドされるず想定しおいたす。 CHIP-8のほずんどのゲヌムずプログラムは、メモリを操䜜するずき、そのようなオフセットを想定しおいたす。


CHB-8メモリ内のプログラムは、MSBファヌスト最も重芁なバむトが最初-最も「重芁な」バむトが最初に保存されるを想定しお、ビッグ゚ンディアンに保存されるこずに泚意しおください。 他の呜什がなかった堎合、呜什は2バむト順に実行されたす。


CHIP-8呜什にはメモリ内のデヌタたたは呜什ぞのポむンタが含たれおいるため、コヌドを倉曎するには呜什内のアドレスを倉曎する必芁がありたす。 幞いなこずに、疑䌌アセンブラはこの問題を解決したす。 CHIP-8の倧量のドキュメントには、いく぀かの指瀺8XY3、8XY6、8XY7、および8XYEの説明は含たれおいたせんが、ここでは説明したす。


建築


GPR汎甚レゞスタヌRON-汎甚レゞスタヌ


すべおの算術挔算はレゞスタヌを䜿甚したす。 CHIP-8は16個のレゞスタを蚘述したす。 すべおのレゞスタは、8ビットの笊号なしで、汎甚レゞスタを匕数ずしお受け入れる呜什で䜿甚できたすが、最埌のレゞスタV [0xF]オヌバヌフロヌレゞスタを倉曎できる呜什があるこずに泚意しおください。


擬䌌コヌド


u8 V[16] <= 0; 

間違いを犯さないでください。最埌のレゞスタは、䞀郚の呜什で特殊レゞスタずしお䜿甚されおいたすが、完党な8ビットレゞスタです。 仕様では、操䜜で最埌のレゞスタを䜿甚しないこずを掚奚しおいたす。


I登録


レゞスタヌIは16ビットのレゞスタヌです。 それにもかかわらず、最初の12ビットのみを䜿甚したす。


擬䌌コヌド


 u16 I <= 0; 

指定挏れオヌバヌフロヌが発生するずどうなりたすか


PC登録


PCレゞスタはレゞスタIに䌌おおり、指瀺のみを瀺したす。
指定挏れオヌバヌフロヌが発生するずどうなりたすか


スタック


CHIP-8は、深さが12セルのスタックを衚したす。 スタックぞの盎接アクセスPUSH / POP /などはありたせんが、スタックを䜿甚する呌び出し呜什ず戻り呜什がありたす。
泚16個のセルが瀺されおいたす。 そしおここ -12。


説明曞


すべおの呜什は16進衚蚘です。
指定に぀いおは、衚を参照しおください。



レゞスタず算術


6XNN-レゞスタに定数をロヌドしたす。
レゞスタの最も単玔な呜什は6XNN 16進衚蚘です。 Xはレゞスタであり、NNはレゞスタにロヌドされる定数です。 たずえば、6ABB-倀10V [0xA]、0〜15のレゞスタ16でレゞスタに倀BB 187をロヌドしたす。


擬䌌コヌド


 V[X] <= 0xNN 

7XNN-レゞスタヌに定数を远加ADDI
定数NNを番号Xのレゞスタに远加し、番号Xのレゞスタに保存したす。オヌバヌフロヌレゞスタは倉曎されたせん。


 V[X] <= V[X] + NN 

8XY0-レゞスタを別のレゞスタに保存MOV
レゞスタを操䜜する別の呜什。 8XY0レコヌドが8XY0たす。 Xは、レゞスタが番号Yでコピヌされるレゞスタ番号です。


擬䌌コヌド


 V[X] <= V[Y] 

8XY4-2぀のレゞスタヌを远加ADD
数倀Yのレゞスタの倀をレゞスタXに加算し、倀をレゞスタXに保存したす。オヌバヌフロヌが発生した堎合、オヌバヌフロヌレゞスタは1に蚭定されたす。オヌバヌフロヌが発生しなかった堎合、オヌバヌフロヌレゞスタは0にリセットされたす。


 V[X] <= (V[X] + V[Y]) & 0xFF; V[F] <= (V[X] + V[Y] >= 256); 

私のミスをしないでくださいオヌバヌフロヌレゞスタはいずれの堎合でも倉曎されたす。
指定挏れレゞスタXがオヌバヌフロヌレゞスタである堎合はどうなりたすか


8XY5-レゞスタヌから枛算SUB
番号XのレゞスタからレゞスタYの倀を枛算し、借甚が発生した堎合おおよその転送、オヌバヌフロヌレゞスタを1に蚭定したす。借甚が発生しおいない堎合は、オヌバヌフロヌレゞスタを0に蚭定したす。


8XY7-逆枛算SUB
レゞスタXをレゞスタYからレゞスタXの倀を枛算した結果に蚭定したす。借甚が発生した堎合は、オヌバヌフロヌレゞスタを1に蚭定したす。借甚が発生しなかった堎合は、オヌバヌフロヌレゞスタを0に蚭定したす。


8XY2、8XY1および8XY3-論理挔算AND、OR、XOR
レゞスタXを挔算結果に蚭定
8XY2-論理的な「および」、
8XY1-論理「OR」、
8XY3-排他的OR
2぀のオペランドレゞスタXずレゞスタY。オヌバヌフロヌレゞスタを倉曎したせん。
私の間違いをしないでくださいこれらの操䜜はオヌバヌフロヌレゞスタを倉曎したせん。
泚入力ミスはありたせん。 8XY2-AND。 8XY1 OR。 8XY3 XOR。


8XY6-右シフト
レゞスタYを右にシフトした結果をレゞスタXに保存したす。
オヌバヌフロヌレゞスタをレゞスタYの䞋䜍ビットに蚭定したす。
間違いをしないでくださいレゞスタYをシフトした結果は、レゞスタYではなく、レゞスタXに保存されたす。


8XYE-右シフト
レゞスタYの䞊䜍ビットをオヌバヌフロヌレゞスタに保存したす。
レゞスタYをレゞスタXにシフトした結果を保存したす。


CXNN- ランダム 乱数
レゞスタXの倀を論理「AND」定数NNおよび ランダム 乱数。


実行制埡泚翻蚳「フロヌ制埡」


1NNN-NNNぞゞャンプ
PCをNNN倀に入れたす。
次の呜什はNNNアドレスから実行されたす


BNNN-NNN + V0ぞゞャンプ
PCをNNN + V0に配眮したす。
次の呜什は、アドレスNNN + V0から実行されたす


2NNN-関数を呌び出す呌び出しサブルヌチン
2NNNで関数を呌び出したす。 倀PC + 2がスタックに曞き蟌たれたす。


00EE-サブルヌチンからの戻り
PCレゞスタは、スタックの最埌の芁玠に蚭定されたす。


3XNN-定数ずケヌスが等しい堎合、呜什をスキップしたす。
定数NNずレゞスタXが等しい堎合、呜什PC + 4をスキップしたす。 それ以倖の堎合は、スキップしないでくださいPC + 2。


5XY0-䞡方のレゞスタが等しい堎合、呜什をスキップしたす。
レゞスタYずレゞスタXが等しい堎合、呜什PC + 4をスキップしたす。 それ以倖の堎合は、スキップしないでくださいPC + 2。


4XNN-定数ずケヌスが等しくない堎合、ステヌトメントをスキップしたす。
定数NNずレゞスタXが等しくない堎合、呜什PC + 4をスキップしたす。 それ以倖の堎合は、スキップしないでくださいPC + 2。


9XY0-レゞスタが等しくない堎合、呜什をスキップしたす。
レゞスタYずケヌスXが等しくない堎合、呜什PC + 4をスキップしたす。 それ以倖の堎合は、スキップしないでくださいPC + 2。


タむマヌ


CHIP-8には2぀のタむマヌがありたす。 1぀のタむマヌは遅延をカりントし翻蚳遅延タむマヌ、もう1぀の「サりンドタむマヌ」翻蚳サりンドタむマヌは、タむマヌの倀が0より倧きい間、サりンドを再生したす。 䞡方のタむマヌは、呚波数60Hz1秒あたり60回で固有倀を枛らしたす。 遅延タむマヌから読み取るこずができたすが、「サりンドタむマヌ」から読み取るこずはできたせん。


FX15-遅延タむマヌ倀をレゞスタXに蚭定したす。
FX07-レゞスタXの倀を遅延タむマヌの倀に蚭定したす。
ここではすべおが明確です:)
FX18-サりンドタむマヌの倀をレゞスタXの倀に蚭定したす。
泚COSMAC VIPでは、倀1は効果がないこずが瀺されおいるこずを思い出しおください。


入力キヌパッド


入力には、0〜9の16個のボタンずAFが䜿甚されたす。 仕様の省略この番号にボタンがない堎合はどうなりたすか。 䟋17。
FX0A-プレス埅ち。


レゞスタXで指定されたキヌが抌されるたで実行を䞀時停止したす。
間違いを犯さないでください。キヌストロヌクではなく、この特定のキヌのキヌストロヌクのみです。


EX9E-レゞスタヌXの倀に察応するボタンが抌された堎合、以䞋の指瀺をスキップしたす。
EXA1-レゞスタXの倀に察応するボタンが抌されおいない堎合、以䞋の指瀺をスキップしたす。


ここではすべおが明確だず思いたす。


登録I


ANNN-登録IにNNNを曞き蟌みたす。


FX1E-レゞスタヌXの倀をレゞスタヌIに远加したす。
オヌバヌフロヌが発生した堎合、オヌバヌフロヌレゞスタは1に蚭定され、それ以倖の堎合は0に蚭定されたす。


グラフィックずスプラむト


泚グラフィックに぀いおは、実際の郚分で詳しく説明したす。
DXYN-スプラむトを描画したす。


画面䞊の䜍眮にサむズNバむト非れロ倀のスプラむトを描画したすVx、Vy。 スプラむトはメモリのアドレスIにありたす。スプラむトは論理排他的ORXORずしお描画されたす。 ピクセルを再描画する堎合1,1-> 0、オヌバヌフロヌレゞスタは1に蚭定され、そうでない堎合は0に蚭定されたす。


仕様省略



00E0-画面をクリアしたす。


FX29-レゞスタXで指定された番号のスプラむトアドレスにIの倀を蚭定したす。
スプラむトは最初の512バむトに保存されたす。


フォント


Cのこのテヌブル


 unsigned char chip8_fontset[80] = { 0xF0, 0x90, 0x90, 0x90, 0xF0, // 0 0x20, 0x60, 0x20, 0x20, 0x70, // 1 0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2 0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3 0x90, 0x90, 0xF0, 0x10, 0x10, // 4 0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5 0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6 0xF0, 0x10, 0x20, 0x40, 0x40, // 7 0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8 0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9 0xF0, 0x90, 0xF0, 0x90, 0x90, // A 0xE0, 0x90, 0xE0, 0x90, 0xE0, // B 0xF0, 0x80, 0x80, 0x80, 0xF0, // C 0xE0, 0x90, 0x90, 0x90, 0xE0, // D 0xF0, 0x80, 0xF0, 0x80, 0xF0, // E 0xF0, 0x80, 0xF0, 0x80, 0x80 // F }; 

ここから撮圱。


FX33-レゞスタ倀をI、I + 1およびI + 2の2進10進圢匏で保存したす。
参照 バむナリ10進コヌド およそBCD-バむナリコヌド10進


レゞスタずメモリ


FX55-レゞスタV0〜VXの倀をメモリ開始アドレスIに包括的に保存したす。
実行埌、レゞスタIはI + X + 1に等しくなりたす。䞀郚のむンタヌプリタヌはこの芏則を無芖したすが


FX65-レゞスタV0〜VXを、アドレスIから始たるメモリに栌玍されおいる倀に包括的にロヌドしたす。
実行埌、レゞスタIはI + X + 1に等しくなりたす。䞀郚のむンタヌプリタヌはこの芏則を無芖したすが


残りすべお


通蚳はどの呚波数で動䜜したすか


これに぀いおは、オリゞナルには䜕も芋぀かりたせん。 むンタヌネットからさたざたな呚波数が埗られたした 1000Hz 、 840Hz 、 540Hz 、500Hz、さらには60Hz。


ゞャンプが揃っおいない堎合はどうなりたすか
これに関する情報は芋぀かりたせんでしたが、呜什はダりンロヌドされお実行されるず思いたす。


最初の512バむトから読み取りたたは曞き蟌みを行うずどうなりたすか
再び䜕も芋぀かりたせん。 録音時には0を指定しお無芖する必芁があるず思いたす。


終わり


これで終わりです。 タむプミスに぀いおは、プラむベヌトメッセヌゞを曞きたす。 どんなコメントでも喜んでいたす。 実甚的な郚分が䜜成されおいたす。 実際的な郚分は、CC ++ではないおよびSDL2になりたす。


ここでオリゞナルを芋぀けるこずができたす。 ここにもう少し情報がありたす 。 ここで別の実甚的なチュヌトリアル。



Source: https://habr.com/ru/post/J316788/


All Articles