mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-08-29 09:00:02 +02:00
Update to v094r18 release.
byuu says: Okay yeah, lots of SNES coprocessor games were horribly broken. They should be fixed now with the below changes: Old syntax: auto programROM = root["rom[0]/name"].text(); auto dataROM = root["rom[1]/name"].text(); load_memory(root["ram[0]"]); New syntax: auto rom = root.find("rom"); auto ram = root.find("ram"); auto programROM = rom(0)["name"].text(); auto dataROM = rom(1)["name"].text(); load_memory(ram(0)); Since I'm now relying on the XShm driver, which is multi-threaded, I'm now compiling higan with -fopenmp. On FreeBSD, this requires linking with -Wl,-rpath=/usr/local/lib -Wl,-rpath=/usr/local/lib/gcc49 to get the right version of GOMP. This gives a pretty nice speed boost for XShm, I go from around 101fps to 111fps at 4x scale on the accuracy profile. The combination of inlining the accuracy-PPU and parallelizing the XShm renderer about evenly compensates now for the ~20% CPU overclock I gave up a while ago. The WIP also has some other niceties from the newer version of nall. Most noticeably, cheat code database searching is now instantaneous. No more 3-second stall.
This commit is contained in:
95
nall/encode/zip.hpp
Normal file
95
nall/encode/zip.hpp
Normal file
@@ -0,0 +1,95 @@
|
||||
#ifndef NALL_ZIP_HPP
|
||||
#define NALL_ZIP_HPP
|
||||
|
||||
//creates uncompressed ZIP archives
|
||||
|
||||
#include <nall/string.hpp>
|
||||
#include <nall/hash/crc32.hpp>
|
||||
|
||||
namespace nall { namespace Encode {
|
||||
|
||||
struct ZIP {
|
||||
ZIP(const string& filename) {
|
||||
fp.open(filename, file::mode::write);
|
||||
time_t currentTime = time(nullptr);
|
||||
tm* info = localtime(¤tTime);
|
||||
dosTime = (info->tm_hour << 11) | (info->tm_min << 5) | (info->tm_sec >> 1);
|
||||
dosDate = ((info->tm_year - 80) << 9) | ((1 + info->tm_mon) << 5) + (info->tm_mday);
|
||||
}
|
||||
|
||||
//append path: append("path/");
|
||||
//append file: append("path/file", data, size);
|
||||
void append(string filename, const uint8_t* data = nullptr, unsigned size = 0u) {
|
||||
filename.transform("\\", "/");
|
||||
uint32_t checksum = Hash::CRC32(data, size).value();
|
||||
directory.append({filename, checksum, size, fp.offset()});
|
||||
|
||||
fp.writel(0x04034b50, 4); //signature
|
||||
fp.writel(0x0014, 2); //minimum version (2.0)
|
||||
fp.writel(0x0000, 2); //general purpose bit flags
|
||||
fp.writel(0x0000, 2); //compression method (0 = uncompressed)
|
||||
fp.writel(dosTime, 2);
|
||||
fp.writel(dosDate, 2);
|
||||
fp.writel(checksum, 4);
|
||||
fp.writel(size, 4); //compressed size
|
||||
fp.writel(size, 4); //uncompressed size
|
||||
fp.writel(filename.length(), 2); //file name length
|
||||
fp.writel(0x0000, 2); //extra field length
|
||||
fp.print(filename); //file name
|
||||
|
||||
fp.write(data, size); //file data
|
||||
}
|
||||
|
||||
~ZIP() {
|
||||
//central directory
|
||||
unsigned baseOffset = fp.offset();
|
||||
for(auto& entry : directory) {
|
||||
fp.writel(0x02014b50, 4); //signature
|
||||
fp.writel(0x0014, 2); //version made by (2.0)
|
||||
fp.writel(0x0014, 2); //version needed to extract (2.0)
|
||||
fp.writel(0x0000, 2); //general purpose bit flags
|
||||
fp.writel(0x0000, 2); //compression method (0 = uncompressed)
|
||||
fp.writel(dosTime, 2);
|
||||
fp.writel(dosDate, 2);
|
||||
fp.writel(entry.checksum, 4);
|
||||
fp.writel(entry.size, 4); //compressed size
|
||||
fp.writel(entry.size, 4); //uncompressed size
|
||||
fp.writel(entry.filename.length(), 2); //file name length
|
||||
fp.writel(0x0000, 2); //extra field length
|
||||
fp.writel(0x0000, 2); //file comment length
|
||||
fp.writel(0x0000, 2); //disk number start
|
||||
fp.writel(0x0000, 2); //internal file attributes
|
||||
fp.writel(0x00000000, 4); //external file attributes
|
||||
fp.writel(entry.offset, 4); //relative offset of file header
|
||||
fp.print(entry.filename);
|
||||
}
|
||||
unsigned finishOffset = fp.offset();
|
||||
|
||||
//end of central directory
|
||||
fp.writel(0x06054b50, 4); //signature
|
||||
fp.writel(0x0000, 2); //number of this disk
|
||||
fp.writel(0x0000, 2); //disk where central directory starts
|
||||
fp.writel(directory.size(), 2); //number of central directory records on this disk
|
||||
fp.writel(directory.size(), 2); //total number of central directory records
|
||||
fp.writel(finishOffset - baseOffset, 4); //size of central directory
|
||||
fp.writel(baseOffset, 4); //offset of central directory
|
||||
fp.writel(0x0000, 2); //comment length
|
||||
|
||||
fp.close();
|
||||
}
|
||||
|
||||
protected:
|
||||
file fp;
|
||||
uint16_t dosTime, dosDate;
|
||||
struct entry_t {
|
||||
string filename;
|
||||
uint32_t checksum;
|
||||
uint32_t size;
|
||||
uint32_t offset;
|
||||
};
|
||||
vector<entry_t> directory;
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user