void set_bgtile(int tile_id);
/*vram definition*/
-static unsigned char * sprite_ram;
static unsigned char * bg_palette_tbl;
static unsigned char * spr_palette_tbl;
static unsigned char * pattern_tbl0;
static unsigned char * pattern_tbl1;
+//#define PPU_TEST
+#ifdef PPU_TEST
+static int first_time = TRUE;
+#endif /* PPU_TEST */
+
+extern int debug_mode;
+static void (*vram_log_level4)(unsigned short, unsigned char);
+static void dump_vram_write (unsigned short addr, unsigned char data);
+void d4_set(int on_off);
+
/*
* VRAM get/set functions....
*
bg_palette_tbl[offset] = data;
}
-
-static unsigned char spr_ram_tbl_get(unsigned short offset) {
- return sprite_ram[offset];
-}
-
-static void spr_ram_tbl_set(unsigned short offset, unsigned char data) {
- sprite_ram[offset] = data;
-}
-
void vram_data_set(unsigned short addr, unsigned char data) {
+#ifdef PPU_TEST
+ if (!first_time)
+ return;
+#endif /* PPU_TEST */
- dprint("vram_data_set addr:%04x, data:%2x\n", addr, data);
+ vram_log_level4 (addr, data);
//mirror 0x4000 up addr.
addr &= PPU_ADDR_MASK;
if (addr < 2 * PATTERN_TBL_SIZE) {
+ //dprint("invalid vram write addr:%04x, data:%2x\n", addr, data);
//do nothing. pattern table is read only.
+ extern int critical_error;
+ dprint("invalid vram write!!!!\n");
+ critical_error = TRUE;
}
else if (addr >= PALETTE_START) {
// bg/sprite palette table.
/* VRAM manipulation... */
-//#define PPU_TEST
#ifdef PPU_TEST
/*
* ppu test function
0x0f, 0x0a, 0x1a, 0x2a,
};
+ //bg character base addr set to 0x1000.
+ ppu_ctrl1_set(0x00);
+
/*
+*/
//palette tbl
for (i = 0; i < 16; i++)
vram_data_set(0x3f00 + i, plt[i]);
for (i = 0; i < 16; i++)
vram_data_set(0x3f10 + i, plt[i + 16]);
-*/
+
//name tbl
for (i = 0; i < 960; i++)
- vram_data_set(0x2000 + i, 0);
+ vram_data_set(0x2000 + i, i %255);
/*
*/
//attr tbl
for (i = 0; i < 64; i++)
- vram_data_set(0x23c0 + i, 0);
+ vram_data_set(0x23c0 + i, i%16);
+ /*
vram_data_set(0x2000 + 205, 'D');
vram_data_set(0x2000 + 206, 'e');
vram_data_set(0x2000 + 207, 'e');
//other test.
vram_data_set(0x2000 + 300, 1);
vram_data_set(0x2000 + 0, 0x65);
- /*
- * */
+*/
+ /*
set_monocolor(FALSE);
+ * */
for (i = 0; i < 960; i++)
set_bgtile(i);
+ /*
//sprite test
struct sprite_attr sa;
sa.palette = 2;
set_sprite(50, 100, 'd', sa);
sa.flip_v = 1;
set_sprite(70, 105, 'd', sa);
+ * */
+
+ //bg&sprite show
+ ppu_ctrl2_set(0x18);
/*
vga_xfer();
dump_vram(VRAM_DUMP_TYPE_PLT, 0, 0, 16);
*/
}
-static int first_time = TRUE;
#endif /* PPU_TEST */
-int show_background(void) {
- int i;
-
-#ifdef PPU_TEST
- if (1 /*first_time*/) {
- test_ppu();
- first_time = FALSE;
- }
- return TRUE;
-#endif /*PPU_TEST */
-
- for (i = 0; i < H_SCREEN_TILE_SIZE * V_SCREEN_TILE_SIZE; i++) {
- set_bgtile(i);
- }
- return TRUE;
-}
-
static int attr_index_to_gp(int tile_index) {
int tile_x, tile_y, gp_x, gp_y;
if (pattern_tbl1 == NULL)
return FALSE;
- sprite_ram = malloc(SPRITE_RAM_SIZE);
- if (sprite_ram == NULL)
- return FALSE;
-
name_tbl0 = malloc(NAME_TBL_SIZE);
if (name_tbl0 == NULL)
return FALSE;
memset(pattern_tbl0, 0, PATTERN_TBL_SIZE);
memset(pattern_tbl1, 0, PATTERN_TBL_SIZE);
- memset(sprite_ram, 0, SPRITE_RAM_SIZE);
memset(name_tbl0, 0, NAME_TBL_SIZE);
memset(name_tbl1, 0, NAME_TBL_SIZE);
memset(attr_tbl0, 0, ATTR_TBL_SIZE);
memset(bg_palette_tbl, 0, PALETTE_TBL_SIZE);
memset(spr_palette_tbl, 0, PALETTE_TBL_SIZE);
+ d4_set(debug_mode);
+
return TRUE;
}
free(pattern_tbl0);
free(pattern_tbl1);
- free(sprite_ram);
-
free(name_tbl0);
free(name_tbl1);
}
+static void null_write (unsigned short addr, unsigned char data) {}
+static void dump_vram_write (unsigned short addr, unsigned char data) {
+ dprint(" ");
+ dprint("vram_data_set addr:%04x, data:%2x\n", addr, data);
+}
+
+void d4_set(int on_off) {
+ if (on_off) {
+ vram_log_level4 = dump_vram_write;
+ }
+ else {
+ vram_log_level4 = null_write;
+ }
+}