Previous 15994 Revisions Next

r10331 Tuesday 8th February, 2011 at 07:48:21 UTC by Miodrag Milanović
Sync with MAME (save state)
[src/emu]devintrf.c devintrf.h diexec.c emu.h emucore.h emupal.c machine.c machine.h memory.c romload.h schedule.c schedule.h screen.c sound.c speaker.h state.c state.h tilemap.c timer.c video.c
[src/emu/cpu/arm]arm.c
[src/emu/cpu/cubeqcpu]cubeqcpu.c
[src/emu/cpu/g65816]g65816.c
[src/emu/cpu/h83002]h8_16.c h8_8.c
[src/emu/cpu/hd6309]hd6309.c
[src/emu/cpu/i386]i386.c
[src/emu/cpu/jaguar]jaguar.c
[src/emu/cpu/m37710]m37710.c
[src/emu/cpu/m68000]m68kcpu.c
[src/emu/cpu/mips]psx.c
[src/emu/cpu/tms34010]tms34010.c
[src/emu/debug]debugcmd.c dvmemory.c
[src/emu/machine]pci.c pit8253.c
[src/emu/sound]2151intf.c 2203intf.c 2608intf.c 2610intf.c 2612intf.c fm.c fm2612.c fmopl.c k054539.c msm5232.c pokey.c samples.c upd7759.c vlm5030.c ym2151.c ymz280b.c
[src/emu/video]mc6845.c pc_video.c poly.c tms9927.c voodoo.c
[src/mame]mamedriv.c
[src/mame/audio]8080bw.c cage.c dcs.c
[src/mame/drivers]20pacgal.c ace.c astrocde.c atarig1.c atarisy2.c atetris.c crystal.c darius.c djmain.c dynax.c forte2.c gottlieb.c liberatr.c m90.c m92.c mjsister.c mw8080bw.c mystwarr.c namcos10.c neogeo.c ninjaw.c othunder.c pengadvb.c psikyo4.c renegade.c sigmab98.c slapshot.c taito_f2.c taito_h.c taito_x.c taito_z.c taitoair.c topspeed.c vegas.c warriorb.c wgp.c xexex.c xmen.c
[src/mame/machine]atarigen.c midwayic.c naomibd.c nmk112.c psx.c s16fd.c s24fd.c simpsons.c tnzs.c toaplan1.c twincobr.c vertigo.c williams.c
[src/mame/video]40love.c atarimo.c cave.c chaknpop.c cloak.c cps1.c gradius3.c gridlee.c gtia.c hyprduel.c jaguar.c konamiic.c konicdev.c nemesis.c neogeo.c psx.c stvvdp1.c stvvdp2.c tail2nos.c taitoic.c toaplan1.c tumbleb.c twincobr.c ygv608.c
[src/mess/drivers]ng_aes.c supercon.c
[src/mess/machine]6883sam.c apple2.c apple2gs.c b2m.c coco.c comx35.c hp48.c lynx.c mac.c mboard.c nes.c thomson.c
[src/mess/video]coco3.c coco6847.c crtc_ega.c m6847.c pc_video_mess.c

