From 6f9831ec68b902c79f38ef0a69f9717cce19910a Mon Sep 17 00:00:00 2001 From: zeromus Date: Wed, 25 Jun 2008 06:34:08 +0000 Subject: [PATCH] 7zip archive browsing configurable no-bg-render fill color change to poweron sequence for movies. hopefully that wont break any compatibility..... --- src/driver.h | 6 +- src/drivers/win/7zip.cpp | 416 +++++++++++++++++++++++++++++++ src/drivers/win/7zip/IArchive.h | 173 +++++++++++++ src/drivers/win/7zip/IProgress.h | 32 +++ src/drivers/win/7zip/IStream.h | 62 +++++ src/drivers/win/7zip/MyUnknown.h | 24 ++ src/drivers/win/7zip/PropID.h | 50 ++++ src/drivers/win/7zip/Types.h | 19 ++ src/drivers/win/7zip/readme.txt | 225 +++++++++++++++++ src/drivers/win/7zxa.dll | Bin 0 -> 76288 bytes src/drivers/win/config.cpp | 6 +- src/drivers/win/main.h | 1 - src/drivers/win/res.rc | 100 +++++--- src/drivers/win/resource.h | 3 +- src/drivers/win/window.cpp | 48 ++-- src/drivers/win/window.h | 2 +- src/fceu.cpp | 159 ++++++------ src/movie.cpp | 46 ++-- src/ppu.cpp | 11 +- vc8/fceux.vcproj | 5 + 20 files changed, 1213 insertions(+), 175 deletions(-) create mode 100644 src/drivers/win/7zip.cpp create mode 100644 src/drivers/win/7zip/IArchive.h create mode 100644 src/drivers/win/7zip/IProgress.h create mode 100644 src/drivers/win/7zip/IStream.h create mode 100644 src/drivers/win/7zip/MyUnknown.h create mode 100644 src/drivers/win/7zip/PropID.h create mode 100644 src/drivers/win/7zip/Types.h create mode 100644 src/drivers/win/7zip/readme.txt create mode 100644 src/drivers/win/7zxa.dll diff --git a/src/driver.h b/src/driver.h index 440201da..a88cdd5d 100644 --- a/src/driver.h +++ b/src/driver.h @@ -89,9 +89,13 @@ void FCEUI_DisableSpriteLimitation(int a); void FCEUI_SetRenderPlanes(bool sprites, bool bg); void FCEUI_GetRenderPlanes(bool& sprites, bool& bg); -//name=path and file to load. returns 0 on failure, 1 on success +//name=path and file to load. returns null if it failed FCEUGI *FCEUI_LoadGame(const char *name, int OverwriteVidMode); +//same as FCEUI_LoadGame, except that it can load from a tempfile. +//name is the actual path to open; logicalname is what the emulator should think it is +FCEUGI *FCEUI_LoadGameVirtual(const char *name, const char *logicalname, int OverwriteVidMode); + //general purpose emulator initialization. returns true if successful bool FCEUI_Initialize(); diff --git a/src/drivers/win/7zip.cpp b/src/drivers/win/7zip.cpp new file mode 100644 index 00000000..e9f6c504 --- /dev/null +++ b/src/drivers/win/7zip.cpp @@ -0,0 +1,416 @@ +#include +#include +#include +#include + +#include +#include +#include + +#include "7zip/IArchive.h" + +#include "driver.h" +#include "main.h" + +DEFINE_GUID(CLSID_CFormat7z,0x23170F69,0x40C1,0x278A,0x10,0x00,0x00,0x01,0x10,0x07,0x00,0x00); + +class OutStream : public IArchiveExtractCallback +{ + class SeqStream : public ISequentialOutStream + { + uint8* const output; + uint32 pos; + const uint32 size; + ULONG refCount; + + HRESULT STDMETHODCALLTYPE QueryInterface(REFGUID,void**) + { + return E_NOINTERFACE; + } + + HRESULT STDMETHODCALLTYPE Write(const void* data,UInt32 length,UInt32* save) + { + if (data != NULL || size == 0) + { + //NST_VERIFY( length <= size - pos ); + + if (length > size - pos) + length = size - pos; + + std::memcpy( output + pos, data, length ); + pos += length; + + if (save) + *save = length; + + return S_OK; + } + else + { + return E_INVALIDARG; + } + } + + ULONG STDMETHODCALLTYPE AddRef() + { + return ++refCount; + } + + ULONG STDMETHODCALLTYPE Release() + { + return --refCount; + } + + public: + + SeqStream(void* d,uint32 s) + : output(static_cast(d)), pos(0), size(s), refCount(0) {} + + uint32 Size() const + { + return pos; + } + }; + + SeqStream seqStream; + const uint32 index; + ULONG refCount; + + HRESULT STDMETHODCALLTYPE QueryInterface(REFGUID,void**) + { + return E_NOINTERFACE; + } + + HRESULT STDMETHODCALLTYPE PrepareOperation(Int32) + { + return S_OK; + } + + HRESULT STDMETHODCALLTYPE SetTotal(UInt64) + { + return S_OK; + } + + HRESULT STDMETHODCALLTYPE SetCompleted(const UInt64*) + { + return S_OK; + } + + HRESULT STDMETHODCALLTYPE SetOperationResult(Int32) + { + return S_OK; + } + + HRESULT STDMETHODCALLTYPE GetStream(UInt32 id,ISequentialOutStream** ptr,Int32 mode) + { + switch (mode) + { + case NArchive::NExtract::NAskMode::kExtract: + case NArchive::NExtract::NAskMode::kTest: + + if (id != index || ptr == NULL) + return S_FALSE; + else + *ptr = &seqStream; + + case NArchive::NExtract::NAskMode::kSkip: + return S_OK; + + default: + return E_INVALIDARG; + } + } + + ULONG STDMETHODCALLTYPE AddRef() + { + return ++refCount; + } + + ULONG STDMETHODCALLTYPE Release() + { + return --refCount; + } + +public: + + OutStream(uint32 index,void* data,uint32 size) + : seqStream(data,size), index(index), refCount(0) {} + + uint32 Size() const + { + return seqStream.Size(); + } +}; + +class InStream : public IInStream, private IStreamGetSize +{ + ULONG refCount; + + HRESULT STDMETHODCALLTYPE QueryInterface(REFGUID,void**) + { + return E_NOINTERFACE; + } + + HRESULT STDMETHODCALLTYPE GetSize(UInt64* save) + { + if (save) + { + *save = size; + return S_OK; + } + else + { + return E_INVALIDARG; + } + } + + ULONG STDMETHODCALLTYPE AddRef() + { + return ++refCount; + } + + ULONG STDMETHODCALLTYPE Release() + { + return --refCount; + } + +protected: + + uint32 size; + +public: + + explicit InStream() + : refCount(0) + {} +}; + + +class InFileStream : public InStream +{ +public: + + ~InFileStream() + { + if(inf) delete inf; + } + + std::fstream* inf; + + InFileStream(std::string fname) + : inf(0) + { + inf = FCEUD_UTF8_fstream(fname,"rb"); + if(inf) + { + inf->seekg(0,std::ios::end); + size = inf->tellg(); + inf->seekg(0,std::ios::beg); + } + } + + HRESULT STDMETHODCALLTYPE Read(void* data,UInt32 length,UInt32* save) + { + if(!inf) return E_FAIL; + + if (data != NULL || length == 0) + { + inf->read((char*)data,length); + length = inf->gcount(); + + //do we need to do + //return E_FAIL; + + if (save) + *save = length; + + return S_OK; + } + else + { + return E_INVALIDARG; + } + } + + HRESULT STDMETHODCALLTYPE Seek(Int64 offset,UInt32 origin,UInt64* pos) + { + if(!inf) return E_FAIL; + + if (origin < 3) + { + std::ios::off_type offtype; + switch(origin) + { + case 0: offtype = std::ios::beg; break; + case 1: offtype = std::ios::cur; break; + case 2: offtype = std::ios::end; break; + default: + return E_INVALIDARG; + } + inf->seekg(offset,offtype); + origin = inf->tellg(); + + if (pos) + *pos = origin; + + return S_OK; + } + else + { + return E_INVALIDARG; + } + + } +}; + + +class LibRef +{ +public: + HMODULE hmod; + LibRef(const char* fname) { + hmod = LoadLibrary("7zxa.dll"); + } + ~LibRef() { + if(hmod) + FreeLibrary(hmod); + } +}; + +struct FileSelectorContext +{ + struct Item + { + std::string name; + uint32 size, index; + }; + std::vector items; +} *currFileSelectorContext; + + + +static BOOL CALLBACK ArchiveFileSelectorCallback(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + HWND hwndListbox = GetDlgItem(hwndDlg,IDC_LIST1); + for(uint32 i=0;iitems.size();i++) + { + std::string& name = currFileSelectorContext->items[i].name; + SendMessage(hwndListbox,LB_ADDSTRING,0,(LPARAM)name.c_str()); + } + } + break; + + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDC_LIST1: + if(HIWORD(wParam) == LBN_DBLCLK) + { + EndDialog(hwndDlg,SendMessage((HWND)lParam,LB_GETCURSEL,0,0)); + } + return TRUE; + + case IDOK: + EndDialog(hwndDlg,SendMessage((HWND)lParam,LB_GETCURSEL,0,0)); + return TRUE; + + case IDCANCEL: + EndDialog(hwndDlg, LB_ERR); + return TRUE; + } + break; + } + return FALSE; +} + +void do7zip(HWND hParent, std::string fname) +{ + LibRef libref("7zxa.dll"); + if(!libref.hmod) { + MessageBox(hParent,"Could not locate 7zxa.dll","Failure launching 7z archive browser",0); + return; + } + + typedef UINT32 (WINAPI *CreateObjectFunc)(const GUID*,const GUID*,void**); + CreateObjectFunc CreateObject = (CreateObjectFunc)GetProcAddress(libref.hmod,"CreateObject"); + if(!CreateObject) + { + MessageBox(hParent,"7zxa.dll was invalid","Failure launching 7z archive browser",0); + return; + } + + IInArchive* object; + if (!FAILED(CreateObject( &CLSID_CFormat7z, &IID_IInArchive, (void**)&object ))) + { + InFileStream ifs(fname); + if (SUCCEEDED(object->Open(&ifs,0,0))) + { + uint32 numFiles; + if (SUCCEEDED(object->GetNumberOfItems(&numFiles))) + { + FileSelectorContext fileSelectorContext; + currFileSelectorContext = &fileSelectorContext; + + for(uint32 i=0;iGetProperty( i, kpidSize, &prop )) || prop.vt != VT_UI8 || !prop.uhVal.LowPart || prop.uhVal.HighPart) + continue; + + item.size = prop.uhVal.LowPart; + + if (FAILED(object->GetProperty( i, kpidPath, &prop )) || prop.vt != VT_BSTR || prop.bstrVal == NULL) + continue; + + + std::wstring tempfname = prop.bstrVal; + int buflen = tempfname.size()*2; + char* buf = new char[buflen]; + int ret = WideCharToMultiByte(CP_ACP,0,tempfname.c_str(),tempfname.size(),buf,buflen,0,0); + if(ret == 0) { + delete[] buf; + continue; + } + buf[ret] = 0; + item.name = buf; + delete[] buf; + + ::VariantClear( reinterpret_cast(&prop) ); + + fileSelectorContext.items.push_back(item); + } + + int ret = DialogBoxParam(fceu_hInstance, "7ZIPARCHIVEDIALOG", hParent, ArchiveFileSelectorCallback, (LPARAM)0); + if(ret != LB_ERR) + { + FileSelectorContext::Item& item = fileSelectorContext.items[ret]; + std::vector data(item.size); + OutStream outStream( item.index, &data[0], item.size); + const uint32 indices[1] = {item.index}; + if (SUCCEEDED(object->Extract(indices,1,0,&outStream))) + { + char* tempname = tmpnam(0); + FILE* outf = fopen(tempname,"wb"); + fwrite(&data[0],1,item.size,outf); + fclose(outf); + void ALoad(char *nameo,char* actualfile); + ALoad((char*)item.name.c_str(),tempname); + + } //if we extracted the file correctly + + } //if returned a file from the fileselector + + } //if we scanned the 7z correctly + } //if we opened the 7z correctly + object->Release(); + } +} \ No newline at end of file diff --git a/src/drivers/win/7zip/IArchive.h b/src/drivers/win/7zip/IArchive.h new file mode 100644 index 00000000..2cfdfc2d --- /dev/null +++ b/src/drivers/win/7zip/IArchive.h @@ -0,0 +1,173 @@ +// IArchive.h + +#ifndef __IARCHIVE_H +#define __IARCHIVE_H + +#include "IStream.h" +#include "IProgress.h" +#include "PropID.h" + +// MIDL_INTERFACE("23170F69-40C1-278A-0000-000600xx0000") +#define ARCHIVE_INTERFACE_SUB(i, base, x) \ +DEFINE_GUID(IID_ ## i, \ +0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x06, 0x00, x, 0x00, 0x00); \ +struct i: public base + +#define ARCHIVE_INTERFACE(i, x) ARCHIVE_INTERFACE_SUB(i, IUnknown, x) + +namespace NFileTimeType +{ + enum EEnum + { + kWindows, + kUnix, + kDOS + }; +} + +namespace NArchive +{ + enum + { + kName = 0, + kClassID, + kExtension, + kAddExtension, + kUpdate, + kKeepName, + kStartSignature, + kFinishSignature, + kAssociate + }; + + namespace NExtract + { + namespace NAskMode + { + enum + { + kExtract = 0, + kTest, + kSkip + }; + } + namespace NOperationResult + { + enum + { + kOK = 0, + kUnSupportedMethod, + kDataError, + kCRCError + }; + } + } + namespace NUpdate + { + namespace NOperationResult + { + enum + { + kOK = 0, + kError + }; + } + } +} + +ARCHIVE_INTERFACE(IArchiveOpenCallback, 0x10) +{ + STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes) PURE; + STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes) PURE; +}; + + +ARCHIVE_INTERFACE_SUB(IArchiveExtractCallback, IProgress, 0x20) +{ + STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, + Int32 askExtractMode) PURE; + // GetStream OUT: S_OK - OK, S_FALSE - skeep this file + STDMETHOD(PrepareOperation)(Int32 askExtractMode) PURE; + STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) PURE; +}; + + +ARCHIVE_INTERFACE(IArchiveOpenVolumeCallback, 0x30) +{ + STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value) PURE; + STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream) PURE; +}; + + +ARCHIVE_INTERFACE(IInArchiveGetStream, 0x40) +{ + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream) PURE; +}; + + +ARCHIVE_INTERFACE(IArchiveOpenSetSubArchiveName, 0x50) +{ + STDMETHOD(SetSubArchiveName)(const wchar_t *name) PURE; +}; + + +ARCHIVE_INTERFACE(IInArchive, 0x60) +{ + STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, + IArchiveOpenCallback *openArchiveCallback) PURE; + STDMETHOD(Close)() PURE; + STDMETHOD(GetNumberOfItems)(UInt32 *numItems) PURE; + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE; + STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) PURE; + // indices must be sorted + // numItems = 0xFFFFFFFF means all files + // testMode != 0 means "test files operation" + + STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value) PURE; + + STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties) PURE; + STDMETHOD(GetPropertyInfo)(UInt32 index, + BSTR *name, PROPID *propID, VARTYPE *varType) PURE; + + STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProperties) PURE; + STDMETHOD(GetArchivePropertyInfo)(UInt32 index, + BSTR *name, PROPID *propID, VARTYPE *varType) PURE; +}; + + +ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback, IProgress, 0x80) +{ + STDMETHOD(GetUpdateItemInfo)(UInt32 index, + Int32 *newData, // 1 - new data, 0 - old data + Int32 *newProperties, // 1 - new properties, 0 - old properties + UInt32 *indexInArchive // -1 if there is no in archive, or if doesn't matter + ) PURE; + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE; + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream) PURE; + STDMETHOD(SetOperationResult)(Int32 operationResult) PURE; +}; + + +ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82) +{ + STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size) PURE; + STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream) PURE; +}; + + +ARCHIVE_INTERFACE(IOutArchive, 0xA0) +{ + STDMETHOD(UpdateItems)(ISequentialOutStream *outStream, UInt32 numItems, + IArchiveUpdateCallback *updateCallback) PURE; + STDMETHOD(GetFileTimeType)(UInt32 *type) PURE; +}; + + +ARCHIVE_INTERFACE(ISetProperties, 0x03) +{ + STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) PURE; +}; + + +#endif diff --git a/src/drivers/win/7zip/IProgress.h b/src/drivers/win/7zip/IProgress.h new file mode 100644 index 00000000..c94b7f4c --- /dev/null +++ b/src/drivers/win/7zip/IProgress.h @@ -0,0 +1,32 @@ +// Interface/IProgress.h + +#ifndef __IPROGRESS_H +#define __IPROGRESS_H + +#include "MyUnknown.h" +#include "Types.h" + +// {23170F69-40C1-278A-0000-000000050000} +DEFINE_GUID(IID_IProgress, +0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00); +MIDL_INTERFACE("23170F69-40C1-278A-0000-000000050000") +IProgress: public IUnknown +{ + STDMETHOD(SetTotal)(UInt64 total) PURE; + STDMETHOD(SetCompleted)(const UInt64 *completeValue) PURE; +}; + +/* +// {23170F69-40C1-278A-0000-000000050002} +DEFINE_GUID(IID_IProgress2, +0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02); +MIDL_INTERFACE("23170F69-40C1-278A-0000-000000050002") +IProgress2: public IUnknown +{ +public: + STDMETHOD(SetTotal)(const UInt64 *total) PURE; + STDMETHOD(SetCompleted)(const UInt64 *completeValue) PURE; +}; +*/ + +#endif diff --git a/src/drivers/win/7zip/IStream.h b/src/drivers/win/7zip/IStream.h new file mode 100644 index 00000000..1a50af69 --- /dev/null +++ b/src/drivers/win/7zip/IStream.h @@ -0,0 +1,62 @@ +// IStream.h + +#ifndef __ISTREAM_H +#define __ISTREAM_H + +#include "MyUnknown.h" +#include "Types.h" + +// "23170F69-40C1-278A-0000-000300xx0000" + +#define STREAM_INTERFACE_SUB(i, b, x) \ +DEFINE_GUID(IID_ ## i, \ +0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x03, 0x00, x, 0x00, 0x00); \ +struct i: public b + +#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x) + +STREAM_INTERFACE(ISequentialInStream, 0x01) +{ + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE; + /* + Out: if size != 0, return_value = S_OK and (*processedSize == 0), + then there are no more bytes in stream. + if (size > 0) && there are bytes in stream, + this function must read at least 1 byte. + This function is allowed to read less than number of remaining bytes in stream. + You must call Read function in loop, if you need exact amount of data + */ +}; + +STREAM_INTERFACE(ISequentialOutStream, 0x02) +{ + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE; + /* + if (size > 0) this function must write at least 1 byte. + This function is allowed to write less than "size". + You must call Write function in loop, if you need to write exact amount of data + */ +}; + +STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03) +{ + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; +}; + +STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04) +{ + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; + STDMETHOD(SetSize)(Int64 newSize) PURE; +}; + +STREAM_INTERFACE(IStreamGetSize, 0x06) +{ + STDMETHOD(GetSize)(UInt64 *size) PURE; +}; + +STREAM_INTERFACE(IOutStreamFlush, 0x07) +{ + STDMETHOD(Flush)() PURE; +}; + +#endif diff --git a/src/drivers/win/7zip/MyUnknown.h b/src/drivers/win/7zip/MyUnknown.h new file mode 100644 index 00000000..6cd32cad --- /dev/null +++ b/src/drivers/win/7zip/MyUnknown.h @@ -0,0 +1,24 @@ +// MyUnknown.h + +#ifndef __MYUNKNOWN_H +#define __MYUNKNOWN_H + +#ifdef _WIN32 + +#ifdef _WIN32_WCE +#if (_WIN32_WCE > 300) +#include +#else +#define MIDL_INTERFACE(x) struct +#endif +#else +#include +#endif + +#include + +#else +#include "MyWindows.h" +#endif + +#endif diff --git a/src/drivers/win/7zip/PropID.h b/src/drivers/win/7zip/PropID.h new file mode 100644 index 00000000..c42b990a --- /dev/null +++ b/src/drivers/win/7zip/PropID.h @@ -0,0 +1,50 @@ +// Interface/PropID.h + +#ifndef __INTERFACE_PROPID_H +#define __INTERFACE_PROPID_H + +enum +{ + kpidNoProperty = 0, + + kpidHandlerItemIndex = 2, + kpidPath, + kpidName, + kpidExtension, + kpidIsFolder, + kpidSize, + kpidPackedSize, + kpidAttributes, + kpidCreationTime, + kpidLastAccessTime, + kpidLastWriteTime, + kpidSolid, + kpidCommented, + kpidEncrypted, + kpidSplitBefore, + kpidSplitAfter, + kpidDictionarySize, + kpidCRC, + kpidType, + kpidIsAnti, + kpidMethod, + kpidHostOS, + kpidFileSystem, + kpidUser, + kpidGroup, + kpidBlock, + kpidComment, + kpidPosition, + + kpidTotalSize = 0x1100, + kpidFreeSpace, + kpidClusterSize, + kpidVolumeName, + + kpidLocalName = 0x1200, + kpidProvider, + + kpidUserDefined = 0x10000 +}; + +#endif diff --git a/src/drivers/win/7zip/Types.h b/src/drivers/win/7zip/Types.h new file mode 100644 index 00000000..52d07081 --- /dev/null +++ b/src/drivers/win/7zip/Types.h @@ -0,0 +1,19 @@ +// Common/Types.h + +#ifndef __COMMON_TYPES_H +#define __COMMON_TYPES_H + +typedef unsigned char Byte; +typedef short Int16; +typedef unsigned short UInt16; +typedef int Int32; +typedef unsigned int UInt32; +#ifdef _MSC_VER +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else +typedef long long int Int64; +typedef unsigned long long int UInt64; +#endif + +#endif diff --git a/src/drivers/win/7zip/readme.txt b/src/drivers/win/7zip/readme.txt new file mode 100644 index 00000000..33fb406d --- /dev/null +++ b/src/drivers/win/7zip/readme.txt @@ -0,0 +1,225 @@ +7-Zip 4.27 Sources +------------------ + +7-Zip is a file archiver for Windows 95/98/ME/NT/2000/2003/XP. + +7-Zip Copyright (C) 1999-2005 Igor Pavlov. + + +License Info +------------ + +Most of 7-Zip source code is under GNU LGPL. + +Files in folders + 7zip/Compress/Rar20 + 7zip/Compress/Rar29 + 7zip/Compress/Rar29/Original +are licensed under "unRAR license + GNU LGPL" license. +Source code files in all other folders of this package are under GNU LGPL. + +"unRAR license + GNU LGPL" means that you must follow +GNU LGPL in all aspects while it is in agreement +with unRAR license. But you can not break unRAR license rules. +It means that unRAR license is main license in that pair. + +You can find unRAR license in file unrarLicense.txt +You can find GNU LGPL license in file copying.txt + + +GNU LGPL information: +--------------------- + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +unRAR license + GNU LGPL Notes +------------------------------ + +Please check main restriction from unRar license: + + 2. The unRAR sources may be used in any software to handle RAR + archives without limitations free of charge, but cannot be used + to re-create the RAR compression algorithm, which is proprietary. + Distribution of modified unRAR sources in separate form or as a + part of other software is permitted, provided that it is clearly + stated in the documentation and source comments that the code may + not be used to develop a RAR (WinRAR) compatible archiver. + +In brief it means: +1) You can compile and use compiled files under GNU LGPL rules, since + unRAR license almost has no restrictions for compiled files. + You can link these compiled files to LGPL programs. +2) You can fix bugs in source code and use compiled fixed version. +3) You can not use unRAR sources to re-create the RAR compression algorithm. + + +7zip\Compress\Rar29\Original folder contains files that are modified +versions of original unRAR source code files. + + +License notes +------------- + +You can support development of 7-Zip by registering. + +7-Zip is free software distributed under the GNU LGPL. +If you need license with other conditions, write to +http://www.7-zip.org/support.html + +--- +Also this package contains files from LZMA SDK +you can download LZMA SDK from this page: +http://www.7-zip.org/sdk.html +read about addtional licenses for LZMA SDK in file +DOC/lzma.txt + + +How to compile +-------------- +To compile sources you need Visual C++ 6.0. +For compiling some files you also need +new Platform SDK from Microsoft' Site: +http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm +or +http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm +or +http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ + +If you use MSVC6, specify SDK directories at top of directories lists: +Tools / Options / Directories + - Include files + - Library files + + +To compile 7-Zip for AMD64 and IA64 you need: + Windows Server 2003 SP1 Platform SDK from microsoft.com + + + +Compiling under Unix/Linux +-------------------------- +Check this site for Posix/Linux version: +http://sourceforge.net/projects/p7zip/ + + +Notes: +------ +7-Zip consists of COM modules (DLL files). +But 7-Zip doesn't use standard COM interfaces for creating objects. +Look at +7zip\UI\Client7z folder for example of using DLL files of 7-Zip. +Some DLL files can use other DLL files from 7-Zip. +If you don't like it, you must use standalone version of DLL. +To compile standalone version of DLL you must include all used parts +to project and define some defs. +For example, 7zip\Bundles\Format7z is a standalone version of 7z.dll +that works with 7z format. So you can use such DLL in your project +without additional DLL files. + + +Description of 7-Zip sources package +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +DOC Documentation +--- + 7zFormat.txt - 7z format description + copying.txt - GNU LGPL license + unRarLicense.txt - License for unRAR part of source code + history.txt - Sources history + Methods.txt - Compression method IDs + readme.txt - Readme file + lzma.txt - LZMA SDK description + 7zip.nsi - installer script for NSIS + + +Common Common modules +Windows Win32 wrappers + +7zip +------- + Common Common modules for 7-zip + + Archive 7-Zip Archive Format Plugins + -------- + Common + 7z + Arj + BZip2 + Cab + Cpio + GZip + Rar + Rpm + Split + Tar + Zip + + Bundle Modules that are bundles of other modules + ------ + Alone 7za.exe: Standalone version of 7z + SFXCon 7zCon.sfx: Console 7z SFX module + SFXWin 7z.sfx: Windows 7z SFX module + SFXSetup 7zS.sfx: Windows 7z SFX module for Installers + Format7z 7za.dll: Standalone version of 7z.dll + + UI + -- + Agent Intermediary modules for FAR plugin and Explorer plugin + Console 7z.exe Console version + Explorer Explorer plugin + Resource Resources + Far FAR plugin + Client7z Test application for 7za.dll + + Compress + -------- + BZip2 BZip2 compressor + Original Download BZip2 compression sources from + http://sources.redhat.com/bzip2/index.html + to that folder. + Branch Branch converter + ByteSwap Byte Swap converter + Copy Copy coder + Deflate + Implode + Arj + LZMA + PPMd Dmitry Shkarin's PPMdH with small changes. + LZ Lempel - Ziv + MT Multi Thread Match finder + BinTree Match Finder based on Binary Tree + Patricia Match Finder based on Patricia algoritm + HashChain Match Finder based on Hash Chains + + Crypto Crypto modules + ------ + 7zAES Cipher for 7z + AES AES Cipher + Rar20 Cipher for Rar 2.0 + RarAES Cipher for Rar 3.0 + Zip Cipher for Zip + + FileManager File Manager + + +--- +Igor Pavlov +http://www.7-zip.org + + +--- +End of document + diff --git a/src/drivers/win/7zxa.dll b/src/drivers/win/7zxa.dll new file mode 100644 index 0000000000000000000000000000000000000000..1ae7252835a6b2a81c187564e191519f2d5deb88 GIT binary patch literal 76288 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�xM`L9dQU+YmILqCkn-R=a-=SWs(>Qx@T@C+ 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

