OSDN Git Service

added (but not supported...) some ppu commands
authorastoria-d <astoria-d@mail.goo.ne.jp>
Wed, 13 Mar 2013 06:49:40 +0000 (15:49 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Wed, 13 Mar 2013 06:49:40 +0000 (15:49 +0900)
emulator/ppucore/Makefile
emulator/ppucore/dummy-driver2.c
emulator/ppucore/palette.c
emulator/ppucore/ppucore.c
emulator/ppucore/vga_xfer.c
emulator/ppucore/vga_xfer.h [new file with mode: 0644]

index 4cd2aa6..520ca9f 100644 (file)
@@ -7,7 +7,7 @@ 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
+LIBS=-L../../libs -lmotones -pthread -lrt
 
 INCLUDE=-I../../include
 
index a9f1518..1d66978 100644 (file)
@@ -22,6 +22,7 @@ void vga_xfer(void);
 void dump_vram(int type, int bank, unsigned short addr, int size);
 void set_bgtile(int tile_id);
 void set_sprite(int x, int y, int tile_id, struct sprite_attr sa);
+void set_monocolor (int mono);
 
 struct timespec sleep_inteval = {0, 1000000 / VGA_REFRESH_RATE};
 
@@ -99,6 +100,8 @@ static void test_ppu(void) {
     name_tbl_set(0, 300, 1);
     attr_tbl_set(0, 0, 0x65);
 
+    set_monocolor(FALSE);
+
     for (i = 0; i < 960; i++) 
         set_bgtile(i);
 
@@ -114,7 +117,16 @@ static void test_ppu(void) {
     sa.flip_v = 1;
     set_sprite(70, 105, 'd', sa);
 
+    struct timespec begin, end;
+    clock_gettime(CLOCK_REALTIME, &begin);
     vga_xfer();
+    clock_gettime(CLOCK_REALTIME, &end);
+
+    dprint("vga_xfer elapsed time: %d.%09d, vga frame rate:0.%09d\n", 
+            end.tv_sec - begin.tv_sec, 
+            end.tv_nsec - begin.tv_nsec, 
+            1000000000 / 60);
+    fflush(stdout);
 
 //void dump_vram(int type, int bank, unsigned short addr, int size);
 /*
index 5c098af..e12a558 100644 (file)
@@ -8,7 +8,7 @@ static struct rgb15 NES_PALETTE_RGB15[PALETTE_SIZE];
 //copied from 
 //http://hlc6502.web.fc2.com/NesPal2.htm
 //
-static unsigned int NES_PALETTE_RGB24[PALETTE_SIZE] = {
+static const 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, 
@@ -27,6 +27,24 @@ static void from_rgb24(unsigned int rgb24, struct rgb15* rgb) {
     rgb->b = colto5bit(rgb24 & 0xFF);
 }
 
+void set_monocolor (int mono) {
+    if (mono) {
+        int i;
+        for (i = 0; i < PALETTE_SIZE; i++) {
+            NES_PALETTE_RGB15[i].r = 0x1f;
+            NES_PALETTE_RGB15[i].g = 0x1f;
+            NES_PALETTE_RGB15[i].b = 0x1f;
+        }
+    }
+    else {
+        int i;
+        for (i = 0; i < PALETTE_SIZE; i++) {
+            from_rgb24(NES_PALETTE_RGB24[i], &NES_PALETTE_RGB15[i]);
+        }
+    }
+}
+
+
 /*
  * bank: 0 >> bg palette
  * bank: 1 >> sprite palette
index 69b4eaa..5f27570 100644 (file)
@@ -4,6 +4,7 @@
 #include "tools.h"
 #include "vram.h"
 #include "ppucore.h"
+#include "vga_xfer.h"
 
 int vscreen_init(void);
 void clean_vscreen(void);
@@ -130,6 +131,10 @@ int ppucore_init(void) {
     if (!ret)
         return FALSE;
 
+    ret = vga_xfer_init();
+    if (!ret)
+        return FALSE;
+
     ret = vscreen_init();
     if (!ret)
         return FALSE;
index 6138f04..f8597fa 100644 (file)
@@ -1,4 +1,5 @@
 #include <string.h>
+#include "tools.h"
 #include "vga.h"
 #include "ppucore.h"
 
@@ -7,12 +8,45 @@ void vscreenn_dot_get(int x, int y, struct rgb15 *col);
 #define VSCREEN_WIDTH       (H_SCREEN_TILE_SIZE * TILE_DOT_SIZE)
 #define VSCREEN_HEIGHT      (V_SCREEN_TILE_SIZE * TILE_DOT_SIZE)
 
+#define MAX_5_BIT       0x1f
+#define EMPHASIZE_MAX   0x1c
+/*emphasize 10% increase.*/
+#define EMPHASIZE_RATE  110
+
 static struct rgb15 *vga_base;
 
+static int emp_red;
+static int emp_green;
+static int emp_blue;
+
+/*
+ * at this moment PPU emphasize r/g/b feature is not supported.
+ * TODO: emphasize color
+ * */
+void set_emphasize_red(int set) {
+    emp_red = set;
+}
+void set_emphasize_green(int set) {
+    emp_green = set;
+}
+void set_emphasize_blue(int set) {
+    emp_blue = set;
+}
+
 void set_vga_base(unsigned char* base) {
     vga_base = (struct rgb15*)base;
 }
 
+/*
+ * show left 8 pixels of sprite/background function not supported.
+ * TODO: show left 8 pixels of sprite/bg
+ * */
+void show_leftside_sprite(void) {
+}
+
+void show_leftside_bg(void) {
+}
+
 void vga_xfer(void) {
     int vscrn_x, vscrn_y, vscrn_x_old, vscrn_y_old;
     int vga_x, vga_y;
@@ -32,11 +66,6 @@ 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;
@@ -53,3 +82,9 @@ void vga_xfer(void) {
     }
 }
 
+int vga_xfer_init(void) {
+    emp_red = FALSE;
+    emp_green = FALSE;
+    emp_blue = FALSE;
+    return TRUE;
+}
diff --git a/emulator/ppucore/vga_xfer.h b/emulator/ppucore/vga_xfer.h
new file mode 100644 (file)
index 0000000..0f80793
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef __vga_xfer_h__
+#define __vga_xfer_h__
+
+
+int vga_xfer_init(void);
+void set_emphasize_red(int set);
+void set_emphasize_green(int set);
+void set_emphasize_blue(int set);
+
+void show_leftside_sprite(void);
+void show_leftside_bg(void);
+
+#endif /*__vga_xfer_h__*/
+