fixed some shit related to pixel conversions/black screens...

master
xerox 3 years ago
parent daa4f9a04f
commit 8b718cd481

@ -241,11 +241,11 @@ void S9xLoadConfigFiles (char **argv, int argc)
// Display // Display
Settings.SupportHiRes = conf.GetBool("Display::HiRes", true); Settings.SupportHiRes = conf.GetBool("Display::HiRes", false);
Settings.Transparency = conf.GetBool("Display::Transparency", true); Settings.Transparency = conf.GetBool("Display::Transparency", true);
Settings.DisableGraphicWindows = !conf.GetBool("Display::GraphicWindows", true); Settings.DisableGraphicWindows = !conf.GetBool("Display::GraphicWindows", true);
Settings.DisplayTime = conf.GetBool("Display::DisplayTime", false); 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.DisplayWatchedAddresses = conf.GetBool("Display::DisplayWatchedAddresses", false);
Settings.DisplayPressedKeys = conf.GetBool("Display::DisplayInput", false); Settings.DisplayPressedKeys = conf.GetBool("Display::DisplayInput", false);
Settings.DisplayMovieFrame = conf.GetBool("Display::DisplayFrameCount", false); Settings.DisplayMovieFrame = conf.GetBool("Display::DisplayFrameCount", false);

@ -3,7 +3,7 @@
HI_S32 g_hFrameBuffer; HI_S32 g_hFrameBuffer;
HIFB_BUFFER_S g_stCanvasBuf; 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_r16 = {10, 5, 0};
static struct fb_bitfield s_g16 = {5, 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.enIntfSync = VO_OUTPUT_640x480_60;
stPubAttr.enIntfType = VO_INTF_HDMI; stPubAttr.enIntfType = VO_INTF_HDMI;
stPubAttr.stSyncInfo.bSynm = HI_TRUE;
stPubAttr.u32BgColor = 0x000000; stPubAttr.u32BgColor = 0x000000;
stLayerAttr.bClusterMode = HI_FALSE; stLayerAttr.bClusterMode = HI_FALSE;
@ -165,10 +166,10 @@ HI_BOOL HiInitDisplay() {
} }
/* when we call RefreshScreen we will re-draw the entire screen... */ /* 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.y = 0;
g_stCanvasBuf.UpdateRect.w = SCREEN_WIDTH; g_stCanvasBuf.UpdateRect.w = SCALE_WIDTH;
g_stCanvasBuf.UpdateRect.h = SCREEN_HEIGHT; g_stCanvasBuf.UpdateRect.h = SCALE_HEIGHT;
/* meta data about the back buffer... */ /* meta data about the back buffer... */
g_stCanvasBuf.stCanvas.u32Height = SCREEN_HEIGHT; g_stCanvasBuf.stCanvas.u32Height = SCREEN_HEIGHT;
@ -190,5 +191,7 @@ HI_BOOL HiInitDisplay() {
} }
void RefreshScreen() { void RefreshScreen() {
int arg = 0;
ioctl(g_hFrameBuffer, FBIO_WAITFORVSYNC, &arg);
ioctl(g_hFrameBuffer, FBIO_REFRESH, &g_stCanvasBuf); ioctl(g_hFrameBuffer, FBIO_REFRESH, &g_stCanvasBuf);
} }

