integrate stuff from rerecording branch

This commit is contained in:
zeromus 2009-05-02 06:39:08 +00:00
parent 1719e1eb41
commit c52a03f95e
37 changed files with 4559 additions and 336 deletions

View File

@ -3230,7 +3230,7 @@ void gpu_savestate(std::ostream* os)
//version
write32le(0,os);
os->write((char*)GPU_tempScreen,sizeof(GPU_tempScreen));
os->write((char*)GPU_screen,sizeof(GPU_screen));
write32le(MainScreen.gpu->affineInfo[0].x,os);
write32le(MainScreen.gpu->affineInfo[0].y,os);
@ -3242,14 +3242,14 @@ void gpu_savestate(std::ostream* os)
write32le(SubScreen.gpu->affineInfo[1].y,os);
}
bool gpu_loadstate(std::istream* is)
bool gpu_loadstate(std::istream* is, int size)
{
//read version
int version;
if(read32le(&version,is) != 1) return false;
if(version != 0) return false;
is->read((char*)GPU_tempScreen,sizeof(GPU_tempScreen));
is->read((char*)GPU_screen,sizeof(GPU_screen));
read32le(&MainScreen.gpu->affineInfo[0].x,is);
read32le(&MainScreen.gpu->affineInfo[0].y,is);
read32le(&MainScreen.gpu->affineInfo[1].x,is);

View File

@ -36,7 +36,7 @@
#include <iosfwd>
void gpu_savestate(std::ostream* os);
bool gpu_loadstate(std::istream* is);
bool gpu_loadstate(std::istream* is, int size);
/*******************************************************************************
this structure is for display control,

View File

@ -180,7 +180,11 @@ void OSDCLASS::addFixed(u16 x, u16 y, const char *fmt, ...)
if (strcmp(msg, old_msg) == 0) return;
render51.PrintString<DesmumeFont>(1,x,y,render51.MakeColor(128,0,0),msg,&screenshell);
render51.PrintString<DesmumeFont>(1,x-1,y-1,render51.MakeColor(0,0,0),msg,&screenshell);
render51.PrintString<DesmumeFont>(1,x+1,y-1,render51.MakeColor(0,0,0),msg,&screenshell);
render51.PrintString<DesmumeFont>(1,x-1,y+1,render51.MakeColor(0,0,0),msg,&screenshell);
render51.PrintString<DesmumeFont>(1,x+1,y+1,render51.MakeColor(0,0,0),msg,&screenshell);
render51.PrintString<DesmumeFont>(1,x,y,render51.MakeColor(255,255,255),msg,&screenshell);
needUpdate = true;
}

View File

@ -46,6 +46,7 @@
#include "mc.h"
#include "addons.h"
#include "mic.h"
#include "movie.h"
#ifdef DO_ASSERT_UNALIGNED
#define ASSERT_UNALIGNED(x) assert(x)

View File

@ -40,6 +40,7 @@
#include "bios.h"
#include "debug.h"
#include "cheatSystem.h"
#include "movie.h"
#ifdef _WIN32
#include "./windows/disView.h"
@ -844,6 +845,23 @@ int NDS_LoadROM( const char *filename, int bmtype, u32 bmsize,
return ret;
}
void MovieSRAM(int bmtype, u32 bmsize) {
char buf[MAX_PATH];
memset(buf, 0, MAX_PATH);
strcpy(buf, pathFilenameToROMwithoutExt);
strcat(buf, ".sav"); // DeSmuME memory card :)
if(movieMode != MOVIEMODE_INACTIVE) {
strcat(buf, "movie");
}
mc_realloc(&MMU.bupmem, bmtype, bmsize);
mc_load_file(&MMU.bupmem, buf);
}
void NDS_FreeROM(void)
{
if (MMU.CART_ROM != MMU.UNUSED_RAM)
@ -869,6 +887,8 @@ void NDS_Reset(BOOL resetBySavestate)
lastLag=0;
TotalLagFrames=0;
currFrameCounter=0;
MMU_clearMem();
//ARM7 BIOS IRQ HANDLER
@ -1565,10 +1585,9 @@ u32 NDS_exec(s32 nb)
{
int i, j;
//TODO - since NDS_exec is not necessarily called one frame at a time, this could be wrong.
LagFrameFlag=1;
nb = 560190<<1;
nb += nds.cycles;//(nds.cycles>>26)<<26;
LagFrameFlag=1;
//increase this to execute more instructions in each batch (reducing overhead)
//the value of 4 seems to optimize speed.. do lower values increase precision?
@ -2393,23 +2412,30 @@ static std::string MakeInputDisplayString(u16 pad, u16 padExt) {
return s;
}
void ClearAutoHold(void) {
for (int i=0; i < 10; i++) {
AutoHold.hold(i)=false;
}
}
void NDS_setPadFromMovie(u16 pad)
{
#define FIX(b,n) (((pad>>n)&1)!=0)
NDS_setPad(
FIX(pad,0),
FIX(pad,1),
FIX(pad,12), //R
FIX(pad,11), //L
FIX(pad,10), //D
FIX(pad,9), //U
FIX(pad,7), //Select
FIX(pad,8), //Start
FIX(pad,6), //B
FIX(pad,5), //A
FIX(pad,4), //Y
FIX(pad,3), //X
FIX(pad,2),
FIX(pad,3),
FIX(pad,4),
FIX(pad,5),
FIX(pad,6),
FIX(pad,7),
FIX(pad,8),
FIX(pad,9),
FIX(pad,10),
FIX(pad,11),
FIX(pad,12),
FIX(pad,1),
FIX(pad,0),
FIX(pad,13)
);
#undef FIX
@ -2418,12 +2444,12 @@ void NDS_setPadFromMovie(u16 pad)
turbo Turbo;
turbotime TurboTime;
static void SetTurbo(bool (&pad) [10]) {
static void SetTurbo(bool (&pad) [12]) {
bool turbo[4] = {true, false, true, false};
bool currentbutton;
for (int i=0; i < 10; i++) {
for (int i=0; i < 12; i++) {
currentbutton=Turbo.button(i);
if(currentbutton) {
@ -2435,7 +2461,7 @@ static void SetTurbo(bool (&pad) [10]) {
else
TurboTime.time(i)=0; //reset timer if the button isn't pressed
}
for (int i=0; i<10; i++)
for (int i=0; i<12; i++)
TurboTime.time(i)++;
}
@ -2444,7 +2470,7 @@ autohold AutoHold;
void NDS_setPad(bool R,bool L,bool D,bool U,bool T,bool S,bool B,bool A,bool Y,bool X,bool W,bool E,bool G, bool F)
{
bool padarray[10] = {R, L, D, U, T, S, B, A, Y, X};
bool padarray[12] = {R, L, D, U, T, S, B, A, Y, X, W, E};
SetTurbo(padarray);
@ -2458,6 +2484,8 @@ void NDS_setPad(bool R,bool L,bool D,bool U,bool T,bool S,bool B,bool A,bool Y,b
A=padarray[7];
Y=padarray[8];
X=padarray[9];
W=padarray[10];
E=padarray[11];
if(AutoHold.Right) R=!padarray[0];
if(AutoHold.Left) L=!padarray[1];
@ -2556,20 +2584,18 @@ void NDS_setPad(bool R,bool L,bool D,bool U,bool T,bool S,bool B,bool A,bool Y,b
nds.pad =
(FIX(r)<<0)|
(FIX(l)<<1)|
(FIX(d)<<2)|
(FIX(u)<<3)|
(FIX(t)<<4)|
(FIX(s)<<5)|
(FIX(r)<<12)|
(FIX(l)<<11)|
(FIX(d)<<10)|
(FIX(u)<<9)|
(FIX(s)<<8)|
(FIX(t)<<7)|
(FIX(b)<<6)|
(FIX(a)<<7)|
(FIX(y)<<8)|
(FIX(x)<<9)|
(FIX(w)<<10)|
(FIX(e)<<11)|
(FIX(g)<<12)|
(FIX(f)<<13);
(FIX(a)<<5)|
(FIX(y)<<4)|
(FIX(x)<<3)|
(FIX(w)<<2)|
(FIX(e)<<1);
// TODO: low power IRQ
}

View File

@ -45,6 +45,8 @@ struct turbo {
bool A;
bool Y;
bool X;
bool L;
bool R;
bool &button(int i) { return ((bool*)this)[i]; }
};
@ -62,6 +64,8 @@ struct turbotime {
int A;
int Y;
int X;
int L;
int R;
int &time(int i) { return ((int*)this)[i]; }
};
@ -380,6 +384,7 @@ class Driver {
public:
virtual BOOL WIFI_Host_InitSystem() { return FALSE; }
virtual void WIFI_Host_ShutdownSystem() {}
virtual BOOL AVI_IsRecording() { return FALSE; }
};
extern Driver* driver;
@ -387,6 +392,10 @@ extern std::string InputDisplayString;
extern int LagFrameFlag;
extern int lastLag, TotalLagFrames;
void MovieSRAM(int bmtype, u32 bmsize);
void ClearAutoHold(void);
#endif

View File

@ -81,9 +81,6 @@ static ALIGN(16) u8 GPU_screen3D [256*192*4];
static const unsigned short map3d_cull[4] = {GL_FRONT_AND_BACK, GL_FRONT, GL_BACK, 0};
static const int texEnv[4] = { GL_MODULATE, GL_DECAL, GL_MODULATE, GL_MODULATE };
static const int depthFunc[2] = { GL_LESS, GL_EQUAL };
static bool needRefreshFramebuffer = false;
static bool validFramebuffer = false;
//derived values extracted from polyattr etc
static bool wireframe=false, alpha31=false;
@ -342,7 +339,6 @@ static void OGLReset()
// memset(GPU_screenStencil,0,sizeof(GPU_screenStencil));
memset(GPU_screen3D,0,sizeof(GPU_screen3D));
needRefreshFramebuffer = false;
}
@ -678,6 +674,49 @@ static void Control()
}
}
static void GL_ReadFramebuffer()
{
if(!BEGINGL()) return;
glFinish();
// glReadPixels(0,0,256,192,GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, GPU_screenStencil);
glReadPixels(0,0,256,192,GL_BGRA_EXT, GL_UNSIGNED_BYTE, GPU_screen3D);
ENDGL();
//convert the pixels to a different format which is more convenient
//is it safe to modify the screen buffer? if not, we could make a temp copy
for(int i=0,y=191;y>=0;y--)
{
u16* dst = gfx3d_convertedScreen + (y<<8);
u8* dstAlpha = gfx3d_convertedAlpha + (y<<8);
#ifndef NOSSE2
//I dont know much about this kind of stuff, but this seems to help
//for some reason I couldnt make the intrinsics work
u8* wanx = (u8*)&((u32*)GPU_screen3D)[i];
#define ASS(X,Y) __asm { prefetchnta [wanx+32*0x##X##Y] }
#define PUNK(X) ASS(X,0) ASS(X,1) ASS(X,2) ASS(X,3) ASS(X,4) ASS(X,5) ASS(X,6) ASS(X,7) ASS(X,8) ASS(X,9) ASS(X,A) ASS(X,B) ASS(X,C) ASS(X,D) ASS(X,E) ASS(X,F)
PUNK(0); PUNK(1);
#endif
for(int x=0;x<256;x++,i++)
{
u32 &u32screen3D = ((u32*)GPU_screen3D)[i];
u32screen3D>>=3;
u32screen3D &= 0x1F1F1F1F;
const int t = i<<2;
const u8 a = GPU_screen3D[t+3];
const u8 r = GPU_screen3D[t+2];
const u8 g = GPU_screen3D[t+1];
const u8 b = GPU_screen3D[t+0];
dst[x] = R5G5B5TORGB15(r,g,b) | alpha_lookup[a];
dstAlpha[x] = alpha_5bit_to_4bit[a];
}
}
}
static void OGLRender()
{
if(!BEGINGL()) return;
@ -819,10 +858,9 @@ static void OGLRender()
}
}
//since we just redrew, we need to refresh the framebuffers
needRefreshFramebuffer = true;
ENDGL();
GL_ReadFramebuffer();
}
static void OGLVramReconfigureSignal()
@ -830,58 +868,6 @@ static void OGLVramReconfigureSignal()
TexCache_Invalidate();
}
static void GL_ReadFramebuffer()
{
if(!BEGINGL()) return;
glFinish();
// glReadPixels(0,0,256,192,GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, GPU_screenStencil);
glReadPixels(0,0,256,192,GL_BGRA_EXT, GL_UNSIGNED_BYTE, GPU_screen3D);
ENDGL();
//convert the pixels to a different format which is more convenient
//is it safe to modify the screen buffer? if not, we could make a temp copy
for(int i=0,y=191;y>=0;y--)
{
u16* dst = gfx3d_convertedScreen + (y<<8);
u8* dstAlpha = gfx3d_convertedAlpha + (y<<8);
#ifndef NOSSE2
//I dont know much about this kind of stuff, but this seems to help
//for some reason I couldnt make the intrinsics work
u8* wanx = (u8*)&((u32*)GPU_screen3D)[i];
#define ASS(X,Y) __asm { prefetchnta [wanx+32*0x##X##Y] }
#define PUNK(X) ASS(X,0) ASS(X,1) ASS(X,2) ASS(X,3) ASS(X,4) ASS(X,5) ASS(X,6) ASS(X,7) ASS(X,8) ASS(X,9) ASS(X,A) ASS(X,B) ASS(X,C) ASS(X,D) ASS(X,E) ASS(X,F)
PUNK(0); PUNK(1);
#endif
for(int x=0;x<256;x++,i++)
{
u32 &u32screen3D = ((u32*)GPU_screen3D)[i];
u32screen3D>>=3;
u32screen3D &= 0x1F1F1F1F;
const int t = i<<2;
const u8 a = GPU_screen3D[t+3];
const u8 r = GPU_screen3D[t+2];
const u8 g = GPU_screen3D[t+1];
const u8 b = GPU_screen3D[t+0];
dst[x] = R5G5B5TORGB15(r,g,b) | alpha_lookup[a];
dstAlpha[x] = alpha_5bit_to_4bit[a];
}
}
}
static void OGLCheckFresh()
{
if(needRefreshFramebuffer)
{
needRefreshFramebuffer = false;
GL_ReadFramebuffer();
}
}
GPU3DInterface gpu3Dgl = {
"OpenGL",
OGLInit,
@ -889,5 +875,4 @@ GPU3DInterface gpu3Dgl = {
OGLClose,
OGLRender,
OGLVramReconfigureSignal,
OGLCheckFresh,
};

View File

@ -32,6 +32,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "mem.h"
#include "readwrite.h"
#include "armcpu.h"
#include "NDSSystem.h"
SPU_struct *SPU_core = 0;
SPU_struct *SPU_user = 0;
@ -1034,7 +1035,10 @@ void SPU_Emulate_core()
spu_core_samples = (int)(samples);
samples -= spu_core_samples;
SPU_MixAudio<false>(SPU_core,spu_core_samples);
if(driver->AVI_IsRecording())
SPU_MixAudio<true>(SPU_core,spu_core_samples);
else
SPU_MixAudio<false>(SPU_core,spu_core_samples);
}
void SPU_Emulate_user()
@ -1300,7 +1304,7 @@ void spu_savestate(std::ostream* os)
}
}
bool spu_loadstate(std::istream* is)
bool spu_loadstate(std::istream* is, int size)
{
//read version
int version;

View File

@ -112,6 +112,6 @@ extern SPU_struct *SPU_core, *SPU_user;
extern int spu_core_samples;
void spu_savestate(std::ostream* os);
bool spu_loadstate(std::istream* is);
bool spu_loadstate(std::istream* is, int size);
#endif

View File

@ -183,7 +183,7 @@ static u32 lightColor[4] = {0,0,0,0};
static u32 lightDirection[4] = {0,0,0,0};
//material state:
static u16 dsDiffuse, dsAmbient, dsSpecular, dsEmission;
/* Shininess */
// Shininess
static float shininessTable[128] = {0};
static int shininessInd = 0;
@ -315,6 +315,9 @@ void gfx3d_reset()
last_t = 0;
last_s = 0;
viewport = 0xBFFF0000;
memset(gfx3d_convertedScreen,0,sizeof(gfx3d_convertedScreen));
memset(gfx3d_convertedAlpha,0,sizeof(gfx3d_convertedAlpha));
GFX_FIFOclear();
}
@ -1470,6 +1473,13 @@ void gfx3d_VBlankEndSignal(bool skipFrame)
drawPending = FALSE;
gpu3D->NDS_3D_Render();
//if the null 3d core is chosen, then we need to clear out the 3d buffers to keep old data from being rendered
if(gpu3D == &gpu3DNull)
{
memset(gfx3d_convertedScreen,0,sizeof(gfx3d_convertedScreen));
memset(gfx3d_convertedScreen,0,sizeof(gfx3d_convertedAlpha));
}
}
#ifdef USE_GEOMETRY_FIFO_EMULATION
@ -2221,7 +2231,6 @@ void gfx3d_glGetLightColor(unsigned int index, unsigned int* dest)
void gfx3d_GetLineData(int line, u16** dst, u8** dstAlpha)
{
gpu3D->NDS_3D_CheckFresh();
*dst = gfx3d_convertedScreen+((line)<<8);
if(dstAlpha != NULL)
{
@ -2286,11 +2295,6 @@ SFORMAT SF_GFX3D[]={
{ "GMAM", 2, 1, &dsAmbient},
{ "GMSP", 2, 1, &dsSpecular},
{ "GMEM", 2, 1, &dsEmission},
{ "GTST", 4, 1, &triStripToggle},
{ "GTVC", 4, 1, &tempVertInfo.count},
{ "GTVM", 4, 4, &tempVertInfo.map[0]},
{ "GTVF", 4, 1, &tempVertInfo.first},
{ "GLTW", 4, 1, &listTwiddle},
{ "GFLP", 4, 1, &flushPending},
{ "GDRP", 4, 1, &drawPending},
{ "GSET", 4, 1, &gfx3d.enableTexturing},
@ -2310,6 +2314,13 @@ SFORMAT SF_GFX3D[]={
{ "GSTT", 4, 32, gfx3d.rgbToonTable},
{ "GSST", 4, 128, shininessTable},
{ "GSSI", 4, 1, &shininessInd},
//------------------------
{ "GTST", 4, 1, &triStripToggle},
{ "GTVC", 4, 1, &tempVertInfo.count},
{ "GTVM", 4, 4, tempVertInfo.map},
{ "GTVF", 4, 1, &tempVertInfo.first},
{ "G3CS", 2, 256*192, gfx3d_convertedScreen},
{ "G3CA", 2, 256*192, gfx3d_convertedAlpha},
{ 0 }
};
@ -2317,10 +2328,15 @@ SFORMAT SF_GFX3D[]={
void gfx3d_savestate(std::ostream* os)
{
//dump the render lists
//TODO!!!!
OSWRITE(vertlist->count);
for(int i=0;i<vertlist->count;i++)
vertlist->list[i].save(os);
OSWRITE(polylist->count);
for(int i=0;i<polylist->count;i++)
polylist->list[i].save(os);
}
bool gfx3d_loadstate(std::istream* is)
bool gfx3d_loadstate(std::istream* is, int size)
{
gfx3d_glPolygonAttrib_cache();
gfx3d_glTexImage_cache();
@ -2331,14 +2347,21 @@ bool gfx3d_loadstate(std::istream* is)
gfx3d_glLightDirection_cache(3);
//jiggle the lists. and also wipe them. this is clearly not the best thing to be doing.
listTwiddle = 0;
polylist = &polylists[listTwiddle];
vertlist = &vertlists[listTwiddle];
polylist->count = 0;
vertlist->count = 0;
OSREAD(vertlist->count);
for(int i=0;i<vertlist->count;i++)
vertlist->list[i].load(is);
OSREAD(polylist->count);
for(int i=0;i<polylist->count;i++)
polylist->list[i].load(is);
gfx3d.polylist = &polylists[listTwiddle^1];
gfx3d.vertlist = &vertlists[listTwiddle^1];
gfx3d.polylist->count=0;
gfx3d.vertlist->count=0;
return true;
}
}

View File

@ -26,6 +26,8 @@
#include "types.h"
#include <iosfwd>
#include <ostream>
#include <istream>
//produce a 32bpp color from a DS RGB16
#define RGB16TO32(col,alpha) (((alpha)<<24) | ((((col) & 0x7C00)>>7)<<16) | ((((col) & 0x3E0)>>2)<<8) | (((col) & 0x1F)<<3))
@ -68,8 +70,6 @@ struct POLY {
int type; //tri or quad
u16 vertIndexes[4]; //up to four verts can be referenced by this poly
u32 polyAttr, texParam, texPalette; //the hardware rendering params
// int projIndex; //the index into the projlist that this poly uses
u32 pad;
u32 viewport;
float miny, maxy;
@ -88,6 +88,26 @@ struct POLY {
}
int getAlpha() { return (polyAttr>>16)&0x1F; }
void save(std::ostream* os)
{
OSWRITE(type);
OSWRITE(vertIndexes[0]); OSWRITE(vertIndexes[1]); OSWRITE(vertIndexes[2]); OSWRITE(vertIndexes[3]);
OSWRITE(polyAttr); OSWRITE(texParam); OSWRITE(texPalette);
OSWRITE(viewport);
OSWRITE(miny);
OSWRITE(maxy);
}
void load(std::istream* is)
{
OSREAD(type);
OSREAD(vertIndexes[0]); OSREAD(vertIndexes[1]); OSREAD(vertIndexes[2]); OSREAD(vertIndexes[3]);
OSREAD(polyAttr); OSREAD(texParam); OSREAD(texPalette);
OSREAD(viewport);
OSREAD(miny);
OSREAD(maxy);
}
};
#define POLYLIST_SIZE 100000
@ -117,6 +137,20 @@ struct VERT {
fcolor[1] = color[1];
fcolor[2] = color[2];
}
void save(std::ostream* os)
{
OSWRITE(x); OSWRITE(y); OSWRITE(z); OSWRITE(w);
OSWRITE(u); OSWRITE(v);
OSWRITE(color[0]); OSWRITE(color[1]); OSWRITE(color[2]);
OSWRITE(fcolor[0]); OSWRITE(fcolor[1]); OSWRITE(fcolor[2]);
}
void load(std::istream* is)
{
OSREAD(x); OSREAD(y); OSREAD(z); OSREAD(w);
OSREAD(u); OSREAD(v);
OSREAD(color[0]); OSREAD(color[1]); OSREAD(color[2]);
OSREAD(fcolor[0]); OSREAD(fcolor[1]); OSREAD(fcolor[2]);
}
};
#define VERTLIST_SIZE 400000
@ -267,6 +301,6 @@ void gfx3d_GetLineData(int line, u16** dst, u8** dstAlpha);
struct SFORMAT;
extern SFORMAT SF_GFX3D[];
void gfx3d_savestate(std::ostream* os);
bool gfx3d_loadstate(std::istream* is);
bool gfx3d_loadstate(std::istream* is, int size);
#endif

View File

@ -23,6 +23,7 @@
#include "debug.h"
#include "types.h"
#include "mc.h"
#include "movie.h"
#define FW_CMD_READ 0x3
#define FW_CMD_WRITEDISABLE 0x4
@ -207,9 +208,16 @@ void mc_load_file(memory_chip_t *mc, const char* filename)
{
long size;
int type = -1;
FILE* file = fopen(filename, "rb+");
FILE* file;
size_t elems_read;
if(movieMode != MOVIEMODE_INACTIVE) {
mc->filename = strdup(filename);
return;
}
else
file = fopen(filename, "rb+");
if(file == NULL)
{
mc->filename = strdup(filename);

View File

@ -1,6 +1,6 @@
/* movie.cpp
*
* Copyright (C) 2006-2008 Zeromus
* Copyright (C) 2006-2009 DeSmuME team
*
* This file is part of DeSmuME
*
@ -22,14 +22,18 @@
#include <assert.h>
#include <limits.h>
#include <fstream>
#include "main.h"
#include "utils/guid.h"
#include "utils/xstring.h"
#include "movie.h"
#include "NDSSystem.h"
#include "readwrite.h"
#include "debug.h"
#include "rtc.h"
using namespace std;
bool freshMovie = false; //True when a movie loads, false when movie is altered. Used to determine if a movie has been altered since opening
bool autoMovieBackup = true;
#define FCEU_PrintError LOG
@ -189,6 +193,8 @@ void MovieData::installValue(std::string& key, std::string& val)
guid = Desmume_Guid::fromString(val);
else if(key == "comment")
comments.push_back(mbstowcs(val));
else if(key == "binary")
installBool(val,binaryFlag);
else if(key == "savestate")
{
int len = Base64StringToBytesLength(val);
@ -222,10 +228,10 @@ int MovieData::dump(std::ostream *os, bool binary)
*os << "savestate " << BytesToString(&savestate[0],savestate.size()) << endl;
if(binary)
{
////put one | to start the binary dump
//os->put('|');
//for(int i=0;i<(int)records.size();i++)
// records[i].dumpBinary(this,os,i);
//put one | to start the binary dump
os->put('|');
for(int i=0;i<(int)records.size();i++)
records[i].dumpBinary(this,os,i);
}
else
for(int i=0;i<(int)records.size();i++)
@ -268,8 +274,8 @@ static bool LoadFM2(MovieData& movieData, std::istream* fp, int size, bool stopA
isnewline = (c==10||c==13);
if(isrecchar && movieData.binaryFlag && !stopAfterHeader)
{
//LoadFM2_binarychunk(movieData, fp, size);
return false;
LoadFM2_binarychunk(movieData, fp, size);
return true;
}
switch(state)
{
@ -349,7 +355,7 @@ static void closeRecordingMovie()
/// Stop movie playback.
static void StopPlayback()
{
//FCEU_DispMessageOnMovie("Movie playback stopped.");
SetMessageToDisplay("Movie playback stopped.");
movieMode = MOVIEMODE_INACTIVE;
}
@ -357,8 +363,7 @@ static void StopPlayback()
/// Stop movie recording
static void StopRecording()
{
//FCEU_DispMessage("Movie recording stopped.");
SetMessageToDisplay("Movie recording stopped.");
movieMode = MOVIEMODE_INACTIVE;
closeRecordingMovie();
@ -366,7 +371,7 @@ static void StopRecording()
static void FCEUI_StopMovie()
void FCEUI_StopMovie()
{
//if(suppressMovieStop)
// return;
@ -377,11 +382,12 @@ static void FCEUI_StopMovie()
StopRecording();
curMovieFilename[0] = 0;
freshMovie = false;
}
//begin playing an existing movie
static void FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe)
void FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe)
{
//if(!tasedit && !FCEU_IsValidUI(FCEUI_PLAYMOVIE))
// return;
@ -416,6 +422,7 @@ static void FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, in
//fully reload the game to reinitialize everything before playing any movie
//poweron(true);
NDS_Reset();
////WE NEED TO LOAD A SAVESTATE
//if(currMovieData.savestate.size() != 0)
//{
@ -428,11 +435,15 @@ static void FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, in
movie_readonly = _read_only;
movieMode = MOVIEMODE_PLAY;
currRerecordCount = currMovieData.rerecordCount;
InitMovieTime();
MovieSRAM(backupmemorytype, backupmemorysize);
freshMovie = true;
ClearAutoHold();
//if(movie_readonly)
// FCEU_DispMessage("Replay started Read-Only.");
//else
// FCEU_DispMessage("Replay started Read+Write.");
if(movie_readonly)
SetMessageToDisplay("Replay started Read-Only.");
else
SetMessageToDisplay("Replay started Read+Write.");
}
static void openRecordingMovie(const char* fname)
@ -447,7 +458,7 @@ static void openRecordingMovie(const char* fname)
//begin recording a new movie
//TODO - BUG - the record-from-another-savestate doesnt work.
static void FCEUI_SaveMovie(const char *fname, std::wstring author)
void FCEUI_SaveMovie(const char *fname, std::wstring author)
{
//if(!FCEU_IsValidUI(FCEUI_RECORDMOVIE))
// return;
@ -468,6 +479,7 @@ static void FCEUI_SaveMovie(const char *fname, std::wstring author)
//currMovieData.romChecksum = GameInfo->MD5;
//currMovieData.romFilename = FileBase;
NDS_Reset();
//todo ?
//poweron(true);
//else
@ -479,81 +491,109 @@ static void FCEUI_SaveMovie(const char *fname, std::wstring author)
movieMode = MOVIEMODE_RECORD;
movie_readonly = false;
currRerecordCount = 0;
InitMovieTime();
MovieSRAM(backupmemorytype, backupmemorysize);
//FCEU_DispMessage("Movie recording started.");
SetMessageToDisplay("Movie recording started.");
}
void NDS_setTouchFromMovie(void) {
//the main interaction point between the emulator and the movie system.
//either dumps the current joystick state or loads one state from the movie
static void FCEUMOV_AddInputState()
{
//todo - for tasedit, either dump or load depending on whether input recording is enabled
//or something like that
//(input recording is just like standard read+write movie recording with input taken from gamepad)
//otherwise, it will come from the tasedit data.
if(movieMode == MOVIEMODE_PLAY)
{
if(movieMode == MOVIEMODE_PLAY)
{
//stop when we run out of frames
if(currFrameCounter == (int)currMovieData.records.size())
{
StopPlayback();
}
else
{
MovieRecord* mr = &currMovieData.records[currFrameCounter];
//reset if necessary
if(mr->command_reset())
{}
//ResetNES();
MovieRecord* mr = &currMovieData.records[currFrameCounter];
nds.touchX=mr->touch.x << 4;
nds.touchY=mr->touch.y << 4;
NDS_setPadFromMovie(mr->pad);
}
if(mr->touch.touch) {
nds.isTouch=mr->touch.touch;
MMU.ARM7_REG[0x136] &= 0xBF;
}
else {
nds.touchX=0;
nds.touchY=0;
nds.isTouch=0;
//if we are on the last frame, then pause the emulator if the player requested it
if(currFrameCounter == (int)currMovieData.records.size()-1)
{
/*if(FCEUD_PauseAfterPlayback())
{
FCEUI_ToggleEmulationPause();
}*/
}
MMU.ARM7_REG[0x136] |= 0x40;
}
osd->addFixed(mr->touch.x, mr->touch.y, "%s", "X");
}
}
//pause the movie at a specified frame
//if(FCEUMOV_ShouldPause() && FCEUI_EmulationPaused()==0)
//{
// FCEUI_ToggleEmulationPause();
// FCEU_DispMessage("Paused at specified movie frame");
//}
}
else if(movieMode == MOVIEMODE_RECORD)
{
MovieRecord mr;
//the main interaction point between the emulator and the movie system.
//either dumps the current joystick state or loads one state from the movie
void FCEUMOV_AddInputState()
{
//todo - for tasedit, either dump or load depending on whether input recording is enabled
//or something like that
//(input recording is just like standard read+write movie recording with input taken from gamepad)
//otherwise, it will come from the tasedit data.
mr.commands = 0;
mr.pad = nds.pad;
if(nds.isTouch) {
mr.touch.x = nds.touchX;
mr.touch.y = nds.touchY;
mr.touch.touch = 1;
} else {
mr.touch.x = 0;
mr.touch.y = 0;
mr.touch.touch = 0;
}
if(movieMode == MOVIEMODE_PLAY)
{
//stop when we run out of frames
if(currFrameCounter == (int)currMovieData.records.size())
{
StopPlayback();
}
else
{
MovieRecord* mr = &currMovieData.records[currFrameCounter];
mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size());
currMovieData.records.push_back(mr);
}
//reset if necessary
if(mr->command_reset())
{}
//ResetNES();
currFrameCounter++;
NDS_setPadFromMovie(mr->pad);
NDS_setTouchFromMovie();
}
/*extern uint8 joy[4];
memcpy(&cur_input_display,joy,4);*/
}
//if we are on the last frame, then pause the emulator if the player requested it
if(currFrameCounter == (int)currMovieData.records.size()-1)
{
/*if(FCEUD_PauseAfterPlayback())
{
FCEUI_ToggleEmulationPause();
}*/
}
//pause the movie at a specified frame
//if(FCEUMOV_ShouldPause() && FCEUI_EmulationPaused()==0)
//{
// FCEUI_ToggleEmulationPause();
// FCEU_DispMessage("Paused at specified movie frame");
//}
osd->addFixed(180, 176, "%s", "Playback");
}
else if(movieMode == MOVIEMODE_RECORD)
{
MovieRecord mr;
mr.commands = 0;
mr.pad = nds.pad;
if(nds.isTouch) {
mr.touch.x = nds.touchX >> 4;
mr.touch.y = nds.touchY >> 4;
mr.touch.touch = 1;
} else {
mr.touch.x = 0;
mr.touch.y = 0;
mr.touch.touch = 0;
}
mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size());
currMovieData.records.push_back(mr);
osd->addFixed(180, 176, "%s", "Recording");
}
currFrameCounter++;
/*extern uint8 joy[4];
memcpy(&cur_input_display,joy,4);*/
}
//TODO
@ -570,38 +610,60 @@ static void FCEUMOV_AddCommand(int cmd)
}
static int FCEUMOV_WriteState(std::ostream* os)
void mov_savestate(std::ostream* os)
{
//we are supposed to dump the movie data into the savestate
//if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY)
// return currMovieData.dump(os, true);
//else return 0;
if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY)
return currMovieData.dump(os, true);
else return 0;
{
write32le('MOVI',os);
currMovieData.dump(os, true);
}
else
{
write32le('NOMO',os);
}
}
//TODO EVERYTHING BELOW
static bool load_successful;
static bool FCEUMOV_ReadState(std::istream* is, uint32 size)
bool mov_loadstate(std::istream* is, int size)
{
load_successful = false;
int cookie;
if(read32le(&cookie,is) != 1) return false;
if(cookie == 'NOMO')
return true;
else if(cookie != 'MOVI')
return false;
size -= 4;
if (!movie_readonly && autoMovieBackup && freshMovie) //If auto-backup is on, movie has not been altered this session and the movie is in read+write mode
{
FCEUI_MakeBackupMovie(false); //Backup the movie before the contents get altered, but do not display messages
}
//a little rule: cant load states in read+write mode with a movie from an archive.
//so we are going to switch it to readonly mode in that case
if(!movie_readonly
//*&& FCEU_isFileInArchive(curMovieFilename)*/
) {
FCEU_PrintError("Cannot loadstate in Read+Write with movie from archive. Movie is now Read-Only.");
movie_readonly = true;
}
// if(!movie_readonly
// //*&& FCEU_isFileInArchive(curMovieFilename)*/
// ) {
// FCEU_PrintError("Cannot loadstate in Read+Write with movie from archive. Movie is now Read-Only.");
// movie_readonly = true;
// }
MovieData tempMovieData = MovieData();
std::ios::pos_type curr = is->tellg();
if(!LoadFM2(tempMovieData, is, size, false)) {
/*is->seekg((uint32)curr+size);
extern bool FCEU_state_loading_old_format;
// is->seekg((uint32)curr+size);
/* extern bool FCEU_state_loading_old_format;
if(FCEU_state_loading_old_format) {
if(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_RECORD) {
FCEUI_StopMovie();
@ -652,12 +714,29 @@ static bool FCEUMOV_ReadState(std::istream* is, uint32 size)
if(movie_readonly)
{
//-------------------------------------------------------------
//this code would reload the movie from disk. allegedly it is helpful to hexers, but
//it is way too slow with dsm format. so it is only here as a reminder, and in case someone
//wants to play with it
//-------------------------------------------------------------
//{
// fstream fs (curMovieFilename);
// if(!LoadFM2(tempMovieData, &fs, INT_MAX, false))
// {
// FCEU_PrintError("Failed to reload DSM after loading savestate");
// }
// fs.close();
// currMovieData = tempMovieData;
//}
//-------------------------------------------------------------
//if the frame counter is longer than our current movie, then error
if(currFrameCounter > (int)currMovieData.records.size())
{
FCEU_PrintError("Savestate is from a frame (%d) after the final frame in the movie (%d). This is not permitted.", currFrameCounter, currMovieData.records.size()-1);
return false;
}
movieMode = MOVIEMODE_PLAY;
}
else
@ -666,10 +745,10 @@ static bool FCEUMOV_ReadState(std::istream* is, uint32 size)
tempMovieData.truncateAt(currFrameCounter);
currMovieData = tempMovieData;
#ifdef _S9XLUA_H
if(!FCEU_LuaRerecordCountSkip())
// #ifdef _S9XLUA_H
// if(!FCEU_LuaRerecordCountSkip())
currRerecordCount++;
#endif
// #endif
currMovieData.rerecordCount = currRerecordCount;
@ -680,6 +759,7 @@ static bool FCEUMOV_ReadState(std::istream* is, uint32 size)
}
load_successful = true;
freshMovie = false;
//// Maximus: Show the last input combination entered from the
//// movie within the state
@ -722,3 +802,137 @@ bool FCEUI_MovieGetInfo(std::istream* fp, MOVIE_INFO& info, bool skipFrameCount)
return true;
}
bool MovieRecord::parseBinary(MovieData* md, std::istream* is)
{
commands=is->get();
is->read((char *) &pad, sizeof pad);
is->read((char *) &touch.x, sizeof touch.x);
is->read((char *) &touch.y, sizeof touch.y);
is->read((char *) &touch.touch, sizeof touch.touch);
return true;
}
void MovieRecord::dumpBinary(MovieData* md, std::ostream* os, int index)
{
os->put(md->records[index].commands);
os->write((char *) &md->records[index].pad, sizeof md->records[index].pad);
os->write((char *) &md->records[index].touch.x, sizeof md->records[index].touch.x);
os->write((char *) &md->records[index].touch.y, sizeof md->records[index].touch.y);
os->write((char *) &md->records[index].touch.touch, sizeof md->records[index].touch.touch);
}
void LoadFM2_binarychunk(MovieData& movieData, std::istream* fp, int size)
{
int recordsize = 1; //1 for the command
recordsize = 6;
assert(size%6==0);
//find out how much remains in the file
int curr = fp->tellg();
fp->seekg(0,std::ios::end);
int end = fp->tellg();
int flen = end-curr;
fp->seekg(curr,std::ios::beg);
//the amount todo is the min of the limiting size we received and the remaining contents of the file
int todo = std::min(size, flen);
int numRecords = todo/recordsize;
movieData.records.resize(numRecords);
for(int i=0;i<numRecords;i++)
{
movieData.records[i].parseBinary(&movieData,fp);
}
}
#include <sstream>
bool CheckFileExists(const char* filename)
{
//This function simply checks to see if the given filename exists
string checkFilename;
if (filename)
checkFilename = filename;
//Check if this filename exists
fstream test;
test.open(checkFilename.c_str(),fstream::in);
if (test.fail())
{
test.close();
return false;
}
else
{
test.close();
return true;
}
}
void FCEUI_MakeBackupMovie(bool dispMessage)
{
//This function generates backup movie files
string currentFn; //Current movie fillename
string backupFn; //Target backup filename
string tempFn; //temp used in back filename creation
stringstream stream;
int x; //Temp variable for string manip
bool exist = false; //Used to test if filename exists
bool overflow = false; //Used for special situation when backup numbering exceeds limit
currentFn = curMovieFilename; //Get current moviefilename
backupFn = curMovieFilename; //Make backup filename the same as current moviefilename
x = backupFn.find_last_of("."); //Find file extension
backupFn = backupFn.substr(0,x); //Remove extension
tempFn = backupFn; //Store the filename at this point
for (unsigned int backNum=0;backNum<999;backNum++) //999 = arbituary limit to backup files
{
stream.str(""); //Clear stream
if (backNum > 99)
stream << "-" << backNum; //assign backNum to stream
else if (backNum <=99 && backNum >= 10)
stream << "-0"; //Make it 010, etc if two digits
else
stream << "-00" << backNum; //Make it 001, etc if single digit
backupFn.append(stream.str()); //add number to bak filename
backupFn.append(".bak"); //add extension
exist = CheckFileExists(backupFn.c_str()); //Check if file exists
if (!exist)
break; //Yeah yeah, I should use a do loop or something
else
{
backupFn = tempFn; //Before we loop again, reset the filename
if (backNum == 999) //If 999 exists, we have overflowed, let's handle that
{
backupFn.append("-001.bak"); //We are going to simply overwrite 001.bak
overflow = true; //Flag that we have exceeded limit
break; //Just in case
}
}
}
MovieData md = currMovieData; //Get current movie data
std::fstream* outf = new fstream(backupFn.c_str(),std::ios_base::out); //FCEUD_UTF8_fstream(backupFn, "wb"); //open/create file
md.dump(outf,false); //dump movie data
delete outf; //clean up, delete file object
//TODO, decide if fstream successfully opened the file and print error message if it doesn't
if (dispMessage) //If we should inform the user
{
// if (overflow)
// FCEUI_DispMessage("Backup overflow, overwriting %s",backupFn.c_str()); //Inform user of overflow
// else
// FCEUI_DispMessage("%s created",backupFn.c_str()); //Inform user of backup filename
}
}

View File

@ -21,6 +21,7 @@ typedef struct
std::string name_of_rom_used;
std::vector<std::wstring> comments;
std::vector<std::string> subtitles;
} MOVIE_INFO;
enum EMOVIEMODE
@ -88,12 +89,12 @@ public:
void clear();
//a waste of memory in lots of cases.. maybe make it a pointer later?
std::vector<char> savestate;
//std::vector<char> savestate;
void parse(MovieData* md, std::istream* is);
//bool parseBinary(MovieData* md, std::istream* is);
bool parseBinary(MovieData* md, std::istream* is);
void dump(MovieData* md, std::ostream* os, int index);
//void dumpBinary(MovieData* md, std::ostream* os, int index);
void dumpBinary(MovieData* md, std::ostream* os, int index);
void parsePad(std::istream* is, u16& pad);
void dumpPad(std::ostream* os, u16 pad);
@ -178,6 +179,19 @@ private:
}
};
bool FCEUI_MovieGetInfo(std::istream* fp, MOVIE_INFO& info, bool skipFrameCount);
extern int currFrameCounter;
extern EMOVIEMODE movieMode; //adelikat: main needs this for frame counter display
extern MovieData currMovieData; //adelikat: main needs this for frame counter display
bool FCEUI_MovieGetInfo(std::istream* fp, MOVIE_INFO& info, bool skipFrameCount);
void FCEUI_SaveMovie(const char *fname, std::wstring author);
void FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe);
void FCEUI_StopMovie();
void FCEUMOV_AddInputState();
void NDS_setTouchFromMovie(void);
void mov_savestate(std::ostream* os);
bool mov_loadstate(std::istream* is, int size);
void LoadFM2_binarychunk(MovieData& movieData, std::istream* fp, int size);
extern bool movie_readonly;
void FCEUI_MakeBackupMovie(bool dispMessage);
#endif

View File

@ -930,7 +930,6 @@ static char SoftRastInit(void)
}
static void SoftRastReset() {
validFramebuffer = false;
}
static void SoftRastClose()
@ -968,15 +967,6 @@ static void SoftRastConvertFramebuffer()
dstAlpha[i] = alpha_5bit_to_4bit[a];
}
}
validFramebuffer = true;
}
static void SoftRastCheckFresh()
{
if(!validFramebuffer)
{
SoftRastConvertFramebuffer();
}
}
static struct TClippedPoly
@ -1295,6 +1285,7 @@ static void SoftRastRender()
validFramebuffer = false;
// printf("rendered %d of %d polys after backface culling\n",gfx3d.polylist->count-culled,gfx3d.polylist->count);
SoftRastConvertFramebuffer();
}
GPU3DInterface gpu3DRasterize = {
@ -1304,5 +1295,4 @@ GPU3DInterface gpu3DRasterize = {
SoftRastClose,
SoftRastRender,
SoftRastVramReconfigureSignal,
SoftRastCheckFresh,
};

View File

@ -32,7 +32,6 @@ GPU3DInterface gpu3DNull = {
NDS_nullFunc1, //NDS_3D_Close
NDS_nullFunc1, //NDS_3D_Render
NDS_nullFunc1, //NDS_3D_VramReconfigureSignal
NDS_nullFunc1, //NDS_3D_CheckFresh
};
GPU3DInterface *gpu3D = &gpu3DNull;

View File

@ -46,9 +46,6 @@ typedef struct Render3DInterface
//called when the emulator reconfigures its vram. you may need to invalidate your texture cache.
void (CALL_CONVENTION* NDS_3D_VramReconfigureSignal) ();
//ensures that the plugin's framebuffer generation is fresh
void (CALL_CONVENTION* NDS_3D_CheckFresh) ();
} GPU3DInterface;
extern int cur3DCore;

View File

@ -33,6 +33,7 @@
#ifdef WIN32
#include "windows/main.h"
#endif
#include "movie.h"
typedef struct
{
@ -81,24 +82,26 @@ struct movietime movie;
int oldframeCounter;
u64 totalcycles=2904024960000ULL;//noon
int totalseconds;
bool init=false;
bool moviemode=false;
#ifdef WIN32
static void MovieTime(void) {
if(!init) {
void InitMovieTime(void) {
movie.year=9;
movie.month=1;
movie.monthday=1;
movie.weekday=4;
oldframeCounter=0;
init=true;
}
if(frameCounter > oldframeCounter) {
}
#ifdef WIN32
static void MovieTime(void) {
if(currFrameCounter > oldframeCounter) {
int difference;
difference=frameCounter-oldframeCounter;
oldframeCounter=frameCounter;
difference=currFrameCounter-oldframeCounter;
oldframeCounter=currFrameCounter;
totalcycles+=((560190<<1)*difference);
}
@ -143,7 +146,7 @@ static void rtcRecv()
tm_local->tm_year %= 100;
tm_local->tm_mon++;
if(moviemode) {
if(movieMode != MOVIEMODE_INACTIVE) {
MovieTime();
@ -177,7 +180,7 @@ static void rtcRecv()
time(&tm);
struct tm *tm_local= localtime(&tm);
if(moviemode) {
if(movieMode != MOVIEMODE_INACTIVE) {
MovieTime();

View File

@ -30,4 +30,6 @@
extern void rtcInit();
extern u16 rtcRead();
extern void rtcWrite(u16 val);
void InitMovieTime(void);
#endif

View File

@ -36,6 +36,8 @@
#include "memorystream.h"
#include "readwrite.h"
#include "gfx3d.h"
#include "movie.h"
#include "windows/main.h"
//void*v is actually a void** which will be indirected before reading
@ -129,8 +131,8 @@ SFORMAT SF_ARM9[]={
};
SFORMAT SF_MEM[]={
{ "ITCM", 1, 0x8000, ARM9Mem.ARM9_ITCM},
{ "DTCM", 1, 0x4000, ARM9Mem.ARM9_DTCM},
{ "ITCM", 1, sizeof(ARM9Mem.ARM9_ITCM), ARM9Mem.ARM9_ITCM},
{ "DTCM", 1, sizeof(ARM9Mem.ARM9_DTCM), ARM9Mem.ARM9_DTCM},
//for legacy purposes, WRAX is a separate variable. shouldnt be a problem.
{ "WRAM", 1, 0x400000, ARM9Mem.MAIN_MEM},
@ -141,9 +143,9 @@ SFORMAT SF_MEM[]={
//but there are actually no more registers than this
{ "9REG", 1, 0x2000, ARM9Mem.ARM9_REG},
{ "VMEM", 1, 0x800, ARM9Mem.ARM9_VMEM},
{ "OAMS", 1, 0x800, ARM9Mem.ARM9_OAM},
{ "LCDM", 1, 0xA4000, ARM9Mem.ARM9_LCD},
{ "VMEM", 1, sizeof(ARM9Mem.ARM9_VMEM), ARM9Mem.ARM9_VMEM},
{ "OAMS", 1, sizeof(ARM9Mem.ARM9_OAM), ARM9Mem.ARM9_OAM},
{ "LCDM", 1, sizeof(ARM9Mem.ARM9_LCD), ARM9Mem.ARM9_LCD},
{ 0 }
};
@ -169,15 +171,12 @@ extern u32 DMASrc[2][4];
extern u32 DMADst[2][4];
SFORMAT SF_MMU[]={
{ "M7BI", 1, 0x4000, MMU.ARM7_BIOS},
{ "M7ER", 1, 0x10000, MMU.ARM7_ERAM},
{ "M7RG", 1, 0x10000, MMU.ARM7_REG},
{ "M7WI", 1, 0x10000, MMU.ARM7_WIRAM},
{ "MVRM", 1, 4, MMU.VRAM_MAP},
{ "MVRM", 4, 9, MMU.LCD_VRAM_ADDR},
{ "MVRM", 1, 9, MMU.LCDCenable},
{ "MSWI", 1, 0x8000, MMU.SWIRAM},
{ "MCRA", 1, 0x10000, MMU.CART_RAM},
{ "M7BI", 1, sizeof(MMU.ARM7_BIOS), MMU.ARM7_BIOS},
{ "M7ER", 1, sizeof(MMU.ARM7_ERAM), MMU.ARM7_ERAM},
{ "M7RG", 1, sizeof(MMU.ARM7_REG), MMU.ARM7_REG},
{ "M7WI", 1, sizeof(MMU.ARM7_WIRAM), MMU.ARM7_WIRAM},
{ "MSWI", 1, sizeof(MMU.SWIRAM), MMU.SWIRAM},
{ "MCRA", 1, sizeof(MMU.CART_RAM), MMU.CART_RAM},
{ "M9RW", 1, 1, &MMU.ARM9_RW_MODE},
{ "MDTC", 4, 1, &MMU.DTCMRegion},
{ "MITC", 4, 1, &MMU.ITCMRegion},
@ -229,37 +228,46 @@ SFORMAT SF_MMU[]={
//fifos
{ "F0TL", 1, 1, &ipc_fifo[0].tail},
{ "F0BF", 4, 16, &ipc_fifo[0].buf[0]},
{ "F0BF", 4, 16, ipc_fifo[0].buf},
{ "F1TL", 1, 1, &ipc_fifo[1].tail},
{ "F1BF", 4, 16, &ipc_fifo[1].buf[0]},
{ "F1BF", 4, 16, ipc_fifo[1].buf},
{ "FDHD", 4, 1, &disp_fifo.head},
{ "FDTL", 4, 1, &disp_fifo.tail},
{ "FDBF", 4, 0x6000, &disp_fifo.buf[0]},
{ "FDBF", 4, 0x6000, disp_fifo.buf},
{ 0 }
};
SFORMAT SF_MOVIE[]={
{ "FRAC", 4, 1, &currFrameCounter},
{ "LAGC", 4, 1, &TotalLagFrames},
{ 0 }
};
static void mmu_savestate(std::ostream* os)
{
//version
write32le(0,os);
write32le(MMU.bupmem.type,os);
write32le(MMU.bupmem.size,os);
os->write((char*)MMU.bupmem.data,MMU.bupmem.size);
}
static bool mmu_loadstate(std::istream* is)
static bool mmu_loadstate(std::istream* is, int size)
{
//read version
int version;
if(read32le(&version,is) != 1) return false;
if(version != 0) return false;
int bupmem_type;
u32 bupmem_size;
if(read32le(&bupmem_type,is) != 1) return false;
if(read32le(&bupmem_size,is) != 1) return false;
if(bupmem_size != MMU.bupmem.size) return false; //mismatch between current initialized and saved size
mc_realloc(&MMU.bupmem,bupmem_type,bupmem_size);
is->read((char*)MMU.bupmem.data,bupmem_size);
if(is->fail()) return false;
@ -364,7 +372,7 @@ static bool cp15_loadone(armcp15_t *cp15, std::istream* is)
return true;
}
static bool cp15_loadstate(std::istream* is)
static bool cp15_loadstate(std::istream* is, int size)
{
//read version
int version;
@ -633,6 +641,9 @@ static int savestate_WriteChunk(std::ostream* os, int type, SFORMAT *sf)
return (bsize+8);
}
//TODO TODO TODO TODO TODO TODO TODO
// - this is retarded. why not write placeholders for size and then write directly to the stream
//and then go back and fill them in
static void savestate_WriteChunk(std::ostream* os, int type, void (*saveproc)(std::ostream* os))
{
//get the size
@ -657,6 +668,16 @@ static bool savestate_save(std::ostream* outstream, int compressionLevel)
writechunks(os);
ms.flush();
for(int i=0x2000;i<0x1000000;i++)
if(ARM9Mem.ARM9_REG[i] != 0) {
MessageBox(0,"Debug check fail: ARM9Mem.ARM9_REG",0,0);
}
for(int i=0;i<0x20000;i++)
if(ARM9Mem.blank_memory[i] != 0) {
MessageBox(0,"Debug check fail: ARM9Mem.blank_memory",0,0);
}
//save the length of the file
u32 len = ms.size();
@ -730,6 +751,8 @@ static void writechunks(std::ostream* os) {
savestate_WriteChunk(os,8,spu_savestate);
savestate_WriteChunk(os,90,SF_GFX3D);
savestate_WriteChunk(os,91,gfx3d_savestate);
savestate_WriteChunk(os,100,SF_MOVIE);
savestate_WriteChunk(os,101,mov_savestate);
savestate_WriteChunk(os,0xFFFFFFFF,(SFORMAT*)0);
}
@ -747,15 +770,17 @@ static bool ReadStateChunks(std::istream* is, s32 totalsize)
{
case 1: if(!ReadStateChunk(is,SF_ARM9,size)) ret=false; break;
case 2: if(!ReadStateChunk(is,SF_ARM7,size)) ret=false; break;
case 3: if(!cp15_loadstate(is)) ret=false; break;
case 3: if(!cp15_loadstate(is,size)) ret=false; break;
case 4: if(!ReadStateChunk(is,SF_MEM,size)) ret=false; break;
case 5: if(!ReadStateChunk(is,SF_NDS,size)) ret=false; break;
case 60: if(!ReadStateChunk(is,SF_MMU,size)) ret=false; break;
case 61: if(!mmu_loadstate(is)) ret=false; break;
case 7: if(!gpu_loadstate(is)) ret=false; break;
case 8: if(!spu_loadstate(is)) ret=false; break;
case 61: if(!mmu_loadstate(is,size)) ret=false; break;
case 7: if(!gpu_loadstate(is,size)) ret=false; break;
case 8: if(!spu_loadstate(is,size)) ret=false; break;
case 90: if(!ReadStateChunk(is,SF_GFX3D,size)) ret=false; break;
case 91: if(!gfx3d_loadstate(is)) ret=false; break;
case 91: if(!gfx3d_loadstate(is,size)) ret=false; break;
case 100: if(!ReadStateChunk(is,SF_MOVIE, size)) ret=false; break;
case 101: if(!mov_loadstate(is, size)) ret=false; break;
default:
ret=false;
break;
@ -842,13 +867,22 @@ static bool savestate_load(std::istream* is)
memorystream mstemp(&buf);
bool x = ReadStateChunks(&mstemp,(s32)len);
if(!x)
{
printf("Error loading savestate. It failed halfway through;\nSince there is no savestate backup system, your current game session is wrecked");
#ifdef _MSC_VER
MessageBox(0,"Error loading savestate. It failed halfway through;\nSince there is no savestate backup system, your current game session is wrecked",0,0);
#endif
return false;
}
loadstate();
if((nds.debugConsole!=0) != CommonSettings.DebugConsole) {
printf("WARNING: forcing console debug mode to: debugmode=%s\n",nds.debugConsole?"TRUE":"FALSE");
}
return x;
return true;
}
bool savestate_load(const char *file_name)

View File

@ -931,7 +931,8 @@ u16 WIFI_read16(wifimac_t *wifi,u32 address)
//printf("wifi: read reg 0x0214\n");
return 0x0009;
case 0x19C:
return 0; //luigi, please pick something to return from here
//assert(false); //luigi, please pick something to return from here
return 0;
default:
// printf("wifi: read unhandled reg %03X\n", address);
return wifi->ioMem[address >> 1];

View File

@ -393,6 +393,22 @@
RelativePath=".\palView.h"
>
</File>
<File
RelativePath=".\ram_search.cpp"
>
</File>
<File
RelativePath=".\ramwatch.cpp"
>
</File>
<File
RelativePath=".\ramwatch.h"
>
</File>
<File
RelativePath=".\replay.cpp"
>
</File>
<File
RelativePath=".\resource.h"
>

View File

@ -279,6 +279,10 @@
RelativePath="..\MMU.cpp"
>
</File>
<File
RelativePath="..\movie.cpp"
>
</File>
<File
RelativePath="..\NDSSystem.cpp"
>
@ -636,6 +640,18 @@
RelativePath=".\palView.cpp"
>
</File>
<File
RelativePath=".\ram_search.cpp"
>
</File>
<File
RelativePath=".\ramwatch.cpp"
>
</File>
<File
RelativePath=".\replay.cpp"
>
</File>
<File
RelativePath=".\snddx.cpp"
>
@ -746,6 +762,18 @@
RelativePath=".\palView.h"
>
</File>
<File
RelativePath=".\ram_search.h"
>
</File>
<File
RelativePath=".\ramwatch.h"
>
</File>
<File
RelativePath=".\replay.h"
>
</File>
<File
RelativePath=".\resource.h"
>
@ -882,6 +910,10 @@
RelativePath="..\MMU.h"
>
</File>
<File
RelativePath="..\movie.h"
>
</File>
<File
RelativePath="..\NDSSystem.h"
>
@ -957,6 +989,10 @@
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
RelativePath=".\bitmap1.bmp"
>
</File>
<File
RelativePath=".\DeSmuME.ico"
>
@ -968,5 +1004,9 @@
</Filter>
</Files>
<Globals>
<Global
Name="RESOURCE_FILE"
Value="resources.rc"
/>
</Globals>
</VisualStudioProject>

View File

@ -414,11 +414,15 @@ void DRV_AviVideoUpdate(const u16* buffer)
AviNextSegment();
}
BOOL AVI_IsRecording()
{
return avi_file && avi_file->valid;
}
void DRV_AviSoundUpdate(void* soundData, int soundLen)
{
int nBytes;
if(!avi_file || !avi_file->valid || !avi_file->sound_added)
if(!AVI_IsRecording() || !avi_file->sound_added)
return;
nBytes = soundLen * avi_file->wave_format.nBlockAlign;

View File

@ -27,6 +27,7 @@
#include "render3d.h"
#include "throttle.h"
#include "../mic.h"
#include "../movie.h"
extern LRESULT OpenFile(); //adelikat: Made this an extern here instead of main.h Seemed icky not to limit the scope of this function
@ -154,9 +155,7 @@ void HK_MicrophoneKeyUp(int) {MicButtonPressed =0;}
void HK_AutoHoldClearKeyDown(int) {
for (int i=0; i < 10; i++) {
AutoHold.hold(i)=false;
}
ClearAutoHold();
}
void HK_Reset(int) {ResetGame();}
@ -168,6 +167,13 @@ void HK_ToggleFrame(int) {frameCounterDisplay ^= true;}
void HK_ToggleFPS(int) {FpsDisplay ^= true;}
void HK_ToggleInput(int) {ShowInputDisplay ^= true;}
void HK_ToggleLag(int) {ShowLagFrameCounter ^= true;}
void HK_ToggleReadOnly(int) {
movie_readonly ^= true;
if(movie_readonly)
SetMessageToDisplay("Read Only");
else
SetMessageToDisplay("Read+Write");
}
void HK_AutoHoldKeyDown(int) {AutoHoldPressed = true;}
void HK_AutoHoldKeyUp(int) {AutoHoldPressed = false;}
@ -178,6 +184,12 @@ void HK_TurboRightKeyUp(int) { Turbo.Right = false; }
void HK_TurboLeftKeyDown(int) { Turbo.Left = true; }
void HK_TurboLeftKeyUp(int) { Turbo.Left = false; }
void HK_TurboRKeyDown(int) { Turbo.R = true; }
void HK_TurboRKeyUp(int) { Turbo.R = false; }
void HK_TurboLKeyDown(int) { Turbo.L = true; }
void HK_TurboLKeyUp(int) { Turbo.L = false; }
void HK_TurboDownKeyDown(int) { Turbo.Down = true; }
void HK_TurboDownKeyUp(int) { Turbo.Down = false; }
@ -208,7 +220,9 @@ void HK_FastForwardKeyDown(int) { FastForward = 1; }
void HK_FastForwardKeyUp(int) { FastForward = 0; }
void HK_IncreaseSpeed(int) { IncreaseSpeed(); }
void HK_DecreaseSpeed(int) { DecreaseSpeed(); }
void HK_FrameAdvance(int) { FrameAdvance(); }
void HK_FrameAdvanceKeyDown(int) { FrameAdvance(true); }
void HK_FrameAdvanceKeyUp(int) { FrameAdvance(false); }
void HK_ToggleRasterizer(int) {
if(cur3DCore == GPU3D_OPENGL)
cur3DCore = GPU3D_SWRAST;
@ -261,7 +275,8 @@ void InitCustomKeys (SCustomKeys *keys)
keys->Pause.page = HOTKEY_PAGE_MAIN;
keys->Pause.key = VK_SPACE;
keys->FrameAdvance.handleKeyDown = HK_FrameAdvance;
keys->FrameAdvance.handleKeyDown = HK_FrameAdvanceKeyDown;
keys->FrameAdvance.handleKeyUp = HK_FrameAdvanceKeyUp;
keys->FrameAdvance.code = "FrameAdvance";
keys->FrameAdvance.name = L"Frame Advance";
keys->FrameAdvance.page = HOTKEY_PAGE_MAIN;
@ -348,6 +363,12 @@ void InitCustomKeys (SCustomKeys *keys)
keys->ToggleLag.page = HOTKEY_PAGE_MAIN;
keys->ToggleLag.key = NULL;
keys->ToggleReadOnly.handleKeyDown = HK_ToggleReadOnly;
keys->ToggleReadOnly.code = "ToggleReadOnly";
keys->ToggleReadOnly.name = L"Toggle Read Only";
keys->ToggleReadOnly.page = HOTKEY_PAGE_MAIN;
keys->ToggleReadOnly.key = NULL;
keys->RecordAVI.handleKeyDown = HK_RecordAVI;
keys->RecordAVI.code = "RecordAVI";
keys->RecordAVI.name = L"Record AVI";
@ -375,6 +396,20 @@ void InitCustomKeys (SCustomKeys *keys)
keys->TurboLeft.page = HOTKEY_PAGE_TURBO;
keys->TurboLeft.key = NULL;
keys->TurboR.handleKeyDown = HK_TurboRKeyDown;
keys->TurboR.handleKeyUp = HK_TurboRKeyUp;
keys->TurboR.code = "TurboR";
keys->TurboR.name = L"Turbo R";
keys->TurboR.page = HOTKEY_PAGE_TURBO;
keys->TurboR.key = NULL;
keys->TurboL.handleKeyDown = HK_TurboLKeyDown;
keys->TurboL.handleKeyUp = HK_TurboLKeyUp;
keys->TurboL.code = "TurboL";
keys->TurboL.name = L"Turbo L";
keys->TurboL.page = HOTKEY_PAGE_TURBO;
keys->TurboL.key = NULL;
keys->TurboDown.handleKeyDown = HK_TurboDownKeyDown;
keys->TurboDown.handleKeyUp = HK_TurboDownKeyUp;
keys->TurboDown.code = "TurboDown";

View File

@ -67,7 +67,7 @@ struct SCustomKeys
SCustomKey OpenROM, Reset, Pause, FrameAdvance, FastForward, FastForwardToggle, IncreaseSpeed, DecreaseSpeed, Microphone;
SCustomKey TurboRight, TurboLeft, TurboDown, TurboUp, TurboSelect, TurboStart, TurboB, TurboA, TurboY, TurboX;
SCustomKey TurboRight, TurboLeft, TurboDown, TurboUp, TurboSelect, TurboStart, TurboB, TurboA, TurboY, TurboX, TurboR, TurboL;
SCustomKey AutoHold, AutoHoldClear;
@ -80,6 +80,7 @@ struct SCustomKeys
SCustomKey ToggleFPS;
SCustomKey ToggleInput;
SCustomKey ToggleLag;
SCustomKey ToggleReadOnly;
SCustomKey LastItem; // dummy, must be last
//--methods--

View File

@ -69,13 +69,17 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "throttle.h"
#include "gbaslot_config.h"
#include "cheatsWin.h"
#include "Mmsystem.h"
#include "../mic.h"
#include "../common.h"
#include "main.h"
#include "hotkey.h"
#include "../movie.h"
#include "../replay.h"
#include "snddx.h"
#include "ramwatch.h"
#include "ram_search.h"
#include "directx/ddraw.h"
@ -91,8 +95,8 @@ using namespace std;
//----Recent ROMs menu globals----------
vector<string> RecentRoms; //The list of recent ROM filenames
const unsigned int MAX_RECENT_ROMS = 10; //To change the recent rom max, simply change this number
const unsigned int clearid = 600; // ID for the Clear recent ROMs item
const unsigned int baseid = 601; //Base identifier for the recent ROMs items
const unsigned int clearid = IDM_RECENT_RESERVED0; // ID for the Clear recent ROMs item
const unsigned int baseid = IDM_RECENT_RESERVED1; //Base identifier for the recent ROMs items
static HMENU recentromsmenu; //Handle to the recent ROMs submenu
//--------------------------------------
@ -107,6 +111,10 @@ void DRV_AviSoundUpdate(void* soundData, int soundLen);
bool DRV_AviIsRecording();
void DRV_AviVideoUpdate(const u16* buffer);
//------
DWORD hKeyInputTimer;
extern LRESULT CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
CRITICAL_SECTION win_sync;
volatile int win_sound_samplecounter = 0;
@ -157,6 +165,7 @@ int WndX = 0;
int WndY = 0;
int ScreenGap = 0;
extern HWND RamSearchHWnd;
static int FrameLimit = 1;
@ -215,9 +224,8 @@ GPU3DInterface *core3DList[] = {
int autoframeskipenab=0;
int frameskiprate=0;
int emu_paused = 0;
static int backupmemorytype=MC_TYPE_AUTODETECT;
static u32 backupmemorysize=1;
unsigned int frameCounter=0;
int backupmemorytype=MC_TYPE_AUTODETECT;
u32 backupmemorysize=1;
bool frameAdvance = false;
bool frameCounterDisplay = false;
bool FpsDisplay = false;
@ -343,10 +351,10 @@ void ResetHud(HudStruct *hudstruct) {
SetHudDummy(&hudstruct->Dummy);
}
unsigned int lastSaveState = 0; //Keeps track of last savestate used for quick save/load functions
stringstream MessageToDisplay; //temp variable to store message that will be displayed via DisplayMessage function
int displayMessageCounter = 0; //Counter to keep track with how long to display messages on screen
unsigned int lastSaveState = 0; //Keeps track of last savestate used for quick save/load functions
stringstream MessageToDisplay; //temp variable to store message that will be displayed via DisplayMessage function
int displayMessageCounter = 0; //Counter to keep track with how long to display messages on screen
bool NewMessageToDisplay = false; //Flag to indicate a new message is in queue
/* the firmware settings */
struct NDS_fw_config_data win_fw_config;
@ -382,6 +390,79 @@ struct configured_features {
const char *cflash_disk_image_file;
};
int KeyInDelayInCount=10;
static int lastTime = timeGetTime();
int repeattime;
VOID CALLBACK KeyInputTimer( UINT idEvent, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{
//
// if(timeGetTime() - lastTime > 5)
// {
bool S9xGetState (WORD KeyIdent);
/* if(GUI.JoystickHotkeys)
{
static uint32 joyState [256];
for(int i = 0 ; i < 255 ; i++)
{
bool active = !S9xGetState(0x8000|i);
if(active)
{
if(joyState[i] < ULONG_MAX) // 0xffffffffUL
joyState[i]++;
if(joyState[i] == 1 || joyState[i] >= (unsigned) KeyInDelayInCount)
PostMessage(GUI.hWnd, WM_CUSTKEYDOWN, (WPARAM)(0x8000|i),(LPARAM)(NULL));
}
else
{
if(joyState[i])
{
joyState[i] = 0;
PostMessage(GUI.hWnd, WM_CUSTKEYUP, (WPARAM)(0x8000|i),(LPARAM)(NULL));
}
}
}
}*/
// if((!GUI.InactivePause || !Settings.ForcedPause)
// || (GUI.BackgroundInput || !(Settings.ForcedPause & (PAUSE_INACTIVE_WINDOW | PAUSE_WINDOW_ICONISED))))
// {
static uint32 joyState [256];
for(int i = 0 ; i < 255 ; i++)
{
bool active = !S9xGetState(i);
if(active)
{
if(joyState[i] < ULONG_MAX) // 0xffffffffUL
joyState[i]++;
if(joyState[i] == 1 || joyState[i] >= (unsigned) KeyInDelayInCount) {
//sort of fix the auto repeating
//TODO find something better
// repeattime++;
// if(repeattime % 10 == 0) {
PostMessage(MainWindow->getHWnd(), WM_CUSTKEYDOWN, (WPARAM)(i),(LPARAM)(NULL));
repeattime=0;
// }
}
}
else
{
if(joyState[i])
{
joyState[i] = 0;
PostMessage(MainWindow->getHWnd(), WM_CUSTKEYUP, (WPARAM)(i),(LPARAM)(NULL));
}
}
}
// }
// lastTime = timeGetTime();
// }
}
static void
init_configured_features( struct configured_features *config) {
config->arm9_gdb_port = 0;
@ -920,7 +1001,8 @@ void DisplayMessage()
{
//adelikat - By using stringstream, it leaves open the possibility to keep a series of message in queue
displayMessageCounter--;
osd->addFixed(0, 40, "%s",MessageToDisplay.str().c_str());
osd->addFixed(0, 120, "%s",MessageToDisplay.str().c_str());
NewMessageToDisplay = false;
}
}
@ -932,12 +1014,15 @@ void SaveStateMessages(int slotnum, int whichMessage)
{
case 0: //State saved
MessageToDisplay << "State " << slotnum << " saved.";
NewMessageToDisplay = true; //adelikat: TODO: make these call SetMessageToDisplay instead
break;
case 1: //State loaded
MessageToDisplay << "State " << slotnum << " loaded.";
NewMessageToDisplay = true;
break;
case 2: //Save slot selected
MessageToDisplay << "State " << slotnum << " selected.";
NewMessageToDisplay = true;
default:
break;
}
@ -999,12 +1084,13 @@ DWORD WINAPI run()
while(execute)
{
input_process();
FCEUMOV_AddInputState();
if (ShowInputDisplay) osd->addFixed(Hud.InputDisplay.x, Hud.InputDisplay.y, "%s",InputDisplayString.c_str());
{
Lock lock;
cycles = NDS_exec((560190<<1)-cycles);
NDS_exec(0);
win_sound_samplecounter = 735;
}
@ -1025,7 +1111,17 @@ DWORD WINAPI run()
static int fps3d = 0;
if (FpsDisplay) osd->addFixed(Hud.FpsDisplay.x, Hud.FpsDisplay.y, "%02d Fps / %02d 3d", fps, fps3d);
osd->update();
if (frameCounterDisplay)
{
if (movieMode == MOVIEMODE_PLAY)
osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d/%d",currFrameCounter,currMovieData.records.size());
else if(movieMode == MOVIEMODE_RECORD)
osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d",currFrameCounter);
else
osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d (no movie)",currFrameCounter);
}
if(!DRV_AviIsRecording()) osd->update();
Display();
osd->clear();
@ -1047,6 +1143,8 @@ DWORD WINAPI run()
}
Update_RAM_Watch();
Update_RAM_Search();
fpsframecount++;
QueryPerformanceCounter((LARGE_INTEGER *)&curticks);
@ -1141,14 +1239,19 @@ DWORD WINAPI run()
emu_halt();
SPU_Pause(1);
}
frameCounter++;
if (frameCounterDisplay) osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d",frameCounter);
if (ShowLagFrameCounter) osd->addFixed(Hud.LagFrameCounter.x, Hud.LagFrameCounter.y, "%d",TotalLagFrames);
if (ShowMicrophone) osd->addFixed(Hud.Microphone.x, Hud.Microphone.y, "%d",MicDisplay);
DisplayMessage();
// DisplayMessage();
CheckMessages();
}
if (NewMessageToDisplay)
{
DisplayMessage();
osd->update();
Display();
osd->clear();
}
paused = TRUE;
CheckMessages();
Sleep(100);
@ -1261,7 +1364,6 @@ BOOL LoadROM(char * filename, const char *cflash_disk_image)
{
INFO("Loading %s was successful\n",filename);
LoadSaveStateInfo();
frameCounter=0;
lagframecounter=0;
UpdateRecentRoms(filename);
osd->setRotate(GPU_rotation);
@ -1390,6 +1492,7 @@ static void ExitRunLoop()
emu_halt();
}
BOOL AVI_IsRecording();
class WinDriver : public Driver
{
virtual BOOL WIFI_Host_InitSystem() {
@ -1419,6 +1522,11 @@ class WinDriver : public Driver
WSACleanup() ;
#endif
}
virtual BOOL AVI_IsRecording()
{
return ::AVI_IsRecording();
}
};
int WINAPI WinMain (HINSTANCE hThisInstance,
@ -1657,6 +1765,10 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
MainWindow->checkMenu(frameskiprate + IDC_FRAMESKIP0, MF_BYCOMMAND | MF_CHECKED);
}
int KeyInRepeatMSec=20;
hKeyInputTimer = timeSetEvent (KeyInRepeatMSec, 0, KeyInputTimer, 0, TIME_PERIODIC);
cur3DCore = GetPrivateProfileInt("3D", "Renderer", GPU3D_OPENGL, IniName);
CommonSettings.HighResolutionInterpolateColor = GetPrivateProfileInt("3D", "HighResolutionInterpolateColor", 1, IniName);
NDS_3D_ChangeCore(cur3DCore);
@ -2246,11 +2358,24 @@ void Pause()
emu_paused ^= 1;
}
void FrameAdvance()
bool first;
void FrameAdvance(bool state)
{
frameAdvance = true;
execute = TRUE;
emu_paused = 1;
if(state) {
if(first) {
frameAdvance=true;
}
else {
execute = TRUE;
first=false;
}
}
else {
emu_halt();
SPU_Pause(1);
emu_paused = 1;
}
}
enum CONFIGSCREEN
@ -2345,6 +2470,10 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
EnableMenuItem(mainMenu, IDM_CHEATS_SEARCH, MF_BYCOMMAND | (romloaded) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem(mainMenu, IDM_WIFISETTINGS, MF_BYCOMMAND | (romloaded) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem(mainMenu, IDM_RECORD_MOVIE, MF_BYCOMMAND | (romloaded && movieMode == MOVIEMODE_INACTIVE) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem(mainMenu, IDM_PLAY_MOVIE, MF_BYCOMMAND | (romloaded && movieMode == MOVIEMODE_INACTIVE) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem(mainMenu, IDM_STOPMOVIE, MF_BYCOMMAND | (romloaded && movieMode != MOVIEMODE_INACTIVE) ? MF_ENABLED : MF_GRAYED);
//Update savestate slot items based on ROM loaded
for (int x = 0; x < 10; x++)
{
@ -2476,6 +2605,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
//break;
case WM_KEYDOWN:
break;
case WM_SYSKEYDOWN:
case WM_CUSTKEYDOWN:
{
@ -2953,7 +3083,15 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
case IDM_CHEATS_SEARCH:
CheatsSearchDialog(hwnd);
return 0;
case IDM_RECORD_MOVIE:
MovieRecordTo();
return 0;
case IDM_PLAY_MOVIE:
Replay_LoadMovie();
return 0;
case IDM_STOPMOVIE:
FCEUI_StopMovie();
return 0;
case ID_VIEW_FRAMECOUNTER:
frameCounterDisplay ^= 1;
MainWindow->checkMenu(ID_VIEW_FRAMECOUNTER, frameCounterDisplay ? MF_CHECKED : MF_UNCHECKED);
@ -2993,6 +3131,25 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
osd->clear();
return 0;
case ID_RAM_SEARCH:
if(!RamSearchHWnd)
{
RamSearchHWnd = CreateDialog(hAppInst, MAKEINTRESOURCE(IDD_RAMSEARCH), hwnd, (DLGPROC) RamSearchProc);
}
else
SetForegroundWindow(RamSearchHWnd);
break;
case ID_RAM_WATCH:
if(!RamWatchHWnd)
{
RamWatchHWnd = CreateDialog(hAppInst, MAKEINTRESOURCE(IDD_RAMWATCH), hwnd, (DLGPROC) RamWatchProc);
// DialogsOpen++;
}
else
SetForegroundWindow(RamWatchHWnd);
return 0;
#define clearsaver() \
MainWindow->checkMenu(IDC_SAVETYPE1, MF_BYCOMMAND | MF_UNCHECKED); \
MainWindow->checkMenu(IDC_SAVETYPE2, MF_BYCOMMAND | MF_UNCHECKED); \
@ -3231,7 +3388,6 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
}
}
return DefWindowProc (hwnd, message, wParam, lParam);
}
@ -3373,7 +3529,6 @@ LRESULT CALLBACK EmulationSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, L
{
CheatsSearchReset();
NDS_Reset();
frameCounter = 0;
}
}
}
@ -3607,7 +3762,6 @@ LRESULT CALLBACK WifiSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM
{
CheatsSearchReset();
NDS_Reset();
frameCounter = 0;
}
}
}
@ -3729,7 +3883,6 @@ void ResetGame()
{
CheatsSearchReset();
NDS_Reset();
frameCounter=0;
}
//adelikat: This function allows another file to add a message to the screen
@ -3739,6 +3892,7 @@ void SetMessageToDisplay(const char *message)
//adelikat: TODO: set up a function that does the clearing and setting of the counter, so this code doesn't have to be done all over the place
// make the function receive an int for the counter, but overload so that if no int, 120 is used
MessageToDisplay << message;
NewMessageToDisplay = true;
displayMessageCounter = 120;//
}
@ -3775,4 +3929,9 @@ void UpdateHotkeyAssignments()
text = text.substr(0,truncate);
text.append("\tCtrl+O"); //TODO: Append actual hotkey assignment
ChangeMenuItemText(IDM_OPEN, text); //Set Menu item text
}
HWND GetMainHWND()
{
return MainWindow->getHWnd();
}

