9 void palette_index_to_rgb15(int bank, unsigned char index, struct rgb15* rgb);
11 #define PATTERN_TBL_SIZE 0x1000
12 #define NAME_TBL_SIZE V_SCREEN_TILE_SIZE * H_SCREEN_TILE_SIZE
13 #define ATTR_TBL_SIZE (VIRT_SCREEN_TILE_SIZE * VIRT_SCREEN_TILE_SIZE \
14 / ATTR_GROUP_UNIT / ATTR_UNIT_PER_BYTE)
15 #define PALETTE_TBL_SIZE 16
16 #define SPRITE_RAM_SIZE 0xff
18 #define PATTERN_ADDR_MASK (PATTERN_TBL_SIZE - 1)
19 #define NAME_TBL_ADDR_MASK (NAME_TBL_SIZE - 1)
20 #define ATTR_TBL_ADDR_MASK (ATTR_TBL_SIZE - 1)
21 #define PALETTE_TBL_ADDR_MASK (PALETTE_TBL_SIZE - 1)
22 #define SPR_RAM_ADDR_MASK (SPRITE_RAM_SIZE - 1)
25 static unsigned char * sprite_ram;
27 static unsigned char * img_palette_tbl;
28 static unsigned char * spr_palette_tbl;
30 static unsigned char * name_tbl0;
31 static unsigned char * name_tbl1;
32 static unsigned char * name_tbl2;
33 static unsigned char * name_tbl3;
35 static unsigned char * attr_tbl0;
36 static unsigned char * attr_tbl1;
37 static unsigned char * attr_tbl2;
38 static unsigned char * attr_tbl3;
40 static unsigned char * pattern_tbl0;
41 static unsigned char * pattern_tbl1;
44 * VRAM get/set functions....
48 unsigned char pattern_tbl_get(unsigned char bank, unsigned short addr) {
49 addr = addr & PATTERN_ADDR_MASK;
51 return pattern_tbl0[addr];
53 return pattern_tbl1[addr];
56 unsigned char name_tbl_get(unsigned char bank, unsigned short addr) {
57 addr = addr & NAME_TBL_ADDR_MASK;
59 return name_tbl0[addr];
61 return name_tbl1[addr];
63 return name_tbl2[addr];
65 return name_tbl3[addr];
68 void name_tbl_set(unsigned char bank, unsigned short addr, unsigned char data) {
69 addr = addr & NAME_TBL_ADDR_MASK;
71 name_tbl0[addr] = data;
73 name_tbl1[addr] = data;
75 name_tbl2[addr] = data;
77 name_tbl3[addr] = data;
81 unsigned char attr_tbl_get(unsigned char bank, unsigned short addr) {
82 addr = addr & ATTR_TBL_ADDR_MASK;
84 return attr_tbl0[addr];
86 return attr_tbl1[addr];
88 return attr_tbl2[addr];
90 return attr_tbl3[addr];
93 void attr_tbl_set(unsigned char bank, unsigned short addr, unsigned char data) {
94 addr = addr & ATTR_TBL_ADDR_MASK;
96 attr_tbl0[addr] = data;
98 attr_tbl1[addr] = data;
100 attr_tbl2[addr] = data;
102 attr_tbl3[addr] = data;
106 unsigned char spr_palette_tbl_get(unsigned short addr) {
107 addr = addr & PALETTE_TBL_ADDR_MASK;
108 return spr_palette_tbl[addr];
111 void spr_palette_tbl_set(unsigned short addr, unsigned char data) {
112 addr = addr & PALETTE_TBL_ADDR_MASK;
113 spr_palette_tbl[addr] = data;
116 unsigned char img_palette_tbl_get(unsigned short addr) {
117 addr = addr & PALETTE_TBL_ADDR_MASK;
118 return img_palette_tbl[addr];
121 void img_palette_tbl_set(unsigned short addr, unsigned char data) {
122 addr = addr & PALETTE_TBL_ADDR_MASK;
123 img_palette_tbl[addr] = data;
127 unsigned char spr_ram_tbl_get(unsigned short addr) {
128 addr = addr & SPR_RAM_ADDR_MASK;
129 return sprite_ram[addr];
132 void spr_ram_tbl_set(unsigned short addr, unsigned char data) {
133 addr = addr & SPR_RAM_ADDR_MASK;
134 sprite_ram[addr] = data;
137 /* VRAM manipulation... */
139 void load_attribute(unsigned char bank, int tile_index, struct palette *plt) {
143 struct palette_unit pu;
145 unsigned short palette_addr;
148 gp_index = tile_index / ATTR_GROUP_UNIT / ATTR_UNIT_PER_BYTE;
149 unit_index = tile_index / ATTR_GROUP_UNIT;
150 data = attr_tbl_get(bank, gp_index);
151 pu = *(struct palette_unit*)&data;
155 palette_group = pu.bit01;
158 palette_group = pu.bit23;
161 palette_group = pu.bit45;
164 palette_group = pu.bit67;
168 /*load bg rgb palette color*/
169 palette_addr = palette_group * 4;
170 pi = img_palette_tbl_get(palette_addr++);
171 palette_index_to_rgb15(0, pi, &plt->col[0]);
172 pi = img_palette_tbl_get(palette_addr++);
173 palette_index_to_rgb15(0, pi, &plt->col[1]);
174 pi = img_palette_tbl_get(palette_addr++);
175 palette_index_to_rgb15(0, pi, &plt->col[2]);
176 pi = img_palette_tbl_get(palette_addr);
177 palette_index_to_rgb15(0, pi, &plt->col[3]);
182 * pattern index: 0 - 255
184 void load_pattern(unsigned char bank, unsigned char ptn_index, struct tile_2* pattern) {
190 //load character pattern
191 p = (unsigned char*)pattern;
192 addr = ptn_index * sizeof(struct tile_2);
193 for (i = 0; i < sizeof(struct tile_2); i++) {
194 data = pattern_tbl_get(bank, addr);
201 int load_chr_rom(FILE* cartridge, int num_rom_bank) {
204 len = fread(pattern_tbl0, 1, PATTERN_TBL_SIZE, cartridge);
205 if (len != PATTERN_TBL_SIZE)
208 len = fread(pattern_tbl1, 1, PATTERN_TBL_SIZE, cartridge);
209 if (len != PATTERN_TBL_SIZE)
215 int vram_init(void) {
223 pattern_tbl0 = malloc(PATTERN_TBL_SIZE);
224 if (pattern_tbl0 == NULL)
227 pattern_tbl1 = malloc(PATTERN_TBL_SIZE);
228 if (pattern_tbl1 == NULL)
231 sprite_ram = malloc(SPRITE_RAM_SIZE);
232 if (sprite_ram == NULL)
235 name_tbl0 = malloc(NAME_TBL_SIZE);
236 if (name_tbl0 == NULL)
239 name_tbl1 = malloc(NAME_TBL_SIZE);
240 if (name_tbl1 == NULL)
243 attr_tbl0 = malloc(ATTR_TBL_SIZE);
244 if (attr_tbl0 == NULL)
247 attr_tbl1 = malloc(ATTR_TBL_SIZE);
248 if (attr_tbl1 == NULL)
251 img_palette_tbl = malloc(PALETTE_TBL_SIZE);
252 if (img_palette_tbl == NULL)
255 spr_palette_tbl = malloc(PALETTE_TBL_SIZE);
256 if (spr_palette_tbl == NULL)
262 void clean_vram(void) {
275 free(img_palette_tbl);
276 free(spr_palette_tbl);