Previous 199869 Revisions Next

r19384 Friday 7th December, 2012 at 15:48:05 UTC by Angelo Salese
Preliminary support for Test Mode in upd1990a RTC device [Angelo Salese]
[src/emu/machine]upd1990a.c upd1990a.h
[src/mess/drivers]pc9801.c

trunk/src/emu/machine/upd1990a.c
r19383r19384
1111
1212    TODO:
1313
14    - test mode
14    - set tp = 64 Hz when out of test mode
15    - test mode is mostly untested (is used by MS-DOS 6.2x in PC-98xx)
1516
1617*/
1718
r19383r19384
9798   m_timer_clock->adjust(attotime::from_hz(clock() / 32768), 0, attotime::from_hz(clock() / 32768));
9899   m_timer_tp = timer_alloc(TIMER_TP);
99100   m_timer_data_out = timer_alloc(TIMER_DATA_OUT);
101   m_timer_test_mode = timer_alloc(TIMER_TEST_MODE);
100102
101103   // state saving
102104   save_item(NAME(m_time_counter));
r19383r19384
150152
151153      m_out_data_func(m_data_out);
152154      break;
155
156   case TIMER_TEST_MODE:
157      if (m_oe)
158      {
159         /* time counter is advanced at 1024 Hz from "Second" counter input */
160         int i;
161
162         for(i=0;i<4;i++)
163         {
164            m_time_counter[i]++;
165            if(m_time_counter[i] != 0)
166               return;
167         }
168      }
169      else // parallel
170      {
171         /* each counter is advanced at 1024 Hz in parallel, overflow carry does not affect next counter */
172         m_time_counter[0]++;
173         m_time_counter[1]++;
174         m_time_counter[2]++;
175         m_time_counter[3]++;
176         m_time_counter[4]++;
177      }
178
179      break;
153180   }
154181}
155182
r19383r19384
214241         /* enable time counter */
215242         m_timer_clock->enable(1);
216243
244         m_timer_test_mode->enable(0);
245
217246         /* 1 Hz data out pulse */
218247         m_data_out = 1;
219248         m_timer_data_out->adjust(attotime::zero, 0, attotime::from_hz(1*2));
r19383r19384
231260         /* disable data out pulse */
232261         m_timer_data_out->enable(0);
233262
263         m_timer_test_mode->enable(0);
264
234265         /* output LSB of shift register */
235266         m_data_out = BIT(m_shift_reg[0], 0);
236267         m_out_data_func(m_data_out);
r19383r19384
249280         /* disable data out pulse */
250281         m_timer_data_out->enable(0);
251282
283         m_timer_test_mode->enable(0);
284
252285         /* output LSB of shift register */
253286         m_data_out = BIT(m_shift_reg[0], 0);
254287         m_out_data_func(m_data_out);
r19383r19384
271304         /* enable time counter */
272305         m_timer_clock->enable(1);
273306
307         m_timer_test_mode->enable(0);
308
274309         /* load time counter data into shift register */
275310         for (int i = 0; i < 5; i++)
276311         {
r19383r19384
290325      case MODE_TP_64HZ_SET:
291326         if (LOG) logerror("uPD1990A '%s' TP = 64 Hz Set Mode\n", tag());
292327
328         m_timer_test_mode->enable(0);
329
293330         /* 64 Hz time pulse */
294331         m_timer_tp->adjust(attotime::zero, 0, attotime::from_hz(64*2));
295332         break;
r19383r19384
297334      case MODE_TP_256HZ_SET:
298335         if (LOG) logerror("uPD1990A '%s' TP = 256 Hz Set Mode\n", tag());
299336
337         m_timer_test_mode->enable(0);
338
300339         /* 256 Hz time pulse */
301340         m_timer_tp->adjust(attotime::zero, 0, attotime::from_hz(256*2));
302341         break;
r19383r19384
304343      case MODE_TP_2048HZ_SET:
305344         if (LOG) logerror("uPD1990A '%s' TP = 2048 Hz Set Mode\n", tag());
306345
346         m_timer_test_mode->enable(0);
347
307348         /* 2048 Hz time pulse */
308349         m_timer_tp->adjust(attotime::zero, 0, attotime::from_hz(2048*2));
309350         break;
310351
311352      case MODE_TEST:
312         if (LOG) logerror("uPD1990A '%s' Test Mode not supported!\n", tag());
353         if (LOG) logerror("uPD1990A '%s' Test Mode\n", tag());
313354
314         if (m_oe)
315         {
316            /* time counter is advanced at 1024 Hz from "Second" counter input */
317         }
318         else
319         {
320            /* each counter is advanced at 1024 Hz in parallel, overflow carry does not affect next counter */
321         }
355         /* disable time counter */
356         m_timer_clock->enable(0);
322357
358         /* disable data out pulse */
359         m_timer_data_out->enable(0);
360
361         m_timer_test_mode->enable(1);
362
363         m_timer_test_mode->adjust(attotime::zero, 0, attotime::from_hz(1024));
323364         break;
324365      }
325366   }
trunk/src/emu/machine/upd1990a.h
r19383r19384
9494   static const device_timer_id TIMER_CLOCK = 0;
9595   static const device_timer_id TIMER_TP = 1;
9696   static const device_timer_id TIMER_DATA_OUT = 2;
97   static const device_timer_id TIMER_TEST_MODE = 3;
9798
9899   devcb_resolved_write_line   m_out_data_func;
99100   devcb_resolved_write_line   m_out_tp_func;
r19383r19384
115116   emu_timer *m_timer_clock;
116117   emu_timer *m_timer_tp;
117118   emu_timer *m_timer_data_out;
119   emu_timer *m_timer_test_mode;
118120};
119121
120122
trunk/src/mess/drivers/pc9801.c
r19383r19384
854854         m_rtc->c2_w((data & 0x04) >> 2);
855855         m_rtc->stb_w((data & 0x08) >> 3);
856856         m_rtc->clk_w((data & 0x10) >> 4);
857         m_rtc->data_in_w((data & 0x20) >> 5);
857         m_rtc->data_in_w(((data & 0x20) >> 5));
858858         if(data & 0xc0)
859859            printf("RTC write to undefined bits %02x\n",data & 0xc0);
860860      }
r19383r19384
31473147   machine().device("maincpu")->execute().set_irq_acknowledge_callback(irq_callback);
31483148
31493149   m_rtc->cs_w(1);
3150   m_rtc->oe_w(1);
3150   m_rtc->oe_w(0); // TODO: unknown connection, MS-DOS 6.2x wants this low somehow with the test mode
31513151
31523152   m_ipl_rom = memregion("ipl")->base();
31533153}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team