src/mess/drivers/phunsy.c
| r9559 | r9560 | |
| 8 | 8 | |
| 9 | 9 | #include "emu.h" |
| 10 | 10 | #include "cpu/s2650/s2650.h" |
| 11 | #include "machine/terminal.h" |
| 11 | 12 | |
| 12 | 13 | |
| 13 | 14 | #define LOG 1 |
| r9559 | r9560 | |
| 24 | 25 | UINT8 keyboard_input; |
| 25 | 26 | UINT8 q_bank; |
| 26 | 27 | UINT8 u_bank; |
| 27 | | UINT16 old_in[3]; |
| 28 | 28 | UINT8 ram_1800[0x800]; |
| 29 | | emu_timer *kb_timer; |
| 30 | 29 | }; |
| 31 | 30 | |
| 32 | 31 | |
| r9559 | r9560 | |
| 155 | 154 | |
| 156 | 155 | /* Input ports */ |
| 157 | 156 | INPUT_PORTS_START( phunsy ) |
| 158 | | PORT_START( "IN0" ) |
| 159 | | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") |
| 160 | | PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") |
| 161 | | PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") |
| 162 | | PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") |
| 163 | | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") |
| 164 | | PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") |
| 165 | | PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") |
| 166 | | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") |
| 167 | | PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") |
| 168 | | PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") |
| 169 | | PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Spacebar") |
| 170 | | PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") |
| 171 | | PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-") |
| 172 | | |
| 173 | | PORT_START( "IN1" ) |
| 174 | | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") |
| 175 | | PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") |
| 176 | | PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") |
| 177 | | PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") |
| 178 | | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") |
| 179 | | PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") |
| 180 | | PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("G") |
| 181 | | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("H") |
| 182 | | PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("I") |
| 183 | | PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("J") |
| 184 | | PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") |
| 185 | | PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("L") |
| 186 | | PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("M") |
| 187 | | PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") |
| 188 | | PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("O") |
| 189 | | PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("P") |
| 190 | | |
| 191 | | PORT_START( "IN2" ) |
| 192 | | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Q") |
| 193 | | PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME("R") |
| 194 | | PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("S") |
| 195 | | PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("T") |
| 196 | | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_NAME("U") |
| 197 | | PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("V") |
| 198 | | PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_NAME("W") |
| 199 | | PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("X") |
| 200 | | PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Y") |
| 201 | | PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Z") |
| 157 | PORT_INCLUDE(generic_terminal) |
| 202 | 158 | INPUT_PORTS_END |
| 203 | 159 | |
| 204 | 160 | |
| 205 | | static TIMER_CALLBACK( phunsy_kb_scan ) |
| 161 | static WRITE8_DEVICE_HANDLER( phunsy_kbd_put ) |
| 206 | 162 | { |
| 207 | | static const char *ports[3] = { "IN0", "IN1", "IN2" }; |
| 208 | | static const UINT8 kb_decode[3][16] = |
| 209 | | { |
| 210 | | { |
| 211 | | 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, |
| 212 | | 0x39, 0x30, 0x20, 0x0D, 0x2D, 0xFF, 0xFF, 0xFF |
| 213 | | }, |
| 214 | | { |
| 215 | | 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, |
| 216 | | 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50 |
| 217 | | }, |
| 218 | | { |
| 219 | | 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, |
| 220 | | 0x59, 0x5a, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF |
| 221 | | }, |
| 222 | | }; |
| 223 | | phunsy_state *state = machine->driver_data<phunsy_state>(); |
| 163 | phunsy_state *state = device->machine->driver_data<phunsy_state>(); |
| 224 | 164 | |
| 225 | | for ( int j = 0; j < 3; j++ ) |
| 226 | | { |
| 227 | | UINT16 x = 1; |
| 228 | | UINT16 data = input_port_read( machine, ports[j] ); |
| 229 | | |
| 230 | | for ( int i = 0; i < 16; i++ ) |
| 231 | | { |
| 232 | | /* Key pressed? */ |
| 233 | | if ( ! ( state->old_in[j] & x ) && ( data & x ) ) |
| 234 | | { |
| 235 | | if ( kb_decode[j][i] != 0xFF ) |
| 236 | | state->keyboard_input = kb_decode[j][i]; |
| 237 | | } |
| 238 | | x <<= 1; |
| 239 | | } |
| 240 | | state->old_in[j] = data; |
| 241 | | } |
| 165 | state->keyboard_input = data; |
| 242 | 166 | } |
| 243 | 167 | |
| 244 | 168 | |
| 245 | | static DRIVER_INIT( phunsy ) |
| 169 | static GENERIC_TERMINAL_INTERFACE( phunsy_terminal_intf ) |
| 246 | 170 | { |
| 247 | | phunsy_state *state = machine->driver_data<phunsy_state>(); |
| 171 | DEVCB_HANDLER(phunsy_kbd_put) |
| 172 | }; |
| 248 | 173 | |
| 249 | | state->kb_timer = timer_alloc( machine, phunsy_kb_scan, NULL ); |
| 174 | |
| 175 | static DRIVER_INIT( phunsy ) |
| 176 | { |
| 250 | 177 | } |
| 251 | 178 | |
| 252 | 179 | |
| r9559 | r9560 | |
| 260 | 187 | state->u_bank = 0; |
| 261 | 188 | state->q_bank = 0; |
| 262 | 189 | state->keyboard_input = 0xFF; |
| 263 | | state->old_in[0] = 0; |
| 264 | | state->old_in[1] = 0; |
| 265 | | state->old_in[2] = 0; |
| 266 | | |
| 267 | | timer_adjust_periodic( state->kb_timer, machine->primary_screen->frame_period(), 0, machine->primary_screen->frame_period() ); |
| 268 | 190 | } |
| 269 | 191 | |
| 270 | 192 | |
| r9559 | r9560 | |
| 354 | 276 | |
| 355 | 277 | static MACHINE_CONFIG_START( phunsy, phunsy_state ) |
| 356 | 278 | /* basic machine hardware */ |
| 357 | | MDRV_CPU_ADD("maincpu",S2650, XTAL_1MHz) |
| 358 | | MDRV_CPU_PROGRAM_MAP(phunsy_mem) |
| 359 | | MDRV_CPU_IO_MAP(phunsy_io) |
| 279 | MDRV_CPU_ADD("maincpu",S2650, XTAL_1MHz) |
| 280 | MDRV_CPU_PROGRAM_MAP(phunsy_mem) |
| 281 | MDRV_CPU_IO_MAP(phunsy_io) |
| 360 | 282 | |
| 361 | | MDRV_MACHINE_RESET(phunsy) |
| 283 | MDRV_MACHINE_RESET(phunsy) |
| 362 | 284 | |
| 363 | 285 | /* video hardware */ |
| 364 | | MDRV_SCREEN_ADD("screen", RASTER) |
| 286 | MDRV_SCREEN_ADD("screen", RASTER) |
| 365 | 287 | /* Display (page 12 of pdf) |
| 366 | 288 | - 8Mhz clock |
| 367 | 289 | - 64 6 pixel characters on a line. |
| r9559 | r9560 | |
| 369 | 291 | - 313 line display of which 256 are displayed. |
| 370 | 292 | */ |
| 371 | 293 | MDRV_SCREEN_RAW_PARAMS(XTAL_8MHz, 480, 0, 64*6, 313, 0, 256) |
| 372 | | MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 373 | | MDRV_PALETTE_LENGTH(8) |
| 374 | | MDRV_PALETTE_INIT(phunsy) |
| 294 | MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 295 | MDRV_PALETTE_LENGTH(8) |
| 296 | MDRV_PALETTE_INIT(phunsy) |
| 375 | 297 | |
| 376 | | MDRV_VIDEO_START(phunsy) |
| 377 | | MDRV_VIDEO_UPDATE(phunsy) |
| 298 | MDRV_VIDEO_START(phunsy) |
| 299 | MDRV_VIDEO_UPDATE(phunsy) |
| 300 | |
| 301 | MDRV_GENERIC_TERMINAL_ADD("ascii_keyboard",phunsy_terminal_intf) |
| 378 | 302 | MACHINE_CONFIG_END |
| 379 | 303 | |
| 380 | 304 | |