GBDK 2020 Docs
4.3.0
API Documentation for GBDK 2020
|
Go to the source code of this file.
Data Structures | |
struct | joypads_t |
struct | OAM_item_t |
Typedefs | |
typedef void(* | int_handler) (void) NONBANKED |
typedef struct OAM_item_t | OAM_item_t |
Variables | |
uint8_t | c |
uint8_t | d |
uint8_t | e |
uint8_t | h |
uint8_t | l |
uint8_t | _cpu |
uint8_t | _is_GBA |
volatile uint16_t | sys_time |
volatile uint8_t | _io_status |
volatile uint8_t | _io_in |
volatile uint8_t | _io_out |
__REG | _current_bank |
void | b |
uint16_t | _current_1bpp_colors |
uint8_t | _map_tile_offset |
uint8_t | _submap_tile_offset |
volatile struct OAM_item_t | shadow_OAM [] |
__REG | _shadow_OAM_base |
Gameboy specific functions.
#define NINTENDO |
#define SYSTEM_60HZ 0x00 |
#define SYSTEM_50HZ 0x01 |
#define GAMEBOY |
#define J_UP 0x04U |
#define J_DOWN 0x08U |
#define J_LEFT 0x02U |
#define J_RIGHT 0x01U |
#define J_A 0x10U |
#define J_B 0x20U |
#define J_SELECT 0x40U |
#define J_START 0x80U |
#define M_DRAWING 0x01U |
Screen modes. Normally used by internal functions only.
#define M_TEXT_OUT 0x02U |
#define M_TEXT_INOUT 0x03U |
#define M_NO_SCROLL 0x04U |
Set this in addition to the others to disable scrolling
If scrolling is disabled, the cursor returns to (0,0)
#define M_NO_INTERP 0x08U |
Set this to disable interpretation
#define S_BANK 0x08U |
If this bit set clear, the tile from the second VRAM bank is used
#define S_PALETTE 0x10U |
If this is set, sprite colours come from OBJ1PAL. Else they come from OBJ0PAL
#define S_FLIPX 0x20U |
If set the sprite will be flipped horizontally.
#define S_FLIPY 0x40U |
If set the sprite will be flipped vertically.
#define S_PRIORITY 0x80U |
If this bit is clear, then the sprite will be displayed on top of the background and window.
#define S_PAL | ( | n | ) | n |
Defines how palette number is encoded in OAM. Required for the png2asset tool's metasprite output.
#define EMPTY_IFLAG 0x00U |
Disable calling of interrupt service routines
#define VBL_IFLAG 0x01U |
VBlank Interrupt occurs at the start of the vertical blank.
During this period the video ram may be freely accessed.
#define LCD_IFLAG 0x02U |
LCD Interrupt when triggered by the STAT register.
#define TIM_IFLAG 0x04U |
Timer Interrupt when the timer TIMA_REG overflows.
#define SIO_IFLAG 0x08U |
Serial Link Interrupt occurs when the serial transfer has completed.
#define JOY_IFLAG 0x10U |
Joypad Interrupt occurs on a transition of the keypad.
#define DMG_BLACK 0x03 |
#define DMG_DARK_GRAY 0x02 |
#define DMG_LITE_GRAY 0x01 |
#define DMG_WHITE 0x00 |
#define DMG_PALETTE | ( | C0, | |
C1, | |||
C2, | |||
C3 | |||
) | ((uint8_t)((((C3) & 0x03) << 6) | (((C2) & 0x03) << 4) | (((C1) & 0x03) << 2) | ((C0) & 0x03))) |
Macro to create a DMG palette from 4 colors
C0 | Color for Index 0 |
C1 | Color for Index 1 |
C2 | Color for Index 2 |
C3 | Color for Index 3 |
The resulting format is four greyscale colors packed into a single unsigned byte.
Example:
#define SCREENWIDTH DEVICE_SCREEN_PX_WIDTH |
Width of the visible screen in pixels.
#define SCREENHEIGHT DEVICE_SCREEN_PX_HEIGHT |
Height of the visible screen in pixels.
#define MINWNDPOSX DEVICE_WINDOW_PX_OFFSET_X |
The Minimum X position of the Window Layer (Left edge of screen)
#define MINWNDPOSY DEVICE_WINDOW_PX_OFFSET_Y |
The Minimum Y position of the Window Layer (Top edge of screen)
#define MAXWNDPOSX (DEVICE_WINDOW_PX_OFFSET_X + DEVICE_SCREEN_PX_WIDTH - 1) |
The Maximum X position of the Window Layer (Right edge of screen)
#define MAXWNDPOSY (DEVICE_WINDOW_PX_OFFSET_Y + DEVICE_SCREEN_PX_HEIGHT - 1) |
The Maximum Y position of the Window Layer (Bottom edge of screen)
#define DMG_TYPE 0x01 |
Hardware Model: Original GB or Super GB.
#define MGB_TYPE 0xFF |
Hardware Model: Pocket GB or Super GB 2.
#define CGB_TYPE 0x11 |
Hardware Model: Color GB.
#define IO_IDLE 0x00U |
Serial Link IO is completed
#define IO_SENDING 0x01U |
Serial Link Sending data
#define IO_RECEIVING 0x02U |
Serial Link Receiving data
#define IO_ERROR 0x04U |
Serial Link Error
#define CURRENT_BANK _current_bank |
#define BANK | ( | VARNAME | ) | ( (uint8_t) & __bank_ ## VARNAME ) |
Obtains the bank number of VARNAME
VARNAME | Name of the variable which has a __bank_VARNAME companion symbol which is adjusted by bankpack |
Use this to obtain the bank number from a bank reference created with BANKREF().
#define BANKREF | ( | VARNAME | ) |
Creates a reference for retrieving the bank number of a variable or function
VARNAME | Variable name to use, which may be an existing identifier |
More than one BANKREF()
may be created per file, but each call should always use a unique VARNAME.
Use BANKREF_EXTERN() within another source file to make the variable and it's data accesible there.
#define BANKREF_EXTERN | ( | VARNAME | ) | extern const void __bank_ ## VARNAME; |
#define SWITCH_ROM | ( | b | ) | (_current_bank = (b), rROMB0 = (b)) |
Makes default platform MBC switch the active ROM bank
b | ROM bank to switch to (max 255) |
Switches SRAM bank on MBC1 and other compatible MBCs
b | SRAM bank to switch to |
Before switching SRAM banks enable it using ENABLE_RAM
#define ENABLE_RAM (rRAMG = 0x0A) |
Enables SRAM on MBC1 and other compatible MBCs
#define DISABLE_RAM (rRAMG = 0x00) |
Disables SRAM on MBC1 and other compatible MBCs
#define SWITCH_ROM_MEGADUCK | ( | b | ) | SWITCH_ROM(b) |
Makes MEGADUCK MBC switch the active ROM bank
b | ROM bank to switch to (max 3 for 64K, or 7 for 128K) |
#define SWITCH_ROM_MBC1 | ( | b | ) | SWITCH_ROM(b) |
Makes MBC1 and other compatible MBCs switch the active ROM bank
b | ROM bank to switch to |
For MBC1 some banks in it's range are unavailable (typically 0x20, 0x40, 0x60).
See pandocs for more details https://gbdev.io/pandocs/MBC1
#define SWITCH_RAM_MBC1 | ( | b | ) | SWITCH_RAM(b) |
Switches SRAM bank on MBC1 and other compatible MBCs
b | SRAM bank to switch to |
Before switching SRAM banks enable it using ENABLE_RAM
#define ENABLE_RAM_MBC1 ENABLE_RAM |
Enables SRAM on MBC1
#define DISABLE_RAM_MBC1 DISABLE_RAM |
Disables SRAM on MBC1
#define SWITCH_16_8_MODE_MBC1 (*(volatile uint8_t *)0x6000 = 0x00) |
#define SWITCH_4_32_MODE_MBC1 (*(volatile uint8_t *)0x6000 = 0x01) |
Makes MBC5 switch to the active ROM bank
b | ROM bank to switch to (max 255) |
Supports up to ROM bank 255 (4 MB).
SWITCH_ROM_MBC5_8M may be used if the full 8MB size is needed.
Note the order used here. Writing the other way around on a MBC1 always selects bank 1
Makes MBC5 to switch the active ROM bank using the full 8MB size.
b | ROM bank to switch to |
This is an alternate to SWITCH_ROM_MBC5 which is limited to 4MB.
Note:
Note the order used here. Writing the other way around on a MBC1 always selects bank 1
#define SWITCH_RAM_MBC5 | ( | b | ) | SWITCH_RAM(b) |
Switches SRAM bank on MBC5
b | SRAM bank to switch to |
Before switching SRAM banks enable it using ENABLE_RAM
#define ENABLE_RAM_MBC5 ENABLE_RAM |
Enables SRAM on MBC5
#define DISABLE_RAM_MBC5 DISABLE_RAM |
Disables SRAM on MBC5
Turns the display back on.
#define DISPLAY_OFF display_off(); |
Turns the display off
Waits until the VBL before turning the display off.
#define HIDE_LEFT_COLUMN |
Does nothing for GB
#define SHOW_LEFT_COLUMN |
Does nothing for GB
#define SET_BORDER_COLOR | ( | C | ) |
Does nothing for GB
#define SHOW_BKG LCDC_REG|=LCDCF_BGON |
Turns on the background layer. Sets bit 0 of the LCDC register to 1.
Doesn't work in CGB mode - the bit is reused to control sprite priority over background and window layers instead.
#define HIDE_BKG LCDC_REG&=~LCDCF_BGON |
Turns off the background layer. Sets bit 0 of the LCDC register to 0.
Doesn't work in CGB mode - the bit is reused to control sprite priority over background and window layers instead.
#define SHOW_WIN LCDC_REG|=LCDCF_WINON |
Turns on the Window layer Sets bit 5 of the LCDC register to 1.
This only controls Window visibility. If either the Background layer (which the window is part of) or the Display are not turned then the Window contents will not be visible. Those can be turned on using SHOW_BKG and DISPLAY_ON.
#define HIDE_WIN LCDC_REG&=~LCDCF_WINON |
Turns off the window layer. Clears bit 5 of the LCDC register to 0.
#define SHOW_SPRITES LCDC_REG|=LCDCF_OBJON |
Turns on the sprites layer. Sets bit 1 of the LCDC register to 1.
#define HIDE_SPRITES LCDC_REG&=~LCDCF_OBJON |
Turns off the sprites layer. Clears bit 1 of the LCDC register to 0.
#define SPRITES_8x16 LCDC_REG|=LCDCF_OBJ16 |
Sets sprite size to 8x16 pixels, two tiles one above the other. Sets bit 2 of the LCDC register to 1.
#define SPRITES_8x8 LCDC_REG&=~LCDCF_OBJ16 |
Sets sprite size to 8x8 pixels, one tile. Clears bit 2 of the LCDC register to 0.
#define COMPAT_PALETTE | ( | C0, | |
C1, | |||
C2, | |||
C3 | |||
) | ((uint8_t)(((C3) << 6) | ((C2) << 4) | ((C1) << 2) | (C0))) |
#define set_bkg_2bpp_data set_bkg_data |
#define set_tile_map set_bkg_tiles |
#define set_tile_submap set_bkg_submap |
#define set_tile_xy set_bkg_tile_xy |
#define set_attribute_xy set_bkg_attribute_xy |
#define set_sprite_2bpp_data set_sprite_data |
#define DISABLE_OAM_DMA _shadow_OAM_base = 0 |
#define DISABLE_VBL_TRANSFER DISABLE_OAM_DMA |
Disable OAM DMA copy each VBlank
#define ENABLE_OAM_DMA _shadow_OAM_base = (uint8_t)((uint16_t)&shadow_OAM >> 8) |
#define ENABLE_VBL_TRANSFER ENABLE_OAM_DMA |
Enable OAM DMA copy each VBlank and set it to transfer default shadow_OAM array
#define MAX_HARDWARE_SPRITES 40 |
Amount of hardware sprites in OAM
#define HARDWARE_SPRITE_CAN_FLIP_X 1 |
True if sprite hardware can flip sprites by X (horizontally)
#define HARDWARE_SPRITE_CAN_FLIP_Y 1 |
True if sprite hardware can flip sprites by Y (vertically)
#define fill_rect fill_bkg_rect |
typedef void(* int_handler) (void) NONBANKED |
Interrupt handlers
typedef struct OAM_item_t OAM_item_t |
Sprite Attributes structure
x | X Coordinate of the sprite on screen |
y | Y Coordinate of the sprite on screen |
tile | Sprite tile number (see set_sprite_tile) |
prop | OAM Property Flags (see set_sprite_prop) |
void remove_VBL | ( | int_handler | h | ) |
void remove_LCD | ( | int_handler | h | ) |
Removes the LCD interrupt handler.
void remove_TIM | ( | int_handler | h | ) |
Removes the TIM interrupt handler.
void remove_SIO | ( | int_handler | h | ) |
Removes the Serial Link / SIO interrupt handler.
The default SIO ISR gets installed automatically if any of the standard SIO calls are used (send_byte(), receive_byte()).
Once installed the default SIO ISR cannot be removed. Only secondary chained SIO ISRs (added with add_SIO()) can be removed.
void remove_JOY | ( | int_handler | h | ) |
Removes the JOY interrupt handler.
void add_VBL | ( | int_handler | h | ) |
Adds a Vertical Blanking interrupt handler.
h | The handler to be called whenever a V-blank interrupt occurs. |
Up to 4 handlers may be added, with the last added being called last.
Do not use the function definition attributes CRITICAL and INTERRUPT when declaring ISR functions added via add_VBL() (or LCD, etc). Those attributes are only required when constructing a bare jump from the interrupt vector itself (such as with ISR_VECTOR()).
ISR handlers added using add_VBL()/etc are instead called via the GBDK ISR dispatcher which makes the extra function attributes unecessary.
Adds a V-blank interrupt handler.
void add_LCD | ( | int_handler | h | ) |
Adds a LCD interrupt handler.
Called when the LCD interrupt occurs.
Up to 3 handlers may be added, with the last added being called last.
There are various sources controlled by the STAT_REG register ($FF41) which can trigger this interrupt. Common examples include triggering on specific scanlines using LY_REG == LYC_REG. Another is applying graphics effects on a per-scanline basis such as modifying the X and Y scroll registers (SCX_REG / SCY_REG registers).
Do not use the function definition attributes CRITICAL and INTERRUPT when declaring ISR functions added via add_VBL() (or LCD, etc). Those attributes are only required when constructing a bare jump from the interrupt vector itself (such as with ISR_VECTOR()).
ISR handlers added using add_VBL/LCD/etc are instead called via the GBDK ISR dispatcher which makes the extra function attributes unecessary.
If this ISR is to be called once per each scanline then make sure that the time it takes to execute is less than the duration of a scanline.
Adds a LCD interrupt handler.
void add_TIM | ( | int_handler | h | ) |
Adds a timer interrupt handler.
Can not be used together with add_low_priority_TIM
This interrupt occurs when the TIMA_REG register ($FF05) changes from $FF to $00.
Up to 4 handlers may be added, with the last added being called last.
void add_low_priority_TIM | ( | int_handler | h | ) |
Adds a timer interrupt handler, that could be interrupted by the other interrupts, as well as itself, if it runs too slow.
Can not be used together with add_TIM
This interrupt occurs when the TIMA_REG register ($FF05) changes from $FF to $00.
Up to 4 handlers may be added, with the last added being called last.
void add_SIO | ( | int_handler | h | ) |
Adds a Serial Link transmit complete interrupt handler.
This interrupt occurs when a serial transfer has completed on the game link port.
Up to 4 handlers may be added, with the last added being called last.
The default SIO ISR gets installed automatically if any of the standard SIO calls are used (send_byte(), receive_byte()).
void add_JOY | ( | int_handler | h | ) |
Adds a joypad button change interrupt handler.
This interrupt occurs on a transition of any of the keypad input lines from high to low, if the relevant P1_REG bits 4 or 5 are set.
For details about configuring flags or reading the data see: https://gbdev.io/pandocs/Interrupt_Sources.html#int-60–joypad-interrupt https://gbdev.io/pandocs/Joypad_Input.html#ff00–p1joyp-joypad
Due to the fact that keypad "bounce" is virtually always present, software should expect this interrupt to occur one or more times for every button press and one or more times for every button release.
Up to 4 handlers may be added, with the last added being called last.
An example use of this is allowing the user to trigger an exit from the lower-power STOP cpu state.
void nowait_int_handler | ( | void | ) |
Interrupt handler chain terminator that does not wait for .STAT
You must add this handler last in every interrupt handler chain if you want to change the default interrupt handler behaviour that waits for LCD controller mode to become 1 or 0 before return from the interrupt.
Example:
void wait_int_handler | ( | void | ) |
Default Interrupt handler chain terminator that waits for
Used by default at the end of interrupt chains to help prevent graphical glitches. The glitches are caused when an ISR interrupts a graphics operation in one mode but returns in a different mode for which that graphics operation is not allowed.
|
inline |
Cancel pending interrupts
void mode | ( | uint8_t | m | ) |
Set the current screen mode - one of M_* modes
Normally used by internal functions only.
uint8_t get_mode | ( | void | ) |
Returns the current mode
|
inline |
Returns the system gbdk is running on.
void send_byte | ( | void | ) |
Serial Link: Send the byte in _io_out out through the serial port
Make sure to enable interrupts for the Serial Link before trying to transfer data.
void receive_byte | ( | void | ) |
Serial Link: Receive a byte from the serial port into _io_in
Make sure to enable interrupts for the Serial Link before trying to transfer data.
void delay | ( | uint16_t | d | ) |
Delays the given number of milliseconds. Uses no timers or interrupts, and can be called with interrupts disabled
uint8_t joypad | ( | void | ) |
Reads and returns the current state of the joypad. Follows Nintendo's guidelines for reading the pad. Return value is an OR of J_*
When testing for multiple different buttons, it's best to read the joypad state once into a variable and then test using that variable.
Waits until at least one of the buttons given in mask are pressed.
mask | Bitmask indicating which buttons to wait for |
Normally only used for checking one key, but it will support many, even J_LEFT at the same time as J_RIGHT. :)
void waitpadup | ( | void | ) |
Waits for the directional pad and all buttons to be released.
Initializes joypads_t structure for polling multiple joypads (for the GB and ones connected via SGB)
npads | number of joypads requested (1, 2 or 4) |
joypads | pointer to joypads_t structure to be initialized |
Only required for joypad_ex, not required for calls to regular joypad()
void joypad_ex | ( | joypads_t * | joypads | ) |
Polls all avaliable joypads (for the GB and ones connected via SGB)
joypads | pointer to joypads_t structure to be filled with joypad statuses, must be previously initialized with joypad_init() |
|
inline |
Enables unmasked interrupts
|
inline |
Disables interrupts
This function may be called as many times as you like; however the first call to enable_interrupts will re-enable them.
void set_interrupts | ( | uint8_t | flags | ) |
Clears any pending interrupts and sets the interrupt mask register IO to flags.
flags | A logical OR of *_IFLAGS |
void reset | ( | void | ) |
Performs a soft reset.
For the Game Boy and related it does this by jumping to address 0x0150 which is in crt0.s (the c-runtime that executes before main() is called).
This performs various startup steps such as resetting the stack, clearing WRAM and OAM, resetting initialized variables and some display registers (scroll, window, LCDC), etc.
This is not the same a hard power reset.
void vsync | ( | void | ) |
HALTs the CPU and waits for the vertical blank interrupt and then returns when all registered VBL ISRs have completed.
This is often used in main loops to idle the CPU at low power until it's time to start the next frame. It's also useful for syncing animation with the screen re-draw.
Warning: If the VBL interrupt is disabled, this function will never return. If the screen is off this function returns immediately.
void wait_vbl_done | ( | void | ) |
Obsolete. This function has been replaced by vsync(), which has identical behavior.
void display_off | ( | void | ) |
void refresh_OAM | ( | void | ) |
Copies data from shadow OAM to OAM
Copies data from somewhere in the lower address space to part of hi-ram.
dst | Offset in high ram (0xFF00 and above) to copy to. |
src | Area to copy from |
n | Number of bytes to copy. |
Set byte in vram at given memory location
addr | address to write to |
v | value |
Get byte from vram at given memory location
addr | address to read from |
|
inline |
Sets palette for 2bpp color translation for GG/SMS, does nothing on GB
Sets the Foreground and Background colors used by the set_*_1bpp_*() functions
fgcolor | Foreground color |
bgcolor | Background color |
mode | Draw Mode |
See set_1bpp_colors for details.
Sets the Foreground and Background colors used by the set_*_1bpp_*() functions
fgcolor | Foreground color to use |
bgcolor | Background color to use |
The default colors are:
Example:
Sets VRAM Tile Pattern data for the Background / Window
first_tile | Index of the first tile to write |
nb_tiles | Number of tiles to write |
data | Pointer to (2 bpp) source tile data |
Writes nb_tiles tiles to VRAM starting at first_tile, tile data is sourced from data. Each Tile is 16 bytes in size (8x8 pixels, 2 bits-per-pixel).
GBC only: VBK_REG determines which bank of tile patterns are written to.
Sets VRAM Tile Pattern data for the Background / Window using 1bpp source data
first_tile | Index of the first Tile to write |
nb_tiles | Number of Tiles to write |
data | Pointer to (1bpp) source Tile Pattern data |
Similar to set_bkg_data, except source data is 1 bit-per-pixel which gets expanded into 2 bits-per-pixel.
For a given bit that represent a pixel:
See set_1bpp_colors for details about setting the Foreground and Background colors.
Copies from Background / Window VRAM Tile Pattern data into a buffer
first_tile | Index of the first Tile to read from |
nb_tiles | Number of Tiles to read |
data | Pointer to destination buffer for Tile Pattern data |
Copies nb_tiles tiles from VRAM starting at first_tile, Tile data is copied into data.
Each Tile is 16 bytes, so the buffer pointed to by data should be at least nb_tiles x 16 bytes in size.
Sets a rectangular region of Background Tile Map.
x | X Start position in Background Map tile coordinates. Range 0 - 31 |
y | Y Start position in Background Map tile coordinates. Range 0 - 31 |
w | Width of area to set in tiles. Range 1 - 32 |
h | Height of area to set in tiles. Range 1 - 32 |
tiles | Pointer to source tile map data |
Entries are copied from map at tiles to the Background Tile Map starting at x, y writing across for w tiles and down for h tiles.
Use set_bkg_submap() instead when:
One byte per source tile map entry.
Writes that exceed coordinate 31 on the x or y axis will wrap around to the Left and Top edges.
GBC only: VBK_REG determines whether Tile Numbers or Tile Attributes get set.
GBC Tile Attributes are defined as:
|
inline |
Sets a rectangular region of Background Tile Map. The offset value in base_tile is added to the tile ID for each map entry.
x | X Start position in Background Map tile coordinates. Range 0 - 31 |
y | Y Start position in Background Map tile coordinates. Range 0 - 31 |
w | Width of area to set in tiles. Range 1 - 32 |
h | Height of area to set in tiles. Range 1 - 32 |
tiles | Pointer to source tile map data |
base_tile | Offset each tile ID entry of the source map by this value. Range 1 - 255 |
This is identical to set_bkg_tiles() except that it adds the base_tile parameter for when a tile map's tiles don't start at index zero. (For example, the tiles used by the map range from 100 -> 120 in VRAM instead of 0 -> 20).
|
inline |
Sets a rectangular region of Background Tile Map Attributes.
x | X Start position in Background Map tile coordinates. Range 0 - 31 |
y | Y Start position in Background Map tile coordinates. Range 0 - 31 |
w | Width of area to set in tiles. Range 1 - 32 |
h | Height of area to set in tiles. Range 1 - 32 |
tiles | Pointer to source tile map attribute data |
Entries are copied from map at tiles to the Background Tile Map starting at x, y writing across for w tiles and down for h tiles.
Use set_bkg_submap_attributes() instead when:
One byte per source tile map entry.
Writes that exceed coordinate 31 on the x or y axis will wrap around to the Left and Top edges.
GBC Tile Attributes are defined as:
|
inline |
Sets a rectangular area of the Background Tile Map using a sub-region from a source tile map. Useful for scrolling implementations of maps larger than 32 x 32 tiles.
x | X Start position in both the Source Tile Map and hardware Background Map tile coordinates. Range 0 - 255 |
y | Y Start position in both the Source Tile Map and hardware Background Map tile coordinates. Range 0 - 255 |
w | Width of area to set in tiles. Range 1 - 255 |
h | Height of area to set in tiles. Range 1 - 255 |
map | Pointer to source tile map data |
map_w | Width of source tile map in tiles. Range 1 - 255 |
Entries are copied from map to the Background Tile Map starting at x, y writing across for w tiles and down for h tiles, using map_w as the rowstride for the source tile map.
The x and y parameters are in Source Tile Map tile coordinates. The location tiles will be written to on the hardware Background Map is derived from those, but only uses the lower 5 bits of each axis, for range of 0-31 (they are bit-masked: x & 0x1F
and y & 0x1F
). As a result the two coordinate systems are aligned together.
In order to transfer tile map data in a way where the coordinate systems are not aligned, an offset from the Source Tile Map pointer can be passed in: (map_ptr + x + (y * map_width))
.
For example, if you want the tile id at 1,2
from the source map to show up at 0,0
on the hardware Background Map (instead of at 1,2
) then modify the pointer address that is passed in: map_ptr + 1 + (2 * map_width)
Use this instead of set_bkg_tiles when the source map is wider than 32 tiles or when writing a width that does not match the source map width.
One byte per source tile map entry.
Writes that exceed coordinate 31 on the x or y axis will wrap around to the Left and Top edges.
See set_bkg_tiles for setting CGB attribute maps with VBK_REG.
|
inline |
Sets a rectangular area of the Background Tile Map using a sub-region from a source tile map. The offset value in base_tile is added to the tile ID for each map entry.
x | X Start position in both the Source Tile Map and hardware Background Map tile coordinates. Range 0 - 255 |
y | Y Start position in both the Source Tile Map and hardware Background Map tile coordinates. Range 0 - 255 |
w | Width of area to set in tiles. Range 1 - 255 |
h | Height of area to set in tiles. Range 1 - 255 |
map | Pointer to source tile map data |
map_w | Width of source tile map in tiles. Range 1 - 255 |
base_tile | Offset each tile ID entry of the source map by this value. Range 1 - 255 |
This is identical to set_bkg_submap() except that it adds the base_tile parameter for when a tile map's tiles don't start at index zero. (For example, the tiles used by the map range from 100 -> 120 in VRAM instead of 0 -> 20).
|
inline |
Sets a rectangular area of the Background Tile Map Attributes using a sub-region from a source tile attribute map. Useful for scrolling implementations of maps larger than 32 x 32 tiles.
x | X Start position in both the Source Tile Map and hardware Background Map tile coordinates. Range 0 - 255 |
y | Y Start position in both the Source Tile Map and hardware Background Map tile coordinates. Range 0 - 255 |
w | Width of area to set in tiles. Range 1 - 255 |
h | Height of area to set in tiles. Range 1 - 255 |
map | Pointer to source tile map attribute data |
map_w | Width of source tile map in tiles. Range 1 - 255 |
Entries are copied from map to the Background Tile Map starting at x, y writing across for w tiles and down for h tiles, using map_w as the rowstride for the source tile map.
The x and y parameters are in Source Tile Map tile coordinates. The location tiles will be written to on the hardware Background Map is derived from those, but only uses the lower 5 bits of each axis, for range of 0-31 (they are bit-masked: x & 0x1F
and y & 0x1F
). As a result the two coordinate systems are aligned together.
In order to transfer tile map data in a way where the coordinate systems are not aligned, an offset from the Source Tile Map pointer can be passed in: (map_ptr + x + (y * map_width))
.
For example, if you want the tile id at 1,2
from the source map to show up at 0,0
on the hardware Background Map (instead of at 1,2
) then modify the pointer address that is passed in: map_ptr + 1 + (2 * map_width)
Use this instead of set_bkg_tiles when the source map is wider than 32 tiles or when writing a width that does not match the source map width.
One byte per source tile map entry.
Writes that exceed coordinate 31 on the x or y axis will wrap around to the Left and Top edges.
See set_bkg_tiles for setting CGB attribute maps with VBK_REG.
Copies a rectangular region of Background Tile Map entries into a buffer.
x | X Start position in Background Map tile coordinates. Range 0 - 31 |
y | Y Start position in Background Map tile coordinates. Range 0 - 31 |
w | Width of area to copy in tiles. Range 0 - 31 |
h | Height of area to copy in tiles. Range 0 - 31 |
tiles | Pointer to destination buffer for Tile Map data |
Entries are copied into tiles from the Background Tile Map starting at x, y reading across for w tiles and down for h tiles.
One byte per tile.
The buffer pointed to by tiles should be at least x x y bytes in size.
Set single tile t on background layer at x,y
x | X-coordinate |
y | Y-coordinate |
t | tile index |
Set single attribute data a on background layer at x,y
x | X-coordinate |
y | Y-coordinate |
a | tile attributes |
Get single tile t on background layer at x,y
x | X-coordinate |
y | Y-coordinate |
Moves the Background Layer to the position specified in x and y in pixels.
x | X axis screen coordinate for Left edge of the Background |
y | Y axis screen coordinate for Top edge of the Background |
0,0 is the top left corner of the GB screen. The Background Layer wraps around the screen, so when part of it goes off the screen it appears on the opposite side (factoring in the larger size of the Background Layer versus the screen size).
The background layer is always under the Window Layer.
Moves the Background relative to it's current position.
x | Number of pixels to move the Background on the X axis Range: -128 - 127 |
y | Number of pixels to move the Background on the Y axis Range: -128 - 127 |
Sets VRAM Tile Pattern data for the Window / Background
first_tile | Index of the first tile to write |
nb_tiles | Number of tiles to write |
data | Pointer to (2 bpp) source Tile Pattern data. |
This is the same as set_bkg_data, since the Window Layer and Background Layer share the same Tile pattern data.
Sets VRAM Tile Pattern data for the Window / Background using 1bpp source data
first_tile | Index of the first tile to write |
nb_tiles | Number of tiles to write |
data | Pointer to (1bpp) source Tile Pattern data |
This is the same as set_bkg_1bpp_data, since the Window Layer and Background Layer share the same Tile pattern data.
For a given bit that represent a pixel:
See set_1bpp_colors for details about setting the Foreground and Background colors.
Copies from Window / Background VRAM Tile Pattern data into a buffer
first_tile | Index of the first Tile to read from |
nb_tiles | Number of Tiles to read |
data | Pointer to destination buffer for Tile Pattern Data |
This is the same as get_bkg_data, since the Window Layer and Background Layer share the same Tile pattern data.
Sets a rectangular region of the Window Tile Map.
x | X Start position in Window Map tile coordinates. Range 0 - 31 |
y | Y Start position in Window Map tile coordinates. Range 0 - 31 |
w | Width of area to set in tiles. Range 1 - 32 |
h | Height of area to set in tiles. Range 1 - 32 |
tiles | Pointer to source tile map data |
Entries are copied from map at tiles to the Window Tile Map starting at x, y writing across for w tiles and down for h tiles.
Use set_win_submap() instead when:
One byte per source tile map entry.
Writes that exceed coordinate 31 on the x or y axis will wrap around to the Left and Top edges.
GBC only: VBK_REG determines whether Tile Numbers or Tile Attributes get set.
For more details about GBC Tile Attributes see set_bkg_tiles.
|
inline |
Sets a rectangular region of the Window Tile Map. The offset value in base_tile is added to the tile ID for each map entry.
x | X Start position in Window Map tile coordinates. Range 0 - 31 |
y | Y Start position in Window Map tile coordinates. Range 0 - 31 |
w | Width of area to set in tiles. Range 1 - 32 |
h | Height of area to set in tiles. Range 1 - 32 |
tiles | Pointer to source tile map data |
base_tile | Offset each tile ID entry of the source map by this value. Range 1 - 255 |
This is identical to set_win_tiles() except that it adds the base_tile parameter for when a tile map's tiles don't start at index zero. (For example, the tiles used by the map range from 100 -> 120 in VRAM instead of 0 -> 20).
|
inline |
Sets a rectangular area of the Window Tile Map using a sub-region from a source tile map.
x | X Start position in both the Source Tile Map and hardware Window Map tile coordinates. Range 0 - 255 |
y | Y Start position in both the Source Tile Map and hardware Window Map tile coordinates. Range 0 - 255 |
w | Width of area to set in tiles. Range 1 - 255 |
h | Height of area to set in tiles. Range 1 - 255 |
map | Pointer to source tile map data |
map_w | Width of source tile map in tiles. Range 1 - 255 |
Entries are copied from map to the Window Tile Map starting at x, y writing across for w tiles and down for h tiles, using map_w as the rowstride for the source tile map.
The x and y parameters are in Source Tile Map tile coordinates. The location tiles will be written to on the hardware Background Map is derived from those, but only uses the lower 5 bits of each axis, for range of 0-31 (they are bit-masked: x & 0x1F
and y & 0x1F
). As a result the two coordinate systems are aligned together.
In order to transfer tile map data in a way where the coordinate systems are not aligned, an offset from the Source Tile Map pointer can be passed in: (map_ptr + x + (y * map_width))
.
For example, if you want the tile id at 1,2
from the source map to show up at 0,0
on the hardware Background Map (instead of at 1,2
) then modify the pointer address that is passed in: map_ptr + 1 + (2 * map_width)
Use this instead of set_win_tiles when the source map is wider than 32 tiles or when writing a width that does not match the source map width.
One byte per source tile map entry.
Writes that exceed coordinate 31 on the x or y axis will wrap around to the Left and Top edges.
GBC only: VBK_REG determines whether Tile Numbers or Tile Attributes get set.
See set_bkg_tiles for details about CGB attribute maps with VBK_REG.
|
inline |
Sets a rectangular area of the Window Tile Map using a sub-region from a source tile map. The offset value in base_tile is added to the tile ID for each map entry.
x | X Start position in both the Source Tile Map and hardware Window Map tile coordinates. Range 0 - 255 |
y | Y Start position in both the Source Tile Map and hardware Window Map tile coordinates. Range 0 - 255 |
w | Width of area to set in tiles. Range 1 - 255 |
h | Height of area to set in tiles. Range 1 - 255 |
map | Pointer to source tile map data |
map_w | Width of source tile map in tiles. Range 1 - 255 |
base_tile | Offset each tile ID entry of the source map by this value. Range 1 - 255 |
This is identical to set_win_submap() except that it adds the base_tile parameter for when a tile map's tiles don't start at index zero. (For example, the tiles used by the map range from 100 -> 120 in VRAM instead of 0 -> 20).
Copies a rectangular region of Window Tile Map entries into a buffer.
x | X Start position in Window Map tile coordinates. Range 0 - 31 |
y | Y Start position in Window Map tile coordinates. Range 0 - 31 |
w | Width of area to copy in tiles. Range 0 - 31 |
h | Height of area to copy in tiles. Range 0 - 31 |
tiles | Pointer to destination buffer for Tile Map data |
Entries are copied into tiles from the Window Tile Map starting at x, y reading across for w tiles and down for h tiles.
One byte per tile.
The buffer pointed to by tiles should be at least x x y bytes in size.
Set single tile t on window layer at x,y
x | X-coordinate |
y | Y-coordinate |
t | tile index |
Get single tile t on window layer at x,y
x | X-coordinate |
y | Y-coordinate |
Moves the Window to the x, y position on the screen.
x | X coordinate for Left edge of the Window (actual displayed location will be X - 7) |
y | Y coordinate for Top edge of the Window |
7,0 is the top left corner of the screen in Window coordinates. The Window is locked to the bottom right corner.
The Window is always over the Background layer.
Move the Window relative to its current position.
x | Number of pixels to move the window on the X axis Range: -128 - 127 |
y | Number of pixels to move the window on the Y axis Range: -128 - 127 |
Sets VRAM Tile Pattern data for Sprites
first_tile | Index of the first tile to write |
nb_tiles | Number of tiles to write |
data | Pointer to (2 bpp) source Tile Pattern data |
Writes nb_tiles tiles to VRAM starting at first_tile, tile data is sourced from data. Each Tile is 16 bytes in size (8x8 pixels, 2 bits-per-pixel).
GBC only: VBK_REG determines which bank of tile patterns are written to.
Sets VRAM Tile Pattern data for Sprites using 1bpp source data
first_tile | Index of the first tile to write |
nb_tiles | Number of tiles to write |
data | Pointer to (1bpp) source Tile Pattern data |
Similar to set_sprite_data, except source data is 1 bit-per-pixel which gets expanded into 2 bits-per-pixel.
For a given bit that represent a pixel:
See set_1bpp_colors for details about setting the Foreground and Background colors.
Copies from Sprite VRAM Tile Pattern data into a buffer
first_tile | Index of the first tile to read from |
nb_tiles | Number of tiles to read |
data | Pointer to destination buffer for Tile Pattern data |
Copies nb_tiles tiles from VRAM starting at first_tile, tile data is copied into data.
Each Tile is 16 bytes, so the buffer pointed to by data should be at least nb_tiles x 16 bytes in size.
|
inline |
Enable OAM DMA copy each VBlank and set it to transfer any 256-byte aligned array
Sets sprite number nb__in the OAM to display tile number __tile.
nb | Sprite number, range 0 - 39 |
tile | Selects a tile (0 - 255) from memory at 8000h - 8FFFh In CGB Mode this could be either in VRAM Bank 0 or 1, depending on Bit 3 of the OAM Attribute Flag (see set_sprite_prop) |
In 8x16 mode:
Returns the tile number of sprite number nb in the OAM.
nb | Sprite number, range 0 - 39 |
Sets the OAM Property Flags of sprite number nb to those defined in prop.
nb | Sprite number, range 0 - 39 |
prop | Property setting (see bitfield description) |
The bits in prop represent:
It's recommended to use GBDK constants (eg: S_FLIPY) to configure sprite properties as these are crossplatform.
Returns the OAM Property Flags of sprite number nb.
nb | Sprite number, range 0 - 39 |
Moves sprite number nb to the x, y position on the screen.
nb | Sprite number, range 0 - 39 |
x | X Position. Specifies the sprites horizontal position on the screen (minus 8). An offscreen value (X=0 or X>=168) hides the sprite, but the sprite still affects the priority ordering - a better way to hide a sprite is to set its Y-coordinate offscreen. |
y | Y Position. Specifies the sprites vertical position on the screen (minus 16). An offscreen value (for example, Y=0 or Y>=160) hides the sprite. |
Moving the sprite to 0,0 (or similar off-screen location) will hide it.
Moves sprite number nb relative to its current position.
nb | Sprite number, range 0 - 39 |
x | Number of pixels to move the sprite on the X axis Range: -128 - 127 |
y | Number of pixels to move the sprite on the Y axis Range: -128 - 127 |
|
inline |
Hides sprite number nb by moving it to zero position by Y.
nb | Sprite number, range 0 - 39 |
Copies arbitrary data to an address in VRAM without taking into account the state of LCDC bits 3 or 4.
vram_addr | Pointer to destination VRAM Address |
data | Pointer to source buffer |
len | Number of bytes to copy |
Copies len bytes from a buffer at data to VRAM starting at vram_addr.
GBC only: VBK_REG determines which bank of tile patterns are written to.
Copies arbitrary data from an address in VRAM into a buffer without taking into account the state of LCDC bits 3 or 4.
vram_addr | Pointer to source VRAM Address |
data | Pointer to destination buffer |
len | Number of bytes to copy |
Copies len bytes from VRAM starting at vram_addr into a buffer at data.
GBC only: VBK_REG determines which bank of tile patterns are written to.
Copies arbitrary data from an address in VRAM into a buffer
dest | Pointer to destination buffer (may be in VRAM) |
sour | Pointer to source buffer (may be in VRAM) |
len | Number of bytes to copy |
Copies len bytes from or to VRAM starting at sour into a buffer or to VRAM at dest.
GBC only: VBK_REG determines which bank of tile patterns are written to.
void set_tiles | ( | uint8_t | x, |
uint8_t | y, | ||
uint8_t | w, | ||
uint8_t | h, | ||
uint8_t * | vram_addr, | ||
const uint8_t * | tiles | ||
) |
Sets a rectangular region of Tile Map entries at a given VRAM Address without taking into account the state of LCDC bit 3.
x | X Start position in Map tile coordinates. Range 0 - 31 |
y | Y Start position in Map tile coordinates. Range 0 - 31 |
w | Width of area to set in tiles. Range 1 - 32 |
h | Height of area to set in tiles. Range 1 - 32 |
vram_addr | Pointer to destination VRAM Address |
tiles | Pointer to source Tile Map data |
Entries are copied from tiles to Tile Map at address vram_addr starting at x, y writing across for w tiles and down for h tiles.
One byte per source tile map entry.
There are two 32x32 Tile Maps in VRAM at addresses 9800h-9BFFh and 9C00h-9FFFh.
GBC only: VBK_REG determines whether Tile Numbers or Tile Attributes get set.
Sets VRAM Tile Pattern data starting from given base address without taking into account the state of LCDC bit 4.
first_tile | Index of the first tile to write |
nb_tiles | Number of tiles to write |
data | Pointer to (2 bpp) source Tile Pattern data. |
base | MSB of the destination address in VRAM (usually 0x80 or 0x90 which gives 0x8000 or 0x9000) |
Copies a rectangular region of Tile Map entries from a given VRAM Address into a buffer without taking into account the state of LCDC bit 3.
x | X Start position in Background Map tile coordinates. Range 0 - 31 |
y | Y Start position in Background Map tile coordinates. Range 0 - 31 |
w | Width of area to copy in tiles. Range 0 - 31 |
h | Height of area to copy in tiles. Range 0 - 31 |
vram_addr | Pointer to source VRAM Address |
tiles | Pointer to destination buffer for Tile Map data |
Entries are copied into tiles from the Background Tile Map starting at x, y reading across for w tiles and down for h tiles.
One byte per tile.
There are two 32x32 Tile Maps in VRAM at addresses 9800h - 9BFFh and 9C00h - 9FFFh.
The buffer pointed to by tiles should be at least x x y bytes in size.
Sets VRAM Tile Pattern data in the native format
first_tile | Index of the first tile to write (0 - 511) |
nb_tiles | Number of tiles to write |
data | Pointer to source Tile Pattern data. |
When first_tile
is larger than 256 on the GB/AP, it will write to sprite data instead of background data.
The bit depth of the source Tile Pattern data depends on which console is being used:
Sets VRAM Tile Pattern data for the Background / Window in the native format
first_tile | Index of the first tile to write |
nb_tiles | Number of tiles to write |
data | Pointer to source tile data |
Writes nb_tiles tiles to VRAM starting at first_tile, tile data is sourced from data.
GBC only: VBK_REG determines which bank of tile patterns are written to.
Sets VRAM Tile Pattern data for Sprites in the native format
first_tile | Index of the first tile to write |
nb_tiles | Number of tiles to write |
data | Pointer to source tile data |
Writes nb_tiles tiles to VRAM starting at first_tile, tile data is sourced from data.
GBC only: VBK_REG determines which bank of tile patterns are written to.
void init_win | ( | uint8_t | c | ) |
Initializes the entire Window Tile Map with Tile Number c
c | Tile number to fill with |
void init_bkg | ( | uint8_t | c | ) |
Initializes the entire Background Tile Map with Tile Number c
c | Tile number to fill with |
Fills the VRAM memory region s of size n with Tile Number c
s | Start address in VRAM |
c | Tile number to fill with |
n | Size of memory region (in bytes) to fill |
Fills a rectangular region of Tile Map entries for the Background layer with tile.
x | X Start position in Background Map tile coordinates. Range 0 - 31 |
y | Y Start position in Background Map tile coordinates. Range 0 - 31 |
w | Width of area to set in tiles. Range 0 - 31 |
h | Height of area to set in tiles. Range 0 - 31 |
tile | Fill value |
Fills a rectangular region of Tile Map entries for the Window layer with tile.
x | X Start position in Window Map tile coordinates. Range 0 - 31 |
y | Y Start position in Window Map tile coordinates. Range 0 - 31 |
w | Width of area to set in tiles. Range 0 - 31 |
h | Height of area to set in tiles. Range 0 - 31 |
tile | Fill value |
void c |
void d |
void e |
void h |
void l |
|
extern |
GB CPU type
|
extern |
GBA detection
|
extern |
Global Time Counter in VBL periods (60Hz)
Increments once per Frame
Will wrap around every ~18 minutes (unsigned 16 bits = 65535 / 60 / 60 = 18.2)
|
extern |
Serial Link: Current IO Status. An OR of IO_*
|
extern |
Serial Link: Byte just read after calling receive_byte()
|
extern |
Serial Link: Write byte to send here before calling send_byte()
__REG _current_bank |
Tracks current active ROM bank
In most cases the CURRENT_BANK macro for this variable is recommended for use instead of the variable itself.
The active bank number is not tracked by _current_bank when SWITCH_ROM_MBC5_8M is used.
This variable is updated automatically when you call SWITCH_ROM_MBC1 or SWITCH_ROM_MBC5, SWITCH_ROM(), or call a BANKED function.
void b |
|
extern |
|
extern |
|
extern |
|
extern |
Shadow OAM array in WRAM, that is DMA-transferred into the real OAM each VBlank
__REG _shadow_OAM_base |
MSB of shadow_OAM address is used by OAM DMA copying routine