From 592deb8f036dee8b24ea9d4f86552b586cc5b346 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 31 Jul 2016 10:07:52 -0700 Subject: [PATCH] HP2100: Fix MPX behaviors from Dave Bryan --- HP2100/hp2100_bugfixes.txt | 82 ++++++++++++++++++++++++++++++++++++- HP2100/hp2100_mpx.c | 65 ++++++++++++++++++----------- doc/hp2100_doc.doc | Bin 172032 -> 175616 bytes 3 files changed, 123 insertions(+), 24 deletions(-) diff --git a/HP2100/hp2100_bugfixes.txt b/HP2100/hp2100_bugfixes.txt index eee129a4..9978bf22 100644 --- a/HP2100/hp2100_bugfixes.txt +++ b/HP2100/hp2100_bugfixes.txt @@ -1,6 +1,6 @@ HP 2100 SIMULATOR BUG FIX WRITEUPS ================================== - Last update: 2016-03-04 + Last update: 2016-07-28 1. PROBLEM: Booting from magnetic tape reports "HALT instruction, P: 77756 @@ -6936,3 +6936,83 @@ "hp2100_ds.c" and "hp2100_di_da.c" to use the new include file name. STATUS: Fixed in version 4.0-0. + + + +271. PROBLEM: The MPX device incorrectly reports a currently filling read + buffer as complete. + + VERSION: 4.0-0 + + OBSERVATION: Using Kermit to upload a file to RTE and specifying a packet + size larger than 254 bytes fails with transmission errors. Uploads with + packet sizes under 254 bytes work properly. + + CAUSE: The 12792 multiplexer provides two 254-byte receive buffers per + line. A single reception larger than 254 bytes returns "partial buffer" + status when the initial read terminates because of the buffer full + condition. This informs RTE that the reception is incomplete and that it + should issue additional reads to obtain the remainder of the data. + Complete reception is indicated by the final read not returning "partial + buffer" status. + + When Kermit sends a large packet, the multiplexer fills the first 254-byte + buffer, terminating on the buffer-full condition, and sends an unsolicited + interrupt to the CPU with "read buffer available" status. In response, RTE + sends an "acknowledge" command to the multiplexer, which returns the + "partial buffer" status and the buffer length. RTE then follows with a + "read buffer" command and prepares to receive the first buffer data. + Concurrently, the multiplexer begins filling the second 254-byte buffer. + + RTE uses DCPC to transfer the data from the multiplexer, which is faster + than the incoming data rate. Therefore, the transfer completes while the + second buffer is still filling. On DCPC completion, the multiplexer checks + to see if the other receive buffer is complete, and if it is, issues + another unsolicited interrupt with "read buffer available" status. + + The buffer completion check incorrectly returns TRUE if the buffer contains + received data. It should return TRUE only if the buffer contains data and + it is not currently being filled. + + For short reads, such as EDIT screen reads, the second buffer fill + completes before the first buffer DCPC transfer, and the returned "read + buffer available" status is appropriate. For long reads, such as Kermit + transfers, the incorrect buffer check causes RTE to transfer data from the + second buffer while it is incomplete. This leads to corrupted data and + Kermit transmission errors. + + RESOLUTION: Modify "mpx_cntl_svc" (hp2100_mpx.c) to indicate read buffer + availability only when filling is complete. + + STATUS: Fixed in version 4.0-0. + + + +272. PROBLEM: An MPX binary read larger than 254 bytes never completes. + + VERSION: 4.0-0. + + OBSERVATION: The MPX device may be configured to terminate a read on + reception of either a special character (e.g., CR) or a certain character + count. Counts up to 64K bytes are permitted, and such reads will succeed + if the alternating buffers are concurrently transferred to the CPU before + filling completely. However, while reads that specify character counts of + 254 or less complete as expected, reads of more than 254 bytes never + complete. + + CAUSE: As each character is received, the current character count is + compared to the termination count, and the read completes if the counts are + equal. However, the current character count is determined by the number of + characters in the current buffer and not the accumulated count of all + characters received. As the read buffers are 254 bytes long, the current + count will never exceed 254. Therefore, any read terminating on a count + greater than that will never complete. + + RESOLUTION: Define a new "mpx_termcnt" array to hold the termination + counts for the eight lines, and reassign the "mpx_charcnt" array to hold + the current character counts. Modify "exec_command" and "mpx_line_svc" + (hp2100_mpx.c) to set the termination count, compare it against the current + character count as characters are received, and terminate reception if + enabled and the values are equal. + + STATUS: Fixed in version 4.0-0. diff --git a/HP2100/hp2100_mpx.c b/HP2100/hp2100_mpx.c index 15068160..fa913bc3 100644 --- a/HP2100/hp2100_mpx.c +++ b/HP2100/hp2100_mpx.c @@ -25,6 +25,8 @@ MPX 12792C 8-channel multiplexer card + 28-Jul-16 JDB Fixed buffer ready check at read completion + Fixed terminate on character counts > 254 13-May-16 JDB Modified for revised SCP API function parameter types 24-Dec-14 JDB Added casts for explicit downward conversions 10-Jan-13 MP Added DEV_MUX and additional DEVICE field values @@ -123,6 +125,7 @@ Because this is a functional simulation of the multiplexer and not a Z80 emulation, the diagnostic cannot be used to test the implementation. + Implementation notes: 1. The 12792 had two baud-rate generators that were assigned to lines by the @@ -508,7 +511,12 @@ BITFIELD (FL_DO_ENQACK, 0, 1) /* Port flags: do ENQ/AC /* Multiplexer controller state variables */ -typedef enum { idle, cmd, param, exec } STATE; +typedef enum { /* execution state */ + idle, + cmd, + param, + exec + } STATE; STATE mpx_state = idle; /* controller state */ @@ -535,7 +543,8 @@ struct { uint8 mpx_key [MPX_PORTS]; /* port keys */ uint16 mpx_config [MPX_PORTS]; /* port configuration */ uint16 mpx_rcvtype [MPX_PORTS]; /* receive type */ -uint16 mpx_charcnt [MPX_PORTS]; /* character count */ +uint16 mpx_charcnt [MPX_PORTS]; /* current character count */ +uint16 mpx_termcnt [MPX_PORTS]; /* termination character count */ uint16 mpx_flowcntl [MPX_PORTS]; /* flow control */ uint8 mpx_enq_cntr [MPX_PORTS]; /* ENQ character counter */ uint16 mpx_ack_wait [MPX_PORTS]; /* ACK wait timer */ @@ -675,6 +684,7 @@ REG mpx_reg [] = { { BRDATA (PCONFIG, mpx_config, 8, 16, MPX_PORTS) }, { BRDATA (RCVTYPE, mpx_rcvtype, 8, 16, MPX_PORTS) }, { BRDATA (CHARCNT, mpx_charcnt, 8, 16, MPX_PORTS) }, + { BRDATA (TERMCNT, mpx_termcnt, 8, 16, MPX_PORTS) }, { BRDATA (FLOWCNTL, mpx_flowcntl, 8, 16, MPX_PORTS) }, { BRDATA (ENQCNTR, mpx_enq_cntr, 10, 7, MPX_PORTS) }, @@ -1128,17 +1138,21 @@ switch (mpx_cmd) { if (port >= 0) /* port defined? */ buf_cancel (ioread, port, get); /* cancel get buffer */ - if ((buf_avail (ioread, port) == 1) && /* one buffer remaining? */ - !(mpx_flags [port] & FL_RDFILL)) /* and not filling it? */ - mpx_flags [port] |= FL_HAVEBUF; /* indicate buffer availability */ + if (buf_avail (ioread, port) == 2) /* if all buffers are now clear */ + mpx_charcnt [port] = 0; /* then clear the current character count */ + + else if (!(mpx_flags [port] & FL_RDFILL)) /* otherwise if the other buffer is not filling */ + mpx_flags [port] |= FL_HAVEBUF; /* then indicate buffer availability */ break; case CMD_CANCEL_ALL: /* cancel all read buffers */ port = key_to_port (mpx_portkey); /* get port */ - if (port >= 0) /* port defined? */ + if (port >= 0) { /* port defined? */ buf_init (ioread, port); /* reinitialize read buffers */ + mpx_charcnt [port] = 0; /* and clear the current character count */ + } break; @@ -1208,8 +1222,10 @@ switch (mpx_cmd) { case CMD_SET_COUNT: /* set character count */ port = key_to_port (mpx_portkey); /* get port */ - if (port >= 0) /* port defined? */ - mpx_charcnt [port] = (uint16) mpx_param; /* save port character count */ + if (port >= 0) { /* port defined? */ + mpx_termcnt [port] = (uint16) mpx_param; /* save port termination character count */ + mpx_charcnt [port] = 0; /* and clear the current character count */ + } break; @@ -1262,13 +1278,14 @@ switch (mpx_cmd) { if (port >= 0) /* port defined? */ if (buf_len (ioread, port, put) > 0) { /* any chars in buffer? */ buf_term (ioread, port, 0); /* terminate buffer and set header */ + mpx_charcnt [port] = 0; /* then clear the current character count */ if (buf_avail (ioread, port) == 1) /* first read buffer? */ mpx_flags [port] |= FL_HAVEBUF; /* indicate availability */ } else { /* buffer is empty */ - mpx_charcnt [port] = 1; /* set to terminate on one char */ + mpx_termcnt [port] = 1; /* set to terminate on one char */ mpx_flags [port] |= FL_ALERT; /* set alert flag */ } break; @@ -1520,8 +1537,9 @@ switch (mpx_state) { /* dispatch if (buf_len (ioread, mpx_port, get) == 0) { /* buffer now empty? */ buf_free (ioread, mpx_port); /* free buffer */ - if (buf_avail (ioread, mpx_port) == 1) /* another buffer available? */ - mpx_flags [mpx_port] |= FL_HAVEBUF; /* indicate availability */ + if ((buf_avail (ioread, mpx_port) == 1) && /* one buffer remaining? */ + !(mpx_flags [mpx_port] & FL_RDFILL)) /* and not filling it? */ + mpx_flags [mpx_port] |= FL_HAVEBUF; /* indicate buffer availability */ } mpx_state = idle; /* idle controller */ @@ -1675,7 +1693,6 @@ const t_bool fast_binary_read = (mpx_cmd == CMD_BINARY_READ); /* fast binary r uint8 ch; int32 chx; -uint16 read_length; t_stat status = SCPE_OK; t_bool recv_loop = !fast_binary_read; /* bypass if fast binary read */ t_bool xmit_loop = !(fast_binary_read || /* bypass if fast read or output suspended */ @@ -1854,25 +1871,26 @@ while (recv_loop) { /* OK to process? */ recv_loop = TRUE; /* no termination */ } - if (recv_loop) /* no termination condition? */ + if (recv_loop) { /* no termination condition? */ buf_put (ioread, port, ch); /* put character in buffer */ - - read_length = buf_len (ioread, port, put); /* get current buffer length */ + mpx_charcnt [port]++; /* and count it */ + } if ((rt & RT_END_ON_CNT) && /* end on count */ - (read_length == mpx_charcnt [port])) { /* and count reached? */ + (mpx_charcnt [port] == mpx_termcnt [port])) { /* and termination count reached? */ recv_loop = FALSE; /* set termination */ mpx_param = 0; /* no extra termination info */ + mpx_charcnt [port] = 0; /* clear the current character count */ if (mpx_flags [port] & FL_ALERT) { /* was this alert for term rcv buffer? */ mpx_flags [port] &= ~FL_ALERT; /* clear alert flag */ - mpx_charcnt [port] = RD_BUF_LIMIT; /* reset character count */ + mpx_termcnt [port] = RD_BUF_LIMIT; /* reset termination character count */ } } - else if (read_length == RD_BUF_LIMIT) { /* buffer now full? */ - recv_loop = FALSE; /* set termination */ - mpx_param = mpx_param | RS_PARTIAL; /* and partial buffer flag */ + else if (buf_len (ioread, port, put) == RD_BUF_LIMIT) { /* buffer now full? */ + recv_loop = FALSE; /* set termination */ + mpx_param = mpx_param | RS_PARTIAL; /* and partial buffer flag */ } if (recv_loop) /* no termination condition? */ @@ -1887,7 +1905,7 @@ while (recv_loop) { /* OK to process? */ else if (rt & RT_END_ON_CHAR) fprintf (sim_deb, "character %s\n", fmt_char (ch)); else - fprintf (sim_deb, "count = %d\n", mpx_charcnt [port]); + fprintf (sim_deb, "count = %d\n", mpx_termcnt [port]); } if (buf_len (ioread, port, put) == 0) { /* zero-length read? */ @@ -2070,7 +2088,7 @@ return SCPE_OK; A direct attach to the poll unit is only allowed when restoring a previously saved session. - + The Telnet poll service routine is synchronized with the other input polling devices in the simulator to facilitate idling. */ @@ -2227,7 +2245,8 @@ for (i = 0; i < MPX_PORTS; i++) { /* clear per-line variab mpx_config [i] = (uint16) (SK_PWRUP_1 | i); mpx_rcvtype [i] = RT_PWRUP; /* power on config for echoplex */ - mpx_charcnt [i] = 0; /* default character count */ + mpx_charcnt [i] = 0; /* clear character count */ + mpx_termcnt [i] = 0; /* default termination character count */ mpx_flowcntl [i] = 0; /* default flow control */ mpx_flags [i] = 0; /* clear state flags */ mpx_enq_cntr [i] = 0; /* clear ENQ counter */ diff --git a/doc/hp2100_doc.doc b/doc/hp2100_doc.doc index 8d58d115ff8473e1816ce4959f0d360800374c21..13d16124587afbb12eb4ebafbb7ee60f4e1f3220 100644 GIT binary patch delta 37914 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 OE&Db8$}CsvWd8>~4zGRy delta 37689 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