Slide 1

Slide 1 text

PHPで学ぶ コンピュータアーキテクチャ Learning: computer architecture with PHP 長谷川智希 HASEGAWA Tomoki

Slide 2

Slide 2 text

この資料は後ほど公開します This slide will be published later.

Slide 3

Slide 3 text

はじめに Introduction

Slide 4

Slide 4 text

このトークの内容 Contents of this talk

Slide 5

Slide 5 text

今風のカッコいいPHPの書き方 Modern style PHP coding.

Slide 6

Slide 6 text

今風のカッコいいPHPの書き方 Modern style PHP coding.

Slide 7

Slide 7 text

今風のカッコいいPHPの書き方 Modern style PHP coding. クールなライブラリやフレームワーク Cool libraries / frameworks.

Slide 8

Slide 8 text

今風のカッコいいPHPの書き方 Modern style PHP coding. クールなライブラリやフレームワーク Cool libraries / frameworks.

Slide 9

Slide 9 text

今風のカッコいいPHPの書き方 Modern style PHP coding. クールなライブラリやフレームワーク Cool libraries / frameworks. PHPをそんな風に使うのか!という驚き Exciting PHP usage.

Slide 10

Slide 10 text

今風のカッコいいPHPの書き方 Modern style PHP coding. クールなライブラリやフレームワーク Cool libraries / frameworks. PHPをそんな風に使うのか!という驚き Exciting PHP usage.

Slide 11

Slide 11 text

今風のカッコいいPHPの書き方 Modern style PHP coding. クールなライブラリやフレームワーク Cool libraries / frameworks. PHPをそんな風に使うのか!という驚き Exciting PHP usage. ゲームボーイの仕様の知識 Knowledge of GAMEBOY specs.

Slide 12

Slide 12 text

今風のカッコいいPHPの書き方 Modern style PHP coding. クールなライブラリやフレームワーク Cool libraries / frameworks. PHPをそんな風に使うのか!という驚き Exciting PHP usage. ゲームボーイの仕様の知識 Knowledge of GAMEBOY specs.

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

今日の話: This story,

Slide 15

Slide 15 text

あまりに話したくてLTでやってみた I tried to talk in LT.

Slide 16

Slide 16 text

時間が足りず会場の全員を 置き去り x 2 LT is too short for this story, All audience was one lap behind!!

Slide 17

Slide 17 text

カンファレンスでなら時間が足りる! There is sufficient time if it was conference session!

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

5/21 福岡公演 FUKUOKA

Slide 20

Slide 20 text

5/21 福岡公演 FUKUOKA 7/3 東京公演 TOKYO

Slide 21

Slide 21 text

5/21 福岡公演 FUKUOKA 7/16 大阪公演 OSAKA 7/3 東京公演 TOKYO

Slide 22

Slide 22 text

大分満足した It was considerably satisfied

Slide 23

Slide 23 text

千秋楽公演 It’s a final day of this talk

Slide 24

Slide 24 text

#phpkansai / ブログ / 懇親会 面白かったら リアクションお願いします!

Slide 25

Slide 25 text

ライフワーク: Web / iOSアプリ開発, ビール, 電子工作,
 サッカー観戦, レンタルカートレース, … 長谷川 智希 Web / iOS App Development, Beer, IoT, Watch soccer match, Rental Kart Racing, … デジタルサーカス株式会社 副団長CTO Digital Circus, Inc. Vice-master CTO Tokyo, Japan Lifework: @tomzoh

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

WE ARE HIRING!! Web Development Mobile App Development ( ) (iOS, Android) http://www.dgcircus.com Omotesando, Tokyo

Slide 29

Slide 29 text

今日のテーマ Learning: computer architecture with PHP PHPで学ぶ コンピュータアーキテクチャ Today’s theme

Slide 30

Slide 30 text

今年2月23日 23, February

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

terminal-gameboy-emulator

Slide 34

Slide 34 text

#Z5SBOTGSPN+1&(WFSTJPOBOESFNPWFXIJUFCBDLHSPVOE0SJHJOBMCZ&WBO"NPT.FEJB(BNF#PZ'-KQH 1VCMJD%PNBJO IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE terminal-gameboy-emulator

Slide 35

Slide 35 text

#Z5SBOTGSPN+1&(WFSTJPOBOESFNPWFXIJUFCBDLHSPVOE0SJHJOBMCZ&WBO"NPT.FEJB(BNF#PZ'-KQH 1VCMJD%PNBJO IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE terminal-gameboy-emulator

Slide 36

Slide 36 text

terminal-gameboy-emulator

Slide 37

Slide 37 text

エミュレータ エミュレータとは、機械装置やコンピュータのハードウェア (PC、ゲーム機など)の構造を、別の装置やソフトウェアで 模倣することで実現させたもの。 In computing, an emulator is hardware or software that enables one computer system to behave like another computer system. Emulator terminal-gameboy-emulator

Slide 38

Slide 38 text

terminal-gameboy-emulator

Slide 39

Slide 39 text

terminal-gameboy-emulator ??

Slide 40

Slide 40 text

demo

Slide 41

Slide 41 text

!?

Slide 42

Slide 42 text

