Slide 1

Slide 1 text

golang emus Ignacio Sánchez Ginés @drhelius

Slide 2

Slide 2 text

Emulator = legal ROM = ilegal

Slide 3

Slide 3 text

Emulator ≠ Simulator

Slide 4

Slide 4 text

Interpreter LD A,(HL) SUB 1 JR C,CONTINUE CP B JR NZ,LOOP Decode Read Exec

Slide 5

Slide 5 text

Binary Translation Target Machine Code LD A,(HL) SUB 1 JR C,CONTINUE CP B JR NZ,LOOP

Slide 6

Slide 6 text

Dynamic Recompilation Trans Read Exec LD A,(HL) SUB 1 JR C,CONTINUE CP B JR NZ,LOOP Target Machine Code

Slide 7

Slide 7 text

CPU MEM IO Audio Video Input

Slide 8

Slide 8 text

CPU 6502 Z80 Game Boy * Master System Game Gear MSX ZX Spectrum NES Atari 2600 Commodore 64 Apple 2 Super NES 65816

Slide 9

Slide 9 text

CPU MEM 8-bit 16-bit

Slide 10

Slide 10 text

0000 FFFF 0 65535 16KB 16KB 16KB 16KB

Slide 11

Slide 11 text

8DC4F3CD 293D2144 FF3E92BE 20FDCD0C ........ parameter opcode opcode opcode parameter

Slide 12

Slide 12 text

Main Loop while true { updateCPU() updateVideo() updateInput() updateAudio() }

Slide 13

Slide 13 text

updateCPU() { opcode = fetchOpcode() runOpcode(opcode) }

Slide 14

Slide 14 text

100 clks N clks CPU Video Input

Slide 15

Slide 15 text

CPU 4 MHz MEM Timer Audio Video Input Cart Game Boy

Slide 16

Slide 16 text

CPU H L B C D E SP PC A F 16 bit 8 bit

Slide 17

Slide 17 text

Flags 0 0 H C 0 0 Z N 1 0 5 4 3 2 7 6

Slide 18

Slide 18 text

16 KB ROM Bank 0 16 KB switchable ROM bank 8 KB Video RAM 8 KB switchable RAM bank 8 KB internal RAM Mirror 8 KB internal RAM Sprite Memory (OAM) Empty IO Ports Empty Internal RAM Interrupt Register cartridge FF4C FF80 FEA0 FF00 FFFF FE00 E000 C000 A000 8000 4000 0000 cartridge

Slide 19

Slide 19 text

j j+1 X N i+1 i 2 1

Slide 20

Slide 20 text

16 KB ROM Bank 0 16 KB switchable ROM bank 8000 4000 0000

Slide 21

Slide 21 text

Bank 0 Bank 1 Bank 2 Bank 3 Bank 4 ... fixed 00000 04000 08000 0C000 10000 14000 switchable Bank 4

Slide 22

Slide 22 text

ROM RAM MBC

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

Visible 160x144 HBlank VBlank 1.08 ms 48.6 us

Slide 25

Slide 25 text

Demo Emulator main core glfw opengl cpu video input

Slide 26

Slide 26 text

Workshop go get -u github.com/drhelius/demo-emulator cd $GOPATH/src/github.com/drhelius go run main.go -rom workshop.rom