Top Banner
1 ゆとりでも作れる OS 筑波大学 1 ranha こと上里 友弥
67

1000sp4 SNES EMU

Jun 20, 2015

Download

Technology

ranha

This slide was shown in 1000speakers 4
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: 1000sp4 SNES EMU

1

ゆとりでも作れるOS

筑波大学 1年

ranhaこと上里 友弥

Page 2: 1000sp4 SNES EMU

2

自己紹介

泣く子も苦笑い 89世代花の ゆ と り

筑波大学無試験 (?)入学者えーしー

Page 3: 1000sp4 SNES EMU

3

OSは天からの贈り物!

Page 4: 1000sp4 SNES EMU

4

では断じてない!

Page 5: 1000sp4 SNES EMU

5

おぺれーてぃんぐしすてむ

今日もどこかで誰かが書いている。

人が書いてる=>完全無欠じゃない

Page 6: 1000sp4 SNES EMU

6

OS を書こう

自分の好きな言語で書こう!

Page 7: 1000sp4 SNES EMU

7

プログラマの 3 大夢 (1)

OS を作る

Page 8: 1000sp4 SNES EMU

8

プログラマの 3 大夢 (2)

言語を作る

Page 9: 1000sp4 SNES EMU

9

プログラマの 3 大夢 (3)

CPU を作る

Page 10: 1000sp4 SNES EMU

10

今日は OS を作ろうとしてみる

ゆとりなので、 Intelのマニュアルとか読めない!

もとい読みたくない

Page 11: 1000sp4 SNES EMU

11

はじめて読む 486

これで i486の仕様を 漠然と掴めるよ!

Page 12: 1000sp4 SNES EMU

12

まずブートローダから

手始めに ブートローダから書く

Page 13: 1000sp4 SNES EMU

13

?!

Page 14: 1000sp4 SNES EMU

14

どうせOS書くんだったら

Page 15: 1000sp4 SNES EMU

15

IntelのアレとかAMDのアレとか

SPARCのアレとかそこから作る

Page 16: 1000sp4 SNES EMU

16

そうだ

エミュレータを書こう!!

Page 17: 1000sp4 SNES EMU

17

改 . ゆとりでも作れるエミュ

筑波大学 1年

ranhaこと上里 友弥

Page 18: 1000sp4 SNES EMU

18

どういうわけでそういうわけ?

ハードウェア的には作れると思えない。

(電気回路論理回路なにそれ、半田とか見た記憶も無い )

Page 19: 1000sp4 SNES EMU

19

というのは建前で

OS自作入門なんていう本も出た事ですし、ゆとり的には

他の人と被ってる事はやりたくない。

Page 20: 1000sp4 SNES EMU

20

というのは冗談で

本当は

FinalFantasy4がやりたかっただけ

Page 21: 1000sp4 SNES EMU

21

それだったら

ソフトウェア的に実現しる

Page 22: 1000sp4 SNES EMU

22

でも i486 は嫌だ

エミュレータと言えばゲーム機

ゲーム機といえば・・・

Page 23: 1000sp4 SNES EMU

23

スーパーファミコン!スーパーファミコン!

Page 24: 1000sp4 SNES EMU

24

スーファミ最強 1スーパーマリオワールド ドラゴンクエスト V 天空の花嫁F­ZERO 真・女神転生ファイナルファイト ウィザードリィ Vシムシティ 餓狼伝説ファイナルファンタジー IV ファイナルファンタジー V超魔界村 …半熟英雄 ああ、世界よ半熟なれ !!悪魔城ドラキュラ エイリアン VS プレデター

ゼルダの伝説 神々のトライフォース スターフォックスダンジョンマスター シムアント高橋名人の大冒険島 ジョジョの奇妙な冒険

ロマンシング サ・ガ ドラゴンボール Z 超武闘伝弟切草 ブレス オブ ファイア 竜の戦士ファイナルファイト・ガイ スーパーボンバーマンストリートファイター II ファイナルファイト 23×3EYES 聖魔降臨伝 ヨッシーのクッキースーパーマリオカート エイリアン 3

Page 25: 1000sp4 SNES EMU

25

スーファミ最強 2ストリートファイター II ターボ スーパーボンバーマン 2スーパーマリオコレクション スレイヤーズ聖剣伝説 2 MOTHER2  ギーグの逆襲

トルネコの大冒険 不思議のダンジョン サムライスピリッツ 超時空要塞マクロス スクランブルバルキリー 真・女神転生 if...

す~ぱ~ぷよぷよ 極上パロディウス ロマンシング サ・ガ 2 かまいたちの夜

