Previous 199869 Revisions Next

r33991 Sunday 21st December, 2014 at 00:06:54 UTC by hap
added power-off and display-off
[src/mess/drivers]tispeak.c

trunk/src/mess/drivers/tispeak.c
r242502r242503
2020   tispeak_state(const machine_config &mconfig, device_type type, const char *tag)
2121      : driver_device(mconfig, type, tag),
2222      m_maincpu(*this, "maincpu"),
23      m_tms5100(*this, "tms5100"),
24      m_tms6100(*this, "tms6100"),
25      m_filoff_timer(*this, "filoff"),
2326      m_button_matrix(*this, "IN")
2427   { }
2528
2629   required_device<tms0270_cpu_device> m_maincpu;
30   required_device<tms5100_device> m_tms5100;
31   required_device<tms6100_device> m_tms6100;
32   required_device<timer_device> m_filoff_timer;
2733   required_ioport_array<9> m_button_matrix;
2834
2935   UINT16 m_r;
3036   UINT16 m_o;
37   int m_filament_on;
38   int m_power_on;
3139
32   UINT16 m_leds_state[9];
33   void leds_update();
40   UINT16 m_digit_state[9];
41   void display_update();
42   TIMER_DEVICE_CALLBACK_MEMBER(delayed_filament_off);
3443
3544   DECLARE_READ8_MEMBER(snspell_read_k);
3645   DECLARE_WRITE16_MEMBER(snmath_write_o);
3746   DECLARE_WRITE16_MEMBER(snspell_write_o);
3847   DECLARE_WRITE16_MEMBER(snspell_write_r);
48
49   DECLARE_INPUT_CHANGED_MEMBER(power_button);
3950   DECLARE_WRITE_LINE_MEMBER(auto_power_off);
51   void power_off();
4052
53   virtual void machine_reset();
4154   virtual void machine_start();
4255};
4356
r242502r242503
4558
4659/***************************************************************************
4760
48  LEDs
61  VFD Display
4962
5063***************************************************************************/
5164
65// The device strobes the filament-enable very fast, it is unnoticeable to the user.
66// To prevent flickering here, we need to simulate a decay.
5267
53void tispeak_state::leds_update()
68// decay time in milliseconds
69#define FILOFF_DECAY_TIME 20
70
71TIMER_DEVICE_CALLBACK_MEMBER(tispeak_state::delayed_filament_off)
5472{
55   // update leds state
73   // turn off display
74   m_filament_on = 0;
75   display_update();
76}
77
78void tispeak_state::display_update()
79{
80   // filament on/off
81   if (m_r & 0x8000)
82   {
83      m_filament_on = 1;
84      m_filoff_timer->reset();
85   }
86   else if (m_filament_on && m_filoff_timer->time_left() == attotime::never)
87   {
88      // schedule delayed filament-off
89      m_filoff_timer->adjust(attotime::from_msec(FILOFF_DECAY_TIME));
90   }
91   
92   // update digit state
5693   for (int i = 0; i < 9; i++)
5794      if (m_r >> i & 1)
58         m_leds_state[i] = m_o & 0x3fff;
95         m_digit_state[i] = m_o;
5996
60   // if filament (R15) is on, send to output
61//   if (m_r & 0x8000) // blank..
97   // send to output
6298   for (int i = 0; i < 9; i++)
63      output_set_digit_value(i, m_leds_state[i]);
99   {
100      // standard led14seg
101      output_set_digit_value(i, m_filament_on ? m_digit_state[i] & 0x3fff : 0);
102     
103      // DP(display point) and AP(apostrophe) segments as lamps
104      output_set_lamp_value(i*10 + 0, m_digit_state[i] >> 14 & m_filament_on);
105      output_set_lamp_value(i*10 + 1, m_digit_state[i] >> 15 & m_filament_on);
106   }
64107}
65108
66109
r242502r242503
88131
89132WRITE16_MEMBER(tispeak_state::snspell_write_r)
90133{
134   // R0-R7: input mux and select digit (+R8 if the device has 9 digits)
135   // R15: filament on
136   // other bits: MCU internal use
91137   m_r = data;
92   leds_update();
138   display_update();
93139}
94140
95141WRITE16_MEMBER(tispeak_state::snspell_write_o)
r242502r242503
98144   // E,D,C,G,B,A,I,M,L,K,N,J,[AP],H,F,[DP] (sidenote: TI KLMN = MAME MLNK)
99145   m_o = BITSWAP16(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5);
100146
101   leds_update();
147   display_update();
102148}
103149
104150
151void tispeak_state::power_off()
152{
153   m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
154   m_tms5100->reset();
155   m_tms6100->reset();
156
157   m_power_on = 0;
158}
159
105160WRITE_LINE_MEMBER(tispeak_state::auto_power_off)
106161{
107   //if (state) printf("X");
162   // power-off request from the MCU, usually after a couple of minutes of idling
163   if (state)
164      power_off();
108165}
109166
110167
r242502r242503
116173   // [DP],D,C,H,F,B,I,M,L,K,N,J,[AP],E,G,A (sidenote: TI KLMN = MAME MLNK)
117174   m_o = BITSWAP16(data,12,0,10,7,8,9,11,6,3,14,4,13,1,2,5,15);
118175
119   leds_update();
176   display_update();
120177}
121178
122179
r242502r242503
127184
128185***************************************************************************/
129186
187INPUT_CHANGED_MEMBER(tispeak_state::power_button)
188{
189   // note: even though power buttons are on the matrix, they are not MCU-controlled
190   int on = (int)(FPTR)param;
191   
192   if (on)
193   {
194      m_power_on = 1;
195      m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
196   }
197   else if (m_power_on)
198      power_off();
199}
200
130201static INPUT_PORTS_START( snspell )
131202   PORT_START("IN.0") // R0
132203   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A')
r242502r242503
174245   PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED )
175246
176247   PORT_START("IN.7") // R7
177   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off")
248   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)0)
178249   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("Go")
179250   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay")
180251   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat")
r242502r242503
185256   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Secret Code")
186257   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter")
187258   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Say It")
188   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Spell/On")
259   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)1)
189260INPUT_PORTS_END
190261
191262
r242502r242503
215286   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
216287   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
217288   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Go")
218   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off")
289   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)0)
219290   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
220291
221292   PORT_START("IN.4") // R4
r242502r242503
237308   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_NAME("Write It")
238309   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Greater/Less")
239310   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("Word Problems")
240   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Solve It/On")
311   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_PGUP) PORT_NAME("Solve It/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, (void *)1)
241312
242313   PORT_START("IN.7")
243314   PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED )
r242502r242503
254325
255326***************************************************************************/
256327
328void tispeak_state::machine_reset()
329{
330   m_filament_on = 0;
331   m_power_on = 1;
332}
333
257334void tispeak_state::machine_start()
258335{
259   memset(m_leds_state, 0, sizeof(m_leds_state));
336   // zerofill
337   memset(m_digit_state, 0, sizeof(m_digit_state));
260338   m_r = 0;
261339   m_o = 0;
340   m_filament_on = 0;
341   m_power_on = 0;
262342
263   save_item(NAME(m_leds_state));
343   // register for savestates
344   save_item(NAME(m_digit_state));
264345   save_item(NAME(m_r));
265346   save_item(NAME(m_o));
347   save_item(NAME(m_filament_on));
348   save_item(NAME(m_power_on));
266349}
267350
268351
r242502r242503
279362   MCFG_TMS0270_WRITE_CTL_CB(DEVWRITE8("tms5100", tms5100_device, ctl_w))
280363   MCFG_TMS0270_WRITE_PDC_CB(DEVWRITELINE("tms5100", tms5100_device, pdc_w))
281364
282   MCFG_DEFAULT_LAYOUT(layout_tispeak)
365   MCFG_TIMER_DRIVER_ADD("filoff", tispeak_state, delayed_filament_off)
366   MCFG_DEFAULT_LAYOUT(layout_tispeak) // max 9 digits
283367
284368   /* no video! */
285369


Previous 199869 Revisions Next


© 1997-2024 The MAME Team