コード例 #1
0
bool DeInit(void* context)
{
  UPSEContext* upse = (UPSEContext*)context;
  upse_eventloop_stop(upse->mod);
  upse_eventloop_render(upse->mod, (int16_t**)&upse->buf);
  upse_module_close(upse->mod);
  delete upse;

  return true;
}
コード例 #2
0
ファイル: reentrancy_test_main.c プロジェクト: kaniini/upse
void *
emulator_singleton_thread(void *arg)
{
    upse_module_t *mod;

    mod = upse_module_open(arg, &iofuncs);    
    if (mod == NULL)
    {
        printf("opening %s failed?\n", arg);
        return NULL;
    }

    printf("thread %p is playing mod: %s\n", pthread_self(), mod->metadata->title);
    upse_eventloop_run(mod);
    printf("thread %p has played mod: %s\n", pthread_self(), mod->metadata->title);

    upse_module_close(mod);

    fflush(stdout);

    return NULL;
}
コード例 #3
0
ファイル: psf2exe_main.c プロジェクト: kaniini/upse
int
main(int argc, const char *argv[])
{
    upse_module_t *mod;
    FILE *f;
    u8 *exebuf, *writer;
    u32 exesize, readaddr;
    upse_exe_header_t *head;
    upse_module_instance_t *ins;

    if (argc < 3)
    {
        printf("%s: usage: in.minipsf out.psf\n", argv[0]);
        return -1;
    }

    upse_module_init();
    mod = upse_module_open(argv[1], &psf2exe_iofuncs);
    if (mod == NULL)
        return -1;

    ins = &mod->instance;

    printf("Reassembling %s into %s:\n\n", argv[1], argv[2]);

    exesize = (ins->highest_addr - ins->lowest_addr) + ins->highest_addr_size;

    printf("Lowest load address : 0x%.8X\n", ins->lowest_addr);
    printf("Highest load address: 0x%.8X\n", ins->highest_addr);
    printf("Total image size    : 0x%.8X\n", exesize);
    printf("Entry point         : 0x%.8X\n", ins->cpustate.pc);
    printf("GP base             : 0x%.8X\n", ins->cpustate.GPR.n.gp);
    printf("Stack base          : 0x%.8X\n", ins->cpustate.GPR.n.sp);

    exebuf = malloc(sizeof(upse_exe_header_t) + 0x800 + exesize);
    head = (upse_exe_header_t *) exebuf;

    printf("\nBuilding PS-X EXE header.\n");

    head->id[0] = 'P';
    head->id[1] = 'S';
    head->id[2] = '-';
    head->id[3] = 'X';
    head->id[4] = ' ';
    head->id[5] = 'E';
    head->id[6] = 'X';
    head->id[7] = 'E';

    head->text = 0;
    head->data = 0;
    head->pc0 = ins->cpustate.pc;
    head->gp0 = ins->cpustate.GPR.n.gp;

    head->t_addr = ins->lowest_addr;
    head->t_size = exesize + 0x4C;

    head->d_addr = 0;
    head->d_size = 0;
    head->b_addr = 0;
    head->b_size = 0;

    head->s_addr = ins->cpustate.GPR.n.sp;
    head->s_size = 0;

    head->SavedSP = 0;
    head->SavedFP = 0;
    head->SavedGP = 0;
    head->SavedRA = 0;
    head->SavedS0 = 0;

    printf("Assembling binary image.\n");
    for (readaddr = ins->lowest_addr, writer = exebuf + 0x800;
         (writer - exebuf) < exesize; readaddr++, writer++)
    {
        *writer = PSXMu8(ins, readaddr);
    }

    printf("PS-X EXE image assembled.\n");

    upse_module_close(mod);
    ins = NULL;

    f = fopen(argv[2], "wb");
    if (f == NULL)
    {
        perror(argv[2]);
        return -1;
    }

    printf("\nOpened %s for writing.\n", argv[2]);

    fwrite(exebuf, 1, sizeof(upse_exe_header_t) + 0x800 + exesize, f);

    fclose(f);

    printf("Wrote %s successfully.\n", argv[2]);

    return 0;
}