// 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);
}