├── game.txt ├── .gitattributes ├── blit.h ├── Makefile ├── .gitignore ├── blit.c ├── main.c └── font.c /game.txt: -------------------------------------------------------------------------------- 1 | ux0:plugins/amphetamin.suprx 1 -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /blit.h: -------------------------------------------------------------------------------- 1 | #ifndef __BLIT_H__ 2 | #define __BLIT_H__ 3 | 4 | #define COLOR_CYAN 0x00ffff00 5 | #define COLOR_MAGENDA 0x00ff00ff 6 | #define COLOR_YELLOW 0x0000ffff 7 | 8 | #define RGB(R,G,B) (((B)<<16)|((G)<<8)|(R)) 9 | #define RGBT(R,G,B,T) (((T)<<24)|((B)<<16)|((G)<<8)|(R)) 10 | 11 | #define CENTER(num) ((960/2)-(num*(16/2))) 12 | 13 | int blit_setup(void); 14 | void blit_set_color(int fg_col,int bg_col); 15 | int blit_string(int sx,int sy,const char *msg); 16 | int blit_string_ctr(int sy,const char *msg); 17 | int blit_stringf(int sx, int sy, const char *msg, ...); 18 | 19 | #endif 20 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | TARGET = amphetamin 2 | OBJS = main.o blit.o font.o 3 | 4 | LIBS = -lSceAppMgr_stub -lSceCtrl_stub -lSceDisplay_stub -lSceFios2_stub -lSceKernel_stub -lScePower_stub 5 | 6 | PREFIX = arm-vita-eabi 7 | CC = $(PREFIX)-gcc 8 | CFLAGS = -Wl,-q -Wall -O3 -nostartfiles 9 | ASFLAGS = $(CFLAGS) 10 | 11 | all: $(TARGET).suprx 12 | 13 | %.suprx: %.velf 14 | vita-make-fself $< $@ 15 | 16 | %.velf: %.elf 17 | vita-elf-create $< $@ 18 | 19 | $(TARGET).elf: $(OBJS) 20 | $(CC) $(CFLAGS) $^ $(LIBS) -o $@ 21 | 22 | clean: 23 | @rm -rf $(TARGET).suprx $(TARGET).velf $(TARGET).elf $(OBJS) 24 | 25 | send: $(TARGET).suprx 26 | curl -T $(TARGET).suprx ftp://$(PSVITAIP):1337/ux0:/plugins/$(TARGET).suprx 27 | @echo "Sent." -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | -------------------------------------------------------------------------------- /blit.c: -------------------------------------------------------------------------------- 1 | /* 2 | PSP VSH 24bpp text bliter 3 | */ 4 | #include 5 | #include 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include "blit.h" 13 | 14 | #define ALPHA_BLEND 1 15 | 16 | extern unsigned char msx[]; 17 | 18 | ///////////////////////////////////////////////////////////////////////////// 19 | ///////////////////////////////////////////////////////////////////////////// 20 | static int pwidth, pheight, bufferwidth, pixelformat; 21 | static unsigned int* vram32; 22 | 23 | static uint32_t fcolor = 0x00ffffff; 24 | static uint32_t bcolor = 0xff000000; 25 | 26 | #if ALPHA_BLEND 27 | ///////////////////////////////////////////////////////////////////////////// 28 | ///////////////////////////////////////////////////////////////////////////// 29 | static uint32_t adjust_alpha(uint32_t col) 30 | { 31 | uint32_t alpha = col>>24; 32 | uint8_t mul; 33 | uint32_t c1,c2; 34 | 35 | if(alpha==0) return col; 36 | if(alpha==0xff) return col; 37 | 38 | c1 = col & 0x00ff00ff; 39 | c2 = col & 0x0000ff00; 40 | mul = (uint8_t)(255-alpha); 41 | c1 = ((c1*mul)>>8)&0x00ff00ff; 42 | c2 = ((c2*mul)>>8)&0x0000ff00; 43 | return (alpha<<24)|c1|c2; 44 | } 45 | #endif 46 | 47 | ///////////////////////////////////////////////////////////////////////////// 48 | ///////////////////////////////////////////////////////////////////////////// 49 | //int blit_setup(int sx,int sy,const char *msg,int fg_col,int bg_col) 50 | int blit_setup(void) 51 | { 52 | SceDisplayFrameBuf param; 53 | param.size = sizeof(SceDisplayFrameBuf); 54 | sceDisplayGetFrameBuf(¶m, SCE_DISPLAY_SETBUF_IMMEDIATE); 55 | 56 | pwidth = param.width; 57 | pheight = param.height; 58 | vram32 = param.base; 59 | bufferwidth = param.pitch; 60 | pixelformat = param.pixelformat; 61 | 62 | if( (bufferwidth==0) || (pixelformat!=0)) return -1; 63 | 64 | fcolor = 0x00ffffff; 65 | bcolor = 0xff000000; 66 | 67 | return 0; 68 | } 69 | 70 | ///////////////////////////////////////////////////////////////////////////// 71 | // blit text 72 | ///////////////////////////////////////////////////////////////////////////// 73 | void blit_set_color(int fg_col,int bg_col) 74 | { 75 | fcolor = fg_col; 76 | bcolor = bg_col; 77 | } 78 | 79 | ///////////////////////////////////////////////////////////////////////////// 80 | // blit text 81 | ///////////////////////////////////////////////////////////////////////////// 82 | int blit_string(int sx,int sy,const char *msg) 83 | { 84 | int x,y,p; 85 | int offset; 86 | char code; 87 | unsigned char font; 88 | uint32_t fg_col,bg_col; 89 | 90 | #if ALPHA_BLEND 91 | uint32_t col,c1,c2; 92 | uint32_t alpha; 93 | 94 | fg_col = adjust_alpha(fcolor); 95 | bg_col = adjust_alpha(bcolor); 96 | #else 97 | fg_col = fcolor; 98 | bg_col = bcolor; 99 | #endif 100 | 101 | //Kprintf("MODE %d WIDTH %d\n",pixelformat,bufferwidth); 102 | if( (bufferwidth==0) || (pixelformat!=0)) return -1; 103 | 104 | for(x=0;msg[x] && x<(pwidth/16);x++) 105 | { 106 | code = msg[x] & 0x7f; // 7bit ANK 107 | for(y=0;y<8;y++) 108 | { 109 | offset = (sy+(y*2))*bufferwidth + sx+x*16; 110 | font = y>=7 ? 0x00 : msx[ code*8 + y ]; 111 | for(p=0;p<8;p++) 112 | { 113 | #if ALPHA_BLEND 114 | col = (font & 0x80) ? fg_col : bg_col; 115 | alpha = col>>24; 116 | if(alpha==0) 117 | { 118 | vram32[offset] = col; 119 | vram32[offset + 1] = col; 120 | vram32[offset + bufferwidth] = col; 121 | vram32[offset + bufferwidth + 1] = col; 122 | } 123 | else if(alpha!=0xff) 124 | { 125 | c2 = vram32[offset]; 126 | c1 = c2 & 0x00ff00ff; 127 | c2 = c2 & 0x0000ff00; 128 | c1 = ((c1*alpha)>>8)&0x00ff00ff; 129 | c2 = ((c2*alpha)>>8)&0x0000ff00; 130 | uint32_t color = (col&0xffffff) + c1 + c2; 131 | vram32[offset] = color; 132 | vram32[offset + 1] = color; 133 | vram32[offset + bufferwidth] = color; 134 | vram32[offset + bufferwidth + 1] = color; 135 | } 136 | #else 137 | uint32_t color = (font & 0x80) ? fg_col : bg_col; 138 | vram32[offset] = color; 139 | vram32[offset + 1] = color; 140 | vram32[offset + bufferwidth] = color; 141 | vram32[offset + bufferwidth + 1] = color; 142 | #endif 143 | font <<= 1; 144 | offset+=2; 145 | } 146 | } 147 | } 148 | return x; 149 | } 150 | 151 | int blit_string_ctr(int sy,const char *msg) 152 | { 153 | int sx = 960/2-strlen(msg)*(16/2); 154 | return blit_string(sx,sy,msg); 155 | } 156 | 157 | int blit_stringf(int sx, int sy, const char *msg, ...) 158 | { 159 | va_list list; 160 | char string[512]; 161 | 162 | va_start(list, msg); 163 | vsprintf(string, msg, list); 164 | va_end(list); 165 | 166 | return blit_string(sx, sy, string); 167 | } -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | /* 2 | Vitamin 3 | Copyright (C) 2016, Team FreeK (TheFloW, Major Tom, mr. gas) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | 29 | #include 30 | #include 31 | #include 32 | #include 33 | 34 | #include "blit.h" 35 | 36 | #define GREEN 0x00007F00 37 | #define BLUE 0x007F3F1F 38 | #define PURPLE 0x007F1F7F 39 | 40 | static int freq_list[] = { 111, 166, 222, 266, 333, 366, 444 }; 41 | #define N_FREQS (sizeof(freq_list) / sizeof(int)) 42 | 43 | static uint32_t current_buttons = 0, pressed_buttons = 0; 44 | 45 | int holdButtons(SceCtrlData *pad, uint32_t buttons, uint64_t time) { 46 | if ((pad->buttons & buttons) == buttons) { 47 | uint64_t time_start = sceKernelGetProcessTimeWide(); 48 | 49 | while ((pad->buttons & buttons) == buttons) { 50 | sceKernelDelayThread(10 * 1000); 51 | sceCtrlPeekBufferPositive(0, pad, 1); 52 | 53 | pressed_buttons = pad->buttons & ~current_buttons; 54 | current_buttons = pad->buttons; 55 | 56 | if ((sceKernelGetProcessTimeWide() - time_start) >= time) { 57 | return 1; 58 | } 59 | } 60 | } 61 | 62 | return 0; 63 | } 64 | 65 | /* 66 | * Tricky way to freeze main thread, we set our plugin priority to 0 (max) 67 | * and we start two threads with 0 priority in order to get VITA scheduler 68 | * to always reschedule our threads instead of main one 69 | */ 70 | volatile int term_stubs = 0; 71 | int dummy_thread(SceSize args, void *argp){ 72 | for (;;){ 73 | if (term_stubs) sceKernelExitDeleteThread(0); 74 | } 75 | } 76 | void pauseMainThread(){ 77 | sceKernelChangeThreadPriority(0, 0x0); 78 | int i; 79 | term_stubs = 0; 80 | for (i=0;i<2;i++){ 81 | SceUID thid = sceKernelCreateThread("dummy thread", dummy_thread, 0x0, 0x40000, 0, 0, NULL); 82 | if (thid >= 0) 83 | sceKernelStartThread(thid, 0, NULL); 84 | } 85 | SceKernelThreadInfo main_thread; 86 | for(;;){ 87 | main_thread.size = sizeof(SceKernelThreadInfo); 88 | sceKernelGetThreadInfo(0x40010003, &main_thread); 89 | sceKernelChangeThreadPriority(0x40010003, 0x7F); 90 | if (main_thread.status == SCE_THREAD_RUNNING){ 91 | term_stubs = 1; 92 | sceKernelDelayThread(1000); 93 | term_stubs = 0; 94 | for (i=0;i<2;i++){ 95 | SceUID thid = sceKernelCreateThread("dummy thread", dummy_thread, 0x0, 0x40000, 0, 0, NULL); 96 | if (thid >= 0) 97 | sceKernelStartThread(thid, 0, NULL); 98 | } 99 | }else break; 100 | } 101 | } 102 | void resumeMainThread(){ 103 | term_stubs = 1; 104 | sceKernelChangeThreadPriority(0, 0x40); 105 | SceKernelThreadInfo main_thread; 106 | main_thread.size = sizeof(SceKernelThreadInfo); 107 | sceKernelGetThreadInfo(0x40010003, &main_thread); 108 | sceKernelChangeThreadPriority(0x40010003, main_thread.initPriority); 109 | } 110 | /* 111 | * END OF PAUSE/RESUME THREADS TRICK 112 | */ 113 | 114 | int blit_thread(SceSize args, void *argp) { 115 | sceKernelDelayThread(5 * 1000 * 1000); 116 | 117 | scePowerSetArmClockFrequency(444); 118 | 119 | int menu_open = 0; 120 | int menu_sel = 0; 121 | 122 | while (1) { 123 | SceCtrlData pad; 124 | memset(&pad, 0, sizeof(SceCtrlData)); 125 | sceCtrlPeekBufferPositive(0, &pad, 1); 126 | 127 | pressed_buttons = pad.buttons & ~current_buttons; 128 | current_buttons = pad.buttons; 129 | 130 | if (!menu_open && holdButtons(&pad, SCE_CTRL_SELECT, 1 * 1000 * 1000)) { 131 | menu_open = 1; 132 | menu_sel = 0; 133 | pauseMainThread(); 134 | } 135 | 136 | if (menu_open){ 137 | if (pressed_buttons & SCE_CTRL_SELECT){ 138 | menu_open = 0; 139 | resumeMainThread(); 140 | } 141 | 142 | if (pressed_buttons & SCE_CTRL_UP) { 143 | if (menu_sel > 0) 144 | menu_sel--; 145 | } 146 | 147 | if (pressed_buttons & SCE_CTRL_DOWN) { 148 | if (menu_sel < 2) 149 | menu_sel++; 150 | } 151 | 152 | if (pressed_buttons & SCE_CTRL_LEFT || pressed_buttons & SCE_CTRL_RIGHT) { 153 | int freq = 0; 154 | 155 | switch (menu_sel) { 156 | case 0: 157 | freq = scePowerGetArmClockFrequency(); 158 | break; 159 | 160 | case 1: 161 | freq = scePowerGetBusClockFrequency(); 162 | break; 163 | 164 | case 2: 165 | freq = scePowerGetGpuClockFrequency(); 166 | break; 167 | } 168 | 169 | if (pressed_buttons & SCE_CTRL_LEFT) { 170 | int i; 171 | for (i = 0; i < N_FREQS; i++) { 172 | if (freq_list[i] == freq) { 173 | if (i > 0) 174 | freq = freq_list[i - 1]; 175 | break; 176 | } 177 | } 178 | } 179 | 180 | if (pressed_buttons & SCE_CTRL_RIGHT) { 181 | int i; 182 | for (i = 0; i < N_FREQS; i++) { 183 | if (freq_list[i] == freq) { 184 | if (i < N_FREQS - 1) 185 | freq = freq_list[i + 1]; 186 | break; 187 | } 188 | } 189 | } 190 | 191 | switch (menu_sel) { 192 | case 0: 193 | scePowerSetArmClockFrequency(freq); 194 | break; 195 | 196 | case 1: 197 | scePowerSetBusClockFrequency(freq); 198 | break; 199 | 200 | case 2: 201 | scePowerSetGpuClockFrequency(freq); 202 | break; 203 | } 204 | } 205 | 206 | blit_setup(); 207 | blit_set_color(0x00FFFFFF, 0x00007F00); 208 | blit_stringf(336, 128, "AMPHETAMIN PLUGIN"); 209 | 210 | blit_set_color(0x00FFFFFF, menu_sel == 0 ? BLUE : PURPLE); 211 | blit_stringf(336, 160, "ARM CLOCK"); 212 | blit_stringf(496, 160, "%d MHZ", scePowerGetArmClockFrequency()); 213 | blit_set_color(0x00FFFFFF, menu_sel == 1 ? BLUE : PURPLE); 214 | blit_stringf(336, 176, "BUS CLOCK"); 215 | blit_stringf(496, 176, "%d MHZ", scePowerGetBusClockFrequency()); 216 | blit_set_color(0x00FFFFFF, menu_sel == 2 ? BLUE : PURPLE); 217 | blit_stringf(336, 192, "GPU CLOCK"); 218 | blit_stringf(496, 192, "%d MHZ", scePowerGetGpuClockFrequency()); 219 | } 220 | 221 | sceDisplayWaitVblankStart(); 222 | } 223 | 224 | return 0; 225 | } 226 | 227 | int _start(SceSize args, void *argp) { 228 | SceUID thid = sceKernelCreateThread("blit_thread", blit_thread, 0x40, 0x40000, 0, 0, NULL); 229 | if (thid >= 0) 230 | sceKernelStartThread(thid, 0, NULL); 231 | 232 | return 0; 233 | } -------------------------------------------------------------------------------- /font.c: -------------------------------------------------------------------------------- 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 | #include 15 | 16 | const uint8_t msx[]= 17 | "\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x42\xa5\x81\xa5\x99\x42\x3c" 18 | "\x3c\x7e\xdb\xff\xff\xdb\x66\x3c\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" 19 | "\x10\x38\x7c\xfe\x7c\x38\x10\x00\x10\x38\x54\xfe\x54\x10\x38\x00" 20 | "\x10\x38\x7c\xfe\xfe\x10\x38\x00\x00\x00\x00\x30\x30\x00\x00\x00" 21 | "\xff\xff\xff\xe7\xe7\xff\xff\xff\x38\x44\x82\x82\x82\x44\x38\x00" 22 | "\xc7\xbb\x7d\x7d\x7d\xbb\xc7\xff\x0f\x03\x05\x79\x88\x88\x88\x70" 23 | "\x38\x44\x44\x44\x38\x10\x7c\x10\x30\x28\x24\x24\x28\x20\xe0\xc0" 24 | "\x3c\x24\x3c\x24\x24\xe4\xdc\x18\x10\x54\x38\xee\x38\x54\x10\x00" 25 | "\x10\x10\x10\x7c\x10\x10\x10\x10\x10\x10\x10\xff\x00\x00\x00\x00" 26 | "\x00\x00\x00\xff\x10\x10\x10\x10\x10\x10\x10\xf0\x10\x10\x10\x10" 27 | "\x10\x10\x10\x1f\x10\x10\x10\x10\x10\x10\x10\xff\x10\x10\x10\x10" 28 | "\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\xff\x00\x00\x00\x00" 29 | "\x00\x00\x00\x1f\x10\x10\x10\x10\x00\x00\x00\xf0\x10\x10\x10\x10" 30 | "\x10\x10\x10\x1f\x00\x00\x00\x00\x10\x10\x10\xf0\x00\x00\x00\x00" 31 | "\x81\x42\x24\x18\x18\x24\x42\x81\x01\x02\x04\x08\x10\x20\x40\x80" 32 | "\x80\x40\x20\x10\x08\x04\x02\x01\x00\x10\x10\xff\x10\x10\x00\x00" 33 | "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x20\x20\x20\x00\x00\x20\x00" 34 | "\x50\x50\x50\x00\x00\x00\x00\x00\x50\x50\xf8\x50\xf8\x50\x50\x00" 35 | "\x20\x78\xa0\x70\x28\xf0\x20\x00\xc0\xc8\x10\x20\x40\x98\x18\x00" 36 | "\x40\xa0\x40\xa8\x90\x98\x60\x00\x10\x20\x40\x00\x00\x00\x00\x00" 37 | "\x10\x20\x40\x40\x40\x20\x10\x00\x40\x20\x10\x10\x10\x20\x40\x00" 38 | "\x20\xa8\x70\x20\x70\xa8\x20\x00\x00\x20\x20\xf8\x20\x20\x00\x00" 39 | "\x00\x00\x00\x00\x00\x20\x20\x40\x00\x00\x00\x78\x00\x00\x00\x00" 40 | "\x00\x00\x00\x00\x00\x60\x60\x00\x00\x00\x08\x10\x20\x40\x80\x00" 41 | "\x70\x88\x98\xa8\xc8\x88\x70\x00\x20\x60\xa0\x20\x20\x20\xf8\x00" 42 | "\x70\x88\x08\x10\x60\x80\xf8\x00\x70\x88\x08\x30\x08\x88\x70\x00" 43 | "\x10\x30\x50\x90\xf8\x10\x10\x00\xf8\x80\xe0\x10\x08\x10\xe0\x00" 44 | "\x30\x40\x80\xf0\x88\x88\x70\x00\xf8\x88\x10\x20\x20\x20\x20\x00" 45 | "\x70\x88\x88\x70\x88\x88\x70\x00\x70\x88\x88\x78\x08\x10\x60\x00" 46 | "\x00\x00\x20\x00\x00\x20\x00\x00\x00\x00\x20\x00\x00\x20\x20\x40" 47 | "\x18\x30\x60\xc0\x60\x30\x18\x00\x00\x00\xf8\x00\xf8\x00\x00\x00" 48 | "\xc0\x60\x30\x18\x30\x60\xc0\x00\x70\x88\x08\x10\x20\x00\x20\x00" 49 | "\x70\x88\x08\x68\xa8\xa8\x70\x00\x20\x50\x88\x88\xf8\x88\x88\x00" 50 | "\xf0\x48\x48\x70\x48\x48\xf0\x00\x30\x48\x80\x80\x80\x48\x30\x00" 51 | "\xe0\x50\x48\x48\x48\x50\xe0\x00\xf8\x80\x80\xf0\x80\x80\xf8\x00" 52 | "\xf8\x80\x80\xf0\x80\x80\x80\x00\x70\x88\x80\xb8\x88\x88\x70\x00" 53 | "\x88\x88\x88\xf8\x88\x88\x88\x00\x70\x20\x20\x20\x20\x20\x70\x00" 54 | "\x38\x10\x10\x10\x90\x90\x60\x00\x88\x90\xa0\xc0\xa0\x90\x88\x00" 55 | "\x80\x80\x80\x80\x80\x80\xf8\x00\x88\xd8\xa8\xa8\x88\x88\x88\x00" 56 | "\x88\xc8\xc8\xa8\x98\x98\x88\x00\x70\x88\x88\x88\x88\x88\x70\x00" 57 | "\xf0\x88\x88\xf0\x80\x80\x80\x00\x70\x88\x88\x88\xa8\x90\x68\x00" 58 | "\xf0\x88\x88\xf0\xa0\x90\x88\x00\x70\x88\x80\x70\x08\x88\x70\x00" 59 | "\xf8\x20\x20\x20\x20\x20\x20\x00\x88\x88\x88\x88\x88\x88\x70\x00" 60 | "\x88\x88\x88\x88\x50\x50\x20\x00\x88\x88\x88\xa8\xa8\xd8\x88\x00" 61 | "\x88\x88\x50\x20\x50\x88\x88\x00\x88\x88\x88\x70\x20\x20\x20\x00" 62 | "\xf8\x08\x10\x20\x40\x80\xf8\x00\x70\x40\x40\x40\x40\x40\x70\x00" 63 | "\x00\x00\x80\x40\x20\x10\x08\x00\x70\x10\x10\x10\x10\x10\x70\x00" 64 | "\x20\x50\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00" 65 | "\x40\x20\x10\x00\x00\x00\x00\x00\x00\x00\x70\x08\x78\x88\x78\x00" 66 | "\x80\x80\xb0\xc8\x88\xc8\xb0\x00\x00\x00\x70\x88\x80\x88\x70\x00" 67 | "\x08\x08\x68\x98\x88\x98\x68\x00\x00\x00\x70\x88\xf8\x80\x70\x00" 68 | "\x10\x28\x20\xf8\x20\x20\x20\x00\x00\x00\x68\x98\x98\x68\x08\x70" 69 | "\x80\x80\xf0\x88\x88\x88\x88\x00\x20\x00\x60\x20\x20\x20\x70\x00" 70 | "\x10\x00\x30\x10\x10\x10\x90\x60\x40\x40\x48\x50\x60\x50\x48\x00" 71 | "\x60\x20\x20\x20\x20\x20\x70\x00\x00\x00\xd0\xa8\xa8\xa8\xa8\x00" 72 | "\x00\x00\xb0\xc8\x88\x88\x88\x00\x00\x00\x70\x88\x88\x88\x70\x00" 73 | "\x00\x00\xb0\xc8\xc8\xb0\x80\x80\x00\x00\x68\x98\x98\x68\x08\x08" 74 | "\x00\x00\xb0\xc8\x80\x80\x80\x00\x00\x00\x78\x80\xf0\x08\xf0\x00" 75 | "\x40\x40\xf0\x40\x40\x48\x30\x00\x00\x00\x90\x90\x90\x90\x68\x00" 76 | "\x00\x00\x88\x88\x88\x50\x20\x00\x00\x00\x88\xa8\xa8\xa8\x50\x00" 77 | "\x00\x00\x88\x50\x20\x50\x88\x00\x00\x00\x88\x88\x98\x68\x08\x70" 78 | "\x00\x00\xf8\x10\x20\x40\xf8\x00\x18\x20\x20\x40\x20\x20\x18\x00" 79 | "\x20\x20\x20\x00\x20\x20\x20\x00\xc0\x20\x20\x10\x20\x20\xc0\x00" 80 | "\x40\xa8\x10\x00\x00\x00\x00\x00\x00\x00\x20\x50\xf8\x00\x00\x00" 81 | "\x70\x88\x80\x80\x88\x70\x20\x60\x90\x00\x00\x90\x90\x90\x68\x00" 82 | "\x10\x20\x70\x88\xf8\x80\x70\x00\x20\x50\x70\x08\x78\x88\x78\x00" 83 | "\x48\x00\x70\x08\x78\x88\x78\x00\x20\x10\x70\x08\x78\x88\x78\x00" 84 | "\x20\x00\x70\x08\x78\x88\x78\x00\x00\x70\x80\x80\x80\x70\x10\x60" 85 | "\x20\x50\x70\x88\xf8\x80\x70\x00\x50\x00\x70\x88\xf8\x80\x70\x00" 86 | "\x20\x10\x70\x88\xf8\x80\x70\x00\x50\x00\x00\x60\x20\x20\x70\x00" 87 | "\x20\x50\x00\x60\x20\x20\x70\x00\x40\x20\x00\x60\x20\x20\x70\x00" 88 | "\x50\x00\x20\x50\x88\xf8\x88\x00\x20\x00\x20\x50\x88\xf8\x88\x00" 89 | "\x10\x20\xf8\x80\xf0\x80\xf8\x00\x00\x00\x6c\x12\x7e\x90\x6e\x00" 90 | "\x3e\x50\x90\x9c\xf0\x90\x9e\x00\x60\x90\x00\x60\x90\x90\x60\x00" 91 | "\x90\x00\x00\x60\x90\x90\x60\x00\x40\x20\x00\x60\x90\x90\x60\x00" 92 | "\x40\xa0\x00\xa0\xa0\xa0\x50\x00\x40\x20\x00\xa0\xa0\xa0\x50\x00" 93 | "\x90\x00\x90\x90\xb0\x50\x10\xe0\x50\x00\x70\x88\x88\x88\x70\x00" 94 | "\x50\x00\x88\x88\x88\x88\x70\x00\x20\x20\x78\x80\x80\x78\x20\x20" 95 | "\x18\x24\x20\xf8\x20\xe2\x5c\x00\x88\x50\x20\xf8\x20\xf8\x20\x00" 96 | "\xc0\xa0\xa0\xc8\x9c\x88\x88\x8c\x18\x20\x20\xf8\x20\x20\x20\x40" 97 | "\x10\x20\x70\x08\x78\x88\x78\x00\x10\x20\x00\x60\x20\x20\x70\x00" 98 | "\x20\x40\x00\x60\x90\x90\x60\x00\x20\x40\x00\x90\x90\x90\x68\x00" 99 | "\x50\xa0\x00\xa0\xd0\x90\x90\x00\x28\x50\x00\xc8\xa8\x98\x88\x00" 100 | "\x00\x70\x08\x78\x88\x78\x00\xf8\x00\x60\x90\x90\x90\x60\x00\xf0" 101 | "\x20\x00\x20\x40\x80\x88\x70\x00\x00\x00\x00\xf8\x80\x80\x00\x00" 102 | "\x00\x00\x00\xf8\x08\x08\x00\x00\x84\x88\x90\xa8\x54\x84\x08\x1c" 103 | "\x84\x88\x90\xa8\x58\xa8\x3c\x08\x20\x00\x00\x20\x20\x20\x20\x00" 104 | "\x00\x00\x24\x48\x90\x48\x24\x00\x00\x00\x90\x48\x24\x48\x90\x00" 105 | "\x28\x50\x20\x50\x88\xf8\x88\x00\x28\x50\x70\x08\x78\x88\x78\x00" 106 | "\x28\x50\x00\x70\x20\x20\x70\x00\x28\x50\x00\x20\x20\x20\x70\x00" 107 | "\x28\x50\x00\x70\x88\x88\x70\x00\x50\xa0\x00\x60\x90\x90\x60\x00" 108 | "\x28\x50\x00\x88\x88\x88\x70\x00\x50\xa0\x00\xa0\xa0\xa0\x50\x00" 109 | "\xfc\x48\x48\x48\xe8\x08\x50\x20\x00\x50\x00\x50\x50\x50\x10\x20" 110 | "\xc0\x44\xc8\x54\xec\x54\x9e\x04\x10\xa8\x40\x00\x00\x00\x00\x00" 111 | "\x00\x20\x50\x88\x50\x20\x00\x00\x88\x10\x20\x40\x80\x28\x00\x00" 112 | "\x7c\xa8\xa8\x68\x28\x28\x28\x00\x38\x40\x30\x48\x48\x30\x08\x70" 113 | "\x00\x00\x00\x00\x00\x00\xff\xff\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" 114 | "\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" 115 | "\x00\x00\x00\x3c\x3c\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00" 116 | "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0" 117 | "\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\x03\x03\x03\x03\x03\x03\x03\x03" 118 | "\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x11\x22\x44\x88\x11\x22\x44\x88" 119 | "\x88\x44\x22\x11\x88\x44\x22\x11\xfe\x7c\x38\x10\x00\x00\x00\x00" 120 | "\x00\x00\x00\x00\x10\x38\x7c\xfe\x80\xc0\xe0\xf0\xe0\xc0\x80\x00" 121 | "\x01\x03\x07\x0f\x07\x03\x01\x00\xff\x7e\x3c\x18\x18\x3c\x7e\xff" 122 | "\x81\xc3\xe7\xff\xff\xe7\xc3\x81\xf0\xf0\xf0\xf0\x00\x00\x00\x00" 123 | "\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00" 124 | "\x00\x00\x00\x00\xf0\xf0\xf0\xf0\x33\x33\xcc\xcc\x33\x33\xcc\xcc" 125 | "\x00\x20\x20\x50\x50\x88\xf8\x00\x20\x20\x70\x20\x70\x20\x20\x00" 126 | "\x00\x00\x00\x50\x88\xa8\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff" 127 | "\x00\x00\x00\x00\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" 128 | "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\x00\x00\x00\x00" 129 | "\x00\x00\x68\x90\x90\x90\x68\x00\x30\x48\x48\x70\x48\x48\x70\xc0" 130 | "\xf8\x88\x80\x80\x80\x80\x80\x00\xf8\x50\x50\x50\x50\x50\x98\x00" 131 | "\xf8\x88\x40\x20\x40\x88\xf8\x00\x00\x00\x78\x90\x90\x90\x60\x00" 132 | "\x00\x50\x50\x50\x50\x68\x80\x80\x00\x50\xa0\x20\x20\x20\x20\x00" 133 | "\xf8\x20\x70\xa8\xa8\x70\x20\xf8\x20\x50\x88\xf8\x88\x50\x20\x00" 134 | "\x70\x88\x88\x88\x50\x50\xd8\x00\x30\x40\x40\x20\x50\x50\x50\x20" 135 | "\x00\x00\x00\x50\xa8\xa8\x50\x00\x08\x70\xa8\xa8\xa8\x70\x80\x00" 136 | "\x38\x40\x80\xf8\x80\x40\x38\x00\x70\x88\x88\x88\x88\x88\x88\x00" 137 | "\x00\xf8\x00\xf8\x00\xf8\x00\x00\x20\x20\xf8\x20\x20\x00\xf8\x00" 138 | "\xc0\x30\x08\x30\xc0\x00\xf8\x00\x18\x60\x80\x60\x18\x00\xf8\x00" 139 | "\x10\x28\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\xa0\x40" 140 | "\x00\x20\x00\xf8\x00\x20\x00\x00\x00\x50\xa0\x00\x50\xa0\x00\x00" 141 | "\x00\x18\x24\x24\x18\x00\x00\x00\x00\x30\x78\x78\x30\x00\x00\x00" 142 | "\x00\x00\x00\x00\x30\x00\x00\x00\x3e\x20\x20\x20\xa0\x60\x20\x00" 143 | "\xa0\x50\x50\x50\x00\x00\x00\x00\x40\xa0\x20\x40\xe0\x00\x00\x00" 144 | "\x00\x38\x38\x38\x38\x38\x38\x00\x00\x00\x00\x00\x00\x00\x00"; 145 | 146 | 147 | 148 | --------------------------------------------------------------------------------