trunk/src/mess/drivers/digel804.c
| r242497 | r242498 | |
| 20 | 20 | * hook up keypad via 74C923 and mode buttons via logic gate mess |
| 21 | 21 | * |
| 22 | 22 | * TODO: |
| 23 | * remove ACIA hack in digel804_state::acia_command_w |
| 23 | 24 | * minor finishing touches to i/o map |
| 24 | | * hook up 6551/ACIA interrupt (currently ACIA device doesn't have a callback for /IRQ line) |
| 25 | | * attach terminal to 6551/ACIA serial for recieving from ep804 |
| 26 | | * correctly hook up 10937 vfd controller: por is not hooked up (relates to /MEMEN) |
| 27 | | * SCLK line should be handled inside the 10937 device |
| 28 | 25 | * EPROM socket stuff (ports 0x40, 0x41, 0x42 and 0x47) |
| 29 | 26 | * artwork |
| 30 | 27 | * |
| r242497 | r242498 | |
| 59 | 56 | /* Core includes */ |
| 60 | 57 | #include "emu.h" |
| 61 | 58 | #include "cpu/z80/z80.h" |
| 62 | | #include "machine/terminal.h" |
| 63 | 59 | #include "sound/speaker.h" |
| 64 | 60 | #include "machine/roc10937.h" |
| 65 | 61 | #include "machine/mos6551.h" |
| 66 | 62 | #include "machine/mm74c922.h" |
| 67 | 63 | #include "machine/ram.h" |
| 64 | #include "bus/rs232/rs232.h" |
| 68 | 65 | #include "digel804.lh" |
| 69 | 66 | |
| 70 | | #define TERMINAL_TAG "terminal" |
| 71 | 67 | |
| 72 | 68 | class digel804_state : public driver_device |
| 73 | 69 | { |
| r242497 | r242498 | |
| 75 | 71 | digel804_state(const machine_config &mconfig, device_type type, const char *tag) |
| 76 | 72 | : driver_device(mconfig, type, tag), |
| 77 | 73 | m_maincpu(*this, "maincpu"), |
| 78 | | m_terminal(*this, TERMINAL_TAG), |
| 79 | 74 | m_speaker(*this, "speaker"), |
| 80 | 75 | m_acia(*this, "acia"), |
| 81 | 76 | m_vfd(*this, "vfd"), |
| 82 | 77 | m_kb(*this, "74c923"), |
| 83 | | m_ram(*this, RAM_TAG) |
| 78 | m_ram(*this, RAM_TAG), |
| 79 | m_rambank(*this, "bankedram") |
| 84 | 80 | { |
| 85 | 81 | } |
| 86 | 82 | |
| 87 | 83 | required_device<cpu_device> m_maincpu; |
| 88 | | required_device<generic_terminal_device> m_terminal; |
| 89 | 84 | required_device<speaker_sound_device> m_speaker; |
| 90 | 85 | required_device<mos6551_device> m_acia; |
| 91 | 86 | required_device<roc10937_t> m_vfd; |
| 92 | 87 | required_device<mm74c922_device> m_kb; |
| 93 | 88 | required_device<ram_device> m_ram; |
| 89 | required_memory_bank m_rambank; |
| 94 | 90 | |
| 95 | 91 | virtual void machine_reset(); |
| 96 | 92 | DECLARE_DRIVER_INIT(digel804); |
| r242497 | r242498 | |
| 115 | 111 | DECLARE_WRITE8_MEMBER( acia_command_w ); |
| 116 | 112 | DECLARE_READ8_MEMBER( acia_control_r ); |
| 117 | 113 | DECLARE_WRITE8_MEMBER( acia_control_w ); |
| 114 | DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); |
| 115 | DECLARE_WRITE_LINE_MEMBER( ep804_acia_irq_w ); |
| 118 | 116 | DECLARE_WRITE_LINE_MEMBER( da_w ); |
| 119 | 117 | DECLARE_INPUT_CHANGED_MEMBER(mode_change); |
| 120 | 118 | // current speaker state for port 45 |
| 121 | 119 | UINT8 m_speaker_state; |
| 122 | 120 | // ram stuff for banking |
| 123 | 121 | UINT8 m_ram_bank; |
| 124 | | //required_shared_ptr<UINT8> m_main_ram; |
| 125 | 122 | // states |
| 126 | 123 | UINT8 m_acia_intq; |
| 127 | 124 | UINT8 m_overload_state; |
| r242497 | r242498 | |
| 133 | 130 | UINT8 m_chipinsert_state; |
| 134 | 131 | UINT8 m_keyen_state; |
| 135 | 132 | UINT8 m_op41; |
| 136 | | DECLARE_WRITE8_MEMBER(digel804_serial_put); |
| 137 | 133 | }; |
| 138 | 134 | |
| 139 | 135 | |
| r242497 | r242498 | |
| 156 | 152 | m_op41 = 0; |
| 157 | 153 | m_keyen_state = 1; // /KEYEN |
| 158 | 154 | |
| 159 | | membank( "bankedram" )->set_base(m_ram->pointer()); |
| 155 | m_rambank->set_base(m_ram->pointer()); |
| 160 | 156 | } |
| 161 | 157 | |
| 162 | 158 | void digel804_state::machine_reset() |
| r242497 | r242498 | |
| 236 | 232 | WRITE8_MEMBER( digel804_state::op00 ) |
| 237 | 233 | { |
| 238 | 234 | m_ram_bank = data; |
| 239 | | membank( "bankedram" )->set_base(m_ram->pointer() + ((m_ram_bank * 0x8000) & m_ram->mask())); |
| 235 | m_rambank->set_base(m_ram->pointer() + ((m_ram_bank * 0x8000) & m_ram->mask())); |
| 240 | 236 | } |
| 241 | 237 | |
| 242 | 238 | WRITE8_MEMBER( digel804_state::op43 ) |
| r242497 | r242498 | |
| 257 | 253 | if ((data&0xF8)!=0) |
| 258 | 254 | logerror("Digel804: port 0x43 ram bank had unexpected data %02x written to it!\n", data); |
| 259 | 255 | |
| 260 | | membank( "bankedram" )->set_base(m_ram->pointer() + ((m_ram_bank * 0x8000) & m_ram->mask())); |
| 256 | m_rambank->set_base(m_ram->pointer() + ((m_ram_bank * 0x8000) & m_ram->mask())); |
| 261 | 257 | } |
| 262 | 258 | |
| 263 | 259 | WRITE8_MEMBER( digel804_state::op43_1_4 ) |
| r242497 | r242498 | |
| 372 | 368 | m_sim_mode = 0; |
| 373 | 369 | break; |
| 374 | 370 | } |
| 371 | |
| 372 | m_acia->reset(); |
| 375 | 373 | } |
| 376 | 374 | |
| 377 | 375 | // press one of those keys reset the Z80 |
| r242497 | r242498 | |
| 406 | 404 | |
| 407 | 405 | WRITE8_MEMBER( digel804_state::acia_command_w ) |
| 408 | 406 | { |
| 407 | data |= 0x08; // HACK for ep804 remote mode |
| 408 | |
| 409 | 409 | m_acia->write(space, 2, data); |
| 410 | 410 | } |
| 411 | 411 | |
| r242497 | r242498 | |
| 458 | 458 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 459 | 459 | // io bits: x 1 x x x * * * |
| 460 | 460 | // writes to 47, 4e, 57, 5e, 67, 6e, 77, 7e, c7, ce, d7, de, e7, ee, f7, fe all go to 47, same with reads |
| 461 | | AM_RANGE(0x00, 0x00) AM_MIRROR(0xB8) AM_WRITE(op00) // W, banked ram |
| 461 | AM_RANGE(0x00, 0x00) AM_MIRROR(0x38) AM_WRITE(op00) // W, banked ram |
| 462 | 462 | AM_RANGE(0x40, 0x40) AM_MIRROR(0xB8) AM_READWRITE(ip40, op40) // RW, eprom socket data bus input/output value |
| 463 | 463 | AM_RANGE(0x41, 0x41) AM_MIRROR(0xB8) AM_WRITE(op41) // W, eprom socket address low out |
| 464 | 464 | AM_RANGE(0x42, 0x42) AM_MIRROR(0xB8) AM_WRITE(op42) // W, eprom socket address hi/control out |
| r242497 | r242498 | |
| 553 | 553 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 554 | 554 | INPUT_PORTS_END |
| 555 | 555 | |
| 556 | static DEVICE_INPUT_DEFAULTS_START( digel804_rs232_defaults ) |
| 557 | DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 ) |
| 558 | DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 ) |
| 559 | DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 ) |
| 560 | DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_7 ) |
| 561 | DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_ODD ) |
| 562 | DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 ) |
| 563 | DEVICE_INPUT_DEFAULTS_END |
| 564 | |
| 556 | 565 | /****************************************************************************** |
| 557 | 566 | Machine Drivers |
| 558 | 567 | ******************************************************************************/ |
| 559 | | WRITE8_MEMBER(digel804_state::digel804_serial_put) |
| 560 | | { |
| 561 | | //m_acia->receive_character(data); |
| 562 | | } |
| 563 | 568 | |
| 564 | 569 | WRITE_LINE_MEMBER( digel804_state::da_w ) |
| 565 | 570 | { |
| 566 | | m_maincpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE); |
| 567 | 571 | m_key_intq = state ? 0 : 1; |
| 572 | m_maincpu->set_input_line(0, (m_key_intq & m_acia_intq) ? CLEAR_LINE : ASSERT_LINE); |
| 568 | 573 | } |
| 569 | 574 | |
| 575 | WRITE_LINE_MEMBER( digel804_state::acia_irq_w ) |
| 576 | { |
| 577 | m_acia_intq = state ? 0 : 1; |
| 578 | m_maincpu->set_input_line(0, (m_key_intq & m_acia_intq) ? CLEAR_LINE : ASSERT_LINE); |
| 579 | } |
| 580 | |
| 581 | WRITE_LINE_MEMBER( digel804_state::ep804_acia_irq_w ) |
| 582 | { |
| 583 | } |
| 584 | |
| 570 | 585 | static MACHINE_CONFIG_START( digel804, digel804_state ) |
| 571 | 586 | /* basic machine hardware */ |
| 572 | 587 | MCFG_CPU_ADD("maincpu", Z80, XTAL_3_6864MHz/2) /* Z80A, X1(aka E0 on schematics): 3.6864Mhz */ |
| r242497 | r242498 | |
| 577 | 592 | MCFG_ROC10937_ADD("vfd",0) // RIGHT_TO_LEFT |
| 578 | 593 | |
| 579 | 594 | /* video hardware */ |
| 580 | | MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0) |
| 581 | | MCFG_GENERIC_TERMINAL_KEYBOARD_CB(WRITE8(digel804_state, digel804_serial_put)) |
| 582 | | |
| 583 | 595 | MCFG_DEFAULT_LAYOUT(layout_digel804) |
| 584 | 596 | |
| 585 | 597 | MCFG_DEVICE_ADD("74c923", MM74C923, 0) |
| r242497 | r242498 | |
| 591 | 603 | |
| 592 | 604 | /* acia */ |
| 593 | 605 | MCFG_DEVICE_ADD("acia", MOS6551, 0) |
| 594 | | MCFG_MOS6551_XTAL(XTAL_1_8432MHz) |
| 606 | MCFG_MOS6551_XTAL(XTAL_3_6864MHz/2) |
| 607 | MCFG_MOS6551_IRQ_HANDLER(WRITELINE(digel804_state, acia_irq_w)) |
| 608 | MCFG_MOS6551_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) |
| 609 | MCFG_MOS6551_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) |
| 610 | MCFG_MOS6551_DTR_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_dtr)) |
| 595 | 611 | |
| 612 | MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "null_modem") |
| 613 | MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", mos6551_device, write_rxd)) |
| 614 | MCFG_RS232_DSR_HANDLER(DEVWRITELINE("acia", mos6551_device, write_dsr)) |
| 615 | MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", mos6551_device, write_cts)) |
| 616 | MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("null_modem", digel804_rs232_defaults) |
| 617 | MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("terminal", digel804_rs232_defaults) |
| 618 | |
| 596 | 619 | MCFG_RAM_ADD(RAM_TAG) |
| 597 | 620 | MCFG_RAM_DEFAULT_SIZE("256K") |
| 598 | 621 | MCFG_RAM_EXTRA_OPTIONS("32K,64K,128K") |
| r242497 | r242498 | |
| 609 | 632 | MCFG_CPU_PROGRAM_MAP(z80_mem_804_1_2) |
| 610 | 633 | MCFG_CPU_IO_MAP(z80_io_1_2) |
| 611 | 634 | |
| 635 | MCFG_DEVICE_MODIFY("acia") |
| 636 | MCFG_MOS6551_IRQ_HANDLER(WRITELINE(digel804_state, ep804_acia_irq_w)) |
| 637 | |
| 612 | 638 | MCFG_RAM_MODIFY(RAM_TAG) |
| 613 | 639 | MCFG_RAM_DEFAULT_SIZE("32K") |
| 614 | 640 | MCFG_RAM_EXTRA_OPTIONS("64K") |