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