All pastes #16454 Raw Edit

Unnamed

public text v1 · immutable
#16454 ·published 2005-06-30 08:19 UTC
rendered paste body
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspdisplay.h>

void *g_vram_base, *g_vram_base_2;
int linePos = 0;

/* Define the module info section */
MODULE_INFO("PSPMC", 0x01010000)

/* Define printf, just to make typing easier */
#define printf	pspDebugScreenPrintf

/* Exit callback */
void exit_callback(void)
{
    sceKernelExitGame();
}

/* Callback thread */
void CallbackThread(void *arg)
{
    int cbid;
    cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
    sceKernelRegisterExitCallback(cbid);
    sceKernelSleepThreadCB();
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void)
{
    int thid = 0;
    thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
    if (thid >= 0)
        sceKernelStartThread(thid, 0, 0);
    return thid;
}

unsigned char *getVramAddr()
{
    if (frame == 0)
        return g_vram_base;
    return g_vram_base_2;
}

void swapBuffer()
{

    if (frame == 0) {
        sceDisplaySetFrameBuf(g_vram_base, 512, 3, 1);
        frame = 1;
    } else {
        sceDisplaySetFrameBuf(g_vram_base_2, 512, 3, 1);
        frame = 0;
    }
}

void fillvram(unsigned long color)
{
    unsigned long *vptr0;	//pointer to vram
    unsigned long i, j;

    vptr0 = getVramAddr();
    for (i = 0; i < 272; i++) {
        if (frame == 0) {	//skip a line
            for (j = 0; j < 480; j++) {
                *vptr0 = 0;
                vptr0 += 1;
            }
            vptr0 += 512 - 480;
        }

        for (j = 0; j < 480; j++) {
            *vptr0 = color;
            vptr0 += 1;
        }
        vptr0 += 512 - 480;	//skip offscreen buffer

        //skip a line
        if (frame == 1) {
            for (j = 0; j < 480; j++) {
                *vptr0 = 0;
                vptr0 += 1;
            }
            vptr0 += 512 - 480;
        }
    }

    //draw line
    vptr0 = getVramAddr();
    vptr0 += 512 * linePos;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 480; j++) {
            *vptr0 = 0x00FFFFFF;
            vptr0 += 1;
        }
        vptr0 += 512 - 480;
    }
    linePos++;
    //linePos = linePos % 272;
    if (linePos > 268)
        linePos = 0;
}

int main(int argc, char* argv[]) {
    g_vram_base = (void *) (0x40000000 | sceGeEdramGetAddr());
    g_vram_base_2 = (void *) (g_vram_base + 512 * 272 * 4);

    sceDisplaySetMode(0, 480, 272);
    sceDisplaySetFrameBuf(g_vram_base, 512, 3 /* 8888 ABGR mode*/, 1);
    SetupCallbacks();
    printf("starting pspmc\n");
    for (;;) {
        
        //uses fancy fillvram func to draw alternating lines of the color specified (ABGR format)
        if (frame == 0)
           fillvram(0x00FF0000);
        else
           fillvram(0x00FF0000);
        
        //not so fancy set vram all one color
        //for (i = 0; i < 272; i+=1)
        //      memset(frame?g_vram_base:g_vram_base_2, i%2==0?0x007F0000:0x00000000, 512*270);
        sceDisplayWaitVblankStart();
        swapBuffer();
    }
}