├── .gitignore ├── batteryPercent.yml ├── draw.h ├── LICENSE ├── CMakeLists.txt ├── README.md ├── draw.c ├── batteryPercent.c └── font.h /.gitignore: -------------------------------------------------------------------------------- 1 | # Vita 2 | *.suprx 3 | *.skprx 4 | 5 | # Cmake 6 | /CMakeFiles 7 | Makefile 8 | CMakeCache.txt 9 | *.cmake 10 | -------------------------------------------------------------------------------- /batteryPercent.yml: -------------------------------------------------------------------------------- 1 | vitabatteryplus: 2 | attributes: 0 3 | version: 4 | major: 1 5 | minor: 8 6 | main: 7 | start: module_start 8 | stop: module_stop 9 | -------------------------------------------------------------------------------- /draw.h: -------------------------------------------------------------------------------- 1 | #ifndef __DRAW_H__ 2 | #define __DRAW_H__ 3 | 4 | 5 | #define BLACK 0x00000000 6 | #define WHITE 0x00FFFFFF 7 | #define RED 0x000000FF 8 | #define GREEN 0x0000FF00 9 | #define BLUE 0x00FF0000 10 | #define CYAN 0x00FFFF00 11 | #define MAGENTA 0x00FF00FF 12 | #define YELLOW 0x0000FFFF 13 | #define ORANGE 0x00008CFF 14 | #define PURPLE 0x00FC006D 15 | 16 | 17 | void updateFrameBuf(const SceDisplayFrameBuf *param); 18 | void setColor(int fg_col, int bg_col); 19 | void drawString(int sx, int sy, const char *format); 20 | void drawStringF(int sx, int sy, const char *format, ...); 21 | 22 | 23 | #endif -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Joel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8) 2 | 3 | if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) 4 | if(DEFINED ENV{VITASDK}) 5 | set(CMAKE_TOOLCHAIN_FILE "$ENV{VITASDK}/share/vita.toolchain.cmake" CACHE PATH "toolchain file") 6 | else() 7 | message(FATAL_ERROR "Please define VITASDK to point to your SDK path!") 8 | endif() 9 | endif() 10 | 11 | project(vitabatteryplus) 12 | include("${VITASDK}/share/vita.cmake" REQUIRED) 13 | 14 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-q -Wall -O3 -std=gnu99") 15 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-rtti -fno-exceptions") 16 | 17 | include_directories( 18 | ) 19 | 20 | link_directories( 21 | ${CMAKE_CURRENT_BINARY_DIR} 22 | ) 23 | 24 | if (NOT ${RELEASE}) 25 | add_definitions(-DENABLE_LOGGING) 26 | endif() 27 | 28 | add_executable(vitabatteryplus 29 | batteryPercent.c 30 | draw.c 31 | ) 32 | 33 | target_link_libraries(vitabatteryplus 34 | taihen_stub 35 | SceLibKernel_stub 36 | SceIofilemgr_stub 37 | SceDisplay_stub 38 | SceCtrl_stub 39 | k 40 | gcc 41 | ScePower_stub 42 | ) 43 | 44 | set_target_properties(vitabatteryplus 45 | PROPERTIES LINK_FLAGS "-nostdlib" 46 | ) 47 | 48 | vita_create_self(vitabatteryplus.suprx vitabatteryplus 49 | CONFIG ${CMAKE_SOURCE_DIR}/batteryPercent.yml 50 | ) 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VITABatteryPlus [![Github latest downloads](https://img.shields.io/github/downloads/Electric1447/VITABatteryPlus/total.svg)](https://github.com/Electric1447/VITABatteryPlus/releases/latest) 2 | 3 | A simple tai-hen plugin that displays the battery & framerate information on your PS VITA 4 | 5 | VITABatteryPlus Modes: 6 | -------------------------------------------------------------------------------- 7 | 8 | - Current battery percentage. 9 | - Current battery temperature in Celsius (°C) degrees. 10 | - Remaining battery life time. 11 | - FPS counter. 12 | 13 | 14 | Controls: 15 | -------------------------------------------------------------------------------- 16 | 17 | **Start + Up** -> Cycle mode. 18 | **Start + Left** -> Cycle position. 19 | **Start + Right** -> Cycle text color. 20 | **Start + Down** -> Close VITABatteryPlus display. 21 | 22 | 23 | Installation: 24 | -------------------------------------------------------------------------------- 25 | 26 | Put "vitabatteryplus.suprx" in ux0:/tai folder in your PS Vita. 27 | 28 | Open ux0:/tai/config.txt and add the following: 29 | 30 | ```text 31 | # titleid for your application 32 | *ALL 33 | ux0:tai/vitabatteryplus.suprx 34 | ``` 35 | 36 | 37 | ### Credits: 38 | - [joel16](https://github.com/joel16) for creating [VITABattery](https://github.com/joel16/VITABattery). 39 | - [Rinnegatamante](https://github.com/Rinnegatamante) for Framecounter function. 40 | -------------------------------------------------------------------------------- /draw.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include 6 | #include 7 | 8 | #include "draw.h" 9 | #include "font.h" 10 | 11 | 12 | unsigned int* vram32; 13 | int pwidth, pheight, bufferwidth, pixelformat; 14 | 15 | uint32_t fcolor = 0x00ffffff; 16 | uint32_t bcolor = 0xff000000; 17 | 18 | 19 | /* 20 | * This function updates the frame buffer. 21 | */ 22 | void updateFrameBuf(const SceDisplayFrameBuf *param) { 23 | 24 | pwidth = param->width; 25 | pheight = param->height; 26 | vram32 = param->base; 27 | bufferwidth = param->pitch; 28 | pixelformat = param->pixelformat; 29 | 30 | if ((bufferwidth == 0) || (pixelformat != 0)) 31 | return; 32 | 33 | fcolor = 0x00ffffff; 34 | bcolor = 0xff000000; 35 | } 36 | 37 | /* 38 | * This function sets the string color, as well as the background color. 39 | */ 40 | void setColor(int fg_col, int bg_col) { 41 | fcolor = fg_col; 42 | bcolor = bg_col; 43 | } 44 | 45 | /* 46 | * This function draws a string onto the screen. 47 | */ 48 | void drawString(int sx, int sy, const char *format) { 49 | 50 | if ((bufferwidth == 0) || (pixelformat != 0)) 51 | return; 52 | 53 | for (int x = 0; format[x] && x < (pwidth / 16); x++) { 54 | 55 | int code = format[x] & 0x7f; // 7bit ANK 56 | 57 | for (int y = 0; y < 8; y++) { 58 | int offset = (sy + (y * 2)) * bufferwidth + sx + x * 16; 59 | unsigned char font = (y >= 7) ? 0x00 : msx[code * 8 + y]; 60 | 61 | for (int p = 0; p < 8; p++) { 62 | uint32_t color = (font & 0x80) ? fcolor : bcolor; 63 | vram32[offset] = color; 64 | vram32[offset + 1] = color; 65 | vram32[offset + bufferwidth] = color; 66 | vram32[offset + bufferwidth + 1] = color; 67 | 68 | font <<= 1; 69 | offset+=2; 70 | } 71 | } 72 | } 73 | } 74 | 75 | /* 76 | * This function draws a string onto the screen with string specifier formats. 77 | */ 78 | void drawStringF(int sx, int sy, const char *format, ...) { 79 | 80 | char string[512]; 81 | va_list list; 82 | 83 | va_start(list, format); 84 | vsnprintf(string, 512, format, list); 85 | va_end(list); 86 | 87 | drawString(sx, sy, string); 88 | } -------------------------------------------------------------------------------- /batteryPercent.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "draw.h" 6 | 7 | 8 | #define TIMER_SECOND 1000000 // 1 second 9 | #define NUM_MODES 4 10 | #define NUM_POSITIONS 4 11 | #define NUM_COLORS 9 12 | 13 | 14 | int colors[] = {WHITE, GREEN, RED, BLUE, CYAN, MAGENTA, YELLOW, ORANGE, PURPLE}; 15 | 16 | int menuIndex = 0, posIndex = 0, colorIndex = 0; 17 | uint64_t tick = 0, t_tick = 0; 18 | int frames = 0, fps_data = 0; 19 | 20 | static uint32_t old_buttons, pressed_buttons; 21 | 22 | static SceUID tai_uid; 23 | static tai_hook_ref_t hook; 24 | 25 | 26 | void checkButtons() { 27 | SceCtrlData pad; 28 | sceCtrlPeekBufferPositive(0, &pad, 1); 29 | pressed_buttons = pad.buttons & ~old_buttons; 30 | 31 | if ((pad.buttons & SCE_CTRL_START) && (pressed_buttons & SCE_CTRL_UP)) 32 | menuIndex = ((menuIndex == (NUM_MODES - 1)) ? NUM_MODES : ((menuIndex + 1) % NUM_MODES)); 33 | 34 | if (menuIndex) { 35 | if ((pad.buttons & SCE_CTRL_START) && (pad.buttons & SCE_CTRL_DOWN)) 36 | menuIndex = 0; 37 | else if ((pad.buttons & SCE_CTRL_START) && (pressed_buttons & SCE_CTRL_LEFT)) 38 | posIndex = (posIndex + 1) % NUM_POSITIONS; 39 | else if ((pad.buttons & SCE_CTRL_START) && (pressed_buttons & SCE_CTRL_RIGHT)) 40 | colorIndex = (colorIndex + 1) % NUM_COLORS; 41 | } 42 | 43 | old_buttons = pad.buttons; 44 | } 45 | 46 | int sceDisplaySetFrameBuf_patched(const SceDisplayFrameBuf *pParam, int sync) { 47 | 48 | checkButtons(); 49 | 50 | updateFrameBuf(pParam); 51 | setColor(colors[colorIndex], BLACK); 52 | 53 | switch (menuIndex) { 54 | case 1: { 55 | int percent = scePowerGetBatteryLifePercent(); 56 | 57 | drawStringF((1 - posIndex / 2) * (896 - 16 * (percent / 100)), (posIndex % 2) * 528, "%d %%", percent); 58 | break; 59 | } 60 | case 2: { 61 | int batteryLifeTime = scePowerGetBatteryLifeTime(); 62 | 63 | if (batteryLifeTime >= 0) 64 | drawStringF((1 - posIndex / 2) * 848, (posIndex % 2) * 528, "%02ih %02im", batteryLifeTime / 60, batteryLifeTime - (batteryLifeTime / 60 * 60)); 65 | break; 66 | } 67 | case 3: { 68 | int temp = scePowerGetBatteryTemp(); 69 | 70 | if (temp > 0) 71 | drawStringF((1 - posIndex / 2) * 800, (posIndex % 2) * 528, "Temp: %02i C", temp / 100); 72 | break; 73 | } 74 | case 4: 75 | // This function is from Framecounter by Rinnegatamante. 76 | t_tick = sceKernelGetProcessTimeWide(); 77 | 78 | if (tick == 0) { 79 | tick = t_tick; 80 | } else { 81 | if ((t_tick - tick) > TIMER_SECOND) { 82 | fps_data = frames; 83 | frames = 0; 84 | tick = t_tick; 85 | } 86 | drawStringF((1 - posIndex / 2) * 848, (posIndex % 2) * 528, "FPS: %2d", fps_data); 87 | } 88 | 89 | frames++; 90 | break; 91 | } 92 | 93 | return TAI_CONTINUE(int, hook, pParam, sync); 94 | } 95 | 96 | void _start() __attribute__ ((weak, alias ("module_start"))); 97 | int module_start(SceSize argc, const void *args) { 98 | 99 | tai_uid = taiHookFunctionImport(&hook, TAI_MAIN_MODULE, 0x4FAACD11, 0x7A410B64, sceDisplaySetFrameBuf_patched); 100 | 101 | return SCE_KERNEL_START_SUCCESS; 102 | } 103 | 104 | int module_stop(SceSize argc, const void *args) { 105 | 106 | // free hooks that didn't fail 107 | if (tai_uid >= 0) taiHookRelease(tai_uid, hook); 108 | 109 | return SCE_KERNEL_STOP_SUCCESS; 110 | } -------------------------------------------------------------------------------- /font.h: -------------------------------------------------------------------------------- 1 | /* 2 | * PSP Software Development Kit - http://www.pspdev.org 3 | * ----------------------------------------------------------------------- 4 | * Licensed under the BSD license, see LICENSE in PSPSDK root for details. 5 | * 6 | * font.c - Debug Font. 7 | * 8 | * Copyright (c) 2005 Marcus R. Brown 9 | * Copyright (c) 2005 James Forshaw 10 | * Copyright (c) 2005 John Kelley 11 | * 12 | * $Id: font.c 339 2005-06-27 02:24:25Z warren $ 13 | */ 14 | 15 | const uint8_t msx[]= 16 | "\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x42\xa5\x81\xa5\x99\x42\x3c" 17 | "\x3c\x7e\xdb\xff\xff\xdb\x66\x3c\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" 18 | "\x10\x38\x7c\xfe\x7c\x38\x10\x00\x10\x38\x54\xfe\x54\x10\x38\x00" 19 | "\x10\x38\x7c\xfe\xfe\x10\x38\x00\x00\x00\x00\x30\x30\x00\x00\x00" 20 | "\xff\xff\xff\xe7\xe7\xff\xff\xff\x38\x44\x82\x82\x82\x44\x38\x00" 21 | "\xc7\xbb\x7d\x7d\x7d\xbb\xc7\xff\x0f\x03\x05\x79\x88\x88\x88\x70" 22 | "\x38\x44\x44\x44\x38\x10\x7c\x10\x30\x28\x24\x24\x28\x20\xe0\xc0" 23 | "\x3c\x24\x3c\x24\x24\xe4\xdc\x18\x10\x54\x38\xee\x38\x54\x10\x00" 24 | "\x10\x10\x10\x7c\x10\x10\x10\x10\x10\x10\x10\xff\x00\x00\x00\x00" 25 | "\x00\x00\x00\xff\x10\x10\x10\x10\x10\x10\x10\xf0\x10\x10\x10\x10" 26 | "\x10\x10\x10\x1f\x10\x10\x10\x10\x10\x10\x10\xff\x10\x10\x10\x10" 27 | "\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\xff\x00\x00\x00\x00" 28 | "\x00\x00\x00\x1f\x10\x10\x10\x10\x00\x00\x00\xf0\x10\x10\x10\x10" 29 | "\x10\x10\x10\x1f\x00\x00\x00\x00\x10\x10\x10\xf0\x00\x00\x00\x00" 30 | "\x81\x42\x24\x18\x18\x24\x42\x81\x01\x02\x04\x08\x10\x20\x40\x80" 31 | "\x80\x40\x20\x10\x08\x04\x02\x01\x00\x10\x10\xff\x10\x10\x00\x00" 32 | "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x20\x20\x20\x00\x00\x20\x00" 33 | "\x50\x50\x50\x00\x00\x00\x00\x00\x50\x50\xf8\x50\xf8\x50\x50\x00" 34 | "\x20\x78\xa0\x70\x28\xf0\x20\x00\xc0\xc8\x10\x20\x40\x98\x18\x00" 35 | "\x40\xa0\x40\xa8\x90\x98\x60\x00\x10\x20\x40\x00\x00\x00\x00\x00" 36 | "\x10\x20\x40\x40\x40\x20\x10\x00\x40\x20\x10\x10\x10\x20\x40\x00" 37 | "\x20\xa8\x70\x20\x70\xa8\x20\x00\x00\x20\x20\xf8\x20\x20\x00\x00" 38 | "\x00\x00\x00\x00\x00\x20\x20\x40\x00\x00\x00\x78\x00\x00\x00\x00" 39 | "\x00\x00\x00\x00\x00\x60\x60\x00\x00\x00\x08\x10\x20\x40\x80\x00" 40 | "\x70\x88\x98\xa8\xc8\x88\x70\x00\x20\x60\xa0\x20\x20\x20\xf8\x00" 41 | "\x70\x88\x08\x10\x60\x80\xf8\x00\x70\x88\x08\x30\x08\x88\x70\x00" 42 | "\x10\x30\x50\x90\xf8\x10\x10\x00\xf8\x80\xe0\x10\x08\x10\xe0\x00" 43 | "\x30\x40\x80\xf0\x88\x88\x70\x00\xf8\x88\x10\x20\x20\x20\x20\x00" 44 | "\x70\x88\x88\x70\x88\x88\x70\x00\x70\x88\x88\x78\x08\x10\x60\x00" 45 | "\x00\x00\x20\x00\x00\x20\x00\x00\x00\x00\x20\x00\x00\x20\x20\x40" 46 | "\x18\x30\x60\xc0\x60\x30\x18\x00\x00\x00\xf8\x00\xf8\x00\x00\x00" 47 | "\xc0\x60\x30\x18\x30\x60\xc0\x00\x70\x88\x08\x10\x20\x00\x20\x00" 48 | "\x70\x88\x08\x68\xa8\xa8\x70\x00\x20\x50\x88\x88\xf8\x88\x88\x00" 49 | "\xf0\x48\x48\x70\x48\x48\xf0\x00\x30\x48\x80\x80\x80\x48\x30\x00" 50 | "\xe0\x50\x48\x48\x48\x50\xe0\x00\xf8\x80\x80\xf0\x80\x80\xf8\x00" 51 | "\xf8\x80\x80\xf0\x80\x80\x80\x00\x70\x88\x80\xb8\x88\x88\x70\x00" 52 | "\x88\x88\x88\xf8\x88\x88\x88\x00\x70\x20\x20\x20\x20\x20\x70\x00" 53 | "\x38\x10\x10\x10\x90\x90\x60\x00\x88\x90\xa0\xc0\xa0\x90\x88\x00" 54 | "\x80\x80\x80\x80\x80\x80\xf8\x00\x88\xd8\xa8\xa8\x88\x88\x88\x00" 55 | "\x88\xc8\xc8\xa8\x98\x98\x88\x00\x70\x88\x88\x88\x88\x88\x70\x00" 56 | "\xf0\x88\x88\xf0\x80\x80\x80\x00\x70\x88\x88\x88\xa8\x90\x68\x00" 57 | "\xf0\x88\x88\xf0\xa0\x90\x88\x00\x70\x88\x80\x70\x08\x88\x70\x00" 58 | "\xf8\x20\x20\x20\x20\x20\x20\x00\x88\x88\x88\x88\x88\x88\x70\x00" 59 | "\x88\x88\x88\x88\x50\x50\x20\x00\x88\x88\x88\xa8\xa8\xd8\x88\x00" 60 | "\x88\x88\x50\x20\x50\x88\x88\x00\x88\x88\x88\x70\x20\x20\x20\x00" 61 | "\xf8\x08\x10\x20\x40\x80\xf8\x00\x70\x40\x40\x40\x40\x40\x70\x00" 62 | "\x00\x00\x80\x40\x20\x10\x08\x00\x70\x10\x10\x10\x10\x10\x70\x00" 63 | "\x20\x50\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00" 64 | "\x40\x20\x10\x00\x00\x00\x00\x00\x00\x00\x70\x08\x78\x88\x78\x00" 65 | "\x80\x80\xb0\xc8\x88\xc8\xb0\x00\x00\x00\x70\x88\x80\x88\x70\x00" 66 | "\x08\x08\x68\x98\x88\x98\x68\x00\x00\x00\x70\x88\xf8\x80\x70\x00" 67 | "\x10\x28\x20\xf8\x20\x20\x20\x00\x00\x00\x68\x98\x98\x68\x08\x70" 68 | "\x80\x80\xf0\x88\x88\x88\x88\x00\x20\x00\x60\x20\x20\x20\x70\x00" 69 | "\x10\x00\x30\x10\x10\x10\x90\x60\x40\x40\x48\x50\x60\x50\x48\x00" 70 | "\x60\x20\x20\x20\x20\x20\x70\x00\x00\x00\xd0\xa8\xa8\xa8\xa8\x00" 71 | "\x00\x00\xb0\xc8\x88\x88\x88\x00\x00\x00\x70\x88\x88\x88\x70\x00" 72 | "\x00\x00\xb0\xc8\xc8\xb0\x80\x80\x00\x00\x68\x98\x98\x68\x08\x08" 73 | "\x00\x00\xb0\xc8\x80\x80\x80\x00\x00\x00\x78\x80\xf0\x08\xf0\x00" 74 | "\x40\x40\xf0\x40\x40\x48\x30\x00\x00\x00\x90\x90\x90\x90\x68\x00" 75 | "\x00\x00\x88\x88\x88\x50\x20\x00\x00\x00\x88\xa8\xa8\xa8\x50\x00" 76 | "\x00\x00\x88\x50\x20\x50\x88\x00\x00\x00\x88\x88\x98\x68\x08\x70" 77 | "\x00\x00\xf8\x10\x20\x40\xf8\x00\x18\x20\x20\x40\x20\x20\x18\x00" 78 | "\x20\x20\x20\x00\x20\x20\x20\x00\xc0\x20\x20\x10\x20\x20\xc0\x00" 79 | "\x40\xa8\x10\x00\x00\x00\x00\x00\x00\x00\x20\x50\xf8\x00\x00\x00" 80 | "\x70\x88\x80\x80\x88\x70\x20\x60\x90\x00\x00\x90\x90\x90\x68\x00" 81 | "\x10\x20\x70\x88\xf8\x80\x70\x00\x20\x50\x70\x08\x78\x88\x78\x00" 82 | "\x48\x00\x70\x08\x78\x88\x78\x00\x20\x10\x70\x08\x78\x88\x78\x00" 83 | "\x20\x00\x70\x08\x78\x88\x78\x00\x00\x70\x80\x80\x80\x70\x10\x60" 84 | "\x20\x50\x70\x88\xf8\x80\x70\x00\x50\x00\x70\x88\xf8\x80\x70\x00" 85 | "\x20\x10\x70\x88\xf8\x80\x70\x00\x50\x00\x00\x60\x20\x20\x70\x00" 86 | "\x20\x50\x00\x60\x20\x20\x70\x00\x40\x20\x00\x60\x20\x20\x70\x00" 87 | "\x50\x00\x20\x50\x88\xf8\x88\x00\x20\x00\x20\x50\x88\xf8\x88\x00" 88 | "\x10\x20\xf8\x80\xf0\x80\xf8\x00\x00\x00\x6c\x12\x7e\x90\x6e\x00" 89 | "\x3e\x50\x90\x9c\xf0\x90\x9e\x00\x60\x90\x00\x60\x90\x90\x60\x00" 90 | "\x90\x00\x00\x60\x90\x90\x60\x00\x40\x20\x00\x60\x90\x90\x60\x00" 91 | "\x40\xa0\x00\xa0\xa0\xa0\x50\x00\x40\x20\x00\xa0\xa0\xa0\x50\x00" 92 | "\x90\x00\x90\x90\xb0\x50\x10\xe0\x50\x00\x70\x88\x88\x88\x70\x00" 93 | "\x50\x00\x88\x88\x88\x88\x70\x00\x20\x20\x78\x80\x80\x78\x20\x20" 94 | "\x18\x24\x20\xf8\x20\xe2\x5c\x00\x88\x50\x20\xf8\x20\xf8\x20\x00" 95 | "\xc0\xa0\xa0\xc8\x9c\x88\x88\x8c\x18\x20\x20\xf8\x20\x20\x20\x40" 96 | "\x10\x20\x70\x08\x78\x88\x78\x00\x10\x20\x00\x60\x20\x20\x70\x00" 97 | "\x20\x40\x00\x60\x90\x90\x60\x00\x20\x40\x00\x90\x90\x90\x68\x00" 98 | "\x50\xa0\x00\xa0\xd0\x90\x90\x00\x28\x50\x00\xc8\xa8\x98\x88\x00" 99 | "\x00\x70\x08\x78\x88\x78\x00\xf8\x00\x60\x90\x90\x90\x60\x00\xf0" 100 | "\x20\x00\x20\x40\x80\x88\x70\x00\x00\x00\x00\xf8\x80\x80\x00\x00" 101 | "\x00\x00\x00\xf8\x08\x08\x00\x00\x84\x88\x90\xa8\x54\x84\x08\x1c" 102 | "\x84\x88\x90\xa8\x58\xa8\x3c\x08\x20\x00\x00\x20\x20\x20\x20\x00" 103 | "\x00\x00\x24\x48\x90\x48\x24\x00\x00\x00\x90\x48\x24\x48\x90\x00" 104 | "\x28\x50\x20\x50\x88\xf8\x88\x00\x28\x50\x70\x08\x78\x88\x78\x00" 105 | "\x28\x50\x00\x70\x20\x20\x70\x00\x28\x50\x00\x20\x20\x20\x70\x00" 106 | "\x28\x50\x00\x70\x88\x88\x70\x00\x50\xa0\x00\x60\x90\x90\x60\x00" 107 | "\x28\x50\x00\x88\x88\x88\x70\x00\x50\xa0\x00\xa0\xa0\xa0\x50\x00" 108 | "\xfc\x48\x48\x48\xe8\x08\x50\x20\x00\x50\x00\x50\x50\x50\x10\x20" 109 | "\xc0\x44\xc8\x54\xec\x54\x9e\x04\x10\xa8\x40\x00\x00\x00\x00\x00" 110 | "\x00\x20\x50\x88\x50\x20\x00\x00\x88\x10\x20\x40\x80\x28\x00\x00" 111 | "\x7c\xa8\xa8\x68\x28\x28\x28\x00\x38\x40\x30\x48\x48\x30\x08\x70" 112 | "\x00\x00\x00\x00\x00\x00\xff\xff\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" 113 | "\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" 114 | "\x00\x00\x00\x3c\x3c\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00" 115 | "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0" 116 | "\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\x03\x03\x03\x03\x03\x03\x03\x03" 117 | "\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x11\x22\x44\x88\x11\x22\x44\x88" 118 | "\x88\x44\x22\x11\x88\x44\x22\x11\xfe\x7c\x38\x10\x00\x00\x00\x00" 119 | "\x00\x00\x00\x00\x10\x38\x7c\xfe\x80\xc0\xe0\xf0\xe0\xc0\x80\x00" 120 | "\x01\x03\x07\x0f\x07\x03\x01\x00\xff\x7e\x3c\x18\x18\x3c\x7e\xff" 121 | "\x81\xc3\xe7\xff\xff\xe7\xc3\x81\xf0\xf0\xf0\xf0\x00\x00\x00\x00" 122 | "\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00" 123 | "\x00\x00\x00\x00\xf0\xf0\xf0\xf0\x33\x33\xcc\xcc\x33\x33\xcc\xcc" 124 | "\x00\x20\x20\x50\x50\x88\xf8\x00\x20\x20\x70\x20\x70\x20\x20\x00" 125 | "\x00\x00\x00\x50\x88\xa8\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff" 126 | "\x00\x00\x00\x00\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" 127 | "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\x00\x00\x00\x00" 128 | "\x00\x00\x68\x90\x90\x90\x68\x00\x30\x48\x48\x70\x48\x48\x70\xc0" 129 | "\xf8\x88\x80\x80\x80\x80\x80\x00\xf8\x50\x50\x50\x50\x50\x98\x00" 130 | "\xf8\x88\x40\x20\x40\x88\xf8\x00\x00\x00\x78\x90\x90\x90\x60\x00" 131 | "\x00\x50\x50\x50\x50\x68\x80\x80\x00\x50\xa0\x20\x20\x20\x20\x00" 132 | "\xf8\x20\x70\xa8\xa8\x70\x20\xf8\x20\x50\x88\xf8\x88\x50\x20\x00" 133 | "\x70\x88\x88\x88\x50\x50\xd8\x00\x30\x40\x40\x20\x50\x50\x50\x20" 134 | "\x00\x00\x00\x50\xa8\xa8\x50\x00\x08\x70\xa8\xa8\xa8\x70\x80\x00" 135 | "\x38\x40\x80\xf8\x80\x40\x38\x00\x70\x88\x88\x88\x88\x88\x88\x00" 136 | "\x00\xf8\x00\xf8\x00\xf8\x00\x00\x20\x20\xf8\x20\x20\x00\xf8\x00" 137 | "\xc0\x30\x08\x30\xc0\x00\xf8\x00\x18\x60\x80\x60\x18\x00\xf8\x00" 138 | "\x10\x28\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\xa0\x40" 139 | "\x00\x20\x00\xf8\x00\x20\x00\x00\x00\x50\xa0\x00\x50\xa0\x00\x00" 140 | "\x00\x18\x24\x24\x18\x00\x00\x00\x00\x30\x78\x78\x30\x00\x00\x00" 141 | "\x00\x00\x00\x00\x30\x00\x00\x00\x3e\x20\x20\x20\xa0\x60\x20\x00" 142 | "\xa0\x50\x50\x50\x00\x00\x00\x00\x40\xa0\x20\x40\xe0\x00\x00\x00" 143 | "\x00\x38\x38\x38\x38\x38\x38\x00\x00\x00\x00\x00\x00\x00\x00"; --------------------------------------------------------------------------------