Previous 199869 Revisions Next

r26883 Wednesday 1st January, 2014 at 23:59:18 UTC by smf
fix for potential loss of state change (nw)
[src/emu/machine]6522via.c

trunk/src/emu/machine/6522via.c
r26882r26883
157157      m_cb1_handler(*this),
158158      m_cb2_handler(*this),
159159      m_irq_handler(*this),
160      m_in_a(0),
161      m_in_ca1(0),
162      m_in_ca2(0),
163      m_in_b(0),
164      m_in_cb1(0),
165      m_in_cb2(0),
160166      m_irq(CLEAR_LINE)
161167{
162168}
r26882r26883
188194   m_ca2_timer = timer_alloc(TIMER_CA2);
189195   m_shift_timer = timer_alloc(TIMER_SHIFT);
190196   m_pcr = 0;
191   m_in_ca1 = 0;
192   m_in_ca2 = 0;
193197
194198   /* Default clock is from CPU1 */
195199   if (clock() == 0)
r26882r26883
236240
237241void via6522_device::device_reset()
238242{
239   m_in_a = 0;
240   m_in_ca1 = 0;
241   m_in_ca2 = 0;
242243   m_out_a = 0;
243244   m_out_ca2 = 0;
244245   m_ddr_a = 0;
245   m_in_b = 0;
246   m_in_cb1 = 0;
247   m_in_cb2 = 0;
248246   m_out_b = 0;
249247   m_out_cb2 = 0;
250248   m_ddr_b = 0;
r26882r26883
322320
323321      m_cb2_handler(m_out_cb2);
324322
325      m_in_cb1=1;
326
327323      /* this should be one cycle wide */
328324      m_cb1_handler(0);
329325      m_cb1_handler(1);
r26882r26883
957953
958954WRITE_LINE_MEMBER( via6522_device::write_ca1 )
959955{
960   /* handle the active transition */
961   if (state != m_in_ca1)
956   if (m_in_ca1 != state)
962957   {
958      m_in_ca1 = state;
959
963960      if (TRACE_VIA)
964         logerror("%s:6522VIA chip %s: CA1 = %02X\n", machine().describe_context(), tag(), state);
961         logerror("%s:6522VIA chip %s: CA1 = %02X\n", machine().describe_context(), tag(), m_in_ca1);
965962
966      if ((CA1_LOW_TO_HIGH(m_pcr) && state) || (CA1_HIGH_TO_LOW(m_pcr) && !state))
963      if ((m_in_ca1 && CA1_LOW_TO_HIGH(m_pcr)) || (!m_in_ca1 && CA1_HIGH_TO_LOW(m_pcr)))
967964      {
968965         if (PA_LATCH_ENABLE(m_acr))
969966         {
r26882r26883
993990            }
994991         }
995992      }
996
997      m_in_ca1 = state;
998993   }
999994}
1000995
r26882r26883
10051000
10061001WRITE_LINE_MEMBER( via6522_device::write_ca2 )
10071002{
1008   /* CA2 is in input mode */
1009   if (CA2_INPUT(m_pcr))
1003   if (m_in_ca2 != state)
10101004   {
1011      /* the new state has caused a transition */
1012      if (m_in_ca2 != state)
1005      m_in_ca2 = state;
1006
1007      /* CA2 is in input mode */
1008      if (CA2_INPUT(m_pcr))
10131009      {
10141010         /* handle the active transition */
1015         if ((state && CA2_LOW_TO_HIGH(m_pcr)) || (!state && CA2_HIGH_TO_LOW(m_pcr)))
1011         if ((m_in_ca2 && CA2_LOW_TO_HIGH(m_pcr)) || (!m_in_ca2 && CA2_HIGH_TO_LOW(m_pcr)))
10161012         {
10171013            /* mark the IRQ */
10181014            set_int(INT_CA2);
10191015         }
1020         /* set the new value for CA2 */
1021         m_in_ca2 = state;
10221016      }
10231017   }
10241018}
r26882r26883
10371031
10381032WRITE_LINE_MEMBER( via6522_device::write_cb1 )
10391033{
1040   /* handle the active transition */
1041   if (state != m_in_cb1)
1034   if (m_in_cb1 != state)
10421035   {
1043      if ((CB1_LOW_TO_HIGH(m_pcr) && state) || (CB1_HIGH_TO_LOW(m_pcr) && !state))
1036      m_in_cb1 = state;
1037
1038      if ((m_in_cb1 && CB1_LOW_TO_HIGH(m_pcr)) || (!m_in_cb1 && CB1_HIGH_TO_LOW(m_pcr)))
10441039      {
10451040         if (PB_LATCH_ENABLE(m_acr))
10461041         {
r26882r26883
10531048               logerror("%s:6522VIA chip %s: Port B is being read but has no handler\n", machine().describe_context(), tag());
10541049            }
10551050         }
1051
10561052         if (SO_EXT_CONTROL(m_acr) || SI_EXT_CONTROL(m_acr))
10571053         {
10581054            shift();
r26882r26883
10741070            }
10751071         }
10761072      }
1077      m_in_cb1 = state;
10781073   }
10791074}
10801075
r26882r26883
10851080
10861081WRITE_LINE_MEMBER( via6522_device::write_cb2 )
10871082{
1088   /* the new state has caused a transition */
10891083   if (m_in_cb2 != state)
10901084   {
1085      m_in_cb2 = state;
1086
10911087      /* CB2 is in input mode */
10921088      if (CB2_INPUT(m_pcr))
10931089      {
10941090         /* handle the active transition */
1095         if ((state && CB2_LOW_TO_HIGH(m_pcr)) || (!state && CB2_HIGH_TO_LOW(m_pcr)))
1091         if ((m_in_cb2 && CB2_LOW_TO_HIGH(m_pcr)) || (!m_in_cb2 && CB2_HIGH_TO_LOW(m_pcr)))
10961092         {
10971093            /* mark the IRQ */
10981094            set_int(INT_CB2);
10991095         }
11001096      }
1101
1102      /* set the new value for CB2 */
1103      m_in_cb2 = state;
11041097   }
11051098}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team