db(&$quSX9+z-* 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 literal 0 HcmV?d00001 diff --git a/src/drivers/win/config.cpp b/src/drivers/win/config.cpp index 3832aaf4..e7f5d0f7 100644 --- a/src/drivers/win/config.cpp +++ b/src/drivers/win/config.cpp @@ -39,6 +39,8 @@ extern CFGSTRUCT HotkeyConfig[]; extern char *BasicBotDir; extern int autoHoldKey, autoHoldClearKey; +extern uint8 gNoBGFillColor; + //window positions: extern int ChtPosX,ChtPosY; extern int DbgPosX,DbgPosY; @@ -75,7 +77,7 @@ static CFGSTRUCT fceuconfig[] = { ACS(memw_recent_files[3]), ACS(memw_recent_files[4]), - + AC(gNoBGFillColor), AC(ntsccol),AC(ntsctint),AC(ntschue), NAC("palyo",pal_emulation), @@ -85,8 +87,6 @@ static CFGSTRUCT fceuconfig[] = { NAC("sound",soundo), NAC("sicon",status_icon), - ACS(gfsdir), - NACS("odroms",directory_names[0]), NACS("odnonvol",directory_names[1]), NACS("odstates",directory_names[2]), diff --git a/src/drivers/win/main.h b/src/drivers/win/main.h index 47035c40..9bcd14bb 100644 --- a/src/drivers/win/main.h +++ b/src/drivers/win/main.h @@ -41,7 +41,6 @@ extern int pauseAfterPlayback; extern int EnableBackgroundInput; extern int vmod; -static char *gfsdir=0; extern char* directory_names[13]; diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index e4fefda0..1433ba23 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -1244,6 +1244,57 @@ BEGIN DEFPUSHBUTTON "&OK",IDOK,67,52,50,14 END +CDLOGGER DIALOGEX 0, 0, 322, 213 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Code Data Logger" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Load...",BTN_CDLOGGER_LOAD,7,81,50,14 + PUSHBUTTON "Save",BTN_CDLOGGER_SAVE,257,81,50,14 + GROUPBOX "Code Data Log Status",-1,2,4,316,119,BS_CENTER + PUSHBUTTON "Start",BTN_CDLOGGER_START_PAUSE,129,81,50,14 + GROUPBOX "Address Label Logger",65534,3,128,315,79,BS_CENTER + PUSHBUTTON "Load...",111,7,182,50,14,WS_DISABLED + PUSHBUTTON "Start",112,127,181,50,14,WS_DISABLED + PUSHBUTTON "Save...",113,259,181,50,14,WS_DISABLED + LTEXT "4067 - 29.5%",LBL_CDLOGGER_CODECOUNT,38,31,68,11 + GROUPBOX "Bytes Logged As Code",65533,29,20,84,27 + GROUPBOX "Bytes Logged as data",65532,117,20,84,27 + LTEXT "7092 - 37.2%",LBL_CDLOGGER_DATACOUNT,128,31,65,9 + GROUPBOX "Bytes Not Logged",65531,205,20,79,27 + LTEXT "6072 - 32.7%",LBL_CDLOGGER_UNDEFCOUNT,210,31,60,8 + LTEXT "Itsa me the Code Data Logger! Press Start to play!",65530,69,56,172,12 + PUSHBUTTON "Reset Log",BTN_CDLOGGER_RESET,7,66,50,14 + PUSHBUTTON "Save as...",BTN_CDLOGGER_SAVE_AS,257,66,50,14 + PUSHBUTTON "Save Stripped iNes Rom...",BTN_CDLOGGER_SAVE_STRIPPED,213,102,99,14 +END + +PPUVIEW DIALOG 44, 38, 355, 246 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "PPU Viewer" +FONT 8, "MS Sans Serif" +BEGIN + GROUPBOX "Pattern Tables",GRP_PPUVIEW_TABLES,2,-1,351,192,WS_TABSTOP + LTEXT "Tile:",LBL_PPUVIEW_TILE1,6,168,50,10 + LTEXT "Tile:",LBL_PPUVIEW_TILE2,177,168,50,10 + CONTROL "",CTL_PPUVIEW_TRACKBAR,"msctls_trackbar32",WS_TABSTOP,227,178,106,11 + LTEXT "Refresh: More",-1,177,178,50,10 + LTEXT "Less",-1,334,178,18,10 + GROUPBOX "Palettes",LBL_PPUVIEW_PALETTES,2,192,351,53,WS_TABSTOP + LTEXT "Display on scanline:",-1,6,178,65,10 + EDITTEXT IDC_PPUVIEW_SCANLINE,72,176,27,12 +END + +7ZIPARCHIVEDIALOG DIALOGEX 0, 0, 265, 159 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Choose File From Archive" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,146,138,50,14 + PUSHBUTTON "Cancel",IDCANCEL,208,138,50,14 + LISTBOX IDC_LIST1,7,7,251,120,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP +END + ///////////////////////////////////////////////////////////////////////////// // @@ -1361,6 +1412,14 @@ BEGIN TOPMARGIN, 7 BOTTOMMARGIN, 66 END + + "7ZIPARCHIVEDIALOG", DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 258 + TOPMARGIN, 7 + BOTTOMMARGIN, 152 + END END #endif // APSTUDIO_INVOKED @@ -1522,47 +1581,6 @@ END // Dialog // -CDLOGGER DIALOGEX 0, 0, 322, 213 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Code Data Logger" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - DEFPUSHBUTTON "Load...",BTN_CDLOGGER_LOAD,7,81,50,14 - PUSHBUTTON "Save",BTN_CDLOGGER_SAVE,257,81,50,14 - GROUPBOX "Code Data Log Status",-1,2,4,316,119,BS_CENTER - PUSHBUTTON "Start",BTN_CDLOGGER_START_PAUSE,129,81,50,14 - GROUPBOX "Address Label Logger",65534,3,128,315,79,BS_CENTER - PUSHBUTTON "Load...",111,7,182,50,14,WS_DISABLED - PUSHBUTTON "Start",112,127,181,50,14,WS_DISABLED - PUSHBUTTON "Save...",113,259,181,50,14,WS_DISABLED - LTEXT "4067 - 29.5%",LBL_CDLOGGER_CODECOUNT,38,31,68,11 - GROUPBOX "Bytes Logged As Code",65533,29,20,84,27 - GROUPBOX "Bytes Logged as data",65532,117,20,84,27 - LTEXT "7092 - 37.2%",LBL_CDLOGGER_DATACOUNT,128,31,65,9 - GROUPBOX "Bytes Not Logged",65531,205,20,79,27 - LTEXT "6072 - 32.7%",LBL_CDLOGGER_UNDEFCOUNT,210,31,60,8 - LTEXT "Itsa me the Code Data Logger! Press Start to play!",65530,69,56,172,12 - PUSHBUTTON "Reset Log",BTN_CDLOGGER_RESET,7,66,50,14 - PUSHBUTTON "Save as...",BTN_CDLOGGER_SAVE_AS,257,66,50,14 - PUSHBUTTON "Save Stripped iNes Rom...",BTN_CDLOGGER_SAVE_STRIPPED,213,102,99,14 -END - -PPUVIEW DIALOG 44, 38, 355, 246 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "PPU Viewer" -FONT 8, "MS Sans Serif" -BEGIN - GROUPBOX "Pattern Tables",GRP_PPUVIEW_TABLES,2,-1,351,192,WS_TABSTOP - LTEXT "Tile:",LBL_PPUVIEW_TILE1,6,168,50,10 - LTEXT "Tile:",LBL_PPUVIEW_TILE2,177,168,50,10 - CONTROL "",CTL_PPUVIEW_TRACKBAR,"msctls_trackbar32",WS_TABSTOP,227,178,106,11 - LTEXT "Refresh: More",-1,177,178,50,10 - LTEXT "Less",-1,334,178,18,10 - GROUPBOX "Palettes",LBL_PPUVIEW_PALETTES,2,192,351,53,WS_TABSTOP - LTEXT "Display on scanline:",-1,6,178,65,10 - EDITTEXT IDC_PPUVIEW_SCANLINE,72,176,27,12 -END - IDD_REPLAY_METADATA DIALOGEX 0, 0, 325, 250 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Movie Metadata" diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index fc4a37ff..5b782e94 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -127,6 +127,7 @@ #define IDD_DIALOG1 114 #define LBL_AUTO_HOLD 115 #define IDC_CHECK_LOG_NEW_DATA 115 +#define IDD_DIALOG2 115 #define LBL_CLEAR_AH 116 #define IDC_CHECK_LOG_UPDATE_WINDOW 116 #define CHECK_SOUND_8BIT 122 @@ -536,7 +537,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 115 +#define _APS_NEXT_RESOURCE_VALUE 116 #define _APS_NEXT_COMMAND_VALUE 40151 #define _APS_NEXT_CONTROL_VALUE 1133 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/src/drivers/win/window.cpp b/src/drivers/win/window.cpp index 5b74db52..fc170556 100644 --- a/src/drivers/win/window.cpp +++ b/src/drivers/win/window.cpp @@ -512,9 +512,11 @@ void FCEUD_HideMenuToggle(void) ToggleHideMenu(); } -void ALoad(char *nameo) +void ALoad(char *nameo,char* actualfile) { - if(FCEUI_LoadGame(nameo, 1)) + bool isvirtual = (actualfile==0); + if(isvirtual) actualfile = nameo; + if(FCEUI_LoadGameVirtual(actualfile, nameo, 1)) { pal_emulation = FCEUI_GetCurrentVidSystem(0, 0); @@ -522,7 +524,9 @@ void ALoad(char *nameo) SetMainWindowStuff(); - AddRecentFile(nameo); + //todo-add recent files from archives somehow + if(!isvirtual) + AddRecentFile(nameo); RefreshThrottleFPS(); @@ -569,32 +573,18 @@ void LoadNewGamey(HWND hParent, const char *initialdir) // Show the Open File dialog if(GetOpenFileName(&ofn)) { - char *tmpdir = (char *)malloc( ofn.nFileOffset + 1 ); //mbg merge 7/17/06 added cast - - if(tmpdir) + //if the user selected a 7zip file, then we have some work to do.. + //todo - scan file instead of checking extension + std::string fname = nameo; + extern void do7zip(HWND hwnd, std::string fname); + if(fname.substr(fname.size()-3,3) == ".7z") { - // Get the directory from the filename - strncpy(tmpdir, ofn.lpstrFile, ofn.nFileOffset); - tmpdir[ofn.nFileOffset]=0; - - // Prevent setting the File->Open default - // directory when a "Recent Directory" is selected. - if(!initialdir) - { - if(gfsdir) - { - free(gfsdir); - } - - gfsdir = tmpdir; - } - else - { - free(tmpdir); - } + do7zip(hParent, fname); + } + else + { + ALoad(nameo,0); } - - ALoad(nameo); } } @@ -726,7 +716,7 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) if((ftmp=(char*)malloc(len))) //mbg merge 7/17/06 added cast { DragQueryFile((HDROP)wParam,0,ftmp,len); //mbg merge 7/17/06 changed (HANDLE) to (HDROP) - ALoad(ftmp); + ALoad(ftmp,0); free(ftmp); } } @@ -742,7 +732,7 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) if(wParam >= MENU_FIRST_RECENT_FILE && wParam <= MENU_FIRST_RECENT_FILE + MAX_NUMBER_OF_RECENT_FILES - 1) { if(recent_files[wParam - MENU_FIRST_RECENT_FILE]) - ALoad(recent_files[wParam - MENU_FIRST_RECENT_FILE]); + ALoad(recent_files[wParam - MENU_FIRST_RECENT_FILE],0); } switch(LOWORD(wParam)) { diff --git a/src/drivers/win/window.h b/src/drivers/win/window.h index 492107e8..94ff1507 100644 --- a/src/drivers/win/window.h +++ b/src/drivers/win/window.h @@ -23,7 +23,7 @@ void ByebyeWindow(); void DoTimingConfigFix(); int CreateMainWindow(); void UpdateCheckedMenuItems(); -void ALoad(char *nameo); +void ALoad(char *nameo,char* actualfile=0); void LoadNewGamey(HWND hParent, const char *initialdir); int BrowseForFolder(HWND hParent, const char *htext, char *buf); void UpdateCheckedMenuItems(); diff --git a/src/fceu.cpp b/src/fceu.cpp index 5cfd7b2b..054ceacd 100644 --- a/src/fceu.cpp +++ b/src/fceu.cpp @@ -283,17 +283,17 @@ static DECLFR(ARAMH) void ResetGameLoaded(void) { - if(GameInfo) CloseGame(); - EmulationPaused = 0; //mbg 5/8/08 - loading games while paused was bad news. maybe this fixes it - GameStateRestore=0; - PPU_hook=0; - GameHBIRQHook=0; - if(GameExpSound.Kill) - GameExpSound.Kill(); - memset(&GameExpSound,0,sizeof(GameExpSound)); - MapIRQHook=0; - MMC5Hack=0; - PAL&=1; + if(GameInfo) CloseGame(); + EmulationPaused = 0; //mbg 5/8/08 - loading games while paused was bad news. maybe this fixes it + GameStateRestore=0; + PPU_hook=0; + GameHBIRQHook=0; + if(GameExpSound.Kill) + GameExpSound.Kill(); + memset(&GameExpSound,0,sizeof(GameExpSound)); + MapIRQHook=0; + MMC5Hack=0; + PAL&=1; pale=0; } @@ -302,14 +302,16 @@ int iNESLoad(const char *name, FCEUFILE *fp, int OverwriteVidMode); int FDSLoad(const char *name, FCEUFILE *fp); int NSFLoad(FCEUFILE *fp); -char lastLoadedGameName [2048] = {0,}; // hack for movie WRAM clearing on record from poweron +//mbg 6/25/08 - remove this one day +//char lastLoadedGameName [2048] = {0,}; // hack for movie WRAM clearing on record from poweron -FCEUGI *FCEUI_LoadGame(const char *name, int OverwriteVidMode) + +FCEUGI *FCEUI_LoadGameVirtual(const char *name, const char *logicalname, int OverwriteVidMode) { //mbg merge 7/17/07 - why is this here -//#ifdef WIN32 -// StopSound(); -//#endif + //#ifdef WIN32 + // StopSound(); + //#endif //---------- //attempt to open the files @@ -317,14 +319,14 @@ FCEUGI *FCEUI_LoadGame(const char *name, int OverwriteVidMode) char *ipsfn; FCEU_printf("Loading %s...\n\n",name); - GetFileBase(name); + GetFileBase(logicalname); ipsfn=strdup(FCEU_MakeFName(FCEUMKF_IPS,0,0).c_str()); fp=FCEU_fopen(name,ipsfn,"rb",0); free(ipsfn); if(!fp) { - FCEU_PrintError("Error opening \"%s\"!",name); + FCEU_PrintError("Error opening \"%s\"!",name); return 0; } //--------- @@ -332,66 +334,69 @@ FCEUGI *FCEUI_LoadGame(const char *name, int OverwriteVidMode) //file opened ok. start loading. ResetGameLoaded(); - + AutosaveStatus[0] = AutosaveStatus[1] = 0; AutosaveStatus[2] = AutosaveStatus[3] = 0; CloseGame(); GameInfo = new FCEUGI; memset(GameInfo, 0, sizeof(FCEUGI)); - + GameInfo->soundchan = 0; GameInfo->soundrate = 0; - GameInfo->name=0; - GameInfo->type=GIT_CART; - GameInfo->vidsys=GIV_USER; - GameInfo->input[0]=GameInfo->input[1]=SI_UNSET; - GameInfo->inputfc=SIFC_UNSET; - GameInfo->cspecial=SIS_NONE; + GameInfo->name=0; + GameInfo->type=GIT_CART; + GameInfo->vidsys=GIV_USER; + GameInfo->input[0]=GameInfo->input[1]=SI_UNSET; + GameInfo->inputfc=SIFC_UNSET; + GameInfo->cspecial=SIS_NONE; - //try to load each different format - if(iNESLoad(name,fp,OverwriteVidMode)) - goto endlseq; - if(NSFLoad(fp)) - goto endlseq; - if(UNIFLoad(name,fp)) - goto endlseq; - if(FDSLoad(name,fp)) - goto endlseq; + //try to load each different format + if(iNESLoad(name,fp,OverwriteVidMode)) + goto endlseq; + if(NSFLoad(fp)) + goto endlseq; + if(UNIFLoad(name,fp)) + goto endlseq; + if(FDSLoad(name,fp)) + goto endlseq; - FCEU_PrintError("An error occurred while loading the file."); - FCEU_fclose(fp); + FCEU_PrintError("An error occurred while loading the file."); + FCEU_fclose(fp); - delete GameInfo; - GameInfo = 0; + delete GameInfo; + GameInfo = 0; - return 0; + return 0; - endlseq: - - FCEU_fclose(fp); +endlseq: + + FCEU_fclose(fp); + + FCEU_ResetVidSys(); + + if(GameInfo->type!=GIT_NSF) + if(FSettings.GameGenie) + OpenGenie(); + PowerNES(); - FCEU_ResetVidSys(); - - if(GameInfo->type!=GIT_NSF) - if(FSettings.GameGenie) - OpenGenie(); - PowerNES(); - FCEUSS_CheckStates(); - if(GameInfo->type!=GIT_NSF) - { - FCEU_LoadGamePalette(); - FCEU_LoadGameCheats(0); - } - + if(GameInfo->type!=GIT_NSF) + { + FCEU_LoadGamePalette(); + FCEU_LoadGameCheats(0); + } + FCEU_ResetPalette(); FCEU_ResetMessages(); // Save state, status messages, etc. - strcpy(lastLoadedGameName, name); + return GameInfo; +} - return GameInfo; +FCEUGI *FCEUI_LoadGame(const char *name, int OverwriteVidMode) +{ + return FCEUI_LoadGameVirtual(name,name,OverwriteVidMode); } @@ -605,36 +610,34 @@ int suppressAddPowerCommand=0; // hack... yeah, I know... void PowerNES(void) { if(!suppressAddPowerCommand) - FCEUMOV_AddCommand(FCEUNPCMD_POWER); - if(!GameInfo) return; + FCEUMOV_AddCommand(FCEUNPCMD_POWER); + if(!GameInfo) return; FCEU_CheatResetRAM(); FCEU_CheatAddRAM(2,0,RAM); - GeniePower(); + GeniePower(); FCEU_MemoryRand(RAM,0x800); //memset(RAM,0xFF,0x800); - - SetReadHandler(0x0000,0xFFFF,ANull); - SetWriteHandler(0x0000,0xFFFF,BNull); - - SetReadHandler(0,0x7FF,ARAML); - SetWriteHandler(0,0x7FF,BRAML); - - SetReadHandler(0x800,0x1FFF,ARAMH); /* Part of a little */ - SetWriteHandler(0x800,0x1FFF,BRAMH); /* hack for a small speed boost. */ - - InitializeInput(); - FCEUSND_Power(); - FCEUPPU_Power(); - /* Have the external game hardware "powered" after the internal NES stuff. - Needed for the NSF code and VS System code. - */ + SetReadHandler(0x0000,0xFFFF,ANull); + SetWriteHandler(0x0000,0xFFFF,BNull); + + SetReadHandler(0,0x7FF,ARAML); + SetWriteHandler(0,0x7FF,BRAML); + + SetReadHandler(0x800,0x1FFF,ARAMH); // Part of a little + SetWriteHandler(0x800,0x1FFF,BRAMH); //hack for a small speed boost. + + InitializeInput(); + FCEUSND_Power(); + FCEUPPU_Power(); + + //Have the external game hardware "powered" after the internal NES stuff. Needed for the NSF code and VS System code. GameInterface(GI_POWER); if(GameInfo->type==GIT_VSUNI) - FCEU_VSUniPower(); + FCEU_VSUniPower(); timestampbase=0; X6502_Power(); diff --git a/src/movie.cpp b/src/movie.cpp index 5db6eb7e..01f03e2e 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -559,27 +559,35 @@ void FCEUI_StopMovie() static void poweron(bool shouldDisableBatteryLoading) { - // make a for-movie-recording power-on clear the game's save data, too - extern char lastLoadedGameName [2048]; - extern int disableBatteryLoading, suppressAddPowerCommand; - suppressAddPowerCommand=1; - if(shouldDisableBatteryLoading) disableBatteryLoading=1; - suppressMovieStop=true; - { - //we need to save the pause state through this process - int oldPaused = EmulationPaused; + //// make a for-movie-recording power-on clear the game's save data, too + // extern char lastLoadedGameName [2048]; + // extern int disableBatteryLoading, suppressAddPowerCommand; + // suppressAddPowerCommand=1; + // if(shouldDisableBatteryLoading) disableBatteryLoading=1; + // suppressMovieStop=true; + // { + // //we need to save the pause state through this process + // int oldPaused = EmulationPaused; - // NOTE: this will NOT write an FCEUNPCMD_POWER into the movie file - FCEUGI* gi = FCEUI_LoadGame(lastLoadedGameName, 0); - //mbg 5/23/08 - wtf? why would this return null? - //if(!gi) PowerNES(); - assert(gi); + // // NOTE: this will NOT write an FCEUNPCMD_POWER into the movie file + // FCEUGI* gi = FCEUI_LoadGame(lastLoadedGameName, 0); + // //mbg 5/23/08 - wtf? why would this return null? + // //if(!gi) PowerNES(); + // assert(gi); - EmulationPaused = oldPaused; - } - suppressMovieStop=false; - if(shouldDisableBatteryLoading) disableBatteryLoading=0; - suppressAddPowerCommand=0; + // EmulationPaused = oldPaused; + // } + // suppressMovieStop=false; + // if(shouldDisableBatteryLoading) disableBatteryLoading=0; + // suppressAddPowerCommand=0; + + //mbg 6/25/08 + //ok this pissed me off + //the only reason for lastLoadedGameName and all these hacks was for this fix: + //"hack for movie WRAM clearing on record from poweron" + //but W-T-F. are you telling me that there is some problem with the poweron sequence? + //screw that. we're using the main poweron sequence, even if that breaks old movie compatibility (unlikely) + PowerNES(); } diff --git a/src/ppu.cpp b/src/ppu.cpp index 36892565..baac11af 100644 --- a/src/ppu.cpp +++ b/src/ppu.cpp @@ -104,6 +104,11 @@ static int ppudead=1; static int kook=0; int fceuindbg=0; +//mbg 6/23/08 +//make the no-bg fill color configurable +//0xFF shall indicate to use palette[0] +uint8 gNoBGFillColor = 0xFF; + int MMC5Hack=0; uint32 MMC5HackVROMMask=0; uint8 *MMC5HackExNTARAMPtr=0; @@ -755,7 +760,11 @@ static void DoLine(void) if(!renderbg) // User asked to not display background data. { uint32 tem; - tem=Pal[0]|(Pal[0]<<8)|(Pal[0]<<16)|(Pal[0]<<24); + uint8 col; + if(gNoBGFillColor == 0xFF) + col = Pal[0]; + else col = gNoBGFillColor; + tem=col|(col<<8)|(col<<16)|(col<<24); tem|=0x40404040; FCEU_dwmemset(target,tem,256); } diff --git a/vc8/fceux.vcproj b/vc8/fceux.vcproj index c921b2aa..e2df3bdb 100644 --- a/vc8/fceux.vcproj +++ b/vc8/fceux.vcproj @@ -97,6 +97,7 @@ /> + +