summaryrefslogtreecommitdiff
path: root/arm9/source/devices/screen.h
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2024-11-18 14:57:19 +1300
committerBen Bridle <ben@derelict.engineering>2024-11-18 14:57:19 +1300
commit722d5509178fa5bdaa488fbbd9196f21377f8775 (patch)
tree112b39cd80cb8e074d9e71d1def4d8de33c9eefa /arm9/source/devices/screen.h
downloadbedrock-nds-722d5509178fa5bdaa488fbbd9196f21377f8775.zip
Initial commit
Diffstat (limited to 'arm9/source/devices/screen.h')
-rw-r--r--arm9/source/devices/screen.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/arm9/source/devices/screen.h b/arm9/source/devices/screen.h
new file mode 100644
index 0000000..a406051
--- /dev/null
+++ b/arm9/source/devices/screen.h
@@ -0,0 +1,66 @@
+#ifndef SCREEN_H_
+ #define SCREEN_H_
+
+ #define PIXELS_WIDTH 256
+ #define PIXELS_HEIGHT 192
+ #define PIXELS_SIZE 49152
+ #define TILES_WIDTH 32
+ #define TILES_HEIGHT 24
+ #define TILES_SIZE 768
+ #define TILES_MEM 24576 // size of a screen layer in bytes
+
+ #define BG_SLOT_VIS 0 // tile base for visible background tiles
+ #define FG_SLOT_VIS 2 // tile base for visible foreground tiles
+ #define BG_SLOT 4 // tile base for background tiles
+ #define FG_SLOT 6 // tile base for foreground tiles
+ #define MAP_SLOT 12 // map base for tile map
+
+ typedef struct {
+ u8 mem[16]; // buffer memory
+ u8 p; // buffer pointer
+ u8 sprite[8][8]; // transformed sprite
+ bool cached; // true if sprite has been transformed
+ u8 draw; // the cached draw byte
+ } SpriteBuffer;
+
+ typedef struct {
+ u16 *bgv, *fgv; // visible tile memory
+ u16 *bg, *fg; // tile memory
+ u16 *map; // tile map
+ u16 *pal; // colour palette
+ } Screen;
+
+ typedef struct {
+ u16 x,y; // cursor position
+ u16 px,py; // previous cursor position
+ u16 colours; // sprite colours
+ SpriteBuffer sprite; // sprite buffer
+ u16 palette_write; // palette write cache
+ u16 palette[16]; // palette as RGB15 colours
+ Screen *nds; // NDS VRAM pointers
+ bool wake; // wake flag
+ bool dirty; // dirty flag
+ } ScreenDevice;
+
+ void init_screens(void);
+
+ void set_palette_high(ScreenDevice *scr, u8 high);
+ void set_palette_low(ScreenDevice *scr, u8 low);
+ void draw_pixel(u16 *layer, u16 x, u16 y, u8 colour);
+ void fill_layer(u16 *layer, u8 colour);
+ void erase_screen(Screen *nds);
+ void flip_buffer(Screen *nds);
+ void black_screen(Screen *nds);
+
+ void scr_draw_pixel( ScreenDevice *scr, u16 *layer, u8 draw);
+ void scr_draw_sprite(ScreenDevice *scr, u16 *layer, u8 draw);
+ void scr_fill_layer( ScreenDevice *scr, u16 *layer, u8 draw);
+ void scr_draw_line( ScreenDevice *scr, u16 *layer, u8 draw);
+ void scr_draw_rect( ScreenDevice *scr, u16 *layer, u8 draw);
+
+ void draw_dispatch(ScreenDevice *scr, u8 draw);
+ void move_cursor(ScreenDevice *scr, u8 move);
+
+ void push_sprite(SpriteBuffer *b, u8 row);
+
+#endif