21 auto location = 0x7FC0;
22 romSize = 0x400 << romData[location + 0x17];
23 sramSize = 0x400 << romData[location + 0x18];
27 for (
size_t i = 0; i <
romSize; i++) {
31 for (
size_t i = 0; i <
sramSize; i++) {
40 size_t romSize = romData.size();
41 size_t romAddress = 0;
42 const size_t ROM_CHUNK_SIZE = 0x8000;
43 for (
size_t bank = 0x00; bank <= 0x3F; ++bank) {
44 for (
size_t offset = 0x8000; offset <= 0xFFFF; offset += ROM_CHUNK_SIZE) {
46 std::copy(romData.begin() + romAddress,
47 romData.begin() + romAddress + ROM_CHUNK_SIZE,
48 memory_.begin() + (bank << 16) + offset);
49 romAddress += ROM_CHUNK_SIZE;
173 if ((bank & 0x7f) < 0x40 && adr >= 0x6000 && adr < 0x8000 && sramSize > 0) {
175 return ram_[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (
sramSize - 1)];
177 bool secondHalf = bank < 0x80;
179 if (adr >= 0x8000 || bank >= 0x40) {
181 return rom_[(((bank & 0x3f) << 16) | (secondHalf ? 0x400000 : 0) | adr) &
196 uint8_t bank = address >> 16;
197 uint32_t offset = address & 0xFFFF;
200 if (address <= 0x1FFF) {
201 return (0x7E << 16) + offset;
202 }
else if (address <= 0x5FFF) {
203 return (bank << 16) + (offset - 0x2000) + 0x2000;
204 }
else if (address <= 0x7FFF) {
205 return offset - 0x6000 + 0x6000;
208 return (bank << 16) + (offset - 0x8000) + 0x8000;
210 }
else if (bank == 0x7D) {
211 return offset + 0x7D0000;
212 }
else if (bank == 0x7E || bank == 0x7F) {
213 return offset + 0x7E0000;
214 }
else if (bank >= 0x80) {
224 const float TEXT_BASE_WIDTH = ImGui::CalcTextSize(
"A").x;
225 const float TEXT_BASE_HEIGHT = ImGui::GetTextLineHeightWithSpacing();
226 const char* column_names[] = {
227 "Offset",
"0x00",
"0x01",
"0x02",
"0x03",
"0x04",
"0x05",
"0x06",
"0x07",
228 "0x08",
"0x09",
"0x0A",
"0x0B",
"0x0C",
"0x0D",
"0x0E",
"0x0F",
"0x10",
229 "0x11",
"0x12",
"0x13",
"0x14",
"0x15",
"0x16",
"0x17",
"0x18",
"0x19",
230 "0x1A",
"0x1B",
"0x1C",
"0x1D",
"0x1E",
"0x1F"};
231 const int columns_count = IM_ARRAYSIZE(column_names);
232 const int rows_count = 16;
234 static ImGuiTableFlags table_flags =
235 ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX |
236 ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter |
237 ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_Hideable |
238 ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable |
239 ImGuiTableFlags_HighlightHoveredColumn;
240 static bool bools[columns_count * rows_count] = {};
241 static int frozen_cols = 1;
242 static int frozen_rows = 2;
243 ImGui::CheckboxFlags(
"_ScrollX", &table_flags, ImGuiTableFlags_ScrollX);
244 ImGui::CheckboxFlags(
"_ScrollY", &table_flags, ImGuiTableFlags_ScrollY);
245 ImGui::CheckboxFlags(
"_NoBordersInBody", &table_flags,
246 ImGuiTableFlags_NoBordersInBody);
247 ImGui::CheckboxFlags(
"_HighlightHoveredColumn", &table_flags,
248 ImGuiTableFlags_HighlightHoveredColumn);
249 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
250 ImGui::SliderInt(
"Frozen columns", &frozen_cols, 0, 2);
251 ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
252 ImGui::SliderInt(
"Frozen rows", &frozen_rows, 0, 2);
254 if (ImGui::BeginTable(
"table_angled_headers", columns_count, table_flags,
255 ImVec2(0.0f, TEXT_BASE_HEIGHT * 12))) {
256 ImGui::TableSetupColumn(
258 ImGuiTableColumnFlags_NoHide | ImGuiTableColumnFlags_NoReorder);
259 for (
int n = 1; n < columns_count; n++)
260 ImGui::TableSetupColumn(column_names[n],
261 ImGuiTableColumnFlags_AngledHeader |
262 ImGuiTableColumnFlags_WidthFixed);
263 ImGui::TableSetupScrollFreeze(frozen_cols, frozen_rows);
265 ImGui::TableAngledHeadersRow();
266 ImGui::TableHeadersRow();
267 for (
int row = 0; row < rows_count; row++) {
269 ImGui::TableNextRow();
270 ImGui::TableSetColumnIndex(0);
271 ImGui::AlignTextToFramePadding();
272 ImGui::Text(
"Offset 0x%04X", row);
273 for (
int column = 1; column < columns_count; column++)
274 if (ImGui::TableSetColumnIndex(column)) {
275 ImGui::PushID(column);
276 ImGui::Checkbox(
"", &bools[row * columns_count + column]);