diff options
Diffstat (limited to 'src/devices/bus/abcbus/lux21046.cpp')
-rw-r--r-- | src/devices/bus/abcbus/lux21046.cpp | 1163 |
1 files changed, 1163 insertions, 0 deletions
diff --git a/src/devices/bus/abcbus/lux21046.cpp b/src/devices/bus/abcbus/lux21046.cpp new file mode 100644 index 00000000000..67396d81139 --- /dev/null +++ b/src/devices/bus/abcbus/lux21046.cpp @@ -0,0 +1,1163 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Luxor 55 21046-11/-21/-41 5.25"/8" Controller Card emulation + +*********************************************************************/ + +/* + +Luxor Conkort + +PCB Layout +---------- + +55 11046-03 + +|-----------------------------------| +| LD1 SW1 CON2 | +| | +| CON3 S8 | +| S9 | +| LS240 LS174 7406 7406 | +| | +| LS174 FDC9229 LS107 LS266 | +| | +| | +| SAB1793 | +| LS368 16MHz | +| S6 | +| Z80DMA ROM | +| | +| | +| Z80 TC5565 | +| | +| | +| LS138 LS174 SW2 74374 | +| | +| LS10 LS266 S5 LS374 | +| S3 | +| PAL* S1 LS240 | +| | +| LS125* LS244 SW3 DM8131 | +| | +| | +|--|-----------------------------|--| + |------------CON1-------------| + +Notes: + All IC's shown. (* only stocked when used with the ABC 1600 computer) + + ROM - Toshiba TMM27128D-20 16Kx8 EPROM "CNTR 1.07 6490318-07" + PAL - PAL16R4 + TC5565 - Toshiba TC5565PL-15 8Kx8 bit Static RAM + Z80 - Zilog Z8400APS Z80A CPU + Z80DMA - Zilog Z8410APS Z80A DMA + SAB1793 - Siemens SAB1793-02P Floppy Disc Controller + FDC9229 - SMC FDC9229BT Floppy Disc Interface Circuit + DM8131 - National Semiconductor DM8131N 6-Bit Unified Bus Comparator + CON1 - ABC bus connector + CON2 - 25-pin D sub floppy connector (AMP4284) + CON3 - 34-pin header floppy connector + SW1 - Disk drive type (SS/DS, SD/DD) + SW2 - Disk drive model + SW3 - ABC bus address + S1 - Interface type (A:ABC1600 B:ABCBUS) + S3 - Interface type (A:ABC1600 B:ABCBUS) + S5 - Interface type (A:ABC1600 B:ABCBUS) + S6 - Amount of RAM installed (A:2KB, B:8KB) + S7 - Number of drives connected (0:3, 1:2) *located on solder side + S8 - Disk drive type (0:8", 1:5.25") + S9 - Location of RDY signal (A:8" P2-6, B:5.25" P2-34) + LD1 - LED + +*/ + +#include "lux21046.h" + + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +#define Z80_TAG "5ab" +#define Z80DMA_TAG "6ab" +#define SAB1793_TAG "7ab" +#define FDC9229_TAG "8b" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type LUXOR_55_21046 = &device_creator<luxor_55_21046_device>; +const device_type ABC830 = &device_creator<abc830_device>; +const device_type ABC832 = &device_creator<abc832_device>; +const device_type ABC834 = &device_creator<abc834_device>; +const device_type ABC838 = &device_creator<abc838_device>; +const device_type ABC850_FLOPPY = &device_creator<abc850_floppy_device>; + + +//------------------------------------------------- +// ROM( luxor_55_21046 ) +//------------------------------------------------- + +ROM_START( luxor_55_21046 ) + ROM_REGION( 0x4000, Z80_TAG, 0 ) + ROM_DEFAULT_BIOS( "v107" ) + ROM_SYSTEM_BIOS( 0, "v107", "Luxor v1.07 (1985-07-03)" ) + ROMX_LOAD( "cntr 1.07 6490318-07.6cd", 0x0000, 0x4000, CRC(db8c1c0e) SHA1(8bccd5bc72124984de529ee058df779f06d2c1d5), ROM_BIOS(1) ) + ROM_SYSTEM_BIOS( 1, "v108", "Luxor v1.08 (1986-03-12)" ) + ROMX_LOAD( "cntr 108.6cd", 0x2000, 0x2000, CRC(229764cb) SHA1(a2e2f6f49c31b827efc62f894de9a770b65d109d), ROM_BIOS(2) ) + ROM_SYSTEM_BIOS( 2, "v207", "DiAB v2.07 (1987-06-24)" ) + ROMX_LOAD( "diab 207.6cd", 0x2000, 0x2000, CRC(86622f52) SHA1(61ad271de53152c1640c0b364fce46d1b0b4c7e2), ROM_BIOS(3) ) + + ROM_REGION( 0x104, "plds", 0 ) + ROM_LOAD( "pal16r4.2a", 0x000, 0x104, NO_DUMP) +ROM_END + + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const rom_entry *luxor_55_21046_device::device_rom_region() const +{ + return ROM_NAME( luxor_55_21046 ); +} + + +//------------------------------------------------- +// ADDRESS_MAP( luxor_55_21046_mem ) +//------------------------------------------------- + +static ADDRESS_MAP_START( luxor_55_21046_mem, AS_PROGRAM, 8, luxor_55_21046_device ) + ADDRESS_MAP_UNMAP_HIGH + ADDRESS_MAP_GLOBAL_MASK(0x3fff) + AM_RANGE(0x0000, 0x1fff) AM_ROM AM_REGION(Z80_TAG, 0x2000) // A13 pull-up + AM_RANGE(0x2000, 0x3fff) AM_RAM +ADDRESS_MAP_END + + +//------------------------------------------------- +// ADDRESS_MAP( luxor_55_21046_io ) +//------------------------------------------------- + +static ADDRESS_MAP_START( luxor_55_21046_io, AS_IO, 8, luxor_55_21046_device ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x0c, 0x0c) AM_MIRROR(0xff03) AM_READ(out_r) + AM_RANGE(0x1c, 0x1c) AM_MIRROR(0xff03) AM_WRITE(inp_w) + AM_RANGE(0x2c, 0x2c) AM_MIRROR(0xff03) AM_WRITE(_4b_w) + AM_RANGE(0x3c, 0x3c) AM_MIRROR(0xff03) AM_WRITE(_9b_w) + AM_RANGE(0x4c, 0x4c) AM_MIRROR(0xff03) AM_WRITE(_8a_w) + AM_RANGE(0x5c, 0x5c) AM_MIRROR(0xff07) AM_MASK(0xff00) AM_READ(_9a_r) + AM_RANGE(0x68, 0x6b) AM_MIRROR(0xff00) AM_DEVREAD(SAB1793_TAG, fd1793_t, read) + AM_RANGE(0x78, 0x7b) AM_MIRROR(0xff00) AM_DEVWRITE(SAB1793_TAG, fd1793_t, write) + AM_RANGE(0x80, 0x80) AM_MIRROR(0xff77) AM_DEVREADWRITE(Z80DMA_TAG, z80dma_device, read, write) +ADDRESS_MAP_END + + +//------------------------------------------------- +// Z80DMA +//------------------------------------------------- + +/* + + DMA Transfer Programs + + READ DAM + -------- + 7D 45 21 05 00 C3 14 28 95 6B 02 8A CF 01 AF CF 87 + + 7D transfer mode, port A -> port B, port A starting address follows, block length follows + 45 port A starting address low byte = 45 + 21 port A starting address high byte = 21 + 05 block length low byte = 05 + 00 block length high byte = 00 + C3 reset + 14 port A is memory, port A address increments + 28 port B is I/O, port B address fixed + 95 byte mode, port B starting address low byte follows, interrupt control byte follows + 6B port B starting address low byte = 6B (FDC DATA read) + 02 interrupt at end of block + 8A ready active high + CF load + 01 transfer B->A + AF disable interrupts + CF load + 87 enable DMA + + WRITE TO DISK + ------------- + C3 14 28 95 7B 02 8A CF 05 AF CF 87 + + C3 reset + 14 port A is memory, port A address increments + 28 port B is I/O, port B address fixed + 95 byte mode, port B starting address low follows, interrupt control byte follows + 7B port B starting address 0x007B (FDC DATA write) + 02 interrupt at end of block + 8A ready active high + CF load + 05 transfer A->B + AF disable interrupts + CF load + 87 enable DMA + + ?? + -- + C3 91 40 8A AB + + C3 reset + 91 byte mode, interrupt control byte follows + 40 interrupt on RDY + 8A _CE only, ready active high, stop on end of block + AB enable interrupts + +*/ + +WRITE_LINE_MEMBER( luxor_55_21046_device::dma_int_w ) +{ + m_dma_irq = state; + + // FDC and DMA interrupts are wire-ORed to the Z80 + m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_fdc_irq || m_dma_irq); +} + +READ8_MEMBER( luxor_55_21046_device::memory_read_byte ) +{ + return m_maincpu->space(AS_PROGRAM).read_byte(offset); +} + +WRITE8_MEMBER( luxor_55_21046_device::memory_write_byte ) +{ + return m_maincpu->space(AS_PROGRAM).write_byte(offset, data); +} + +READ8_MEMBER( luxor_55_21046_device::io_read_byte ) +{ + return m_maincpu->space(AS_IO).read_byte(offset); +} + +WRITE8_MEMBER( luxor_55_21046_device::io_write_byte ) +{ + return m_maincpu->space(AS_IO).write_byte(offset, data); +} + +FLOPPY_FORMATS_MEMBER( luxor_55_21046_device::floppy_formats ) + FLOPPY_ABC800_FORMAT +FLOPPY_FORMATS_END + +static SLOT_INTERFACE_START( abc_floppies ) + SLOT_INTERFACE( "525sssd", FLOPPY_525_SSSD ) + SLOT_INTERFACE( "525sd", FLOPPY_525_SD ) + SLOT_INTERFACE( "525ssdd", FLOPPY_525_SSDD ) + SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) + SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) + SLOT_INTERFACE( "8dsdd", FLOPPY_8_DSDD ) +SLOT_INTERFACE_END + +WRITE_LINE_MEMBER( luxor_55_21046_device::fdc_intrq_w ) +{ + m_fdc_irq = state; + + // FDC and DMA interrupts are wire-ORed to the Z80 + m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_fdc_irq || m_dma_irq); +} + + +//------------------------------------------------- +// z80_daisy_config z80_daisy_chain +//------------------------------------------------- + +static const z80_daisy_config z80_daisy_chain[] = +{ + { Z80DMA_TAG }, + { NULL } +}; + + +//------------------------------------------------- +// MACHINE_CONFIG( luxor_55_21046 ) +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( luxor_55_21046 ) + MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_16MHz/4) + MCFG_CPU_CONFIG(z80_daisy_chain) + MCFG_CPU_PROGRAM_MAP(luxor_55_21046_mem) + MCFG_CPU_IO_MAP(luxor_55_21046_io) + + MCFG_DEVICE_ADD(Z80DMA_TAG, Z80DMA, XTAL_16MHz/4) + MCFG_Z80DMA_OUT_BUSREQ_CB(INPUTLINE(Z80_TAG, INPUT_LINE_HALT)) + MCFG_Z80DMA_OUT_INT_CB(WRITELINE(luxor_55_21046_device, dma_int_w)) + MCFG_Z80DMA_IN_MREQ_CB(READ8(luxor_55_21046_device, memory_read_byte)) + MCFG_Z80DMA_OUT_MREQ_CB(WRITE8(luxor_55_21046_device, memory_write_byte)) + MCFG_Z80DMA_IN_IORQ_CB(READ8(luxor_55_21046_device, io_read_byte)) + MCFG_Z80DMA_OUT_IORQ_CB(WRITE8(luxor_55_21046_device, io_write_byte)) + + MCFG_FD1793_ADD(SAB1793_TAG, XTAL_16MHz/16) + MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(luxor_55_21046_device, fdc_intrq_w)) + MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE(Z80DMA_TAG, z80dma_device, rdy_w)) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// MACHINE_CONFIG( abc830 ) +//------------------------------------------------- + +static MACHINE_CONFIG_DERIVED( abc830, luxor_55_21046 ) + MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":0", abc_floppies, "525ssdd", luxor_55_21046_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":1", abc_floppies, "525ssdd", luxor_55_21046_device::floppy_formats) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// MACHINE_CONFIG( abc832 ) +//------------------------------------------------- + +static MACHINE_CONFIG_DERIVED( abc832, luxor_55_21046 ) + MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":0", abc_floppies, "525qd", luxor_55_21046_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":1", abc_floppies, "525qd", luxor_55_21046_device::floppy_formats) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// MACHINE_CONFIG( abc838 ) +//------------------------------------------------- + +static MACHINE_CONFIG_DERIVED( abc838, luxor_55_21046 ) + MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":0", abc_floppies, "8dsdd", luxor_55_21046_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":1", abc_floppies, "8dsdd", luxor_55_21046_device::floppy_formats) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// MACHINE_CONFIG( abc850 ) +//------------------------------------------------- + +static MACHINE_CONFIG_DERIVED( abc850, luxor_55_21046 ) + MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":0", abc_floppies, "525qd", luxor_55_21046_device::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":1", abc_floppies, NULL, luxor_55_21046_device::floppy_formats) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor luxor_55_21046_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( luxor_55_21046 ); +} + +machine_config_constructor abc830_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( abc830 ); +} + +machine_config_constructor abc832_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( abc832 ); +} + +machine_config_constructor abc834_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( abc832 ); +} + +machine_config_constructor abc838_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( abc838 ); +} + +machine_config_constructor abc850_floppy_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( abc850 ); +} + + +//------------------------------------------------- +// INPUT_PORTS( luxor_55_21046 ) +//------------------------------------------------- + +INPUT_PORTS_START( luxor_55_21046 ) + PORT_START("SW1") + // ABC 838 + PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:1,2,3,4") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2e) + PORT_DIPSETTING( 0x00, DEF_STR( Unused ) ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2e) + // ABC 830 + PORT_DIPNAME( 0x01, 0x01, "Drive 0 Sides" ) PORT_DIPLOCATION("SW1:1") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d) + PORT_DIPSETTING( 0x01, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x02, 0x02, "Drive 1 Sides" ) PORT_DIPLOCATION("SW1:2") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d) + PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x04, 0x00, "Drive 0 Density" ) PORT_DIPLOCATION("SW1:3") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d) + PORT_DIPSETTING( 0x04, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x08, 0x00, "Drive 1 Density" ) PORT_DIPLOCATION("SW1:4") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d) + PORT_DIPSETTING( 0x08, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + // ABC 832/834/850 + PORT_DIPNAME( 0x01, 0x00, "Drive 0 Sides" ) PORT_DIPLOCATION("SW1:1") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) + PORT_DIPSETTING( 0x01, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x02, 0x00, "Drive 1 Sides" ) PORT_DIPLOCATION("SW1:2") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) + PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x04, 0x04, "Drive 0 Tracks" ) PORT_DIPLOCATION("SW1:3") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) + PORT_DIPSETTING( 0x00, "40" ) + PORT_DIPSETTING( 0x04, "80" ) + PORT_DIPNAME( 0x08, 0x08, "Drive 1 Tracks" ) PORT_DIPLOCATION("SW1:4") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) + PORT_DIPSETTING( 0x00, "40" ) + PORT_DIPSETTING( 0x08, "80" ) + + PORT_START("SW2") + PORT_DIPNAME( 0x0f, 0x01, "Drive Type" ) PORT_DIPLOCATION("SW2:1,2,3,4") + PORT_DIPSETTING( 0x01, "TEAC FD55F (ABC 834)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) // 230 7802-01 + PORT_DIPSETTING( 0x02, "BASF 6138 (ABC 850)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) // 230 8440-15 + PORT_DIPSETTING( 0x03, "Micropolis 1015F (ABC 832)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) // 190 9711-15 + PORT_DIPSETTING( 0x04, "BASF 6118 (ABC 832)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) // 190 9711-16 + PORT_DIPSETTING( 0x05, "Micropolis 1115F (ABC 832)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) // 190 9711-17 + PORT_DIPSETTING( 0x08, "BASF 6106/08 (ABC 830)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d) // 190 9206-16 + PORT_DIPSETTING( 0x09, "MPI 51 (ABC 830)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d) // 190 9206-16 + PORT_DIPSETTING( 0x0e, "BASF 6105 (ABC 838)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2e) + PORT_DIPSETTING( 0x0f, "BASF 6106 (ABC 838)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2e) // 230 8838-15 + + PORT_START("SW3") + PORT_DIPNAME( 0x7f, 0x2c, "Card Address" ) PORT_DIPLOCATION("SW3:1,2,3,4,5,6,7") + PORT_DIPSETTING( 0x2c, "44 (ABC 832/834/850)" ) // MF0: MF1: + PORT_DIPSETTING( 0x2d, "45 (ABC 830)" ) // MO0: MO1: + PORT_DIPSETTING( 0x2e, "46 (ABC 838)" ) // SF0: SF1: + + PORT_START("S1") // also S3,S5 + PORT_DIPNAME( 0x01, 0x01, "Interface Type" ) + PORT_DIPSETTING( 0x00, "ABC 1600" ) + PORT_DIPSETTING( 0x01, "ABC 80/800/802/806" ) + + PORT_START("S6") + PORT_DIPNAME( 0x01, 0x01, "RAM Size" ) + PORT_DIPSETTING( 0x00, "2 KB" ) + PORT_DIPSETTING( 0x01, "8 KB" ) + + PORT_START("S8") + PORT_DIPNAME( 0x01, 0x01, "Drive Type" ) + PORT_DIPSETTING( 0x00, "8\"" ) + PORT_DIPSETTING( 0x01, "5.25\"" ) + + PORT_START("S9") + PORT_DIPNAME( 0x01, 0x01, "RDY Pin" ) + PORT_DIPSETTING( 0x00, "P2-6 (8\")" ) + PORT_DIPSETTING( 0x01, "P2-34 (5.25\")" ) +INPUT_PORTS_END + + +//------------------------------------------------- +// INPUT_PORTS( abc830 ) +//------------------------------------------------- + +INPUT_PORTS_START( abc830 ) + PORT_START("SW1") + PORT_DIPNAME( 0x01, 0x01, "Drive 0 Sides" ) PORT_DIPLOCATION("SW1:1") + PORT_DIPSETTING( 0x01, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x02, 0x02, "Drive 1 Sides" ) PORT_DIPLOCATION("SW1:2") + PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x04, 0x00, "Drive 0 Density" ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x04, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x08, 0x00, "Drive 1 Density" ) PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x08, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + + PORT_START("SW2") + PORT_DIPNAME( 0x0f, 0x08, "Drive Type" ) PORT_DIPLOCATION("SW2:1,2,3,4") + PORT_DIPSETTING( 0x08, "BASF 6106/08" ) + PORT_DIPSETTING( 0x09, "MPI 51" ) + + PORT_START("SW3") + PORT_DIPNAME( 0x7f, 0x2d, "Card Address" ) PORT_DIPLOCATION("SW3:1,2,3,4,5,6,7") + PORT_DIPSETTING( 0x2d, "45" ) + + PORT_START("S1") // also S3,S5 + PORT_DIPNAME( 0x01, 0x01, "Interface Type" ) + PORT_DIPSETTING( 0x00, "ABC 1600" ) + PORT_DIPSETTING( 0x01, "ABC 80/800/802/806" ) + + PORT_START("S6") + PORT_DIPNAME( 0x01, 0x01, "RAM Size" ) + PORT_DIPSETTING( 0x00, "2 KB" ) + PORT_DIPSETTING( 0x01, "8 KB" ) + + PORT_START("S8") + PORT_DIPNAME( 0x01, 0x01, "Drive Type" ) + PORT_DIPSETTING( 0x00, "8\"" ) + PORT_DIPSETTING( 0x01, "5.25\"" ) + + PORT_START("S9") + PORT_DIPNAME( 0x01, 0x01, "RDY Pin" ) + PORT_DIPSETTING( 0x00, "P2-6 (8\")" ) + PORT_DIPSETTING( 0x01, "P2-34 (5.25\")" ) +INPUT_PORTS_END + + +//------------------------------------------------- +// INPUT_PORTS( abc832 ) +//------------------------------------------------- + +INPUT_PORTS_START( abc832 ) + PORT_START("SW1") + PORT_DIPNAME( 0x01, 0x00, "Drive 0 Sides" ) PORT_DIPLOCATION("SW1:1") + PORT_DIPSETTING( 0x01, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x02, 0x00, "Drive 1 Sides" ) PORT_DIPLOCATION("SW1:2") + PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x04, 0x04, "Drive 0 Tracks" ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x00, "40" ) + PORT_DIPSETTING( 0x04, "80" ) + PORT_DIPNAME( 0x08, 0x08, "Drive 1 Tracks" ) PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x00, "40" ) + PORT_DIPSETTING( 0x08, "80" ) + + PORT_START("SW2") + PORT_DIPNAME( 0x0f, 0x04, "Drive Type" ) PORT_DIPLOCATION("SW2:1,2,3,4") + PORT_DIPSETTING( 0x03, "Micropolis 1015F" ) + PORT_DIPSETTING( 0x04, "BASF 6118" ) + PORT_DIPSETTING( 0x05, "Micropolis 1115F" ) + + PORT_START("SW3") + PORT_DIPNAME( 0x7f, 0x2c, "Card Address" ) PORT_DIPLOCATION("SW3:1,2,3,4,5,6,7") + PORT_DIPSETTING( 0x2c, "44" ) + + PORT_START("S1") // also S3,S5 + PORT_DIPNAME( 0x01, 0x01, "Interface Type" ) + PORT_DIPSETTING( 0x00, "ABC 1600" ) + PORT_DIPSETTING( 0x01, "ABC 80/800/802/806" ) + + PORT_START("S6") + PORT_DIPNAME( 0x01, 0x01, "RAM Size" ) + PORT_DIPSETTING( 0x00, "2 KB" ) + PORT_DIPSETTING( 0x01, "8 KB" ) + + PORT_START("S8") + PORT_DIPNAME( 0x01, 0x01, "Drive Type" ) + PORT_DIPSETTING( 0x00, "8\"" ) + PORT_DIPSETTING( 0x01, "5.25\"" ) + + PORT_START("S9") + PORT_DIPNAME( 0x01, 0x01, "RDY Pin" ) + PORT_DIPSETTING( 0x00, "P2-6 (8\")" ) + PORT_DIPSETTING( 0x01, "P2-34 (5.25\")" ) +INPUT_PORTS_END + + +//------------------------------------------------- +// INPUT_PORTS( abc834 ) +//------------------------------------------------- + +INPUT_PORTS_START( abc834 ) + PORT_START("SW1") + PORT_DIPNAME( 0x01, 0x00, "Drive 0 Sides" ) PORT_DIPLOCATION("SW1:1") + PORT_DIPSETTING( 0x01, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x02, 0x00, "Drive 1 Sides" ) PORT_DIPLOCATION("SW1:2") + PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, "Double" ) + PORT_DIPNAME( 0x04, 0x04, "Drive 0 Tracks" ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x00, "40" ) + PORT_DIPSETTING( 0x04, "80" ) + PORT_DIPNAME( 0x08, 0x08, "Drive 1 Tracks" ) PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x00, "40" ) + PORT_DIPSETTING( 0x08, "80" ) + + PORT_START("SW2") + PORT_DIPNAME( 0x0f, 0x01, "Drive Type" ) PORT_DIPLOCATION("SW2:1,2,3,4") + PORT_DIPSETTING( 0x01, "TEAC FD55F" ) + + PORT_START("SW3") + PORT_DIPNAME( 0x7f, 0x2c, "Card Address" ) PORT_DIPLOCATION("SW3:1,2,3,4,5,6,7") + PORT_DIPSETTING( 0x2c, "44" ) + + PORT_START("S1") // also S3,S5 + PORT_DIPNAME( 0x01, 0x01, "Interface Type" ) + PORT_DIPSETTING( 0x00, "ABC 1600" ) + PORT_DIPSETTING( 0x01, "ABC 80/800/802/806" ) + + PORT_START("S6") + PORT_DIPNAME( 0x01, 0x01, "RAM Size" ) + PORT_DIPSETTING( 0x00, "2 KB" ) + PORT_DIPSETTING( 0x01, "8 KB" ) + + PORT_START("S8") + PORT_DIPNAME( 0x01, 0x01, "Drive Type" ) + PORT_DIPSETTING( 0x00, "8\"" ) + PORT_DIPSETTING( 0x01, "5.25\"" ) + + PORT_START("S9") + PORT_DIPNAME( 0x01, 0x01, "RDY Pin" ) + PORT_DIPSETTING( 0x00, "P2-6 (8\")" ) + PORT_DIPSETTING( 0x01, "P2-34 (5.25\")" ) +INPUT_PORTS_END + + +//------------------------------------------------- +// INPUT_PORTS( abc838 ) +//------------------------------------------------- + +INPUT_PORTS_START( abc838 ) + PORT_START("SW1") + PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:1,2,3,4") + PORT_DIPSETTING( 0x00, DEF_STR( Unused ) ) + + PORT_START("SW2") + PORT_DIPNAME( 0x0f, 0x0e, "Drive Type" ) PORT_DIPLOCATION("SW2:1,2,3,4") + PORT_DIPSETTING( 0x0e, "BASF 6105" ) + PORT_DIPSETTING( 0x0f, "BASF 6106" ) + + PORT_START("SW3") + PORT_DIPNAME( 0x7f, 0x2e, "Card Address" ) PORT_DIPLOCATION("SW3:1,2,3,4,5,6,7") + PORT_DIPSETTING( 0x2e, "46" ) + + PORT_START("S1") // also S3,S5 + PORT_DIPNAME( 0x01, 0x01, "Interface Type" ) + PORT_DIPSETTING( 0x00, "ABC 1600" ) + PORT_DIPSETTING( 0x01, "ABC 80/800/802/806" ) + + PORT_START("S6") + PORT_DIPNAME( 0x01, 0x01, "RAM Size" ) + PORT_DIPSETTING( 0x00, "2 KB" ) + PORT_DIPSETTING( 0x01, "8 KB" ) + + PORT_START("S8") + PORT_DIPNAME( 0x01, 0x00, "Drive Type" ) + PORT_DIPSETTING( 0x00, "8\"" ) + PORT_DIPSETTING( 0x01, "5.25\"" ) + + PORT_START("S9") + PORT_DIPNAME( 0x01, 0x00, "RDY Pin" ) + PORT_DIPSETTING( 0x00, "P2-6 (8\")" ) + PORT_DIPSETTING( 0x01, "P2-34 (5.25\")" ) +INPUT_PORTS_END + + +//------------------------------------------------- +// INPUT_PORTS( abc850 ) +//------------------------------------------------- + +INPUT_PORTS_START( abc850 ) + PORT_START("SW1") + PORT_DIPNAME( 0x01, 0x01, "Drive 0 Sides" ) PORT_DIPLOCATION("SW1:1") + PORT_DIPSETTING( 0x00, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x01, "Double" ) + PORT_DIPNAME( 0x02, 0x02, "Drive 1 Sides" ) PORT_DIPLOCATION("SW1:2") + PORT_DIPSETTING( 0x00, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x02, "Double" ) + PORT_DIPNAME( 0x04, 0x04, "Drive 0 Tracks" ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x00, "40" ) + PORT_DIPSETTING( 0x04, "80" ) + PORT_DIPNAME( 0x08, 0x08, "Drive 1 Tracks" ) PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x00, "40" ) + PORT_DIPSETTING( 0x08, "80" ) + + PORT_START("SW2") + PORT_DIPNAME( 0x0f, 0x02, "Drive Type" ) PORT_DIPLOCATION("SW2:1,2,3,4") + PORT_DIPSETTING( 0x01, "TEAC FD55F" ) + PORT_DIPSETTING( 0x02, "BASF 6138" ) + + PORT_START("SW3") + PORT_DIPNAME( 0x7f, 0x2c, "Card Address" ) PORT_DIPLOCATION("SW3:1,2,3,4,5,6,7") + PORT_DIPSETTING( 0x2c, "44" ) + + PORT_START("S1") // also S3,S5 + PORT_DIPNAME( 0x01, 0x01, "Interface Type" ) + PORT_DIPSETTING( 0x00, "ABC 1600" ) + PORT_DIPSETTING( 0x01, "ABC 80/800/802/806" ) + + PORT_START("S6") + PORT_DIPNAME( 0x01, 0x01, "RAM Size" ) + PORT_DIPSETTING( 0x00, "2 KB" ) + PORT_DIPSETTING( 0x01, "8 KB" ) + + PORT_START("S8") + PORT_DIPNAME( 0x01, 0x01, "Drive Type" ) + PORT_DIPSETTING( 0x00, "8\"" ) + PORT_DIPSETTING( 0x01, "5.25\"" ) + + PORT_START("S9") + PORT_DIPNAME( 0x01, 0x01, "RDY Pin" ) + PORT_DIPSETTING( 0x00, "P2-6 (8\")" ) + PORT_DIPSETTING( 0x01, "P2-34 (5.25\")" ) +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor luxor_55_21046_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( luxor_55_21046 ); +} + +ioport_constructor abc830_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( abc830 ); +} + +ioport_constructor abc832_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( abc832 ); +} + +ioport_constructor abc834_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( abc834 ); +} + +ioport_constructor abc838_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( abc838 ); +} + +ioport_constructor abc850_floppy_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( abc850 ); +} + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// luxor_55_21046_device - constructor +//------------------------------------------------- + +luxor_55_21046_device::luxor_55_21046_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, LUXOR_55_21046, "Luxor 55 21046", tag, owner, clock, "lux21046", __FILE__), + device_abcbus_card_interface(mconfig, *this), + m_maincpu(*this, Z80_TAG), + m_dma(*this, Z80DMA_TAG), + m_fdc(*this, SAB1793_TAG), + m_floppy0(*this, SAB1793_TAG":0"), + m_floppy1(*this, SAB1793_TAG":1"), + m_floppy(NULL), + m_sw1(*this, "SW1"), + m_sw2(*this, "SW2"), + m_sw3(*this, "SW3"), + m_cs(false), + m_fdc_irq(0), + m_dma_irq(0), + m_busy(0), + m_force_busy(0) +{ +} + +luxor_55_21046_device::luxor_55_21046_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) + : device_t(mconfig, type, name, tag, owner, clock, shortname, source), + device_abcbus_card_interface(mconfig, *this), + m_maincpu(*this, Z80_TAG), + m_dma(*this, Z80DMA_TAG), + m_fdc(*this, SAB1793_TAG), + m_floppy0(*this, SAB1793_TAG":0"), + m_floppy1(*this, SAB1793_TAG":1"), + m_floppy(NULL), + m_sw1(*this, "SW1"), + m_sw2(*this, "SW2"), + m_sw3(*this, "SW3"), + m_cs(false), + m_fdc_irq(0), + m_dma_irq(0), + m_busy(0), + m_force_busy(0) +{ +} + +abc830_device::abc830_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : luxor_55_21046_device(mconfig, ABC830, "ABC 830", tag, owner, clock, "abc830", __FILE__) +{ +} + +abc832_device::abc832_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : luxor_55_21046_device(mconfig, ABC832, "ABC 832", tag, owner, clock, "abc832", __FILE__) +{ +} + +abc834_device::abc834_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : luxor_55_21046_device(mconfig, ABC834, "ABC 834", tag, owner, clock, "abc834", __FILE__) +{ +} + +abc838_device::abc838_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : luxor_55_21046_device(mconfig, ABC838, "ABC 838", tag, owner, clock, "abc838", __FILE__) +{ +} + +abc850_floppy_device::abc850_floppy_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : luxor_55_21046_device(mconfig, ABC850_FLOPPY, "ABC 850 floppy", tag, owner, clock, "lux21046", __FILE__) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void luxor_55_21046_device::device_start() +{ + // state saving + save_item(NAME(m_cs)); + save_item(NAME(m_status)); + save_item(NAME(m_out)); + save_item(NAME(m_inp)); + save_item(NAME(m_fdc_irq)); + save_item(NAME(m_dma_irq)); + save_item(NAME(m_busy)); + save_item(NAME(m_force_busy)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void luxor_55_21046_device::device_reset() +{ + m_cs = false; + m_out = 0; + + m_maincpu->reset(); + + address_space &space = m_maincpu->space(AS_PROGRAM); + _4b_w(space, 0, 0); + _9b_w(space, 0, 0); + _8a_w(space, 0, 0); +} + + + +//************************************************************************** +// ABC BUS INTERFACE +//************************************************************************** + +//------------------------------------------------- +// abcbus_cs - +//------------------------------------------------- + +void luxor_55_21046_device::abcbus_cs(UINT8 data) +{ + m_cs = (data == m_sw3->read()); +} + + +//------------------------------------------------- +// abcbus_csb - +//------------------------------------------------- + +int luxor_55_21046_device::abcbus_csb() +{ + return m_cs ? 0 : 1; +} + + +//------------------------------------------------- +// abcbus_stat - +//------------------------------------------------- + +UINT8 luxor_55_21046_device::abcbus_stat() +{ + /* + + bit description + + 0 3A pin 8 + 1 4B Q1 + 2 4B Q2 + 3 4B Q3 + 4 1 + 5 PAL16R4 pin 17 + 6 S1/A: PREN*, S1/B: 4B Q6 + 7 S5/A: PAL16R4 pin 16 inverted, S5/B: 4B Q7 + + */ + + UINT8 data = 0; + + if (m_cs) + { + data = 0x30 | (m_status & 0xce) | m_busy; + } + + // LS240 inverts the data + return data ^ 0xff; +} + + +//------------------------------------------------- +// abcbus_inp - +//------------------------------------------------- + +UINT8 luxor_55_21046_device::abcbus_inp() +{ + UINT8 data = 0xff; + + if (m_cs) + { + data = m_inp; + m_busy = 1; + } + + return data; +} + + +//------------------------------------------------- +// abcbus_out - +//------------------------------------------------- + +void luxor_55_21046_device::abcbus_out(UINT8 data) +{ + if (m_cs) + { + m_out = data; + m_busy = 1; + } +} + + +//------------------------------------------------- +// abcbus_c1 - +//------------------------------------------------- + +void luxor_55_21046_device::abcbus_c1(UINT8 data) +{ + if (m_cs) + { + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + } +} + + +//------------------------------------------------- +// abcbus_c3 - +//------------------------------------------------- + +void luxor_55_21046_device::abcbus_c3(UINT8 data) +{ + if (m_cs) + { + device_reset(); + } +} + + +//------------------------------------------------- +// abcbus_c4 - +//------------------------------------------------- + +void luxor_55_21046_device::abcbus_c4(UINT8 data) +{ + // TODO connected to PAL16R4 pin 2 +} + + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +//------------------------------------------------- +// 3d_r - +//------------------------------------------------- + +READ8_MEMBER( luxor_55_21046_device::out_r ) +{ + if (m_busy) + { + m_busy = 0; + } + + return m_out; +} + + +//------------------------------------------------- +// 4d_w - +//------------------------------------------------- + +WRITE8_MEMBER( luxor_55_21046_device::inp_w ) +{ + if (m_busy) + { + m_busy = 0; + } + + m_inp = data; +} + + +//------------------------------------------------- +// 4b_w - +//------------------------------------------------- + +WRITE8_MEMBER( luxor_55_21046_device::_4b_w ) +{ + /* + + bit description + + 0 force busy + 1 + 2 + 3 + 4 N/C + 5 N/C + 6 + 7 + + */ + + m_status = data & 0xce; + + // busy + if (!BIT(data, 0)) + { + m_busy = 1; + } +} + + +//------------------------------------------------- +// 9b_w - +//------------------------------------------------- + +WRITE8_MEMBER( luxor_55_21046_device::_9b_w ) +{ + /* + + bit signal description + + 0 DS0 drive select 0 + 1 DS1 drive select 1 + 2 DS2 drive select 2 + 3 MTRON motor on + 4 TG43 track > 43 + 5 SIDE1 side 1 select + 6 + 7 + + */ + + // drive select + m_floppy = NULL; + + if (BIT(data, 0)) m_floppy = m_floppy0->get_device(); + if (BIT(data, 1)) m_floppy = m_floppy1->get_device(); + + m_fdc->set_floppy(m_floppy); + + if (m_floppy) + { + // motor enable + m_floppy->mon_w(!BIT(data, 3)); + + // side select + m_floppy->ss_w(BIT(data, 5)); + } +} + + +//------------------------------------------------- +// 8a_w - +//------------------------------------------------- + +WRITE8_MEMBER( luxor_55_21046_device::_8a_w ) +{ + /* + + bit signal description + + 0 FD1793 _MR FDC master reset + 1 FD1793 _DDEN, FDC9229 DENS density select + 2 FDC9229 MINI + 3 FDC9229 P1 + 4 FDC9229 P2 + 5 READY signal polarity (0=inverted) + 6 + 7 + + FDC9229 P0 is grounded + + */ + + // FDC master reset + if (!BIT(data, 0)) m_fdc->soft_reset(); + + // density select + m_fdc->dden_w(BIT(data, 1)); + + if (BIT(data, 2)) + { + m_fdc->set_unscaled_clock(XTAL_16MHz/16); + } + else + { + m_fdc->set_unscaled_clock(XTAL_16MHz/8); + } +} + + +//------------------------------------------------- +// 9a_r - +//------------------------------------------------- + +READ8_MEMBER( luxor_55_21046_device::_9a_r ) +{ + /* + + bit description + + 0 busy + 1 _FD2S + 2 SW2 + 3 S1/A: PAL16R4 pin 15, S1/B: GND + 4 SW1-1 or DCG + 5 SW1-2 + 6 SW1-3 + 7 SW1-4 + + */ + + UINT8 data = 0; + + // busy + data |= m_busy; + + // floppy + data |= (m_floppy ? m_floppy->twosid_r() : 1) << 1; + //data |= (m_floppy ? m_floppy->dskchg_r() : 1) << 4; + + // SW2 + UINT8 sw2 = m_sw2->read() & 0x0f; + + int sw2_1 = BIT(sw2, 0) ? 1 : BIT(offset, 8); + int sw2_2 = BIT(sw2, 1) ? 1 : BIT(offset, 9); + int sw2_3 = BIT(sw2, 2) ? 1 : BIT(offset, 10); + int sw2_4 = BIT(sw2, 3) ? 1 : BIT(offset, 11); + int sw2_data = !(sw2_1 && sw2_2 && !(sw2_3 ^ sw2_4)); + + data |= sw2_data << 2; + + // SW1 + data |= (m_sw1->read() & 0x0f) << 4; + + return data ^ 0xff; +} |