gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-support/romusage/src/bank_templates.c
1 // This is free and unencumbered software released into the public domain.
2 // For more information, please refer to <https://unlicense.org>
3 // bbbbbr 2024
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <stdbool.h>
8 #include <stdint.h>
9
10 #include "common.h"
11 #include "logging.h"
12 #include "banks.h"
13 #include "bank_templates.h"
14
15 // Bank info from pandocs
16 // 0000-3FFF 16KB ROM Bank 00 (in cartridge, fixed at bank 00)
17 // 4000-7FFF 16KB ROM Bank 01..NN (in cartridge, switchable bank number)
18 // 8000-9FFF 8KB Video RAM (VRAM) (switchable bank 0-1 in CGB Mode)
19 // A000-BFFF 8KB External RAM (in cartridge, switchable bank, if any)
20 // C000-CFFF 4KB Work RAM Bank 0 (WRAM)
21 // D000-DFFF 4KB Work RAM Bank 1 (WRAM) (switchable bank 1-7 in CGB Mode)
22 // E000-FDFF Same as C000-DDFF (ECHO) (typically not used)
23
24
25 // // Previous unified bank declaration
26 // const bank_item bank_templates_default[] = {
27 // {"ROM_0", 0x0000, 0x3FFF, BANKED_NO, 0x7FFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_0},
28 // {"ROM_", 0x4000, 0x7FFF, BANKED_YES, 0x7FFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_1},
29 // {"VRAM_", 0x8000, 0x9FFF, BANKED_YES, 0x9FFF, 0,0,0, BANK_MEM_TYPE_VRAM, BANK_STARTNUM_0},
30 // {"SRAM_", 0xA000, 0xBFFF, BANKED_YES, 0xBFFF, 0,0,0, BANK_MEM_TYPE_SRAM, BANK_STARTNUM_0},
31 // {"WRAM_LO", 0xC000, 0xCFFF, BANKED_NO, 0xDFFF, 0,0,0, BANK_MEM_TYPE_WRAM, BANK_STARTNUM_0},
32 // {"WRAM_HI_",0xD000, 0xDFFF, BANKED_YES, 0xDFFF, 0,0,0, BANK_MEM_TYPE_WRAM, BANK_STARTNUM_1},
33 // {"HRAM", 0xFF80, 0xFFFE, BANKED_NO, 0xFFFE, 0,0,0, BANK_MEM_TYPE_HRAM, BANK_STARTNUM_0},
34 // };
35
36
37 // ===== Game Boy =====
38
39 // ROM
40 const bank_item ROM_0 = {"ROM_0", 0x0000, 0x3FFF, BANKED_NO, 0x7FFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_0, BANK_MERGED_NO, HIDDEN_NO};
41 const bank_item ROM_X_banked = {"ROM_", 0x4000, 0x7FFF, BANKED_YES, 0x7FFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_1, BANK_MERGED_NO, HIDDEN_NO};
42 // Merged version
43 const bank_item ROM_nonbanked = {"ROM", 0x0000, 0x7FFF, BANKED_YES, 0x7FFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_0, BANK_MERGED_YES, HIDDEN_NO};
44
45 // VRAM
46 const bank_item VRAM = {"VRAM_", 0x8000, 0x9FFF, BANKED_YES, 0x9FFF, 0,0,0, BANK_MEM_TYPE_VRAM, BANK_STARTNUM_0, BANK_MERGED_NO, HIDDEN_NO};
47
48 // SRAM
49 const bank_item SRAM = {"SRAM_", 0xA000, 0xBFFF, BANKED_YES, 0xBFFF, 0,0,0, BANK_MEM_TYPE_SRAM, BANK_STARTNUM_0, BANK_MERGED_NO, HIDDEN_NO};
50
51 // WRAM
52 const bank_item WRAM_0 = {"WRAM_LO", 0xC000, 0xCFFF, BANKED_NO, 0xDFFF, 0,0,0, BANK_MEM_TYPE_WRAM, BANK_STARTNUM_0, BANK_MERGED_NO, HIDDEN_NO};
53 const bank_item WRAM_X_banked = {"WRAM_HI_",0xD000, 0xDFFF, BANKED_YES, 0xDFFF, 0,0,0, BANK_MEM_TYPE_WRAM, BANK_STARTNUM_1, BANK_MERGED_NO, HIDDEN_NO};
54 // Merged version
55 const bank_item WRAM_nonbanked = {"WRAM", 0xC000, 0xDFFF, BANKED_YES, 0xDFFF, 0,0,0, BANK_MEM_TYPE_WRAM, BANK_STARTNUM_0, BANK_MERGED_YES, HIDDEN_NO};
56
57 // HRAM
58 const bank_item HRAM = {"HRAM", 0xFF80, 0xFFFE, BANKED_NO, 0xFFFE, 0,0,0, BANK_MEM_TYPE_HRAM, BANK_STARTNUM_0, BANK_MERGED_NO, HIDDEN_NO};
59
60
61 // ===== Game Gear / SMS (GBDK specific) =====
62
63 // https://www.smspower.org/Development/MemoryMap
64
65 // _CODE_<N> is at base address 0x4000 (code and assets)
66 // _LIT_<N> is at base address 0x8000 (assets)
67 // _DATA_N is also at base address 0x8000 (RAM)
68
69 // ROM
70 const bank_item smsgg_ROM_0 = {"ROM_0", 0x0000, 0x3FFF, BANKED_NO, 0x7FFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_0, BANK_MERGED_NO, HIDDEN_NO};
71 const bank_item smsgg_ROM_X_banked = {"ROM_", 0x4000, 0x7FFF, BANKED_YES, 0x7FFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_1, BANK_MERGED_NO, HIDDEN_NO};
72 // Merged version
73 const bank_item smsgg_ROM_nonbanked = {"ROM", 0x0000, 0x7FFF, BANKED_YES, 0x7FFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_0, BANK_MERGED_YES, HIDDEN_NO};
74
75 // ROM Data
76 const bank_item smsgg_LIT_X_banked = {"LIT_", 0x8000, 0xBFFF, BANKED_YES, 0xBFFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_1, BANK_MERGED_NO, HIDDEN_NO};
77
78 // RAM
79 // Data can also be in the 0x8000 region.. requires some special handling in banks_check()
80 const bank_item smsgg_DATA_X_banked = {"DATA_", 0x8000, 0xBFFF, BANKED_YES, 0xBFFF, 0,0,0, BANK_MEM_TYPE_SRAM, BANK_STARTNUM_1, BANK_MERGED_NO, HIDDEN_NO};
81 const bank_item smsgg_RAM_nonbanked = {"RAM", 0xC000, 0xDFFF, BANKED_YES, 0xDFFF, 0,0,0, BANK_MEM_TYPE_WRAM, BANK_STARTNUM_0, BANK_MERGED_YES, HIDDEN_NO};
82
83
84 // ===== NES (GBDK specific) =====
85
86 // https://en.wikibooks.org/wiki/NES_Programming/Memory_Map
87 // https://www.nesdev.org/wiki/CPU_memory_map
88 //
89 // Michel:
90 // - One fixed 16kB bank at 0xC000 - 0xFFFF
91 // - Sometimes uses segment _HOME, sometimes _CODE
92 // - _XINIT I believe (to initialize data segment)
93 // - Switchable bank at 0x8000-0xBFFF
94 // - Will use segments named _CODE_n, where n is a bank number
95 // - _DATA / _BSS usually start at 0x300, and go up to 0x7FF
96 // - _ZP uses (part of) 0x00-0FF
97 // - Overlay segments OSEG / GBDKOVR also use part of 0x00-0xFF, for parameter passing
98 // - 0x100-0x1FF is stack, which you can probably ignore for your purposes
99 // - 0x200-02FF is currently hardcoded as OAM page
100 //
101 // zero_page_ram: 0x0000 - 0x00FF
102 // ram: 0x0100 - 0x07FF
103 // rom_x_banked: 0x8000 - 0xBFFF
104 // rom_0: 0xC000 - 0xFFFF
105
106 // Name Start End Is Banked? Oflow End (statsx3) Bank Type Base Bank Num Merged version Hidden
107 // RAM
108 const bank_item nes1_RAM_ZP = {"ZPAGE", 0x0000, 0x00FF, BANKED_NO, 0x00FF, 0,0,0, BANK_MEM_TYPE_HRAM, BANK_STARTNUM_0, BANK_MERGED_NO, HIDDEN_NO};
109 const bank_item nes1_RAM = {"RAM", 0x0100, 0x07FF, BANKED_NO, 0x07FF, 0,0,0, BANK_MEM_TYPE_WRAM, BANK_STARTNUM_0, BANK_MERGED_NO, HIDDEN_NO};
110
111 // SRAM
112 const bank_item nes1_SRAM = {"SRAM", 0x6000, 0x7FFF, BANKED_NO, 0x7FFF, 0,0,0, BANK_MEM_TYPE_SRAM, BANK_STARTNUM_0, BANK_MERGED_NO, HIDDEN_NO};
113
114 // ROM
115 const bank_item nes1_ROM_X_banked = {"ROM_", 0x8000, 0xBFFF, BANKED_YES, 0xFFFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_1, BANK_MERGED_NO, HIDDEN_NO};
116 const bank_item nes1_ROM_0 = {"ROM_0", 0xC000, 0xFFFF, BANKED_NO, 0xFFFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_0, BANK_MERGED_NO, HIDDEN_NO};
117 // Merged version
118 const bank_item nes1_ROM_nonbanked = {"ROM", 0x8000, 0xFFFF, BANKED_YES, 0xFFFF, 0,0,0, BANK_MEM_TYPE_ROM, BANK_STARTNUM_0, BANK_MERGED_YES, HIDDEN_NO};
119
120
121 static int bank_template_add(int idx, bank_item * p_bank_templates, const bank_item * p_bank) {
122
123 if (idx >= BANK_TEMPLATES_MAX) {
124 log_error("Error: exceeded max bank template\n");
125 exit(EXIT_FAILURE);
126 }
127
128 p_bank_templates[idx++] = *p_bank;
129 return idx;
130 }
131
132
133 // TODO: FIXME: With -B and -cWRAM and -cROM
134 // - Calc total size is wrong... maybe 2x?
135 // - Graph renders wrong (maybe due to total size wrong)
136
137 int bank_templates_load(bank_item * p_bank_templates) {
138
139 int idx = 0;
140
141 if (get_option_platform() == OPT_PLAT_SMS_GG_GBDK) {
142 if (option_merged_banks & OPT_MERGED_BANKS_ROM) {
143 idx = bank_template_add(idx, p_bank_templates, &smsgg_ROM_nonbanked);
144 } else {
145 idx = bank_template_add(idx, p_bank_templates, &smsgg_ROM_0);
146 idx = bank_template_add(idx, p_bank_templates, &smsgg_ROM_X_banked);
147 }
148 idx = bank_template_add(idx, p_bank_templates, &smsgg_LIT_X_banked);
149 idx = bank_template_add(idx, p_bank_templates, &smsgg_DATA_X_banked);
150 idx = bank_template_add(idx, p_bank_templates, &smsgg_RAM_nonbanked);
151
152 }
153 else if (get_option_platform() == OPT_PLAT_NES_GBDK_1) {
154 if (option_merged_banks & OPT_MERGED_BANKS_ROM) {
155 idx = bank_template_add(idx, p_bank_templates, &nes1_ROM_nonbanked);
156 } else {
157 idx = bank_template_add(idx, p_bank_templates, &nes1_ROM_X_banked);
158 idx = bank_template_add(idx, p_bank_templates, &nes1_ROM_0);
159 }
160 idx = bank_template_add(idx, p_bank_templates, &nes1_RAM_ZP);
161 idx = bank_template_add(idx, p_bank_templates, &nes1_RAM);
162 idx = bank_template_add(idx, p_bank_templates, &nes1_SRAM);
163
164 }
165 else { // implied: if (get_option_platform() == OPT_PLAT_GAMEBOY) {
166
167 if (option_merged_banks & OPT_MERGED_BANKS_ROM) {
168 idx = bank_template_add(idx, p_bank_templates, &ROM_nonbanked);
169 } else {
170 idx = bank_template_add(idx, p_bank_templates, &ROM_0);
171 idx = bank_template_add(idx, p_bank_templates, &ROM_X_banked);
172 }
173
174 idx = bank_template_add(idx, p_bank_templates, &VRAM);
175 idx = bank_template_add(idx, p_bank_templates, &SRAM);
176
177 if (option_merged_banks & OPT_MERGED_BANKS_WRAM) {
178 idx = bank_template_add(idx, p_bank_templates, &WRAM_nonbanked);
179 } else {
180 idx = bank_template_add(idx, p_bank_templates, &WRAM_0);
181 idx = bank_template_add(idx, p_bank_templates, &WRAM_X_banked);
182 }
183
184 idx = bank_template_add(idx, p_bank_templates, &HRAM);
185 }
186
187 return idx;
188 }
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.