ドラゴンボール Z 超武闘伝 2 スーパードンキーコングロックマン X ロックマン X2

スーパー・スター・ウォーズ 帝国の逆襲 クロノ・トリガードラゴンクエスト I ・ II ロマンシング サ・ガ 3

ファイアーエムブレム 紋章の謎 ドラゴンクエスト VI 幻の大地魔神転生 星のカービィ スーパーデラックス真・女神転生 II ファイアーエムブレム 聖戦の系譜スーパーメトロイド スーパードンキーコング 2 ファイナルファンタジー VI ときめきメモリアル 伝説の樹の下で

Page 26: 1000sp4 SNES EMU

26

自分の作ったエミュレータで

かつての感動をもう一度・・・。

Page 27: 1000sp4 SNES EMU

27

もとい

FinalFantasy4

Page 28: 1000sp4 SNES EMU

28

出来るかどうかとかは二の次

取り敢えず仕様をググり始めた春先の夜中

Page 29: 1000sp4 SNES EMU

29

そもそもエミュレートとは

ソフトウェア的に、CPU などのハードウェアレベルを

実現・模倣する事。

ゲームする事では無い。

Page 30: 1000sp4 SNES EMU

30

取りかかり

0.ROM解析1.CPU部エミュレータ2.PPU部エミュレータ3.SPU部エミュレータ

Page 31: 1000sp4 SNES EMU

31

そもそも SNES の中身って

CPU:65C816互換のカスタム 5A22RAM 128KB DRAM

PPU:Picture Processing Unit(Co­Processor)

SPU:Sound Processing Unit(Co­Processor)

Page 32: 1000sp4 SNES EMU

32

65C816(1)レジスタは 9本

●A:Accumulator Regs(16bit)●X,Y:Index Regs(16bit)●D:Direct Pointer(16bit)●S:Stack Pointer(16bit)●PC:Program Counter(16bit)●PB:Program Bank Regs(8bit)●DB:Data Bank Regs(8bit)●P:Status Regs(8bit)

Page 33: 1000sp4 SNES EMU

33

65C816(2)

メモリアドレス空間は 24bitHigh8bit = Bank

Lower16bit = Addressという分け方に成っている。

例えば現在の命令を取り出すにはexec(BANK(PB):ADDR(PC))

Page 34: 1000sp4 SNES EMU

34

65C816(3)

命令数 256(0x00  〜 0xFF)本質的な命令は多くはない。

ADC,AND,EOR,ORA,Brunching,BIT,Status,CMP,Copy,INC,DEC,

Jumping,Load,Store,Stack,Shift,Interrupt    とちょっとの etc

Page 35: 1000sp4 SNES EMU

35

65C816(4)

割り込み (Interrupt):COP: コプロセッサ割り込み

BRK:BRK命令実行時割り込みABORT:ハードウェア特殊信号NMI:Non Maskable InterruptRESET:電源投入、リセット時

IRQ:ハードウェア信号

Page 36: 1000sp4 SNES EMU

36

65C816(5)ステータスレジスタ

●P:NVMXDIZCE●N= ネガティブ (Accの bit7が 1)●V= オーバーフロー●M= メモリモード (0=16bit 1=8bit)●X= インデックスモード (0=16bit 1=8bit)●I=IRQの可否●Z=演算結果が 0の時にセット●C= キャリー発生時にセット●E=( エミュレーション | ネイティブ ) モード

Page 37: 1000sp4 SNES EMU

37

65C816(6)

エミュレーションモード65C816は実際には

NESの CPU(6502)上位として捉えられ、下位互換として NES も実行出来る。

一方で 65C816専用モードとしては、 ネイティブモードがある。

Page 38: 1000sp4 SNES EMU

38

PPU(1)

In Picture Processing Unit

VRAM 64KB : タイル , タイルマップOAM 544Byte : スプライトデータCG 512Byte :色情報 (B5G5R5)

Page 39: 1000sp4 SNES EMU

39

PPU(2)

タイル (tile)SNESのグラフィック base

タイルの集合が BG

BGは 0,1,2,3これらが VRAM にストアされる2bytevhopppcc cccccccc

Page 40: 1000sp4 SNES EMU

40

PPU(3)Sprite

キャラクタを表現Sprite データは X,Y座標にパレットデータ等を独立に含む。

4byteByte 1    xxxxxxxx x: X coordinateByte 2    yyyyyyyy y: Y coordinateByte 3    cccccccc c: starting character (tile) number    p: palette numberByte 4    vhoopppc v: vertical flip   h: horizontal flip  o: priority bits

Page 41: 1000sp4 SNES EMU

41

SPU

Sound Processing Unit良く分からない。

