summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/bus/cbmiec/fd2000.cpp
blob: a4f47b0d83e55d5933113c951a7e50dde78c4bad (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                               

                                                                       
                                            
 

                                                                       

  
         
 



                                                                                      


  
                







                                                                            





                                   






                                                                            

                                                                         






                                                   
                                               












                                                                                                                                                     
                                             




                                                                                                                                                     






                                                   
                                                              
 
                                  

 



                                                              




                                                   







                                                                                                                     


                                                   
                             

                                                   







                                                                                                                     

 


                                       
 
                               
 







             
 
          






                                        
 
                               
 







                            
 
          




                                       
 
                               
 







                             
 
          
 
                         









                                        
 
                               
 







                       
 
          

 



                                                                 
 



                                                                

                                                      

                     

                  
 
 
                                                   
                                                 

                                                   
                                                       

                                                                    
 
                                                                    



                                                                            
 
                                    
 
                                                                                                                                                          


                  
                                                       

                                                                 
 
                                                                    



                                                                            
 
                                       
 
                                                                                                                                                            


                  







                                                                            
                                                                                                             
                                                           


 
                                                                                                                               

                                                    


                                           




                                                   


                                                   
                                                                                                             
                                                           
 


                                                    
 


                                                   






















































                                                   
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************

    CMD FD-2000/FD-4000 disk drive emulation

**********************************************************************/

/*

    TODO:

    - IEC
    - VIA
    - DP8473/PC8477A command extensions to upd765
    - D1M/D2M/D4M image format (http://ist.uwaterloo.ca/~schepers/formats/D2M-DNP.TXT)

*/

#include "emu.h"
#include "fd2000.h"



//**************************************************************************
//  MACROS / CONSTANTS
//**************************************************************************

#define G65SC02PI2_TAG  "m6502"
#define R65C02P4_TAG    "m6502"
#define G65SC22P2_TAG   "m6522"
#define DP8473V_TAG     "dp8473"
#define PC8477AV1_TAG   "pc8477av1"
#define DS1216E_TAG     "ds1216e"



//**************************************************************************
//  DEVICE DEFINITIONS
//**************************************************************************

DEFINE_DEVICE_TYPE(FD2000, fd2000_device, "fd2000", "FD-2000 Disk Drive")
DEFINE_DEVICE_TYPE(FD4000, fd4000_device, "fd4000", "FD-4000 Disk Drive")


//-------------------------------------------------
//  ROM( fd2000 )
//-------------------------------------------------

ROM_START( fd2000 )
	ROM_REGION( 0x8000, G65SC02PI2_TAG, 0 )
	ROM_DEFAULT_BIOS( "v140" )
	ROM_SYSTEM_BIOS( 0, "v134", "Version 1.34" )
	ROMX_LOAD( "cmd fd-2000 dos v1.34 fd-350026.bin", 0x0000, 0x8000, CRC(859a5edc) SHA1(487fa82a7977e5208d5088f3580f34e8c89560d1), ROM_BIOS(1) )
	ROM_SYSTEM_BIOS( 1, "v140", "Version 1.40" )
	ROMX_LOAD( "cmd fd-2000 dos v1.40 cs 33cc6f.bin", 0x0000, 0x8000, CRC(4e6ca15c) SHA1(0c61ba58269baf2b8aadf3bbc4648c7a5a6d2128), ROM_BIOS(2) )
ROM_END


//-------------------------------------------------
//  ROM( fd4000 )
//-------------------------------------------------

ROM_START( fd4000 )
	ROM_REGION( 0x8000, R65C02P4_TAG, 0 )
	ROM_DEFAULT_BIOS( "v140" )
	ROM_SYSTEM_BIOS( 0, "v134", "Version 1.34" )
	ROMX_LOAD( "cmd fd-4000 dos v1.34 fd-350022.bin", 0x0000, 0x8000, CRC(1f4820c1) SHA1(7a2966662e7840fd9377549727ccba62e4349c6f), ROM_BIOS(1) )
	ROM_SYSTEM_BIOS( 1, "v140", "Version 1.40" )
	ROMX_LOAD( "cmd fd-4000 dos v1.40 fd-350022.bin", 0x0000, 0x8000, CRC(b563ef10) SHA1(d936d76fd8b50ce4c65f885703653d7c1bd7d3c9), ROM_BIOS(2) )
ROM_END


//-------------------------------------------------
//  rom_region - device-specific ROM region
//-------------------------------------------------

const tiny_rom_entry *fd2000_device::device_rom_region() const
{
	return ROM_NAME( fd2000 );
}

const tiny_rom_entry *fd4000_device::device_rom_region() const
{
	return ROM_NAME( fd4000 );
}

//-------------------------------------------------
//  ADDRESS_MAP( fd2000_mem )
//-------------------------------------------------

void fd2000_device::fd2000_mem(address_map &map)
{
	map(0x0000, 0x3fff).ram();
	map(0x4000, 0x400f).mirror(0xbf0).rw(G65SC22P2_TAG, FUNC(via6522_device::read), FUNC(via6522_device::write));
	map(0x4e00, 0x4e07).mirror(0x1f8).m(DP8473V_TAG, FUNC(dp8473_device::map));
	map(0x5000, 0x7fff).ram();
	map(0x8000, 0xffff).rom().region(G65SC02PI2_TAG, 0);
}


//-------------------------------------------------
//  ADDRESS_MAP( fd4000_mem )
//-------------------------------------------------

void fd4000_device::fd4000_mem(address_map &map)
{
	map(0x0000, 0x3fff).ram();
	map(0x4000, 0x400f).mirror(0xbf0).rw(G65SC22P2_TAG, FUNC(via6522_device::read), FUNC(via6522_device::write));
	map(0x4e00, 0x4e07).mirror(0x1f8).m(PC8477AV1_TAG, FUNC(pc8477a_device::map));
	map(0x5000, 0x7fff).ram();
	map(0x8000, 0xffff).rom().region(R65C02P4_TAG, 0);
}


READ8_MEMBER( fd2000_device::via_pa_r )
{
	/*

	    bit     description

	    0
	    1
	    2
	    3
	    4
	    5
	    6
	    7

	*/

	return 0;
}

WRITE8_MEMBER( fd2000_device::via_pa_w )
{
	/*

	    bit     description

	    0
	    1
	    2
	    3
	    4
	    5       FAST DIR
	    6
	    7

	*/
}

READ8_MEMBER( fd2000_device::via_pb_r )
{
	/*

	    bit     description

	    0
	    1
	    2
	    3
	    4
	    5
	    6
	    7       FDC INTRQ

	*/

	uint8_t data = 0;

	// FDC interrupt
	data |= m_fdc->get_irq() << 7;

	return data;
}

WRITE8_MEMBER( fd2000_device::via_pb_w )
{
	/*

	    bit     description

	    0
	    1
	    2
	    3
	    4
	    5       LED
	    6       LED
	    7

	*/
}

static void fd2000_floppies(device_slot_interface &device)
{
	device.option_add("35hd", FLOPPY_35_HD); // TEAC FD-235HF
}

static void fd4000_floppies(device_slot_interface &device)
{
	device.option_add("35ed", FLOPPY_35_ED); // TEAC FD-235J
}
/*
FLOPPY_FORMATS_MEMBER( fd2000_device::floppy_formats )
    FLOPPY_D81_FORMAT
    FLOPPY_D2M_FORMAT
FLOPPY_FORMATS_END
*/


//-------------------------------------------------
//  device_add_mconfig - add device configuration
//-------------------------------------------------

MACHINE_CONFIG_START(fd2000_device::device_add_mconfig)
	MCFG_DEVICE_ADD(G65SC02PI2_TAG, M65C02, XTAL(24'000'000)/12)
	MCFG_DEVICE_PROGRAM_MAP(fd2000_mem)

	MCFG_DEVICE_ADD(G65SC22P2_TAG, VIA6522, XTAL(24'000'000)/12)
	MCFG_VIA6522_READPA_HANDLER(READ8(*this, fd2000_device, via_pa_r))
	MCFG_VIA6522_READPB_HANDLER(READ8(*this, fd2000_device, via_pb_r))
	MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, fd2000_device, via_pa_w))
	MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, fd2000_device, via_pb_w))

	MCFG_DP8473_ADD(DP8473V_TAG)

	MCFG_FLOPPY_DRIVE_ADD_FIXED(DP8473V_TAG":0", fd2000_floppies, "35hd", floppy_image_device::default_floppy_formats)//fd2000_device::floppy_formats)