View File

@ -11,14 +11,13 @@ extern unsigned int lastSaveState;
void SaveStateMessages(int slotnum, int whichMessage);
void Display();
void Pause();
void FrameAdvance();
void FrameAdvance(bool state);
void ResetGame(); //Resets game (for the menu item & hotkey
void AviRecordTo();
void AviEnd();
void SetMessageToDisplay(const char *message); //For sending output to the main screen
extern bool ShowInputDisplay;
extern unsigned int frameCounter;
extern bool frameCounterDisplay;
extern bool FpsDisplay;
extern bool ShowInputDisplay;
@ -28,5 +27,9 @@ extern bool ShowLagFrameCounter;
#define GPU3D_OPENGL 1
#define GPU3D_SWRAST 2
extern int backupmemorytype;
extern u32 backupmemorysize;
HWND GetMainHWND(); //adelikat: returns the main window handle
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,49 @@
#ifndef RAM_SEARCH_H
#define RAM_SEARCH_H
//64k in Ram_68k[], 8k in Ram_Z80[]
//#define _68K_RAM_SIZE 64*1024
//#define Z80_RAM_SIZE 8*1024
/*#define SRAM_SIZE (((SRAM_End - SRAM_Start) > 2) ? SRAM_End - SRAM_Start : 0)
#define BRAM_SIZE ((8 << BRAM_Ex_Size) * 1024)*/
//#define GENESIS_RAM_SIZE (_68K_RAM_SIZE + Z80_RAM_SIZE)
//_32X_Ram[]
//#define _32X_RAM_SIZE 256*1024
//512k in Ram_Prg, 256k in Ram_Word_1M and Ram_Word_2M
//(docs say 6Mbit of ram, but I'm not sure what's used when)
//#define SEGACD_RAM_PRG_SIZE 512*1024
//#define SEGACD_1M_RAM_SIZE 256*1024
//#define SEGACD_2M_RAM_SIZE 256*1024
//#define SEGACD_RAM_SIZE (SEGACD_RAM_PRG_SIZE + SEGACD_2M_RAM_SIZE)
//#define MAX_RAM_SIZE (0x112000)
//#define MAX_RAM_SIZE (0xD2000)
#define MAX_RAM_SIZE (0x400000)
extern char rs_type_size;
extern int ResultCount;
unsigned int sizeConv(unsigned int index,char size, char *prevSize = &rs_type_size, bool usePrev = false);
unsigned int GetRamValue(unsigned int Addr,char Size);
void prune(char Search, char Operater, char Type, int Value, int OperatorParameter);
void CompactAddrs();
void reset_address_info();
void signal_new_frame();
void signal_new_size();
void UpdateRamSearchTitleBar(int percent = 0);
void Update_RAM_Search();
void SetRamSearchUndoType(HWND hDlg, int type);
unsigned int ReadValueAtHardwareAddress(unsigned int address, unsigned int size);
bool WriteValueAtHardwareRAMAddress(unsigned int address, unsigned int value, unsigned int size, bool hookless=false);
bool IsHardwareRAMAddressValid(unsigned int address);
extern int curr_ram_size;
extern bool noMisalign;
extern bool littleEndian;
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,39 @@
#ifndef RAMWATCH_H
#define RAMWATCH_H
#include "windows.h"
bool ResetWatches();
void OpenRWRecentFile(int memwRFileNumber);
extern bool AutoRWLoad;
extern bool RWSaveWindowPos;
#define MAX_RECENT_WATCHES 5
extern char rw_recent_files[MAX_RECENT_WATCHES][1024];
extern bool AskSave();
extern int ramw_x;
extern int ramw_y;
extern bool RWfileChanged;
// AddressWatcher is self-contained now
struct AddressWatcher
{
unsigned int Address; // hardware address
char Size;
char Type;
char* comment; // NULL means no comment, non-NULL means allocated comment
bool WrongEndian;
unsigned int CurValue;
};
#define MAX_WATCH_COUNT 256
extern AddressWatcher rswatches[MAX_WATCH_COUNT];
extern int WatchCount; // number of valid items in rswatches
extern char Watch_Dir[1024];
bool InsertWatch(const AddressWatcher& Watch, char *Comment);
bool InsertWatch(const AddressWatcher& Watch, HWND parent=NULL); // asks user for comment
void Update_RAM_Watch();
bool Load_Watches(bool clear, const char* filename);
LRESULT CALLBACK RamWatchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
extern HWND RamWatchHWnd;
#endif