”The SPC 700 is a very stupid sound chip with about the worst handling

  that you have seen in your lifetime.”けど凄い評価。

Page 42: 1000sp4 SNES EMU

42

ROM 解析

大部分は

SMC

SuperMagiconの略

Page 43: 1000sp4 SNES EMU

43

HiROM LoROM

この 2 タイプメモリマップが若干違う

今回は LoROM だけ

Page 44: 1000sp4 SNES EMU

44

なんで LoROM?

ひとえに

FinalFantasy4

Page 45: 1000sp4 SNES EMU

45

ROM フォーマット­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­32704byte ROM data 1byte License­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­21byte GameTitle 1byte Game Version­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­1byte ROM Makeup 2byte Inverse Rom CheckSum­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­1byte ROM Type 2byte ROM CheckSum­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­1byte ROM Size­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 0xFFFA NMI_Vector1byte SRAM Size 0xFFFC RESET_Vector­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 0xFFFE IRQ_Vector1byte CountryCode

Page 46: 1000sp4 SNES EMU

46

目で見た方が早いfilename: FF4.smc         This is Japan ROMthis rom file has SMC_HEADER License : Squareignore SMC_HEADER ROM Version [1]This rom's size is 1048576 EMU nmi_vector 0xffffsuccess : finish reading file EMU reset_vector 0x8000rom size:1048576 EMU irq_vector 0xffffLo ROM Native nmi_vector 0x200rom_title : [FINAL FANTASY 4      ] Native irq_vector 0x204This ROM is SLOW_ROM    sum=accc,check= accc,comp=5333This rom is ROM&SRAM This ROM'S Check SumOKThis rom size is [8]MegaBits start reset cpu_registerThis rom have [64]KiloBits end reset cpu_register

Page 47: 1000sp4 SNES EMU

47

最初は RESET から

ROM を読み込んだられっつら SNESの世界。

最初の命令は、PB=0,PC=RESET_VECTOR

Page 48: 1000sp4 SNES EMU

48

この後

オペレーションコードとオペコード

戯れる。

Page 49: 1000sp4 SNES EMU

49

白熱するエミュレータ

Page 50: 1000sp4 SNES EMU

50

その 1デバッグが

熱い!

Page 51: 1000sp4 SNES EMU

51

喜びの声

Page 52: 1000sp4 SNES EMU

52

友達は機械語

Page 53: 1000sp4 SNES EMU

53

dump解析至上主義!

Page 54: 1000sp4 SNES EMU

54

デバッグログサイズも特厚!

ls ­lh output ­rw­r­­r­­ 1 ranha ranha 2.8G outputls ­lh output ­rw­r­­r­­ 1 ranha ranha 3.1G outputls ­lh output ­rw­r­­r­­ 1 ranha ranha 3.6G output

Page 55: 1000sp4 SNES EMU

55

dump して diff

Page 56: 1000sp4 SNES EMU

56

その 2

低レイヤー思考

Page 57: 1000sp4 SNES EMU

57

CPUの気持ちとかも分かる!

Page 58: 1000sp4 SNES EMU

58

高いレベルで推測して、低いレベルで実装する。

Page 59: 1000sp4 SNES EMU

59

その 3

マゾ度どんどん上がる

Page 60: 1000sp4 SNES EMU

60

その 4

過去のアーキテクチャに触れる感動

Page 61: 1000sp4 SNES EMU

61

当時のプログラマの魂も伝わる

Page 62: 1000sp4 SNES EMU

62

デモ

Page 63: 1000sp4 SNES EMU

63

今後

皆さんのエミュレータに期待

Page 64: 1000sp4 SNES EMU

64

しつつ、少なくとも SPU以外はちゃんと動くようにする。

(出来れば違う言語でも書きたい )

Page 65: 1000sp4 SNES EMU

65

関係無いけど

この後は、Purely Functional Operating Systemとかも考えなしにやってみたい。

Page 66: 1000sp4 SNES EMU

66

重要な問題点

カートリッジ保持でも、ROMの使用はグレーゾーン行為なので

自重。

blog に上がってるのとかは妄想。

自作 ROM に切り替えるしかない。

Page 67: 1000sp4 SNES EMU

67

参考と謝辞http://en.wikibooks.org/wiki/Super_NES_Programming

wikibooks

http://hp.vector.co.jp/authors/VA042397/snes/index.html重要な日本語資料とサンプルプログラム提供

http://www.snes9x.com/相当強い SNES エミュレータ ソースコードおいしいです

http://www.westerndesigncenter.com/wdc/datasheets/Programmanual.pdf65816の命令群

インテル ®  アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル的な何か