MACHINE_CONFIG_END


MACHINE_CONFIG_START(fd4000_device::device_add_mconfig)
	MCFG_DEVICE_ADD(R65C02P4_TAG, M65C02, XTAL(24'000'000)/6)
	MCFG_DEVICE_PROGRAM_MAP(fd4000_mem)

	MCFG_DEVICE_ADD(G65SC22P2_TAG, VIA6522, XTAL(24'000'000)/12)
	MCFG_VIA6522_READPA_HANDLER(READ8(*this, fd2000_device, via_pa_r))
	MCFG_VIA6522_READPB_HANDLER(READ8(*this, fd2000_device, via_pb_r))
	MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, fd2000_device, via_pa_w))
	MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, fd2000_device, via_pb_w))

	MCFG_PC8477A_ADD(PC8477AV1_TAG)

	MCFG_FLOPPY_DRIVE_ADD_FIXED(PC8477AV1_TAG":0", fd4000_floppies, "35ed", floppy_image_device::default_floppy_formats)//fd2000_device::floppy_formats)
MACHINE_CONFIG_END


//**************************************************************************
//  LIVE DEVICE
//**************************************************************************

//-------------------------------------------------
//  fd2000_device - constructor
//-------------------------------------------------

fd2000_device::fd2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
	: fd2000_device(mconfig, FD2000, tag, owner, clock)
{
}