@ -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>
@ -37,14 +37,14 @@
} }
HI_U32 g_pSnesBackBufferPhys; HI_U32 g_pSnesBackBufferPhys;
void* g_pSnesBackBufferVirt; void *g_pSnesBackBufferVirt;
HI_U32 g_pScaleBufferPhys; HI_U32 g_pScaleBufferPhys;
void* g_pScaleBufferVirt; void *g_pScaleBufferVirt;
uint8 js_mod[8] = {0, 0, 0, 0, 0, 0, 0, 0}; uint8 js_mod[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int js_fd[8] = {-1, -1, -1, -1, -1, -1, -1, -1}; 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"}; "/dev/js4", "/dev/js5", "/dev/js6", "/dev/js7"};
bool8 js_unplugged[8] = {FALSE, FALSE, FALSE, FALSE, bool8 js_unplugged[8] = {FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE}; FALSE, FALSE, FALSE, FALSE};
@ -54,12 +54,12 @@ void S9xExit(void) {}
void S9xAutoSaveSRAM(void) {} void S9xAutoSaveSRAM(void) {}
void S9xToggleSoundChannel(int c) {} void S9xToggleSoundChannel(int c) {}
void S9xSyncSpeed(void) {} void S9xSyncSpeed(void) {}
void S9xMessage(int type, int number, const char* message) {} void S9xMessage(int type, int number, const char *message) {}
void S9xParsePortConfig(ConfigFile& conf, int pass) {} 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; int i, j, d;
char* c; char *c;
char buf[4] = "M1+"; char buf[4] = "M1+";
if (!strncmp(n, "PseudoPointer", 13) && n[13] >= '1' && n[13] <= '8' && if (!strncmp(n, "PseudoPointer", 13) && n[13] >= '1' && n[13] <= '8' &&
@ -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;
@ -220,7 +219,7 @@ bool8 ReadJoysticks(void) {
return js_latch; return js_latch;
} }
const char* S9xStringInput(const char* message) { const char *S9xStringInput(const char *message) {
static char buffer[256]; static char buffer[256];
printf("%s: ", message); printf("%s: ", message);
@ -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,15 +334,14 @@ 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];
char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], fname[_MAX_FNAME + 1], char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], fname[_MAX_FNAME + 1],
ext[_MAX_EXT + 1]; ext[_MAX_EXT + 1];
@ -348,13 +353,13 @@ const char* S9xGetFilename(const char* ex, s9x_getdirtype dirtype) {
return (s); 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]; static char s[PATH_MAX + 1];
char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], fname[_MAX_FNAME + 1], char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], fname[_MAX_FNAME + 1],
ext[_MAX_EXT + 1]; ext[_MAX_EXT + 1];
unsigned int i = 0; unsigned int i = 0;
const char* d; const char *d;
struct stat buf; struct stat buf;
_splitpath(Memory.ROMFilename, drive, dir, fname, ext); _splitpath(Memory.ROMFilename, drive, dir, fname, ext);
@ -366,7 +371,7 @@ const char* S9xGetFilenameInc(const char* ex, enum s9x_getdirtype dirtype) {
return (s); return (s);
} }
const char* S9xGetDirectory(enum s9x_getdirtype dirtype) { const char *S9xGetDirectory(enum s9x_getdirtype dirtype) {
static char s[PATH_MAX + 1]; static char s[PATH_MAX + 1];
switch (dirtype) { switch (dirtype) {
case DEFAULT_DIR: case DEFAULT_DIR:
@ -399,8 +404,8 @@ const char* S9xGetDirectory(enum s9x_getdirtype dirtype) {
return (s); return (s);
} }
const char* S9xBasename(const char* path) { const char *S9xBasename(const char *path) {
const char* p; const char *p;
if ((p = strrchr(path, '/')) != NULL || (p = strrchr(path, '\\')) != NULL) if ((p = strrchr(path, '/')) != NULL || (p = strrchr(path, '\\')) != NULL)
return (p + 1); return (p + 1);
@ -408,39 +413,19 @@ const char* S9xBasename(const char* path) {
return (path); return (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);
HI_MPI_SYS_MmzAlloc(&g_pSnesBackBufferPhys, &g_pSnesBackBufferVirt, NULL, HI_MPI_SYS_MmzAlloc(&g_pSnesBackBufferPhys, &g_pSnesBackBufferVirt, NULL,
NULL, 2 * SNES_WIDTH * SNES_HEIGHT); NULL, 2 * SNES_WIDTH * SNES_HEIGHT);
GFX.Screen = (uint16_t*)g_pSnesBackBufferVirt; GFX.Screen = (uint16_t *)g_pSnesBackBufferVirt;
GFX.Pitch = 2 * SNES_WIDTH; GFX.Pitch = 2 * SNES_WIDTH;
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);

Binary file not shown.
Loading…
Cancel
Save