|
|
@ -1,3 +1,4 @@
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <dirent.h>
|
|
|
|
#include <dirent.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <errno.h>
|
|
|
@ -7,7 +8,6 @@
|
|
|
|
#include <string.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <strings.h>
|
|
|
|
#include <strings.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <linux/fb.h>
|
|
|
|
#include <linux/fb.h>
|
|
|
|
#include <linux/joystick.h>
|
|
|
|
#include <linux/joystick.h>
|
|
|
@ -180,8 +180,7 @@ bool8 ReadJoysticks(void) {
|
|
|
|
switch (js_ev.type) {
|
|
|
|
switch (js_ev.type) {
|
|
|
|
case JS_EVENT_AXIS:
|
|
|
|
case JS_EVENT_AXIS:
|
|
|
|
S9xReportAxis(0x8000c000 | (i << 24) | js_ev.number, js_ev.value);
|
|
|
|
S9xReportAxis(0x8000c000 | (i << 24) | js_ev.number, js_ev.value);
|
|
|
|
S9xReportAxis(
|
|
|
|
S9xReportAxis(0x80008000 | (i << 24) | (js_mod[i] << 16) | js_ev.number,
|
|
|
|
0x80008000 | (i << 24) | (js_mod[i] << 16) | js_ev.number,
|
|
|
|
|
|
|
|
js_ev.value);
|
|
|
|
js_ev.value);
|
|
|
|
js_latch = TRUE;
|
|
|
|
js_latch = TRUE;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -189,8 +188,8 @@ bool8 ReadJoysticks(void) {
|
|
|
|
case JS_EVENT_BUTTON:
|
|
|
|
case JS_EVENT_BUTTON:
|
|
|
|
case JS_EVENT_BUTTON | JS_EVENT_INIT:
|
|
|
|
case JS_EVENT_BUTTON | JS_EVENT_INIT:
|
|
|
|
S9xReportButton(0x80004000 | (i << 24) | js_ev.number, js_ev.value);
|
|
|
|
S9xReportButton(0x80004000 | (i << 24) | js_ev.number, js_ev.value);
|
|
|
|
S9xReportButton(
|
|
|
|
S9xReportButton(0x80000000 | (i << 24) | (js_mod[i] << 16) |
|
|
|
|
0x80000000 | (i << 24) | (js_mod[i] << 16) | js_ev.number,
|
|
|
|
js_ev.number,
|
|
|
|
js_ev.value);
|
|
|
|
js_ev.value);
|
|
|
|
js_latch = TRUE;
|
|
|
|
js_latch = TRUE;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -232,25 +231,17 @@ const char* S9xStringInput(const char* message) {
|
|
|
|
return (NULL);
|
|
|
|
return (NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool8 S9xContinueUpdate(int width, int height) {
|
|
|
|
bool8 S9xContinueUpdate(int width, int height) { return true; }
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool S9xPollButton(uint32 id, bool* pressed) {
|
|
|
|
bool S9xPollButton(uint32 id, bool *pressed) { return false; }
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool S9xPollAxis(uint32 id, int16* value) {
|
|
|
|
bool S9xPollAxis(uint32 id, int16 *value) { return false; }
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool8 S9xOpenSnapshotFile(const char *filepath, bool8 read_only, STREAM *file) {
|
|
|
|
bool8 S9xOpenSnapshotFile(const char *filepath, bool8 read_only, STREAM *file) {
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool8 S9xInitUpdate(void) {
|
|
|
|
bool8 S9xInitUpdate(void) { return true; }
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool8 S9xDeinitUpdate(int width, int height) {
|
|
|
|
bool8 S9xDeinitUpdate(int width, int height) {
|
|
|
|
TDE2_RECT_S stSrcRect, stDstRect, stScaleRect;
|
|
|
|
TDE2_RECT_S stSrcRect, stDstRect, stScaleRect;
|
|
|
@ -302,6 +293,20 @@ bool8 S9xDeinitUpdate(int width, int height) {
|
|
|
|
stDst.u32PhyAddr = g_stCanvasBuf.stCanvas.u32PhyAddr;
|
|
|
|
stDst.u32PhyAddr = g_stCanvasBuf.stCanvas.u32PhyAddr;
|
|
|
|
stOpt.bResize = HI_TRUE;
|
|
|
|
stOpt.bResize = HI_TRUE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) {
|
|
|
|
|
|
|
|
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,
|
|
|
|
s32Ret = HI_TDE2_Bitblit(s32Handle, &stScale, &stScaleRect, &stSrc,
|
|
|
|
&stSrcRect, &stScale, &stScaleRect, &stOpt);
|
|
|
|
&stSrcRect, &stScale, &stScaleRect, &stOpt);
|
|
|
|
|
|
|
|
|
|
|
@ -310,6 +315,7 @@ bool8 S9xDeinitUpdate(int width, int height) {
|
|
|
|
HI_TDE2_CancelJob(s32Handle);
|
|
|
|
HI_TDE2_CancelJob(s32Handle);
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
s32Ret =
|
|
|
|
s32Ret =
|
|
|
|
HI_TDE2_QuickCopy(s32Handle, &stScale, &stScaleRect, &stDst, &stDstRect);
|
|
|
|
HI_TDE2_QuickCopy(s32Handle, &stScale, &stScaleRect, &stDst, &stDstRect);
|
|
|
@ -328,13 +334,12 @@ bool8 S9xDeinitUpdate(int width, int height) {
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HI_TDE2_WaitAllDone();
|
|
|
|
RefreshScreen();
|
|
|
|
RefreshScreen();
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool8 S9xOpenSoundDevice(void) {
|
|
|
|
bool8 S9xOpenSoundDevice(void) { return false; }
|
|
|
|
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];
|
|
|
|
static char s[PATH_MAX + 1];
|
|
|
@ -409,27 +414,6 @@ const char* S9xBasename(const char* path) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char *argv[]) {
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HI_MPI_SYS_MmzAlloc(&g_pScaleBufferPhys, &g_pScaleBufferVirt, NULL, NULL,
|
|
|
|
HI_MPI_SYS_MmzAlloc(&g_pScaleBufferPhys, &g_pScaleBufferVirt, NULL, NULL,
|
|
|
|
2 * SCALE_WIDTH * SCALE_HEIGHT);
|
|
|
|
2 * SCALE_WIDTH * SCALE_HEIGHT);
|
|
|
|
|
|
|
|
|
|
|
@ -441,6 +425,7 @@ int main(int argc, char* argv[]) {
|
|
|
|
std::printf("[+] init back buffer and scale buffer...\n");
|
|
|
|
std::printf("[+] init back buffer and scale buffer...\n");
|
|
|
|
|
|
|
|
|
|
|
|
S9xLoadConfigFiles(argv, argc);
|
|
|
|
S9xLoadConfigFiles(argv, argc);
|
|
|
|
|
|
|
|
|
|
|
|
Memory.Init();
|
|
|
|
Memory.Init();
|
|
|
|
S9xInitAPU();
|
|
|
|
S9xInitAPU();
|
|
|
|
S9xInitSound(0);
|
|
|
|
S9xInitSound(0);
|
|
|
@ -452,7 +437,7 @@ int main(int argc, char* argv[]) {
|
|
|
|
HiInitDisplay();
|
|
|
|
HiInitDisplay();
|
|
|
|
std::printf("[+] init snes emulator...\n");
|
|
|
|
std::printf("[+] init snes emulator...\n");
|
|
|
|
|
|
|
|
|
|
|
|
Memory.LoadROM("super_mario.smc");
|
|
|
|
Memory.LoadROM("/mnt/usb-drive/super_mario.smc");
|
|
|
|
InitJoysticks();
|
|
|
|
InitJoysticks();
|
|
|
|
|
|
|
|
|
|
|
|
S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0);
|
|
|
|
S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0);
|
|
|
|