trunk/src/mame/drivers/segaybd.c
| r31825 | r31826 | |
| 30 | 30 | #include "cpu/z80/z80.h" |
| 31 | 31 | #include "includes/segaybd.h" |
| 32 | 32 | #include "cpu/m68000/m68000.h" |
| 33 | #include "machine/mb8421.h" |
| 33 | 34 | #include "machine/segaic16.h" |
| 34 | 35 | #include "machine/nvram.h" |
| 35 | 36 | #include "sound/2151intf.h" |
| r31825 | r31826 | |
| 45 | 46 | |
| 46 | 47 | const UINT32 MASTER_CLOCK = 50000000; |
| 47 | 48 | const UINT32 SOUND_CLOCK = 32215900; |
| 48 | | const UINT32 LINK_CLOCK = XTAL_16MHz; |
| 49 | 49 | |
| 50 | 50 | // use this to fiddle with the IRQ2 timing |
| 51 | 51 | #define TWEAK_IRQ2_SCANLINE (0) |
| r31825 | r31826 | |
| 651 | 651 | } |
| 652 | 652 | |
| 653 | 653 | |
| 654 | | READ16_MEMBER(segaybd_state::link_r) |
| 655 | | { |
| 656 | | return rand(); |
| 657 | | } |
| 658 | | |
| 659 | | READ16_MEMBER(segaybd_state::link2_r) |
| 660 | | { |
| 661 | | return 0x0000; |
| 662 | | } |
| 663 | | |
| 664 | | WRITE16_MEMBER(segaybd_state::link2_w) |
| 665 | | { |
| 666 | | data &= mem_mask; |
| 667 | | logerror("link2_w %04x\n", data); |
| 668 | | } |
| 669 | | |
| 670 | | READ8_MEMBER(segaybd_state::linkram_r) |
| 671 | | { |
| 672 | | return m_linkram[offset]; |
| 673 | | } |
| 674 | | |
| 675 | | WRITE8_MEMBER(segaybd_state::linkram_w) |
| 676 | | { |
| 677 | | m_linkram[offset] = data; |
| 678 | | } |
| 679 | | |
| 680 | 654 | //************************************************************************** |
| 681 | 655 | // MAIN CPU ADDRESS MAPS |
| 682 | 656 | //************************************************************************** |
| r31825 | r31826 | |
| 695 | 669 | AM_RANGE(0x1f0000, 0x1fffff) AM_RAM |
| 696 | 670 | ADDRESS_MAP_END |
| 697 | 671 | |
| 698 | | static ADDRESS_MAP_START( main_map_link, AS_PROGRAM, 16, segaybd_state ) |
| 699 | | AM_RANGE(0x190000, 0x190fff) AM_READWRITE8(linkram_r, linkram_w, 0x00ff) // ram to share with link CPU? |
| 700 | | AM_RANGE(0x191000, 0x191001) AM_READ(link_r) |
| 701 | | AM_RANGE(0x192000, 0x192001) AM_READWRITE(link2_r, link2_w) |
| 702 | 672 | |
| 703 | | AM_IMPORT_FROM(main_map) |
| 704 | | ADDRESS_MAP_END |
| 705 | | |
| 706 | 673 | //************************************************************************** |
| 707 | 674 | // SUB CPU ADDRESS MAPS |
| 708 | 675 | //************************************************************************** |
| r31825 | r31826 | |
| 734 | 701 | ADDRESS_MAP_END |
| 735 | 702 | |
| 736 | 703 | |
| 737 | | |
| 738 | 704 | //************************************************************************** |
| 739 | 705 | // Z80 SOUND CPU ADDRESS MAPS |
| 740 | 706 | //************************************************************************** |
| r31825 | r31826 | |
| 753 | 719 | AM_RANGE(0x40, 0x40) AM_MIRROR(0x3f) AM_READ(sound_data_r) |
| 754 | 720 | ADDRESS_MAP_END |
| 755 | 721 | |
| 722 | |
| 756 | 723 | //************************************************************************** |
| 757 | | // Z80 LINK BOARD CPU ADDRESS MAPS |
| 724 | // LINK BOARD |
| 758 | 725 | //************************************************************************** |
| 759 | 726 | |
| 727 | WRITE_LINE_MEMBER(segaybd_state::mb8421_intl) |
| 728 | { |
| 729 | // shared ram interrupt request from linkcpu side |
| 730 | // unused? |
| 731 | } |
| 732 | |
| 733 | WRITE_LINE_MEMBER(segaybd_state::mb8421_intr) |
| 734 | { |
| 735 | // shared ram interrupt request from maincpu side |
| 736 | m_linkcpu->set_input_line_and_vector(0, state ? ASSERT_LINE : CLEAR_LINE, 0xef); // RST $28 |
| 737 | } |
| 738 | |
| 739 | |
| 740 | READ16_MEMBER(segaybd_state::link_r) |
| 741 | { |
| 742 | return rand(); |
| 743 | } |
| 744 | |
| 745 | READ16_MEMBER(segaybd_state::link2_r) |
| 746 | { |
| 747 | return 0x0000; |
| 748 | } |
| 749 | |
| 750 | WRITE16_MEMBER(segaybd_state::link2_w) |
| 751 | { |
| 752 | data &= mem_mask; |
| 753 | logerror("link2_w %04x\n", data); |
| 754 | } |
| 755 | |
| 756 | static ADDRESS_MAP_START( main_map_link, AS_PROGRAM, 16, segaybd_state ) |
| 757 | AM_RANGE(0x190000, 0x190fff) AM_DEVREADWRITE8("mb8421", mb8421_device, left_r, left_w, 0x00ff) |
| 758 | AM_RANGE(0x191000, 0x191001) AM_READ(link_r) |
| 759 | AM_RANGE(0x192000, 0x192001) AM_READWRITE(link2_r, link2_w) |
| 760 | |
| 761 | AM_IMPORT_FROM(main_map) |
| 762 | ADDRESS_MAP_END |
| 763 | |
| 764 | |
| 760 | 765 | static ADDRESS_MAP_START( link_map, AS_PROGRAM, 8, segaybd_state ) |
| 761 | 766 | ADDRESS_MAP_UNMAP_HIGH |
| 762 | 767 | AM_RANGE(0x0000, 0x0fff) AM_ROM |
| 763 | 768 | AM_RANGE(0x2000, 0x3fff) AM_RAM |
| 764 | | AM_RANGE(0x4000, 0x47ff) AM_RAM AM_SHARE("linkram") // MB8421 |
| 769 | AM_RANGE(0x4000, 0x47ff) AM_DEVREADWRITE("mb8421", mb8421_device, right_r, right_w) |
| 765 | 770 | ADDRESS_MAP_END |
| 766 | 771 | |
| 767 | 772 | READ8_MEMBER(segaybd_state::link_portc0_r) |
| r31825 | r31826 | |
| 773 | 778 | ADDRESS_MAP_UNMAP_HIGH |
| 774 | 779 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 775 | 780 | |
| 776 | | // AM_RANGE(0x40, 0x40) AM_READ_PORT("LinkDSW") |
| 781 | // AM_RANGE(0x40, 0x40) AM_READ_PORT("LinkDSW") |
| 777 | 782 | AM_RANGE(0xc0, 0xc0) AM_READ(link_portc0_r) |
| 778 | | |
| 779 | 783 | ADDRESS_MAP_END |
| 780 | 784 | |
| 785 | |
| 781 | 786 | //************************************************************************** |
| 782 | 787 | // GENERIC PORT DEFINITIONS |
| 783 | 788 | //************************************************************************** |
| r31825 | r31826 | |
| 1336 | 1341 | MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) |
| 1337 | 1342 | MACHINE_CONFIG_END |
| 1338 | 1343 | |
| 1339 | | // LINK PCB is 834-6740 |
| 1340 | | // has 1x 8 switch dip bank, z80E CPU, ribbon connector? (to main board?), RX/TX ports, 16Mhz OSC |
| 1344 | // LINK PCB is 834-6740, similar to the one for Super Monaco GP |
| 1345 | // has 1x 8 switch dip bank, Z80E CPU, ribbon connector? (to main board?), RX/TX ports, 16Mhz OSC, |
| 1346 | // MB8421 DPSRAM, MB89372 (UART?) |
| 1347 | // irq at 0x28 is from mb8421, and irq at 0x38 probably from uart? |
| 1341 | 1348 | static MACHINE_CONFIG_DERIVED( yboard_link, yboard ) |
| 1349 | |
| 1350 | // basic machine hardware |
| 1342 | 1351 | MCFG_CPU_MODIFY("maincpu") |
| 1343 | 1352 | MCFG_CPU_PROGRAM_MAP(main_map_link) |
| 1344 | 1353 | |
| 1345 | | MCFG_CPU_ADD("linkcpu", Z80, LINK_CLOCK/2 ) // 8 mhz? |
| 1354 | MCFG_CPU_ADD("linkcpu", Z80, XTAL_16MHz/2 ) // 8 mhz? |
| 1346 | 1355 | MCFG_CPU_PROGRAM_MAP(link_map) |
| 1347 | 1356 | MCFG_CPU_IO_MAP(link_portmap) |
| 1348 | | // valid code at 0x28 and 0x38 |
| 1357 | |
| 1358 | MCFG_DEVICE_ADD("mb8421", MB8421, 0) |
| 1359 | MCFG_MB8421_INTL_HANDLER(WRITELINE(segaybd_state, mb8421_intl)) |
| 1360 | MCFG_MB8421_INTR_HANDLER(WRITELINE(segaybd_state, mb8421_intr)) |
| 1349 | 1361 | MACHINE_CONFIG_END |
| 1350 | 1362 | |
| 1351 | 1363 | //************************************************************************** |
trunk/src/mame/includes/segaybd.h
| r31825 | r31826 | |
| 25 | 25 | m_subx(*this, "subx"), |
| 26 | 26 | m_suby(*this, "suby"), |
| 27 | 27 | m_soundcpu(*this, "soundcpu"), |
| 28 | m_linkcpu(*this, "linkcpu"), |
| 28 | 29 | m_bsprites(*this, "bsprites"), |
| 29 | 30 | m_ysprites(*this, "ysprites"), |
| 30 | 31 | m_segaic16vid(*this, "segaic16vid"), |
| r31825 | r31826 | |
| 33 | 34 | m_irq2_scanline(0), |
| 34 | 35 | m_timer_irq_state(0), |
| 35 | 36 | m_vblank_irq_state(0), |
| 36 | | m_tmp_bitmap(512, 512), |
| 37 | | m_linkram(*this, "linkram") |
| 37 | m_tmp_bitmap(512, 512) |
| 38 | 38 | { |
| 39 | 39 | memset(m_analog_data, 0, sizeof(m_analog_data)); |
| 40 | 40 | memset(m_misc_io_data, 0, sizeof(m_misc_io_data)); |
| r31825 | r31826 | |
| 53 | 53 | // sound Z80 CPU read/write handlers |
| 54 | 54 | DECLARE_READ8_MEMBER( sound_data_r ); |
| 55 | 55 | |
| 56 | // linked cabinet specific handlers |
| 57 | DECLARE_WRITE_LINE_MEMBER( mb8421_intl ); |
| 58 | DECLARE_WRITE_LINE_MEMBER( mb8421_intr ); |
| 59 | DECLARE_READ16_MEMBER( link_r ); |
| 60 | DECLARE_READ16_MEMBER( link2_r ); |
| 61 | DECLARE_WRITE16_MEMBER( link2_w ); |
| 62 | DECLARE_READ8_MEMBER( link_portc0_r ); |
| 63 | |
| 56 | 64 | // game-specific output handlers |
| 57 | 65 | void gforce2_output_cb2(UINT16 data); |
| 58 | 66 | void gloc_output_cb1(UINT16 data); |
| r31825 | r31826 | |
| 97 | 105 | required_device<m68000_device> m_subx; |
| 98 | 106 | required_device<m68000_device> m_suby; |
| 99 | 107 | required_device<z80_device> m_soundcpu; |
| 108 | optional_device<z80_device> m_linkcpu; |
| 100 | 109 | required_device<sega_sys16b_sprite_device> m_bsprites; |
| 101 | 110 | required_device<sega_yboard_sprite_device> m_ysprites; |
| 102 | 111 | required_device<segaic16_video_device> m_segaic16vid; |
| r31825 | r31826 | |
| 114 | 123 | UINT8 m_vblank_irq_state; |
| 115 | 124 | UINT8 m_misc_io_data[0x10]; |
| 116 | 125 | bitmap_ind16 m_tmp_bitmap; |
| 117 | | |
| 118 | | public: |
| 119 | | // linkpcb support |
| 120 | | DECLARE_READ16_MEMBER(link_r); |
| 121 | | DECLARE_READ16_MEMBER(link2_r); |
| 122 | | DECLARE_WRITE16_MEMBER(link2_w); |
| 123 | | |
| 124 | | DECLARE_READ8_MEMBER(linkram_r); |
| 125 | | DECLARE_WRITE8_MEMBER(linkram_w); |
| 126 | | |
| 127 | | DECLARE_READ8_MEMBER(link_portc0_r); |
| 128 | | |
| 129 | | optional_shared_ptr<UINT8> m_linkram; |
| 130 | 126 | }; |