branches/new_menus/src/mame/drivers/maygay1b.c
| r29542 | r29543 | |
| 512 | 512 | return (portnames[m_lamp_strobe&0x07])->read(); |
| 513 | 513 | } |
| 514 | 514 | |
| 515 | | /* |
| 516 | | static I8279_INTERFACE( m1_i8279_intf ) |
| 517 | | { |
| 518 | | DEVCB_NULL, // irq |
| 519 | | DEVCB_DRIVER_MEMBER(maygay1b_state, scanlines_w), // scan SL lines |
| 520 | | DEVCB_DRIVER_MEMBER(maygay1b_state, lamp_data_w), // display A&B |
| 521 | | DEVCB_NULL, // BD |
| 522 | | DEVCB_DRIVER_MEMBER(maygay1b_state,kbd_r), // kbd RL lines |
| 523 | | DEVCB_NULL, // Shift key |
| 524 | | DEVCB_NULL // Ctrl-Strobe line |
| 525 | | }; |
| 526 | | */ |
| 527 | | |
| 528 | | |
| 529 | | |
| 530 | 515 | WRITE8_MEMBER( maygay1b_state::lamp_data_2_w ) |
| 531 | 516 | { |
| 532 | 517 | //The two A/B ports are merged back into one, to make one row of 8 lamps. |
| r29542 | r29543 | |
| 546 | 531 | |
| 547 | 532 | } |
| 548 | 533 | |
| 549 | | /* |
| 550 | | static I8279_INTERFACE( m1_i8279_2_intf ) |
| 551 | | { |
| 552 | | DEVCB_NULL, // irq |
| 553 | | DEVCB_NULL, // scan SL lines |
| 554 | | DEVCB_DRIVER_MEMBER(maygay1b_state, lamp_data_2_w), // display A&B |
| 555 | | DEVCB_NULL, // BD |
| 556 | | DEVCB_NULL, // kbd RL lines |
| 557 | | DEVCB_NULL, // Shift key |
| 558 | | DEVCB_NULL // Ctrl-Strobe line |
| 559 | | }; |
| 560 | | */ |
| 561 | | |
| 562 | 534 | // machine driver for maygay m1 board ///////////////////////////////// |
| 563 | 535 | |
| 564 | 536 | |
| r29542 | r29543 | |
| 589 | 561 | |
| 590 | 562 | MCFG_TIMER_DRIVER_ADD_PERIODIC("nmitimer", maygay1b_state, maygay1b_nmitimer_callback, attotime::from_hz(75)) // freq? |
| 591 | 563 | MCFG_DEVICE_ADD("i8279", I8279, M1_MASTER_CLOCK/4) // unknown clock |
| 592 | | MCFG_DEVICE_ADD("i8279_2", I8279, M1_MASTER_CLOCK/4) // unknown clock |
| 593 | | |
| 594 | | // MCFG_I8279_ADD("i8279", M1_MASTER_CLOCK/4, m1_i8279_intf) // unknown clock |
| 595 | | // MCFG_I8279_ADD("i8279_2", M1_MASTER_CLOCK/4, m1_i8279_2_intf) // unknown clock |
| 596 | | |
| 564 | MCFG_I8279_OUT_SL_CB(WRITE8(maygay1b_state, scanlines_w)) // scan SL lines |
| 565 | MCFG_I8279_OUT_DISP_CB(WRITE8(maygay1b_state, lamp_data_w)) // display A&B |
| 566 | MCFG_I8279_IN_RL_CB(READ8(maygay1b_state, kbd_r)) // kbd RL lines |
| 567 | MCFG_DEVICE_ADD("i8279_2", I8279, M1_MASTER_CLOCK/4) // unknown clock |
| 568 | MCFG_I8279_OUT_DISP_CB(WRITE8(maygay1b_state, lamp_data_2_w)) // display A&B |
| 569 | |
| 597 | 570 | MCFG_NVRAM_ADD_0FILL("nvram") |
| 598 | 571 | |
| 599 | 572 | MCFG_DEFAULT_LAYOUT(layout_maygay1b) |
branches/new_menus/src/mame/drivers/blitz68k.c
| r29542 | r29543 | |
| 1716 | 1716 | AM_RANGE(0x000, 0x3ff) AM_DEVREADWRITE("ramdac",ramdac_device,ramdac_pal_r,ramdac_rgb666_w) |
| 1717 | 1717 | ADDRESS_MAP_END |
| 1718 | 1718 | |
| 1719 | | static RAMDAC_INTERFACE( ramdac_intf ) |
| 1720 | | { |
| 1721 | | 0 |
| 1722 | | }; |
| 1723 | | |
| 1724 | 1719 | static MACHINE_CONFIG_START( ilpag, blitz68k_state ) |
| 1725 | 1720 | MCFG_CPU_ADD("maincpu", M68000, 11059200 ) // ? |
| 1726 | 1721 | MCFG_CPU_PROGRAM_MAP(ilpag_map) |
| r29542 | r29543 | |
| 1739 | 1734 | |
| 1740 | 1735 | MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k) |
| 1741 | 1736 | |
| 1742 | | MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map, "palette") |
| 1737 | MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette") |
| 1743 | 1738 | |
| 1744 | 1739 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 1745 | 1740 | MCFG_DAC_ADD("dac") |
| r29542 | r29543 | |
| 1812 | 1807 | MCFG_PALETTE_ADD("palette", 0x100) |
| 1813 | 1808 | |
| 1814 | 1809 | MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k) |
| 1815 | | MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map, "palette") |
| 1810 | MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette") |
| 1816 | 1811 | |
| 1817 | 1812 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 1818 | 1813 | MCFG_DAC_ADD("dac") |
| r29542 | r29543 | |
| 1844 | 1839 | MCFG_PALETTE_ADD("palette", 0x100) |
| 1845 | 1840 | |
| 1846 | 1841 | MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k) |
| 1847 | | MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map, "palette") |
| 1842 | MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette") |
| 1848 | 1843 | |
| 1849 | 1844 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 1850 | 1845 | MCFG_DAC_ADD("dac") |
| r29542 | r29543 | |
| 1874 | 1869 | MCFG_PALETTE_ADD("palette", 0x100) |
| 1875 | 1870 | |
| 1876 | 1871 | MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k_addr_factor1) |
| 1877 | | MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map, "palette") |
| 1872 | MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette") |
| 1878 | 1873 | |
| 1879 | 1874 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 1880 | 1875 | MCFG_DAC_ADD("dac") |
| r29542 | r29543 | |
| 1903 | 1898 | MCFG_PALETTE_ADD("palette", 0x100) |
| 1904 | 1899 | |
| 1905 | 1900 | MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k) |
| 1906 | | MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map, "palette") |
| 1901 | MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette") |
| 1907 | 1902 | |
| 1908 | 1903 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 1909 | 1904 | MCFG_DAC_ADD("dac") |
| r29542 | r29543 | |
| 1934 | 1929 | MCFG_PALETTE_ADD("palette", 0x100) |
| 1935 | 1930 | |
| 1936 | 1931 | MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k) |
| 1937 | | MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map, "palette") |
| 1932 | MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette") |
| 1938 | 1933 | |
| 1939 | 1934 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 1940 | 1935 | MCFG_DAC_ADD("dac") |
| r29542 | r29543 | |
| 1963 | 1958 | MCFG_PALETTE_ADD("palette", 0x100) |
| 1964 | 1959 | |
| 1965 | 1960 | MCFG_VIDEO_START_OVERRIDE(blitz68k_state,blitz68k) |
| 1966 | | MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map, "palette") |
| 1961 | MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette") |
| 1967 | 1962 | |
| 1968 | 1963 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 1969 | 1964 | MCFG_DAC_ADD("dac") |
| r29542 | r29543 | |
| 1995 | 1990 | MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_11_0592MHz/4, mc6845_intf_irq3) |
| 1996 | 1991 | |
| 1997 | 1992 | MCFG_PALETTE_ADD("palette", 0x100) |
| 1998 | | MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map, "palette") |
| 1993 | MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette") |
| 1999 | 1994 | |
| 2000 | 1995 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 2001 | 1996 | MCFG_SAA1099_ADD("saa", XTAL_8MHz/2) |
branches/new_menus/src/mame/drivers/konamigx.c
| r29542 | r29543 | |
| 1651 | 1651 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| 1652 | 1652 | |
| 1653 | 1653 | MCFG_DEVICE_MODIFY("dasp") |
| 1654 | | MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) |
| 1655 | | MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) |
| 1654 | MCFG_SOUND_ROUTE(0, "lspeaker", 0.3) |
| 1655 | MCFG_SOUND_ROUTE(1, "rspeaker", 0.3) |
| 1656 | 1656 | |
| 1657 | 1657 | MCFG_K056800_ADD("k056800", XTAL_18_432MHz) |
| 1658 | 1658 | MCFG_K056800_INT_HANDLER(INPUTLINE("soundcpu", M68K_IRQ_1)) |
| 1659 | 1659 | |
| 1660 | 1660 | MCFG_K054539_ADD("k054539_1", XTAL_18_432MHz, k054539_config) |
| 1661 | 1661 | MCFG_K054539_TIMER_HANDLER(WRITELINE(konamigx_state, k054539_irq_gen)) |
| 1662 | | MCFG_SOUND_ROUTE_EX(0, "dasp", 0.9, 0) |
| 1663 | | MCFG_SOUND_ROUTE_EX(1, "dasp", 0.9, 1) |
| 1662 | MCFG_SOUND_ROUTE_EX(0, "dasp", 0.5, 0) |
| 1663 | MCFG_SOUND_ROUTE_EX(1, "dasp", 0.5, 1) |
| 1664 | 1664 | MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) |
| 1665 | 1665 | MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) |
| 1666 | 1666 | |
| 1667 | 1667 | MCFG_K054539_ADD("k054539_2", XTAL_18_432MHz, k054539_config) |
| 1668 | | MCFG_SOUND_ROUTE_EX(0, "dasp", 0.9, 2) |
| 1669 | | MCFG_SOUND_ROUTE_EX(1, "dasp", 0.9, 3) |
| 1668 | MCFG_SOUND_ROUTE_EX(0, "dasp", 0.5, 2) |
| 1669 | MCFG_SOUND_ROUTE_EX(1, "dasp", 0.5, 3) |
| 1670 | 1670 | MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) |
| 1671 | 1671 | MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) |
| 1672 | 1672 | MACHINE_CONFIG_END |
branches/new_menus/src/mame/drivers/namcos12.c
| r29542 | r29543 | |
| 1077 | 1077 | |
| 1078 | 1078 | int m_ttt_cnt; |
| 1079 | 1079 | UINT32 m_ttt_val[2]; |
| 1080 | | int m_s12_porta; |
| 1081 | | int m_s12_lastpB; |
| 1080 | UINT8 m_sub_porta; |
| 1081 | UINT8 m_sub_portb; |
| 1082 | 1082 | |
| 1083 | 1083 | DECLARE_WRITE16_MEMBER(sharedram_w); |
| 1084 | 1084 | DECLARE_READ16_MEMBER(sharedram_r); |
| r29542 | r29543 | |
| 1235 | 1235 | { |
| 1236 | 1236 | m_sub->set_input_line(1, vblank_state ? ASSERT_LINE : CLEAR_LINE); |
| 1237 | 1237 | m_adc->adtrg_w(vblank_state); |
| 1238 | | m_s12_lastpB = (m_s12_lastpB & 0x7f) | (vblank_state << 7); |
| 1238 | m_sub_portb = (m_sub_portb & 0x7f) | (vblank_state << 7); |
| 1239 | 1239 | } |
| 1240 | 1240 | |
| 1241 | 1241 | static ADDRESS_MAP_START( namcos12_map, AS_PROGRAM, 32, namcos12_state ) |
| r29542 | r29543 | |
| 1473 | 1473 | |
| 1474 | 1474 | READ16_MEMBER(namcos12_state::s12_mcu_pa_r) |
| 1475 | 1475 | { |
| 1476 | | return m_s12_porta; |
| 1476 | return m_sub_porta; |
| 1477 | 1477 | } |
| 1478 | 1478 | |
| 1479 | 1479 | WRITE16_MEMBER(namcos12_state::s12_mcu_pa_w) |
| 1480 | 1480 | { |
| 1481 | 1481 | logerror("pa_w %02x\n", data); |
| 1482 | | m_s12_porta = data; |
| 1483 | | m_rtc->ce_w((m_s12_lastpB & 0x20) && (m_s12_porta & 1)); |
| 1484 | | m_settings->ce_w((m_s12_lastpB & 0x20) && !(m_s12_porta & 1)); |
| 1482 | m_sub_porta = data; |
| 1483 | m_rtc->ce_w((m_sub_portb & 0x20) && (m_sub_porta & 1)); |
| 1484 | m_settings->ce_w((m_sub_portb & 0x20) && !(m_sub_porta & 1)); |
| 1485 | 1485 | } |
| 1486 | 1486 | |
| 1487 | 1487 | READ16_MEMBER(namcos12_state::s12_mcu_portB_r) |
| 1488 | 1488 | { |
| 1489 | | return m_s12_lastpB; |
| 1489 | return m_sub_portb; |
| 1490 | 1490 | } |
| 1491 | 1491 | |
| 1492 | 1492 | WRITE16_MEMBER(namcos12_state::s12_mcu_portB_w) |
| 1493 | 1493 | { |
| 1494 | | m_s12_lastpB = data; |
| 1495 | | m_rtc->ce_w((m_s12_lastpB & 0x20) && (m_s12_porta & 1)); |
| 1496 | | m_settings->ce_w((m_s12_lastpB & 0x20) && !(m_s12_porta & 1)); |
| 1494 | m_sub_portb = (m_sub_portb & 0x80) | (data & 0x7f); |
| 1495 | m_rtc->ce_w((m_sub_portb & 0x20) && (m_sub_porta & 1)); |
| 1496 | m_settings->ce_w((m_sub_portb & 0x20) && !(m_sub_porta & 1)); |
| 1497 | 1497 | } |
| 1498 | 1498 | |
| 1499 | 1499 | static ADDRESS_MAP_START( s12h8iomap, AS_IO, 16, namcos12_state ) |
| 1500 | 1500 | AM_RANGE(h8_device::PORT_7, h8_device::PORT_7) AM_READ_PORT("DSW") |
| 1501 | | AM_RANGE(h8_device::PORT_8, h8_device::PORT_8) AM_READ(s12_mcu_p8_r ) AM_WRITENOP |
| 1502 | | AM_RANGE(h8_device::PORT_A, h8_device::PORT_A) AM_READWRITE(s12_mcu_pa_r, s12_mcu_pa_w ) |
| 1503 | | AM_RANGE(h8_device::PORT_B, h8_device::PORT_B) AM_READWRITE(s12_mcu_portB_r, s12_mcu_portB_w ) |
| 1501 | AM_RANGE(h8_device::PORT_8, h8_device::PORT_8) AM_READ(s12_mcu_p8_r) AM_WRITENOP |
| 1502 | AM_RANGE(h8_device::PORT_A, h8_device::PORT_A) AM_READWRITE(s12_mcu_pa_r, s12_mcu_pa_w) |
| 1503 | AM_RANGE(h8_device::PORT_B, h8_device::PORT_B) AM_READWRITE(s12_mcu_portB_r, s12_mcu_portB_w) |
| 1504 | 1504 | AM_RANGE(h8_device::ADC_0, h8_device::ADC_0) AM_NOP |
| 1505 | 1505 | AM_RANGE(h8_device::ADC_1, h8_device::ADC_1) AM_NOP |
| 1506 | 1506 | AM_RANGE(h8_device::ADC_2, h8_device::ADC_2) AM_NOP |
| r29542 | r29543 | |
| 1508 | 1508 | ADDRESS_MAP_END |
| 1509 | 1509 | |
| 1510 | 1510 | |
| 1511 | | /* Golgo 13 lightgun inputs |
| 1512 | | * |
| 1513 | | * Note: The H8/3002's ADC is 10 bits wide, but |
| 1514 | | * it expects the 10-bit value to be left-justified |
| 1515 | | * within the 16-bit word. |
| 1516 | | */ |
| 1511 | // Golgo 13 lightgun inputs |
| 1517 | 1512 | |
| 1518 | 1513 | READ16_MEMBER(namcos12_state::s12_mcu_gun_h_r) |
| 1519 | 1514 | { |
| 1520 | | return ioport("LIGHT0_X")->read() << 2; |
| 1515 | return ioport("LIGHT0_X")->read(); |
| 1521 | 1516 | } |
| 1522 | 1517 | |
| 1523 | 1518 | READ16_MEMBER(namcos12_state::s12_mcu_gun_v_r) |
| 1524 | 1519 | { |
| 1525 | | return ioport("LIGHT0_Y")->read() << 2; |
| 1520 | return ioport("LIGHT0_Y")->read(); |
| 1526 | 1521 | } |
| 1527 | 1522 | |
| 1528 | 1523 | static ADDRESS_MAP_START( golgo13_h8iomap, AS_IO, 16, namcos12_state ) |
| 1529 | | AM_RANGE(h8_device::ADC_1, h8_device::ADC_1) AM_READ(s12_mcu_gun_h_r ) |
| 1530 | | AM_RANGE(h8_device::ADC_2, h8_device::ADC_2) AM_READ(s12_mcu_gun_v_r ) |
| 1524 | AM_RANGE(h8_device::ADC_1, h8_device::ADC_1) AM_READ(s12_mcu_gun_h_r) |
| 1525 | AM_RANGE(h8_device::ADC_2, h8_device::ADC_2) AM_READ(s12_mcu_gun_v_r) |
| 1531 | 1526 | |
| 1532 | 1527 | AM_IMPORT_FROM( s12h8iomap ) |
| 1533 | 1528 | ADDRESS_MAP_END |
| r29542 | r29543 | |
| 1537 | 1532 | { |
| 1538 | 1533 | membank("bank1")->configure_entries(0, memregion( "user2" )->bytes() / 0x200000, memregion( "user2" )->base(), 0x200000 ); |
| 1539 | 1534 | |
| 1540 | | m_s12_porta = 0; |
| 1541 | | m_s12_lastpB = 0x50; |
| 1535 | m_sub_porta = 0; |
| 1536 | m_sub_portb = 0x50; |
| 1542 | 1537 | |
| 1543 | 1538 | m_n_tektagdmaoffset = 0; |
| 1544 | 1539 | m_n_dmaoffset = 0; |
branches/new_menus/src/mame/drivers/namcos23.c
| r29542 | r29543 | |
| 1447 | 1447 | UINT16 m_c435_buffer[256]; |
| 1448 | 1448 | int m_c435_buffer_pos; |
| 1449 | 1449 | |
| 1450 | | int m_porta; |
| 1451 | | int m_lastpb; |
| 1450 | UINT8 m_sub_porta; |
| 1451 | UINT8 m_sub_portb; |
| 1452 | 1452 | UINT8 m_tssio_port_4; |
| 1453 | 1453 | |
| 1454 | 1454 | void update_main_interrupts(UINT32 cause); |
| r29542 | r29543 | |
| 1508 | 1508 | UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 1509 | 1509 | INTERRUPT_GEN_MEMBER(interrupt); |
| 1510 | 1510 | TIMER_CALLBACK_MEMBER(c361_timer_cb); |
| 1511 | | void sub_irq(screen_device &screen, bool state); |
| 1511 | void sub_irq(screen_device &screen, bool vblank_state); |
| 1512 | 1512 | UINT8 nthbyte(const UINT32 *pSource, int offs); |
| 1513 | 1513 | UINT16 nthword(const UINT32 *pSource, int offs); |
| 1514 | 1514 | inline INT32 u32_to_s24(UINT32 v); |
| r29542 | r29543 | |
| 2255 | 2255 | m_render.count[m_render.cur] = 0; |
| 2256 | 2256 | } |
| 2257 | 2257 | |
| 2258 | | void namcos23_state::sub_irq(screen_device &screen, bool state) |
| 2258 | void namcos23_state::sub_irq(screen_device &screen, bool vblank_state) |
| 2259 | 2259 | { |
| 2260 | | m_subcpu->set_input_line(1, state ? ASSERT_LINE : CLEAR_LINE); |
| 2261 | | m_adc->adtrg_w(state); |
| 2262 | | m_lastpb = (m_lastpb & 0x7f) | (state << 7); |
| 2260 | m_subcpu->set_input_line(1, vblank_state ? ASSERT_LINE : CLEAR_LINE); |
| 2261 | m_adc->adtrg_w(vblank_state); |
| 2262 | m_sub_portb = (m_sub_portb & 0x7f) | (vblank_state << 7); |
| 2263 | 2263 | } |
| 2264 | 2264 | |
| 2265 | 2265 | |
| r29542 | r29543 | |
| 2861 | 2861 | |
| 2862 | 2862 | READ16_MEMBER(namcos23_state::mcu_pa_r) |
| 2863 | 2863 | { |
| 2864 | | return m_porta; |
| 2864 | return m_sub_porta; |
| 2865 | 2865 | } |
| 2866 | 2866 | |
| 2867 | 2867 | WRITE16_MEMBER(namcos23_state::mcu_pa_w) |
| 2868 | 2868 | { |
| 2869 | 2869 | m_rtc->ce_w(data & 1); |
| 2870 | | m_porta = data; |
| 2871 | | m_rtc->ce_w((m_lastpb & 0x20) && (m_porta & 1)); |
| 2872 | | m_settings->ce_w((m_lastpb & 0x20) && !(m_porta & 1)); |
| 2870 | m_sub_porta = data; |
| 2871 | m_rtc->ce_w((m_sub_portb & 0x20) && (m_sub_porta & 1)); |
| 2872 | m_settings->ce_w((m_sub_portb & 0x20) && !(m_sub_porta & 1)); |
| 2873 | 2873 | } |
| 2874 | 2874 | |
| 2875 | 2875 | |
| r29542 | r29543 | |
| 2878 | 2878 | |
| 2879 | 2879 | READ16_MEMBER(namcos23_state::mcu_pb_r) |
| 2880 | 2880 | { |
| 2881 | | return m_lastpb; |
| 2881 | return m_sub_portb; |
| 2882 | 2882 | } |
| 2883 | 2883 | |
| 2884 | 2884 | WRITE16_MEMBER(namcos23_state::mcu_pb_w) |
| 2885 | 2885 | { |
| 2886 | | m_lastpb = data; |
| 2887 | | m_rtc->ce_w((m_lastpb & 0x20) && (m_porta & 1)); |
| 2888 | | m_settings->ce_w((m_lastpb & 0x20) && !(m_porta & 1)); |
| 2886 | m_sub_portb = (m_sub_portb & 0x80) | (data & 0x7f); |
| 2887 | m_rtc->ce_w((m_sub_portb & 0x20) && (m_sub_porta & 1)); |
| 2888 | m_settings->ce_w((m_sub_portb & 0x20) && !(m_sub_porta & 1)); |
| 2889 | 2889 | } |
| 2890 | 2890 | |
| 2891 | 2891 | |
| r29542 | r29543 | |
| 3256 | 3256 | m_jvssense = 1; |
| 3257 | 3257 | m_main_irqcause = 0; |
| 3258 | 3258 | m_ctl_vbl_active = false; |
| 3259 | | m_lastpb = 0x50; |
| 3259 | m_sub_portb = 0x50; |
| 3260 | 3260 | m_tssio_port_4 = 0; |
| 3261 | | m_porta = 0; |
| 3261 | m_sub_porta = 0; |
| 3262 | 3262 | m_subcpu_running = false; |
| 3263 | 3263 | m_render.count[0] = m_render.count[1] = 0; |
| 3264 | 3264 | m_render.cur = 0; |
branches/new_menus/src/emu/bus/isa/wdxt_gen.c
| r29542 | r29543 | |
| 140 | 140 | m_ram[offset] = data; |
| 141 | 141 | } |
| 142 | 142 | |
| 143 | | static WD11C00_17_INTERFACE( host_intf ) |
| 144 | | { |
| 145 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, wdxt_gen_device, irq5_w), |
| 146 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, wdxt_gen_device, drq3_w), |
| 147 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, wdxt_gen_device, mr_w), |
| 148 | | DEVCB_NULL, |
| 149 | | DEVCB_NULL, |
| 150 | | DEVCB_CPU_INPUT_LINE(WD1015_TAG, MCS48_INPUT_IRQ), |
| 151 | | DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, wdxt_gen_device, rd322_r), |
| 152 | | DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, wdxt_gen_device, ram_r), |
| 153 | | DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, wdxt_gen_device, ram_w), |
| 154 | | DEVCB_DEVICE_MEMBER(WD2010A_TAG, wd2010_device, read), |
| 155 | | DEVCB_DEVICE_MEMBER(WD2010A_TAG, wd2010_device, write) |
| 156 | | }; |
| 157 | | |
| 158 | | |
| 159 | 143 | //------------------------------------------------- |
| 160 | 144 | // MACHINE_DRIVER( wdxt_gen ) |
| 161 | 145 | //------------------------------------------------- |
| r29542 | r29543 | |
| 164 | 148 | MCFG_CPU_ADD(WD1015_TAG, I8049, 5000000) |
| 165 | 149 | MCFG_CPU_IO_MAP(wd1015_io) |
| 166 | 150 | |
| 167 | | MCFG_WD11C00_17_ADD(WD11C00_17_TAG, 5000000, host_intf) |
| 151 | MCFG_DEVICE_ADD(WD11C00_17_TAG, WD11C00_17, 5000000) |
| 152 | MCFG_WD11C00_17_OUT_IRQ5_CB(WRITELINE(wdxt_gen_device, irq5_w)) |
| 153 | MCFG_WD11C00_17_OUT_DRQ3_CB(WRITELINE(wdxt_gen_device, drq3_w)) |
| 154 | MCFG_WD11C00_17_OUT_MR_CB(WRITELINE(wdxt_gen_device, mr_w)) |
| 155 | MCFG_WD11C00_17_OUT_RA3_CB(INPUTLINE(WD1015_TAG, MCS48_INPUT_IRQ)) |
| 156 | MCFG_WD11C00_17_IN_RD322_CB(READ8(wdxt_gen_device, rd322_r)) |
| 157 | MCFG_WD11C00_17_IN_RAMCS_CB(READ8(wdxt_gen_device, ram_r)) |
| 158 | MCFG_WD11C00_17_OUT_RAMWR_CB(WRITE8(wdxt_gen_device, ram_w)) |
| 159 | MCFG_WD11C00_17_IN_CS1010_CB(DEVREAD8(WD2010A_TAG, wd2010_device, read)) |
| 160 | MCFG_WD11C00_17_OUT_CS1010_CB(DEVWRITE8(WD2010A_TAG, wd2010_device, write)) |
| 168 | 161 | MCFG_DEVICE_ADD(WD2010A_TAG, WD2010, 5000000) |
| 169 | 162 | MCFG_WD2010_OUT_BCR_CB(DEVWRITELINE(WD11C00_17_TAG, wd11c00_17_device, clct_w)) |
| 170 | 163 | MCFG_WD2010_IN_BCS_CB(DEVREAD8(WD11C00_17_TAG, wd11c00_17_device, read)) |
branches/new_menus/src/emu/bus/isa/gus.c
| r29542 | r29543 | |
| 85 | 85 | { |
| 86 | 86 | if(data & 0x80) |
| 87 | 87 | { |
| 88 | | m_timer1_irq_func(0); |
| 89 | | m_timer2_irq_func(0); |
| 88 | m_timer1_irq_handler(0); |
| 89 | m_timer2_irq_handler(0); |
| 90 | 90 | m_adlib_status &= ~0xe0; |
| 91 | 91 | logerror("GUS: Timer flags reset\n"); |
| 92 | 92 | } |
| r29542 | r29543 | |
| 122 | 122 | if(m_timer_ctrl & 0x02) |
| 123 | 123 | { |
| 124 | 124 | m_adlib_status |= 0x01; |
| 125 | | m_nmi_func(1); |
| 125 | m_nmi_handler(1); |
| 126 | 126 | logerror("GUS: 2X9 Timer triggered!\n"); |
| 127 | 127 | } |
| 128 | 128 | } |
| r29542 | r29543 | |
| 209 | 209 | m_adlib_status |= 0xc0; |
| 210 | 210 | m_timer1_count = m_timer1_value; |
| 211 | 211 | if(m_timer_ctrl & 0x04) |
| 212 | | m_timer1_irq_func(1); |
| 212 | m_timer1_irq_handler(1); |
| 213 | 213 | } |
| 214 | 214 | m_timer1_count++; |
| 215 | 215 | } |
| r29542 | r29543 | |
| 222 | 222 | m_adlib_status |= 0xa0; |
| 223 | 223 | m_timer2_count = m_timer2_value; |
| 224 | 224 | if(m_timer_ctrl & 0x08) |
| 225 | | m_timer2_irq_func(1); |
| 225 | m_timer2_irq_handler(1); |
| 226 | 226 | } |
| 227 | 227 | m_timer2_count++; |
| 228 | 228 | } |
| 229 | 229 | break; |
| 230 | 230 | case DMA_TIMER: |
| 231 | | m_drq1(1); |
| 231 | m_drq1_handler(1); |
| 232 | 232 | break; |
| 233 | 233 | case VOL_RAMP_TIMER: |
| 234 | 234 | update_volume_ramps(); |
| r29542 | r29543 | |
| 352 | 352 | acia6850_device(mconfig, GGF1, "Gravis GF1", tag, owner, clock, "gf1", __FILE__), |
| 353 | 353 | device_sound_interface( mconfig, *this ), |
| 354 | 354 | m_txirq_handler(*this), |
| 355 | | m_rxirq_handler(*this) |
| 355 | m_rxirq_handler(*this), |
| 356 | m_wave_irq_handler(*this), |
| 357 | m_ramp_irq_handler(*this), |
| 358 | m_timer1_irq_handler(*this), |
| 359 | m_timer2_irq_handler(*this), |
| 360 | m_sb_irq_handler(*this), |
| 361 | m_dma_irq_handler(*this), |
| 362 | m_drq1_handler(*this), |
| 363 | m_drq2_handler(*this), |
| 364 | m_nmi_handler(*this) |
| 356 | 365 | { |
| 357 | 366 | } |
| 358 | 367 | |
| 359 | | void gf1_device::device_config_complete() |
| 360 | | { |
| 361 | | // inherit a copy of the static data |
| 362 | | const gf1_interface *intf = reinterpret_cast<const gf1_interface *>(static_config()); |
| 363 | | if (intf != NULL) |
| 364 | | *static_cast<gf1_interface *>(this) = *intf; |
| 365 | | |
| 366 | | // or initialize to defaults if none provided |
| 367 | | else |
| 368 | | { |
| 369 | | memset(&wave_irq_cb, 0, sizeof(wave_irq_cb)); |
| 370 | | memset(&ramp_irq_cb, 0, sizeof(ramp_irq_cb)); |
| 371 | | memset(&timer1_irq_cb, 0, sizeof(timer1_irq_cb)); |
| 372 | | memset(&timer2_irq_cb, 0, sizeof(timer2_irq_cb)); |
| 373 | | memset(&sb_irq_cb, 0, sizeof(sb_irq_cb)); |
| 374 | | memset(&dma_irq_cb, 0, sizeof(dma_irq_cb)); |
| 375 | | memset(&drq1_cb, 0, sizeof(drq1_cb)); |
| 376 | | memset(&drq2_cb, 0, sizeof(drq2_cb)); |
| 377 | | memset(&nmi_cb, 0, sizeof(nmi_cb)); |
| 378 | | } |
| 379 | | } |
| 380 | | |
| 381 | 368 | //------------------------------------------------- |
| 382 | 369 | // device_start - device-specific startup |
| 383 | 370 | //------------------------------------------------- |
| r29542 | r29543 | |
| 391 | 378 | |
| 392 | 379 | m_txirq_handler.resolve_safe(); |
| 393 | 380 | m_rxirq_handler.resolve_safe(); |
| 381 | m_wave_irq_handler.resolve_safe(); |
| 382 | m_ramp_irq_handler.resolve_safe(); |
| 383 | m_timer1_irq_handler.resolve_safe(); |
| 384 | m_timer2_irq_handler.resolve_safe(); |
| 385 | m_sb_irq_handler.resolve_safe(); |
| 386 | m_dma_irq_handler.resolve_safe(); |
| 387 | m_drq1_handler.resolve_safe(); |
| 388 | m_drq2_handler.resolve_safe(); |
| 389 | m_nmi_handler.resolve_safe(); |
| 394 | 390 | |
| 395 | 391 | // TODO: make DRAM size configurable. Can be 256k, 512k, 768k, or 1024k |
| 396 | 392 | m_wave_ram.resize_and_clear(1024*1024); |
| r29542 | r29543 | |
| 405 | 401 | |
| 406 | 402 | save_item(NAME(m_wave_ram)); |
| 407 | 403 | |
| 408 | | m_wave_irq_func.resolve(wave_irq_cb, *this); |
| 409 | | m_ramp_irq_func.resolve(ramp_irq_cb, *this); |
| 410 | | m_timer1_irq_func.resolve(timer1_irq_cb, *this); |
| 411 | | m_timer2_irq_func.resolve(timer2_irq_cb, *this); |
| 412 | | m_sb_irq_func.resolve(sb_irq_cb, *this); |
| 413 | | m_dma_irq_func.resolve(dma_irq_cb, *this); |
| 414 | | m_drq1.resolve(drq1_cb,*this); |
| 415 | | m_drq2.resolve(drq2_cb,*this); |
| 416 | | m_nmi_func.resolve(nmi_cb, *this); |
| 417 | | |
| 418 | 404 | m_voice_irq_current = 0; |
| 419 | 405 | m_voice_irq_ptr = 0; |
| 420 | 406 | m_dma_channel1 = 0; |
| r29542 | r29543 | |
| 499 | 485 | { |
| 500 | 486 | ret = m_dma_dram_ctrl; |
| 501 | 487 | m_dma_dram_ctrl &= ~0x40; |
| 502 | | m_dma_irq_func(0); |
| 488 | m_dma_irq_handler(0); |
| 503 | 489 | return ret; |
| 504 | 490 | } |
| 505 | 491 | case 0x45: // Timer control |
| r29542 | r29543 | |
| 595 | 581 | m_voice_irq_current++; |
| 596 | 582 | else |
| 597 | 583 | ret = 0xe0; |
| 598 | | m_wave_irq_func(0); |
| 599 | | m_ramp_irq_func(0); |
| 584 | m_wave_irq_handler(0); |
| 585 | m_ramp_irq_handler(0); |
| 600 | 586 | return ret; |
| 601 | 587 | } |
| 602 | 588 | break; |
| r29542 | r29543 | |
| 799 | 785 | if(!(data & 0x02)) |
| 800 | 786 | m_adlib_status &= ~0x01; |
| 801 | 787 | if(!(m_adlib_status & 0x19)) |
| 802 | | m_sb_irq_func(0); |
| 788 | m_sb_irq_handler(0); |
| 803 | 789 | if(!(data & 0x04)) |
| 804 | 790 | { |
| 805 | 791 | m_adlib_status &= ~0x40; |
| 806 | | m_timer1_irq_func(0); |
| 792 | m_timer1_irq_handler(0); |
| 807 | 793 | } |
| 808 | 794 | if(!(data & 0x08)) |
| 809 | 795 | { |
| 810 | 796 | m_adlib_status &= ~0x20; |
| 811 | | m_timer2_irq_func(0); |
| 797 | m_timer2_irq_handler(0); |
| 812 | 798 | } |
| 813 | 799 | if((m_adlib_status & 0x60) != 0) |
| 814 | 800 | m_adlib_status &= ~0x80; |
| r29542 | r29543 | |
| 1044 | 1030 | break; |
| 1045 | 1031 | case 0x05: |
| 1046 | 1032 | m_statread = 0; |
| 1047 | | //m_other_irq_func(0); |
| 1033 | //m_other_irq_handler(0); |
| 1048 | 1034 | break; |
| 1049 | 1035 | case 0x06: |
| 1050 | 1036 | // TODO: Jumper register (joy/MIDI enable) |
| r29542 | r29543 | |
| 1093 | 1079 | if(m_reg_ctrl & 0x80) |
| 1094 | 1080 | { |
| 1095 | 1081 | m_statread |= 0x80; |
| 1096 | | m_nmi_func(1); |
| 1082 | m_nmi_handler(1); |
| 1097 | 1083 | } |
| 1098 | 1084 | return m_sb_data_2xe; |
| 1099 | 1085 | } |
| r29542 | r29543 | |
| 1108 | 1094 | if(m_timer_ctrl & 0x20) |
| 1109 | 1095 | { |
| 1110 | 1096 | m_adlib_status |= 0x10; |
| 1111 | | m_nmi_func(1); |
| 1097 | m_nmi_handler(1); |
| 1112 | 1098 | logerror("GUS: SB 0x2XC IRQ active\n"); |
| 1113 | 1099 | } |
| 1114 | 1100 | break; |
| r29542 | r29543 | |
| 1128 | 1114 | if(m_timer_ctrl & 0x20) |
| 1129 | 1115 | { |
| 1130 | 1116 | m_adlib_status |= 0x08; |
| 1131 | | m_nmi_func(1); |
| 1117 | m_nmi_handler(1); |
| 1132 | 1118 | logerror("GUS: SB 0x2X6 IRQ active\n"); |
| 1133 | 1119 | } |
| 1134 | 1120 | } |
| r29542 | r29543 | |
| 1153 | 1139 | { |
| 1154 | 1140 | m_irq_source = 0xe0 | (voice & 0x1f); |
| 1155 | 1141 | m_irq_source &= ~0x80; |
| 1156 | | m_wave_irq_func(1); |
| 1142 | m_wave_irq_handler(1); |
| 1157 | 1143 | m_voice_irq_fifo[m_voice_irq_ptr % 32] = m_irq_source; |
| 1158 | 1144 | m_voice_irq_ptr++; |
| 1159 | 1145 | m_voice[voice].voice_ctrl |= 0x80; |
| r29542 | r29543 | |
| 1162 | 1148 | { |
| 1163 | 1149 | m_irq_source = 0xe0 | (voice & 0x1f); |
| 1164 | 1150 | m_irq_source &= ~0x40; |
| 1165 | | m_ramp_irq_func(1); |
| 1151 | m_ramp_irq_handler(1); |
| 1166 | 1152 | m_voice_irq_fifo[m_voice_irq_ptr % 32] = m_irq_source; |
| 1167 | 1153 | m_voice_irq_ptr++; |
| 1168 | 1154 | } |
| r29542 | r29543 | |
| 1173 | 1159 | if(source & IRQ_WAVETABLE) |
| 1174 | 1160 | { |
| 1175 | 1161 | m_irq_source |= 0x80; |
| 1176 | | m_wave_irq_func(0); |
| 1162 | m_wave_irq_handler(0); |
| 1177 | 1163 | } |
| 1178 | 1164 | if(source & IRQ_VOLUME_RAMP) |
| 1179 | 1165 | { |
| 1180 | 1166 | m_irq_source |= 0x40; |
| 1181 | | m_ramp_irq_func(0); |
| 1167 | m_ramp_irq_handler(0); |
| 1182 | 1168 | } |
| 1183 | 1169 | } |
| 1184 | 1170 | |
| r29542 | r29543 | |
| 1204 | 1190 | } |
| 1205 | 1191 | m_wave_ram[m_dma_current & 0xfffff] = data; |
| 1206 | 1192 | m_dma_current++; |
| 1207 | | m_drq1(0); |
| 1193 | m_drq1_handler(0); |
| 1208 | 1194 | } |
| 1209 | 1195 | |
| 1210 | 1196 | void gf1_device::eop_w(int state) |
| r29542 | r29543 | |
| 1212 | 1198 | if(state == ASSERT_LINE) { |
| 1213 | 1199 | // end of transfer |
| 1214 | 1200 | m_dmatimer->reset(); |
| 1215 | | //m_drq1(0); |
| 1201 | //m_drq1_handler(0); |
| 1216 | 1202 | if(m_dma_dram_ctrl & 0x20) |
| 1217 | 1203 | { |
| 1218 | 1204 | m_dma_dram_ctrl |= 0x40; |
| 1219 | | m_dma_irq_func(1); |
| 1205 | m_dma_irq_handler(1); |
| 1220 | 1206 | } |
| 1221 | 1207 | logerror("GUS: End of transfer. (%05x)\n",m_dma_current); |
| 1222 | 1208 | } |
| r29542 | r29543 | |
| 1225 | 1211 | |
| 1226 | 1212 | /* 16-bit ISA card device implementation */ |
| 1227 | 1213 | |
| 1228 | | static const gf1_interface gus_gf1_config = |
| 1229 | | { |
| 1230 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,wavetable_irq), |
| 1231 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,volumeramp_irq), |
| 1232 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,timer1_irq), |
| 1233 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,timer2_irq), |
| 1234 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,sb_irq), |
| 1235 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,dma_irq), |
| 1236 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,drq1_w), |
| 1237 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,drq2_w), |
| 1238 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,nmi_w) |
| 1239 | | }; |
| 1240 | | |
| 1241 | 1214 | static MACHINE_CONFIG_FRAGMENT( gus_config ) |
| 1242 | 1215 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker","rspeaker") |
| 1243 | 1216 | MCFG_SOUND_ADD("gf1",GGF1,GF1_CLOCK) |
| 1244 | | MCFG_SOUND_CONFIG(gus_gf1_config) |
| 1245 | 1217 | MCFG_SOUND_ROUTE(0,"lspeaker",0.50) |
| 1246 | 1218 | MCFG_SOUND_ROUTE(1,"rspeaker",0.50) |
| 1247 | 1219 | |
| 1248 | 1220 | MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd)) |
| 1249 | 1221 | MCFG_GF1_TXIRQ_HANDLER(WRITELINE(isa16_gus_device, midi_txirq)) |
| 1250 | 1222 | MCFG_GF1_RXIRQ_HANDLER(WRITELINE(isa16_gus_device, midi_txirq)) |
| 1223 | MCFG_GF1_WAVE_IRQ_HANDLER(WRITELINE(isa16_gus_device, wavetable_irq)) |
| 1224 | MCFG_GF1_RAMP_IRQ_HANDLER(WRITELINE(isa16_gus_device, volumeramp_irq)) |
| 1225 | MCFG_GF1_TIMER1_IRQ_HANDLER(WRITELINE(isa16_gus_device, timer1_irq)) |
| 1226 | MCFG_GF1_TIMER2_IRQ_HANDLER(WRITELINE(isa16_gus_device, timer2_irq)) |
| 1227 | MCFG_GF1_SB_IRQ_HANDLER(WRITELINE(isa16_gus_device, sb_irq)) |
| 1228 | MCFG_GF1_DMA_IRQ_HANDLER(WRITELINE(isa16_gus_device, dma_irq)) |
| 1229 | MCFG_GF1_DRQ1_HANDLER(WRITELINE(isa16_gus_device, drq1_w)) |
| 1230 | MCFG_GF1_DRQ2_HANDLER(WRITELINE(isa16_gus_device, drq2_w)) |
| 1231 | MCFG_GF1_NMI_HANDLER(WRITELINE(isa16_gus_device, nmi_w)) |
| 1251 | 1232 | |
| 1252 | 1233 | MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin") |
| 1253 | 1234 | MCFG_MIDI_RX_HANDLER(DEVWRITELINE("gf1", acia6850_device, write_rxd)) |
branches/new_menus/src/emu/bus/isa/gus.h
| r29542 | r29543 | |
| 50 | 50 | #define MCFG_GF1_RXIRQ_HANDLER(_devcb) \ |
| 51 | 51 | devcb = &gf1_device::set_rxirq_handler(*device, DEVCB2_##_devcb); |
| 52 | 52 | |
| 53 | #define MCFG_GF1_WAVE_IRQ_HANDLER(_devcb) \ |
| 54 | devcb = &gf1_device::set_wave_irq_handler(*device, DEVCB2_##_devcb); |
| 55 | |
| 56 | #define MCFG_GF1_RAMP_IRQ_HANDLER(_devcb) \ |
| 57 | devcb = &gf1_device::set_ramp_irq_handler(*device, DEVCB2_##_devcb); |
| 58 | |
| 59 | #define MCFG_GF1_TIMER1_IRQ_HANDLER(_devcb) \ |
| 60 | devcb = &gf1_device::set_timer1_irq_handler(*device, DEVCB2_##_devcb); |
| 61 | |
| 62 | #define MCFG_GF1_TIMER2_IRQ_HANDLER(_devcb) \ |
| 63 | devcb = &gf1_device::set_timer2_irq_handler(*device, DEVCB2_##_devcb); |
| 64 | |
| 65 | #define MCFG_GF1_SB_IRQ_HANDLER(_devcb) \ |
| 66 | devcb = &gf1_device::set_sb_irq_handler(*device, DEVCB2_##_devcb); |
| 67 | |
| 68 | #define MCFG_GF1_DMA_IRQ_HANDLER(_devcb) \ |
| 69 | devcb = &gf1_device::set_dma_irq_handler(*device, DEVCB2_##_devcb); |
| 70 | |
| 71 | #define MCFG_GF1_DRQ1_HANDLER(_devcb) \ |
| 72 | devcb = &gf1_device::set_drq1_handler(*device, DEVCB2_##_devcb); |
| 73 | |
| 74 | #define MCFG_GF1_DRQ2_HANDLER(_devcb) \ |
| 75 | devcb = &gf1_device::set_drq2_handler(*device, DEVCB2_##_devcb); |
| 76 | |
| 77 | #define MCFG_GF1_NMI_HANDLER(_devcb) \ |
| 78 | devcb = &gf1_device::set_nmi_handler(*device, DEVCB2_##_devcb); |
| 79 | |
| 53 | 80 | //************************************************************************** |
| 54 | 81 | // TYPE DEFINITIONS |
| 55 | 82 | //************************************************************************** |
| r29542 | r29543 | |
| 86 | 113 | INT16 sample; // current sample data |
| 87 | 114 | }; |
| 88 | 115 | |
| 89 | | struct gf1_interface |
| 90 | | { |
| 91 | | devcb_write_line wave_irq_cb; |
| 92 | | devcb_write_line ramp_irq_cb; |
| 93 | | devcb_write_line timer1_irq_cb; |
| 94 | | devcb_write_line timer2_irq_cb; |
| 95 | | devcb_write_line sb_irq_cb; |
| 96 | | devcb_write_line dma_irq_cb; |
| 97 | | devcb_write_line drq1_cb; |
| 98 | | devcb_write_line drq2_cb; |
| 99 | | devcb_write_line nmi_cb; |
| 100 | | }; |
| 101 | | |
| 102 | 116 | class gf1_device : |
| 103 | 117 | public acia6850_device, |
| 104 | | public device_sound_interface, |
| 105 | | public gf1_interface |
| 118 | public device_sound_interface |
| 106 | 119 | { |
| 107 | 120 | public: |
| 108 | 121 | // construction/destruction |
| r29542 | r29543 | |
| 110 | 123 | |
| 111 | 124 | template<class _Object> static devcb2_base &set_txirq_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_txirq_handler.set_callback(object); } |
| 112 | 125 | template<class _Object> static devcb2_base &set_rxirq_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_rxirq_handler.set_callback(object); } |
| 126 | template<class _Object> static devcb2_base &set_wave_irq_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_wave_irq_handler.set_callback(object); } |
| 127 | template<class _Object> static devcb2_base &set_ramp_irq_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_ramp_irq_handler.set_callback(object); } |
| 128 | template<class _Object> static devcb2_base &set_timer1_irq_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_timer1_irq_handler.set_callback(object); } |
| 129 | template<class _Object> static devcb2_base &set_timer2_irq_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_timer2_irq_handler.set_callback(object); } |
| 130 | template<class _Object> static devcb2_base &set_sb_irq_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_sb_irq_handler.set_callback(object); } |
| 131 | template<class _Object> static devcb2_base &set_dma_irq_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_dma_irq_handler.set_callback(object); } |
| 132 | template<class _Object> static devcb2_base &set_drq1_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_drq1_handler.set_callback(object); } |
| 133 | template<class _Object> static devcb2_base &set_drq2_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_drq2_handler.set_callback(object); } |
| 134 | template<class _Object> static devcb2_base &set_nmi_handler(device_t &device, _Object object) { return downcast<gf1_device &>(device).m_nmi_handler.set_callback(object); } |
| 113 | 135 | |
| 114 | 136 | // current IRQ/DMA channel getters |
| 115 | 137 | UINT8 gf1_irq() { if(m_gf1_irq != 0) return m_gf1_irq; else return m_midi_irq; } // workaround for win95 loading dumb values |
| r29542 | r29543 | |
| 143 | 165 | // optional information overrides |
| 144 | 166 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 145 | 167 | virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); |
| 146 | | virtual void device_config_complete(); |
| 147 | 168 | |
| 148 | 169 | // voice-specific registers |
| 149 | 170 | gus_voice m_voice[32]; |
| r29542 | r29543 | |
| 178 | 199 | |
| 179 | 200 | virtual void update_irq(); |
| 180 | 201 | |
| 181 | | devcb_resolved_write_line m_wave_irq_func; |
| 182 | | devcb_resolved_write_line m_ramp_irq_func; |
| 183 | | devcb_resolved_write_line m_timer1_irq_func; |
| 184 | | devcb_resolved_write_line m_timer2_irq_func; |
| 185 | | devcb_resolved_write_line m_sb_irq_func; |
| 186 | | devcb_resolved_write_line m_dma_irq_func; |
| 187 | | devcb_resolved_write_line m_drq1; |
| 188 | | devcb_resolved_write_line m_drq2; |
| 189 | | devcb_resolved_write_line m_nmi_func; |
| 190 | | |
| 191 | 202 | private: |
| 192 | 203 | // internal state |
| 193 | 204 | sound_stream* m_stream; |
| r29542 | r29543 | |
| 238 | 249 | |
| 239 | 250 | devcb2_write_line m_txirq_handler; |
| 240 | 251 | devcb2_write_line m_rxirq_handler; |
| 252 | devcb2_write_line m_wave_irq_handler; |
| 253 | devcb2_write_line m_ramp_irq_handler; |
| 254 | devcb2_write_line m_timer1_irq_handler; |
| 255 | devcb2_write_line m_timer2_irq_handler; |
| 256 | devcb2_write_line m_sb_irq_handler; |
| 257 | devcb2_write_line m_dma_irq_handler; |
| 258 | devcb2_write_line m_drq1_handler; |
| 259 | devcb2_write_line m_drq2_handler; |
| 260 | devcb2_write_line m_nmi_handler; |
| 241 | 261 | }; |
| 242 | 262 | |
| 243 | 263 | class isa16_gus_device : |
branches/new_menus/src/emu/bus/isa/ega.c
| r29542 | r29543 | |
| 449 | 449 | #define EGA_SCREEN_NAME "ega_screen" |
| 450 | 450 | #define EGA_CRTC_NAME "crtc_ega_ega" |
| 451 | 451 | |
| 452 | |
| 453 | #define EGA_MODE_GRAPHICS 1 |
| 454 | #define EGA_MODE_TEXT 2 |
| 455 | |
| 456 | |
| 452 | 457 | /* |
| 453 | 458 | Prototypes |
| 454 | 459 | */ |
| 455 | | static CRTC_EGA_UPDATE_ROW( ega_update_row ); |
| 456 | 460 | |
| 457 | | static CRTC_EGA_INTERFACE( crtc_ega_ega_intf ) |
| 458 | | { |
| 459 | | 8, /* numbers of pixels per video memory address */ |
| 460 | | NULL, /* begin_update */ |
| 461 | | ega_update_row, /* update_row */ |
| 462 | | NULL, /* end_update */ |
| 463 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa8_ega_device, de_changed), /* on_de_chaged */ |
| 464 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa8_ega_device, hsync_changed), /* on_hsync_changed */ |
| 465 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa8_ega_device, vsync_changed), /* on vsync_changed */ |
| 466 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa8_ega_device, vblank_changed) /* on_vblank_changed */ |
| 467 | | }; |
| 468 | | |
| 469 | | |
| 470 | 461 | MACHINE_CONFIG_FRAGMENT( pcvideo_ega ) |
| 471 | 462 | MCFG_SCREEN_ADD(EGA_SCREEN_NAME, RASTER) |
| 472 | 463 | MCFG_SCREEN_RAW_PARAMS(16257000,912,0,640,262,0,200) |
| r29542 | r29543 | |
| 474 | 465 | MCFG_SCREEN_PALETTE("palette") |
| 475 | 466 | |
| 476 | 467 | MCFG_PALETTE_ADD( "palette", 64 ) |
| 477 | | MCFG_CRTC_EGA_ADD(EGA_CRTC_NAME, 16257000/8, crtc_ega_ega_intf) |
| 468 | |
| 469 | MCFG_DEVICE_ADD(EGA_CRTC_NAME, CRTC_EGA, 16257000/8) |
| 478 | 470 | MCFG_CRTC_EGA_SET_SCREEN(EGA_SCREEN_NAME) |
| 471 | MCFG_CRTC_EGA_HPIXELS_PER_COLUMN(8) |
| 472 | MCFG_CRTC_EGA_ROW_UPDATE_CB(isa8_ega_device, ega_update_row) |
| 473 | MCFG_CRTC_EGA_RES_OUT_DE_CB(WRITELINE(isa8_ega_device, de_changed)) |
| 474 | MCFG_CRTC_EGA_RES_OUT_HSYNC_CB(WRITELINE(isa8_ega_device, hsync_changed)) |
| 475 | MCFG_CRTC_EGA_RES_OUT_VSYNC_CB(WRITELINE(isa8_ega_device, vsync_changed)) |
| 476 | MCFG_CRTC_EGA_RES_OUT_VBLANK_CB(WRITELINE(isa8_ega_device, vblank_changed)) |
| 479 | 477 | MACHINE_CONFIG_END |
| 480 | 478 | |
| 481 | 479 | ROM_START( ega ) |
| r29542 | r29543 | |
| 664 | 662 | |
| 665 | 663 | install_banks(); |
| 666 | 664 | |
| 667 | | m_update_row = NULL; |
| 668 | 665 | m_misc_output = 0; |
| 669 | 666 | m_attribute.index_write = 1; |
| 670 | 667 | |
| r29542 | r29543 | |
| 686 | 683 | m_attribute.data[14] = 0x3E; |
| 687 | 684 | m_attribute.data[15] = 0x3F; |
| 688 | 685 | |
| 686 | m_video_mode = 0; |
| 689 | 687 | } |
| 690 | 688 | |
| 691 | 689 | void isa8_ega_device::install_banks() |
| r29542 | r29543 | |
| 746 | 744 | } |
| 747 | 745 | } |
| 748 | 746 | |
| 749 | | static CRTC_EGA_UPDATE_ROW( ega_update_row ) |
| 747 | CRTC_EGA_ROW_UPDATE( isa8_ega_device::ega_update_row ) |
| 750 | 748 | { |
| 751 | | isa8_ega_device *ega = dynamic_cast<isa8_ega_device*>(device->owner()); |
| 752 | | if ( ega->m_update_row ) |
| 753 | | { |
| 754 | | ega->m_update_row( device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, param ); |
| 755 | | } |
| 749 | if (m_video_mode == EGA_MODE_GRAPHICS) |
| 750 | pc_ega_graphics(bitmap, cliprect, ma, ra, y, x_count, cursor_x); |
| 751 | else if (m_video_mode == EGA_MODE_TEXT) |
| 752 | pc_ega_text(bitmap, cliprect, ma, ra, y, x_count, cursor_x); |
| 756 | 753 | } |
| 757 | 754 | |
| 758 | 755 | |
| r29542 | r29543 | |
| 784 | 781 | } |
| 785 | 782 | |
| 786 | 783 | |
| 787 | | static CRTC_EGA_UPDATE_ROW( pc_ega_graphics ) |
| 784 | CRTC_EGA_ROW_UPDATE( isa8_ega_device::pc_ega_graphics ) |
| 788 | 785 | { |
| 789 | | isa8_ega_device *ega = dynamic_cast<isa8_ega_device*>(device->owner()); |
| 790 | 786 | UINT16 *p = &bitmap.pix16(y); |
| 791 | 787 | |
| 792 | 788 | // logerror( "pc_ega_graphics: y = %d, x_count = %d, ma = %d, ra = %d\n", y, x_count, ma, ra ); |
| 793 | 789 | |
| 794 | | if ( ega->m_graphics_controller.data[5] & 0x10 ) |
| 790 | if ( m_graphics_controller.data[5] & 0x10 ) |
| 795 | 791 | { |
| 796 | 792 | // Odd/Even mode (CGA compatible) |
| 797 | 793 | |
| 798 | 794 | for ( int i = 0; i < x_count; i++ ) |
| 799 | 795 | { |
| 800 | 796 | UINT16 offset = ( ( ma + i ) & 0x1fff ) | ( ( y & 1 ) << 12 ); |
| 801 | | UINT8 data = ega->m_plane[0][offset]; |
| 797 | UINT8 data = m_plane[0][offset]; |
| 802 | 798 | |
| 803 | | *p = ega->m_attribute.data[ ( data >> 6 ) ]; p++; |
| 804 | | *p = ega->m_attribute.data[ ( data >> 4 ) & 0x03 ]; p++; |
| 805 | | *p = ega->m_attribute.data[ ( data >> 2 ) & 0x03 ]; p++; |
| 806 | | *p = ega->m_attribute.data[ data & 0x03 ]; p++; |
| 799 | *p = m_attribute.data[ ( data >> 6 ) ]; p++; |
| 800 | *p = m_attribute.data[ ( data >> 4 ) & 0x03 ]; p++; |
| 801 | *p = m_attribute.data[ ( data >> 2 ) & 0x03 ]; p++; |
| 802 | *p = m_attribute.data[ data & 0x03 ]; p++; |
| 807 | 803 | |
| 808 | | data = ega->m_plane[1][offset]; |
| 804 | data = m_plane[1][offset]; |
| 809 | 805 | |
| 810 | | *p = ega->m_attribute.data[ ( data >> 6 ) ]; p++; |
| 811 | | *p = ega->m_attribute.data[ ( data >> 4 ) & 0x03 ]; p++; |
| 812 | | *p = ega->m_attribute.data[ ( data >> 2 ) & 0x03 ]; p++; |
| 813 | | *p = ega->m_attribute.data[ data & 0x03 ]; p++; |
| 806 | *p = m_attribute.data[ ( data >> 6 ) ]; p++; |
| 807 | *p = m_attribute.data[ ( data >> 4 ) & 0x03 ]; p++; |
| 808 | *p = m_attribute.data[ ( data >> 2 ) & 0x03 ]; p++; |
| 809 | *p = m_attribute.data[ data & 0x03 ]; p++; |
| 814 | 810 | } |
| 815 | 811 | } |
| 816 | 812 | else |
| 817 | 813 | { |
| 818 | 814 | // EGA mode |
| 819 | 815 | |
| 820 | | UINT8 mask = ega->m_attribute.data[0x12] & 0x0f; |
| 816 | UINT8 mask = m_attribute.data[0x12] & 0x0f; |
| 821 | 817 | |
| 822 | 818 | for ( int i = 0; i < x_count; i++ ) |
| 823 | 819 | { |
| 824 | 820 | UINT16 offset = ma + i; |
| 825 | | UINT16 data0 = ega->m_plane[0][offset]; |
| 826 | | UINT16 data1 = ega->m_plane[1][offset] << 1; |
| 827 | | UINT16 data2 = ega->m_plane[2][offset] << 2; |
| 828 | | UINT16 data3 = ega->m_plane[3][offset] << 3; |
| 821 | UINT16 data0 = m_plane[0][offset]; |
| 822 | UINT16 data1 = m_plane[1][offset] << 1; |
| 823 | UINT16 data2 = m_plane[2][offset] << 2; |
| 824 | UINT16 data3 = m_plane[3][offset] << 3; |
| 829 | 825 | |
| 830 | 826 | for ( int j = 7; j >= 0; j-- ) |
| 831 | 827 | { |
| r29542 | r29543 | |
| 833 | 829 | |
| 834 | 830 | col &= mask; |
| 835 | 831 | |
| 836 | | p[j] = ega->m_attribute.data[col]; |
| 832 | p[j] = m_attribute.data[col]; |
| 837 | 833 | |
| 838 | 834 | data0 >>= 1; |
| 839 | 835 | data1 >>= 1; |
| r29542 | r29543 | |
| 846 | 842 | } |
| 847 | 843 | |
| 848 | 844 | |
| 849 | | static CRTC_EGA_UPDATE_ROW( pc_ega_text ) |
| 845 | CRTC_EGA_ROW_UPDATE( isa8_ega_device::pc_ega_text ) |
| 850 | 846 | { |
| 851 | | isa8_ega_device *ega = dynamic_cast<isa8_ega_device*>(device->owner()); |
| 852 | 847 | UINT16 *p = &bitmap.pix16(y); |
| 853 | 848 | int i; |
| 854 | 849 | |
| r29542 | r29543 | |
| 857 | 852 | for ( i = 0; i < x_count; i++ ) |
| 858 | 853 | { |
| 859 | 854 | UINT16 offset = ma + i; |
| 860 | | UINT8 chr = ega->m_plane[0][ offset ]; |
| 861 | | UINT8 attr = ega->m_plane[1][ offset ]; |
| 855 | UINT8 chr = m_plane[0][ offset ]; |
| 856 | UINT8 attr = m_plane[1][ offset ]; |
| 862 | 857 | UINT8 data = 0; |
| 863 | | UINT16 fg = ega->m_attribute.data[ attr & 0x07 ]; |
| 864 | | UINT16 bg = ega->m_attribute.data[ ( attr >> 4 ) & 0x07 ]; |
| 858 | UINT16 fg = m_attribute.data[ attr & 0x07 ]; |
| 859 | UINT16 bg = m_attribute.data[ ( attr >> 4 ) & 0x07 ]; |
| 865 | 860 | |
| 866 | 861 | /* If character set A and B are equal attribute bit 3 is used as intensity */ |
| 867 | | if ( ega->m_charA == ega->m_charB ) |
| 862 | if ( m_charA == m_charB ) |
| 868 | 863 | { |
| 869 | 864 | /* intensity selector */ |
| 870 | | data = ega->m_charB[ chr * 32 + ra ]; |
| 865 | data = m_charB[ chr * 32 + ra ]; |
| 871 | 866 | fg += ( attr & 0x08 ) ? 0x38 : 0x00; |
| 872 | 867 | } |
| 873 | 868 | else |
| 874 | 869 | { |
| 875 | 870 | /* character set selector */ |
| 876 | | data = ( attr & 0x08 ) ? ega->m_charA[ chr * 32 + ra ] : ega->m_charB[ chr * 32 + ra ]; |
| 871 | data = ( attr & 0x08 ) ? m_charA[ chr * 32 + ra ] : m_charB[ chr * 32 + ra ]; |
| 877 | 872 | } |
| 878 | 873 | |
| 879 | 874 | if ( i == cursor_x ) |
| 880 | 875 | { |
| 881 | | if ( ega->m_frame_cnt & 0x08 ) |
| 876 | if ( m_frame_cnt & 0x08 ) |
| 882 | 877 | { |
| 883 | 878 | data = 0xFF; |
| 884 | 879 | } |
| r29542 | r29543 | |
| 886 | 881 | else |
| 887 | 882 | { |
| 888 | 883 | /* Check for blinking */ |
| 889 | | if ( ( ega->m_attribute.data[0x10] & 0x08 ) && ( attr & 0x80 ) && ( ega->m_frame_cnt & 0x10 ) ) |
| 884 | if ( ( m_attribute.data[0x10] & 0x08 ) && ( attr & 0x80 ) && ( m_frame_cnt & 0x10 ) ) |
| 890 | 885 | { |
| 891 | 886 | data = 0x00; |
| 892 | 887 | } |
| r29542 | r29543 | |
| 908 | 903 | { |
| 909 | 904 | int clock, pixels; |
| 910 | 905 | |
| 911 | | m_update_row = NULL; |
| 906 | m_video_mode = 0; |
| 912 | 907 | |
| 913 | 908 | /* Check for graphics mode */ |
| 914 | 909 | if ( ( m_attribute.data[0x10] & 0x01 ) && |
| r29542 | r29543 | |
| 920 | 915 | logerror("change_mode(): Switch to graphics mode\n"); |
| 921 | 916 | } |
| 922 | 917 | |
| 923 | | m_update_row = pc_ega_graphics; |
| 918 | m_video_mode = EGA_MODE_GRAPHICS; |
| 924 | 919 | } |
| 925 | 920 | |
| 926 | 921 | /* Check for text mode */ |
| r29542 | r29543 | |
| 933 | 928 | logerror("chnage_mode(): Switching to text mode\n"); |
| 934 | 929 | } |
| 935 | 930 | |
| 936 | | m_update_row = pc_ega_text; |
| 931 | m_video_mode = EGA_MODE_TEXT; |
| 937 | 932 | |
| 938 | 933 | /* Set character maps */ |
| 939 | 934 | if ( m_sequencer.data[0x04] & 0x02 ) |
| r29542 | r29543 | |
| 959 | 954 | m_crtc_ega->set_clock( clock / pixels ); |
| 960 | 955 | m_crtc_ega->set_hpixels_per_column( pixels ); |
| 961 | 956 | |
| 962 | | if ( ! m_update_row ) |
| 963 | | logerror("unknown video mode\n"); |
| 957 | if (!m_video_mode) |
| 958 | logerror("unknown video mode\n"); |
| 964 | 959 | } |
| 965 | 960 | |
| 966 | 961 | |
branches/new_menus/src/emu/bus/x68k/x68k_neptunex.c
| r29542 | r29543 | |
| 13 | 13 | |
| 14 | 14 | const device_type X68K_NEPTUNEX = &device_creator<x68k_neptune_device>; |
| 15 | 15 | |
| 16 | | static const dp8390_interface neptune_dp8390_interface = { |
| 17 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, x68k_neptune_device, x68k_neptune_irq_w), |
| 18 | | DEVCB_NULL, |
| 19 | | DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, x68k_neptune_device, x68k_neptune_mem_read), |
| 20 | | DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, x68k_neptune_device, x68k_neptune_mem_write) |
| 21 | | }; |
| 22 | | |
| 23 | | |
| 24 | 16 | // device machine config |
| 25 | 17 | static MACHINE_CONFIG_FRAGMENT( x68k_neptunex ) |
| 26 | | MCFG_DP8390D_ADD("dp8390d", neptune_dp8390_interface) |
| 18 | MCFG_DEVICE_ADD("dp8390d", DP8390D, 0) |
| 19 | MCFG_DP8390D_IRQ_CB(WRITELINE(x68k_neptune_device, x68k_neptune_irq_w)) |
| 20 | MCFG_DP8390D_MEM_READ_CB(READ8(x68k_neptune_device, x68k_neptune_mem_read)) |
| 21 | MCFG_DP8390D_MEM_WRITE_CB(WRITE8(x68k_neptune_device, x68k_neptune_mem_write)) |
| 27 | 22 | MACHINE_CONFIG_END |
| 28 | 23 | |
| 29 | 24 | machine_config_constructor x68k_neptune_device::device_mconfig_additions() const |
| r29542 | r29543 | |
| 85 | 80 | m_dp8390->dp8390_reset(CLEAR_LINE); |
| 86 | 81 | return 0; |
| 87 | 82 | default: |
| 88 | | logerror("ne2000: invalid register read %02X\n", offset); |
| 83 | logerror("x68k_neptune: invalid register read %02X\n", offset); |
| 89 | 84 | } |
| 90 | 85 | return 0; |
| 91 | 86 | } |
| r29542 | r29543 | |
| 118 | 113 | m_dp8390->dp8390_reset(ASSERT_LINE); |
| 119 | 114 | return; |
| 120 | 115 | default: |
| 121 | | logerror("ne2000: invalid register write %02X\n", offset); |
| 116 | logerror("x68k_neptune: invalid register write %02X\n", offset); |
| 122 | 117 | } |
| 123 | 118 | return; |
| 124 | 119 | } |
| r29542 | r29543 | |
| 128 | 123 | if(offset < 32) return m_prom[offset>>1]; |
| 129 | 124 | if((offset < (16*1024)) || (offset >= (32*1024))) |
| 130 | 125 | { |
| 131 | | logerror("ne2000: invalid memory read %04X\n", offset); |
| 126 | logerror("x68k_neptune: invalid memory read %04X\n", offset); |
| 132 | 127 | return 0xff; |
| 133 | 128 | } |
| 134 | 129 | return m_board_ram[offset - (16*1024)]; |
| r29542 | r29543 | |
| 138 | 133 | { |
| 139 | 134 | if((offset < (16*1024)) || (offset >= (32*1024))) |
| 140 | 135 | { |
| 141 | | logerror("ne2000: invalid memory write %04X\n", offset); |
| 136 | logerror("x68k_neptune: invalid memory write %04X\n", offset); |
| 142 | 137 | return; |
| 143 | 138 | } |
| 144 | 139 | m_board_ram[offset - (16*1024)] = data; |
branches/new_menus/src/emu/machine/keyboard.c
| r29542 | r29543 | |
| 8 | 8 | Example of usage in a driver. |
| 9 | 9 | |
| 10 | 10 | In MACHINE_CONFIG |
| 11 | | MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf) |
| 11 | |
| 12 | MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0) |
| 13 | MCFG_GENERIC_KEYBOARD_CB(WRITE8(xxx_state, kbd_put)) |
| 12 | 14 | |
| 13 | 15 | In the code: |
| 14 | 16 | |
| r29542 | r29543 | |
| 17 | 19 | (code to capture the key as it is pressed) |
| 18 | 20 | } |
| 19 | 21 | |
| 20 | | static ASCII_KEYBOARD_INTERFACE( keyboard_intf ) |
| 21 | | { |
| 22 | | DEVCB_DRIVER_MEMBER(xxx_state, kbd_put) |
| 23 | | }; |
| 24 | | |
| 25 | 22 | ***************************************************************************/ |
| 26 | 23 | |
| 27 | 24 | #include "machine/keyboard.h" |
| r29542 | r29543 | |
| 41 | 38 | m_io_kbd5(*this, "TERM_LINE5"), |
| 42 | 39 | m_io_kbd6(*this, "TERM_LINE6"), |
| 43 | 40 | m_io_kbd7(*this, "TERM_LINE7"), |
| 44 | | m_io_kbdc(*this, "TERM_LINEC") |
| 41 | m_io_kbdc(*this, "TERM_LINEC"), |
| 42 | m_keyboard_cb(*this) |
| 45 | 43 | { |
| 46 | 44 | } |
| 47 | 45 | |
| r29542 | r29543 | |
| 55 | 53 | m_io_kbd5(*this, "TERM_LINE5"), |
| 56 | 54 | m_io_kbd6(*this, "TERM_LINE6"), |
| 57 | 55 | m_io_kbd7(*this, "TERM_LINE7"), |
| 58 | | m_io_kbdc(*this, "TERM_LINEC") |
| 56 | m_io_kbdc(*this, "TERM_LINEC"), |
| 57 | m_keyboard_cb(*this) |
| 59 | 58 | { |
| 60 | 59 | } |
| 61 | 60 | |
| r29542 | r29543 | |
| 209 | 208 | |
| 210 | 209 | void generic_keyboard_device::device_start() |
| 211 | 210 | { |
| 212 | | m_keyboard_func.resolve(m_keyboard_cb, *this); |
| 211 | m_keyboard_cb.resolve_safe(); |
| 213 | 212 | m_timer = timer_alloc(); |
| 214 | 213 | } |
| 215 | 214 | |
| 216 | | void generic_keyboard_device::device_config_complete() |
| 217 | | { |
| 218 | | const keyboard_interface *intf = reinterpret_cast<const keyboard_interface *>(static_config()); |
| 219 | | if(intf != NULL) |
| 220 | | { |
| 221 | | *static_cast<keyboard_interface *>(this) = *intf; |
| 222 | | } |
| 223 | | else |
| 224 | | { |
| 225 | | memset(&m_keyboard_cb, 0, sizeof(m_keyboard_cb)); |
| 226 | | } |
| 227 | | } |
| 228 | | |
| 229 | 215 | void generic_keyboard_device::device_reset() |
| 230 | 216 | { |
| 231 | 217 | m_last_code = 0; |
branches/new_menus/src/emu/machine/keyboard.h
| r29542 | r29543 | |
| 4 | 4 | #include "emu.h" |
| 5 | 5 | |
| 6 | 6 | /*************************************************************************** |
| 7 | | TYPE DEFINITIONS |
| 8 | | ***************************************************************************/ |
| 9 | | |
| 10 | | struct keyboard_interface |
| 11 | | { |
| 12 | | devcb_write8 m_keyboard_cb; |
| 13 | | }; |
| 14 | | |
| 15 | | #define ASCII_KEYBOARD_INTERFACE(name) const keyboard_interface (name) = |
| 16 | | |
| 17 | | /*************************************************************************** |
| 18 | 7 | DEVICE CONFIGURATION MACROS |
| 19 | 8 | ***************************************************************************/ |
| 20 | 9 | |
| 21 | | #define MCFG_ASCII_KEYBOARD_ADD(_tag, _intrf) \ |
| 22 | | MCFG_DEVICE_ADD(_tag, GENERIC_KEYBOARD, 0) \ |
| 23 | | MCFG_DEVICE_CONFIG(_intrf) |
| 10 | #define MCFG_GENERIC_KEYBOARD_CB(_devcb) \ |
| 11 | devcb = &generic_keyboard_device::set_keyboard_callback(*device, DEVCB2_##_devcb); |
| 24 | 12 | |
| 25 | 13 | /*************************************************************************** |
| 26 | 14 | FUNCTION PROTOTYPES |
| r29542 | r29543 | |
| 28 | 16 | |
| 29 | 17 | INPUT_PORTS_EXTERN( generic_keyboard ); |
| 30 | 18 | |
| 31 | | class generic_keyboard_device : |
| 32 | | public device_t, |
| 33 | | public keyboard_interface |
| 19 | class generic_keyboard_device : public device_t |
| 34 | 20 | { |
| 35 | 21 | public: |
| 36 | 22 | generic_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); |
| 37 | 23 | generic_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 24 | |
| 25 | template<class _Object> static devcb2_base &set_keyboard_callback(device_t &device, _Object object) { return downcast<generic_keyboard_device &>(device).m_keyboard_cb.set_callback(object); } |
| 38 | 26 | |
| 39 | 27 | virtual ioport_constructor device_input_ports() const; |
| 40 | 28 | virtual machine_config_constructor device_mconfig_additions() const; |
| r29542 | r29543 | |
| 52 | 40 | virtual void device_start(); |
| 53 | 41 | virtual void device_reset(); |
| 54 | 42 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 55 | | virtual void device_config_complete(); |
| 56 | | virtual void send_key(UINT8 code) { m_keyboard_func(0, code); } |
| 43 | virtual void send_key(UINT8 code) { m_keyboard_cb((offs_t)0, code); } |
| 57 | 44 | emu_timer *m_timer; |
| 58 | 45 | private: |
| 59 | 46 | virtual UINT8 keyboard_handler(UINT8 last_code, UINT8 *scan_line); |
| r29542 | r29543 | |
| 61 | 48 | UINT8 m_last_code; |
| 62 | 49 | UINT8 m_scan_line; |
| 63 | 50 | |
| 64 | | devcb_resolved_write8 m_keyboard_func; |
| 51 | devcb2_write8 m_keyboard_cb; |
| 65 | 52 | }; |
| 66 | 53 | |
| 67 | 54 | extern const device_type GENERIC_KEYBOARD; |
branches/new_menus/src/emu/machine/wd11c00_17.c
| r29542 | r29543 | |
| 42 | 42 | const device_type WD11C00_17 = &device_creator<wd11c00_17_device>; |
| 43 | 43 | |
| 44 | 44 | |
| 45 | | //------------------------------------------------- |
| 46 | | // device_config_complete - perform any |
| 47 | | // operations now that the configuration is |
| 48 | | // complete |
| 49 | | //------------------------------------------------- |
| 50 | | |
| 51 | | void wd11c00_17_device::device_config_complete() |
| 52 | | { |
| 53 | | // inherit a copy of the static data |
| 54 | | const wd11c00_17_interface *intf = reinterpret_cast<const wd11c00_17_interface *>(static_config()); |
| 55 | | if (intf != NULL) |
| 56 | | *static_cast<wd11c00_17_interface *>(this) = *intf; |
| 57 | | |
| 58 | | // or initialize to defaults if none provided |
| 59 | | else |
| 60 | | { |
| 61 | | memset(&m_out_irq5_cb, 0, sizeof(m_out_irq5_cb)); |
| 62 | | memset(&m_out_drq3_cb, 0, sizeof(m_out_drq3_cb)); |
| 63 | | memset(&m_out_mr_cb, 0, sizeof(m_out_mr_cb)); |
| 64 | | memset(&m_out_busy_cb, 0, sizeof(m_out_busy_cb)); |
| 65 | | memset(&m_out_req_cb, 0, sizeof(m_out_req_cb)); |
| 66 | | memset(&m_out_ra3_cb, 0, sizeof(m_out_ra3_cb)); |
| 67 | | memset(&m_in_rd322_cb, 0, sizeof(m_in_rd322_cb)); |
| 68 | | memset(&m_in_ramcs_cb, 0, sizeof(m_in_ramcs_cb)); |
| 69 | | memset(&m_out_ramwr_cb, 0, sizeof(m_out_ramwr_cb)); |
| 70 | | memset(&m_in_cs1010_cb, 0, sizeof(m_in_cs1010_cb)); |
| 71 | | memset(&m_out_cs1010_cb, 0, sizeof(m_out_cs1010_cb)); |
| 72 | | } |
| 73 | | } |
| 74 | | |
| 75 | | |
| 76 | | |
| 77 | 45 | //************************************************************************** |
| 78 | 46 | // INLINE HELPERS |
| 79 | 47 | //************************************************************************** |
| r29542 | r29543 | |
| 93 | 61 | |
| 94 | 62 | if (m_ra3 != ra3) |
| 95 | 63 | { |
| 96 | | m_out_ra3_func(ra3 ? ASSERT_LINE : CLEAR_LINE); |
| 64 | m_out_ra3_cb(ra3 ? ASSERT_LINE : CLEAR_LINE); |
| 97 | 65 | m_ra3 = ra3; |
| 98 | 66 | } |
| 99 | 67 | |
| r29542 | r29543 | |
| 101 | 69 | |
| 102 | 70 | if (m_irq5 != irq5) |
| 103 | 71 | { |
| 104 | | m_out_irq5_func(irq5); |
| 72 | m_out_irq5_cb(irq5); |
| 105 | 73 | m_irq5 = irq5; |
| 106 | 74 | } |
| 107 | 75 | |
| r29542 | r29543 | |
| 109 | 77 | |
| 110 | 78 | if (m_drq3 != drq3) |
| 111 | 79 | { |
| 112 | | m_out_drq3_func(drq3); |
| 80 | m_out_drq3_cb(drq3); |
| 113 | 81 | m_drq3 = drq3; |
| 114 | 82 | } |
| 115 | 83 | |
| r29542 | r29543 | |
| 117 | 85 | |
| 118 | 86 | if (m_busy != busy) |
| 119 | 87 | { |
| 120 | | m_out_busy_func(busy); |
| 88 | m_out_busy_cb(busy); |
| 121 | 89 | m_busy = busy; |
| 122 | 90 | } |
| 123 | 91 | |
| r29542 | r29543 | |
| 125 | 93 | |
| 126 | 94 | if (m_req != req) |
| 127 | 95 | { |
| 128 | | m_out_req_func(req); |
| 96 | m_out_req_cb(req); |
| 129 | 97 | m_req = req; |
| 130 | 98 | } |
| 131 | 99 | } |
| r29542 | r29543 | |
| 152 | 120 | |
| 153 | 121 | if (m_status & STATUS_BUSY) |
| 154 | 122 | { |
| 155 | | data = m_in_ramcs_func(m_ra & 0x7ff); |
| 123 | data = m_in_ramcs_cb(m_ra & 0x7ff); |
| 156 | 124 | |
| 157 | 125 | increment_address(); |
| 158 | 126 | } |
| r29542 | r29543 | |
| 169 | 137 | { |
| 170 | 138 | if (m_status & STATUS_BUSY) |
| 171 | 139 | { |
| 172 | | m_out_ramwr_func(m_ra & 0x7ff, data); |
| 140 | m_out_ramwr_cb(m_ra & 0x7ff, data); |
| 173 | 141 | |
| 174 | 142 | increment_address(); |
| 175 | 143 | } |
| r29542 | r29543 | |
| 182 | 150 | |
| 183 | 151 | inline void wd11c00_17_device::software_reset() |
| 184 | 152 | { |
| 185 | | m_out_mr_func(ASSERT_LINE); |
| 186 | | m_out_mr_func(CLEAR_LINE); |
| 153 | m_out_mr_cb(ASSERT_LINE); |
| 154 | m_out_mr_cb(CLEAR_LINE); |
| 187 | 155 | |
| 188 | 156 | device_reset(); |
| 189 | 157 | } |
| r29542 | r29543 | |
| 212 | 180 | |
| 213 | 181 | wd11c00_17_device::wd11c00_17_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 214 | 182 | : device_t(mconfig, WD11C00_17, "Western Digital WD11C00-17", tag, owner, clock, "wd11c00_17", __FILE__), |
| 183 | m_out_irq5_cb(*this), |
| 184 | m_out_drq3_cb(*this), |
| 185 | m_out_mr_cb(*this), |
| 186 | m_out_busy_cb(*this), |
| 187 | m_out_req_cb(*this), |
| 188 | m_out_ra3_cb(*this), |
| 189 | m_in_rd322_cb(*this), |
| 190 | m_in_ramcs_cb(*this), |
| 191 | m_out_ramwr_cb(*this), |
| 192 | m_in_cs1010_cb(*this), |
| 193 | m_out_cs1010_cb(*this), |
| 215 | 194 | m_status(0), |
| 216 | 195 | m_ra(0), |
| 217 | 196 | m_irq5(CLEAR_LINE), |
| r29542 | r29543 | |
| 230 | 209 | void wd11c00_17_device::device_start() |
| 231 | 210 | { |
| 232 | 211 | // resolve callbacks |
| 233 | | m_out_irq5_func.resolve(m_out_irq5_cb, *this); |
| 234 | | m_out_drq3_func.resolve(m_out_drq3_cb, *this); |
| 235 | | m_out_mr_func.resolve(m_out_mr_cb, *this); |
| 236 | | m_out_busy_func.resolve(m_out_busy_cb, *this); |
| 237 | | m_out_req_func.resolve(m_out_req_cb, *this); |
| 238 | | m_out_ra3_func.resolve(m_out_ra3_cb, *this); |
| 239 | | m_in_rd322_func.resolve(m_in_rd322_cb, *this); |
| 240 | | m_in_ramcs_func.resolve(m_in_ramcs_cb, *this); |
| 241 | | m_out_ramwr_func.resolve(m_out_ramwr_cb, *this); |
| 242 | | m_in_cs1010_func.resolve(m_in_cs1010_cb, *this); |
| 243 | | m_out_cs1010_func.resolve(m_out_cs1010_cb, *this); |
| 212 | m_out_irq5_cb.resolve_safe(); |
| 213 | m_out_drq3_cb.resolve_safe(); |
| 214 | m_out_mr_cb.resolve_safe(); |
| 215 | m_out_busy_cb.resolve_safe(); |
| 216 | m_out_req_cb.resolve_safe(); |
| 217 | m_out_ra3_cb.resolve_safe(); |
| 218 | m_in_rd322_cb.resolve_safe(0); |
| 219 | m_in_ramcs_cb.resolve_safe(0); |
| 220 | m_out_ramwr_cb.resolve_safe(); |
| 221 | m_in_cs1010_cb.resolve_safe(0); |
| 222 | m_out_cs1010_cb.resolve_safe(); |
| 244 | 223 | } |
| 245 | 224 | |
| 246 | 225 | |
| r29542 | r29543 | |
| 280 | 259 | break; |
| 281 | 260 | |
| 282 | 261 | case 2: // Read Drive Configuration Information |
| 283 | | data = m_in_rd322_func(0); |
| 262 | data = m_in_rd322_cb(0); |
| 284 | 263 | break; |
| 285 | 264 | |
| 286 | 265 | case 3: // Not Used |
| r29542 | r29543 | |
| 361 | 340 | break; |
| 362 | 341 | |
| 363 | 342 | case 0x20: |
| 364 | | data = m_in_cs1010_func(m_ra >> 8); |
| 343 | data = m_in_cs1010_cb(m_ra >> 8); |
| 365 | 344 | break; |
| 366 | 345 | } |
| 367 | 346 | |
| r29542 | r29543 | |
| 384 | 363 | break; |
| 385 | 364 | |
| 386 | 365 | case 0x20: |
| 387 | | m_out_cs1010_func(m_ra >> 8, data); |
| 366 | m_out_cs1010_cb(m_ra >> 8, data); |
| 388 | 367 | break; |
| 389 | 368 | |
| 390 | 369 | case 0x60: |
branches/new_menus/src/emu/machine/wd11c00_17.h
| r29542 | r29543 | |
| 23 | 23 | // INTERFACE CONFIGURATION MACROS |
| 24 | 24 | //************************************************************************** |
| 25 | 25 | |
| 26 | | #define MCFG_WD11C00_17_ADD(_tag, _clock, _config) \ |
| 27 | | MCFG_DEVICE_ADD(_tag, WD11C00_17, _clock) \ |
| 28 | | MCFG_DEVICE_CONFIG(_config) |
| 26 | #define MCFG_WD11C00_17_OUT_IRQ5_CB(_devcb) \ |
| 27 | devcb = &wd11c00_17_device::set_out_irq5_callback(*device, DEVCB2_##_devcb); |
| 29 | 28 | |
| 29 | #define MCFG_WD11C00_17_OUT_DRQ3_CB(_devcb) \ |
| 30 | devcb = &wd11c00_17_device::set_out_drq3_callback(*device, DEVCB2_##_devcb); |
| 30 | 31 | |
| 31 | | #define WD11C00_17_INTERFACE(_name) \ |
| 32 | | const wd11c00_17_interface (_name) = |
| 32 | #define MCFG_WD11C00_17_OUT_MR_CB(_devcb) \ |
| 33 | devcb = &wd11c00_17_device::set_out_mr_callback(*device, DEVCB2_##_devcb); |
| 33 | 34 | |
| 35 | #define MCFG_WD11C00_17_OUT_BUSY_CB(_devcb) \ |
| 36 | devcb = &wd11c00_17_device::set_out_busy_callback(*device, DEVCB2_##_devcb); |
| 34 | 37 | |
| 38 | #define MCFG_WD11C00_17_OUT_REQ_CB(_devcb) \ |
| 39 | devcb = &wd11c00_17_device::set_out_req_callback(*device, DEVCB2_##_devcb); |
| 35 | 40 | |
| 41 | #define MCFG_WD11C00_17_OUT_RA3_CB(_devcb) \ |
| 42 | devcb = &wd11c00_17_device::set_out_ra3_callback(*device, DEVCB2_##_devcb); |
| 43 | |
| 44 | #define MCFG_WD11C00_17_IN_RD322_CB(_devcb) \ |
| 45 | devcb = &wd11c00_17_device::set_in_rd322_callback(*device, DEVCB2_##_devcb); |
| 46 | |
| 47 | #define MCFG_WD11C00_17_IN_RAMCS_CB(_devcb) \ |
| 48 | devcb = &wd11c00_17_device::set_in_ramcs_callback(*device, DEVCB2_##_devcb); |
| 49 | |
| 50 | #define MCFG_WD11C00_17_OUT_RAMWR_CB(_devcb) \ |
| 51 | devcb = &wd11c00_17_device::set_out_ramwr_callback(*device, DEVCB2_##_devcb); |
| 52 | |
| 53 | #define MCFG_WD11C00_17_IN_CS1010_CB(_devcb) \ |
| 54 | devcb = &wd11c00_17_device::set_in_cs1010_callback(*device, DEVCB2_##_devcb); |
| 55 | |
| 56 | #define MCFG_WD11C00_17_OUT_CS1010_CB(_devcb) \ |
| 57 | devcb = &wd11c00_17_device::set_out_cs1010_callback(*device, DEVCB2_##_devcb); |
| 58 | |
| 36 | 59 | //************************************************************************** |
| 37 | 60 | // TYPE DEFINITIONS |
| 38 | 61 | //************************************************************************** |
| 39 | 62 | |
| 40 | | // ======================> wd11c00_17_interface |
| 41 | | |
| 42 | | struct wd11c00_17_interface |
| 43 | | { |
| 44 | | devcb_write_line m_out_irq5_cb; |
| 45 | | devcb_write_line m_out_drq3_cb; |
| 46 | | devcb_write_line m_out_mr_cb; |
| 47 | | devcb_write_line m_out_busy_cb; |
| 48 | | devcb_write_line m_out_req_cb; |
| 49 | | devcb_write_line m_out_ra3_cb; |
| 50 | | devcb_read8 m_in_rd322_cb; |
| 51 | | devcb_read8 m_in_ramcs_cb; |
| 52 | | devcb_write8 m_out_ramwr_cb; |
| 53 | | devcb_read8 m_in_cs1010_cb; |
| 54 | | devcb_write8 m_out_cs1010_cb; |
| 55 | | }; |
| 56 | | |
| 57 | | |
| 58 | 63 | // ======================> wd11c00_17_device |
| 59 | 64 | |
| 60 | | class wd11c00_17_device : public device_t, |
| 61 | | public wd11c00_17_interface |
| 65 | class wd11c00_17_device : public device_t |
| 62 | 66 | { |
| 63 | 67 | public: |
| 64 | 68 | // construction/destruction |
| 65 | 69 | wd11c00_17_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 66 | 70 | |
| 71 | template<class _Object> static devcb2_base &set_out_irq5_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_out_irq5_cb.set_callback(object); } |
| 72 | template<class _Object> static devcb2_base &set_out_drq3_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_out_drq3_cb.set_callback(object); } |
| 73 | template<class _Object> static devcb2_base &set_out_mr_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_out_mr_cb.set_callback(object); } |
| 74 | template<class _Object> static devcb2_base &set_out_busy_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_out_busy_cb.set_callback(object); } |
| 75 | template<class _Object> static devcb2_base &set_out_req_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_out_req_cb.set_callback(object); } |
| 76 | template<class _Object> static devcb2_base &set_out_ra3_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_out_ra3_cb.set_callback(object); } |
| 77 | template<class _Object> static devcb2_base &set_in_rd322_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_in_rd322_cb.set_callback(object); } |
| 78 | template<class _Object> static devcb2_base &set_in_ramcs_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_in_ramcs_cb.set_callback(object); } |
| 79 | template<class _Object> static devcb2_base &set_out_ramwr_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_out_ramwr_cb.set_callback(object); } |
| 80 | template<class _Object> static devcb2_base &set_in_cs1010_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_in_cs1010_cb.set_callback(object); } |
| 81 | template<class _Object> static devcb2_base &set_out_cs1010_callback(device_t &device, _Object object) { return downcast<wd11c00_17_device &>(device).m_out_cs1010_cb.set_callback(object); } |
| 82 | |
| 67 | 83 | DECLARE_READ8_MEMBER( io_r ); |
| 68 | 84 | DECLARE_WRITE8_MEMBER( io_w ); |
| 69 | 85 | |
| r29542 | r29543 | |
| 86 | 102 | // device-level overrides |
| 87 | 103 | virtual void device_start(); |
| 88 | 104 | virtual void device_reset(); |
| 89 | | virtual void device_config_complete(); |
| 90 | 105 | |
| 91 | 106 | private: |
| 92 | 107 | inline void check_interrupt(); |
| r29542 | r29543 | |
| 96 | 111 | inline void software_reset(); |
| 97 | 112 | inline void select(); |
| 98 | 113 | |
| 99 | | devcb_resolved_write_line m_out_irq5_func; |
| 100 | | devcb_resolved_write_line m_out_drq3_func; |
| 101 | | devcb_resolved_write_line m_out_mr_func; |
| 102 | | devcb_resolved_write_line m_out_busy_func; |
| 103 | | devcb_resolved_write_line m_out_req_func; |
| 104 | | devcb_resolved_write_line m_out_ra3_func; |
| 105 | | devcb_resolved_read8 m_in_rd322_func; |
| 106 | | devcb_resolved_read8 m_in_ramcs_func; |
| 107 | | devcb_resolved_write8 m_out_ramwr_func; |
| 108 | | devcb_resolved_read8 m_in_cs1010_func; |
| 109 | | devcb_resolved_write8 m_out_cs1010_func; |
| 114 | devcb2_write_line m_out_irq5_cb; |
| 115 | devcb2_write_line m_out_drq3_cb; |
| 116 | devcb2_write_line m_out_mr_cb; |
| 117 | devcb2_write_line m_out_busy_cb; |
| 118 | devcb2_write_line m_out_req_cb; |
| 119 | devcb2_write_line m_out_ra3_cb; |
| 120 | devcb2_read8 m_in_rd322_cb; |
| 121 | devcb2_read8 m_in_ramcs_cb; |
| 122 | devcb2_write8 m_out_ramwr_cb; |
| 123 | devcb2_read8 m_in_cs1010_cb; |
| 124 | devcb2_write8 m_out_cs1010_cb; |
| 110 | 125 | |
| 111 | 126 | UINT8 m_status; |
| 112 | 127 | UINT8 m_mask; |
branches/new_menus/src/emu/machine/terminal.c
| r29542 | r29543 | |
| 141 | 141 | generic_terminal_device::generic_terminal_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) |
| 142 | 142 | : device_t(mconfig, type, name, tag, owner, clock, shortname, source), |
| 143 | 143 | m_palette(*this, "palette"), |
| 144 | | m_io_term_conf(*this, "TERM_CONF") |
| 144 | m_io_term_conf(*this, "TERM_CONF"), |
| 145 | m_keyboard_cb(*this) |
| 145 | 146 | { |
| 146 | 147 | } |
| 147 | 148 | |
| 148 | 149 | generic_terminal_device::generic_terminal_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 149 | 150 | : device_t(mconfig, GENERIC_TERMINAL, "Generic Terminal", tag, owner, clock, "generic_terminal", __FILE__), |
| 150 | 151 | m_palette(*this, "palette"), |
| 151 | | m_io_term_conf(*this, "TERM_CONF") |
| 152 | m_io_term_conf(*this, "TERM_CONF"), |
| 153 | m_keyboard_cb(*this) |
| 152 | 154 | { |
| 153 | 155 | } |
| 154 | 156 | |
| r29542 | r29543 | |
| 304 | 306 | send_key(data); |
| 305 | 307 | } |
| 306 | 308 | |
| 307 | | static ASCII_KEYBOARD_INTERFACE( keyboard_intf ) |
| 308 | | { |
| 309 | | DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, generic_terminal_device, kbd_put) |
| 310 | | }; |
| 311 | | |
| 312 | 309 | /*************************************************************************** |
| 313 | 310 | VIDEO HARDWARE |
| 314 | 311 | ***************************************************************************/ |
| r29542 | r29543 | |
| 323 | 320 | |
| 324 | 321 | MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette") |
| 325 | 322 | |
| 326 | | MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf) |
| 323 | MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0) |
| 324 | MCFG_GENERIC_KEYBOARD_CB(WRITE8(generic_terminal_device, kbd_put)) |
| 327 | 325 | MACHINE_CONFIG_END |
| 328 | 326 | |
| 329 | 327 | machine_config_constructor generic_terminal_device::device_mconfig_additions() const |
| r29542 | r29543 | |
| 333 | 331 | |
| 334 | 332 | void generic_terminal_device::device_start() |
| 335 | 333 | { |
| 336 | | m_keyboard_func.resolve(m_keyboard_cb, *this); |
| 334 | m_keyboard_cb.resolve_safe(); |
| 337 | 335 | } |
| 338 | 336 | |
| 339 | | void generic_terminal_device::device_config_complete() |
| 340 | | { |
| 341 | | const terminal_interface *intf = reinterpret_cast<const terminal_interface *>(static_config()); |
| 342 | | if(intf != NULL) |
| 343 | | { |
| 344 | | *static_cast<terminal_interface *>(this) = *intf; |
| 345 | | } |
| 346 | | else |
| 347 | | { |
| 348 | | memset(&m_keyboard_cb, 0, sizeof(m_keyboard_cb)); |
| 349 | | } |
| 350 | | } |
| 351 | | |
| 352 | 337 | void generic_terminal_device::device_reset() |
| 353 | 338 | { |
| 354 | 339 | clear(); |
branches/new_menus/src/emu/machine/terminal.h
| r29542 | r29543 | |
| 6 | 6 | #define TERMINAL_SCREEN_TAG "terminal_screen" |
| 7 | 7 | |
| 8 | 8 | /*************************************************************************** |
| 9 | | TYPE DEFINITIONS |
| 10 | | ***************************************************************************/ |
| 11 | | |
| 12 | | struct terminal_interface |
| 13 | | { |
| 14 | | devcb_write8 m_keyboard_cb; |
| 15 | | }; |
| 16 | | |
| 17 | | #define GENERIC_TERMINAL_INTERFACE(name) const terminal_interface (name) = |
| 18 | | |
| 19 | | /*************************************************************************** |
| 20 | 9 | DEVICE CONFIGURATION MACROS |
| 21 | 10 | ***************************************************************************/ |
| 22 | 11 | |
| 23 | | #define MCFG_GENERIC_TERMINAL_ADD(_tag, _intrf) \ |
| 24 | | MCFG_DEVICE_ADD(_tag, GENERIC_TERMINAL, 0) \ |
| 25 | | MCFG_DEVICE_CONFIG(_intrf) |
| 12 | #define MCFG_GENERIC_TERMINAL_KEYBOARD_CB(_devcb) \ |
| 13 | devcb = &generic_terminal_device::set_keyboard_callback(*device, DEVCB2_##_devcb); |
| 26 | 14 | |
| 27 | | #define MCFG_GENERIC_TERMINAL_REMOVE(_tag) \ |
| 28 | | MCFG_DEVICE_REMOVE(_tag) |
| 29 | | |
| 30 | 15 | /*************************************************************************** |
| 31 | 16 | FUNCTION PROTOTYPES |
| 32 | 17 | ***************************************************************************/ |
| r29542 | r29543 | |
| 36 | 21 | |
| 37 | 22 | INPUT_PORTS_EXTERN( generic_terminal ); |
| 38 | 23 | |
| 39 | | class generic_terminal_device : |
| 40 | | public device_t, |
| 41 | | public terminal_interface |
| 24 | class generic_terminal_device : public device_t |
| 42 | 25 | { |
| 43 | 26 | public: |
| 44 | 27 | generic_terminal_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); |
| 45 | 28 | generic_terminal_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 29 | |
| 30 | template<class _Object> static devcb2_base &set_keyboard_callback(device_t &device, _Object object) { return downcast<generic_terminal_device &>(device).m_keyboard_cb.set_callback(object); } |
| 31 | |
| 46 | 32 | DECLARE_WRITE8_MEMBER(write) { term_write(data); } |
| 47 | 33 | DECLARE_WRITE8_MEMBER(kbd_put); |
| 48 | 34 | UINT32 update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| r29542 | r29543 | |
| 56 | 42 | virtual void term_write(UINT8 data); |
| 57 | 43 | virtual void device_start(); |
| 58 | 44 | virtual void device_reset(); |
| 59 | | virtual void device_config_complete(); |
| 60 | | virtual void send_key(UINT8 code) { m_keyboard_func(0, code); } |
| 45 | virtual void send_key(UINT8 code) { m_keyboard_cb((offs_t)0, code); } |
| 61 | 46 | UINT8 m_buffer[TERMINAL_WIDTH*50]; // make big enough for teleprinter |
| 62 | 47 | UINT8 m_x_pos; |
| 63 | 48 | private: |
| r29542 | r29543 | |
| 68 | 53 | UINT8 m_framecnt; |
| 69 | 54 | UINT8 m_y_pos; |
| 70 | 55 | |
| 71 | | devcb_resolved_write8 m_keyboard_func; |
| 56 | devcb2_write8 m_keyboard_cb; |
| 72 | 57 | }; |
| 73 | 58 | |
| 74 | 59 | extern const device_type GENERIC_TERMINAL; |
branches/new_menus/src/emu/machine/dp8390.c
| r29542 | r29543 | |
| 7 | 7 | const device_type DP8390D = &device_creator<dp8390d_device>; |
| 8 | 8 | const device_type RTL8019A = &device_creator<rtl8019a_device>; |
| 9 | 9 | |
| 10 | | void dp8390_device::device_config_complete() { |
| 11 | | const dp8390_interface *intf = reinterpret_cast<const dp8390_interface *>(static_config()); |
| 12 | | if(intf != NULL) |
| 13 | | *static_cast<dp8390_interface *>(this) = *intf; |
| 14 | | else { |
| 15 | | memset(&irq_cb, 0, sizeof(irq_cb)); |
| 16 | | memset(&breq_cb, 0, sizeof(breq_cb)); |
| 17 | | memset(&mem_read_cb, 0, sizeof(mem_read_cb)); |
| 18 | | memset(&mem_write_cb, 0, sizeof(mem_write_cb)); |
| 19 | | } |
| 20 | | } |
| 21 | | |
| 22 | 10 | dp8390d_device::dp8390d_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 23 | 11 | : dp8390_device(mconfig, DP8390D, "DP8390D", tag, owner, clock, 10.0f, "dp8390d", __FILE__) { |
| 24 | 12 | m_type = TYPE_DP8390D; |
| r29542 | r29543 | |
| 31 | 19 | |
| 32 | 20 | dp8390_device::dp8390_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, float bandwidth, const char *shortname, const char *source) |
| 33 | 21 | : device_t(mconfig, type, name, tag, owner, clock, shortname, source), |
| 34 | | device_network_interface(mconfig, *this, bandwidth) { |
| 22 | device_network_interface(mconfig, *this, bandwidth), |
| 23 | m_irq_cb(*this), |
| 24 | m_breq_cb(*this), |
| 25 | m_mem_read_cb(*this), |
| 26 | m_mem_write_cb(*this) |
| 27 | { |
| 35 | 28 | } |
| 36 | 29 | |
| 37 | 30 | void dp8390_device::device_start() { |
| 38 | | irq_func.resolve(irq_cb, *this); |
| 39 | | breq_func.resolve(breq_cb, *this); |
| 40 | | mem_read.resolve(mem_read_cb, *this); |
| 41 | | mem_write.resolve(mem_write_cb, *this); |
| 31 | m_irq_cb.resolve_safe(); |
| 32 | m_breq_cb.resolve_safe(); |
| 33 | m_mem_read_cb.resolve_safe(0); |
| 34 | m_mem_write_cb.resolve_safe(); |
| 42 | 35 | } |
| 43 | 36 | |
| 44 | 37 | void dp8390_device::stop() { |
| 45 | 38 | m_regs.isr = 0x80; // is this right? |
| 46 | 39 | m_regs.cr |= 1; |
| 47 | | irq_func(CLEAR_LINE); |
| 40 | m_irq_cb(CLEAR_LINE); |
| 48 | 41 | m_reset = 1; |
| 49 | 42 | } |
| 50 | 43 | |
| r29542 | r29543 | |
| 56 | 49 | memset(&m_8019regs, 0, sizeof(m_8019regs)); |
| 57 | 50 | m_8019regs.config1 = 0x80; |
| 58 | 51 | m_8019regs.config3 = 0x01; |
| 59 | | irq_func(CLEAR_LINE); |
| 52 | m_irq_cb(CLEAR_LINE); |
| 60 | 53 | |
| 61 | 54 | m_reset = 1; |
| 62 | 55 | } |
| r29542 | r29543 | |
| 83 | 76 | } |
| 84 | 77 | |
| 85 | 78 | buf.resize(m_regs.tbcr); |
| 86 | | for(i = 0; i < m_regs.tbcr; i++) buf[i] = mem_read(high16 + (m_regs.tpsr << 8) + i); |
| 79 | for(i = 0; i < m_regs.tbcr; i++) buf[i] = m_mem_read_cb(high16 + (m_regs.tpsr << 8) + i); |
| 87 | 80 | |
| 88 | 81 | if(send(buf, m_regs.tbcr)) { |
| 89 | 82 | m_regs.tsr = 1; |
| r29542 | r29543 | |
| 139 | 132 | len &= 0xffff; |
| 140 | 133 | |
| 141 | 134 | for(i = 0; i < len; i++) { |
| 142 | | mem_write(high16 + offset, buf[i]); |
| 135 | m_mem_write_cb(high16 + offset, buf[i]); |
| 143 | 136 | offset++; |
| 144 | 137 | if(!(offset & 0xff)) { |
| 145 | 138 | if((offset >> 8) == m_regs.pstop) offset = m_regs.pstart << 8; |
| r29542 | r29543 | |
| 149 | 142 | if(len < 60) { |
| 150 | 143 | // this can't pass to the next page |
| 151 | 144 | for(; i < 60; i++) { |
| 152 | | mem_write(high16 + offset, 0); |
| 145 | m_mem_write_cb(high16 + offset, 0); |
| 153 | 146 | offset++; |
| 154 | 147 | } |
| 155 | 148 | len = 60; |
| r29542 | r29543 | |
| 160 | 153 | m_regs.curr = (offset >> 8) + ((offset & 0xff)?1:0); |
| 161 | 154 | if(m_regs.curr == m_regs.pstop) m_regs.curr = m_regs.pstart; |
| 162 | 155 | len += 4; |
| 163 | | mem_write(start, m_regs.rsr); |
| 164 | | mem_write(start+1, m_regs.curr); |
| 165 | | mem_write(start+2, len & 0xff); |
| 166 | | mem_write(start+3, len >> 8); |
| 156 | m_mem_write_cb((offs_t)start, m_regs.rsr); |
| 157 | m_mem_write_cb((offs_t)start+1, m_regs.curr); |
| 158 | m_mem_write_cb((offs_t)start+2, len & 0xff); |
| 159 | m_mem_write_cb((offs_t)start+3, len >> 8); |
| 167 | 160 | check_irq(); |
| 168 | 161 | } |
| 169 | 162 | |
| r29542 | r29543 | |
| 185 | 178 | UINT32 high16 = (m_regs.dcr & 4)?m_regs.rsar<<16:0; |
| 186 | 179 | if(m_regs.dcr & 1) { |
| 187 | 180 | m_regs.crda &= ~1; |
| 188 | | data = mem_read(high16 + m_regs.crda++); |
| 189 | | data |= mem_read(high16 + m_regs.crda++) << 8; |
| 181 | data = m_mem_read_cb(high16 + m_regs.crda++); |
| 182 | data |= m_mem_read_cb(high16 + m_regs.crda++) << 8; |
| 190 | 183 | m_regs.rbcr -= (m_regs.rbcr < 2)?m_regs.rbcr:2; |
| 191 | 184 | check_dma_complete(); |
| 192 | 185 | return DP8390_BYTE_ORDER(data); |
| 193 | 186 | } else { |
| 194 | 187 | m_regs.rbcr -= (m_regs.rbcr)?1:0; |
| 195 | | data = mem_read(high16 + m_regs.crda++); |
| 188 | data = m_mem_read_cb(high16 + m_regs.crda++); |
| 196 | 189 | check_dma_complete(); |
| 197 | 190 | return data; |
| 198 | 191 | } |
| r29542 | r29543 | |
| 355 | 348 | if(m_regs.dcr & 1) { |
| 356 | 349 | data = DP8390_BYTE_ORDER(data); |
| 357 | 350 | m_regs.crda &= ~1; |
| 358 | | mem_write(high16 + m_regs.crda++, data & 0xff); |
| 359 | | mem_write(high16 + m_regs.crda++, data >> 8); |
| 351 | m_mem_write_cb(high16 + m_regs.crda++, data & 0xff); |
| 352 | m_mem_write_cb(high16 + m_regs.crda++, data >> 8); |
| 360 | 353 | m_regs.rbcr -= (m_regs.rbcr < 2)?m_regs.rbcr:2; |
| 361 | 354 | check_dma_complete(); |
| 362 | 355 | } else { |
| 363 | 356 | data &= 0xff; |
| 364 | | mem_write(high16 + m_regs.crda++, data); |
| 357 | m_mem_write_cb(high16 + m_regs.crda++, data); |
| 365 | 358 | m_regs.rbcr -= (m_regs.rbcr)?1:0; |
| 366 | 359 | check_dma_complete(); |
| 367 | 360 | } |
branches/new_menus/src/emu/machine/dp8390.h
| r29542 | r29543 | |
| 3 | 3 | |
| 4 | 4 | #include "emu.h" |
| 5 | 5 | |
| 6 | | struct dp8390_interface |
| 7 | | { |
| 8 | | devcb_write_line irq_cb; |
| 9 | | devcb_write_line breq_cb; |
| 10 | | devcb_read8 mem_read_cb; |
| 11 | | devcb_write8 mem_write_cb; |
| 12 | | }; |
| 13 | 6 | |
| 14 | 7 | // device stuff |
| 15 | | #define MCFG_DP8390D_ADD(_tag, _intrf) \ |
| 16 | | MCFG_DEVICE_ADD(_tag, DP8390D, 0) \ |
| 17 | | MCFG_DEVICE_CONFIG(_intrf) |
| 18 | 8 | |
| 19 | | #define MCFG_RTL8019A_ADD(_tag, _intrf) \ |
| 20 | | MCFG_DEVICE_ADD(_tag, RTL8019A, 0) \ |
| 21 | | MCFG_DEVICE_CONFIG(_intrf) |
| 9 | #define MCFG_DP8390D_IRQ_CB(_devcb) \ |
| 10 | devcb = &dp8390d_device::set_irq_callback(*device, DEVCB2_##_devcb); |
| 22 | 11 | |
| 12 | #define MCFG_DP8390D_BREQ_CB(_devcb) \ |
| 13 | devcb = &dp8390d_device::set_breq_callback(*device, DEVCB2_##_devcb); |
| 14 | |
| 15 | #define MCFG_DP8390D_MEM_READ_CB(_devcb) \ |
| 16 | devcb = &dp8390d_device::set_mem_read_callback(*device, DEVCB2_##_devcb); |
| 17 | |
| 18 | #define MCFG_DP8390D_MEM_WRITE_CB(_devcb) \ |
| 19 | devcb = &dp8390d_device::set_mem_write_callback(*device, DEVCB2_##_devcb); |
| 20 | |
| 21 | #define MCFG_RTL8019A_IRQ_CB(_devcb) \ |
| 22 | devcb = &rtl8019a_device::set_irq_callback(*device, DEVCB2_##_devcb); |
| 23 | |
| 24 | #define MCFG_RTL8019A_BREQ_CB(_devcb) \ |
| 25 | devcb = &rtl8019a_device::set_breq_callback(*device, DEVCB2_##_devcb); |
| 26 | |
| 27 | #define MCFG_RTL8019A_MEM_READ_CB(_devcb) \ |
| 28 | devcb = &rtl8019a_device::set_mem_read_callback(*device, DEVCB2_##_devcb); |
| 29 | |
| 30 | #define MCFG_RTL8019A_MEM_WRITE_CB(_devcb) \ |
| 31 | devcb = &rtl8019a_device::set_mem_write_callback(*device, DEVCB2_##_devcb); |
| 32 | |
| 33 | |
| 23 | 34 | class dp8390_device : public device_t, |
| 24 | | public device_network_interface, |
| 25 | | public dp8390_interface |
| 35 | public device_network_interface |
| 26 | 36 | { |
| 27 | 37 | public: |
| 28 | 38 | // construction/destruction |
| 29 | 39 | dp8390_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, float bandwidth, const char *shortname, const char *source); |
| 40 | |
| 41 | template<class _Object> static devcb2_base &set_irq_callback(device_t &device, _Object object) { return downcast<dp8390_device &>(device).m_irq_cb.set_callback(object); } |
| 42 | template<class _Object> static devcb2_base &set_breq_callback(device_t &device, _Object object) { return downcast<dp8390_device &>(device).m_breq_cb.set_callback(object); } |
| 43 | template<class _Object> static devcb2_base &set_mem_read_callback(device_t &device, _Object object) { return downcast<dp8390_device &>(device).m_mem_read_cb.set_callback(object); } |
| 44 | template<class _Object> static devcb2_base &set_mem_write_callback(device_t &device, _Object object) { return downcast<dp8390_device &>(device).m_mem_write_cb.set_callback(object); } |
| 30 | 45 | |
| 31 | 46 | DECLARE_WRITE16_MEMBER( dp8390_w ); |
| 32 | 47 | DECLARE_READ16_MEMBER( dp8390_r ); |
| r29542 | r29543 | |
| 38 | 53 | // device-level overrides |
| 39 | 54 | virtual void device_start(); |
| 40 | 55 | virtual void device_reset(); |
| 41 | | virtual void device_config_complete(); |
| 56 | |
| 42 | 57 | int m_type; |
| 43 | 58 | |
| 44 | 59 | enum { |
| r29542 | r29543 | |
| 47 | 62 | }; |
| 48 | 63 | |
| 49 | 64 | private: |
| 50 | | devcb_resolved_write_line irq_func; |
| 51 | | devcb_resolved_write_line breq_func; |
| 52 | | devcb_resolved_read8 mem_read; |
| 53 | | devcb_resolved_write8 mem_write; |
| 65 | devcb2_write_line m_irq_cb; |
| 66 | devcb2_write_line m_breq_cb; |
| 67 | devcb2_read8 m_mem_read_cb; |
| 68 | devcb2_write8 m_mem_write_cb; |
| 54 | 69 | |
| 55 | 70 | void set_cr(UINT8 newcr); |
| 56 | 71 | void check_dma_complete(); |
| 57 | 72 | void do_tx(); |
| 58 | 73 | bool mcast_ck(const UINT8 *buf, int len); |
| 59 | | void check_irq() { irq_func((m_regs.imr & m_regs.isr & 0x7f)?ASSERT_LINE:CLEAR_LINE); } |
| 74 | void check_irq() { m_irq_cb((m_regs.imr & m_regs.isr & 0x7f)?ASSERT_LINE:CLEAR_LINE); } |
| 60 | 75 | void recv_overflow(); |
| 61 | 76 | void stop(); |
| 62 | 77 | void recv(UINT8 *buf, int len); |
branches/new_menus/src/emu/cpu/arm/arm.c
| r29542 | r29543 | |
| 248 | 248 | } |
| 249 | 249 | |
| 250 | 250 | |
| 251 | |
| 251 | 252 | void arm_cpu_device::cpu_write32( int addr, UINT32 data ) |
| 252 | 253 | { |
| 253 | 254 | /* Unaligned writes are treated as normal writes */ |
| r29542 | r29543 | |
| 309 | 310 | |
| 310 | 311 | /***************************************************************************/ |
| 311 | 312 | |
| 313 | void arm_cpu_device::device_config_complete() |
| 314 | { |
| 315 | // inherit a copy of the static data |
| 316 | const arm_interface *intf = reinterpret_cast<const arm_interface *>(static_config()); |
| 317 | if (intf != NULL) |
| 318 | *static_cast<arm_interface *>(this) = *intf; |
| 319 | |
| 320 | // or set default if none provided |
| 321 | else |
| 322 | { |
| 323 | coprotype = ARM_COPRO_TYPE_UNKNOWN_CP15; |
| 324 | } |
| 325 | } |
| 326 | |
| 312 | 327 | void arm_cpu_device::device_reset() |
| 313 | 328 | { |
| 314 | 329 | for ( int i = 0; i < 27; i++ ) |
| r29542 | r29543 | |
| 413 | 428 | } |
| 414 | 429 | else if ((insn & 0x0f000000u) == 0x0e000000u) /* Coprocessor */ |
| 415 | 430 | { |
| 416 | | HandleCoPro(insn); |
| 431 | if(coprotype == 1) |
| 432 | HandleCoProVL86C020(insn); |
| 433 | else |
| 434 | HandleCoPro(insn); |
| 435 | |
| 417 | 436 | R15 += 4; |
| 418 | 437 | } |
| 419 | 438 | else if ((insn & 0x0f000000u) == 0x0f000000u) /* Software interrupt */ |
| r29542 | r29543 | |
| 1363 | 1382 | return accumulator; |
| 1364 | 1383 | } |
| 1365 | 1384 | |
| 1385 | void arm_cpu_device::HandleCoProVL86C020( UINT32 insn ) |
| 1386 | { |
| 1387 | UINT32 rn=(insn>>12)&0xf; |
| 1388 | UINT32 crn=(insn>>16)&0xf; |
| 1366 | 1389 | |
| 1390 | m_icount -= S_CYCLE; |
| 1391 | |
| 1392 | /* MRC - transfer copro register to main register */ |
| 1393 | if( (insn&0x0f100010)==0x0e100010 ) |
| 1394 | { |
| 1395 | if(crn == 0) // ID, read only |
| 1396 | { |
| 1397 | /* |
| 1398 | 0x41<<24 <- Designer code, Acorn Computer Ltd. |
| 1399 | 0x56<<16 <- Manufacturer code, VLSI Technology Inc. |
| 1400 | 0x03<<8 <- Part type, VLC86C020 |
| 1401 | 0x00<<0 <- Revision number, 0 |
| 1402 | */ |
| 1403 | SetRegister(rn, 0x41560300); |
| 1404 | debugger_break(machine()); |
| 1405 | } |
| 1406 | else |
| 1407 | SetRegister(rn, m_coproRegister[crn]); |
| 1408 | |
| 1409 | } |
| 1410 | /* MCR - transfer main register to copro register */ |
| 1411 | else if( (insn&0x0f100010)==0x0e000010 ) |
| 1412 | { |
| 1413 | if(crn != 0) |
| 1414 | m_coproRegister[crn]=GetRegister(rn); |
| 1415 | |
| 1416 | printf("%08x: VL86C020 copro instruction write %08x %d %d\n", R15 & 0x3ffffff, insn,rn,crn); |
| 1417 | } |
| 1418 | else |
| 1419 | { |
| 1420 | printf("%08x: Unimplemented VL86C020 copro instruction %08x %d %d\n", R15 & 0x3ffffff, insn,rn,crn); |
| 1421 | debugger_break(machine()); |
| 1422 | } |
| 1423 | } |
| 1424 | |
| 1367 | 1425 | void arm_cpu_device::HandleCoPro( UINT32 insn ) |
| 1368 | 1426 | { |
| 1369 | 1427 | UINT32 rn=(insn>>12)&0xf; |
branches/new_menus/src/emu/video/ramdac.h
| r29542 | r29543 | |
| 16 | 16 | // INTERFACE CONFIGURATION MACROS |
| 17 | 17 | //************************************************************************** |
| 18 | 18 | |
| 19 | | #define MCFG_RAMDAC_ADD(_tag,_config,_map,_palette_tag) \ |
| 19 | #define MCFG_RAMDAC_ADD(_tag, _map, _palette_tag) \ |
| 20 | 20 | MCFG_DEVICE_ADD(_tag, RAMDAC, 0) \ |
| 21 | | MCFG_DEVICE_CONFIG(_config) \ |
| 22 | 21 | MCFG_DEVICE_ADDRESS_MAP(AS_0, _map) \ |
| 23 | 22 | ramdac_device::static_set_palette_tag(*device, "^" _palette_tag); |
| 24 | 23 | |
| 25 | | #define RAMDAC_INTERFACE(name) \ |
| 26 | | const ramdac_interface (name) = |
| 24 | #define MCFG_RAMDAC_SPLIT_READ(_split) \ |
| 25 | ramdac_device::set_split_read(*device, _split); |
| 27 | 26 | |
| 28 | | // ======================> ramdac_interface |
| 29 | 27 | |
| 30 | | struct ramdac_interface |
| 31 | | { |
| 32 | | UINT8 m_split_read_reg; // read register index is separated, seen in rltennis |
| 33 | | }; |
| 34 | | |
| 35 | 28 | //************************************************************************** |
| 36 | 29 | // TYPE DEFINITIONS |
| 37 | 30 | //************************************************************************** |
| r29542 | r29543 | |
| 39 | 32 | // ======================> ramdac_device |
| 40 | 33 | |
| 41 | 34 | class ramdac_device : public device_t, |
| 42 | | public device_memory_interface, |
| 43 | | public ramdac_interface |
| 35 | public device_memory_interface |
| 44 | 36 | { |
| 45 | 37 | public: |
| 46 | 38 | // construction/destruction |
| r29542 | r29543 | |
| 48 | 40 | |
| 49 | 41 | // static configuration |
| 50 | 42 | static void static_set_palette_tag(device_t &device, const char *tag); |
| 43 | static void set_split_read(device_t &device, int split) { downcast<ramdac_device &>(device).m_split_read_reg = split; } |
| 51 | 44 | |
| 52 | 45 | // I/O operations |
| 53 | 46 | DECLARE_READ8_MEMBER( index_r ); |
| r29542 | r29543 | |
| 68 | 61 | virtual void device_validity_check(validity_checker &valid) const; |
| 69 | 62 | virtual void device_start(); |
| 70 | 63 | virtual void device_reset(); |
| 71 | | virtual void device_config_complete(); |
| 72 | 64 | inline UINT8 readbyte(offs_t address); |
| 73 | 65 | inline void writebyte(offs_t address, UINT8 data); |
| 74 | 66 | inline void reg_increment(UINT8 inc_type); |
| r29542 | r29543 | |
| 81 | 73 | |
| 82 | 74 | const address_space_config m_space_config; |
| 83 | 75 | required_device<palette_device> m_palette; |
| 76 | |
| 77 | UINT8 m_split_read_reg; // read register index is separated, seen in rltennis |
| 84 | 78 | }; |
| 85 | 79 | |
| 86 | 80 | |
| r29542 | r29543 | |
| 88 | 82 | extern const device_type RAMDAC; |
| 89 | 83 | |
| 90 | 84 | |
| 91 | | |
| 92 | | //************************************************************************** |
| 93 | | // GLOBAL VARIABLES |
| 94 | | //************************************************************************** |
| 95 | | |
| 96 | | |
| 97 | | |
| 98 | 85 | #endif |
branches/new_menus/src/emu/video/t6a04.c
| r29542 | r29543 | |
| 18 | 18 | const device_type T6A04 = &device_creator<t6a04_device>; |
| 19 | 19 | |
| 20 | 20 | //------------------------------------------------- |
| 21 | | // device_config_complete - perform any |
| 22 | | // operations now that the configuration is |
| 23 | | // complete |
| 24 | | //------------------------------------------------- |
| 25 | | |
| 26 | | void t6a04_device::device_config_complete() |
| 27 | | { |
| 28 | | // inherit a copy of the static data |
| 29 | | const t6a04_interface *intf = reinterpret_cast<const t6a04_interface *>(static_config()); |
| 30 | | |
| 31 | | if (intf != NULL) |
| 32 | | { |
| 33 | | *static_cast<t6a04_interface *>(this) = *intf; |
| 34 | | } |
| 35 | | // or initialize to defaults if none provided |
| 36 | | else |
| 37 | | { |
| 38 | | height = width = 0; |
| 39 | | } |
| 40 | | } |
| 41 | | |
| 42 | | //------------------------------------------------- |
| 43 | 21 | // device_validity_check - perform validity checks |
| 44 | 22 | // on this device |
| 45 | 23 | //------------------------------------------------- |
| 46 | 24 | |
| 47 | 25 | void t6a04_device::device_validity_check(validity_checker &valid) const |
| 48 | 26 | { |
| 49 | | if (height == 0 || width == 0) |
| 27 | if (m_height == 0 || m_width == 0) |
| 50 | 28 | mame_printf_error("Configured with invalid parameter\n"); |
| 51 | 29 | } |
| 52 | 30 | |
| r29542 | r29543 | |
| 59 | 37 | //------------------------------------------------- |
| 60 | 38 | |
| 61 | 39 | t6a04_device::t6a04_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 62 | | device_t(mconfig, T6A04, "T6A04", tag, owner, clock, "t6a04", __FILE__) |
| 40 | device_t(mconfig, T6A04, "T6A04", tag, owner, clock, "t6a04", __FILE__), |
| 41 | m_height(0), |
| 42 | m_width(0) |
| 63 | 43 | { |
| 64 | 44 | } |
| 65 | 45 | |
| r29542 | r29543 | |
| 115 | 95 | |
| 116 | 96 | UINT32 t6a04_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 117 | 97 | { |
| 118 | | UINT8 ypages = width>>3; |
| 119 | | UINT8 last_line = m_zpos + height; |
| 98 | UINT8 ypages = m_width>>3; |
| 99 | UINT8 last_line = m_zpos + m_height; |
| 120 | 100 | |
| 121 | 101 | if (m_display_on) |
| 122 | 102 | { |
branches/new_menus/src/emu/video/t6a04.h
| r29542 | r29543 | |
| 11 | 11 | #ifndef __T6A04_H__ |
| 12 | 12 | #define __T6A04_H__ |
| 13 | 13 | |
| 14 | | #define MCFG_T6A04_ADD( _tag, _config ) \ |
| 15 | | MCFG_DEVICE_ADD( _tag, T6A04, 0 ) \ |
| 16 | | MCFG_DEVICE_CONFIG(_config) |
| 17 | | |
| 18 | 14 | //************************************************************************** |
| 19 | 15 | // TYPE DEFINITIONS |
| 20 | 16 | //************************************************************************** |
| 21 | 17 | |
| 22 | | // ======================> t6a04_interface |
| 23 | | |
| 24 | | struct t6a04_interface |
| 25 | | { |
| 26 | | UINT8 height; // number of lines |
| 27 | | UINT8 width; // pixels for line |
| 28 | | }; |
| 29 | | |
| 30 | 18 | // ======================> t6a04_device |
| 31 | 19 | |
| 32 | | class t6a04_device : public device_t, |
| 33 | | public t6a04_interface |
| 20 | class t6a04_device : public device_t |
| 34 | 21 | { |
| 35 | 22 | public: |
| 36 | 23 | // construction/destruction |
| 37 | 24 | t6a04_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 38 | 25 | |
| 26 | static void set_size(device_t &device, int w, int h) |
| 27 | { |
| 28 | t6a04_device &dev = downcast<t6a04_device &>(device); |
| 29 | dev.m_width = w; |
| 30 | dev.m_height = h; |
| 31 | } |
| 32 | |
| 39 | 33 | // device interface |
| 40 | 34 | DECLARE_WRITE8_MEMBER(control_write); |
| 41 | 35 | DECLARE_READ8_MEMBER(control_read); |
| r29542 | r29543 | |
| 48 | 42 | // device-level overrides |
| 49 | 43 | virtual void device_start(); |
| 50 | 44 | virtual void device_reset(); |
| 51 | | virtual void device_config_complete(); |
| 52 | 45 | virtual void device_validity_check(validity_checker &valid) const; |
| 53 | 46 | |
| 54 | 47 | private: |
| r29542 | r29543 | |
| 65 | 58 | UINT8 m_opa1; |
| 66 | 59 | UINT8 m_opa2; |
| 67 | 60 | UINT8 m_output_reg; |
| 61 | |
| 62 | UINT8 m_height; // number of lines |
| 63 | UINT8 m_width; // pixels for line |
| 68 | 64 | }; |
| 69 | 65 | |
| 70 | 66 | // device type definition |
| 71 | 67 | extern const device_type T6A04; |
| 72 | 68 | |
| 69 | #define MCFG_T6A04_SIZE(_width, _height) \ |
| 70 | t6a04_device::set_size(*device, _width, _height); |
| 71 | |
| 73 | 72 | #endif |
branches/new_menus/src/emu/video/crtc_ega.c
| r29542 | r29543 | |
| 16 | 16 | const device_type CRTC_EGA = &device_creator<crtc_ega_device>; |
| 17 | 17 | |
| 18 | 18 | |
| 19 | | void crtc_ega_device::device_config_complete() |
| 20 | | { |
| 21 | | const crtc_ega_interface *intf = reinterpret_cast<const crtc_ega_interface *>(static_config()); |
| 22 | | |
| 23 | | if ( intf != NULL ) |
| 24 | | { |
| 25 | | *static_cast<crtc_ega_interface *>(this) = *intf; |
| 26 | | } |
| 27 | | else |
| 28 | | { |
| 29 | | m_hpixels_per_column = 0; |
| 30 | | m_begin_update = NULL; |
| 31 | | m_update_row = NULL; |
| 32 | | m_end_update = NULL; |
| 33 | | memset(&m_out_de_func, 0, sizeof(m_out_de_func)); |
| 34 | | memset(&m_out_hsync_func, 0, sizeof(m_out_hsync_func)); |
| 35 | | memset(&m_out_vsync_func, 0, sizeof(m_out_vsync_func)); |
| 36 | | memset(&m_out_vblank_func, 0, sizeof(m_out_vblank_func)); |
| 37 | | } |
| 38 | | } |
| 39 | | |
| 40 | | |
| 41 | 19 | crtc_ega_device::crtc_ega_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 42 | 20 | : device_t(mconfig, CRTC_EGA, "crtc_EGA", tag, owner, clock, "crtc_ega", __FILE__), |
| 43 | | device_video_interface(mconfig, *this, false) |
| 21 | device_video_interface(mconfig, *this, false), |
| 22 | m_res_out_de_cb(*this), |
| 23 | m_res_out_hsync_cb(*this), |
| 24 | m_res_out_vsync_cb(*this), |
| 25 | m_res_out_vblank_cb(*this), |
| 26 | m_hpixels_per_column(0) |
| 44 | 27 | { |
| 45 | 28 | } |
| 46 | 29 | |
| r29542 | r29543 | |
| 239 | 222 | |
| 240 | 223 | void crtc_ega_device::set_de(int state) |
| 241 | 224 | { |
| 242 | | if ( m_de != state ) |
| 225 | if (m_de != state) |
| 243 | 226 | { |
| 244 | 227 | m_de = state; |
| 245 | 228 | |
| 246 | | if ( !m_res_out_de_func.isnull() ) |
| 247 | | m_res_out_de_func( m_de ); |
| 229 | if (!m_res_out_de_cb.isnull()) |
| 230 | m_res_out_de_cb(m_de); |
| 248 | 231 | } |
| 249 | 232 | } |
| 250 | 233 | |
| 251 | 234 | |
| 252 | 235 | void crtc_ega_device::set_hsync(int state) |
| 253 | 236 | { |
| 254 | | if ( m_hsync != state ) |
| 237 | if (m_hsync != state) |
| 255 | 238 | { |
| 256 | 239 | m_hsync = state; |
| 257 | 240 | |
| 258 | | if ( !m_res_out_hsync_func.isnull() ) |
| 259 | | m_res_out_hsync_func( m_hsync ); |
| 241 | if (!m_res_out_hsync_cb.isnull()) |
| 242 | m_res_out_hsync_cb(m_hsync); |
| 260 | 243 | } |
| 261 | 244 | } |
| 262 | 245 | |
| 263 | 246 | |
| 264 | 247 | void crtc_ega_device::set_vsync(int state) |
| 265 | 248 | { |
| 266 | | if ( m_vsync != state ) |
| 249 | if (m_vsync != state) |
| 267 | 250 | { |
| 268 | 251 | m_vsync = state; |
| 269 | 252 | |
| 270 | | if ( !m_res_out_vsync_func.isnull() ) |
| 271 | | m_res_out_vsync_func( m_vsync ); |
| 253 | if (!m_res_out_vsync_cb.isnull()) |
| 254 | m_res_out_vsync_cb(m_vsync); |
| 272 | 255 | } |
| 273 | 256 | } |
| 274 | 257 | |
| 275 | 258 | |
| 276 | 259 | void crtc_ega_device::set_vblank(int state) |
| 277 | 260 | { |
| 278 | | if ( m_vblank != state ) |
| 261 | if (m_vblank != state) |
| 279 | 262 | { |
| 280 | 263 | m_vblank = state; |
| 281 | 264 | |
| 282 | | if ( !m_res_out_vblank_func.isnull() ) |
| 283 | | m_res_out_vblank_func( m_vblank ); |
| 265 | if (!m_res_out_vblank_cb.isnull()) |
| 266 | m_res_out_vblank_cb(m_vblank); |
| 284 | 267 | } |
| 285 | 268 | } |
| 286 | 269 | |
| 287 | 270 | |
| 288 | 271 | void crtc_ega_device::set_cur(int state) |
| 289 | 272 | { |
| 290 | | if ( m_cur != state ) |
| 273 | if (m_cur != state) |
| 291 | 274 | { |
| 292 | 275 | m_cur = state; |
| 293 | 276 | |
| 294 | | // if ( !m_res_out_cur_func.isnull() ) |
| 295 | | // m_res_out_cur_func( m_cur ); |
| 277 | // if (!m_res_out_cur_cb.isnull()) |
| 278 | // m_res_out_cur_cb(m_cur); |
| 296 | 279 | } |
| 297 | 280 | } |
| 298 | 281 | |
| r29542 | r29543 | |
| 538 | 521 | { |
| 539 | 522 | UINT16 y; |
| 540 | 523 | |
| 541 | | void *param = NULL; |
| 524 | assert(!m_row_update_cb.isnull() != NULL); |
| 542 | 525 | |
| 543 | | assert(m_update_row != NULL); |
| 544 | | |
| 545 | 526 | /* call the set up function if any */ |
| 546 | | if (m_begin_update != NULL) |
| 547 | | param = m_begin_update(this, bitmap, cliprect); |
| 527 | if (!m_begin_update_cb.isnull()) |
| 528 | m_begin_update_cb(bitmap, cliprect); |
| 548 | 529 | |
| 549 | 530 | if (cliprect.min_y == 0) |
| 550 | 531 | { |
| r29542 | r29543 | |
| 569 | 550 | INT8 cursor_x = cursor_visible ? (m_cursor_addr - m_current_disp_addr) : -1; |
| 570 | 551 | |
| 571 | 552 | /* call the external system to draw it */ |
| 572 | | m_update_row(this, bitmap, cliprect, m_current_disp_addr, ra, y, m_horiz_disp + 1, cursor_x, param); |
| 553 | m_row_update_cb(bitmap, cliprect, m_current_disp_addr, ra, y, m_horiz_disp + 1, cursor_x); |
| 573 | 554 | |
| 574 | 555 | /* update MA if the last raster address */ |
| 575 | 556 | if (ra == m_max_ras_addr) |
| r29542 | r29543 | |
| 577 | 558 | } |
| 578 | 559 | |
| 579 | 560 | /* call the tear down function if any */ |
| 580 | | if (m_end_update != NULL) |
| 581 | | m_end_update(this, bitmap, cliprect, param); |
| 561 | if (!m_end_update_cb.isnull()) |
| 562 | m_end_update_cb(bitmap, cliprect); |
| 582 | 563 | } |
| 583 | 564 | else |
| 584 | 565 | logerror("Invalid crtc_ega screen parameters - display disabled!!!\n"); |
| r29542 | r29543 | |
| 595 | 576 | assert(m_hpixels_per_column > 0); |
| 596 | 577 | |
| 597 | 578 | /* resolve callbacks */ |
| 598 | | m_res_out_de_func.resolve(m_out_de_func, *this); |
| 599 | | m_res_out_hsync_func.resolve(m_out_hsync_func, *this); |
| 600 | | m_res_out_vsync_func.resolve(m_out_vsync_func, *this); |
| 601 | | m_res_out_vblank_func.resolve(m_out_vblank_func, *this); |
| 579 | m_res_out_de_cb.resolve(); |
| 580 | m_res_out_hsync_cb.resolve(); |
| 581 | m_res_out_vsync_cb.resolve(); |
| 582 | m_res_out_vblank_cb.resolve(); |
| 602 | 583 | |
| 584 | /* bind delegates */ |
| 585 | m_begin_update_cb.bind_relative_to(*owner()); |
| 586 | m_row_update_cb.bind_relative_to(*owner()); |
| 587 | m_end_update_cb.bind_relative_to(*owner()); |
| 588 | |
| 603 | 589 | /* create the timers */ |
| 604 | 590 | m_line_timer = timer_alloc(TIMER_LINE); |
| 605 | 591 | m_de_off_timer = timer_alloc(TIMER_DE_OFF); |
| r29542 | r29543 | |
| 699 | 685 | void crtc_ega_device::device_reset() |
| 700 | 686 | { |
| 701 | 687 | /* internal registers other than status remain unchanged, all outputs go low */ |
| 702 | | if ( !m_res_out_de_func.isnull() ) |
| 703 | | m_res_out_de_func( FALSE ); |
| 688 | if (!m_res_out_de_cb.isnull()) |
| 689 | m_res_out_de_cb(false); |
| 704 | 690 | |
| 705 | | if ( !m_res_out_hsync_func.isnull() ) |
| 706 | | m_res_out_hsync_func( FALSE ); |
| 691 | if (!m_res_out_hsync_cb.isnull()) |
| 692 | m_res_out_hsync_cb(false); |
| 707 | 693 | |
| 708 | | if ( !m_res_out_vsync_func.isnull() ) |
| 709 | | m_res_out_vsync_func( FALSE ); |
| 694 | if (!m_res_out_vsync_cb.isnull()) |
| 695 | m_res_out_vsync_cb(false); |
| 710 | 696 | |
| 711 | | if ( !m_res_out_vblank_func.isnull() ) |
| 712 | | m_res_out_vblank_func( FALSE ); |
| 697 | if (!m_res_out_vblank_cb.isnull()) |
| 698 | m_res_out_vblank_cb(false); |
| 713 | 699 | |
| 714 | | if ( ! m_line_timer->enabled( ) ) |
| 700 | if (!m_line_timer->enabled()) |
| 715 | 701 | { |
| 716 | 702 | m_line_timer->adjust( attotime::from_ticks( m_horiz_char_total + 2, m_clock ) ); |
| 717 | 703 | } |
branches/new_menus/src/emu/video/crtc_ega.h
| r29542 | r29543 | |
| 9 | 9 | |
| 10 | 10 | #include "emu.h" |
| 11 | 11 | |
| 12 | | #define CRTC_EGA_INTERFACE(name) \ |
| 13 | | const crtc_ega_interface (name) = |
| 12 | /* callback definitions */ |
| 13 | typedef device_delegate<void (bitmap_ind16 &bitmap, const rectangle &cliprect)> crtc_ega_begin_update_delegate; |
| 14 | 14 | |
| 15 | | #define MCFG_CRTC_EGA_ADD(_tag, _clock, _intrf) \ |
| 16 | | MCFG_DEVICE_ADD(_tag, CRTC_EGA, _clock) \ |
| 17 | | MCFG_DEVICE_CONFIG(_intrf) |
| 15 | typedef device_delegate<void (bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, |
| 16 | UINT16 y, UINT8 x_count, INT8 cursor_x)> crtc_ega_row_update_delegate; |
| 18 | 17 | |
| 19 | | #define MCFG_CRTC_EGA_SET_SCREEN MCFG_VIDEO_SET_SCREEN |
| 18 | typedef device_delegate<void (bitmap_ind16 &bitmap, const rectangle &cliprect)> crtc_ega_end_update_delegate; |
| 20 | 19 | |
| 21 | 20 | |
| 22 | | class crtc_ega_device; |
| 21 | #define CRTC_EGA_BEGIN_UPDATE(_name) void _name(bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 22 | #define CRTC_EGA_ROW_UPDATE(_name) void _name(bitmap_ind16 &bitmap, \ |
| 23 | const rectangle &cliprect, UINT16 ma, UINT8 ra, \ |
| 24 | UINT16 y, UINT8 x_count, INT8 cursor_x) |
| 25 | #define CRTC_EGA_END_UPDATE(_name) void _name(bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 23 | 26 | |
| 24 | | /* callback definitions */ |
| 25 | | typedef void * (*crtc_ega_begin_update_func)(crtc_ega_device *device, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 26 | | #define CRTC_EGA_BEGIN_UPDATE(name) void *name(crtc_ega_device *device, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 27 | 27 | |
| 28 | | typedef void (*crtc_ega_update_row_func)(crtc_ega_device *device, bitmap_ind16 &bitmap, |
| 29 | | const rectangle &cliprect, UINT16 ma, UINT8 ra, |
| 30 | | UINT16 y, UINT8 x_count, INT8 cursor_x, void *param); |
| 31 | | #define CRTC_EGA_UPDATE_ROW(name) void name(crtc_ega_device *device, bitmap_ind16 &bitmap, \ |
| 32 | | const rectangle &cliprect, UINT16 ma, UINT8 ra, \ |
| 33 | | UINT16 y, UINT8 x_count, INT8 cursor_x, void *param) |
| 34 | 28 | |
| 35 | | typedef void (*crtc_ega_end_update_func)(crtc_ega_device *device, bitmap_ind16 &bitmap, const rectangle &cliprect, void *param); |
| 36 | | #define CRTC_EGA_END_UPDATE(name) void name(crtc_ega_device *device, bitmap_ind16 &bitmap, const rectangle &cliprect, void *param) |
| 29 | #define MCFG_CRTC_EGA_SET_SCREEN MCFG_VIDEO_SET_SCREEN |
| 37 | 30 | |
| 31 | #define MCFG_CRTC_EGA_BEGIN_UPDATE_CB(_class, _method) \ |
| 32 | crtc_ega_device::set_begin_update_callback(*device, crtc_ega_begin_update_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); |
| 38 | 33 | |
| 39 | | /* interface */ |
| 40 | | struct crtc_ega_interface |
| 41 | | { |
| 42 | | int m_hpixels_per_column; /* number of pixels per video memory address */ |
| 34 | #define MCFG_CRTC_EGA_ROW_UPDATE_CB(_class, _method) \ |
| 35 | crtc_ega_device::set_row_update_callback(*device, crtc_ega_row_update_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); |
| 43 | 36 | |
| 44 | | /* if specified, this gets called before any pixel update, |
| 45 | | optionally return a pointer that will be passed to the |
| 46 | | update and tear down callbacks */ |
| 47 | | crtc_ega_begin_update_func m_begin_update; |
| 37 | #define MCFG_CRTC_EGA_END_UPDATE_CB(_class, _method) \ |
| 38 | crtc_ega_device::set_end_update_callback(*device, crtc_ega_end_update_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); |
| 48 | 39 | |
| 49 | | /* this gets called for every row, the driver must output |
| 50 | | x_count * hpixels_per_column pixels. |
| 51 | | cursor_x indicates the character position where the cursor is, or -1 |
| 52 | | if there is no cursor on this row */ |
| 53 | | crtc_ega_update_row_func m_update_row; |
| 40 | #define MCFG_CRTC_EGA_HPIXELS_PER_COLUMN(_pix) \ |
| 41 | crtc_ega_device::set_hpixels_per_column(*device, _pix); |
| 54 | 42 | |
| 55 | | /* if specified, this gets called after all row updating is complete */ |
| 56 | | crtc_ega_end_update_func m_end_update; |
| 43 | #define MCFG_CRTC_EGA_RES_OUT_DE_CB(_devcb) \ |
| 44 | devcb = &crtc_ega_device::set_res_out_de_callback(*device, DEVCB2_##_devcb); |
| 57 | 45 | |
| 58 | | /* if specified, this gets called for every change of the disply enable signal */ |
| 59 | | devcb_write_line m_out_de_func; |
| 46 | #define MCFG_CRTC_EGA_RES_OUT_HSYNC_CB(_devcb) \ |
| 47 | devcb = &crtc_ega_device::set_res_out_hsync_callback(*device, DEVCB2_##_devcb); |
| 60 | 48 | |
| 61 | | /* if specified, this gets called for every change of the HSYNC signal */ |
| 62 | | devcb_write_line m_out_hsync_func; |
| 49 | #define MCFG_CRTC_EGA_RES_OUT_VSYNC_CB(_devcb) \ |
| 50 | devcb = &crtc_ega_device::set_res_out_vsync_callback(*device, DEVCB2_##_devcb); |
| 63 | 51 | |
| 64 | | /* if specified, this gets called for every change of the VSYNC signal */ |
| 65 | | devcb_write_line m_out_vsync_func; |
| 52 | #define MCFG_CRTC_EGA_RES_OUT_VBLANK_CB(_devcb) \ |
| 53 | devcb = &crtc_ega_device::set_res_out_vblank_callback(*device, DEVCB2_##_devcb); |
| 66 | 54 | |
| 67 | | devcb_write_line m_out_vblank_func; |
| 68 | | }; |
| 69 | 55 | |
| 70 | | |
| 71 | 56 | class crtc_ega_device : public device_t, |
| 72 | | public device_video_interface, |
| 73 | | public crtc_ega_interface |
| 57 | public device_video_interface |
| 74 | 58 | { |
| 75 | 59 | public: |
| 76 | 60 | crtc_ega_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 77 | 61 | |
| 62 | template<class _Object> static devcb2_base &set_res_out_de_callback(device_t &device, _Object object) |
| 63 | { return downcast<crtc_ega_device &>(device).m_res_out_de_cb.set_callback(object); } |
| 64 | template<class _Object> static devcb2_base &set_res_out_hsync_callback(device_t &device, _Object object) |
| 65 | { return downcast<crtc_ega_device &>(device).m_res_out_hsync_cb.set_callback(object); } |
| 66 | template<class _Object> static devcb2_base &set_res_out_vsync_callback(device_t &device, _Object object) |
| 67 | { return downcast<crtc_ega_device &>(device).m_res_out_vsync_cb.set_callback(object); } |
| 68 | template<class _Object> static devcb2_base &set_res_out_vblank_callback(device_t &device, _Object object) |
| 69 | { return downcast<crtc_ega_device &>(device).m_res_out_vblank_cb.set_callback(object); } |
| 70 | |
| 71 | static void set_begin_update_callback(device_t &device, crtc_ega_begin_update_delegate callback) { downcast<crtc_ega_device &>(device).m_begin_update_cb = callback; } |
| 72 | static void set_row_update_callback(device_t &device, crtc_ega_row_update_delegate callback) { downcast<crtc_ega_device &>(device).m_row_update_cb = callback; } |
| 73 | static void set_end_update_callback(device_t &device, crtc_ega_end_update_delegate callback) { downcast<crtc_ega_device &>(device).m_end_update_cb = callback; } |
| 74 | static void set_hpixels_per_column(device_t &device, int hpixels_per_column) { downcast<crtc_ega_device &>(device).m_hpixels_per_column = hpixels_per_column; } |
| 75 | |
| 78 | 76 | /* select one of the registers for reading or writing */ |
| 79 | 77 | DECLARE_WRITE8_MEMBER( address_w ); |
| 80 | 78 | |
| r29542 | r29543 | |
| 106 | 104 | |
| 107 | 105 | protected: |
| 108 | 106 | // device-level overrides |
| 109 | | virtual void device_config_complete(); |
| 110 | 107 | virtual void device_start(); |
| 111 | 108 | virtual void device_reset(); |
| 112 | 109 | virtual void device_post_load(); |
| 113 | 110 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 114 | 111 | |
| 115 | 112 | private: |
| 116 | | devcb_resolved_write_line m_res_out_de_func; |
| 117 | | devcb_resolved_write_line m_res_out_cur_func; |
| 118 | | devcb_resolved_write_line m_res_out_hsync_func; |
| 119 | | devcb_resolved_write_line m_res_out_vsync_func; |
| 120 | | devcb_resolved_write_line m_res_out_vblank_func; |
| 113 | devcb2_write_line m_res_out_de_cb; |
| 114 | devcb2_write_line m_res_out_hsync_cb; |
| 115 | devcb2_write_line m_res_out_vsync_cb; |
| 116 | devcb2_write_line m_res_out_vblank_cb; |
| 121 | 117 | |
| 118 | /* if specified, this gets called before any pixel update, |
| 119 | optionally return a pointer that will be passed to the |
| 120 | update and tear down callbacks */ |
| 121 | crtc_ega_begin_update_delegate m_begin_update_cb; |
| 122 | |
| 123 | /* this gets called for every row, the driver must output |
| 124 | x_count * hpixels_per_column pixels. |
| 125 | cursor_x indicates the character position where the cursor is, or -1 |
| 126 | if there is no cursor on this row */ |
| 127 | crtc_ega_row_update_delegate m_row_update_cb; |
| 128 | |
| 129 | /* if specified, this gets called after all row updating is complete */ |
| 130 | crtc_ega_end_update_delegate m_end_update_cb; |
| 131 | |
| 122 | 132 | /* ega/vga register file */ |
| 123 | 133 | UINT8 m_horiz_char_total; /* 0x00 */ |
| 124 | 134 | UINT8 m_horiz_disp; /* 0x01 */ |
| r29542 | r29543 | |
| 157 | 167 | UINT8 m_register_address_latch; |
| 158 | 168 | bool m_cursor_state; /* 0 = off, 1 = on */ |
| 159 | 169 | UINT8 m_cursor_blink_count; |
| 170 | int m_hpixels_per_column; /* number of pixels per video memory address */ |
| 160 | 171 | |
| 161 | 172 | /* output signals */ |
| 162 | 173 | int m_cur; |
branches/new_menus/src/emu/video/mb_vcu.h
| r29542 | r29543 | |
| 1 | 1 | // license: ? |
| 2 | 2 | // copyright-holders: Angelo Salese |
| 3 | | /*************************************************************************** |
| 4 | | |
| 5 | | Template for skeleton device |
| 6 | | |
| 7 | | ***************************************************************************/ |
| 8 | | |
| 9 | 3 | #pragma once |
| 10 | 4 | |
| 11 | 5 | #ifndef __MB_VCUDEV_H__ |
| 12 | 6 | #define __MB_VCUDEV_H__ |
| 13 | 7 | |
| 14 | 8 | |
| 15 | | |
| 16 | 9 | //************************************************************************** |
| 17 | | // INTERFACE CONFIGURATION MACROS |
| 18 | | //************************************************************************** |
| 19 | | |
| 20 | | #define MCFG_MB_VCU_ADD(_tag,_freq,_config, _palette_tag) \ |
| 21 | | MCFG_DEVICE_ADD(_tag, MB_VCU, _freq) \ |
| 22 | | MCFG_DEVICE_CONFIG(_config) \ |
| 23 | | mb_vcu_device::static_set_palette_tag(*device, "^" _palette_tag); |
| 24 | | |
| 25 | | //************************************************************************** |
| 26 | 10 | // TYPE DEFINITIONS |
| 27 | 11 | //************************************************************************** |
| 28 | 12 | |
| 29 | | // ======================> mb_vcu_interface |
| 30 | | |
| 31 | | struct mb_vcu_interface |
| 32 | | { |
| 33 | | const char *m_cpu_tag; |
| 34 | | }; |
| 35 | | |
| 36 | 13 | // ======================> mb_vcu_device |
| 37 | 14 | |
| 38 | 15 | class mb_vcu_device : public device_t, |
| 39 | 16 | public device_memory_interface, |
| 40 | | public device_video_interface, |
| 41 | | public mb_vcu_interface |
| 17 | public device_video_interface |
| 42 | 18 | { |
| 43 | 19 | public: |
| 44 | 20 | // construction/destruction |
| r29542 | r29543 | |
| 46 | 22 | |
| 47 | 23 | // static configuration |
| 48 | 24 | static void static_set_palette_tag(device_t &device, const char *tag); |
| 25 | static void set_cpu_tag(device_t &device, const char *tag) { downcast<mb_vcu_device &>(device).m_cpu.set_tag(tag); } |
| 49 | 26 | |
| 50 | 27 | // I/O operations |
| 51 | 28 | DECLARE_WRITE8_MEMBER( write_vregs ); |
| r29542 | r29543 | |
| 65 | 42 | |
| 66 | 43 | protected: |
| 67 | 44 | // device-level overrides |
| 68 | | virtual void device_config_complete(); |
| 69 | 45 | virtual void device_validity_check(validity_checker &valid) const; |
| 70 | 46 | virtual void device_start(); |
| 71 | 47 | virtual void device_reset(); |
| r29542 | r29543 | |
| 81 | 57 | UINT8 m_status; |
| 82 | 58 | UINT8 *m_ram; |
| 83 | 59 | UINT8 *m_palram; |
| 84 | | cpu_device *m_cpu; |
| 85 | 60 | UINT16 m_param_offset_latch; |
| 86 | 61 | |
| 87 | 62 | INT16 m_xpos, m_ypos; |
| r29542 | r29543 | |
| 95 | 70 | double m_weights_r[2]; |
| 96 | 71 | double m_weights_g[3]; |
| 97 | 72 | double m_weights_b[3]; |
| 73 | required_device<cpu_device> m_cpu; |
| 98 | 74 | required_device<palette_device> m_palette; |
| 99 | 75 | }; |
| 100 | 76 | |
| r29542 | r29543 | |
| 103 | 79 | extern const device_type MB_VCU; |
| 104 | 80 | |
| 105 | 81 | |
| 106 | | |
| 107 | 82 | //************************************************************************** |
| 108 | | // GLOBAL VARIABLES |
| 83 | // INTERFACE CONFIGURATION MACROS |
| 109 | 84 | //************************************************************************** |
| 110 | 85 | |
| 86 | #define MCFG_MB_VCU_CPU(_tag) \ |
| 87 | mb_vcu_device::set_cpu_tag(*device, "^"_tag); |
| 111 | 88 | |
| 89 | #define MCFG_MB_VCU_PALETTE(_palette_tag) \ |
| 90 | mb_vcu_device::static_set_palette_tag(*device, "^" _palette_tag); |
| 112 | 91 | |
| 113 | 92 | #endif |
branches/new_menus/src/lib/formats/td0_dsk.c
| r29542 | r29543 | |
| 823 | 823 | dynamic_buffer imagebuf(max_size); |
| 824 | 824 | UINT8 header[12]; |
| 825 | 825 | |
| 826 | | try |
| 826 | io_generic_read(io, header, 0, 12); |
| 827 | head_count = header[9]; |
| 828 | |
| 829 | if(header[0] == 't') |
| 827 | 830 | { |
| 828 | | io_generic_read(io, header, 0, 12); |
| 829 | | head_count = header[9]; |
| 831 | td0dsk_t disk_decode; |
| 830 | 832 | |
| 831 | | if(header[0] == 't') |
| 832 | | { |
| 833 | | td0dsk_t disk_decode; |
| 833 | disk_decode.floppy_file = io; |
| 834 | disk_decode.init_Decode(); |
| 835 | disk_decode.floppy_file_offset = 12; |
| 836 | disk_decode.Decode(imagebuf, max_size); |
| 837 | } |
| 838 | else |
| 839 | io_generic_read(io, imagebuf, 12, io_generic_size(io)); |
| 834 | 840 | |
| 835 | | disk_decode.floppy_file = io; |
| 836 | | disk_decode.init_Decode(); |
| 837 | | disk_decode.floppy_file_offset = 12; |
| 838 | | disk_decode.Decode(imagebuf, max_size); |
| 839 | | } |
| 840 | | else |
| 841 | | io_generic_read(io, imagebuf, 12, io_generic_size(io)); |
| 841 | if(header[7] & 0x80) |
| 842 | offset = 10 + imagebuf[2] + (imagebuf[3] << 8); |
| 842 | 843 | |
| 843 | | if(header[7] & 0x80) |
| 844 | | offset = 10 + imagebuf[2] + (imagebuf[3] << 8); |
| 844 | track_spt = imagebuf[offset]; |
| 845 | if(track_spt == 255) // Empty file? |
| 846 | return false; |
| 845 | 847 | |
| 846 | | track_spt = imagebuf[offset]; |
| 847 | | if(track_spt == 255) // Empty file? |
| 848 | | throw false; |
| 849 | | |
| 850 | | switch(header[6]) |
| 851 | | { |
| 852 | | case 2: |
| 853 | | if((imagebuf[offset + 2] & 0x7f) == 2) // ? |
| 854 | | { |
| 855 | | if(head_count == 2) |
| 856 | | image->set_variant(floppy_image::DSHD); |
| 857 | | else |
| 858 | | throw false; // single side hd? |
| 859 | | break; |
| 860 | | } |
| 861 | | /* no break; could be qd, won't know until tracks are counted */ |
| 862 | | case 1: |
| 848 | switch(header[6]) |
| 849 | { |
| 850 | case 2: |
| 851 | if((imagebuf[offset + 2] & 0x7f) == 2) // ? |
| 852 | { |
| 863 | 853 | if(head_count == 2) |
| 864 | | image->set_variant(floppy_image::DSDD); |
| 854 | image->set_variant(floppy_image::DSHD); |
| 865 | 855 | else |
| 866 | | image->set_variant(floppy_image::SSDD); |
| 856 | return false; // single side hd? |
| 867 | 857 | break; |
| 868 | | case 4: |
| 869 | | if((imagebuf[offset + 2] & 0x7f) == 2) // ? |
| 870 | | { |
| 871 | | if(head_count == 2) |
| 872 | | image->set_variant(floppy_image::DSHD); |
| 873 | | else |
| 874 | | throw false; // single side 3.5? |
| 875 | | break; |
| 876 | | } |
| 877 | | /* no break */ |
| 878 | | case 3: |
| 858 | } |
| 859 | /* no break; could be qd, won't know until tracks are counted */ |
| 860 | case 1: |
| 861 | if(head_count == 2) |
| 862 | image->set_variant(floppy_image::DSDD); |
| 863 | else |
| 864 | image->set_variant(floppy_image::SSDD); |
| 865 | break; |
| 866 | case 4: |
| 867 | if((imagebuf[offset + 2] & 0x7f) == 2) // ? |
| 868 | { |
| 879 | 869 | if(head_count == 2) |
| 880 | | { |
| 881 | | if(form_factor == floppy_image::FF_525) |
| 882 | | image->set_variant(floppy_image::DSQD); |
| 883 | | else |
| 884 | | image->set_variant(floppy_image::DSDD); |
| 885 | | } |
| 870 | image->set_variant(floppy_image::DSHD); |
| 886 | 871 | else |
| 887 | | { |
| 888 | | if(form_factor == floppy_image::FF_525) |
| 889 | | image->set_variant(floppy_image::SSQD); |
| 890 | | else |
| 891 | | throw false; // single side 3.5? |
| 892 | | } |
| 872 | return false; // single side 3.5? |
| 893 | 873 | break; |
| 894 | | } |
| 874 | } |
| 875 | /* no break */ |
| 876 | case 3: |
| 877 | if(head_count == 2) |
| 878 | { |
| 879 | if(form_factor == floppy_image::FF_525) |
| 880 | image->set_variant(floppy_image::DSQD); |
| 881 | else |
| 882 | image->set_variant(floppy_image::DSDD); |
| 883 | } |
| 884 | else |
| 885 | { |
| 886 | if(form_factor == floppy_image::FF_525) |
| 887 | image->set_variant(floppy_image::SSQD); |
| 888 | else |
| 889 | return false; // single side 3.5? |
| 890 | } |
| 891 | break; |
| 892 | } |
| 895 | 893 | |
| 896 | | static const int rates[3] = { 250000, 300000, 500000 }; |
| 897 | | int rate = (header[5] & 0x7f) >= 3 ? 500000 : rates[header[5] & 0x7f]; |
| 898 | | int rpm = form_factor == floppy_image::FF_8 || (form_factor == floppy_image::FF_525 && rate >= 300000) ? 360 : 300; |
| 899 | | int base_cell_count = rate*60/rpm; |
| 894 | static const int rates[3] = { 250000, 300000, 500000 }; |
| 895 | int rate = (header[5] & 0x7f) >= 3 ? 500000 : rates[header[5] & 0x7f]; |
| 896 | int rpm = form_factor == floppy_image::FF_8 || (form_factor == floppy_image::FF_525 && rate >= 300000) ? 360 : 300; |
| 897 | int base_cell_count = rate*60/rpm; |
| 900 | 898 | |
| 901 | | while(track_spt != 255) |
| 899 | while(track_spt != 255) |
| 900 | { |
| 901 | desc_pc_sector sects[256]; |
| 902 | UINT8 sect_data[65536]; |
| 903 | int sdatapos = 0; |
| 904 | int track = imagebuf[offset + 1]; |
| 905 | int head = imagebuf[offset + 2] & 1; |
| 906 | bool fm = (header[5] & 0x80) || (imagebuf[offset + 2] & 0x80); // ? |
| 907 | offset += 4; |
| 908 | for(int i = 0; i < track_spt; i++) |
| 902 | 909 | { |
| 903 | | desc_pc_sector sects[256]; |
| 904 | | UINT8 sect_data[65536]; |
| 905 | | int sdatapos = 0; |
| 906 | | int track = imagebuf[offset + 1]; |
| 907 | | int head = imagebuf[offset + 2] & 1; |
| 908 | | bool fm = (header[5] & 0x80) || (imagebuf[offset + 2] & 0x80); // ? |
| 909 | | offset += 4; |
| 910 | | for(int i = 0; i < track_spt; i++) |
| 911 | | { |
| 912 | | UINT8 *hs = &imagebuf[offset]; |
| 913 | | UINT16 size; |
| 914 | | offset += 6; |
| 910 | UINT8 *hs = &imagebuf[offset]; |
| 911 | UINT16 size; |
| 912 | offset += 6; |
| 915 | 913 | |
| 916 | | sects[i].track = hs[0]; |
| 917 | | sects[i].head = hs[1]; |
| 918 | | sects[i].sector = hs[2]; |
| 919 | | sects[i].size = hs[3]; |
| 920 | | sects[i].deleted = (hs[4] & 4) == 4; |
| 921 | | sects[i].bad_crc = (hs[4] & 2) == 2; |
| 914 | sects[i].track = hs[0]; |
| 915 | sects[i].head = hs[1]; |
| 916 | sects[i].sector = hs[2]; |
| 917 | sects[i].size = hs[3]; |
| 918 | sects[i].deleted = (hs[4] & 4) == 4; |
| 919 | sects[i].bad_crc = (hs[4] & 2) == 2; |
| 922 | 920 | |
| 923 | | if(hs[4] & 0x30) |
| 924 | | size = 0; |
| 925 | | else |
| 921 | if(hs[4] & 0x30) |
| 922 | size = 0; |
| 923 | else |
| 924 | { |
| 925 | offset += 3; |
| 926 | size = 128 << hs[3]; |
| 927 | int j, k; |
| 928 | switch(hs[8]) |
| 926 | 929 | { |
| 927 | | offset += 3; |
| 928 | | size = 128 << hs[3]; |
| 929 | | int j, k; |
| 930 | | switch(hs[8]) |
| 931 | | { |
| 932 | | default: |
| 933 | | throw false; |
| 934 | | case 0: |
| 935 | | memcpy(§_data[sdatapos], &imagebuf[offset], size); |
| 936 | | offset += size; |
| 937 | | break; |
| 938 | | case 1: |
| 939 | | offset += 4; |
| 940 | | k = (hs[9] + (hs[10] << 8)) * 2; |
| 941 | | k = (k <= size) ? k : size; |
| 942 | | for(j = 0; j < k; j += 2) |
| 930 | default: |
| 931 | return false; |
| 932 | case 0: |
| 933 | memcpy(§_data[sdatapos], &imagebuf[offset], size); |
| 934 | offset += size; |
| 935 | break; |
| 936 | case 1: |
| 937 | offset += 4; |
| 938 | k = (hs[9] + (hs[10] << 8)) * 2; |
| 939 | k = (k <= size) ? k : size; |
| 940 | for(j = 0; j < k; j += 2) |
| 941 | { |
| 942 | sect_data[sdatapos + j] = hs[11]; |
| 943 | sect_data[sdatapos + j + 1] = hs[12]; |
| 944 | } |
| 945 | if(k < size) |
| 946 | memset(§_data[sdatapos + k], '\0', size - k); |
| 947 | break; |
| 948 | case 2: |
| 949 | k = 0; |
| 950 | while(k < size) |
| 951 | { |
| 952 | UINT16 len = imagebuf[offset]; |
| 953 | UINT16 rep = imagebuf[offset + 1]; |
| 954 | offset += 2; |
| 955 | if(!len) |
| 943 | 956 | { |
| 944 | | sect_data[sdatapos + j] = hs[11]; |
| 945 | | sect_data[sdatapos + j + 1] = hs[12]; |
| 957 | memcpy(§_data[sdatapos + k], &imagebuf[offset], rep); |
| 958 | offset += rep; |
| 959 | k += rep; |
| 946 | 960 | } |
| 947 | | if(k < size) |
| 948 | | memset(§_data[sdatapos + k], '\0', size - k); |
| 949 | | break; |
| 950 | | case 2: |
| 951 | | k = 0; |
| 952 | | while(k < size) |
| 961 | else |
| 953 | 962 | { |
| 954 | | UINT16 len = imagebuf[offset]; |
| 955 | | UINT16 rep = imagebuf[offset + 1]; |
| 956 | | offset += 2; |
| 957 | | if(!len) |
| 958 | | { |
| 959 | | memcpy(§_data[sdatapos + k], &imagebuf[offset], rep); |
| 960 | | offset += rep; |
| 961 | | k += rep; |
| 962 | | } |
| 963 | | else |
| 964 | | { |
| 965 | | len = (1 << len); |
| 966 | | rep = len * rep; |
| 967 | | rep = ((rep + k) <= size) ? rep : (size - k); |
| 968 | | for(j = 0; j < rep; j += len) |
| 969 | | memcpy(§_data[sdatapos + j + k], &imagebuf[offset], len); |
| 970 | | k += rep; |
| 971 | | offset += len; |
| 972 | | } |
| 963 | len = (1 << len); |
| 964 | rep = len * rep; |
| 965 | rep = ((rep + k) <= size) ? rep : (size - k); |
| 966 | for(j = 0; j < rep; j += len) |
| 967 | memcpy(§_data[sdatapos + j + k], &imagebuf[offset], len); |
| 968 | k += rep; |
| 969 | offset += len; |
| 973 | 970 | } |
| 974 | | break; |
| 975 | | } |
| 971 | } |
| 972 | break; |
| 976 | 973 | } |
| 974 | } |
| 977 | 975 | |
| 978 | | sects[i].actual_size = size; |
| 976 | sects[i].actual_size = size; |
| 979 | 977 | |
| 980 | | if(size) |
| 981 | | { |
| 982 | | sects[i].data = §_data[sdatapos]; |
| 983 | | sdatapos += size; |
| 984 | | } |
| 985 | | else |
| 986 | | sects[i].data = NULL; |
| 978 | if(size) |
| 979 | { |
| 980 | sects[i].data = §_data[sdatapos]; |
| 981 | sdatapos += size; |
| 987 | 982 | } |
| 988 | | track_count = track; |
| 989 | | |
| 990 | | if(fm) |
| 991 | | build_pc_track_fm(track, head, image, base_cell_count, track_spt, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size)); |
| 992 | 983 | else |
| 993 | | build_pc_track_mfm(track, head, image, base_cell_count*2, track_spt, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size)); |
| 994 | | |
| 995 | | track_spt = imagebuf[offset]; |
| 984 | sects[i].data = NULL; |
| 996 | 985 | } |
| 997 | | if((track_count > 50) && (form_factor == floppy_image::FF_525)) // ? |
| 998 | | { |
| 999 | | if(image->get_variant() == floppy_image::DSDD) |
| 1000 | | image->set_variant(floppy_image::DSQD); |
| 1001 | | else if(image->get_variant() == floppy_image::SSDD) |
| 1002 | | image->set_variant(floppy_image::SSQD); |
| 1003 | | } |
| 1004 | | throw true; |
| 986 | track_count = track; |
| 987 | |
| 988 | if(fm) |
| 989 | build_pc_track_fm(track, head, image, base_cell_count, track_spt, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size)); |
| 990 | else |
| 991 | build_pc_track_mfm(track, head, image, base_cell_count*2, track_spt, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size)); |
| 992 | |
| 993 | track_spt = imagebuf[offset]; |
| 1005 | 994 | } |
| 1006 | | catch(bool ret) |
| 995 | if((track_count > 50) && (form_factor == floppy_image::FF_525)) // ? |
| 1007 | 996 | { |
| 1008 | | return ret; |
| 997 | if(image->get_variant() == floppy_image::DSDD) |
| 998 | image->set_variant(floppy_image::DSQD); |
| 999 | else if(image->get_variant() == floppy_image::SSDD) |
| 1000 | image->set_variant(floppy_image::SSQD); |
| 1009 | 1001 | } |
| 1010 | | return false; |
| 1002 | return true; |
| 1011 | 1003 | } |
| 1012 | 1004 | |
| 1013 | 1005 | |