コード例 #1
0
ファイル: save.c プロジェクト: 4nykey/rockbox
void savestate(int fd)
{
    int i;
    byte buf[4096];
    un32 (*header)[2] = (un32 (*)[2])buf;
    un32 d = 0;
    int irl = hw.cgb ? 8 : 2;
    int vrl = hw.cgb ? 4 : 2;
    int srl = mbc.ramsize << 1;
    size_t base_offset;

    ver = 0x104;
    iramblock = 1;
    vramblock = 1+irl;
    sramblock = 1+irl+vrl;
    hiofs = 4096 - 768;
    palofs = 4096 - 512;
    oamofs = 4096 - 256;
    memset(buf, 0, sizeof buf);

    for (i = 0; svars[i].len > 0; i++)
    {
        header[i][0] = svars[i].k.key;
        switch (svars[i].len)
        {
        case 1:
            d = *(byte *)svars[i].ptr;
            break;
        case 2:
            d = *(un16 *)svars[i].ptr;
            break;
        case 4:
            d = *(un32 *)svars[i].ptr;
            break;
        }
        header[i][1] = LIL(d);
    }
    header[i][0] = header[i][1] = 0;

    memcpy(buf+hiofs, ram.hi, sizeof ram.hi);
    memcpy(buf+palofs, lcd.pal, sizeof lcd.pal);
    memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam);

    /* calculate base offset for output file */
    /* (we'll seek relative to that from now on) */
    base_offset = lseek(fd, 0, SEEK_CUR);
    write(fd,buf, 4096);
    
    lseek(fd, base_offset + (iramblock << 12), SEEK_SET);
    write(fd,ram.ibank, 4096*irl);
    
    lseek(fd, base_offset + (vramblock << 12), SEEK_SET);
    write(fd,lcd.vbank, 4096*vrl);
    
    lseek(fd, base_offset + (sramblock << 12), SEEK_SET);
    write(fd,ram.sbank, 4096*srl);
}
コード例 #2
0
ファイル: save.c プロジェクト: cedricwaltercson/gnuboy
void loadstate(FILE *f)
{
	int i, j;
	byte buf[4096];
	un32 (*header)[2] = (un32 (*)[2])buf;
	un32 d;
	int irl = hw.cgb ? 8 : 2;
	int vrl = hw.cgb ? 4 : 2;
	int srl = mbc.ramsize << 1;

	ver = hramofs = hiofs = palofs = oamofs = wavofs = 0;

	fseek(f, 0, SEEK_SET);
	fread(buf, 4096, 1, f);
	
	for (j = 0; header[j][0]; j++)
	{
		for (i = 0; svars[i].ptr; i++)
		{
			if (header[j][0] != *(un32 *)svars[i].key)
				continue;
			d = LIL(header[j][1]);
			switch (svars[i].len)
			{
			case 1:
				*(byte *)svars[i].ptr = d;
				break;
			case 2:
				*(un16 *)svars[i].ptr = d;
				break;
			case 4:
				*(un32 *)svars[i].ptr = d;
				break;
			}
			break;
		}
	}

	/* obsolete as of version 0x104 */
	if (hramofs) memcpy(ram.hi+128, buf+hramofs, 127);
	
	if (hiofs) memcpy(ram.hi, buf+hiofs, sizeof ram.hi);
	if (palofs) memcpy(lcd.pal, buf+palofs, sizeof lcd.pal);
	if (oamofs) memcpy(lcd.oam.mem, buf+oamofs, sizeof lcd.oam);

	if (wavofs) memcpy(snd.wave, buf+wavofs, sizeof snd.wave);
	else memcpy(snd.wave, ram.hi+0x30, 16); /* patch data from older files */

	fseek(f, iramblock<<12, SEEK_SET);
	fread(ram.ibank, 4096, irl, f);
	
	fseek(f, vramblock<<12, SEEK_SET);
	fread(lcd.vbank, 4096, vrl, f);
	
	fseek(f, sramblock<<12, SEEK_SET);
	fread(ram.sbank, 4096, srl, f);
}
コード例 #3
0
ファイル: save.c プロジェクト: cedricwaltercson/gnuboy
void savestate(FILE *f)
{
	int i;
	byte buf[4096];
	un32 (*header)[2] = (un32 (*)[2])buf;
	un32 d = 0;
	int irl = hw.cgb ? 8 : 2;
	int vrl = hw.cgb ? 4 : 2;
	int srl = mbc.ramsize << 1;

	ver = 0x105;
	iramblock = 1;
	vramblock = 1+irl;
	sramblock = 1+irl+vrl;
	wavofs = 4096 - 784;
	hiofs = 4096 - 768;
	palofs = 4096 - 512;
	oamofs = 4096 - 256;
	memset(buf, 0, sizeof buf);

	for (i = 0; svars[i].len > 0; i++)
	{
		header[i][0] = *(un32 *)svars[i].key;
		switch (svars[i].len)
		{
		case 1:
			d = *(byte *)svars[i].ptr;
			break;
		case 2:
			d = *(un16 *)svars[i].ptr;
			break;
		case 4:
			d = *(un32 *)svars[i].ptr;
			break;
		}
		header[i][1] = LIL(d);
	}
	header[i][0] = header[i][1] = 0;

	memcpy(buf+hiofs, ram.hi, sizeof ram.hi);
	memcpy(buf+palofs, lcd.pal, sizeof lcd.pal);
	memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam);
	memcpy(buf+wavofs, snd.wave, sizeof snd.wave);

	fseek(f, 0, SEEK_SET);
	fwrite(buf, 4096, 1, f);
	
	fseek(f, iramblock<<12, SEEK_SET);
	fwrite(ram.ibank, 4096, irl, f);
	
	fseek(f, vramblock<<12, SEEK_SET);
	fwrite(lcd.vbank, 4096, vrl, f);
	
	fseek(f, sramblock<<12, SEEK_SET);
	fwrite(ram.sbank, 4096, srl, f);
}
コード例 #4
0
ファイル: save.c プロジェクト: 4nykey/rockbox
void loadstate(int fd)
{
    int i, j;
    byte buf[4096];
    un32 (*header)[2] = (un32 (*)[2])buf;
    un32 d;
    int irl = hw.cgb ? 8 : 2;
    int vrl = hw.cgb ? 4 : 2;
    int srl = mbc.ramsize << 1;
    size_t base_offset;

    ver = hramofs = hiofs = palofs = oamofs = wavofs = 0;

    base_offset = lseek(fd, 0, SEEK_CUR);
  
    read(fd,buf, 4096);
    
    for (j = 0; header[j][0]; j++)
    {
        for (i = 0; svars[i].ptr; i++)
        {
            if (header[j][0] != svars[i].k.key)
                continue;
            d = LIL(header[j][1]);
            switch (svars[i].len)
            {
            case 1:
                *(byte *)svars[i].ptr = d;
                break;
            case 2:
                *(un16 *)svars[i].ptr = d;
                break;
            case 4:
                *(un32 *)svars[i].ptr = d;
                break;
            }
            break;
        }
    }

    /* obsolete as of version 0x104 */
    if (hramofs) memcpy(ram.hi+128, buf+hramofs, 127);
    if (wavofs) memcpy(ram.hi+48, buf+wavofs, 16);
    
    if (hiofs) memcpy(ram.hi, buf+hiofs, sizeof ram.hi);
    if (palofs) memcpy(lcd.pal, buf+palofs, sizeof lcd.pal);
    if (oamofs) memcpy(lcd.oam.mem, buf+oamofs, sizeof lcd.oam);

    lseek(fd, base_offset + (iramblock << 12), SEEK_SET);
    read(fd,ram.ibank, 4096*irl);
    
    lseek(fd, base_offset + (vramblock << 12), SEEK_SET);
    read(fd,lcd.vbank, 4096*vrl);
    
    lseek(fd, base_offset + (sramblock << 12), SEEK_SET);
    read(fd,ram.sbank, 4096*srl);
    vram_dirty();
    pal_dirty();
    sound_dirty();
    mem_updatemap();            
}
コード例 #5
0
ファイル: save.c プロジェクト: Kcchouette/AndroidEmu
void savestate(const char *filename)
{
	int i;
	byte *buf;//[4096];
	byte *bufptr;


	//menu_message("Saving");


	int irl = hw.cgb ? 8 : 2;
	int vrl = hw.cgb ? 4 : 2;
	int srl = mbc.ramsize << 1;
	int bufsize = (1 + irl + vrl + srl) * 4096;

	buf=(byte*)malloc(bufsize);
	bufptr = buf;
	un32 (*header)[2] = (un32 (*)[2])buf;
	un32 d = 0;

	ver = 0x105;
	iramblock = 1;
	vramblock = 1+irl;
	sramblock = 1+irl+vrl;
	wavofs = 4096 - 784;
	hiofs = 4096 - 768;
	palofs = 4096 - 512;
	oamofs = 4096 - 256;


	memset(buf, 0, 4096);

	for (i = 0; svars[i].len > 0; i++)
	{


		header[i][0] = *(un32 *)svars[i].key;

		switch (svars[i].len)
		{
		case 1:
			d = *(byte *)svars[i].ptr;
			break;
		case 2:
			d = *(un16 *)svars[i].ptr;
			break;
		case 4:
			d = *(un32 *)svars[i].ptr;

			break;
		}

		header[i][1] = LIL(d);

	}
	header[i][0] = header[i][1] = 0;


	memcpy(buf+hiofs, ram.hi, sizeof ram.hi);
	memcpy(buf+palofs, lcd.pal, sizeof lcd.pal);
	memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam);
	memcpy(buf+wavofs, snd.wave, sizeof snd.wave);

	bufptr += 4096;

	//fseek(f, iramblock<<12, SEEK_SET);
	memcpy(bufptr, ram.ibank, 4096 * irl);
	bufptr += 4096 * irl;

	//fseek(f, vramblock<<12, SEEK_SET);
	memcpy(bufptr, lcd.vbank, 4096 * vrl);
	bufptr += 4096 * vrl;

	//fseek(f, sramblock<<12, SEEK_SET);
	memcpy(bufptr, ram.sbank, 4096 * srl);
	bufptr += 4096 * srl;

	save_archive(filename, "GBCOID", buf, bufsize);

	free(buf);
}
コード例 #6
0
ファイル: save.c プロジェクト: Kcchouette/AndroidEmu
void loadstate(const char *filename)
{
	int i, j;
	byte *buf;//[4096];
	byte *bufptr;


	//menu_message("Loading");

	int irl = hw.cgb ? 8 : 2;
	int vrl = hw.cgb ? 4 : 2;
	int srl = mbc.ramsize << 1;
	int bufsize = (1 + irl + vrl + srl) * 4096;

	buf=(byte*)malloc(bufsize);
	bufptr = buf;

	int n = load_archive(filename, "GBCOID", buf, bufsize);
	if (n < 0) {
		FILE *file = fopen(filename, "rb");
		if (file != NULL) {
			n = fread(buf, 1, bufsize, file);
			fclose(file);
		}
	}
	if (n != bufsize) {
		free(buf);
		return;
	}

	un32 (*header)[2] = (un32 (*)[2])buf;
	un32 d;

	ver = hramofs = hiofs = palofs = oamofs = wavofs = 0;



	bufptr += 4096;

	for (j = 0; header[j][0]; j++)
	{
		for (i = 0; svars[i].ptr; i++)
		{
			if (header[j][0] != *(un32 *)svars[i].key)
				continue;
			d = LIL(header[j][1]);
			switch (svars[i].len)
			{
			case 1:
				*(byte *)svars[i].ptr = d;
				break;
			case 2:
				*(un16 *)svars[i].ptr = d;
				break;
			case 4:
				*(un32 *)svars[i].ptr = d;
				break;
			}
			break;
		}
	}

	/* obsolete as of version 0x104 */
	if (hramofs) memcpy(ram.hi+128, buf+hramofs, 127);

	if (hiofs) memcpy(ram.hi, buf+hiofs, sizeof ram.hi);
	if (palofs) memcpy(lcd.pal, buf+palofs, sizeof lcd.pal);
	if (oamofs) memcpy(lcd.oam.mem, buf+oamofs, sizeof lcd.oam);

	if (wavofs) memcpy(snd.wave, buf+wavofs, sizeof snd.wave);
	else memcpy(snd.wave, ram.hi+0x30, 16); /* patch data from older files */

	//fseek(f, iramblock<<12, SEEK_SET);
	memcpy(ram.ibank, bufptr, 4096 * irl);
	bufptr += 4096 * irl;

	//fseek(f, vramblock<<12, SEEK_SET);
	memcpy(lcd.vbank, bufptr, 4096 * vrl);
	bufptr += 4096 * vrl;

	//fseek(f, sramblock<<12, SEEK_SET);
	memcpy(ram.sbank, bufptr, 4096 * srl);
	bufptr += 4096 * srl;

	free(buf);
}