trunk/src/emu/machine/r10788.c
| r242279 | r242280 | |
| 41 | 41 | #include "emu.h" |
| 42 | 42 | #include "machine/r10788.h" |
| 43 | 43 | |
| 44 | #define VERBOSE 1 |
| 45 | #if VERBOSE |
| 46 | #define LOG(x) logerror x |
| 47 | #else |
| 48 | #define LOG(x) |
| 49 | #endif |
| 44 | 50 | |
| 45 | 51 | /************************************* |
| 46 | 52 | * |
| r242279 | r242280 | |
| 53 | 59 | r10788_device::r10788_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 54 | 60 | : device_t(mconfig, R10788, "Rockwell 10788", tag, owner, clock, "r10788", __FILE__), |
| 55 | 61 | m_reg(), |
| 56 | | m_ktr(0), m_kts(0), m_kla(0), m_klb(0), m_enable(3), m_ker(0), |
| 57 | | m_scan_counter(0), |
| 62 | m_ktr(0), m_kts(0), m_kla(0), m_klb(0), m_mask_a(15), m_mask_b(15), m_ker(0), |
| 63 | m_io_counter(0), m_scan_counter(0), |
| 58 | 64 | m_display(*this) |
| 59 | 65 | { |
| 60 | 66 | } |
| r242279 | r242280 | |
| 71 | 77 | save_item(NAME(m_kts)); |
| 72 | 78 | save_item(NAME(m_kla)); |
| 73 | 79 | save_item(NAME(m_klb)); |
| 74 | | save_item(NAME(m_enable)); |
| 80 | save_item(NAME(m_mask_a)); |
| 81 | save_item(NAME(m_mask_b)); |
| 75 | 82 | save_item(NAME(m_ker)); |
| 83 | save_item(NAME(m_io_counter)); |
| 76 | 84 | save_item(NAME(m_scan_counter)); |
| 77 | 85 | |
| 78 | 86 | m_timer = timer_alloc(TIMER_DISPLAY); |
| 79 | | m_timer->adjust(clocks_to_attotime(36)); |
| 87 | // recurring timer every 36 cycles |
| 88 | m_timer->adjust(clocks_to_attotime(36), 0, clocks_to_attotime(36)); |
| 80 | 89 | } |
| 81 | 90 | |
| 82 | 91 | /** |
| r242279 | r242280 | |
| 90 | 99 | m_kts = 0; |
| 91 | 100 | m_kla = 0; |
| 92 | 101 | m_klb = 0; |
| 93 | | m_enable = 3; |
| 102 | m_mask_a = 15; |
| 103 | m_mask_b = 15; |
| 94 | 104 | m_ker = 0; |
| 95 | 105 | m_scan_counter = 0; |
| 96 | 106 | } |
| r242279 | r242280 | |
| 105 | 115 | */ |
| 106 | 116 | void r10788_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 107 | 117 | { |
| 108 | | m_scan_counter = (m_scan_counter + 1) % 16; |
| 118 | UINT8 data; |
| 109 | 119 | switch (id) |
| 110 | 120 | { |
| 111 | 121 | case TIMER_DISPLAY: |
| 112 | | m_display(m_scan_counter, m_reg[0][m_scan_counter] << 4 | m_reg[1][m_scan_counter], 0xff); |
| 122 | data = (m_reg[0][m_scan_counter] & m_mask_a) + |
| 123 | 16 * (m_reg[1][m_scan_counter] & m_mask_b); |
| 124 | LOG(("%s: scan counter:%2d data:%02x\n", __FUNCTION__, m_scan_counter, data)); |
| 125 | m_display(m_scan_counter, data, 0xff); |
| 113 | 126 | break; |
| 127 | default: |
| 128 | LOG(("%s: invalid timer id:%d\n", __FUNCTION__, id)); |
| 114 | 129 | } |
| 130 | m_scan_counter = (m_scan_counter + 1) % 16; |
| 115 | 131 | } |
| 116 | 132 | |
| 117 | 133 | /************************************* |
| r242279 | r242280 | |
| 132 | 148 | switch (offset) |
| 133 | 149 | { |
| 134 | 150 | case KTR: // Transfer Keyboard Return |
| 151 | LOG(("%s: KTR data:%02x\n", __FUNCTION__, data)); |
| 135 | 152 | m_ktr = data; |
| 136 | 153 | break; |
| 137 | 154 | case KTS: // Transfer Keyboard Strobe |
| 155 | LOG(("%s: KTS data:%02x\n", __FUNCTION__, data)); |
| 138 | 156 | m_kts = data; |
| 139 | 157 | break; |
| 140 | 158 | case KLA: // Load Display Register A |
| 159 | LOG(("%s: KLA [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data)); |
| 141 | 160 | m_kla = data; |
| 161 | m_reg[0][m_io_counter] = m_kla; |
| 142 | 162 | break; |
| 143 | 163 | case KLB: // Load Display Register B |
| 164 | LOG(("%s: KLB [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data)); |
| 144 | 165 | m_klb = data; |
| 166 | m_reg[1][m_io_counter] = m_kla; |
| 145 | 167 | break; |
| 146 | 168 | case KDN: // Turn On Display |
| 147 | | m_enable = 1 | 2; |
| 169 | LOG(("%s: KDN data:%02x\n", __FUNCTION__, data)); |
| 170 | m_mask_a = 15; |
| 171 | m_mask_b = 15; |
| 148 | 172 | break; |
| 149 | 173 | case KAF: // Turn Off A |
| 150 | | m_enable &= ~1; |
| 174 | LOG(("%s: KAF data:%02x\n", __FUNCTION__, data)); |
| 175 | m_mask_a = 0; |
| 176 | m_mask_b &= ~3; |
| 151 | 177 | break; |
| 152 | 178 | case KBF: // Turn Off B |
| 153 | | m_enable &= ~1; |
| 179 | LOG(("%s: KBF data:%02x\n", __FUNCTION__, data)); |
| 180 | m_mask_b &= ~12; |
| 154 | 181 | break; |
| 155 | 182 | case KER: // Reset Keyboard Error |
| 183 | LOG(("%s: KER data:%02x\n", __FUNCTION__, data)); |
| 156 | 184 | m_ker = 10; |
| 157 | 185 | break; |
| 158 | 186 | } |
| r242279 | r242280 | |
| 167 | 195 | { |
| 168 | 196 | case KTR: // Transfer Keyboard Return |
| 169 | 197 | data = m_ktr; |
| 198 | LOG(("%s: KTR data:%02x\n", __FUNCTION__, data)); |
| 170 | 199 | break; |
| 171 | 200 | case KTS: // Transfer Keyboard Strobe |
| 172 | 201 | data = m_kts; |
| 202 | LOG(("%s: KTS data:%02x\n", __FUNCTION__, data)); |
| 173 | 203 | break; |
| 174 | 204 | case KLA: // Load Display Register A |
| 205 | m_kla = m_reg[0][m_io_counter]; |
| 175 | 206 | data = m_kla; |
| 207 | LOG(("%s: KLA [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data)); |
| 176 | 208 | break; |
| 177 | 209 | case KLB: // Load Display Register B |
| 210 | m_klb = m_reg[1][m_io_counter]; |
| 178 | 211 | data = m_klb; |
| 212 | LOG(("%s: KLB [%2d] data:%02x\n", __FUNCTION__, m_io_counter, data)); |
| 213 | // FIXME: does it automagically increment at KLB write? |
| 214 | m_io_counter = (m_io_counter + 1) % 16; |
| 179 | 215 | break; |
| 180 | 216 | case KDN: // Turn On Display |
| 217 | LOG(("%s: KDN data:%02x\n", __FUNCTION__, data)); |
| 181 | 218 | break; |
| 182 | 219 | case KAF: // Turn Off A |
| 220 | LOG(("%s: KAF data:%02x\n", __FUNCTION__, data)); |
| 183 | 221 | break; |
| 184 | 222 | case KBF: // Turn Off B |
| 223 | LOG(("%s: KBF data:%02x\n", __FUNCTION__, data)); |
| 185 | 224 | break; |
| 186 | 225 | case KER: // Reset Keyboard Error |
| 226 | LOG(("%s: KER data:%02x\n", __FUNCTION__, data)); |
| 187 | 227 | break; |
| 188 | 228 | } |
| 189 | 229 | return data; |