OSDN Git Service

vram bug fixed
authorastoria-d <astoria-d@mail.goo.ne.jp>
Wed, 13 Mar 2013 05:34:15 +0000 (14:34 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Wed, 13 Mar 2013 05:34:15 +0000 (14:34 +0900)
emulator/ppucore/dummy-driver2.c
emulator/ppucore/vscreen.c

index 9148f77..a9f1518 100644 (file)
@@ -57,10 +57,21 @@ void dump_6502(int full) {
 static void test_ppu(void) {
     int i;
     unsigned char plt[32] = {
-        0, 1, 2,  3,  0, 5,  6,  7, 
+            0x0f, 0x00, 0x10, 0x20,
+            0x0f, 0x06, 0x16, 0x26,
+            0x0f, 0x08, 0x18, 0x28,
+            0x0f, 0x0a, 0x1a, 0x2a,
+
+            0x0f, 0x00, 0x10, 0x20,
+            0x0f, 0x06, 0x16, 0x26,
+            0x0f, 0x08, 0x18, 0x28,
+            0x0f, 0x0a, 0x1a, 0x2a,
+/*
+        0, 5, 1,  0x28,  0, 6,  0xb,  0x36, 
         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++)
@@ -80,9 +91,9 @@ static void test_ppu(void) {
     name_tbl_set(0, 207, 'e');
     name_tbl_set(0, 208, '!');
     name_tbl_set(0, 209, '!');
-    //205 = palette gp2 01100101b
+    //205 = palette gp2 00011011b 
     //205 = 11
-    attr_tbl_set(0, 11, 0x65);
+    attr_tbl_set(0, 11, 0x1b);
 
     //other test.
     name_tbl_set(0, 300, 1);
index 36e5f0e..8a6ebfe 100644 (file)
@@ -52,13 +52,34 @@ void vscreenn_dot_set(int x, int y, struct rgb15 *col) {
     tile->l[inner_y].d[inner_x] = *col;
 }
 
+static int pal_index(struct tile_2 *ptn, int l, int dot_x) {
+    switch (dot_x) {
+        case 0:
+            return ptn->b0.l[l].dot0 * 2 + ptn->b1.l[l].dot0;
+        case 1:
+            return ptn->b0.l[l].dot1 * 2 + ptn->b1.l[l].dot1;
+        case 2:
+            return ptn->b0.l[l].dot2 * 2 + ptn->b1.l[l].dot2;
+        case 3:
+            return ptn->b0.l[l].dot3 * 2 + ptn->b1.l[l].dot3;
+        case 4:
+            return ptn->b0.l[l].dot4 * 2 + ptn->b1.l[l].dot4;
+        case 5:
+            return ptn->b0.l[l].dot5 * 2 + ptn->b1.l[l].dot5;
+        case 6:
+            return ptn->b0.l[l].dot6 * 2 + ptn->b1.l[l].dot6;
+        case 7:
+        default:
+            return ptn->b0.l[l].dot7 * 2 + ptn->b1.l[l].dot7;
+    }
+}
 
 void set_bgtile(int tile_id) {
     struct palette plt;
     struct tile_2 ptn;
     unsigned char name_index;
     struct tile_rgb15* set_data;
-    int i;
+    int i,j;
 
     load_attribute(0, tile_id, &plt);
 
@@ -68,14 +89,13 @@ void set_bgtile(int tile_id) {
     set_data = vscreen + tile_id;
     for (i = 0; i < TILE_DOT_SIZE; i++) {
         //display shows left to right with high bit to low bit
-        set_data->l[i].d[7] = plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0];
-        set_data->l[i].d[6] = plt.col[ptn.b0.l[i].dot1 + ptn.b1.l[i].dot1];
-        set_data->l[i].d[5] = plt.col[ptn.b0.l[i].dot2 + ptn.b1.l[i].dot2];
-        set_data->l[i].d[4] = plt.col[ptn.b0.l[i].dot3 + ptn.b1.l[i].dot3];
-        set_data->l[i].d[3] = plt.col[ptn.b0.l[i].dot4 + ptn.b1.l[i].dot4];
-        set_data->l[i].d[2] = plt.col[ptn.b0.l[i].dot5 + ptn.b1.l[i].dot5];
-        set_data->l[i].d[1] = plt.col[ptn.b0.l[i].dot6 + ptn.b1.l[i].dot6];
-        set_data->l[i].d[0] = plt.col[ptn.b0.l[i].dot7 + ptn.b1.l[i].dot7];
+        for (j = 0; j < 8; j++) {
+            int pi = pal_index(&ptn, i, j);
+            if (pi) {
+                //dprint("%d, %d, colind:%d\n", j, i, pi);
+                set_data->l[i].d[7 - j] = plt.col[pi];
+            }
+        }
     }
 
 }
@@ -83,7 +103,7 @@ void set_bgtile(int tile_id) {
 void set_sprite(int x, int y, int tile_id, struct sprite_attr sa) {
     struct palette plt;
     struct tile_2 ptn;
-    int i;
+    int i, j;
 
     load_spr_attribute(sa, &plt);
 
@@ -93,46 +113,34 @@ void set_sprite(int x, int y, int tile_id, struct sprite_attr sa) {
     for (i = 0; i < TILE_DOT_SIZE; i++) {
         if (sa.flip_h) {
             if (sa.flip_v) {
-                vscreenn_dot_set(x + 0, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0]);
-                vscreenn_dot_set(x + 1, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot1]);
-                vscreenn_dot_set(x + 2, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot2]);
-                vscreenn_dot_set(x + 3, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot3]);
-                vscreenn_dot_set(x + 4, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot4]);
-                vscreenn_dot_set(x + 5, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot5]);
-                vscreenn_dot_set(x + 6, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot6]);
-                vscreenn_dot_set(x + 7, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot7]);
+                for (j = 0; j < 8; j++) {
+                    int pi = pal_index(&ptn, i, j);
+                    if (pi)
+                        vscreenn_dot_set(x + j, y + 7 - i, &plt.col[pi]);
+                }
             }
             else {
-                vscreenn_dot_set(x + 0, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0]);
-                vscreenn_dot_set(x + 1, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot1]);
-                vscreenn_dot_set(x + 2, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot2]);
-                vscreenn_dot_set(x + 3, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot3]);
-                vscreenn_dot_set(x + 4, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot4]);
-                vscreenn_dot_set(x + 5, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot5]);
-                vscreenn_dot_set(x + 6, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot6]);
-                vscreenn_dot_set(x + 7, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot7]);
+                for (j = 0; j < 8; j++) {
+                    int pi = pal_index(&ptn, i, j);
+                    if (pi)
+                        vscreenn_dot_set(x + j, y + i, &plt.col[pi]);
+                }
             }
         }
         else {
             if (sa.flip_v) {
-                vscreenn_dot_set(x + 7, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0]);
-                vscreenn_dot_set(x + 6, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot1]);
-                vscreenn_dot_set(x + 5, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot2]);
-                vscreenn_dot_set(x + 4, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot3]);
-                vscreenn_dot_set(x + 3, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot4]);
-                vscreenn_dot_set(x + 2, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot5]);
-                vscreenn_dot_set(x + 1, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot6]);
-                vscreenn_dot_set(x + 0, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot7]);
+                for (j = 0; j < 8; j++) {
+                    int pi = pal_index(&ptn, i, j);
+                    if (pi)
+                        vscreenn_dot_set(x + 7 - j, y + 7 - i, &plt.col[pi]);
+                }
             }
             else {
-                vscreenn_dot_set(x + 7, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0]);
-                vscreenn_dot_set(x + 6, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot1]);
-                vscreenn_dot_set(x + 5, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot2]);
-                vscreenn_dot_set(x + 4, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot3]);
-                vscreenn_dot_set(x + 3, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot4]);
-                vscreenn_dot_set(x + 2, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot5]);
-                vscreenn_dot_set(x + 1, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot6]);
-                vscreenn_dot_set(x + 0, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot7]);
+                for (j = 0; j < 8; j++) {
+                    int pi = pal_index(&ptn, i, j);
+                    if (pi)
+                        vscreenn_dot_set(x + 7 - j, y + i, &plt.col[pi]);
+                }
             }
         }
     }