[change] include the ROMs and copyright notices

This commit is contained in:
nikp123 2022-07-22 13:15:16 +02:00
parent 01058f2ff6
commit 220c6e009e
7 changed files with 486 additions and 60 deletions

View File

@ -10,7 +10,9 @@ ifeq ($(Z80_DIR),)
Z80_DIR := $(GAL_DIR)/../inc/libz80 Z80_DIR := $(GAL_DIR)/../inc/libz80
endif endif
SOURCES_C := $(CORE_DIR)/src/libretro.c SOURCES_C := \
$(CORE_DIR)/src/libretro.c \
$(CORE_DIR)/src/rom.c
SOURCES_CXX := SOURCES_CXX :=

View File

@ -3,8 +3,8 @@ galaxy-libretro
This repo contains the libretro binding code for the Galaksija emulator. This repo contains the libretro binding code for the Galaksija emulator.
The actual emulator code is in [this repository](https://github.com/nikp123/Galaksija-Emulator). The actual emulator code is in [this repository](https://github.com/nikp123/Galaksija-Emulator),
albeit it's outdated since many improvements were done here.
Building Building
-------- --------
@ -22,17 +22,19 @@ Initial setup
Copy the resulting ``galaksija_libretro.*`` file to your libretro cores folder. Copy the resulting ``galaksija_libretro.*`` file to your libretro cores folder.
You will need these files put into your libretro system folder:
```
md5sum file location within the libretro system folder
c7ce14d6a81062db862f3ce5afedcfb6 galaksija/ROM1.BIN
c4c4094622eb9f8724908b86c97abc67 galaksija/ROM2.BIN (optional, but adds math)
ecae5c55d75a2fe0871d0ebd95663628 galaksija/CHRGEN.BIN
```
The emulator **WILL NOT** launch without those (two) files. ## The optional part
The files can be obtained here: In case you want to change the system firmware of the Galaksija that you are
emulating, you can do so by swapping the following files.
File location within the libretro system folder
* ``galaksija/CHRGEN.BIN``
* ``galaksija/ROM1.BIN``
* ``galaksija/ROM2.BIN`` (optional, but adds math)
The included firmwares won't load if you decide to include any of these files.
An example of such firmwares can be found here:
[ROM1.BIN](https://github.com/mejs/galaksija/blob/master/roms/ROM%20A/ROM_A_with_ROM_B_init_ver_29.bin?raw=true) [ROM1.BIN](https://github.com/mejs/galaksija/blob/master/roms/ROM%20A/ROM_A_with_ROM_B_init_ver_29.bin?raw=true)
[CHRGEN.BIN](https://raw.githubusercontent.com/mejs/galaksija/master/roms/Character%20Generator%20ROM/CHRGEN_MIPRO.BIN) [CHRGEN.BIN](https://raw.githubusercontent.com/mejs/galaksija/master/roms/Character%20Generator%20ROM/CHRGEN_MIPRO.BIN)
[ROM2.BIN](https://github.com/mejs/galaksija/blob/master/roms/ROM%20B/ROM_B.bin?raw=true) [ROM2.BIN](https://github.com/mejs/galaksija/blob/master/roms/ROM%20B/ROM_B.bin?raw=true)
@ -55,6 +57,20 @@ Built-in shortcuts
- ``CTRL+R`` resets the computer - ``CTRL+R`` resets the computer
License
-------
The emulator's own code as with the included firmware is in the Public Domain.
External pieces such as:
* ``libretro-common`` (MIT)
* ``tinyfiledialogs`` (MIT)
* ``libz80`` (GPL2)
are licensed differently, so keep that in mind if you plan on
redistributing/modifying the code.
Missing features Missing features
---------------- ----------------

View File

@ -35,6 +35,7 @@ typedef struct {
uint64_t background; // single pixel (no 10bit unfortunately) uint64_t background; // single pixel (no 10bit unfortunately)
uint64_t foreground; // single pixel uint64_t foreground; // single pixel
char* firmware_path; char* firmware_path;
bool firmware_ignore;
char* system_state_file; char* system_state_file;
galaxy_graphics_pixel_mode graphics_mode; galaxy_graphics_pixel_mode graphics_mode;
} galaxy_config; } galaxy_config;

View File

@ -46,61 +46,63 @@ void galaxy_reset(galaxy_state *state) {
bool galaxy_init(galaxy_state *state) { bool galaxy_init(galaxy_state *state) {
char temp[4096]; char temp[4096];
if(state->config.firmware_path == NULL) { if(state->config.firmware_path == NULL && !state->config.firmware_ignore) {
state->error = GALAXY_FIRMWARE_PATH_INVALID; state->error = GALAXY_FIRMWARE_PATH_INVALID;
return false; return false;
} }
snprintf(temp, 4096, "%s/CHRGEN.BIN", state->config.firmware_path); if(!state->config.firmware_ignore) {
if(!util_file_exists(temp)) { snprintf(temp, 4096, "%s/CHRGEN.BIN", state->config.firmware_path);
state->error = GALAXY_FIRMWARE_CHARGEN_MISSING; if(!util_file_exists(temp)) {
return false; state->error = GALAXY_FIRMWARE_CHARGEN_MISSING;
} return false;
if(util_file_size(temp) != GALAXY_CHARGEN_SIZE) { }
state->error = GALAXY_FIRMWARE_CHARGEN_INVALID; if(util_file_size(temp) != GALAXY_CHARGEN_SIZE) {
return false; state->error = GALAXY_FIRMWARE_CHARGEN_INVALID;
} return false;
if(util_file_to_existing_buffer_unsafe(temp, state->chargen) == 0) { }
state->error = GALAXY_FIRMWARE_CHARGEN_READ_FAILURE; if(util_file_to_existing_buffer_unsafe(temp, state->chargen) == 0) {
return false; state->error = GALAXY_FIRMWARE_CHARGEN_READ_FAILURE;
} return false;
}
snprintf(temp, 4096, "%s/ROM1.BIN", state->config.firmware_path); snprintf(temp, 4096, "%s/ROM1.BIN", state->config.firmware_path);
if(!util_file_exists(temp)) { if(!util_file_exists(temp)) {
state->error = GALAXY_FIRMWARE_ROM1_MISSING; state->error = GALAXY_FIRMWARE_ROM1_MISSING;
return false; return false;
} }
if(util_file_size(temp) != GALAXY_ROM1_SIZE) { if(util_file_size(temp) != GALAXY_ROM1_SIZE) {
state->error = GALAXY_FIRMWARE_ROM1_INVALID; state->error = GALAXY_FIRMWARE_ROM1_INVALID;
return false; return false;
} }
if(util_file_to_existing_buffer_unsafe(temp, state->memory) == 0) { if(util_file_to_existing_buffer_unsafe(temp, state->memory) == 0) {
state->error = GALAXY_FIRMWARE_ROM1_READ_FAILURE; state->error = GALAXY_FIRMWARE_ROM1_READ_FAILURE;
return false; return false;
} }
snprintf(temp, 4096, "%s/ROM2.BIN", state->config.firmware_path); snprintf(temp, 4096, "%s/ROM2.BIN", state->config.firmware_path);
if(!util_file_exists(temp)) { if(!util_file_exists(temp)) {
state->error = GALAXY_FIRMWARE_ROM2_MISSING; // acts as a warning beyond anything else state->error = GALAXY_FIRMWARE_ROM2_MISSING; // acts as a warning beyond anything else
} else if(util_file_size(temp) != GALAXY_ROM2_SIZE) { } else if(util_file_size(temp) != GALAXY_ROM2_SIZE) {
state->error = GALAXY_FIRMWARE_ROM2_INVALID; state->error = GALAXY_FIRMWARE_ROM2_INVALID;
return false; return false;
} else if(util_file_to_existing_buffer_unsafe(temp, &state->memory[GALAXY_ROM2_START]) == 0) { } else if(util_file_to_existing_buffer_unsafe(temp, &state->memory[GALAXY_ROM2_START]) == 0) {
state->error = GALAXY_FIRMWARE_ROM2_READ_FAILURE; state->error = GALAXY_FIRMWARE_ROM2_READ_FAILURE;
return false; return false;
} }
/** /**
* TODO: this * TODO: this
* // GAL_PLUS * // GAL_PLUS
* if((rom=fopen("GAL_PLUS.BIN", "rb"))!=NULL) { * if((rom=fopen("GAL_PLUS.BIN", "rb"))!=NULL) {
* fread(&MEMORY[0xE000], 1, 4096, rom); * fread(&MEMORY[0xE000], 1, 4096, rom);
* fclose(rom); * fclose(rom);
* } else { * } else {
* printf("GAL_PLUS.BIN nije prisutan, idemo dalje bez njega!\n"); * printf("GAL_PLUS.BIN nije prisutan, idemo dalje bez njega!\n");
* memset(&MEMORY[0xE000], 0xff, 4096); * memset(&MEMORY[0xE000], 0xff, 4096);
* } * }
**/ **/
}
// TODO: check whether clearing further memory is necessary // TODO: check whether clearing further memory is necessary

View File

@ -11,6 +11,8 @@
#include "libretro.h" #include "libretro.h"
#include "rom.h"
#include <file/file_path.h> #include <file/file_path.h>
#define VIDEO_WIDTH GALAXY_HORIZONTAL_RESOLUTION #define VIDEO_WIDTH GALAXY_HORIZONTAL_RESOLUTION
@ -88,23 +90,29 @@ void retro_init(void)
memset(frame_buf, 0x00, VIDEO_PIXELS*sizeof(uint32_t)); memset(frame_buf, 0x00, VIDEO_PIXELS*sizeof(uint32_t));
bool ignore_firmware = 0;
snprintf(bios_path, sizeof(bios_path), "%.4074s%cgalaksija%cCHRGEN.BIN", retro_base_directory, slash, slash); snprintf(bios_path, sizeof(bios_path), "%.4074s%cgalaksija%cCHRGEN.BIN", retro_base_directory, slash, slash);
if (does_file_exist(bios_path) != 1) { if (does_file_exist(bios_path) != 1) {
ignore_firmware = 1;
log_cb(RETRO_LOG_INFO, "%s NOT FOUND\n", bios_path); log_cb(RETRO_LOG_INFO, "%s NOT FOUND\n", bios_path);
} }
snprintf(bios_path, sizeof(bios_path), "%.4076s%cgalaksija%cROM1.BIN", retro_base_directory, slash, slash); snprintf(bios_path, sizeof(bios_path), "%.4076s%cgalaksija%cROM1.BIN", retro_base_directory, slash, slash);
if (does_file_exist(bios_path) != 1) { if (does_file_exist(bios_path) != 1) {
ignore_firmware = 1;
log_cb(RETRO_LOG_INFO, "%s NOT FOUND\n", bios_path); log_cb(RETRO_LOG_INFO, "%s NOT FOUND\n", bios_path);
} }
snprintf(bios_path, sizeof(bios_path), "%.4076s%cgalaksija%cROM2.BIN", retro_base_directory, slash, slash); snprintf(bios_path, sizeof(bios_path), "%.4076s%cgalaksija%cROM2.BIN", retro_base_directory, slash, slash);
if (does_file_exist(bios_path) != 1) { if (does_file_exist(bios_path) != 1) {
ignore_firmware = 1;
log_cb(RETRO_LOG_INFO, "%s NOT FOUND\n", bios_path); log_cb(RETRO_LOG_INFO, "%s NOT FOUND\n", bios_path);
} }
snprintf(bios_path, sizeof(bios_path), "%.4072s%cgalaksija%cGAL_PLUS.BIN", retro_base_directory, slash, slash); snprintf(bios_path, sizeof(bios_path), "%.4072s%cgalaksija%cGAL_PLUS.BIN", retro_base_directory, slash, slash);
if (does_file_exist(bios_path) != 1) { if (does_file_exist(bios_path) != 1) {
ignore_firmware = 1;
log_cb(RETRO_LOG_INFO, "%s NOT FOUND\n", bios_path); log_cb(RETRO_LOG_INFO, "%s NOT FOUND\n", bios_path);
} }
@ -118,8 +126,16 @@ void retro_init(void)
.firmware_path = bios_path, .firmware_path = bios_path,
.graphics_mode = GALAXY_GRAPHICS_MODE_RGBX8888, .graphics_mode = GALAXY_GRAPHICS_MODE_RGBX8888,
.system_state_file = NULL, .system_state_file = NULL,
.firmware_ignore = ignore_firmware,
} }
}; };
if(ignore_firmware) {
LoadCHRGENBIN(galaxy.chargen);
LoadROM1BIN(&galaxy.memory[GALAXY_ROM1_START]);
LoadROM2BIN(&galaxy.memory[GALAXY_ROM2_START]);
}
galaxy_init(&galaxy); galaxy_init(&galaxy);
} }

