golang
emus
Ignacio Sánchez Ginés
@drhelius
Emulator = legal
ROM = ilegal
Emulator ≠ Simulator
Interpreter
LD A,(HL)
SUB 1
JR C,CONTINUE
CP B
JR NZ,LOOP
Decode
Read
Exec
Binary Translation
Target
Machine
Code
LD A,(HL)
SUB 1
JR C,CONTINUE
CP B
JR NZ,LOOP
Dynamic Recompilation
Trans
Read
Exec
LD A,(HL)
SUB 1
JR C,CONTINUE
CP B
JR NZ,LOOP
Target
Machine
Code
CPU
MEM
IO
Audio
Video
Input
CPU
6502 Z80
Game Boy *
Master System
Game Gear
MSX
ZX Spectrum
NES
Atari 2600
Commodore 64
Apple 2
Super NES 65816
CPU MEM
8-bit
16-bit
0000
FFFF
0
65535
16KB
16KB
16KB
16KB
8DC4F3CD
293D2144
FF3E92BE
20FDCD0C
........
parameter
opcode opcodeopcode
parameter
Main Loop
while true {
updateCPU()
updateVideo()
updateInput()
updateAudio()
}
updateCPU() {
opcode = fetchOpcode()
runOpcode(opcode)
}
100 clks N clks
CPU
Video
Input
CPU
4 MHz
MEM
Timer
Audio
Video
InputCart
Game Boy
CPU
H L
B C D E
SPPC
A F
16 bit 8 bit
Flags
0 0H C 0 0Z N
1 05 4 3 27 6
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
j
j+1
X
N
i+1
i
2
1
16 KB ROM Bank 0
16 KB switchable ROM bank
8000
4000
0000
Bank 0
Bank 1
Bank 2
Bank 3
Bank 4
...
fixed
00000
04000
08000
0C000
10000
14000
switchable
Bank 4
ROMRAM
MBC
Visible
160x144
HBlank
VBlank 1.08 ms
48.6 us
Demo Emulator
main
core
glfw
opengl
cpu
video
input
Workshop
go get -u github.com/drhelius/demo-emulator
cd $GOPATH/src/github.com/drhelius
go run main.go -rom workshop.rom

8-bit Emulator Programming with Go