GBDK 2020 Docs  4.2.0
API Documentation for GBDK 2020
nes.h
Go to the documentation of this file.
1 
4 #ifndef _NES_H
5 #define _NES_H
6 
7 #include <types.h>
8 #include <stdint.h>
9 #include <gbdk/version.h>
10 #include <nes/hardware.h>
11 #include <nes/rgb_to_nes_macro.h>
12 
13 #define NINTENDO_NES
14 
15 // Here NINTENDO means Game Boy & related clones
16 #ifdef NINTENDO
17 #undef NINTENDO
18 #endif
19 
20 #ifdef SEGA
21 #undef SEGA
22 #endif
23 
24 #ifdef MSX
25 #undef MSX
26 #endif
27 
28 
29 #define RGB(r,g,b) RGB_TO_NES(((r) | ((g) << 2) | ((b) << 4)))
30 #define RGB8(r,g,b) RGB_TO_NES((((r) >> 6) | (((g) >> 6) << 2) | (((b) >> 6) << 4)))
31 #define RGBHTML(RGB24bit) RGB_TO_NES((((RGB24bit) >> 22) | ((((RGB24bit) & 0xFFFF) >> 14) << 2) | ((((RGB24bit) & 0xFF) >> 6) << 4)))
32 
38 #define RGB_RED 0x16 // EGA12
39 #define RGB_DARKRED 0x06 // EGA4
40 #define RGB_GREEN 0x2A // EGA10
41 #define RGB_DARKGREEN 0x1A // EGA2
42 #define RGB_BLUE 0x12 // EGA9
43 #define RGB_DARKBLUE 0x02 // EGA1
44 #define RGB_YELLOW 0x28 // EGA14
45 #define RGB_DARKYELLOW 0x18 // EGA6
46 #define RGB_CYAN 0x2C // EGA11
47 #define RGB_AQUA 0x1C // EGA3
48 #define RGB_PINK 0x24 // EGA13
49 #define RGB_PURPLE 0x14 // EGA5
50 #define RGB_BLACK 0x0F // EGA0
51 #define RGB_DARKGRAY 0x00 // EGA8
52 #define RGB_LIGHTGRAY 0x10 // EGA7
53 #define RGB_WHITE 0x30 // EGA15
54 
56 
57 void set_bkg_palette(uint8_t first_palette, uint8_t nb_palettes, const palette_color_t *rgb_data) OLDCALL;
58 
59 void set_sprite_palette(uint8_t first_palette, uint8_t nb_palettes, const palette_color_t *rgb_data) OLDCALL;
60 
62 
64 
78 #define J_UP 0x10U
79 #define J_DOWN 0x20U
80 #define J_LEFT 0x40U
81 #define J_RIGHT 0x80U
82 #define J_A 0x01U
83 #define J_B 0x02U
84 #define J_SELECT 0x04U
85 #define J_START 0x08U
86 
91 #define M_DRAWING 0x01U
92 #define M_TEXT_OUT 0x02U
93 #define M_TEXT_INOUT 0x03U
99 #define M_NO_SCROLL 0x04U
103 #define M_NO_INTERP 0x08U
104 
109 #define S_PALETTE 0x10U
113 #define S_FLIPX 0x40U
117 #define S_FLIPY 0x80U
122 #define S_PRIORITY 0x20U
126 #define S_PAL(n) n
127 
128 /* DMG Palettes */
129 #define DMG_BLACK 0x03
130 #define DMG_DARK_GRAY 0x02
131 #define DMG_LITE_GRAY 0x01
132 #define DMG_WHITE 0x00
152 #define DMG_PALETTE(C0, C1, C2, C3) ((uint8_t)((((C3) & 0x03) << 6) | (((C2) & 0x03) << 4) | (((C1) & 0x03) << 2) | ((C0) & 0x03)))
153 
154 /* Limits */
157 #define SCREENWIDTH DEVICE_SCREEN_PX_WIDTH
160 #define SCREENHEIGHT DEVICE_SCREEN_PX_HEIGHT
161 
164 typedef void (*int_handler)(void) NONBANKED;
165 
174 
179 
209 
243 
251 
257 
264 extern volatile uint16_t sys_time;
265 
276 extern volatile uint8_t _current_bank;
277 #define CURRENT_BANK _current_bank
278 
288 #ifndef BANK
289 #define BANK(VARNAME) ( (uint8_t) & __bank_ ## VARNAME )
290 #endif
291 
304 #define BANKREF(VARNAME) void __func_ ## VARNAME(void) __banked __naked { \
305 __asm \
306  .local b___func_ ## VARNAME \
307  ___bank_ ## VARNAME = b___func_ ## VARNAME \
308  .globl ___bank_ ## VARNAME \
309 __endasm; \
310 }
311 
321 #define BANKREF_EXTERN(VARNAME) extern const void __bank_ ## VARNAME;
322 
326 #define SWITCH_ROM_DUMMY(b)
327 
331 #define SWITCH_ROM_UNROM(b) _switch_prg0(b)
332 
338 #define SWITCH_ROM SWITCH_ROM_UNROM
339 
344 #define SWITCH_RAM(b) 0
345 
349 #define ENABLE_RAM
350 
354 #define DISABLE_RAM
355 
361 
372 
382 
386 void waitpadup(void);
387 
393 typedef struct {
394  uint8_t npads;
395  union {
396  struct {
397  uint8_t joy0, joy1, joy2, joy3;
398  };
399  uint8_t joypads[4];
400  };
401 } joypads_t;
402 
412 
417 void joypad_ex(joypads_t * joypads) OLDCALL;
418 
419 
420 
429 inline void enable_interrupts(void) {
430  __asm__("cli");
431 }
432 
445 inline void disable_interrupts(void) {
446  __asm__("sei");
447 }
448 
458 void vsync(void);
459 
462 void wait_vbl_done(void);
463 
468 void display_on(void);
469 
475 void display_off(void);
476 
479 void refresh_OAM(void);
480 
484 #define DISPLAY_ON \
485  display_on();
486 
490 #define DISPLAY_OFF \
491  display_off();
492 
496 #define HIDE_LEFT_COLUMN \
497  shadow_PPUMASK &= ~(PPUMASK_SHOW_BG_LC | PPUMASK_SHOW_SPR_LC); \
498 
502 #define SHOW_LEFT_COLUMN \
503  shadow_PPUMASK |= (PPUMASK_SHOW_BG_LC | PPUMASK_SHOW_SPR_LC);
504 
508 #define SHOW_BKG \
509  shadow_PPUMASK |= PPUMASK_SHOW_BG;
510 
514 #define HIDE_BKG \
515  shadow_PPUMASK &= ~PPUMASK_SHOW_BG;
516 
520 #define SHOW_SPRITES \
521  shadow_PPUMASK |= PPUMASK_SHOW_SPR;
522 
526 #define HIDE_SPRITES \
527  shadow_PPUMASK &= ~PPUMASK_SHOW_SPR;
528 
532 #define SPRITES_8x16 \
533  shadow_PPUCTRL |= PPUCTRL_SPR_8X16;
534 
538 #define SPRITES_8x8 \
539  shadow_PPUCTRL &= ~PPUCTRL_SPR_8X16;
540 
541 
542 
550 
555 
556 #define COMPAT_PALETTE(C0,C1,C2,C3) ((uint8_t)(((C3) << 6) | ((C2) << 4) | ((C1) << 2) | (C0)))
557 
560 inline void set_2bpp_palette(uint16_t palette) {
561  palette;
562 }
563 
566 inline void set_1bpp_colors(uint8_t fgcolor, uint8_t bgcolor) {
567  set_1bpp_colors_ex(fgcolor, bgcolor, 0);
568 }
569 
579 void set_bkg_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data) OLDCALL;
580 #define set_bkg_2bpp_data set_bkg_data
581 
593 void set_bkg_1bpp_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data) OLDCALL;
594 
614 #define set_tile_map set_bkg_tiles
615 
640 
664 inline void set_bkg_attributes(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *attributes)
665 {
666  set_bkg_attributes_nes16x16(x >> 1, y >> 1, (w + 1) >> 1, (h + 1) >> 1, attributes);
667 }
714 
727 inline void set_bkg_submap_attributes(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *attributes, uint8_t map_w)
728 {
729  set_bkg_submap_attributes_nes16x16(x >> 1, y >> 1, (w + 1) >> 1, (h + 1) >> 1, attributes, map_w >> 1);
730 }
731 
732 
734 
753 inline void set_bkg_based_tiles(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *tiles, uint8_t base_tile) {
754  _map_tile_offset = base_tile;
755  set_bkg_tiles(x, y, w, h, tiles);
756  _map_tile_offset = 0;
757 }
758 
759 
788 void set_bkg_submap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *map, uint8_t map_w) OLDCALL;
789 #define set_tile_submap set_bkg_submap
790 
791 
793 
813 inline void set_bkg_based_submap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *map, uint8_t map_w, uint8_t base_tile) {
814  _submap_tile_offset = base_tile;
815  set_bkg_submap(x, y, w, h, map, map_w);
817 }
818 
819 
832 
833 
842 #define set_tile_xy set_bkg_tile_xy
843 
852 
866 {
867  set_bkg_attribute_xy_nes16x16(x >> 1, y >> 1, a);
868 }
869 #define set_attribute_xy set_bkg_attribute_xy
870 
878 
879 
893 inline void move_bkg(uint8_t x, uint8_t y) {
894  bkg_scroll_x = x, bkg_scroll_y = y;
895 }
896 
897 
907 inline void scroll_bkg(int8_t x, int8_t y) {
908  bkg_scroll_x += x, bkg_scroll_y += y;
909 }
910 
911 
923 void set_sprite_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data) OLDCALL;
924 #define set_sprite_2bpp_data set_sprite_data
925 
937 void set_sprite_1bpp_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data) OLDCALL;
938 
945 typedef struct OAM_item_t {
946  uint8_t y; //< Y coordinate of the sprite on screen - 1
947  uint8_t tile; //< Sprite tile number
948  uint8_t prop; //< OAM Property Flags
949  uint8_t x; //< X coordinate of the sprite on screen
951 
952 
955 extern volatile struct OAM_item_t shadow_OAM[];
956 
960 
961 #define DISABLE_OAM_DMA \
962  _shadow_OAM_base = 0
963 
966 #define DISABLE_VBL_TRANSFER DISABLE_OAM_DMA
967 
968 #define ENABLE_OAM_DMA \
969  _shadow_OAM_base = (uint8_t)((uint16_t)&shadow_OAM >> 8)
970 
973 #define ENABLE_VBL_TRANSFER ENABLE_OAM_DMA
974 
977 #define MAX_HARDWARE_SPRITES 64
978 
981 #define HARDWARE_SPRITE_CAN_FLIP_X 1
982 
985 #define HARDWARE_SPRITE_CAN_FLIP_Y 1
986 
989 inline void SET_SHADOW_OAM_ADDRESS(void * address) {
990  _shadow_OAM_base = (uint8_t)((uint16_t)address >> 8);
991 }
992 
1007  shadow_OAM[nb].tile=tile;
1008 }
1009 
1010 
1018  return shadow_OAM[nb].tile;
1019 }
1020 
1021 
1053  shadow_OAM[nb].prop=prop;
1054 }
1055 
1056 
1063  return shadow_OAM[nb].prop;
1064 }
1065 
1066 
1076 inline void move_sprite(uint8_t nb, uint8_t x, uint8_t y) {
1077  OAM_item_t * itm = &shadow_OAM[nb];
1078  itm->y=y, itm->x=x;
1079 }
1080 
1081 
1092 inline void scroll_sprite(uint8_t nb, int8_t x, int8_t y) {
1093  OAM_item_t * itm = &shadow_OAM[nb];
1094  itm->y+=y, itm->x+=x;
1095 }
1096 
1097 
1102 inline void hide_sprite(uint8_t nb) {
1103  shadow_OAM[nb].y = 240;
1104 }
1105 
1106 
1107 
1115 void set_data(uint8_t *vram_addr, const uint8_t *data, uint16_t len) OLDCALL;
1116 
1117 
1136 void set_tiles(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t *vram_addr, const uint8_t *tiles) OLDCALL;
1137 
1143 inline void set_tile_data(uint16_t first_tile, uint8_t nb_tiles, const uint8_t *data) {
1144  if (first_tile < 256) {
1145  set_bkg_data(first_tile, nb_tiles, data);
1146  if(first_tile + nb_tiles > 256)
1147  set_sprite_data(first_tile - 256, nb_tiles, data);
1148  } else {
1149  set_sprite_data(first_tile - 256, nb_tiles, data);
1150  }
1151 }
1152 
1164 void set_bkg_native_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data);
1165 
1175 void set_sprite_native_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data);
1176 
1190 inline void set_native_tile_data(uint16_t first_tile, uint8_t nb_tiles, const uint8_t *data) {
1191  if (first_tile < 256) {
1192  set_bkg_native_data(first_tile, nb_tiles, data);
1193  if(first_tile + nb_tiles > 256)
1194  set_sprite_native_data(first_tile - 256, nb_tiles, data);
1195  } else {
1196  set_sprite_native_data(first_tile - 256, nb_tiles, data);
1197  }
1198 }
1199 
1206 
1214 void vmemset (void *s, uint8_t c, size_t n) OLDCALL;
1215 
1225 #define fill_rect fill_bkg_rect
1226 
1235 
1237 
1238 #endif /* _NES_H */
char c
Definition: string.h:20
#define OLDCALL
Definition: types.h:21
#define NONBANKED
Definition: types.h:40
uint16_t palette_color_t
Definition: cgb.h:85
uint8_t d
Definition: gb.h:397
uint8_t h
Definition: gb.h:397
__SHADOW_REG bkg_scroll_x
Definition: hardware.h:56
__SHADOW_REG bkg_scroll_y
Definition: hardware.h:57
void set_vram_byte(uint8_t *addr, uint8_t v) OLDCALL
void set_bkg_submap_attributes_nes16x16(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *map, uint8_t map_w) OLDCALL
void set_sprite_tile(uint8_t nb, uint8_t tile)
Definition: nes.h:1006
volatile uint8_t _current_bank
Definition: gb.h:493
void set_bkg_palette(uint8_t first_palette, uint8_t nb_palettes, const palette_color_t *rgb_data) OLDCALL
void set_bkg_attributes_nes16x16(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *attributes) OLDCALL
void waitpadup(void)
void set_1bpp_colors_ex(uint8_t fgcolor, uint8_t bgcolor, uint8_t mode) OLDCALL
void scroll_bkg(int8_t x, int8_t y)
Definition: nes.h:907
void wait_vbl_done(void)
void enable_interrupts(void)
Definition: nes.h:429
uint16_t _current_1bpp_colors
void set_tile_data(uint16_t first_tile, uint8_t nb_tiles, const uint8_t *data)
Definition: nes.h:1143
uint8_t joypad(void) OLDCALL
void delay(uint16_t d) OLDCALL
void disable_interrupts(void)
Definition: nes.h:445
void vmemset(void *s, uint8_t c, size_t n) OLDCALL
void set_bkg_submap_attributes(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *attributes, uint8_t map_w)
Definition: nes.h:727
void set_bkg_tiles(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *tiles) OLDCALL
volatile struct OAM_item_t shadow_OAM[]
void flush_shadow_attributes(void) OLDCALL
void set_data(uint8_t *vram_addr, const uint8_t *data, uint16_t len) OLDCALL
void mode(uint8_t m) OLDCALL
void vsync(void)
void set_tiles(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t *vram_addr, const uint8_t *tiles) OLDCALL
void move_bkg(uint8_t x, uint8_t y)
Definition: nes.h:893
uint8_t _shadow_OAM_base
Definition: gb.h:1753
void remove_LCD(int_handler h)
void set_native_tile_data(uint16_t first_tile, uint8_t nb_tiles, const uint8_t *data)
Definition: nes.h:1190
uint8_t get_sprite_prop(uint8_t nb)
Definition: nes.h:1062
void scroll_sprite(uint8_t nb, int8_t x, int8_t y)
Definition: nes.h:1092
uint8_t get_mode(void) OLDCALL
void set_sprite_palette(uint8_t first_palette, uint8_t nb_palettes, const palette_color_t *rgb_data) OLDCALL
volatile uint16_t sys_time
void set_bkg_attribute_xy(uint8_t x, uint8_t y, uint8_t a)
Definition: nes.h:865
void SET_SHADOW_OAM_ADDRESS(void *address)
Definition: nes.h:989
void set_bkg_based_tiles(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *tiles, uint8_t base_tile)
Definition: nes.h:753
void set_bkg_attributes(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *attributes)
Definition: nes.h:664
void add_VBL(int_handler h)
void fill_bkg_rect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t tile) OLDCALL
uint8_t * set_bkg_tile_xy(uint8_t x, uint8_t y, uint8_t t) OLDCALL
struct OAM_item_t OAM_item_t
void(* int_handler)(void) NONBANKED
Definition: nes.h:164
void set_sprite_prop(uint8_t nb, uint8_t prop)
Definition: nes.h:1052
void set_sprite_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data) OLDCALL
uint8_t palette_color_t
Definition: nes.h:55
void set_2bpp_palette(uint16_t palette)
Definition: nes.h:560
uint8_t _map_tile_offset
void joypad_ex(joypads_t *joypads) OLDCALL
void set_sprite_native_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data)
Definition: gb.h:2088
void display_on(void)
void set_sprite_palette_entry(uint8_t palette, uint8_t entry, palette_color_t rgb_data) OLDCALL
void move_sprite(uint8_t nb, uint8_t x, uint8_t y)
Definition: nes.h:1076
uint8_t _submap_tile_offset
uint8_t joypad_init(uint8_t npads, joypads_t *joypads) OLDCALL
uint8_t * get_bkg_xy_addr(uint8_t x, uint8_t y) OLDCALL
void set_bkg_based_submap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *map, uint8_t map_w, uint8_t base_tile)
Definition: nes.h:813
void set_sprite_1bpp_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data) OLDCALL
void refresh_OAM(void)
void remove_VBL(int_handler h)
void set_bkg_attribute_xy_nes16x16(uint8_t x, uint8_t y, uint8_t a)
void set_bkg_native_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data)
Definition: gb.h:2071
uint8_t get_bkg_tile_xy(uint8_t x, uint8_t y) OLDCALL
void set_bkg_1bpp_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data) OLDCALL
void hide_sprite(uint8_t nb)
Definition: nes.h:1102
void init_bkg(uint8_t c) OLDCALL
void set_bkg_submap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *map, uint8_t map_w) OLDCALL
Definition: msx.h:562
void set_1bpp_colors(uint8_t fgcolor, uint8_t bgcolor)
Definition: nes.h:566
void get_bkg_tiles(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t *tiles) OLDCALL
uint8_t _switch_prg0(uint8_t bank) OLDCALL
void set_bkg_palette_entry(uint8_t palette, uint8_t entry, palette_color_t rgb_data) OLDCALL
void add_LCD(int_handler h)
uint8_t waitpad(uint8_t mask) OLDCALL
uint8_t get_sprite_tile(uint8_t nb)
Definition: nes.h:1017
void set_bkg_data(uint8_t first_tile, uint8_t nb_tiles, const uint8_t *data) OLDCALL
void display_off(void)
Definition: msx.h:233
unsigned char uint8_t
Definition: stdint.h:51
unsigned short int uint16_t
Definition: stdint.h:52
signed char int8_t
Definition: stdint.h:43
Definition: gb.h:1740
uint8_t x
Definition: gb.h:1741
uint8_t prop
Definition: gb.h:1743
uint8_t tile
Definition: gb.h:1742
uint8_t y
Definition: gb.h:1741
Definition: gb.h:698