src/mess/drivers/sg1000.c
| r4262 | r4263 | |
| 31 | 31 | |
| 32 | 32 | Notes: |
| 33 | 33 | All IC's shown. |
| 34 | | |
| 34 | |
| 35 | 35 | Z80 - NEC D780C-1 / Zilog Z8400A (REV.A) Z80A CPU @ 3.579545 |
| 36 | 36 | TMS9918A- Texas Instruments TMS9918ANL Video Display Processor @ 10.738635MHz |
| 37 | 37 | MB8118 - Fujitsu MB8118-12 16K x 1 Dynamic RAM |
| r4262 | r4263 | |
| 55 | 55 | |
| 56 | 56 | - OMV keyboard |
| 57 | 57 | - SC-3000 return instruction referenced by R when reading ports 60-7f,e0-ff |
| 58 | | - connect the PSG /READY signal |
| 58 | - connect the PSG /READY signal |
| 59 | 59 | - accurate video timing |
| 60 | 60 | - SP-400 serial printer |
| 61 | 61 | - SH-400 racing controller |
| r4262 | r4263 | |
| 70 | 70 | #include "devices/cartslot.h" |
| 71 | 71 | #include "devices/cassette.h" |
| 72 | 72 | #include "devices/printer.h" |
| 73 | | #include "machine/centroni.h" |
| 73 | #include "machine/ctronics.h" |
| 74 | 74 | #include "includes/serial.h" |
| 75 | 75 | #include "machine/msm8251.h" |
| 76 | 76 | #include "machine/8255ppi.h" |
| r4262 | r4263 | |
| 421 | 421 | PORT_BIT( 0x, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') |
| 422 | 422 | PORT_BIT( 0x, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') |
| 423 | 423 | PORT_BIT( 0x, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') |
| 424 | | |
| 424 | |
| 425 | 425 | PORT_BIT( 0x, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("S-1") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) |
| 426 | 426 | PORT_BIT( 0x, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("S-1") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) |
| 427 | 427 | */ |
| r4262 | r4263 | |
| 531 | 531 | |
| 532 | 532 | /* cartridge contact */ |
| 533 | 533 | data |= 0x10; |
| 534 | | |
| 534 | |
| 535 | 535 | /* printer */ |
| 536 | 536 | data |= 0x60; |
| 537 | 537 | |
| r4262 | r4263 | |
| 609 | 609 | PA7 |
| 610 | 610 | */ |
| 611 | 611 | |
| 612 | const device_config *printer = devtag_get_device(device->machine, CENTRONICS, "centronics"); |
| 612 | 613 | sg1000_state *state = device->machine->driver_data; |
| 614 | UINT8 result = 0; |
| 613 | 615 | |
| 614 | | int centronics_handshake = centronics_read_handshake(device->machine,1); |
| 615 | | int busy = 0; |
| 616 | result |= state->fdc_irq; |
| 617 | result |= centronics_busy_r(printer) << 1; |
| 618 | result |= state->fdc_index << 2; |
| 616 | 619 | |
| 617 | | if ((centronics_handshake & CENTRONICS_NOT_BUSY) == 0) |
| 618 | | { |
| 619 | | busy = 0x02; |
| 620 | | } |
| 621 | | |
| 622 | | return (state->fdc_index << 2) | busy | state->fdc_irq; |
| 620 | return result; |
| 623 | 621 | } |
| 624 | 622 | |
| 625 | | static WRITE8_DEVICE_HANDLER( sf7000_ppi8255_b_w ) |
| 626 | | { |
| 627 | | /* |
| 628 | | Signal Description |
| 629 | | |
| 630 | | PB0 Data output to Centronics printer |
| 631 | | PB1 Data output to Centronics printer |
| 632 | | PB2 Data output to Centronics printer |
| 633 | | PB3 Data output to Centronics printer |
| 634 | | PB4 Data output to Centronics printer |
| 635 | | PB5 Data output to Centronics printer |
| 636 | | PB6 Data output to Centronics printer |
| 637 | | PB7 Data output to Centronics printer |
| 638 | | */ |
| 639 | | |
| 640 | | centronics_write_data(device->machine, 1, data); |
| 641 | | } |
| 642 | | |
| 643 | 623 | static WRITE8_DEVICE_HANDLER( sf7000_ppi8255_c_w ) |
| 644 | 624 | { |
| 645 | | device_config *fdc = (device_config*)devtag_get_device(device->machine, NEC765A, "nec765"); |
| 625 | const device_config *fdc = devtag_get_device(device->machine, NEC765A, "nec765"); |
| 626 | const device_config *printer = devtag_get_device(device->machine, CENTRONICS, "centronics"); |
| 646 | 627 | /* |
| 647 | 628 | Signal Description |
| 648 | 629 | |
| r4262 | r4263 | |
| 670 | 651 | } |
| 671 | 652 | |
| 672 | 653 | /* ROM selection */ |
| 673 | | memory_set_bank(device->machine, 1, (data & 0x40) >> 6); |
| 654 | memory_set_bank(device->machine, 1, BIT(data, 6)); |
| 674 | 655 | |
| 675 | 656 | /* printer strobe */ |
| 676 | | centronics_write_handshake(device->machine, 1, (data & 0x80) ? 0 : CENTRONICS_STROBE, CENTRONICS_STROBE); |
| 657 | centronics_strobe_w(printer, BIT(data, 7)); |
| 677 | 658 | } |
| 678 | 659 | |
| 679 | 660 | static const ppi8255_interface sf7000_ppi8255_intf[2] = |
| r4262 | r4263 | |
| 691 | 672 | DEVCB_NULL, // Port B read |
| 692 | 673 | DEVCB_NULL, // Port C read |
| 693 | 674 | DEVCB_NULL, // Port A write |
| 694 | | DEVCB_HANDLER(sf7000_ppi8255_b_w), // Port B write |
| 675 | DEVCB_DEVICE_HANDLER(CENTRONICS, "centronics", centronics_data_w), // Port B write |
| 695 | 676 | DEVCB_HANDLER(sf7000_ppi8255_c_w) // Port C write |
| 696 | 677 | } |
| 697 | 678 | }; |
| r4262 | r4263 | |
| 719 | 700 | NEC765_RDY_PIN_CONNECTED |
| 720 | 701 | }; |
| 721 | 702 | |
| 722 | | static const CENTRONICS_CONFIG sf7000_centronics_config[1] = { |
| 723 | | { |
| 724 | | PRINTER_IBM, |
| 725 | | NULL |
| 726 | | } |
| 727 | | }; |
| 728 | 703 | |
| 729 | 704 | static MACHINE_START( sf7000 ) |
| 730 | 705 | { |
| r4262 | r4263 | |
| 736 | 711 | /* configure FDC */ |
| 737 | 712 | floppy_drive_set_index_pulse_callback(image_from_devtype_and_index(machine, IO_FLOPPY, 0), sf7000_fdc_index_callback); |
| 738 | 713 | |
| 739 | | /* configure PPI */ |
| 740 | | centronics_config(machine, 1, sf7000_centronics_config); |
| 741 | | |
| 742 | 714 | /* configure memory banking */ |
| 743 | 715 | memory_configure_bank(machine, 1, 0, 1, memory_region(machine, "main"), 0); |
| 744 | 716 | memory_configure_bank(machine, 1, 1, 1, mess_ram, 0); |
| r4262 | r4263 | |
| 883 | 855 | |
| 884 | 856 | static MACHINE_DRIVER_START( omv ) |
| 885 | 857 | MDRV_IMPORT_FROM(sg1000) |
| 886 | | |
| 858 | |
| 887 | 859 | MDRV_CARTSLOT_MODIFY("cart") |
| 888 | 860 | MDRV_CARTSLOT_EXTENSION_LIST("sg,bin") |
| 889 | 861 | MDRV_CARTSLOT_NOT_MANDATORY |
| r4262 | r4263 | |
| 922 | 894 | MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 923 | 895 | |
| 924 | 896 | /* printer */ |
| 925 | | MDRV_PRINTER_ADD("printer") |
| 897 | MDRV_PRINTER_ADD("sp400") /* serial printer */ |
| 926 | 898 | |
| 927 | 899 | /* cassette */ |
| 928 | 900 | MDRV_CASSETTE_ADD( "cassette", sc3000_cassette_config ) |
| r4262 | r4263 | |
| 947 | 919 | MDRV_MACHINE_RESET( sf7000 ) |
| 948 | 920 | |
| 949 | 921 | MDRV_PPI8255_ADD("ppi8255_0", sf7000_ppi8255_intf[0]) |
| 950 | | |
| 951 | 922 | MDRV_PPI8255_ADD("ppi8255_1", sf7000_ppi8255_intf[1]) |
| 952 | 923 | |
| 953 | 924 | /* video hardware */ |
| r4262 | r4263 | |
| 962 | 933 | MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 963 | 934 | |
| 964 | 935 | /* printer */ |
| 965 | | MDRV_PRINTER_ADD("printer") |
| 966 | | MDRV_PRINTER_ADD("sp400") |
| 936 | MDRV_CENTRONICS_ADD("centronics", standard_centronics) |
| 937 | MDRV_PRINTER_ADD("sp400") /* serial printer */ |
| 967 | 938 | |
| 968 | 939 | /* cassette */ |
| 969 | 940 | MDRV_CASSETTE_ADD("cassette", sc3000_cassette_config) |
| 970 | 941 | |
| 971 | 942 | /* uart */ |
| 972 | 943 | MDRV_MSM8251_ADD("uart", default_msm8251_interface) |
| 973 | | |
| 974 | | MDRV_NEC765A_ADD("nec765", sf7000_nec765_interface) |
| 944 | |
| 945 | MDRV_NEC765A_ADD("nec765", sf7000_nec765_interface) |
| 975 | 946 | MACHINE_DRIVER_END |
| 976 | 947 | |
| 977 | 948 | /* ROMs */ |