summaryrefslogtreecommitdiff
path: root/arm9/source/devices/screen.h
blob: 1ff58e5caf17e750fc52d079139390d64bab140a (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
69
70
#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;         // buffered tile memory
        u16 *map;             // tile map (never changes)
        u16 *palv;            // visible colour palette
        u16 pal[16];          // buffered 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 scr_make_main(ScreenDevice *scr);
    void scr_make_sub(ScreenDevice *scr);
    void scr_unmake(ScreenDevice *scr);

    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