OSDN Git Service

show sprite developed.
[motonesemu/motonesemu.git] / emulator / ppucore / vram.c
index f946f13..634d75c 100644 (file)
@@ -15,7 +15,6 @@ void dump_mem(const char* msg, unsigned short base,
 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;
@@ -33,6 +32,16 @@ static unsigned char * attr_tbl3;
 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....
  *
@@ -107,24 +116,23 @@ static void bg_palette_tbl_set(unsigned short offset, unsigned char data) {
     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.
@@ -212,7 +220,6 @@ unsigned char vram_data_get(unsigned short addr) {
 
 /* VRAM manipulation... */
 
-//#define PPU_TEST
 #ifdef PPU_TEST
 /*
  * ppu test function
@@ -231,23 +238,28 @@ static void test_ppu(void) {
             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');
@@ -260,14 +272,16 @@ static void test_ppu(void) {
     //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;
@@ -279,6 +293,10 @@ static void test_ppu(void) {
     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();
@@ -292,26 +310,8 @@ static void test_ppu(void) {
     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;
 
@@ -459,10 +459,6 @@ int vram_init(void) {
     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;
@@ -495,7 +491,6 @@ int vram_init(void) {
 
     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);
@@ -503,6 +498,8 @@ int vram_init(void) {
     memset(bg_palette_tbl, 0, PALETTE_TBL_SIZE);
     memset(spr_palette_tbl, 0, PALETTE_TBL_SIZE);
 
+    d4_set(debug_mode);
+
     return TRUE;
 }
 
@@ -511,8 +508,6 @@ void clean_vram(void) {
     free(pattern_tbl0);
     free(pattern_tbl1);
 
-    free(sprite_ram);
-
     free(name_tbl0);
     free(name_tbl1);
 
@@ -524,3 +519,17 @@ void clean_vram(void) {
 
 }
 
+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;
+    }
+}