fd2000_device::fd2000_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
	: device_t(mconfig, type, tag, owner, clock)
	, device_cbm_iec_interface(mconfig, *this)
	, m_maincpu(*this, G65SC02PI2_TAG)
	, m_fdc(*this, DP8473V_TAG)
	, m_floppy0(*this, DP8473V_TAG":0")
{
}


//-------------------------------------------------
//  fd4000_device - constructor
//-------------------------------------------------

fd4000_device::fd4000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
	: fd2000_device(mconfig, FD4000, tag, owner, clock)
{
	m_maincpu.set_tag(*this, R65C02P4_TAG);
	m_fdc.set_tag(*this, PC8477AV1_TAG);
	m_floppy0.set_tag(*this, PC8477AV1_TAG":0");
}


//-------------------------------------------------
//  device_start - device-specific startup
//-------------------------------------------------

void fd2000_device::device_start()
{
}


//-------------------------------------------------
//  device_reset - device-specific reset
//-------------------------------------------------

void fd2000_device::device_reset()
{
}


//-------------------------------------------------
//  cbm_iec_srq -
//-------------------------------------------------

void fd2000_device::cbm_iec_srq(int state)
{
}


//-------------------------------------------------
//  cbm_iec_atn -
//-------------------------------------------------

void fd2000_device::cbm_iec_atn(int state)
{
}


//-------------------------------------------------
//  cbm_iec_data -
//-------------------------------------------------

void fd2000_device::cbm_iec_data(int state)
{
}


//-------------------------------------------------
//  cbm_iec_reset -
//-------------------------------------------------

void fd2000_device::cbm_iec_reset(int state)
{
	if (!state)
	{
		device_reset();
	}
}