OSDN Git Service

ppu internal release 2
authorastoria-d <astoria-d@mail.goo.ne.jp>
Tue, 12 Mar 2013 02:41:48 +0000 (11:41 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Tue, 12 Mar 2013 02:41:48 +0000 (11:41 +0900)
emulator/ppucore/Makefile
emulator/ppucore/dummy-driver2.c
emulator/ppucore/palette.c
emulator/ppucore/vga_xfer.c
emulator/ppucore/vram.c
emulator/ppucore/vram.h
emulator/ppucore/vscreen.c

index 21c1390..4cd2aa6 100644 (file)
@@ -2,8 +2,10 @@
 #BIN=ppucore
 BIN=dummy-driver2
 
-OBJS=dummy-driver2.o ppucore.o vram.o cartridge.o vscreen.o palette.o \
-        vga_xfer.o
+DUMMY_OBJS=dummy-driver2.o debug.o cartridge.o 
+
+OBJS=ppucore.o vram.o vscreen.o palette.o \
+        vga_xfer.o $(DUMMY_OBJS)
         
 LIBS=-L../../libs -lmotones -pthread
 
index cad6ce1..081b7e8 100644 (file)
@@ -18,11 +18,16 @@ void clean_ppucore(void);
 int load_cartridge(const char* cartridge);
 void set_vga_base(unsigned char* base);
 void vga_xfer(void);
+void dump_vram(int type, int bank, unsigned short addr, int size);
+void set_bgtile(int tile_id);
 
 struct timespec sleep_inteval = {0, 1000000 / VGA_REFRESH_RATE};
 
 
-/*dummy function*/
+/*
+ * dummy function
+ * for cartridge.c
+ * */
 int load_prg_rom(FILE* cartridge, int num_rom_bank) {
 #define ROM_32K 0x8000
     int len;
@@ -39,22 +44,45 @@ int load_prg_rom(FILE* cartridge, int num_rom_bank) {
     return TRUE;
 }
 
+/*
+ * for debug.c
+ * */
+int debug_mode = TRUE;
+int critical_error = FALSE;
+void dump_6502(int full) {
+}
+
 static void test_ppu(void) {
     int i;
     unsigned char plt[32] = {
-        0x0f, 0x00, 0x10, 0x20,
-        0x0f, 0x06, 0x16, 0x26,
-        0x0f, 0x08, 0x18, 0x28,
-        0x0f, 0x0a, 0x1a, 0x2a
+        0, 1, 2,  3,  0, 5,  6,  7, 
+        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++)
-        img_palette_tbl_set(i, plt[i]);
+        bg_palette_tbl_set(i, plt[i]);
     for (i = 0; i < 16; i++)
         spr_palette_tbl_set(i, plt[i + 16]);
-    attr_tbl_set(0, 100, 0);
-    name_tbl_set(0, 100, 'm');
+
+    for (i = 0; i < 64; i++) 
+        name_tbl_set(0, i, i % 4);
+
+    for (i = 0; i < 64; i++) 
+        attr_tbl_set(0, i, 0);
+
+    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);
+*/
 }
 
 int main(int argc, char** argv) {
index a5781fb..94f0b50 100644 (file)
@@ -6,6 +6,11 @@
 static struct rgb15 NES_PALETTE_SPR[PALETTE_SIZE];
 static struct rgb15 NES_PALETTE_BG[PALETTE_SIZE];
 
+#define colto5bit(col8) col8 * 0x1F / 0xFF
+
+//copied from 
+//http://hlc6502.web.fc2.com/NesPal2.htm
+//
 static unsigned int RGB24_SPR[PALETTE_SIZE] = {
     0x787878, 0x2000B0, 0x2800B8, 0x6010A0, 0x982078, 0xB01030, 0xA03000, 0x784000, 
     0x485800, 0x386800, 0x386C00, 0x306040, 0x305080, 0x000000, 0x000000, 0x000000,
@@ -21,9 +26,9 @@ static unsigned int RGB24_BG[PALETTE_SIZE] = {
 };
 
 static void from_rgb24(unsigned int rgb24, struct rgb15* rgb) {
-    rgb->r = rgb24 && 0xFF;
-    rgb->g = (rgb24 >> 8) && 0xFF;
-    rgb->b = (rgb24 >> 16) && 0xFF;
+    rgb->r = colto5bit(rgb24 & 0xFF);
+    rgb->g = colto5bit((rgb24 >> 8) & 0xFF);
+    rgb->b = colto5bit((rgb24 >> 16) & 0xFF);
 }
 
 /*
index 930c56c..6138f04 100644 (file)
@@ -32,6 +32,11 @@ void vga_xfer(void) {
                 else {
                     *col = *col_old;
                 }
+                /*
+                col->r = to5bit(0xffff);
+                col->g = 0;
+                col->b = 0;
+                */
 
                 vscrn_x_old = vscrn_x;
                 col_old = col;
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);
 
 }
index de2a93b..3e09c11 100644 (file)
@@ -12,28 +12,27 @@ void name_tbl_set(unsigned char bank, unsigned short addr, unsigned char data);
 unsigned char attr_tbl_get(unsigned char bank, unsigned short addr);
 void attr_tbl_set(unsigned char bank, unsigned short addr, unsigned char data);
 
-unsigned char spr_plt_tbl_get(unsigned short addr);
-void spr_plt_tbl_set(unsigned short addr, unsigned char data);
-
-
 unsigned char spr_palette_tbl_get(unsigned short addr);
 void spr_palette_tbl_set(unsigned short addr, unsigned char data);
 
-unsigned char img_palette_tbl_get(unsigned short addr);
-void img_palette_tbl_set(unsigned short addr, unsigned char data);
+unsigned char bg_palette_tbl_get(unsigned short addr);
+void bg_palette_tbl_set(unsigned short addr, unsigned char data);
+
+unsigned char spr_ram_tbl_get(unsigned short addr);
+void spr_ram_tbl_set(unsigned short addr, unsigned char data);
 
 int vram_init(void);
 void clean_vram(void);
 
 struct tile_1_line{
-    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;
+    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;
 } __attribute__ ((packed));
 
 struct tile_1 {
@@ -41,8 +40,8 @@ struct tile_1 {
 };
 
 struct tile_2 {
-    struct tile_1 b0;
     struct tile_1 b1;
+    struct tile_1 b0;
 };
 
 struct palette {
@@ -50,10 +49,10 @@ struct palette {
 };
 
 struct palette_unit {
-    unsigned int    bit01   :2;
-    unsigned int    bit23   :2;
-    unsigned int    bit45   :2;
     unsigned int    bit67   :2;
+    unsigned int    bit45   :2;
+    unsigned int    bit23   :2;
+    unsigned int    bit01   :2;
 } __attribute__ ((packed));
 
 #endif /*__vram_h__*/
index 9ae0f0a..7b84fb9 100644 (file)
@@ -94,7 +94,7 @@ int vscreen_init(void) {
         return FALSE;
     memset(vscreen, 0, sizeof (struct tile_rgb15) * VIRT_SCREEN_TILE_SIZE * VIRT_SCREEN_TILE_SIZE);
 
-    dprint("tile_1_line:%d tile_2 size:%d\n", sizeof(struct tile_1_line), sizeof(struct tile_2));
+    //dprint("tile_1_line:%d tile_2 size:%d\n", sizeof(struct tile_1_line), sizeof(struct tile_2));
 
     return TRUE;
 }