- --
Viewing Issue Advanced Details
ID | Category [?] | Severity [?] | Reproducibility | Date Submitted | Last Update |
---|---|---|---|---|---|
05660 | Misc. | Feature | Always | Aug 8, 2014, 04:46 | Oct 19, 2014, 00:59 |
Tester | Richard42 | View Status | Public | Platform | MESS (Self-compiled) |
Assigned To | R. Belmont | Resolution | Fixed | OS | Linux |
Status [?] | Resolved | Driver | |||
Version | 0.154 | Fixed in Version | 0.156 | Build | 64-bit |
Fixed in Git Commit | Github Pull Request # | ||||
Summary | 05660: Coco 1, 2, 3: Implement virtual "Becker Port" for DriveWire support | ||||
Description |
There is a very widely used piece of software in the Coco community called DriveWire. Here is the main page: https://sites.google.com/site/drivewire4/ The user runs a DW server on a modern computer, which can then serve up floppy/hard disk images or MIDI devices to the Coco. A real Coco may be connected to the DW server via serial cable (or I think wireless hardware). An emulated Coco may also connect to a DW server on a network machine by use of a special hardware port which was first created by Gary Becker for his Coco3FPGA hardware system. There are 2 major Coco emulators (Vcc and XRoar) which support this Becker port emulation, and I have also written a MESS patch to add this capability to MESS. |
||||
Steps To Reproduce | I have attached a diff file which applies to r31554 of the MAME SVN source tree. | ||||
Additional Information |
This patch adds a new MESS target called 'coco3dw1', which is a Coco3 machine but with an HDB-DOS ROM image supporting the Becker Port in place of the Disk Extended Color Basic v1.1 ROM. It's basically like having a real Coco machine with the HDB-DOS ROM instead of the DECB ROM in your FD-502 floppy controller. An extra ROM image (which I will attach to this bug report) is required in order to use the new target. This extra target may be removed if desired, since users can always mount a floppy disk containing a loadable version of HDB-DOS which will replace the DECB image in RAM. This patch also adds a couple of controls to the system configuration of the Coco targets: one for enabling/disabling the Becker port, and another for selecting the TCP/IP port number to use for connecting with the DW server. I could not figure out any way to add a free-form text field configuration option, which would be needed to support connections with any DW server on a network machine. So instead I hard-coded the hostname to "localhost" and only allow the user to configure the port number. This patch has been tested and works in both Linux and Windows. |
||||
Github Commit | |||||
Flags | |||||
Regression Version | |||||
Affected Sets / Systems | Coco 1, 2, 3 | ||||
Attached Files
|
mame-r31554-becker.diff (21,294 bytes) Aug 8, 2014, 04:46 Uploaded by Richard42 patch for Becker Port support [Show Content] [Hide Content]Index: makefile =================================================================== --- makefile (revision 31554) +++ makefile (working copy) @@ -24,7 +24,7 @@ #------------------------------------------------- ifndef TARGET -TARGET = mame +TARGET = mess endif ifndef SUBTARGET @@ -775,6 +775,12 @@ LIBS += -lstdc++ -lpthread endif +# windows needs networking +ifeq ($(TARGETOS),win32) +LIBS += -lWs2_32 +endif + + #------------------------------------------------- # 'default' target needs to go here, before the # include files which define additional targets Index: src/emu/bus/coco/coco_fdc.c =================================================================== --- src/emu/bus/coco/coco_fdc.c (revision 31554) +++ src/emu/bus/coco/coco_fdc.c (working copy) @@ -639,6 +639,30 @@ } //************************************************************************** +// COCO-3 HDB-DOS +//************************************************************************** + +ROM_START( coco3_hdb1 ) + ROM_REGION(0x8000,"eprom",ROMREGION_ERASE00) + ROM_LOAD_OPTIONAL( "hdbdw3bc3.rom", 0x0000, 0x2000, CRC(309a9efd) SHA1(671605d61811953860466f771c1594bbade331f4)) + ROM_RELOAD(0x2000, 0x2000) + ROM_RELOAD(0x4000, 0x2000) + ROM_RELOAD(0x6000, 0x2000) +ROM_END + +const device_type COCO3_HDB1 = &device_creator<coco3_hdb1_device>; + +coco3_hdb1_device::coco3_hdb1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : coco_fdc_device(mconfig, COCO3_HDB1, "CoCo3 HDB-DOS", tag, owner, clock, "coco3_hdb1", __FILE__) +{ +} + +const rom_entry *coco3_hdb1_device::device_rom_region() const +{ + return ROM_NAME( coco3_hdb1 ); +} + +//************************************************************************** // CP400 FDC //************************************************************************** Index: src/emu/bus/coco/coco_fdc.h =================================================================== --- src/emu/bus/coco/coco_fdc.h (revision 31554) +++ src/emu/bus/coco/coco_fdc.h (working copy) @@ -95,6 +95,23 @@ // device type definition extern const device_type COCO_FDC_V11; +// ======================> coco3_hdb1_device + +class coco3_hdb1_device : + public coco_fdc_device +{ +public: + // construction/destruction + coco3_hdb1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual const rom_entry *device_rom_region() const; +}; + + +// device type definition +extern const device_type COCO3_HDB1; + // ======================> cp400_fdc_device class cp400_fdc_device : Index: src/emu/bus/coco/coco_multi.c =================================================================== --- src/emu/bus/coco/coco_multi.c (revision 31554) +++ src/emu/bus/coco/coco_multi.c (working copy) @@ -75,7 +75,8 @@ SLOT_INTERFACE("pak", COCO_PAK) SLOT_INTERFACE_END static SLOT_INTERFACE_START(coco_cart_slot4) - SLOT_INTERFACE("fdcv11", COCO_FDC_V11) + SLOT_INTERFACE("cc3hdb1", COCO3_HDB1) + SLOT_INTERFACE("fdcv11", COCO_FDC_V11) SLOT_INTERFACE("rs232", COCO_232) SLOT_INTERFACE("orch90", COCO_ORCH90) SLOT_INTERFACE("banked_16k", COCO_PAK_BANKED) Index: src/mess/drivers/coco12.c =================================================================== --- src/mess/drivers/coco12.c (revision 31554) +++ src/mess/drivers/coco12.c (working copy) @@ -29,6 +29,7 @@ #include "bus/coco/coco_pak.h" #include "bus/coco/coco_fdc.h" #include "bus/coco/coco_multi.h" +#include "machine/coco_dwsock.h" #include "formats/coco_cas.h" //************************************************************************** @@ -127,6 +128,30 @@ //------------------------------------------------- +// INPUT_PORTS( coco_drivewire ) +//------------------------------------------------- + +INPUT_PORTS_START( coco_drivewire ) + PORT_START(BECKERPORT_TAG) + PORT_CONFNAME( 0x01, 0x01, "Becker Port" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off )) + PORT_CONFSETTING( 0x01, DEF_STR( On )) + PORT_START(DRIVEWIRE_PORT_TAG) + PORT_CONFNAME( 0xffff, 65504, "Drivewire Port") PORT_CHANGED_MEMBER(DEVICE_SELF, coco_state, coco_state::drivewire_port_changed, NULL ) + PORT_CONFSETTING( 65500, "65500" ) + PORT_CONFSETTING( 65501, "65501" ) + PORT_CONFSETTING( 65502, "65502" ) + PORT_CONFSETTING( 65503, "65503" ) + PORT_CONFSETTING( 65504, "65504" ) + PORT_CONFSETTING( 65505, "65505" ) + PORT_CONFSETTING( 65506, "65506" ) + PORT_CONFSETTING( 65507, "65507" ) + PORT_CONFSETTING( 65508, "65508" ) + PORT_CONFSETTING( 65509, "65509" ) +INPUT_PORTS_END + + +//------------------------------------------------- // INPUT_PORTS( coco_keyboard ) //------------------------------------------------- // @@ -223,6 +248,7 @@ PORT_INCLUDE( coco_analog_control ) PORT_INCLUDE( coco_cart_autostart ) PORT_INCLUDE( coco_rtc ) + PORT_INCLUDE( coco_drivewire ) INPUT_PORTS_END @@ -238,6 +264,7 @@ SLOT_INTERFACE_START( coco_cart ) SLOT_INTERFACE("fdc", COCO_FDC) SLOT_INTERFACE("fdcv11", COCO_FDC_V11) + SLOT_INTERFACE("cc3hdb1", COCO3_HDB1) SLOT_INTERFACE("cp400_fdc", CP400_FDC) SLOT_INTERFACE("rs232", COCO_232) SLOT_INTERFACE("orch90", COCO_ORCH90) @@ -313,6 +340,8 @@ MCFG_COCO_CARTRIDGE_NMI_CB(INPUTLINE(MAINCPU_TAG, INPUT_LINE_NMI)) MCFG_COCO_CARTRIDGE_HALT_CB(INPUTLINE(MAINCPU_TAG, INPUT_LINE_HALT)) + MCFG_DWSOCK_ADD(DWSOCK_TAG) + // video hardware MCFG_SCREEN_MC6847_NTSC_ADD(SCREEN_TAG, VDG_TAG) Index: src/mess/drivers/coco3.c =================================================================== --- src/mess/drivers/coco3.c (revision 31554) +++ src/mess/drivers/coco3.c (working copy) @@ -222,6 +222,7 @@ PORT_INCLUDE( coco_rat_mouse ) PORT_INCLUDE( coco_lightgun ) PORT_INCLUDE( coco_rtc ) + PORT_INCLUDE( coco_drivewire ) INPUT_PORTS_END static DEVICE_INPUT_DEFAULTS_START( printer ) @@ -276,6 +277,7 @@ MCFG_COCO_VHD_ADD(VHD0_TAG) MCFG_COCO_VHD_ADD(VHD1_TAG) + MCFG_DWSOCK_ADD(DWSOCK_TAG) // video hardware MCFG_DEFAULT_LAYOUT(layout_coco3) @@ -337,8 +339,11 @@ MCFG_CPU_PROGRAM_MAP(coco3_mem) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( coco3dw1, coco3 ) + MCFG_COCO_CARTRIDGE_REMOVE(CARTRIDGE_TAG) + MCFG_COCO_CARTRIDGE_ADD(CARTRIDGE_TAG, coco_cart, "cc3hdb1") +MACHINE_CONFIG_END - //************************************************************************** // ROMS //************************************************************************** @@ -354,9 +359,8 @@ ROM_END #define rom_coco3h rom_coco3 +#define rom_coco3dw1 rom_coco3 - - //************************************************************************** // SYSTEM DRIVERS //************************************************************************** @@ -364,3 +368,4 @@ COMP( 1986, coco3, coco, 0, coco3, coco3, driver_device, 0, "Tandy Radio Shack", "Color Computer 3 (NTSC)", 0) COMP( 1986, coco3p, coco, 0, coco3p, coco3, driver_device, 0, "Tandy Radio Shack", "Color Computer 3 (PAL)", 0) COMP( 19??, coco3h, coco, 0, coco3h, coco3, driver_device, 0, "Tandy Radio Shack", "Color Computer 3 (NTSC; HD6309)", GAME_UNOFFICIAL) +COMP( 19??, coco3dw1, coco, 0, coco3dw1, coco3, driver_device, 0, "Tandy Radio Shack", "Color Computer 3 (NTSC; HDB-DOS)", GAME_UNOFFICIAL) Index: src/mess/includes/coco.h =================================================================== --- src/mess/includes/coco.h (revision 31554) +++ src/mess/includes/coco.h (working copy) @@ -18,6 +18,7 @@ #include "machine/6821pia.h" #include "bus/coco/cococart.h" #include "machine/coco_vhd.h" +#include "machine/coco_dwsock.h" #include "machine/ram.h" #include "sound/dac.h" #include "sound/wave.h" @@ -31,6 +32,7 @@ INPUT_PORTS_EXTERN( coco_analog_control ); INPUT_PORTS_EXTERN( coco_cart_autostart ); INPUT_PORTS_EXTERN( coco_rtc ); +INPUT_PORTS_EXTERN( coco_drivewire ); SLOT_INTERFACE_EXTERN( coco_cart ); @@ -48,6 +50,7 @@ #define DAC_TAG "dac" #define CARTRIDGE_TAG "ext" #define RS232_TAG "rs232" +#define DWSOCK_TAG "dwsock" #define VHD0_TAG "vhd0" #define VHD1_TAG "vhd1" @@ -55,6 +58,8 @@ #define CTRL_SEL_TAG "ctrl_sel" #define HIRES_INTF_TAG "hires_intf" #define CART_AUTOSTART_TAG "cart_autostart" +#define BECKERPORT_TAG "beckerport" +#define DRIVEWIRE_PORT_TAG "drivewire_port" #define JOYSTICK_RX_TAG "joystick_rx" #define JOYSTICK_RY_TAG "joystick_ry" #define JOYSTICK_LX_TAG "joystick_lx" @@ -92,6 +97,7 @@ required_device<cococart_slot_device> m_cococart; required_device<ram_device> m_ram; required_device<cassette_image_device> m_cassette; + required_device<beckerport_device> m_beckerport; optional_device<rs232_port_device> m_rs232; optional_device<coco_vhd_image_device> m_vhd_0; optional_device<coco_vhd_image_device> m_vhd_1; @@ -99,6 +105,7 @@ // driver update handlers DECLARE_INPUT_CHANGED_MEMBER(keyboard_changed); DECLARE_INPUT_CHANGED_MEMBER(joystick_mode_changed); + DECLARE_INPUT_CHANGED_MEMBER(drivewire_port_changed); // IO virtual DECLARE_READ8_MEMBER( ff00_read ); Index: src/mess/machine/coco.c =================================================================== --- src/mess/machine/coco.c (revision 31554) +++ src/mess/machine/coco.c (working copy) @@ -87,6 +87,7 @@ m_cococart(*this, CARTRIDGE_TAG), m_ram(*this, RAM_TAG), m_cassette(*this, "cassette"), + m_beckerport(*this, DWSOCK_TAG), m_rs232(*this, RS232_TAG), m_vhd_0(*this, VHD0_TAG), m_vhd_1(*this, VHD1_TAG) @@ -1017,7 +1018,16 @@ } +//------------------------------------------------- +// drivewire_port_changed +//------------------------------------------------- +INPUT_CHANGED_MEMBER(coco_state::drivewire_port_changed) +{ + m_beckerport->update_port(); +} + + //------------------------------------------------- // poll_hires_joystick //------------------------------------------------- @@ -1159,6 +1169,11 @@ READ8_MEMBER( coco_state::ff40_read ) { + if (offset >= 1 && offset <= 2 && machine().root_device().ioport(BECKERPORT_TAG)->read_safe(0) == 1) + { + return m_beckerport->read(space, offset-1, mem_mask); + } + return m_cococart->read(space, offset, mem_mask); } @@ -1170,6 +1185,11 @@ WRITE8_MEMBER( coco_state::ff40_write ) { + if (offset >= 1 && offset <= 2 && machine().root_device().ioport(BECKERPORT_TAG)->read_safe(0) == 1) + { + return m_beckerport->write(space, offset-1, data, mem_mask); + } + m_cococart->write(space, offset, data, mem_mask); } @@ -1184,8 +1204,6 @@ m_pia_1->cb1_w(state); } - - /*************************************************************************** DISASSEMBLY OVERRIDE (OS9 syscalls) ***************************************************************************/ Index: src/mess/machine/coco_dwsock.c =================================================================== --- src/mess/machine/coco_dwsock.c (revision 0) +++ src/mess/machine/coco_dwsock.c (working copy) @@ -0,0 +1,252 @@ +#ifdef WIN32 + #include <winsock2.h> + #include <ws2tcpip.h> + #define AI_NUMERICSERV 0 + #define AI_ADDRCONFIG 0 + #define MSG_NOSIGNAL 0 + #undef interface +#else + #include <sys/select.h> + #include <netinet/in.h> + #include <netinet/tcp.h> + #include <sys/socket.h> + #include <netdb.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/types.h> + +#include "emu.h" +#include "includes/coco.h" + +#include "coco_dwsock.h" + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +const device_type COCO_DWSOCK = &device_creator<beckerport_device>; + +#ifdef WIN32 + bool beckerport_device::m_wsInit = false; +#endif + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// beckerport_device - constructor / destructor +//------------------------------------------------- + +beckerport_device::beckerport_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, COCO_DWSOCK, "Virtual Becker Port", tag, owner, clock, "coco_dwsock", __FILE__) +{ + m_socket = (unsigned int) INVALID_SOCKET; + m_head = 0; + m_rx_pending = 0; +} + +beckerport_device::~beckerport_device() +{ + if (m_socket != INVALID_SOCKET) + device_stop(); +} + +/*------------------------------------------------- + device_start +-------------------------------------------------*/ + +void beckerport_device::device_start(void) +{ + struct addrinfo host_info; + struct addrinfo *host_info_list; + int status; + char chPort[8]; + +#ifdef WIN32 + /* Initialize Winsock */ + if (!m_wsInit) + { + WSAData wsaData; + int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); + if (iResult != 0) { + fprintf(stderr, "WSAStartup failed: %d\n", iResult); + return; + } + m_wsInit = true; + } +#endif + + /* get port number */ + snprintf(chPort, sizeof(chPort), "%d", m_dwport); + + memset(&host_info, 0, sizeof(host_info)); + host_info.ai_family = AF_UNSPEC; + host_info.ai_socktype = SOCK_STREAM; + host_info.ai_flags = AI_NUMERICSERV | AI_ADDRCONFIG; + + fprintf(stderr, "Connecting to Drivewire server on %s:%d... ", m_hostname, m_dwport); + + status = getaddrinfo(m_hostname, chPort, &host_info, &host_info_list); + if (status != 0) { + fprintf(stderr, "Error: getaddrinfo failed!\n"); + return; + } + + if ((m_socket = socket(host_info_list->ai_family, SOCK_STREAM, host_info_list->ai_protocol)) == INVALID_SOCKET) { + fprintf(stderr, "%s: failed to open socket for Drivewire!\n", __func__); + return; + } + + if (connect(m_socket, host_info_list->ai_addr, host_info_list->ai_addrlen) == SOCKET_ERROR) { + fprintf(stderr, "%s: failed to connect to Drivewire server!\n", __func__); + return; + } + + freeaddrinfo(host_info_list); + + fprintf(stderr, "Connected!\n"); +} + +/*------------------------------------------------- + device_stop +-------------------------------------------------*/ + +void beckerport_device::device_stop(void) +{ + if (m_socket != (unsigned int) INVALID_SOCKET) + { + printf("Closing connection to Drivewire server\n"); +#ifdef WIN32 + closesocket(m_socket); +#else + close(m_socket); +#endif + m_socket = (unsigned int) INVALID_SOCKET; + } + +#ifdef WIN32 + /* Shutdown Winsock */ + if (m_wsInit) + { + WSACleanup(); + m_wsInit = false; + } +#endif + +} + +/*------------------------------------------------- + device_config_complete +-------------------------------------------------*/ + +void beckerport_device::device_config_complete(void) +{ + /* + const beckerport_config *intf = reinterpret_cast<const beckerport_config *>(static_config()); + if(intf != NULL) + { + *static_cast<beckerport_config *>(this) = *intf; + } + else + */ + { + m_hostname = "127.0.0.1"; + m_dwport = 65504; + } +} + +/*------------------------------------------------- + read +-------------------------------------------------*/ + +READ8_MEMBER(beckerport_device::read) +{ + char line[128]; + unsigned char data = 0x5a; + struct timeval timeout; + fd_set read_fds; + + switch (offset) { + case DWS_STATUS: + if (!m_rx_pending) { + /* Try to read from dws */ + FD_ZERO(&read_fds); + FD_SET(m_socket, &read_fds); + timeout.tv_sec = timeout.tv_usec = 0; + + if (select(m_socket + 1, &read_fds, NULL, NULL, &timeout) < 0) { + sprintf(line, "select() failed in %s : %s : %d ", __func__, __FILE__, __LINE__); + perror(line); + } else if (FD_ISSET(m_socket, &read_fds)) { + m_head = 0; + m_rx_pending = ::recv(m_socket, m_buf, sizeof(m_buf), 0); + if (m_rx_pending == -1) { + m_rx_pending = 0; + sprintf(line, "recv() failed in %s : %s : %d ", __func__, __FILE__, __LINE__); + perror(line); + } + } + } + //printf("beckerport_device: status read. %i bytes remaining.\n", m_rx_pending); + data = (m_rx_pending > 0) ? 2 : 0; + break; + case DWS_DATA: + if (!m_rx_pending) { + fprintf(stderr, "coco_dwsock.c: beckerport_device::read() buffer underrun\n"); + break; + } + data = m_buf[m_head++]; + m_rx_pending--; + //printf("beckerport_device: data read 1 byte (0x%02x). %i bytes remaining.\n", data&0xff, m_rx_pending); + break; + default: + fprintf(stderr, "%s: read from bad offset %d\n", __FILE__, offset); + } + + return (int)data; +} + +/*------------------------------------------------- + write +-------------------------------------------------*/ + +WRITE8_MEMBER(beckerport_device::write) +{ + char line[128]; + char d = (char)data; + + switch (offset) { + case DWS_STATUS: + //printf("beckerport_write: error: write (0x%02x) to status register\n", d); + break; + case DWS_DATA: + if (::send(m_socket, &d, 1, MSG_NOSIGNAL) != 1) + { + sprintf(line, "send() failed in %s : %s : %d ", __func__, __FILE__, __LINE__); + perror(line); + } + //printf("beckerport_write: data write one byte (0x%02x)\n", d & 0xff); + break; + default: + fprintf(stderr, "%s: write to bad offset %d\n", __FILE__, offset); + } +} + +/*------------------------------------------------- + update_port +-------------------------------------------------*/ + +void beckerport_device::update_port(void) +{ + device_stop(); + m_dwport = machine().root_device().ioport(DRIVEWIRE_PORT_TAG)->read_safe(65504); + device_start(); +} + + + Index: src/mess/machine/coco_dwsock.h =================================================================== --- src/mess/machine/coco_dwsock.h (revision 0) +++ src/mess/machine/coco_dwsock.h (working copy) @@ -0,0 +1,71 @@ +#ifndef _DWSOCK_H_ +#define _DWSOCK_H_ + +#include "emu.h" + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +#define MCFG_DWSOCK_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, COCO_DWSOCK, 0) \ + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +struct beckerport_config +{ + /* IP hostname */ + const char * m_hostname; + + /* IP port */ + int m_dwport; +}; + + +class beckerport_device : public device_t, + public beckerport_config +{ +public: + beckerport_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~beckerport_device(); + + virtual void device_start(void); + virtual void device_stop(void); + virtual void device_config_complete(void); + + void update_port(void); + + virtual DECLARE_READ8_MEMBER(read); + virtual DECLARE_WRITE8_MEMBER(write); + + // types + enum dwsock_ports { + DWS_STATUS, + DWS_DATA + }; + +private: +#ifdef WIN32 + static bool m_wsInit; + unsigned int m_socket; +#else + int m_socket; + #define INVALID_SOCKET -1 + #define SOCKET_ERROR -1 +#endif + int m_rx_pending; + int m_head; + char m_buf[0x80]; +}; + +// device type definition +extern const device_type COCO_DWSOCK; + +// device iterator +typedef device_type_iterator<&device_creator<beckerport_device>, beckerport_device> beckerport_device_iterator; + +#endif /* _DWSOCK_H_ */ + Index: src/mess/mess.lst =================================================================== --- src/mess/mess.lst (revision 31554) +++ src/mess/mess.lst (working copy) @@ -1205,6 +1205,7 @@ coco3 // Color Computer 3 (NTSC) coco3p // Color Computer 3 (PAL) coco3h // Hacked Color Computer 3 (6309) +coco3dw1 // Coco 3 with HDB-DOS dragon32 // Dragon 32 dragon64 // Dragon 64 dragon200 // Dragon 200 Index: src/mess/mess.mak =================================================================== --- src/mess/mess.mak (revision 31554) +++ src/mess/mess.mak (working copy) @@ -1961,6 +1961,7 @@ $(MESS_DRIVERS)/dragon.o \ $(MESS_MACHINE)/dgnalpha.o \ $(MESS_MACHINE)/coco_vhd.o \ + $(MESS_MACHINE)/coco_dwsock.o \ $(MESS_DRIVERS)/mc10.o \ $(MESS_MACHINE)/trs80.o \ $(MESS_VIDEO)/trs80.o \ | ||||
hdbdw3bc3.zip (6,938 bytes) Aug 8, 2014, 04:47 Uploaded by Richard42 HDB-DOS ROM including Becker Port client support
| |||||
mame-r32810-beckerport.patch (19,650 bytes) Oct 18, 2014, 22:51 Uploaded by Richard42 updated patch for Becker Port support [Show Content] [Hide Content]Index: makefile =================================================================== --- makefile (revision 32810) +++ makefile (working copy) @@ -24,7 +24,7 @@ #------------------------------------------------- ifndef TARGET -TARGET = mame +TARGET = mess endif ifndef SUBTARGET Index: src/emu/bus/bus.mak =================================================================== --- src/emu/bus/bus.mak (revision 32810) +++ src/emu/bus/bus.mak (working copy) @@ -1250,6 +1250,7 @@ BUSOBJS += $(BUSOBJ)/coco/coco_pak.o BUSOBJS += $(BUSOBJ)/coco/coco_fdc.o BUSOBJS += $(BUSOBJ)/coco/coco_multi.o +BUSOBJS += $(BUSOBJ)/coco/coco_dwsock.o endif #------------------------------------------------- Index: src/emu/bus/coco/coco_dwsock.c =================================================================== --- src/emu/bus/coco/coco_dwsock.c (revision 0) +++ src/emu/bus/coco/coco_dwsock.c (working copy) @@ -0,0 +1,201 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/types.h> + +#include "emu.h" +#include "osdcore.h" +#include "includes/coco.h" + +#include "coco_dwsock.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type COCO_DWSOCK = &device_creator<beckerport_device>; + +//------------------------------------------------- +// INPUT_PORTS( coco_drivewire ) +//------------------------------------------------- + +INPUT_PORTS_START( coco_drivewire ) + PORT_START(DRIVEWIRE_PORT_TAG) + PORT_CONFNAME( 0xffff, 65504, "Drivewire Server TCP Port") + PORT_CHANGED_MEMBER(DEVICE_SELF, beckerport_device, beckerport_device::drivewire_port_changed, NULL ) + PORT_CONFSETTING( 65500, "65500" ) + PORT_CONFSETTING( 65501, "65501" ) + PORT_CONFSETTING( 65502, "65502" ) + PORT_CONFSETTING( 65503, "65503" ) + PORT_CONFSETTING( 65504, "65504" ) + PORT_CONFSETTING( 65505, "65505" ) + PORT_CONFSETTING( 65506, "65506" ) + PORT_CONFSETTING( 65507, "65507" ) + PORT_CONFSETTING( 65508, "65508" ) + PORT_CONFSETTING( 65509, "65509" ) +INPUT_PORTS_END + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor beckerport_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( coco_drivewire ); +} + +//------------------------------------------------- +// drivewire_port_changed +//------------------------------------------------- +INPUT_CHANGED_MEMBER(beckerport_device::drivewire_port_changed) +{ + this->update_port(); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// beckerport_device - constructor / destructor +//------------------------------------------------- + +beckerport_device::beckerport_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, COCO_DWSOCK, "Virtual Becker Port", tag, owner, clock, "coco_dwsock", __FILE__), + m_dwconfigport(*this, DRIVEWIRE_PORT_TAG) +{ + m_pSocket = NULL; + m_head = 0; + m_rx_pending = 0; +} + +beckerport_device::~beckerport_device() +{ + if (m_pSocket != NULL) + device_stop(); +} + +/*------------------------------------------------- + device_start +-------------------------------------------------*/ + +void beckerport_device::device_start(void) +{ + char chAddress[64]; + + /* format address string for opening the port */ + snprintf(chAddress, sizeof(chAddress), "socket.%s:%d", m_hostname, m_dwtcpport); + + fprintf(stderr, "Connecting to Drivewire server on %s:%d... ", m_hostname, m_dwtcpport); + + UINT64 filesize; // unused + file_error filerr = osd_open(chAddress, 0, &m_pSocket, &filesize); + if (filerr != FILERR_NONE) + { + fprintf(stderr, "Error: osd_open returned error %i!\n", (int) filerr); + return; + } + + fprintf(stderr, "Connected!\n"); +} + +/*------------------------------------------------- + device_stop +-------------------------------------------------*/ + +void beckerport_device::device_stop(void) +{ + if (m_pSocket != NULL) + { + printf("Closing connection to Drivewire server\n"); + osd_close(m_pSocket); + m_pSocket = NULL; + } +} + +/*------------------------------------------------- + device_config_complete +-------------------------------------------------*/ + +void beckerport_device::device_config_complete(void) +{ + m_hostname = "127.0.0.1"; + m_dwtcpport = 65504; +} + +/*------------------------------------------------- + read +-------------------------------------------------*/ + +READ8_MEMBER(beckerport_device::read) +{ + unsigned char data = 0x5a; + + switch (offset) + { + case DWS_STATUS: + if (!m_rx_pending) + { + /* Try to read from dws */ + file_error filerr = osd_read(m_pSocket, m_buf, 0, sizeof(m_buf), &m_rx_pending); + if (filerr != FILERR_NONE && filerr != FILERR_FAILURE) // FILERR_FAILURE means no data available, so don't throw error message + fprintf(stderr, "coco_dwsock.c: beckerport_device::read() socket read operation failed with file_error %i\n", filerr); + else + m_head = 0; + } + //printf("beckerport_device: status read. %i bytes remaining.\n", m_rx_pending); + data = (m_rx_pending > 0) ? 2 : 0; + break; + case DWS_DATA: + if (!m_rx_pending) { + fprintf(stderr, "coco_dwsock.c: beckerport_device::read() buffer underrun\n"); + break; + } + data = m_buf[m_head++]; + m_rx_pending--; + //printf("beckerport_device: data read 1 byte (0x%02x). %i bytes remaining.\n", data&0xff, m_rx_pending); + break; + default: + fprintf(stderr, "%s: read from bad offset %d\n", __FILE__, offset); + } + + return (int)data; +} + +/*------------------------------------------------- + write +-------------------------------------------------*/ + +WRITE8_MEMBER(beckerport_device::write) +{ + char d = (char)data; + file_error filerr; + + switch (offset) + { + case DWS_STATUS: + //printf("beckerport_write: error: write (0x%02x) to status register\n", d); + break; + case DWS_DATA: + filerr = osd_write(m_pSocket, &d, 0, 1, NULL); + if (filerr != FILERR_NONE) + fprintf(stderr, "coco_dwsock.c: beckerport_device::write() socket write operation failed with file_error %i\n", filerr); + //printf("beckerport_write: data write one byte (0x%02x)\n", d & 0xff); + break; + default: + fprintf(stderr, "%s: write to bad offset %d\n", __FILE__, offset); + } +} + +/*------------------------------------------------- + update_port +-------------------------------------------------*/ + +void beckerport_device::update_port(void) +{ + device_stop(); + m_dwtcpport = m_dwconfigport->read_safe(65504); + device_start(); +} + Index: src/emu/bus/coco/coco_dwsock.h =================================================================== --- src/emu/bus/coco/coco_dwsock.h (revision 0) +++ src/emu/bus/coco/coco_dwsock.h (working copy) @@ -0,0 +1,72 @@ +#ifndef _DWSOCK_H_ +#define _DWSOCK_H_ + +#include "emu.h" +#include "osdcore.h" + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +#define DRIVEWIRE_PORT_TAG "drivewire_port" + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> beckerport_device + +class beckerport_device : public device_t +{ +public: + beckerport_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~beckerport_device(); + + // optional information overrides + virtual ioport_constructor device_input_ports() const; + + virtual void device_start(void); + virtual void device_stop(void); + virtual void device_config_complete(void); + + void update_port(void); + + // driver update handlers + DECLARE_INPUT_CHANGED_MEMBER(drivewire_port_changed); + + virtual DECLARE_READ8_MEMBER(read); + virtual DECLARE_WRITE8_MEMBER(write); + + // types + enum dwsock_ports { + DWS_STATUS, + DWS_DATA + }; + +private: + /* IP hostname */ + const char * m_hostname; + + /* IP port */ + required_ioport m_dwconfigport; + int m_dwtcpport; + + osd_file *m_pSocket; + + unsigned int m_rx_pending; + unsigned int m_head; + char m_buf[0x80]; +}; + +// device type definition +extern const device_type COCO_DWSOCK; + +// device iterator +typedef device_type_iterator<&device_creator<beckerport_device>, beckerport_device> beckerport_device_iterator; + +#endif /* _DWSOCK_H_ */ + Index: src/emu/bus/coco/coco_fdc.c =================================================================== --- src/emu/bus/coco/coco_fdc.c (revision 32810) +++ src/emu/bus/coco/coco_fdc.c (working copy) @@ -639,6 +639,30 @@ } //************************************************************************** +// COCO-3 HDB-DOS +//************************************************************************** + +ROM_START( coco3_hdb1 ) + ROM_REGION(0x8000,"eprom",ROMREGION_ERASE00) + ROM_LOAD("hdbdw3bc3.rom", 0x0000, 0x2000, CRC(309a9efd) SHA1(671605d61811953860466f771c1594bbade331f4)) + ROM_RELOAD(0x2000, 0x2000) + ROM_RELOAD(0x4000, 0x2000) + ROM_RELOAD(0x6000, 0x2000) +ROM_END + +const device_type COCO3_HDB1 = &device_creator<coco3_hdb1_device>; + +coco3_hdb1_device::coco3_hdb1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : coco_fdc_device(mconfig, COCO3_HDB1, "CoCo3 HDB-DOS", tag, owner, clock, "coco3_hdb1", __FILE__) +{ +} + +const rom_entry *coco3_hdb1_device::device_rom_region() const +{ + return ROM_NAME( coco3_hdb1 ); +} + +//************************************************************************** // CP400 FDC //************************************************************************** Index: src/emu/bus/coco/coco_fdc.h =================================================================== --- src/emu/bus/coco/coco_fdc.h (revision 32810) +++ src/emu/bus/coco/coco_fdc.h (working copy) @@ -95,6 +95,23 @@ // device type definition extern const device_type COCO_FDC_V11; +// ======================> coco3_hdb1_device + +class coco3_hdb1_device : + public coco_fdc_device +{ +public: + // construction/destruction + coco3_hdb1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual const rom_entry *device_rom_region() const; +}; + + +// device type definition +extern const device_type COCO3_HDB1; + // ======================> cp400_fdc_device class cp400_fdc_device : Index: src/emu/bus/coco/coco_multi.c =================================================================== --- src/emu/bus/coco/coco_multi.c (revision 32810) +++ src/emu/bus/coco/coco_multi.c (working copy) @@ -75,6 +75,7 @@ SLOT_INTERFACE("pak", COCO_PAK) SLOT_INTERFACE_END static SLOT_INTERFACE_START(coco_cart_slot4) + SLOT_INTERFACE("cc3hdb1", COCO3_HDB1) SLOT_INTERFACE("fdcv11", COCO_FDC_V11) SLOT_INTERFACE("rs232", COCO_232) SLOT_INTERFACE("orch90", COCO_ORCH90) Index: src/mess/drivers/coco12.c =================================================================== --- src/mess/drivers/coco12.c (revision 32810) +++ src/mess/drivers/coco12.c (working copy) @@ -29,6 +29,7 @@ #include "bus/coco/coco_pak.h" #include "bus/coco/coco_fdc.h" #include "bus/coco/coco_multi.h" +#include "bus/coco/coco_dwsock.h" #include "formats/coco_cas.h" //************************************************************************** @@ -114,6 +115,17 @@ //------------------------------------------------- +// INPUT_PORTS( coco_beckerport ) +//------------------------------------------------- + +INPUT_PORTS_START( coco_beckerport ) + PORT_START(BECKERPORT_TAG) + PORT_CONFNAME( 0x01, 0x01, "Becker Port" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off )) + PORT_CONFSETTING( 0x01, DEF_STR( On )) +INPUT_PORTS_END + +//------------------------------------------------- // INPUT_PORTS( coco_rtc ) //------------------------------------------------- @@ -223,6 +235,7 @@ PORT_INCLUDE( coco_analog_control ) PORT_INCLUDE( coco_cart_autostart ) PORT_INCLUDE( coco_rtc ) + PORT_INCLUDE( coco_beckerport ) INPUT_PORTS_END @@ -238,6 +251,7 @@ SLOT_INTERFACE_START( coco_cart ) SLOT_INTERFACE("fdc", COCO_FDC) SLOT_INTERFACE("fdcv11", COCO_FDC_V11) + SLOT_INTERFACE("cc3hdb1", COCO3_HDB1) SLOT_INTERFACE("cp400_fdc", CP400_FDC) SLOT_INTERFACE("rs232", COCO_232) SLOT_INTERFACE("orch90", COCO_ORCH90) @@ -300,6 +314,9 @@ MCFG_SAM6883_ADD(SAM_TAG, XTAL_3_579545MHz, MAINCPU_TAG, AS_PROGRAM) MCFG_SAM6883_RES_CALLBACK(READ8(coco12_state, sam_read)) + // Becker Port device + MCFG_DEVICE_ADD(DWSOCK_TAG, COCO_DWSOCK, 0) + MCFG_CASSETTE_ADD("cassette") MCFG_CASSETTE_FORMATS(coco_cassette_formats) MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED) Index: src/mess/drivers/coco3.c =================================================================== --- src/mess/drivers/coco3.c (revision 32810) +++ src/mess/drivers/coco3.c (working copy) @@ -222,6 +222,7 @@ PORT_INCLUDE( coco_rat_mouse ) PORT_INCLUDE( coco_lightgun ) PORT_INCLUDE( coco_rtc ) + PORT_INCLUDE( coco_beckerport ) INPUT_PORTS_END static DEVICE_INPUT_DEFAULTS_START( printer ) @@ -261,6 +262,9 @@ MCFG_PIA_IRQA_HANDLER(WRITELINE(coco_state, pia1_firq_a)) MCFG_PIA_IRQB_HANDLER(WRITELINE(coco_state, pia1_firq_b)) + // Becker Port device + MCFG_DEVICE_ADD(DWSOCK_TAG, COCO_DWSOCK, 0) + MCFG_CASSETTE_ADD("cassette") MCFG_CASSETTE_FORMATS(coco_cassette_formats) MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED) @@ -337,8 +341,11 @@ MCFG_CPU_PROGRAM_MAP(coco3_mem) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( coco3dw1, coco3 ) + MCFG_COCO_CARTRIDGE_REMOVE(CARTRIDGE_TAG) + MCFG_COCO_CARTRIDGE_ADD(CARTRIDGE_TAG, coco_cart, "cc3hdb1") +MACHINE_CONFIG_END - //************************************************************************** // ROMS //************************************************************************** @@ -354,9 +361,8 @@ ROM_END #define rom_coco3h rom_coco3 +#define rom_coco3dw1 rom_coco3 - - //************************************************************************** // SYSTEM DRIVERS //************************************************************************** @@ -364,3 +370,4 @@ COMP( 1986, coco3, coco, 0, coco3, coco3, driver_device, 0, "Tandy Radio Shack", "Color Computer 3 (NTSC)", 0) COMP( 1986, coco3p, coco, 0, coco3p, coco3, driver_device, 0, "Tandy Radio Shack", "Color Computer 3 (PAL)", 0) COMP( 19??, coco3h, coco, 0, coco3h, coco3, driver_device, 0, "Tandy Radio Shack", "Color Computer 3 (NTSC; HD6309)", GAME_UNOFFICIAL) +COMP( 19??, coco3dw1, coco, 0, coco3dw1, coco3, driver_device, 0, "Tandy Radio Shack", "Color Computer 3 (NTSC; HDB-DOS)", GAME_UNOFFICIAL) Index: src/mess/includes/coco.h =================================================================== --- src/mess/includes/coco.h (revision 32810) +++ src/mess/includes/coco.h (working copy) @@ -18,6 +18,7 @@ #include "machine/6821pia.h" #include "bus/coco/cococart.h" #include "machine/coco_vhd.h" +#include "bus/coco/coco_dwsock.h" #include "machine/ram.h" #include "sound/dac.h" #include "sound/wave.h" @@ -31,6 +32,7 @@ INPUT_PORTS_EXTERN( coco_analog_control ); INPUT_PORTS_EXTERN( coco_cart_autostart ); INPUT_PORTS_EXTERN( coco_rtc ); +INPUT_PORTS_EXTERN( coco_beckerport ); SLOT_INTERFACE_EXTERN( coco_cart ); @@ -48,6 +50,7 @@ #define DAC_TAG "dac" #define CARTRIDGE_TAG "ext" #define RS232_TAG "rs232" +#define DWSOCK_TAG "dwsock" #define VHD0_TAG "vhd0" #define VHD1_TAG "vhd1" @@ -55,6 +58,7 @@ #define CTRL_SEL_TAG "ctrl_sel" #define HIRES_INTF_TAG "hires_intf" #define CART_AUTOSTART_TAG "cart_autostart" +#define BECKERPORT_TAG "beckerport" #define JOYSTICK_RX_TAG "joystick_rx" #define JOYSTICK_RY_TAG "joystick_ry" #define JOYSTICK_LX_TAG "joystick_lx" @@ -95,6 +99,8 @@ optional_device<rs232_port_device> m_rs232; optional_device<coco_vhd_image_device> m_vhd_0; optional_device<coco_vhd_image_device> m_vhd_1; + required_device<beckerport_device> m_beckerport; + required_ioport m_beckerportconfig; // driver update handlers DECLARE_INPUT_CHANGED_MEMBER(keyboard_changed); Index: src/mess/machine/coco.c =================================================================== --- src/mess/machine/coco.c (revision 32810) +++ src/mess/machine/coco.c (working copy) @@ -89,7 +89,9 @@ m_cassette(*this, "cassette"), m_rs232(*this, RS232_TAG), m_vhd_0(*this, VHD0_TAG), - m_vhd_1(*this, VHD1_TAG) + m_vhd_1(*this, VHD1_TAG), + m_beckerport(*this, DWSOCK_TAG), + m_beckerportconfig(*this, BECKERPORT_TAG) { } @@ -1016,8 +1018,6 @@ poll_keyboard(); } - - //------------------------------------------------- // poll_hires_joystick //------------------------------------------------- @@ -1159,6 +1159,11 @@ READ8_MEMBER( coco_state::ff40_read ) { + if (offset >= 1 && offset <= 2 && m_beckerportconfig->read_safe(0) == 1) + { + return m_beckerport->read(space, offset-1, mem_mask); + } + return m_cococart->read(space, offset, mem_mask); } @@ -1170,6 +1175,11 @@ WRITE8_MEMBER( coco_state::ff40_write ) { + if (offset >= 1 && offset <= 2 && m_beckerportconfig->read_safe(0) == 1) + { + return m_beckerport->write(space, offset-1, data, mem_mask); + } + m_cococart->write(space, offset, data, mem_mask); } @@ -1184,8 +1194,6 @@ m_pia_1->cb1_w(state); } - - /*************************************************************************** DISASSEMBLY OVERRIDE (OS9 syscalls) ***************************************************************************/ Index: src/mess/mess.lst =================================================================== --- src/mess/mess.lst (revision 32810) +++ src/mess/mess.lst (working copy) @@ -1213,6 +1213,7 @@ coco3 // Color Computer 3 (NTSC) coco3p // Color Computer 3 (PAL) coco3h // Hacked Color Computer 3 (6309) +coco3dw1 // Coco 3 with HDB-DOS dragon32 // Dragon 32 dragon64 // Dragon 64 dragon200 // Dragon 200 | |||||
Relationships
There are no relationship linked to this issue. |
Notes
8
No.10911
NekoEd Senior Tester
Aug 9, 2014, 01:26
|
I'll set this aside to be looked at by the devs to see if it's acceptable. |
---|---|
No.10917
Richard42 Tester
Aug 13, 2014, 02:36
|
There's quite a bit of interest in this feature from the Coco community. Aaron Wolfe said, "Support for the Becker port is already present in VCC and XRoar, so MESS is the only modern emulator that doesn't provide it. Since today so many people are using DriveWire or similar solutions on their physical coco, it makes sense to me for emulators to be able to do the same, and the Becker port has become the standard way to do that." Bill Piece said, "it's handy to be able to do the same things in Mess that I do on my real Coco and Vcc (and Mess cannot currently do).... DW4 Midi, Internet Access, virtual printer, multiple HDs (more than 2), remote terminal etc." So DriveWire adds quite a few capabilities. Also, the patch that I attached to this report will not work properly with OSX, due to its different method of blocking SIGPIPE signals if the remote end of the socket closes early. If you guys decide to merge this feature into MESS, I will fix my patch to properly support OSX. |
No.10982
Tafoid Administrator
Sep 17, 2014, 10:19
|
If you have a submission you want to include in main source, this is not the correct place to submit it for review/addition. Visit http://www.mamedev.org/devwiki/index.php?title=Submitting_Source_Code |
No.11050
Richard42 Tester
Oct 12, 2014, 15:53
|
OK, I have submitted this source code patch to the development team according to the instructions on that web page. |
No.11061
R. Belmont Developer
Oct 14, 2014, 15:22
|
Hi Richard, I appreciate what you're trying to do and we definitely want this functionality in MESS, but as the portability guy I have to wave the red flag. MAME/MESS already allows you to open, read, write, and close TCP sockets via the osd_open()/osd_read()/osd_write()/osd_close() file I/O APIs. You simply feed it a specially formatted filename of the form "socket" dot HOST colon port. E.g. "socket.google.com:80". Pass OPEN_FLAG_CREATE for a listener (server) socket, omit it for an outgoing socket to connect to a remote server. Depending on how fancy you need to get it would be acceptable to add e.g. osd_fcntl() and osd_select() types of API calls to portably encapsulate those operations. Also, regarding stuff like "m_dwport = machine().root_device().ioport(DRIVEWIRE_PORT_TAG)->read_safe(65504);", you should use the required_ioport pattern to avoid doing an expensive tag lookup each time that statement executes. Admittedly it won't be often in that specific case, but we're trying to eliminate the older design pattern so when people copy/paste stuff in the future they have a fighting chance of getting something that isn't outdated. Good luck, and hopefully this isn't too drastic of a change :) |
No.11111
Richard42 Tester
Oct 18, 2014, 23:03
|
Hello, I have uploaded an updated patch which includes the two changes that you requested (1. using osd_* functions instead of socket(),recv(), etc, and 2. using the required_ioport pattern to avoid config tag lookups at runtime). There are some other improvements as well. The becker port implementation class (coco_dwsock.c) was moved from /mess/machine to /emu/bus/coco, to go along with some similar files recently moved in MESS. The 2 new config options ("Becker Port" and "Drivewire Server TCP Port") were split up so that the Becker Port enable option is implemented in the coco machine, while the Drivewire Server TCP Port is implemented in the becker port device itself (coco_dwsock.c). I think this is conceptually better. I also updated the base of the patch to the newest SVN revision as of today (32810). I tested this patch under both Win32 and Linux, and everything worked correctly. Please let me know if there are any other changes you need before merging. Should I also resubmit this patch to the email address, or is it sufficient to post it here? |
No.11112
Tafoid Administrator
Oct 18, 2014, 23:13
|
I was about to email you about this - please send it like you did your other one so it can be forwarded and looked at quicker. Devs don't come here as often as read discussion list emails. Thank you! |
No.11113
R. Belmont Developer
Oct 19, 2014, 00:58
|
Richard, The revised patch is exactly what I was hoping to see, I have applied it to trunk for 0.156. Thanks! -RB |