OSDN Git Service

ppu internal release 2
[motonesemu/motonesemu.git] / emulator / ppucore / vram.c
index cc1bc12..828271f 100644 (file)
@@ -1,12 +1,15 @@
 #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
@@ -24,7 +27,7 @@ void palette_index_to_rgb15(int bank, unsigned char index, struct rgb15* rgb);
 /*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;
@@ -113,14 +116,14 @@ void spr_palette_tbl_set(unsigned short addr, unsigned char data) {
     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;
 }
 
 
@@ -149,6 +152,8 @@ void load_attribute(unsigned char bank, int tile_index, struct palette *plt) {
     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:
@@ -167,13 +172,13 @@ void load_attribute(unsigned char bank, int tile_index, struct palette *plt) {
 
     /*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]);
 
 }
@@ -197,6 +202,93 @@ void load_pattern(unsigned char bank, unsigned char ptn_index, struct tile_2* pa
     }
 }
 
+/*
+ * 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;
@@ -248,8 +340,8 @@ int vram_init(void) {
     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);
@@ -272,7 +364,7 @@ void clean_vram(void) {
     free(attr_tbl0);
     free(attr_tbl1);
 
-    free(img_palette_tbl);
+    free(bg_palette_tbl);
     free(spr_palette_tbl);
 
 }