blob: bf742ffbaca950ed687c98e682b1dc3f182c193a (
plain) (
tree)
|
|
// license:GPL-2.0+
// copyright-holders:Wilbert Pol, Kevin Thacker
/***************************************************************************
nc.c
***************************************************************************/
#include "emu.h"
#include "includes/nc.h"
#include "machine/i8251.h"
/*************************************************************************************************/
/* PCMCIA Ram Card management */
/* the data is stored as a simple memory dump, there is no header or other information */
/* stores size of actual file on filesystem */
/* this is not a real register, it is used to record card status */
/* ==0, card not inserted, !=0 card is inserted */
// set pcmcia card present state
void nc_state::set_card_present_state(int state)
{
m_card_status = state;
}
// this mask will prevent overwrites from end of data
int nc_state::card_calculate_mask(int size)
{
/* memory block is visible as 16k blocks */
/* mask can only operate on power of two sizes */
/* memory cards normally in power of two sizes */
/* maximum of 64 16k blocks can be accessed using memory paging of nc computer */
/* max card size is therefore 1mb */
for (int i = 14; i < 20; i++)
{
if (size < (1 << i))
return 0x03f >> (19 - i);
}
return 0x03f;
}
// load pcmcia card data
DEVICE_IMAGE_LOAD_MEMBER( nc_state::load_pcmcia_card )
{
uint32_t size = m_card->common_get_size("rom");
m_card->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
m_card->common_load_rom(m_card->get_rom_base(), size, "rom");
set_card_present_state(1);
m_membank_card_ram_mask = card_calculate_mask(size);
return image_init_result::PASS;
}
// save pcmcia card data back
DEVICE_IMAGE_UNLOAD_MEMBER( nc_state::unload_pcmcia_card )
{
// if there is no data to write, quit
if (!m_card_size)
return;
logerror("attempting card save\n");
// write data
image.fwrite(m_card_ram, m_card_size);
logerror("write succeeded!\r\n");
// set card not present state
set_card_present_state(0);
m_card_size = 0;
}
void nc_state::init_nc()
{
// set card not present state
set_card_present_state(0);
m_card_size = 0;
}
|