trunk/src/mess/drivers/megadriv.c
| r22071 | r22072 | |
| 34 | 34 | READ8_MEMBER(mess_md_io_read_data_port); |
| 35 | 35 | WRITE16_MEMBER(mess_md_io_write_data_port); |
| 36 | 36 | |
| 37 | DECLARE_MACHINE_START( ms_megadriv ); |
| 38 | DECLARE_MACHINE_RESET( ms_megadriv ); |
| 37 | 39 | }; |
| 38 | 40 | |
| 39 | 41 | class pico_state : public md_cons_state |
| r22071 | r22072 | |
| 49 | 51 | UINT16 pico_read_penpos(int pen); |
| 50 | 52 | DECLARE_READ16_HANDLER(pico_68k_io_read); |
| 51 | 53 | DECLARE_WRITE16_MEMBER(pico_68k_io_write); |
| 54 | DECLARE_MACHINE_START(pico); |
| 52 | 55 | }; |
| 53 | 56 | |
| 54 | 57 | |
| r22071 | r22072 | |
| 313 | 316 | } |
| 314 | 317 | } |
| 315 | 318 | |
| 316 | | static MACHINE_START( ms_megadriv ) |
| 319 | MACHINE_START_MEMBER(md_cons_state,ms_megadriv ) |
| 317 | 320 | { |
| 318 | | md_cons_state *state = machine.driver_data<md_cons_state>(); |
| 321 | init_megadri6_io(); |
| 319 | 322 | |
| 320 | | state->init_megadri6_io(); |
| 321 | | |
| 322 | 323 | vdp_get_word_from_68k_mem = vdp_get_word_from_68k_mem_console; |
| 323 | 324 | |
| 324 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7fffff, read16_delegate(FUNC(base_md_cart_slot_device::read),(base_md_cart_slot_device*)state->m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write),(base_md_cart_slot_device*)state->m_slotcart)); |
| 325 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a13),(base_md_cart_slot_device*)state->m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write_a13),(base_md_cart_slot_device*)state->m_slotcart)); |
| 326 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)state->m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)state->m_slotcart)); |
| 327 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)state->m_slotcart)); |
| 325 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7fffff, read16_delegate(FUNC(base_md_cart_slot_device::read),(base_md_cart_slot_device*)m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write),(base_md_cart_slot_device*)m_slotcart)); |
| 326 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a13),(base_md_cart_slot_device*)m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write_a13),(base_md_cart_slot_device*)m_slotcart)); |
| 327 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)m_slotcart)); |
| 328 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)m_slotcart)); |
| 328 | 329 | } |
| 329 | 330 | |
| 330 | | static MACHINE_RESET( ms_megadriv ) |
| 331 | MACHINE_RESET_MEMBER(md_cons_state,ms_megadriv ) |
| 331 | 332 | { |
| 332 | | MACHINE_RESET_CALL( megadriv ); |
| 333 | MACHINE_RESET_CALL_MEMBER( megadriv ); |
| 333 | 334 | } |
| 334 | 335 | |
| 335 | 336 | static SLOT_INTERFACE_START(md_cart) |
| r22071 | r22072 | |
| 393 | 394 | static MACHINE_CONFIG_START( ms_megadriv, md_cons_state ) |
| 394 | 395 | MCFG_FRAGMENT_ADD( md_ntsc ) |
| 395 | 396 | |
| 396 | | MCFG_MACHINE_START( ms_megadriv ) |
| 397 | | MCFG_MACHINE_RESET( ms_megadriv ) |
| 397 | MCFG_MACHINE_START_OVERRIDE( md_cons_state, ms_megadriv ) |
| 398 | MCFG_MACHINE_RESET_OVERRIDE( md_cons_state, ms_megadriv ) |
| 398 | 399 | |
| 399 | 400 | MCFG_MD_CARTRIDGE_ADD("mdslot", md_cart, NULL, NULL) |
| 400 | 401 | MCFG_SOFTWARE_LIST_ADD("cart_list","megadriv") |
| r22071 | r22072 | |
| 403 | 404 | static MACHINE_CONFIG_START( ms_megadpal, md_cons_state ) |
| 404 | 405 | MCFG_FRAGMENT_ADD( md_pal ) |
| 405 | 406 | |
| 406 | | MCFG_MACHINE_START( ms_megadriv ) |
| 407 | | MCFG_MACHINE_RESET( ms_megadriv ) |
| 407 | MCFG_MACHINE_START_OVERRIDE( md_cons_state, ms_megadriv ) |
| 408 | MCFG_MACHINE_RESET_OVERRIDE( md_cons_state, ms_megadriv ) |
| 408 | 409 | |
| 409 | 410 | MCFG_MD_CARTRIDGE_ADD("mdslot", md_cart, NULL, NULL) |
| 410 | 411 | MCFG_SOFTWARE_LIST_ADD("cart_list","megadriv") |
| r22071 | r22072 | |
| 1014 | 1015 | SLOT_INTERFACE_INTERNAL("rom_sramsafe", MD_ROM_SRAM) // not sure these are needed... |
| 1015 | 1016 | SLOT_INTERFACE_END |
| 1016 | 1017 | |
| 1017 | | static MACHINE_START(pico) |
| 1018 | MACHINE_START_MEMBER(pico_state,pico) |
| 1018 | 1019 | { |
| 1019 | | pico_state *state = machine.driver_data<pico_state>(); |
| 1020 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7fffff, read16_delegate(FUNC(base_md_cart_slot_device::read),(base_md_cart_slot_device*)state->m_picocart), write16_delegate(FUNC(base_md_cart_slot_device::write),(base_md_cart_slot_device*)state->m_picocart)); |
| 1021 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a13),(base_md_cart_slot_device*)state->m_picocart), write16_delegate(FUNC(base_md_cart_slot_device::write_a13),(base_md_cart_slot_device*)state->m_picocart)); |
| 1022 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)state->m_picocart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)state->m_picocart)); |
| 1023 | | machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)state->m_picocart)); |
| 1020 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7fffff, read16_delegate(FUNC(base_md_cart_slot_device::read),(base_md_cart_slot_device*)m_picocart), write16_delegate(FUNC(base_md_cart_slot_device::write),(base_md_cart_slot_device*)m_picocart)); |
| 1021 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a13),(base_md_cart_slot_device*)m_picocart), write16_delegate(FUNC(base_md_cart_slot_device::write_a13),(base_md_cart_slot_device*)m_picocart)); |
| 1022 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)m_picocart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)m_picocart)); |
| 1023 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)m_picocart)); |
| 1024 | 1024 | } |
| 1025 | 1025 | |
| 1026 | 1026 | static MACHINE_CONFIG_START( pico, pico_state ) |
| r22071 | r22072 | |
| 1031 | 1031 | |
| 1032 | 1032 | MCFG_DEVICE_REMOVE("genesis_snd_z80") |
| 1033 | 1033 | |
| 1034 | | MCFG_MACHINE_START( pico ) |
| 1035 | | MCFG_MACHINE_RESET( ms_megadriv ) |
| 1034 | MCFG_MACHINE_START_OVERRIDE( pico_state, pico ) |
| 1035 | MCFG_MACHINE_RESET_OVERRIDE( pico_state, ms_megadriv ) |
| 1036 | 1036 | |
| 1037 | 1037 | MCFG_PICO_CARTRIDGE_ADD("picoslot", pico_cart, NULL, NULL) |
| 1038 | 1038 | MCFG_SOFTWARE_LIST_ADD("cart_list","pico") |
| r22071 | r22072 | |
| 1046 | 1046 | |
| 1047 | 1047 | MCFG_DEVICE_REMOVE("genesis_snd_z80") |
| 1048 | 1048 | |
| 1049 | | MCFG_MACHINE_START( pico ) |
| 1050 | | MCFG_MACHINE_RESET( ms_megadriv ) |
| 1049 | MCFG_MACHINE_START_OVERRIDE( pico_state, pico ) |
| 1050 | MCFG_MACHINE_RESET_OVERRIDE( pico_state, ms_megadriv ) |
| 1051 | 1051 | |
| 1052 | 1052 | MCFG_PICO_CARTRIDGE_ADD("picoslot", pico_cart, NULL, NULL) |
| 1053 | 1053 | MCFG_SOFTWARE_LIST_ADD("cart_list","pico") |
trunk/src/mame/machine/megadriv.c
| r22071 | r22072 | |
| 836 | 836 | |
| 837 | 837 | |
| 838 | 838 | |
| 839 | | SCREEN_UPDATE_RGB32(megadriv) |
| 839 | UINT32 md_base_state::screen_update_megadriv(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 840 | 840 | { |
| 841 | | sega_genesis_vdp_device *vdp = screen.machine().device<sega_genesis_vdp_device>("gen_vdp"); // yuck |
| 841 | sega_genesis_vdp_device *vdp = machine().device<sega_genesis_vdp_device>("gen_vdp"); // yuck |
| 842 | 842 | |
| 843 | 843 | /* Copy our screen buffer here */ |
| 844 | 844 | for (int y = cliprect.min_y; y <= cliprect.max_y; y++) |
| r22071 | r22072 | |
| 869 | 869 | |
| 870 | 870 | /*****************************************************************************************/ |
| 871 | 871 | |
| 872 | | |
| 873 | | MACHINE_START( megadriv ) |
| 872 | VIDEO_START_MEMBER(md_base_state,megadriv) |
| 874 | 873 | { |
| 875 | | md_base_state *state = machine.driver_data<md_base_state>(); |
| 876 | | if (state->m_megadrive_6buttons_pad) |
| 877 | | state->init_megadri6_io(); |
| 878 | 874 | } |
| 879 | 875 | |
| 880 | | MACHINE_RESET( megadriv ) |
| 876 | MACHINE_START_MEMBER(md_base_state,megadriv) |
| 881 | 877 | { |
| 882 | | md_base_state *state = machine.driver_data<md_base_state>(); |
| 878 | if (m_megadrive_6buttons_pad) |
| 879 | init_megadri6_io(); |
| 880 | } |
| 883 | 881 | |
| 882 | MACHINE_RESET_MEMBER(md_base_state,megadriv) |
| 883 | { |
| 884 | 884 | /* default state of z80 = reset, with bus */ |
| 885 | 885 | mame_printf_debug("Resetting Megadrive / Genesis\n"); |
| 886 | 886 | |
| 887 | | if (state->m_z80snd) |
| 887 | if (m_z80snd) |
| 888 | 888 | { |
| 889 | | state->m_genz80.z80_is_reset = 1; |
| 890 | | state->m_genz80.z80_has_bus = 1; |
| 891 | | state->m_genz80.z80_bank_addr = 0; |
| 892 | | state->m_vdp->set_scanline_counter(-1); |
| 893 | | machine.scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(md_base_state::megadriv_z80_run_state),state)); |
| 889 | m_genz80.z80_is_reset = 1; |
| 890 | m_genz80.z80_has_bus = 1; |
| 891 | m_genz80.z80_bank_addr = 0; |
| 892 | m_vdp->set_scanline_counter(-1); |
| 893 | machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(md_base_state::megadriv_z80_run_state),this)); |
| 894 | 894 | } |
| 895 | 895 | |
| 896 | | state->megadrive_reset_io(); |
| 896 | megadrive_reset_io(); |
| 897 | 897 | |
| 898 | | if (!state->m_vdp->m_use_alt_timing) |
| 898 | if (!m_vdp->m_use_alt_timing) |
| 899 | 899 | { |
| 900 | | megadriv_scanline_timer = machine.device<timer_device>("md_scan_timer"); |
| 900 | megadriv_scanline_timer = machine().device<timer_device>("md_scan_timer"); |
| 901 | 901 | megadriv_scanline_timer->adjust(attotime::zero); |
| 902 | 902 | } |
| 903 | 903 | |
| 904 | | if (state->m_other_hacks) |
| 904 | if (m_other_hacks) |
| 905 | 905 | { |
| 906 | 906 | // machine.device("maincpu")->set_clock_scale(0.9950f); /* Fatal Rewind is very fussy... (and doesn't work now anyway, so don't bother with this) */ |
| 907 | | if (state->m_megadrive_ram) |
| 908 | | memset(state->m_megadrive_ram,0x00,0x10000); |
| 907 | if (m_megadrive_ram) |
| 908 | memset(m_megadrive_ram,0x00,0x10000); |
| 909 | 909 | } |
| 910 | 910 | |
| 911 | | megadriv_reset_vdp(machine); |
| 911 | megadriv_reset_vdp(machine()); |
| 912 | 912 | |
| 913 | 913 | |
| 914 | 914 | // if the system has a 32x, pause the extra CPUs until they are actually turned on |
| 915 | | if (state->m_32x) |
| 916 | | state->m_32x->pause_cpu(); |
| 915 | if (m_32x) |
| 916 | m_32x->pause_cpu(); |
| 917 | 917 | } |
| 918 | 918 | |
| 919 | 919 | void md_base_state::megadriv_stop_scanline_timer() |
| r22071 | r22072 | |
| 1018 | 1018 | MCFG_CPU_IO_MAP(megadriv_z80_io_map) |
| 1019 | 1019 | /* IRQ handled via the timers */ |
| 1020 | 1020 | |
| 1021 | | MCFG_MACHINE_START(megadriv) |
| 1022 | | MCFG_MACHINE_RESET(megadriv) |
| 1021 | MCFG_MACHINE_START_OVERRIDE(md_base_state,megadriv) |
| 1022 | MCFG_MACHINE_RESET_OVERRIDE(md_base_state,megadriv) |
| 1023 | 1023 | |
| 1024 | 1024 | MCFG_FRAGMENT_ADD(megadriv_timers) |
| 1025 | 1025 | |
| r22071 | r22072 | |
| 1036 | 1036 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // Vblank handled manually. |
| 1037 | 1037 | MCFG_SCREEN_SIZE(64*8, 620) |
| 1038 | 1038 | MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 28*8-1) |
| 1039 | | MCFG_SCREEN_UPDATE_STATIC(megadriv) /* Copies a bitmap */ |
| 1040 | | MCFG_SCREEN_VBLANK_STATIC(megadriv) /* Used to Sync the timing */ |
| 1039 | MCFG_SCREEN_UPDATE_DRIVER(md_base_state,screen_update_megadriv) /* Copies a bitmap */ |
| 1040 | MCFG_SCREEN_VBLANK_DRIVER(md_base_state,screen_eof_megadriv) /* Used to Sync the timing */ |
| 1041 | 1041 | |
| 1042 | 1042 | MCFG_TIMER_ADD_SCANLINE("scantimer", megadriv_scanline_timer_callback_alt_timing, "megadriv", 0, 1) |
| 1043 | 1043 | |
| 1044 | 1044 | MCFG_PALETTE_LENGTH(0x200) |
| 1045 | 1045 | |
| 1046 | | MCFG_VIDEO_START(megadriv) |
| 1046 | MCFG_VIDEO_START_OVERRIDE(md_base_state,megadriv) |
| 1047 | 1047 | |
| 1048 | 1048 | /* sound hardware */ |
| 1049 | 1049 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| r22071 | r22072 | |
| 1071 | 1071 | MCFG_CPU_IO_MAP(megadriv_z80_io_map) |
| 1072 | 1072 | /* IRQ handled via the timers */ |
| 1073 | 1073 | |
| 1074 | | MCFG_MACHINE_START(megadriv) |
| 1075 | | MCFG_MACHINE_RESET(megadriv) |
| 1074 | MCFG_MACHINE_START_OVERRIDE(md_base_state,megadriv) |
| 1075 | MCFG_MACHINE_RESET_OVERRIDE(md_base_state,megadriv) |
| 1076 | 1076 | |
| 1077 | 1077 | MCFG_FRAGMENT_ADD(megadriv_timers) |
| 1078 | 1078 | |
| r22071 | r22072 | |
| 1087 | 1087 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // Vblank handled manually. |
| 1088 | 1088 | MCFG_SCREEN_SIZE(64*8, 620) |
| 1089 | 1089 | MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 28*8-1) |
| 1090 | | MCFG_SCREEN_UPDATE_STATIC(megadriv) /* Copies a bitmap */ |
| 1091 | | MCFG_SCREEN_VBLANK_STATIC(megadriv) /* Used to Sync the timing */ |
| 1090 | MCFG_SCREEN_UPDATE_DRIVER(md_base_state,screen_update_megadriv) /* Copies a bitmap */ |
| 1091 | MCFG_SCREEN_VBLANK_DRIVER(md_base_state,screen_eof_megadriv) /* Used to Sync the timing */ |
| 1092 | 1092 | |
| 1093 | 1093 | MCFG_PALETTE_LENGTH(0x200) |
| 1094 | 1094 | |
| 1095 | | MCFG_VIDEO_START(megadriv) |
| 1095 | MCFG_VIDEO_START_OVERRIDE(md_base_state,megadriv) |
| 1096 | 1096 | |
| 1097 | 1097 | /* sound hardware */ |
| 1098 | 1098 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| r22071 | r22072 | |
| 1341 | 1341 | |
| 1342 | 1342 | |
| 1343 | 1343 | |
| 1344 | | SCREEN_VBLANK(megadriv) |
| 1344 | void md_base_state::screen_eof_megadriv(screen_device &screen, bool state) |
| 1345 | 1345 | { |
| 1346 | | md_base_state *state = screen.machine().driver_data<md_base_state>(); |
| 1347 | | |
| 1348 | 1346 | if (screen.ioport(":RESET")->read_safe(0x00) & 0x01) |
| 1349 | | state->m_maincpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); |
| 1347 | m_maincpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); |
| 1350 | 1348 | |
| 1351 | 1349 | // rising edge |
| 1352 | | if (vblank_on) |
| 1350 | if (state) |
| 1353 | 1351 | { |
| 1354 | | if (!state->m_vdp->m_use_alt_timing) |
| 1352 | if (!m_vdp->m_use_alt_timing) |
| 1355 | 1353 | { |
| 1356 | | state->m_vdp->vdp_handle_eof(screen.machine()); |
| 1354 | m_vdp->vdp_handle_eof(machine()); |
| 1357 | 1355 | megadriv_scanline_timer->adjust(attotime::zero); |
| 1358 | 1356 | } |
| 1359 | 1357 | } |