diff --git a/data/common/emul/pokemini b/data/common/emul/pokemini new file mode 100644 index 0000000000..76c9d0995b Binary files /dev/null and b/data/common/emul/pokemini differ diff --git a/programs/emulator/pokemini/Makefile b/programs/emulator/pokemini/Makefile new file mode 100644 index 0000000000..288702e65e --- /dev/null +++ b/programs/emulator/pokemini/Makefile @@ -0,0 +1,15 @@ +OUTFILE = pokemini +OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) $(OBJS6) $(OBJS7) $(OBJS8) $(OBJS9) +OBJS1 = PokeMini_SDL.o ../../sourcex/KeybMapSDL.o ../../sourcex/ExportBMP.o ../../sourcex/ExportWAV.o ../../source/PMCommon.o ../../source/PokeMini.o +OBJS2 = ../../source/Multicart.o ../../source/Hardware.o ../../source/Video.o ../../source/Video_x1.o ../../source/Video_x2.o ../../source/Video_x3.o +OBJS3 = ../../source/Video_x4.o ../../source/Video_x5.o ../../source/Video_x6.o ../../source/CommandLine.o ../../source/MinxCPU.o +OBJS4 = ../../source/MinxCPU_XX.o ../../source/MinxCPU_CE.o ../../source/MinxCPU_CF.o ../../source/MinxCPU_SP.o ../../source/MinxTimers.o +OBJS5 = ../../source/MinxIO.o ../../source/MinxIRQ.o ../../source/MinxPRC.o ../../source/MinxColorPRC.o ../../source/MinxLCD.o +OBJS6 = ../../source/MinxAudio.o ../../source/UI.o ../../source/Joystick.o ../../source/Keyboard.o +OBJS7 = ../../resource/PokeMini_ColorPal.o ../../resource/PokeMini_Font12.o ../../resource/PokeMini_Icons12.o ../../resource/PokeMini_BG2.o +OBJS8 = ../../resource/PokeMini_BG3.o ../../resource/PokeMini_BG4.o ../../resource/PokeMini_BG5.o ../../resource/PokeMini_BG6.o +OBJS9 = ./freebios/freebios.o + +CFLAGS = -Os -fomit-frame-pointer -DPERFORMANCE -DNO_ZIP -DNO_SCANDIRS -I$(MENUETDEV)/include/SDL -I./ -I./../../source -I./../../sourcex -I./../../resource -I../../dependencies/minizip -I../../freebios +LIBS = -lSDL -lm +include $(MENUETDEV)/makefiles/Makefile_for_program diff --git a/programs/emulator/pokemini/PokeMini_SDL.c b/programs/emulator/pokemini/PokeMini_SDL.c new file mode 100644 index 0000000000..096edf264f --- /dev/null +++ b/programs/emulator/pokemini/PokeMini_SDL.c @@ -0,0 +1,527 @@ +/* + PokeMini - Pokémon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "SDL.h" + +#include "PokeMini.h" +#include "Hardware.h" +#include "ExportBMP.h" +#include "ExportWAV.h" +#include "Keyboard.h" +#include "KeybMapSDL.h" + +#include "Video_x1.h" +#include "Video_x2.h" +#include "Video_x3.h" +#include "Video_x4.h" +#include "Video_x5.h" +#include "Video_x6.h" +#include "PokeMini_BG2.h" +#include "PokeMini_BG3.h" +#include "PokeMini_BG4.h" +#include "PokeMini_BG5.h" +#include "PokeMini_BG6.h" + +const char *AppName = "PokeMini " PokeMini_Version " SDL"; + +int emurunning = 1, emulimiter = 1; +SDL_Surface *screen; +int PMWidth, PMHeight; +int PixPitch, PMOff, UIOff; + +FILE *sdump; +void setup_screen(); + +// Sound buffer size +#define SOUNDBUFFER 512 +#define PMSNDBUFFER (SOUNDBUFFER*2) + +const char *clc_zoom_txt[] = { + "0x (Illegal)", + "1x ( 96x 64)", + "2x (192x128)", + "3x (288x192)", + "4x (384x256)", + "5x (480x320)", + "6x (576x384)", +}; + +// Custom command line (NEW IN 0.5.0) +int clc_zoom = 6, clc_bpp = 16, clc_fullscreen = 0; +char clc_dump_sound[PMTMPV] = {0}; +int clc_displayfps = 0; +const TCommandLineCustom CustomArgs[] = { + { "-dumpsound", (int *)&clc_dump_sound, COMMANDLINE_STR, PMTMPV-1 }, + { "-zoom", &clc_zoom, COMMANDLINE_INT, 1, 6 }, + { "-bpp", &clc_bpp, COMMANDLINE_INT, 16, 32 }, + { "-windowed", &clc_fullscreen, COMMANDLINE_INTSET, 0 }, + { "-fullscreen", &clc_fullscreen, COMMANDLINE_INTSET, 1 }, + { "-displayfps", &clc_displayfps, COMMANDLINE_INTSET, 1 }, + { "", NULL, COMMANDLINE_EOL } +}; +const TCommandLineCustom CustomConf[] = { + { "zoom", &clc_zoom, COMMANDLINE_INT, 1, 6 }, + { "bpp", &clc_bpp, COMMANDLINE_INT, 16, 32 }, + { "fullscreen", &clc_fullscreen, COMMANDLINE_BOOL }, + { "displayfps", &clc_displayfps, COMMANDLINE_BOOL }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "Zoom: %s", UIItems_PlatformC }, + { 0, 2, "Depth: %dbpp", UIItems_PlatformC }, + /*{ 0, 3, "Fullscreen: %s", UIItems_PlatformC },*/ + { 0, 4, "Display FPS: %s", UIItems_PlatformC }, + { 0, 9, "Define Keyboard...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + int zoomchanged = 0; + if (reason == UIMENU_OK) { + reason = UIMENU_RIGHT; + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: // Zoom + clc_zoom--; + if (clc_zoom < 1) clc_zoom = 6; + zoomchanged = 1; + break; + case 2: // Bits-Per-Pixel + if (clc_bpp == 32) + clc_bpp = 16; + else + clc_bpp = 32; + zoomchanged = 1; + break; + case 3: // Fullscreen + clc_fullscreen = !clc_fullscreen; + zoomchanged = 1; + break; + case 4: // Display FPS + clc_displayfps = !clc_displayfps; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: // Zoom + clc_zoom++; + if (clc_zoom > 6) clc_zoom = 1; + zoomchanged = 1; + break; + case 2: // Bits-Per-Pixel + if (clc_bpp == 16) + clc_bpp = 32; + else + clc_bpp = 16; + zoomchanged = 1; + break; + case 3: // Fullscreen + clc_fullscreen = !clc_fullscreen; + zoomchanged = 1; + break; + case 4: // Display FPS + clc_displayfps = !clc_displayfps; + break; + break; + case 9: // Define Keyboard... + KeyboardEnterMenu(); + break; + } + } + UIMenu_ChangeItem(UIItems_Platform, 1, "Zoom: %s", clc_zoom_txt[clc_zoom]); + UIMenu_ChangeItem(UIItems_Platform, 2, "Depth: %dbpp", clc_bpp); + UIMenu_ChangeItem(UIItems_Platform, 3, "Fullscreen: %s", clc_fullscreen ? "Yes" : "No"); + UIMenu_ChangeItem(UIItems_Platform, 4, "Display FPS: %s", clc_displayfps ? "Yes" : "No"); + if (zoomchanged) { + SDL_UnlockSurface(screen); + setup_screen(); + SDL_LockSurface(screen); + return 0; + } + return 1; +} + +// Setup screen +void setup_screen() +{ + TPokeMini_VideoSpec *videospec; + int depth, PMOffX, PMOffY, UIOffX, UIOffY; + + // Calculate size based of zoom + if (clc_zoom == 1) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video1x1; + PMWidth = 192; PMHeight = 128; PMOffX = 48; PMOffY = 32; UIOffX = 0; UIOffY = 0; + UIMenu_SetDisplay(192, 128, PokeMini_BGR16, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalBGR16, (uint32_t *)PokeMini_BG2_PalBGR32); + } else if (clc_zoom == 2) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video2x2; + PMWidth = 208; PMHeight = 144; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(192, 128, PokeMini_BGR16, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalBGR16, (uint32_t *)PokeMini_BG2_PalBGR32); + } else if (clc_zoom == 3) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video3x3; + PMWidth = 304; PMHeight = 208; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(288, 192, PokeMini_BGR16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + } else if (clc_zoom == 4) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video4x4; + PMWidth = 400; PMHeight = 272; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(384, 256, PokeMini_BGR16, (uint8_t *)PokeMini_BG4, (uint16_t *)PokeMini_BG4_PalBGR16, (uint32_t *)PokeMini_BG4_PalBGR32); + } else if (clc_zoom == 5) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video5x5; + PMWidth = 496; PMHeight = 336; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(480, 320, PokeMini_BGR16, (uint8_t *)PokeMini_BG5, (uint16_t *)PokeMini_BG5_PalBGR16, (uint32_t *)PokeMini_BG5_PalBGR32); + } else { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video6x6; + PMWidth = 592; PMHeight = 400; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(576, 384, PokeMini_BGR16, (uint8_t *)PokeMini_BG6, (uint16_t *)PokeMini_BG6_PalBGR16, (uint32_t *)PokeMini_BG6_PalBGR32); + } + + // Set video spec and check if is supported + depth = PokeMini_SetVideo(videospec, clc_bpp, CommandLine.lcdfilter, CommandLine.lcdmode); + if (!depth) { + fprintf(stderr, "Couldn't set video spec from %i bpp\n", clc_bpp); + exit(1); + } + + // Set video mode + screen = SDL_SetVideoMode(PMWidth, PMHeight, depth, SDL_HWSURFACE | SDL_DOUBLEBUF | (clc_fullscreen ? SDL_FULLSCREEN : 0)); + if (screen == NULL) { + fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError()); + exit(1); + } + + // Calculate pitch and offset + if (depth == 32) { + PixPitch = screen->pitch / 4; + PMOff = (PMOffY * screen->pitch) + (PMOffX * 4); + UIOff = (UIOffY * screen->pitch) + (UIOffX * 4); + } else { + PixPitch = screen->pitch / 2; + PMOff = (PMOffY * screen->pitch) + (PMOffX * 2); + UIOff = (UIOffY * screen->pitch) + (UIOffX * 2); + } + clc_bpp = depth; +} + +// Capture screen +void capture_screen() +{ + FILE *capf; + int y, capnum; + unsigned long Video[96*64]; + PokeMini_VideoPreview_32((uint32_t *)Video, 96, PokeMini_LCDMode); + capf = OpenUnique_ExportBMP(&capnum, 96, 64); + if (!capf) { + fprintf(stderr, "Error while saving capture\n"); + return; + } + for (y=0; y<64; y++) { + WriteArray_ExportBMP(capf, (uint32_t *)&Video[(63-y) * 96], 96); + } + printf("Capture saved at 'snap_%03d.bmp'\n", capnum); + Close_ExportBMP(capf); +} + +// Handle keyboard and quit events +void handleevents(SDL_Event *event) +{ + switch (event->type) { + case SDL_KEYDOWN: + if (event->key.keysym.sym == SDLK_F9) { // Capture screen + capture_screen(); + } else if (event->key.keysym.sym == SDLK_F4) { // Emulator Exit + if (event->key.keysym.mod & KMOD_ALT) { + emurunning = 0; + } + } else if (event->key.keysym.sym == SDLK_F10) { // Fullscreen/Window + clc_fullscreen = !clc_fullscreen; + setup_screen(); + UIItems_PlatformC(0, UIMENU_LOAD); + } else if (event->key.keysym.sym == SDLK_F11) { // Disable speed throttling + emulimiter = !emulimiter; + } else if (event->key.keysym.sym == SDLK_TAB) { // Temp disable speed throttling + emulimiter = 0; + } else { + KeyboardPressEvent(event->key.keysym.sym); + } + break; + case SDL_KEYUP: + if (event->key.keysym.sym == SDLK_TAB) { // Speed threhold + emulimiter = 1; + } else { + KeyboardReleaseEvent(event->key.keysym.sym); + } + break; + case SDL_QUIT: + emurunning = 0; + break; + }; +} + +// Used to fill the sound buffer +void emulatorsound(void *unused, Uint8 *stream, int len) +{ + MinxAudio_GetSamplesU8(stream, len); + if (clc_dump_sound[0]) WriteU8A_ExportWAV(sdump, stream, len>>1); +} + +// Enable / Disable sound +void enablesound(int sound) +{ + MinxAudio_ChangeEngine(sound); + if (AudioEnabled) SDL_PauseAudio(!sound); +} + +// Menu loop +void menuloop() +{ + SDL_Event event; + + // Update window's title and stop sound + SDL_WM_SetCaption(AppName, "PMEWindow"); + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + enablesound(0); + + // Update EEPROM + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Slowdown to approx. 60fps + SDL_Delay(1); + + // Process UI + UIMenu_Process(); + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + if (PokeMini_VideoDepth == 32) + UIMenu_Display_32((uint32_t *)((uint8_t *)screen->pixels + UIOff), PixPitch); + else + UIMenu_Display_16((uint16_t *)((uint8_t *)screen->pixels + UIOff), PixPitch); + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + } + + // Apply configs + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else + { + if (CommandLine.sound == MINX_AUDIO_GENERATED) + enablesound(MINX_AUDIO_GENERATED); + else + enablesound(0); + } + SDL_EnableKeyRepeat(0, 0); +} + +// Main function +int main(int argc, char **argv) +{ + SDL_Event event; + char title[256]; + char fpstxt[16]; + + // Process arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs(argv[0], NULL); + CommandLineInit(); + CommandLineConfFile("/tmp0/1/pokemini.cfg", "/tmp0/1/pokemini_sdl.cfg", CustomConf); + if (!CommandLineArgs(argc, argv, CustomArgs)) { + PrintHelpUsage(stdout); + printf(" -dumpsound sound.wav Dump sound into a WAV file\n"); + printf(" -windowed Display in window (default)\n"); + printf(" -fullscreen Display in fullscreen\n"); + printf(" -displayfps Display FPS counter on screen\n"); + printf(" -zoom n Zoom display: 1 to 6 (def 4)\n"); + printf(" -bpp n Bits-Per-Pixel: 16 or 32 (def 16)\n"); + return 1; + } + + // Initialize SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) { + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); + return 1; + } + atexit(SDL_Quit); // Clean up on exit + + // Initialize the display + setup_screen(); + + // Initialize the sound + SDL_AudioSpec audfmt; + SDL_AudioSpec obtained; + audfmt.freq = 44100; + audfmt.format = AUDIO_U8; + audfmt.channels = 1; + audfmt.samples = SOUNDBUFFER; + audfmt.callback = emulatorsound; + audfmt.userdata = NULL; + + // Open the audio device + // Second setting can't be NULL on KolibriOS or else it wont play sound + if (SDL_OpenAudio(&audfmt, &obtained) < 0) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + fprintf(stderr, "Audio will be disabled\n"); + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Set the window manager title bar + SDL_WM_SetCaption(AppName, "PMEWindow"); + SDL_EnableKeyRepeat(0, 0); + + // Open WAV capture if was requested + if (clc_dump_sound[0]) { + sdump = Open_ExportWAV(clc_dump_sound, EXPORTWAV_44KHZ | EXPORTWAV_MONO | EXPORTWAV_16BITS); + if (!sdump) { + fprintf(stderr, "Error opening sound export file.\n"); + return 1; + } + } + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(0, PMSNDBUFFER)) { + fprintf(stderr, "Error while initializing emulator\n"); + return 1; + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Running emulator...\n"); + UIMenu_Init(); + KeyboardRemap(&KeybMapSDL); + + if (CommandLine.sound == MINX_AUDIO_GENERATED) + enablesound(MINX_AUDIO_GENERATED); + else + enablesound(0); + + // Emulator's loop + unsigned long time, NewTickFPS = 0, NewTickSync = 0; + int fps = 72, fpscnt = 0; + while (emurunning) { + // Emulate and syncronize + time = SDL_GetTicks(); + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + if (emulimiter) while (MinxAudio_SyncWithAudio()) SDL_Delay(1); + } else { + PokeMini_EmulateFrame(); + if (emulimiter) { + do { + SDL_Delay(1); // This lower CPU usage + time = SDL_GetTicks(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + } + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + if (PokeMini_Rumbling) { + PokeMini_VideoBlit((void *)((uint8_t *)screen->pixels + PMOff + PokeMini_GenRumbleOffset(screen->pitch)), PixPitch); + } else { + PokeMini_VideoBlit((void *)((uint8_t *)screen->pixels + PMOff), PixPitch); + } + LCDDirty = 0; + + // Display FPS counter + if (clc_displayfps) { + if (PokeMini_VideoDepth == 32) + UIDraw_String_32((uint32_t *)screen->pixels, PixPitch, 4, 4, 10, fpstxt, UI_Font1_Pal32); + else + UIDraw_String_16((uint16_t *)screen->pixels, PixPitch, 4, 4, 10, fpstxt, UI_Font1_Pal16); + } + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + + // calculate FPS + fpscnt++; + if (time >= NewTickFPS) { + fps = fpscnt; + sprintf(title, "%s - %d%%", AppName, fps * 100 / 72); + sprintf(fpstxt, "%i FPS", fps); + SDL_WM_SetCaption(title, "PMEWindow"); + NewTickFPS = time + 1000; + fpscnt = 0; + } + } + + // Disable sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Close WAV capture if there's one + if (clc_dump_sound[0]) Close_ExportWAV(sdump); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + return 0; +} diff --git a/programs/emulator/pokemini/doc/LICENSE b/programs/emulator/pokemini/doc/LICENSE new file mode 100644 index 0000000000..37ee3e5d13 --- /dev/null +++ b/programs/emulator/pokemini/doc/LICENSE @@ -0,0 +1,15 @@ +PokeMini - Pokémon-Mini Emulator +Copyright (C) 2014 JustBurn + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/programs/emulator/pokemini/doc/Readme.txt b/programs/emulator/pokemini/doc/Readme.txt new file mode 100644 index 0000000000..5a6f732f12 --- /dev/null +++ b/programs/emulator/pokemini/doc/Readme.txt @@ -0,0 +1,19 @@ +======================== +PokeMini 0.60 for KolibriOS +======================== +Port for KolibriOS by gameblabla + +PokeMini is a PokĂ©mon mini emulator by JustBurn. +It has been ported to the PCs, Sega Dreamcast, PSP, NDS +with unofficial ports for the GCW0, TI Nspire and now the KolibriOS. + +This requires at least a Pentium Pro to even work. +Why ? Because the toolchain was compiled for Pentium Pro+ support only... (SERGE!) + +Sound is supported too, your soundcard needs to support Mono 44050hz 8bits. +I think that shouldn't be a problem as even a SB16 supports that... + +To open a ROM, you need to use the "Open with..." thingy. +Choose a PokĂ©mon Mini ROM for that and choose to open it with PokĂ©Mini. + +Enjoy ! diff --git a/programs/emulator/pokemini/doc/original_readme.txt b/programs/emulator/pokemini/doc/original_readme.txt new file mode 100644 index 0000000000..78f092bb04 --- /dev/null +++ b/programs/emulator/pokemini/doc/original_readme.txt @@ -0,0 +1,204 @@ + ___ _ _ + | _ \ | \_/ | + | _/ | _ | + | | | | | | + |_| OKE |_| |_| INI + ------------------- + Version 0.60 + + Homebrew-emulator for Pokémon-Mini! + + Latest version can be found in: + http://pokemini.sourceforge.net/ + + For hardware documentation, visit: + http://wiki.sublab.net/index.php/Pokemon_Mini + +> Keys & Information: + + To include real BIOS, place "bios.min" on the emulator's directory. + When no "bios.min" is present, emulator will use Pokémon-Mini FreeBIOS. + + Pokémon-Mini PC Keys + ---------------------------- + D-PAD Left Arrow Left + D-PAD Right Arrow Right + D-PAD Up Arrow Up + D-PAD Down Arrow Down + Key A Keyboard X + Key B Keyboard Z + Key C Keyboard S or C + Power Button Keyboard E + Shock Detector Keyboard A + ---------------------------- + UI Menu Keyboard Esc + + F9 will capture the screen and save as "snap_(sequence number).bmp" + + F10 can toggle between Fullscreen and Windowed. + + F11 will disable/enable speed throttle + + TAB can be hold to temporary disable speed throttle + +> Supported multicarts: + + Type 0 - Disabled (Commercial, Prototype) + Read only + + Type 1 - Normal 512KB Flash (AM29LV040B) + Read, Erase, Write, Banking and Manufacturer ID + + Type 2 - Lupin's 512KB Flash (AM29LV040B) + Read, Erase, Write, Banking and Manufacturer ID + +> Command-Line: + + Usage: + PokeMini [Options] rom.min + + Options: + -freebios Force FreeBIOS + -bios otherbios.min Load BIOS + -noeeprom Discard EEPROM data + -eeprom pokemini.eep Load/Save EEPROM file + -eepromshare Share EEPROM to all ROMs (default) + -noeepromshare Each ROM will use individual EEPROM + -nostate Discard State data (default) + -state pokemini.sta Load/Save state file + -nortc No RTC + -statertc RTC time difference in savestates + -hostrtc RTC match the Host clock (def) + -nosound Disable sound + -sound Same as -soundpiezo (def) + -sounddirect Use timer 3 directly for sound (default) + -soundemulate Use sound circuit emulation + -sounddirectpwm Same as direct, can play PWM samples + -nopiezo Disable piezo speaker filter + -piezo Enable piezo speaker filter (def) + -scanline 50% Scanline LCD filter + -dotmatrix LCD dot-matrix filter (def) + -nofilter No LCD filter + -2shades LCD Mode: No mixing + -3shades LCD Mode: Grey emulation + -analog LCD Mode: Pretend real LCD (default) + -fullbattery Emulate with a full battery (default) + -lowbattery Emulate with a weak battery + -palette n Select palette for colors (0 to 15) + -rumblelvl 3 Rumble level (0 to 3) + -nojoystick Disable joystick (def) + -joystick Enable joystick + -joyid 0 Set joystick ID + -custom1light 0xFFFFFF Palette Custom 1 Light + -custom1dark 0x000000 Palette Custom 1 Dark + -custom2light 0xFFFFFF Palette Custom 2 Light + -custom2dark 0x000000 Palette Custom 2 Dark + -synccycles 8 Number of cycles per hardware sync. + -multicart 0 Multicart type (0 to 2) + -lcdcontrast 64 LCD contrast boost in percent + -lcdbright 0 LCD brightness offset in percent + + Only on SDL platform: + -dumpsound sound.wav Dump sound into a WAV file + -windowed Display in window (default) + -fullscreen Display in fullscreen + -zoom n Zoom display: 1 to 4 (def 4) + -bpp n Bits-Per-Pixel: 16 or 32 (def 16) + + Only on Debugger platform: + -autorun 0 Autorun, 0=Off, 1=Full, 2=Dbg+Snd, 3=Dbg + -windowed Display in window (default) + -fullscreen Display in fullscreen + -zoom n Zoom display: 1 to 4 (def 4) + -bpp n Bits-Per-Pixel: 16 or 32 (def 16) + + +> System requirements: + + No sound: + Pentium III 733 Mhz or better recommended. + + With sound: + Pentium IV 1.7 Ghz or better recommended. + + Note: Performance tests were based on 0.4.0 version + +> History: + + -: 0.60 Changes :- + Changed version format to only 2 fields to avoid confusion + Fixed RTC month being reported wrong from host + Adjusted graphics, now it display darker shades to match more closely the real system + Added 2 new options: LCD contrast and LCD bright + Changed the way analog LCD mode works, now it's less blurry and can do up to 5 shades without artifacts + SDL port has been upgraded to SDL 2, this brings Haptic support and other improvements + New Keyboard/Joystick option to allow checking inputs + Applying joystick settings now can (re)enable the device + Share EEPROM is now disabled by default + Emulator can be compiled for 64-bit CPU without issues now + Limited sync-cycles to 64 on 'accurancy' platforms + Win32 Only: + Corrected Direct3D issue in some GPUs + Sound write position is now handled correctly + NDS Only: Added 3-in-1 rumble support + PSP Only: + Analog stick now works + Added FPS display under Platform... (default is off) + Reached 100% emulation by skipping 1 frame, aparently hardware is limited to 60fps max + Dreamcast Only: + Improved sound latency (thanks BlueCrab). + Added FPS display under Platform... (default is off) + Debugger Only: + Minor fixes + Trace history is now 10000 instructions instead of 256 + Added copy & paste buttons to timing counters + + Older History can be found at: + http://sourceforge.net/p/pokemini/wiki/History/ + +> License GPLv3 (emulator and tools): + +PokeMini - Pokémon-Mini Emulator +Copyright (C) 2015 JustBurn + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +> Greetings & Links: + + Thank's to p0p, Dave|X, Onori + goldmomo, asterick, DarkFader, Agilo + MrBlinky, Wa, Lupin and everyone at + #pmdev on IRC EFNET! + Questions and Bugs reports are welcome! + + PokeMini webpage: + https://sourceforge.net/projects/pokemini/ + + Pokemon-Mini Hardware: + http://wiki.sublab.net/index.php/Pokemon_Mini + + Pokémon-mini.net: + http://www.pokemon-mini.net/ + + MEGA - Museum of Electronic Games & Art: + http://m-e-g-a.org/ + + Minimon (other Pokemon-Mini emulator): + http://www.sublab.net/projects/minimon/ + + DarkFader Pokemon-Mini webpage: + http://darkfader.net/pm/ + + Agilo's Weblog: + http://www.agilo.nl/ diff --git a/programs/emulator/pokemini/freebios/Makefile b/programs/emulator/pokemini/freebios/Makefile new file mode 100644 index 0000000000..64ec1bacd4 --- /dev/null +++ b/programs/emulator/pokemini/freebios/Makefile @@ -0,0 +1,5 @@ +OUTFILE = noout +OBJS = freebios.o +CFLAGS = -Os -DNOTPSP -DFRAMELIMIT -DNODEBUG -DNO_SNPRINTF -DKOLIBRI -I/home/hatsune/menuetos/include/SDL +LIBS = -lm +include $(MENUETDEV)/makefiles/Makefile_for_program diff --git a/programs/emulator/pokemini/freebios/freebios.c b/programs/emulator/pokemini/freebios/freebios.c new file mode 100644 index 0000000000..58f06edda0 --- /dev/null +++ b/programs/emulator/pokemini/freebios/freebios.c @@ -0,0 +1,259 @@ +const unsigned char FreeBIOS[] = +{ + 0x9A,0x00,0xAB,0x00,0xAB,0x00,0x2F,0x02,0x41,0x02,0x53,0x02,0x65,0x02,0x77,0x02, + 0x89,0x02,0x9B,0x02,0xAD,0x02,0xBF,0x02,0xD1,0x02,0xE3,0x02,0xF5,0x02,0x07,0x03, + 0x19,0x03,0xAB,0x00,0xAB,0x00,0x60,0x04,0x2B,0x03,0xF1,0x03,0x3D,0x03,0x4F,0x03, + 0x61,0x03,0x73,0x03,0x85,0x03,0x97,0x03,0xA9,0x03,0xBB,0x03,0xCD,0x03,0xDF,0x03, + 0xF1,0xFF,0x9E,0x04,0x60,0x04,0x60,0x04,0xE4,0x04,0x60,0x04,0x0D,0x05,0x24,0x05, + 0x45,0x05,0x4C,0x05,0x5D,0x05,0x7C,0x05,0x92,0x05,0x9F,0x05,0xBB,0x05,0x60,0x04, + 0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04, + 0x60,0x04,0xD6,0x05,0xE3,0x05,0x60,0x04,0x60,0x04,0xF0,0x05,0x00,0x06,0x66,0x06, + 0x7A,0x06,0x8A,0x06,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04, + 0x60,0x04,0x60,0x04,0x60,0x04,0x00,0x00,0x98,0x06,0xB4,0x20,0x38,0xCE,0xCD,0xDD, + 0x08,0x02,0xD9,0x08,0x01,0xDD,0x00,0x7C,0xDD,0x02,0x00,0x9F,0xC0,0xB4,0x20,0x38, + 0xCE,0xCD,0xCE,0xCE,0xCE,0xCF,0xCF,0x6E,0x00,0x20,0xDD,0x80,0x00,0xCE,0xC4,0x01, + 0xF3,0x01,0x00,0xD9,0x00,0x03,0xD9,0x01,0x30,0xD9,0x02,0xC0,0xF2,0xE1,0x00,0xC6, + 0xA0,0x06,0xBE,0x82,0x20,0x79,0x84,0x79,0x85,0x79,0x86,0x79,0x87,0x79,0x88,0x79, + 0x89,0x38,0xC6,0x00,0x10,0x60,0x92,0xD6,0x00,0x20,0xEF,0xF9,0xFF,0xF2,0x05,0x01, + 0xDD,0xFE,0xAF,0xF2,0x1D,0x01,0xD9,0x80,0x0A,0xD9,0x81,0x01,0xDC,0x10,0x20,0xEF, + 0x40,0x00,0xF2,0x2F,0x00,0xEF,0x3A,0x00,0x38,0xDD,0x80,0x00,0xDD,0x81,0x07,0x78, + 0x82,0x78,0x83,0xD8,0x01,0xEF,0xC6,0x00,0x10,0x60,0x92,0xD6,0x00,0x20,0xEF,0xF9, + 0xFF,0xC4,0x00,0x00,0xCF,0xE4,0xCF,0xE8,0xCF,0xEC,0x4C,0x52,0xB0,0xFF,0x9C,0xC0, + 0xF3,0xD0,0x1F,0xCE,0xD0,0x00,0x21,0x32,0x4D,0xF8,0xCE,0xD0,0x01,0x21,0x32,0x4E, + 0xF8,0xB1,0x03,0xA0,0xB0,0x01,0xC6,0x7D,0x13,0xB1,0x03,0xF2,0x51,0x00,0xC6,0x88, + 0x13,0xB1,0x04,0xF2,0x49,0x00,0xDC,0x10,0x20,0xEE,0x0B,0x00,0xC6,0x94,0x13,0xB0, + 0x08,0xB1,0x04,0xF2,0x39,0x00,0xF2,0xCB,0xFF,0xEE,0x0B,0x00,0xC6,0xA0,0x13,0xB0, + 0x0C,0xB1,0x04,0xF2,0x29,0x00,0xF2,0x2C,0x00,0xC6,0x94,0x13,0xB0,0x00,0xB1,0x04, + 0xF2,0x17,0x00,0xF2,0x1F,0x00,0xA8,0xF5,0xBB,0xC6,0xA0,0x13,0xB0,0x00,0xB1,0x04, + 0xF2,0x07,0x00,0xF2,0x0F,0x00,0xF3,0x6A,0xFF,0x60,0x92,0xF5,0xFD,0xF8,0x60,0x92, + 0x80,0xF5,0xFC,0xF8,0xB0,0xFF,0xB1,0xFF,0xF5,0xFF,0x88,0xEF,0xF9,0xFF,0xF8,0xB1, + 0x00,0xDD,0x10,0x08,0xD8,0x19,0xCF,0x79,0x20,0xDD,0x21,0x30,0xDD,0x22,0x02,0x79, + 0x23,0xDD,0x24,0x02,0x79,0x25,0x79,0x26,0x79,0x40,0x79,0x44,0xDD,0x50,0xFF,0x79, + 0x51,0x79,0x54,0x79,0x55,0xD9,0x60,0x0C,0xD8,0x61,0xFB,0xD9,0x61,0x08,0xD9,0x61, + 0x04,0xDD,0x61,0x20,0xDD,0x60,0x32,0x79,0x62,0x79,0x70,0x79,0x71,0xDD,0xFE,0x81, + 0xDD,0xFE,0x1F,0xF8,0xA1,0xC5,0xFE,0x20,0xB5,0xE3,0xB5,0xA4,0xB5,0xAD,0xB5,0x00, + 0xB5,0x10,0xB5,0xEE,0xB5,0x40,0xB5,0xA2,0xB5,0xA0,0xB5,0xC0,0xB5,0xA6,0xB5,0x2F, + 0xA9,0xF8,0xC5,0xFE,0x20,0xB5,0xE3,0xB3,0xB0,0x6B,0xB5,0x00,0xB5,0x10,0xB1,0x60, + 0x91,0xDD,0xFF,0x00,0xF5,0xFC,0x99,0x83,0xCE,0xBE,0xB8,0xEF,0xEC,0xFF,0xF8,0xA5, + 0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x00,0x02,0xAC,0xAD,0xF3,0xC8, + 0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xEE,0x01,0xAC,0xAD, + 0xF3,0xBC,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xDC,0x01, + 0xAC,0xAD,0xF3,0xB0,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA, + 0xCA,0x01,0xAC,0xAD,0xF3,0xA4,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01, + 0x20,0xEA,0xB8,0x01,0xAC,0xAD,0xF3,0x98,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20, + 0xDC,0x01,0x20,0xEA,0xA6,0x01,0xAC,0xAD,0xF3,0x8C,0x1E,0xA5,0xA4,0xCE,0xC5,0x00, + 0xB4,0x20,0xDC,0x01,0x20,0xEA,0x94,0x01,0xAC,0xAD,0xF3,0x80,0x1E,0xA5,0xA4,0xCE, + 0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x82,0x01,0xAC,0xAD,0xF3,0x74,0x1E,0xA5, + 0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x70,0x01,0xAC,0xAD,0xF3,0x68, + 0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x5E,0x01,0xAC,0xAD, + 0xF3,0x5C,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x4C,0x01, + 0xAC,0xAD,0xF3,0x50,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA, + 0x3A,0x01,0xAC,0xAD,0xF3,0x44,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01, + 0x20,0xEA,0x28,0x01,0xAC,0xAD,0xF3,0x38,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20, + 0xDC,0x01,0x20,0xEA,0x16,0x01,0xAC,0xAD,0xF3,0x2C,0x1E,0xA5,0xA4,0xCE,0xC5,0x00, + 0xB4,0x20,0xDC,0x01,0x20,0xEA,0x04,0x01,0xAC,0xAD,0xF3,0x62,0x1E,0xA5,0xA4,0xCE, + 0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xF2,0x00,0xAC,0xAD,0xF3,0x14,0x1E,0xA5, + 0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xE0,0x00,0xAC,0xAD,0xF3,0x08, + 0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xCE,0x00,0xAC,0xAD, + 0xF3,0xFC,0x1D,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xBC,0x00, + 0xAC,0xAD,0xF3,0xF0,0x1D,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA, + 0xAA,0x00,0xAC,0xAD,0xF3,0xE4,0x1D,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01, + 0x20,0xEA,0x98,0x00,0xAC,0xAD,0xF3,0xD8,0x1D,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20, + 0xDC,0x01,0x20,0xEA,0x86,0x00,0xAC,0xAD,0xF3,0xCC,0x1D,0xA5,0xA4,0xCE,0xC5,0x00, + 0xB4,0x20,0xDC,0x01,0x20,0xEA,0x74,0x00,0xAC,0xAD,0xF3,0xC0,0x1D,0xA5,0xA4,0xCE, + 0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x62,0x00,0xAC,0xAD,0xF3,0xB4,0x1D,0xA5, + 0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x50,0x00,0xAC,0xAD,0xF3,0xA8, + 0x1D,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEF,0x2A,0x00,0xDC,0x01, + 0x10,0xEF,0xA8,0xFC,0xDC,0x71,0x04,0xEE,0x0D,0x00,0xDC,0x02,0x40,0xEE,0x07,0x00, + 0xD8,0x71,0xFB,0xD9,0x02,0x80,0xDC,0x01,0x80,0xEE,0x11,0x00,0xDC,0x02,0x20,0xEF, + 0x14,0x00,0xAC,0xAD,0xF3,0xD7,0x1B,0xAC,0xAD,0xF3,0x31,0x1D,0xD9,0x01,0x20,0xDC, + 0x02,0x20,0xEF,0xF3,0xFF,0xDD,0x29,0x80,0xAC,0xAD,0xF9,0xDC,0x71,0x04,0xEE,0x0D, + 0x00,0xDC,0x02,0x40,0xEE,0x07,0x00,0xD8,0x71,0xFB,0xD9,0x02,0x80,0xDC,0x01,0x80, + 0xEE,0x0A,0x00,0xCF,0x68,0x03,0x00,0xAC,0xAD,0xF3,0xA2,0x1B,0xD9,0x01,0x20,0xF8, + 0xF9,0xD8,0x80,0xF7,0xDD,0xFE,0xAE,0xDD,0xFE,0xAC,0xDD,0xFE,0x28,0xDD,0xFE,0xA5, + 0xD8,0x02,0xE3,0xD8,0x81,0xFE,0xD9,0x02,0x01,0xD9,0x24,0x02,0xD9,0x21,0x30,0xD8, + 0x01,0xDF,0xD8,0x02,0xE3,0xA7,0x9F,0x80,0xCE,0xAE,0xAF,0xD9,0x02,0x10,0xD9,0x81, + 0x01,0xF2,0x61,0xFD,0xDD,0xFE,0xAF,0xD8,0x02,0xDF,0xD9,0x00,0x03,0xF8,0xA5,0xA4, + 0x9F,0xC0,0xCE,0xC5,0x00,0xB4,0x20,0x4C,0x80,0x44,0x21,0x22,0x0C,0xA0,0x4C,0x23, + 0x44,0x24,0xA0,0x4C,0x25,0x44,0x26,0xA0,0xDD,0x23,0x00,0xDD,0x24,0x00,0xDD,0x25, + 0x80,0xDD,0x26,0x00,0xD9,0x21,0x0C,0xDD,0x29,0x80,0xDD,0x80,0x00,0xF2,0x92,0xFF, + 0xA8,0x79,0x25,0x78,0x26,0xA8,0x79,0x23,0x78,0x24,0xA8,0x79,0x80,0x22,0xF3,0x78, + 0x21,0xAC,0xAD,0xF9,0x9F,0xC0,0xCF,0x6E,0x00,0x20,0xCE,0xC5,0x00,0xB4,0x20,0xF2, + 0xBE,0xFC,0xDD,0x23,0x00,0xDD,0x24,0x00,0xDD,0x25,0x80,0xDD,0x26,0x00,0xDD,0x29, + 0x80,0xDD,0x80,0x00,0xDD,0x21,0x0C,0xF2,0x58,0xFF,0xF3,0x9F,0xFB,0xAF,0xA5,0xA1, + 0xCE,0xC5,0x00,0xC5,0x00,0x20,0xCE,0x84,0xCE,0x84,0xCE,0x25,0x03,0xCE,0x2C,0xA9, + 0xAD,0xF3,0x23,0x00,0xF2,0x27,0x00,0xAF,0xA7,0xEE,0x0A,0x00,0x32,0x3F,0xEE,0x0D, + 0x00,0x80,0xF3,0x0C,0x00,0x28,0xEE,0x05,0x00,0x88,0xF3,0x04,0x00,0xB0,0xFF,0xF9, + 0xF2,0xCC,0xFF,0x38,0xF9,0xAF,0xF2,0x05,0x00,0xF3,0x13,0x00,0xAF,0xA5,0xA4,0xCE, + 0xC5,0x00,0xB4,0x20,0x44,0x00,0xCE,0x8C,0xCE,0x8C,0xAC,0xAD,0xF8,0xAF,0xA5,0xA4, + 0xCE,0xC5,0x00,0xB4,0x20,0x48,0xDC,0x80,0x08,0xA7,0xD8,0x80,0xF7,0xDD,0xFE,0x81, + 0x79,0xFE,0xAF,0xEE,0x04,0x00,0xD9,0x80,0x08,0xAC,0xAD,0xF8,0xA5,0xA4,0xCE,0xC5, + 0x00,0xB4,0x20,0xF2,0x6F,0xFC,0xDD,0xFE,0xAF,0xD9,0x80,0x04,0xD9,0x81,0x01,0xAC, + 0xAD,0xF9,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xF2,0x59,0xFC,0xAC,0xAD,0xF9,0xA5, + 0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xD8,0x80,0xF7,0xDD,0xFE,0xAE,0xDD,0xFE,0xAC,0xDD, + 0xFE,0x28,0xDD,0xFE,0xA5,0xD8,0x81,0xFE,0xAC,0xAD,0xF9,0xA5,0xA4,0xCE,0xC5,0x00, + 0xB4,0x20,0x9F,0xC0,0xDC,0x01,0x80,0xEF,0x0A,0x00,0xD9,0x01,0x80,0xD9,0x01,0x40, + 0xD8,0x01,0xDF,0xAC,0xAD,0xF9,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xD8,0x00,0xFC, + 0xAC,0xAD,0xF9,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xD9,0x00,0x03,0xAC,0xAD,0xF9, + 0xAF,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x53,0x02,0x9E,0x01,0xAC,0xAD,0xF8, + 0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xA6,0xA2,0xA3,0xA1,0xCF,0xB1,0x9F,0xC0,0x46, + 0x96,0x01,0xCE,0xC1,0xEE,0x0E,0x00,0xC2,0x0A,0x00,0x5E,0x9A,0x56,0x9A,0xA1,0x4E, + 0x9A,0xF3,0x04,0x00,0xC2,0x07,0x00,0xA0,0x4E,0x9A,0x46,0x9A,0x5E,0x9A,0x56,0x9A, + 0xCE,0xCF,0xCF,0xED,0x46,0x9A,0x5E,0x9A,0x56,0xCE,0xCE,0xCF,0xE9,0xD9,0x02,0x80, + 0xB6,0xFF,0xD9,0x02,0x80,0x47,0xD9,0x02,0x80,0x31,0xA8,0xCE,0xC3,0xEE,0x0A,0x00, + 0xAF,0x51,0xA8,0x58,0x41,0xA7,0xF2,0x0B,0x00,0xA8,0x22,0x01,0xA9,0xAB,0xAA,0xAE, + 0xAC,0xAD,0xF9,0xCE,0xCC,0xF4,0xA5,0xA1,0xCE,0xC5,0x00,0xC5,0x81,0x20,0xCE,0x25, + 0xF1,0x22,0x07,0xCE,0x84,0xCE,0x2C,0xA9,0xAD,0xF9,0xA5,0xA4,0xCE,0xC5,0x00,0xB4, + 0x20,0x44,0x81,0xCE,0x8C,0x22,0x07,0xAC,0xAD,0xF9,0xAF,0xA5,0xA4,0xCE,0xC5,0x00, + 0xB4,0x20,0xDC,0x01,0x08,0xAC,0xAD,0xF8,0xB7,0x02,0xF5,0xFF,0xB7,0x00,0xF9,0xFF, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x04,0x82,0xE1,0xE1,0x31,0x31, + 0x39,0x39,0x39,0x39,0x39,0x39,0x31,0x31,0xE1,0xE1,0x82,0x06,0xFA,0x04,0xF8,0x00, + 0xFE,0x82,0xEA,0x3A,0xFE,0x82,0xEA,0x96,0xFC,0xC7,0xAA,0xBB,0xFF,0xC7,0xAA,0xBA, + 0xFE,0x82,0xAA,0xD6,0xFE,0x8A,0xFE,0xC6,0xBB,0xC7,0xFD,0xB6,0xAB,0xAB,0xDA,0x7E, + 0x7C,0x7C,0x40,0x40,0x00,0x38,0x7C,0x44,0x7C,0x38,0x00,0x3C,0x7C,0x20,0x7C,0x3C, + 0x00,0x00,0x7C,0x7C,0x7C,0x74,0x6C,0x54,0x64,0x44,0x44,0x44,0x44,0x6C,0x38,0x00, + 0x7C,0x7C,0x08,0x10,0x7C,0x7C,0x00,0x38,0x7C,0x44,0x7C,0x38,0x00,0x00,0x00,0x38, + 0x44,0x44,0x00,0x78,0x14,0x14,0x78,0x00,0x7C,0x14,0x14,0x68,0x00,0x04,0x7C,0x04, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x20,0x20,0x20,0x20,0x46,0x72,0x65,0x65,0x77,0x61,0x72,0x65,0x20,0x20,0x20,0x20, + 0x50,0x6F,0x6B,0x65,0x6D,0x6F,0x6E,0x4D,0x69,0x6E,0x69,0x20,0x42,0x49,0x4F,0x53, + 0x20,0x20,0x56,0x65,0x72,0x73,0x69,0x6F,0x6E,0x20,0x20,0x31,0x2E,0x33,0x20,0x20, + 0x20,0x62,0x79,0x20,0x54,0x65,0x61,0x6D,0x20,0x50,0x6F,0x6B,0x65,0x6D,0x65,0x20, +}; diff --git a/programs/emulator/pokemini/freebios/freebios.h b/programs/emulator/pokemini/freebios/freebios.h new file mode 100644 index 0000000000..065413910f --- /dev/null +++ b/programs/emulator/pokemini/freebios/freebios.h @@ -0,0 +1,25 @@ +/* + PokeMini - Pokémon-Mini Emulator + Copyright (C) 2009 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef FREEBIOS_H +#define FREEBIOS_H + +// Free BIOS (4KB) +extern const unsigned char FreeBIOS[]; + +#endif diff --git a/programs/emulator/pokemini/freebios/noout.map b/programs/emulator/pokemini/freebios/noout.map new file mode 100644 index 0000000000..622a4b39c2 --- /dev/null +++ b/programs/emulator/pokemini/freebios/noout.map @@ -0,0 +1,235 @@ +Archive member included because of file (symbol) + +/home/hatsune/menuetos/lib/libc.a(param.o) + /home/hatsune/menuetos/stub/crt0.o (__menuet__app_path_area) +/home/hatsune/menuetos/lib/libc.a(crt1.o) + /home/hatsune/menuetos/stub/crt0.o (__crt1_startup) +/home/hatsune/menuetos/lib/libc.a(brk.o) + /home/hatsune/menuetos/lib/libc.a(crt1.o) (init_brk) +/home/hatsune/menuetos/lib/libc.a(crt0.o) + /home/hatsune/menuetos/lib/libc.a(crt1.o) (__crt0_setup_arguments) +/home/hatsune/menuetos/lib/libc.a(emu_init.o) + /home/hatsune/menuetos/lib/libc.a(crt1.o) (dosemu_inithandles) +/home/hatsune/menuetos/lib/libc.a(_main.o) + /home/hatsune/menuetos/lib/libc.a(crt1.o) (__main) +/home/hatsune/menuetos/lib/libc.a(exit.o) + /home/hatsune/menuetos/lib/libc.a(crt1.o) (exit) +/home/hatsune/menuetos/lib/libc.a(errno.o) + /home/hatsune/menuetos/lib/libc.a(brk.o) (errno) +/home/hatsune/menuetos/lib/libc.a(malloc.o) + /home/hatsune/menuetos/lib/libc.a(crt0.o) (malloc) +/home/hatsune/menuetos/lib/libc.a(strlen.o) + /home/hatsune/menuetos/lib/libc.a(crt0.o) (strlen) +/home/hatsune/menuetos/lib/libc.a(strcpy.o) + /home/hatsune/menuetos/lib/libc.a(emu_init.o) (strcpy) +/home/hatsune/menuetos/lib/libc.a(strrchr.o) + /home/hatsune/menuetos/lib/libc.a(emu_init.o) (strrchr) +/home/hatsune/menuetos/lib/libc.a(delay.o) + /home/hatsune/menuetos/lib/libc.a(malloc.o) (__menuet__delay100) +/home/hatsune/menuetos/lib/libc.a(memcpy.o) + /home/hatsune/menuetos/lib/libc.a(malloc.o) (memcpy) + +Memory Configuration + +Name Origin Length Attributes +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + + 0x0000000000400000 __image_base__ = 0x400000 + 0x0000000000000000 __dll__ = 0x0 + 0x0000000000400000 ___ImageBase = 0x400000 + 0x0000000000000010 __section_alignment__ = 0x10 + 0x0000000000000010 __file_alignment__ = 0x10 + 0x0000000000000004 __major_os_version__ = 0x4 + 0x0000000000000000 __minor_os_version__ = 0x0 + 0x0000000000000001 __major_image_version__ = 0x1 + 0x0000000000000000 __minor_image_version__ = 0x0 + 0x0000000000000004 __major_subsystem_version__ = 0x4 + 0x0000000000000000 __minor_subsystem_version__ = 0x0 + 0x0000000000000003 __subsystem__ = 0x3 + 0x0000000000200000 __size_of_stack_reserve__ = 0x200000 + 0x0000000000001000 __size_of_stack_commit__ = 0x1000 + 0x0000000000100000 __size_of_heap_reserve__ = 0x100000 + 0x0000000000001000 __size_of_heap_commit__ = 0x1000 + 0x0000000000000000 __loader_flags__ = 0x0 + 0x0000000000000000 __dll_characteristics__ = 0x0 + +.text 0x0000000000000000 0x810 + 0x0000000000000000 code = . + 0x0000000000000000 _code = . + *(.A) + .A 0x0000000000000000 0x24 /home/hatsune/menuetos/stub/crt0.o + 0x0000000000000000 __menuet__app_header + 0x0000000000000014 __menuet__memsize + *(.text) + .text 0x0000000000000024 0x0 /home/hatsune/menuetos/stub/crt0.o + 0x0000000000000024 start + .text 0x0000000000000024 0x0 freebios.o + .text 0x0000000000000024 0x0 /home/hatsune/menuetos/lib/libc.a(param.o) + .text 0x0000000000000024 0x40 /home/hatsune/menuetos/lib/libc.a(crt1.o) + 0x0000000000000024 __crt1_startup + .text 0x0000000000000064 0x15c /home/hatsune/menuetos/lib/libc.a(brk.o) + 0x0000000000000064 init_brk + 0x00000000000000b8 sbrk + .text 0x00000000000001c0 0x140 /home/hatsune/menuetos/lib/libc.a(crt0.o) + 0x0000000000000243 _exit + 0x000000000000024d __crt0_setup_arguments + .text 0x0000000000000300 0x78 /home/hatsune/menuetos/lib/libc.a(emu_init.o) + 0x0000000000000300 dosemu_inithandles + 0x0000000000000345 init_dir_stack + .text 0x0000000000000378 0x3c /home/hatsune/menuetos/lib/libc.a(_main.o) + 0x0000000000000378 __main + .text 0x00000000000003b4 0x24 /home/hatsune/menuetos/lib/libc.a(exit.o) + 0x00000000000003b4 exit + .text 0x00000000000003d8 0xc /home/hatsune/menuetos/lib/libc.a(errno.o) + 0x00000000000003d8 __isatty + .text 0x00000000000003e4 0x384 /home/hatsune/menuetos/lib/libc.a(malloc.o) + 0x00000000000004b1 malloc + 0x0000000000000667 free + 0x0000000000000705 realloc + .text 0x0000000000000768 0x18 /home/hatsune/menuetos/lib/libc.a(strlen.o) + 0x0000000000000768 strlen + .text 0x0000000000000780 0x1c /home/hatsune/menuetos/lib/libc.a(strcpy.o) + 0x0000000000000780 strcpy + .text 0x000000000000079c 0x24 /home/hatsune/menuetos/lib/libc.a(strrchr.o) + 0x000000000000079c strrchr + .text 0x00000000000007c0 0x24 /home/hatsune/menuetos/lib/libc.a(delay.o) + 0x00000000000007c0 __menuet__delay100 + 0x00000000000007d1 __menuet(int, double, long,...) + .text 0x00000000000007e4 0x2c /home/hatsune/menuetos/lib/libc.a(memcpy.o) + 0x00000000000007e4 memcpy + *(.fixup) + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.const) + *(.ro*) + *(.gnu.linkonce.r*) + 0x0000000000000810 ecode = . + 0x0000000000000810 _ecode = . + +.rdata 0x0000000000000810 0x1130 + .rdata 0x0000000000000810 0x1000 freebios.o + 0x0000000000000810 FreeBIOS + .rdata$zzz 0x0000000000001810 0x14 freebios.o + .rdata$zzz 0x0000000000001824 0x14 /home/hatsune/menuetos/lib/libc.a(param.o) + .rdata$zzz 0x0000000000001838 0x14 /home/hatsune/menuetos/lib/libc.a(crt1.o) + .rdata$zzz 0x000000000000184c 0x14 /home/hatsune/menuetos/lib/libc.a(brk.o) + .rdata$zzz 0x0000000000001860 0x14 /home/hatsune/menuetos/lib/libc.a(crt0.o) + .rdata$zzz 0x0000000000001874 0x14 /home/hatsune/menuetos/lib/libc.a(emu_init.o) + .rdata$zzz 0x0000000000001888 0x14 /home/hatsune/menuetos/lib/libc.a(_main.o) + .rdata$zzz 0x000000000000189c 0x14 /home/hatsune/menuetos/lib/libc.a(exit.o) + .rdata$zzz 0x00000000000018b0 0x14 /home/hatsune/menuetos/lib/libc.a(errno.o) + .rdata$zzz 0x00000000000018c4 0x14 /home/hatsune/menuetos/lib/libc.a(malloc.o) + .rdata$zzz 0x00000000000018d8 0x14 /home/hatsune/menuetos/lib/libc.a(strlen.o) + .rdata$zzz 0x00000000000018ec 0x14 /home/hatsune/menuetos/lib/libc.a(strcpy.o) + .rdata$zzz 0x0000000000001900 0x14 /home/hatsune/menuetos/lib/libc.a(strrchr.o) + .rdata$zzz 0x0000000000001914 0x14 /home/hatsune/menuetos/lib/libc.a(delay.o) + .rdata$zzz 0x0000000000001928 0x14 /home/hatsune/menuetos/lib/libc.a(memcpy.o) + +.data 0x000000000000193c 0x4e0 + 0x000000000000193c djgpp_first_ctor = . + *(.ctor) + *(.ctors) + 0x000000000000193c djgpp_last_ctor = . + 0x000000000000193c djgpp_first_dtor = . + *(.dtor) + *(.dtors) + 0x000000000000193c djgpp_last_dtor = . + *(.gcc_exc*) + 0x000000000000193c __EH_FRAME_BEGIN__ = . + *(.eh_fram*) + .eh_frame 0x000000000000193c 0x34 /home/hatsune/menuetos/lib/libc.a(crt1.o) + .eh_frame 0x0000000000001970 0x68 /home/hatsune/menuetos/lib/libc.a(brk.o) + .eh_frame 0x00000000000019d8 0x9c /home/hatsune/menuetos/lib/libc.a(crt0.o) + .eh_frame 0x0000000000001a74 0x58 /home/hatsune/menuetos/lib/libc.a(emu_init.o) + .eh_frame 0x0000000000001acc 0x40 /home/hatsune/menuetos/lib/libc.a(_main.o) + .eh_frame 0x0000000000001b0c 0x34 /home/hatsune/menuetos/lib/libc.a(exit.o) + .eh_frame 0x0000000000001b40 0x38 /home/hatsune/menuetos/lib/libc.a(errno.o) + .eh_frame 0x0000000000001b78 0x140 /home/hatsune/menuetos/lib/libc.a(malloc.o) + .eh_frame 0x0000000000001cb8 0x3c /home/hatsune/menuetos/lib/libc.a(strlen.o) + .eh_frame 0x0000000000001cf4 0x40 /home/hatsune/menuetos/lib/libc.a(strcpy.o) + .eh_frame 0x0000000000001d34 0x3c /home/hatsune/menuetos/lib/libc.a(strrchr.o) + .eh_frame 0x0000000000001d70 0x60 /home/hatsune/menuetos/lib/libc.a(delay.o) + .eh_frame 0x0000000000001dd0 0x40 /home/hatsune/menuetos/lib/libc.a(memcpy.o) + 0x0000000000001e10 __EH_FRAME_END__ = . + 0x0000000000001e10 0x4 LONG 0x0 + *(.gnu.linkonce.d*) + *(.rodata) + *(.rodata.*) + *(.data) + .data 0x0000000000001e14 0x0 freebios.o + .data 0x0000000000001e14 0x0 /home/hatsune/menuetos/lib/libc.a(param.o) + .data 0x0000000000001e14 0x4 /home/hatsune/menuetos/lib/libc.a(crt1.o) + 0x0000000000001e14 __bss_count + .data 0x0000000000001e18 0x0 /home/hatsune/menuetos/lib/libc.a(brk.o) + .data 0x0000000000001e18 0x0 /home/hatsune/menuetos/lib/libc.a(crt0.o) + .data 0x0000000000001e18 0x0 /home/hatsune/menuetos/lib/libc.a(emu_init.o) + .data 0x0000000000001e18 0x4 /home/hatsune/menuetos/lib/libc.a(_main.o) + .data 0x0000000000001e1c 0x0 /home/hatsune/menuetos/lib/libc.a(exit.o) + .data 0x0000000000001e1c 0x0 /home/hatsune/menuetos/lib/libc.a(errno.o) + .data 0x0000000000001e1c 0x0 /home/hatsune/menuetos/lib/libc.a(malloc.o) + .data 0x0000000000001e1c 0x0 /home/hatsune/menuetos/lib/libc.a(strlen.o) + .data 0x0000000000001e1c 0x0 /home/hatsune/menuetos/lib/libc.a(strcpy.o) + .data 0x0000000000001e1c 0x0 /home/hatsune/menuetos/lib/libc.a(strrchr.o) + .data 0x0000000000001e1c 0x0 /home/hatsune/menuetos/lib/libc.a(delay.o) + .data 0x0000000000001e1c 0x0 /home/hatsune/menuetos/lib/libc.a(memcpy.o) + 0x0000000000001e1c edata = . + 0x0000000000001e1c _edata = . + 0x0000000000001e1c bss = . + +.bss 0x0000000000001e1c 0x190bc + *(.bss) + .bss 0x0000000000001e1c 0x10000 /home/hatsune/menuetos/stub/crt0.o + .bss 0x0000000000011e1c 0x0 freebios.o + .bss 0x0000000000011e1c 0x800 /home/hatsune/menuetos/lib/libc.a(param.o) + 0x0000000000011e1c __menuet__app_path_area + 0x000000000001221c __menuet__app_param_area + .bss 0x000000000001261c 0x14 /home/hatsune/menuetos/lib/libc.a(crt1.o) + 0x000000000001261c __dos_argv0 + 0x0000000000012620 __crt0_argv + 0x0000000000012624 __crt0_argc + 0x0000000000012628 _crt0_startup_flags + 0x000000000001262c environ + .bss 0x0000000000012630 0x18 /home/hatsune/menuetos/lib/libc.a(brk.o) + .bss 0x0000000000012648 0x0 /home/hatsune/menuetos/lib/libc.a(crt0.o) + .bss 0x0000000000012648 0x8800 /home/hatsune/menuetos/lib/libc.a(emu_init.o) + 0x0000000000012648 __curdir_buf + 0x0000000000012a48 _io_handles + .bss 0x000000000001ae48 0x0 /home/hatsune/menuetos/lib/libc.a(_main.o) + .bss 0x000000000001ae48 0x8 /home/hatsune/menuetos/lib/libc.a(exit.o) + 0x000000000001ae48 keypress_at_exit + 0x000000000001ae4c __atexit_ptr + .bss 0x000000000001ae50 0x4 /home/hatsune/menuetos/lib/libc.a(errno.o) + 0x000000000001ae50 errno + .bss 0x000000000001ae54 0x84 /home/hatsune/menuetos/lib/libc.a(malloc.o) + .bss 0x000000000001aed8 0x0 /home/hatsune/menuetos/lib/libc.a(strlen.o) + .bss 0x000000000001aed8 0x0 /home/hatsune/menuetos/lib/libc.a(strcpy.o) + .bss 0x000000000001aed8 0x0 /home/hatsune/menuetos/lib/libc.a(strrchr.o) + .bss 0x000000000001aed8 0x0 /home/hatsune/menuetos/lib/libc.a(delay.o) + .bss 0x000000000001aed8 0x0 /home/hatsune/menuetos/lib/libc.a(memcpy.o) + 0x000000000001aed8 end = . + 0x000000000001aed8 _end = . + 0x000000000001aed8 ___memsize = . + +/DISCARD/ + *(.debug$S) + *(.debug$T) + *(.debug$F) + *(.drectve) + *(.note.GNU-stack) + *(.eh_frame) + *(.comment) + *(.debug_abbrev) + *(.debug_info) + *(.debug_line) + *(.debug_frame) + *(.debug_loc) + *(.debug_pubnames) + *(.debug_aranges) + *(.debug_ranges) +LOAD /home/hatsune/menuetos/stub/crt0.o +LOAD freebios.o +LOAD /home/hatsune/menuetos/lib/libm.a +LOAD /home/hatsune/menuetos/lib/libc.a +OUTPUT(noout pei-i386)