[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
endif
SOURCES_C := $(CORE_DIR)/src/libretro.c
SOURCES_C := \
$(CORE_DIR)/src/libretro.c \
$(CORE_DIR)/src/rom.c
SOURCES_CXX :=

View File

@ -3,8 +3,8 @@ galaxy-libretro
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
--------
@ -22,17 +22,19 @@ Initial setup
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)
[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)
@ -55,6 +57,20 @@ Built-in shortcuts
- ``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
----------------

View File

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

View File

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

View File

@ -11,6 +11,8 @@
#include "libretro.h"
#include "rom.h"
#include <file/file_path.h>
#define VIDEO_WIDTH GALAXY_HORIZONTAL_RESOLUTION
@ -88,23 +90,29 @@ void retro_init(void)
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);
if (does_file_exist(bios_path) != 1) {
ignore_firmware = 1;
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);
if (does_file_exist(bios_path) != 1) {
ignore_firmware = 1;
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);
if (does_file_exist(bios_path) != 1) {
ignore_firmware = 1;
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);
if (does_file_exist(bios_path) != 1) {
ignore_firmware = 1;
log_cb(RETRO_LOG_INFO, "%s NOT FOUND\n", bios_path);
}
@ -118,8 +126,16 @@ void retro_init(void)
.firmware_path = bios_path,
.graphics_mode = GALAXY_GRAPHICS_MODE_RGBX8888,
.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);
}

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