1 // license:BSD-3-Clause
2 // copyright-holders:Sandro Ronco
3 /***************************************************************************
4 
5     TI-89, TI-92, TI-92 plus, Voyage 200 PLT and TI-89 Titanium
6 
7     Driver by Sandro Ronco
8 
9     Note:
10      -NVRAM works only if the calculator is turned off (2nd + ON) before closing MESS
11 
12     TODO:
13      -Link
14      -HW 3 I/O port
15      -RTC
16      -LCD contrast
17 
18 ****************************************************************************/
19 
20 #include "emu.h"
21 #include "includes/ti89.h"
22 
23 #include "cpu/m68000/m68000.h"
24 #include "machine/intelfsh.h"
25 #include "machine/nvram.h"
26 #include "screen.h"
27 
28 
keypad_r()29 uint8_t ti68k_state::keypad_r()
30 {
31 	uint8_t bit, data = 0xff;
32 
33 	for (bit = 0; bit < 10; bit++)
34 	{
35 		if (~m_kb_mask & (0x01 << bit))
36 		{
37 			data ^= m_io_bit0->read() & (0x01 << bit) ? 0x01 : 0x00;
38 			data ^= m_io_bit1->read() & (0x01 << bit) ? 0x02 : 0x00;
39 			data ^= m_io_bit2->read() & (0x01 << bit) ? 0x04 : 0x00;
40 			data ^= m_io_bit3->read() & (0x01 << bit) ? 0x08 : 0x00;
41 			data ^= m_io_bit4->read() & (0x01 << bit) ? 0x10 : 0x00;
42 			data ^= m_io_bit5->read() & (0x01 << bit) ? 0x20 : 0x00;
43 			data ^= m_io_bit6->read() & (0x01 << bit) ? 0x40 : 0x00;
44 			data ^= m_io_bit7->read() & (0x01 << bit) ? 0x80 : 0x00;
45 		}
46 	}
47 
48 	return data;
49 }
50 
51 
ti68k_io_w(offs_t offset,uint16_t data)52 void ti68k_state::ti68k_io_w(offs_t offset, uint16_t data)
53 {
54 	switch(offset & 0x0f)
55 	{
56 		case 0x00:
57 			m_lcd_contrast = (m_lcd_contrast & 0xfe) | BIT(data, 5);
58 			break;
59 		case 0x02:
60 			if (!(data & 0x10) && data != m_io_hw1[offset])
61 				m_maincpu->suspend(SUSPEND_REASON_DISABLE, 1);
62 			break;
63 		case 0x08:
64 				m_lcd_base = data << 3;
65 			break;
66 		case 0x09:
67 				m_lcd_width = (0x40 - ((data >> 8) & 0xff)) * 0x10;
68 				m_lcd_height = 0x100 - (data & 0xff);
69 			break;
70 		case 0x0a:
71 			m_timer_on = BIT(data ,1);
72 			switch((data >> 4) & 0x03)
73 			{
74 				case 0:     m_timer_mask = 0x0000;  break;
75 				case 1:     m_timer_mask = 0x000f;  break;
76 				case 2:     m_timer_mask = 0x007f;  break;
77 				case 3:     m_timer_mask = 0x1fff;  break;
78 			}
79 			break;
80 		case 0x0b:
81 			m_timer_val = data & 0xff;
82 		case 0x0c:
83 			m_kb_mask = data & 0x03ff;
84 			break;
85 		case 0x0e:
86 			m_lcd_on = (((data >> 8) & 0x3c) == 0x3c) ? 0 : 1;
87 			m_lcd_contrast = (m_lcd_contrast & 0x01) | ((data & 0x0f) << 1);
88 			break;
89 		default: break;
90 	}
91 	m_io_hw1[offset & 0x0f] = data;
92 }
93 
94 
ti68k_io_r(offs_t offset)95 uint16_t ti68k_state::ti68k_io_r(offs_t offset)
96 {
97 	uint16_t data;
98 
99 	switch (offset & 0x0f)
100 	{
101 		case 0x00:
102 			data = 0x0400 | ((m_lcd_contrast & 1) << 13);
103 			break;
104 		case 0x0b:
105 			data = m_timer_val;
106 			break;
107 		case 0x0d:
108 			data = ((!m_on_key) << 9) | keypad_r();
109 			break;
110 		default:
111 			data= m_io_hw1[offset & 0x0f];
112 	}
113 	return data;
114 }
115 
116 
ti68k_io2_w(offs_t offset,uint16_t data)117 void ti68k_state::ti68k_io2_w(offs_t offset, uint16_t data)
118 {
119 	switch(offset & 0x7f)
120 	{
121 		case 0x0b:
122 			m_lcd_base = 0x4c00 + 0x1000 * (data & 0x03);
123 			break;
124 		case 0x0e:
125 			m_lcd_on = (data & 0x02) ? 1 : 0;
126 			break;
127 		default: break;
128 	}
129 	m_io_hw2[offset & 0x7f] = data;
130 }
131 
132 
ti68k_io2_r(offs_t offset)133 uint16_t ti68k_state::ti68k_io2_r(offs_t offset)
134 {
135 	uint16_t data;
136 
137 	switch (offset & 0x7f)
138 	{
139 		default:
140 			data= m_io_hw2[offset & 0x7f];
141 	}
142 	return data;
143 }
144 
145 
rom_r(offs_t offset)146 uint16_t ti68k_state::rom_r(offs_t offset)
147 {
148 	return m_rom_base[offset];
149 }
150 
151 
reset_overlay_r(offs_t offset)152 uint16_t ti68k_state::reset_overlay_r(offs_t offset)
153 {
154 	if (m_ram_enabled)
155 		return m_ram_base[offset];
156 	else
157 	{
158 		// FIXME: probably triggered by something else
159 		if (offset == 3 && !machine().side_effects_disabled())
160 			m_ram_enabled = true;
161 
162 		// FIXME: this reset vector happens to work for all Flash systems, but may not be loaded
163 		// first. It is algorithmically located by the preceding initialization code which looks
164 		// for the string of four CC bytes preceding it. This code has not been enabled since it
165 		// also contains a "Certificate Memory" self-test which fails.
166 		if (m_flash.found())
167 			return m_flash->read(offset + 0x12088/2);
168 		else
169 			return m_rom_base[offset];
170 	}
171 }
172 
173 
TIMER_DEVICE_CALLBACK_MEMBER(ti68k_state::ti68k_timer_callback)174 TIMER_DEVICE_CALLBACK_MEMBER(ti68k_state::ti68k_timer_callback)
175 {
176 	m_timer++;
177 
178 	if (m_timer_on)
179 	{
180 		if (!(m_timer & m_timer_mask) && BIT(m_io_hw1[0x0a], 3))
181 		{
182 			if (m_timer_val)
183 				m_timer_val++;
184 			else
185 				m_timer_val = (m_io_hw1[0x0b]) & 0xff;
186 		}
187 
188 		if (!BIT(m_io_hw1[0x0a], 7) && ((m_hw_version == HW1) || (!BIT(m_io_hw1[0x0f], 2) && !BIT(m_io_hw1[0x0f], 1))))
189 		{
190 			if (!(m_timer & 0x003f))
191 				m_maincpu->set_input_line(M68K_IRQ_1, HOLD_LINE);
192 
193 			if (!(m_timer & 0x3fff) && !BIT(m_io_hw1[0x0a], 3))
194 				m_maincpu->set_input_line(M68K_IRQ_3, HOLD_LINE);
195 
196 			if (!(m_timer & m_timer_mask) && BIT(m_io_hw1[0x0a], 3) && m_timer_val == 0)
197 				m_maincpu->set_input_line(M68K_IRQ_5, HOLD_LINE);
198 		}
199 	}
200 
201 	if (keypad_r() != 0xff)
202 		m_maincpu->set_input_line(M68K_IRQ_2, HOLD_LINE);
203 }
204 
205 
ti92_mem(address_map & map)206 void ti68k_state::ti92_mem(address_map &map)
207 {
208 	map.unmap_value_high();
209 	map(0x000000, 0x0fffff).ram().share("nvram");
210 	map(0x000000, 0x000007).r(FUNC(ti68k_state::reset_overlay_r));
211 	map(0x200000, 0x5fffff).unmaprw();   // ROM
212 	map(0x600000, 0x6fffff).rw(FUNC(ti68k_state::ti68k_io_r), FUNC(ti68k_state::ti68k_io_w));
213 }
214 
215 
ti89_mem(address_map & map)216 void ti68k_state::ti89_mem(address_map &map)
217 {
218 	map.unmap_value_high();
219 	map(0x000000, 0x0fffff).ram().share("nvram");
220 	map(0x000000, 0x000007).r(FUNC(ti68k_state::reset_overlay_r));
221 	map(0x200000, 0x3fffff).rw(m_flash, FUNC(intelfsh16_device::read), FUNC(intelfsh16_device::write));
222 	map(0x400000, 0x5fffff).noprw();
223 	map(0x600000, 0x6fffff).rw(FUNC(ti68k_state::ti68k_io_r), FUNC(ti68k_state::ti68k_io_w));
224 	map(0x700000, 0x7fffff).rw(FUNC(ti68k_state::ti68k_io2_r), FUNC(ti68k_state::ti68k_io2_w));
225 }
226 
227 
ti92p_mem(address_map & map)228 void ti68k_state::ti92p_mem(address_map &map)
229 {
230 	map.unmap_value_high();
231 	map(0x000000, 0x0fffff).ram().share("nvram");
232 	map(0x000000, 0x000007).r(FUNC(ti68k_state::reset_overlay_r));
233 	map(0x200000, 0x3fffff).noprw();
234 	map(0x400000, 0x5fffff).rw(m_flash, FUNC(intelfsh16_device::read), FUNC(intelfsh16_device::write));
235 	map(0x600000, 0x6fffff).rw(FUNC(ti68k_state::ti68k_io_r), FUNC(ti68k_state::ti68k_io_w));
236 	map(0x700000, 0x7fffff).rw(FUNC(ti68k_state::ti68k_io2_r), FUNC(ti68k_state::ti68k_io2_w));
237 }
238 
239 
v200_mem(address_map & map)240 void ti68k_state::v200_mem(address_map &map)
241 {
242 	map.unmap_value_high();
243 	map(0x000000, 0x0fffff).ram().share("nvram");
244 	map(0x000000, 0x000007).r(FUNC(ti68k_state::reset_overlay_r));
245 	map(0x200000, 0x5fffff).rw(m_flash, FUNC(intelfsh16_device::read), FUNC(intelfsh16_device::write));
246 	map(0x600000, 0x6fffff).rw(FUNC(ti68k_state::ti68k_io_r), FUNC(ti68k_state::ti68k_io_w));
247 	map(0x700000, 0x70ffff).rw(FUNC(ti68k_state::ti68k_io2_r), FUNC(ti68k_state::ti68k_io2_w));
248 }
249 
250 
ti89t_mem(address_map & map)251 void ti68k_state::ti89t_mem(address_map &map)
252 {
253 	map.unmap_value_high();
254 	map(0x000000, 0x0fffff).ram().mirror(0x200000).share("nvram");
255 	map(0x000000, 0x000007).r(FUNC(ti68k_state::reset_overlay_r));
256 	map(0x600000, 0x6fffff).rw(FUNC(ti68k_state::ti68k_io_r), FUNC(ti68k_state::ti68k_io_w));
257 	map(0x700000, 0x70ffff).rw(FUNC(ti68k_state::ti68k_io2_r), FUNC(ti68k_state::ti68k_io2_w));
258 	map(0x800000, 0xbfffff).rw(m_flash, FUNC(intelfsh16_device::read), FUNC(intelfsh16_device::write));
259 	map(0xc00000, 0xffffff).noprw();
260 }
261 
262 
INPUT_CHANGED_MEMBER(ti68k_state::ti68k_on_key)263 INPUT_CHANGED_MEMBER(ti68k_state::ti68k_on_key)
264 {
265 	m_on_key = newval;
266 
267 	if (m_on_key)
268 	{
269 		if (m_maincpu->suspended(SUSPEND_REASON_DISABLE))
270 			m_maincpu->resume(SUSPEND_REASON_DISABLE);
271 
272 		m_maincpu->set_input_line(M68K_IRQ_6, HOLD_LINE);
273 	}
274 }
275 
276 
277 /* Input ports for TI-89 and TI-89 Titanium*/
278 static INPUT_PORTS_START (ti8x)
279 	PORT_START("BIT0")   /* bit 0 */
PORT_CODE(KEYCODE_UP)280 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP)
281 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENTER  (ENTRY)") PORT_CODE(KEYCODE_ENTER)
282 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(-)") PORT_CODE(KEYCODE_M)
283 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP)
284 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0)
285 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("APPS") PORT_CODE(KEYCODE_F11)
286 		PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC)
287 
288 	PORT_START("BIT1")   /* bit 1 */
289 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT)
290 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("+") PORT_CODE(KEYCODE_BACKSLASH)
291 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3)
292 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2)
293 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1)
294 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("STORE") PORT_CODE(KEYCODE_TAB)
295 		PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ON") PORT_CODE(KEYCODE_F10) PORT_CHANGED_MEMBER(DEVICE_SELF, ti68k_state, ti68k_on_key, 0)
296 
297 	PORT_START("BIT2")   /* bit 2 */
298 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN)
299 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS)
300 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6)
301 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5)
302 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4)
303 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("EE") PORT_CODE(KEYCODE_E)
304 
305 	PORT_START("BIT3")   /* bit 3 */
306 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT)
307 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_L)
308 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9)
309 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8)
310 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7)
311 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("|") PORT_CODE(KEYCODE_COLON)
312 
313 	PORT_START("BIT4")   /* bit 4 */
314 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2nd") PORT_CODE(KEYCODE_LALT)
315 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH)
316 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA)
317 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(")") PORT_CODE(KEYCODE_CLOSEBRACE)
318 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(") PORT_CODE(KEYCODE_OPENBRACE)
319 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("=") PORT_CODE(KEYCODE_EQUALS)
320 
321 	PORT_START("BIT5")   /* bit 5 */
322 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT)
323 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("^") PORT_CODE(KEYCODE_P)
324 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T)
325 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z)
326 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y)
327 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X)
328 
329 	PORT_START("BIT6")   /* bit 6 */
330 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3nd") PORT_CODE(KEYCODE_LCONTROL)
331 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CLEAR") PORT_CODE(KEYCODE_DEL)
332 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("<--") PORT_CODE(KEYCODE_BACKSPACE)
333 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CATALOG") PORT_CODE(KEYCODE_F8)
334 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Mode") PORT_CODE(KEYCODE_F12)
335 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME)
336 
337 	PORT_START("BIT7")   /* bit 7 */
338 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ALPHA") PORT_CODE(KEYCODE_CAPSLOCK)
339 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5)
340 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4)
341 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3)
342 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2)
343 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1)
344 INPUT_PORTS_END
345 
346 /* Input ports for TI-92 and TI92 Plus*/
347 static INPUT_PORTS_START (ti9x)
348 	PORT_START("BIT0")   /* bit 0 */
349 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2nd") PORT_CODE(KEYCODE_LALT)
350 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_UNUSED)
351 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_UNUSED)
352 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("STORE") PORT_CODE(KEYCODE_TAB)
353 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE)
354 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH)
355 		PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("^") PORT_CODE(KEYCODE_COLON)
356 		PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("=") PORT_CODE(KEYCODE_EQUALS)
357 		PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("<--") PORT_CODE(KEYCODE_BACKSPACE)
358 		PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS)
359 
360 	PORT_START("BIT1")   /* bit 1 */
361 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3nd") PORT_CODE(KEYCODE_LCONTROL)
362 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z)
363 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X)
364 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C)
365 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V)
366 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B)
367 		PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N)
368 		PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M)
369 		PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("o") PORT_CODE(KEYCODE_BACKSLASH)
370 		PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER_PAD)
371 
372 	PORT_START("BIT2")   /* bit 2 */
373 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT)
374 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S)
375 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D)
376 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F)
377 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G)
378 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H)
379 		PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J)
380 		PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K)
381 		PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L)
382 		PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A)
383 
384 	PORT_START("BIT3")   /* bit 3 */
385 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Clock") PORT_CODE(KEYCODE_F11)
386 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W)
387 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E)
388 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R)
389 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T)
390 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y)
391 		PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U)
392 		PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I)
393 		PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O)
394 		PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q)
395 
396 	PORT_START("BIT4")   /* bit 4 */
397 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT)
398 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8)
399 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3)
400 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7)
401 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2)
402 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6)
403 		PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1)
404 		PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5)
405 		PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("+") PORT_CODE(KEYCODE_PLUS_PAD)
406 		PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4)
407 
408 	PORT_START("BIT5")   /* bit 5 */
409 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP)
410 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1)
411 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4)
412 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7)
413 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(") PORT_CODE(KEYCODE_OPENBRACE)
414 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SIN") PORT_CODE(KEYCODE_PGUP)
415 		PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LN") PORT_CODE(KEYCODE_PGDN)
416 		PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CLEAR") PORT_CODE(KEYCODE_DEL)
417 		PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("MODE") PORT_CODE(KEYCODE_F12)
418 		PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0)
419 
420 	PORT_START("BIT6")   /* bit 6 */
421 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT)
422 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2)
423 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5)
424 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8)
425 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(")") PORT_CODE(KEYCODE_CLOSEBRACE)
426 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("COS") PORT_CODE(KEYCODE_END)
427 		PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER)
428 		PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("APPS") PORT_CODE(KEYCODE_HOME)
429 		PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC)
430 		PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP)
431 
432 	PORT_START("BIT7")   /* bit 7 */
433 		PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN)
434 		PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3)
435 		PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6)
436 		PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9)
437 		PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA)
438 		PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("TAN") PORT_CODE(KEYCODE_INSERT)
439 		PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P)
440 		PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("*") PORT_CODE(KEYCODE_ASTERISK)
441 		PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ON") PORT_CODE(KEYCODE_F10) PORT_CHANGED_MEMBER(DEVICE_SELF, ti68k_state, ti68k_on_key, 0)
442 		PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(-)") PORT_CODE(KEYCODE_MINUS_PAD)
443 INPUT_PORTS_END
444 
445 
446 void ti68k_state::machine_start()
447 {
448 	if (m_flash.found())
449 	{
450 		uint32_t base = ((((m_rom_base[0x82]) << 16) | m_rom_base[0x83]) & 0xffff)>>1;
451 
452 		if (m_rom_base[base] >= 8)
453 			m_hw_version = ((m_rom_base[base + 0x0b]) << 16) | m_rom_base[base + 0x0c];
454 
455 		if (!m_hw_version)
456 			m_hw_version = HW1;
457 	}
458 	else
459 	{
460 		m_hw_version = HW1;
461 		uint32_t initial_pc = ((m_rom_base[2]) << 16) | m_rom_base[3];
462 
463 		m_maincpu->space(AS_PROGRAM).unmap_read(0x200000, 0x5fffff);
464 
465 		if (initial_pc > 0x400000)
466 		{
467 			m_maincpu->space(AS_PROGRAM).install_read_handler(0x400000, 0x5fffff, read16sm_delegate(*this, FUNC(ti68k_state::rom_r)));
468 		}
469 		else
470 		{
471 			m_maincpu->space(AS_PROGRAM).install_read_handler(0x200000, 0x3fffff, read16sm_delegate(*this, FUNC(ti68k_state::rom_r)));
472 		}
473 	}
474 
475 	logerror("HW=v%x, Type=%s\n", m_hw_version, m_flash.found() ? "Flash" : "ROM");
476 }
477 
478 
machine_reset()479 void ti68k_state::machine_reset()
480 {
481 	m_ram_enabled = false;
482 
483 	m_kb_mask = 0xff;
484 	m_on_key = 0;
485 	m_lcd_base = 0;
486 	m_lcd_width = 0;
487 	m_lcd_height = 0;
488 	m_lcd_on = 0;
489 	m_lcd_contrast = 0;
490 	memset(m_io_hw1, 0, ARRAY_LENGTH(m_io_hw1) * sizeof(uint16_t));
491 	memset(m_io_hw2, 0, ARRAY_LENGTH(m_io_hw2) * sizeof(uint16_t));
492 	m_timer_on = 0;
493 	m_timer_mask = 0xf;
494 	m_timer_val = 0;
495 }
496 
497 /* video */
screen_update(screen_device & screen,bitmap_ind16 & bitmap,const rectangle & cliprect)498 uint32_t ti68k_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
499 {
500 	/* preliminary implementation, doesn't use the contrast value */
501 	uint8_t const width = screen.width();
502 	uint8_t const height = screen.height();
503 
504 	if (!m_lcd_on || !m_lcd_base)
505 		bitmap.fill(0);
506 	else
507 		for (uint8_t y = 0; y < height; y++)
508 			for (uint8_t x = 0; x < width / 8; x++)
509 			{
510 				uint8_t s_byte= m_maincpu->space(AS_PROGRAM).read_byte(m_lcd_base + y * (width/8) + x);
511 				for (uint8_t b = 0; b<8; b++)
512 					bitmap.pix(y, x * 8 + (7 - b)) = BIT(s_byte, b);
513 			}
514 
515 	return 0;
516 }
517 
ti68k_palette(palette_device & palette) const518 void ti68k_state::ti68k_palette(palette_device &palette) const
519 {
520 	palette.set_pen_color(0, rgb_t(138, 146, 148));
521 	palette.set_pen_color(1, rgb_t(92, 83, 88));
522 }
523 
ti89(machine_config & config)524 void ti68k_state::ti89(machine_config &config)
525 {
526 	/* basic machine hardware */
527 	M68000(config, m_maincpu, XTAL(10'000'000));
528 	m_maincpu->set_addrmap(AS_PROGRAM, &ti68k_state::ti89_mem);
529 
530 	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
531 
532 	/* video hardware */
533 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
534 	screen.set_refresh_hz(50);
535 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
536 	screen.set_screen_update(FUNC(ti68k_state::screen_update));
537 	screen.set_size(240, 128);
538 	screen.set_visarea(0, 160-1, 0, 100-1);
539 	screen.set_palette("palette");
540 
541 	PALETTE(config, "palette", FUNC(ti68k_state::ti68k_palette), 2);
542 
543 	SHARP_LH28F160S3(config, m_flash);
544 
545 	TIMER(config, "ti68k_timer").configure_periodic(FUNC(ti68k_state::ti68k_timer_callback), attotime::from_hz(1<<14));
546 }
547 
548 
ti92(machine_config & config)549 void ti68k_state::ti92(machine_config &config)
550 {
551 	ti89(config);
552 	m_maincpu->set_addrmap(AS_PROGRAM, &ti68k_state::ti92_mem);
553 
554 	config.device_remove("flash");
555 
556 	/* video hardware */
557 	subdevice<screen_device>("screen")->set_visarea(0, 240-1, 0, 128-1);
558 }
559 
560 
ti92p(machine_config & config)561 void ti68k_state::ti92p(machine_config &config)
562 {
563 	ti89(config);
564 	m_maincpu->set_clock(XTAL(12'000'000));
565 	m_maincpu->set_addrmap(AS_PROGRAM, &ti68k_state::ti92p_mem);
566 
567 	/* video hardware */
568 	subdevice<screen_device>("screen")->set_visarea(0, 240-1, 0, 128-1);
569 }
570 
571 
v200(machine_config & config)572 void ti68k_state::v200(machine_config &config)
573 {
574 	ti89(config);
575 	m_maincpu->set_clock(XTAL(12'000'000));
576 	m_maincpu->set_addrmap(AS_PROGRAM, &ti68k_state::v200_mem);
577 
578 	SHARP_LH28F320BF(config.replace(), m_flash);
579 
580 	/* video hardware */
581 	subdevice<screen_device>("screen")->set_visarea(0, 240-1, 0, 128-1);
582 }
583 
584 
ti89t(machine_config & config)585 void ti68k_state::ti89t(machine_config &config)
586 {
587 	ti89(config);
588 	m_maincpu->set_clock(XTAL(16'000'000));
589 	m_maincpu->set_addrmap(AS_PROGRAM, &ti68k_state::ti89t_mem);
590 
591 	SHARP_LH28F320BF(config.replace(), m_flash);
592 }
593 
594 
595 /* ROM definition */
596 ROM_START( ti89 )
597 	ROM_REGION16_BE( 0x200000, "flash", ROMREGION_ERASEFF )
598 	ROM_SYSTEM_BIOS( 0, "v100", "V 1.00 - HW1" )
599 	ROMX_LOAD( "ti89v100.rom",   0x000000, 0x200000, CRC(264b34ad) SHA1(c87586a7e9b6d49fbe908fbb6f3c0038f3498573), ROM_BIOS(0))
600 	ROM_SYSTEM_BIOS( 1, "v100a", "V 1.00 [a] - HW1" )
601 	ROMX_LOAD( "ti89v100a.rom",  0x000000, 0x200000, CRC(95199934) SHA1(b8e3cdeb4705b0c7e0a15ab6c6f62bcde14a3a55), ROM_BIOS(1))
602 	ROM_SYSTEM_BIOS( 2, "v100m", "V 1.00 [m] - HW1" )
603 	ROMX_LOAD( "ti89v100m.rom",  0x000000, 0x200000, CRC(b9059e06) SHA1(b33a7c2935eb9f73b210bcf6e7c7f32d1548a9d5), ROM_BIOS(2))
604 	ROM_SYSTEM_BIOS( 3, "v100m2", "V 1.00 [m2] - HW1" )
605 	ROMX_LOAD( "ti89v100m2.rom", 0x000000, 0x200000, CRC(cdd69d34) SHA1(1686362b0997bb9597f39b443490d4d8d85b56cc), ROM_BIOS(3))
606 	ROM_SYSTEM_BIOS( 4, "v105", "V 1.05 - HW1" )
607 	ROMX_LOAD( "ti89v105.rom",   0x000000, 0x200000, CRC(3bc0b474) SHA1(46fe0cd511eb81d53dc12cc4bdacec8a5bba5171), ROM_BIOS(4))
608 	ROM_SYSTEM_BIOS( 5, "v201", "V 2.01 - HW1" )
609 	ROMX_LOAD( "ti89v201.rom",   0x000000, 0x200000, CRC(fa6745e9) SHA1(e4ee6067df9b975356cef6c5a81d0ec664371c1d), ROM_BIOS(5))
610 	ROM_SYSTEM_BIOS( 6, "v203", "V 2.03 - HW1" )
611 	ROMX_LOAD( "ti89v203.rom",   0x000000, 0x200000, CRC(a3a74eca) SHA1(55aae3561722a96973b430e3d4cb4f513298ea4e), ROM_BIOS(6))
612 	ROM_SYSTEM_BIOS( 7, "v203m", "V 2.03 [m] - HW 1" )
613 	ROMX_LOAD( "ti89v203m.rom",  0x000000, 0x200000, CRC(d79068f7) SHA1(5b6f571417889b11ae19eef99a5fda4f027d5ec2), ROM_BIOS(7))
614 	ROM_SYSTEM_BIOS( 8, "v209",  "V 2.09 - HW 1" )
615 	ROMX_LOAD( "ti89v209.rom",   0x000000, 0x200000, CRC(f76f9c15) SHA1(66409ef4b20190a3b7c0d48cbd30257580b47dcd), ROM_BIOS(8))
616 	ROM_SYSTEM_BIOS( 9, "v105-2","V 1.05 - HW2" )
617 	ROMX_LOAD( "ti89v105-2.rom", 0x000000, 0x200000, CRC(83817402) SHA1(b2ddf785e973cc3f9a437d058a68abdf7ca52ea2), ROM_BIOS(9))
618 	ROM_SYSTEM_BIOS( 10, "v203-2",  "V 2.03 - HW2" )
619 	ROMX_LOAD( "ti89v203-2.rom", 0x000000, 0x200000, CRC(5e0400a9) SHA1(43c608ee72f15aed56cb5762948ec6a3c93dd9d8), ROM_BIOS(10))
620 	ROM_SYSTEM_BIOS( 11, "v203m-2", "V 2.03 [m] - HW2" )
621 	ROMX_LOAD( "ti89v203m-2.rom", 0x000000, 0x200000, CRC(04d5d76d) SHA1(14ca44b64c29aa1bf274508ca40fe69224f5a7cc), ROM_BIOS(11))
622 	ROM_SYSTEM_BIOS( 12, "v205-2", "V 2.05 - HW2" )
623 	ROMX_LOAD( "ti89v205-2.rom", 0x000000, 0x200000, CRC(37c4653c) SHA1(f48d00a57430230e489e243383513485009b1b98), ROM_BIOS(12))
624 	ROM_SYSTEM_BIOS( 13, "v205-2m", "V 2.05 [m] - HW2" )
625 	ROMX_LOAD( "ti89v205m-2.rom", 0x000000, 0x200000, CRC(e58a23f9) SHA1(d4cb23fb4b414a43802c37dc3c572a8ede670e0f), ROM_BIOS(13))
626 	ROM_SYSTEM_BIOS( 14, "v205-2m2","V 2.05 [m2] - HW2" )
627 	ROMX_LOAD( "ti89v205m2-2.rom", 0x000000, 0x200000, CRC(a8ba976c) SHA1(38bd25ada5e2066c64761d1008a9327a37d68654), ROM_BIOS(14))
628 	ROM_SYSTEM_BIOS( 15,"v209-2", "V 2.09 - HW2" )
629 	ROMX_LOAD( "ti89v209-2.rom", 0x000000, 0x200000, CRC(242a238f) SHA1(9668df314a0180ef210796e9cb651c5e9f17eb07), ROM_BIOS(15))
630 ROM_END
631 
632 ROM_START( ti92 )
633 	ROM_REGION16_BE( 0x200000, "flash", ROMREGION_ERASEFF )
634 	ROM_SYSTEM_BIOS( 0, "v111", "V 1.11" )
635 	ROMX_LOAD( "ti92v111.rom",  0x000000, 0x100000, CRC(67878d52) SHA1(c0fdf162961922a76f286c93fd9b861ce20f23a3), ROM_BIOS(0))
636 	ROM_SYSTEM_BIOS( 1, "v13e", "V 1.3 [e]" )
637 	ROMX_LOAD( "ti92v13e.rom",  0x000000, 0x100000, CRC(316c8196) SHA1(82c8cd484c6aebe36f814a2023d2afad6d87f840), ROM_BIOS(1))
638 	ROM_SYSTEM_BIOS( 2, "v14e", "V 1.4 [e]" )
639 	ROMX_LOAD( "ti92v14e.rom",  0x000000, 0x100000, CRC(239e9405) SHA1(df2f1ab17d490fda43a02f5851b5a15052361b28), ROM_BIOS(2))
640 	ROM_SYSTEM_BIOS( 3, "v17e", "V 1.7 [e]" )
641 	ROMX_LOAD( "ti92v17e.rom",  0x000000, 0x100000, CRC(83e27cc5) SHA1(aec5a6a6157ff94a4e665fa3fe747bacb6688cd4), ROM_BIOS(3))
642 	ROM_SYSTEM_BIOS( 4, "v111e", "V 1.11 [e]" )
643 	ROMX_LOAD( "ti92v111e.rom", 0x000000, 0x100000, CRC(4a343833) SHA1(ab4eaacc8c83a861c8d37df5c10e532d0d580460), ROM_BIOS(4))
644 	ROM_SYSTEM_BIOS( 5, "v112e", "V 1.12 [e]" )
645 	ROMX_LOAD( "ti92v112e.rom", 0x000000, 0x100000, CRC(9a6947a0) SHA1(8bb0538ca98711e9ad46c56e4dfd609d4699be30), ROM_BIOS(5))
646 	ROM_SYSTEM_BIOS( 6, "v21e", "V 2.1 [e]" )
647 	ROMX_LOAD( "ti92v21e.rom",  0x000000, 0x200000, CRC(5afb5863) SHA1(bf7b260d37d1502cc4b08dea5e1d55b523f27925), ROM_BIOS(6))
648 
649 ROM_END
650 
651 ROM_START( ti92p )
652 	ROM_REGION16_BE( 0x200000, "flash", ROMREGION_ERASEFF )
653 	ROM_SYSTEM_BIOS( 0, "v100", "V 1.00 - HW1" )
654 	ROMX_LOAD( "ti92pv100.rom", 0x0000, 0x200000, CRC(c651a586) SHA1(fbbf7e053e70eefe517f9aae40c072036bc614ea), ROM_BIOS(0))
655 	ROM_SYSTEM_BIOS( 1, "v101", "V 1.01 - HW1" )
656 	ROMX_LOAD( "ti92pv101.rom", 0x0000, 0x200000, CRC(826b1539) SHA1(dd8969511fc6233bf2047f83c3306ac8d2be5644), ROM_BIOS(1))
657 	ROM_SYSTEM_BIOS( 2, "v101a","V 1.01 [a] - HW1" )
658 	ROMX_LOAD( "ti92pv101a.rom", 0x0000, 0x200000, CRC(18f9002f) SHA1(2bf13ba7da0212a8706c5a43853dc2ccb8c2257d), ROM_BIOS(2))
659 	ROM_SYSTEM_BIOS( 3, "v101m", "V 1.01 [m] - HW1" )
660 	ROMX_LOAD( "ti92pv101m.rom", 0x0000, 0x200000, CRC(fe2b6e77) SHA1(0e1bb8c677a726ee086c1a4280ab59de95b4abe2), ROM_BIOS(3))
661 	ROM_SYSTEM_BIOS( 4, "v105", "V 1.05 - HW1" )
662 	ROMX_LOAD( "ti92pv105.rom", 0x0000, 0x200000, CRC(cd945824) SHA1(6941aca243c6fd5c8a377253bffc2ffb5a84c41b), ROM_BIOS(4))
663 	ROM_SYSTEM_BIOS( 5, "v105-2", "V 1.05 - HW2" )
664 	ROMX_LOAD( "ti92pv105-2.rom", 0x0000, 0x200000, CRC(289aa84f) SHA1(c9395750e20d5a201401699d156b62f00530fcdd), ROM_BIOS(5))
665 	ROM_SYSTEM_BIOS( 6, "v203", "V 2.03 - HW2" )
666 	ROMX_LOAD( "ti92pv203.rom", 0x0000, 0x200000, CRC(1612213e) SHA1(1715dd5913bed12baedc4912e9abe0cb4e48cd45), ROM_BIOS(6))
667 	ROM_SYSTEM_BIOS( 7, "v204", "V 2.04 - HW2" )
668 	ROMX_LOAD( "ti92pv204.rom", 0x0000, 0x200000, CRC(86819be3) SHA1(78032a0f5f11d1e9a45ffbea91e7f9657fd1a8ae), ROM_BIOS(7))
669 	ROM_SYSTEM_BIOS( 8, "v205", "V 2.05 - HW2" )
670 	ROMX_LOAD( "ti92pv205.rom",  0x0000, 0x200000, CRC(9509c575) SHA1(703410d8bb98b8ec14277efcd8b7dda45a7cf358), ROM_BIOS(8))
671 	ROM_SYSTEM_BIOS( 9, "v205m", "V 2.05 [m] - HW2" )
672 	ROMX_LOAD( "ti92pv205m.rom",  0x000000, 0x200000, CRC(13ef4d57) SHA1(6ef290bb0dda72f645cd3eca9cc1185f6a2d32dc), ROM_BIOS(9))
673 	ROM_SYSTEM_BIOS( 10, "v209", "V 2.09 - HW2" )
674 	ROMX_LOAD( "ti92pv209.rom",  0x000000, 0x200000, CRC(4851ad52) SHA1(10e6c2cdc60623bf0be7ea72a9ec840259fb37c3), ROM_BIOS(10))
675 ROM_END
676 
677 ROM_START( v200 )
678 	ROM_REGION16_BE( 0x400000, "flash", ROMREGION_ERASEFF )
679 	ROM_SYSTEM_BIOS( 0, "v209", "V 2.09" )
680 	ROMX_LOAD( "voyage200v209.rom", 0x0000, 0x400000, CRC(f805c7a6) SHA1(818b919058ba3bd7d15604f11fff6740010d07fc), ROM_BIOS(0))
681 	ROM_SYSTEM_BIOS( 1, "v310", "V 3.10" )
682 	ROMX_LOAD( "voyage200v310.rom", 0x0000, 0x400000, CRC(ed4cbfd2) SHA1(39cdb9932f314ff792b1cc5e3fe041d98b9fd101), ROM_BIOS(1))
683 ROM_END
684 
685 ROM_START( ti89t )
686 	ROM_REGION16_BE( 0x400000, "flash", ROMREGION_ERASEFF )
687 	ROM_SYSTEM_BIOS( 0, "v300", "V 3.00" )
688 	ROMX_LOAD( "ti89tv300.rom", 0x0000, 0x400000, CRC(55eb4f5a) SHA1(4f919d7752caf2559a79883ec8711a9701d19513), ROM_BIOS(0))
689 	ROM_SYSTEM_BIOS( 1, "v310", "V 3.10" )
690 	ROMX_LOAD( "ti89tv310.rom", 0x0000, 0x400000, CRC(b6967cca) SHA1(fb4f09e5c4500dee651b8de537e502ab97cb8328), ROM_BIOS(1))
691 ROM_END
692 
693 /* Driver */
694 
695 //    YEAR  NAME   PARENT  COMPAT  MACHINE  INPUT  CLASS        INIT        COMPANY              FULLNAME          FLAGS
696 COMP( 1998, ti89,  0,       0,     ti89,    ti8x,  ti68k_state, empty_init, "Texas Instruments", "TI-89",          MACHINE_NO_SOUND )
697 COMP( 1995, ti92,  0,       0,     ti92,    ti9x,  ti68k_state, empty_init, "Texas Instruments", "TI-92",          MACHINE_NO_SOUND )
698 COMP( 1999, ti92p, 0,       0,     ti92p,   ti9x,  ti68k_state, empty_init, "Texas Instruments", "TI-92 Plus",     MACHINE_NO_SOUND )
699 COMP( 2002, v200,  0,       0,     v200,    ti9x,  ti68k_state, empty_init, "Texas Instruments", "Voyage 200 PLT", MACHINE_NO_SOUND )
700 COMP( 2004, ti89t, 0,       0,     ti89t,   ti8x,  ti68k_state, empty_init, "Texas Instruments", "TI-89 Titanium", MACHINE_NO_SOUND )
701