summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/machine/cbm_snqk.cpp
blob: ceb4ab67315b45c1de02547c3b7ebd2fe9c66dc4 (plain) (tree)
1
2

                               























                                                 
                                                                                                                
                                                                                                                 

                       


                                  
              



                           
                                            


                               
                                                 








                                                                           
                                                 














                                                                                                        
                                                  
                                            


                               
                                   
 
                                                          





                                                                
                                                         
                                       

      
                                       

 
                                                                       
 
                                                 


                                                 
                                               



                                               
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/***********************************************

 CBM Quickloads

 ***********************************************/

#include "emu.h"
#include "machine/cbm_snqk.h"

/* prg file format
 * sfx file format
 * sda file format
 * 0 lsb 16bit address
 * 2 chip data */

/* p00 file format (p00 .. p63, s00 .. s63, ..)
 * 0x0000 C64File
 * 0x0007 0
 * 0x0008 Name in commodore encoding?
 * 0x0018 0 0
 * 0x001a lsb 16bit address
 * 0x001c data */


image_init_result general_cbm_loadsnap( device_image_interface &image, const char *file_type, int snapshot_size,
	address_space &space, offs_t offset, void (*cbm_sethiaddress)(address_space &space, uint16_t hiaddress) )
{
	char buffer[7];
	std::vector<uint8_t> data;
	uint32_t bytesread;
	uint16_t address = 0;
	int i;

	if (!file_type)
		goto error;

	if (!core_stricmp(file_type, "prg"))
	{
		/* prg files */
	}
	else if (!core_stricmp(file_type, "p00"))
	{
		/* p00 files */
		if (image.fread( buffer, sizeof(buffer)) != sizeof(buffer))
			goto error;
		if (memcmp(buffer, "C64File", sizeof(buffer)))
			goto error;
		image.fseek(26, SEEK_SET);
		snapshot_size -= 26;
	}
	else if (!core_stricmp(file_type, "t64"))
	{
		/* t64 files - for GB64 Single T64s loading to x0801 - header is always the same size */
		if (image.fread( buffer, sizeof(buffer)) != sizeof(buffer))
			goto error;
		if (memcmp(buffer, "C64 tape image file", sizeof(buffer)))
			goto error;
		image.fseek(94, SEEK_SET);
		snapshot_size -= 94;
	}
	else
	{
		goto error;
	}

	image.fread( &address, 2);
	address = little_endianize_int16(address);
	if (!core_stricmp(file_type, "t64"))
		address = 2049;
	snapshot_size -= 2;

	data.resize(snapshot_size);

	bytesread = image.fread( &data[0], snapshot_size);
	if (bytesread != snapshot_size)
		goto error;

	for (i = 0; i < snapshot_size; i++)
		space.write_byte(address + i + offset, data[i]);

	cbm_sethiaddress(space, address + snapshot_size);
	return image_init_result::PASS;

error:
	return image_init_result::FAIL;
}

void cbm_quick_sethiaddress( address_space &space, uint16_t hiaddress )
{
	space.write_byte(0xae, hiaddress & 0xff);
	space.write_byte(0x31, hiaddress & 0xff);
	space.write_byte(0x2f, hiaddress & 0xff);
	space.write_byte(0x2d, hiaddress & 0xff);
	space.write_byte(0xaf, hiaddress >> 8);
	space.write_byte(0x32, hiaddress >> 8);
	space.write_byte(0x30, hiaddress >> 8);
	space.write_byte(0x2e, hiaddress >> 8);
}