375
src/rom.c Normal file
View File

@ -0,0 +1,375 @@
#include <string.h>
#include <stddef.h>
#include "rom.h"
void LoadCHRGENBIN(unsigned char* out)
{
static const unsigned char CHRGENBINDeflated[] = "\275\377\0\0\210\257\277"
"\257\257\0\236\20\361\311\37\21\0\3+\1\0\b\337\20\0\0\177O\3\377\317\203"
"\207\203\3\3\207{\376\307\3{\373{{\207\20\r\357\207\3{ \0\3\207\207\3\377"
"\207\377\377\357\327\267\337\377\367\347\370\337\357\61\251\277\207\337\365"
"\207\207\277\3\20\31\207\61\271\207~\0\377.\373\267w{w\373\20y\373\357\177"
"\273\373\63\60x{\357O0\177\177 \2\60\177\7s\333\373\357\357\337\357 \201"
"\277{\317{\337{\237\20\250{{\347\347\277\351\377\367{\2?.\273\20}\20\177"
"\373W\20\177\333P\177\373@\177\277\373\373\327\277\373\60\377\333\20\177"
"\367\277\253\177!\1\337{\337\177\177\257\373\276\373\20\234\347\347\337\377"
"\357\60\177\251\361\20\0\37\20\0\21\20\0\0\17\36\373u\200\177\353\373K`\177"
"\267\20\1\337\357\373\373\337 \177\377\3\333\277\253\353\20\177\307\60\177;"
"\20\177\267\203\356\203\277{!\32\3\337\177\0\177.\377\353{\207\373w\203"
"\203\33\377\3\357\177\363\373Ks{\367\203{\203\207 \177\317\7\357\357\373"
"\373\357!\377\377\267\207\337\277\367\20\377\203\203\377\3\377\357\377[\337"
"\277\237\273\177{\337\275\207\21\232\367\377\277\237\0\377/\3=1\177!\377"
"\353\373{k\22\203\353\277\177\20\377K\317\177\367\373\373\333\367\177\60"
"\177o\357p\377\357k\356\337\307\177\20\177\357{\7\60\377\267\357\1\177.\253"
"{`\177{\333\373\375{[{\373[\333\20\177\317\353K\267\177\22\24\373\60\177"
"\3o\353\367[\372!\377\347\20\362s\337\377\373\177\3\177{\367{\177G1\377"
"\357\4\277.\21\377R\377{\273\373\375{;{\373\273\273\22\377\317/\23\t\23\215"
"\373\62\336\267\203;\273z2\377\347\377\347\367\22\26{\21\374\212\367R\377\4"
"\216\0\320\0\37\320\0\21\320\0\277\3\21\357\203\3\373\7{\307\337\207{\23"
"\367\207\373G{\207\303\357\207\23d#\342\23\347!\377\357;\277G3\377\357\377"
"\347\373\207\217\374\3\207\277\207\207\367\23\377\61\217\24\0\177.\5\377\32"
"\20\355\373\300\16\377\0\377/\6\177>\0\0\177n\0O\236";
const unsigned char *in = CHRGENBINDeflated;
for (unsigned char bits = 0, code = 0, *out_end = out + 2048; out != out_end; code <<= 1, bits--)
{
if (bits == 0) { code = *in++; bits = 8; }
if ((code & 0x80) != 0) { *out++ = *in++; continue; }
int RLE1 = *in++, RLE = (RLE1<<8|*in++), RLESize = ((RLE >> 12) == 0 ? (*in++ + 0x12) : (RLE >> 12) + 2), RLEOffset = ((RLE & 0xFFF) + 1);
while (RLESize > RLEOffset) { memcpy(out, out - RLEOffset, RLEOffset); out += RLEOffset; RLESize -= RLEOffset; RLEOffset <<= 1; }
memcpy(out, out - RLEOffset, RLESize); out += RLESize;
}
}
void LoadROM1BIN(unsigned char* out)
{
static const unsigned char ROM1BINDeflated[] = "\377\363\227\303\332\3\337,,"
"\377\315\262\n\303m\n\363\311\377|\272\300}\273\311\373\311\377\343\315\5\1"
"\276\303\224\1\377\331\376 \315\265\t\331\311\377!\0\0\311\314\314\314~\377"
"\361\315\24\4\303\217\7\35\377\365\305\325\345!\260+>\377\300\226\226\226_~"
"\17\17\377\17G\267(\0(\5\65\377\257\330\20\375#wC!\377\177 M:\250+\37\70"
"\377\0= \375\30\7\363\61\377\250+\303\27\3\fy\346\277\b\20*\366(\355G\23\21"
"\357\f\by\20\66?\313\32\366\377\37\7\326@\17\355Or\277\24\20\0\257\67\37\37"
"\252W\377axBREAK\0\375GL\0\0\200\0 \23\37\377g\27w\5(\17\355_\377\326'\245"
"\355O\35\302\213\377\0>\3\30\243\66\274:\377\202*\376: 4:\257\377+\7\60.!"
"\212*\21\377\60\71\6\bz44\276\377\30\4\64\276>50\n\377s+\313@(\2+z\377\20"
"\360\5\20\r~\376\64\377\70\b+\313N(\3s\377#s\375\351\341\321\301\361\377"
"\373\355M\23\32\376 (\377\372\311#\257\315\363\r\"\367\231*\367\317\60\t"
"\325\355[\377\231*\23\327\60\61\30!\177\21\v\326A\330\376\32?\330\377\23"
"\247 +\337('\317\375#))\325\70\27 !\31\377\321\325\70\r\321\337)\t\377\325"
"\353\315\203\1\327\60\66\377>\325\315\231\7SOR\377RY\r\257&*\27\27\377o\257"
"\311\315r\1\320\376\377A\330\306\t\376P\30\6\375\32\376\60\330\376:\20J\346"
"\376\17\311w#}\30\370\20h\377\70,*j*}\346\360\377o\355R\321\257\311#(\377\7"
"\305N\6\0\t\301\33\377\23#\343\311\315H\2\6\337\0H\21\216\315\260\1\30\373"
"\177\20J8 \313\360\313x \377\25\315\303\1\313@\310\r\377\311\315O\2\310\331"
"bk\377\bO\331\313\370\361\313@\377\300\f\311\337.\5\313@\377\313\300\310"
"\361\313p\310!\377\30\0\305\325\331\315\24\t\377\321\1\363\1\305\325\303m"
"\377\v\301\325\337E\33\337+\377\2\30\5\337-\2\313\310\356\315J\2 T\r\313"
"\350\20H\377 \24\30\362\321\257\30\27\377\313h(\370\361\331y\264\377}\331 "
"\2\313\177\302Z\377\6\313H(\2\355D\201\377\247(\23\313\177(\7<\377\365"
"\315\364\n\30\5=\365\377\315\343\n\361\30\352\313p\377\311\313\260\331\357M"
"\331\311\377\b\331T]y\6\0\365\373)\313\21\313\20\60\4\31\211\377O>\0\210G"
"\361\325\26\277\0\60\24\b_\31z\211O\377z\210G\321\331\311]T\377\23\32\33\22"
"\23\376\r \377\367\30%}\376\266( \377+\30\35~\376\r(\30\377\30Q\315\323\f"
"\315\362\7\377\332Z\6>\f\347!\266\377+\"h*\315\61\t\331\377\21\0(\355Sh*\21"
"\377\266+N6\0\315\67\t\377>_\315\266\7\315\365\f\177\20\63q\267(\257\376\35"
"(\377\270\376\36(\274\70\327G\377\345!4,\327\341\70\316\377\33\32\23\22"
"\33\327 \370\377p#\30\302:h*\346\377\37>\r2\265+\310\347\377\311:3 \17\330"
":1\377 \17\70\365\315\355\2\21\277\230 N\355[\237*z\263\366\304\355\b"
"\373 \22\7\17\20a\377\357\21\61\60\61\247*\325\377\345\345\345*6,##\277\345"
"\22\312\335!\254*\315\273\317\7\325\20\206\20\246\301\312\214\3\377\33|\22"
"\33}\22\305\325\357y\223\365\20\265\325 \20\325\377\315\21\b\301*8,\315"
"\376D\t`i\"8, \v\377\361\345\376\3(\257_\26\377\0\31\355[j*\327\322\337S\1"
"\20\30\321\315L\t\321\277\341\20&\30\225!\27\3\345\377.\16\1.\233\1.\356"
"\337&\17\23\200\325\23#\276(\377\6\313~ \f\30\21\32\177 \v\372\313~(\3\33"
"\30\375\22\376.(\t#\20\v\373\367#\321\30\327\60\b~#n\377\346\177g\361\313t"
"\313\264\377\345\304j\n\303\251+\355\377V\375!\375\0!\377'\377uE#p4 \3\266"
"\377(\370\"j*1\255+\377!\v\311\345;\345\315\0\277\20\21b\21:,\31\61:\375,"
"\345\345\303g\0\21q\355\373[6,\30\16\21\37\337:\377\3\361\30\20\337\r \361"
"\377\357\315\366\7\70\341\355S\376\237*\23\23\315\377\2 \372\377./\303\230"
"\3\315\216\6\377\315\20\v\357\311\317|\265\377 \347\315\34\b0\334\30\377"
"\273\357\315\23\b\30\366\317\277\325\21\270\302[\6\361\30\311l!\304\355\2"
"\21\307\70\237\21\275 I\277\366\20C:0 !4 \377\246\17\60\353\30\361\337:"
"\377\5>\r\347\30\245\337\r\377F\347\30\223\337\"T\315\377\70\t \366\30\25."
"\\\377\1.`&*\315\16\6\377~#\267(\6\347}\346\375\17 \365\337,\33!\302\7"
"\377(\27> \347\30\364\317\375|\366(\346)g\22\32\337\376,\2\30\3\337;\23\24"
"\234\337.\340 \234\323\f\"l*\257 \22;\1\20]\367\315\226\3\337 \7\24\341\315"
"\366\b>\347\373\30\271\315t\t`\243*\237\377*\345*\243*\345\357\"\377\241*9"
"\"\243*\303'\277\4\20\16|\265\312Z\6\371\277\341\20\17\341\"\237*\321\315"
"\377Y\t\367\317\1\357#\"\337\221*\20/\"\223*\353\"\377\225*\1\n\0*\241*\377"
"\353\357\71>\t~#\266\377(\26~+\272 \365~\357\273 \361\20\22DM!\n\337\0\31"
"\21\330\371*\225*\353\377\367\315\213\7\"\233*\325\237\353\20/\20Y[\6\327("
"\t\177 S*\233*\30\352\315E\377\n\315m\n\353*\221*\375\345\31\345\315\274"
"\n\20S\315\377;\7\321*n*\361\7\377\60\1\353|\252\362\245\5\377\353\327"
"\321\332$\5*\223\277*\20\214\30\255\312\66\7\345\377\315\374\5\70\17(%\343"
"\377\301\n\267(*\3\315~\377\1 \366\311\341\337\"\0\375\315\331\5(\32\23 \17"
"\365\377\32\376\r\310\376\"\300\23\335\311\33\20\375(\342\341\20$\310_#\364"
"\303\23\67\177\1\310\66\60\375\30\370\315%\1\330\23\36\376\377)\310\32\376$"
"(\2\257\377\311\23}\326\\ \n.\377p\337(\3\315\24\1\264\377\311\376\7\322"
"\217\7.\200\337\264\311 o8\325\365\345\355\355[\235*\22\324\337#!n,\377\17"
"\341\361\315\262\5\355S\377\235*\321\337,C\30\332{\20J\r \372\23\25\63\336"
"\341\337\361\16%\6HOW?\r\177\62\17\23\23\30\326\325>?\357\315\275\7\23\273"
"\337\r\5\321u\20\302\367\321\325 \310\327\63G\262\377\5\321\361\367\337-\6"
"\357\177\21\4\30\24\337+\0\315\263\367\6\337+\b\20\5\315\62\v\373\30\365"
"\337-\337 \n\36\v}\21\62\223\3\337*\b\20\5\315\333\346\n\20\30/\306 \n\367"
"\n\377\30\352>\1\1>\200\365\377\337*\5\361\62\257+\367\377\361\6\257\247"
"\365\317\345\315\377\5\0\325\353\1 \0\34\377!\0(\26\3>\1\35\377(\n\7\7\25 "
"\370\t\377\313\214\30\357G\321\343\313\377\275\313\265\313=0\1\7\377&\0\301"
"\tG\361x \277\f\23c\1\246\357(\1#\367\303\274\n\365\23|\2\66\200\377\361"
"\372-\7/\246\6\266\275w!\313\337=Y\345\27.\341\377\315\16\t\1\4\0\325\345"
"\377\353\335\345\341\355\260\353+\377+\313\26#\335~\4\27\376\313\36+\313\36"
"\341\321\61\64\373\b\365\337=+!%\367b\266k\21\264\30\254\26%\262\n\20\33"
"\357%\1\322\21\371\242\1\300\337\335(\v\27{\337)\1 \23\320\177&;WHAT?\r\321"
"oT\216{\262\24\26\343\310\327\330\373N\305\66\0\345\25\3\341\301\377>?"
"\33q\303\66\t>\276>\25\6\347\331\66_\331\25\0/0\7\25\71\f\25\2\25\376\f("
"\373\342\376 8\350%Z\310{\377\376\64 \336>\35\347{y\25_\314\33\30\317#\343$"
"\312+\367\327\322\27\3\24\241+\327\341\377\330\32\225G\23\32\234\70\371\4"
"\33\260\311\23\27\r!\305\30\367\333\23\32\357\25\212\366\376!\375(\354\376"
"\" \n \27(\277\350\20\t\366\376E \343.\277\366\24\3\335~\377\247> \377(\2"
">-\347\257\335w\377\377=\365!,\0\315\5\356\v0\r&\26=\30\360\26$\373\361<"
"\365!\240\60\24\362\335\377~\376\355D(\v\331\313\377\71\313\34\313\35\331="
"\30\355\363\6\7\21:6\0\27xO\377\2\331x\331w#\20\365\377\1\0\6+~\376\5?\377"
">\0+\216\313!\376\n\377\70\2>\0w\365\247(\377\2\313\301\361\20\351y\301"
"\377\70\6\4\305\6\1\30\337\377Ox<\372\310\b\376\7\377\60\6G\315\34\t\30C?"
"\20\24\20\7>E\347\301\313x\367>+(\b\20\222x\355D\375\30\2\347x\6\60\20E\34"
"\377\306\366\4\30\367\32o\23\356\32g\23\23e\325\305\345\20\215\377\376\200"
"\302=\b\257\6 \377\366\60Ox\347y\347\341\377\301\321\1\373\377\335\t\311"
"\357\315L\f\23\335\30\365\4\20\377\3>.\347~\366\60\347\377#\313\71 \362\5\5"
"\370\375\4\30\353\315\355\b\24|\257\375G\32\23\270\310\347&\271<\377\311"
"\327\310\32\2\23\3\30\377\370x\222 \3y\223\310\377\33+\32w\30\363\301\341}"
"\24R|\265(\20\341\24\66\341\327\"n\24J\223\24N\225*\305\374\311!\310\324"
"\301\71\25\375\64\17\325(\23\24#\345\23\334\345\23\363\345?$\7\24V\345\305"
"\311\337>\7\377\315\71\4\310\330#\311\337\326=\6\20\t\300\20\b<S\20\22\377"
"\320#\311\365\315\254+*\377h*8Fw#>*\357\274 :\31\210\315=\n\345\337#4\20\5"
"\267\355[l*\377\313\212!\340\1\355R(\377\16\70\fDM\313\332\313\356\352! \26"
"t\260*l\24\332\277\341\22\320\3!\340)\345\315\355\64\n\341\27V\361\311"
"\27\177\16\377|\376+8\4\66\r\30\277\356\20\25\30\252\376\f \r\377!\377)6 +"
"\313L\377(\371#\30\330\376\35 \277\324\60\r \362\30\313\66 \377#}\346\37 "
"\370\311\355\377W\340~\267 \374\311\325\337\345\365\23\t\335\345\321\355"
"\260\377\335\313\2\26\335\313\3\26\375x\37\335w\4\67\20\r\36\373\16\5\335\t"
"\361#\16\201\7\277\331\23\62\21\0\0\335~\3\377\335N\4\376\200(,\376\377\1"
"\372\256\n\376\20\331\362\377Z\6\331G\335~\0\335\377n\1\335f\2\313'\355\377"
"j\313\23\313\22\20\366\313\377!0\b\264\265(\1\23\377\315\327\n\325\331"
"\341\311>\356\377\30\354&x\231\t\1\25a\177\31q\27\t\315\324\n\325!\377\20\0"
"\313\34\331\321\357c\277J\21\272\30/\257\202\360{\377\355D_z/?\316\0\377W7"
"\311\315\271\n\315h\377\f(>\273\312k\v\315\366\201\v\30\17P\20-\273\25\213"
"\373\315\256\v\30h%\204h\fk\21\374\30\6 \7\366\22\4\275\315\337\346\v\23"
"\302h\f \5\315\377b\v\30\60\273(S\252\357W\30\v@)(,\273(\377D\315\4\f(\16"
"\60\7\377\353\331\353yHG\331\315\377\27\f\30 |\252 \32\376\36\1\315?\f\30"
"\25\23\32\337\356\200\23\23\321\311\325bk\377\331kbH\331\1.\200\377\335t"
"\372\335u\371\331\335\377u\366\335t\367\335q\370\377\331\303\r\t|\252g\35"
"\377\345\305\6\30\315\201\f\257\337\357Oc\34\60\4\31y\210\377O\331\20\5\301"
"\341\331\30\366\60\331\313\31#2\30\341 \326?\20\60\20/\31\331\355Ry\230\365"
"O0\3\31\20&?\21/\21\371\20\v\345\305\331\20. 1^\273\331\31\200\60\335?0#"
"\267\30\377\336(\n\273(\17|\252\377\314\4\f\30\7\273\310\67\377\313z\30\3"
"\310\313|?\377\300?\37\67\313\27\311}\377\223(\7\342\r\f\355D\377\7\311\331"
"y\270 \1\327\277\331 \22\16\376\30\320\331\313\377\70\313\32\313\33= "
"\367\377\331\36\0|\252\372F\f\267\331 \227\60\7@\220\67\331}\375\213\352a\f"
"o\311@\214\6\377\30\257\f\r\372]\f=\177\31\375\20\367.\200\311\331\205"
"\377\30\340|\267\362X\6\30\377\362\341\325\345\335V\377\335\376^\376\335f"
"\372\335n\21\3\377^\373\335V\374\335F\375\377\335n\366\335f\367\335N\377"
"\370\331>\200\275\311\325\331\377!\247*\345^#V#\337F\331\32\370\357\16\3\6"
"\b\276V \314\331\313\22\60\6\60|\377\331\20\357#\r \350\357\377\331\321}"
"\306e\22\23o\377|\316\260\22\23gy\316\344\5\22O\32\345\32\337\357++\33&\317"
"\7\33\25_\27\\|\265\311\274\377 \2&\0\275 \2.\377\0\35 \v\30\6\331*\377"
"\245*\16\16\21\64 \32\377\17{8\343\376\62 \b\377\r \334:\264+\30E\377\274("
"\336\275(\333\6\0\377\327\32\17\70\312\20\371|\377\267 \3c\30\5}\267\376 "
"\325k\"\245*\357\25K\377\312a\4\376\61\312\5\3\377\376\33!5 8\31\376\377\37"
"\70\20\326\37\313\36\27\377O!p\r\t\355_2\377\250*~2\264+\331\311\377\306@"
"\313\36\70\365!\224\377\r\1[\4\276(\5#\377\f\20\371\16y\30\344 \377 _0!1\"2"
"#\377\63$4%5&6\277\377\67(8)9+;*\377:<,-=>.?\377/\r\rXCZS\f\277\0\34M"
"\355K\231*\355B\377\30\32N#fi\30\24_\31h\5\32\352\30\6\313\354~\377/\346\1o"
">n&\0\67\26\242\30\v\345\337\25w\374\5\301\377\n\276 \v\267(\7#\277\3)-"
"\362>\257\30\331\315\375e\1\70\24\33\357 \6\324\277\7\20\0\1\346\r\305\6\4"
"\357\7\355j\33X\20\370\311\366\277\257G!\343\301q\361(\2\377#p\367\325\21"
"\275\n\325\367\351\262}\311\31#\315\60\7\177\31\25\337T\262\337O\257\317i"
"\24\300.\330\31\366!&<\30\1\r\367\2\30\6\317\36$\0#\321\377\6`\363\257\315"
"h\16\20\355\372>\245\20\6\315b \2+\177\30\205h\16\60\371x/_\337\353}\20"
"\34|\331\16\20!\177\34\270A(\5\17\6d0\377\17\66\374\6\62\20\376\66\276\270"
"\60\5\274\4\20\376\20\34\4\337\341\3\34e\373\331\200G\327\373\311\337?\0"
"\365\20c\357>\377\317\345\363\315\335\16y\376\377\245 \370G\315\331\16a\366"
"\321\325\31\353 \7+x\27\255\267\353\20\32\by\21]\361(\r\376\365q#\353\b8"
"\355\20,\347\361\4\310\36\241\20\65i\331\6\377\1>\247\200!\0 \313\377F(\7= "
"\365\331y\377\30\242\6\332>\251\20\374\377\6ZN\313\31\316\0\20\337\371\7\23"
"[\331\30\331@'\177\36oDY\rLIST\377\204^RUN\204\vN\377EW\203\374SAVE\377"
"\216\60OLD\216\227E\377DIT\202\231NEX\377T\205dINPUT\377\206lIF\204AGO\377T"
"O\204SCALL\377\204\364UNDOT\206\377\314RET\205\22TA\377KE\206&!\204M#"
"\377\204MFOR\216\30P\375RINT\204\200 !\317\377ELSE\204MBY\377TE\215\377WORD"
"\377\215\376ARR$\301\v\377STOP\203\27HO\377ME\204\326\207[RN\377D\214\217ME"
"M\215\232\373KEY\315\253 .\315\274\177 .\315\245PTR\207i\377VAL\307pEQ"
"\215\277\302\20X\312\274&\215\337U\367SR\316\17 \202\334\207w\377STEP\205("
"\205*\377AT\204\274X$\204\230\377Y$\204\233\204\216CH\375R$\316\25\206\v0"
"\200\32\340\210\33";
const unsigned char *in = ROM1BINDeflated;
for (unsigned char bits = 0, code = 0, *out_end = out + 4096; out != out_end; code <<= 1, bits--)
{
if (bits == 0) { code = *in++; bits = 8; }
if ((code & 0x80) != 0) { *out++ = *in++; continue; }
int RLE1 = *in++, RLE = (RLE1<<8|*in++), RLESize = ((RLE >> 12) == 0 ? (*in++ + 0x12) : (RLE >> 12) + 2), RLEOffset = ((RLE & 0xFFF) + 1);
while (RLESize > RLEOffset) { memcpy(out, out - RLEOffset, RLEOffset); out += RLEOffset; RLESize -= RLEOffset; RLEOffset <<= 1; }
memcpy(out, out - RLEOffset, RLESize); out += RLESize;
}
}
// Function to load data from file 'ROM2.BIN' into out with 4096 bytes allocated (stored compressed in 3976 bytes)
void LoadROM2BIN(unsigned char* out)
{
static const unsigned char ROM2BINDeflated[] = "\377*j*|\265 \4+\377\"j*>\f"
"\30\23\343\377\325\21[\7\327 \35!\377\360\35\321\361\303\232\3\303\377[\7"
"\347>\f2\250+\377!\241\20\21\251+\1\6\377\0\355\260\311\21\216\4\327\377 "
"\23\321\343\361\337%\n\377\317> \347\315L\23\303\377\255\4\303\216\4\21w\7"
"\377\327\321\343\300!#\36\30\377\302\303w\7\1\200\4\305\377>\377\62\265+"
"\311\315`\377\20\315\323\f\303d\4\365\377*\265+, !!\253\377*\313F \16!\231"
"\20\377\6\4\276#(\4#\20\377\371&~\365\315\377\2\333\377\377\27\70\370\361"
"\323\377\361\377\311[C\\C]Z^\377S\303\17\20\303o\20*\277\237\20\246\312Z\6"
"\353>\1\377\62\263+\315\277\20\335!\377\254*+\353\367\257\62\252\377*2\335+"
"\353\357\"\366\367+\"\227*\20\315+w+\377w\353\315R\27\345\315\346\375\20!"
"\252*4\257\20\36\341\377\257\62\354+2\352+2\377\353+\"\237*\355[8\377,\327"
"\320:\335+\376\b\267\310\20r\315\63\20+\f\21\341\377\30\344!M\22\345!\336"
"\373+\335!\333+\20\35\267\310\377\376\t\322$\23= '\377!x\31\"\346+>\315\377"
"\62\345+>\3\62\351+\377*\337+|\265\310\315\33\277\23\20q:\342+\267 \1\377<"
"2\262+\311= !\277~\20g\21\345+\6\3:\273\354\20?\335\65\21\20*~#\377\""
"\337+\22\23\335\64\16\337\20\351\20#\4<\335w\16\375= \f\315\30\23\20G\"\364"
"\345+\303H\20c#\20M\20V\377}\346\4\304`\20}\346\267\3\20\344:\341 \202@\302"
"-\362\31*\342+\20\336\20_\rP4\365\355+\"\352\20o\300\20C\355\377K\337+"
"\355C\355+\315\377\322\21\312-\31\361\303T\377\22:\252*\267\300*\332\177\60"
"\242\25\22\312O\26\345*\177\20\357\341\322S\1~\22#\377\33\315P\30\60\356"
"\353#\377\313\376+p+q+6\373\0\353\257<\311 1 \v\337+# \33\372\257GO\311\337"
"\345\331!H\30\22\321\325\32\377\276(\26\366\200\276(\25\377\313~+(\373++~"
"\377\267 \352\345\331\321\341<\376\311+\23\30\342\23\353\20N\377\353\60\343"
"+F+N\353\375\321\257\311\355K\352 \210\21\357\344+\32\20P!\345+\1\277\4"
"\22/\22\30\27\376\355(\377\23!\351+4\335~\3\377\376\206(\5\335~\6\376\377"
"\206\314\367\37\335F\16\4\373\5\312\20\23*\20\66W\23\371> \315p\23\20; \300"
"(\377 \305E\16\375\355a\f\377:\263+\346\2\32\355y\377\301(\n\345\325\355"
"[\366\377+\31w\321\341\315\\\23\363\23#\20\327\21\4!g(\21\336>\r\20\71"
"\335\66\16\0\20y\372\315U\21\30\247!\3\310\20:\377\37\320:h*\346\37\376\357"
"\v0\5\22\247\30\362\355[\373\237*\315o\31 \31\60\20\372\315\355\b:\333\21"
"\275\4\22\302\377\347\315\64\t\335*\364+\337\311*\21JW\23\30\276\315\377"
"\223\24:\336+\376@\310\377\303-\31=O\376*\322\377\202\23\6\6\257\266#\20"
"\377\374 \355y\376\25\70\7\367\335\66\t\355\21\323!v\36\373\t~\335w\n\21"
"\336\311>\313&\347\62\236\22\223|\20\242}O\377\346\360\315\67\24\315h\23"
"\377y\346\17\306\60\376:8\365\2\306\7\365\60\335\6 \233\70\377\2\361\311"
"\361\347\311\315\5\377\27y\6\0\376\64\322\326\377\23!5\36\tF\335\66\373\n"
"\313\335p\v\20\316\2!\377\341+\376\61\70\23\315\326\377\26\376\b\322O\26\7"
"\7\377\7\335\266\v\335w\v\30\347\b~\267\22\27\22\253\315\346\26{@\22#n:"
"\344\"rf\vw\22\252\311\376<\21\r\1\322c\375\24!6\36\t^\22\323~\367\376\6(P"
"\"Q(\b~\367\376\16 \302\20Y~\376@\331(\37\20?\263#\20\276\20\302\v\265"
"\311\22\242##1}\5\20_O\277\26\23\267\f\24{\366F\30\377\336\36\1\315\355\26"
"\60\v\377\34~\376\b0\f\326\4\337\70a\20\212\7\311y\376\67\336\60W\21\345"
"\376\64(\f }\372 J6\355#\22\347\345\20\267\377\315.\24!?\36\t\266\377\341w"
"\311\376>04\315\377\220\24\315&\24Wy\35\377(\16\376<(\3>\v\365!>\3\262\23O"
"\311\60\r\5\367!>\4\262\23y\303\3\24\37\23\177\62\370\21v\376?\312a\25\377"
"\322\213\25\6\v!\241\36\377\315u\25 -\376\3\60\377\32!\337+=(\3!\337\342+"
"\21\357\3~2\346+\377#~2\347+\335p\n\355\311\376\b\22q8\6@\203p\275\311!\35"
"\355\26\70\63\21\65__P\356\27 \356\376\66(\242\366\235@\23\313\23\272\335"
"\266\4\20A\311\345{\366\6\23\333\20\354~ \204\302}\"J\3\21\341+\32\21!:\376"
"\6\b\376\300(\21~\20\4\377\t\376\7 \3\32\376\6\373 :\353\6\0\20\337\366\2"
"\377\260G\346\60\376 x(\267\tR\f\366A\24\"\353#^\375#V\353\303\322\23\21\2<"
"\337\30\356\22E\315\330\25!\302\346\36\6\3\20\303\23\315\303\307\"Y\367\276"
"# \6\23\341\276(\5\377##\20\357\311#xF? \260\20t\1-\31\305\1\1\377\0\376"
"A(\6\60C\353\377\1\0\b\313~\310\313v\377(\23##~\267\300+\177 \360\32\376"
"\16\300>\323\260\375\30\25~\376\211\300\"\206\353w\22\5\376\6\310\22\36"
"\366@\261]\24\244\361\24R\376\5\300\"\20\30\377gO\376D \v~\376\377\206y \5>"
"\351\321\30\377u\376F(c0r\326\377B\7_\315\274\26{0\377\n<=\310== \3\375\313"
"h\300\345\26\0\22\315\355\356Z~\260\24\350\341>\3\24\247o\22#\300\361 "
"\317\355S\346+\376y\376D\320\335\65\16\23\254\377##\353\267\355R\335u\177"
"\22\244\f\0\313} \1%\377$\310\355[\252*\35\300}#`\23\23\303Z\6\20\\4\377"
"\65\300>\311\321\60\3>\377\300\260\303|\24\326I0\317\67O\24\364 \307\304I"
"\26+\347\f \35\25\22#E~G\376\377\3\324I\26>V\5(\377\7>^\5(\2>F\375\303\356"
"\25~\346\307\20&~\377\366\307\30\362\7\7O\32\377\267\300~\376\7\310\376\3"
"\377 \2>\7\315/\24\366\377\301\261\30\332\6\0~\376\377\t \3>\24w\326\21\373"
"?\320\376\b\320\23 ##\367#G7\311\24g\326@\335\377\266\5 \n\335~\4\311_2"
"\275\320\23\310~\267(\371\376\377\206>\6\310~\376\17?\367\330\326\b\330\21"
"\314\1<\267\367\311\315\27\27\23j \nP\177\20\b\300x\272\310\30\323\6\365"
"\376~\346?\21S\5\21\32\6\377\335>=\300\335p\t~\377\346\300\366\6w\257\311"
"\21\377\352+\6\22\257\33\22\20\376\374\325\335\341##\345\24\275\177\25\221"
"\341\345~\376!\304Y\377\27\341>\r\276#\310\30\377\373\345\315\5\30 \31\341"
"\337\"\332\22\240\376\r(\6\376\377 \302c\27#\315<\30\377\315\17\30(\"\365"
"\361y\377\346\177\335w\5\315\32\30\347\315\234\27&q \31i\31\376\375, \6\315"
"\235\27\20&\303\377\357\27+\315h\31\376(\377 \5#\335\313\6\376\21\377\263"
"\37\345\315\66\31\f\313\372\271\353\267(>\20\31\361\25E\372\261\335w\6y\23"
"\25\33 :\377)(\33\376-(\4\376\377+ \34\315f\30\345\353\376\315B\26]\341\30"
"\36\60\32\377 \t/#\335\256\6\360v\24\315\257\30\366\20O\366\341\20#\377"
"\335r\b\335s\7\30\335\237\345\20\\\20[\341 \340\21\312\277\36 d\353#\267"
"\311\326\2\335 \36 \200\" \312&\301\16{\21l\"#(\7\20\313\272\f\363\30\363y2"
"\24|\20\257!(\375\5\376\r\300\361\311 \344 \377\372\361\311~\315s\1\33\377"
"\320\23\376A\330\376_?\377\311\315\327\30\355K\357+\377\311\353\357\337+\0"
"\376-\377\304\327\30\"\357+\315{\377\30\332O\26\30\365\337+\377\5\315^\30\t"
"\311\337-\277\r\20'\267DM*\357+\376\355B\267\311\337<\f\20\67\273E\20\r)\20"
"\375\20\16>\17~P\16\313<\313\35\20\372\20 \337#\n\20\70|\240g}\241\325o\311"
"\20\366\f\21_\b\20\211\4j\21=\\\361\20E\353\25T\1\20\210\347\70\n\33\25"
"\355(y\v\23\376\376& \26\23\315e\1\20z\327\33\357\20\7\330\25\232\1\366\30"
"\377\303\362\r\353\315W\30\70\375\20\315\4\22 \37(\24\6\377(\30PY\353\311"
"\353\337\377\"\t\32\23o&\0\337\375\"\b\311\337$\4\26\243\311\177R\335\217\7"
"\6\177~N\353\377#\266\362;\31\4~\346\377\177\310\271 \363\353\345\23\377"
"\32\267\372Y\31O#~\375\271(\364\341\30\340'M+\377\70\3\33\30\363H\361\353"
"\367\267\311#\353\20\222\353\311\335\337\"\364\30_\254*\311\355s\377\61,11,"
"\365\305\325\374\345\335\345*1,\22G\24\66\337\331\b \20\375\345\331\325\315"
"\377\355\2\21\330\37\315\67\t\377\21\60,\6\2\305\6\6~\31g\32\33g\32\33o\27)"
"\377\20\362>\r\347\301\20\351\337*\227\31\274:\262+\304\336\377\31\315\365"
"\f\361\361\341\321\367\301\361\b\331@\7\355{1\357,\311W\31\232>:\347\6"
"\256\b\31\245~\27\65#\20\366\31d\177\20<\25 \345\311>\3\365\377\317\325\315"
"\362\7 \22\341\327\325\325\20\236\0 \v\6\343\327\357\343\332Y\31\367\6\317|"
"\267\377\325 \367\265(\364DM\375\357\345\355[6,\30F\353\377\327\353\341\60"
"\24\t\313|\377 \336\345\353s#r\353\337\23\32!\366\23\30\343\321\367\375"
"\325*6,+#9\\0\276\61\31\312DM#\345\341\62\373\377\352\321\325\345\32\276 "
"\362\177 ,(\3#\30\363\361\325\377\305\305\321\315\61\t\341\321\272#B7\30"
"\307\321@I\367\32)\276\317\23:\0}\267\341\325\20\326\377\321\367\365\4\65\0"
"\256V\377\31\0\363\"v\0=\252\373\70\1\326\17I\20\3\311\0\177\20\3\1m\22\203"
"{\0\0\377\300\201\0\0\360\3\0\200\377\235\206\0\60\261\t\23r\377\61\0O"
"\370-\1\\\v\377\266{\205\210\b}\250\252\376*~\251\252*\177\0\60\0\277\200"
"\60\3X\327;|\354m\377\204\375\366\301/~\34\61\377\232\376\261=\332~\306"
"\177\377\21\377\3\274L\177|\252\377\252\377\336.e\3!\261\377\32\303E\n\315"
"\"\33\6}\30\256\373\335w\0\335\21<\311\177\20\17\357\315\274\n\30\v!\357"
"\355\32\345\20\34\341\315E\n\377\303\20\v\1\366\377\30\3\376\1\5\0\335\t"
"\311! \n\377!\361\377\325\335\345\321\31o\20\22\355\260\24%\321\311\315\201"
"{\24\266\33\332Z\6\32\304\335\66\377\17\0\315\70\33\70\v!\377\351\32\315"
"\363\33\335\64\17\335\30\360 \n;\33\60\60\22\34\375\34\335\65\17\30\355\20{"
"!\376\241\32\315{\35\315Q0\b\377\324\34\315\367\n\315\310\34\377\315\37"
"\33\315\346\n!\245l ;!\251\60\27Q\33\20\250\20\24_ \27\255\60)\346\n\335n"
"\17\273&\25\234(\1%\20\260\315\62|0l{\35!\321\32 \262\20*\377\201\7\335~"
"\377\335\313\377\377\276\311\325\315\60\34\321\315\377$\34\303\367\n\1\374"
"\33\367\305\337D\v\20\255!\25\33w\20\333\30\353\303\20\270\17\34!\273\265 "
"\177\257\30\4\20\v\7\335\367w\24!\271\20\376;\33\341\346\70\24\345\20\256 |"
"m\n f\352\36\v\341 \225\261P\35\6\20\275\357\335\64\24 =;\33\70\17\177 "
"\244F\33\315\31\33\315K\264\33\20*!\275 \363\330\20\317\20\t\376\6\4\305"
"\345\315V\33 \2?\20\307\60\5\335\345\1\354\377\335\336\t!\21-Y\33\335\341"
"\25k?\25m n2\v\341\301\20\320\375\335\313\nF(\4\20\301\376M!\24F1\230\20X"
"\30\3!\223\62\377\v\337(X\315\262\n\315\373k\33\337,O\20\b\337)\267I\21\65"
"\30*2]\301\355i\373\367MD\355h\20+\35\31\350\303\275\rA\235\310\20,!\222"
"\20\366\275\324!\257\374\33\27\365@\332\345o@\333\357#\21\373\341|\267\302"
"\377Z\6\265(\v\345!\325~!\276\341- \365!\331\22\r\374E\n\341\6\6\305@\244"
"\60\305\307\341\345\21\263\20\251\27\237\n\361\322\3\60\243\22\66\22\61\20"
"\376\21k\":\36\v\337\315\371 e/\33\312\227\20p\22\23\365\70\22A$p(!\363\61"
"\360|\"w!\365\32\6\b\21'A\362\70\20a!\22\301\20\355 V\22\36\61;\257\361pB"
"\265`B\36\v\361\60\177\61(\303\305\34LPRI\377NT\220\\LLIS\377T\220fOUT\234"
"\361\377<\220\247/\232JRE\377N\232\32LDUMP\337\232\220\60\5\223DEL\231\377"
"\373\220\37SQR\235\6\377LN\233hABS\233\377\371SIN\234\60CO\377S\234$TG\234"
"\4A\377RCTG\235\201PI\377\233\31EXP\235\30P\377OW\234\332INP\334\377\372"
"\"\235\0\220Y\0\20\377\b\30 (8@\300\200\377\0\200\210\230\220\240\260\250"
"\377\270\0\tJB\20\0\30\377 \303\302\315\304\0/?\377\67v\363\373\331\7\27\17"
"\377\37'\260\240\270\250\261\241\377\271\251\262\242\272\252\263\243\377"
"\273\253DMEog\0\377\16\17W\17\16G\16\20\377_\20\16O\16\204\n\16\377\205\32"
"\204\16\2\205\16\22\377\7\6\371\16\300:\300\16\377\62\207\6\343\3\3\b\5\377"
"\6\353\322EG\324EX\377T\327ORD\302YT\377E\317PT\317RG\305\377QU\276\316OP"
"\303P\377L\303CF\323CF\310\377ALT\304I\305I\305\377XX\322LCA\322L\357A\322R"
"\20\6RA\304A\373A\314DIR\20\3\314D\276D\20\6D\303PIR\20\3\357\303PD\20\6D"
"\311NI\273R\20\3\311ND\20\6D\317\377TIR\317UTI\317\337TD \7D\316EG\322\357E"
"TI\20\3N\322LD\355\322RD\20[\322L\20Y\322\375R\323LA\323R\20\2L\377\302I"
"T\323ET\322E\377S\301DD\301DC\323\375BC\323UB\301\20KR\337\330O\20h\311N"
"C\304E\376C\314D\305X\311N\20Z\377\304JNZ\312R\312P\367\303ALL\20Z\322ST"
"\377\311M\320OP\320US\377H\200\311X\311Y\301F\277\302\20/\310L\323P\302\303"
"\377\304\305\310\314\301\311\322\316\377Z\332\316C\303\320O\320\377E\320"
"\315\200 AF\373 BC\20\4DE\177\20\tHL IXI\376Y SP()\r.\375\370E\310\64"
"\311\5";
const unsigned char *in = ROM2BINDeflated;
for (unsigned char bits = 0, code = 0, *out_end = out + 4096; out != out_end; code <<= 1, bits--)
{
if (bits == 0) { code = *in++; bits = 8; }
if ((code & 0x80) != 0) { *out++ = *in++; continue; }
int RLE1 = *in++, RLE = (RLE1<<8|*in++), RLESize = ((RLE >> 12) == 0 ? (*in++ + 0x12) : (RLE >> 12) + 2), RLEOffset = ((RLE & 0xFFF) + 1);
while (RLESize > RLEOffset) { memcpy(out, out - RLEOffset, RLEOffset); out += RLEOffset; RLESize -= RLEOffset; RLEOffset <<= 1; }
memcpy(out, out - RLEOffset, RLESize); out += RLESize;
}
}

14
src/rom.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef __LIBRETRO_ROM_H
#define __LIBRETRO_ROM_H
// Function to load data from file 'CHRGEN.BIN' into out with 2048 bytes allocated (stored compressed in 569 bytes)
void LoadCHRGENBIN(unsigned char* out);
// Function to load data from file 'ROM1.BIN' into out with 4096 bytes allocated (stored compressed in 4184 bytes)
void LoadROM1BIN(unsigned char* out);
// Function to load data from file 'ROM2.BIN' into out with 4096 bytes allocated (stored compressed in 3976 bytes)
void LoadROM2BIN(unsigned char* out);
#endif