Beispiel #1
0
/*
 * VOP_WRITE
 */
static
int
emufs_write(struct vnode *v, struct uio *uio)
{
	struct emufs_vnode *ev = v->vn_data;
	uint32_t amt;
	size_t oldresid;
	int result;

	KASSERT(uio->uio_rw==UIO_WRITE);

	while (uio->uio_resid > 0) {
		amt = uio->uio_resid;
		if (amt > EMU_MAXIO) {
			amt = EMU_MAXIO;
		}

		oldresid = uio->uio_resid;

		result = emu_write(ev->ev_emu, ev->ev_handle, amt, uio);
		if (result) {
			return result;
		}

		if (uio->uio_resid == oldresid) {
			/* nothing written...? */
			break;
		}
	}

	return 0;
}
Beispiel #2
0
int gb_write(emu *e, ut64 addr, ut8 *buf, ut32 len)
{
	if(0x2000 <= addr && addr < 0x4000) {
		if(buf[0] == 0x20 || buf[0] == 0x40 || buf[0] == 0x60)
			return r_reg_set_value(e->reg, r_reg_get(e->reg, "mbcrom", -1), 0);
		if(!buf[0])
			return r_reg_set_value(e->reg, r_reg_get(e->reg, "mbcrom", -1), 0);
		return r_reg_set_value(e->reg, r_reg_get(e->reg, "mbcrom", -1), buf[0]-1);
	}
	if(0x4000 <= addr && addr < 0x6000) {
		if(!buf[0])
			return r_reg_set_value(e->reg, r_reg_get(e->reg, "mbcram", -1), 0);
		return r_reg_set_value(e->reg, r_reg_get(e->reg, "mbcram", -1), buf[0]-1);
	}
	if(0xa000 <= addr && addr < 0xc000)
		return emu_write(e, addr + (r_reg_getv(e->reg, "mbcram") << 16), buf, len);
	return emu_write(e, addr, buf, len);
}
Beispiel #3
0
int gb_set_vs_profile(emu *e)										//we need a parser here in /emu/vsection.c
{
	virtual_section_add(e, 0x8000, 0x2000, 7, "vram");
	virtual_section_add(e, 0xc000, 0x2000, 7, "internal_ram");
	virtual_section_add(e, 0xe000, 0x1dff, 0, "F**K YOU!");
	virtual_section_add(e, 0xfe00, 0xa0, 7, "OAM");
	virtual_section_add(e, 0xff00, 0x4c, 7, "IO-Ports");
	virtual_section_add(e, 0xff80, 0x7e, 7, "zram");
	virtual_section_add(e, 0xffff, 1, 7, "ie-flg");
	GBCpuStats *cpu;
	cpu = (GBCpuStats *) e->data;
	int i, j;
	switch(cpu->mbc->rambanks) {
		case GB_NO_RAMBANKS:
			i = 0;
			break;
		case GB_1_2K_RAMBANKS:
			virtual_section_add(e, 0xa000, 0x800, 7, "rambank00");
			i = 0;
			break;
		case GB_1_8K_RAMBANKS:
			virtual_section_add(e, 0xa000, 0x2000, 7, "rambank00");
			i = 0;
			break;
		default:
			switch(cpu->mbc->rambanks) {
				case GB_4_8K_RAMBANKS:
					i = 3;
					break;
				case GB_16_8K_RAMBANKS:
					i = 15;
					break;
			}
			break;
	}
	if(i) {
		char *name = malloc(VS_MAX_NAME_LEN+1);
		for(j=0;j<=i;j++) {
			snprintf(name, VS_MAX_NAME_LEN, "rambank%02x", j);
			virtual_section_add(e, 0xa000 + (0x10000*j), 0x2000, 7, name);
		}
		free(name);
	}
	ut8 wbuf = 0;
	emu_write(e, 0xff05, &wbuf, 1);
	emu_write(e, 0xff06, &wbuf, 1);
	emu_write(e, 0xff07, &wbuf, 1);
	emu_write(e, 0xff17, &wbuf, 1);
	emu_write(e, 0xff21, &wbuf, 1);
	emu_write(e, 0xff22, &wbuf, 1);
	emu_write(e, 0xff42, &wbuf, 1);
	emu_write(e, 0xff43, &wbuf, 1);
	emu_write(e, 0xff45, &wbuf, 1);
	emu_write(e, 0xff4a, &wbuf, 1);
	emu_write(e, 0xff4b, &wbuf, 1);
	emu_write(e, 0xffff, &wbuf, 1);
	wbuf = 0x80;
	emu_write(e, 0xff10, &wbuf, 1);
	wbuf = 0xbf;
	emu_write(e, 0xff11, &wbuf, 1);
	emu_write(e, 0xff14, &wbuf, 1);
	emu_write(e, 0xff19, &wbuf, 1);
	emu_write(e, 0xff1e, &wbuf, 1);
	wbuf = 0xf3;
	emu_write(e, 0xff12, &wbuf, 1);
	emu_write(e, 0xff25, &wbuf, 1);
	wbuf = 0x3f;
	emu_write(e, 0xff16, &wbuf, 1);
	wbuf = 0x7f;
	emu_write(e, 0xff1a, &wbuf, 1);
	wbuf = 0xff;
	emu_write(e, 0xff1b, &wbuf, 1);
	emu_write(e, 0xff20, &wbuf, 1);
	emu_write(e, 0xff48, &wbuf, 1);
	emu_write(e, 0xff49, &wbuf, 1);
	wbuf = 0x9f;
	emu_write(e, 0xff1c, &wbuf, 1);
	wbuf = 0x77;
	emu_write(e, 0xff24, &wbuf, 1);
	wbuf = 0xf3;
	emu_write(e, 0xff25, &wbuf, 1);
	wbuf = 0xf1;
	emu_write(e, 0xff26, &wbuf, 1);
	wbuf = 0x91;
	emu_write(e, 0xff40, &wbuf, 1);
	wbuf = 0xfc;
	emu_write(e, 0xff47, &wbuf, 1);
	return R_TRUE;
}