src/mame/audio/cage.c
r10330r10331
183183
184184   state_save_register_global(machine, cpu_to_cage_ready);
185185   state_save_register_global(machine, cage_to_cpu_ready);
186   state_save_register_global(machine, serial_period_per_word.seconds);
187   state_save_register_global(machine, serial_period_per_word.attoseconds);
186   state_save_register_global(machine, serial_period_per_word);
188187   state_save_register_global(machine, dma_enabled);
189188   state_save_register_global(machine, dma_timer_enabled);
190189   state_save_register_global_array(machine, cage_timer_enabled);
src/mame/audio/dcs.c
r10330r10331
929929      state_save_register_global_pointer(machine, dcs_sram, 0x8000*4 / sizeof(dcs_sram[0]));
930930
931931   if (dcs.rev == 2)
932      state_save_register_postload(machine, sdrc_postload, NULL);
932      machine->state().register_postload(sdrc_postload, NULL);
933933}
934934
935935void dcs_init(running_machine *machine)
src/mame/audio/8080bw.c
r10330r10331
924924   state_save_register_global(machine, state->schaser_effect_555_is_low);
925925   state_save_register_global(machine, state->schaser_effect_555_time_remain_savable);
926926   state_save_register_global(machine, state->port_2_last_extra);
927   state_save_register_postload(machine, schaser_reinit_555_time_remain, NULL);
927   machine->state().register_postload(schaser_reinit_555_time_remain, NULL);
928928}
929929
930930
src/mame/machine/s16fd.c
r10330r10331
228228
229229   state_save_register_global(machine, fd1094_selected_state);
230230   state_save_register_global(machine, fd1094_state);
231   state_save_register_postload(machine, fd1094_postload, NULL);
231   machine->state().register_postload(fd1094_postload, NULL);
232232}
src/mame/machine/tnzs.c
r10330r10331
713713   state_save_register_global(machine, state->bank1);
714714   state_save_register_global(machine, state->bank2);
715715
716   state_save_register_postload(machine, tnzs_postload, NULL);
716   machine->state().register_postload(tnzs_postload, NULL);
717717}
718718
719719MACHINE_START( jpopnics )
r10330r10331
735735   state_save_register_global(machine, state->bank1);
736736   state_save_register_global(machine, state->bank2);
737737
738   state_save_register_postload(machine, tnzs_postload, NULL);
738   machine->state().register_postload(tnzs_postload, NULL);
739739}
740740
741741
src/mame/machine/twincobr.c
r10330r10331
345345   state_save_register_global(machine, twincobr_dsp_BIO);
346346   state_save_register_global(machine, dsp_execute);
347347   state_save_register_global(machine, fsharkbt_8741);
348   state_save_register_postload(machine, twincobr_restore_dsp, NULL);
348   machine->state().register_postload(twincobr_restore_dsp, NULL);
349349}
350350
351351MACHINE_RESET( wardner )
r10330r10331
369369   state_save_register_global(machine, twincobr_dsp_BIO);
370370   state_save_register_global(machine, dsp_execute);
371371   state_save_register_global(machine, wardner_membank);
372   state_save_register_postload(machine, wardner_restore_bank, NULL);   /* Restore the Main CPU bank */
373   state_save_register_postload(machine, twincobr_restore_dsp, NULL);
372   machine->state().register_postload(wardner_restore_bank, NULL);   /* Restore the Main CPU bank */
373   machine->state().register_postload(twincobr_restore_dsp, NULL);
374374}
src/mame/machine/midwayic.c
r10330r10331
258258static void pic_register_state(running_machine *machine)
259259{
260260   state_save_register_global(machine, pic.latch);
261   state_save_register_global(machine, pic.latch_expire_time.seconds);
262   state_save_register_global(machine, pic.latch_expire_time.attoseconds);
261   state_save_register_global(machine, pic.latch_expire_time);
263262   state_save_register_global(machine, pic.state);
264263   state_save_register_global(machine, pic.index);
265264   state_save_register_global(machine, pic.total);
src/mame/machine/toaplan1.c
r10330r10331
439439   state_save_register_global(machine, state->main_ram_seg);
440440   state_save_register_global(machine, state->dsp_BIO);
441441   state_save_register_global(machine, state->dsp_execute);
442   state_save_register_postload(machine, demonwld_restore_dsp, NULL);
442   machine->state().register_postload(demonwld_restore_dsp, NULL);
443443}
444444
445445MACHINE_RESET( vimana )
src/mame/machine/nmk112.c
r10330r10331
140140   nmk112->page_mask = ~intf->disable_page_mask;
141141
142142   state_save_register_device_item_array(device, 0, nmk112->current_bank);
143   state_save_register_postload(device->machine, nmk112_postload_bankswitch, nmk112);
143   device->machine->state().register_postload(nmk112_postload_bankswitch, nmk112);
144144}
145145
146146static DEVICE_RESET( nmk112 )
src/mame/machine/vertigo.c
r10330r10331
210210{
211211   state_save_register_global(machine, irq_state);
212212   state_save_register_global(machine, adc_result);
213   state_save_register_global(machine, irq4_time.seconds);
214   state_save_register_global(machine, irq4_time.attoseconds);
213   state_save_register_global(machine, irq4_time);
215214
216215   vertigo_vproc_init(machine);
217216}
src/mame/machine/atarigen.c
r10330r10331
165165   state_save_register_global(machine, state->playfield2_latch);
166166
167167   /* need a postload to reset the state */
168   state_save_register_postload(machine, slapstic_postload, NULL);
168   machine->state().register_postload(slapstic_postload, NULL);
169169}
170170
171171
src/mame/machine/naomibd.c
r10330r10331
413413{
414414   naomibd_state *v = get_safe_token(device);
415415
416   state_save_register_postload(device->machine, naomibd_postload, v);
416   device->machine->state().register_postload(naomibd_postload, v);
417417
418418   /* register states */
419419   state_save_register_device_item(device, 0, v->rom_offset);
src/mame/machine/s24fd.c
r10330r10331
179179
180180   state_save_register_global(machine, fd1094_selected_state);
181181   state_save_register_global(machine, fd1094_state);
182   state_save_register_postload(machine, s24_fd1094_postload, NULL);
182   machine->state().register_postload(s24_fd1094_postload, NULL);
183183}
src/mame/machine/psx.c
r10330r10331
17491749   state_save_register_global_array( machine, p_psx->mdec.p_n_quantize_uv );
17501750   state_save_register_global_array( machine, p_psx->mdec.p_n_cos );
17511751
1752   state_save_register_postload( machine, psx_postload, NULL );
1752   machine->state().register_postload( psx_postload, NULL );
17531753}
src/mame/machine/williams.c
r10330r10331
454454
455455   /* register for save states */
456456   state_save_register_global(machine, vram_bank);
457   state_save_register_postload(machine, williams2_postload, NULL);
457   machine->state().register_postload(williams2_postload, NULL);
458458}
459459
460460
r10330r10331
739739   /* configure the banking and make sure it is reset to 0 */
740740   memory_configure_bank(machine, "bank1", 0, 9, &machine->region("maincpu")->base()[0x10000], 0x1000);
741741
742   state_save_register_postload(machine, defender_postload, NULL);
742   machine->state().register_postload(defender_postload, NULL);
743743}
744744
745745
src/mame/machine/simpsons.c
r10330r10331
101101   state_save_register_global_pointer(machine, machine->generic.paletteram.u8, 0x1000);
102102   state_save_register_global_pointer(machine, state->xtraram, 0x1000);
103103   state_save_register_global_pointer(machine, state->spriteram, 0x1000 / 2);
104   state_save_register_postload(machine, simpsons_postload, NULL);
104   machine->state().register_postload(simpsons_postload, NULL);
105105}
106106
107107MACHINE_RESET( simpsons )
src/mame/mamedriv.c
r10330r10331
85158515
85168516   /* Sigma B98 */
85178517   DRIVER( gegege )   /* (c) 1997 Banpresto / Sigma */
8518   DRIVER( animalc )   /* 2000 Sammy */
8519   DRIVER( itazuram )   /* 2000 Sammy */
8520   DRIVER( pyenaget )   /* 2000 Sammy */
8521   DRIVER( haekaka )   /* 2002 Sammy */
8522   DRIVER( tdoboon )   /* 2002 Sammy */
85188523
85198524   /* IGS games ( www.igs.com.tw ) */
85208525   DRIVER( goldstar )   /* (c) 198? IGS */
src/mame/video/ygv608.c
r10330r10331
492492   state_save_register_item_2d_array(machine, "ygv608", NULL, 0, ygv608.scroll_data_table);
493493   state_save_register_item_2d_array(machine, "ygv608", NULL, 0, ygv608.colour_palette);
494494
495   state_save_register_postload(machine, ygv608_postload, NULL);
495   machine->state().register_postload(ygv608_postload, NULL);
496496}
497497
498498static void ygv608_exit(running_machine &machine)
src/mame/video/stvvdp1.c
r10330r10331
21302130   state_save_register_global(machine, stv_vdp1_clear_framebuffer_on_next_frame);
21312131   state_save_register_global(machine, stvvdp1_local_x);
21322132   state_save_register_global(machine, stvvdp1_local_y);
2133   state_save_register_postload(machine, stv_vdp1_state_save_postload, NULL);
2133   machine->state().register_postload(stv_vdp1_state_save_postload, NULL);
21342134   return 0;
21352135}
src/mame/video/twincobr.c
r10330r10331
161161   state_save_register_global(machine, twincobr_bg_ram_bank);
162162   state_save_register_global(machine, twincobr_flip_screen);
163163   state_save_register_global(machine, wardner_sprite_hack);
164   state_save_register_postload(machine, twincobr_restore_screen, NULL);
164   machine->state().register_postload(twincobr_restore_screen, NULL);
165165}
166166
167167static STATE_POSTLOAD( twincobr_restore_screen )
src/mame/video/stvvdp2.c
r10330r10331
54625462   state_save_register_global_pointer(machine, stv_vdp2_regs, 0x040000/4);
54635463   state_save_register_global_pointer(machine, stv_vdp2_vram, 0x100000/4);
54645464   state_save_register_global_pointer(machine, stv_vdp2_cram, 0x080000/4);
5465   state_save_register_postload(machine, stv_vdp2_state_save_postload, NULL);
5465   machine->state().register_postload(stv_vdp2_state_save_postload, NULL);
54665466
54675467   return 0;
54685468}
src/mame/video/chaknpop.c
r10330r10331
181181   memory_set_bank(machine, "bank1", 0);
182182   tx_tilemap_mark_all_dirty(machine);
183183
184   state_save_register_postload(machine, chaknpop_postload, NULL);
184   machine->state().register_postload(chaknpop_postload, NULL);
185185}
186186
187187
src/mame/video/cloak.c
r10330r10331
192192   state_save_register_global_pointer(machine, state->bitmap_videoram1, 256*256);
193193   state_save_register_global_pointer(machine, state->bitmap_videoram2, 256*256);
194194   state_save_register_global_pointer(machine, state->palette_ram, NUM_PENS);
195   state_save_register_postload(machine, cloak_postload, NULL);
195   machine->state().register_postload(cloak_postload, NULL);
196196}
197197
198198static void draw_bitmap(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
src/mame/video/psx.c
r10330r10331
749749   }
750750
751751   // icky!!!
752   state_save_register_memory( machine, "globals", NULL, 0, "m_packet", (UINT8 *)&p_psxgpu->m_packet, 1, sizeof( p_psxgpu->m_packet ), __FILE__, __LINE__ );
752   machine->state().save_memory( "globals", NULL, 0, "m_packet", (UINT8 *)&p_psxgpu->m_packet, 1, sizeof( p_psxgpu->m_packet ) );
753753
754754   state_save_register_global_pointer( machine, p_psxgpu->p_vram, p_psxgpu->n_vram_size );
755755   state_save_register_global( machine, p_psxgpu->n_gpu_buffer_offset );
r10330r10331
783783   state_save_register_global( machine, p_psxgpu->n_iy );
784784   state_save_register_global( machine, p_psxgpu->n_ti );
785785
786   state_save_register_postload( machine, updatevisiblearea, NULL );
786   machine->state().register_postload( updatevisiblearea, NULL );
787787   machine->driver_data<psx_state>()->p_psxgpu = p_psxgpu;
788788}
789789
src/mame/video/atarimo.c
r10330r10331
295295   state_save_register_item(machine, "atarimo", NULL, index, mo->dirtyheight);
296296#endif
297297
298   state_save_register_bitmap(machine, "atarimo", NULL, index, "bitmap", mo->bitmap, __FILE__, __LINE__);
298   machine->state().save_item("atarimo", NULL, index, *mo->bitmap, "bitmap");
299299
300   state_save_register_memory(machine, "atarimo", NULL, index, "spriteram", mo->spriteram, sizeof(atarimo_entry), mo->spriteramsize, __FILE__, __LINE__);
300   machine->state().save_memory("atarimo", NULL, index, "spriteram", mo->spriteram, sizeof(atarimo_entry), mo->spriteramsize);
301301
302302   state_save_register_item_pointer(machine, "atarimo", NULL, index, mo->codelookup, round_to_powerof2(mo->codemask.mask));
303303
src/mame/video/taitoic.c
r10330r10331
10211021
10221022   state_save_register_device_item_pointer(device, 0, pc080sn->ram, PC080SN_RAM_SIZE / 2);
10231023   state_save_register_device_item_array(device, 0, pc080sn->ctrl);
1024   state_save_register_postload(device->machine, pc080sn_restore_scroll, pc080sn);
1024   device->machine->state().register_postload(pc080sn_restore_scroll, pc080sn);
10251025}
10261026
10271027
r10330r10331
19071907   device->machine->gfx[tc0080vco->tx_gfx] = gfx_element_alloc(device->machine, &tc0080vco_charlayout, (UINT8 *)tc0080vco->char_ram, 64, 0);
19081908
19091909   state_save_register_device_item_pointer(device, 0, tc0080vco->ram, TC0080VCO_RAM_SIZE / 2);
1910   state_save_register_postload(device->machine, tc0080vco_postload, tc0080vco);
1910   device->machine->state().register_postload(tc0080vco_postload, tc0080vco);
19111911}
19121912
19131913/***************************************************************************/
r10330r10331
25172517   state_save_register_device_item_array(device, 0, tc0100scn->ctrl);
25182518   state_save_register_device_item(device, 0, tc0100scn->dblwidth);
25192519   state_save_register_device_item(device, 0, tc0100scn->gfxbank);
2520   state_save_register_postload(device->machine, tc0100scn_postload, tc0100scn);
2520   device->machine->state().register_postload(tc0100scn_postload, tc0100scn);
25212521}
25222522
25232523
r10330r10331
37273727   state_save_register_device_item_pointer(device, 0, tc0480scp->ram, TC0480SCP_RAM_SIZE / 2);
37283728   state_save_register_device_item_array(device, 0, tc0480scp->ctrl);
37293729   state_save_register_device_item(device, 0, tc0480scp->dblwidth);
3730   state_save_register_postload(device->machine, tc0480scp_postload, tc0480scp);
3730   device->machine->state().register_postload(tc0480scp_postload, tc0480scp);
37313731}
37323732
37333733static DEVICE_RESET( tc0480scp )
r10330r10331
47604760
47614761   state_save_register_device_item_pointer(device, 0, tc0110pcr->ram, TC0110PCR_RAM_SIZE);
47624762   state_save_register_device_item(device, 0, tc0110pcr->type);
4763   state_save_register_postload(device->machine, tc0110pcr_restore_colors, tc0110pcr);
4763   device->machine->state().register_postload(tc0110pcr_restore_colors, tc0110pcr);
47644764}
47654765
47664766static DEVICE_RESET( tc0110pcr )
src/mame/video/cps1.c
r10330r10331
21672167      state_save_register_global_pointer(machine, state->cps2_buffered_obj, state->cps2_obj_size / 2);
21682168   }
21692169
2170   state_save_register_postload(machine, cps_postload, NULL);
2170   machine->state().register_postload(cps_postload, NULL);
21712171}
21722172
21732173VIDEO_START( cps1 )
src/mame/video/hyprduel.c
r10330r10331
381381   /* Set up save state */
382382   state_save_register_global(machine, state->sprite_xoffs);
383383   state_save_register_global(machine, state->sprite_yoffs);
384   state_save_register_postload(machine, hyprduel_postload, NULL);
384   machine->state().register_postload(hyprduel_postload, NULL);
385385}
386386
387387VIDEO_START( hyprduel_14220 )
src/mame/video/toaplan1.c
r10330r10331
360360
361361   register_common(machine);
362362
363   state_save_register_postload(machine, rallybik_flipscreen, NULL);
363   machine->state().register_postload(rallybik_flipscreen, NULL);
364364}
365365
366366VIDEO_START( toaplan1 )
r10330r10331
384384
385385   register_common(machine);
386386
387   state_save_register_postload(machine, toaplan1_flipscreen, NULL);
387   machine->state().register_postload(toaplan1_flipscreen, NULL);
388388}
389389
390390
src/mame/video/gtia.c
r10330r10331
139139   state_save_register_global(machine, gtia.w.gractl);
140140   state_save_register_global(machine, gtia.w.hitclr);
141141   state_save_register_global(machine, gtia.w.cons);
142   state_save_register_postload(machine, gtia_state_postload, NULL);
142   machine->state().register_postload(gtia_state_postload, NULL);
143143}
144144
145145
src/mame/video/jaguar.c
r10330r10331
915915   state_save_register_global_array(machine, blitter_regs);
916916   state_save_register_global_array(machine, gpu_regs);
917917   state_save_register_global(machine, cpu_irq_state);
918   state_save_register_postload(machine, cojag_postload, NULL);
918   machine->state().register_postload(cojag_postload, NULL);
919919}
920920
921921
src/mame/video/nemesis.c
r10330r10331
330330   gfx_element_set_source(machine->gfx[7], (UINT8 *)state->charram);
331331
332332   /* Set up save state */
333   state_save_register_postload(machine, nemesis_postload, NULL);
333   machine->state().register_postload(nemesis_postload, NULL);
334334}
335335
336336
src/mame/video/gridlee.c
r10330r10331
9191
9292    state_save_register_global(machine, gridlee_cocktail_flip);
9393    state_save_register_global(machine, palettebank_vis);
94    state_save_register_postload(machine, expand_pixels, NULL);
94    machine->state().register_postload(expand_pixels, NULL);
9595}
9696
9797
src/mame/video/40love.c
r10330r10331
123123   state_save_register_global_bitmap(machine, state->tmp_bitmap1);
124124   state_save_register_global_bitmap(machine, state->tmp_bitmap2);
125125   state_save_register_global(machine, state->pixram_sel);
126   state_save_register_postload(machine, redraw_pixels, NULL);
126   machine->state().register_postload(redraw_pixels, NULL);
127127}
128128
129129
src/mame/video/tail2nos.c
r10330r10331
6565   state->zoomdata = (UINT16 *)machine->region("gfx3")->base();
6666
6767   state_save_register_global_pointer(machine, state->zoomdata, 0x20000 / 2);
68   state_save_register_postload(machine, tail2nos_postload, NULL);
68   machine->state().register_postload(tail2nos_postload, NULL);
6969}
7070
7171
src/mame/video/konamiic.c
r10330r10331
20692069   state_save_register_global_array(machine, K052109_dy);
20702070   state_save_register_global(machine, has_extra_video_ram);
20712071
2072   state_save_register_postload(machine, K052109_tileflip_reset, NULL);
2072   machine->state().register_postload(K052109_tileflip_reset, NULL);
20732073}
20742074
20752075READ8_HANDLER( K052109_r )
r10330r10331
51285128   K053251_set_tilemaps(NULL,NULL,NULL,NULL,NULL);
51295129
51305130   state_save_register_global_array(machine, K053251_ram);
5131   state_save_register_postload(machine, K053251_reset_indexes, NULL);
5131   machine->state().register_postload(K053251_reset_indexes, NULL);
51325132}
51335133
51345134void K053251_set_tilemaps(tilemap_t *ci0,tilemap_t *ci1,tilemap_t *ci2,tilemap_t *ci3,tilemap_t *ci4)
r10330r10331
59015901   state_save_register_global_array(machine, K056832_dy);
59025902   state_save_register_global_array(machine, K056832_LayerTileMode);
59035903
5904   state_save_register_postload(machine, K056832_postload, NULL);
5904   machine->state().register_postload(K056832_postload, NULL);
59055905}
59065906
59075907/* call if a game uses external linescroll */
src/mame/video/tumbleb.c
r10330r10331
507507   state->sprite_xoffset = -1;
508508   state->sprite_yoffset = 0;
509509
510   state_save_register_postload(machine, tumbleb_tilemap_redraw, NULL);
510   machine->state().register_postload(tumbleb_tilemap_redraw, NULL);
511511}
512512
513513
r10330r10331
525525   state->sprite_xoffset = -1;
526526   state->sprite_yoffset = 0;
527527
528   state_save_register_postload(machine, tumbleb_tilemap_redraw, NULL);
528   machine->state().register_postload(tumbleb_tilemap_redraw, NULL);
529529}
530530
531531VIDEO_START( sdfight )
r10330r10331
543543   state->sprite_xoffset = 0;
544544   state->sprite_yoffset = 1;
545545
546   state_save_register_postload(machine, tumbleb_tilemap_redraw, NULL);
546   machine->state().register_postload(tumbleb_tilemap_redraw, NULL);
547547}
548548
549549VIDEO_START( fncywld )
r10330r10331
560560   state->sprite_xoffset = -1;
561561   state->sprite_yoffset = 0;
562562
563   state_save_register_postload(machine, tumbleb_tilemap_redraw, NULL);
563   machine->state().register_postload(tumbleb_tilemap_redraw, NULL);
564564}
565565
566566VIDEO_START( jumppop )
r10330r10331
583583   state->sprite_xoffset = -1;
584584   state->sprite_yoffset = 0;
585585
586   state_save_register_postload(machine, tumbleb_tilemap_redraw, NULL);
586   machine->state().register_postload(tumbleb_tilemap_redraw, NULL);
587587}
588588
589589
r10330r10331
597597
598598   tilemap_set_transparent_pen(state->pf1_alt_tilemap, 0);
599599
600   state_save_register_postload(machine, tumbleb_tilemap_redraw, NULL);
600   machine->state().register_postload(tumbleb_tilemap_redraw, NULL);
601601}
602602
603603/******************************************************************************/
src/mame/video/gradius3.c
r10330r10331
8888
8989   gfx_element_set_source(machine->gfx[0], (UINT8 *)state->gfxram);
9090
91   state_save_register_postload(machine, gradius3_postload, NULL);
91   machine->state().register_postload(gradius3_postload, NULL);
9292}
9393
9494
src/mame/video/konicdev.c
r10330r10331
27462746   state_save_register_device_item_array(device, 0, k052109->dx);
27472747   state_save_register_device_item_array(device, 0, k052109->dy);
27482748   state_save_register_device_item(device, 0, k052109->has_extra_video_ram);
2749   state_save_register_postload(device->machine, k052109_tileflip_reset, k052109);
2749   device->machine->state().register_postload(k052109_tileflip_reset, k052109);
27502750}
27512751
27522752static DEVICE_RESET( k052109 )
r10330r10331
57575757   state_save_register_device_item(device, 0, k053251->tilemaps_set);
57585758   state_save_register_device_item_array(device, 0, k053251->dirty_tmap);
57595759
5760   state_save_register_postload(device->machine, k053251_reset_indexes, k053251);
5760   device->machine->state().register_postload(k053251_reset_indexes, k053251);
57615761}
57625762
57635763static DEVICE_RESET( k053251 )
r10330r10331
80038003      state_save_register_device_item(device, i, k056832->last_colorbase[i]);
80048004   }
80058005
8006   state_save_register_postload(device->machine, k056832_postload, k056832);
8006   device->machine->state().register_postload(k056832_postload, k056832);
80078007}
80088008
80098009/***************************************************************************/
src/mame/video/neogeo.c
r10330r10331
892892   state_save_register_global(machine, state->auto_animation_counter);
893893   state_save_register_global(machine, state->auto_animation_frame_counter);
894894
895   state_save_register_postload(machine, regenerate_pens, NULL);
895   machine->state().register_postload(regenerate_pens, NULL);
896896
897897   state->region_zoomy = machine->region("zoomy")->base();
898898}
src/mame/video/cave.c
r10330r10331
794794   state_save_register_global(machine, state->blit.clip_top);
795795   state_save_register_global(machine, state->blit.clip_bottom);
796796
797   state_save_register_postload(machine, cave_sprite_postload, NULL);
797   machine->state().register_postload(cave_sprite_postload, NULL);
798798}
799799
800800static void cave_sprite_check( screen_device &screen, const rectangle *clip )
src/mame/drivers/forte2.c
r10330r10331
107107
108108   /* register for save states */
109109   state_save_register_global(machine, forte2_input_mask);
110   state_save_register_postload(machine, forte2, NULL);
110   machine->state().register_postload(forte2, NULL);
111111}
112112
113113static MACHINE_RESET( forte2 )
src/mame/drivers/namcos10.c
r10330r10331
565565   ROM_REGION32_LE( 0x400000, "user1", 0 ) /* bios */
566566   ROM_FILL( 0x0000000, 0x400000, 0x55 )
567567
568   ROM_REGION( 0x4000000, "user2", 0 ) /* main prg */
569   ROM_LOAD( "10011a_0.bin", 0x0000000, 0x1000000, BAD_DUMP CRC(853e329e) SHA1(dd272ab2de9052c5aeee9e0ead4ee3d14347593e) )
570   ROM_LOAD( "10011a_1.bin", 0x1000000, 0x1000000, BAD_DUMP CRC(7d4e96f7) SHA1(41b0d27b93662f15547311c8723ac5141e129cab) )
571   ROM_LOAD( "10011a_2.bin", 0x2000000, 0x1000000, BAD_DUMP CRC(83111de6) SHA1(d760fd41644104f6d3a2806ab4664df2c77bdc42) )
572   ROM_LOAD( "10011a_3.bin", 0x3000000, 0x1000000, BAD_DUMP CRC(b6ea8be7) SHA1(3e65deda2b0e6758ce0ed05419ed096efb8ad755) )
568   ROM_REGION( 0x4200000, "user2", 0 ) /* main prg */
569   ROM_LOAD( "10011a_0.bin", 0x0000000, 0x1080000, CRC(df862033) SHA1(4141357ed315adb4de636d7bf752354e953e8cbf) )
570   ROM_LOAD( "10011a_1.bin", 0x1080000, 0x1080000, CRC(734c7ac0) SHA1(2f325236a4e4f2dba886682e9a7e8e243b5fbb3d) )
571   ROM_LOAD( "10011a_2.bin", 0x2100000, 0x1080000, CRC(3bbbc0b7) SHA1(ad02ec2e5f401f0f5d40a413038649ebd25d5343) )
572   ROM_LOAD( "10011a_3.bin", 0x3180000, 0x1080000, CRC(fb0de5ca) SHA1(50a462a52ff4a0bc112b9d89f2b2d032c60cf59c) )
573573ROM_END
574574
575575ROM_START( mrdrilrg )
576576   ROM_REGION32_LE( 0x400000, "user1", 0 ) /* bios */
577577   ROM_FILL( 0x0000000, 0x400000, 0x55 )
578578
579   ROM_REGION( 0x3000000, "user2", 0 ) /* main prg */
580   ROM_LOAD( "drg1a_0.bin",  0x0000000, 0x1000000, BAD_DUMP CRC(1e5595f1) SHA1(0373ccb6e4b6fe96010afbb9657c3c0b2b02dd57) )
581   ROM_LOAD( "drg1a_1.bin",  0x1000000, 0x1000000, BAD_DUMP CRC(4db3a361) SHA1(d6a4fb682ab75cd98a9a960c244e94cacd367f12) )
582   ROM_LOAD( "drg1a_2.bin",  0x2000000, 0x1000000, BAD_DUMP CRC(c99ffa30) SHA1(fdcc0a348fe705c5ed1611170570f2fd9068525a) )
579   ROM_REGION( 0x3180000, "user2", 0 ) /* main prg */
580   ROM_LOAD( "drg1a_0.bin",  0x0000000, 0x1080000, CRC(e0801878) SHA1(fbb771c1e76e0690f6dffed2287eb470b561ec20) )
581   ROM_LOAD( "drg1a_1.bin",  0x1080000, 0x1080000, CRC(4d8cde73) SHA1(62a5fab8be8fd0a6bfeb101020d4cf58866a757c) )
582   ROM_LOAD( "drg1a_2.bin",  0x2100000, 0x1080000, CRC(ccfabf7b) SHA1(0cbd91ce8abd6efca5d427b52279ce265f685aa9) )
583583ROM_END
584584
585585ROM_START( knpuzzle )
586586   ROM_REGION32_LE( 0x400000, "user1", 0 ) /* bios */
587587   ROM_FILL( 0x0000000, 0x400000, 0x55 )
588588
589   ROM_REGION( 0x3000000, "user2", 0 ) /* main prg */
590   ROM_LOAD( "kpm1a_0.bin",  0x0000000, 0x1000000, BAD_DUMP CRC(606d001b) SHA1(5a94e56a164a9132af7f9bd51cae0674dbe0e036) )
591   ROM_LOAD( "kpm1a_1.bin",  0x1000000, 0x1000000, BAD_DUMP CRC(a506d767) SHA1(f4830edc8eaa42ff80e83aca2fa38a4d2807c667) )
592   ROM_LOAD( "kpm1a_2.bin",  0x2000000, 0x1000000, BAD_DUMP CRC(5f40c402) SHA1(2a56421c0f0c9cc5b7b93ddacfc6f3d214a946d9) )
589   ROM_REGION( 0x3180000, "user2", 0 ) /* main prg */
590   ROM_LOAD( "kpm1a_0.bin",  0x0000000, 0x1080000, CRC(b2947eb8) SHA1(fa941bf3598bb25d2c8f0a93154e32bf78a6507c) )
591   ROM_LOAD( "kpm1a_1.bin",  0x1080000, 0x1080000, CRC(f3aa855a) SHA1(87b94e22db4bc4169324bbff93c4ea19c1d99b40) )
592   ROM_LOAD( "kpm1a_2.bin",  0x2100000, 0x1080000, CRC(b297cc8d) SHA1(c3494e7a8a0b4e0c8c40b99121373effbfe848eb) )
593593ROM_END
594594
595595ROM_START( startrgn )
596596   ROM_REGION32_LE( 0x400000, "user1", 0 ) /* bios */
597597   ROM_FILL( 0x0000000, 0x400000, 0x55 )
598598
599   ROM_REGION( 0x2000000, "user2", 0 ) /* main prg */
600   ROM_LOAD( "stt1a_0.bin",  0x0000000, 0x1000000, BAD_DUMP CRC(07513d66) SHA1(baed445ff81e7f687e39b26648b3fe2ff601826b) )
601   ROM_LOAD( "stt1a_1.bin",  0x1000000, 0x1000000, BAD_DUMP CRC(f6e8e641) SHA1(37c8c1482d652b46a744252721299448b15e1027) )
599   ROM_REGION( 0x2100000, "user2", 0 ) /* main prg */
600   ROM_LOAD( "stt1a_0.bin",  0x0000000, 0x1080000, CRC(1e090644) SHA1(a7a293e2bd9eea2eb64a492a47272d9d9ee2c724) )
601   ROM_LOAD( "stt1a_1.bin",  0x1080000, 0x1080000, CRC(aa527694) SHA1(a25dcbeca58a1443070848b3487a24d51d41a34b) )
602602ROM_END
603603
604604ROM_START( gamshara )
src/mame/drivers/mw8080bw.c
r10330r10331
900900
901901   /* setup for save states */
902902   state_save_register_global(machine, state->maze_tone_timing_state);
903   state_save_register_postload(machine, maze_update_discrete, NULL);
903   machine->state().register_postload(maze_update_discrete, NULL);
904904
905905   MACHINE_START_CALL(mw8080bw);
906906}
src/mame/drivers/liberatr.c
r10330r10331
146146{
147147   atarigen_state::machine_start();
148148
149   state_save_register_device_item(this, 0, m_trackball_offset);
150   state_save_register_device_item(this, 0, m_ctrld);
151   state_save_register_device_item_array(this, 0, m_videoram);
149   save_item(NAME(m_trackball_offset));
150   save_item(NAME(m_ctrld));
151   save_item(NAME(m_videoram));
152152}
153153
154154
src/mame/drivers/pengadvb.c
r10330r10331
248248   state_save_register_global_pointer(machine, main_mem, 0x4000);
249249   state_save_register_global(machine, mem_map);
250250   state_save_register_global_array(machine, mem_banks);
251   state_save_register_postload(machine, pengadvb, NULL);
251   machine->state().register_postload(pengadvb, NULL);
252252}
253253
254254static MACHINE_RESET( pengadvb )
src/mame/drivers/darius.c
r10330r10331
899899   state_save_register_global(machine, state->nmi_enable);
900900   state_save_register_global_array(machine, state->vol);
901901   state_save_register_global_array(machine, state->pan);
902   state_save_register_postload(machine, darius_postload, NULL);
902   machine->state().register_postload(darius_postload, NULL);
903903}
904904
905905
src/mame/drivers/wgp.c
r10330r10331
964964   state_save_register_global(machine, state->cpua_ctrl);
965965   state_save_register_global(machine, state->banknum);
966966   state_save_register_global(machine, state->port_sel);
967   state_save_register_postload(machine, wgp_postload, NULL);
967   machine->state().register_postload(wgp_postload, NULL);
968968}
969969
970970static const tc0100scn_interface wgp_tc0100scn_intf =
src/mame/drivers/taitoair.c
r10330r10331
630630      state_save_register_item(machine, "globals", NULL, i, state->q.p[i].y);
631631   }
632632
633   state_save_register_postload(machine, taitoair_postload, NULL);
633   machine->state().register_postload(taitoair_postload, NULL);
634634}
635635
636636static MACHINE_RESET( taitoair )
src/mame/drivers/atarisy2.c
r10330r10331
230230   state_save_register_global(machine, state->which_adc);
231231   state_save_register_global(machine, state->p2portwr_state);
232232   state_save_register_global(machine, state->p2portrd_state);
233   state_save_register_postload(machine, bankselect_postload, NULL);
233   machine->state().register_postload(bankselect_postload, NULL);
234234   state_save_register_global(machine, state->sound_reset_state);
235235}
236236
src/mame/drivers/mjsister.c
r10330r10331
467467   state_save_register_global(machine, state->dac_bank);
468468   state_save_register_global(machine, state->dac_adr_s);
469469   state_save_register_global(machine, state->dac_adr_e);
470   state_save_register_postload(machine, mjsister_redraw, 0);
470   machine->state().register_postload(mjsister_redraw, 0);
471471}
472472
473473static MACHINE_RESET( mjsister )
src/mame/drivers/renegade.c
r10330r10331
265265   state_save_register_global(machine, mcu_key);
266266
267267   state_save_register_global(machine, bank);
268   state_save_register_postload(machine, renegade_postload, NULL);
268   machine->state().register_postload(renegade_postload, NULL);
269269}
270270
271271static DRIVER_INIT( renegade )
src/mame/drivers/taito_h.c
r10330r10331
534534   state->tc0080vco = machine->device("tc0080vco");
535535
536536   state_save_register_global(machine, state->banknum);
537   state_save_register_postload(machine, taitoh_postload, NULL);
537   machine->state().register_postload(taitoh_postload, NULL);
538538}
539539
540540
src/mame/drivers/slapshot.c
r10330r10331
547547
548548   state->banknum = 0;
549549   state_save_register_global(machine, state->banknum);
550   state_save_register_postload(machine, slapshot_postload, NULL);
550   machine->state().register_postload(slapshot_postload, NULL);
551551}
552552
553553
src/mame/drivers/topspeed.c
r10330r10331
662662   state_save_register_global(machine, state->cpua_ctrl);
663663   state_save_register_global(machine, state->ioc220_port);
664664   state_save_register_global(machine, state->banknum);
665   state_save_register_postload(machine, topspeed_postload, NULL);
665   machine->state().register_postload(topspeed_postload, NULL);
666666}
667667
668668static MACHINE_RESET( topspeed )
src/mame/drivers/atarig1.c
r10330r10331
11761176      pitfightb_cheap_slapstic_init(machine);
11771177      state_save_register_global(machine, state->bslapstic_bank);
11781178      state_save_register_global(machine, state->bslapstic_primed);
1179      state_save_register_postload(machine, pitfightb_state_postload, NULL);
1179      machine->state().register_postload(pitfightb_state_postload, NULL);
11801180   }
11811181   else if (slapstic != 0)
11821182      atarigen_slapstic_init(machine->device("maincpu"), slapstic_base, 0, slapstic);
src/mame/drivers/m90.c
r10330r10331
11481148   set_m90_bank(machine);
11491149
11501150   state_save_register_global(machine, bankaddress);
1151   state_save_register_postload(machine, quizf1_postload, NULL);
1151   machine->state().register_postload(quizf1_postload, NULL);
11521152}
11531153
11541154
src/mame/drivers/djmain.c
r10330r10331
14421442   state_save_register_global(machine, v_ctrl);
14431443   state_save_register_global_array(machine, obj_regs);
14441444
1445   state_save_register_postload(machine, djmain_postload, NULL);
1445   machine->state().register_postload(djmain_postload, NULL);
14461446}
14471447
14481448
src/mame/drivers/neogeo.c
r10330r10331
11021102   state_save_register_global(machine, state->led2_value);
11031103   state_save_register_global(machine, state->recurse);
11041104
1105   state_save_register_postload(machine, neogeo_postload, NULL);
1105   machine->state().register_postload(neogeo_postload, NULL);
11061106}
11071107
11081108
src/mame/drivers/taito_f2.c
r10330r10331
57445744   state_save_register_global(machine, state->driveout_sound_latch);
57455745   state_save_register_global(machine, state->oki_bank);
57465746   state_save_register_global(machine, state->nibble);
5747   state_save_register_postload(machine, driveout_postload, NULL);
5747   machine->state().register_postload(driveout_postload, NULL);
57485748}
57495749
57505750
src/mame/drivers/gottlieb.c
r10330r10331
294294      state_save_register_global_pointer(machine, laserdisc_audio_buffer, AUDIORAM_SIZE);
295295      state_save_register_global(machine, laserdisc_audio_address);
296296      state_save_register_global_array(machine, laserdisc_last_samples);
297      state_save_register_global(machine, laserdisc_last_time.seconds);
298      state_save_register_global(machine, laserdisc_last_time.attoseconds);
299      state_save_register_global(machine, laserdisc_last_clock.seconds);
300      state_save_register_global(machine, laserdisc_last_clock.attoseconds);
297      state_save_register_global(machine, laserdisc_last_time);
298      state_save_register_global(machine, laserdisc_last_clock);
301299      state_save_register_global(machine, laserdisc_zero_seen);
302300      state_save_register_global(machine, laserdisc_audio_bits);
303301      state_save_register_global(machine, laserdisc_audio_bit_count);
src/mame/drivers/m92.c
r10330r10331
233233   state_save_register_global(machine, state->irqvector);
234234   state_save_register_global(machine, state->sound_status);
235235   state_save_register_global(machine, state->bankaddress);
236   state_save_register_postload(machine, m92_postload, NULL);
236   machine->state().register_postload(m92_postload, NULL);
237237
238238   state->scanline_timer = machine->scheduler().timer_alloc(FUNC(m92_scanline_interrupt));
239239}
src/mame/drivers/crystal.c
r10330r10331
585585   state_save_register_global(machine, state->PIO);
586586   state_save_register_global_array(machine, state->DMActrl);
587587   state_save_register_global(machine, state->OldPort4);
588   state_save_register_postload(machine, crystal_banksw_postload, NULL);
588   machine->state().register_postload(crystal_banksw_postload, NULL);
589589}
590590
591591static MACHINE_RESET( crystal )
src/mame/drivers/dynax.c
r10330r10331
49334933{
49344934   MACHINE_START_CALL(dynax);
49354935
4936   state_save_register_postload(machine, tenkai_bank_postload, NULL);
4936   machine->state().register_postload(tenkai_bank_postload, NULL);
49374937}
49384938
49394939static MACHINE_CONFIG_START( tenkai, dynax_state )
r10330r10331
49964996{
49974997   MACHINE_START_CALL(dynax);
49984998
4999   state_save_register_postload(machine, gekisha_bank_postload, NULL);
4999   machine->state().register_postload(gekisha_bank_postload, NULL);
50005000}
50015001
50025002static MACHINE_RESET( gekisha )
src/mame/drivers/sigmab98.c
r10330r10331
11/*************************************************************************************************************
22
3                                              -= Sigma B-98 Hardware =-
3                                     -= Sigma B-98 Hardware / Sammy Medal Games =-
44
55                                                 driver by Luca Elia
66
r10330r10331
1313Each sprite is composed of X x Y tiles and can be zoomed / shrunk.
1414Tiles can be 16x16x4 or 16x16x8.
1515
16----------------------------------------------------------------
17
18Sammy Kids Medal Series
19
20Cartridge based system. Carts contain just some flash roms.
21The main board is not available yet. Hardware unknown, but
22it the graphics chip and ROM/RAM banking is the same.
23The sound chip is different, an OKI MSM981x ?
24
25Info from Tatsuya Fujita:
26
27According to some news articles for the AOU show 2002 and 2003 the correct system name
28is "Treasure Fall" (despite the cart label is "Treasure Hall").
29
30Dumped games:
31
32Animal Catch
33Itazura Monkey
34Taihou de Doboon
35Pye-nage Taikai
36Hae Hae Ka Ka Ka
37
38Games with the same cabinet which might be on the same hardware:
39
401999 Shatekids
411999 Otakara Locomo
421999 Dokidoki Kingyosukui
432000 Taihou de Doboon
442000 Pye-nage Taikai
452000 Animal Catch
462000 Itazura Monkey
472000 Otoshicha Ottotto
482000 Go Go Cowboy
492001 Mushitori Meijin
502001 Morino Dodgeball Senshuken
512001 Waiwai Wanage
522001 Hae Hae Ka Ka Ka
532001 Zarigani Tsuri
542001 Kotekitai Slot
552002 Shateki Yokochou
562002 Ipponzuri Slot
572002 Karateman
582002 One-touchable
592003 Gun Kids
602003 Kurukuru Train
612003 Zakuzaku Kaizokudan
622004 Animal Punch
632004 Dotabata Zaurus
642004 Ninchuu Densetsu
65
66from:
67http://www.tsc-acnet.com/index.php?sort=8&action=cataloglist&s=1&mode=3&genre_id=40&freeword=%25A5%25B5%25A5%25DF%25A1%25BC
68
1669To Do:
1770
1871- Remove ROM patches from gegege
r10330r10331
2477*************************************************************************************************************/
2578
2679#include "emu.h"
80#include "deprecat.h"
2781#include "cpu/z80/z80.h"
2882#include "sound/ymz280b.h"
2983#include "machine/eeprom.h"
r10330r10331
47101    1           7--- ----
48102                -6-- ----     256 Color Sprite
49103                --5- ----
50                ---4 ----     ?
104                ---4 ----     Flip X
51105                ---- 3---
52106                ---- -2--     Draw Sprite
53                ---- --10
107                ---- --10     Priority (0 = Front .. 3 = Back)
54108    2                         Tile Code (High)
55109    3                         Tile Code (Low)
56110    4           7654 3---     Number of X Tiles - 1
r10330r10331
59113    6           7654 3---     Number of Y Tiles - 1
60114                ---- -210     Y (High)
61115    7                         Y (Low)
62    8                         Zoom Factor (<< 8, High)
63    9                         Zoom Factor (<< 8, Low)
116    8                         Shrink Factor (<< 8, High)
117    9                         Shrink Factor (<< 8, Low)
64118    a
65119    b
66120    c           7654 3---
r10330r10331
72126
73127***************************************************************************/
74128
75static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
129static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri_mask)
76130{
77131   UINT8 *end      =   machine->generic.spriteram.u8 - 0x10;
78132   UINT8 *s      =   end + machine->generic.spriteram_size;
r10330r10331
86140      if ( (s[ 0x01 ] & 0x04) == 0)
87141         continue;
88142
143      if ( ((1 << (s[ 0x01 ] & 0x03)) & pri_mask) == 0 )
144         continue;
145
89146      color   =   s[ 0x00 ] & 0xf;
90147
91148      gfx      =   (s[ 0x01 ] & 0x40 ) ? 1 : 0;
r10330r10331
119176      sx      <<=   16;
120177      sy      <<=   16;
121178
179      zoom   =   (1 << 16) / (zoom ? zoom : 1);
122180      dim      =   (0x10 << 8) * zoom;
123181      scale   =   dim / 0x10;
124182
r10330r10331
126184        // to avoid holes in between tiles
127185      if (scale & 0xffff)   scale += (1<<16) / 0x10;
128186
129      flipx   =   0;   // ?
187      flipx   =   s[ 0x01 ] & 0x10;
130188      flipy   =   0;   // ?
131189
132190      if ( flipx )   {   x0 = nx - 1;   x1 = -1;   dx = -1;   }
r10330r10331
151209
152210static VIDEO_UPDATE(sigmab98)
153211{
212   int layers_ctrl = -1;
213
214#ifdef MAME_DEBUG
215   if (input_code_pressed(screen->machine, KEYCODE_Z))
216   {
217      int msk = 0;
218      if (input_code_pressed(screen->machine, KEYCODE_Q))   msk |= 1;
219      if (input_code_pressed(screen->machine, KEYCODE_W))   msk |= 2;
220      if (input_code_pressed(screen->machine, KEYCODE_E))   msk |= 4;
221      if (input_code_pressed(screen->machine, KEYCODE_R))   msk |= 8;
222      if (msk != 0) layers_ctrl &= msk;
223   }
224#endif
225
154226   bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
155   draw_sprites(screen->machine, bitmap, cliprect);
227
228   // Draw from priority 3 (bottom, converted to a bitmask) to priority 0 (top)
229   draw_sprites(screen->machine, bitmap, cliprect, layers_ctrl & 8);
230   draw_sprites(screen->machine, bitmap, cliprect, layers_ctrl & 4);
231   draw_sprites(screen->machine, bitmap, cliprect, layers_ctrl & 2);
232   draw_sprites(screen->machine, bitmap, cliprect, layers_ctrl & 1);
233
156234   return 0;
157235}
158236
r10330r10331
166244static UINT8 reg, rombank;
167245static UINT8 reg2, rambank;
168246
247/***************************************************************************
248                        GeGeGe no Kitarou Youkai Slot
249***************************************************************************/
250
169251// rombank
170252static WRITE8_HANDLER( regs_w )
171253{
r10330r10331
364446
365447
366448/***************************************************************************
449                                 Animal Catch
450***************************************************************************/
367451
452// rombank
453static WRITE8_HANDLER( animalc_rombank_w )
454{
455   if (offset == 0)
456   {
457      reg = data;
458      return;
459   }
460
461   UINT8 *rom = space->machine->region("maincpu")->base();
462   switch ( reg )
463   {
464      case 0x0f:
465         rombank = data;
466         switch (data)
467         {
468            case 0x10:   memory_set_bankptr(space->machine, "rombank", rom + 0x400 + 0x4000);   break;
469            case 0x14:   memory_set_bankptr(space->machine, "rombank", rom + 0x400 + 0x8000);   break;
470            case 0x18:   memory_set_bankptr(space->machine, "rombank", rom + 0x400 + 0xc000);   break;
471            default:
472               logerror("%s: unknown rom bank = %02x, reg = %02x\n", space->machine->describe_context(), data, reg);
473         }
474         break;
475
476      default:
477         logerror("%s: unknown reg written: %02x = %02x\n", space->machine->describe_context(), reg, data);
478   }
479}
480static READ8_HANDLER( animalc_rombank_r )
481{
482   if (offset == 0)
483      return reg;
484
485   switch ( reg )
486   {
487      case 0x0f:
488         return rombank;
489
490      default:
491         logerror("%s: unknown reg read: %02x\n", space->machine->describe_context(), reg);
492         return 0x00;
493   }
494}
495
496// rambank
497static WRITE8_HANDLER( animalc_rambank_w )
498{
499   if (offset == 0)
500   {
501      reg2 = data;
502      return;
503   }
504
505   int bank = 0;
506   switch ( reg2 )
507   {
508      case 0x1f:
509         rambank = data;
510         switch (data)
511         {
512            case 0x58:   bank = 0;   break;
513            case 0x62:   bank = 1;   break;
514            case 0x63:   bank = 2;   break;
515            case 0x64:   bank = 3;   break;
516            case 0x65:   bank = 4;   break;
517            default:
518               logerror("%s: unknown ram bank = %02x, reg2 = %02x\n", space->machine->describe_context(), data, reg2);
519               return;
520         }
521         memory_set_bank(space->machine, "rambank", bank);
522         if ( (bank == 1) || (bank == 2) || (bank == 3) )
523            memory_set_bank(space->machine, "sprbank", bank-1);
524         break;
525
526      default:
527         logerror("%s: unknown reg2 written: %02x = %02x\n", space->machine->describe_context(), reg2, data);
528   }
529}
530static READ8_HANDLER( animalc_rambank_r )
531{
532   if (offset == 0)
533      return reg2;
534
535   switch ( reg2 )
536   {
537      case 0x1f:
538         return rambank;
539
540      default:
541         logerror("%s: unknown reg2 read: %02x\n", space->machine->describe_context(), reg2);
542         return 0x00;
543   }
544}
545
546
547static READ8_DEVICE_HANDLER( sammymdl_eeprom_r )
548{
549   return eeprom_read_bit(device) ? 0x80 : 0;
550}
551
552static WRITE8_DEVICE_HANDLER( sammymdl_eeprom_w )
553{
554   // latch the bit
555   eeprom_write_bit(device, data & 0x40);
556
557   // reset line asserted: reset.
558   eeprom_set_cs_line(device, (data & 0x20) ? CLEAR_LINE : ASSERT_LINE);
559
560   // clock line asserted: write latch or select next bit to read
561   eeprom_set_clock_line(device, (data & 0x10) ? ASSERT_LINE : CLEAR_LINE);
562
563   if (data & 0x8f)
564      logerror("%s: unknown eeeprom bits written %02x\n", device->machine->describe_context(), data);
565}
566
567static READ8_HANDLER( unk_34_r )
568{
569   // mask 0x01?
570   return 0x01;
571}
572
573static UINT8 vblank;
574
575static READ8_HANDLER( vblank_r )
576{
577   // mask 0x04 must be set before writing sprite list
578   // mask 0x10 must be set or irq/00 hangs?
579   return   vblank | 0x14;
580}
581
582static WRITE8_HANDLER( vblank_w )
583{
584   vblank = (vblank & ~0x03) | (data & 0x03);
585}
586
587static VIDEO_EOF( sammymdl )
588{
589   vblank &= ~0x01;
590}
591
592static UINT8 out[3];
593static void show_3_outputs()
594{
595#ifdef MAME_DEBUG
596   popmessage("COIN: %02X  LED: %02X  HOP: %02X", out[0], out[1], out[2]);
597#endif
598}
599// Port 31
600static WRITE8_HANDLER( sammymdl_coin_w )
601{
602   coin_counter_w(space->machine, 0,   data  & 0x01 );   // coin1 in
603   coin_counter_w(space->machine, 1,   data  & 0x02 );   // coin2 in
604   coin_counter_w(space->machine, 2,   data  & 0x04 );   // medal in
605
606   coin_lockout_w(space->machine, 1, (~data) & 0x08 );   // coin2 lockout?
607   coin_lockout_w(space->machine, 0, (~data) & 0x10 );   // coin1 lockout
608   coin_lockout_w(space->machine, 2, (~data) & 0x20 );   // medal lockout?
609
610   out[0] = data;
611   show_3_outputs();
612}
613
614// Port 32
615static WRITE8_HANDLER( sammymdl_leds_w )
616{
617   set_led_status(space->machine, 0,   data & 0x01);   // button
618
619   out[1] = data;
620   show_3_outputs();
621}
622
623// Port b0
624// 02 hopper enable?
625// 01 hopper motor on (active low)?
626static WRITE8_HANDLER( sammymdl_hopper_w )
627{
628   ticket_dispenser_w(space->machine->device("hopper"), 0, (!(data & 0x01) && (data & 0x02)) ? 0x00 : 0x80);
629
630   out[2] = data;
631   show_3_outputs();
632}
633
634static WRITE8_HANDLER( sammymdl_sound_w )
635{
636}
637
638static READ8_HANDLER( sammymdl_coin_hopper_r )
639{
640   UINT8 ret = input_port_read(space->machine, "COIN");
641
642//   if ( !ticket_dispenser_r(space->machine->device("hopper"), 0) )
643//      ret &= ~0x01;
644
645   return ret;
646}
647
648static UINT8 *nvram;
649static ADDRESS_MAP_START( animalc_map, ADDRESS_SPACE_PROGRAM, 8 )
650   AM_RANGE( 0x0000, 0x3fff ) AM_ROM
651   AM_RANGE( 0x4000, 0x7fff ) AM_ROMBANK( "rombank" )
652   AM_RANGE( 0x8000, 0x8fff ) AM_RAMBANK( "rambank" ) AM_SHARE( "nvram" ) AM_BASE( &nvram )
653
654   AM_RANGE( 0x9000, 0x9fff ) AM_RAM
655   AM_RANGE( 0xa000, 0xafff ) AM_RAM
656   AM_RANGE( 0xb000, 0xbfff ) AM_RAMBANK("sprbank")
657
658   AM_RANGE( 0xd000, 0xd1ff ) AM_RAM_WRITE( paletteram_xRRRRRGGGGGBBBBB_be_w ) AM_BASE_GENERIC( paletteram )
659   AM_RANGE( 0xd800, 0xd87f ) AM_RAM   // ?
660
661   AM_RANGE( 0xe011, 0xe011 ) AM_WRITENOP   // IRQ Enable? Screen disable?
662   AM_RANGE( 0xe013, 0xe013 ) AM_READWRITE( vblank_r, vblank_w )   // IRQ Ack?
663
664   AM_RANGE( 0xfe00, 0xffff ) AM_RAM
665ADDRESS_MAP_END
666
667static ADDRESS_MAP_START( animalc_io, ADDRESS_SPACE_IO, 8 )
668   ADDRESS_MAP_GLOBAL_MASK(0xff)
669   AM_RANGE( 0x02, 0x03 ) AM_READWRITE( animalc_rombank_r, animalc_rombank_w )
670   AM_RANGE( 0x04, 0x05 ) AM_READWRITE( animalc_rambank_r, animalc_rambank_w )
671
672   AM_RANGE( 0x2c, 0x2c ) AM_DEVREADWRITE( "eeprom", sammymdl_eeprom_r, sammymdl_eeprom_w )
673   AM_RANGE( 0x2e, 0x2e ) AM_READ( sammymdl_coin_hopper_r )
674   AM_RANGE( 0x30, 0x30 ) AM_READ_PORT( "BUTTON" )
675   AM_RANGE( 0x31, 0x31 ) AM_WRITE( sammymdl_coin_w )
676   AM_RANGE( 0x32, 0x32 ) AM_WRITE( sammymdl_leds_w )
677   AM_RANGE( 0x34, 0x34 ) AM_READ( unk_34_r )
678   AM_RANGE( 0x90, 0x91 ) AM_WRITE( sammymdl_sound_w )
679   AM_RANGE( 0xb0, 0xb0 ) AM_WRITE( sammymdl_hopper_w )
680   AM_RANGE( 0xc0, 0xc0 ) AM_WRITE( watchdog_reset_w )   // 1
681ADDRESS_MAP_END
682
683/***************************************************************************
684                              Itazura Monkey
685***************************************************************************/
686
687// rombank
688static WRITE8_HANDLER( itazuram_rombank_w )
689{
690   if (offset == 0)
691   {
692      reg = data;
693      return;
694   }
695
696   UINT8 *rom = space->machine->region("maincpu")->base();
697   switch ( reg )
698   {
699      case 0x0d:
700         rombank = data;
701         switch (data)
702         {
703            case 0x11:   // 3800 IS ROM
704               memory_set_bankptr(space->machine, "rombank0", rom + 0x4c00);
705               memory_set_bankptr(space->machine, "rombank1", rom + 0x5c00);
706               memory_set_bankptr(space->machine, "sprbank0", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
707               memory_set_bankptr(space->machine, "sprbank1", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
708               break;
709
710            default:
711               logerror("%s: unknown rom bank = %02x, reg = %02x\n", space->machine->describe_context(), data, reg);
712         }
713         break;
714
715      case 0x4d:
716         rombank = data;
717         switch (data)
718         {
719            case 0x14:   // 3800 IS ROM
720               memory_set_bankptr(space->machine, "rombank0", rom + 0x8000);
721               memory_set_bankptr(space->machine, "rombank1", rom + 0x9000);
722               memory_set_bankptr(space->machine, "sprbank0", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
723               memory_set_bankptr(space->machine, "sprbank1", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
724               break;
725
726            default:
727               logerror("%s: unknown rom bank = %02x, reg = %02x\n", space->machine->describe_context(), data, reg);
728         }
729         break;
730
731      case 0x8d:
732         rombank = data;
733         switch (data)
734         {
735            case 0x0f:   // 3800 IS ROM
736               memory_set_bankptr(space->machine, "rombank0", rom + 0x3400);
737               memory_set_bankptr(space->machine, "rombank1", rom + 0x4400);
738               memory_set_bankptr(space->machine, "sprbank0", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
739               memory_set_bankptr(space->machine, "sprbank1", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
740               break;
741
742            case 0x12:   // 3800 IS ROM
743               memory_set_bankptr(space->machine, "rombank0", rom + 0x6400);
744               memory_set_bankptr(space->machine, "rombank1", rom + 0x7400);
745               memory_set_bankptr(space->machine, "sprbank0", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
746               memory_set_bankptr(space->machine, "sprbank1", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
747               break;
748
749            // used in test mode:
750//            case 0x5c:   memory_set_bankptr(space->machine, "rombank", rom + 0x400 + 0x0000);   break;   // 3800 IS RAM! (8000 bytes)
751
752            case 0x5e:   // 3800 IS RAM! (1404 bytes)
753               memory_set_bankptr(space->machine, "rombank0", space->machine->generic.spriteram.u8 + 0x1000*1);
754               memory_set_bankptr(space->machine, "sprbank0", space->machine->generic.spriteram.u8 + 0x1000*1);
755               memory_set_bankptr(space->machine, "rombank1", space->machine->generic.spriteram.u8 + 0x1000*2);
756               memory_set_bankptr(space->machine, "sprbank1", space->machine->generic.spriteram.u8 + 0x1000*2);
757               break;
758
759            case 0x6c:   // 3800 IS RAM! (1000 bytes) - SPRITERAM
760               memory_set_bankptr(space->machine, "rombank0", space->machine->generic.spriteram.u8);
761               memory_set_bankptr(space->machine, "sprbank0", space->machine->generic.spriteram.u8);
762//               memory_set_bankptr(space->machine, "sprbank1", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
763               break;
764
765            default:
766               logerror("%s: unknown rom bank = %02x, reg = %02x\n", space->machine->describe_context(), data, reg);
767         }
768         break;
769
770      case 0xcd:
771         rombank = data;
772         switch (data)
773         {
774            case 0x14:   // 3800 IS ROM
775               memory_set_bankptr(space->machine, "rombank0", rom + 0x8800);
776               memory_set_bankptr(space->machine, "rombank1", rom + 0x9800);
777               memory_set_bankptr(space->machine, "sprbank0", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
778               memory_set_bankptr(space->machine, "sprbank1", space->machine->generic.spriteram.u8 + 0x1000*4);   // scratch
779               break;
780
781            default:
782               logerror("%s: unknown rom bank = %02x, reg = %02x\n", space->machine->describe_context(), data, reg);
783         }
784         break;
785
786      default:
787         logerror("%s: unknown reg written: %02x = %02x\n", space->machine->describe_context(), reg, data);
788   }
789}
790static READ8_HANDLER( itazuram_rombank_r )
791{
792   if (offset == 0)
793      return reg;
794
795   switch ( reg )
796   {
797      // FIXME different registers
798      case 0x0d:
799      case 0x4d:
800      case 0x8d:
801      case 0xcd:
802         return rombank;
803
804      default:
805         logerror("%s: unknown reg read: %02x\n", space->machine->describe_context(), reg);
806         return 0x00;
807   }
808}
809
810// rambank
811static WRITE8_HANDLER( itazuram_rambank_w )
812{
813   if (offset == 0)
814   {
815      reg2 = data;
816      return;
817   }
818
819   switch ( reg2 )
820   {
821      case 0x76:
822         rambank = data;
823         switch (data)
824         {
825            case 0x52:   memory_set_bankptr(space->machine, "palbank", nvram);                           break;
826            case 0x64:   memory_set_bankptr(space->machine, "palbank", space->machine->generic.paletteram.u8);   break;
827            default:
828               logerror("%s: unknown ram bank = %02x, reg2 = %02x\n", space->machine->describe_context(), data, reg2);
829               return;
830         }
831         break;
832
833      default:
834         logerror("%s: unknown reg2 written: %02x = %02x\n", space->machine->describe_context(), reg2, data);
835   }
836}
837
838static READ8_HANDLER( itazuram_rambank_r )
839{
840   if (offset == 0)
841      return reg2;
842
843   switch ( reg2 )
844   {
845      case 0x76:
846         return rambank;
847
848      default:
849         logerror("%s: unknown reg2 read: %02x\n", space->machine->describe_context(), reg2);
850         return 0x00;
851   }
852}
853
854static WRITE8_HANDLER( itazuram_nvram_palette_w )
855{
856   if (rambank == 0x64)
857   {
858      paletteram_xRRRRRGGGGGBBBBB_be_w(space, offset, data);
859//      space->machine->generic.paletteram.u8[offset] = data;
860   }
861   else if (rambank == 0x52)
862   {
863      nvram[offset] = data;
864   }
865   else
866   {
867      logerror("%s: itazuram_nvram_palette_w offset = %03x with unknown bank = %02x\n", space->machine->describe_context(), offset, rambank);
868   }
869}
870
871static WRITE8_HANDLER( itazuram_palette_w )
872{
873   if (rombank == 0x6c)
874   {
875      if (offset < 0x200)
876         paletteram_xRRRRRGGGGGBBBBB_be_w(space, offset, data);
877//         space->machine->generic.paletteram.u8[offset] = data;
878   }
879   else
880   {
881      logerror("%s: itazuram_palette_w offset = %03x with unknown bank = %02x\n", space->machine->describe_context(), offset, rombank);
882   }
883}
884static READ8_HANDLER( itazuram_palette_r )
885{
886   return space->machine->generic.paletteram.u8[offset];
887}
888
889static ADDRESS_MAP_START( itazuram_map, ADDRESS_SPACE_PROGRAM, 8 )
890   AM_RANGE( 0x0000, 0x37ff ) AM_ROM
891   AM_RANGE( 0x3800, 0x47ff ) AM_READ_BANK( "rombank0" ) AM_WRITE_BANK( "sprbank0" )
892   AM_RANGE( 0x4800, 0x57ff ) AM_READ_BANK( "rombank1" ) AM_WRITE_BANK( "sprbank1" )
893
894   AM_RANGE( 0x5800, 0x59ff ) AM_READWRITE( itazuram_palette_r, itazuram_palette_w )
895   AM_RANGE( 0x6000, 0x607f ) AM_RAM   // ?
896
897   AM_RANGE( 0x6811, 0x6811 ) AM_WRITENOP   // IRQ Enable? Screen disable?
898   AM_RANGE( 0x6813, 0x6813 ) AM_WRITENOP   // IRQ Ack?
899   AM_RANGE( 0xdc00, 0xfdff ) AM_READ_BANK( "palbank" ) AM_WRITE( itazuram_nvram_palette_w ) AM_SHARE( "nvram" ) AM_BASE( &nvram )   // nvram | paletteram
900
901   AM_RANGE( 0xfe00, 0xffff ) AM_RAM
902ADDRESS_MAP_END
903
904static ADDRESS_MAP_START( itazuram_io, ADDRESS_SPACE_IO, 8 )
905   ADDRESS_MAP_GLOBAL_MASK(0xff)
906   AM_RANGE( 0x02, 0x03 ) AM_READWRITE( itazuram_rombank_r, itazuram_rombank_w )
907   AM_RANGE( 0x04, 0x05 ) AM_READWRITE( itazuram_rambank_r, itazuram_rambank_w )
908
909   AM_RANGE( 0x2c, 0x2c ) AM_DEVREADWRITE( "eeprom", sammymdl_eeprom_r, sammymdl_eeprom_w )
910   AM_RANGE( 0x2e, 0x2e ) AM_READ( sammymdl_coin_hopper_r )
911   AM_RANGE( 0x30, 0x30 ) AM_READ_PORT( "BUTTON" )
912   AM_RANGE( 0x31, 0x31 ) AM_WRITE( sammymdl_coin_w )
913   AM_RANGE( 0x32, 0x32 ) AM_WRITE( sammymdl_leds_w )
914   AM_RANGE( 0x90, 0x91 ) AM_WRITE( sammymdl_sound_w )   // sound
915   AM_RANGE( 0xb0, 0xb0 ) AM_WRITE( sammymdl_hopper_w )
916   AM_RANGE( 0xc0, 0xc0 ) AM_WRITE( watchdog_reset_w )   // 1
917ADDRESS_MAP_END
918
919/***************************************************************************
920
368921    Graphics Layout
369922
370923***************************************************************************/
r10330r10331
393946
394947static GFXDECODE_START( sigmab98 )
395948   GFXDECODE_ENTRY( "sprites", 0, sigmab98_16x16x4_layout, 0, 0x100/16  )
396   GFXDECODE_ENTRY( "sprites", 0, sigmab98_16x16x8_layout, 0, 0x100/256 )
949   GFXDECODE_ENTRY( "sprites", 0, sigmab98_16x16x8_layout, 0, 0x100/256 )
397950GFXDECODE_END
398951
399952
r10330r10331
403956
404957***************************************************************************/
405958
959/***************************************************************************
960                        GeGeGe no Kitarou Youkai Slot
961***************************************************************************/
962
406963static INPUT_PORTS_START( gegege )
407964
408965   PORT_START("EEPROM")
r10330r10331
437994
438995INPUT_PORTS_END
439996
997/***************************************************************************
998                             Sammy Medal Games
999***************************************************************************/
4401000
1001static INPUT_PORTS_START( sammymdl )
1002   PORT_START("BUTTON")
1003   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // shot
1004   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) // freeze (itazuram)
1005   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
1006   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
1007   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
1008   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
1009   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
1010   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
1011
1012   PORT_START("COIN")
1013   PORT_BIT( 0x01, IP_ACTIVE_LOW,  IPT_COIN1   ) PORT_IMPULSE(5)   // coin1 in
1014   PORT_BIT( 0x02, IP_ACTIVE_LOW,  IPT_COIN2   ) PORT_IMPULSE(5)   // coin2 in
1015   PORT_BIT( 0x04, IP_ACTIVE_LOW,  IPT_COIN3   ) PORT_IMPULSE(5)   // medal in
1016   PORT_BIT( 0x08, IP_ACTIVE_LOW,  IPT_SERVICE )   // test sw
1017   PORT_BIT( 0x10, IP_ACTIVE_LOW,  IPT_UNKNOWN )
1018   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE("hopper", ticket_dispenser_line_r)
1019   PORT_BIT( 0x40, IP_ACTIVE_LOW,  IPT_UNKNOWN )
1020   PORT_BIT( 0x80, IP_ACTIVE_LOW,  IPT_UNKNOWN )
1021INPUT_PORTS_END
1022
1023
4411024/***************************************************************************
4421025
4431026    Machine Drivers
4441027
4451028***************************************************************************/
4461029
1030/***************************************************************************
1031                        GeGeGe no Kitarou Youkai Slot
1032***************************************************************************/
1033
4471034const eeprom_interface eeprom_intf =
4481035{
4491036   6,            // address bits 6
r10330r10331
4751062
4761063   MCFG_SCREEN_ADD("screen", RASTER)
4771064   MCFG_SCREEN_REFRESH_RATE(60)               // ?
478   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
1065   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)   // game reads vblank state
4791066   MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
4801067   MCFG_SCREEN_SIZE(0x200, 0x200)
4811068   MCFG_SCREEN_VISIBLE_AREA(0,0x140-1, 0,0xf0-1)
r10330r10331
4931080   MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
4941081MACHINE_CONFIG_END
4951082
1083/***************************************************************************
1084                                 Animal Catch
1085***************************************************************************/
4961086
1087static const eeprom_interface eeprom_interface_93C46_8bit =
1088{
1089   7,            // address bits 6
1090   8,            // data bits    8
1091   "*110",         // read         1 10 aaaaaa
1092   "*101",         // write        1 01 aaaaaa dddddddd
1093   "*111",         // erase        1 11 aaaaaa
1094   "*10000xxxx",   // lock         1 00 00xxxx
1095   "*10011xxxx",   // unlock       1 00 11xxxx
1096   0,            // enable_multi_read
1097   1            // reset_delay (needed by animalc)
1098//  "*10001xxxx"    // write all    1 00 01xxxx dddddddd
1099//  "*10010xxxx"    // erase all    1 00 10xxxx
1100};
1101
1102static MACHINE_RESET( sammymdl )
1103{
1104   cpu_set_reg(machine->device("maincpu"), Z80_PC, 0x400);   // code starts at 400 ??? (000 = cart header)
1105}
1106
1107static INTERRUPT_GEN( animalc )
1108{
1109   switch (cpu_getiloops(device))
1110   {
1111      case 0:
1112         cpu_set_input_line_and_vector(device, 0, HOLD_LINE, 0x00);   // increment counter
1113         break;
1114
1115      case 1:
1116         cpu_set_input_line_and_vector(device, 0, HOLD_LINE, 0x1c);   // read hopper state
1117         break;
1118
1119      case 2:
1120         cpu_set_input_line_and_vector(device, 0, HOLD_LINE, 0x1e);   // drive hopper motor
1121         break;
1122   }
1123}
1124
1125// Everything here is a guess:
1126static MACHINE_CONFIG_START( animalc, driver_device )
1127   MCFG_CPU_ADD("maincpu", Z80, 8000000)   // ???
1128   MCFG_CPU_PROGRAM_MAP( animalc_map )
1129   MCFG_CPU_IO_MAP( animalc_io )
1130   MCFG_CPU_VBLANK_INT_HACK(animalc, 3) // IM 2 needs a vector on the data bus
1131
1132   MCFG_MACHINE_RESET( sammymdl )
1133
1134   MCFG_NVRAM_ADD_0FILL("nvram")   // battery
1135   MCFG_EEPROM_ADD("eeprom", eeprom_interface_93C46_8bit)
1136
1137   MCFG_TICKET_DISPENSER_ADD("hopper", 200, TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )
1138
1139   // video hardware
1140   MCFG_SCREEN_ADD("screen", RASTER)
1141   MCFG_SCREEN_REFRESH_RATE(60)
1142   MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
1143   MCFG_SCREEN_SIZE(0x140, 0x100)
1144   MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xf0-1)
1145
1146   MCFG_GFXDECODE(sigmab98)
1147   MCFG_PALETTE_LENGTH(0x100)
1148
1149   MCFG_VIDEO_UPDATE(sigmab98)
1150   MCFG_VIDEO_EOF(sammymdl)
1151
1152   // sound hardware
1153   // OKI MSM981x ?
1154MACHINE_CONFIG_END
1155
4971156/***************************************************************************
1157                              Itazura Monkey
1158***************************************************************************/
4981159
1160static INTERRUPT_GEN( itazuram )
1161{
1162   switch (cpu_getiloops(device))
1163   {
1164      case 0:
1165         cpu_set_input_line_and_vector(device, 0, HOLD_LINE, 0x00);   // sprites
1166         break;
1167
1168      case 1:
1169         cpu_set_input_line_and_vector(device, 0, HOLD_LINE, 0x02);   // copy palette
1170         break;
1171
1172      case 2:
1173         cpu_set_input_line_and_vector(device, 0, HOLD_LINE, 0x16);   // hopper, i/o
1174         break;
1175   }
1176}
1177
1178// Everything here is a guess:
1179static MACHINE_CONFIG_START( itazuram, driver_device )
1180   MCFG_CPU_ADD("maincpu", Z80, 8000000)   // ???
1181   MCFG_CPU_PROGRAM_MAP( itazuram_map )
1182   MCFG_CPU_IO_MAP( itazuram_io )
1183   MCFG_CPU_VBLANK_INT_HACK(itazuram, 3) // IM 2 needs a vector on the data bus
1184
1185   MCFG_MACHINE_RESET( sammymdl )
1186
1187   MCFG_NVRAM_ADD_0FILL("nvram")   // battery
1188   MCFG_EEPROM_ADD("eeprom", eeprom_interface_93C46_8bit)
1189
1190   MCFG_TICKET_DISPENSER_ADD("hopper", 200, TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW )
1191
1192   // video hardware
1193   MCFG_SCREEN_ADD("screen", RASTER)
1194   MCFG_SCREEN_REFRESH_RATE(60)
1195   MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
1196   MCFG_SCREEN_SIZE(0x140, 0x100)
1197   MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xf0-1)
1198
1199   MCFG_GFXDECODE(sigmab98)
1200   MCFG_PALETTE_LENGTH(0x100)
1201
1202   MCFG_VIDEO_UPDATE(sigmab98)
1203//   MCFG_VIDEO_EOF(sammymdl)
1204
1205   // sound hardware
1206   // OKI MSM981x ?
1207MACHINE_CONFIG_END
1208
1209
1210/***************************************************************************
1211
4991212    ROMs Loading
5001213
5011214***************************************************************************/
r10330r10331
5761289
5771290/***************************************************************************
5781291
1292  Animal Catch ( VX2002L02 ANIMALCAT 200011211536 SAMMY CORP. AM )
1293
1294  Sammy AM3ADT-01 Memory Card Type 3:
1295  1 x MX29F1610ATC-12 (@U021)
1296  1 x MX29F1610TC-12  (@U016)
1297
1298***************************************************************************/
1299
1300ROM_START( animalc )
1301   ROM_REGION( 0x200000, "samples", 0 )
1302   ROM_LOAD( "vx2302l01.u021", 0x00000, 0x200000, CRC(84cf123b) SHA1(d8b425c93ff1a560e3f92c70d7eb93a05c3581af) )
1303
1304   ROM_REGION( 0x40000, "maincpu", 0 )
1305   ROM_COPY( "samples", 0x1c0000, 0x00000, 0x40000 )
1306
1307   ROM_REGION( 0x200000, "sprites", 0 )
1308   // tiles end abruptly at 1A00, but a few tiles above that are needed
1309   ROM_LOAD( "vx2301l01.u016", 0x00000, 0x200000, BAD_DUMP CRC(c3a9ca47) SHA1(812bbcfe3b789eadb5adb4c8141303fc046d52c9) )   // 1xxxxxxxxxxxxxxxxxxxx = 0x00
1310ROM_END
1311
1312static DRIVER_INIT( animalc )
1313{
1314   // RAM banks
1315   UINT8 *bankedram = auto_alloc_array(machine, UINT8, 0x1000 * 5);
1316   memory_configure_bank(machine, "rambank", 0, 1, nvram,     0x1000);
1317   memory_configure_bank(machine, "rambank", 1, 4, bankedram, 0x1000);
1318   memory_set_bank(machine, "rambank", 0);
1319
1320   machine->generic.spriteram.u8 = auto_alloc_array(machine, UINT8, 0x1000 * 5);
1321   memset(machine->generic.spriteram.u8, 0, 0x1000 * 5);
1322   machine->generic.spriteram_size = 0x1000;
1323   memory_configure_bank(machine, "sprbank", 0, 5, machine->generic.spriteram.u8, 0x1000);
1324   memory_set_bank(machine, "sprbank", 0);
1325
1326#if 0
1327   // uncomment to show used tiles missing from the dump
1328   UINT8 *gfx = machine->region("sprites")->base();
1329   for (int i = 0x1a00*(16*16*4/8); i < 0x100000; i++)
1330      gfx[i] = i*7;
1331#endif
1332}
1333
1334/***************************************************************************
1335
1336  Itazura Monkey ( VX1902L02 ITZRMONKY 200011211639 SAMMY CORP. AM )
1337
1338  Sammy AM3ADT-01 Memory Card Type 3:
1339  2 x MX29F1610ATC-12
1340
1341***************************************************************************/
1342
1343ROM_START( itazuram )
1344   ROM_REGION( 0x200000, "samples", 0 )
1345   ROM_LOAD( "vx2002l01.u021", 0x00000, 0x200000, CRC(ddbdd2f3) SHA1(91f67a938929be0261442e066e3d2c03b5e9f06a) )
1346
1347   ROM_REGION( 0x40000, "maincpu", 0 )
1348   ROM_COPY( "samples", 0x1c0000, 0x00000, 0x40000 )
1349
1350   ROM_REGION( 0x200000, "sprites", 0 )
1351   ROM_LOAD( "vx2001l01.u016", 0x00000, 0x200000, CRC(9ee95222) SHA1(7154d43ef312a48a882207ca37e1c61e8b215a9b) )
1352ROM_END
1353
1354static DRIVER_INIT( itazuram )
1355{
1356   // ROM banks
1357   UINT8 *rom = machine->region("maincpu")->base();
1358   memory_set_bankptr(machine, "rombank0", rom + 0x3400);
1359   memory_set_bankptr(machine, "rombank1", rom + 0x4400);
1360   rombank = 0x0f;
1361
1362   // RAM banks
1363   machine->generic.paletteram.u8 = auto_alloc_array(machine, UINT8, 0x3000);
1364   memset(machine->generic.paletteram.u8, 0, 0x3000);
1365   memory_set_bankptr(machine, "palbank", machine->generic.paletteram.u8);
1366   rambank = 0x64;
1367
1368   machine->generic.spriteram.u8 = auto_alloc_array(machine, UINT8, 0x1000 * 5);
1369   memset(machine->generic.spriteram.u8, 0, 0x1000 * 5);
1370   machine->generic.spriteram_size = 0x1000;
1371   memory_set_bankptr(machine, "sprbank0",  machine->generic.spriteram.u8 + 0x1000*4);   // scratch
1372   memory_set_bankptr(machine, "sprbank1",  machine->generic.spriteram.u8 + 0x1000*4);   // scratch
1373}
1374
1375/***************************************************************************
1376
1377  Taihou de Doboon ( EM4210L01 PUSHERDBN 200203151028 SAMMY CORP. AM )
1378
1379  Sammy AM3ADT-01 Memory Card Type 3:
1380  2 x MX29F1610ATC-12
1381
1382  The flash roms found in the cart are labeled:
1383
1384  vx1801l01.u016
1385  vx1802l01.u021
1386
1387  which correspond to "Pye-nage Taikai". But they were reflashed with the
1388  software noted in the sticker on the back of the cart (rom names reflect that):
1389
1390  System: Treasure Hall
1391  Soft: Taihou de Doboon
1392  2003.02.14
1393  Char Rev: EM4209L01
1394  Pro  Rev: EM4210L01
1395
1396***************************************************************************/
1397
1398ROM_START( tdoboon )
1399   ROM_REGION( 0x200000, "samples", 0 )
1400   ROM_LOAD( "em4210l01.u021.bin", 0x00000, 0x200000, CRC(3523e314) SHA1(d07c5d17d3f285be4cde810547f427e84f98968f) )
1401
1402   ROM_REGION( 0x40000, "maincpu", 0 )
1403   ROM_COPY( "samples", 0x1c0000, 0x00000, 0x40000 )
1404
1405   ROM_REGION( 0x200000, "sprites", 0 )
1406   ROM_LOAD( "em4209l01.u016.bin", 0x00000, 0x200000, CRC(aca220fa) SHA1(7db441add16af554700e597fd9926b6ccd19d628) )   // 1xxxxxxxxxxxxxxxxxxxx = 0xFF
1407ROM_END
1408
1409/***************************************************************************
1410
1411  Pye-nage Taikai ( VX1802L01 PAINAGETK 200011021216 SAMMY CORP. AM. )
1412
1413  Sammy AM3ADT-01 Memory Card Type 3:
1414  2 x MX29F1610ATC-12
1415
1416***************************************************************************/
1417
1418ROM_START( pyenaget )
1419   ROM_REGION( 0x200000, "samples", 0 )
1420   ROM_LOAD( "vx1802l01.u021", 0x00000, 0x200000, CRC(7a22a657) SHA1(2a98085862fd958209253c5401e41eae4f7c06ea) )
1421
1422   ROM_REGION( 0x40000, "maincpu", 0 )
1423   ROM_COPY( "samples", 0x1c0000, 0x00000, 0x40000 )
1424
1425   ROM_REGION( 0x200000, "sprites", 0 )
1426   ROM_LOAD( "vx1801l01.u016", 0x00000, 0x200000, CRC(c4607403) SHA1(f4f4699442afccc5ed4354447f91b1bee36ae3e5) )
1427ROM_END
1428
1429/***************************************************************************
1430
1431  Hae Hae Ka Ka Ka ( EM4208L01 PUSHERHAEHAE 200203151032 SAMMY CORP. AM )
1432
1433  Sammy AM3ADT-01 Memory Card Type 3:
1434  2 x MX29F1610ATC-12
1435
1436  The flash roms found in the cart are labeled:
1437
1438  vx1801l01.u016
1439  vx1802l01.u021
1440
1441  which correspond to "Pye-nage Taikai". But they were reflashed with the
1442  software noted in the sticker on the back of the cart (rom names reflect that):
1443
1444  System: Treasure Hall
1445  Soft: Hae Hae Ka Ka Ka
1446  2003.02.14
1447  Char Rev: EM4207L01
1448  Pro  Rev: EM4208L01
1449
1450***************************************************************************/
1451
1452ROM_START( haekaka )
1453   ROM_REGION( 0x200000, "samples", 0 )
1454   ROM_LOAD( "em4208l01.u021.bin", 0x00000, 0x200000, CRC(d23bb748) SHA1(38d5b6c4b2cd470b3a68574aeca3f9fa9032245e) )
1455
1456   ROM_REGION( 0x40000, "maincpu", 0 )
1457   ROM_COPY( "samples", 0x1c0000, 0x00000, 0x40000 )
1458
1459   ROM_REGION( 0x200000, "sprites", 0 )
1460   ROM_LOAD( "em4207l01.u016.bin", 0x00000, 0x200000, CRC(3876961c) SHA1(3d842c1f63ea5aa7e799967928b86c5fabb4e65e) )
1461ROM_END
1462
1463/***************************************************************************
1464
5791465    Game Drivers
5801466
5811467***************************************************************************/
5821468
583GAME( 1997, gegege, 0, gegege, gegege, gegege, ROT0, "Banpresto / Sigma", "GeGeGe no Kitarou Youkai Slot", 0 )
1469GAME( 1997, gegege,   0, gegege,   gegege,   gegege,   ROT0, "Banpresto / Sigma", "GeGeGe no Kitarou Youkai Slot", 0             )
1470// Sammy Medal Games:
1471GAME( 2000, animalc,  0, animalc,  sammymdl, animalc,  ROT0, "Sammy",             "Animal Catch",                  GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS )
1472GAME( 2000, itazuram, 0, itazuram, sammymdl, itazuram, ROT0, "Sammy",             "Itazura Monkey",                GAME_NO_SOUND )
1473GAME( 2000, pyenaget, 0, animalc,  sammymdl, 0,        ROT0, "Sammy",             "Pye-nage Taikai",               GAME_NO_SOUND | GAME_NOT_WORKING )
1474GAME( 2002, haekaka,  0, animalc,  sammymdl, 0,        ROT0, "Sammy",             "Hae Hae Ka Ka Ka",              GAME_NO_SOUND | GAME_NOT_WORKING )
1475GAME( 2002, tdoboon,  0, animalc,  sammymdl, 0,        ROT0, "Sammy",             "Taihou de Doboon",              GAME_NO_SOUND | GAME_NOT_WORKING )
src/mame/drivers/vegas.c
r10330r10331
565565   state_save_register_global(machine, sio_led_state);
566566   state_save_register_global(machine, pending_analog_read);
567567   state_save_register_global(machine, cmos_unlocked);
568   state_save_register_postload(machine, vegas_postload, NULL);
568   machine->state().register_postload(vegas_postload, NULL);
569569}
570570
571571
src/mame/drivers/20pacgal.c
r10330r10331
338338
339339   state_save_register_global(machine, state->game_selected);
340340   state_save_register_global_pointer(machine, state->ram_48000, 0x2000);
341   state_save_register_postload(machine, postload_20pacgal, NULL);
341   machine->state().register_postload(postload_20pacgal, NULL);
342342}
343343
344344static MACHINE_RESET( 20pacgal )
src/mame/drivers/atetris.c
r10330r10331
119119   /* Set up save state */
120120   state_save_register_global(machine, state->current_bank);
121121   state_save_register_global(machine, state->nvram_write_enable);
122   state_save_register_postload(machine, atetris_postload, NULL);
122   machine->state().register_postload(atetris_postload, NULL);
123123}
124124
125125
src/mame/drivers/xexex.c
r10330r10331
493493
494494   state_save_register_global(machine, state->cur_control2);
495495   state_save_register_global(machine, state->cur_sound_region);
496   state_save_register_postload(machine, xexex_postload, NULL);
496   machine->state().register_postload(xexex_postload, NULL);
497497
498498   state->dmadelay_timer = machine->scheduler().timer_alloc(FUNC(dmaend_callback));
499499}
src/mame/drivers/warriorb.c
r10330r10331
558558
559559   state_save_register_global(machine, state->banknum);
560560   state_save_register_global_array(machine, state->pandata);
561   state_save_register_postload(machine, warriorb_postload, NULL);
561   machine->state().register_postload(warriorb_postload, NULL);
562562}
563563
564564static MACHINE_RESET( taito_dualscreen )
src/mame/drivers/ace.c
r10330r10331
329329{
330330   ace_state *state = machine->driver_data<ace_state>();
331331   state_save_register_global_array(machine, state->objpos);
332   state_save_register_postload(machine, ace_postload, NULL);
332   machine->state().register_postload(ace_postload, NULL);
333333}
334334
335335static MACHINE_RESET( ace )
src/mame/drivers/astrocde.c
r10330r10331
17651765
17661766   /* reset banking */
17671767   profpac_banksw_w(iospace, 0, 0);
1768   state_save_register_postload(machine, profbank_banksw_restore, NULL);
1768   machine->state().register_postload(profbank_banksw_restore, NULL);
17691769}
17701770
17711771
r10330r10331
17811781
17821782   /* reset banking */
17831783   profpac_banksw_w(iospace, 0, 0);
1784   state_save_register_postload(machine, profbank_banksw_restore, NULL);
1784   machine->state().register_postload(profbank_banksw_restore, NULL);
17851785}
17861786
17871787
r10330r10331
18021802
18031803   /* reset banking */
18041804   profpac_banksw_w(iospace, 0, 0);
1805   state_save_register_postload(machine, profbank_banksw_restore, NULL);
1805   machine->state().register_postload(profbank_banksw_restore, NULL);
18061806}
18071807
18081808
src/mame/drivers/othunder.c
r10330r10331
706706   state_save_register_global(machine, state->ad_irq);
707707   state_save_register_global(machine, state->banknum);
708708   state_save_register_global_array(machine, state->pan);
709   state_save_register_postload(machine, othunder_postload, NULL);
709   machine->state().register_postload(othunder_postload, NULL);
710710}
711711
712712static MACHINE_RESET( othunder )
src/mame/drivers/psikyo4.c
r10330r10331
10721072   set_hotgmck_pcm_bank(machine, 1);
10731073
10741074   memory_install_write32_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x5800008, 0x580000b, 0, 0, hotgmck_pcm_bank_w );
1075   state_save_register_postload(machine, hotgmck_pcm_bank_postload, (void *)0);
1076   state_save_register_postload(machine, hotgmck_pcm_bank_postload, (void *)1);
1075   machine->state().register_postload(hotgmck_pcm_bank_postload, (void *)0);
1076   machine->state().register_postload(hotgmck_pcm_bank_postload, (void *)1);
10771077}
10781078
10791079static DRIVER_INIT( hotgmck )
src/mame/drivers/taito_x.c
r10330r10331
898898
899899   state->taitox_banknum = -1;
900900   state_save_register_global(machine, state->taitox_banknum);
901   state_save_register_postload(machine, taitox_postload, NULL);
901   machine->state().register_postload(taitox_postload, NULL);
902902}
903903
904904static const tc0140syt_interface taitox_tc0140syt_intf =
src/mame/drivers/xmen.c
r10330r10331
330330   state_save_register_global(machine, state->sprite_colorbase);
331331   state_save_register_global_array(machine, state->layer_colorbase);
332332   state_save_register_global_array(machine, state->layerpri);
333   state_save_register_postload(machine, xmen_postload, NULL);
333   machine->state().register_postload(xmen_postload, NULL);
334334}
335335
336336static MACHINE_RESET( xmen )
src/mame/drivers/taito_z.c
r10330r10331
29942994
29952995   memory_configure_bank(machine, "bank10", 0, banks, machine->region("audiocpu")->base() + 0xc000, 0x4000);
29962996
2997   state_save_register_postload(machine, taitoz_postload, NULL);
2997   machine->state().register_postload(taitoz_postload, NULL);
29982998
29992999   MACHINE_START_CALL(bshark);
30003000}
r10330r10331
48884888   state->dblaxle_vibration = 0;
48894889   state->eep_latch = 0;
48904890
4891   state_save_register_postload(machine, bshark_postload, NULL);
4891   machine->state().register_postload(bshark_postload, NULL);
48924892   state_save_register_global(machine, state->eep_latch);
48934893}
48944894
src/mame/drivers/mystwarr.c
r10330r10331
865865
866866   state_save_register_global(machine, mw_irq_control);
867867   state_save_register_global(machine, cur_sound_region);
868   state_save_register_postload(machine, mystwarr_postload, NULL);
868   machine->state().register_postload(mystwarr_postload, NULL);
869869}
870870
871871static MACHINE_RESET(mystwarr)
src/mame/drivers/ninjaw.c
r10330r10331
783783   state_save_register_global(machine, state->cpua_ctrl);
784784   state_save_register_global(machine, state->banknum);
785785   state_save_register_global_array(machine, state->pandata);
786   state_save_register_postload(machine, ninjaw_postload, NULL);
786   machine->state().register_postload(ninjaw_postload, NULL);
787787}
788788
789789static MACHINE_RESET( ninjaw )
src/emu/debug/dvmemory.c
r10330r10331
177177      // stop when we run out of items
178178      UINT32 valsize, valcount;
179179      void *base;
180      const char *itemname = state_save_get_indexed_item(&m_machine, itemnum, &base, &valsize, &valcount);
180      const char *itemname = m_machine.state().indexed_item(itemnum, base, valsize, valcount);
181181      if (itemname == NULL)
182182         break;
183183
src/emu/debug/debugcmd.c
r10330r10331
244244      void *base;
245245
246246      /* stop when we run out of items */
247      name = state_save_get_indexed_item(machine, itemnum, &base, &valsize, &valcount);
247      name = machine->state().indexed_item(itemnum, base, valsize, valcount);
248248      if (name == NULL)
249249         break;
250250
src/emu/cpu/h83002/h8_16.c
r10330r10331
237237   state_save_register_device_item(device, 0, h8->h8TSTR);
238238   state_save_register_device_item_array(device, 0, h8->h8TCNT);
239239
240   state_save_register_postload(device->machine, h8_onstateload, h8);
240   device->machine->state().register_postload(h8_onstateload, h8);
241241
242242   h8_itu_init(h8);
243243}
src/emu/cpu/h83002/h8_8.c
r10330r10331
259259   state_save_register_device_item(device, 0, h8->h8TSTR);
260260   state_save_register_device_item_array(device, 0, h8->h8TCNT);
261261
262   state_save_register_postload(h8->device->machine, h8_onstateload, h8);
262   h8->device->machine->state().register_postload(h8_onstateload, h8);
263263}
264264
265265static CPU_RESET(h8bit)
src/emu/cpu/m68000/m68kcpu.c
r10330r10331
769769   state_save_register_device_item(device, 0, m68k->save_halted);
770770   state_save_register_device_item(device, 0, m68k->pref_addr);
771771   state_save_register_device_item(device, 0, m68k->pref_data);
772   state_save_register_presave(device->machine, m68k_presave, m68k);
773   state_save_register_postload(device->machine, m68k_postload, m68k);
772   device->machine->state().register_presave(m68k_presave, m68k);
773   device->machine->state().register_postload(m68k_postload, m68k);
774774}
775775
776776/* Pulse the RESET line on the CPU */
src/emu/cpu/tms34010/tms34010.c
r10330r10331
669669   state_save_register_device_item(device, 0, tms->pixelshift);
670670   state_save_register_device_item(device, 0, tms->gfxcycles);
671671   state_save_register_device_item_pointer(device, 0, (&tms->regs[0].reg), ARRAY_LENGTH(tms->regs));
672   state_save_register_postload(device->machine, tms34010_state_postload, tms);
672   device->machine->state().register_postload(tms34010_state_postload, tms);
673673}
674674
675675static CPU_RESET( tms34010 )
src/emu/cpu/m37710/m37710.c
r10330r10331
940940   state_save_register_device_item(device, 0, cpustate->irq_level);
941941   state_save_register_device_item(device, 0, cpustate->stopped);
942942   state_save_register_device_item_array(device, 0, cpustate->m37710_regs);
943   state_save_register_device_item(device, 0, cpustate->reload[0].seconds);
944   state_save_register_device_item(device, 0, cpustate->reload[0].attoseconds);
945   state_save_register_device_item(device, 0, cpustate->reload[1].seconds);
946   state_save_register_device_item(device, 0, cpustate->reload[1].attoseconds);
947   state_save_register_device_item(device, 0, cpustate->reload[2].seconds);
948   state_save_register_device_item(device, 0, cpustate->reload[2].attoseconds);
949   state_save_register_device_item(device, 0, cpustate->reload[3].seconds);
950   state_save_register_device_item(device, 0, cpustate->reload[3].attoseconds);
951   state_save_register_device_item(device, 0, cpustate->reload[4].seconds);
952   state_save_register_device_item(device, 0, cpustate->reload[4].attoseconds);
953   state_save_register_device_item(device, 0, cpustate->reload[5].seconds);
954   state_save_register_device_item(device, 0, cpustate->reload[5].attoseconds);
955   state_save_register_device_item(device, 0, cpustate->reload[6].seconds);
956   state_save_register_device_item(device, 0, cpustate->reload[6].attoseconds);
957   state_save_register_device_item(device, 0, cpustate->reload[7].seconds);
958   state_save_register_device_item(device, 0, cpustate->reload[7].attoseconds);
943   state_save_register_device_item(device, 0, cpustate->reload[0]);
944   state_save_register_device_item(device, 0, cpustate->reload[1]);
945   state_save_register_device_item(device, 0, cpustate->reload[2]);
946   state_save_register_device_item(device, 0, cpustate->reload[3]);
947   state_save_register_device_item(device, 0, cpustate->reload[4]);
948   state_save_register_device_item(device, 0, cpustate->reload[5]);
949   state_save_register_device_item(device, 0, cpustate->reload[6]);
950   state_save_register_device_item(device, 0, cpustate->reload[7]);
959951
960   state_save_register_postload(device->machine, m37710_restore_state, cpustate);
952   device->machine->state().register_postload(m37710_restore_state, cpustate);
961953}
962954
963955/**************************************************************************
src/emu/cpu/cubeqcpu/cubeqcpu.c
r10330r10331
275275   state_save_register_device_item(device, 0, cpustate->prev_ipram);
276276   state_save_register_device_item(device, 0, cpustate->prev_ipwrt);
277277
278   state_save_register_postload(device->machine, cquestsnd_postload, (void *)device);
278   device->machine->state().register_postload(cquestsnd_postload, (void *)device);
279279}
280280
281281static CPU_INIT( cquestsnd )
r10330r10331
349349   state_save_register_device_item_pointer(device, 0, cpustate->dram, 16384);
350350   state_save_register_device_item_pointer(device, 0, cpustate->sram, 2048);
351351
352   state_save_register_postload(device->machine, cquestrot_postload, (void *)device);
352   device->machine->state().register_postload(cquestrot_postload, (void *)device);
353353}
354354
355355static CPU_INIT( cquestrot )
r10330r10331
433433   state_save_register_device_item_pointer(device, 0, cpustate->e_stack, 32768);
434434   state_save_register_device_item_pointer(device, 0, cpustate->o_stack, 32768);
435435
436   state_save_register_postload(device->machine, cquestlin_postload, (void *)device);
436   device->machine->state().register_postload(cquestlin_postload, (void *)device);
437437}
438438
439439static CPU_INIT( cquestlin )
src/emu/cpu/hd6309/hd6309.c
r10330r10331
541541   state_save_register_device_item(device, 0, DP);
542542   state_save_register_device_item(device, 0, CC);
543543   state_save_register_device_item(device, 0, MD);
544   state_save_register_postload(device->machine, hd6309_postload, (void *) device);
544   device->machine->state().register_postload(hd6309_postload, (void *) device);
545545   state_save_register_device_item(device, 0, m68_state->int_state);
546546   state_save_register_device_item(device, 0, m68_state->nmi_state);
547547   state_save_register_device_item(device, 0, m68_state->irq_state[0]);
src/emu/cpu/i386/i386.c
r10330r10331
605605   state_save_register_device_item(device, 0, cpustate->ldtr.flags);
606606   state_save_register_device_item(device, 0,  cpustate->irq_state);
607607   state_save_register_device_item(device, 0, cpustate->performed_intersegment_jump);
608   state_save_register_postload(device->machine, i386_postload, (void *)device);
608   device->machine->state().register_postload(i386_postload, (void *)device);
609609}
610610
611611static void build_opcode_table(i386_state *cpustate, UINT32 features)
src/emu/cpu/jaguar/jaguar.c
r10330r10331
430430   state_save_register_device_item_array(device, 0, jaguar->a);
431431   state_save_register_device_item_array(device, 0, jaguar->ctrl);
432432   state_save_register_device_item(device, 0, jaguar->ppc);
433   state_save_register_postload(device->machine, jaguar_postload, (void *)device);
433   device->machine->state().register_postload(jaguar_postload, (void *)device);
434434}
435435
436436
src/emu/cpu/arm/arm.c
r10330r10331
535535   state_save_register_device_item_array(device, 0, cpustate->coproRegister);
536536   state_save_register_device_item(device, 0, cpustate->pendingIrq);
537537   state_save_register_device_item(device, 0, cpustate->pendingFiq);
538   state_save_register_device_item(device, 0, cpustate->endian);
539538}
540539
541540
r10330r10331
552551   state_save_register_device_item_array(device, 0, cpustate->coproRegister);
553552   state_save_register_device_item(device, 0, cpustate->pendingIrq);
554553   state_save_register_device_item(device, 0, cpustate->pendingFiq);
555   state_save_register_device_item(device, 0, cpustate->endian);
556554}
557555
558556
src/emu/cpu/g65816/g65816.c
r10330r10331
365365   state_save_register_device_item(device, 0, cpustate->irq_delay);
366366   state_save_register_device_item(device, 0, cpustate->stopped);
367367
368   state_save_register_postload(device->machine, g65816_restore_state, cpustate);
368   device->machine->state().register_postload(g65816_restore_state, cpustate);
369369}
370370
371371/**************************************************************************
src/emu/cpu/mips/psx.c
r10330r10331
16271627   state_save_register_device_item( device, 0, psxcpu->multiplier_operation );
16281628   state_save_register_device_item( device, 0, psxcpu->multiplier_operand1 );
16291629   state_save_register_device_item( device, 0, psxcpu->multiplier_operand2 );
1630   state_save_register_postload( device->machine, mips_postload, psxcpu );
1630   device->machine->state().register_postload( mips_postload, psxcpu );
16311631}
16321632
16331633static CPU_INIT( psxcpu )
src/emu/video/tms9927.c
r10330r10331
283283   }
284284
285285   /* register for state saving */
286   state_save_register_postload(device->machine, tms9927_state_save_postload, tms);
286   device->machine->state().register_postload(tms9927_state_save_postload, tms);
287287
288288   state_save_register_device_item(device, 0, tms->clock);
289289   state_save_register_device_item_array(device, 0, tms->reg);
src/emu/video/poly.c
r10330r10331
347347      poly->queue = osd_work_queue_alloc(WORK_QUEUE_FLAG_MULTI | WORK_QUEUE_FLAG_HIGH_FREQ);
348348
349349   /* request a pre-save callback for synchronization */
350   state_save_register_presave(machine, poly_state_presave, poly);
350   machine->state().register_presave(poly_state_presave, poly);
351351   return poly;
352352}
353353
src/emu/video/mc6845.c
r10330r10331
909909   mc6845->vert_char_total = 0x7f;
910910
911911   /* register for state saving */
912   state_save_register_postload(device->machine, mc6845_state_save_postload, mc6845);
912   device->machine->state().register_postload(mc6845_state_save_postload, mc6845);
913913
914914   state_save_register_device_item(device, 0, mc6845->clock);
915915   state_save_register_device_item(device, 0, mc6845->hpixels_per_column);
src/emu/video/voodoo.c
r10330r10331
656656   voodoo_state *v = get_safe_token(device);
657657   int index, subindex;
658658
659   state_save_register_postload(device->machine, voodoo_postload, v);
659   device->machine->state().register_postload(voodoo_postload, v);
660660
661661   /* register states: core */
662662   state_save_register_device_item(device, 0, v->extra_cycles);
r10330r10331
669669   state_save_register_device_item(device, 0, v->pci.init_enable);
670670   state_save_register_device_item(device, 0, v->pci.stall_state);
671671   state_save_register_device_item(device, 0, v->pci.op_pending);
672   state_save_register_device_item(device, 0, v->pci.op_end_time.seconds);
673   state_save_register_device_item(device, 0, v->pci.op_end_time.attoseconds);
672   state_save_register_device_item(device, 0, v->pci.op_end_time);
674673   state_save_register_device_item_array(device, 0, v->pci.fifo_mem);
675674
676675   /* register states: dac */
src/emu/video/pc_video.c
r10330r10331
5353      video_start_generic_bitmapped(machine);
5454   }
5555
56   state_save_register_postload(machine, pc_video_postload, NULL);
56   machine->state().register_postload(pc_video_postload, NULL);
5757}
5858
5959
src/emu/tilemap.c
r10330r10331
411411   machine->tilemap_data->instance++;
412412
413413   /* reset everything after a load */
414   state_save_register_postload(machine, tilemap_postload, tmap);
414   machine->state().register_postload(tilemap_postload, tmap);
415415   return tmap;
416416}
417417
src/emu/video.c
r10330r10331
136136{
137137   // request a callback upon exiting
138138   machine.add_notifier(MACHINE_NOTIFY_EXIT, exit_static);
139   state_save_register_postload(&machine, state_postload_stub<video_manager, &video_manager::postload>, this);
139   machine.state().register_postload(state_postload_stub<video_manager, &video_manager::postload>, this);
140140
141141   // extract initial execution state from global configuration settings
142142   update_refresh_speed();
src/emu/devintrf.c
r10330r10331
134134   m_machine->add_notifier(MACHINE_NOTIFY_EXIT, static_exit);
135135
136136   // add pre-save and post-load callbacks
137   state_save_register_presave(m_machine, static_pre_save, this);
138   state_save_register_postload(m_machine, static_post_load, this);
137   m_machine->state().register_presave(static_pre_save, this);
138   m_machine->state().register_postload(static_post_load, this);
139139
140140   // iterate over devices to start them
141141   device_t *nextdevice;
r10330r10331
535535device_t::device_t(running_machine &_machine, const device_config &config)
536536   : machine(&_machine),
537537     m_machine(_machine),
538     m_state_manager(_machine.state()),
538539     m_debug(NULL),
539540     m_execute(NULL),
540541     m_memory(NULL),
r10330r10331
724725      intf->interface_pre_start();
725726
726727   // remember the number of state registrations
727   int state_registrations = state_save_get_reg_count(machine);
728   int state_registrations = machine->state().registration_count();
728729
729730   // start the device
730731   device_start();
731732
732733   // complain if nothing was registered by the device
733   state_registrations = state_save_get_reg_count(machine) - state_registrations;
734   state_registrations = machine->state().registration_count() - state_registrations;
734735   device_execute_interface *exec;
735736   device_sound_interface *sound;
736737   if (state_registrations == 0 && (interface(exec) || interface(sound)))
src/emu/devintrf.h
r10330r10331
437437   void synchronize(device_timer_id id = 0, int param = 0, void *ptr = NULL) { timer_set(attotime::zero, id, param, ptr); }
438438   void timer_expired(emu_timer &timer, device_timer_id id, int param, void *ptr) { device_timer(timer, id, param, ptr); }
439439
440   // state saving interfaces
441   template<typename T>
442   void save_item(T &value, const char *valname, int index = 0) { m_state_manager.save_item(name(), tag(), index, value, valname); }
443   template<typename T>
444   void save_pointer(T *value, const char *valname, UINT32 count, int index = 0) { m_state_manager.save_pointer(name(), tag(), index, value, valname); }
445
440446   // debugging
441447   device_debug *debug() const { return m_debug; }
442448
r10330r10331
475481   //------------------- end derived class overrides
476482
477483   running_machine &      m_machine;
484   state_manager &         m_state_manager;
478485   device_debug *         m_debug;
479486
480487   // for speed
src/emu/emu.h
r10330r10331
7070#include "memory.h"
7171#include "addrmap.h"
7272
73// machine-wide utilities
74#include "romload.h"
75#include "state.h"
76
7377// define machine_config_constructor here due to circular dependency
7478// between devices and the machine config
7579class machine_config;
r10330r10331
103107#include "mconfig.h"
104108#include "driver.h"
105109
106// machine-wide utilities
107#include "romload.h"
108#include "state.h"
109
110110// image-related
111111#include "softlist.h"
112112#include "image.h"
src/emu/machine.c
r10330r10331
154154     sample_rate(options_get_int(&options, OPTION_SAMPLERATE)),
155155     debug_flags(0),
156156      ui_active(false),
157     state_data(NULL),
158157     memory_data(NULL),
159158     palette_data(NULL),
160159     tilemap_data(NULL),
r10330r10331
167166     generic_video_data(NULL),
168167     generic_audio_data(NULL),
169168     m_logerror_list(NULL),
169     m_state(*this),
170170     m_scheduler(*this),
171171     m_options(options),
172172     m_osd(osd),
r10330r10331
264264   config_init(this);
265265   input_init(this);
266266   output_init(this);
267   state_init(this);
268   state_save_allow_registration(this, true);
269267   palette_init(this);
270268   m_render = auto_alloc(this, render_manager(*this));
271269   generic_machine_init(this);
272270   generic_sound_init(this);
273271   
274   m_scheduler.register_for_save();
275
276272   // allocate a soft_reset timer
277273   m_soft_reset_timer = m_scheduler.timer_alloc(MSTUB(timer_expired, running_machine, soft_reset), this);
278274
r10330r10331
344340   m_cheat = auto_alloc(this, cheat_manager(*this));
345341
346342   // disallow save state registrations starting here
347   state_save_allow_registration(this, false);
343   m_state.allow_registration(false);
348344}
349345
350346
r10330r10331
798794      astring fullname(mame_file_full_name(file));
799795
800796      // read/write the save state
801      state_save_error staterr = (m_saveload_schedule == SLS_LOAD) ? state_save_read_file(this, file) : state_save_write_file(this, file);
797      state_save_error staterr = (m_saveload_schedule == SLS_LOAD) ? m_state.read_file(file) : m_state.write_file(file);
802798
803799      // handle the result
804800      switch (staterr)
src/emu/sound/2612intf.c
r10330r10331
118118   info->chip = ym2612_init(info,device,device->clock(),rate,timer_handler,IRQHandler);
119119   assert_always(info->chip != NULL, "Error creating YM2612 chip");
120120
121   state_save_register_postload(device->machine, ym2612_intf_postload, info);
121   device->machine->state().register_postload(ym2612_intf_postload, info);
122122}
123123
124124
src/emu/sound/fm2612.c
r10330r10331
17071707static void FMsave_state_st(device_t *device,FM_ST *ST)
17081708{
17091709#if FM_BUSY_FLAG_SUPPORT
1710   state_save_register_device_item(device, 0, ST->busy_expiry_time.seconds );
1711   state_save_register_device_item(device, 0, ST->busy_expiry_time.attoseconds );
1710   state_save_register_device_item(device, 0, ST->busy_expiry_time );
17121711#endif
17131712   state_save_register_device_item(device, 0, ST->address );
17141713   state_save_register_device_item(device, 0, ST->irq     );
src/emu/sound/k054539.c
r10330r10331
674674
675675   k054539_init_chip(device, info);
676676
677   state_save_register_postload(device->machine, reset_zones, info);
677   device->machine->state().register_postload(reset_zones, info);
678678}
679679
680680
src/emu/sound/ymz280b.c
r10330r10331
694694      }
695695   }
696696
697   state_save_register_postload(device->machine, YMZ280B_state_save_update_step, chip);
697   device->machine->state().register_postload(YMZ280B_state_save_update_step, chip);
698698
699699#if MAKE_WAVS
700700   chip->wavresample = wav_open("resamp.wav", INTERNAL_SAMPLE_RATE, 2);
src/emu/sound/upd7759.c
r10330r10331
628628   state_save_register_device_item(device, 0, chip->sample);
629629
630630   state_save_register_device_item(device, 0, chip->romoffset);
631   state_save_register_postload(device->machine, upd7759_postload, chip);
631   device->machine->state().register_postload(upd7759_postload, chip);
632632}
633633
634634
src/emu/sound/pokey.c
r10330r10331
589589   state_save_register_device_item(device, 0, chip->r9);
590590   state_save_register_device_item(device, 0, chip->r17);
591591   state_save_register_device_item(device, 0, chip->clockmult);
592   state_save_register_device_item(device, 0, chip->timer_period[0].seconds);
593   state_save_register_device_item(device, 0, chip->timer_period[0].attoseconds);
594   state_save_register_device_item(device, 0, chip->timer_period[1].seconds);
595   state_save_register_device_item(device, 0, chip->timer_period[1].attoseconds);
596   state_save_register_device_item(device, 0, chip->timer_period[2].seconds);
597   state_save_register_device_item(device, 0, chip->timer_period[2].attoseconds);
592   state_save_register_device_item(device, 0, chip->timer_period[0]);
593   state_save_register_device_item(device, 0, chip->timer_period[1]);
594   state_save_register_device_item(device, 0, chip->timer_period[2]);
598595   state_save_register_device_item_array(device, 0, chip->timer_param);
599596   state_save_register_device_item_array(device, 0, chip->AUDF);
600597   state_save_register_device_item_array(device, 0, chip->AUDC);
src/emu/sound/ym2151.c
r10330r10331
14851485
14861486   state_save_register_device_item_array(device, 0, chip->connect);
14871487
1488   state_save_register_postload(device->machine, ym2151_postload, chip);
1488   device->machine->state().register_postload(ym2151_postload, chip);
14891489}
14901490#else
14911491STATE_POSTLOAD( ym2151_postload )
src/emu/sound/samples.c
r10330r10331
501501        state_save_register_device_item(device, i, info->channel[i].loop);
502502        state_save_register_device_item(device, i, info->channel[i].paused);
503503   }
504   state_save_register_postload(device->machine, samples_postload, info);
504   device->machine->state().register_postload(samples_postload, info);
505505
506506   /* initialize any custom handlers */
507507   if (intf->start)
src/emu/sound/msm5232.c
r10330r10331
799799   chip->stream = device->machine->sound().stream_alloc(*device, 0, 11, rate, chip, MSM5232_update_one);
800800
801801   /* register with the save state system */
802   state_save_register_postload(device->machine, msm5232_postload, chip);
802   device->machine->state().register_postload(msm5232_postload, chip);
803803   state_save_register_device_item_array(device, 0, chip->EN_out16);
804804   state_save_register_device_item_array(device, 0, chip->EN_out8);
805805   state_save_register_device_item_array(device, 0, chip->EN_out4);
src/emu/sound/2610intf.c
r10330r10331
179179                 timer_handler,IRQHandler,&psgintf);
180180   assert_always(info->chip != NULL, "Error creating YM2610 chip");
181181
182   state_save_register_postload(device->machine, ym2610_intf_postload, info);
182   device->machine->state().register_postload(ym2610_intf_postload, info);
183183}
184184
185185static DEVICE_STOP( ym2610 )
src/emu/sound/fmopl.c
r10330r10331
19571957   state_save_register_device_item(device, 0, OPL->statusmask);
19581958   state_save_register_device_item(device, 0, OPL->mode);
19591959
1960   state_save_register_postload(device->machine, OPL_postload, OPL);
1960   device->machine->state().register_postload(OPL_postload, OPL);
19611961}
19621962
19631963
src/emu/sound/fm.c
r10330r10331
17041704static void FMsave_state_st(device_t *device,FM_ST *ST)
17051705{
17061706#if FM_BUSY_FLAG_SUPPORT
1707   state_save_register_device_item(device, 0, ST->busy_expiry_time.seconds );
1708   state_save_register_device_item(device, 0, ST->busy_expiry_time.attoseconds );
1707   state_save_register_device_item(device, 0, ST->busy_expiry_time );
17091708#endif
17101709   state_save_register_device_item(device, 0, ST->address );
17111710   state_save_register_device_item(device, 0, ST->irq     );
src/emu/sound/2608intf.c
r10330r10331
167167                 timer_handler,IRQHandler,&psgintf);
168168   assert_always(info->chip != NULL, "Error creating YM2608 chip");
169169
170   state_save_register_postload(device->machine, ym2608_intf_postload, info);
170   device->machine->state().register_postload(ym2608_intf_postload, info);
171171}
172172
173173static DEVICE_STOP( ym2608 )
src/emu/sound/2151intf.c
r10330r10331
6161   info->chip = ym2151_init(device,device->clock(),rate);
6262   assert_always(info->chip != NULL, "Error creating YM2151 chip");
6363
64   state_save_register_postload(device->machine, ym2151intf_postload, info);
64   device->machine->state().register_postload(ym2151intf_postload, info);
6565
6666   ym2151_set_irq_handler(info->chip,info->intf->irqhandler);
6767   ym2151_set_port_write_handler(info->chip,info->intf->portwritehandler);
src/emu/sound/vlm5030.c
r10330r10331
726726   state_save_register_device_item(device,0,chip->target_pitch);
727727   state_save_register_device_item_array(device,0,chip->target_k);
728728   state_save_register_device_item_array(device,0,chip->x);
729   state_save_register_postload(device->machine, vlm5030_restore_state, chip);
729   device->machine->state().register_postload(vlm5030_restore_state, chip);
730730}
731731
732732
src/emu/sound/2203intf.c
r10330r10331
144144   info->chip = ym2203_init(info,device,device->clock(),rate,timer_handler,IRQHandler,&psgintf);
145145   assert_always(info->chip != NULL, "Error creating YM2203 chip");
146146
147   state_save_register_postload(device->machine, ym2203_intf_postload, info);
147   device->machine->state().register_postload(ym2203_intf_postload, info);
148148}
149149
150150static DEVICE_STOP( ym2203 )
src/emu/machine.h
r10330r10331
187187class debug_view_manager;
188188class osd_interface;
189189
190typedef struct _state_private state_private;
191190typedef struct _memory_private memory_private;
192191typedef struct _palette_private palette_private;
193192typedef struct _tilemap_private tilemap_private;
r10330r10331
356355   bool exit_pending() const { return m_exit_pending; }
357356   bool new_driver_pending() const { return (m_new_driver_pending != NULL); }
358357   const char *new_driver_name() const { return m_new_driver_pending->name; }
358   state_manager &state() { return m_state; }
359359   device_scheduler &scheduler() { return m_scheduler; }
360360   osd_interface &osd() const { return m_osd; }
361361   screen_device *first_screen() const { return primary_screen; }
r10330r10331
440440   generic_pointers      generic;         // generic pointers
441441
442442   // internal core information
443   state_private *         state_data;         // internal data from state.c
444443   memory_private *      memory_data;      // internal data from memory.c
445444   palette_private *      palette_data;      // internal data from palette.c
446445   tilemap_private *      tilemap_data;      // internal data from tilemap.c
r10330r10331
486485   };
487486   logerror_callback_item *m_logerror_list;
488487
488   state_manager         m_state;         // state manager
489489   device_scheduler      m_scheduler;      // scheduler object
490490   core_options &         m_options;
491491   osd_interface &         m_osd;
src/emu/state.c
r10330r10331
44
55    Save state management functions.
66
7    Copyright Nicola Salmoria and the MAME Team.
8    Visit http://mamedev.org for licensing and usage restrictions.
7****************************************************************************
98
9    Copyright Aaron Giles
10    All rights reserved.
11
12    Redistribution and use in source and binary forms, with or without
13    modification, are permitted provided that the following conditions are
14    met:
15
16        * Redistributions of source code must retain the above copyright
17          notice, this list of conditions and the following disclaimer.
18        * Redistributions in binary form must reproduce the above copyright
19          notice, this list of conditions and the following disclaimer in
20          the documentation and/or other materials provided with the
21          distribution.
22        * Neither the name 'MAME' nor the names of its contributors may be
23          used to endorse or promote products derived from this software
24          without specific prior written permission.
25
26    THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
27    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
28    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29    DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
30    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
35    IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36    POSSIBILITY OF SUCH DAMAGE.
37
1038****************************************************************************
1139
1240    Save state file format:
r10330r10331
2856#include <zlib.h>
2957
3058
59//**************************************************************************
60//  DEBUGGING
61//**************************************************************************
3162
32/***************************************************************************
33    DEBUGGING
34***************************************************************************/
63#define VERBOSE 1
3564
36#define VERBOSE 0
37
3865#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
3966
4067
4168
42/***************************************************************************
43    CONSTANTS
44***************************************************************************/
69//**************************************************************************
70//  CONSTANTS
71//**************************************************************************
4572
46#define SAVE_VERSION      2
47#define HEADER_SIZE         32
73const int SAVE_VERSION      = 2;
74const int HEADER_SIZE      = 32;
4875
49/* Available flags */
76// Available flags
5077enum
5178{
5279   SS_MSB_FIRST = 0x02
r10330r10331
5481
5582
5683
57/***************************************************************************
58    TYPE DEFINITIONS
59***************************************************************************/
84//**************************************************************************
85//  GLOBAL VARIABLES
86//**************************************************************************
6087
61typedef struct _state_entry state_entry;
62struct _state_entry
63{
64   state_entry *      next;            /* pointer to next entry */
65   running_machine *   machine;         /* pointer back to the owning machine */
66   void *            data;            /* pointer to the memory to save/restore */
67   astring            name;            /* full name */
68   UINT8            typesize;         /* size of the raw data type */
69   UINT32            typecount;         /* number of items */
70   UINT32            offset;            /* offset within the final structure */
71};
72
73
74typedef struct _state_callback state_callback;
75struct _state_callback
76{
77   state_callback *   next;            /* pointer to next entry */
78   running_machine *   machine;         /* pointer back to the owning machine */
79   void *            param;            /* function parameter */
80   union
81   {
82      state_presave_func presave;         /* presave callback */
83      state_postload_func postload;      /* postload callback */
84   } func;                           /* function pointers */
85};
86
87
88/* In mame.h: typedef struct _state_private state_private; */
89struct _state_private
90{
91   UINT8            reg_allowed;      /* are registrations allowed? */
92   int               illegal_regs;      /* number of illegal registrations */
93
94   state_entry *      entrylist;         /* list of live entries */
95   state_callback *   prefunclist;      /* presave function list */
96   state_callback *   postfunclist;      /* postsave function list */
97
98   UINT8 *            ioarray;         /* array where we accumulate all the data */
99   UINT32            ioarraysize;      /* size of the array */
100   mame_file *         iofile;            /* file currently in use */
101};
102
103
104
105/***************************************************************************
106    GLOBAL VARIABLES
107***************************************************************************/
108
10988#ifdef MESS
110static const char ss_magic_num[8] = { 'M', 'E', 'S', 'S', 'S', 'A', 'V', 'E' };
89const char state_manager::s_magic_num[8] = { 'M', 'E', 'S', 'S', 'S', 'A', 'V', 'E' };
11190#else
112static const char ss_magic_num[8] = { 'M', 'A', 'M', 'E', 'S', 'A', 'V', 'E' };
91const char state_manager::s_magic_num[8] = { 'M', 'A', 'M', 'E', 'S', 'A', 'V', 'E' };
11392#endif
11493
11594
11695
117/***************************************************************************
118    INLINE FUNCTIONS
119***************************************************************************/
96//**************************************************************************
97//  INITIALIZATION
98//**************************************************************************
12099
121/*-------------------------------------------------
122    flip_data - reverse the endianness of a
123    block of  data
124-------------------------------------------------*/
100//-------------------------------------------------
101//  state_manager - constructor
102//-------------------------------------------------
125103
126INLINE void flip_data(state_entry *entry)
104state_manager::state_manager(running_machine &machine)
105   : m_machine(machine),
106     m_reg_allowed(true),
107     m_illegal_regs(0),
108     m_entry_list(machine.m_respool),
109     m_presave_list(machine.m_respool),
110     m_postload_list(machine.m_respool)
127111{
128   UINT16 *data16;
129   UINT32 *data32;
130   UINT64 *data64;
131   int count;
112}
132113
133   switch (entry->typesize)
134   {
135      case 2:
136         data16 = (UINT16 *)entry->data;
137         for (count = 0; count < entry->typecount; count++)
138            data16[count] = FLIPENDIAN_INT16(data16[count]);
139         break;
140114
141      case 4:
142         data32 = (UINT32 *)entry->data;
143         for (count = 0; count < entry->typecount; count++)
144            data32[count] = FLIPENDIAN_INT32(data32[count]);
145         break;
115//-------------------------------------------------
116//  allow_registration - allow/disallow
117//  registrations to happen
118//-------------------------------------------------
146119
147      case 8:
148         data64 = (UINT64 *)entry->data;
149         for (count = 0; count < entry->typecount; count++)
150            data64[count] = FLIPENDIAN_INT64(data64[count]);
151         break;
152   }
120void state_manager::allow_registration(bool allowed)
121{
122   // allow/deny registration
123   m_reg_allowed = allowed;
124   if (!allowed)
125      dump_registry();
153126}
154127
155128
129//-------------------------------------------------
130//  indexed_item - return an item with the given
131//  index
132//-------------------------------------------------
156133
157/***************************************************************************
158    INITIALIZATION
159***************************************************************************/
160
161/*-------------------------------------------------
162    state_init - initialize the system and reset
163    all registrations
164-------------------------------------------------*/
165
166enum test_enum_type { test_val };
167
168class test_class_type { public: int dummy; };
169
170void state_init(running_machine *machine)
134const char *state_manager::indexed_item(int index, void *&base, UINT32 &valsize, UINT32 &valcount) const
171135{
172   bool test_bool = false;
173   INT8 test_INT8 = 0;
174   UINT8 test_UINT8 = 0;
175   INT16 test_INT16 = 0;
176   UINT16 test_UINT16 = 0;
177   INT32 test_INT32 = 0;
178   UINT32 test_UINT32 = 0;
179   INT64 test_INT64 = 0;
180   UINT64 test_UINT64 = 0;
181   float test_float = 0.0f;
182   double test_double = 0.0;
183   test_enum_type test_enum = test_val;
184#ifdef __GNUC__
185   test_class_type test_class;
186#endif
187
188   assert_always(IS_VALID_SAVE_TYPE(test_bool), "bool is not a valid type for save");
189   assert_always(IS_VALID_SAVE_TYPE(test_INT8), "INT8 is not a valid type for save");
190   assert_always(IS_VALID_SAVE_TYPE(test_UINT8), "UINT8 is not a valid type for save");
191   assert_always(IS_VALID_SAVE_TYPE(test_INT16), "INT16 is not a valid type for save");
192   assert_always(IS_VALID_SAVE_TYPE(test_UINT16), "UINT16 is not a valid type for save");
193   assert_always(IS_VALID_SAVE_TYPE(test_INT32), "INT32 is not a valid type for save");
194   assert_always(IS_VALID_SAVE_TYPE(test_UINT32), "UINT32 is not a valid type for save");
195   assert_always(IS_VALID_SAVE_TYPE(test_INT64), "INT64 is not a valid type for save");
196   assert_always(IS_VALID_SAVE_TYPE(test_UINT64), "UINT64 is not a valid type for save");
197   assert_always(IS_VALID_SAVE_TYPE(test_float), "float is not a valid type for save");
198   assert_always(IS_VALID_SAVE_TYPE(test_double), "double is not a valid type for save");
199   assert_always(IS_VALID_SAVE_TYPE(test_enum), "enums are not a valid type for save");
200#ifdef __GNUC__
201   assert_always(!IS_VALID_SAVE_TYPE(test_class), "classes are a valid type for save");
202#endif
203
204   machine->state_data = auto_alloc_clear(machine, state_private);
136   state_entry *entry = m_entry_list.find(index);
137   if (entry == NULL)
138      return NULL;
139   
140   base = entry->m_data;
141   valsize = entry->m_typesize;
142   valcount = entry->m_typecount;
143   
144   return entry->m_name;
205145}
206146
207147
208/*-------------------------------------------------
209    state_save_get_reg_count - return the number
210    of total registrations so far
211-------------------------------------------------*/
148//-------------------------------------------------
149//  register_presave - register a pre-save
150//  function callback
151//-------------------------------------------------
212152
213int state_save_get_reg_count(running_machine *machine)
153void state_manager::register_presave(prepost_func func, void *param)
214154{
215   state_private *global = machine->state_data;
216   state_entry *entry;
217   int count = 0;
155   // check for invalid timing
156   if (!m_reg_allowed)
157      fatalerror("Attempt to register callback function after state registration is closed!");
218158
219   /* count entries */
220   for (entry = global->entrylist; entry != NULL; entry = entry->next)
221      count++;
159   // scan for duplicates and push through to the end
160   for (state_callback *cb = m_presave_list.first(); cb != NULL; cb = cb->next())
161      if (cb->m_func == func && cb->m_param == param)
162         fatalerror("Duplicate save state function (%p, %p)", param, func);
222163
223   return count;
164   // allocate a new entry
165   m_presave_list.append(*auto_alloc(&m_machine, state_callback(func, param)));
224166}
225167
226168
169//-------------------------------------------------
170//  state_save_register_postload -
171//  register a post-load function callback
172//-------------------------------------------------
227173
228/***************************************************************************
229    REGISTRATION HANDLING
230***************************************************************************/
231
232/*-------------------------------------------------
233    state_save_allow_registration - allow/disallow
234    registrations to happen
235-------------------------------------------------*/
236
237void state_save_allow_registration(running_machine *machine, int allowed)
174void state_manager::register_postload(prepost_func func, void *param)
238175{
239   /* allow/deny registration */
240   machine->state_data->reg_allowed = allowed;
241   if (!allowed)
242      state_save_dump_registry(machine);
243}
176   // check for invalid timing
177   if (!m_reg_allowed)
178      fatalerror("Attempt to register callback function after state registration is closed!");
244179
180   // scan for duplicates and push through to the end
181   for (state_callback *cb = m_postload_list.first(); cb != NULL; cb = cb->next())
182      if (cb->m_func == func && cb->m_param == param)
183         fatalerror("Duplicate save state function (%p, %p)", param, func);
245184
246/*-------------------------------------------------
247    state_save_registration_allowed - query
248    whether or not registrations are allowed
249-------------------------------------------------*/
250
251int state_save_registration_allowed(running_machine *machine)
252{
253   return machine->state_data->reg_allowed;
185   // allocate a new entry
186   m_postload_list.append(*auto_alloc(&m_machine, state_callback(func, param)));
254187}
255188
256189
257/*-------------------------------------------------
258    state_save_register_memory - register an
259    array of data in memory
260-------------------------------------------------*/
190//-------------------------------------------------
191//  save_memory - register an array of data in
192//  memory
193//-------------------------------------------------
261194
262void state_save_register_memory(running_machine *machine, const char *module, const char *tag, UINT32 index, const char *name, void *val, UINT32 valsize, UINT32 valcount, const char *file, int line)
195void state_manager::save_memory(const char *module, const char *tag, UINT32 index, const char *name, void *val, UINT32 valsize, UINT32 valcount)
263196{
264   state_private *global = machine->state_data;
265   state_entry **entryptr, *next;
266   astring totalname;
267
268197   assert(valsize == 1 || valsize == 2 || valsize == 4 || valsize == 8);
269198
270   /* check for invalid timing */
271   if (!global->reg_allowed)
199   // check for invalid timing
200   if (!m_reg_allowed)
272201   {
273      logerror("Attempt to register save state entry after state registration is closed!\nFile: %s, line %d, module %s tag %s name %s\n", file, line, module, tag, name);
274      if (machine->gamedrv->flags & GAME_SUPPORTS_SAVE)
275         fatalerror("Attempt to register save state entry after state registration is closed!\nFile: %s, line %d, module %s tag %s name %s\n", file, line, module, tag, name);
276      global->illegal_regs++;
202      logerror("Attempt to register save state entry after state registration is closed!\nModule %s tag %s name %s\n", module, tag, name);
203      if (m_machine.gamedrv->flags & GAME_SUPPORTS_SAVE)
204         fatalerror("Attempt to register save state entry after state registration is closed!\nModule %s tag %s name %s\n", module, tag, name);
205      m_illegal_regs++;
277206      return;
278207   }
279208
280   /* create the full name */
209   // create the full name
210   astring totalname;
281211   if (tag != NULL)
282212      totalname.printf("%s/%s/%X/%s", module, tag, index, name);
283213   else
284214      totalname.printf("%s/%X/%s", module, index, name);
285215
286   /* look for duplicates and an entry to insert in front of */
287   for (entryptr = &global->entrylist; *entryptr != NULL; entryptr = &(*entryptr)->next)
216   // look for duplicates and an entry to insert in front of
217   state_entry *insert_after = NULL;
218   for (state_entry *entry = m_entry_list.first(); entry != NULL; entry = entry->next())
288219   {
289      /* stop if the next guy's string is greater than ours */
290      int cmpval = (*entryptr)->name.cmp(totalname);
291      if (cmpval > 0)
220      // stop when we find an entry whose name is after ours
221      if (entry->m_name > totalname)
292222         break;
223      insert_after = entry;
293224
294      /* error if we are equal */
295      if (cmpval == 0)
225      // error if we are equal
226      if (entry->m_name == totalname)
296227         fatalerror("Duplicate save state registration entry (%s)", totalname.cstr());
297228   }
298229
299   /* didn't find one; allocate a new one */
300   next = *entryptr;
301   *entryptr = auto_alloc_clear(machine, state_entry);
302
303   /* fill in the rest */
304   (*entryptr)->next      = next;
305   (*entryptr)->machine   = machine;
306   (*entryptr)->data      = val;
307   (*entryptr)->name      = totalname;
308   (*entryptr)->typesize  = valsize;
309   (*entryptr)->typecount = valcount;
230   // insert us into the list   
231   m_entry_list.insert_after(*auto_alloc(&m_machine, state_entry(val, totalname, valsize, valcount)), insert_after);
310232}
311233
312234
313/*-------------------------------------------------
314    state_save_register_bitmap - register a
315    bitmap to be saved
316-------------------------------------------------*/
235//-------------------------------------------------
236//  check_file - check if a file is a valid save
237//  state
238//-------------------------------------------------
317239
318void state_save_register_bitmap(running_machine *machine, const char *module, const char *tag, UINT32 index, const char *name, bitmap_t *val, const char *file, int line)
240state_save_error state_manager::check_file(running_machine *machine, mame_file *file, const char *gamename, void (CLIB_DECL *errormsg)(const char *fmt, ...))
319241{
320   state_save_register_memory(machine, module, tag, index, name, val->base, val->bpp / 8, val->rowpixels * val->height, file, line);
321}
242   // if we want to validate the signature, compute it
243   UINT32 sig = 0;
244   if (machine != NULL)
245      sig = machine->state().signature();
322246
247   // seek to the beginning and read the header
248   mame_fcompress(file, FCOMPRESS_NONE);
249   mame_fseek(file, 0, SEEK_SET);
250   UINT8 header[HEADER_SIZE];
251   if (mame_fread(file, header, sizeof(header)) != sizeof(header))
252   {
253      if (errormsg != NULL)
254         (*errormsg)("Could not read " APPNAME " save file header");
255      return STATERR_READ_ERROR;
256   }
323257
258   // let the generic header check work out the rest
259   return validate_header(header, gamename, sig, errormsg, "");
260}
324261
325/***************************************************************************
326    CALLBACK FUNCTION REGISTRATION
327***************************************************************************/
328262
329/*-------------------------------------------------
330    state_save_register_presave -
331    register a pre-save function callback
332-------------------------------------------------*/
263//-------------------------------------------------
264//  read_file - read the data from a file
265//-------------------------------------------------
333266
334void state_save_register_presave(running_machine *machine, state_presave_func func, void *param)
267state_save_error state_manager::read_file(mame_file *file)
335268{
336   state_private *global = machine->state_data;
337   state_callback **cbptr;
269   // if we have illegal registrations, return an error
270   if (m_illegal_regs > 0)
271      return STATERR_ILLEGAL_REGISTRATIONS;
338272
339   /* check for invalid timing */
340   if (!global->reg_allowed)
341      fatalerror("Attempt to register callback function after state registration is closed!");
273   // read the header and turn on compression for the rest of the file
274   mame_fcompress(file, FCOMPRESS_NONE);
275   mame_fseek(file, 0, SEEK_SET);
276   UINT8 header[HEADER_SIZE];
277   if (mame_fread(file, header, sizeof(header)) != sizeof(header))
278      return STATERR_READ_ERROR;
279   mame_fcompress(file, FCOMPRESS_MEDIUM);
342280
343   /* scan for duplicates and push through to the end */
344   for (cbptr = &global->prefunclist; *cbptr != NULL; cbptr = &(*cbptr)->next)
345      if ((*cbptr)->func.presave == func && (*cbptr)->param == param)
346         fatalerror("Duplicate save state function (%p, %p)", param, func);
281   // verify the header and report an error if it doesn't match
282   UINT32 sig = signature();
283   if (validate_header(header, m_machine.gamedrv->name, sig, popmessage, "Error: ")  != STATERR_NONE)
284      return STATERR_INVALID_HEADER;
347285
348   /* allocate a new entry */
349   *cbptr = auto_alloc(machine, state_callback);
286   // determine whether or not to flip the data when done
287   bool flip = NATIVE_ENDIAN_VALUE_LE_BE((header[9] & SS_MSB_FIRST) != 0, (header[9] & SS_MSB_FIRST) == 0);
350288
351   /* fill it in */
352   (*cbptr)->next         = NULL;
353   (*cbptr)->machine      = machine;
354   (*cbptr)->func.presave = func;
355   (*cbptr)->param        = param;
289   // read all the data, flipping if necessary
290   for (state_entry *entry = m_entry_list.first(); entry != NULL; entry = entry->next())
291   {
292      UINT32 totalsize = entry->m_typesize * entry->m_typecount;
293      if (mame_fread(file, entry->m_data, totalsize) != totalsize)
294         return STATERR_READ_ERROR;
295
296      // handle flipping
297      if (flip)
298         entry->flip_data();
299   }
300
301   // call the post-load functions
302   for (state_callback *func = m_postload_list.first(); func != NULL; func = func->next())
303      (*func->m_func)(&m_machine, func->m_param);
304
305   return STATERR_NONE;
356306}
357307
358308
359/*-------------------------------------------------
360    state_save_register_postload -
361    register a post-load function callback
362-------------------------------------------------*/
309//-------------------------------------------------
310//  write_file - writes the data to a file
311//-------------------------------------------------
363312
364void state_save_register_postload(running_machine *machine, state_postload_func func, void *param)
313state_save_error state_manager::write_file(mame_file *file)
365314{
366   state_private *global = machine->state_data;
367   state_callback **cbptr;
315   // if we have illegal registrations, return an error
316   if (m_illegal_regs > 0)
317      return STATERR_ILLEGAL_REGISTRATIONS;
368318
369   /* check for invalid timing */
370   if (!global->reg_allowed)
371      fatalerror("Attempt to register callback function after state registration is closed!");
319   // generate the header
320   UINT8 header[HEADER_SIZE];
321   memcpy(&header[0], s_magic_num, 8);
322   header[8] = SAVE_VERSION;
323   header[9] = NATIVE_ENDIAN_VALUE_LE_BE(0, SS_MSB_FIRST);
324   strncpy((char *)&header[0x0a], m_machine.gamedrv->name, 0x1c - 0x0a);
325   UINT32 sig = signature();
326   *(UINT32 *)&header[0x1c] = LITTLE_ENDIANIZE_INT32(sig);
372327
373   /* scan for duplicates and push through to the end */
374   for (cbptr = &global->postfunclist; *cbptr != NULL; cbptr = &(*cbptr)->next)
375      if ((*cbptr)->func.postload == func && (*cbptr)->param == param)
376         fatalerror("Duplicate save state function (%p, %p)", param, func);
328   // write the header and turn on compression for the rest of the file
329   mame_fcompress(file, FCOMPRESS_NONE);
330   mame_fseek(file, 0, SEEK_SET);
331   if (mame_fwrite(file, header, sizeof(header)) != sizeof(header))
332      return STATERR_WRITE_ERROR;
333   mame_fcompress(file, FCOMPRESS_MEDIUM);
377334
378   /* allocate a new entry */
379   *cbptr = auto_alloc(machine, state_callback);
335   // call the pre-save functions
336   for (state_callback *func = m_presave_list.first(); func != NULL; func = func->next())
337      (*func->m_func)(&m_machine, func->m_param);
380338
381   /* fill it in */
382   (*cbptr)->next          = NULL;
383   (*cbptr)->machine       = machine;
384   (*cbptr)->func.postload = func;
385   (*cbptr)->param         = param;
339   // then write all the data
340   for (state_entry *entry = m_entry_list.first(); entry != NULL; entry = entry->next())
341   {
342      UINT32 totalsize = entry->m_typesize * entry->m_typecount;
343      if (mame_fwrite(file, entry->m_data, totalsize) != totalsize)
344         return STATERR_WRITE_ERROR;
345   }
346   return STATERR_NONE;
386347}
387348
388349
350//-------------------------------------------------
351//  signature - compute the signature, which
352//  is a CRC over the structure of the data
353//-------------------------------------------------
389354
390/***************************************************************************
391    PROCESSING HELPERS
392***************************************************************************/
393
394/*-------------------------------------------------
395    get_signature - compute the signature, which
396    is a CRC over the structure of the data
397-------------------------------------------------*/
398
399static UINT32 get_signature(running_machine *machine)
355UINT32 state_manager::signature() const
400356{
401   state_private *global = machine->state_data;
402   state_entry *entry;
357   // iterate over entries
403358   UINT32 crc = 0;
404
405   /* iterate over entries */
406   for (entry = global->entrylist; entry != NULL; entry = entry->next)
359   for (state_entry *entry = m_entry_list.first(); entry != NULL; entry = entry->next())
407360   {
408      UINT32 temp[2];
361      // add the entry name to the CRC
362      crc = crc32(crc, (UINT8 *)entry->m_name.cstr(), entry->m_name.len());
409363
410      /* add the entry name to the CRC */
411      crc = crc32(crc, (UINT8 *)entry->name.cstr(), entry->name.len());
412
413      /* add the type and size to the CRC */
414      temp[0] = LITTLE_ENDIANIZE_INT32(entry->typecount);
415      temp[1] = LITTLE_ENDIANIZE_INT32(entry->typesize);
364      // add the type and size to the CRC
365      UINT32 temp[2];
366      temp[0] = LITTLE_ENDIANIZE_INT32(entry->m_typecount);
367      temp[1] = LITTLE_ENDIANIZE_INT32(entry->m_typesize);
416368      crc = crc32(crc, (UINT8 *)&temp[0], sizeof(temp));
417369   }
418
419370   return crc;
420371}
421372
422373
374//-------------------------------------------------
375//  dump_registry - dump the registry to the
376//  logfile
377//-------------------------------------------------
423378
424/***************************************************************************
425    SAVE STATE FILE PROCESSING
426***************************************************************************/
379void state_manager::dump_registry() const
380{
381   for (state_entry *entry = m_entry_list.first(); entry != NULL; entry = entry->next())
382      LOG(("%s: %d x %d\n", entry->m_name.cstr(), entry->m_typesize, entry->m_typecount));
383}
427384
428/*-------------------------------------------------
429    validate_header - validate the data in the
430    header
431-------------------------------------------------*/
432385
433static state_save_error validate_header(const UINT8 *header, const char *gamename, UINT32 signature,
386//-------------------------------------------------
387//  validate_header - validate the data in the
388//  header
389//-------------------------------------------------
390
391state_save_error state_manager::validate_header(const UINT8 *header, const char *gamename, UINT32 signature,
434392   void (CLIB_DECL *errormsg)(const char *fmt, ...), const char *error_prefix)
435393{
436   /* check magic number */
437   if (memcmp(header, ss_magic_num, 8))
394   // check magic number
395   if (memcmp(header, s_magic_num, 8))
438396   {
439397      if (errormsg != NULL)
440398         (*errormsg)("%sThis is not a " APPNAME " save file", error_prefix);
441399      return STATERR_INVALID_HEADER;
442400   }
443401
444   /* check save state version */
402   // check save state version
445403   if (header[8] != SAVE_VERSION)
446404   {
447405      if (errormsg != NULL)
r10330r10331
449407      return STATERR_INVALID_HEADER;
450408   }
451409
452   /* check gamename, if we were asked to */
410   // check gamename, if we were asked to
453411   if (gamename != NULL && strncmp(gamename, (const char *)&header[0x0a], 0x1c - 0x0a))
454412   {
455413      if (errormsg != NULL)
r10330r10331
457415      return STATERR_INVALID_HEADER;
458416   }
459417
460   /* check signature, if we were asked to */
418   // check signature, if we were asked to
461419   if (signature != 0)
462420   {
463421      UINT32 rawsig = *(UINT32 *)&header[0x1c];
r10330r10331
472430}
473431
474432
475/*-------------------------------------------------
476    state_save_check_file - check if a file is
477    a valid save state
478-------------------------------------------------*/
433//-------------------------------------------------
434//  state_callback - constructor
435//-------------------------------------------------
479436
480state_save_error state_save_check_file(running_machine *machine, mame_file *file, const char *gamename, void (CLIB_DECL *errormsg)(const char *fmt, ...))
437state_manager::state_callback::state_callback(prepost_func callback, void *param)
438   : m_next(NULL),
439     m_param(param),
440     m_func(callback)
481441{
482   UINT8 header[HEADER_SIZE];
483   UINT32 signature = 0;
484
485   /* if we want to validate the signature, compute it */
486   if (machine != NULL)
487      signature = get_signature(machine);
488
489   /* seek to the beginning and read the header */
490   mame_fcompress(file, FCOMPRESS_NONE);
491   mame_fseek(file, 0, SEEK_SET);
492   if (mame_fread(file, header, sizeof(header)) != sizeof(header))
493   {
494      if (errormsg != NULL)
495         (*errormsg)("Could not read " APPNAME " save file header");
496      return STATERR_READ_ERROR;
497   }
498
499   /* let the generic header check work out the rest */
500   return validate_header(header, gamename, signature, errormsg, "");
501442}
502443
503444
504/*-------------------------------------------------
505    state_save_write_file - writes the data to
506    a file
507-------------------------------------------------*/
445//-------------------------------------------------
446//  state_entry - constructor
447//-------------------------------------------------
508448
509state_save_error state_save_write_file(running_machine *machine, mame_file *file)
449state_manager::state_entry::state_entry(void *data, const char *name, UINT8 size, UINT32 count)
450   : m_next(NULL),
451     m_data(data),
452     m_name(name),
453     m_typesize(size),
454     m_typecount(count),
455     m_offset(0)
510456{
511   state_private *global = machine->state_data;
512   UINT32 signature = get_signature(machine);
513   UINT8 header[HEADER_SIZE];
514   state_callback *func;
515   state_entry *entry;
516
517   /* if we have illegal registrations, return an error */
518   if (global->illegal_regs > 0)
519      return STATERR_ILLEGAL_REGISTRATIONS;
520
521   /* generate the header */
522   memcpy(&header[0], ss_magic_num, 8);
523   header[8] = SAVE_VERSION;
524   header[9] = NATIVE_ENDIAN_VALUE_LE_BE(0, SS_MSB_FIRST);
525   strncpy((char *)&header[0x0a], machine->gamedrv->name, 0x1c - 0x0a);
526   *(UINT32 *)&header[0x1c] = LITTLE_ENDIANIZE_INT32(signature);
527
528   /* write the header and turn on compression for the rest of the file */
529   mame_fcompress(file, FCOMPRESS_NONE);
530   mame_fseek(file, 0, SEEK_SET);
531   if (mame_fwrite(file, header, sizeof(header)) != sizeof(header))
532      return STATERR_WRITE_ERROR;
533   mame_fcompress(file, FCOMPRESS_MEDIUM);
534
535   /* call the pre-save functions */
536   for (func = global->prefunclist; func != NULL; func = func->next)
537      (*func->func.presave)(machine, func->param);
538
539   /* then write all the data */
540   for (entry = global->entrylist; entry != NULL; entry = entry->next)
541   {
542      UINT32 totalsize = entry->typesize * entry->typecount;
543      if (mame_fwrite(file, entry->data, totalsize) != totalsize)
544         return STATERR_WRITE_ERROR;
545   }
546   return STATERR_NONE;
547457}
548458
549459
550/*-------------------------------------------------
551    state_save_read_file - read the data from a
552    file
553-------------------------------------------------*/
460//-------------------------------------------------
461//  flip_data - reverse the endianness of a
462//  block of  data
463//-------------------------------------------------
554464
555state_save_error state_save_read_file(running_machine *machine, mame_file *file)
465void state_manager::state_entry::flip_data()
556466{
557   state_private *global = machine->state_data;
558   UINT32 signature = get_signature(machine);
559   UINT8 header[HEADER_SIZE];
560   state_callback *func;
561   state_entry *entry;
562   int flip;
467   UINT16 *data16;
468   UINT32 *data32;
469   UINT64 *data64;
470   int count;
563471
564   /* if we have illegal registrations, return an error */
565   if (global->illegal_regs > 0)
566      return STATERR_ILLEGAL_REGISTRATIONS;
567
568   /* read the header and turn on compression for the rest of the file */
569   mame_fcompress(file, FCOMPRESS_NONE);
570   mame_fseek(file, 0, SEEK_SET);
571   if (mame_fread(file, header, sizeof(header)) != sizeof(header))
572      return STATERR_READ_ERROR;
573   mame_fcompress(file, FCOMPRESS_MEDIUM);
574
575   /* verify the header and report an error if it doesn't match */
576   if (validate_header(header, machine->gamedrv->name, signature, popmessage, "Error: ")  != STATERR_NONE)
577      return STATERR_INVALID_HEADER;
578
579   /* determine whether or not to flip the data when done */
580   flip = NATIVE_ENDIAN_VALUE_LE_BE((header[9] & SS_MSB_FIRST) != 0, (header[9] & SS_MSB_FIRST) == 0);
581
582   /* read all the data, flipping if necessary */
583   for (entry = global->entrylist; entry != NULL; entry = entry->next)
472   switch (m_typesize)
584473   {
585      UINT32 totalsize = entry->typesize * entry->typecount;
586      if (mame_fread(file, entry->data, totalsize) != totalsize)
587         return STATERR_READ_ERROR;
474      case 2:
475         data16 = (UINT16 *)m_data;
476         for (count = 0; count < m_typecount; count++)
477            data16[count] = FLIPENDIAN_INT16(data16[count]);
478         break;
588479
589      /* handle flipping */
590      if (flip)
591         flip_data(entry);
592   }
480      case 4:
481         data32 = (UINT32 *)m_data;
482         for (count = 0; count < m_typecount; count++)
483            data32[count] = FLIPENDIAN_INT32(data32[count]);
484         break;
593485
594   /* call the post-load functions */
595   for (func = global->postfunclist; func != NULL; func = func->next)
596      (*func->func.postload)(machine, func->param);
597
598   return STATERR_NONE;
486      case 8:
487         data64 = (UINT64 *)m_data;
488         for (count = 0; count < m_typecount; count++)
489            data64[count] = FLIPENDIAN_INT64(data64[count]);
490         break;
491   }
599492}
600
601
602
603/***************************************************************************
604    DEBUGGING
605***************************************************************************/
606
607/*-------------------------------------------------
608    state_save_get_indexed_item - return an item
609    with the given index
610-------------------------------------------------*/
611
612const char *state_save_get_indexed_item(running_machine *machine, int index, void **base, UINT32 *valsize, UINT32 *valcount)
613{
614   state_private *global = machine->state_data;
615   state_entry *ss;
616
617   for (ss = global->entrylist; ss != NULL; ss = ss->next)
618      if (index-- == 0)
619      {
620         if (base != NULL)
621            *base = ss->data;
622         if (valsize != NULL)
623            *valsize = ss->typesize;
624         if (valcount != NULL)
625            *valcount = ss->typecount;
626         return ss->name;
627      }
628
629   return NULL;
630}
631
632
633/*-------------------------------------------------
634    state_save_dump_registry - dump the registry
635    to the logfile
636-------------------------------------------------*/
637
638void state_save_dump_registry(running_machine *machine)
639{
640   state_private *global = machine->state_data;
641   state_entry *entry;
642
643   for (entry = global->entrylist; entry; entry=entry->next)
644      LOG(("%s: %d x %d\n", entry->name.cstr(), entry->typesize, entry->typecount));
645}
646
src/emu/emupal.c
r10330r10331
143143      palette->save_bright = auto_alloc_array(machine, float, numcolors);
144144      state_save_register_global_pointer(machine, palette->save_pen, numcolors);
145145      state_save_register_global_pointer(machine, palette->save_bright, numcolors);
146      state_save_register_presave(machine, palette_presave, palette);
147      state_save_register_postload(machine, palette_postload, palette);
146      machine->state().register_presave(palette_presave, palette);
147      machine->state().register_postload(palette_postload, palette);
148148   }
149149}
150150
src/emu/state.h
r10330r10331
44
55    Save state management functions.
66
7    Copyright Nicola Salmoria and the MAME Team.
8    Visit http://mamedev.org for licensing and usage restrictions.
7****************************************************************************
98
9    Copyright Aaron Giles
10    All rights reserved.
11
12    Redistribution and use in source and binary forms, with or without
13    modification, are permitted provided that the following conditions are
14    met:
15
16        * Redistributions of source code must retain the above copyright
17          notice, this list of conditions and the following disclaimer.
18        * Redistributions in binary form must reproduce the above copyright
19          notice, this list of conditions and the following disclaimer in
20          the documentation and/or other materials provided with the
21          distribution.
22        * Neither the name 'MAME' nor the names of its contributors may be
23          used to endorse or promote products derived from this software
24          without specific prior written permission.
25
26    THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
27    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
28    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29    DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
30    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
35    IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36    POSSIBILITY OF SUCH DAMAGE.
37
1038***************************************************************************/
1139
1240#pragma once
r10330r10331
1846#ifndef __STATE_H__
1947#define __STATE_H__
2048
21#ifdef __GNUC__
22#include <tr1/type_traits>
23#endif
2449
2550
26/***************************************************************************
27    TYPE DEFINTIONS
28***************************************************************************/
51//**************************************************************************
52//  CONSTANTS
53//**************************************************************************
2954
30typedef void (*state_presave_func)(running_machine *machine, void *param);
31typedef void (*state_postload_func)(running_machine *machine, void *param);
32
33
34
35/***************************************************************************
36    CONSTANTS
37***************************************************************************/
38
39enum _state_save_error
55enum state_save_error
4056{
4157   STATERR_NONE,
4258   STATERR_ILLEGAL_REGISTRATIONS,
r10330r10331
4460   STATERR_READ_ERROR,
4561   STATERR_WRITE_ERROR
4662};
47typedef enum _state_save_error state_save_error;
4863
4964
5065
51/***************************************************************************
52    MACROS
53***************************************************************************/
66//**************************************************************************
67//  MACROS
68//**************************************************************************
5469
5570#define STATE_PRESAVE(name) void name(running_machine *machine, void *param)
5671#define STATE_POSTLOAD(name) void name(running_machine *machine, void *param)
r10330r10331
7186}
7287
7388
74#ifdef __GNUC__
75#define IS_VALID_SAVE_TYPE(_var) \
76   (std::tr1::is_arithmetic<typeof(_var)>::value || std::tr1::is_enum<typeof(_var)>::value || \
77    std::tr1::is_same<typeof(_var), PAIR>::value || std::tr1::is_same<typeof(_var), PAIR64>::value)
78#else
79#define IS_VALID_SAVE_TYPE(_var) \
80   (sizeof(_var) == 1 || sizeof(_var) == 2 || sizeof(_var) == 4 || sizeof(_var) == 8)
81#endif
82
83
84/* generic registration; all further registrations are based on this */
85#define state_save_register_generic(_mach, _mod, _tag, _index, _name, _val, _valsize, _count)      \
86do {                                                                        \
87   assert_always(IS_VALID_SAVE_TYPE(_valsize), "Invalid data type supplied for state saving.");   \
88   state_save_register_memory(_mach, _mod, _tag, _index, _name, _val, sizeof(_valsize), _count, __FILE__, __LINE__);   \
89} while (0)
90
91
92/* register items with explicit tags */
89// register items with explicit tags
9390#define state_save_register_item(_mach, _mod, _tag, _index, _val) \
94   state_save_register_generic(_mach, _mod, _tag, _index, #_val, &_val, _val, 1)
91   (_mach)->state().save_item(_mod, _tag, _index, _val, #_val)
9592
9693#define state_save_register_item_pointer(_mach, _mod, _tag, _index, _val, _count) \
97   state_save_register_generic(_mach, _mod, _tag, _index, #_val, &_val[0], _val[0], _count)
94   (_mach)->state().save_pointer(_mod, _tag, _index, _val, #_val, _count)
9895
9996#define state_save_register_item_array(_mach, _mod, _tag, _index, _val) \
100   state_save_register_item_pointer(_mach, _mod, _tag, _index, _val, sizeof(_val)/sizeof(_val[0]))
97   (_mach)->state().save_item(_mod, _tag, _index, _val, #_val)
10198
10299#define state_save_register_item_2d_array(_mach, _mod, _tag, _index, _val) \
103   state_save_register_item_pointer(_mach, _mod, _tag, _index, _val[0], sizeof(_val)/sizeof(_val[0][0]))
100   (_mach)->state().save_item(_mod, _tag, _index, _val, #_val)
104101
105#define state_save_register_item_bitmap(_mach, _mod, _tag, _index, _val)   \
106   state_save_register_bitmap(_mach, _mod, _tag, _index, #_val, _val, __FILE__, __LINE__)
102#define state_save_register_item_bitmap(_mach, _mod, _tag, _index, _val) \
103   (_mach)->state().save_item(_mod, _tag, _index, *(_val), #_val)
107104
108105
109106
110/* register device items */
107// register device items
111108#define state_save_register_device_item(_dev, _index, _val) \
112   state_save_register_generic((_dev)->machine, (_dev)->name(), (_dev)->tag(), _index, #_val, &_val, _val, 1)
109   (_dev)->machine->state().save_item((_dev)->name(), (_dev)->tag(), _index, _val, #_val)
113110
114111#define state_save_register_device_item_pointer(_dev, _index, _val, _count) \
115   state_save_register_generic((_dev)->machine, (_dev)->name(), (_dev)->tag(), _index, #_val, &_val[0], _val[0], _count)
112   (_dev)->machine->state().save_pointer((_dev)->name(), (_dev)->tag(), _index, _val, #_val, _count)
116113
117114#define state_save_register_device_item_array(_dev, _index, _val) \
118   state_save_register_item_pointer((_dev)->machine, (_dev)->name(), (_dev)->tag(), _index, _val, sizeof(_val)/sizeof(_val[0]))
115   (_dev)->machine->state().save_item((_dev)->name(), (_dev)->tag(), _index, _val, #_val)
119116
120117#define state_save_register_device_item_2d_array(_dev, _index, _val) \
121   state_save_register_item_pointer((_dev)->machine, (_dev)->name(), (_dev)->tag(), _index, _val[0], sizeof(_val)/sizeof(_val[0][0]))
118   (_dev)->machine->state().save_item((_dev)->name(), (_dev)->tag(), _index, _val, #_val)
122119
123#define state_save_register_device_item_bitmap(_dev, _index, _val)   \
124   state_save_register_bitmap((_dev)->machine, (_dev)->name(), (_dev)->tag(), _index, #_val, _val, __FILE__, __LINE__)
120#define state_save_register_device_item_bitmap(_dev, _index, _val) \
121   (_dev)->machine->state().save_item((_dev)->name(), (_dev)->tag(), _index, *(_val), #_val)
125122
126123
127124
128/* register global items */
125// register global items
129126#define state_save_register_global(_mach, _val) \
130   state_save_register_item(_mach, "globals", NULL, 0, _val)
127   (_mach)->state().save_item(_val, #_val)
131128
132129#define state_save_register_global_pointer(_mach, _val, _count) \
133   state_save_register_item_pointer(_mach, "globals", NULL, 0, _val, _count)
130   (_mach)->state().save_pointer(_val, #_val, _count)
134131
135132#define state_save_register_global_array(_mach, _val) \
136   state_save_register_item_array(_mach, "globals", NULL, 0, _val)
133   (_mach)->state().save_item(_val, #_val)
137134
138135#define state_save_register_global_2d_array(_mach, _val) \
139   state_save_register_item_2d_array(_mach, "globals", NULL, 0, _val)
136   (_mach)->state().save_item(_val, #_val)
140137
141138#define state_save_register_global_bitmap(_mach, _val) \
142   state_save_register_bitmap(_mach, "globals", NULL, 0, #_val, _val, __FILE__, __LINE__)
139   (_mach)->state().save_item(*(_val), #_val)
143140
144141
145142
146/***************************************************************************
147    FUNCTION PROTOTYPES
148***************************************************************************/
143//**************************************************************************
144//  TYPE DEFINITIONS
145//**************************************************************************
149146
147class state_manager
148{
149   // type_checker is a set of templates to identify valid save types
150   template<typename T> struct type_checker { static const bool is_atom = false; static const bool is_pointer = false; };
151   template<typename T> struct type_checker<T*> { static const bool is_atom = false; static const bool is_pointer = true; };
150152
151/* ----- core system operations ----- */
153public:
154   typedef void (*prepost_func)(running_machine *machine, void *param);
152155
153/* initialize the system and reset all registrations */
154void state_init(running_machine *machine);
156   // construction/destruction
157   state_manager(running_machine &machine);
155158
156/* return the number of total registrations so far */
157int state_save_get_reg_count(running_machine *machine);
159   // getters
160   int registration_count() const { return m_entry_list.count(); }
161   bool registration_allowed() const { return m_reg_allowed; }
162   
163   // registration control
164   void allow_registration(bool allowed = true);
165   const char *indexed_item(int index, void *&base, UINT32 &valsize, UINT32 &valcount) const;
158166
167   // function registration
168   void register_presave(prepost_func func, void *param);
169   void register_postload(prepost_func func, void *param);
159170
171   // generic memory registration
172   void save_memory(const char *module, const char *tag, UINT32 index, const char *name, void *val, UINT32 valsize, UINT32 valcount = 1);
173   
174   // templatized wrapper for general objects
175   template<typename T>
176   void save_item(const char *module, const char *tag, int index, T &value, const char *valname)
177   {
178      if (type_checker<T>::is_pointer) throw emu_fatalerror("Called save_item on a pointer with no count!");
179      if (!type_checker<T>::is_atom) throw emu_fatalerror("Called save_item on a non-fundamental type!");
180      save_memory(module, tag, index, valname, &value, sizeof(value));
181   }
182   
183   // templatized wrapper for 1-dimensional arrays
184   template<typename T, std::size_t N>
185   void save_item(const char *module, const char *tag, int index, T (&value)[N], const char *valname)
186   {
187      if (!type_checker<T>::is_atom) throw emu_fatalerror("Called save_item on a non-fundamental type!");
188      save_memory(module, tag, index, valname, &value[0], sizeof(value[0]), N);
189   }
190   
191   // templatized wrapper for 2-dimensional arrays
192   template<typename T, std::size_t M, std::size_t N>
193   void save_item(const char *module, const char *tag, int index, T (&value)[M][N], const char *valname)
194   {
195      if (!type_checker<T>::is_atom) throw emu_fatalerror("Called save_item on a non-fundamental type!");
196      save_memory(module, tag, index, valname, &value[0][0], sizeof(value[0][0]), M * N);
197   }
198   
199   // templatized wrapper for pointers
200   template<typename T>
201   void save_pointer(const char *module, const char *tag, int index, T *value, const char *valname, UINT32 count)
202   {
203      if (!type_checker<T>::is_atom) throw emu_fatalerror("Called save_item on a non-fundamental type!");
204      save_memory(module, tag, index, valname, value, sizeof(*value), count);
205   }
206   
207   // global memory registration
208   template<typename T>
209   void save_item(T &value, const char *valname, int index = 0) { save_item("global", NULL, index, value, valname); }
210   template<typename T>
211   void save_pointer(T *value, const char *valname, UINT32 count, int index = 0) { save_pointer("global", NULL, index, value, valname, count); }
212   
213   // file processing
214   static state_save_error check_file(running_machine *machine, mame_file *file, const char *gamename, void (CLIB_DECL *errormsg)(const char *fmt, ...));
215   state_save_error write_file(mame_file *file);
216   state_save_error read_file(mame_file *file);
217   
218private:
219   // internal helpers
220   UINT32 signature() const;
221   void dump_registry() const;
222   static state_save_error validate_header(const UINT8 *header, const char *gamename, UINT32 signature, void (CLIB_DECL *errormsg)(const char *fmt, ...), const char *error_prefix);
160223
161/* ----- registration handling ----- */
224   // state callback item
225   class state_callback
226   {
227   public:
228      // construction/destruction
229      state_callback(prepost_func callback, void *param);
162230
163/* allow/disallow registrations to happen (called by the core) */
164void state_save_allow_registration(running_machine *machine, int allowed);
231      // getters
232      state_callback *next() const { return m_next; }         
165233
166/* query whether or not registrations are allowed */
167int state_save_registration_allowed(running_machine *machine);
234      // state
235      state_callback *   m_next;               // pointer to next entry
236      void *            m_param;            // function parameter
237      prepost_func      m_func;               // pointer to the function
238   };
168239
169/* register an array of data in memory */
170void state_save_register_memory(running_machine *machine, const char *module, const char *tag, UINT32 index, const char *name, void *val, UINT32 valsize, UINT32 valcount, const char *file, int line);
240   class state_entry
241   {
242   public:
243      // construction/destruction
244      state_entry(void *data, const char *name, UINT8 size, UINT32 count);
171245
172/* register a bitmap to be saved */
173void state_save_register_bitmap(running_machine *machine, const char *module, const char *tag, UINT32 index, const char *name, bitmap_t *val, const char *file, int line);
246      // getters
247      state_entry *next() const { return m_next; }         
248     
249      // helpers
250      void flip_data();
174251
252      // state
253      state_entry *      m_next;               // pointer to next entry
254      void *            m_data;               // pointer to the memory to save/restore
255      astring            m_name;               // full name
256      UINT8            m_typesize;            // size of the raw data type
257      UINT32            m_typecount;         // number of items
258      UINT32            m_offset;            // offset within the final structure
259   };
175260
261   // internal state
262   running_machine &      m_machine;            // reference to our machine
263   bool               m_reg_allowed;         // are registrations allowed?
264   int                  m_illegal_regs;         // number of illegal registrations
176265
177/* ----- callback function registraton ----- */
266   simple_list<state_entry> m_entry_list;         // list of reigstered entries
267   simple_list<state_callback> m_presave_list;      // list of pre-save functions
268   simple_list<state_callback> m_postload_list;   // list of post-load functions
178269
179/* register a pre-save function callback */
180void state_save_register_presave(running_machine *machine, state_presave_func func, void *param);
270   static const char s_magic_num[8];            // magic number for header
271};
181272
182/* register a post-load function callback */
183void state_save_register_postload(running_machine *machine, state_postload_func func, void *param);
184273
274// template specializations to enumerate the fundamental atomic types you are allowed to save
275template<> struct state_manager::type_checker<bool>   { static const bool is_atom = true; static const bool is_pointer = false; };
276template<> struct state_manager::type_checker<INT8>   { static const bool is_atom = true; static const bool is_pointer = false; };
277template<> struct state_manager::type_checker<UINT8>  { static const bool is_atom = true; static const bool is_pointer = false; };
278template<> struct state_manager::type_checker<INT16>  { static const bool is_atom = true; static const bool is_pointer = false; };
279template<> struct state_manager::type_checker<UINT16> { static const bool is_atom = true; static const bool is_pointer = false; };
280template<> struct state_manager::type_checker<INT32>  { static const bool is_atom = true; static const bool is_pointer = false; };
281template<> struct state_manager::type_checker<UINT32> { static const bool is_atom = true; static const bool is_pointer = false; };
282template<> struct state_manager::type_checker<INT64>  { static const bool is_atom = true; static const bool is_pointer = false; };
283template<> struct state_manager::type_checker<UINT64> { static const bool is_atom = true; static const bool is_pointer = false; };
284template<> struct state_manager::type_checker<PAIR>   { static const bool is_atom = true; static const bool is_pointer = false; };
285template<> struct state_manager::type_checker<PAIR64> { static const bool is_atom = true; static const bool is_pointer = false; };
286template<> struct state_manager::type_checker<float>  { static const bool is_atom = true; static const bool is_pointer = false; };
287template<> struct state_manager::type_checker<double> { static const bool is_atom = true; static const bool is_pointer = false; };
185288
186289
187/* ----- save state file processing ----- */
188290
189/* check if a file is a valid save state */
190state_save_error state_save_check_file(running_machine *machine, mame_file *file, const char *gamename, void (CLIB_DECL *errormsg)(const char *fmt, ...));
291//**************************************************************************
292//  INLINE FUNCTIONS
293//**************************************************************************
191294
192/* write out the save state file */
193state_save_error state_save_write_file(running_machine *machine, mame_file *file);
295//-------------------------------------------------
296//  save_item - specialized save_item for bitmaps
297//-------------------------------------------------
194298
195/* read in a save state file */
196state_save_error state_save_read_file(running_machine *machine, mame_file *file);
299template<>
300inline void state_manager::save_item(const char *module, const char *tag, int index, bitmap_t &value, const char *name)
301{
302   save_memory(module, tag, index, name, value.base, value.bpp / 8, value.rowpixels * value.height);
303}
197304
198305
306//-------------------------------------------------
307//  save_item - specialized save_item for attotimes
308//-------------------------------------------------
199309
200/* ----- debugging ----- */
310template<>
311inline void state_manager::save_item(const char *module, const char *tag, int index, attotime &value, const char *name)
312{
313   astring tempstr(name, ".attoseconds");
314   save_memory(module, tag, index, tempstr, &value.attoseconds, sizeof(value.attoseconds));
315   tempstr.cpy(name).cat(".seconds");
316   save_memory(module, tag, index, tempstr, &value.seconds, sizeof(value.seconds));
317}
201318
202/* return an item with the given index */
203const char *state_save_get_indexed_item(running_machine *machine, int index, void **base, UINT32 *valsize, UINT32 *valcount);
204319
205/* dump the registry to the logfile */
206void state_save_dump_registry(running_machine *machine);
207
208
209320#endif   /* __STATE_H__ */
src/emu/schedule.c
r10330r10331
283283   // save the bits
284284   state_save_register_item(m_machine, "timer", name, index, m_param);
285285   state_save_register_item(m_machine, "timer", name, index, m_enabled);
286   state_save_register_item(m_machine, "timer", name, index, m_period.seconds);
287   state_save_register_item(m_machine, "timer", name, index, m_period.attoseconds);
288   state_save_register_item(m_machine, "timer", name, index, m_start.seconds);
289   state_save_register_item(m_machine, "timer", name, index, m_start.attoseconds);
290   state_save_register_item(m_machine, "timer", name, index, m_expire.seconds);
291   state_save_register_item(m_machine, "timer", name, index, m_expire.attoseconds);
286   state_save_register_item(m_machine, "timer", name, index, m_period);
287   state_save_register_item(m_machine, "timer", name, index, m_start);
288   state_save_register_item(m_machine, "timer", name, index, m_expire);
292289}
293290
294291
r10330r10331
336333   // append a single never-expiring timer so there is always one in the list
337334   m_timer_list = &m_timer_allocator.alloc()->init(m_machine, NULL, NULL, NULL, true);
338335   m_timer_list->adjust(attotime::never);
339}
340336
341
342// remove me once save state registration is embedded
343void device_scheduler::register_for_save()
344{
345337   // register global states
346   state_save_register_item(&m_machine, "timer", NULL, 0, m_basetime.seconds);
347   state_save_register_item(&m_machine, "timer", NULL, 0, m_basetime.attoseconds);
348   state_save_register_postload(&m_machine, &state_postload_stub<device_scheduler, &device_scheduler::postload>, this);
338   state_save_register_item(&m_machine, "timer", NULL, 0, m_basetime);
339   m_machine.state().register_postload(&state_postload_stub<device_scheduler, &device_scheduler::postload>, this);
349340}
350341
351342
src/emu/speaker.h
r10330r10331
8585   virtual device_t *alloc_device(running_machine &machine) const;
8686 
8787   // inline configuration helpers
88   speaker_device_config *next_speaker() const { return downcast<speaker_device_config *>(typenext()); }
8889   static void static_set_position(device_config *device, double x, double y, double z);
8990 
9091protected:
r10330r10331
109110   virtual ~speaker_device();
110111 
111112public:
113   // getters
114   speaker_device *next_speaker() const { return downcast<speaker_device *>(typenext()); }
115 
112116   // internally for use by the sound system
113117   void mix(INT32 *leftmix, INT32 *rightmix, int &samples_this_update, bool suppress);
114118 
r10330r10331
135139extern const device_type SPEAKER;
136140 
137141 
138 
139//**************************************************************************
140//  INLINE HELPERS
141//**************************************************************************
142 
143//-------------------------------------------------
144//  speaker_first - return the first speaker
145//  device config in a machine_config
146//-------------------------------------------------
147 
148inline const speaker_device_config *speaker_first(const machine_config &config)
149{
150   return downcast<speaker_device_config *>(config.m_devicelist.first(SPEAKER));
151}
152 
153 
154//-------------------------------------------------
155//  speaker_next - return the next speaker
156//  device config in a machine_config
157//-------------------------------------------------
158 
159inline const speaker_device_config *speaker_next(const speaker_device_config *previous)
160{
161   return downcast<speaker_device_config *>(previous->typenext());
162}
163 
164 
165//-------------------------------------------------
166//  speaker_first - return the first speaker
167//  device in a machine
168//-------------------------------------------------
169 
170inline speaker_device *speaker_first(running_machine &machine)
171{
172   return downcast<speaker_device *>(machine.m_devicelist.first(SPEAKER));
173}
174 
175 
176//-------------------------------------------------
177//  speaker_next - return the next speaker
178//  device in a machine
179//-------------------------------------------------
180 
181inline speaker_device *speaker_next(speaker_device *previous)
182{
183   return downcast<speaker_device *>(previous->typenext());
184}
185 
186 
187142#endif   /* __SOUND_H__ */
src/emu/schedule.h
r10330r10331
155155   // construction/destruction
156156   device_scheduler(running_machine &machine);
157157   ~device_scheduler();
158   void register_for_save();
159158
160159   // getters
161160   attotime time() const;
src/emu/romload.h
r10330r10331
123123    TYPE DEFINITIONS
124124***************************************************************************/
125125
126class machine_config;
127
126128typedef device_config rom_source;
127129
128130
src/emu/memory.c
r10330r10331
15901590      space->locate_memory();
15911591
15921592   // register a callback to reset banks when reloading state
1593   state_save_register_postload(machine, bank_reattach, NULL);
1593   machine->state().register_postload(bank_reattach, NULL);
15941594
15951595   // dump the final memory configuration
15961596   generate_memdump(machine);
r10330r10331
40924092      int bytes_per_element = space.data_width() / 8;
40934093      astring name;
40944094      name.printf("%08x-%08x", bytestart, byteend);
4095      state_save_register_memory(&space.m_machine, "memory", space.device().tag(), space.spacenum(), name, m_data, bytes_per_element, (UINT32)(byteend + 1 - bytestart) / bytes_per_element, __FILE__, __LINE__);
4095      space.m_machine.state().save_memory("memory", space.device().tag(), space.spacenum(), name, m_data, bytes_per_element, (UINT32)(byteend + 1 - bytestart) / bytes_per_element);
40964096   }
40974097}
40984098
r10330r10331
41424142      m_name.printf("Bank '%s'", tag);
41434143   }
41444144
4145   if (!m_anonymous && state_save_registration_allowed(&space.m_machine))
4145   if (!m_anonymous && space.m_machine.state().registration_allowed())
41464146      state_save_register_item(&space.m_machine, "memory", m_tag, 0, m_curentry);
41474147}
41484148
src/emu/machine/pci.c
r10330r10331
292292   state_save_register_device_item(device, 0, pcibus->devicenum);
293293   state_save_register_device_item(device, 0, pcibus->busnum);
294294
295   state_save_register_postload(device->machine, pci_bus_postload, pcibus);
295   device->machine->state().register_postload(pci_bus_postload, pcibus);
296296}
297297
298298
src/emu/machine/pit8253.c
r10330r10331
11051105      state_save_register_device_item(device, timerno, timer->null_count);
11061106      state_save_register_device_item(device, timerno, timer->phase);
11071107      state_save_register_device_item(device, timerno, timer->cycles_to_output);
1108      state_save_register_device_item(device, timerno, timer->last_updated.seconds);
1109      state_save_register_device_item(device, timerno, timer->last_updated.attoseconds);
1108      state_save_register_device_item(device, timerno, timer->last_updated);
11101109      state_save_register_device_item(device, timerno, timer->clock);
11111110   }
11121111}
src/emu/diexec.c
r10330r10331
569569   state_save_register_device_item(&m_device, 0, m_nexteatcycles);
570570   state_save_register_device_item(&m_device, 0, m_trigger);
571571   state_save_register_device_item(&m_device, 0, m_totalcycles);
572   state_save_register_device_item(&m_device, 0, m_localtime.seconds);
573   state_save_register_device_item(&m_device, 0, m_localtime.attoseconds);
572   state_save_register_device_item(&m_device, 0, m_localtime);
574573   state_save_register_device_item(&m_device, 0, m_iloops);
575574}
576575
src/emu/emucore.h
r10330r10331
198198inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); }
199199
200200
201// this macro passes an item followed by a string version of itself as two consecutive parameters
202#define NAME(x) x, #x
203
201204// this macro wraps a function 'x' and can be used to pass a function followed by its name
202205#define FUNC(x) x, #x
203206
src/emu/screen.c
r10330r10331
379379   if (overname != NULL && strcmp(overname, "none") != 0)
380380      load_effect_overlay(overname);
381381
382   state_save_register_device_item(this, 0, m_width);
383   state_save_register_device_item(this, 0, m_height);
384   state_save_register_device_item(this, 0, m_visarea.min_x);
385   state_save_register_device_item(this, 0, m_visarea.min_y);
386   state_save_register_device_item(this, 0, m_visarea.max_x);
387   state_save_register_device_item(this, 0, m_visarea.max_y);
388   state_save_register_device_item(this, 0, m_last_partial_scan);
389   state_save_register_device_item(this, 0, m_frame_period);
390   state_save_register_device_item(this, 0, m_scantime);
391   state_save_register_device_item(this, 0, m_pixeltime);
392   state_save_register_device_item(this, 0, m_vblank_period);
393   state_save_register_device_item(this, 0, m_vblank_start_time.seconds);
394   state_save_register_device_item(this, 0, m_vblank_start_time.attoseconds);
395   state_save_register_device_item(this, 0, m_vblank_end_time.seconds);
396   state_save_register_device_item(this, 0, m_vblank_end_time.attoseconds);
397   state_save_register_device_item(this, 0, m_frame_number);
382   // register items for saving
383   save_item(NAME(m_width));
384   save_item(NAME(m_height));
385   save_item(NAME(m_visarea.min_x));
386   save_item(NAME(m_visarea.min_y));
387   save_item(NAME(m_visarea.max_x));
388   save_item(NAME(m_visarea.max_y));
389   save_item(NAME(m_last_partial_scan));
390   save_item(NAME(m_frame_period));
391   save_item(NAME(m_scantime));
392   save_item(NAME(m_pixeltime));
393   save_item(NAME(m_vblank_period));
394   save_item(NAME(m_vblank_start_time));
395   save_item(NAME(m_vblank_end_time));
396   save_item(NAME(m_frame_number));
398397}
399398
400399
src/emu/sound.c
r10330r10331
112112   astring state_tag;
113113   state_tag.printf("%d", m_device.machine->sound().m_stream_list.count());
114114   state_save_register_item(m_device.machine, "stream", state_tag, 0, m_sample_rate);
115   state_save_register_postload(m_device.machine, state_postload_stub<sound_stream, &sound_stream::postload>, this);
115   m_device.machine->state().register_postload(state_postload_stub<sound_stream, &sound_stream::postload>, this);
116116
117117   // save the gain of each input and output
118118   for (int inputnum = 0; inputnum < m_inputs; inputnum++)
r10330r10331
806806   machine.add_notifier(MACHINE_NOTIFY_RESET, &sound_manager::reset);
807807
808808   // register global states
809   state_save_register_global(&machine, m_last_update.seconds);
810   state_save_register_global(&machine, m_last_update.attoseconds);
809   state_save_register_global(&machine, m_last_update);
811810
812811   // set the starting attenuation
813812   set_attenuation(options_get_int(machine.options(), OPTION_VOLUME));
r10330r10331
863862bool sound_manager::indexed_speaker_input(int index, speaker_input &info) const
864863{
865864   // scan through the speakers until we find the indexed input
866   for (info.speaker = downcast<speaker_device *>(m_machine.m_devicelist.first(SPEAKER)); info.speaker != NULL; info.speaker = downcast<speaker_device *>(info.speaker->typenext()))
865   for (info.speaker = downcast<speaker_device *>(m_machine.m_devicelist.first(SPEAKER)); info.speaker != NULL; info.speaker = info.speaker->next_speaker())
867866   {
868867      if (index < info.speaker->inputs())
869868      {
r10330r10331
10041003
10051004   // force all the speaker streams to generate the proper number of samples
10061005   int samples_this_update = 0;
1007   for (speaker_device *speaker = downcast<speaker_device *>(m_machine.m_devicelist.first(SPEAKER)); speaker != NULL; speaker = downcast<speaker_device *>(speaker->typenext()))
1006   for (speaker_device *speaker = downcast<speaker_device *>(m_machine.m_devicelist.first(SPEAKER)); speaker != NULL; speaker = speaker->next_speaker())
10081007      speaker->mix(m_leftmix, m_rightmix, samples_this_update, (m_muted & MUTE_REASON_SYSTEM));
10091008
10101009   // now downmix the final result
src/emu/timer.c
r10330r10331
286286   m_timer = timer_alloc();
287287
288288   // register for save states
289   state_save_register_device_item(this, 0, m_first_time);
289   save_item(NAME(m_first_time));
290290}
291291
292292
src/mess/machine/hp48.c
r10330r10331
12311231   state_save_register_global_array(machine,  state->io );
12321232   //state_save_register_global_pointer(machine,  machine->generic.nvram.u8, machine->generic.nvram_size );
12331233
1234   state_save_register_postload( machine, hp48_update_annunciators, NULL );
1235   state_save_register_postload( machine, hp48_apply_modules, NULL );
1234   machine->state().register_postload( hp48_update_annunciators, NULL );
1235   machine->state().register_postload( hp48_apply_modules, NULL );
12361236
12371237#ifdef CHARDEV
12381238   /* direct I/O */
src/mess/machine/coco.c
r10330r10331
30843084   state_save_register_global(machine, state->interupt_line);
30853085   state_save_register_global(machine, state->gime_irq);
30863086   state_save_register_global(machine, state->gime_firq);
3087   state_save_register_postload(machine, coco3_state_postload, NULL);
3087   machine->state().register_postload(coco3_state_postload, NULL);
30883088
30893089   /* need to specify lightgun crosshairs */
30903090   machine->scheduler().timer_set(attotime::zero, FUNC(update_lightgun_timer_callback));
src/mess/machine/b2m.c
r10330r10331
346346   state_save_register_global(machine, state->b2m_localmachine);
347347   state_save_register_global(machine, state->vblank_state);
348348
349   state_save_register_postload(machine, b2m_postload, NULL);
349   machine->state().register_postload(b2m_postload, NULL);
350350}
351351
352352static IRQ_CALLBACK(b2m_irq_callback)
src/mess/machine/thomson.c
r10330r10331
16001600   state_save_register_global( machine, to7_lightpen );
16011601   state_save_register_global( machine, to7_lightpen_step );
16021602   state_save_register_global_pointer( machine, (mem + 0x10000), 0x10000 );
1603   state_save_register_postload( machine, to7_update_cart_bank_postload, NULL );
1603   machine->state().register_postload( to7_update_cart_bank_postload, NULL );
16041604}
16051605
16061606
r10330r10331
18451845   state_save_register_global( machine, to7_lightpen );
18461846   state_save_register_global( machine, to7_lightpen_step );
18471847   state_save_register_global_pointer( machine, (mem + 0x10000), 0x10000 );
1848   state_save_register_postload( machine,  to770_update_ram_bank_postload, NULL );
1849   state_save_register_postload( machine,  to7_update_cart_bank_postload, NULL );
1848   machine->state().register_postload( to770_update_ram_bank_postload, NULL );
1849   machine->state().register_postload( to7_update_cart_bank_postload, NULL );
18501850}
18511851
18521852
r10330r10331
22202220   state_save_register_global( machine, to7_lightpen_step );
22212221   state_save_register_global( machine, mo5_reg_cart );
22222222   state_save_register_global_pointer( machine, (mem + 0x10000), 0x10000 );
2223   state_save_register_postload( machine, mo5_update_cart_bank_postload, NULL );
2223   machine->state().register_postload( mo5_update_cart_bank_postload, NULL );
22242224}
22252225
22262226
r10330r10331
31843184   state_save_register_global( machine, to7_lightpen_step );
31853185   state_save_register_global( machine, to9_soft_bank );
31863186   state_save_register_global_pointer( machine, (mem + 0x10000), 0x10000 );
3187   state_save_register_postload( machine,  to9_update_ram_bank_postload, NULL );
3188   state_save_register_postload( machine,  to9_update_cart_bank_postload, NULL );
3187   machine->state().register_postload( to9_update_ram_bank_postload, NULL );
3188   machine->state().register_postload( to9_update_cart_bank_postload, NULL );
31893189}
31903190
31913191
r10330r10331
41934193   state_save_register_global( machine, to8_data_vpage );
41944194   state_save_register_global( machine, to8_cart_vpage );
41954195   state_save_register_global_pointer( machine, (mem + 0x10000), 0x10000 );
4196   state_save_register_postload( machine,  to8_update_ram_bank_postload, NULL );
4197   state_save_register_postload( machine,  to8_update_cart_bank_postload, NULL );
4198   state_save_register_postload( machine,  to8_update_floppy_bank_postload, NULL );
4196   machine->state().register_postload( to8_update_ram_bank_postload, NULL );
4197   machine->state().register_postload( to8_update_cart_bank_postload, NULL );
4198   machine->state().register_postload( to8_update_floppy_bank_postload, NULL );
41994199}
42004200
42014201
r10330r10331
43634363   state_save_register_global( machine, to8_data_vpage );
43644364   state_save_register_global( machine, to8_cart_vpage );
43654365   state_save_register_global_pointer( machine, (mem + 0x10000), 0x10000 );
4366   state_save_register_postload( machine,  to8_update_ram_bank_postload, NULL );
4367   state_save_register_postload( machine,  to8_update_cart_bank_postload, NULL );
4368   state_save_register_postload( machine,  to8_update_floppy_bank_postload, NULL );
4366   machine->state().register_postload( to8_update_ram_bank_postload, NULL );
4367   machine->state().register_postload( to8_update_cart_bank_postload, NULL );
4368   machine->state().register_postload( to8_update_floppy_bank_postload, NULL );
43694369}
43704370
43714371
r10330r10331
49874987   state_save_register_global( machine, to8_cart_vpage );
49884988   state_save_register_global( machine, mo5_reg_cart );
49894989   state_save_register_global_pointer( machine, (mem + 0x10000), 0x10000 );
4990   state_save_register_postload( machine,  mo6_update_ram_bank_postload, NULL );
4991   state_save_register_postload( machine,  mo6_update_cart_bank_postload, NULL );
4990   machine->state().register_postload( mo6_update_ram_bank_postload, NULL );
4991   machine->state().register_postload( mo6_update_cart_bank_postload, NULL );
49924992}
49934993
49944994
r10330r10331
52475247   state_save_register_global( machine, to8_cart_vpage );
52485248   state_save_register_global( machine, mo5_reg_cart );
52495249   state_save_register_global_pointer( machine, (mem + 0x10000), 0x10000 );
5250   state_save_register_postload( machine,  mo6_update_ram_bank_postload, NULL );
5251   state_save_register_postload( machine,  mo6_update_cart_bank_postload, NULL );
5250   machine->state().register_postload( mo6_update_ram_bank_postload, NULL );
5251   machine->state().register_postload( mo6_update_cart_bank_postload, NULL );
52525252}
src/mess/machine/6883sam.c
r10330r10331
265265   /* save state registration */
266266   state_save_register_item(device->machine, "6883sam", NULL, 0, sam->state);
267267   state_save_register_item(device->machine, "6883sam", NULL, 0, sam->video_position);
268   state_save_register_postload(device->machine, update_sam_postload, (void*)device);
268   device->machine->state().register_postload(update_sam_postload, (void*)device);
269269}
270270
271271static DEVICE_START( sam6883 )
src/mess/machine/comx35.c
r10330r10331
612612   m_reset_timer = machine->scheduler().timer_alloc(FUNC(reset_tick));
613613
614614   /* register for state saving */
615   state_save_register_postload(machine, comx35_state_save_postload, NULL);
615   machine->state().register_postload(comx35_state_save_postload, NULL);
616616   state_save_register_global(machine, m_reset);
617617   state_save_register_global(machine, m_cdp1802_q);
618618   state_save_register_global(machine, m_cdp1802_ef4);
src/mess/machine/apple2gs.c
r10330r10331
17571757   apple2gs_setup_memory(machine);
17581758
17591759   /* save state stuff.  note that the driver takes care of docram. */
1760   state_save_register_global_array(machine, ram_get_ptr(machine->device(RAM_TAG)));
1760   state_save_register_global_pointer(machine, ram_get_ptr(machine->device(RAM_TAG)),ram_get_size(machine->device(RAM_TAG)));
17611761
17621762   state_save_register_item(machine, "NEWVIDEO", NULL, 0, state->newvideo);
17631763
src/mess/machine/mac.c
r10330r10331
32333233   mac->m_inquiry_timeout = machine->scheduler().timer_alloc(FUNC(inquiry_timeout_func));
32343234
32353235   /* save state stuff */
3236   state_save_register_postload(machine, mac_state_load, NULL);
3236   machine->state().register_postload(mac_state_load, NULL);
32373237}
32383238
32393239#define MAC_DRIVER_INIT(label, model)   \
src/mess/machine/nes.c
r10330r10331
271271   if (state->battery)
272272      state_save_register_global_pointer(machine, state->battery_ram, state->battery_size);
273273
274   state_save_register_postload(machine, nes_banks_restore, NULL);
274   machine->state().register_postload(nes_banks_restore, NULL);
275275}
276276
277277MACHINE_START( nes )
src/mess/machine/mboard.c
r10330r10331
254254void mboard_savestate_register(running_machine *machine)
255255{
256256   state_save_register_global_array(machine,save_board);
257   state_save_register_postload(machine,m_board_postload,NULL);
258   state_save_register_presave(machine,m_board_presave,NULL);
257   machine->state().register_postload(m_board_postload,NULL);
258   machine->state().register_presave(m_board_presave,NULL);
259259}
260260
261261void mboard_set_board( void )
src/mess/machine/lynx.c
r10330r10331
18001800   int i;
18011801   state_save_register_global(machine, state->memory_config);
18021802   state_save_register_global_pointer(machine, state->mem_fe00, state->mem_fe00_size);
1803   state_save_register_postload(machine, lynx_postload, NULL);
1803   machine->state().register_postload(lynx_postload, NULL);
18041804
18051805   memory_configure_bank(machine, "bank3", 0, 1, machine->region("maincpu")->base() + 0x0000, 0);
18061806   memory_configure_bank(machine, "bank3", 1, 1, state->mem_fe00, 0);
src/mess/machine/apple2.c
r10330r10331
16311631
16321632   /* state save registers */
16331633   state_save_register_global(machine, state->flags);
1634   state_save_register_postload(machine, apple2_update_memory_postload, NULL);
1634   machine->state().register_postload(apple2_update_memory_postload, NULL);
16351635
16361636   /* --------------------------------------------- *
16371637     * set up the softswitch mask/set                *
src/mess/video/coco6847.c
r10330r10331
19101910   m6847->fs_rise_timer->adjust(attotime::zero, 0, attotime(0, frame_period));
19111911
19121912   /* setup save states */
1913   state_save_register_postload(machine, m6847_postload, NULL);
1913   machine->state().register_postload(m6847_postload, NULL);
19141914
19151915   /* build font */
19161916   build_fontdata(v);
src/mess/video/m6847.c
r10330r10331
19351935   devcb_resolve_read_line(&mc6847->in_css_func, &intf->in_css_func, device);
19361936
19371937   /* setup save states */
1938   state_save_register_postload(device->machine, mc6847_postload, mc6847);
1938   device->machine->state().register_postload(mc6847_postload, mc6847);
19391939}
19401940
19411941static DEVICE_RESET( mc6847 )
src/mess/video/crtc_ega.c
r10330r10331
764764
765765   /* register for state saving */
766766
767   state_save_register_postload(device->machine, crtc_ega_state_save_postload, crtc_ega);
767   device->machine->state().register_postload(crtc_ega_state_save_postload, crtc_ega);
768768
769769   state_save_register_item(device->machine, device->tag(), NULL, 0, crtc_ega->clock);
770770   state_save_register_item(device->machine, device->tag(), NULL, 0, crtc_ega->hpixels_per_column);
src/mess/video/coco3.c
r10330r10331
821821   state_save_register_global(machine, video->legacy_video);
822822   state_save_register_global(machine, video->top_border_scanlines);
823823   state_save_register_global(machine, video->display_scanlines);
824   state_save_register_postload(machine, coco3_video_postload, NULL);
824   machine->state().register_postload(coco3_video_postload, NULL);
825825}
826826
827827
src/mess/video/pc_video_mess.c
r10330r10331
6666      video_start_generic_bitmapped(machine);
6767   }
6868
69   state_save_register_postload(machine, pc_video_postload, NULL);
69   machine->state().register_postload(pc_video_postload, NULL);
7070   return pc_crtc;
7171}
7272
src/mess/drivers/ng_aes.c
r10330r10331
12731273   state_save_register_global(machine, state->led2_value);
12741274   state_save_register_global(machine, state->recurse);
12751275
1276   state_save_register_postload(machine, aes_postload, NULL);
1276   machine->state().register_postload(aes_postload, NULL);
12771277}
12781278
12791279static MACHINE_START( neogeo )
src/mess/drivers/supercon.c
r10330r10331
554554   state->timer_update_irq->adjust( attotime::zero, 0, attotime::from_hz(1000) );
555555
556556   state_save_register_global_array(machine,state->save_board);
557   state_save_register_postload(machine,m_board_postload,NULL);
558   state_save_register_presave(machine,m_board_presave,NULL);
557   machine->state().register_postload(m_board_postload,NULL);
558   machine->state().register_presave(m_board_presave,NULL);
559559}
560560
561561static MACHINE_RESET( supercon )

Previous 15994 Revisions Next


© 1998-2018 The MESS Team