trunk/src/mess/includes/mikromik.h
| r19716 | r19717 | |
| 43 | 43 | m_floppy0(*this, UPD765_TAG ":0:525qd"), |
| 44 | 44 | m_floppy1(*this, UPD765_TAG ":1:525qd"), |
| 45 | 45 | m_ram(*this, RAM_TAG), |
| 46 | | m_video_ram(*this, "video_ram") |
| 46 | m_video_ram(*this, "video_ram"), |
| 47 | m_a8(0), |
| 48 | m_recall(0), |
| 49 | m_dack3(1), |
| 50 | m_tc(CLEAR_LINE) |
| 47 | 51 | { } |
| 48 | 52 | |
| 49 | 53 | required_device<cpu_device> m_maincpu; |
| r19716 | r19717 | |
| 66 | 70 | virtual void video_start(); |
| 67 | 71 | UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 68 | 72 | |
| 69 | | DECLARE_READ8_MEMBER( mmu_r ); |
| 70 | | DECLARE_WRITE8_MEMBER( mmu_w ); |
| 73 | DECLARE_READ8_MEMBER( read ); |
| 74 | DECLARE_WRITE8_MEMBER( write ); |
| 71 | 75 | DECLARE_WRITE8_MEMBER( ls259_w ); |
| 72 | 76 | DECLARE_READ8_MEMBER( kb_r ); |
| 73 | | DECLARE_WRITE_LINE_MEMBER( dma_hrq_changed ); |
| 77 | DECLARE_WRITE_LINE_MEMBER( dma_hrq_w ); |
| 74 | 78 | DECLARE_READ8_MEMBER( mpsc_dack_r ); |
| 75 | 79 | DECLARE_WRITE8_MEMBER( mpsc_dack_w ); |
| 76 | | DECLARE_WRITE_LINE_MEMBER( tc_w ); |
| 80 | DECLARE_WRITE_LINE_MEMBER( dma_eop_w ); |
| 77 | 81 | DECLARE_WRITE_LINE_MEMBER( dack3_w ); |
| 78 | 82 | DECLARE_WRITE_LINE_MEMBER( itxc_w ); |
| 79 | 83 | DECLARE_WRITE_LINE_MEMBER( irxc_w ); |
| r19716 | r19717 | |
| 81 | 85 | DECLARE_WRITE_LINE_MEMBER( drq2_w ); |
| 82 | 86 | DECLARE_WRITE_LINE_MEMBER( drq1_w ); |
| 83 | 87 | DECLARE_READ_LINE_MEMBER( dsra_r ); |
| 84 | | DECLARE_PALETTE_INIT(mm1); |
| 85 | | DECLARE_READ8_MEMBER(fdc_dma_r); |
| 86 | | DECLARE_WRITE8_MEMBER(fdc_dma_w); |
| 87 | 88 | |
| 88 | | void fdc_irq(bool state); |
| 89 | | void fdc_drq(bool state); |
| 89 | void update_tc(); |
| 90 | void fdc_intrq_w(bool state); |
| 91 | void fdc_drq_w(bool state); |
| 90 | 92 | |
| 91 | 93 | void scan_keyboard(); |
| 92 | 94 | |
| r19716 | r19717 | |
| 114 | 116 | int m_recall; |
| 115 | 117 | int m_dack3; |
| 116 | 118 | int m_tc; |
| 117 | | UINT32 screen_update_mm1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 119 | |
| 118 | 120 | TIMER_DEVICE_CALLBACK_MEMBER(kbclk_tick); |
| 119 | 121 | DECLARE_FLOPPY_FORMATS( floppy_formats ); |
| 120 | 122 | }; |
trunk/src/mess/drivers/mikromik.c
| r19716 | r19717 | |
| 59 | 59 | // MACROS / CONSTANTS |
| 60 | 60 | //************************************************************************** |
| 61 | 61 | |
| 62 | | #define LOG 0 |
| 62 | #define LOG 1 |
| 63 | 63 | |
| 64 | | #define MMU_IOEN_MEMEN 0x01 |
| 65 | | #define MMU_RAMEN 0x02 |
| 66 | | #define MMU_CE4 0x08 |
| 67 | | #define MMU_CE0 0x10 |
| 68 | | #define MMU_CE1 0x20 |
| 69 | | #define MMU_CE2 0x40 |
| 70 | | #define MMU_CE3 0x80 |
| 64 | #define MMU_IOEN 0x01 |
| 65 | #define MMU_RAMEN 0x02 |
| 66 | #define MMU_CE4 0x08 |
| 67 | #define MMU_CE0 0x10 |
| 68 | #define MMU_CE1 0x20 |
| 69 | #define MMU_CE2 0x40 |
| 70 | #define MMU_CE3 0x80 |
| 71 | 71 | |
| 72 | 72 | |
| 73 | 73 | |
| r19716 | r19717 | |
| 76 | 76 | //************************************************************************** |
| 77 | 77 | |
| 78 | 78 | //------------------------------------------------- |
| 79 | | // mmu_r - |
| 79 | // read - |
| 80 | 80 | //------------------------------------------------- |
| 81 | 81 | |
| 82 | | READ8_MEMBER( mm1_state::mmu_r ) |
| 82 | READ8_MEMBER( mm1_state::read ) |
| 83 | 83 | { |
| 84 | 84 | UINT8 data = 0; |
| 85 | 85 | UINT8 mmu = m_mmu_rom[(m_a8 << 8) | (offset >> 8)]; |
| 86 | 86 | |
| 87 | | if (mmu & MMU_IOEN_MEMEN) |
| 87 | if (mmu & MMU_IOEN) |
| 88 | 88 | { |
| 89 | 89 | switch ((offset >> 4) & 0x07) |
| 90 | 90 | { |
| r19716 | r19717 | |
| 146 | 146 | |
| 147 | 147 | |
| 148 | 148 | //------------------------------------------------- |
| 149 | | // mmu_w - |
| 149 | // write - |
| 150 | 150 | //------------------------------------------------- |
| 151 | 151 | |
| 152 | | WRITE8_MEMBER( mm1_state::mmu_w ) |
| 152 | WRITE8_MEMBER( mm1_state::write ) |
| 153 | 153 | { |
| 154 | 154 | UINT8 mmu = m_mmu_rom[(m_a8 << 8) | (offset >> 8)]; |
| 155 | 155 | |
| 156 | | if (mmu & MMU_IOEN_MEMEN) |
| 156 | if (mmu & MMU_IOEN) |
| 157 | 157 | { |
| 158 | 158 | switch ((offset >> 4) & 0x07) |
| 159 | 159 | { |
| r19716 | r19717 | |
| 221 | 221 | case 1: // RECALL |
| 222 | 222 | if (LOG) logerror("RECALL %u\n", d); |
| 223 | 223 | m_recall = d; |
| 224 | | if(d) |
| 225 | | m_fdc->reset(); |
| 224 | if (d) m_fdc->reset(); |
| 226 | 225 | break; |
| 227 | 226 | |
| 228 | 227 | case 2: // _RV28/RX21 |
| r19716 | r19717 | |
| 333 | 332 | //------------------------------------------------- |
| 334 | 333 | |
| 335 | 334 | static ADDRESS_MAP_START( mm1_map, AS_PROGRAM, 8, mm1_state ) |
| 336 | | AM_RANGE(0x0000, 0xffff) AM_READWRITE(mmu_r, mmu_w) |
| 335 | AM_RANGE(0x0000, 0xffff) AM_READWRITE(read, write) |
| 337 | 336 | ADDRESS_MAP_END |
| 338 | 337 | |
| 339 | 338 | |
| r19716 | r19717 | |
| 485 | 484 | // I8237_INTERFACE( dmac_intf ) |
| 486 | 485 | //------------------------------------------------- |
| 487 | 486 | |
| 488 | | WRITE_LINE_MEMBER( mm1_state::dma_hrq_changed ) |
| 487 | void mm1_state::update_tc() |
| 489 | 488 | { |
| 489 | m_fdc->tc_w(m_tc && !m_dack3); |
| 490 | } |
| 491 | |
| 492 | WRITE_LINE_MEMBER( mm1_state::dma_hrq_w ) |
| 493 | { |
| 490 | 494 | m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); |
| 491 | 495 | |
| 492 | 496 | // Assert HLDA |
| r19716 | r19717 | |
| 509 | 513 | m_dmac->dreq1_w(CLEAR_LINE); |
| 510 | 514 | } |
| 511 | 515 | |
| 512 | | WRITE_LINE_MEMBER( mm1_state::tc_w ) |
| 516 | WRITE_LINE_MEMBER( mm1_state::dma_eop_w ) |
| 513 | 517 | { |
| 514 | | if (!m_dack3) |
| 515 | | { |
| 516 | | // floppy terminal count |
| 517 | | m_fdc->tc_w(!state); |
| 518 | | } |
| 519 | | |
| 520 | | m_tc = !state; |
| 521 | | |
| 522 | 518 | m_maincpu->set_input_line(I8085_RST75_LINE, state); |
| 519 | |
| 520 | m_tc = state; |
| 521 | update_tc(); |
| 523 | 522 | } |
| 524 | 523 | |
| 525 | 524 | WRITE_LINE_MEMBER( mm1_state::dack3_w ) |
| 526 | 525 | { |
| 527 | 526 | m_dack3 = state; |
| 528 | | |
| 529 | | if (!m_dack3) |
| 530 | | { |
| 531 | | // floppy terminal count |
| 532 | | m_fdc->tc_w(m_tc); |
| 533 | | } |
| 527 | update_tc(); |
| 534 | 528 | } |
| 535 | 529 | |
| 536 | | static UINT8 memory_read_byte(address_space &space, offs_t address, UINT8 mem_mask) { return space.read_byte(address); } |
| 537 | | static void memory_write_byte(address_space &space, offs_t address, UINT8 data, UINT8 mem_mask) { space.write_byte(address, data); } |
| 538 | | |
| 539 | | READ8_MEMBER( mm1_state::fdc_dma_r ) |
| 540 | | { |
| 541 | | return m_fdc->dma_r(); |
| 542 | | } |
| 543 | | |
| 544 | | WRITE8_MEMBER( mm1_state::fdc_dma_w ) |
| 545 | | { |
| 546 | | m_fdc->dma_w(data); |
| 547 | | } |
| 548 | | |
| 549 | 530 | static I8237_INTERFACE( dmac_intf ) |
| 550 | 531 | { |
| 551 | | DEVCB_DRIVER_LINE_MEMBER(mm1_state, dma_hrq_changed), |
| 552 | | DEVCB_DRIVER_LINE_MEMBER(mm1_state, tc_w), |
| 553 | | DEVCB_MEMORY_HANDLER(I8085A_TAG, PROGRAM, memory_read_byte), |
| 554 | | DEVCB_MEMORY_HANDLER(I8085A_TAG, PROGRAM, memory_write_byte), |
| 555 | | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(mm1_state, mpsc_dack_r), DEVCB_DRIVER_MEMBER(mm1_state, fdc_dma_r) }, |
| 556 | | { DEVCB_DEVICE_HANDLER(I8275_TAG, i8275_dack_w), DEVCB_DRIVER_MEMBER(mm1_state, mpsc_dack_w), DEVCB_NULL, DEVCB_DRIVER_MEMBER(mm1_state, fdc_dma_w) }, |
| 532 | DEVCB_DRIVER_LINE_MEMBER(mm1_state, dma_hrq_w), |
| 533 | DEVCB_DRIVER_LINE_MEMBER(mm1_state, dma_eop_w), |
| 534 | DEVCB_DRIVER_MEMBER(mm1_state, read), |
| 535 | DEVCB_DRIVER_MEMBER(mm1_state, write), |
| 536 | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(mm1_state, mpsc_dack_r), DEVCB_DEVICE_MEMBER(UPD765_TAG, upd765_family_device, mdma_r) }, |
| 537 | { DEVCB_DEVICE_HANDLER(I8275_TAG, i8275_dack_w), DEVCB_DRIVER_MEMBER(mm1_state, mpsc_dack_w), DEVCB_NULL, DEVCB_DEVICE_MEMBER(UPD765_TAG, upd765_family_device, mdma_w) }, |
| 557 | 538 | { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_LINE_MEMBER(mm1_state, dack3_w) } |
| 558 | 539 | }; |
| 559 | 540 | |
| r19716 | r19717 | |
| 693 | 674 | SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) |
| 694 | 675 | SLOT_INTERFACE_END |
| 695 | 676 | |
| 696 | | void mm1_state::fdc_irq(bool state) |
| 677 | void mm1_state::fdc_intrq_w(bool state) |
| 697 | 678 | { |
| 698 | 679 | m_maincpu->set_input_line(I8085_RST55_LINE, state ? ASSERT_LINE : CLEAR_LINE); |
| 699 | 680 | } |
| 700 | 681 | |
| 701 | | void mm1_state::fdc_drq(bool state) |
| 682 | void mm1_state::fdc_drq_w(bool state) |
| 702 | 683 | { |
| 703 | 684 | m_dmac->dreq3_w(state); |
| 704 | 685 | } |
| r19716 | r19717 | |
| 715 | 696 | void mm1_state::machine_start() |
| 716 | 697 | { |
| 717 | 698 | // floppy callbacks |
| 718 | | m_fdc->setup_intrq_cb(upd765a_device::line_cb(FUNC(mm1_state::fdc_irq), this)); |
| 719 | | m_fdc->setup_drq_cb(upd765a_device::line_cb(FUNC(mm1_state::fdc_drq), this)); |
| 699 | m_fdc->setup_intrq_cb(upd765_family_device::line_cb(FUNC(mm1_state::fdc_intrq_w), this)); |
| 700 | m_fdc->setup_drq_cb(upd765_family_device::line_cb(FUNC(mm1_state::fdc_drq_w), this)); |
| 720 | 701 | |
| 721 | 702 | // find memory regions |
| 722 | 703 | m_mmu_rom = memregion("address")->base(); |
| r19716 | r19717 | |
| 731 | 712 | save_item(NAME(m_tx21)); |
| 732 | 713 | save_item(NAME(m_rcl)); |
| 733 | 714 | save_item(NAME(m_recall)); |
| 734 | | save_item(NAME(m_dack3)); |
| 735 | 715 | } |
| 736 | 716 | |
| 737 | 717 | |
| r19716 | r19717 | |
| 742 | 722 | void mm1_state::machine_reset() |
| 743 | 723 | { |
| 744 | 724 | address_space &program = m_maincpu->space(AS_PROGRAM); |
| 745 | | int i; |
| 746 | 725 | |
| 747 | 726 | // reset LS259 |
| 748 | | for (i = 0; i < 8; i++) ls259_w(program, i, 0); |
| 727 | for (int i = 0; i < 8; i++) |
| 728 | { |
| 729 | ls259_w(program, i, 0); |
| 730 | } |
| 749 | 731 | |
| 750 | 732 | // reset FDC |
| 751 | 733 | m_fdc->reset(); |
| r19716 | r19717 | |
| 766 | 748 | MCFG_CPU_ADD(I8085A_TAG, I8085A, XTAL_6_144MHz) |
| 767 | 749 | MCFG_CPU_PROGRAM_MAP(mm1_map) |
| 768 | 750 | MCFG_CPU_CONFIG(i8085_intf) |
| 751 | MCFG_QUANTUM_PERFECT_CPU(I8085A_TAG) |
| 769 | 752 | |
| 770 | 753 | MCFG_TIMER_DRIVER_ADD_PERIODIC("kbclk", mm1_state, kbclk_tick, attotime::from_hz(2500)) |
| 771 | 754 | |