aboutsummaryrefslogtreecommitdiff
path: root/arm9/source/devices/screen.h
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