void __fastcall writemem_mapper_codies(UINT16 offset, UINT8 data) { switch(offset & 0xC000) { case 0x0000: sms_mapper_w(1, data); return; case 0x4000: sms_mapper_w(2, data); return; case 0x8000: sms_mapper_w(3, data); return; } }
void __fastcall writemem_mapper_sega(UINT16 offset, UINT8 data) { sms.wram[offset & 0x1fff] = data; if(offset >= 0xFFFC) sms_mapper_w(offset & 3, data); }
void system_load_state(void *fd) { int i; uint8 reg[0x40]; /* Initialize everything */ cpu_reset(); system_reset(); /* Load VDP context */ fread(&vdp, sizeof(t_vdp), 1, fd); /* Load SMS context */ fread(&sms, sizeof(t_sms), 1, fd); /* Load Z80 context */ fread(Z80_Context, sizeof(Z80_Regs), 1, fd); fread(&after_EI, sizeof(int), 1, fd); /* Load YM2413 registers */ fread(reg, 0x40, 1, fd); /* Load SN76489 context */ fread(&sn[0], sizeof(t_SN76496), 1, fd); /* Restore callbacks */ z80_set_irq_callback(sms_irq_callback); cpu_readmap[0] = cart.rom + 0x0000; /* 0000-3FFF */ cpu_readmap[1] = cart.rom + 0x2000; cpu_readmap[2] = cart.rom + 0x4000; /* 4000-7FFF */ cpu_readmap[3] = cart.rom + 0x6000; cpu_readmap[4] = cart.rom + 0x0000; /* 0000-3FFF */ cpu_readmap[5] = cart.rom + 0x2000; cpu_readmap[6] = sms.ram; cpu_readmap[7] = sms.ram; cpu_writemap[0] = sms.dummy; cpu_writemap[1] = sms.dummy; cpu_writemap[2] = sms.dummy; cpu_writemap[3] = sms.dummy; cpu_writemap[4] = sms.dummy; cpu_writemap[5] = sms.dummy; cpu_writemap[6] = sms.ram; cpu_writemap[7] = sms.ram; sms_mapper_w(3, sms.fcr[3]); sms_mapper_w(2, sms.fcr[2]); sms_mapper_w(1, sms.fcr[1]); sms_mapper_w(0, sms.fcr[0]); /* Force full pattern cache update */ is_vram_dirty = 1; memset(vram_dirty, 1, 0x200); /* Restore palette */ for(i = 0; i < PALETTE_SIZE; i += 1) palette_sync(i); /* Restore sound state */ if(snd.enabled) { /* Clear YM2413 context */ OPLL_reset(opll) ; OPLL_reset_patch(opll,0) ; /* if use default voice data. */ /* Restore rhythm enable first */ ym2413_write(0, 0, 0x0E); ym2413_write(0, 1, reg[0x0E]); /* User instrument settings */ for(i = 0x00; i <= 0x07; i += 1) { ym2413_write(0, 0, i); ym2413_write(0, 1, reg[i]); } /* Channel frequency */ for(i = 0x10; i <= 0x18; i += 1) { ym2413_write(0, 0, i); ym2413_write(0, 1, reg[i]); } /* Channel frequency + ctrl. */ for(i = 0x20; i <= 0x28; i += 1) { ym2413_write(0, 0, i); ym2413_write(0, 1, reg[i]); } /* Instrument and volume settings */ for(i = 0x30; i <= 0x38; i += 1) { ym2413_write(0, 0, i); ym2413_write(0, 1, reg[i]); } } }
int load_state_from_mem(void *stor) { int i; /* Initialize everything */ z80_reset(0); z80_set_irq_callback(sms_irq_callback); system_reset(); if(snd.enabled) sound_reset(); //davex: header is not saved in memory state // Load VDP context memcpy(&vdp, stor, sizeof(vdp_t)); //VDP context stor += sizeof(vdp_t); //Load SMS context (1/3) memcpy(&sms, stor, sizeof(sms_t) ); stor += sizeof(sms_t); //Load SMS context (2/3) memcpy(&cart.fcr[0],stor, 1 ); stor += 1; memcpy(&cart.fcr[1],stor, 1 ); stor += 1; memcpy(&cart.fcr[2],stor, 1 ); stor += 1; memcpy(&cart.fcr[3],stor, 1 ); stor += 1; //Load SMS context (3/3) memcpy(&cart.sram, stor, 0x8000); stor += 0x8000; // Load Z80 context memcpy(Z80_Context, stor, sizeof(Z80_Regs) ); stor += sizeof(Z80_Regs); memcpy(&after_EI, stor, sizeof(int) ); stor += sizeof(int); // Load YM2413 context FM_SetContext(stor); stor += FM_GetContextSize(); // Load SN76489 context SN76489_SetContext(0, stor); /* Restore callbacks */ z80_set_irq_callback(sms_irq_callback); for(i = 0x00; i <= 0x2F; i++) { cpu_readmap[i] = &cart.rom[(i & 0x1F) << 10]; cpu_writemap[i] = dummy_write; } for(i = 0x30; i <= 0x3F; i++) { cpu_readmap[i] = &sms.wram[(i & 0x07) << 10]; cpu_writemap[i] = &sms.wram[(i & 0x07) << 10]; } sms_mapper_w(3, cart.fcr[3]); sms_mapper_w(2, cart.fcr[2]); sms_mapper_w(1, cart.fcr[1]); sms_mapper_w(0, cart.fcr[0]); /* Force full pattern cache update */ bg_list_index = 0x200; for(i = 0; i < 0x200; i++) { bg_name_list[i] = i; bg_name_dirty[i] = -1; } /* Restore palette */ for(i = 0; i < PALETTE_SIZE; i++) palette_sync(i, 1); viewport_check(); return 1; }
void system_load_state(void *fd) { int i; uint8 *buf; char id[4]; uint16 version; /* Initialize everything */ z80_reset(0); z80_set_irq_callback(sms_irq_callback); system_reset(); if(snd.enabled) sound_reset(); /* Read header */ fread(id, 4, 1, fd); fread(&version, 2, 1, fd); /* Load VDP context */ fread(&vdp, sizeof(vdp_t), 1, fd); /* Load SMS context */ fread(&sms, sizeof(sms_t), 1, fd); cart.fcr[0] = fgetc(fd); cart.fcr[1] = fgetc(fd); cart.fcr[2] = fgetc(fd); cart.fcr[3] = fgetc(fd); fread(cart.sram, 0x8000, 1, fd); /* Load Z80 context */ fread(Z80_Context, sizeof(Z80_Regs), 1, fd); fread(&after_EI, sizeof(int), 1, fd); /* Load YM2413 context */ buf = malloc(FM_GetContextSize()); fread(buf, FM_GetContextSize(), 1, fd); FM_SetContext(buf); free(buf); /* Load SN76489 context */ buf = malloc(SN76489_GetContextSize()); fread(buf, SN76489_GetContextSize(), 1, fd); SN76489_SetContext(0, buf); free(buf); /* Restore callbacks */ z80_set_irq_callback(sms_irq_callback); for(i = 0x00; i <= 0x2F; i++) { cpu_readmap[i] = &cart.rom[(i & 0x1F) << 10]; cpu_writemap[i] = dummy_write; } for(i = 0x30; i <= 0x3F; i++) { cpu_readmap[i] = &sms.wram[(i & 0x07) << 10]; cpu_writemap[i] = &sms.wram[(i & 0x07) << 10]; } sms_mapper_w(3, cart.fcr[3]); sms_mapper_w(2, cart.fcr[2]); sms_mapper_w(1, cart.fcr[1]); sms_mapper_w(0, cart.fcr[0]); /* Force full pattern cache update */ bg_list_index = 0x200; for(i = 0; i < 0x200; i++) { bg_name_list[i] = i; bg_name_dirty[i] = -1; } /* Restore palette */ for(i = 0; i < PALETTE_SIZE; i++) palette_sync(i, 1); viewport_check(); }