OSDN Git Service

ppu display ok
authorastoria-d <astoria-d@mail.goo.ne.jp>
Tue, 12 Mar 2013 10:26:23 +0000 (19:26 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Tue, 12 Mar 2013 10:26:23 +0000 (19:26 +0900)
emulator/ppucore/dummy-driver2.c
emulator/ppucore/palette.c
emulator/ppucore/vram.c
emulator/ppucore/vram.h
emulator/ppucore/vscreen.c

index 081b7e8..794513d 100644 (file)
@@ -66,22 +66,31 @@ static void test_ppu(void) {
     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);
 */
 }
 
index 94f0b50..5c098af 100644 (file)
@@ -1,24 +1,19 @@
 #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, 
@@ -26,36 +21,27 @@ static unsigned int RGB24_BG[PALETTE_SIZE] = {
 };
 
 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;
index 828271f..922f43d 100644 (file)
@@ -7,7 +7,7 @@
 #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);
 
@@ -19,7 +19,6 @@ void dump_mem(const char* msg, unsigned short base,
 #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)
@@ -57,7 +56,6 @@ unsigned char pattern_tbl_get(unsigned char bank, unsigned short addr) {
 }
 
 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)
@@ -69,7 +67,6 @@ unsigned char name_tbl_get(unsigned char bank, unsigned short addr) {
 }
 
 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)
@@ -139,47 +136,89 @@ void spr_ram_tbl_set(unsigned short addr, unsigned char data) {
 
 /* 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));
+            */
 
 }
 
@@ -199,6 +238,7 @@ void load_pattern(unsigned char bank, unsigned char ptn_index, struct tile_2* pa
         data = pattern_tbl_get(bank, addr);
         *p = data;
         p++;
+        addr++;
     }
 }
 
@@ -216,13 +256,13 @@ void dump_vram(int type, int bank, unsigned short addr, int size) {
     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) {
@@ -242,7 +282,7 @@ void dump_vram(int type, int bank, unsigned short addr, int size) {
             }
             break;
 
-        case 2:
+        case VRAM_DUMP_TYPE_ATTR:
             sprintf(buf, "attribute table %d:\n", bank);
             base = 0x23c0 + bank * 0x400;
             switch (bank) {
@@ -262,7 +302,7 @@ void dump_vram(int type, int bank, unsigned short addr, int size) {
             }
             break;
 
-        case 3:
+        case VRAM_DUMP_TYPE_PLT:
             switch (bank) {
                 case 0:
                     base = 0x3f00;
@@ -278,7 +318,7 @@ void dump_vram(int type, int bank, unsigned short addr, int size) {
             }
             break;
 
-        case 4:
+        case VRAM_DUMP_TYPE_SPR:
         default:
             sprintf(buf, "sprite ram:\n");
             base = 0;
index 3e09c11..ec43b46 100644 (file)
@@ -25,14 +25,14 @@ int vram_init(void);
 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 {
@@ -49,11 +49,22 @@ struct palette {
 };
 
 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__*/
 
index 7b84fb9..f67c910 100644 (file)
@@ -78,7 +78,7 @@ void vscreenn_dot_get(int x, int y, struct rgb15 *col) {
 
     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;