Advertisement
NWPlayer123

Game Prototype v0.1

Jan 10th, 2016
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.52 KB | None | 0 0
  1. #include "loader.h"
  2.  
  3. void _start()
  4. {
  5.     /****************************>      Clean up everything       <****************************/
  6.     //Load a good stack
  7.     asm(
  8.         "lis %r1, 0x1ab5 ;"
  9.         "ori %r1, %r1, 0xd138 ;"
  10.         );
  11.     //Get a handle on coreinit
  12.     uint32_t coreinit_handle;
  13.     OSDynLoad_Acquire("coreinit.rpl", &coreinit_handle);
  14.     //IM Shutdown functions
  15.     int (*IM_SetDeviceState)(int fd, void *mem, int state, int a, int b);
  16.     int (*IM_Close)(int fd);
  17.     int (*IM_Open)(void);
  18.     //OS Memory functions
  19.     void*(*memset)(void *dest, uint32_t value, uint32_t bytes);
  20.     void*(*OSAllocFromSystem)(uint32_t size, int align);
  21.     void (*OSFreeToSystem)(void *ptr);
  22.     //IM Shutdown functions
  23.     OSDynLoad_FindExport(coreinit_handle, 0, "IM_SetDeviceState", &IM_SetDeviceState);
  24.     OSDynLoad_FindExport(coreinit_handle, 0, "IM_Close", &IM_Close);
  25.     OSDynLoad_FindExport(coreinit_handle, 0, "IM_Open", &IM_Open);
  26.     //OS Memory functions
  27.     OSDynLoad_FindExport(coreinit_handle, 0, "OSAllocFromSystem", &OSAllocFromSystem);
  28.     OSDynLoad_FindExport(coreinit_handle, 0, "OSFreeToSystem", &OSFreeToSystem);
  29.     OSDynLoad_FindExport(coreinit_handle, 0, "memset", &memset);
  30.     //Restart system to get lib access
  31.     int fd = IM_Open();
  32.     void *mem = OSAllocFromSystem(0x100, 64);
  33.     memset(mem, 0, 0x100);
  34.     //set restart flag to force quit browser
  35.     IM_SetDeviceState(fd, mem, 3, 0, 0);
  36.     IM_Close(fd);
  37.     OSFreeToSystem(mem);
  38.     //wait a bit for browser end
  39.     unsigned int t1 = 0x1FFFFFFF;
  40.     while(t1--) ;
  41.     /****************************>           Get Handles           <****************************/
  42.     //Get a handle to coreinit.rpl
  43.     OSDynLoad_Acquire("coreinit.rpl", &coreinit_handle);
  44.     //Get a handle to vpad.rpl
  45.     uint32_t vpad_handle;
  46.     OSDynLoad_Acquire("vpad.rpl", &vpad_handle);
  47.     //Get a handle to nsysnet.rpl
  48.     uint32_t nsysnet_handle;
  49.     OSDynLoad_Acquire("nsysnet.rpl", &nsysnet_handle);
  50.     //Get a handle to gx2.rpl
  51.     uint32_t gx2_handle;
  52.     OSDynLoad_Acquire("gx2.rpl", &gx2_handle);
  53.     /****************************>       External Prototypes       <****************************/
  54.     //OSScreen functions
  55.     void     (*OSScreenInit)(void);
  56.     uint32_t (*OSScreenGetBufferSizeEx)(uint32_t bufferNum);
  57.     uint32_t (*OSScreenSetBufferEx)(uint32_t bufferNum, void *addr);
  58.     //Misc functions
  59.     uint32_t (*OSGetSystemTick)(void);
  60.     void (*OSSleepTicks)(uint32_t ticks);
  61.     void (*DCFlushRange)(const void *addr, uint32_t length);
  62.     void (*GX2WaitForVsync)(void);
  63.     //VPAD functions
  64.     int (*VPADRead)(int controller, VPADData *buffer, unsigned int num, int *error);
  65.     // Socket functions
  66.     int (*socket)(int family, int type, int proto);
  67.     int (*connect)(int fd, struct sockaddr *addr, int addrlen);
  68.     int (*send)(int fd, const void *buffer, int len, int flags);
  69.     int (*recv)(int fd, void *buffer, int len, int flags);
  70.     void(*socket_lib_init)(void);
  71.     //OS functions
  72.     void (*_Exit)();
  73.     /****************************>             Exports             <****************************/
  74.     //OSScreen functions
  75.     OSDynLoad_FindExport(coreinit_handle, 0, "OSScreenInit", &OSScreenInit);
  76.     OSDynLoad_FindExport(coreinit_handle, 0, "OSScreenGetBufferSizeEx", &OSScreenGetBufferSizeEx);
  77.     OSDynLoad_FindExport(coreinit_handle, 0, "OSScreenSetBufferEx", &OSScreenSetBufferEx);
  78.     OSDynLoad_FindExport(coreinit_handle, 0, "OSGetSystemTick", &OSGetSystemTick);
  79.     OSDynLoad_FindExport(coreinit_handle, 0, "OSSleepTicks", &OSSleepTicks);
  80.     OSDynLoad_FindExport(gx2_handle, 0, "GX2WaitForVsync", &GX2WaitForVsync);
  81.     //VPAD functions
  82.     OSDynLoad_FindExport(vpad_handle, 0, "VPADRead", &VPADRead);
  83.     //Socket functions
  84.     OSDynLoad_FindExport(nsysnet_handle, 0, "socket", &socket);
  85.     OSDynLoad_FindExport(nsysnet_handle, 0, "connect", &connect);
  86.     OSDynLoad_FindExport(nsysnet_handle, 0, "recv", &recv);
  87.     OSDynLoad_FindExport(nsysnet_handle, 0, "send", &send);
  88.     OSDynLoad_FindExport(nsysnet_handle, 0, "socket_lib_init", &socket_lib_init);
  89.     //OS functions
  90.     OSDynLoad_FindExport(coreinit_handle, 0, "_Exit", &_Exit);
  91.     /****************************>          Initial Setup          <****************************/
  92.     //Call the Screen initilzation function.
  93.     OSScreenInit();
  94.     //Grab the buffer size for each screen (TV and gamepad)
  95.     int buf0_size = OSScreenGetBufferSizeEx(0);
  96.     int buf1_size = OSScreenGetBufferSizeEx(1);
  97.     //Set the buffer area.
  98.     OSScreenSetBufferEx(0, (void *)0xF4000000);
  99.     OSScreenSetBufferEx(1, (void *)0xF4000000 + buf0_size);
  100.     //Clear both framebuffers.
  101.     int ii = 0;
  102.     for (ii; ii < 2; ii++)
  103.     {
  104.         fillScreen(0,0,0,0);
  105.         flipBuffers();
  106.     }
  107.  
  108.     VPADData vpad_data;
  109.     uint32_t error;
  110.    
  111.     socket_lib_init();
  112.  
  113.     /* Set up our socket address structure */
  114.     struct sockaddr sin;
  115.     sin.sin_family = AF_INET;
  116.     sin.sin_port = 42069;
  117.     sin.sin_addr.s_addr = PC_IP;
  118.     int i, j;
  119.     for (i = 0; i < 8; i++) sin.sin_zero[i] = 0;
  120.    
  121.     int clr01 = 0xFFFFFFFF;
  122.     int clr02 = 0x500000FF;
  123.     int clr03 = 0xF84070FF;
  124.     int clr04 = 0xF8D870FF;
  125.     int clr05 = 0xB02860FF;
  126.     int clr06 = 0xD8A038FF;
  127.     int clr07 = 0xF8F8F8FF;
  128.     int clr08 = 0x000000FF;
  129.     int clr09 = 0xF8D0C0FF;
  130.     int clr10 = 0x885818FF;
  131.     int clr11 = 0xF87068FF;
  132.     int clr12 = 0x408098FF;
  133.     int clr13 = 0x80D8C8FF;
  134.     int clr14 = 0x203088FF;
  135.     int mario[20][14] = {
  136.         {clr01, clr01, clr01, clr01, clr01, clr01, clr02, clr02, clr02, clr02, clr02, clr01, clr01, clr01},
  137.         {clr01, clr01, clr01, clr01, clr02, clr02, clr03, clr03, clr03, clr04, clr03, clr02, clr01, clr01},
  138.         {clr01, clr01, clr01, clr02, clr03, clr03, clr05, clr05, clr06, clr04, clr07, clr02, clr01, clr01},
  139.         {clr01, clr01, clr02, clr05, clr03, clr05, clr05, clr08, clr08, clr08, clr08, clr08, clr08, clr01},
  140.         {clr01, clr02, clr05, clr05, clr05, clr08, clr08, clr08, clr08, clr08, clr08, clr08, clr08, clr08},
  141.         {clr01, clr02, clr09, clr08, clr08, clr08, clr11, clr08, clr11, clr08, clr11, clr01, clr01, clr01},
  142.         {clr02, clr09, clr10, clr09, clr08, clr11, clr09, clr08, clr09, clr08, clr09, clr10, clr10, clr01},
  143.         {clr02, clr11, clr10, clr09, clr08, clr08, clr09, clr09, clr09, clr09, clr09, clr09, clr09, clr10},
  144.         {clr02, clr08, clr11, clr09, clr08, clr09, clr09, clr08, clr11, clr11, clr11, clr11, clr11, clr10},
  145.         {clr01, clr08, clr08, clr11, clr11, clr09, clr08, clr08, clr08, clr08, clr08, clr08, clr08, clr01},
  146.         {clr01, clr01, clr08, clr10, clr10, clr11, clr11, clr11, clr08, clr08, clr08, clr08, clr01, clr01},
  147.         {clr01, clr01, clr01, clr02, clr05, clr10, clr10, clr10, clr10, clr14, clr01, clr01, clr01, clr01},
  148.         {clr01, clr01, clr02, clr05, clr05, clr03, clr12, clr12, clr13, clr13, clr14, clr01, clr01, clr01},
  149.         {clr01, clr01, clr02, clr10, clr10, clr10, clr12, clr07, clr07, clr13, clr07, clr14, clr01, clr01},
  150.         {clr01, clr01, clr10, clr07, clr07, clr07, clr10, clr07, clr07, clr13, clr07, clr14, clr01, clr01},
  151.         {clr01, clr01, clr10, clr07, clr07, clr10, clr12, clr12, clr12, clr13, clr13, clr14, clr01, clr01},
  152.         {clr01, clr01, clr10, clr07, clr07, clr10, clr12, clr12, clr14, clr12, clr14, clr01, clr01, clr01},
  153.         {clr01, clr01, clr01, clr10, clr10, clr10, clr10, clr08, clr10, clr08, clr01, clr01, clr01, clr01},
  154.         {clr01, clr01, clr01, clr08, clr10, clr10, clr10, clr04, clr08, clr04, clr08, clr01, clr01, clr01},
  155.         {clr01, clr01, clr01, clr08, clr08, clr08, clr08, clr08, clr08, clr08, clr08, clr01, clr01, clr01}
  156.     };
  157.     int enabled = 0;
  158.     int x = 0, y = 0;
  159.     int ticksPerFrame = 1035937;
  160.     uint32_t time0, time1;
  161.     while (1)
  162.     {
  163.         VPADRead(0, &vpad_data, 1, &error);
  164.         if (vpad_data.btn_trigger & BUTTON_A) {
  165.            
  166.             /* Connect to the PC */
  167.             /*for (i = 0; i < 20; i++) {
  168.                 for (j = 0; j < 14; j++) {
  169.                     makeBigPixel(j, i, mario[i][j]);
  170.                 }
  171.             }*/
  172.             /*uint32_t buffer[1];
  173.             uint32_t *screen = (void *) 0xF4000000;
  174.             int count = 0, red = 0;
  175.             for (i = 0;i < buf0_size / 8; i++) {
  176.                 buffer[0] = ((red << 24) | (256 << 16) | (0 << 8) | (256 << 4));
  177.                 memcpy(screen, buffer, 4);
  178.                 DCFlushRange(screen, 16);
  179.                 screen += 1; count += 1;
  180.                 if (i % width == 0) red += 1;
  181.             }*/
  182.             /*int rpc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  183.             int status = connect(rpc, &sin, 0x10);
  184.             if (status) break;
  185.             uint32_t *screen = (void *) 0xF4000000;
  186.             uint32_t buffer[256 * height * 5];
  187.             int pos = 0;*/
  188.             /*for (i = 0; i < height * 5; i++) {
  189.                 recv(rpc, (void*)buffer+(i*0x400), 0x400, 0);
  190.                 for (j = 0; j < 256; j++) {
  191.                     memcpy(screen, (void*)buffer+(j*4), 4);
  192.                     DCFlushRange(screen, 16);
  193.                     screen += 1;
  194.                 }
  195.             }*/
  196.             /*int rpc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  197.             int status = connect(rpc, &sin, 0x10);
  198.             if (status) break;
  199.             char *screen = (void *)0xF4000000;
  200.             char buffer[0x400];
  201.             int width = 1280;
  202.             int x = 0, y = 0;
  203.             for (i = 0; i < (0x384000 / 0x400); i++) {
  204.                 recv(rpc,(void*)buffer, 0x400, 0);
  205.                 for (j = 0; j < 256; j++) {
  206.                     uint32_t v=((x*2+y*2)*width);
  207.                     screen[v+0] = buffer[j*4];
  208.                     screen[v+1] = buffer[j*4+1];
  209.                     screen[v+2] = buffer[j*4+2];
  210.                     screen[v+3] = buffer[j*4+3];
  211.                     x += 1;
  212.                     if (x == width) {x = 0; y += 1;}
  213.                 }
  214.             }*/
  215.         }
  216.  
  217.         if (vpad_data.btn_hold & BUTTON_RIGHT) {
  218.             time0 = OSGetSystemTick();
  219.             x += 1;
  220.             for (i = 0; i < 20; i++) {
  221.                 for (j = 0; j < 14; j++) {
  222.                     makeBigPixel(j + x, i + y, mario[i][j]);
  223.                 }
  224.             }
  225.             time1 = OSGetSystemTick();
  226.             OSSleepTicks(ticksPerFrame - (time1 - time0));
  227.         }
  228.  
  229.         if (vpad_data.btn_hold & BUTTON_DOWN) {
  230.             time0 = OSGetSystemTick();
  231.             x += 1;
  232.             for (i = 0; i < 20; i++) {
  233.                 for (j = 0; j < 14; j++) {
  234.                     makeBigPixel(j + x, i + y, mario[i][j]);
  235.                 }
  236.             }
  237.             time1 = OSGetSystemTick();
  238.             OSSleepTicks(ticksPerFrame - (time1 - time0));
  239.         }
  240.         if (vpad_data.btn_trigger & BUTTON_HOME) break;
  241.     }
  242.     //WARNING: DO NOT CHANGE THIS. YOU MUST CLEAR THE FRAMEBUFFERS AND IMMEDIATELY CALL EXIT FROM THIS FUNCTION. RETURNING TO LOADER CAUSES FREEZE.
  243.     for(ii=0;ii<2;ii++)
  244.     {
  245.         fillScreen(0, 0, 0, 0);
  246.         flipBuffers();
  247.     }
  248.     _Exit();
  249. }
  250.  
  251. void makeBigPixel(int x, int y, int color) {
  252.     int width = 1280;
  253.     int height = 720;
  254.     int i, j;
  255.     for (i = 0; i < 4; i++) {
  256.         for (j = 0; j < 4; j++) {
  257.             makePixel((x * 4) + i, (y * 4) + j, color);
  258.         }
  259.     }
  260. }
  261.  
  262. void makePixel(int x, int y, int color) {
  263.     unsigned int coreinit_handle;
  264.     OSDynLoad_Acquire("coreinit.rpl", &coreinit_handle);
  265.     void (*DCFlushRange)(void *buffer, uint32_t length);
  266.     OSDynLoad_FindExport(coreinit_handle, 0, "DCFlushRange", &DCFlushRange);
  267.     int width = 1280;
  268.     int height = 720;
  269.     uint32_t buffer[1];
  270.     uint32_t *screen = (void *) 0xF4000000;
  271.     buffer[0] = color;
  272.     screen += (x + (y * width));
  273.     memcpy(screen, buffer, 4);
  274.     DCFlushRange(screen, 16);
  275. }
  276.  
  277. void* memcpy(void* dst, void* src, uint32_t size)
  278. {
  279.     uint32_t i;
  280.     for (i = 0; i < size; i++)
  281.         ((uint8_t*) dst)[i] = ((const uint8_t*) src)[i];
  282.     return dst;
  283. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement