diff --git a/snes9x/snes9x.cpp b/snes9x/snes9x.cpp index 9cb173c..2e29a70 100644 --- a/snes9x/snes9x.cpp +++ b/snes9x/snes9x.cpp @@ -241,11 +241,11 @@ void S9xLoadConfigFiles (char **argv, int argc) // Display - Settings.SupportHiRes = conf.GetBool("Display::HiRes", true); + Settings.SupportHiRes = conf.GetBool("Display::HiRes", false); Settings.Transparency = conf.GetBool("Display::Transparency", true); Settings.DisableGraphicWindows = !conf.GetBool("Display::GraphicWindows", true); Settings.DisplayTime = conf.GetBool("Display::DisplayTime", false); - Settings.DisplayFrameRate = conf.GetBool("Display::DisplayFrameRate", false); + Settings.DisplayFrameRate = conf.GetBool("Display::DisplayFrameRate", true); Settings.DisplayWatchedAddresses = conf.GetBool("Display::DisplayWatchedAddresses", false); Settings.DisplayPressedKeys = conf.GetBool("Display::DisplayInput", false); Settings.DisplayMovieFrame = conf.GetBool("Display::DisplayFrameCount", false); diff --git a/snes9x/unix/hifb.cpp b/snes9x/unix/hifb.cpp index 689086a..f3a2326 100644 --- a/snes9x/unix/hifb.cpp +++ b/snes9x/unix/hifb.cpp @@ -3,7 +3,7 @@ HI_S32 g_hFrameBuffer; HIFB_BUFFER_S g_stCanvasBuf; -void* g_BackBuffer; +void *g_BackBuffer; static struct fb_bitfield s_r16 = {10, 5, 0}; static struct fb_bitfield s_g16 = {5, 5, 0}; @@ -67,6 +67,7 @@ HI_BOOL HiInitDisplay() { stPubAttr.enIntfSync = VO_OUTPUT_640x480_60; stPubAttr.enIntfType = VO_INTF_HDMI; + stPubAttr.stSyncInfo.bSynm = HI_TRUE; stPubAttr.u32BgColor = 0x000000; stLayerAttr.bClusterMode = HI_FALSE; @@ -165,10 +166,10 @@ HI_BOOL HiInitDisplay() { } /* when we call RefreshScreen we will re-draw the entire screen... */ - g_stCanvasBuf.UpdateRect.x = 0; + g_stCanvasBuf.UpdateRect.x = (SCREEN_WIDTH - SCALE_WIDTH) / 2; g_stCanvasBuf.UpdateRect.y = 0; - g_stCanvasBuf.UpdateRect.w = SCREEN_WIDTH; - g_stCanvasBuf.UpdateRect.h = SCREEN_HEIGHT; + g_stCanvasBuf.UpdateRect.w = SCALE_WIDTH; + g_stCanvasBuf.UpdateRect.h = SCALE_HEIGHT; /* meta data about the back buffer... */ g_stCanvasBuf.stCanvas.u32Height = SCREEN_HEIGHT; @@ -190,5 +191,7 @@ HI_BOOL HiInitDisplay() { } void RefreshScreen() { + int arg = 0; + ioctl(g_hFrameBuffer, FBIO_WAITFORVSYNC, &arg); ioctl(g_hFrameBuffer, FBIO_REFRESH, &g_stCanvasBuf); } \ No newline at end of file diff --git a/snes9x/unix/main.cpp b/snes9x/unix/main.cpp index 02b4d73..4e03e88 100644 --- a/snes9x/unix/main.cpp +++ b/snes9x/unix/main.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -7,7 +8,6 @@ #include #include #include -#include #include #include @@ -28,23 +28,23 @@ #include "memmap.h" #include "snes9x.h" -#define MAP_KEY(x, y) \ - { \ - s9xcommand_t cmd; \ +#define MAP_KEY(x, y) \ + { \ + s9xcommand_t cmd; \ \ - cmd = S9xGetCommandT(y); \ - S9xMapInput(x, &cmd); \ + cmd = S9xGetCommandT(y); \ + S9xMapInput(x, &cmd); \ } HI_U32 g_pSnesBackBufferPhys; -void* g_pSnesBackBufferVirt; +void *g_pSnesBackBufferVirt; HI_U32 g_pScaleBufferPhys; -void* g_pScaleBufferVirt; +void *g_pScaleBufferVirt; uint8 js_mod[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int js_fd[8] = {-1, -1, -1, -1, -1, -1, -1, -1}; -const char* js_device[8] = {"/dev/js0", "/dev/js1", "/dev/js2", "/dev/js3", +const char *js_device[8] = {"/dev/js0", "/dev/js1", "/dev/js2", "/dev/js3", "/dev/js4", "/dev/js5", "/dev/js6", "/dev/js7"}; bool8 js_unplugged[8] = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}; @@ -54,12 +54,12 @@ void S9xExit(void) {} void S9xAutoSaveSRAM(void) {} void S9xToggleSoundChannel(int c) {} void S9xSyncSpeed(void) {} -void S9xMessage(int type, int number, const char* message) {} -void S9xParsePortConfig(ConfigFile& conf, int pass) {} +void S9xMessage(int type, int number, const char *message) {} +void S9xParsePortConfig(ConfigFile &conf, int pass) {} -bool8 S9xMapInput(const char* n, s9xcommand_t* cmd) { +bool8 S9xMapInput(const char *n, s9xcommand_t *cmd) { int i, j, d; - char* c; + char *c; char buf[4] = "M1+"; if (!strncmp(n, "PseudoPointer", 13) && n[13] >= '1' && n[13] <= '8' && @@ -178,22 +178,21 @@ bool8 ReadJoysticks(void) { while (read(js_fd[i], &js_ev, sizeof(struct js_event)) == sizeof(struct js_event)) { switch (js_ev.type) { - case JS_EVENT_AXIS: - S9xReportAxis(0x8000c000 | (i << 24) | js_ev.number, js_ev.value); - S9xReportAxis( - 0x80008000 | (i << 24) | (js_mod[i] << 16) | js_ev.number, - js_ev.value); - js_latch = TRUE; - break; - - case JS_EVENT_BUTTON: - case JS_EVENT_BUTTON | JS_EVENT_INIT: - S9xReportButton(0x80004000 | (i << 24) | js_ev.number, js_ev.value); - S9xReportButton( - 0x80000000 | (i << 24) | (js_mod[i] << 16) | js_ev.number, - js_ev.value); - js_latch = TRUE; - break; + case JS_EVENT_AXIS: + S9xReportAxis(0x8000c000 | (i << 24) | js_ev.number, js_ev.value); + S9xReportAxis(0x80008000 | (i << 24) | (js_mod[i] << 16) | js_ev.number, + js_ev.value); + js_latch = TRUE; + break; + + case JS_EVENT_BUTTON: + case JS_EVENT_BUTTON | JS_EVENT_INIT: + S9xReportButton(0x80004000 | (i << 24) | js_ev.number, js_ev.value); + S9xReportButton(0x80000000 | (i << 24) | (js_mod[i] << 16) | + js_ev.number, + js_ev.value); + js_latch = TRUE; + break; } } @@ -220,7 +219,7 @@ bool8 ReadJoysticks(void) { return js_latch; } -const char* S9xStringInput(const char* message) { +const char *S9xStringInput(const char *message) { static char buffer[256]; printf("%s: ", message); @@ -232,25 +231,17 @@ const char* S9xStringInput(const char* message) { return (NULL); } -bool8 S9xContinueUpdate(int width, int height) { - return true; -} +bool8 S9xContinueUpdate(int width, int height) { return true; } -bool S9xPollButton(uint32 id, bool* pressed) { - return false; -} +bool S9xPollButton(uint32 id, bool *pressed) { return false; } -bool S9xPollAxis(uint32 id, int16* value) { - return false; -} +bool S9xPollAxis(uint32 id, int16 *value) { return false; } -bool8 S9xOpenSnapshotFile(const char* filepath, bool8 read_only, STREAM* file) { +bool8 S9xOpenSnapshotFile(const char *filepath, bool8 read_only, STREAM *file) { return true; } -bool8 S9xInitUpdate(void) { - return true; -} +bool8 S9xInitUpdate(void) { return true; } bool8 S9xDeinitUpdate(int width, int height) { TDE2_RECT_S stSrcRect, stDstRect, stScaleRect; @@ -304,11 +295,26 @@ bool8 S9xDeinitUpdate(int width, int height) { s32Ret = HI_TDE2_Bitblit(s32Handle, &stScale, &stScaleRect, &stSrc, &stSrcRect, &stScale, &stScaleRect, &stOpt); - + + // if the screen is black all pixel values will be 0. this will cause bitblit + // to fail because it doesnt understand pixel conversions with pixels that are all 0... + // so i just make R = 1, G = 1, and B = 1... simple fix... lol... if (s32Ret < 0) { - SAMPLE_PRT("HI_TDE2_Bitblit:%d failed,ret=0x%x!\n", __LINE__, s32Ret); - HI_TDE2_CancelJob(s32Handle); - return false; + for (int i = 0; i < SNES_WIDTH * SNES_HEIGHT; ++i) { + if (*(((uint16_t *)g_pSnesBackBufferVirt) + i) == NULL) { + *(((uint16_t *)g_pSnesBackBufferVirt) + i) = + BUILD_PIXEL2_RGB565(1, 1, 1); + } + } + + s32Ret = HI_TDE2_Bitblit(s32Handle, &stScale, &stScaleRect, &stSrc, + &stSrcRect, &stScale, &stScaleRect, &stOpt); + + if (s32Ret < 0) { + SAMPLE_PRT("HI_TDE2_Bitblit:%d failed,ret=0x%x!\n", __LINE__, s32Ret); + HI_TDE2_CancelJob(s32Handle); + return false; + } } s32Ret = @@ -327,16 +333,15 @@ bool8 S9xDeinitUpdate(int width, int height) { HI_TDE2_CancelJob(s32Handle); return false; } - + + HI_TDE2_WaitAllDone(); RefreshScreen(); return true; } -bool8 S9xOpenSoundDevice(void) { - return false; -} +bool8 S9xOpenSoundDevice(void) { return false; } -const char* S9xGetFilename(const char* ex, s9x_getdirtype dirtype) { +const char *S9xGetFilename(const char *ex, s9x_getdirtype dirtype) { static char s[PATH_MAX + 1]; char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], fname[_MAX_FNAME + 1], ext[_MAX_EXT + 1]; @@ -348,13 +353,13 @@ const char* S9xGetFilename(const char* ex, s9x_getdirtype dirtype) { return (s); } -const char* S9xGetFilenameInc(const char* ex, enum s9x_getdirtype dirtype) { +const char *S9xGetFilenameInc(const char *ex, enum s9x_getdirtype dirtype) { static char s[PATH_MAX + 1]; char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], fname[_MAX_FNAME + 1], ext[_MAX_EXT + 1]; unsigned int i = 0; - const char* d; + const char *d; struct stat buf; _splitpath(Memory.ROMFilename, drive, dir, fname, ext); @@ -366,41 +371,41 @@ const char* S9xGetFilenameInc(const char* ex, enum s9x_getdirtype dirtype) { return (s); } -const char* S9xGetDirectory(enum s9x_getdirtype dirtype) { +const char *S9xGetDirectory(enum s9x_getdirtype dirtype) { static char s[PATH_MAX + 1]; switch (dirtype) { - case DEFAULT_DIR: - strncpy(s, getenv("HOME"), PATH_MAX + 1); - s[PATH_MAX] = 0; - break; - - case HOME_DIR: - strncpy(s, getenv("HOME"), PATH_MAX + 1); - s[PATH_MAX] = 0; - break; - - case ROMFILENAME_DIR: - strncpy(s, Memory.ROMFilename, PATH_MAX + 1); - s[PATH_MAX] = 0; - - for (int i = strlen(s); i >= 0; i--) { - if (s[i] == SLASH_CHAR) { - s[i] = 0; - break; - } + case DEFAULT_DIR: + strncpy(s, getenv("HOME"), PATH_MAX + 1); + s[PATH_MAX] = 0; + break; + + case HOME_DIR: + strncpy(s, getenv("HOME"), PATH_MAX + 1); + s[PATH_MAX] = 0; + break; + + case ROMFILENAME_DIR: + strncpy(s, Memory.ROMFilename, PATH_MAX + 1); + s[PATH_MAX] = 0; + + for (int i = strlen(s); i >= 0; i--) { + if (s[i] == SLASH_CHAR) { + s[i] = 0; + break; } + } - break; + break; - default: - s[0] = 0; - break; + default: + s[0] = 0; + break; } return (s); } -const char* S9xBasename(const char* path) { - const char* p; +const char *S9xBasename(const char *path) { + const char *p; if ((p = strrchr(path, '/')) != NULL || (p = strrchr(path, '\\')) != NULL) return (p + 1); @@ -408,39 +413,19 @@ const char* S9xBasename(const char* path) { return (path); } -int main(int argc, char* argv[]) { - /* default settings to get snes emulation working... */ - memset(&Settings, 0, sizeof(Settings)); - Settings.MouseMaster = TRUE; - Settings.SuperScopeMaster = TRUE; - Settings.JustifierMaster = TRUE; - Settings.MultiPlayer5Master = TRUE; - Settings.FrameTimePAL = 20000; - Settings.FrameTimeNTSC = 16667; - Settings.SixteenBitSound = TRUE; - Settings.Stereo = TRUE; - Settings.SoundPlaybackRate = 48000; - Settings.SoundInputRate = 31950; - Settings.SupportHiRes = FALSE; - Settings.Transparency = TRUE; - Settings.AutoDisplayMessages = TRUE; - Settings.InitialInfoStringTimeout = 120; - Settings.HDMATimingHack = 100; - Settings.BlockInvalidVRAMAccessMaster = TRUE; - Settings.SkipFrames = AUTO_FRAMERATE; - Settings.TurboSkipFrames = 15; - +int main(int argc, char *argv[]) { HI_MPI_SYS_MmzAlloc(&g_pScaleBufferPhys, &g_pScaleBufferVirt, NULL, NULL, 2 * SCALE_WIDTH * SCALE_HEIGHT); HI_MPI_SYS_MmzAlloc(&g_pSnesBackBufferPhys, &g_pSnesBackBufferVirt, NULL, NULL, 2 * SNES_WIDTH * SNES_HEIGHT); - GFX.Screen = (uint16_t*)g_pSnesBackBufferVirt; + GFX.Screen = (uint16_t *)g_pSnesBackBufferVirt; GFX.Pitch = 2 * SNES_WIDTH; std::printf("[+] init back buffer and scale buffer...\n"); S9xLoadConfigFiles(argv, argc); + Memory.Init(); S9xInitAPU(); S9xInitSound(0); @@ -452,7 +437,7 @@ int main(int argc, char* argv[]) { HiInitDisplay(); std::printf("[+] init snes emulator...\n"); - Memory.LoadROM("super_mario.smc"); + Memory.LoadROM("/mnt/usb-drive/super_mario.smc"); InitJoysticks(); S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); @@ -475,4 +460,4 @@ int main(int argc, char* argv[]) { ReadJoysticks(); S9xMainLoop(); } -} \ No newline at end of file +} diff --git a/snes9x/unix/snes9x b/snes9x/unix/snes9x deleted file mode 100755 index 6e231b3..0000000 Binary files a/snes9x/unix/snes9x and /dev/null differ