mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-24 14:49:53 -06:00
Merge branch 'master' into feature/zip-support
This commit is contained in:
@ -24,7 +24,7 @@
|
||||
namespace LAN_PCap
|
||||
{
|
||||
|
||||
typedef struct
|
||||
struct AdapterData
|
||||
{
|
||||
char DeviceName[128];
|
||||
char FriendlyName[128];
|
||||
@ -34,8 +34,7 @@ typedef struct
|
||||
u8 IP_v4[4];
|
||||
|
||||
void* Internal;
|
||||
|
||||
} AdapterData;
|
||||
};
|
||||
|
||||
|
||||
extern AdapterData* Adapters;
|
||||
|
@ -48,7 +48,7 @@ const u32 kClientIP = kSubnet | 0x10;
|
||||
|
||||
const u8 kServerMAC[6] = {0x00, 0xAB, 0x33, 0x28, 0x99, 0x44};
|
||||
|
||||
FIFO<u32>* RXBuffer = nullptr;
|
||||
FIFO<u32, (0x8000 >> 2)> RXBuffer;
|
||||
|
||||
u32 IPv4ID;
|
||||
|
||||
@ -86,16 +86,16 @@ void RXEnqueue(const void* buf, int len)
|
||||
int alignedlen = (len + 3) & ~3;
|
||||
int totallen = alignedlen + 4;
|
||||
|
||||
if (!RXBuffer->CanFit(totallen >> 2))
|
||||
if (!RXBuffer.CanFit(totallen >> 2))
|
||||
{
|
||||
printf("slirp: !! NOT ENOUGH SPACE IN RX BUFFER\n");
|
||||
return;
|
||||
}
|
||||
|
||||
u32 header = (alignedlen & 0xFFFF) | (len << 16);
|
||||
RXBuffer->Write(header);
|
||||
RXBuffer.Write(header);
|
||||
for (int i = 0; i < alignedlen; i += 4)
|
||||
RXBuffer->Write(((u32*)buf)[i>>2]);
|
||||
RXBuffer.Write(((u32*)buf)[i>>2]);
|
||||
}
|
||||
|
||||
ssize_t SlirpCbSendPacket(const void* buf, size_t len, void* opaque)
|
||||
@ -202,8 +202,6 @@ bool Init()
|
||||
//FDListSize = 0;
|
||||
//memset(FDList, 0, sizeof(FDList));
|
||||
|
||||
RXBuffer = new FIFO<u32>(0x8000 >> 2);
|
||||
|
||||
SlirpConfig cfg;
|
||||
memset(&cfg, 0, sizeof(cfg));
|
||||
cfg.version = 1;
|
||||
@ -228,12 +226,6 @@ void DeInit()
|
||||
slirp_cleanup(Ctx);
|
||||
Ctx = nullptr;
|
||||
}
|
||||
|
||||
if (RXBuffer)
|
||||
{
|
||||
delete RXBuffer;
|
||||
RXBuffer = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -530,13 +522,13 @@ int RecvPacket(u8* data)
|
||||
slirp_pollfds_poll(Ctx, res<0, SlirpCbGetREvents, nullptr);
|
||||
}
|
||||
|
||||
if (!RXBuffer->IsEmpty())
|
||||
if (!RXBuffer.IsEmpty())
|
||||
{
|
||||
u32 header = RXBuffer->Read();
|
||||
u32 header = RXBuffer.Read();
|
||||
u32 len = header & 0xFFFF;
|
||||
|
||||
for (int i = 0; i < len; i += 4)
|
||||
((u32*)data)[i>>2] = RXBuffer->Read();
|
||||
((u32*)data)[i>>2] = RXBuffer.Read();
|
||||
|
||||
ret = header >> 16;
|
||||
}
|
||||
|
@ -72,6 +72,8 @@ char MicWavPath[1024];
|
||||
|
||||
char LastROMFolder[1024];
|
||||
|
||||
char RecentROMList[10][1024];
|
||||
|
||||
int EnableCheats;
|
||||
|
||||
bool EnableJIT;
|
||||
@ -166,6 +168,17 @@ ConfigEntry PlatformConfigFile[] =
|
||||
|
||||
{"LastROMFolder", 1, LastROMFolder, 0, "", 1023},
|
||||
|
||||
{"RecentROM_0", 1, RecentROMList[0], 0, "", 1023},
|
||||
{"RecentROM_1", 1, RecentROMList[1], 0, "", 1023},
|
||||
{"RecentROM_2", 1, RecentROMList[2], 0, "", 1023},
|
||||
{"RecentROM_3", 1, RecentROMList[3], 0, "", 1023},
|
||||
{"RecentROM_4", 1, RecentROMList[4], 0, "", 1023},
|
||||
{"RecentROM_5", 1, RecentROMList[5], 0, "", 1023},
|
||||
{"RecentROM_6", 1, RecentROMList[6], 0, "", 1023},
|
||||
{"RecentROM_7", 1, RecentROMList[7], 0, "", 1023},
|
||||
{"RecentROM_8", 1, RecentROMList[8], 0, "", 1023},
|
||||
{"RecentROM_9", 1, RecentROMList[9], 0, "", 1023},
|
||||
|
||||
{"EnableCheats", 0, &EnableCheats, 0, NULL, 0},
|
||||
|
||||
{"", -1, NULL, 0, NULL, 0}
|
||||
|
@ -86,6 +86,8 @@ extern char MicWavPath[1024];
|
||||
|
||||
extern char LastROMFolder[1024];
|
||||
|
||||
extern char RecentROMList[10][1024];
|
||||
|
||||
extern int EnableCheats;
|
||||
|
||||
}
|
||||
|
@ -84,6 +84,14 @@ VideoSettingsDialog::VideoSettingsDialog(QWidget* parent) : QDialog(parent), ui(
|
||||
ui->cbxGLResolution->setEnabled(true);
|
||||
ui->cbBetterPolygons->setEnabled(true);
|
||||
}
|
||||
|
||||
// sorry
|
||||
ui->cbVSync->hide();
|
||||
ui->cbVSync->setEnabled(false);
|
||||
ui->sbVSyncInterval->hide();
|
||||
ui->sbVSyncInterval->setEnabled(false);
|
||||
ui->label_2->hide();
|
||||
ui->groupBox->layout()->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding));
|
||||
}
|
||||
|
||||
VideoSettingsDialog::~VideoSettingsDialog()
|
||||
|
@ -875,22 +875,26 @@ void ScreenPanelGL::initializeGL()
|
||||
screenShader->setUniformValue("ScreenTex", (GLint)0);
|
||||
screenShader->release();
|
||||
|
||||
// to prevent bleeding between both parts of the screen
|
||||
// with bilinear filtering enabled
|
||||
const int paddedHeight = 192*2+2;
|
||||
const float padPixels = 1.f / paddedHeight;
|
||||
|
||||
float vertices[] =
|
||||
const float vertices[] =
|
||||
{
|
||||
0, 0, 0, 0,
|
||||
0, 192, 0, 0.5,
|
||||
256, 192, 1, 0.5,
|
||||
0, 0, 0, 0,
|
||||
256, 192, 1, 0.5,
|
||||
256, 0, 1, 0,
|
||||
0.f, 0.f, 0.f, 0.f,
|
||||
0.f, 192.f, 0.f, 0.5f - padPixels,
|
||||
256.f, 192.f, 1.f, 0.5f - padPixels,
|
||||
0.f, 0.f, 0.f, 0.f,
|
||||
256.f, 192.f, 1.f, 0.5f - padPixels,
|
||||
256.f, 0.f, 1.f, 0.f,
|
||||
|
||||
0, 0, 0, 0.5,
|
||||
0, 192, 0, 1,
|
||||
256, 192, 1, 1,
|
||||
0, 0, 0, 0.5,
|
||||
256, 192, 1, 1,
|
||||
256, 0, 1, 0.5
|
||||
0.f, 0.f, 0.f, 0.5f + padPixels,
|
||||
0.f, 192.f, 0.f, 1.f,
|
||||
256.f, 192.f, 1.f, 1.f,
|
||||
0.f, 0.f, 0.f, 0.5f + padPixels,
|
||||
256.f, 192.f, 1.f, 1.f,
|
||||
256.f, 0.f, 1.f, 0.5f + padPixels
|
||||
};
|
||||
|
||||
glGenBuffers(1, &screenVertexBuffer);
|
||||
@ -911,7 +915,11 @@ void ScreenPanelGL::initializeGL()
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 192*2, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, paddedHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
// fill the padding
|
||||
u8 zeroData[256*4*4];
|
||||
memset(zeroData, 0, sizeof(zeroData));
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 192, 256, 2, GL_RGBA, GL_UNSIGNED_BYTE, zeroData);
|
||||
|
||||
OSD::Init(this);
|
||||
}
|
||||
@ -949,7 +957,7 @@ void ScreenPanelGL::paintGL()
|
||||
{
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_RGBA,
|
||||
GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][0]);
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 192, 256, 192, GL_RGBA,
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 192+2, 256, 192, GL_RGBA,
|
||||
GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][1]);
|
||||
}
|
||||
}
|
||||
@ -1021,6 +1029,14 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
||||
actOpenROM = menu->addAction("Open ROM...");
|
||||
connect(actOpenROM, &QAction::triggered, this, &MainWindow::onOpenFile);
|
||||
|
||||
recentMenu = menu->addMenu("Open Recent");
|
||||
for(int i = 0; i < 10; ++i)
|
||||
{
|
||||
if(strlen(Config::RecentROMList[i]) > 0)
|
||||
recentFileList.push_back(Config::RecentROMList[i]);
|
||||
}
|
||||
updateRecentFilesMenu();
|
||||
|
||||
//actBootFirmware = menu->addAction("Launch DS menu");
|
||||
actBootFirmware = menu->addAction("Boot firmware");
|
||||
connect(actBootFirmware, &QAction::triggered, this, &MainWindow::onBootFirmware);
|
||||
@ -1333,7 +1349,7 @@ void MainWindow::keyPressEvent(QKeyEvent* event)
|
||||
if (event->isAutoRepeat()) return;
|
||||
|
||||
// TODO!! REMOVE ME IN RELEASE BUILDS!!
|
||||
if (event->key() == Qt::Key_F11) NDS::debug(0);
|
||||
//if (event->key() == Qt::Key_F11) NDS::debug(0);
|
||||
|
||||
Input::KeyPress(event);
|
||||
}
|
||||
@ -1457,7 +1473,20 @@ void MainWindow::onOpenFile()
|
||||
"Open ROM",
|
||||
Config::LastROMFolder,
|
||||
"DS ROMs (*.nds *.dsi *.srl *.zip *.7z);;GBA ROMs (*.gba *.zip *.7z);;Other Compressed ROMs (*.zip *.7z *.rar *.tar *.tar.gz *.tar.xz *tar.bz2);;Any file (*.*)");
|
||||
|
||||
if (filename.isEmpty())
|
||||
{
|
||||
emuThread->emuUnpause();
|
||||
return;
|
||||
}
|
||||
|
||||
void MainWindow::loadROM(QString filename)
|
||||
{
|
||||
recentFileList.removeAll(filename);
|
||||
recentFileList.prepend(filename);
|
||||
updateRecentFilesMenu();
|
||||
|
||||
|
||||
static const QSet<QString> compressedExts = {"zip", "7z", "rar", "tar", "tar.gz", "tar.xz", "tar.bz2"};
|
||||
if (compressedExts.contains(QFileInfo(filename).completeSuffix()))
|
||||
{
|
||||
@ -1502,13 +1531,7 @@ void MainWindow::onOpenFile()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (filename.isEmpty())
|
||||
{
|
||||
emuThread->emuUnpause();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// TODO: validate the input file!!
|
||||
// * check that it is a proper ROM
|
||||
// * ensure the binary offsets are sane
|
||||
@ -1554,6 +1577,60 @@ void MainWindow::onOpenFile()
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::onOpenFile()
|
||||
{
|
||||
emuThread->emuPause();
|
||||
|
||||
QString filename = QFileDialog::getOpenFileName(this,
|
||||
"Open ROM",
|
||||
Config::LastROMFolder,
|
||||
"DS ROMs (*.nds *.dsi *.srl);;GBA ROMs (*.gba);;Any file (*.*)");
|
||||
if (filename.isEmpty())
|
||||
{
|
||||
emuThread->emuUnpause();
|
||||
return;
|
||||
}
|
||||
|
||||
loadROM(filename);
|
||||
}
|
||||
|
||||
void MainWindow::onClearRecentFiles()
|
||||
{
|
||||
recentFileList.clear();
|
||||
memset(Config::RecentROMList, 0, 10 * 1024);
|
||||
updateRecentFilesMenu();
|
||||
}
|
||||
|
||||
void MainWindow::updateRecentFilesMenu()
|
||||
{
|
||||
recentMenu->clear();
|
||||
|
||||
for(int i = 0; i < recentFileList.size(); ++i)
|
||||
{
|
||||
QAction *actRecentFile_i = recentMenu->addAction(QString("%1. %2").arg(i+1).arg(recentFileList.at(i)));
|
||||
actRecentFile_i->setData(recentFileList.at(i));
|
||||
connect(actRecentFile_i, &QAction::triggered, this, &MainWindow::onClickRecentFile);
|
||||
|
||||
if(i < 10)
|
||||
strncpy(Config::RecentROMList[i], recentFileList.at(i).toStdString().c_str(), 1024);
|
||||
}
|
||||
|
||||
QAction *actClearRecentList = recentMenu->addAction("Clear");
|
||||
connect(actClearRecentList, &QAction::triggered, this, &MainWindow::onClearRecentFiles);
|
||||
|
||||
if(recentFileList.empty())
|
||||
actClearRecentList->setEnabled(false);
|
||||
|
||||
Config::Save();
|
||||
}
|
||||
|
||||
void MainWindow::onClickRecentFile()
|
||||
{
|
||||
emuThread->emuPause();
|
||||
QAction *act = (QAction *)sender();
|
||||
loadROM(act->data().toString());
|
||||
}
|
||||
|
||||
void MainWindow::onBootFirmware()
|
||||
{
|
||||
// TODO: check the whole GBA cart shito
|
||||
|
@ -191,6 +191,8 @@ signals:
|
||||
|
||||
private slots:
|
||||
void onOpenFile();
|
||||
void onClickRecentFile();
|
||||
void onClearRecentFiles();
|
||||
void onBootFirmware();
|
||||
void onSaveState();
|
||||
void onLoadState();
|
||||
@ -236,6 +238,11 @@ private slots:
|
||||
void onFullscreenToggled();
|
||||
|
||||
private:
|
||||
QList<QString> recentFileList;
|
||||
QMenu *recentMenu;
|
||||
void updateRecentFilesMenu();
|
||||
void loadROM(QString filename);
|
||||
|
||||
void createScreenPanel();
|
||||
|
||||
QString loadErrorStr(int error);
|
||||
|
Reference in New Issue
Block a user