mirror of
https://github.com/open-simh/simh.git
synced 2026-01-25 11:55:43 +00:00
TMXR, PDP11, PDP10, VAX: Add DDCMP sync framer support
This adds support for the "framer" device, which is a USB-connected device built around a Raspberry Pico that connects to a synchronous line, either RS-232 or DEC "integral modem" coax connection. It implements the framing portion of DDCMP: clock recovery for the integral modem case, byte sync, and DDCMP frame handling including CRC. The actual DDCMP protocol state machine, with its handling of sequencing, timeout and retransmit, etc. is left to the host software. All the design files for the framer may be found at https://github.com/pkoning2/ddcmp . This commit adds code to drive the framer from the TMXR library, allowing it to be used either from simulated DMC-11 or simulated DUP-11 devices. Both have been tested, using RSTS/E, RSX-11/M+, and TOPS-20. Fixed the one-digit limit on eth<n> device names, the limit is now 2.
This commit is contained in:
committed by
Mark Pizzolato
parent
030a47bdb4
commit
5cd1e8b7ac
9
PDP11/ddcmp_sync.md
Normal file
9
PDP11/ddcmp_sync.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# DDCMP synchronous line interface
|
||||
|
||||
The DDCMP synchronous interface supported by the DUP and DMC device emulations, is a USB connected device that implements synchronous links for use by DDCMP.
|
||||
|
||||
When used with SIMH, the synchronous interface allows an emulated DMC-11 or DUP-11 (including KMC/DUP) to be connected to a system that uses a real synchronous link for DDCMP, for example an actual DMC-11 device. The interface can support either RS-232 connectons for the DUP-11 or DMC-11 "remote" line cards, or the "integral modem" coaxial cable connection implemented in the DMC "local" line card. Speeds in the range 500 to 56k bits per second (for RS-232) or 56k to 1M bits per second (for integral modem) are supported.
|
||||
|
||||
The DDCMP synchronous line interface is an open source design. All the design files (schematics, circuit board layout, firmware, and documentation) may be found on GitHub at [this link](https://github.com/pkoning2/ddcmp "DDCMP Framer on GitHub").
|
||||
|
||||
Note that at the moment, no boards, kits, or assembled units are offered. If you want a framer, you would need to obtain a circuit board and assemble it. The documentation in the GitHub design files explains how to do this. The design uses all "through hole" parts, so modest electronics assembly skills suffice to build a unit.
|
||||
@@ -1250,6 +1250,8 @@ MTAB dmc_mod[] = {
|
||||
&set_addr, &show_addr, NULL, "Bus address" },
|
||||
{ MTAB_XTD|MTAB_VDV|MTAB_VALR, 1, "VECTOR", "VECTOR",
|
||||
&set_vec, &show_vec, NULL, "Interrupt vector" },
|
||||
{ MTAB_XTD|MTAB_VDV|MTAB_NMO, 0, "SYNC", NULL,
|
||||
NULL, &tmxr_show_sync, NULL, "Display attachable DDCMP synchronous links" },
|
||||
{ 0 } };
|
||||
|
||||
extern DEVICE dmp_dev;
|
||||
@@ -1891,6 +1893,18 @@ const char helpString[] =
|
||||
"\n"
|
||||
"+sim> ATTACH %U port,UDP\n"
|
||||
"\n"
|
||||
" Communication may alternately use the DDCMP synchronous framer device.\n"
|
||||
" The DDCMP synchronous device is a USB device that can send and\n"
|
||||
" receive DDCMP frames over either RS-232 or coax synchronous lines.\n"
|
||||
" Refer to https://github.com/pkoning2/ddcmp for documentation.\n"
|
||||
"\n"
|
||||
"+sim> ATTACH %U SYNC=ifname:mode:speed\n"
|
||||
"\n"
|
||||
" Communicate via the synchronous DDCMP framer interface \"ifname\", \n"
|
||||
" and framer mode \"mode\" -- one of INTEGRAL, RS232_DTE, or\n"
|
||||
" RS232_DCE. The \"speed\" argument is the bit rate for the line.\n"
|
||||
" In SYNC mode, the \"PEER\" parameter is not used and need not be set.\n"
|
||||
" You can use \"SHOW SYNC\" to see the list of synchronous DDCMP devices.\n"
|
||||
"2 Examples\n"
|
||||
" To configure two simulators to talk to each other use the following\n"
|
||||
" example:\n"
|
||||
@@ -1905,6 +1919,8 @@ const char helpString[] =
|
||||
"+sim> SET %U PEER=LOCALHOST:1111\n"
|
||||
"+sim> ATTACH %U 2222\n"
|
||||
"\n"
|
||||
" To communicate with an \"integral modem\" DMC or similar, at 56 kbps:\n"
|
||||
"+sim> ATTACH %U SYNC=sync0:INTEGRAL:56000\n"
|
||||
"1 Monitoring\n"
|
||||
" The %D device and %U line configuration and state can be displayed with\n"
|
||||
" one of the available show commands.\n"
|
||||
@@ -3972,14 +3988,21 @@ if (!cptr || !*cptr)
|
||||
return SCPE_ARG;
|
||||
if (!(uptr->flags & UNIT_ATTABLE))
|
||||
return SCPE_NOATT;
|
||||
if (!peer[0]) {
|
||||
sim_printf ("Peer must be specified before attach\n");
|
||||
return SCPE_ARG;
|
||||
if (0 == strncasecmp (cptr, "SYNC", 4)) {
|
||||
sprintf (attach_string, "Line=%d,%s", dmc, cptr);
|
||||
ans = tmxr_open_master (mp, attach_string);
|
||||
}
|
||||
else {
|
||||
if (!peer[0]) {
|
||||
sim_printf ("Peer must be specified before attach\n");
|
||||
return SCPE_ARG;
|
||||
}
|
||||
sprintf (attach_string, "Line=%d,Connect=%s,%s", dmc, peer, cptr);
|
||||
ans = tmxr_open_master (mp, attach_string); /* open master socket */
|
||||
sprintf (attach_string, "Line=%d,Connect=%s,%s", dmc, peer, cptr);
|
||||
ans = tmxr_open_master (mp, attach_string); /* open master socket */
|
||||
}
|
||||
if (ans != SCPE_OK)
|
||||
return ans;
|
||||
mp->dptr = dptr;
|
||||
strncpy (port, cptr, sizeof(dmc_port[0]));
|
||||
uptr->filename = (char *)malloc (strlen(port)+1);
|
||||
strcpy (uptr->filename, port);
|
||||
|
||||
@@ -405,6 +405,8 @@ static MTAB dup_mod[] = {
|
||||
NULL, &tmxr_show_cstat, (void *) &dup_desc, "Display current connections" },
|
||||
{ MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "LINES", "LINES=n",
|
||||
&dup_setnl, &tmxr_show_lines, (void *) &dup_desc, "Display number of lines" },
|
||||
{ MTAB_XTD|MTAB_VDV|MTAB_NMO, 0, "SYNC", NULL,
|
||||
NULL, &tmxr_show_sync, NULL, "Display attachable DDCMP synchronous links" },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
@@ -554,8 +556,8 @@ switch ((PA >> 1) & 03) { /* case on PA<2:1> */
|
||||
dup_set_modem (dup, data);
|
||||
dup_rxcsr[dup] &= ~RXCSR_WRITEABLE;
|
||||
dup_rxcsr[dup] |= (data & RXCSR_WRITEABLE);
|
||||
if ((dup_rxcsr[dup] & RXCSR_M_RTS) && /* Upward transition of RTS */
|
||||
(!(orig_val & RXCSR_M_RTS))) /* Enables Receive on the line */
|
||||
if ((dup_rxcsr[dup] & RXCSR_M_DTR) && /* Upward transition of DTR */
|
||||
(!(orig_val & RXCSR_M_DTR))) /* Enables Receive on the line */
|
||||
dup_desc.ldsc[dup].rcve = TRUE;
|
||||
if ((dup_rxcsr[dup] & RXCSR_M_RTS) && /* Upward transition of RTS */
|
||||
(!(orig_val & RXCSR_M_RTS)) && /* while receiver is enabled and */
|
||||
@@ -1560,6 +1562,17 @@ const char helpString[] =
|
||||
" the peer. Alternatively, UDP can be used by specifying UDP on the\n"
|
||||
" ATTACH command.\n"
|
||||
"\n"
|
||||
" Communication may alternately use the DDCMP synchronous framer device.\n"
|
||||
" The DDCMP synchronous device is a USB device that can send and\n"
|
||||
" receive DDCMP frames over either RS-232 or coax synchronous lines.\n"
|
||||
" Refer to https://github.com/pkoning2/ddcmp for documentation.\n"
|
||||
"\n"
|
||||
"+sim> ATTACH %U SYNC=ifname:mode:speed\n"
|
||||
"\n"
|
||||
" Communicate via the synchronous DDCMP framer interface \"ifname\", \n"
|
||||
" and framer mode \"mode\" -- one of INTEGRAL, RS232_DTE, or\n"
|
||||
" RS232_DCE. The \"speed\" argument is the bit rate for the line.\n"
|
||||
" You can use \"SHOW SYNC\" to see the list of synchronous DDCMP devices.\n"
|
||||
"2 Examples\n"
|
||||
" To configure two simulators to talk to each other use the following\n"
|
||||
" example:\n"
|
||||
@@ -1572,6 +1585,8 @@ const char helpString[] =
|
||||
"+sim> SET %D ENABLE\n"
|
||||
"+sim> ATTACH %U 2222,connect=LOCALHOST:1111\n"
|
||||
"\n"
|
||||
" To communicate with an \"integral modem\" DMC or similar, at 56 kbps:\n"
|
||||
"+sim> ATTACH %U SYNC=sync0:INTEGRAL:56000\n"
|
||||
"1 Monitoring\n"
|
||||
" The %D device and %U line configuration and state can be displayed with\n"
|
||||
" one of the available show commands.\n"
|
||||
|
||||
Reference in New Issue
Block a user