for (i = 0; i < 16; i++)
spr_palette_tbl_set(i, plt[i + 16]);
- for (i = 0; i < 64; i++)
- name_tbl_set(0, i, i % 4);
+ for (i = 0; i < 960; i++)
+ name_tbl_set(0, i, 0);
for (i = 0; i < 64; i++)
attr_tbl_set(0, i, 0);
+ name_tbl_set(0, 205, 2);
+ name_tbl_set(0, 300, 1);
+ name_tbl_set(0, 400, 3);
+ //205 = palette gp2 01100101b
+ //205 = 11
+ attr_tbl_set(0, 0, 0x65);
+ attr_tbl_set(0, 11, 0x65);
+
for (i = 0; i < 960; i++)
set_bgtile(i);
+
vga_xfer();
//void dump_vram(int type, int bank, unsigned short addr, int size);
/*
- dump_vram(0, 0, 0, 0x100);
- dump_vram(1, 0, 0, 100);
- dump_vram(2, 0, 0, 64);
- dump_vram(3, 0, 0, 16);
+ dump_vram(VRAM_DUMP_TYPE_PTN, 0, 0, 0x100);
+ dump_vram(VRAM_DUMP_TYPE_NAME, 0, 0, 300);
+ dump_vram(VRAM_DUMP_TYPE_ATTR, 0, 0, 64);
+ dump_vram(VRAM_DUMP_TYPE_PLT, 0, 0, 16);
*/
}
#include <string.h>
#include "tools.h"
-#include "vga.h"
+#include "vram.h"
-#define PALETTE_SIZE 32
-static struct rgb15 NES_PALETTE_SPR[PALETTE_SIZE];
-static struct rgb15 NES_PALETTE_BG[PALETTE_SIZE];
-
-#define colto5bit(col8) col8 * 0x1F / 0xFF
+#define PALETTE_SIZE 64
+static struct rgb15 NES_PALETTE_RGB15[PALETTE_SIZE];
//copied from
//http://hlc6502.web.fc2.com/NesPal2.htm
//
-static unsigned int RGB24_SPR[PALETTE_SIZE] = {
+static unsigned int NES_PALETTE_RGB24[PALETTE_SIZE] = {
0x787878, 0x2000B0, 0x2800B8, 0x6010A0, 0x982078, 0xB01030, 0xA03000, 0x784000,
0x485800, 0x386800, 0x386C00, 0x306040, 0x305080, 0x000000, 0x000000, 0x000000,
0xB0B0B0, 0x4060F8, 0x4040FF, 0x9040F0, 0xD840C0, 0xD84060, 0xE05000, 0xC07000,
- 0x888800, 0x50A000, 0x48A810, 0x48A068, 0x4090C0, 0x000000, 0x000000, 0x000000
-};
+ 0x888800, 0x50A000, 0x48A810, 0x48A068, 0x4090C0, 0x000000, 0x000000, 0x000000,
-static unsigned int RGB24_BG[PALETTE_SIZE] = {
0xFFFFFF, 0x60A0FF, 0x5080FF, 0xA070FF, 0xF060FF, 0xFF60B0, 0xFF7830, 0xFFA000,
0xE8D020, 0x98E800, 0x70F040, 0x70E090, 0x60D0E0, 0x787878, 0x000000, 0x000000,
0xFFFFFF, 0x90D0FF, 0xA0B8FF, 0xC0B0FF, 0xE0B0FF, 0xFFB8E8, 0xFFC8B8, 0xFFD8A0,
};
static void from_rgb24(unsigned int rgb24, struct rgb15* rgb) {
- rgb->r = colto5bit(rgb24 & 0xFF);
+ //dprint("from_rgb24: %02x >> %02x\n", rgb24 >> 16, colto5bit(rgb24 >> 16));
+ rgb->r = colto5bit((rgb24 >> 16));
rgb->g = colto5bit((rgb24 >> 8) & 0xFF);
- rgb->b = colto5bit((rgb24 >> 16) & 0xFF);
+ rgb->b = colto5bit(rgb24 & 0xFF);
}
/*
* bank: 0 >> bg palette
* bank: 1 >> sprite palette
* */
-void palette_index_to_rgb15(int bank, unsigned char index, struct rgb15* rgb) {
+void palette_index_to_rgb15(unsigned char index, struct rgb15* rgb) {
index = index & (PALETTE_SIZE - 1);
- if (bank == 0) {
- rgb->r = NES_PALETTE_BG[index].r;
- rgb->g = NES_PALETTE_BG[index].g;
- rgb->b = NES_PALETTE_BG[index].b;
- }
- else {
- rgb->r = NES_PALETTE_SPR[index].r;
- rgb->g = NES_PALETTE_SPR[index].g;
- rgb->b = NES_PALETTE_SPR[index].b;
- }
+ rgb->r = NES_PALETTE_RGB15[index].r;
+ rgb->g = NES_PALETTE_RGB15[index].g;
+ rgb->b = NES_PALETTE_RGB15[index].b;
}
int palette_init(void) {
int i;
for (i = 0; i < PALETTE_SIZE; i++) {
- from_rgb24(RGB24_BG[i], &NES_PALETTE_BG[i]);
- }
- for (i = 0; i < PALETTE_SIZE; i++) {
- from_rgb24(RGB24_SPR[i], &NES_PALETTE_SPR[i]);
+ from_rgb24(NES_PALETTE_RGB24[i], &NES_PALETTE_RGB15[i]);
}
return TRUE;
#include "ppucore.h"
#include "vram.h"
-void palette_index_to_rgb15(int bank, unsigned char index, struct rgb15* rgb);
+void palette_index_to_rgb15(unsigned char index, struct rgb15* rgb);
void dump_mem(const char* msg, unsigned short base,
unsigned short offset, unsigned char* buf, int size);
#define SPRITE_RAM_SIZE 0xff
#define PATTERN_ADDR_MASK (PATTERN_TBL_SIZE - 1)
-#define NAME_TBL_ADDR_MASK (NAME_TBL_SIZE - 1)
#define ATTR_TBL_ADDR_MASK (ATTR_TBL_SIZE - 1)
#define PALETTE_TBL_ADDR_MASK (PALETTE_TBL_SIZE - 1)
#define SPR_RAM_ADDR_MASK (SPRITE_RAM_SIZE - 1)
}
unsigned char name_tbl_get(unsigned char bank, unsigned short addr) {
- addr = addr & NAME_TBL_ADDR_MASK;
if (bank == 0)
return name_tbl0[addr];
else if (bank == 1)
}
void name_tbl_set(unsigned char bank, unsigned short addr, unsigned char data) {
- addr = addr & NAME_TBL_ADDR_MASK;
if (bank == 0)
name_tbl0[addr] = data;
else if (bank == 1)
/* VRAM manipulation... */
+static int attr_index_to_gp(int tile_index) {
+ int tile_x, tile_y, gp_x, gp_y;
+
+ tile_x = tile_index % H_SCREEN_TILE_SIZE;
+ tile_y = tile_index / H_SCREEN_TILE_SIZE;
+
+ gp_x = tile_x / ATTR_GROUP_UNIT;
+ gp_y = tile_y / ATTR_GROUP_UNIT;
+ //dprint("tile_x:%d, y:%d, gp_x:%d, y:%d\n", tile_x, tile_y, gp_x, gp_y);
+
+ return gp_x + gp_y * 8;
+}
+
void load_attribute(unsigned char bank, int tile_index, struct palette *plt) {
int gp_index;
- int unit_index;
unsigned char data;
struct palette_unit pu;
int palette_group;
unsigned short palette_addr;
unsigned char pi;
+ int tile_x, tile_y;
+ int in_x, in_y;
- gp_index = tile_index / ATTR_GROUP_UNIT / ATTR_UNIT_PER_BYTE;
- unit_index = tile_index / ATTR_GROUP_UNIT;
+ gp_index = attr_index_to_gp(tile_index);
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:
+ tile_x = tile_index % H_SCREEN_TILE_SIZE;
+ tile_y = tile_index / H_SCREEN_TILE_SIZE;
+ in_x = tile_x % (ATTR_GROUP_UNIT);
+ in_y = tile_y % (ATTR_GROUP_UNIT);
+ if (in_y < 2) {
+ if (in_x < 2) {
palette_group = pu.bit01;
- break;
- case 1:
+ }
+ else {
palette_group = pu.bit23;
- break;
- case 2:
+ }
+ }
+ else {
+ if (in_x < 2) {
palette_group = pu.bit45;
- break;
- default:
+ }
+ else {
palette_group = pu.bit67;
- break;
+ }
}
+ /*
+ dprint("tile_index: %d, gp_index: %d\n", tile_index, gp_index);
+ dprint("in_x: %d, in_y: %d\n", in_x, in_y);
+ dprint("pu bit01:%d, bit23:%d, bit45:%d, bit67:%d\n", pu.bit01, pu.bit23, pu.bit45, pu.bit67);
+ dprint("palette_gp: %d\n", palette_group);
+ */
/*load bg rgb palette color*/
palette_addr = palette_group * 4;
pi = bg_palette_tbl_get(palette_addr++);
- palette_index_to_rgb15(0, pi, &plt->col[0]);
+ palette_index_to_rgb15(pi, &plt->col[0]);
+ /*
+ dprint("palette 0: index:%02d, %02x %02x %02x\n", pi,
+ colto8bit(plt->col[0].r), colto8bit(plt->col[0].g), colto8bit(plt->col[0].b));
+ */
+
pi = bg_palette_tbl_get(palette_addr++);
- palette_index_to_rgb15(0, pi, &plt->col[1]);
+ palette_index_to_rgb15(pi, &plt->col[1]);
+ /*
+ dprint("palette 1: index:%02d, %02x %02x %02x\n", pi,
+ colto8bit(plt->col[1].r), colto8bit(plt->col[1].g), colto8bit(plt->col[1].b));
+ */
+
pi = bg_palette_tbl_get(palette_addr++);
- palette_index_to_rgb15(0, pi, &plt->col[2]);
+ palette_index_to_rgb15(pi, &plt->col[2]);
+ /*
+ dprint("palette 2: index:%02d, %02x %02x %02x\n", pi,
+ colto8bit(plt->col[2].r), colto8bit(plt->col[2].g), colto8bit(plt->col[2].b));
+ */
+
pi = bg_palette_tbl_get(palette_addr);
- palette_index_to_rgb15(0, pi, &plt->col[3]);
+ palette_index_to_rgb15(pi, &plt->col[3]);
+ /*
+ dprint("palette 3: index:%02d, %02x %02x %02x\n", pi,
+ colto8bit(plt->col[3].r), colto8bit(plt->col[3].g), colto8bit(plt->col[3].b));
+ */
}
data = pattern_tbl_get(bank, addr);
*p = data;
p++;
+ addr++;
}
}
unsigned char *mem;
switch(type) {
- case 0:
+ case VRAM_DUMP_TYPE_PTN:
sprintf(buf, "pattern table %d:\n", bank);
base = (bank == 0 ? 0 : 0x1000);
mem = (bank == 0 ? pattern_tbl0 : pattern_tbl1);
break;
- case 1:
+ case VRAM_DUMP_TYPE_NAME:
sprintf(buf, "name table %d:\n", bank);
base = 0x2000 + bank * 0x400;
switch (bank) {
}
break;
- case 2:
+ case VRAM_DUMP_TYPE_ATTR:
sprintf(buf, "attribute table %d:\n", bank);
base = 0x23c0 + bank * 0x400;
switch (bank) {
}
break;
- case 3:
+ case VRAM_DUMP_TYPE_PLT:
switch (bank) {
case 0:
base = 0x3f00;
}
break;
- case 4:
+ case VRAM_DUMP_TYPE_SPR:
default:
sprintf(buf, "sprite ram:\n");
base = 0;
void clean_vram(void);
struct tile_1_line{
- unsigned int dot7 :1;
- unsigned int dot6 :1;
- unsigned int dot5 :1;
- unsigned int dot4 :1;
- unsigned int dot3 :1;
- unsigned int dot2 :1;
- unsigned int dot1 :1;
unsigned int dot0 :1;
+ unsigned int dot1 :1;
+ unsigned int dot2 :1;
+ unsigned int dot3 :1;
+ unsigned int dot4 :1;
+ unsigned int dot5 :1;
+ unsigned int dot6 :1;
+ unsigned int dot7 :1;
} __attribute__ ((packed));
struct tile_1 {
};
struct palette_unit {
- unsigned int bit67 :2;
- unsigned int bit45 :2;
- unsigned int bit23 :2;
unsigned int bit01 :2;
+ unsigned int bit23 :2;
+ unsigned int bit45 :2;
+ unsigned int bit67 :2;
} __attribute__ ((packed));
+#define VRAM_DUMP_TYPE_PTN 0
+#define VRAM_DUMP_TYPE_NAME 1
+#define VRAM_DUMP_TYPE_ATTR 2
+#define VRAM_DUMP_TYPE_PLT 3
+#define VRAM_DUMP_TYPE_SPR 4
+
+
+#define colto5bit(col8) ((col8) * 0x1F / 0xFF)
+#define colto8bit(col5) (((unsigned int)(col5)) * 0xFF / 0x1F)
+
+
#endif /*__vram_h__*/
tile_id_x = x / TILE_DOT_SIZE;
tile_id_y = y / TILE_DOT_SIZE;
- tile_id = tile_id_x + tile_id_y * V_SCREEN_TILE_SIZE;
+ tile_id = tile_id_x + tile_id_y * H_SCREEN_TILE_SIZE;
tile = vscreen + tile_id;
inner_x = x % TILE_DOT_SIZE;