trunk/src/mess/drivers/apc.c
| r19059 | r19060 | |
| 57 | 57 | #include "machine/pit8253.h" |
| 58 | 58 | #include "machine/am9517a.h" |
| 59 | 59 | #include "machine/upd765.h" |
| 60 | #include "machine/upd1990a.h" |
| 60 | 61 | #include "machine/nvram.h" |
| 61 | 62 | #include "video/upd7220.h" |
| 62 | 63 | #include "imagedev/flopdrv.h" |
| r19059 | r19060 | |
| 66 | 67 | |
| 67 | 68 | //#include "sound/ay8910.h" |
| 68 | 69 | |
| 70 | #define MAIN_CLOCK XTAL_5MHz |
| 71 | |
| 69 | 72 | class apc_state : public driver_device |
| 70 | 73 | { |
| 71 | 74 | public: |
| r19059 | r19060 | |
| 74 | 77 | m_maincpu(*this, "maincpu"), |
| 75 | 78 | m_hgdc1(*this, "upd7220_chr"), |
| 76 | 79 | m_hgdc2(*this, "upd7220_btm"), |
| 80 | m_rtc(*this, "upd1990a"), |
| 77 | 81 | m_i8259_m(*this, "pic8259_master"), |
| 78 | 82 | m_i8259_s(*this, "pic8259_slave"), |
| 79 | 83 | m_fdc(*this, "upd765"), |
| r19059 | r19060 | |
| 86 | 90 | required_device<cpu_device> m_maincpu; |
| 87 | 91 | required_device<upd7220_device> m_hgdc1; |
| 88 | 92 | required_device<upd7220_device> m_hgdc2; |
| 93 | required_device<upd1990a_device> m_rtc; |
| 89 | 94 | required_device<pic8259_device> m_i8259_m; |
| 90 | 95 | required_device<pic8259_device> m_i8259_s; |
| 91 | 96 | required_device<upd765a_device> m_fdc; |
| r19059 | r19060 | |
| 110 | 115 | DECLARE_WRITE8_MEMBER(apc_dma_segments_w); |
| 111 | 116 | DECLARE_READ8_MEMBER(apc_dma_r); |
| 112 | 117 | DECLARE_WRITE8_MEMBER(apc_dma_w); |
| 118 | DECLARE_WRITE8_MEMBER(apc_irq_ack_w); |
| 119 | DECLARE_READ8_MEMBER(apc_rtc_r); |
| 120 | DECLARE_WRITE8_MEMBER(apc_rtc_w); |
| 113 | 121 | |
| 114 | 122 | struct { |
| 115 | 123 | UINT8 status; //status |
| r19059 | r19060 | |
| 404 | 412 | machine().device<am9517a_device>("i8237")->write(space, BITSWAP8(offset,7,6,5,4,2,1,0,3), data, 0xff); |
| 405 | 413 | } |
| 406 | 414 | |
| 415 | WRITE8_MEMBER(apc_state::apc_irq_ack_w) |
| 416 | { |
| 417 | if(data & 4) |
| 418 | pic8259_ir3_w(machine().device("pic8259_master"), 0); |
| 407 | 419 | |
| 420 | if(data & ~4) |
| 421 | logerror("IRQ ACK %02x\n",data); |
| 422 | } |
| 423 | |
| 424 | /* TODO: bit arrangement is completely wrong */ |
| 425 | READ8_MEMBER(apc_state::apc_rtc_r) |
| 426 | { |
| 427 | return m_rtc->data_out_r(); |
| 428 | } |
| 429 | |
| 430 | WRITE8_MEMBER(apc_state::apc_rtc_w) |
| 431 | { |
| 432 | m_rtc->data_in_w(BIT(data, 0)); |
| 433 | m_rtc->stb_w(BIT(data, 1)); |
| 434 | m_rtc->clk_w(BIT(data, 2)); |
| 435 | m_rtc->oe_w(BIT(data, 3)); |
| 436 | m_rtc->c0_w(BIT(data, 3)); |
| 437 | m_rtc->c1_w(BIT(data, 4)); |
| 438 | m_rtc->c2_w(BIT(data, 5)); |
| 439 | } |
| 440 | |
| 408 | 441 | static ADDRESS_MAP_START( apc_map, AS_PROGRAM, 16, apc_state ) |
| 409 | 442 | AM_RANGE(0x00000, 0x9ffff) AM_RAM |
| 410 | 443 | AM_RANGE(0xa0000, 0xa0fff) AM_RAM AM_SHARE("cmos") |
| 411 | 444 | // AM_RANGE(0xc0000, 0xcffff) standard character ROM |
| 412 | | // AM_RANGE(0xd8000, 0xdffff) AM_RAM // AUX character RAM |
| 445 | AM_RANGE(0xd8000, 0xdffff) AM_RAM // AUX character RAM |
| 413 | 446 | // AM_RANGE(0xe0000, 0xeffff) Special Character RAM |
| 414 | 447 | AM_RANGE(0xfe000, 0xfffff) AM_ROM AM_REGION("ipl", 0) |
| 415 | 448 | ADDRESS_MAP_END |
| r19059 | r19060 | |
| 422 | 455 | // 0x30, 0x37 serial port 0/1 (i8251) (even/odd) |
| 423 | 456 | AM_RANGE(0x38, 0x3f) AM_WRITE8(apc_dma_segments_w,0x00ff) |
| 424 | 457 | AM_RANGE(0x40, 0x43) AM_READWRITE8(apc_gdc_r, apc_gdc_w, 0xffff) |
| 425 | | // 0x46 UPD7220 reset interrupt |
| 458 | AM_RANGE(0x46, 0x47) AM_WRITE8(apc_irq_ack_w, 0x00ff) |
| 426 | 459 | AM_RANGE(0x48, 0x4f) AM_READWRITE8(apc_kbd_r, apc_kbd_w, 0x00ff) |
| 427 | 460 | AM_RANGE(0x50, 0x53) AM_DEVICE8("upd765", upd765a_device, map, 0x00ff ) // upd765 |
| 461 | AM_RANGE(0x58, 0x59) AM_READWRITE8(apc_rtc_r, apc_rtc_w, 0x00ff) |
| 428 | 462 | // 0x5a APU data (Arithmetic Processing Unit!) |
| 429 | 463 | // 0x5e APU status/command |
| 430 | 464 | AM_RANGE(0x60, 0x67) AM_READWRITE8(apc_port_60_r, apc_port_60_w, 0xffff) |
| r19059 | r19060 | |
| 503 | 537 | PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("[ / {") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x5b) |
| 504 | 538 | PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\\ / |") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x5c) |
| 505 | 539 | PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("] / }") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x5d) |
| 506 | | PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("¯ / ^") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x5e) |
| 540 | PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("(up score) / ^") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x5e) |
| 507 | 541 | PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("- / _") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x5f) |
| 508 | 542 | // PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("unk6") PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x26) |
| 509 | 543 | |
| r19059 | r19060 | |
| 638 | 672 | BYTE 0X08 ; 9C - back space |
| 639 | 673 | */ |
| 640 | 674 | PORT_START("KEY_S1") |
| 641 | | PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("BREAK") PORT_CODE(KEYCODE_ESC) PORT_CHAR(0x00) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x96) |
| 675 | PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("BREAK") PORT_CHAR(0x00) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x96) |
| 642 | 676 | PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x0d) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x97) |
| 643 | 677 | PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("TAB") /*PORT_CODE(KEYCODE_TAB)*/ PORT_CHAR(0x09) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x98) |
| 644 | 678 | PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_UNUSED) //0x99 |
| 645 | 679 | PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME) PORT_CHAR(0x1e) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x9a) |
| 646 | 680 | PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_UNUSED) //0x9b |
| 647 | 681 | PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("BACK SPACE") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x08) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x9c) |
| 682 | PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ESC") PORT_CHAR(0x1b) PORT_IMPULSE(1) PORT_CHANGED_MEMBER(DEVICE_SELF, apc_state, key_stroke, 0x1b) |
| 648 | 683 | |
| 649 | 684 | /* |
| 650 | 685 | BYTE 0X0B ; F7 - up arrow |
| r19059 | r19060 | |
| 667 | 702 | PORT_START("KEY_MOD") |
| 668 | 703 | PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) |
| 669 | 704 | PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE |
| 670 | | |
| 671 | 705 | INPUT_PORTS_END |
| 672 | 706 | |
| 673 | 707 | void apc_state::fdc_drq(bool state) |
| r19059 | r19060 | |
| 696 | 730 | m_fdc->set_rate(500000); |
| 697 | 731 | m_fdc->setup_intrq_cb(upd765a_device::line_cb(FUNC(apc_state::fdc_irq), this)); |
| 698 | 732 | m_fdc->setup_drq_cb(upd765a_device::line_cb(FUNC(apc_state::fdc_drq), this)); |
| 733 | |
| 734 | m_rtc->cs_w(1); |
| 735 | // m_rtc->oe_w(1); |
| 699 | 736 | } |
| 700 | 737 | |
| 701 | 738 | void apc_state::machine_reset() |
| r19059 | r19060 | |
| 764 | 801 | { |
| 765 | 802 | { |
| 766 | 803 | { |
| 767 | | 1996800, /* heartbeat IRQ */ |
| 804 | MAIN_CLOCK, /* heartbeat IRQ */ |
| 768 | 805 | DEVCB_NULL, |
| 769 | | DEVCB_NULL |
| 806 | DEVCB_DEVICE_LINE("pic8259_master", pic8259_ir3_w) |
| 770 | 807 | }, { |
| 771 | | 1996800, /* Memory Refresh */ |
| 808 | MAIN_CLOCK, /* Memory Refresh */ |
| 772 | 809 | DEVCB_NULL, |
| 773 | 810 | DEVCB_NULL |
| 774 | 811 | }, { |
| 775 | | 1996800, /* RS-232c */ |
| 812 | MAIN_CLOCK, /* RS-232c */ |
| 776 | 813 | DEVCB_NULL, |
| 777 | 814 | DEVCB_NULL |
| 778 | 815 | } |
| r19059 | r19060 | |
| 910 | 947 | { DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_dack0_w), DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_dack1_w), DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_dack2_w), DEVCB_DRIVER_LINE_MEMBER(apc_state, apc_dack3_w) } |
| 911 | 948 | }; |
| 912 | 949 | |
| 950 | static UPD1990A_INTERFACE( apc_upd1990a_intf ) |
| 951 | { |
| 952 | DEVCB_NULL, |
| 953 | DEVCB_NULL |
| 954 | }; |
| 955 | |
| 913 | 956 | static const floppy_format_type apc_floppy_formats[] = { |
| 914 | 957 | FLOPPY_D88_FORMAT, |
| 915 | 958 | FLOPPY_IMD_FORMAT, |
| r19059 | r19060 | |
| 931 | 974 | palette_set_color_rgb(machine(), i, pal1bit(0), pal1bit(0), pal1bit(0)); |
| 932 | 975 | } |
| 933 | 976 | |
| 934 | | #define MAIN_CLOCK XTAL_5MHz |
| 935 | | |
| 936 | 977 | static MACHINE_CONFIG_START( apc, apc_state ) |
| 937 | 978 | |
| 938 | 979 | /* basic machine hardware */ |
| r19059 | r19060 | |
| 946 | 987 | MCFG_I8237_ADD("i8237", MAIN_CLOCK, dmac_intf) |
| 947 | 988 | |
| 948 | 989 | MCFG_NVRAM_ADD_1FILL("cmos") |
| 990 | MCFG_UPD1990A_ADD("upd1990a", XTAL_32_768kHz, apc_upd1990a_intf) |
| 949 | 991 | |
| 950 | 992 | MCFG_UPD765A_ADD("upd765", true, true) |
| 951 | 993 | MCFG_FLOPPY_DRIVE_ADD("upd765:0", apc_floppies, "8", 0, apc_floppy_formats) |