10 void palette_index_to_rgb15(int bank, unsigned char index, struct rgb15* rgb);
11 void dump_mem(const char* msg, unsigned short base,
12 unsigned short offset, unsigned char* buf, int size);
14 #define PATTERN_TBL_SIZE 0x1000
15 #define NAME_TBL_SIZE V_SCREEN_TILE_SIZE * H_SCREEN_TILE_SIZE
16 #define ATTR_TBL_SIZE (VIRT_SCREEN_TILE_SIZE * VIRT_SCREEN_TILE_SIZE \
17 / ATTR_GROUP_UNIT / ATTR_UNIT_PER_BYTE)
18 #define PALETTE_TBL_SIZE 16
19 #define SPRITE_RAM_SIZE 0xff
21 #define PATTERN_ADDR_MASK (PATTERN_TBL_SIZE - 1)
22 #define NAME_TBL_ADDR_MASK (NAME_TBL_SIZE - 1)
23 #define ATTR_TBL_ADDR_MASK (ATTR_TBL_SIZE - 1)
24 #define PALETTE_TBL_ADDR_MASK (PALETTE_TBL_SIZE - 1)
25 #define SPR_RAM_ADDR_MASK (SPRITE_RAM_SIZE - 1)
28 static unsigned char * sprite_ram;
30 static unsigned char * bg_palette_tbl;
31 static unsigned char * spr_palette_tbl;
33 static unsigned char * name_tbl0;
34 static unsigned char * name_tbl1;
35 static unsigned char * name_tbl2;
36 static unsigned char * name_tbl3;
38 static unsigned char * attr_tbl0;
39 static unsigned char * attr_tbl1;
40 static unsigned char * attr_tbl2;
41 static unsigned char * attr_tbl3;
43 static unsigned char * pattern_tbl0;
44 static unsigned char * pattern_tbl1;
47 * VRAM get/set functions....
51 unsigned char pattern_tbl_get(unsigned char bank, unsigned short addr) {
52 addr = addr & PATTERN_ADDR_MASK;
54 return pattern_tbl0[addr];
56 return pattern_tbl1[addr];
59 unsigned char name_tbl_get(unsigned char bank, unsigned short addr) {
60 addr = addr & NAME_TBL_ADDR_MASK;
62 return name_tbl0[addr];
64 return name_tbl1[addr];
66 return name_tbl2[addr];
68 return name_tbl3[addr];
71 void name_tbl_set(unsigned char bank, unsigned short addr, unsigned char data) {
72 addr = addr & NAME_TBL_ADDR_MASK;
74 name_tbl0[addr] = data;
76 name_tbl1[addr] = data;
78 name_tbl2[addr] = data;
80 name_tbl3[addr] = data;
84 unsigned char attr_tbl_get(unsigned char bank, unsigned short addr) {
85 addr = addr & ATTR_TBL_ADDR_MASK;
87 return attr_tbl0[addr];
89 return attr_tbl1[addr];
91 return attr_tbl2[addr];
93 return attr_tbl3[addr];
96 void attr_tbl_set(unsigned char bank, unsigned short addr, unsigned char data) {
97 addr = addr & ATTR_TBL_ADDR_MASK;
99 attr_tbl0[addr] = data;
101 attr_tbl1[addr] = data;
103 attr_tbl2[addr] = data;
105 attr_tbl3[addr] = data;
109 unsigned char spr_palette_tbl_get(unsigned short addr) {
110 addr = addr & PALETTE_TBL_ADDR_MASK;
111 return spr_palette_tbl[addr];
114 void spr_palette_tbl_set(unsigned short addr, unsigned char data) {
115 addr = addr & PALETTE_TBL_ADDR_MASK;
116 spr_palette_tbl[addr] = data;
119 unsigned char bg_palette_tbl_get(unsigned short addr) {
120 addr = addr & PALETTE_TBL_ADDR_MASK;
121 return bg_palette_tbl[addr];
124 void bg_palette_tbl_set(unsigned short addr, unsigned char data) {
125 addr = addr & PALETTE_TBL_ADDR_MASK;
126 bg_palette_tbl[addr] = data;
130 unsigned char spr_ram_tbl_get(unsigned short addr) {
131 addr = addr & SPR_RAM_ADDR_MASK;
132 return sprite_ram[addr];
135 void spr_ram_tbl_set(unsigned short addr, unsigned char data) {
136 addr = addr & SPR_RAM_ADDR_MASK;
137 sprite_ram[addr] = data;
140 /* VRAM manipulation... */
142 void load_attribute(unsigned char bank, int tile_index, struct palette *plt) {
146 struct palette_unit pu;
148 unsigned short palette_addr;
151 gp_index = tile_index / ATTR_GROUP_UNIT / ATTR_UNIT_PER_BYTE;
152 unit_index = tile_index / ATTR_GROUP_UNIT;
153 data = attr_tbl_get(bank, gp_index);
154 pu = *(struct palette_unit*)&data;
155 memcpy(&pu, &data, sizeof(pu));
156 //dprint("attr data:%1x, pu size:%d\n", data, sizeof(pu));
160 palette_group = pu.bit01;
163 palette_group = pu.bit23;
166 palette_group = pu.bit45;
169 palette_group = pu.bit67;
173 /*load bg rgb palette color*/
174 palette_addr = palette_group * 4;
175 pi = bg_palette_tbl_get(palette_addr++);
176 palette_index_to_rgb15(0, pi, &plt->col[0]);
177 pi = bg_palette_tbl_get(palette_addr++);
178 palette_index_to_rgb15(0, pi, &plt->col[1]);
179 pi = bg_palette_tbl_get(palette_addr++);
180 palette_index_to_rgb15(0, pi, &plt->col[2]);
181 pi = bg_palette_tbl_get(palette_addr);
182 palette_index_to_rgb15(0, pi, &plt->col[3]);
187 * pattern index: 0 - 255
189 void load_pattern(unsigned char bank, unsigned char ptn_index, struct tile_2* pattern) {
195 //load character pattern
196 p = (unsigned char*)pattern;
197 addr = ptn_index * sizeof(struct tile_2);
198 for (i = 0; i < sizeof(struct tile_2); i++) {
199 data = pattern_tbl_get(bank, addr);
210 * 3: palette table (bank=0: bg, bank=1: sprite)
213 void dump_vram(int type, int bank, unsigned short addr, int size) {
220 sprintf(buf, "pattern table %d:\n", bank);
221 base = (bank == 0 ? 0 : 0x1000);
222 mem = (bank == 0 ? pattern_tbl0 : pattern_tbl1);
226 sprintf(buf, "name table %d:\n", bank);
227 base = 0x2000 + bank * 0x400;
246 sprintf(buf, "attribute table %d:\n", bank);
247 base = 0x23c0 + bank * 0x400;
269 sprintf(buf, "bg palette table %d:\n", bank);
270 mem = bg_palette_tbl;
275 sprintf(buf, "sprite palette table %d:\n", bank);
276 mem = spr_palette_tbl;
283 sprintf(buf, "sprite ram:\n");
289 dump_mem(buf, base, addr, mem, size);
293 int load_chr_rom(FILE* cartridge, int num_rom_bank) {
296 len = fread(pattern_tbl0, 1, PATTERN_TBL_SIZE, cartridge);
297 if (len != PATTERN_TBL_SIZE)
300 len = fread(pattern_tbl1, 1, PATTERN_TBL_SIZE, cartridge);
301 if (len != PATTERN_TBL_SIZE)
307 int vram_init(void) {
315 pattern_tbl0 = malloc(PATTERN_TBL_SIZE);
316 if (pattern_tbl0 == NULL)
319 pattern_tbl1 = malloc(PATTERN_TBL_SIZE);
320 if (pattern_tbl1 == NULL)
323 sprite_ram = malloc(SPRITE_RAM_SIZE);
324 if (sprite_ram == NULL)
327 name_tbl0 = malloc(NAME_TBL_SIZE);
328 if (name_tbl0 == NULL)
331 name_tbl1 = malloc(NAME_TBL_SIZE);
332 if (name_tbl1 == NULL)
335 attr_tbl0 = malloc(ATTR_TBL_SIZE);
336 if (attr_tbl0 == NULL)
339 attr_tbl1 = malloc(ATTR_TBL_SIZE);
340 if (attr_tbl1 == NULL)
343 bg_palette_tbl = malloc(PALETTE_TBL_SIZE);
344 if (bg_palette_tbl == NULL)
347 spr_palette_tbl = malloc(PALETTE_TBL_SIZE);
348 if (spr_palette_tbl == NULL)
354 void clean_vram(void) {
367 free(bg_palette_tbl);
368 free(spr_palette_tbl);