-
-
Notifications
You must be signed in to change notification settings - Fork 246
GB_get_direct_access
typedef enum {
GB_DIRECT_ACCESS_ROM,
GB_DIRECT_ACCESS_RAM,
GB_DIRECT_ACCESS_CART_RAM,
GB_DIRECT_ACCESS_VRAM,
GB_DIRECT_ACCESS_HRAM,
GB_DIRECT_ACCESS_IO,
GB_DIRECT_ACCESS_BOOTROM,
GB_DIRECT_ACCESS_OAM,
GB_DIRECT_ACCESS_BGP,
GB_DIRECT_ACCESS_OBP,
GB_DIRECT_ACCESS_IE,
GB_DIRECT_ACCESS_ROM0,
} GB_direct_access_t;void *GB_get_direct_access(GB_gameboy_t *gb, GB_direct_access_t access, size_t *size, uint16_t *bank);
In gb.h
Returns a pointer to various memory regions of the emulated instance that can be freely read and modified. It will also return the size of that memory region via the size output argument, and on applicable regions, the currently mapped bank as well via the bank output argument. You may set bank and/or size to NULL if you don't require them.
The regions supported by this function are:
-
GB_DIRECT_ACCESS_ROM: Returns a pointer to the ROM and its size. Will return the ROM bank number mapped at$4000-$7fff. -
GB_DIRECT_ACCESS_ROM0: Similar toGB_DIRECT_ACCESS_ROM, but will return the ROM bank number mapped at$0000-$3fffinstead. (Useful when emulating MBCs that can bank-switch within this region, such as MMM01) -
GB_DIRECT_ACCESS_RAM: Returns a pointer to the RAM and its size (either0x8000bytes for CGB and newer, or0x2000for older models). Will return the RAM bank number mapped at$d000-$dfff. -
GB_DIRECT_ACCESS_CART_RAM: Returns a pointer to the cartridge RAM and its size. Will return the number of the currently mapped cartridge RAM bank. -
GB_DIRECT_ACCESS_VRAM: Returns a pointer to VRAM and its size (either0x4000bytes for CGB and newer, or0x2000for older models). Will return the currently mapped VRAM bank. -
GB_DIRECT_ACCESS_HRAM: Returns a pointer to HRAM and its size (always0x7f). -
GB_DIRECT_ACCESS_IO: Returns a pointer to MMIO (see Notes) and its size (always0x80). -
GB_DIRECT_ACCESS_BOOTROM: Returns a pointer to the boot ROM and its size (either0x900bytes for CGB and newer, or0x100for older models). Bytes0x100to0x1ffare not used in this buffer. -
GB_DIRECT_ACCESS_OAM: Returns a pointer to OAM and its size (always0xa0). -
GB_DIRECT_ACCESS_BGP: Returns a pointer to background palette RAM, and its size (always0x40). -
GB_DIRECT_ACCESS_OBP: Returns a pointer to object palette RAM, and its size (always0x40). -
GB_DIRECT_ACCESS_IE: Returns a pointer to IE register, and its size (always1).
GB_get_direct_access is thread-safe and can be called from any thread and context.
The pointers returned by this function may become invalid upon calling a function that loads a different ROM (e.g. GB_load_rom) or by switching the emulated model. Make sure not to retain pointers to these buffers after they stop being valid.
Some MMIO registers will not appear in the GB_DIRECT_ACCESS_IO region in the same way they actually appear in the emulator instance's memory, and writes to this region might not always have the desired effect. It is recommended to use GB_read_memory and GB_write_memory to access this region when possible.
Writes to GB_DIRECT_ACCESS_IE can have unexpected results and need to be avoided.
Writes to the GB_DIRECT_ACCESS_BGP and GB_DIRECT_ACCESS_OBP regions might not have an immediate visual effect.