Previous 199869 Revisions Next

r34221 Tuesday 6th January, 2015 at 15:39:44 UTC by Fabio Priuli
(MESS) gamegear: fixed a small mistake in the checks for SMS mode, on behalf of
Enik Land. nw.
[src/mess/drivers]sms.c
[src/mess/includes]sms.h
[src/mess/machine]sms.c

trunk/src/mess/drivers/sms.c
r242732r242733
346346static ADDRESS_MAP_START( gg_io, AS_IO, 8, sms_state )
347347   ADDRESS_MAP_GLOBAL_MASK(0xff)
348348   ADDRESS_MAP_UNMAP_HIGH
349   AM_RANGE(0x00, 0x00)                 AM_READ(gg_input_port_2_r)
349   AM_RANGE(0x00, 0x00)                 AM_READ(gg_input_port_00_r)
350350   AM_RANGE(0x01, 0x05)                 AM_READWRITE(gg_sio_r, gg_sio_w)
351351   AM_RANGE(0x06, 0x06)                 AM_DEVWRITE("gamegear", gamegear_device, stereo_w)
352352   AM_RANGE(0x07, 0x07)                 AM_WRITE(sms_io_control_w)
trunk/src/mess/includes/sms.h
r242732r242733
151151   DECLARE_READ8_MEMBER(sms_count_r);
152152   DECLARE_READ8_MEMBER(sms_input_port_dc_r);
153153   DECLARE_READ8_MEMBER(sms_input_port_dd_r);
154   DECLARE_READ8_MEMBER(gg_input_port_00_r);
154155   DECLARE_WRITE8_MEMBER(sms_ym2413_register_port_w);
155156   DECLARE_WRITE8_MEMBER(sms_ym2413_data_port_w);
156   DECLARE_READ8_MEMBER(gg_input_port_2_r);
157157   DECLARE_READ8_MEMBER(sms_sscope_r);
158158   DECLARE_WRITE8_MEMBER(sms_sscope_w);
159159   DECLARE_READ8_MEMBER(sms_mapper_r);
trunk/src/mess/machine/sms.c
r242732r242733
4545
4646WRITE_LINE_MEMBER(sms_state::sms_ctrl2_th_input)
4747{
48   if (m_is_gamegear && (!m_cartslot->exists() || !m_cartslot->m_cart->get_sms_mode()))
48   if (m_is_gamegear && !(m_cartslot->exists() && m_cartslot->m_cart->get_sms_mode()))
4949      return;
5050
5151   // Check if TH of controller port 2 is set to input (1)
r242732r242733
6868
6969void sms_state::sms_get_inputs()
7070{
71   bool port_dd_has_th_input = true;
72
7173   UINT8 data1 = 0xff;
7274   UINT8 data2 = 0xff;
7375
r242732r242733
8082
8183   if (m_is_gamegear)
8284   {
85      // Assume the Japanese Game Gear behaves as the
86      // Japanese Master System, regarding TH input.
87      if (m_is_gg_region_japan)
88         port_dd_has_th_input = false;
89
90      // For Game Gear, this function is used only if SMS mode is
91      // enabled, else only register $dc receives input data, through
92      // direct read of the m_port_gg_dc I/O port.
93
8394      data1 = m_port_gg_dc->read();
8495      m_port_dc_reg &= ~0x03f | data1;
96
97      data2 = m_port_gear2gear->port_r();
8598   }
8699   else
87100   {
101      // Sega Mark III does not have TH lines connected.
102      // The Japanese Master System does not set port $dd with TH input.
103      if (m_is_mark_iii || m_is_smsj)
104         port_dd_has_th_input = false;
105
88106      data1 = m_port_ctrl1->port_r();
89107      m_port_dc_reg &= ~0x0f | data1; // Up, Down, Left, Right
90108      m_port_dc_reg &= ~0x10 | (data1 >> 1); // TL (Button 1)
91109      m_port_dc_reg &= ~0x20 | (data1 >> 2); // TR (Button 2)
92   }
93110
94   if (m_is_gamegear)
95   {
96      if (m_cartslot->exists() && m_cartslot->m_cart->get_sms_mode())
97         data2 = m_port_gear2gear->port_r();
98   }
99   else
100   {
101111      data2 = m_port_ctrl2->port_r();
102112   }
113
103114   m_port_dc_reg &= ~0xc0 | (data2 << 6); // Up, Down
104115   m_port_dd_reg &= ~0x03 | (data2 >> 2); // Left, Right
105116   m_port_dd_reg &= ~0x04 | (data2 >> 3); // TL (Button 1)
106117   m_port_dd_reg &= ~0x08 | (data2 >> 4); // TR (Button 2)
107118
108   // Sega Mark III does not have TH line connected.
109   // Also, the Japanese Master System does not set port $dd with TH input.
110   if (!m_is_mark_iii && !m_is_smsj)
119   if (port_dd_has_th_input)
111120   {
112121      m_port_dd_reg &= ~0x40 | data1; // TH ctrl1
113122      m_port_dd_reg &= ~0x80 | (data2 << 1); // TH ctrl2
r242732r242733
149158   UINT8 ctrl1_port_data = 0xff;
150159   UINT8 ctrl2_port_data = 0xff;
151160
152   if (m_is_gamegear && (!m_cartslot->exists() || !m_cartslot->m_cart->get_sms_mode()))
161   if (m_is_gamegear && !(m_cartslot->exists() && m_cartslot->m_cart->get_sms_mode()))
153162   {
154163      m_io_ctrl_reg = data;
155164      return;
r242732r242733
236245 */
237246WRITE_LINE_MEMBER(sms_state::sms_pause_callback)
238247{
239   if (m_is_gamegear && m_cartslot->exists() && !m_cartslot->m_cart->get_sms_mode())
240      return;
248   bool pause_pressed = false;
241249
242   if ((m_is_gamegear && !(m_port_start->read() & 0x80)) || (!m_is_gamegear && !(m_port_pause->read() & 0x80)))
250   if (!m_is_mark_iii)
243251   {
252      // clear TH latch of the controller ports
253      m_ctrl1_th_latch = 0;
254      m_ctrl2_th_latch = 0;
255   }
256
257   if (m_is_gamegear)
258   {
259      if (!(m_cartslot->exists() && m_cartslot->m_cart->get_sms_mode()))
260         return;
261
262      if (!(m_port_start->read() & 0x80))
263         pause_pressed = true;
264   }
265   else
266   {
267      if (!(m_port_pause->read() & 0x80))
268         pause_pressed = true;
269   }
270
271   if (pause_pressed)
272   {
244273      if (!m_paused)
245274         m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
246275
r242732r242733
248277   }
249278   else
250279      m_paused = 0;
251
252   if (!m_is_mark_iii)
253   {
254      // clear TH latch of the controller ports
255      m_ctrl1_th_latch = 0;
256      m_ctrl2_th_latch = 0;
257   }
258280}
259281
260282
r242732r242733
266288      return m_port_dc_reg;
267289   }
268290
269   if (!m_is_gamegear && (m_mem_ctrl_reg & IO_CHIP))
291   if (m_is_gamegear)
270292   {
271      return 0xff;
293      // If SMS mode is disabled, just return the data read from the
294      // input port. Its mapped port bits match the bits of register $dc.
295      if (!(m_cartslot->exists() && m_cartslot->m_cart->get_sms_mode()))
296         return m_port_gg_dc->read();
272297   }
273298   else
274299   {
275      sms_get_inputs();
300      // Return if the I/O chip is disabled (1). This check isn't performed
301      // for the Game Gear because has no effect on it (even in SMS mode?).
302      if (m_mem_ctrl_reg & IO_CHIP)
303         return 0xff;
304   }
276305
277      // Check if TR of controller port 1 is set to output (0)
278      if (!(m_io_ctrl_reg & 0x01))
279      {
280         // Read TR state set through IO control port
281         m_port_dc_reg &= ~0x20 | ((m_io_ctrl_reg & 0x10) << 1);
282      }
306   sms_get_inputs();
283307
284      return m_port_dc_reg;
308   // Check if TR of controller port 1 is set to output (0)
309   if (!(m_io_ctrl_reg & 0x01))
310   {
311      // Read TR state set through IO control port
312      m_port_dc_reg &= ~0x20 | ((m_io_ctrl_reg & 0x10) << 1);
285313   }
314
315   return m_port_dc_reg;
286316}
287317
288318
r242732r242733
294324      return m_port_dd_reg;
295325   }
296326
297   if (!m_is_gamegear && (m_mem_ctrl_reg & IO_CHIP))
298      return 0xff;
327   if (m_is_gamegear)
328   {
329      if (!(m_cartslot->exists() && m_cartslot->m_cart->get_sms_mode()))
330         return 0xff;
331   }
332   else
333   {
334      // Return if the I/O chip is disabled (1). This check isn't performed
335      // for the Game Gear because has no effect on it (even in SMS mode?).
336      if (m_mem_ctrl_reg & IO_CHIP)
337         return 0xff;
338   }
299339
300340   sms_get_inputs();
301341
r242732r242733
377417}
378418
379419
380READ8_MEMBER(sms_state::gg_input_port_2_r)
420READ8_MEMBER(sms_state::gg_input_port_00_r)
381421{
382   //logerror("joy 2 read, val: %02x, pc: %04x\n", (m_is_gg_region_japan ? 0x00 : 0x40) | (m_port_start->read() & 0x80), activecpu_get_pc());
383   return (m_is_gg_region_japan ? 0x00 : 0x40) | (m_port_start->read() & 0x80);
422   if (m_cartslot->exists() && m_cartslot->m_cart->get_sms_mode())
423      return 0xff;
424   else
425   {
426      UINT8 data = (m_is_gg_region_japan ? 0x00 : 0x40) | (m_port_start->read() & 0x80);
427
428      //logerror("port $00 read, val: %02x, pc: %04x\n", data, activecpu_get_pc());
429      return data;
430   }
384431}
385432
386433


Previous 199869 Revisions Next


© 1997-2024 The MAME Team