View File

@ -0,0 +1,157 @@
#include <io.h>
#include "resource.h"
#include "replay.h"
#include "common.h"
#include "main.h"
#include "movie.h"
#include "utils/xstring.h"
bool replayreadonly=1;
//adelikat: TODO: put this in one of the header files
template<int BUFSIZE>
inline std::wstring GetDlgItemTextW(HWND hDlg, int nIDDlgItem) {
wchar_t buf[BUFSIZE];
GetDlgItemTextW(hDlg, nIDDlgItem, buf, BUFSIZE);
return buf;
}
template<int BUFSIZE>
inline std::string GetDlgItemText(HWND hDlg, int nIDDlgItem) {
char buf[BUFSIZE];
GetDlgItemText(hDlg, nIDDlgItem, buf, BUFSIZE);
return buf;
}
char playfilename[MAX_PATH] = "";
//Replay movie dialog
BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
OPENFILENAME ofn;
char szChoice[MAX_PATH]={0};
char filename[MAX_PATH] = "";
switch(uMsg)
{
case WM_INITDIALOG:
SendDlgItemMessage(hwndDlg, IDC_CHECK_READONLY, BM_SETCHECK, replayreadonly?BST_CHECKED:BST_UNCHECKED, 0);
return FALSE;
case WM_COMMAND:
int wID = LOWORD(wParam);
switch(wID)
{
case ID_BROWSE:
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = MainWindow->getHWnd();
ofn.lpstrFilter = "Desmume Movie File (*.dsm)\0*.dsm\0All files(*.*)\0*.*\0\0";
ofn.nFilterIndex = 1;
ofn.lpstrFile = filename;
ofn.lpstrTitle = "Replay Movie from File";
ofn.nMaxFile = MAX_PATH;
ofn.lpstrDefExt = "dsm";
GetOpenFileName(&ofn);
strcpy(playfilename, filename);
SetDlgItemText(hwndDlg, PM_FILENAME, playfilename);
return true;
case IDC_CHECK_READONLY:
replayreadonly ^= 1;
return true;
case IDOK:
FCEUI_LoadMovie(playfilename, replayreadonly, false, 80000);
ZeroMemory(&playfilename, sizeof(playfilename));
EndDialog(hwndDlg, 0);
return true;
case IDCANCEL:
ZeroMemory(&playfilename, sizeof(playfilename));
EndDialog(hwndDlg, 0);
return true;
}
}
return false;
}
//Record movie dialog
static BOOL CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static struct CreateMovieParameters* p = NULL;
std::wstring author = L"";
switch(uMsg)
{
case WM_INITDIALOG:
return false;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK: {
author = GetDlgItemTextW<500>(hwndDlg,IDC_EDIT_AUTHOR);
std::string fname = GetDlgItemText<MAX_PATH>(hwndDlg,IDC_EDIT_FILENAME);
FCEUI_SaveMovie(fname.c_str(), author);
EndDialog(hwndDlg, 0);
return true;
}
case IDCANCEL:
EndDialog(hwndDlg, 0);
return true;
case IDC_BUTTON_BROWSEFILE:
{
OPENFILENAME ofn;
char szChoice[MAX_PATH]={0};
char recordfilename[MAX_PATH];
// browse button
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = MainWindow->getHWnd();
ofn.lpstrFilter = "Desmume Movie File (*.dsm)\0*.dsm\0All files(*.*)\0*.*\0\0";
ofn.lpstrFile = szChoice;
ofn.lpstrTitle = "Record a new movie";
ofn.lpstrDefExt = "dsm";
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
GetSaveFileName(&ofn);
strcpy(recordfilename, szChoice);
SetDlgItemText(hwndDlg, IDC_EDIT_FILENAME, recordfilename);
//if(GetSaveFileName(&ofn))
// UpdateRecordDialogPath(hwndDlg,szChoice);
return true;
}
}
}
return false;
}
//Show the play movie dialog and play a movie
void Replay_LoadMovie()
{
char* fn = (char*)DialogBoxParam(hAppInst, "IDD_REPLAYINP", GetMainHWND(), ReplayDialogProc, false);
if(fn)
{
FCEUI_LoadMovie(fn, movie_readonly, false, 100000);
free(fn);
}
}
//Show the record movie dialog and record a movie.
void MovieRecordTo()
{
DialogBoxParam(hAppInst, MAKEINTRESOURCE(IDD_RECORDMOVIE), GetMainHWND(), RecordDialogProc, (LPARAM)0);
}

