1 // license:BSD-3-Clause
2 // copyright-holders:Wilbert Pol
3 #include "emu.h"
4 #include "msx_s1985.h"
5 
6 const uint8_t manufacturer_id = 0xfe;
7 
8 DEFINE_DEVICE_TYPE(MSX_S1985, msx_s1985_device, "msx_s1985", "MSX-Engine S1985")
9 
msx_s1985_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)10 msx_s1985_device::msx_s1985_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
11 	: device_t(mconfig, MSX_S1985, tag, owner, clock)
12 	, device_nvram_interface(mconfig, *this)
13 	, m_selected(false)
14 	, m_backup_ram_address(0)
15 	, m_color1(0)
16 	, m_color2(0)
17 	, m_pattern(0)
18 {
19 }
20 
21 
device_start()22 void msx_s1985_device::device_start()
23 {
24 	save_item(NAME(m_selected));
25 	save_item(NAME(m_backup_ram_address));
26 	save_item(NAME(m_backup_ram));
27 	save_item(NAME(m_color1));
28 	save_item(NAME(m_color2));
29 	save_item(NAME(m_pattern));
30 }
31 
32 
nvram_default()33 void msx_s1985_device::nvram_default()
34 {
35 	memset(m_backup_ram, 0xff, sizeof(m_backup_ram));
36 }
37 
38 
nvram_read(emu_file & file)39 void msx_s1985_device::nvram_read(emu_file &file)
40 {
41 	file.read(m_backup_ram, sizeof(m_backup_ram));
42 }
43 
44 
nvram_write(emu_file & file)45 void msx_s1985_device::nvram_write(emu_file &file)
46 {
47 	file.write(m_backup_ram, sizeof(m_backup_ram));
48 }
49 
50 
switched_read(offs_t offset)51 uint8_t msx_s1985_device::switched_read(offs_t offset)
52 {
53 	if (m_selected)
54 	{
55 		switch (offset)
56 		{
57 		case 0:
58 			/// Manufacturer ID number register
59 			return manufacturer_id ^ 0xff;
60 
61 		case 2:
62 			/// Back-up RAM read
63 			return m_backup_ram[m_backup_ram_address];
64 
65 		case 7:
66 		{
67 			// Pattern and foreground/background color read
68 			uint8_t data = (m_pattern & 0x80) ? m_color2 : m_color1;
69 
70 			if(!machine().side_effects_disabled())
71 				m_pattern = (m_pattern << 1) | (m_pattern >> 7);
72 
73 			return data;
74 		}
75 
76 		default:
77 			printf("msx_s1985: unhandled read from offset %02x\n", offset);
78 			break;
79 		}
80 	}
81 
82 	return 0xff;
83 }
84 
85 
switched_write(offs_t offset,uint8_t data)86 void msx_s1985_device::switched_write(offs_t offset, uint8_t data)
87 {
88 	if (offset == 0)
89 	{
90 		/// Manufacturer ID number register
91 		m_selected = (data == manufacturer_id);
92 	}
93 	else if (m_selected)
94 	{
95 		switch (offset)
96 		{
97 		case 1:
98 			/// Back-up RAM address latch
99 			m_backup_ram_address = data & 0x0f;
100 			break;
101 
102 		case 2:
103 			/// Back-up RAM write
104 			m_backup_ram[m_backup_ram_address] = data;
105 			break;
106 
107 		case 6:
108 			// Foreground/background color write
109 			m_color2 = m_color1;
110 			m_color1 = data;
111 			break;
112 
113 		case 7:
114 			// Pattern write
115 			m_pattern = data;
116 			break;
117 
118 		default:
119 			printf("msx_s1985: unhandled write %02x to offset %02x\n", data, offset);
120 			break;
121 		}
122 	}
123 }
124