public GetPinStates ( byte &BitMode ) : FT_STATUS | ||
BitMode | byte | A bitmap value containing the instantaneous state of the device IO pins |
return | FT_STATUS |
/// <summary> /// /// </summary> /// <param name="iSoundChipType"></param> /// <param name="clock"></param> /// <returns></returns> public static VsifClient TryToConnectVSIF(VsifSoundModuleType soundModule, PortId comPort, bool shareOnly) { lock (lockObject) { foreach (var c in vsifClients) { if (c.SoundModuleType == soundModule) { if (c.DataWriter.PortName.Equals("COM" + (int)(comPort + 1))) { c.ReferencedCount++; return(c); } if (c.DataWriter.PortName.Equals("FTDI_COM" + (int)comPort)) { c.ReferencedCount++; return(c); } } } if (shareOnly) { return(null); } try { switch (soundModule) { case VsifSoundModuleType.Generic_UART: { SerialPort sp = null; sp = new SerialPort("COM" + ((int)comPort + 1)); sp.WriteTimeout = 100; sp.ReadTimeout = 100; sp.BaudRate = 115200; sp.BaudRate = 1200 * (int)Settings.Default.BitBangWaitAY8910; sp.StopBits = StopBits.One; sp.DataBits = 8; sp.Handshake = Handshake.None; sp.Open(); var client = new VsifClient(soundModule, new PortWriterGenericUart(sp)); client.Disposed += Client_Disposed; vsifClients.Add(client); return(client); } case VsifSoundModuleType.SMS: { SerialPort sp = null; sp = new SerialPort("COM" + ((int)comPort + 1)); sp.WriteTimeout = 100; sp.ReadTimeout = 100; sp.BaudRate = 115200; sp.StopBits = StopBits.Two; //sp.BaudRate = 57600; //sp.StopBits = StopBits.One; sp.Parity = Parity.None; sp.DataBits = 8; sp.Handshake = Handshake.None; sp.Open(); var client = new VsifClient(soundModule, new PortWriterGenesis(sp)); client.Disposed += Client_Disposed; vsifClients.Add(client); return(client); } case VsifSoundModuleType.Genesis: { SerialPort sp = null; sp = new SerialPort("COM" + ((int)comPort + 1)); sp.WriteTimeout = 500; sp.ReadTimeout = 500; //sp.BaudRate = 230400; sp.BaudRate = 163840; sp.StopBits = StopBits.One; sp.Parity = Parity.None; sp.DataBits = 8; sp.Open(); var client = new VsifClient(soundModule, new PortWriterGenesis(sp)); client.Disposed += Client_Disposed; vsifClients.Add(client); return(client); } case VsifSoundModuleType.Genesis_Low: { SerialPort sp = null; sp = new SerialPort("COM" + ((int)comPort + 1)); sp.WriteTimeout = 500; sp.ReadTimeout = 500; sp.BaudRate = 115200; sp.StopBits = StopBits.One; sp.Parity = Parity.None; sp.DataBits = 8; sp.Open(); var client = new VsifClient(soundModule, new PortWriterGenesis(sp)); client.Disposed += Client_Disposed; vsifClients.Add(client); return(client); } case VsifSoundModuleType.Genesis_FTDI: { var ftdi = new FTD2XX_NET.FTDI(); var stat = ftdi.OpenByIndex((uint)comPort); if (stat == FTDI.FT_STATUS.FT_OK) { ftdi.SetBitMode(0x00, FTDI.FT_BIT_MODES.FT_BIT_MODE_RESET); ftdi.SetBitMode(0xff, FTDI.FT_BIT_MODES.FT_BIT_MODE_ASYNC_BITBANG); ftdi.SetBaudRate(FTDI_BAUDRATE_GEN * FTDI_BAUDRATE_GEN_MUL); ftdi.SetTimeouts(500, 500); ftdi.SetLatency(0); byte ps = 0; ftdi.GetPinStates(ref ps); if ((ps & 0x40) == 0) { uint dummy = 0; ftdi.Write(new byte[] { 0x40 }, 1, ref dummy); } var client = new VsifClient(soundModule, new PortWriterGenesis(ftdi, comPort)); //ftdi.Write(new byte[] { (byte)(((0x07 << 1) & 0xe) | 0) }, 1, ref dummy); //ftdi.Write(new byte[] { (byte)(((0x38 >> 2) & 0xe) | 1) }, 1, ref dummy); //ftdi.Write(new byte[] { (byte)(((0xC0 >> 5) & 0xe) | 0) }, 1, ref dummy); //ftdi.Write(new byte[] { 1 }, 1, ref dummy); client.Disposed += Client_Disposed; vsifClients.Add(client); return(client); } } break; case VsifSoundModuleType.MSX_FTDI: { var ftdi = new FTD2XX_NET.FTDI(); var stat = ftdi.OpenByIndex((uint)comPort); if (stat == FTDI.FT_STATUS.FT_OK) { ftdi.SetBitMode(0x00, FTDI.FT_BIT_MODES.FT_BIT_MODE_RESET); ftdi.SetBitMode(0xff, FTDI.FT_BIT_MODES.FT_BIT_MODE_ASYNC_BITBANG); ftdi.SetBaudRate(FTDI_BAUDRATE_MSX * FTDI_BAUDRATE_MSX_MUL); ftdi.SetTimeouts(500, 500); ftdi.SetLatency(0); //{ // uint dummy = 0x00; // ftdi.Write(new byte[] { (byte)dummy }, 1, ref dummy); //} var client = new VsifClient(soundModule, new PortWriterMsx(ftdi, comPort)); client.Disposed += Client_Disposed; vsifClients.Add(client); return(client); } } break; case VsifSoundModuleType.NES_FTDI_INDIRECT: case VsifSoundModuleType.NES_FTDI_DIRECT: { var ftdi = new FTD2XX_NET.FTDI(); var stat = ftdi.OpenByIndex((uint)comPort); if (stat == FTDI.FT_STATUS.FT_OK) { ftdi.SetBitMode(0x00, FTDI.FT_BIT_MODES.FT_BIT_MODE_RESET); ftdi.SetBitMode(0xff, FTDI.FT_BIT_MODES.FT_BIT_MODE_ASYNC_BITBANG); ftdi.SetBaudRate(FTDI_BAUDRATE_NES * FTDI_BAUDRATE_NES_MUL); ftdi.SetTimeouts(500, 500); ftdi.SetLatency(0); byte ps = 0; ftdi.GetPinStates(ref ps); if ((ps & 0x10) == 0x10) { uint dummy = 0; ftdi.Write(new byte[] { 0x00 }, 1, ref dummy); } VsifClient client = null; switch (soundModule) { case VsifSoundModuleType.NES_FTDI_DIRECT: client = new VsifClient(soundModule, new PortWriterNesDirect(ftdi, comPort)); break; case VsifSoundModuleType.NES_FTDI_INDIRECT: client = new VsifClient(soundModule, new PortWriterNesIndirect(ftdi, comPort)); break; } client.Disposed += Client_Disposed; vsifClients.Add(client); return(client); } } break; } //sp.Write(new byte[] { (byte)'M', (byte)'a', (byte)'M', (byte)'i' }, 0, 4); //sp.BaseStream.WriteByte((byte)soundModule); //Thread.Sleep(100); //var ret = sp.BaseStream.ReadByte(); //if (ret == 0x0F) //OK } catch (Exception ex) { if (ex.GetType() == typeof(Exception)) { throw; } else if (ex.GetType() == typeof(SystemException)) { throw; } } return(null); } }