From: astoria-d Date: Wed, 13 Mar 2013 05:34:15 +0000 (+0900) Subject: vram bug fixed X-Git-Tag: motonesemu-0.1.0~12 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=20688a059dea43182f6b98d2ec68113722a49c6a;p=motonesemu%2Fmotonesemu.git vram bug fixed --- diff --git a/emulator/ppucore/dummy-driver2.c b/emulator/ppucore/dummy-driver2.c index 9148f77..a9f1518 100644 --- a/emulator/ppucore/dummy-driver2.c +++ b/emulator/ppucore/dummy-driver2.c @@ -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); diff --git a/emulator/ppucore/vscreen.c b/emulator/ppucore/vscreen.c index 36e5f0e..8a6ebfe 100644 --- a/emulator/ppucore/vscreen.c +++ b/emulator/ppucore/vscreen.c @@ -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]); + } } } }