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

master
xerox 2 years ago
parent daa4f9a04f
commit 8b718cd481

@ -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);

@ -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);
}

@ -1,3 +1,4 @@
#include <algorithm>
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
@ -7,7 +8,6 @@
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <algorithm>
#include <linux/fb.h>
#include <linux/joystick.h>
@ -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();
}
}
}

Binary file not shown.
Loading…
Cancel
Save