【GameBoy模拟器 5】实现MemoryMap

先把存储空间划分一下再说

目标:

  • 实现GameBoy的MemoryMap内存映射
    • 了解GameBoy的内存划分
    • 进一步熟悉GameBoy的硬件组成
    • 了解MemoryMap的好处
  • 给CPU添加interrupt enable register(中断使能寄存器)

对照的参考资料

知识点

  • memory mapped IO: 一切皆地址。好处:减少指令集复杂度(CPU复杂度)
  • 现代计算机也适用,这就是为什么实际的内存比标定的要小,比如32位时代的Windows家用机,理论寻址空间是4GB,实际上可用的只有3GB,这就是因为一部分空间留给了其他设备(打印机、显卡、摄像头……)

成果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(base) $ gbemu/gbemu ../../roms/cpu_instrs.gb 
Opened: ../../roms/cpu_instrs.gb
Cartridge Loaded:
         Title    : CPU_INSTRS
         Type     : 01 (MBC1)
         ROM Size : 64 KB
         RAM Size : 00
         LIC Code : 00 (None)
         ROM Vers : 00
         Checksum : 3B (PASSED)
Cart loaded..
SDL INIT
TTF INIT
0100: NOP     (00 C3 37) A: 01 BC: 0000 DE: 0000 HL: 0000
0101: JP      (C3 37 06) A: 01 BC: 0000 DE: 0000 HL: 0000
0637: JP      (C3 30 04) A: 01 BC: 0000 DE: 0000 HL: 0000
0430: DI      (F3 31 FF) A: 01 BC: 0000 DE: 0000 HL: 0000
0431: LD      (31 FF DF) A: 01 BC: 0000 DE: 0000 HL: 0000
0434: LD      (EA 00 D6) A: 01 BC: 0000 DE: 0000 HL: 0000
0437: LD      (3E 00 E0) A: 01 BC: 0000 DE: 0000 HL: 0000
0439: LDH     (E0 07 3E) A: 00 BC: 0000 DE: 0000 HL: 0000
UNSUPPORTED bus_write(FF00)
043B: LD      (3E 00 E0) A: 00 BC: 0000 DE: 0000 HL: 0000
043D: LDH     (E0 0F 3E) A: 00 BC: 0000 DE: 0000 HL: 0000
UNSUPPORTED bus_write(FF00)
043F: LD      (3E 00 E0) A: 00 BC: 0000 DE: 0000 HL: 0000
0441: LDH     (E0 FF 3E) A: 00 BC: 0000 DE: 0000 HL: 0000
UNSUPPORTED bus_write(FF00)
0443: LD      (3E 00 E0) A: 00 BC: 0000 DE: 0000 HL: 0000
0445: LDH     (E0 26 3E) A: 00 BC: 0000 DE: 0000 HL: 0000
UNSUPPORTED bus_write(FF00)
0447: LD      (3E 80 E0) A: 00 BC: 0000 DE: 0000 HL: 0000
0449: LDH     (E0 26 3E) A: 80 BC: 0000 DE: 0000 HL: 0000
044B: LD      (3E FF E0) A: 80 BC: 0000 DE: 0000 HL: 0000
044D: LDH     (E0 25 3E) A: FF BC: 0000 DE: 0000 HL: 0000
044F: LD      (3E 77 E0) A: FF BC: 0000 DE: 0000 HL: 0000
0451: LDH     (E0 24 21) A: 77 BC: 0000 DE: 0000 HL: 0000
UNSUPPORTED bus_write(FF77)
0453: LD      (21 8F 0B) A: 77 BC: 0000 DE: 0000 HL: 0000
0456: <NONE>  (CD A3 02) A: 77 BC: 0000 DE: 0000 HL: 0B8F
INVALID INSTRUCTION!

可以看到,成功执行了一系列的LDLDH指令,并且通过debug输出,发现下一个应该支持的指令为CD (CALL)

代码实现:

https://github.com/SimpleCodeJust4Fun/CBoy/pull/4

Licensed under CC BY-NC-SA 4.0
最后更新于 Jun 25, 2025 15:02 UTC
Built with Hugo
Jimmy 设计的 Stack 主题