From fe8e9d51fbe8fd672564972b30693f157edf4640 Mon Sep 17 00:00:00 2001 From: astoria-d Date: Wed, 13 Mar 2013 15:49:40 +0900 Subject: [PATCH] added (but not supported...) some ppu commands --- emulator/ppucore/Makefile | 2 +- emulator/ppucore/dummy-driver2.c | 12 +++++++++++ emulator/ppucore/palette.c | 20 +++++++++++++++++- emulator/ppucore/ppucore.c | 5 +++++ emulator/ppucore/vga_xfer.c | 45 +++++++++++++++++++++++++++++++++++----- emulator/ppucore/vga_xfer.h | 14 +++++++++++++ 6 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 emulator/ppucore/vga_xfer.h diff --git a/emulator/ppucore/Makefile b/emulator/ppucore/Makefile index 4cd2aa6..520ca9f 100644 --- a/emulator/ppucore/Makefile +++ b/emulator/ppucore/Makefile @@ -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 diff --git a/emulator/ppucore/dummy-driver2.c b/emulator/ppucore/dummy-driver2.c index a9f1518..1d66978 100644 --- a/emulator/ppucore/dummy-driver2.c +++ b/emulator/ppucore/dummy-driver2.c @@ -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); /* diff --git a/emulator/ppucore/palette.c b/emulator/ppucore/palette.c index 5c098af..e12a558 100644 --- a/emulator/ppucore/palette.c +++ b/emulator/ppucore/palette.c @@ -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 diff --git a/emulator/ppucore/ppucore.c b/emulator/ppucore/ppucore.c index 69b4eaa..5f27570 100644 --- a/emulator/ppucore/ppucore.c +++ b/emulator/ppucore/ppucore.c @@ -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; diff --git a/emulator/ppucore/vga_xfer.c b/emulator/ppucore/vga_xfer.c index 6138f04..f8597fa 100644 --- a/emulator/ppucore/vga_xfer.c +++ b/emulator/ppucore/vga_xfer.c @@ -1,4 +1,5 @@ #include +#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 index 0000000..0f80793 --- /dev/null +++ b/emulator/ppucore/vga_xfer.h @@ -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__*/ + -- 2.11.0