#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "tools.h"
#include "ppucore.h"
#include "vram.h"
void palette_index_to_rgb15(int bank, unsigned char index, struct rgb15* rgb);
+void dump_mem(const char* msg, unsigned short base,
+ unsigned short offset, unsigned char* buf, int size);
#define PATTERN_TBL_SIZE 0x1000
#define NAME_TBL_SIZE V_SCREEN_TILE_SIZE * H_SCREEN_TILE_SIZE
/*vram definition*/
static unsigned char * sprite_ram;
-static unsigned char * img_palette_tbl;
+static unsigned char * bg_palette_tbl;
static unsigned char * spr_palette_tbl;
static unsigned char * name_tbl0;
spr_palette_tbl[addr] = data;
}
-unsigned char img_palette_tbl_get(unsigned short addr) {
+unsigned char bg_palette_tbl_get(unsigned short addr) {
addr = addr & PALETTE_TBL_ADDR_MASK;
- return img_palette_tbl[addr];
+ return bg_palette_tbl[addr];
}
-void img_palette_tbl_set(unsigned short addr, unsigned char data) {
+void bg_palette_tbl_set(unsigned short addr, unsigned char data) {
addr = addr & PALETTE_TBL_ADDR_MASK;
- img_palette_tbl[addr] = data;
+ bg_palette_tbl[addr] = data;
}
unit_index = tile_index / ATTR_GROUP_UNIT;
data = attr_tbl_get(bank, gp_index);
pu = *(struct palette_unit*)&data;
+ memcpy(&pu, &data, sizeof(pu));
+ //dprint("attr data:%1x, pu size:%d\n", data, sizeof(pu));
switch(unit_index) {
case 0:
/*load bg rgb palette color*/
palette_addr = palette_group * 4;
- pi = img_palette_tbl_get(palette_addr++);
+ pi = bg_palette_tbl_get(palette_addr++);
palette_index_to_rgb15(0, pi, &plt->col[0]);
- pi = img_palette_tbl_get(palette_addr++);
+ pi = bg_palette_tbl_get(palette_addr++);
palette_index_to_rgb15(0, pi, &plt->col[1]);
- pi = img_palette_tbl_get(palette_addr++);
+ pi = bg_palette_tbl_get(palette_addr++);
palette_index_to_rgb15(0, pi, &plt->col[2]);
- pi = img_palette_tbl_get(palette_addr);
+ pi = bg_palette_tbl_get(palette_addr);
palette_index_to_rgb15(0, pi, &plt->col[3]);
}
}
}
+/*
+ * type
+ * 0: pattern table
+ * 1: name table
+ * 2: attribute table
+ * 3: palette table (bank=0: bg, bank=1: sprite)
+ * 4: sprite ram
+ * */
+void dump_vram(int type, int bank, unsigned short addr, int size) {
+ char buf[100];
+ unsigned short base;
+ unsigned char *mem;
+
+ switch(type) {
+ case 0:
+ sprintf(buf, "pattern table %d:\n", bank);
+ base = (bank == 0 ? 0 : 0x1000);
+ mem = (bank == 0 ? pattern_tbl0 : pattern_tbl1);
+ break;
+
+ case 1:
+ sprintf(buf, "name table %d:\n", bank);
+ base = 0x2000 + bank * 0x400;
+ switch (bank) {
+ case 0:
+ mem = name_tbl0;
+ break;
+ case 1:
+ mem = name_tbl1;
+ break;
+ case 2:
+ mem = name_tbl2;
+ break;
+ case 3:
+ default:
+ mem = name_tbl3;
+ break;
+ }
+ break;
+
+ case 2:
+ sprintf(buf, "attribute table %d:\n", bank);
+ base = 0x23c0 + bank * 0x400;
+ switch (bank) {
+ case 0:
+ mem = attr_tbl0;
+ break;
+ case 1:
+ mem = attr_tbl1;
+ break;
+ case 2:
+ mem = attr_tbl2;
+ break;
+ case 3:
+ default:
+ mem = attr_tbl3;
+ break;
+ }
+ break;
+
+ case 3:
+ switch (bank) {
+ case 0:
+ base = 0x3f00;
+ sprintf(buf, "bg palette table %d:\n", bank);
+ mem = bg_palette_tbl;
+ break;
+ case 1:
+ default:
+ base = 0x3f10;
+ sprintf(buf, "sprite palette table %d:\n", bank);
+ mem = spr_palette_tbl;
+ break;
+ }
+ break;
+
+ case 4:
+ default:
+ sprintf(buf, "sprite ram:\n");
+ base = 0;
+ mem = sprite_ram;
+ break;
+
+ }
+ dump_mem(buf, base, addr, mem, size);
+}
+
int load_chr_rom(FILE* cartridge, int num_rom_bank) {
int len;
if (attr_tbl1 == NULL)
return FALSE;
- img_palette_tbl = malloc(PALETTE_TBL_SIZE);
- if (img_palette_tbl == NULL)
+ bg_palette_tbl = malloc(PALETTE_TBL_SIZE);
+ if (bg_palette_tbl == NULL)
return FALSE;
spr_palette_tbl = malloc(PALETTE_TBL_SIZE);
free(attr_tbl0);
free(attr_tbl1);
- free(img_palette_tbl);
+ free(bg_palette_tbl);
free(spr_palette_tbl);
}