src/mess/drivers/atarist.c
| r851 | r852 | |
| 237 | 237 | /* IKBD */ |
| 238 | 238 | |
| 239 | 239 | static UINT8 acia_ikbd_rx, acia_ikbd_tx; |
| 240 | | static UINT8 ikbd_keymask; |
| 241 | | static int ikbd_joyen; |
| 240 | static UINT8 ikbd_keylatch; |
| 242 | 241 | static UINT8 ikbd_mouse_x0, ikbd_mouse_y0; |
| 243 | 242 | static UINT8 ikbd_mouse_x_phase, ikbd_mouse_y_phase, ikbd_mouse_phase_counter; |
| 244 | 243 | |
| r851 | r852 | |
| 252 | 251 | IKBD_MOUSE_PHASE_NEGATIVE |
| 253 | 252 | }; |
| 254 | 253 | |
| 255 | | static WRITE8_HANDLER( ikbd_port1_w ) |
| 254 | static READ8_HANDLER( ikbd_port1_r ) |
| 256 | 255 | { |
| 257 | | ikbd_keymask = data; |
| 256 | return ikbd_keylatch; |
| 258 | 257 | } |
| 259 | 258 | |
| 260 | 259 | static READ8_HANDLER( ikbd_port2_r ) |
| r851 | r852 | |
| 280 | 279 | |
| 281 | 280 | bit description |
| 282 | 281 | |
| 283 | | 0 JOY 1-5 output |
| 282 | 0 JOY 1-5 |
| 284 | 283 | 1 JOY 0-6 |
| 285 | 284 | 2 JOY 1-6 |
| 286 | 285 | 3 SD FROM CPU |
| r851 | r852 | |
| 288 | 287 | |
| 289 | 288 | */ |
| 290 | 289 | |
| 291 | | ikbd_joyen = data & 0x01; |
| 292 | 290 | acia_ikbd_rx = (data & 0x10) >> 4; |
| 293 | 291 | } |
| 294 | 292 | |
| 295 | | static WRITE8_HANDLER( ikbd_port_3_w ) |
| 293 | static WRITE8_HANDLER( ikbd_port3_w ) |
| 296 | 294 | { |
| 297 | | set_led_status(1, data & 0x01); |
| 298 | | } |
| 299 | | |
| 300 | | static READ8_HANDLER( ikbd_port_3_r ) |
| 301 | | { |
| 302 | 295 | /* |
| 303 | 296 | |
| 304 | 297 | bit description |
| 305 | 298 | |
| 306 | 299 | 0 CAPS LOCK LED |
| 307 | | 1 Keyboard row input |
| 308 | | 2 Keyboard row input |
| 309 | | 3 Keyboard row input |
| 310 | | 4 Keyboard row input |
| 311 | | 5 Keyboard row input |
| 312 | | 6 Keyboard row input |
| 313 | | 7 Keyboard row input |
| 300 | 1 Keyboard row select |
| 301 | 2 Keyboard row select |
| 302 | 3 Keyboard row select |
| 303 | 4 Keyboard row select |
| 304 | 5 Keyboard row select |
| 305 | 6 Keyboard row select |
| 306 | 7 Keyboard row select |
| 314 | 307 | |
| 315 | 308 | */ |
| 316 | 309 | |
| 317 | | UINT8 data = 0xff; |
| 310 | set_led_status(1, data & 0x01); |
| 318 | 311 | |
| 319 | | if ((readinputportbytag("P31") & ikbd_keymask) == ikbd_keymask) data -= 0x02; |
| 320 | | if ((readinputportbytag("P32") & ikbd_keymask) == ikbd_keymask) data -= 0x04; |
| 321 | | if ((readinputportbytag("P33") & ikbd_keymask) == ikbd_keymask) data -= 0x08; |
| 322 | | if ((readinputportbytag("P34") & ikbd_keymask) == ikbd_keymask) data -= 0x10; |
| 323 | | if ((readinputportbytag("P35") & ikbd_keymask) == ikbd_keymask) data -= 0x20; |
| 324 | | if ((readinputportbytag("P36") & ikbd_keymask) == ikbd_keymask) data -= 0x40; |
| 325 | | if ((readinputportbytag("P37") & ikbd_keymask) == ikbd_keymask) data -= 0x80; |
| 312 | if (~data & 0x02) ikbd_keylatch = readinputportbytag("P31"); |
| 313 | if (~data & 0x04) ikbd_keylatch = readinputportbytag("P32"); |
| 314 | if (~data & 0x08) ikbd_keylatch = readinputportbytag("P33"); |
| 315 | if (~data & 0x10) ikbd_keylatch = readinputportbytag("P34"); |
| 316 | if (~data & 0x20) ikbd_keylatch = readinputportbytag("P35"); |
| 317 | if (~data & 0x40) ikbd_keylatch = readinputportbytag("P36"); |
| 318 | if (~data & 0x80) ikbd_keylatch = readinputportbytag("P37"); |
| 319 | } |
| 326 | 320 | |
| 327 | | return data; |
| 321 | static READ8_HANDLER( ikbd_port4_r ) |
| 322 | { |
| 323 | if (readinputportbytag("config") & 0x01) |
| 324 | { |
| 325 | /* |
| 326 | |
| 327 | Right Left Up Down |
| 328 | |
| 329 | XA 1100 0110 YA 1100 0110 |
| 330 | XB 0110 1100 YB 0110 1100 |
| 331 | |
| 332 | */ |
| 333 | |
| 334 | UINT8 data = readinputportbytag("JOY0") & 0xf0; |
| 335 | UINT8 x = readinputportbytag("MOUSEX"); |
| 336 | UINT8 y = readinputportbytag("MOUSEY"); |
| 337 | |
| 338 | if (x == ikbd_mouse_x0) |
| 339 | { |
| 340 | ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_STATIC; |
| 341 | } |
| 342 | else if (x > ikbd_mouse_x0) |
| 343 | { |
| 344 | ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_POSITIVE; |
| 345 | } |
| 346 | else if (x < ikbd_mouse_x0) |
| 347 | { |
| 348 | ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_NEGATIVE; |
| 349 | } |
| 350 | |
| 351 | if (y == ikbd_mouse_y0) |
| 352 | { |
| 353 | ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_STATIC; |
| 354 | } |
| 355 | else if (y > ikbd_mouse_y0) |
| 356 | { |
| 357 | ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_POSITIVE; |
| 358 | } |
| 359 | else if (y < ikbd_mouse_y0) |
| 360 | { |
| 361 | ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_NEGATIVE; |
| 362 | } |
| 363 | |
| 364 | data |= IKBD_MOUSE_XYB[ikbd_mouse_x_phase][ikbd_mouse_phase_counter]; // XB |
| 365 | data |= IKBD_MOUSE_XYA[ikbd_mouse_x_phase][ikbd_mouse_phase_counter] << 1; // XA |
| 366 | data |= IKBD_MOUSE_XYA[ikbd_mouse_y_phase][ikbd_mouse_phase_counter] << 2; // YA |
| 367 | data |= IKBD_MOUSE_XYB[ikbd_mouse_y_phase][ikbd_mouse_phase_counter] << 3; // YB |
| 368 | |
| 369 | ikbd_mouse_phase_counter++; |
| 370 | |
| 371 | if (ikbd_mouse_phase_counter == 4) |
| 372 | { |
| 373 | ikbd_mouse_phase_counter = 0; |
| 374 | } |
| 375 | |
| 376 | ikbd_mouse_x0 = x; |
| 377 | ikbd_mouse_y0 = y; |
| 378 | |
| 379 | return data; |
| 380 | } |
| 381 | else |
| 382 | { |
| 383 | return readinputportbytag("JOY0"); |
| 384 | } |
| 328 | 385 | } |
| 329 | 386 | |
| 330 | | static READ8_HANDLER( ikbd_port_4_r ) |
| 387 | static WRITE8_HANDLER( ikbd_port4_w ) |
| 331 | 388 | { |
| 332 | 389 | /* |
| 333 | 390 | |
| r851 | r852 | |
| 344 | 401 | |
| 345 | 402 | */ |
| 346 | 403 | |
| 347 | | if (ikbd_joyen) |
| 348 | | { |
| 349 | | UINT8 data = 0xff; |
| 350 | | |
| 351 | | if ((readinputportbytag("P40") & ikbd_keymask) == ikbd_keymask) data -= 0x01; |
| 352 | | if ((readinputportbytag("P41") & ikbd_keymask) == ikbd_keymask) data -= 0x02; |
| 353 | | if ((readinputportbytag("P42") & ikbd_keymask) == ikbd_keymask) data -= 0x04; |
| 354 | | if ((readinputportbytag("P43") & ikbd_keymask) == ikbd_keymask) data -= 0x08; |
| 355 | | if ((readinputportbytag("P44") & ikbd_keymask) == ikbd_keymask) data -= 0x10; |
| 356 | | if ((readinputportbytag("P45") & ikbd_keymask) == ikbd_keymask) data -= 0x20; |
| 357 | | if ((readinputportbytag("P46") & ikbd_keymask) == ikbd_keymask) data -= 0x40; |
| 358 | | if ((readinputportbytag("P47") & ikbd_keymask) == ikbd_keymask) data -= 0x80; |
| 359 | | |
| 360 | | return data; |
| 361 | | } |
| 362 | | else |
| 363 | | { |
| 364 | | if (readinputportbytag("config") & 0x01) |
| 365 | | { |
| 366 | | /* |
| 367 | | |
| 368 | | Right Left Up Down |
| 369 | | |
| 370 | | XA 1100 0110 YA 1100 0110 |
| 371 | | XB 0110 1100 YB 0110 1100 |
| 372 | | |
| 373 | | */ |
| 374 | | |
| 375 | | UINT8 data = readinputportbytag("JOY0") & 0xf0; |
| 376 | | UINT8 x = readinputportbytag("MOUSEX"); |
| 377 | | UINT8 y = readinputportbytag("MOUSEY"); |
| 378 | | |
| 379 | | if (x == ikbd_mouse_x0) |
| 380 | | { |
| 381 | | ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_STATIC; |
| 382 | | } |
| 383 | | else if (x > ikbd_mouse_x0) |
| 384 | | { |
| 385 | | ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_POSITIVE; |
| 386 | | } |
| 387 | | else if (x < ikbd_mouse_x0) |
| 388 | | { |
| 389 | | ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_NEGATIVE; |
| 390 | | } |
| 391 | | |
| 392 | | if (y == ikbd_mouse_y0) |
| 393 | | { |
| 394 | | ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_STATIC; |
| 395 | | } |
| 396 | | else if (y > ikbd_mouse_y0) |
| 397 | | { |
| 398 | | ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_POSITIVE; |
| 399 | | } |
| 400 | | else if (y < ikbd_mouse_y0) |
| 401 | | { |
| 402 | | ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_NEGATIVE; |
| 403 | | } |
| 404 | | |
| 405 | | data |= IKBD_MOUSE_XYB[ikbd_mouse_x_phase][ikbd_mouse_phase_counter]; // XB |
| 406 | | data |= IKBD_MOUSE_XYA[ikbd_mouse_x_phase][ikbd_mouse_phase_counter] << 1; // XA |
| 407 | | data |= IKBD_MOUSE_XYA[ikbd_mouse_y_phase][ikbd_mouse_phase_counter] << 2; // YA |
| 408 | | data |= IKBD_MOUSE_XYB[ikbd_mouse_y_phase][ikbd_mouse_phase_counter] << 3; // YB |
| 409 | | |
| 410 | | ikbd_mouse_phase_counter++; |
| 411 | | |
| 412 | | if (ikbd_mouse_phase_counter == 4) |
| 413 | | { |
| 414 | | ikbd_mouse_phase_counter = 0; |
| 415 | | } |
| 416 | | |
| 417 | | ikbd_mouse_x0 = x; |
| 418 | | ikbd_mouse_y0 = y; |
| 419 | | |
| 420 | | return data; |
| 421 | | } |
| 422 | | else |
| 423 | | { |
| 424 | | return readinputportbytag("JOY0"); |
| 425 | | } |
| 426 | | } |
| 404 | if (~data & 0x01) ikbd_keylatch = readinputportbytag("P40"); |
| 405 | if (~data & 0x02) ikbd_keylatch = readinputportbytag("P41"); |
| 406 | if (~data & 0x04) ikbd_keylatch = readinputportbytag("P42"); |
| 407 | if (~data & 0x08) ikbd_keylatch = readinputportbytag("P43"); |
| 408 | if (~data & 0x10) ikbd_keylatch = readinputportbytag("P44"); |
| 409 | if (~data & 0x20) ikbd_keylatch = readinputportbytag("P45"); |
| 410 | if (~data & 0x40) ikbd_keylatch = readinputportbytag("P46"); |
| 411 | if (~data & 0x80) ikbd_keylatch = readinputportbytag("P47"); |
| 427 | 412 | } |
| 428 | 413 | |
| 429 | 414 | /* Memory Maps */ |
| r851 | r852 | |
| 435 | 420 | ADDRESS_MAP_END |
| 436 | 421 | |
| 437 | 422 | static ADDRESS_MAP_START( ikbd_io_map, ADDRESS_SPACE_IO, 8 ) |
| 438 | | AM_RANGE(HD63701_PORT1, HD63701_PORT1) AM_WRITE(ikbd_port1_w) |
| 423 | AM_RANGE(HD63701_PORT1, HD63701_PORT1) AM_READ(ikbd_port1_r) |
| 439 | 424 | AM_RANGE(HD63701_PORT2, HD63701_PORT2) AM_READWRITE(ikbd_port2_r, ikbd_port2_w) |
| 440 | | AM_RANGE(HD63701_PORT3, HD63701_PORT3) AM_READ(ikbd_port_3_r) |
| 441 | | AM_RANGE(HD63701_PORT4, HD63701_PORT4) AM_READ(ikbd_port_4_r) |
| 425 | AM_RANGE(HD63701_PORT3, HD63701_PORT3) AM_WRITE(ikbd_port3_w) |
| 426 | AM_RANGE(HD63701_PORT4, HD63701_PORT4) AM_READWRITE(ikbd_port4_r, ikbd_port4_w) |
| 442 | 427 | ADDRESS_MAP_END |
| 443 | 428 | |
| 444 | 429 | static ADDRESS_MAP_START( st_map, ADDRESS_SPACE_PROGRAM, 16 ) |
| r851 | r852 | |
| 837 | 822 | |
| 838 | 823 | static struct acia6850_interface acia_ikbd_intf = |
| 839 | 824 | { |
| 840 | | Y2/64, |
| 841 | | Y2/64, |
| 825 | 500000, |
| 826 | 500000, |
| 842 | 827 | &acia_ikbd_rx, |
| 843 | 828 | &acia_ikbd_tx, |
| 844 | 829 | acia_interrupt |
| r851 | r852 | |
| 846 | 831 | |
| 847 | 832 | static struct acia6850_interface acia_midi_intf = |
| 848 | 833 | { |
| 849 | | Y2/64, |
| 850 | | Y2/64, |
| 834 | 500000, |
| 835 | 500000, |
| 851 | 836 | &acia_midi_rx, |
| 852 | 837 | &acia_midi_tx, |
| 853 | 838 | acia_interrupt |
| r851 | r852 | |
| 989 | 974 | MDRV_CPU_ADD_TAG("main", M68000, Y2/4) |
| 990 | 975 | MDRV_CPU_PROGRAM_MAP(st_map, 0) |
| 991 | 976 | |
| 992 | | MDRV_CPU_ADD(HD63701, 1000000) // HD6301 |
| 977 | MDRV_CPU_ADD(HD63701, 1000000) // HD6301, really clocked at 4MHz but CPU core doesn't divide it properly |
| 993 | 978 | MDRV_CPU_PROGRAM_MAP(ikbd_map, 0) |
| 994 | 979 | MDRV_CPU_IO_MAP(ikbd_io_map, 0) |
| 995 | 980 | |
| r851 | r852 | |
| 1052 | 1037 | ROMX_LOAD( "tos102.img", 0xfc0000, 0x030000, BAD_DUMP CRC(3b5cd0c5) SHA1(87900a40a890fdf03bd08be6c60cc645855cbce5), ROM_BIOS(2) ) |
| 1053 | 1038 | ROM_SYSTEM_BIOS( 2, "tos104", "TOS 1.04 (Rainbow TOS)" ) |
| 1054 | 1039 | ROMX_LOAD( "tos104.img", 0xfc0000, 0x030000, BAD_DUMP CRC(a50d1d43) SHA1(9526ef63b9cb1d2a7109e278547ae78a5c1db6c6), ROM_BIOS(3) ) |
| 1040 | ROM_SYSTEM_BIOS( 3, "tos099", "TOS 0.99 (Disk TOS)" ) |
| 1041 | ROMX_LOAD( "tos099.img", 0xfc0000, 0x008000, NO_DUMP, ROM_BIOS(4) ) |
| 1055 | 1042 | ROM_COPY( REGION_CPU1, 0xfc0000, 0x000000, 0x000008 ) |
| 1056 | 1043 | |
| 1057 | 1044 | ROM_REGION( 0x10000, REGION_CPU2, 0 ) |