src/mess/drivers/portfoli.c
| r9338 | r9339 | |
| 29 | 29 | |
| 30 | 30 | TODO: |
| 31 | 31 | |
| 32 | | - boot is always cold |
| 32 | - clock is running too fast |
| 33 | - access violation after OFF command |
| 34 | - create chargen ROM from tech manual |
| 33 | 35 | - memory error interrupt vector |
| 34 | 36 | - i/o port 8051 |
| 35 | 37 | - screen contrast |
| 36 | 38 | - system tick frequency selection (1 or 128 Hz) |
| 37 | 39 | - speaker |
| 38 | | - serial interface |
| 39 | | - parallel interface |
| 40 | 40 | - credit card memory (A:/B:) |
| 41 | 41 | - software list |
| 42 | 42 | |
| r9338 | r9339 | |
| 67 | 67 | INT_EXTERNAL |
| 68 | 68 | }; |
| 69 | 69 | |
| 70 | enum |
| 71 | { |
| 72 | PID_COMMCARD = 0x00, |
| 73 | PID_SERIAL, |
| 74 | PID_PARALLEL, |
| 75 | PID_PRINTER, |
| 76 | PID_MODEM, |
| 77 | PID_NONE = 0xff |
| 78 | }; |
| 79 | |
| 70 | 80 | static UINT8 INTERRUPT_VECTOR[] = { 0x08, 0x09, 0x00 }; |
| 71 | 81 | |
| 72 | 82 | //************************************************************************** |
| r9338 | r9339 | |
| 101 | 111 | } |
| 102 | 112 | |
| 103 | 113 | //------------------------------------------------- |
| 114 | // irq_status_r - interrupt status read |
| 115 | //------------------------------------------------- |
| 116 | |
| 117 | static READ8_HANDLER( irq_status_r ) |
| 118 | { |
| 119 | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 120 | |
| 121 | return state->ip; |
| 122 | } |
| 123 | |
| 124 | //------------------------------------------------- |
| 104 | 125 | // irq_mask_w - interrupt enable mask |
| 105 | 126 | //------------------------------------------------- |
| 106 | 127 | |
| r9338 | r9339 | |
| 123 | 144 | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 124 | 145 | |
| 125 | 146 | state->sivr = data; |
| 147 | //logerror("SIVR %02x\n", data); |
| 126 | 148 | } |
| 127 | 149 | |
| 128 | 150 | //------------------------------------------------- |
| r9338 | r9339 | |
| 277 | 299 | bit description |
| 278 | 300 | |
| 279 | 301 | 0 |
| 280 | | 1 |
| 302 | 1 1=power off |
| 281 | 303 | 2 |
| 282 | 304 | 3 |
| 283 | 305 | 4 |
| r9338 | r9339 | |
| 298 | 320 | { |
| 299 | 321 | /* |
| 300 | 322 | |
| 301 | | bit description |
| 323 | bit signal description |
| 302 | 324 | |
| 303 | 325 | 0 |
| 304 | 326 | 1 |
| 305 | 327 | 2 |
| 306 | 328 | 3 |
| 307 | 329 | 4 |
| 308 | | 5 |
| 309 | | 6 0=battery low |
| 310 | | 7 |
| 330 | 5 PDET 1=peripheral connected |
| 331 | 6 BATD? 0=battery low |
| 332 | 7 1=cold boot |
| 311 | 333 | |
| 312 | 334 | */ |
| 313 | 335 | |
| 314 | | return 0xc2; |
| 336 | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 337 | |
| 338 | UINT8 data = 0; |
| 339 | |
| 340 | /* peripheral detect */ |
| 341 | data |= (state->pid != PID_NONE) << 5; |
| 342 | |
| 343 | /* battery status */ |
| 344 | data |= BIT(input_port_read(space->machine, "BATTERY"), 0) << 6; |
| 345 | |
| 346 | return data; |
| 315 | 347 | } |
| 316 | 348 | |
| 349 | //------------------------------------------------- |
| 350 | // unknown_w - ? |
| 351 | //------------------------------------------------- |
| 352 | |
| 353 | static WRITE8_HANDLER( unknown_w ) |
| 354 | { |
| 355 | //logerror("UNKNOWN %02x\n", data); |
| 356 | } |
| 357 | |
| 317 | 358 | //************************************************************************** |
| 318 | 359 | // SYSTEM TIMERS |
| 319 | 360 | //************************************************************************** |
| r9338 | r9339 | |
| 431 | 472 | |
| 432 | 473 | */ |
| 433 | 474 | |
| 434 | | return 0xff; |
| 475 | portfolio_state *state = space->machine->driver_data<portfolio_state>(); |
| 476 | |
| 477 | return state->pid; |
| 435 | 478 | } |
| 436 | 479 | |
| 437 | 480 | //************************************************************************** |
| r9338 | r9339 | |
| 461 | 504 | AM_RANGE(0x8020, 0x8020) AM_WRITE(speaker_w) |
| 462 | 505 | AM_RANGE(0x8030, 0x8030) AM_WRITE(power_w) |
| 463 | 506 | AM_RANGE(0x8040, 0x8041) AM_READWRITE(counter_r, counter_w) |
| 464 | | AM_RANGE(0x8050, 0x8050) AM_WRITE(irq_mask_w) |
| 465 | | AM_RANGE(0x8051, 0x8051) AM_READ(battery_r) |
| 507 | AM_RANGE(0x8050, 0x8050) AM_READWRITE(irq_status_r, irq_mask_w) |
| 508 | AM_RANGE(0x8051, 0x8051) AM_READWRITE(battery_r, unknown_w) |
| 466 | 509 | AM_RANGE(0x8060, 0x8060) AM_RAM AM_BASE_MEMBER(portfolio_state, contrast) |
| 467 | 510 | // AM_RANGE(0x8070, 0x8077) AM_DEVREADWRITE(M82C50A_TAG, ins8250_r, ins8250_w) Serial Interface |
| 468 | 511 | // AM_RANGE(0x8078, 0x807b) AM_DEVREADWRITE(M82C55A_TAG, i8255a_r, i8255a_w) Parallel Interface |
| r9338 | r9339 | |
| 566 | 609 | PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') |
| 567 | 610 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') |
| 568 | 611 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) |
| 612 | |
| 613 | PORT_START("BATTERY") |
| 614 | PORT_CONFNAME( 0x01, 0x01, "Battery Status" ) |
| 615 | PORT_CONFSETTING( 0x01, DEF_STR( Normal ) ) |
| 616 | PORT_CONFSETTING( 0x00, "Low Battery" ) |
| 617 | |
| 618 | PORT_START("PERIPHERAL") |
| 619 | PORT_CONFNAME( 0xff, PID_NONE, "Peripheral" ) |
| 620 | PORT_CONFSETTING( PID_NONE, DEF_STR( None ) ) |
| 621 | PORT_CONFSETTING( PID_PARALLEL, "Intelligent Parallel Interface (HPC-101)" ) |
| 622 | PORT_CONFSETTING( PID_SERIAL, "Serial Interface (HPC-102)" ) |
| 569 | 623 | INPUT_PORTS_END |
| 570 | 624 | |
| 571 | 625 | //************************************************************************** |
| r9338 | r9339 | |
| 690 | 744 | |
| 691 | 745 | static INS8250_INTERRUPT( i8250_intrpt_w ) |
| 692 | 746 | { |
| 693 | | trigger_interrupt(device->machine, INT_EXTERNAL); |
| 747 | // trigger_interrupt(device->machine, INT_EXTERNAL); |
| 694 | 748 | } |
| 695 | 749 | |
| 696 | 750 | const ins8250_interface i8250_intf = |
| r9338 | r9339 | |
| 752 | 806 | /* set initial values */ |
| 753 | 807 | state->keylatch = 0xff; |
| 754 | 808 | state->sivr = 0x2a; |
| 809 | state->pid = 0xff; |
| 810 | |
| 811 | /* register for state saving */ |
| 812 | state_save_register_global(machine, state->ip); |
| 813 | state_save_register_global(machine, state->ie); |
| 814 | state_save_register_global(machine, state->sivr); |
| 815 | state_save_register_global(machine, state->counter); |
| 816 | state_save_register_global(machine, state->keylatch); |
| 817 | state_save_register_global(machine, state->contrast); |
| 818 | state_save_register_global(machine, state->pid); |
| 755 | 819 | } |
| 756 | 820 | |
| 821 | //------------------------------------------------- |
| 822 | // MACHINE_RESET( portfolio ) |
| 823 | //------------------------------------------------- |
| 824 | |
| 825 | static MACHINE_RESET( portfolio ) |
| 826 | { |
| 827 | portfolio_state *state = machine->driver_data<portfolio_state>(); |
| 828 | address_space *io = cputag_get_address_space(machine, M80C88A_TAG, ADDRESS_SPACE_IO); |
| 829 | |
| 830 | /* peripheral */ |
| 831 | state->pid = input_port_read(machine, "PERIPHERAL"); |
| 832 | |
| 833 | switch (state->pid) |
| 834 | { |
| 835 | case PID_SERIAL: |
| 836 | memory_install_readwrite8_device_handler(io, machine->device(M82C50A_TAG), 0x8070, 0x8077, 0, 0, ins8250_r, ins8250_w); |
| 837 | break; |
| 838 | |
| 839 | case PID_PARALLEL: |
| 840 | memory_install_readwrite8_device_handler(io, machine->device(M82C55A_TAG), 0x8078, 0x807b, 0, 0, i8255a_r, i8255a_w); |
| 841 | break; |
| 842 | } |
| 843 | } |
| 844 | |
| 757 | 845 | //************************************************************************** |
| 758 | 846 | // MACHINE CONFIGURATION |
| 759 | 847 | //************************************************************************** |
| r9338 | r9339 | |
| 769 | 857 | MDRV_CPU_IO_MAP(portfolio_io) |
| 770 | 858 | |
| 771 | 859 | MDRV_MACHINE_START(portfolio) |
| 860 | MDRV_MACHINE_RESET(portfolio) |
| 772 | 861 | |
| 773 | 862 | /* video hardware */ |
| 774 | 863 | MDRV_SCREEN_ADD(SCREEN_TAG, LCD) |
| r9338 | r9339 | |
| 853 | 942 | //************************************************************************** |
| 854 | 943 | |
| 855 | 944 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 856 | | COMP( 1989, pofo, 0, 0, portfolio, portfolio, 0, "Atari", "Portfolio", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) |
| 945 | COMP( 1989, pofo, 0, 0, portfolio, portfolio, 0, "Atari", "Portfolio", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) |