Previous 199869 Revisions Next

r24046 Tuesday 2nd July, 2013 at 17:25:59 UTC by Dirk Best
mtx.c: Improve snapshot loading
[src/mess/drivers]mtx.c
[src/mess/machine]mtx.c

trunk/src/mess/drivers/mtx.c
r24045r24046
372372   MCFG_Z80CTC_ADD(Z80CTC_TAG, XTAL_4MHz, ctc_intf )
373373   MCFG_TIMER_DRIVER_ADD_PERIODIC("z80ctc_timer", mtx_state, ctc_tick, attotime::from_hz(XTAL_4MHz/13))
374374   MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, standard_centronics)
375   MCFG_SNAPSHOT_ADD("snapshot", mtx_state, mtx, "mtb", 0.5)
375   MCFG_SNAPSHOT_ADD("snapshot", mtx_state, mtx, "mtx", 1)
376376   MCFG_CASSETTE_ADD("cassette", mtx_cassette_interface)
377377   MCFG_TIMER_DRIVER_ADD_PERIODIC("cassette_timer", mtx_state, cassette_tick, attotime::from_hz(44100))
378378
trunk/src/mess/machine/mtx.c
r24045r24046
323323    SNAPSHOT
324324***************************************************************************/
325325
326// this only works for some of the files, nothing which tries to load
327// more data from tape. todo: tapes which autorun after loading
326328SNAPSHOT_LOAD_MEMBER( mtx_state, mtx )
327329{
328330   address_space &program = m_maincpu->space(AS_PROGRAM);
329
331   void *ptr;
330332   UINT8 header[18];
331   UINT16 addr;
332333
333   /* get the header */
334   image.fread( &header, sizeof(header));
334   // read header
335   image.fread(&header, sizeof(header));
335336
336   if (header[0] == 0xff)
337   // verify first byte
338   if (header[0] != 0xff)
337339   {
338      /* long header */
339      addr = pick_integer_le(header, 16, 2);
340      void *ptr = program.get_write_ptr(addr);
341      image.fread( ptr, 599);
342      ptr = program.get_write_ptr(0xc000);
343      image.fread( ptr, snapshot_size - 599 - 18);
340      image.seterror(IMAGE_ERROR_INVALIDIMAGE, NULL);
341      return IMAGE_INIT_FAIL;
344342   }
345   else
343
344   // get tape name
345   char tape_name[16];
346   memcpy(&tape_name, &header[1], 15);
347   tape_name[15] = '\0';
348   image.message("Loading '%s'", tape_name);
349
350   // start of system variables area
351   UINT16 system_variables_base = pick_integer_le(header, 16, 2);
352
353   // write system variables
354   UINT16 system_variables_size = 0;
355
356   if (system_variables_base != 0)
346357   {
347      /* short header */
348      addr = pick_integer_le(header, 0, 2);
349      image.fseek(4, SEEK_SET);
350      void *ptr = program.get_write_ptr(addr);
351      image.fread( ptr, 599);
352      ptr = program.get_write_ptr(0xc000);
353      image.fread( ptr, snapshot_size - 599 - 4);
358      ptr = program.get_write_ptr(system_variables_base);
359      system_variables_size = 0xfb4b - system_variables_base;
360      image.fread(ptr, system_variables_size);
354361   }
355362
363   // write actual image data
364   UINT16 data_size = snapshot_size - 18 - system_variables_size;
365
366   ptr = program.get_write_ptr(0x4000);
367   image.fread(ptr, 0x4000);
368
369   // if we cross the page boundary, get a new write pointer and write the rest
370   if (data_size > 0x4000)
371   {
372      ptr = program.get_write_ptr(0x8000);
373      image.fread(ptr, 0x4000);
374   }
375
376   logerror("snapshot name = '%s', system_size = 0x%04x, data_size = 0x%04x\n", tape_name, system_variables_size, data_size);
377
356378   return IMAGE_INIT_PASS;
357379}
358380

Previous 199869 Revisions Next


© 1997-2024 The MAME Team