View File

@ -0,0 +1,2 @@
void Replay_LoadMovie();
void MovieRecordTo();

View File

@ -2,6 +2,7 @@
#define IDC_STATIC (-1)
#endif
#define IDD_RECORDMOVIE 101
#define IDM_OPEN 101
#define IDM_QUIT 102
#define IDC_FERMER 103
@ -45,7 +46,6 @@
#define IDM_SUBMITBUGREPORT 134
#define IDM_STATE_LOAD 135
#define IDM_STATE_SAVE 136
#define IDR_MAIN_ACCEL 137
#define IDM_STATE_SAVE_F1 140
#define IDM_STATE_SAVE_F2 141
#define IDM_STATE_SAVE_F3 142
@ -88,7 +88,10 @@
#define IDC_FRAMESKIP6 197
#define IDC_FRAMESKIP7 198
#define IDC_FRAMESKIP8 199
#define IDC_EDIT_FILENAME 200
#define IDC_FRAMESKIP9 200
#define IDC_BUTTON_BROWSEFILE 201
#define IDC_CHECK_READONLY 201
#define IDM_IMPORTBACKUPMEMORY 201
#define IDC_LANGENGLISH 210
#define IDC_LANGFRENCH 211
@ -120,7 +123,10 @@
#define IDC_GOTODES 423
#define IDC_TMP 424
#define IDD_GAME_INFO 501
#define ID_RAM_WATCH 550
#define IDD_IO_REG 601
#define IDM_RECORD_MOVIE 602
#define IDM_PLAY_MOVIE 603
#define IDD_PAL 703
#define IDD_TILE 704
#define IDC_PAL_SELECT 705
@ -140,6 +146,7 @@
#define IDC_SCR 806
#define IDC_MSIZE 807
#define IDC_SCROLL 808
#define IDD_CHEAT_ADD_XX_CODE 809
#define IDD_OAM 900
#define IDC_SCR_SELECT 901
#define IDC_TILE 902
@ -155,16 +162,71 @@
#define IDD_EMULATIONSETTINGS 916
#define IDD_WIFISETTINGS 918
#define IDD_MEM_VIEW 920
#define IDD_CHEAT_ADD_XX_CODE 921
#define IDC_DIFFERENTFROM 921
#define IDC_DIFFERENTBY 922
#define IDC_MODULO 923
#define IDC_EDIT_DIFFBY 924
#define IDC_EDIT_MODBY 925
#define IDC_PREVIOUSVALUE 926
#define IDC_SPECIFICVALUE 927
#define IDC_NUMBEROFCHANGES 928
#define IDC_EDIT_COMPAREVALUE 929
#define IDC_EDIT_COMPARECHANGES 930
#define IDC_C_AUTOSEARCH 931
#define IDC_MISALIGN 932
#define IDC_C_RESET_CHANGES 933
#define IDC_C_UNDO 934
#define ID_RAM_SEARCH 935
#define IDD_RAMSEARCH 945
#define IDC_SPECIFICADDRESS 950
#define IDC_EDIT_COMPAREADDRESS 951
#define IDC_PROMPT_TEXT 952
#define IDC_PROMPT_EDIT 953
#define IDC_SIGNED 954
#define IDC_UNSIGNED 955
#define IDC_HEX 956
#define IDC_1_BYTE 957
#define IDC_2_BYTES 958
#define IDC_4_BYTES 959
#define IDC_WATCHLIST 960
#define IDC_C_WATCH_EDIT 961
#define IDC_C_WATCH_REMOVE 962
#define IDC_C_WATCH 963
#define IDC_C_WATCH_DUPLICATE 964
#define IDC_C_ADDCHEAT 965
#define ID_WATCHES_UPDOWN 966
#define IDD_RAMWATCH 967
#define IDC_C_WATCH_UP 980
#define IDD_EDITWATCH 980
#define IDC_C_WATCH_DOWN 981
#define RAMMENU_FILE_AUTOLOAD 982
#define RAMMENU_FILE_SAVEWINDOW 983
#define RAMMENU_FILE_SAVE 984
#define RAMMENU_FILE_SAVEAS 985
#define RAMMENU_FILE_OPEN 986
#define RAMMENU_FILE_APPEND 987
#define RAMMENU_FILE_NEW 988
#define RAMMENU_FILE_RECENT 990
#define IDC_RAMLIST 991
#define IDC_C_SEARCH 992
#define IDC_C_RESET 993
#define IDC_C_ELIMINATE 994
#define IDC_LESSTHAN 995
#define IDC_MORETHAN 996
#define IDC_NOMORETHAN 997
#define IDC_NOLESSTHAN 998
#define IDC_EQUALTO 999
#define IDC_BGMAP_SEL 1000
#define IDC_BRIDGEADAPTER 1000
#define IDC_EDIT03 1000
#define IDC_SOUNDCORECB 1000
#define IDC_USEEXTBIOS 1000
#define ID_BROWSE 1000
#define IDC_BGMAP_BGXCNT 1001
#define IDC_CHECKBOX_DEBUGGERMODE 1001
#define IDC_EDIT01 1001
#define IDC_SOUNDBUFFERET 1001
#define PM_FILENAME 1001
#define IDC_ARM9BIOS 1002
#define IDC_EDIT05 1002
#define IDC_SLVOLUME 1002
@ -279,6 +341,7 @@
#define IDC_EDIT13 1104
#define IDC_EDIT3 1104
#define IDC_EDIT14 1105
#define IDC_EDIT_AUTHOR 1180
#define IDD_MATRIX_VIEWER 1200
#define IDM_MATRIX_VIEWER 1200
#define IDC_MATRIX_VIEWER_COORD_GROUP 1201
@ -381,6 +444,7 @@
#define IDC_LIGHT_VIEWER_LIGHT3COLOR_EDIT 1333
#define IDC_LIGHT_VIEWER_LIGHT3VECTOR_EDIT 1334
#define IDC_GI_FATOFS 4464
#define IDC_INTERPOLATECOLOR 4464
#define IDC_GI_FATSIZE 4465
#define IDC_GI_ICONTITLEOFS 4466
#define IDC_GI_USEDROMSIZE 4467
@ -425,6 +489,7 @@
#define ID_VIEW_DISPLAYMICROPHONE 40014
#define IDM_FILE_RECORDAVI 40015
#define IDM_FILE_STOPAVI 40016
#define IDM_STOPMOVIE 40019
#define ID_FILE_RECENTROM 40034
#define IDC_SAVETYPE7 40037
#define IDM_DEFSIZE 40038
@ -517,4 +582,17 @@
#define IDC_HKCOMBO 60077
#define IDD_KEYCUSTOM 60078
#define IDM_HOTKEY_CONFIG 60079
#define IDC_INTERPOLATECOLOR 70000
#define IDM_RECENT_RESERVED0 65500
#define IDM_RECENT_RESERVED1 65501
#define IDM_RECENT_RESERVED2 65502
#define IDM_RECENT_RESERVED3 65503
#define IDM_RECENT_RESERVED4 65504
#define IDM_RECENT_RESERVED5 65505
#define IDM_RECENT_RESERVED6 65506
#define IDM_RECENT_RESERVED7 65507
#define IDM_RECENT_RESERVED8 65508
#define IDM_RECENT_RESERVED9 65509
#define IDM_RECENT_RESERVED10 65510
#define IDM_RECENT_RESERVED11 65511
#define IDM_RECENT_RESERVED12 65512
#define IDM_RECENT_RESERVED13 65513

