trunk/src/emu/machine/rtc4543.c
| r31533 | r31534 | |
| 52 | 52 | save_item(NAME(m_clk)); |
| 53 | 53 | save_item(NAME(m_wr)); |
| 54 | 54 | save_item(NAME(m_data)); |
| 55 | save_item(NAME(m_shiftreg)); |
| 55 | 56 | save_item(NAME(m_regs)); |
| 56 | 57 | save_item(NAME(m_curreg)); |
| 57 | 58 | } |
| r31533 | r31534 | |
| 69 | 70 | m_wr = 0; |
| 70 | 71 | m_clk = 0; |
| 71 | 72 | m_data = 0; |
| 73 | m_shiftreg = 0; |
| 72 | 74 | m_curreg = 0; |
| 75 | m_curbit = 0; |
| 73 | 76 | } |
| 74 | 77 | |
| 75 | 78 | |
| r31533 | r31534 | |
| 96 | 99 | { |
| 97 | 100 | static const int weekday[7] = { 7, 1, 2, 3, 4, 5, 6 }; |
| 98 | 101 | |
| 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) |
| 109 | 112 | } |
| 110 | 113 | |
| 111 | 114 | //------------------------------------------------- |
| r31533 | r31534 | |
| 116 | 119 | { |
| 117 | 120 | if (VERBOSE) printf("RTC4543 '%s' CE: %u\n", tag(), state); |
| 118 | 121 | |
| 119 | | if (!state && m_ce) // complete transfer |
| 122 | if (!state && m_ce) // complete transfer |
| 120 | 123 | { |
| 121 | 124 | } |
| 122 | | else if (state && !m_ce) // start new data transfer |
| 125 | else if (state && !m_ce) // start new data transfer |
| 123 | 126 | { |
| 124 | 127 | m_curreg = 0; |
| 125 | | m_bit = 8; // force immediate reload of output data |
| 128 | m_curbit = 0; // force immediate reload of output data |
| 126 | 129 | } |
| 127 | 130 | |
| 128 | 131 | m_ce = state; |
| r31533 | r31534 | |
| 149 | 152 | |
| 150 | 153 | if (!m_ce) return; |
| 151 | 154 | |
| 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) |
| 153 | 157 | { |
| 154 | 158 | if (!m_wr) |
| 155 | 159 | { |
| 156 | | if (m_bit > 7) // reload data? |
| 160 | // reload data? |
| 161 | if ((m_curbit & 7) == 0) |
| 157 | 162 | { |
| 158 | | m_bit = 0; |
| 159 | | m_data = m_regs[m_curreg++]; |
| 163 | m_shiftreg = m_regs[m_curreg++]; |
| 164 | |
| 160 | 165 | if (VERBOSE) |
| 161 | | logerror("RTC4543 '%s' sending byte: %02x\n", tag(), m_data); |
| 166 | logerror("RTC4543 '%s' sending byte: %02x\n", tag(), m_shiftreg); |
| 162 | 167 | } |
| 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) |
| 164 | 172 | { |
| 165 | | m_data >>= 1; |
| 173 | m_data = m_shiftreg & 1; |
| 174 | m_curbit++; |
| 175 | m_shiftreg >>= 1; |
| 176 | data_cb(m_data); |
| 166 | 177 | } |
| 167 | | |
| 168 | | m_bit++; |
| 169 | | |
| 170 | | data_cb(m_data & 0x01); |
| 171 | 178 | } |
| 172 | 179 | } |
| 173 | 180 | |
| r31533 | r31534 | |
| 183 | 190 | { |
| 184 | 191 | if (VERBOSE) logerror("RTC4543 '%s' I/O: %u\n", tag(), state); |
| 185 | 192 | |
| 186 | | m_data |= (state & 1); |
| 193 | m_data = state & 1; |
| 187 | 194 | } |
| 188 | 195 | |
| 189 | 196 | |
| r31533 | r31534 | |
| 193 | 200 | |
| 194 | 201 | READ_LINE_MEMBER( rtc4543_device::data_r ) |
| 195 | 202 | { |
| 196 | | return (m_data & 0x80) ? 1 : 0; |
| 203 | return m_data; |
| 197 | 204 | } |