/* * 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; }
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); }
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; }