/*

  Version Changer for 2.00 downgrading by mph (mphtheone@hotmail.com)

  Based on :

  Hello World v1 for PSP v2.0
  (w) 24/09/2005 by Groepaz/Hitmen
  http://www.hitmen-console.org

  greets to Skylark, Niacin, Skywalker, xor37h, Tyranid

*/


#include <pspiofilemgr_dirent.h>


void Main (void);
void _start (void) __attribute__ ((section (".text.start")));


// this is our "crt0". not real, very fake. but enough for now :=P

void _start (void)
{
 Main();
 while (1) {}; // wait forever
} 

// font data

const unsigned char font[] = 
{

    // much better charset, by eddie!
    // this is actually the 8x8 neuromancer
    // vga/ega mode font :)
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   // 0x20 
    0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00,   // 0x21 
    0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,   // 0x22 
    0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00,   // 0x23 
    0x30,0x7C,0xC0,0x78,0x0C,0xF8,0x30,0x00,   // 0x24 
    0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6,0x00,   // 0x25 
    0x38,0x6C,0x38,0x76,0xDC,0xCC,0x76,0x00,   // 0x26 
    0x60,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,   // 0x27 
    0x18,0x30,0x60,0x60,0x60,0x30,0x18,0x00,   // 0x28 
    0x60,0x30,0x18,0x18,0x18,0x30,0x60,0x00,   // 0x29 
    0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,   // 0x2A 
    0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00,   // 0x2B 
    0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,   // 0x2C 
    0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,   // 0x2D 
    0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,   // 0x2E 
    0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,   // 0x2F 
    0x7C,0xC6,0xCE,0xDE,0xF6,0xE6,0x7C,0x00,   // 0x30 
    0x30,0x70,0x30,0x30,0x30,0x30,0xFC,0x00,   // 0x31 
    0x78,0xCC,0x0C,0x38,0x60,0xCC,0xFC,0x00,   // 0x32 
    0x78,0xCC,0x0C,0x38,0x0C,0xCC,0x78,0x00,   // 0x33 
    0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x1E,0x00,   // 0x34 
    0xFC,0xC0,0xF8,0x0C,0x0C,0xCC,0x78,0x00,   // 0x35 
    0x38,0x60,0xC0,0xF8,0xCC,0xCC,0x78,0x00,   // 0x36 
    0xFC,0xCC,0x0C,0x18,0x30,0x30,0x30,0x00,   // 0x37 
    0x78,0xCC,0xCC,0x78,0xCC,0xCC,0x78,0x00,   // 0x38 
    0x78,0xCC,0xCC,0x7C,0x0C,0x18,0x70,0x00,   // 0x39 
    0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,   // 0x3A 
    0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x60,   // 0x3B 
    0x18,0x30,0x60,0xC0,0x60,0x30,0x18,0x00,   // 0x3C 
    0x00,0x00,0xFC,0x00,0x00,0xFC,0x00,0x00,   // 0x3D 
    0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00,   // 0x3E 
    0x78,0xCC,0x0C,0x18,0x30,0x00,0x30,0x00,   // 0x3F 
    0x7C,0xC6,0xDE,0xDE,0xDE,0xC0,0x78,0x00,   // 0x40 
    0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC,0x00,   // 0x41 
    0xFC,0x66,0x66,0x7C,0x66,0x66,0xFC,0x00,   // 0x42 
    0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00,   // 0x43 
    0xF8,0x6C,0x66,0x66,0x66,0x6C,0xF8,0x00,   // 0x44 
    0xFE,0x62,0x68,0x78,0x68,0x62,0xFE,0x00,   // 0x45 
    0xFE,0x62,0x68,0x78,0x68,0x60,0xF0,0x00,   // 0x46 
    0x3C,0x66,0xC0,0xC0,0xCE,0x66,0x3E,0x00,   // 0x47 
    0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00,   // 0x48 
    0x78,0x30,0x30,0x30,0x30,0x30,0x78,0x00,   // 0x49 
    0x1E,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00,   // 0x4A 
    0xE6,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00,   // 0x4B 
    0xF0,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,   // 0x4C 
    0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00,   // 0x4D 
    0xC6,0xE6,0xF6,0xDE,0xCE,0xC6,0xC6,0x00,   // 0x4E 
    0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x38,0x00,   // 0x4F 
    0xFC,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00,   // 0x50 
    0x78,0xCC,0xCC,0xCC,0xDC,0x78,0x1C,0x00,   // 0x51 
    0xFC,0x66,0x66,0x7C,0x6C,0x66,0xE6,0x00,   // 0x52 
    0x78,0xCC,0xE0,0x70,0x1C,0xCC,0x78,0x00,   // 0x53 
    0xFC,0xB4,0x30,0x30,0x30,0x30,0x78,0x00,   // 0x54 
    0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFC,0x00,   // 0x55 
    0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x30,0x00,   // 0x56 
    0xC6,0xC6,0xC6,0xD6,0xFE,0xEE,0xC6,0x00,   // 0x57 
    0xC6,0xC6,0x6C,0x38,0x38,0x6C,0xC6,0x00,   // 0x58 
    0xCC,0xCC,0xCC,0x78,0x30,0x30,0x78,0x00,   // 0x59 
    0xFE,0xC6,0x8C,0x18,0x32,0x66,0xFE,0x00,   // 0x5A 
    0x78,0x60,0x60,0x60,0x60,0x60,0x78,0x00,   // 0x5B 
    0xC0,0x60,0x30,0x18,0x0C,0x06,0x02,0x00,   // 0x5C 
    0x78,0x18,0x18,0x18,0x18,0x18,0x78,0x00,   // 0x5D 
    0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,   // 0x5E 
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,   // 0x5F 
    0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,   // 0x60 
    0x00,0x00,0x78,0x0C,0x7C,0xCC,0x76,0x00,   // 0x61 
    0xE0,0x60,0x60,0x7C,0x66,0x66,0xDC,0x00,   // 0x62 
    0x00,0x00,0x78,0xCC,0xC0,0xCC,0x78,0x00,   // 0x63 
    0x1C,0x0C,0x0C,0x7C,0xCC,0xCC,0x76,0x00,   // 0x64 
    0x00,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00,   // 0x65 
    0x38,0x6C,0x60,0xF0,0x60,0x60,0xF0,0x00,   // 0x66 
    0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0xF8,   // 0x67 
    0xE0,0x60,0x6C,0x76,0x66,0x66,0xE6,0x00,   // 0x68 
    0x30,0x00,0x70,0x30,0x30,0x30,0x78,0x00,   // 0x69 
    0x0C,0x00,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,   // 0x6A 
    0xE0,0x60,0x66,0x6C,0x78,0x6C,0xE6,0x00,   // 0x6B 
    0x70,0x30,0x30,0x30,0x30,0x30,0x78,0x00,   // 0x6C 
    0x00,0x00,0xCC,0xFE,0xFE,0xD6,0xC6,0x00,   // 0x6D 
    0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0x00,   // 0x6E 
    0x00,0x00,0x78,0xCC,0xCC,0xCC,0x78,0x00,   // 0x6F 
    0x00,0x00,0xDC,0x66,0x66,0x7C,0x60,0xF0,   // 0x70 
    0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0x1E,   // 0x71 
    0x00,0x00,0xDC,0x76,0x66,0x60,0xF0,0x00,   // 0x72 
    0x00,0x00,0x7C,0xC0,0x78,0x0C,0xF8,0x00,   // 0x73 
    0x10,0x30,0x7C,0x30,0x30,0x34,0x18,0x00,   // 0x74 
    0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x76,0x00,   // 0x75 
    0x00,0x00,0xCC,0xCC,0xCC,0x78,0x30,0x00,   // 0x76 
    0x00,0x00,0xC6,0xD6,0xFE,0xFE,0x6C,0x00,   // 0x77 
    0x00,0x00,0xC6,0x6C,0x38,0x6C,0xC6,0x00,   // 0x78 
    0x00,0x00,0xCC,0xCC,0xCC,0x7C,0x0C,0xF8,   // 0x79 
    0x00,0x00,0xFC,0x98,0x30,0x64,0xFC,0x00,   // 0x7A 
    0x1C,0x30,0x30,0xE0,0x30,0x30,0x1C,0x00,   // 0x7B 
    0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x00,   // 0x7C 
    0xE0,0x30,0x30,0x1C,0x30,0x30,0xE0,0x00,   // 0x7D 
    0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,   // 0x7E    
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

#define CMAX_X		60
#define CMAX_Y		38
#define PIXELSIZE	3				//in short
#define LINESIZE 	512				//in short
#define FRAMESIZE	0xAA000			//in byte

char line[4][256];


unsigned char *vramtop = (unsigned char *) 0x04000000;
unsigned long drawframe;

// get vram address for character position

unsigned char *GetVramAddr (unsigned long x, unsigned long y)
{
 return vramtop + ((drawframe) ? FRAMESIZE : 0) + (x * 4) + (y * LINESIZE * 4) + 0x40000000;
}

// print a single character

void PutChar (unsigned long x, unsigned long y, unsigned long color, unsigned long bgcolor, unsigned char ch, char drawfg, char drawbg, char mag)
{
 unsigned char *vptr0;			//pointer to vram
 unsigned char *vptr;			//pointer to vram
 const unsigned char *cfont;	//pointer to font
 unsigned long cx, cy;
 unsigned long b;
 char mx, my;


 cfont = font + (ch * 8);
 vptr0 = GetVramAddr(x,y);

 for (cy=0;cy<8;cy++)
 {
  for (my=0;my<mag;my++)
  {
   vptr = vptr0;
   b = 0x80;

   for (cx=0;cx<8;cx++)
   {
	for (mx=0;mx<mag;mx++)
	{
	 if ((*cfont & b) != 0)
	 {
	  if (drawfg)
	   *(unsigned long *) vptr = color;
	 }
	 else
	 {
	  if (drawbg)
	   *(unsigned long *) vptr = bgcolor;
	 }

	 vptr+=4; // PIXELSIZE*2;
	}

	b = b >> 1;
   }

   vptr0 += LINESIZE * 4; // 2
  }

  cfont++;
 }
}

// print a string

void Print(unsigned long x, unsigned long y, unsigned long color, const char *str)
{
 while ((*str != 0) && (x < CMAX_X) && (y < CMAX_Y))
 {
  PutChar(x*8,y*8,color,0,*str,1,1,1);

  str++; x++;

  if (x >= CMAX_X)
  {
   x = 0;
   y++;
  }
 }
}
 
// clear video ram

void Fillvram (unsigned long color)
{
 unsigned char *vptr0;		//pointer to vram
 unsigned long i;


 vptr0 = GetVramAddr(0,0);

 for (i=0;i<(FRAMESIZE/4)*2;i++) 
 {
  *(unsigned long *) vptr0 = color;
  vptr0 += 4;
 }
}

// Memory functions

int memcmp (u8 *buf1, u8 *buf2, int size)
{
 int x, r = 0;

 for (x=0;(x<size) && (r == 0);x++)  if (buf1[x] != buf2[x]) r = 1;

 return r;
}

// String functions

void strcpy (char *dst,char *src)
{
 while ((*dst++ = *src++));
}

int strlen (char *s)
{
 int i = 0;


 while (*s++) i++;

 return i;
}

void PrintLines (void)
{
 int i = 0;


 for (i=0;i<3;i++) Print(1,i+1,0x00ffffff,line[i]);
}

// for printing a 32bit hex --abu

void num2hex (char *dst, int n)
{
 int i;
 static char hex[]="0123456789ABCDEF";


 for (i=0;i<8;i++) dst[i] = hex[(n >> ((7 - i) * 4)) & 15];
}

// Files functions

#define PSP_O_RDONLY    0x0001
#define PSP_O_WRONLY    0x0002
#define PSP_O_CREAT     0x0200
#define PSP_O_TRUNC     0x0400
#define PSP_O_APPEND    0x0100

#define PSP_SEEK_SET	0
#define PSP_SEEK_CUR	1
#define PSP_SEEK_END	2

// 0x208F,0x109f50bc,sceIoOpen

int sceIoOpen (char *name, int flags, int mode)
{
// function args are readily in registers, so just do syscall --abu
 asm("syscall 0x208f");
}

//0x208d,0x810c4bc3,sceIoClose

void sceIoClose (int fd)
{
 asm("syscall 0x208d");  
}

//0x2091,0x6a638d83,sceIoRead

int sceIoRead (int fd, char *buf, int sz)
{
 asm("syscall 0x2091");
}

//0x2093,0x42ec03ac,sceIoWrite

int sceIoWrite (int fd, char *buf, int sz)
{
 asm("syscall 0x2093");
}

//0x209B,0xb29ddf9c,sceIoDopen

void *sceIoDopen (const char *dirname)
{
 asm("syscall 0x209b");
}

//0x209C,0xe3eb004c,sceIoDread

int sceIoDread (void *fd, SceIoDirent *dir)
{
 asm("syscall 0x209c");
}

//0x209D,0xeb092469,sceIoDclose

int sceIoDclose (void *fd)
{
 asm("syscall 0x209d");
}

//0x209F,0x06a70004,sceIoMkdir

int sceIoMkdir (char *n, int m)
{
 asm("syscall 0x209f");
}
/*
int sceIoUnassign (char *s)
{
 asm("syscall 0x20A9");
}
*/
int sceIoAssign (char *s, char *s2, char *s3, int d, int d2, int d3)
{
 asm("syscall 0x20A8");
}

int sceIoLseek32 (int fd, long offset, int mode)
{
 asm("syscall 0x2097");
}


int copy_file (char *src, char *dst)
{
 int srcfd, dstfd, r, w, copied = 0;
 char buf[512];


 srcfd = sceIoOpen (src,PSP_O_RDONLY,0);
 if (srcfd < 0) return -1;

 dstfd = sceIoOpen(dst,PSP_O_WRONLY|PSP_O_CREAT|PSP_O_TRUNC,0777);
 if (dstfd < 0) { r = dstfd; goto out; }

 for (;;)
 {
  r = sceIoRead(srcfd,buf,512);
  if (r <= 0) goto out;

  w = sceIoWrite(dstfd,buf,r); 
  if (w != r) { r = 0xfbadcafe; goto out; }  

  copied += r;
  num2hex(line[2],copied);
  line[2][8] = 0;
  PrintLines();
 }

out:
 if (srcfd >= 0) sceIoClose(srcfd);
 if (dstfd >= 0) sceIoClose(dstfd);

 return r;
}

char err[64] = "";	// you can copy an error msg here

#define FLASH_PATH	"flash2:/vsh/etc/index.dat"
#define MS_PATH		"ms0:/index.dat"
#define MSBAK_PATH	"ms0:/index.dat.bak"

#define BLOCK	512

void Main (void)
{
 int fd, fd2, x;
 u8 buffer[BLOCK];
 u8 buftemp[11] = { 0x49, 0x4E, 0x44, 0x45, 0x58, 0x20, 0x20, 0x20, 0x44, 0x41, 0x54 };	// Pour verifier qu'on est bien au bon endroit
 u8 *ptr;
 

 drawframe = 0;

 // clear the video ram
 Fillvram(0x00000000);

 x = 0;

 // Lire le block de l'entrée du fichier index.dat
 strcpy(line[0],"MPHDowngrader v1.0.1");
 strcpy(line[1],"Patch FAT entry ...");
 PrintLines();

 fd = sceIoOpen("lflash:",PSP_O_RDONLY,0);
 if (fd >= 0)
 {
  x = sceIoLseek32(fd,0x9C4000,PSP_SEEK_SET);			// 0x9C4000 est le bloc qui contient l'entrée de index.dat

  sceIoRead(fd,buffer,BLOCK);
  sceIoClose(fd);
 }

 // pointer ptr vers la bonne entrée
 ptr = &buffer[0xE0];

 // regarder si on a le bon block
 if (!(memcmp(ptr,buftemp,11)))
 {
  // Patcher l'attribut du fichier index.dat
  ptr[11] = 0x20;				// Attributs changés (plus read only)
  ptr[14] = 0xFB;				// Octet reservé dans la FAT sert a la protection de copie ?
  ptr[22] = 0xFB;				// Soit disant l'heure du fichier ??

  // Copier dans la lflash
  fd = sceIoOpen("lflash:",PSP_O_RDONLY | PSP_O_WRONLY,0777);
  if (fd >= 0)
  {
   x = sceIoLseek32(fd,0x9C4000,PSP_SEEK_SET);

   sceIoWrite(fd,buffer,BLOCK);
   sceIoClose(fd);
  }
 }

 // Astuce pour assigner la flash0
 x = sceIoAssign("flash2:", "lflash0:0,0", "flashfat2:", 0, NULL, 0);

 // Copier une copie du fichier dans la ms
 strcpy(line[1],"Backup old index.dat file ...");
 PrintLines();

 x = copy_file(FLASH_PATH,MSBAK_PATH);

 // Copier le nouveau fichier
 strcpy(line[2],"Copy new index.dat file ...");
 PrintLines();

 x = copy_file(MS_PATH,FLASH_PATH);

 strcpy(line[0],"Patch succesful, please restart and launch update 1.50");
 PrintLines();

 // endless loop
 for (;;)
 {
  PrintLines();
  drawframe = (drawframe) ? 0 : 1;
 }
}

