blob: 48411b7c6856acf6d4a45135cb73e7e7573573e3 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#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
|