#ifndef SCREEN_H_ #define SCREEN_H_ #include "../bang.h" // Dimension constants. #define PIXELS_WIDTH 256 #define PIXELS_HEIGHT 192 #define PIXELS_COUNT (PIXELS_WIDTH*PIXELS_HEIGHT) #define TILES_WIDTH 32 #define TILES_HEIGHT 24 #define TILES_COUNT (TILES_WIDTH*TILES_HEIGHT) #define LAYER_MEM (TILES_COUNT*32) // VRAM addresses. #define BG_SLOT_FRONT 0 // Tile base for background tiles in the front buffer #define FG_SLOT_FRONT 2 // Tile base for foreground tiles in the front buffer #define BG_SLOT_BACK 4 // Tile base for background tiles in the back buffer #define FG_SLOT_BACK 6 // Tile base for foreground tiles in the back buffer #define MAP_SLOT 12 // Map base for tile map // Sprite buffer for the screen device. typedef struct { u8 mem[16]; // Buffer memory u8 p; // Buffer pointer u8 sprite[8][8]; // Cached transformed sprite u8 draw; // Cached draw byte bool cached; // A transformed sprite has been cached } SpriteBuffer; // Hardware screen on the NDS. typedef struct { u16 *bgv, *fgv; // Visible tile memory (front buffer) u16 *bg, *fg; // Buffered tile memory (back buffer) u16 *map; // Tile map (never changes) u16 *palv; // Visible colour palette (front buffer) u16 pal[16]; // Buffered colour palette (back buffer) } NDSScreen; // Bedrock screen device. typedef struct { u16 x,y; // Current cursor position u16 px,py; // Previous cursor position u16 selected; // Selected sprite colours SpriteBuffer sprite; // Sprite buffer u16 colour; // Palette colour write cache u16 pal[16]; // Palette as RGB15 colours NDSScreen *nds; // Pointer to hardware screen to draw to. bool wake; // Wake flag bool dirty; // Dirty flag } ScreenDevice; // Functions. void init_nds_screens(void); // Methods. void screen_reset(ScreenDevice *screen); void ndsscreen_flip_buffers(NDSScreen *nds); void ndsscreen_clear(NDSScreen *nds); void spritebuf_push(SpriteBuffer *b, u8 row); void screen_map_to_none(ScreenDevice *screen); void screen_map_to_main(ScreenDevice *screen); void screen_map_to_sub(ScreenDevice *screen); void screen_commit_colour(ScreenDevice *screen); void screen_move_cursor(ScreenDevice *screen, u8 move); void screen_draw(ScreenDevice *screen, u8 draw); #endif