目标:
- 实现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!
|
可以看到,成功执行了一系列的LD和LDH指令,并且通过debug输出,发现下一个应该支持的指令为CD (CALL)
代码实现:
https://github.com/SimpleCodeJust4Fun/CBoy/pull/4