View File

@ -242,6 +242,10 @@ MENU_PRINCIPAL MENU
MENUITEM "Record &AVI...", IDM_FILE_RECORDAVI
MENUITEM "Stop AVI", IDM_FILE_STOPAVI
MENUITEM SEPARATOR
MENUITEM "&Record Movie...", IDM_RECORD_MOVIE
MENUITEM "&Play Movie...", IDM_PLAY_MOVIE
MENUITEM "&Stop Movie", IDM_STOPMOVIE
MENUITEM SEPARATOR
MENUITEM "&Quit\tAlt F4", IDM_QUIT
}
POPUP "&Emulation"
@ -290,6 +294,8 @@ MENU_PRINCIPAL MENU
MENUITEM "Display Lag Counter", ID_VIEW_DISPLAYLAG
MENUITEM "Display Microphone", ID_VIEW_DISPLAYMICROPHONE
MENUITEM "HUD Editing Mode", ID_VIEW_HUDEDITOR
MENUITEM "RAM Watch", ID_RAM_WATCH
MENUITEM "RAM Search", ID_RAM_SEARCH
}
POPUP "&Config"
{
@ -307,7 +313,7 @@ MENU_PRINCIPAL MENU
MENUITEM "Control Config", IDM_CONFIG
MENUITEM "Hotkey Config", IDM_HOTKEY_CONFIG
MENUITEM "Sound Settings", IDM_SOUNDSETTINGS
MENUITEM "Wifi settings", IDM_WIFISETTINGS, GRAYED
MENUITEM "Wifi settings", IDM_WIFISETTINGS
MENUITEM "Firmware Settings", IDM_FIRMSETTINGS
MENUITEM "Emulation Settings", IDM_EMULATIONSETTINGS
MENUITEM "Microphone Settings", IDM_MICROPHONESETTINGS
@ -345,7 +351,7 @@ MENU_PRINCIPAL MENU
MENUITEM "View Matrices", IDM_MATRIX_VIEWER
MENUITEM "View Lights", IDM_LIGHT_VIEWER
MENUITEM SEPARATOR
POPUP "&View &Layers"
POPUP "&View Layers"
{
MENUITEM "Main BG 0", IDM_MBG0, CHECKED
MENUITEM "Main BG 1", IDM_MBG1, CHECKED
@ -540,6 +546,37 @@ MENU_PRINCIPAL MENU
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
RAMWATCH_MENU MENU
{
POPUP "File"
{
MENUITEM "&New list\tCtrl N", RAMMENU_FILE_NEW
MENUITEM "&Open...\tCtrl O", RAMMENU_FILE_OPEN
MENUITEM "&Save\tCtrl S", RAMMENU_FILE_SAVE
MENUITEM "Sa&ve As...\tCtrl Shift S", RAMMENU_FILE_SAVEAS
MENUITEM "&Append file...", RAMMENU_FILE_APPEND
MENUITEM "Recent", RAMMENU_FILE_RECENT
MENUITEM SEPARATOR
MENUITEM "Auto-&load", RAMMENU_FILE_AUTOLOAD
MENUITEM "Save Window Position", RAMMENU_FILE_SAVEWINDOW
MENUITEM SEPARATOR
MENUITEM "&Close\tAlt F4", IDCANCEL
}
POPUP "Watches"
{
MENUITEM "&New Watch\tN", IDC_C_WATCH
MENUITEM "&Edit Watch\tE", IDC_C_WATCH_EDIT
MENUITEM "&Remove Watch\tR", IDC_C_WATCH_REMOVE
MENUITEM "Duplicate Watch\tA", IDC_C_WATCH_DUPLICATE
MENUITEM SEPARATOR
MENUITEM "Move Up\tU", IDC_C_WATCH_UP
MENUITEM "Move Down\tD", IDC_C_WATCH_DOWN
}
}
LANGUAGE LANG_DANISH, SUBLANG_DANISH_DENMARK
RECENTROMS MENU
{
@ -583,10 +620,10 @@ RECENTROMS MENU
// Dialog resources
//
LANGUAGE LANG_DANISH, SUBLANG_DANISH_DENMARK
IDD_3DSETTINGS DIALOGEX 0, 0, 174, 120
IDD_3DSETTINGS DIALOG 0, 0, 174, 120
STYLE DS_MODALFRAME | DS_SETFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
CAPTION "3D settings"
FONT 8, "MS Sans Serif", 0, 0, 0
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "OK", IDOK, 62, 92, 50, 14, BS_DEFPUSHBUTTON
PUSHBUTTON "Cancel", IDCANCEL, 117, 92, 50, 14, BS_PUSHBUTTON
@ -617,10 +654,10 @@ FONT 8, "MS Sans Serif", 0, 0, 0
LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
IDD_3DSETTINGS DIALOGEX 0, 0, 174, 120
IDD_3DSETTINGS DIALOG 0, 0, 174, 120
STYLE DS_MODALFRAME | DS_SETFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
CAPTION "Configuration 3D"
FONT 8, "MS Sans Serif", 0, 0, 0
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "OK", IDOK, 62, 92, 50, 14, BS_DEFPUSHBUTTON
PUSHBUTTON "Annuler", IDCANCEL, 117, 92, 50, 14, BS_PUSHBUTTON
@ -1220,6 +1257,30 @@ FONT 8, "MS Sans Serif", 0, 0, 1
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDD_EDITWATCH DIALOGEX 0, 0, 181, 95
STYLE DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
CAPTION " Edit Watch"
FONT 8, "MS Shell Dlg", 400, 0, 1
{
CTEXT "Address:", IDC_SPECIFICADDRESS, 18, 12, 35, 10, SS_CENTER
EDITTEXT IDC_EDIT_COMPAREADDRESS, 55, 10, 65, 12, ES_AUTOHSCROLL | ES_UPPERCASE
CTEXT "Notes:", IDC_PROMPT_TEXT, 18, 24, 45, 10, SS_CENTER
EDITTEXT IDC_PROMPT_EDIT, 55, 22, 65, 12, ES_AUTOHSCROLL
GROUPBOX "Data Type", IDC_STATIC, 14, 37, 75, 42, 0, WS_EX_TRANSPARENT
AUTORADIOBUTTON "&Signed", IDC_SIGNED, 18, 47, 67, 9, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "&Unsigned", IDC_UNSIGNED, 18, 57, 67, 9, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "&Hexadecimal", IDC_HEX, 18, 67, 67, 9, WS_TABSTOP | BS_AUTORADIOBUTTON
GROUPBOX "Data Size", IDC_STATIC, 94, 37, 73, 42, 0, WS_EX_TRANSPARENT
AUTORADIOBUTTON "&1 byte", IDC_1_BYTE, 98, 47, 61, 11, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "&2 bytes", IDC_2_BYTES, 98, 57, 61, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "&4 bytes", IDC_4_BYTES, 98, 67, 61, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
DEFPUSHBUTTON "&OK", IDOK, 66, 80, 50, 14, BS_DEFPUSHBUTTON
PUSHBUTTON "&Cancel", IDCANCEL, 120, 80, 50, 14, BS_PUSHBUTTON
}
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDD_EMULATIONSETTINGS DIALOG 0, 0, 241, 270
STYLE DS_CENTER | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_SYSMENU
@ -2094,7 +2155,6 @@ FONT 8, "MS Shell Dlg", 400, 0, 1
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDD_MEM_VIEW DIALOG 0, 0, 436, 231
STYLE DS_CENTER | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_SYSMENU
CAPTION ""
FONT 8, "MS Sans Serif"
{
PUSHBUTTON "Close", IDCANCEL, 188, 210, 60, 15, BS_PUSHBUTTON
@ -2137,7 +2197,7 @@ CAPTION "OAM Fremviser"
FONT 8, "MS Sans Serif", 0, 0, 1
{
COMBOBOX IDC_SCR_SELECT, 4, 4, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWNLIST
SCROLLBAR IDC_SCROLLER, 48, 20, 20, 14, WS_VISIBLE | WS_VISIBLE
SCROLLBAR IDC_SCROLLER, 48, 20, 20, 14, NOT WS_VISIBLE | NOT WS_VISIBLE
LTEXT "Mode :", IDC_STATIC, 4, 36, 45, 8, SS_LEFT
LTEXT "Tile :", IDC_STATIC, 4, 46, 45, 8, SS_LEFT
LTEXT "Palette :", IDC_STATIC, 4, 56, 45, 8, SS_LEFT
@ -2173,7 +2233,7 @@ CAPTION "OAM Viewer"
FONT 8, "MS Sans Serif", 0, 0, 1
{
COMBOBOX IDC_SCR_SELECT, 4, 4, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWNLIST
SCROLLBAR IDC_SCROLLER, 48, 20, 20, 14, WS_VISIBLE | WS_VISIBLE
SCROLLBAR IDC_SCROLLER, 48, 20, 20, 14, NOT WS_VISIBLE | NOT WS_VISIBLE
LTEXT "Mode :", IDC_STATIC, 4, 36, 45, 8, SS_LEFT
LTEXT "Tile :", IDC_STATIC, 4, 46, 45, 8, SS_LEFT
LTEXT "Palette :", IDC_STATIC, 4, 56, 45, 8, SS_LEFT
@ -2209,7 +2269,7 @@ CAPTION "OAM Viewer"
FONT 8, "MS Sans Serif", 0, 0, 1
{
COMBOBOX IDC_SCR_SELECT, 4, 4, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWNLIST
SCROLLBAR IDC_SCROLLER, 48, 20, 20, 14, WS_VISIBLE | WS_VISIBLE
SCROLLBAR IDC_SCROLLER, 48, 20, 20, 14, NOT WS_VISIBLE | NOT WS_VISIBLE
LTEXT "Mode :", IDC_STATIC, 4, 36, 45, 8, SS_LEFT
LTEXT "Tile :", IDC_STATIC, 4, 46, 45, 8, SS_LEFT
LTEXT "Palette :", IDC_STATIC, 4, 56, 45, 8, SS_LEFT
@ -2246,7 +2306,7 @@ FONT 8, "MS Sans Serif", 0, 0, 1
{
COMBOBOX IDC_PAL_SELECT, 15, 3, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWN
LTEXT "Pal : 0", IDC_PALNUM, 3, 21, 25, 8, SS_LEFT
SCROLLBAR IDC_SCROLLER, 30, 18, 20, 14, WS_VISIBLE | WS_VISIBLE
SCROLLBAR IDC_SCROLLER, 30, 18, 20, 14, NOT WS_VISIBLE | NOT WS_VISIBLE
PUSHBUTTON "&Luk", IDC_FERMER, 35, 169, 50, 14, BS_PUSHBUTTON
AUTOCHECKBOX "&Auto-update", IDC_AUTO_UPDATE, 13, 150, 54, 14, BS_AUTOCHECKBOX
EDITTEXT IDC_AUTO_UPDATE_SECS, 68, 151, 12, 14, WS_DISABLED | ES_AUTOHSCROLL | ES_READONLY
@ -2264,7 +2324,7 @@ FONT 8, "MS Sans Serif", 0, 0, 1
{
COMBOBOX IDC_PAL_SELECT, 15, 3, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWN
LTEXT "Pal : 0", IDC_PALNUM, 3, 21, 25, 8, SS_LEFT
SCROLLBAR IDC_SCROLLER, 30, 18, 20, 14, WS_VISIBLE | WS_VISIBLE
SCROLLBAR IDC_SCROLLER, 30, 18, 20, 14, NOT WS_VISIBLE | NOT WS_VISIBLE
PUSHBUTTON "&Close", IDC_FERMER, 35, 169, 50, 14, BS_PUSHBUTTON
AUTOCHECKBOX "&Auto-update", IDC_AUTO_UPDATE, 13, 150, 54, 14, BS_AUTOCHECKBOX
EDITTEXT IDC_AUTO_UPDATE_SECS, 68, 151, 12, 14, WS_DISABLED | ES_AUTOHSCROLL | ES_READONLY
@ -2282,7 +2342,7 @@ FONT 8, "MS Sans Serif", 0, 0, 1
{
COMBOBOX IDC_PAL_SELECT, 15, 3, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWN
LTEXT "Pal : 0", IDC_PALNUM, 3, 21, 25, 8, SS_LEFT
SCROLLBAR IDC_SCROLLER, 30, 18, 20, 14, WS_VISIBLE | WS_VISIBLE
SCROLLBAR IDC_SCROLLER, 30, 18, 20, 14, NOT WS_VISIBLE | NOT WS_VISIBLE
AUTOCHECKBOX "Auto-update", IDC_AUTO_UPDATE, 60, 18, 75, 14, BS_AUTOCHECKBOX
PUSHBUTTON "&Fermer", IDC_FERMER, 35, 169, 50, 14, BS_PUSHBUTTON
AUTOCHECKBOX "&Auto-update", IDC_AUTO_UPDATE2, 13, 150, 54, 14, BS_AUTOCHECKBOX
@ -2293,6 +2353,120 @@ FONT 8, "MS Sans Serif", 0, 0, 1
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDD_RAMSEARCH DIALOGEX 0, 0, 287, 292
STYLE DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_GROUP | WS_POPUP | WS_SYSMENU
CAPTION " RAM Search"
FONT 8, "MS Shell Dlg", 400, 0, 1
{
CONTROL "", IDC_RAMLIST, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_SHOWSELALWAYS | LVS_OWNERDATA | LVS_REPORT, 9, 9, 214, 151, WS_EX_CLIENTEDGE
PUSHBUTTON "&Search", IDC_C_SEARCH, 226, 9, 52, 16, BS_PUSHBUTTON
PUSHBUTTON "&Add Cheat", IDC_C_ADDCHEAT, 226, 145, 52, 16, WS_DISABLED | BS_PUSHBUTTON
PUSHBUTTON "&Watch", IDC_C_WATCH, 226, 127, 52, 16, BS_PUSHBUTTON
PUSHBUTTON "&Reset", IDC_C_RESET, 226, 27, 52, 16, BS_PUSHBUTTON
PUSHBUTTON "&Eliminate", IDC_C_ELIMINATE, 226, 109, 52, 16, BS_PUSHBUTTON
GROUPBOX "Comparison Operator", IDC_STATIC, 10, 166, 102, 118, 0, WS_EX_TRANSPARENT
AUTORADIOBUTTON "Less Than", IDC_LESSTHAN, 14, 178, 95, 11, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Greater Than", IDC_MORETHAN, 14, 191, 95, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Less Than or Equal To", IDC_NOMORETHAN, 14, 204, 95, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Greater Than or Equal To", IDC_NOLESSTHAN, 14, 217, 95, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Equal To", IDC_EQUALTO, 14, 230, 95, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Not Equal To", IDC_DIFFERENTFROM, 14, 243, 95, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Different By:", IDC_DIFFERENTBY, 14, 256, 52, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Modulo", IDC_MODULO, 14, 269, 35, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
EDITTEXT IDC_EDIT_DIFFBY, 69, 255, 38, 12, WS_DISABLED | ES_AUTOHSCROLL | ES_UPPERCASE
EDITTEXT IDC_EDIT_MODBY, 51, 267, 38, 12, WS_DISABLED | ES_AUTOHSCROLL | ES_UPPERCASE
GROUPBOX "Compare To / By", IDC_STATIC, 118, 166, 153, 58, 0, WS_EX_TRANSPARENT
AUTORADIOBUTTON "Previous Value", IDC_PREVIOUSVALUE, 121, 176, 67, 10, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Specific Value:", IDC_SPECIFICVALUE, 121, 187, 67, 10, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Specific Address:", IDC_SPECIFICADDRESS, 121, 198, 67, 10, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Number of Changes:", IDC_NUMBEROFCHANGES, 121, 209, 76, 10, WS_TABSTOP | BS_AUTORADIOBUTTON
EDITTEXT IDC_EDIT_COMPAREVALUE, 203, 183, 63, 12, WS_DISABLED | ES_AUTOHSCROLL | ES_UPPERCASE
EDITTEXT IDC_EDIT_COMPAREADDRESS, 203, 195, 63, 12, WS_DISABLED | ES_AUTOHSCROLL | ES_UPPERCASE
EDITTEXT IDC_EDIT_COMPARECHANGES, 203, 207, 63, 12, WS_DISABLED | ES_AUTOHSCROLL | ES_UPPERCASE
GROUPBOX "Data Type / Display", IDC_STATIC, 196, 227, 75, 44, 0, WS_EX_TRANSPARENT
AUTORADIOBUTTON "Signed", IDC_SIGNED, 200, 237, 67, 9, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Unsigned", IDC_UNSIGNED, 200, 248, 67, 9, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Hexadecimal", IDC_HEX, 200, 259, 67, 9, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTOCHECKBOX "Autosearch", IDC_C_AUTOSEARCH, 200, 273, 52, 11, BS_AUTOCHECKBOX
GROUPBOX "Data Size", IDC_STATIC, 117, 227, 73, 57, 0, WS_EX_TRANSPARENT
AUTORADIOBUTTON "1 byte", IDC_1_BYTE, 121, 237, 61, 11, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "2 bytes", IDC_2_BYTES, 121, 248, 61, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "4 bytes", IDC_4_BYTES, 121, 259, 61, 11, WS_TABSTOP | BS_AUTORADIOBUTTON
AUTOCHECKBOX "Check Misaligned", IDC_MISALIGN, 121, 272, 65, 8, BS_AUTOCHECKBOX
PUSHBUTTON "&Clear Change Counts", IDC_C_RESET_CHANGES, 226, 46, 52, 20, BS_PUSHBUTTON | BS_MULTILINE
PUSHBUTTON "&Undo", IDC_C_UNDO, 226, 69, 52, 16, WS_DISABLED | BS_PUSHBUTTON
LTEXT "Is", IDC_STATIC, 92, 270, 12, 8, SS_LEFT
}
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDD_RAMWATCH DIALOGEX 0, 0, 269, 298
STYLE DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_GROUP | WS_POPUP | WS_SYSMENU
CAPTION " RAM Watch"
MENU RAMWATCH_MENU
FONT 8, "MS Shell Dlg", 400, 0, 1
{
CONTROL "", IDC_WATCHLIST, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_SHOWSELALWAYS | LVS_OWNERDATA | LVS_SINGLESEL | LVS_REPORT, 9, 9, 210, 279, WS_EX_CLIENTEDGE
PUSHBUTTON "Edit", IDC_C_WATCH_EDIT, 226, 66, 34, 14, BS_PUSHBUTTON
PUSHBUTTON "Remove", IDC_C_WATCH_REMOVE, 226, 83, 34, 14, BS_PUSHBUTTON
PUSHBUTTON "New", IDC_C_WATCH, 226, 100, 34, 14, BS_PUSHBUTTON
PUSHBUTTON "Duplicate", IDC_C_WATCH_DUPLICATE, 226, 117, 34, 14, BS_PUSHBUTTON
PUSHBUTTON "Add Cheat", IDC_C_ADDCHEAT, 222, 140, 42, 16, WS_DISABLED | BS_PUSHBUTTON
GROUPBOX "Watches", IDC_STATIC, 222, 11, 42, 125
CONTROL "", ID_WATCHES_UPDOWN, UPDOWN_CLASS, WS_TABSTOP, 232, 23, 19, 36
}
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDD_RECORDMOVIE DIALOGEX 0, 0, 301, 89
STYLE DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
CAPTION "Record movie"
FONT 8, "MS Shell Dlg", 400, 0, 1
{
DEFPUSHBUTTON "OK", IDOK, 177, 62, 50, 14, BS_DEFPUSHBUTTON
GROUPBOX "", 65501, 11, 9, 269, 47
PUSHBUTTON "Cancel", IDCANCEL, 231, 62, 50, 14, BS_PUSHBUTTON
EDITTEXT IDC_EDIT_FILENAME, 49, 20, 189, 12, ES_AUTOHSCROLL
PUSHBUTTON "...", IDC_BUTTON_BROWSEFILE, 249, 20, 18, 14, BS_PUSHBUTTON
EDITTEXT IDC_EDIT_AUTHOR, 49, 36, 189, 14, ES_AUTOHSCROLL
LTEXT "File:", IDC_STATIC, 31, 22, 14, 8, SS_LEFT
LTEXT "Author:", IDC_STATIC, 21, 38, 25, 8, SS_LEFT
}
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_REPLAYINP DIALOGEX 0, 0, 300, 79
STYLE DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
CAPTION "Play Movie"
FONT 8, "MS Shell Dlg", 0, 0, 0
{
DEFPUSHBUTTON "OK", 1, 186, 60, 50, 14, BS_DEFPUSHBUTTON
GROUPBOX "", 65497, 3, 0, 293, 57
RTEXT "File:", 65498, 7, 14, 24, 10, NOT WS_GROUP | SS_RIGHT | SS_CENTERIMAGE
PUSHBUTTON "Cancel", 2, 246, 60, 50, 14, BS_PUSHBUTTON
AUTOCHECKBOX "Open &Read-Only", IDC_CHECK_READONLY, 18, 33, 69, 10, BS_AUTOCHECKBOX
PUSHBUTTON "Browse...", ID_BROWSE, 224, 12, 50, 14, BS_PUSHBUTTON
EDITTEXT PM_FILENAME, 35, 12, 184, 14, ES_AUTOHSCROLL | ES_READONLY
}
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDD_REPLAY_METADATA DIALOGEX 0, 0, 325, 250
STYLE DS_MODALFRAME | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
CAPTION "Movie Metadata"
FONT 8, "MS Shell Dlg", 400, 0, 1
{
DEFPUSHBUTTON "Close", IDCANCEL, 268, 229, 50, 14, BS_DEFPUSHBUTTON
CONTROL "", 1130, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT, 7, 7, 311, 214
}
LANGUAGE LANG_DANISH, SUBLANG_DANISH_DENMARK
IDD_SOUNDSETTINGS DIALOGEX 0, 0, 174, 96
STYLE DS_CENTER | DS_MODALFRAME | DS_SETFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
@ -2341,7 +2515,7 @@ FONT 8, "MS Sans Serif", 0, 0, 1
{
COMBOBOX IDC_PAL_SELECT, 4, 13, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWN
LTEXT "Pal : 0", IDC_PALNUM, 4, 31, 25, 8, SS_LEFT
SCROLLBAR IDC_SCROLLER, 30, 28, 20, 14, WS_VISIBLE | WS_VISIBLE
SCROLLBAR IDC_SCROLLER, 30, 28, 20, 14, NOT WS_VISIBLE | NOT WS_VISIBLE
COMBOBOX IDC_MEM_SELECT, 4, 50, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWN
AUTORADIOBUTTON "Bitmap", IDC_BITMAP, 4, 68, 35, 10, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "256 Farver", IDC_256COUL, 4, 80, 55, 10, WS_TABSTOP | BS_AUTORADIOBUTTON
@ -2366,7 +2540,7 @@ FONT 8, "MS Sans Serif", 0, 0, 1
{
COMBOBOX IDC_PAL_SELECT, 4, 13, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWN
LTEXT "Pal : 0", IDC_PALNUM, 4, 31, 25, 8, SS_LEFT
SCROLLBAR IDC_SCROLLER, 30, 28, 20, 14, WS_VISIBLE | WS_VISIBLE
SCROLLBAR IDC_SCROLLER, 30, 28, 20, 14, NOT WS_VISIBLE | NOT WS_VISIBLE
COMBOBOX IDC_MEM_SELECT, 4, 50, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWN
AUTORADIOBUTTON "Bitmap", IDC_BITMAP, 4, 68, 35, 10, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "256 colors", IDC_256COUL, 4, 80, 55, 10, WS_TABSTOP | BS_AUTORADIOBUTTON
@ -2391,7 +2565,7 @@ FONT 8, "MS Sans Serif", 0, 0, 1
{
COMBOBOX IDC_PAL_SELECT, 4, 13, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWN
LTEXT "Pal : 0", IDC_PALNUM, 4, 31, 25, 8, SS_LEFT
SCROLLBAR IDC_SCROLLER, 30, 28, 20, 14, WS_VISIBLE | WS_VISIBLE
SCROLLBAR IDC_SCROLLER, 30, 28, 20, 14, NOT WS_VISIBLE | NOT WS_VISIBLE
COMBOBOX IDC_MEM_SELECT, 4, 50, 90, 14, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWN
AUTORADIOBUTTON "Bitmap", IDC_BITMAP, 4, 68, 35, 10, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON
AUTORADIOBUTTON "256 couleurs", IDC_256COUL, 4, 80, 55, 10, WS_TABSTOP | BS_AUTORADIOBUTTON
@ -2421,13 +2595,3 @@ FONT 8, "Ms Shell Dlg"
COMBOBOX IDC_BRIDGEADAPTER, 15, 30, 300, 45, CBS_DROPDOWNLIST | CBS_HASSTRINGS
LTEXT "(wifi emulation is not yet complete. this doesn't work.)", IDC_STATIC, 15, 48, 166, 8, SS_LEFT
}
//
// Accelerator resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDR_MAIN_ACCEL ACCELERATORS
{
}

View File

@ -0,0 +1,24 @@
#pragma once
// The following macros define the minimum required platform. The minimum required platform
// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
// your application. The macros work by enabling all features available on platform versions up to and
// including the version specified.
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0.
#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE.
#endif