#BIN=ppucore
BIN=dummy-driver2
-OBJS=dummy-driver2.o ppucore.o vram.o cartridge.o vscreen.o palette.o \
- vga_xfer.o
+DUMMY_OBJS=dummy-driver2.o debug.o cartridge.o
+
+OBJS=ppucore.o vram.o vscreen.o palette.o \
+ vga_xfer.o $(DUMMY_OBJS)
LIBS=-L../../libs -lmotones -pthread
int load_cartridge(const char* cartridge);
void set_vga_base(unsigned char* base);
void vga_xfer(void);
+void dump_vram(int type, int bank, unsigned short addr, int size);
+void set_bgtile(int tile_id);
struct timespec sleep_inteval = {0, 1000000 / VGA_REFRESH_RATE};
-/*dummy function*/
+/*
+ * dummy function
+ * for cartridge.c
+ * */
int load_prg_rom(FILE* cartridge, int num_rom_bank) {
#define ROM_32K 0x8000
int len;
return TRUE;
}
+/*
+ * for debug.c
+ * */
+int debug_mode = TRUE;
+int critical_error = FALSE;
+void dump_6502(int full) {
+}
+
static void test_ppu(void) {
int i;
unsigned char plt[32] = {
- 0x0f, 0x00, 0x10, 0x20,
- 0x0f, 0x06, 0x16, 0x26,
- 0x0f, 0x08, 0x18, 0x28,
- 0x0f, 0x0a, 0x1a, 0x2a
+ 0, 1, 2, 3, 0, 5, 6, 7,
+ 0, 9, 10, 11, 0, 13, 14, 15,
+ 0, 30, 31, 32, 0, 40, 41, 42,
+ 0, 20, 21, 22, 0, 11, 12, 13
};
for (i = 0; i < 16; i++)
- img_palette_tbl_set(i, plt[i]);
+ bg_palette_tbl_set(i, plt[i]);
for (i = 0; i < 16; i++)
spr_palette_tbl_set(i, plt[i + 16]);
- attr_tbl_set(0, 100, 0);
- name_tbl_set(0, 100, 'm');
+
+ for (i = 0; i < 64; i++)
+ name_tbl_set(0, i, i % 4);
+
+ for (i = 0; i < 64; i++)
+ attr_tbl_set(0, i, 0);
+
+ 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);
+*/
}
int main(int argc, char** argv) {
static struct rgb15 NES_PALETTE_SPR[PALETTE_SIZE];
static struct rgb15 NES_PALETTE_BG[PALETTE_SIZE];
+#define colto5bit(col8) col8 * 0x1F / 0xFF
+
+//copied from
+//http://hlc6502.web.fc2.com/NesPal2.htm
+//
static unsigned int RGB24_SPR[PALETTE_SIZE] = {
0x787878, 0x2000B0, 0x2800B8, 0x6010A0, 0x982078, 0xB01030, 0xA03000, 0x784000,
0x485800, 0x386800, 0x386C00, 0x306040, 0x305080, 0x000000, 0x000000, 0x000000,
};
static void from_rgb24(unsigned int rgb24, struct rgb15* rgb) {
- rgb->r = rgb24 && 0xFF;
- rgb->g = (rgb24 >> 8) && 0xFF;
- rgb->b = (rgb24 >> 16) && 0xFF;
+ rgb->r = colto5bit(rgb24 & 0xFF);
+ rgb->g = colto5bit((rgb24 >> 8) & 0xFF);
+ rgb->b = colto5bit((rgb24 >> 16) & 0xFF);
}
/*
else {
*col = *col_old;
}
+ /*
+ col->r = to5bit(0xffff);
+ col->g = 0;
+ col->b = 0;
+ */
vscrn_x_old = vscrn_x;
col_old = col;
#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);
}
unsigned char attr_tbl_get(unsigned char bank, unsigned short addr);
void attr_tbl_set(unsigned char bank, unsigned short addr, unsigned char data);
-unsigned char spr_plt_tbl_get(unsigned short addr);
-void spr_plt_tbl_set(unsigned short addr, unsigned char data);
-
-
unsigned char spr_palette_tbl_get(unsigned short addr);
void spr_palette_tbl_set(unsigned short addr, unsigned char data);
-unsigned char img_palette_tbl_get(unsigned short addr);
-void img_palette_tbl_set(unsigned short addr, unsigned char data);
+unsigned char bg_palette_tbl_get(unsigned short addr);
+void bg_palette_tbl_set(unsigned short addr, unsigned char data);
+
+unsigned char spr_ram_tbl_get(unsigned short addr);
+void spr_ram_tbl_set(unsigned short addr, unsigned char data);
int vram_init(void);
void clean_vram(void);
struct tile_1_line{
- 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;
+ 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;
} __attribute__ ((packed));
struct tile_1 {
};
struct tile_2 {
- struct tile_1 b0;
struct tile_1 b1;
+ struct tile_1 b0;
};
struct palette {
};
struct palette_unit {
- unsigned int bit01 :2;
- unsigned int bit23 :2;
- unsigned int bit45 :2;
unsigned int bit67 :2;
+ unsigned int bit45 :2;
+ unsigned int bit23 :2;
+ unsigned int bit01 :2;
} __attribute__ ((packed));
#endif /*__vram_h__*/
return FALSE;
memset(vscreen, 0, sizeof (struct tile_rgb15) * VIRT_SCREEN_TILE_SIZE * VIRT_SCREEN_TILE_SIZE);
- dprint("tile_1_line:%d tile_2 size:%d\n", sizeof(struct tile_1_line), sizeof(struct tile_2));
+ //dprint("tile_1_line:%d tile_2 size:%d\n", sizeof(struct tile_1_line), sizeof(struct tile_2));
return TRUE;
}