trunk/src/mess/machine/pmd85.c
| r26762 | r26763 | |
| 762 | 762 | case TIMER_RESET: |
| 763 | 763 | pmd_reset(ptr, param); |
| 764 | 764 | break; |
| 765 | | case TIMER_SETUP_MACHINE_STATE: |
| 766 | | setup_machine_state(ptr, param); |
| 767 | | break; |
| 768 | 765 | default: |
| 769 | 766 | assert_always(FALSE, "Unknown id in pmd85_state::device_timer"); |
| 770 | 767 | } |
| 771 | 768 | } |
| 772 | 769 | |
| 770 | WRITE_LINE_MEMBER(pmd85_state::write_cas_tx) |
| 771 | { |
| 772 | m_cas_tx = state; |
| 773 | } |
| 773 | 774 | |
| 774 | 775 | TIMER_CALLBACK_MEMBER(pmd85_state::pmd85_cassette_timer_callback) |
| 775 | 776 | { |
| r26762 | r26763 | |
| 797 | 798 | { |
| 798 | 799 | data = (!m_previous_level && current_level) ? 1 : 0; |
| 799 | 800 | |
| 800 | | m_sercas->send_bit(data); |
| 801 | m_uart->write_rx(data); |
| 801 | 802 | m_uart->receive_clock(); |
| 802 | 803 | |
| 803 | 804 | m_clk_level_tape = 1; |
| r26762 | r26763 | |
| 817 | 818 | /* tape writing */ |
| 818 | 819 | if (m_cassette->get_state()&CASSETTE_RECORD) |
| 819 | 820 | { |
| 820 | | data = m_sercas->get_in_data_bit(); |
| 821 | data = m_cas_tx; |
| 821 | 822 | data ^= m_clk_level_tape; |
| 822 | 823 | m_cassette->output(data&0x01 ? 1 : -1); |
| 823 | 824 | |
| r26762 | r26763 | |
| 921 | 922 | pmd85_common_driver_init(); |
| 922 | 923 | } |
| 923 | 924 | |
| 924 | | TIMER_CALLBACK_MEMBER(pmd85_state::setup_machine_state) |
| 925 | | { |
| 926 | | if (m_model != MATO) |
| 927 | | { |
| 928 | | m_uart->connect(m_sercas); |
| 929 | | } |
| 930 | | } |
| 931 | | |
| 932 | | |
| 933 | 925 | void pmd85_state::machine_reset() |
| 934 | 926 | { |
| 935 | 927 | int i, j; |
| r26762 | r26763 | |
| 958 | 950 | m_startup_mem_map = 1; |
| 959 | 951 | (this->*update_memory)(); |
| 960 | 952 | |
| 961 | | timer_set(attotime::zero, TIMER_SETUP_MACHINE_STATE); |
| 962 | | |
| 963 | 953 | m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(pmd85_state::pmd85_opbaseoverride), this)); |
| 964 | 954 | } |
trunk/src/mess/includes/pmd85.h
| r26762 | r26763 | |
| 20 | 20 | enum |
| 21 | 21 | { |
| 22 | 22 | TIMER_CASSETTE, |
| 23 | | TIMER_RESET, |
| 24 | | TIMER_SETUP_MACHINE_STATE |
| 23 | TIMER_RESET |
| 25 | 24 | }; |
| 26 | 25 | |
| 27 | 26 | pmd85_state(const machine_config &mconfig, device_type type, const char *tag) |
| r26762 | r26763 | |
| 29 | 28 | m_maincpu(*this, "maincpu"), |
| 30 | 29 | m_ram(*this, RAM_TAG), |
| 31 | 30 | m_cassette(*this, "cassette"), |
| 32 | | m_sercas(*this, "sercas"), |
| 33 | 31 | m_pit8253(*this, "pit8253"), |
| 34 | 32 | m_uart(*this, "uart"), |
| 35 | 33 | m_ppi8255_0(*this, "ppi8255_0"), |
| r26762 | r26763 | |
| 83 | 81 | UINT32 screen_update_pmd85(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 84 | 82 | TIMER_CALLBACK_MEMBER(pmd85_cassette_timer_callback); |
| 85 | 83 | TIMER_CALLBACK_MEMBER(pmd_reset); |
| 86 | | TIMER_CALLBACK_MEMBER(setup_machine_state); |
| 84 | DECLARE_WRITE_LINE_MEMBER(write_cas_tx); |
| 87 | 85 | DECLARE_READ8_MEMBER(pmd85_ppi_0_porta_r); |
| 88 | 86 | DECLARE_READ8_MEMBER(pmd85_ppi_0_portb_r); |
| 89 | 87 | DECLARE_READ8_MEMBER(pmd85_ppi_0_portc_r); |
| r26762 | r26763 | |
| 116 | 114 | required_device<cpu_device> m_maincpu; |
| 117 | 115 | required_device<ram_device> m_ram; |
| 118 | 116 | required_device<cassette_image_device> m_cassette; |
| 119 | | required_device<serial_source_device> m_sercas; |
| 120 | 117 | required_device<pit8253_device> m_pit8253; |
| 121 | 118 | optional_device<i8251_device> m_uart; |
| 122 | 119 | optional_device<i8255_device> m_ppi8255_0; |
| r26762 | r26763 | |
| 153 | 150 | void pmd85_common_driver_init(); |
| 154 | 151 | void pmd85_draw_scanline(bitmap_ind16 &bitmap, int pmd85_scanline); |
| 155 | 152 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 153 | |
| 154 | int m_cas_tx; |
| 156 | 155 | }; |
| 157 | 156 | |
| 158 | 157 | |
trunk/src/mess/drivers/pmd85.c
| r26762 | r26763 | |
| 542 | 542 | NULL |
| 543 | 543 | }; |
| 544 | 544 | |
| 545 | const i8251_interface pmd85_i8251_interface = |
| 546 | { |
| 547 | DEVCB_DRIVER_LINE_MEMBER(pmd85_state, write_cas_tx), |
| 548 | DEVCB_NULL, |
| 549 | DEVCB_NULL, |
| 550 | DEVCB_NULL, |
| 551 | DEVCB_NULL, |
| 552 | DEVCB_NULL, |
| 553 | DEVCB_NULL |
| 554 | }; |
| 545 | 555 | |
| 556 | |
| 546 | 557 | /* machine definition */ |
| 547 | 558 | static MACHINE_CONFIG_START( pmd85, pmd85_state ) |
| 548 | 559 | /* basic machine hardware */ |
| r26762 | r26763 | |
| 574 | 585 | MCFG_CASSETTE_ADD( "cassette", pmd85_cassette_interface ) |
| 575 | 586 | |
| 576 | 587 | /* uart */ |
| 577 | | MCFG_I8251_ADD("uart", default_i8251_interface) |
| 578 | | MCFG_SERIAL_SOURCE_ADD("sercas") |
| 588 | MCFG_I8251_ADD("uart", pmd85_i8251_interface) |
| 579 | 589 | |
| 580 | 590 | /* internal ram */ |
| 581 | 591 | MCFG_RAM_ADD(RAM_TAG) |