Top Banner
JS ででででででででででででで でででででで
31

JSでファミコンエミュレータを作った時の話

Feb 17, 2017

Download

Technology

sairoutine
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: JSでファミコンエミュレータを作った時の話

JS でファミコンエミュレータを作った時の話

Page 2: JSでファミコンエミュレータを作った時の話

自己紹介• HN: さい • Twitter: @sairoutine

• サーバーサイドエンジニア• フロントエンドフレームワーク Mithril の普及に努めてます

Page 3: JSでファミコンエミュレータを作った時の話

ファミコン

Page 4: JSでファミコンエミュレータを作った時の話

のエミュレータを JavaScript で作る

※ エミュレータ・・・動作を再現したソフトウェア

Page 5: JSでファミコンエミュレータを作った時の話

FaithJS

Page 6: JSでファミコンエミュレータを作った時の話

DEMO

Page 7: JSでファミコンエミュレータを作った時の話

FaithJS

• ブラウザで遊べる NES エミュレータ• Web Audio と Canvas を使用• ROM データを読み込んで CPU を再現してる• 割りとちゃんと 60FPS 出る• http://sairoutine.github.io/faithjs/public/

Page 8: JSでファミコンエミュレータを作った時の話

動機

Page 9: JSでファミコンエミュレータを作った時の話

僕も OS とは何かを知りたい!

Page 10: JSでファミコンエミュレータを作った時の話

ファミコンアーキテクチャについて

Page 11: JSでファミコンエミュレータを作った時の話

概要

http://web.sfc.wide.ad.jp/~gucchan/docs/nesdev.pdf より引用

Page 12: JSでファミコンエミュレータを作った時の話

http://web.sfc.wide.ad.jp/~gucchan/docs/nesdev.pdf より引用

Page 13: JSでファミコンエミュレータを作った時の話

ROM の用意• ネットに落ちてるのはもちろん違法• 自分で吸い出す?• 有志が自作プログラムを公開してるので使わせてもらう• FaithJS は門真なむ様のゲームを使用させてもらって動作確認http://www.geocities.jp/littlimi/fc.htm• nestest というテスト用 ROM もあります

Page 14: JSでファミコンエミュレータを作った時の話

主な情報源• NesDevhttp://wiki.nesdev.com/w/index.php/Nesdev_Wiki• NES on FPGAhttp://pgate1.at-ninja.jp/NES_on_FPGA/index.html• ギコ猫でもわかるファミコンプログラミングhttp://gikofami.fc2web.com/

Page 15: JSでファミコンエミュレータを作った時の話

リファレンスだけでは実装イメージが全然湧かない!!!

Page 16: JSでファミコンエミュレータを作った時の話

既存のエミュレータコードを読むWeb NEShttps://github.com/peteward44/WebNESJavaScript FC エミュレータhttp://twoseater.hp2.jp/nes/index.htmlbjnehttps://github.com/tanakh/bjneCycloahttps://github.com/ledyba/Cycloa

Page 17: JSでファミコンエミュレータを作った時の話

未解析部分も多々あるので実装が正!

Page 18: JSでファミコンエミュレータを作った時の話

事前知識• CPU

• OS

• メモリ• アセンブラ• バイナリ• 英語

Page 19: JSでファミコンエミュレータを作った時の話

レジスタ

Page 20: JSでファミコンエミュレータを作った時の話

• 8bit しかない•自由に使えるレジスタは A

X Y の3つ

Page 21: JSでファミコンエミュレータを作った時の話

描画の仕組み

http://web.sfc.wide.ad.jp/~gucchan/docs/nesdev.pdf より引用

Page 22: JSでファミコンエミュレータを作った時の話

6502 アセンブラの命令

Page 23: JSでファミコンエミュレータを作った時の話

ここからやっと JS の話!

Page 24: JSでファミコンエミュレータを作った時の話

すごい大雑把な処理の流れvar opcode = this.Get(this.PC++);

this.CPUClock += this.CycleTable[opcode];

this.PpuRun();

this.ApuRun();

this.ExecuteOpCode(opcode);

Page 25: JSでファミコンエミュレータを作った時の話

オペコードの実装NES.prototype.ExecuteOpCode = function (opcode) {

switch(opcode){case 0xA1://LDA XINDthis.LDA(this.GetAddressIndirectX());break;case 0xA5://LDA ZPthis.LDA(this.GetAddressZeroPage());break;

以降、 Switch 文が命令の数だけ延々続く

Page 26: JSでファミコンエミュレータを作った時の話

処理の遅い演算は事前に全パターン演算しておいてキャッシュするthis.ZNCacheTable = new Array(256);this.ZNCacheTable[0] = 0x02; // 0b0010var i;for(i=1; i<256; i++) {

this.ZNCacheTable[i] = i & 0x80;}

Page 27: JSでファミコンエミュレータを作った時の話

これで 60FPS!

Page 28: JSでファミコンエミュレータを作った時の話

まとめ

NES を実装するのはいいぞ!

Page 29: JSでファミコンエミュレータを作った時の話

NES を実装すると良いこと• CPU の知識が得られる (6502 だけでなく、

8086 や i386, x86_64 にも興味関心が出てきた• アセンブラに興味関心が出てくる! ( 例えばある処理が重い軽いの話に、アセンブラレベルで処理が追えるようになる )• 英語が読めるようになる! ( 有志のリファレンスはほぼ英語なので )

Page 30: JSでファミコンエミュレータを作った時の話

みんなもやってみよう!

Page 31: JSでファミコンエミュレータを作った時の話

ありがとうございました