trunk/src/mess/drivers/mtx.c
| r24045 | r24046 | |
| 372 | 372 | MCFG_Z80CTC_ADD(Z80CTC_TAG, XTAL_4MHz, ctc_intf ) |
| 373 | 373 | MCFG_TIMER_DRIVER_ADD_PERIODIC("z80ctc_timer", mtx_state, ctc_tick, attotime::from_hz(XTAL_4MHz/13)) |
| 374 | 374 | 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) |
| 376 | 376 | MCFG_CASSETTE_ADD("cassette", mtx_cassette_interface) |
| 377 | 377 | MCFG_TIMER_DRIVER_ADD_PERIODIC("cassette_timer", mtx_state, cassette_tick, attotime::from_hz(44100)) |
| 378 | 378 | |
trunk/src/mess/machine/mtx.c
| r24045 | r24046 | |
| 323 | 323 | SNAPSHOT |
| 324 | 324 | ***************************************************************************/ |
| 325 | 325 | |
| 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 |
| 326 | 328 | SNAPSHOT_LOAD_MEMBER( mtx_state, mtx ) |
| 327 | 329 | { |
| 328 | 330 | address_space &program = m_maincpu->space(AS_PROGRAM); |
| 329 | | |
| 331 | void *ptr; |
| 330 | 332 | UINT8 header[18]; |
| 331 | | UINT16 addr; |
| 332 | 333 | |
| 333 | | /* get the header */ |
| 334 | | image.fread( &header, sizeof(header)); |
| 334 | // read header |
| 335 | image.fread(&header, sizeof(header)); |
| 335 | 336 | |
| 336 | | if (header[0] == 0xff) |
| 337 | // verify first byte |
| 338 | if (header[0] != 0xff) |
| 337 | 339 | { |
| 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; |
| 344 | 342 | } |
| 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) |
| 346 | 357 | { |
| 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); |
| 354 | 361 | } |
| 355 | 362 | |
| 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 | |
| 356 | 378 | return IMAGE_INIT_PASS; |
| 357 | 379 | } |
| 358 | 380 | |