git.y1.nz

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.