trunk/src/mess/drivers/minicom.c
| r31365 | r31366 | |
| 41 | 41 | #include "cpu/mcs51/mcs51.h" |
| 42 | 42 | #include "minicom.lh" |
| 43 | 43 | |
| 44 | | UINT16 display_data; |
| 45 | | |
| 46 | 44 | class minicom_state : public driver_device |
| 47 | 45 | { |
| 48 | 46 | public: |
| r31365 | r31366 | |
| 55 | 53 | DECLARE_READ8_MEMBER(minicom_io_r); |
| 56 | 54 | DECLARE_DRIVER_INIT(minicom); |
| 57 | 55 | private: |
| 58 | | int digit_index; |
| 56 | UINT8 m_p[4]; |
| 57 | UINT16 m_display_data; |
| 58 | int m_digit_index; |
| 59 | 59 | virtual void machine_start(); |
| 60 | 60 | virtual void machine_reset(); |
| 61 | 61 | required_device<cpu_device> m_maincpu; |
| r31365 | r31366 | |
| 67 | 67 | |
| 68 | 68 | void minicom_state::machine_start() |
| 69 | 69 | { |
| 70 | // zerofill |
| 71 | memset(m_p, 0, 4); |
| 72 | m_digit_index = 0; |
| 73 | m_display_data = 0; |
| 74 | |
| 75 | // register for savestates |
| 76 | save_item(NAME(m_p)); |
| 77 | save_item(NAME(m_digit_index)); |
| 78 | save_item(NAME(m_display_data)); |
| 70 | 79 | } |
| 71 | 80 | |
| 72 | 81 | void minicom_state::machine_reset() |
| 73 | 82 | { |
| 74 | | int i; |
| 75 | | digit_index = 19; |
| 76 | | display_data = 0; |
| 83 | m_digit_index = 19; |
| 84 | m_display_data = 0; |
| 77 | 85 | |
| 78 | | for (i=0; i<20; i++) |
| 86 | for (int i=0; i<20; i++) |
| 79 | 87 | output_set_digit_value(i, 0); |
| 80 | 88 | } |
| 81 | 89 | |
| r31365 | r31366 | |
| 100 | 108 | } |
| 101 | 109 | |
| 102 | 110 | #if LOG_IO_PORTS |
| 103 | | static void printbits(unsigned char v) { |
| 111 | static void printbits(UINT8 v) { |
| 104 | 112 | int i; |
| 105 | 113 | for(i = 7; i >= 0; i--) putchar('0' + ((v >> i) & 1)); |
| 106 | 114 | } |
| r31365 | r31366 | |
| 114 | 122 | #define P3_UNKNOWN_BITS (0xFF & ~((1 << 4)|(1 << 5))) |
| 115 | 123 | WRITE8_MEMBER(minicom_state::minicom_io_w) |
| 116 | 124 | { |
| 117 | | static UINT8 p0=0, p1=0, p2=0, p3=0; |
| 118 | 125 | switch (offset) |
| 119 | 126 | { |
| 120 | 127 | case 0x00: |
| 121 | 128 | { |
| 122 | | p0=data; |
| 129 | m_p[offset]=data; |
| 123 | 130 | break; |
| 124 | 131 | } |
| 125 | 132 | case 0x01: |
| 126 | 133 | { |
| 127 | | if (data != p1) |
| 134 | if (data != m_p[offset]) |
| 128 | 135 | { |
| 129 | 136 | #if LOG_IO_PORTS |
| 130 | | char changed = p1 ^ data; |
| 137 | UINT8 changed = m_p[offset] ^ data; |
| 131 | 138 | if (changed ^ P1_UNKNOWN_BITS){ |
| 132 | 139 | printf("Write to P1: %02X changed: ( ) (", data); |
| 133 | 140 | printbits(changed); |
| 134 | 141 | printf(") ( ) ( )\n"); |
| 135 | 142 | } |
| 136 | 143 | #endif |
| 137 | | if (FALLING_EDGE(p1, data, 2)){ |
| 138 | | digit_index--; |
| 139 | | if (digit_index<0) digit_index = 19; |
| 144 | if (FALLING_EDGE(m_p[offset], data, 2)){ |
| 145 | m_digit_index--; |
| 146 | if (m_digit_index<0) m_digit_index = 19; |
| 140 | 147 | } |
| 141 | | p1=data; |
| 148 | m_p[offset]=data; |
| 142 | 149 | } |
| 143 | 150 | break; |
| 144 | 151 | } |
| 145 | 152 | case 0x02: |
| 146 | 153 | { |
| 147 | | if (data != p2) |
| 154 | if (data != m_p[offset]) |
| 148 | 155 | { |
| 149 | 156 | #if LOG_IO_PORTS |
| 150 | | char changed = p2 ^ data; |
| 157 | UINT8 changed = m_p[offset] ^ data; |
| 151 | 158 | if (changed ^ P2_UNKNOWN_BITS){ |
| 152 | 159 | printf("Write to P2: %02X changed: ( ) ( ) (", data); |
| 153 | 160 | printbits(changed); |
| 154 | 161 | printf(") ( )\n"); |
| 155 | 162 | } |
| 156 | 163 | #endif |
| 157 | | p2=data; |
| 164 | m_p[offset]=data; |
| 158 | 165 | } |
| 159 | 166 | break; |
| 160 | 167 | } |
| 161 | 168 | case 0x03: |
| 162 | 169 | { |
| 163 | | if (data != p3) |
| 170 | if (data != m_p[offset]) |
| 164 | 171 | { |
| 165 | | char changed = p3 ^ data; |
| 172 | UINT8 changed = m_p[offset] ^ data; |
| 166 | 173 | #if LOG_IO_PORTS |
| 167 | 174 | if (changed ^ P3_UNKNOWN_BITS){ |
| 168 | 175 | printf("Write to P3: %02X changed: ( ) ( ) ( ) (", data); |
| r31365 | r31366 | |
| 171 | 178 | } |
| 172 | 179 | #endif |
| 173 | 180 | |
| 174 | | if (FALLING_EDGE(p3, data, 4)){ //P3.4 = T0 |
| 175 | | display_data &= 0xFF00; |
| 176 | | display_data |= p0; |
| 181 | if (FALLING_EDGE(m_p[offset], data, 4)){ //P3.4 = T0 |
| 182 | m_display_data &= 0xFF00; |
| 183 | m_display_data |= m_p[0]; |
| 177 | 184 | } |
| 178 | 185 | |
| 179 | | if (FALLING_EDGE(p3, data, 5)){ //P3.5 = T1 |
| 180 | | display_data &= 0xFF; |
| 181 | | display_data |= (p0 << 8); |
| 186 | if (FALLING_EDGE(m_p[offset], data, 5)){ //P3.5 = T1 |
| 187 | m_display_data &= 0xFF; |
| 188 | m_display_data |= (m_p[0] << 8); |
| 182 | 189 | } |
| 183 | 190 | |
| 184 | 191 | if (BIT(changed,4) || BIT(changed,5)){ |
| 185 | | output_set_digit_value(digit_index, BITSWAP16(display_data, 9, 1, 3, 11, 12, 4, 2, 10, 14, 6, 7, 5, 0, 15, 13, 8) & 0x3FFF); |
| 192 | output_set_digit_value(m_digit_index, BITSWAP16(m_display_data, 9, 1, 3, 11, 12, 4, 2, 10, 14, 6, 7, 5, 0, 15, 13, 8) & 0x3FFF); |
| 186 | 193 | } |
| 187 | | p3=data; |
| 194 | m_p[offset]=data; |
| 188 | 195 | } |
| 189 | 196 | break; |
| 190 | 197 | } |