trunk/src/mess/drivers/pc9801.c
| r19306 | r19307 | |
| 275 | 275 | #define UPD1990A_TAG "upd1990a" |
| 276 | 276 | #define UPD8251_TAG "upd8251" |
| 277 | 277 | |
| 278 | #define DEBUG_PCG 1 |
| 279 | |
| 278 | 280 | class pc9801_state : public driver_device |
| 279 | 281 | { |
| 280 | 282 | public: |
| r19306 | r19307 | |
| 346 | 348 | UINT8 pal_entry; |
| 347 | 349 | UINT8 r[16],g[16],b[16]; |
| 348 | 350 | }m_analog16; |
| 349 | | UINT8 m_support_16_colors; |
| 350 | 351 | |
| 351 | 352 | /* PC9821 specific */ |
| 352 | 353 | UINT8 m_analog256,m_analog256e; |
| r19306 | r19307 | |
| 389 | 390 | DECLARE_WRITE8_MEMBER(pc9801_tvram_w); |
| 390 | 391 | DECLARE_READ8_MEMBER(pc9801_gvram_r); |
| 391 | 392 | DECLARE_WRITE8_MEMBER(pc9801_gvram_w); |
| 393 | DECLARE_READ8_MEMBER(pc9801_mouse_r); |
| 394 | DECLARE_WRITE8_MEMBER(pc9801_mouse_w); |
| 392 | 395 | // DECLARE_READ8_MEMBER(pc9801rs_gvram_r); |
| 393 | 396 | DECLARE_WRITE8_MEMBER(pc9801rs_gvram_w); |
| 394 | 397 | DECLARE_READ8_MEMBER(pc9801_opn_r); |
| r19306 | r19307 | |
| 515 | 518 | DECLARE_READ8_MEMBER(ppi_fdd_portb_r); |
| 516 | 519 | DECLARE_READ8_MEMBER(ppi_fdd_portc_r); |
| 517 | 520 | DECLARE_WRITE8_MEMBER(ppi_fdd_portc_w); |
| 521 | DECLARE_READ8_MEMBER(ppi_mouse_porta_r); |
| 522 | DECLARE_READ8_MEMBER(ppi_mouse_portb_r); |
| 523 | DECLARE_READ8_MEMBER(ppi_mouse_portc_r); |
| 524 | DECLARE_WRITE8_MEMBER(ppi_mouse_porta_w); |
| 525 | DECLARE_WRITE8_MEMBER(ppi_mouse_portb_w); |
| 526 | DECLARE_WRITE8_MEMBER(ppi_mouse_portc_w); |
| 527 | |
| 518 | 528 | DECLARE_WRITE_LINE_MEMBER(fdc_2hd_irq); |
| 519 | 529 | DECLARE_WRITE_LINE_MEMBER(fdc_2hd_drq); |
| 520 | 530 | DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq); |
| r19306 | r19307 | |
| 568 | 578 | return; |
| 569 | 579 | |
| 570 | 580 | interlace_on = state->m_video_ff[INTERLACE_REG]; |
| 571 | | colors16_mode = (state->m_ex_video_ff[0] && state->m_support_16_colors) ? 16 : 8; |
| 581 | colors16_mode = (state->m_ex_video_ff[0]) ? 16 : 8; |
| 572 | 582 | |
| 573 | 583 | for(xi=0;xi<8;xi++) |
| 574 | 584 | { |
| r19306 | r19307 | |
| 1349 | 1359 | } |
| 1350 | 1360 | } |
| 1351 | 1361 | |
| 1362 | READ8_MEMBER(pc9801_state::pc9801_mouse_r) |
| 1363 | { |
| 1364 | if((offset & 1) == 0) |
| 1365 | return 0xff; |
| 1366 | else |
| 1367 | { |
| 1368 | return machine().device<i8255_device>("ppi8255_mouse")->read(space, (offset & 6) >> 1); |
| 1369 | } |
| 1370 | } |
| 1352 | 1371 | |
| 1372 | WRITE8_MEMBER(pc9801_state::pc9801_mouse_w) |
| 1373 | { |
| 1374 | if((offset & 1) == 0) |
| 1375 | { |
| 1376 | //return 0xff; |
| 1377 | } |
| 1378 | else |
| 1379 | { |
| 1380 | machine().device<i8255_device>("ppi8255_mouse")->write(space, (offset & 6) >> 1,data); |
| 1381 | } |
| 1382 | } |
| 1383 | |
| 1384 | |
| 1353 | 1385 | static ADDRESS_MAP_START( pc9801_map, AS_PROGRAM, 16, pc9801_state ) |
| 1354 | 1386 | AM_RANGE(0x00000, 0x9ffff) AM_RAM //work RAM |
| 1355 | 1387 | AM_RANGE(0xa0000, 0xa3fff) AM_READWRITE8(pc9801_tvram_r,pc9801_tvram_w,0xffff) //TVRAM |
| r19306 | r19307 | |
| 1377 | 1409 | AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,pc9801_a0_w,0xffff) //upd7220 bitmap ports / display registers |
| 1378 | 1410 | AM_RANGE(0x00c8, 0x00cd) AM_READWRITE8(pc9801_fdc_2dd_r,pc9801_fdc_2dd_w,0xffff) //upd765a 2dd / <undefined> |
| 1379 | 1411 | AM_RANGE(0x0188, 0x018b) AM_READWRITE8(pc9801_opn_r,pc9801_opn_w,0xffff) //ym2203 opn / <undefined> |
| 1412 | AM_RANGE(0x7fd8, 0x7fdf) AM_READWRITE8(pc9801_mouse_r,pc9801_mouse_w,0xffff) // <undefined> / mouse ppi8255 ports |
| 1380 | 1413 | ADDRESS_MAP_END |
| 1381 | 1414 | |
| 1382 | 1415 | /************************************* |
| r19306 | r19307 | |
| 2713 | 2746 | DEVCB_DRIVER_MEMBER(pc9801_state,ppi_fdd_portc_w) /* Port C write */ |
| 2714 | 2747 | }; |
| 2715 | 2748 | |
| 2749 | READ8_MEMBER(pc9801_state::ppi_mouse_porta_r) |
| 2750 | { |
| 2751 | printf("A\n"); |
| 2752 | return 0xff; |
| 2753 | } |
| 2754 | |
| 2755 | READ8_MEMBER(pc9801_state::ppi_mouse_portb_r) |
| 2756 | { |
| 2757 | printf("B\n"); |
| 2758 | return 0xff; |
| 2759 | } |
| 2760 | |
| 2761 | READ8_MEMBER(pc9801_state::ppi_mouse_portc_r) |
| 2762 | { |
| 2763 | printf("C\n"); |
| 2764 | return 0xff; |
| 2765 | } |
| 2766 | |
| 2767 | WRITE8_MEMBER(pc9801_state::ppi_mouse_porta_w) |
| 2768 | { |
| 2769 | printf("A %02x\n",data); |
| 2770 | } |
| 2771 | |
| 2772 | WRITE8_MEMBER(pc9801_state::ppi_mouse_portb_w) |
| 2773 | { |
| 2774 | printf("B %02x\n",data); |
| 2775 | } |
| 2776 | |
| 2777 | WRITE8_MEMBER(pc9801_state::ppi_mouse_portc_w) |
| 2778 | { |
| 2779 | printf("C %02x\n",data); |
| 2780 | } |
| 2781 | |
| 2782 | static I8255A_INTERFACE( ppi_mouse_intf ) |
| 2783 | { |
| 2784 | DEVCB_DRIVER_MEMBER(pc9801_state,ppi_mouse_porta_r), /* Port A read */ |
| 2785 | DEVCB_DRIVER_MEMBER(pc9801_state,ppi_mouse_porta_w), /* Port A write */ |
| 2786 | DEVCB_DRIVER_MEMBER(pc9801_state,ppi_mouse_portb_r), /* Port B read */ |
| 2787 | DEVCB_DRIVER_MEMBER(pc9801_state,ppi_mouse_portb_w), /* Port B write */ |
| 2788 | DEVCB_DRIVER_MEMBER(pc9801_state,ppi_mouse_portc_r), /* Port C read */ |
| 2789 | DEVCB_DRIVER_MEMBER(pc9801_state,ppi_mouse_portc_w) /* Port C write */ |
| 2790 | }; |
| 2791 | |
| 2716 | 2792 | /**************************************** |
| 2717 | 2793 | * |
| 2718 | 2794 | * UPD765 interface |
| r19306 | r19307 | |
| 2824 | 2900 | m_ipl_rom = memregion("ipl")->base(); |
| 2825 | 2901 | m_pcg_ram = auto_alloc_array(machine(), UINT8, 0x80000); |
| 2826 | 2902 | |
| 2827 | | m_support_16_colors = 0; |
| 2828 | 2903 | state_save_register_global_pointer(machine(), m_pcg_ram, 0x80000); |
| 2829 | 2904 | } |
| 2830 | 2905 | |
| r19306 | r19307 | |
| 2868 | 2943 | state_save_register_global_pointer(machine(), m_work_ram, 0xa0000); |
| 2869 | 2944 | state_save_register_global_pointer(machine(), m_ext_work_ram, 0x700000); |
| 2870 | 2945 | |
| 2871 | | m_support_16_colors = 1; |
| 2872 | | |
| 2873 | 2946 | upd765a_device *fdc; |
| 2874 | 2947 | fdc = machine().device<upd765a_device>(":upd765_2hd"); |
| 2875 | 2948 | fdc->setup_intrq_cb(upd765a_device::line_cb(FUNC(pc9801_state::pc9801rs_fdc_irq), this)); |
| r19306 | r19307 | |
| 3032 | 3105 | MCFG_I8255_ADD( "ppi8255_sys", ppi_system_intf ) |
| 3033 | 3106 | MCFG_I8255_ADD( "ppi8255_prn", ppi_printer_intf ) |
| 3034 | 3107 | MCFG_I8255_ADD( "ppi8255_fdd", ppi_fdd_intf ) |
| 3108 | MCFG_I8255_ADD( "ppi8255_mouse", ppi_mouse_intf ) |
| 3035 | 3109 | MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, pc9801_upd1990a_intf) |
| 3036 | 3110 | MCFG_I8251_ADD(UPD8251_TAG, pc9801_uart_interface) |
| 3037 | 3111 | |