src/mess/drivers/phunsy.c
| r9528 | r9529 | |
| 19 | 19 | phunsy_state(running_machine &machine, const driver_device_config_base &config) |
| 20 | 20 | : driver_device(machine, config) { } |
| 21 | 21 | |
| 22 | | UINT8 *video_ram; |
| 23 | | UINT8 data_out; |
| 24 | | UINT8 keyboard_input; |
| 22 | UINT8 *video_ram; |
| 23 | UINT8 data_out; |
| 24 | UINT8 keyboard_input; |
| 25 | UINT16 old_in[3]; |
| 25 | 26 | emu_timer *kb_timer; |
| 26 | 27 | }; |
| 27 | 28 | |
| r9528 | r9529 | |
| 52 | 53 | { |
| 53 | 54 | state->keyboard_input |= 0x80; |
| 54 | 55 | } |
| 56 | |
| 55 | 57 | /* b3 - speaker output */ |
| 58 | if ( data & 0x08 ) |
| 59 | { |
| 60 | } |
| 61 | |
| 56 | 62 | /* b4 - -REV MDCR output */ |
| 57 | 63 | /* b5 - -FWD MDCR output */ |
| 58 | 64 | /* b6 - -WCD MDCR output */ |
| r9528 | r9529 | |
| 109 | 115 | /* Input ports */ |
| 110 | 116 | INPUT_PORTS_START( phunsy ) |
| 111 | 117 | PORT_START( "IN0" ) |
| 112 | | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") |
| 118 | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") |
| 119 | PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") |
| 120 | PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") |
| 121 | PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") |
| 122 | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") |
| 123 | PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") |
| 124 | PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") |
| 125 | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") |
| 126 | PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") |
| 127 | PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") |
| 128 | PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Spacebar") |
| 129 | PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") |
| 130 | PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-") |
| 131 | |
| 132 | PORT_START( "IN1" ) |
| 133 | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") |
| 134 | PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") |
| 135 | PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") |
| 136 | PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") |
| 137 | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") |
| 138 | PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") |
| 139 | PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("G") |
| 140 | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("H") |
| 141 | PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("I") |
| 142 | PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("J") |
| 143 | PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") |
| 144 | PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("L") |
| 145 | PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("M") |
| 146 | PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") |
| 147 | PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("O") |
| 148 | PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("P") |
| 149 | |
| 150 | PORT_START( "IN2" ) |
| 151 | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Q") |
| 152 | PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME("R") |
| 153 | PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("S") |
| 154 | PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("T") |
| 155 | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_NAME("U") |
| 156 | PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("V") |
| 157 | PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_NAME("W") |
| 158 | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("X") |
| 159 | PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Y") |
| 160 | PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Z") |
| 113 | 161 | INPUT_PORTS_END |
| 114 | 162 | |
| 115 | 163 | |
| 116 | 164 | static TIMER_CALLBACK( phunsy_kb_scan ) |
| 117 | 165 | { |
| 166 | static const char *ports[3] = { "IN0", "IN1", "IN2" }; |
| 167 | static const UINT8 kb_decode[3][16] = |
| 168 | { |
| 169 | { |
| 170 | 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, |
| 171 | 0x39, 0x30, 0x20, 0x0D, 0x2D, 0xFF, 0xFF, 0xFF |
| 172 | }, |
| 173 | { |
| 174 | 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, |
| 175 | 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50 |
| 176 | }, |
| 177 | { |
| 178 | 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, |
| 179 | 0x59, 0x5a, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF |
| 180 | }, |
| 181 | }; |
| 118 | 182 | phunsy_state *state = machine->driver_data<phunsy_state>(); |
| 119 | | UINT8 data; |
| 120 | 183 | |
| 121 | | data = input_port_read( machine, "IN0" ); |
| 184 | for ( int j = 0; j < 3; j++ ) |
| 185 | { |
| 186 | UINT16 x = 1; |
| 187 | UINT16 data = input_port_read( machine, ports[j] ); |
| 122 | 188 | |
| 123 | | if ( data & 0x01 ) |
| 124 | | { |
| 125 | | state->keyboard_input = 0x61; |
| 189 | for ( int i = 0; i < 16; i++ ) |
| 190 | { |
| 191 | /* Key pressed? */ |
| 192 | if ( ! ( state->old_in[j] & x ) && ( data & x ) ) |
| 193 | { |
| 194 | if ( kb_decode[j][i] != 0xFF ) |
| 195 | state->keyboard_input = kb_decode[j][i]; |
| 196 | } |
| 197 | x <<= 1; |
| 198 | } |
| 199 | state->old_in[j] = data; |
| 126 | 200 | } |
| 127 | 201 | } |
| 128 | 202 | |
| r9528 | r9529 | |
| 140 | 214 | phunsy_state *state = machine->driver_data<phunsy_state>(); |
| 141 | 215 | |
| 142 | 216 | memory_set_bankptr( machine, "bank2", memory_region(machine, "ram_4000") ); |
| 217 | |
| 143 | 218 | state->keyboard_input = 0xFF; |
| 219 | state->old_in[0] = 0; |
| 220 | state->old_in[1] = 0; |
| 221 | state->old_in[2] = 0; |
| 144 | 222 | |
| 145 | 223 | timer_adjust_periodic( state->kb_timer, machine->primary_screen->frame_period(), 0, machine->primary_screen->frame_period() ); |
| 146 | 224 | } |
| r9528 | r9529 | |
| 204 | 282 | else |
| 205 | 283 | { |
| 206 | 284 | /* ASCII mode */ |
| 285 | if ( ! ( c & 0x20 ) ) |
| 286 | { |
| 287 | c ^= 0x40; |
| 288 | } |
| 289 | |
| 207 | 290 | for ( int i = 0; i < 8; i++ ) |
| 208 | 291 | { |
| 209 | 292 | UINT16 *p = BITMAP_ADDR16( bitmap, h * 8 + i, w * 6 ); |