SUGOI

Slide 43

Slide 43 text

EXCITING

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

It’s

Slide 47

Slide 47 text

We are er.

Slide 48

Slide 48 text

WE CAN READ IT!!

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

ゲームボーイのCPU CPU of GAMEBOY

Slide 51

Slide 51 text

ゲームボーイのCPU CPU of GAMEBOY IUUQTFOXJLJQFEJBPSHXJLJ(BNF@#PZ

Slide 52

Slide 52 text

ゲームボーイのCPU CPU of GAMEBOY IUUQTFOXJLJQFEJBPSHXJLJ(BNF@#PZ

Slide 53

Slide 53 text

#Z%SJLOBQBMN౤ߘऀࣗ਎ʹΑΔ࡞඼ $$දࣔܧঝ IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE #Z$$3+1(NPSJLPVEFSJWBUJWFXPSL6CDVMF͜ͷϑΝΠϧͷ೿ੜݩ$$3+1( ύϒϦοΫɾυϝΠϯ IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE #Zʢ:LBUTV UBML ʣ:LBUTV UBML TpMF ύϒϦοΫɾυϝΠϯ IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE

Slide 54

Slide 54 text

#Z%SJLOBQBMN౤ߘऀࣗ਎ʹΑΔ࡞඼ $$දࣔܧঝ IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE #Z$$3+1(NPSJLPVEFSJWBUJWFXPSL6CDVMF͜ͷϑΝΠϧͷ೿ੜݩ$$3+1( ύϒϦοΫɾυϝΠϯ IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE #Zʢ:LBUTV UBML ʣ:LBUTV UBML TpMF ύϒϦοΫɾυϝΠϯ IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE

Slide 55

Slide 55 text

レジスタ Registers Instructions 命令 Memory access and I/O メモリアクセスとI/O

Slide 56

Slide 56 text

レジスタ Registers Instructions 命令 Memory access and I/O メモリアクセスとI/O

Slide 57

Slide 57 text

LR35902の命令セット Instruction set of LR35902 http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html

Slide 58

Slide 58 text

LR35902 CPUのプログラム Program of CPU LR35902 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 0200 42 E0 43 E0 A4 E0 41 E0 01 E0 02 EA 00 D0 EA 01 0210 D0 3E 80 E0 40 F0 44 FE 94 20 FA 3E 03 E0 40 3E 0220 E1 E0 47 E0 48 3E E5 E0 49 21 26 FF 3E 80 32 3E 0230 FF 32 36 77 21 06 FF 3E BF 22 3E 04 77 3E 01 EA 0240 00 20 31 FF CF AF 21 FF DF 06 00 32 05 20 FC 21 0250 FF CF 0E 10 06 00 32 05 20 FC 0D 20 F9 21 FF 9F 0260 0E 20 AF 06 00 32 05 20 FC 0D 20 F9 21 FF FE 06

Slide 59

Slide 59 text

プログラムの実行 Program execution +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0

Slide 60

Slide 60 text

プログラムの実行 Program execution +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0

Slide 61

Slide 61 text

プログラムの実行 Program execution AF 21 DF FF 0E 10 06 00 32 05 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0

Slide 62

Slide 62 text

プログラムの実行 Program execution AF 21 DF FF 0E 10 06 00 32 05 XOR A LD HL, 0xFFDF LD C, 0x10 LD B, 0x00 LD (HL-), A DEC B +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0

Slide 63

Slide 63 text

プログラムの実行 Program execution AF 21 DF FF 0E 10 06 00 32 05 XOR A LD HL, 0xFFDF LD C, 0x10 LD B, 0x00 LD (HL-), A DEC B +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 AをAでXOR HLに0xFFDFを入れる Cに0x10を入れる Bに0x00を入れる HLが指すアドレスにAの値を入れる Bを-1する Load 0xffdf into HL XOR A with A Load 0x10 into C Load 0x00 into B Load a value A has into memory address HL points at Decrement B

Slide 64

Slide 64 text

レジスタ Registers Instructions 命令 Memory access and I/O メモリアクセスとI/O

Slide 65

Slide 65 text

SHARP LR35902 のレジスタ SHARP LR35902 registers ʜ ʜ " ' # $ % & ) - ʜ ʜ 41 4UBDL1PJOUFS 1$ 1SPHSBN$PVOUFS 8bit / 16bit registers 16bit registers Flag register ; / ) $ •Z - Zero Flag •N - Subtract Flag •H - Half Carry Flag •C - Carry Flag •0 - Not uses, always zero レジスタ: CPUが持つ、プログラム言語で言う変数 Registers: Variables in programing language.

Slide 66

Slide 66 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. PC

Slide 67

Slide 67 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. PC

Slide 68

Slide 68 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. PC

Slide 69

Slide 69 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. PC

Slide 70

Slide 70 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. PC

Slide 71

Slide 71 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. PC

Slide 72

Slide 72 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. AF 21 DF FF 0E 10 06 00 32 05 XOR A LD HL, 0xFFDF LD C, 0x10 LD B, 0x00 LD (HL-), A DEC B PC

Slide 73

Slide 73 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. AF 21 DF FF 0E 10 06 00 32 05 XOR A LD HL, 0xFFDF LD C, 0x10 LD B, 0x00 LD (HL-), A DEC B PC

Slide 74

Slide 74 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. AF 21 DF FF 0E 10 06 00 32 05 XOR A LD HL, 0xFFDF LD C, 0x10 LD B, 0x00 LD (HL-), A DEC B PC

Slide 75

Slide 75 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. AF 21 DF FF 0E 10 06 00 32 05 XOR A LD HL, 0xFFDF LD C, 0x10 LD B, 0x00 LD (HL-), A DEC B PC

Slide 76

Slide 76 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. AF 21 DF FF 0E 10 06 00 32 05 XOR A LD HL, 0xFFDF LD C, 0x10 LD B, 0x00 LD (HL-), A DEC B PC

Slide 77

Slide 77 text

プログラムカウンタ Program Counter +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 01E0 01 E0 85 E1 D1 C1 F1 D9 AF 21 FF DF 0E 10 06 00 01F0 32 05 20 FC 0D 20 F9 3E 0D F3 E0 0F E0 FF AF E0 現在実行中の命令のアドレスを指す特殊なレジスタ。 A special register that contains the address of the instruction being executed now. AF 21 DF FF 0E 10 06 00 32 05 XOR A LD HL, 0xFFDF LD C, 0x10 LD B, 0x00 LD (HL-), A DEC B PC

Slide 78

Slide 78 text

LR35902 の命令 - LD LR35902 instructions - LD LD BC, 0x1234 BCレジスタに0x1234を入れる。 Load BC register with 0x1234. LD (BC), A BCレジスタの指し示すメモリアドレスにAレジスタ の内容を入れる。 Load a value A register has into memory BC register points at.

Slide 79

Slide 79 text

LR35902 の命令 - JP / CD LR35902 instructions - JP / CD JP 0x5678 0x5678番地にジャンプする。 Jump to location 0x5678. CALL 0x8181 スタックに現在のアドレスを入れて0x8181番地に ジャンプする。 Push current address to stack pointer, then jump to 0x8181. RET スタック先頭のアドレスにジャンプする。 Jump to the location of top of stack pointer.

Slide 80

Slide 80 text

LR35902 の命令 - JP / CD LR35902 instructions - JP / CD JP 0x5678 0x5678番地にジャンプする。 Jump to location 0x5678. CALL 0x8181 スタックに現在のアドレスを入れて0x8181番地に ジャンプする。 Push current address to stack pointer, then jump to 0x8181. RET スタック先頭のアドレスにジャンプする。 Jump to the location of top of stack pointer. LD PC, 0x5678

Slide 81

Slide 81 text

LR35902 の命令 - JP / CD LR35902 instructions - JP / CD JP 0x5678 0x5678番地にジャンプする。 Jump to location 0x5678. CALL 0x8181 スタックに現在のアドレスを入れて0x8181番地に ジャンプする。 Push current address to stack pointer, then jump to 0x8181. RET スタック先頭のアドレスにジャンプする。 Jump to the location of top of stack pointer.

Slide 82

Slide 82 text

LR35902 の命令 - JP / CD LR35902 instructions - JP / CD JP 0x5678 0x5678番地にジャンプする。 Jump to location 0x5678. CALL 0x8181 スタックに現在のアドレスを入れて0x8181番地に ジャンプする。 Push current address to stack pointer, then jump to 0x8181. RET スタック先頭のアドレスにジャンプする。 Jump to the location of top of stack pointer. LD (SP), PC
 LD SP, SP+2
 LD PC, 0x8181

Slide 83

Slide 83 text

LR35902 の命令 - JP / CD LR35902 instructions - JP / CD JP 0x5678 0x5678番地にジャンプする。 Jump to location 0x5678. CALL 0x8181 スタックに現在のアドレスを入れて0x8181番地に ジャンプする。 Push current address to stack pointer, then jump to 0x8181. RET スタック先頭のアドレスにジャンプする。 Jump to the location of top of stack pointer. LD (SP), PC
 LD SP, SP+2
 LD PC, 0x8181 LD PC, (SP) LD SP, SP-2

Slide 84

Slide 84 text

レジスタ Registers Instructions 命令 Memory access and I/O メモリアクセスとI/O

Slide 85

Slide 85 text

ゲームボーイのハードウェアコンポネント CPU I/O Keys Sound Video Display Com Port Memory • RAM • Game 
 Cartridge • Video RAM Hardware components of GAMEBOY

Slide 86

Slide 86 text

GAMEBOYのメモリマップ Memory map of GAMEBOY $FFFF Interrupt Enable Flag I/O $FF80-$FFFE Zero Page - 127 bytes RAM $FF00-$FF7F Hardware I/O Registers I/O $FEA0-$FEFF Unusable Memory $FE00-$FE9F OAM - Object Attribute Memory Video RAM $E000-$FDFF Echo RAM - Reserved, Do Not Use $D000-$DFFF Internal RAM - Bank 1-7 (switchable - CGB only) RAM $C000-$CFFF Internal RAM - Bank 0 (fixed) $A000-$BFFF Cartridge RAM (If Available) Cartridge $9C00-$9FFF BG Map Data 2 Video RAM $9800-$9BFF BG Map Data 1 $8000-$97FF Character RAM $4000-$7FFF Cartridge ROM - Switchable Banks 1-xx Cartridge $0150-$3FFF Cartridge ROM - Bank 0 (fixed) $0100-$014F Cartridge Header Area $0000-$00FF Restart and Interrupt Vectors ROM IUUQXXXIVDLpOHBNFTDPN QJE #Z5SBOTGSPN+1&(WFSTJPOBOESFNPWFXIJUFCBDLHSPVOE0SJHJOBMCZ&WBO"NPT.FEJB(BNF#PZ'-KQH 1VCMJD%PNBJO IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE

Slide 87

Slide 87 text

GAMEBOYのメモリマップ Memory map of GAMEBOY $FFFF Interrupt Enable Flag I/O $FF80-$FFFE Zero Page - 127 bytes RAM $FF00-$FF7F Hardware I/O Registers I/O $FEA0-$FEFF Unusable Memory $FE00-$FE9F OAM - Object Attribute Memory Video RAM $E000-$FDFF Echo RAM - Reserved, Do Not Use $D000-$DFFF Internal RAM - Bank 1-7 (switchable - CGB only) RAM $C000-$CFFF Internal RAM - Bank 0 (fixed) $A000-$BFFF Cartridge RAM (If Available) Cartridge $9C00-$9FFF BG Map Data 2 Video RAM $9800-$9BFF BG Map Data 1 $8000-$97FF Character RAM $4000-$7FFF Cartridge ROM - Switchable Banks 1-xx Cartridge $0150-$3FFF Cartridge ROM - Bank 0 (fixed) $0100-$014F Cartridge Header Area $0000-$00FF Restart and Interrupt Vectors ROM IUUQXXXIVDLpOHBNFTDPN QJE #Z5SBOTGSPN+1&(WFSTJPOBOESFNPWFXIJUFCBDLHSPVOE0SJHJOBMCZ&WBO"NPT.FEJB(BNF#PZ'-KQH 1VCMJD%PNBJO IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE

Slide 88

Slide 88 text

GAMEBOYのメモリマップ Memory map of GAMEBOY $FFFF Interrupt Enable Flag I/O $FF80-$FFFE Zero Page - 127 bytes RAM $FF00-$FF7F Hardware I/O Registers I/O $FEA0-$FEFF Unusable Memory $FE00-$FE9F OAM - Object Attribute Memory Video RAM $E000-$FDFF Echo RAM - Reserved, Do Not Use $D000-$DFFF Internal RAM - Bank 1-7 (switchable - CGB only) RAM $C000-$CFFF Internal RAM - Bank 0 (fixed) $A000-$BFFF Cartridge RAM (If Available) Cartridge $9C00-$9FFF BG Map Data 2 Video RAM $9800-$9BFF BG Map Data 1 $8000-$97FF Character RAM $4000-$7FFF Cartridge ROM - Switchable Banks 1-xx Cartridge $0150-$3FFF Cartridge ROM - Bank 0 (fixed) $0100-$014F Cartridge Header Area $0000-$00FF Restart and Interrupt Vectors ROM IUUQXXXIVDLpOHBNFTDPN QJE #Z5SBOTGSPN+1&(WFSTJPOBOESFNPWFXIJUFCBDLHSPVOE0SJHJOBMCZ&WBO"NPT.FEJB(BNF#PZ'-KQH 1VCMJD%PNBJO IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE メモリマップドI/O Memory mapped I/O

Slide 89

Slide 89 text

エミュレータのCPU命令実装 CPU instructions implementation of emulator

Slide 90

Slide 90 text

CPU実装のソースファイル Source file of CPU implementation

Slide 91

Slide 91 text

CPU実装のソースファイル Source file of CPU implementation

Slide 92

Slide 92 text

class Opcode { public static function run(Core $core, $address) { $function = 'opcode'.$address; return Opcode::$function($core); } public static function opcode0(Core $core) { // Do Nothing... } public static function opcode1(Core $core) { $core->registerC = $core->memoryRead($core->programCounter); $core->registerB = $core->memoryRead(($core->programCounter + 1) & 0xFFFF); $core->programCounter = ($core->programCounter + 2) & 0xFFFF; } Opcodeの実装 Implementation of opcodes

Slide 93

Slide 93 text

class Opcode { public static function run(Core $core, $address) { $function = 'opcode'.$address; return Opcode::$function($core); } public static function opcode0(Core $core) { // Do Nothing... } public static function opcode1(Core $core) { $core->registerC = $core->memoryRead($core->programCounter); $core->registerB = $core->memoryRead(($core->programCounter + 1) & 0xFFFF); $core->programCounter = ($core->programCounter + 2) & 0xFFFF; } Opcodeの実装 Implementation of opcodes 0x00 NOP

Slide 94

Slide 94 text

class Opcode { public static function run(Core $core, $address) { $function = 'opcode'.$address; return Opcode::$function($core); } public static function opcode0(Core $core) { // Do Nothing... } public static function opcode1(Core $core) { $core->registerC = $core->memoryRead($core->programCounter); $core->registerB = $core->memoryRead(($core->programCounter + 1) & 0xFFFF); $core->programCounter = ($core->programCounter + 2) & 0xFFFF; } Opcodeの実装 Implementation of opcodes 0x01 LD BC, nn

Slide 95

Slide 95 text

LD BC, 0x1234 BCレジスタに0x1234を入れる。 Load BC register with 0x1234.

Slide 96

Slide 96 text

LD BC, d16 LD BC, d16 http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html

Slide 97

Slide 97 text

LD BC, d16 LD BC, d16 http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html

Slide 98

Slide 98 text

LD BC, d16 LD BC, d16 http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html

Slide 99

Slide 99 text

public static function opcode1(Core $core) { $core->registerC =
 $core->memoryRead($core->programCounter); $core->registerB = 
 $core->memoryRead(($core->programCounter + 1) & 0xFFFF); $core->programCounter = 
 ($core->programCounter + 2) & 0xFFFF; } LC BC, d16 の実装 Implementation of LD BC, d16 PC PC + 1 0x01 0x34 0x12 LD BC, d16 0x1234 Data Address

Slide 100

Slide 100 text

public static function opcode1(Core $core) { $core->registerC =
 $core->memoryRead($core->programCounter); $core->registerB = 
 $core->memoryRead(($core->programCounter + 1) & 0xFFFF); $core->programCounter = 
 ($core->programCounter + 2) & 0xFFFF; } LC BC, d16 の実装 Implementation of LD BC, d16 PC PC + 1 0x01 0x34 0x12 LD BC, d16 0x1234 Data Address BCレジスタに指定したアドレスのメモリの値を入れる。 Load BC register with nn.

Slide 101

Slide 101 text

public static function opcode1(Core $core) { $core->registerC =
 $core->memoryRead($core->programCounter); $core->registerB = 
 $core->memoryRead(($core->programCounter + 1) & 0xFFFF); $core->programCounter = 
 ($core->programCounter + 2) & 0xFFFF; } LC BC, d16 の実装 Implementation of LD BC, d16 PC PC + 1 0x01 0x34 0x12 LD BC, d16 0x1234 Data Address PCを次の命令まで進める。 Move PC register to next instruction.

Slide 102

Slide 102 text

public static function opcode1(Core $core) { $core->registerC =
 $core->memoryRead($core->programCounter); $core->registerB = 
 $core->memoryRead(($core->programCounter + 1) & 0xFFFF); $core->programCounter = 
 ($core->programCounter + 2) & 0xFFFF; } LC BC, d16 の実装 Implementation of LD BC, d16 PC PC + 1 0x01 0x34 0x12 LD BC, d16 0x1234 Data Address

Slide 103

Slide 103 text

QUIZ

Slide 104

Slide 104 text

$core->memoryRead($core->programCounter); // //Main RAM, MBC RAM, GBC Main RAM, VRAM, etc. // //Main Core Memory public $memory = []; Core.php

Slide 105

Slide 105 text

$core->memoryRead($core->programCounter); // //Main RAM, MBC RAM, GBC Main RAM, VRAM, etc. // //Main Core Memory public $memory = []; Core.php メインメモリは配列になっている。 Main memory is defined as array.


Slide 106

Slide 106 text

$core->memoryRead($core->programCounter); // //Main RAM, MBC RAM, GBC Main RAM, VRAM, etc. // //Main Core Memory public $memory = []; Core.php メインメモリは配列になっている。 Main memory is defined as array.
 なぜ $core->memory[$core->programCounter] ではない? Q Why not $core->memory[$core->programCounter] ?

Slide 107

Slide 107 text

GAMEBOYのメモリマップ Memory map of GAMEBOY $FFFF Interrupt Enable Flag I/O $FF80-$FFFE Zero Page - 127 bytes RAM $FF00-$FF7F Hardware I/O Registers I/O $FEA0-$FEFF Unusable Memory $FE00-$FE9F OAM - Object Attribute Memory Video RAM $E000-$FDFF Echo RAM - Reserved, Do Not Use $D000-$DFFF Internal RAM - Bank 1-7 (switchable - CGB only) RAM $C000-$CFFF Internal RAM - Bank 0 (fixed) $A000-$BFFF Cartridge RAM (If Available) Cartridge $9C00-$9FFF BG Map Data 2 Video RAM $9800-$9BFF BG Map Data 1 $8000-$97FF Character RAM $4000-$7FFF Cartridge ROM - Switchable Banks 1-xx Cartridge $0150-$3FFF Cartridge ROM - Bank 0 (fixed) $0100-$014F Cartridge Header Area $0000-$00FF Restart and Interrupt Vectors ROM IUUQXXXIVDLpOHBNFTDPN QJE #Z5SBOTGSPN+1&(WFSTJPOBOESFNPWFXIJUFCBDLHSPVOE0SJHJOBMCZ&WBO"NPT.FEJB(BNF#PZ'-KQH 1VCMJD%PNBJO IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE

Slide 108

Slide 108 text

GAMEBOYのメモリマップ Memory map of GAMEBOY $FFFF Interrupt Enable Flag I/O $FF80-$FFFE Zero Page - 127 bytes RAM $FF00-$FF7F Hardware I/O Registers I/O $FEA0-$FEFF Unusable Memory $FE00-$FE9F OAM - Object Attribute Memory Video RAM $E000-$FDFF Echo RAM - Reserved, Do Not Use $D000-$DFFF Internal RAM - Bank 1-7 (switchable - CGB only) RAM $C000-$CFFF Internal RAM - Bank 0 (fixed) $A000-$BFFF Cartridge RAM (If Available) Cartridge $9C00-$9FFF BG Map Data 2 Video RAM $9800-$9BFF BG Map Data 1 $8000-$97FF Character RAM $4000-$7FFF Cartridge ROM - Switchable Banks 1-xx Cartridge $0150-$3FFF Cartridge ROM - Bank 0 (fixed) $0100-$014F Cartridge Header Area $0000-$00FF Restart and Interrupt Vectors ROM IUUQXXXIVDLpOHBNFTDPN QJE #Z5SBOTGSPN+1&(WFSTJPOBOESFNPWFXIJUFCBDLHSPVOE0SJHJOBMCZ&WBO"NPT.FEJB(BNF#PZ'-KQH 1VCMJD%PNBJO IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE A. メモリアクセスはそのアドレスに よって動作が違うから。 A. Because the result of memory access depends on its location. 


Slide 109

Slide 109 text

エミュレータのI/O実装 I/O implementations of emulator

Slide 110

Slide 110 text

ゲームボーイのハードウェアコンポネント CPU I/O Keys Sound Video Display Com Port Memory • RAM • Game 
 Cartridge • Video RAM Hardware components of GAMEBOY

Slide 111

Slide 111 text

ゲームボーイのハードウェアコンポネント CPU I/O Keys Sound Video Display Com Port Memory • RAM • Game 
 Cartridge • Video RAM Hardware components of GAMEBOY CPUはキーにI/O経由でアクセスする CPU accesses keys through the I/O

Slide 112

Slide 112 text

実行のメインループ $keyboard = new Keyboard($core); while (true) { $core->run(); $keyboard->check(); } boot.php Main loop of excution

Slide 113

Slide 113 text

実行のメインループ $keyboard = new Keyboard($core); while (true) { $core->run(); $keyboard->check(); } boot.php メインループ Main loop.
 Main loop of excution

Slide 114

Slide 114 text

キー状態の取得 public function __construct(Core $core) { $this->core = $core; exec('stty -icanon -echo'); $this->file = fopen('php://stdin', 'r'); stream_set_blocking($this->file, false); } public function check() { $key = fread($this->file, 1); if (!empty($key)) { $this->keyDown($key); } elseif (!empty($this->keyPressing)) { $this->keyUp($this->keyPressing); } $this->keyPressing = $key; } Get key status

Slide 115

Slide 115 text

キー状態の取得 public function __construct(Core $core) { $this->core = $core; exec('stty -icanon -echo'); $this->file = fopen('php://stdin', 'r'); stream_set_blocking($this->file, false); } public function check() { $key = fread($this->file, 1); if (!empty($key)) { $this->keyDown($key); } elseif (!empty($this->keyPressing)) { $this->keyUp($this->keyPressing); } $this->keyPressing = $key; } Get key status 標準入力を開いて… Open standard in and...


Slide 116

Slide 116 text

キー状態の取得 public function __construct(Core $core) { $this->core = $core; exec('stty -icanon -echo'); $this->file = fopen('php://stdin', 'r'); stream_set_blocking($this->file, false); } public function check() { $key = fread($this->file, 1); if (!empty($key)) { $this->keyDown($key); } elseif (!empty($this->keyPressing)) { $this->keyUp($this->keyPressing); } $this->keyPressing = $key; } Get key status 標準入力を開いて… Open standard in and...
 fread()で1文字取る! Get a character with fread!

Slide 117

Slide 117 text

キー状態の取得 Get key status CPU GAMEBOY’s key ゲームボーイのキー CPU I/O I/O ゲームボーイソフトウェア GAMEBOY Software ゲームボーイエミュレータ PC keyboard PCのキーボード GAMEBOY Emulator PHP PHP

Slide 118

Slide 118 text

GAMEBOYのメモリマップ Memory map of GAMEBOY $FFFF Interrupt Enable Flag I/O $FF80-$FFFE Zero Page - 127 bytes RAM $FF00-$FF7F Hardware I/O Registers I/O $FEA0-$FEFF Unusable Memory $FE00-$FE9F OAM - Object Attribute Memory Video RAM $E000-$FDFF Echo RAM - Reserved, Do Not Use $D000-$DFFF Internal RAM - Bank 1-7 (switchable - CGB only) RAM $C000-$CFFF Internal RAM - Bank 0 (fixed) $A000-$BFFF Cartridge RAM (If Available) Cartridge $9C00-$9FFF BG Map Data 2 Video RAM $9800-$9BFF BG Map Data 1 $8000-$97FF Character RAM $4000-$7FFF Cartridge ROM - Switchable Banks 1-xx Cartridge $0150-$3FFF Cartridge ROM - Bank 0 (fixed) $0100-$014F Cartridge Header Area $0000-$00FF Restart and Interrupt Vectors ROM IUUQXXXIVDLpOHBNFTDPN QJE #Z5SBOTGSPN+1&(WFSTJPOBOESFNPWFXIJUFCBDLHSPVOE0SJHJOBMCZ&WBO"NPT.FEJB(BNF#PZ'-KQH 1VCMJD%PNBJO IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE

Slide 119

Slide 119 text

I/O 0xFF00 キー状態 FF00 -- JOYPAD [RW] Joypad port Bit5 Bit4 | In order to scan the keys, output 0 into either Bit4 Bit3 DOWN START | or Bit5 of JOYPAD, wait for some time and read JOYPAD. Bit2 UP SELECT | Bits 0-3 will be set to zeroes if corresponding Bit1 LEFT B | buttons are pressed. Bits 6 and 7 are not used. Bits Bit0 RIGHT A | 0-3 are connected to input lines P10-P13. Bits 4 and 5 | are connected to ouput lines P14 and P15. IUUQGNTLPNLPOPSH(BNF#PZ5FDI4PGUXBSFIUNM キーの状態を読み取るには、0xFF00のビット4とビット5に 値を書き込み、その後ビット0〜ビット3の値を読み込む。 ビット4とビット5に書き込んだ値によってビット0〜ビッ ト3がどのキーに対応するかが変化する。 I/O 0xFF00 Key status

Slide 120

Slide 120 text

I/O 読み込み public function memoryRead($address) { if ($address < 0x4000) { } elseif ($address >= 0xFF00) { switch ($address) { case 0xFF00: return 0xC0 | $this->memory[0xFF00]; break; I/O read

Slide 121

Slide 121 text

I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00

Slide 122

Slide 122 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00

Slide 123

Slide 123 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00

Slide 124

Slide 124 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00

Slide 125

Slide 125 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00

Slide 126

Slide 126 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00

Slide 127

Slide 127 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00 7 6 5 4 3 2 1 0 A B Select Start → ← ↑ ↓ $this->JoyPad:

Slide 128

Slide 128 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00 7 6 5 4 3 2 1 0 A B Select Start → ← ↑ ↓ $this->JoyPad:

Slide 129

Slide 129 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00 7 6 5 4 3 2 1 0 A B Select Start → ← ↑ ↓ $this->JoyPad:

Slide 130

Slide 130 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00 7 6 5 4 3 2 1 0 A B Select Start → ← ↑ ↓ $this->JoyPad:

Slide 131

Slide 131 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00 7 6 5 4 3 2 1 0 A B Select Start → ← ↑ ↓ $this->JoyPad:

Slide 132

Slide 132 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00 7 6 5 4 3 2 1 0 A B Select Start → ← ↑ ↓ $this->JoyPad:

Slide 133

Slide 133 text

public function memoryWrite($address, $data) { if ($address < 0x8000) { //I/O Registers (GB + GBC): } elseif ($address == 0xFF00) { $this->memory[0xFF00] = ($data & 0x30) | (((($data & 0x20) == 0) ? ($this->JoyPad >> 4) : 0xF) & ((($data & 0x10) == 0) ? ($this->JoyPad & 0xF) : 0xF)); } elseif ($address == 0xFF02) { I/O 書き込み I/O write 7 6 5 4 3 2 1 0 - - P15 out P14 out P13 in P12 in P11 in P10 in - - 0 1 A B Select Start - - 1 0 → ← ↑ ↓ I/O port 0xFF00 7 6 5 4 3 2 1 0 A B Select Start → ← ↑ ↓ $this->JoyPad:

Slide 134

Slide 134 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ

Slide 135

Slide 135 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ

Slide 136

Slide 136 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ 45本 / 80本

Slide 137

Slide 137 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ 45本 / 80本

Slide 138

Slide 138 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ 45本 / 80本

Slide 139

Slide 139 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ 1pin 45本 / 80本

Slide 140

Slide 140 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ 1pin 24pin 45本 / 80本

Slide 141

Slide 141 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ 1pin 24pin 40pin 45本 / 80本

Slide 142

Slide 142 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ 1pin 24pin 40pin 64pin 45本 / 80本

Slide 143

Slide 143 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ 1pin 24pin 40pin 64pin 80pin 45本 / 80本

Slide 144

Slide 144 text

GAMEBOYのI/O I/O of GAMEBOY https://ja.wikipedia.org/wiki/ゲームボーイ 45本 / 80本

Slide 145

Slide 145 text

結論 Conclusion

Slide 146

Slide 146 text

エミュレータのソースを読むのは楽しい

Slide 147

Slide 147 text

Webアプリとも
 フレームワークとも フロントエンドの非同期アプリとも
 違う感じのコード群

Slide 148

Slide 148 text

ハードウェアの動作を ソフトウェアで表現

Slide 149

Slide 149 text

とても面白い

Slide 150

Slide 150 text

皆さんも是非読んでみてください

Slide 151

Slide 151 text

Thanks WE ARE HIRING @tomzoh プリーズ #phpkansai / ブログ / 懇親会

Slide 152

Slide 152 text

Appendix

Slide 153

Slide 153 text

http://www.hasegawa-tomoki.com/blog/2016/05/23/8bit-asm/

Slide 154

Slide 154 text

リンク • http://marc.rawer.de/Gameboy/Docs/GBCPUman.pdf • https://en.wikipedia.org/wiki/Game_Boy • http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html • http://gbdev.gg8.se/wiki/articles/The_Cartridge_Header • http://gameboy.mongenel.com/dmg/asmmemmap.html • http://www.z80.info/z80inst.txt Resources

Slide 155

Slide 155 text

セットアップ How to run $ git clone https://github.com/gabrielrcouto/ php-terminal-gameboy-emulator.git $ cd php-terminal-gameboy-emulator $ composer install -o $ bin/php-gameboy drmario.rom

Slide 156

Slide 156 text

ROMいずこ How to get ROM file

Slide 157

Slide 157 text

ROMいずこ How to get ROM file

Slide 158

Slide 158 text

ROMいずこ How to get ROM file _人人人人人人人_ > drmario.gb <  ̄Y^Y^Y^Y^Y^Y ̄

Slide 159

Slide 159 text

ROMいずこ How to get ROM file

Slide 160

Slide 160 text

ROMいずこ How to get ROM file

Slide 161

Slide 161 text

ROMいずこ How to get ROM file $rom = base64_decode(file_get_contents($argv[1])); $rom = file_get_contents($filename);

Slide 162

Slide 162 text

ボトルネックはどこか PHP5.5.30 OSX Native FPS: 4 PHP7.0.1 VirtualBox FPS: 14 We need more FPS

Slide 163

Slide 163 text

タイルでの色表現 ゲームボーイは4色出せるが1色&パターンで表現している。 GAMEBOY’s display has 4 colors. PHP version uses only 1 color with pattern. Color using tile pattern

Slide 164

Slide 164 text

アドレスバスとデータバス Data bus and address bus メモリ空間64KB 0x0000 to 0xffff 0000000000000000 to 1111111111111111 16bits ビデオRAM8KB 0x0000 to 0x1fff 0000000000000000 to 0001111111111111 13bits

Slide 165

Slide 165 text

Pentiumのアドレスバスとデータバス IUUQEPXOMPBEJOUFMDPNEFTJHOQFOUJVNEBUBTIUTQEG $$දࣔܧঝ IUUQTDPNNPOTXJLJNFEJBPSHXJOEFYQIQ DVSJE D0〜D63 A3〜A31 Data bus and address bus of Pentium

Slide 166

Slide 166 text

ノイマン型コンピュータ http://e-words.jp/w/ノイマン型コンピュータ.html von Neumann architecture プログラムをデータとして記憶装置に格納し、
 これを順番に読み込んで実行するコンピュータ。 "DPNQVUFSXIJDIIBTBNFNPSZBOE$165IJT$16DBOJOUFSQSFUUIF DPOUFOUTPGNFNPSZFJUIFSBTJOTUSVDUJPOTPSBTEBUBBDDPSEJOHUPUIF GFUDIFYFDVUFDZDMF http://www.dictionary.com/browse/von-neumann-architecture

Slide 167

Slide 167 text

エンディアン Endian

Slide 168

Slide 168 text

エンディアン Endian PC PC + 1 0x01 0x34 0x12 LD BC, nn 0x1234 Data Address LD BC, 0x1234 BCレジスタに0x1234を入れる。 Load BC register with 0x1234.

Slide 169

Slide 169 text

エンディアン Endian UTF-16のBOM = Byte Order Mark = ビッグエンディアンかリトルエンディアンか

Slide 170

Slide 170 text

ストリームの非ブロックモード public function __construct(Core $core) { $this->core = $core; exec('stty -icanon -echo'); $this->file = fopen('php://stdin', 'r'); stream_set_blocking($this->file, false); } public function check() { $key = fread($this->file, 1); if (!empty($key)) { $this->keyDown($key); } elseif (!empty($this->keyPressing)) { $this->keyUp($this->keyPressing); } $this->keyPressing = $key; } Non-blocking mode on a stream

Slide 171

Slide 171 text

ストリームの非ブロックモード public function __construct(Core $core) { $this->core = $core; exec('stty -icanon -echo'); $this->file = fopen('php://stdin', 'r'); stream_set_blocking($this->file, false); } public function check() { $key = fread($this->file, 1); if (!empty($key)) { $this->keyDown($key); } elseif (!empty($this->keyPressing)) { $this->keyUp($this->keyPressing); } $this->keyPressing = $key; } Non-blocking mode on a stream

Slide 172

Slide 172 text

ストリームの非ブロックモード public function __construct(Core $core) { $this->core = $core; exec('stty -icanon -echo'); $this->file = fopen('php://stdin', 'r'); stream_set_blocking($this->file, false); } public function check() { $key = fread($this->file, 1); if (!empty($key)) { $this->keyDown($key); } elseif (!empty($this->keyPressing)) { $this->keyUp($this->keyPressing); } $this->keyPressing = $key; } Non-blocking mode on a stream ストリームのモードを非ブロックに設定 Set non-blocking mode on a stream.