trunk/src/mess/drivers/pc9801.c
| r19339 | r19340 | |
| 491 | 491 | DECLARE_MACHINE_START(pc9801rs); |
| 492 | 492 | DECLARE_MACHINE_START(pc9821); |
| 493 | 493 | |
| 494 | | DECLARE_MACHINE_RESET(pc9801); |
| 494 | DECLARE_MACHINE_RESET(pc9801_common); |
| 495 | 495 | DECLARE_MACHINE_RESET(pc9801f); |
| 496 | 496 | DECLARE_MACHINE_RESET(pc9801rs); |
| 497 | 497 | DECLARE_MACHINE_RESET(pc9821); |
| r19339 | r19340 | |
| 522 | 522 | DECLARE_READ8_MEMBER(ppi_fdd_portb_r); |
| 523 | 523 | DECLARE_READ8_MEMBER(ppi_fdd_portc_r); |
| 524 | 524 | DECLARE_WRITE8_MEMBER(ppi_fdd_portc_w); |
| 525 | |
| 526 | DECLARE_WRITE_LINE_MEMBER(fdc_2hd_irq); |
| 527 | DECLARE_WRITE_LINE_MEMBER(fdc_2hd_drq); |
| 528 | DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq); |
| 529 | DECLARE_WRITE_LINE_MEMBER(fdc_2dd_drq); |
| 530 | // DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_irq); |
| 531 | |
| 525 | 532 | DECLARE_READ8_MEMBER(ppi_mouse_porta_r); |
| 526 | 533 | DECLARE_READ8_MEMBER(ppi_mouse_portb_r); |
| 527 | 534 | DECLARE_READ8_MEMBER(ppi_mouse_portc_r); |
| 528 | 535 | DECLARE_WRITE8_MEMBER(ppi_mouse_porta_w); |
| 529 | 536 | DECLARE_WRITE8_MEMBER(ppi_mouse_portb_w); |
| 530 | 537 | DECLARE_WRITE8_MEMBER(ppi_mouse_portc_w); |
| 538 | struct{ |
| 539 | UINT8 control; |
| 540 | UINT8 lx; |
| 541 | UINT8 ly; |
| 542 | }m_mouse; |
| 543 | TIMER_DEVICE_CALLBACK_MEMBER( mouse_irq_cb ); |
| 531 | 544 | |
| 532 | | DECLARE_WRITE_LINE_MEMBER(fdc_2hd_irq); |
| 533 | | DECLARE_WRITE_LINE_MEMBER(fdc_2hd_drq); |
| 534 | | DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq); |
| 535 | | DECLARE_WRITE_LINE_MEMBER(fdc_2dd_drq); |
| 536 | | // DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_irq); |
| 537 | | |
| 538 | 545 | void pc9801_fdc_2hd_update_ready(floppy_image_device *, int); |
| 539 | 546 | inline UINT32 m_calc_grcg_addr(int i,UINT32 offset); |
| 540 | 547 | }; |
| r19339 | r19340 | |
| 2553 | 2560 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Joystick Button 2") |
| 2554 | 2561 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 2555 | 2562 | |
| 2563 | PORT_START("MOUSE_X") |
| 2564 | PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_RESET PORT_SENSITIVITY(30) PORT_KEYDELTA(30) |
| 2565 | |
| 2566 | PORT_START("MOUSE_Y") |
| 2567 | PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y ) PORT_RESET PORT_SENSITIVITY(30) PORT_KEYDELTA(30) |
| 2568 | |
| 2569 | PORT_START("MOUSE_B") |
| 2570 | PORT_BIT(0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 2571 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_CODE(MOUSECODE_BUTTON3) PORT_NAME("Mouse Middle Button") |
| 2572 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CODE(MOUSECODE_BUTTON2) PORT_NAME("Mouse Right Button") |
| 2573 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CODE(MOUSECODE_BUTTON1) PORT_NAME("Mouse Left Button") |
| 2574 | |
| 2556 | 2575 | PORT_START("ROM_LOAD") |
| 2557 | 2576 | PORT_CONFNAME( 0x01, 0x01, "Load floppy 2hd BIOS" ) |
| 2558 | 2577 | PORT_CONFSETTING( 0x00, DEF_STR( Yes ) ) |
| r19339 | r19340 | |
| 2634 | 2653 | ir4 rs-232c |
| 2635 | 2654 | ir5 |
| 2636 | 2655 | ir6 |
| 2637 | | ir7 |
| 2656 | ir7 slave irq |
| 2638 | 2657 | |
| 2639 | 2658 | 8259 slave: |
| 2640 | | ir0 <connection with master 8259?> |
| 2659 | ir0 printer |
| 2641 | 2660 | ir1 |
| 2642 | 2661 | ir2 2dd floppy irq |
| 2643 | 2662 | ir3 2hd floppy irq |
| 2644 | 2663 | ir4 opn |
| 2645 | | ir5 |
| 2664 | ir5 mouse |
| 2646 | 2665 | ir6 |
| 2647 | 2666 | ir7 |
| 2648 | 2667 | */ |
| r19339 | r19340 | |
| 2893 | 2912 | |
| 2894 | 2913 | READ8_MEMBER(pc9801_state::ppi_mouse_porta_r) |
| 2895 | 2914 | { |
| 2896 | | printf("A\n"); |
| 2897 | | return 0xff; |
| 2915 | UINT8 res; |
| 2916 | UINT8 isporthi; |
| 2917 | const char *const mousenames[] = { "MOUSE_X", "MOUSE_Y" }; |
| 2918 | |
| 2919 | res = ioport("MOUSE_B")->read() & 0xe0; |
| 2920 | isporthi = ((m_mouse.control & 0x20) >> 5)*4; |
| 2921 | |
| 2922 | if((m_mouse.control & 0x80) == 0) |
| 2923 | res |= ioport(mousenames[(m_mouse.control & 0x40) >> 6])->read() >> (isporthi) & 0xf; |
| 2924 | else |
| 2925 | { |
| 2926 | if(m_mouse.control & 0x40) |
| 2927 | res |= (m_mouse.ly >> isporthi) & 0xf; |
| 2928 | else |
| 2929 | res |= (m_mouse.lx >> isporthi) & 0xf; |
| 2930 | } |
| 2931 | |
| 2932 | // printf("A\n"); |
| 2933 | return res; |
| 2898 | 2934 | } |
| 2899 | 2935 | |
| 2900 | 2936 | READ8_MEMBER(pc9801_state::ppi_mouse_portb_r) |
| r19339 | r19340 | |
| 2921 | 2957 | |
| 2922 | 2958 | WRITE8_MEMBER(pc9801_state::ppi_mouse_portc_w) |
| 2923 | 2959 | { |
| 2924 | | printf("C %02x\n",data); |
| 2960 | if((m_mouse.control & 0x80) == 0 && data & 0x80) |
| 2961 | { |
| 2962 | m_mouse.lx = ioport("MOUSE_X")->read(); |
| 2963 | m_mouse.ly = ioport("MOUSE_Y")->read(); |
| 2964 | } |
| 2965 | |
| 2966 | m_mouse.control = data; |
| 2925 | 2967 | } |
| 2926 | 2968 | |
| 2927 | 2969 | static I8255A_INTERFACE( ppi_mouse_intf ) |
| r19339 | r19340 | |
| 3107 | 3149 | state_save_register_global_pointer(machine(), m_ext_gvram, 0xa0000); |
| 3108 | 3150 | } |
| 3109 | 3151 | |
| 3110 | | MACHINE_RESET_MEMBER(pc9801_state,pc9801) |
| 3152 | MACHINE_RESET_MEMBER(pc9801_state,pc9801_common) |
| 3111 | 3153 | { |
| 3112 | 3154 | |
| 3113 | 3155 | /* this looks like to be some kind of backup ram, system will boot with green colors otherwise */ |
| r19339 | r19340 | |
| 3127 | 3169 | beep_set_state(machine().device(BEEPER_TAG),0); |
| 3128 | 3170 | |
| 3129 | 3171 | m_nmi_ff = 0; |
| 3172 | m_mouse.control = 0xff; |
| 3130 | 3173 | } |
| 3131 | 3174 | |
| 3132 | 3175 | MACHINE_RESET_MEMBER(pc9801_state,pc9801f) |
| 3133 | 3176 | { |
| 3134 | | MACHINE_RESET_CALL_MEMBER(pc9801); |
| 3177 | MACHINE_RESET_CALL_MEMBER(pc9801_common); |
| 3135 | 3178 | |
| 3136 | 3179 | /* 2dd interface ready line is ON by default */ |
| 3137 | 3180 | floppy_image_device *floppy; |
| r19339 | r19340 | |
| 3164 | 3207 | |
| 3165 | 3208 | MACHINE_RESET_MEMBER(pc9801_state,pc9801rs) |
| 3166 | 3209 | { |
| 3167 | | MACHINE_RESET_CALL_MEMBER(pc9801); |
| 3210 | MACHINE_RESET_CALL_MEMBER(pc9801_common); |
| 3168 | 3211 | |
| 3169 | 3212 | m_gate_a20 = 0; |
| 3170 | 3213 | m_rom_bank = 0; |
| r19339 | r19340 | |
| 3235 | 3278 | FLOPPY_PC98FDI_FORMAT |
| 3236 | 3279 | FLOPPY_FORMATS_END |
| 3237 | 3280 | |
| 3281 | TIMER_DEVICE_CALLBACK_MEMBER( pc9801_state::mouse_irq_cb ) |
| 3282 | { |
| 3283 | if((m_mouse.control & 0x10) == 0) |
| 3284 | { |
| 3285 | pic8259_ir5_w(machine().device("pic8259_slave"), 0); |
| 3286 | pic8259_ir5_w(machine().device("pic8259_slave"), 1); |
| 3287 | } |
| 3288 | } |
| 3289 | |
| 3290 | static MACHINE_CONFIG_FRAGMENT( pc9801_mouse ) |
| 3291 | MCFG_I8255_ADD( "ppi8255_mouse", ppi_mouse_intf ) |
| 3292 | |
| 3293 | MCFG_TIMER_DRIVER_ADD_PERIODIC("mouse_timer", pc9801_state, mouse_irq_cb, attotime::from_hz(120)) |
| 3294 | MACHINE_CONFIG_END |
| 3295 | |
| 3296 | |
| 3238 | 3297 | static MACHINE_CONFIG_START( pc9801, pc9801_state ) |
| 3239 | 3298 | MCFG_CPU_ADD("maincpu", I8086, 5000000) //unknown clock |
| 3240 | 3299 | MCFG_CPU_PROGRAM_MAP(pc9801_map) |
| r19339 | r19340 | |
| 3251 | 3310 | MCFG_I8255_ADD( "ppi8255_sys", ppi_system_intf ) |
| 3252 | 3311 | MCFG_I8255_ADD( "ppi8255_prn", ppi_printer_intf ) |
| 3253 | 3312 | MCFG_I8255_ADD( "ppi8255_fdd", ppi_fdd_intf ) |
| 3254 | | MCFG_I8255_ADD( "ppi8255_mouse", ppi_mouse_intf ) |
| 3313 | MCFG_FRAGMENT_ADD(pc9801_mouse) |
| 3255 | 3314 | MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, pc9801_upd1990a_intf) |
| 3256 | 3315 | MCFG_I8251_ADD(UPD8251_TAG, pc9801_uart_interface) |
| 3257 | 3316 | |
| r19339 | r19340 | |
| 3320 | 3379 | MCFG_I8255_ADD( "ppi8255_sys", ppi_system_intf ) |
| 3321 | 3380 | MCFG_I8255_ADD( "ppi8255_prn", ppi_printer_intf ) |
| 3322 | 3381 | MCFG_I8255_ADD( "ppi8255_fdd", ppi_fdd_intf ) |
| 3323 | | MCFG_I8255_ADD( "ppi8255_mouse", ppi_mouse_intf ) |
| 3382 | MCFG_FRAGMENT_ADD(pc9801_mouse) |
| 3324 | 3383 | MCFG_UPD1990A_ADD("upd1990a", XTAL_32_768kHz, pc9801_upd1990a_intf) |
| 3325 | 3384 | MCFG_I8251_ADD(UPD8251_TAG, pc9801_uart_interface) |
| 3326 | 3385 | |
| r19339 | r19340 | |
| 3383 | 3442 | MCFG_I8255_ADD( "ppi8255_sys", ppi_system_intf ) |
| 3384 | 3443 | MCFG_I8255_ADD( "ppi8255_prn", ppi_printer_intf ) |
| 3385 | 3444 | MCFG_I8255_ADD( "ppi8255_fdd", ppi_fdd_intf ) |
| 3386 | | MCFG_I8255_ADD( "ppi8255_mouse", ppi_mouse_intf ) |
| 3445 | MCFG_FRAGMENT_ADD(pc9801_mouse) |
| 3387 | 3446 | MCFG_UPD1990A_ADD("upd1990a", XTAL_32_768kHz, pc9801_upd1990a_intf) |
| 3388 | 3447 | MCFG_I8251_ADD(UPD8251_TAG, pc9801_uart_interface) |
| 3389 | 3448 | |