Previous 199869 Revisions Next

r31534 Wednesday 6th August, 2014 at 22:35:34 UTC by hap
fix array out of bounds access
[src/emu/machine]rtc4543.c rtc4543.h

trunk/src/emu/machine/rtc4543.c
r31533r31534
5252   save_item(NAME(m_clk));
5353   save_item(NAME(m_wr));
5454   save_item(NAME(m_data));
55   save_item(NAME(m_shiftreg));
5556   save_item(NAME(m_regs));
5657   save_item(NAME(m_curreg));
5758}
r31533r31534
6970   m_wr = 0;
7071   m_clk = 0;
7172   m_data = 0;
73   m_shiftreg = 0;
7274   m_curreg = 0;
75   m_curbit = 0;
7376}
7477
7578
r31533r31534
9699{
97100   static const int weekday[7] = { 7, 1, 2, 3, 4, 5, 6 };
98101
99   m_regs[0] = make_bcd(second);               // seconds (BCD, 0-59) in bits 0-6, bit 7 = battery low
100   m_regs[1] = make_bcd(minute);               // minutes (BCD, 0-59)
101   m_regs[2] = make_bcd(hour);                 // hour (BCD, 0-23)
102   m_regs[3] = make_bcd(weekday[day_of_week-1]);   // low nibble = day of the week
103   m_regs[3] |= (make_bcd(day) & 0x0f)<<4;     // high nibble = low digit of day
104   m_regs[4] = (make_bcd(day) >> 4);           // low nibble = high digit of day
105   m_regs[4] |= (make_bcd(month & 0x0f)<<4);   // high nibble = low digit of month
106   m_regs[5] = make_bcd(month & 0x0f) >> 4;    // low nibble = high digit of month
107   m_regs[5] |= (make_bcd(year % 10) << 4);    // high nibble = low digit of year
108   m_regs[6] = make_bcd(year % 100) >> 4;  // low nibble = tens digit of year (BCD, 0-9)
102   m_regs[0] = make_bcd(second);                   // seconds (BCD, 0-59) in bits 0-6, bit 7 = battery low
103   m_regs[1] = make_bcd(minute);                   // minutes (BCD, 0-59)
104   m_regs[2] = make_bcd(hour);                     // hour (BCD, 0-23)
105   m_regs[3] = make_bcd(weekday[day_of_week - 1]); // low nibble = day of the week
106   m_regs[3] |= (make_bcd(day) & 0x0f) << 4;       // high nibble = low digit of day
107   m_regs[4] = (make_bcd(day) >> 4);               // low nibble = high digit of day
108   m_regs[4] |= (make_bcd(month & 0x0f) << 4);     // high nibble = low digit of month
109   m_regs[5] = make_bcd(month & 0x0f) >> 4;        // low nibble = high digit of month
110   m_regs[5] |= (make_bcd(year % 10) << 4);        // high nibble = low digit of year
111   m_regs[6] = make_bcd(year % 100) >> 4;          // low nibble = tens digit of year (BCD, 0-9)
109112}
110113
111114//-------------------------------------------------
r31533r31534
116119{
117120   if (VERBOSE) printf("RTC4543 '%s' CE: %u\n", tag(), state);
118121
119   if (!state && m_ce)         // complete transfer
122   if (!state && m_ce) // complete transfer
120123   {
121124   }
122   else if (state && !m_ce)    // start new data transfer
125   else if (state && !m_ce) // start new data transfer
123126   {
124127      m_curreg = 0;
125      m_bit = 8;      // force immediate reload of output data
128      m_curbit = 0; // force immediate reload of output data
126129   }
127130
128131   m_ce = state;
r31533r31534
149152
150153   if (!m_ce) return;
151154
152   if (!m_clk && state) // rising edge - read data becomes valid here
155   // rising edge - read data becomes valid here
156   if (!m_clk && state)
153157   {
154158      if (!m_wr)
155159      {
156         if (m_bit > 7)  // reload data?
160         // reload data?
161         if ((m_curbit & 7) == 0)
157162         {
158            m_bit = 0;
159            m_data = m_regs[m_curreg++];
163            m_shiftreg = m_regs[m_curreg++];
164
160165            if (VERBOSE)
161               logerror("RTC4543 '%s' sending byte: %02x\n", tag(), m_data);
166               logerror("RTC4543 '%s' sending byte: %02x\n", tag(), m_shiftreg);
162167         }
163         else            // no reload, just continue with the current byte
168
169         // shift data bit
170         // note: output data does not change when clk at final bit
171         if (m_curbit != 55)
164172         {
165            m_data >>= 1;
173            m_data = m_shiftreg & 1;
174            m_curbit++;
175            m_shiftreg >>= 1;
176            data_cb(m_data);
166177         }
167
168         m_bit++;
169
170         data_cb(m_data & 0x01);
171178      }
172179   }
173180
r31533r31534
183190{
184191   if (VERBOSE) logerror("RTC4543 '%s' I/O: %u\n", tag(), state);
185192
186   m_data |= (state & 1);
193   m_data = state & 1;
187194}
188195
189196
r31533r31534
193200
194201READ_LINE_MEMBER( rtc4543_device::data_r )
195202{
196   return (m_data & 0x80) ? 1 : 0;
203   return m_data;
197204}
trunk/src/emu/machine/rtc4543.h
r31533r31534
6464   int m_clk;
6565   int m_wr;
6666   int m_data;
67   int m_shiftreg;
6768   int m_regs[7];
6869   int m_curreg;
69   int m_bit;
70   int m_curbit;
7071
7172   // timers
7273   emu_timer *m_clock_timer;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team