src/mess/drivers/x1.c
| r13655 | r13656 | |
| 217 | 217 | #include "video/mc6845.h" |
| 218 | 218 | #include "sound/2151intf.h" |
| 219 | 219 | #include "sound/wave.h" |
| 220 | | |
| 221 | 220 | #include "machine/wd17xx.h" |
| 222 | 221 | #include "imagedev/cassette.h" |
| 223 | 222 | #include "imagedev/flopdrv.h" |
| r13655 | r13656 | |
| 242 | 241 | * |
| 243 | 242 | *************************************/ |
| 244 | 243 | |
| 245 | | static VIDEO_START( x1 ) |
| 244 | VIDEO_START( x1 ) |
| 246 | 245 | { |
| 247 | 246 | x1_state *state = machine.driver_data<x1_state>(); |
| 248 | 247 | |
| r13655 | r13656 | |
| 827 | 826 | logerror("CMT: Command 0xe9-0x%02x received.\n",cmd); |
| 828 | 827 | } |
| 829 | 828 | |
| 830 | | static TIMER_DEVICE_CALLBACK( x1_cmt_wind_timer ) |
| 829 | TIMER_DEVICE_CALLBACK( x1_cmt_wind_timer ) |
| 831 | 830 | { |
| 832 | 831 | x1_state *state = timer.machine().driver_data<x1_state>(); |
| 833 | 832 | cassette_image_device* cmt = timer.machine().device<cassette_image_device>(CASSETTE_TAG); |
| r13655 | r13656 | |
| 1611 | 1610 | WRITE8_HANDLER( x1turbo_bank_w ) |
| 1612 | 1611 | { |
| 1613 | 1612 | x1_state *state = space->machine().driver_data<x1_state>(); |
| 1614 | | //UINT8 *RAM = space->machine().region("maincpu")->base(); |
| 1613 | //UINT8 *RAM = space->machine().region("x1_cpu")->base(); |
| 1615 | 1614 | /* |
| 1616 | 1615 | --x- ---- BML5: latch bit (doesn't have any real function) |
| 1617 | 1616 | ---x ---- BMCS: select bank RAM, active low |
| r13655 | r13656 | |
| 2007 | 2006 | |
| 2008 | 2007 | static Z80DMA_INTERFACE( x1_dma ) |
| 2009 | 2008 | { |
| 2010 | | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_HALT), |
| 2011 | | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), |
| 2009 | DEVCB_CPU_INPUT_LINE("x1_cpu", INPUT_LINE_HALT), |
| 2010 | DEVCB_CPU_INPUT_LINE("x1_cpu", INPUT_LINE_IRQ0), |
| 2012 | 2011 | DEVCB_NULL, |
| 2013 | | DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, memory_read_byte), |
| 2014 | | DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, memory_write_byte), |
| 2015 | | DEVCB_MEMORY_HANDLER("maincpu", IO, memory_read_byte), |
| 2016 | | DEVCB_MEMORY_HANDLER("maincpu", IO, memory_write_byte) |
| 2012 | DEVCB_MEMORY_HANDLER("x1_cpu", PROGRAM, memory_read_byte), |
| 2013 | DEVCB_MEMORY_HANDLER("x1_cpu", PROGRAM, memory_write_byte), |
| 2014 | DEVCB_MEMORY_HANDLER("x1_cpu", IO, memory_read_byte), |
| 2015 | DEVCB_MEMORY_HANDLER("x1_cpu", IO, memory_write_byte) |
| 2017 | 2016 | }; |
| 2018 | 2017 | |
| 2019 | 2018 | /************************************* |
| r13655 | r13656 | |
| 2024 | 2023 | |
| 2025 | 2024 | static INPUT_CHANGED( ipl_reset ) |
| 2026 | 2025 | { |
| 2027 | | //address_space *space = field.machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 2026 | //address_space *space = field.machine().device("x1_cpu")->memory().space(AS_PROGRAM); |
| 2028 | 2027 | x1_state *state = field.machine().driver_data<x1_state>(); |
| 2029 | 2028 | |
| 2030 | | cputag_set_input_line(field.machine(), "maincpu", INPUT_LINE_RESET, newval ? CLEAR_LINE : ASSERT_LINE); |
| 2029 | device_set_input_line(state->m_x1_cpu, INPUT_LINE_RESET, newval ? CLEAR_LINE : ASSERT_LINE); |
| 2031 | 2030 | |
| 2032 | 2031 | state->m_ram_bank = 0x00; |
| 2033 | 2032 | if(state->m_is_turbo) { state->m_ex_bank = 0x10; } |
| r13655 | r13656 | |
| 2037 | 2036 | /* Apparently most games doesn't support this (not even the Konami ones!), one that does is...177 :o */ |
| 2038 | 2037 | static INPUT_CHANGED( nmi_reset ) |
| 2039 | 2038 | { |
| 2040 | | cputag_set_input_line(field.machine(), "maincpu", INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE); |
| 2039 | x1_state *state = field.machine().driver_data<x1_state>(); |
| 2040 | |
| 2041 | device_set_input_line(state->m_x1_cpu, INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE); |
| 2041 | 2042 | } |
| 2042 | 2043 | |
| 2043 | 2044 | INPUT_PORTS_START( x1 ) |
| r13655 | r13656 | |
| 2371 | 2372 | static Z80CTC_INTERFACE( ctc_intf ) |
| 2372 | 2373 | { |
| 2373 | 2374 | 0, // timer disables |
| 2374 | | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), // interrupt handler |
| 2375 | DEVCB_CPU_INPUT_LINE("x1_cpu", INPUT_LINE_IRQ0), // interrupt handler |
| 2375 | 2376 | DEVCB_LINE(z80ctc_trg3_w), // ZC/TO0 callback |
| 2376 | 2377 | DEVCB_LINE(z80ctc_trg1_w), // ZC/TO1 callback |
| 2377 | 2378 | DEVCB_LINE(z80ctc_trg2_w), // ZC/TO2 callback |
| r13655 | r13656 | |
| 2408 | 2409 | DEVCB_NULL, |
| 2409 | 2410 | DEVCB_NULL, |
| 2410 | 2411 | |
| 2411 | | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0) |
| 2412 | DEVCB_CPU_INPUT_LINE("x1_cpu", INPUT_LINE_IRQ0) |
| 2412 | 2413 | }; |
| 2413 | 2414 | |
| 2414 | 2415 | static const z80_daisy_config x1_daisy[] = |
| r13655 | r13656 | |
| 2492 | 2493 | TIMER_DEVICE_CALLBACK(x1_keyboard_callback) |
| 2493 | 2494 | { |
| 2494 | 2495 | x1_state *state = timer.machine().driver_data<x1_state>(); |
| 2495 | | address_space *space = timer.machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 2496 | address_space *space = timer.machine().device("x1_cpu")->memory().space(AS_PROGRAM); |
| 2496 | 2497 | UINT32 key1 = input_port_read(timer.machine(),"key1"); |
| 2497 | 2498 | UINT32 key2 = input_port_read(timer.machine(),"key2"); |
| 2498 | 2499 | UINT32 key3 = input_port_read(timer.machine(),"key3"); |
| r13655 | r13656 | |
| 2510 | 2511 | x1_sub_io_w(space,0,0xe6); |
| 2511 | 2512 | state->m_irq_vector = state->m_key_irq_vector; |
| 2512 | 2513 | state->m_key_irq_flag = 1; |
| 2513 | | cputag_set_input_line(timer.machine(),"maincpu",0,ASSERT_LINE); |
| 2514 | cputag_set_input_line(timer.machine(),"x1_cpu",0,ASSERT_LINE); |
| 2514 | 2515 | state->m_old_key1 = key1; |
| 2515 | 2516 | state->m_old_key2 = key2; |
| 2516 | 2517 | state->m_old_key3 = key3; |
| r13655 | r13656 | |
| 2551 | 2552 | MACHINE_RESET( x1 ) |
| 2552 | 2553 | { |
| 2553 | 2554 | x1_state *state = machine.driver_data<x1_state>(); |
| 2554 | | //UINT8 *ROM = machine.region("maincpu")->base(); |
| 2555 | //UINT8 *ROM = machine.region("x1_cpu")->base(); |
| 2555 | 2556 | UINT8 *PCG_RAM = machine.region("pcg")->base(); |
| 2556 | 2557 | int i; |
| 2557 | 2558 | |
| r13655 | r13656 | |
| 2567 | 2568 | |
| 2568 | 2569 | state->m_io_bank_mode = 0; |
| 2569 | 2570 | |
| 2570 | | //device_set_irq_callback(machine.device("maincpu"), x1_irq_callback); |
| 2571 | //device_set_irq_callback(machine.device("x1_cpu"), x1_irq_callback); |
| 2571 | 2572 | |
| 2572 | 2573 | state->m_cmt_current_cmd = 0; |
| 2573 | 2574 | state->m_cmt_test = 0; |
| r13655 | r13656 | |
| 2657 | 2658 | |
| 2658 | 2659 | static MACHINE_CONFIG_START( x1, x1_state ) |
| 2659 | 2660 | /* basic machine hardware */ |
| 2660 | | MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4) |
| 2661 | MCFG_CPU_ADD("x1_cpu", Z80, MAIN_CLOCK/4) |
| 2661 | 2662 | MCFG_CPU_PROGRAM_MAP(x1_mem) |
| 2662 | 2663 | MCFG_CPU_IO_MAP(x1_io) |
| 2663 | 2664 | MCFG_CPU_CONFIG(x1_daisy) |
| r13655 | r13656 | |
| 2714 | 2715 | MCFG_SOFTWARE_LIST_ADD("flop_list","x1_flop") |
| 2715 | 2716 | |
| 2716 | 2717 | MCFG_TIMER_ADD_PERIODIC("keyboard_timer", x1_keyboard_callback, attotime::from_hz(250)) |
| 2717 | | MCFG_TIMER_ADD_PERIODIC("x1_cmt_wind_timer", x1_cmt_wind_timer, attotime::from_hz(16)) |
| 2718 | MCFG_TIMER_ADD_PERIODIC("cmt_wind_timer", x1_cmt_wind_timer, attotime::from_hz(16)) |
| 2718 | 2719 | MACHINE_CONFIG_END |
| 2719 | 2720 | |
| 2720 | 2721 | static MACHINE_CONFIG_DERIVED( x1turbo, x1 ) |
| 2721 | 2722 | |
| 2722 | | MCFG_CPU_MODIFY("maincpu") |
| 2723 | MCFG_CPU_MODIFY("x1_cpu") |
| 2723 | 2724 | MCFG_CPU_PROGRAM_MAP(x1turbo_mem) |
| 2724 | 2725 | MCFG_CPU_IO_MAP(x1turbo_io) |
| 2725 | 2726 | MCFG_CPU_CONFIG(x1turbo_daisy) |
| r13655 | r13656 | |
| 2746 | 2747 | *************************************/ |
| 2747 | 2748 | |
| 2748 | 2749 | ROM_START( x1 ) |
| 2749 | | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 2750 | ROM_REGION( 0x10000, "x1_cpu", ROMREGION_ERASEFF ) |
| 2750 | 2751 | |
| 2751 | 2752 | ROM_REGION( 0x8000, "ipl", ROMREGION_ERASEFF ) |
| 2752 | 2753 | ROM_LOAD( "ipl.x1", 0x0000, 0x1000, CRC(7b28d9de) SHA1(c4db9a6e99873808c8022afd1c50fef556a8b44d) ) |
| r13655 | r13656 | |
| 2775 | 2776 | ROM_CART_LOAD("cart", 0x0000, 0xffffff, ROM_OPTIONAL | ROM_NOMIRROR) |
| 2776 | 2777 | ROM_END |
| 2777 | 2778 | |
| 2778 | | ROM_START( x1twin ) |
| 2779 | | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 2780 | | |
| 2781 | | ROM_REGION( 0x8000, "ipl", ROMREGION_ERASEFF ) |
| 2782 | | ROM_LOAD( "ipl.rom", 0x0000, 0x1000, CRC(e70011d3) SHA1(d3395e9aeb5b8bbba7654dd471bcd8af228ee69a) ) |
| 2783 | | |
| 2784 | | ROM_REGION( 0x10000, "wram", ROMREGION_ERASE00 ) |
| 2785 | | |
| 2786 | | ROM_REGION(0x1000, "mcu", ROMREGION_ERASEFF) //MCU for the Keyboard, "sub cpu" |
| 2787 | | ROM_LOAD( "80c48", 0x0000, 0x1000, NO_DUMP ) |
| 2788 | | |
| 2789 | | ROM_REGION( 0x1000000, "emm", ROMREGION_ERASEFF ) |
| 2790 | | |
| 2791 | | ROM_REGION(0x1800, "pcg", ROMREGION_ERASEFF) |
| 2792 | | |
| 2793 | | ROM_REGION(0x1000, "font", 0) //TODO: this contains 8x16 charset only, maybe it's possible that it derivates a 8x8 charset by skipping gfx lines? |
| 2794 | | ROM_LOAD( "ank16.rom", 0x0000, 0x1000, CRC(8f9fb213) SHA1(4f06d20c997a79ee6af954b69498147789bf1847) ) |
| 2795 | | |
| 2796 | | ROM_REGION(0x1800, "cgrom", 0) |
| 2797 | | ROM_LOAD("ank8.rom", 0x00000, 0x00800, CRC(e3995a57) SHA1(1c1a0d8c9f4c446ccd7470516b215ddca5052fb2) ) |
| 2798 | | ROM_COPY("font", 0x00000, 0x00800, 0x1000 ) |
| 2799 | | |
| 2800 | | ROM_REGION(0x20000, "kanji", ROMREGION_ERASEFF) |
| 2801 | | |
| 2802 | | ROM_REGION(0x20000, "raw_kanji", ROMREGION_ERASEFF) // these comes from x1 turbo |
| 2803 | | ROM_LOAD("kanji4.rom", 0x00000, 0x8000, BAD_DUMP CRC(3e39de89) SHA1(d3fd24892bb1948c4697dedf5ff065ff3eaf7562) ) |
| 2804 | | ROM_LOAD("kanji2.rom", 0x08000, 0x8000, BAD_DUMP CRC(e710628a) SHA1(103bbe459dc8da27a9400aa45b385255c18fcc75) ) |
| 2805 | | ROM_LOAD("kanji3.rom", 0x10000, 0x8000, BAD_DUMP CRC(8cae13ae) SHA1(273f3329c70b332f6a49a3a95e906bbfe3e9f0a1) ) |
| 2806 | | ROM_LOAD("kanji1.rom", 0x18000, 0x8000, BAD_DUMP CRC(5874f70b) SHA1(dad7ada1b70c45f1e9db11db273ef7b385ef4f17) ) |
| 2807 | | |
| 2808 | | ROM_REGION( 0x1000000, "cart_img", ROMREGION_ERASE00 ) |
| 2809 | | ROM_CART_LOAD("cart", 0x0000, 0xffffff, ROM_OPTIONAL | ROM_NOMIRROR) |
| 2810 | | ROM_END |
| 2811 | | |
| 2812 | 2779 | ROM_START( x1turbo ) |
| 2813 | | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 2780 | ROM_REGION( 0x10000, "x1_cpu", ROMREGION_ERASEFF ) |
| 2814 | 2781 | |
| 2815 | 2782 | ROM_REGION( 0x8000, "ipl", ROMREGION_ERASEFF ) |
| 2816 | 2783 | ROM_LOAD( "ipl.x1t", 0x0000, 0x8000, CRC(2e8b767c) SHA1(44620f57a25f0bcac2b57ca2b0f1ebad3bf305d3) ) |
| r13655 | r13656 | |
| 2846 | 2813 | ROM_END |
| 2847 | 2814 | |
| 2848 | 2815 | ROM_START( x1turbo40 ) |
| 2849 | | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 2816 | ROM_REGION( 0x10000, "x1_cpu", ROMREGION_ERASEFF ) |
| 2850 | 2817 | |
| 2851 | 2818 | ROM_REGION( 0x8000, "ipl", ROMREGION_ERASEFF ) |
| 2852 | 2819 | ROM_LOAD( "ipl.bin", 0x0000, 0x8000, CRC(112f80a2) SHA1(646cc3fb5d2d24ff4caa5167b0892a4196e9f843) ) |
| r13655 | r13656 | |
| 2881 | 2848 | |
| 2882 | 2849 | |
| 2883 | 2850 | /* Convert the ROM interleaving into something usable by the write handlers */ |
| 2884 | | static DRIVER_INIT( kanji ) |
| 2851 | DRIVER_INIT( x1_kanji ) |
| 2885 | 2852 | { |
| 2886 | 2853 | UINT32 i,j,k,l; |
| 2887 | 2854 | UINT8 *kanji = machine.region("kanji")->base(); |
| r13655 | r13656 | |
| 2904 | 2871 | |
| 2905 | 2872 | |
| 2906 | 2873 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 2907 | | COMP( 1982, x1, 0, 0, x1, x1, 0, "Sharp", "X1 (CZ-800C)", 0 ) |
| 2908 | | COMP( 1986, x1twin, x1, 0, x1, x1, kanji,"Sharp", "X1 Twin (CZ-830C)", GAME_NOT_WORKING ) |
| 2909 | | COMP( 1984, x1turbo, x1, 0, x1turbo, x1turbo, kanji,"Sharp", "X1 Turbo (CZ-850C)", GAME_NOT_WORKING ) //model 10 |
| 2910 | | COMP( 1985, x1turbo40, x1, 0, x1turbo, x1turbo, kanji,"Sharp", "X1 Turbo (CZ-862C)", 0 ) //model 40 |
| 2874 | COMP( 1982, x1, 0, 0, x1, x1, 0, "Sharp", "X1 (CZ-800C)", 0 ) |
| 2875 | // x1twin in x1twin.c |
| 2876 | COMP( 1984, x1turbo, x1, 0, x1turbo, x1turbo, x1_kanji,"Sharp", "X1 Turbo (CZ-850C)", GAME_NOT_WORKING ) //model 10 |
| 2877 | COMP( 1985, x1turbo40, x1, 0, x1turbo, x1turbo, x1_kanji,"Sharp", "X1 Turbo (CZ-862C)", 0 ) //model 40 |
| 2911 | 2878 | // x1turboz /* 1986 Sharp X1 TurboZ */ |