1 // license:BSD-3-Clause
2 // copyright-holders:AJR
3 /***************************************************************************
4 
5     SDK-85 memory expansion (ALE-multiplexed)
6 
7 ***************************************************************************/
8 
9 #include "emu.h"
10 #include "memexp.h"
11 
12 #include "i8755.h"
13 
14 // device type definition
15 DEFINE_DEVICE_TYPE(SDK85_ROMEXP, sdk85_romexp_device, "sdk85_romexp", "SDK-85 expansion ROM socket")
16 
sdk85_romexp_device(const machine_config & mconfig,const char * tag,device_t * owner,u32 clock)17 sdk85_romexp_device::sdk85_romexp_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
18 	: device_t(mconfig, SDK85_ROMEXP, tag, owner, clock)
19 	, device_image_interface(mconfig, *this)
20 	, device_single_card_slot_interface<device_sdk85_romexp_card_interface>(mconfig, *this)
21 	, m_dev(nullptr)
22 {
23 }
24 
call_load()25 image_init_result sdk85_romexp_device::call_load()
26 {
27 	if (get_card_device() != nullptr)
28 	{
29 		u32 size = loaded_through_softlist() ? get_software_region_length("rom") : length();
30 		u8 *base = get_card_device()->get_rom_base(size);
31 		if (base == nullptr)
32 			return image_init_result::FAIL;
33 
34 		if (loaded_through_softlist())
35 			memcpy(base, get_software_region("rom"), size);
36 		else
37 			fread(base, size);
38 	}
39 
40 	return image_init_result::PASS;
41 }
42 
get_default_card_software(get_default_card_software_hook & hook) const43 std::string sdk85_romexp_device::get_default_card_software(get_default_card_software_hook &hook) const
44 {
45 	return software_get_default_slot("i8755");
46 }
47 
device_start()48 void sdk85_romexp_device::device_start()
49 {
50 	m_dev = get_card_device();
51 }
52 
memory_r(offs_t offset)53 u8 sdk85_romexp_device::memory_r(offs_t offset)
54 {
55 	if (m_dev != nullptr)
56 		return m_dev->read_memory(offset);
57 	else
58 		return 0xff;
59 }
60 
memory_w(offs_t offset,u8 data)61 void sdk85_romexp_device::memory_w(offs_t offset, u8 data)
62 {
63 	if (m_dev != nullptr)
64 		m_dev->write_memory(offset, data);
65 }
66 
io_r(offs_t offset)67 u8 sdk85_romexp_device::io_r(offs_t offset)
68 {
69 	if (m_dev != nullptr)
70 		return m_dev->read_io(offset);
71 	else
72 		return 0xff;
73 }
74 
io_w(offs_t offset,u8 data)75 void sdk85_romexp_device::io_w(offs_t offset, u8 data)
76 {
77 	if (m_dev != nullptr)
78 		m_dev->write_io(offset, data);
79 }
80 
rom_options(device_slot_interface & slot)81 void sdk85_romexp_device::rom_options(device_slot_interface &slot)
82 {
83 	slot.option_add_internal("i8755", SDK85_I8755);
84 }
85 
device_sdk85_romexp_card_interface(const machine_config & mconfig,device_t & device)86 device_sdk85_romexp_card_interface::device_sdk85_romexp_card_interface(const machine_config &mconfig, device_t &device)
87 	: device_interface(device, "sdk85_romexp")
88 {
89 }
90 
get_rom_base(u32 size)91 u8 *device_sdk85_romexp_card_interface::get_rom_base(u32 size)
92 {
93 	return nullptr;
94 }
95