mirror of
https://github.com/libretro/bsnes-libretro.git
synced 2024-11-28 03:20:30 +00:00
ef746bbda4
[No prior releases were posted to the WIP thread. -Ed.] byuu says: Super Famicom mapping system has been reworked as discussed with the mask= changes. offset becomes base, mode is gone. Also added support for comma-separated fields in the address fields, to reduce the number of map lines needed. <?xml version="1.0" encoding="UTF-8"?> <cartridge region="NTSC"> <superfx revision="2"> <rom name="program.rom" size="0x200000"/> <ram name="save.rwm" size="0x8000"/> <map id="io" address="00-3f,80-bf:3000-32ff"/> <map id="rom" address="00-3f:8000-ffff" mask="0x8000"/> <map id="rom" address="40-5f:0000-ffff"/> <map id="ram" address="00-3f,80-bf:6000-7fff" size="0x2000"/> <map id="ram" address="70-71:0000-ffff"/> </superfx> </cartridge> Or in BML: cartridge region=NTSC superfx revision=2 rom name=program.rom size=0x200000 ram name=save.rwm size=0x8000 map id=io address=00-3f,80-bf:3000-32ff map id=rom address=00-3f:8000-ffff mask=0x8000 map id=rom address=40-5f:0000-ffff map id=ram address=00-3f,80-bf:6000-7fff size=0x2000 map id=ram address=70-71:0000-ffff As a result of the changes, old mappings will no longer work. The above XML example will run Super Mario World 2: Yoshi's Island. Otherwise, you'll have to write your own. All that's left now is to work some sort of database mapping system in, so I can start dumping carts en masse. The NES changes that FitzRoy asked for are mostly in as well. Also, part of the reason I haven't released a WIP ... but fuck it, I'm not going to wait forever to post a new WIP. I've added a skeleton driver to emulate Campus Challenge '92 and Powerfest '94. There's no actual emulation, except for the stuff I can glean from looking at the pictures of the board. It has a DSP-1 (so SR/DR registers), four ROMs that map in and out, RAM, etc. I've also added preliminary mapping to upload high scores to a website, but obviously I need the ROMs first.
119 lines
2.6 KiB
C++
Executable File
119 lines
2.6 KiB
C++
Executable File
#ifndef NALL_BASE64_HPP
|
|
#define NALL_BASE64_HPP
|
|
|
|
#include <nall/stdint.hpp>
|
|
#include <nall/string.hpp>
|
|
|
|
namespace nall {
|
|
struct base64 {
|
|
static bool encode(char *&output, const uint8_t* input, unsigned inlength) {
|
|
output = new char[inlength * 8 / 6 + 8]();
|
|
|
|
unsigned i = 0, o = 0;
|
|
while(i < inlength) {
|
|
switch(i % 3) {
|
|
|
|
case 0: {
|
|
output[o++] = enc(input[i] >> 2);
|
|
output[o] = enc((input[i] & 3) << 4);
|
|
break;
|
|
}
|
|
|
|
case 1: {
|
|
uint8_t prev = dec(output[o]);
|
|
output[o++] = enc(prev + (input[i] >> 4));
|
|
output[o] = enc((input[i] & 15) << 2);
|
|
break;
|
|
}
|
|
|
|
case 2: {
|
|
uint8_t prev = dec(output[o]);
|
|
output[o++] = enc(prev + (input[i] >> 6));
|
|
output[o++] = enc(input[i] & 63);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static string encode(const string &data) {
|
|
char *buffer = nullptr;
|
|
encode(buffer, (const uint8_t*)(const char*)data, data.length());
|
|
string result = buffer;
|
|
delete[] buffer;
|
|
return result;
|
|
}
|
|
|
|
static bool decode(uint8_t *&output, unsigned &outlength, const char *input) {
|
|
unsigned inlength = strlen(input), infix = 0;
|
|
output = new uint8_t[inlength + 1]();
|
|
|
|
unsigned i = 0, o = 0;
|
|
while(i < inlength) {
|
|
uint8_t x = dec(input[i]);
|
|
|
|
switch(i++ & 3) {
|
|
|
|
case 0: {
|
|
output[o] = x << 2;
|
|
break;
|
|
}
|
|
|
|
case 1: {
|
|
output[o++] |= x >> 4;
|
|
output[o] = (x & 15) << 4;
|
|
break;
|
|
}
|
|
|
|
case 2: {
|
|
output[o++] |= x >> 2;
|
|
output[o] = (x & 3) << 6;
|
|
break;
|
|
}
|
|
|
|
case 3: {
|
|
output[o++] |= x;
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
outlength = o;
|
|
return true;
|
|
}
|
|
|
|
static string decode(const string &data) {
|
|
uint8_t *buffer = nullptr;
|
|
unsigned size = 0;
|
|
decode(buffer, size, (const char*)data);
|
|
string result = (const char*)buffer;
|
|
delete[] buffer;
|
|
return result;
|
|
}
|
|
|
|
private:
|
|
static char enc(uint8_t n) {
|
|
//base64 for URL encodings (URL = -_, MIME = +/)
|
|
static char lookup_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
return lookup_table[n & 63];
|
|
}
|
|
|
|
static uint8_t dec(char n) {
|
|
if(n >= 'A' && n <= 'Z') return n - 'A';
|
|
if(n >= 'a' && n <= 'z') return n - 'a' + 26;
|
|
if(n >= '0' && n <= '9') return n - '0' + 52;
|
|
if(n == '-') return 62;
|
|
if(n == '_') return 63;
|
|
return 0;
|
|
}
|
|
};
|
|
}
|
|
|
|
#endif
|