@@ -108,7 +108,12 @@ class tek440x_state : public driver_device
108108 u8 mapcntl_r ();
109109 void mapcntl_w (u8 data);
110110 void sound_w (u8 data);
111+ u8 diag_r ();
111112 void diag_w (u8 data);
113+
114+ // need to handle loopback mode
115+ u8 duart_r (offs_t offset);
116+ void duart_w (offs_t offset, u8 data);
112117
113118 void kb_rdata_w (int state);
114119 void kb_tdata_w (int state);
@@ -138,6 +143,7 @@ class tek440x_state : public driver_device
138143 bool m_kb_tdata;
139144 bool m_kb_rclamp;
140145 bool m_kb_loop;
146+ u8 m_diag;
141147};
142148
143149/* ************************************
@@ -153,8 +159,8 @@ void tek440x_state::machine_start()
153159 save_item (NAME (m_kb_rdata));
154160 save_item (NAME (m_kb_tdata));
155161 save_item (NAME (m_kb_rclamp));
156- save_item (NAME (m_kb_loop));
157- }
162+ save_item (NAME (m_kb_loop));
163+ save_item ( NAME (m_diag));
158164
159165
160166
@@ -272,12 +278,19 @@ void tek440x_state::sound_w(u8 data)
272278 m_boot = false ;
273279}
274280
281+ u8 tek440x_state::diag_r ()
282+ {
283+ return m_diag;
284+ }
285+
275286void tek440x_state::diag_w (u8 data)
276287{
277288 if (!m_kb_rclamp && m_kb_loop != BIT (data, 7 ))
278289 m_keyboard->kdo_w (!BIT (data, 7 ) || m_kb_tdata);
279290
280291 m_kb_loop = BIT (data, 7 );
292+ m_diag = data;
293+
281294}
282295
283296void tek440x_state::kb_rdata_w (int state)
@@ -312,6 +325,25 @@ void tek440x_state::kb_tdata_w(int state)
312325 }
313326}
314327
328+ u8 tek440x_state::duart_r (offs_t offset)
329+ {
330+ return m_duart->read (offset);
331+ }
332+
333+ void tek440x_state::duart_w (offs_t offset, u8 data)
334+ {
335+ // Transmit Buffer?
336+ if (offset == 3 )
337+ {
338+ if (m_kb_loop)
339+ {
340+ m_duart->write (0x0 , 0x80 );
341+ }
342+ }
343+
344+ m_duart->write (offset, data);
345+ }
346+
315347void tek440x_state::logical_map (address_map &map)
316348{
317349 map (0x000000 , 0x7fffff ).rw (FUNC (tek440x_state::memory_r), FUNC (tek440x_state::memory_w));
@@ -346,10 +378,11 @@ void tek440x_state::physical_map(address_map &map)
346378
347379 // 7a0000-7bffff peripheral board I/O
348380 // 7a0000-7affff: reserved
349- map (0x7b0000 , 0x7b0000 ).w ( FUNC (tek440x_state::diag_w));
381+ map (0x7b0000 , 0x7b0000 ).rw ( FUNC (tek440x_state::diag_r), FUNC (tek440x_state::diag_w));
350382 // 7b1000-7b1fff: diagnostic registers
351383 // 7b2000-7b3fff: Centronics printer data
352- map (0x7b4000 , 0x7b401f ).rw (m_duart, FUNC (mc68681_device::read), FUNC (mc68681_device::write)).umask16 (0xff00 );
384+
385+ map (0x7b4000 , 0x7b401f ).rw (FUNC (tek440x_state::duart_r), FUNC (tek440x_state::duart_w)).umask16 (0xff00 );
353386 // 7b6000-7b7fff: Mouse
354387 map (0x7b8000 , 0x7b8003 ).mirror (0x100 ).rw (" timer" , FUNC (am9513_device::read16), FUNC (am9513_device::write16));
355388 // 7ba000-7bbfff: MC146818 RTC
0 commit comments