From c4e55d0f6be9e548a00e713fd8d79f1a29e49ed3 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 12 Jan 2018 14:48:50 -0800 Subject: [PATCH] HP3000: HP 3000 release 7 See HP3000/hp3000_release.txt for details of the release --- HP3000/hp3000_atc.c | 257 +++++++++++++++++++++++++++----------- HP3000/hp3000_defs.h | 6 +- HP3000/hp3000_io.h | 18 +-- HP3000/hp3000_release.txt | 77 +++++++++++- doc/hp3000_doc.doc | Bin 393216 -> 404992 bytes 5 files changed, 271 insertions(+), 87 deletions(-) diff --git a/HP3000/hp3000_atc.c b/HP3000/hp3000_atc.c index a49ef9bd..68aa1e9f 100644 --- a/HP3000/hp3000_atc.c +++ b/HP3000/hp3000_atc.c @@ -26,6 +26,9 @@ ATCD,ATCC HP 30032B Asynchronous Terminal Controller + 18-Dec-17 JDB Return event time instead of status from "activate_unit" + 11-Dec-17 JDB Reschedule "line_service" if receive buffer has data + 26-Oct-17 JDB Call "tmxr_poll_tx" if transmit buffer is full 05-Sep-17 JDB Changed REG_A (permit any symbolic override) to REG_X 16-Sep-16 JDB Fixed atcd_detach to skip channel cancel if SIM_SW_REST 12-Sep-16 JDB Changed DIB register macro usage from SRDATA to DIB_REG @@ -783,7 +786,7 @@ static void tci_master_reset (void); static t_stat line_service (UNIT *uptr); static t_stat poll_service (UNIT *uptr); -static t_stat activate_unit (UNIT *uptr, ACTIVATOR reason); +static int32 activate_unit (UNIT *uptr, ACTIVATOR reason); static uint32 service_time (HP_WORD control, ACTIVATOR reason); static void store (HP_WORD control, HP_WORD data); static void receive (int32 channel, int32 data, t_bool loopback); @@ -1724,6 +1727,7 @@ tdi_master_reset (); /* perform a master rese if (sim_switches & SWMASK ('P')) { /* if this is a power-on reset */ sim_rtcn_init (poll_unit.wait, TMR_ATC); /* then initialize the poll timer */ fast_data_time = FAST_IO_TIME; /* restore the initial fast data time */ + atcd_ldsc [0].xmte = 1; /* enable transmission on the system console port */ } if (atc_is_polling) { /* if we're polling for the simulation console */ @@ -1826,6 +1830,14 @@ return status; unit 16 if it is attached. In all cases, it is imperative that we not reject the request for unit 16; otherwise any remaining device detaches will not be performed. + + + Implementation notes: + + 1. Detaching the multiplexer resets each line first, which flushes the + output buffer. This ensures that buffered data that has not been output + via a poll_service entry before the DETACH command was issued is written + before the line is disconnected. */ static t_stat atcd_detach (UNIT *uptr) @@ -1976,8 +1988,9 @@ return; The channel service routine runs only when there are characters to read or write. It is scheduled either at a realistic rate corresponding to the programmed baud rate of the channel to be serviced, or at a somewhat faster - optimized rate. It is entered when a channel buffer is ready for output or - when the poll routine determines that there are characters ready for input. + optimized rate. It is entered when a channel buffer is ready for output, + when the poll routine determines that there are characters ready for input, + or while waiting for an ACK to complete an ENQ/ACK handshake. On entry, the receive channel buffer is checked for a character. If one is not already present, then the terminal multiplexer library is called to @@ -1985,6 +1998,12 @@ return; processed. If the receive channel has its "diagnose" bit set, the character is also passed to the auxiliary channels. + If a received character is not available, then the unit's "wait" field is + checked to see if an ACK is expected in reply to an earlier ENQ. If a wait + time is present, it is doubled, and the service is rescheduled. However, if + the new wait time is longer than the current poll time, service rescheduling + is abandoned in favor of the normal poll for received characters. + The send channel buffer is then checked for a character to output. If one is present, then if it is an all-mark (sync) character, it is discarded, as the receiver would never see it. Otherwise, if the TDI is in diagnostic mode, @@ -1999,18 +2018,36 @@ return; simulation console (if output is to channel 0) or to the terminal multiplexer library for output via Telnet or a serial port on the host machine. If the channel has its "diagnose" bit set, the character is also passed to the - auxiliary channels. + auxiliary channels. If an ENQ was transmitted, service is rescheduled to + wait for reception of the ACK. If the data flag is clear, the indicated receive and send channels are checked for completion flags. If either is set, an interrupt is requested. + If characters remain in the Telnet receive buffer, the service routine is + rescheduled to receive the next one. Otherwise, the routine goes idle until + the next character is output or the next poll determines that there are + characters to receive. + Implementation notes: - 1. Calling "tmxr_getc_ln" for channel 0 is OK, as reception is disabled by + 1. The "wait" fields of the channel units are not used (i.e., are set to + zero) except when channels are waiting for ACKs. Because we want to + retrieve the ACK as quickly as possible but also minimize the load on the + host system, we initially wait the normal reception time (fast or + realistic) and then double the wait each time it expires without + reception. Therefore, a non-zero "wait" value indicates that an ACK is + expected. + + 2. Receipt of any character cancels a pending ACK wait, even though it is + possible that the character is not an ACK (for example, if the character + was received but not processed before the ENQ was sent). + + 3. Calling "tmxr_getc_ln" for channel 0 is OK, as reception is disabled by default and therefore will return 0. - 2. The send channel buffer will always be non-zero if a character is present + 4. The send channel buffer will always be non-zero if a character is present (even a NUL) because the data word will have DDS_IS_SEND set. The receive buffer will always be non-zero if a character is present @@ -2019,27 +2056,45 @@ return; TMXR_VALID set, and characters looped back from sending will have DDS_IS_SEND set. - 3. Reception of a loopback character is performed immediately because the + 5. Reception of a loopback character is performed immediately because the reception occurs concurrently with transmission. Reception of a locally generated ACK is scheduled with a one-character delay to reflect the remote device transmission delay. - 4. If storing an ACK locally overwrites a character already present but not + 6. If storing an ACK locally overwrites a character already present but not yet processed, then the receive routine will set the character lost flag. - 5. Both TMXR_VALID and SCPE_KFLAG are set on internally generated ACKs only + 7. Both TMXR_VALID and SCPE_KFLAG are set on internally generated ACKs only so that a debug trace will record the generation correctly. - 6. The console library "sim_putchar_s" routine and the terminal multiplexer - library "tmxr_putc_ln" routine return SCPE_STALL if the Telnet output - buffer is full. In this case, transmission is rescheduled with a delay - to allow the buffer to drain. + 8. The console library "sim_putchar_s" routine and the terminal multiplexer + library "tmxr_putc_ln" routine return SCPE_STALL if they are called when + the transmit buffer is full. When called to add the last character to + the buffer, the routines return SCPE_OK but also change the "xmte" field + of the terminal multiplexer line (TMLN) structure from 1 to 0 to indicate + that further calls will be rejected; the value is set back to 1 when the + transmit buffer empties. - They also return SCPE_LOST if the line has been dropped on the remote - end. We ignore the error here to allow the simulation to continue while - ignoring the output. + Entry with the transmit buffer full causes the service to be rescheduled + to retry the write after a short delay. The "tmxr_poll_tx" routine must + be called in this case, as it is responsible for transmitting the buffer + contents and therefore freeing space in the buffer. - 7. The receive/send completion flag (buffer flag) will not set unless the + Both library "put" routines also return SCPE_LOST if the line has been + dropped on the remote end. We ignore that error here to allow the + simulation to continue while ignoring the output to a disconnected + terminal. + + 9. Characters written using "tmxr_putc_ln" are buffered and not transmitted + until the buffer is full, the character is an ENQ (and so we will be + waiting to receive an ACK), or the next input poll is performed. The + last case ensures that the buffer is flushed when output is complete, as + there is no indication from the CPU that the last character has been + sent. This does incur a delay of up to 10 milliseconds, but this is + imperceptible by the user. Buffering offers significantly better + throughput compared to transmitting each character as it is written. + + 10. The receive/send completion flag (buffer flag) will not set unless the interrupt enable flag for that channel is also set. If enable is not set, the completion indication will be lost. */ @@ -2058,18 +2113,36 @@ dprintf (atcd_dev, DEB_SERV, "Channel %d service entered\n", /* Reception service */ -recv_data = recv_buffer [channel]; /* get the current buffer character */ +recv_data = recv_buffer [channel]; /* get the current buffer character */ -if (recv_data == 0) /* if there's none present */ - recv_data = tmxr_getc_ln (&atcd_ldsc [channel]); /* then see if there's a character ready via Telnet */ +if (recv_data == 0) { /* if no character is present */ + if (uptr->wait) /* then if the channel is waiting for an ACK */ + tmxr_poll_rx (&atcd_mdsc); /* then poll the line to see if it has arrived */ -if (recv_data & ~DDR_DATA_MASK) { /* if we now have a valid character */ - receive (channel, recv_data, loopback); /* then process the reception */ - - if (recv_param [channel] & DPI_DIAGNOSE) /* if a diagnosis is requested */ - diagnose (recv_param [channel], recv_data); /* then route the data to the auxiliary channels */ + recv_data = tmxr_getc_ln (&atcd_ldsc [channel]); /* see if there's now a character ready */ } +if (recv_data & ~DDR_DATA_MASK) { /* if we now have a valid character */ + receive (channel, recv_data, loopback); /* then process the reception */ + + if (recv_param [channel] & DPI_DIAGNOSE) /* if a diagnosis is requested */ + diagnose (recv_param [channel], recv_data); /* then route the data to the auxiliary channels */ + + uptr->wait = 0; /* clear any pending ACK wait */ + } + +else if (uptr->wait) { /* otherwise if an ACK is expected but has not arrived */ + uptr->wait = uptr-> wait * 2; /* then double the wait time for the next check */ + + if (uptr->wait < poll_unit.wait) { /* if the wait is shorter than the standard poll wait */ + sim_activate (uptr, uptr->wait); /* then reschedule the line service */ + + dprintf (atcd_dev, DEB_SERV, "Channel %d delay %d service rescheduled for ACK\n", + channel, uptr->wait); + } + } + + /* Transmission service */ if (send_buffer [channel]) { /* if data is available to send */ @@ -2133,43 +2206,56 @@ if (send_buffer [channel]) { /* if data is availa cvtd_data = sim_tt_outcvt (LOWER_BYTE (send_data), /* so convert it as directed */ TT_GET_MODE (uptr->flags)); /* by the output mode flag */ - if (cvtd_data >= 0) /* if the converted character is printable */ - if (channel == 0) /* then if we are writing to channel 0 */ - result = sim_putchar_s (cvtd_data); /* then output it to the simulation console */ - else /* otherwise */ - result = tmxr_putc_ln (&atcd_ldsc [channel], /* output it to the multiplexer line */ - cvtd_data); - - if (result == SCPE_STALL) { /* if the buffer is full */ + if (cvtd_data >= 0 && atcd_ldsc [channel].xmte == 0) { /* if it's printable but the transmit buffer is full */ activate_unit (uptr, Stall); /* then retry the output a while later */ - result = SCPE_OK; /* and return OK to continue */ + + tmxr_poll_tx (&atcd_mdsc); /* transmit the line buffer */ + + dprintf (atcd_dev, DEB_XFER, "Channel %d character %s transmission stalled for full buffer\n", + channel, fmt_char (cvtd_data)); } - else if (result == SCPE_OK || result == SCPE_LOST) { /* otherwise if the character is queued to transmit */ - tmxr_poll_tx (&atcd_mdsc); /* then send (or ignore) it */ + else { /* otherwise the character will be consumed */ + if (cvtd_data >= 0) /* if the converted character is printable */ + if (channel == 0) /* then if we are writing to channel 0 */ + result = sim_putchar_s (cvtd_data); /* then output it to the simulation console */ - if (DPRINTING (atcd_dev, DEB_XFER)) - if (result == SCPE_LOST) - hp_debug (&atcd_dev, DEB_XFER, "Channel %d character %s discarded by connection loss\n", - channel, fmt_char (char_data)); + else { /* otherwise */ + result = tmxr_putc_ln (&atcd_ldsc [channel], /* output it to the multiplexer line */ + cvtd_data); - else if (cvtd_data >= 0) - hp_debug (&atcd_dev, DEB_XFER, "Channel %d character %s sent\n", - channel, fmt_char (cvtd_data)); + if (char_data == ENQ /* if sending an ENQ */ + || atcd_ldsc [channel].xmte == 0) /* or the output buffer is full */ + tmxr_poll_tx (&atcd_mdsc); /* then transmit the line buffer */ + } - else - hp_debug (&atcd_dev, DEB_XFER, "Channel %d character %s discarded by output filter\n", - channel, fmt_char (char_data)); + if (result == SCPE_OK || result == SCPE_LOST) { /* if the character is queued to transmit */ + if (DPRINTING (atcd_dev, DEB_XFER)) + if (result == SCPE_LOST) + hp_debug (&atcd_dev, DEB_XFER, "Channel %d character %s discarded by connection loss\n", + channel, fmt_char (char_data)); - if (send_param [channel] & DPI_DIAGNOSE) /* if a diagnosis is requested */ - diagnose (send_param [channel], send_data); /* then route the data to the auxiliary channels */ + else if (cvtd_data >= 0) + hp_debug (&atcd_dev, DEB_XFER, "Channel %d character %s sent\n", + channel, fmt_char (cvtd_data)); - send_buffer [channel] = 0; /* clear the buffer */ + else + hp_debug (&atcd_dev, DEB_XFER, "Channel %d character %s discarded by output filter\n", + channel, fmt_char (char_data)); - if (send_param [channel] & DPI_ENABLE_IRQ) /* if this channel is enabled to interrupt */ - send_status [channel] |= DST_COMPLETE; /* then set the completion flag */ + if (send_param [channel] & DPI_DIAGNOSE) /* if a diagnosis is requested */ + diagnose (send_param [channel], send_data); /* then route the data to the auxiliary channels */ - result = SCPE_OK; /* return OK in case the connection was lost */ + send_buffer [channel] = 0; /* clear the buffer */ + + if (send_param [channel] & DPI_ENABLE_IRQ) /* if this channel is enabled to interrupt */ + send_status [channel] |= DST_COMPLETE; /* then set the completion flag */ + + if (cvtd_data == ENQ && result == SCPE_OK) /* if an ENQ was successfully sent */ + uptr->wait = activate_unit (uptr, Receive); /* then schedule the ACK reception */ + + result = SCPE_OK; /* return OK in case the connection was lost */ + } } } } @@ -2178,6 +2264,9 @@ if (send_buffer [channel]) { /* if data is availa if (tdi_data_flag == CLEAR) /* if an interrupt is not currently pending */ scan_channels (channel); /* then scan the channels for completion flags */ +if (tmxr_rqln (&atcd_ldsc [channel])) /* if characters are still available on this channel */ + activate_unit (uptr, Receive); /* then reschedule the line service */ + return result; /* return the result of the service */ } @@ -2185,10 +2274,9 @@ return result; /* return the result of /* Multiplexer poll service. The poll service routine is used to poll for Telnet connections and incoming - characters. It also polls the simulation console for channel 0. Polling - starts at simulator startup or when the TDI is enabled and stops when it is - disabled. - + characters. It also polls the simulation console for channel 0 and flushes + the output buffers for all channels. Polling starts at simulator startup or + when the TDI is enabled and stops when it is disabled. Implementation notes: @@ -2201,20 +2289,30 @@ return result; /* return the result of may be shorter than the channel service time, and as the console provides no buffering, a second character received before the channel service had been entered would be lost. + + 3. A channel that is waiting for an ACK to complete an ENQ/ACK handshake has + its unit "wait" field set non-zero. If the field value is greater than + the realistic reception time, then the line service is scheduled + immediately, as the channel has already waited the minimum time necessary + (the "wait" field value is doubled each time the line service is entered + before the ACK has been received). Otherwise, the service is scheduled + using the normal reception time. */ static t_stat poll_service (UNIT *uptr) { -int32 chan, line_state; +int32 chan, line_state; t_stat status = SCPE_OK; -dprintf (atcd_dev, DEB_PSERV, "Poll service entered\n"); +dprintf (atcd_dev, DEB_PSERV, "Poll delay %d service entered\n", + uptr->wait); if ((atcc_dev.flags & DEV_DIS) == 0) - dprintf (atcc_dev, DEB_PSERV, "Poll service entered\n"); + dprintf (atcc_dev, DEB_PSERV, "Poll delay %d service entered\n", + uptr->wait); if ((atcd_dev.flags & DEV_DIAG) == 0) { /* if we're not in diagnostic mode */ - chan = tmxr_poll_conn (&atcd_mdsc); /* then check for a new multiplex connection */ + chan = tmxr_poll_conn (&atcd_mdsc); /* then check for a new multiplexer connection */ if (chan != -1) { /* if a new connection was established */ atcd_ldsc [chan].rcve = TRUE; /* then enable the channel to receive */ @@ -2224,7 +2322,8 @@ if ((atcd_dev.flags & DEV_DIAG) == 0) { /* if we're not in diagn } } -tmxr_poll_rx (&atcd_mdsc); /* poll the multiplex connections for input */ +tmxr_poll_tx (&atcd_mdsc); /* flush the multiplexer output buffers */ +tmxr_poll_rx (&atcd_mdsc); /* and poll the multiplexer connections for input */ if ((atcc_dev.flags & (DEV_DIAG | DEV_DIS)) == 0) /* if we're not in diagnostic mode or are disabled */ for (chan = FIRST_TERM; chan <= LAST_TERM; chan++) /* then scan the channels for line state changes */ @@ -2258,9 +2357,15 @@ if (status >= SCPE_KFLAG) { /* if a character was pr line_service (&line_unit [0]); /* run the system console's I/O service */ } -for (chan = FIRST_TERM; chan <= LAST_TERM; chan++) /* check each of the receive channels for available input */ - if (tmxr_rqln (&atcd_ldsc [chan])) /* if characters are available on this channel */ - activate_unit (&line_unit [chan], Receive); /* then activate the channel's I/O service */ +for (chan = FIRST_TERM; chan <= LAST_TERM; chan++) /* check each of the channels for available input */ + if (tmxr_rqln (&atcd_ldsc [chan])) /* if characters are available on this channel */ + if (line_unit [chan].wait > line_unit [chan].recv_time) { /* then if the channel is waiting for an ACK */ + sim_cancel (&line_unit [chan]); /* then cancel any current wait */ + activate_unit (&line_unit [chan], Loop); /* and activate the line service immediately */ + } + + else /* otherwise this is a normal input */ + activate_unit (&line_unit [chan], Receive); /* so schedule with the normal receive timing */ if (cpu_is_calibrated) /* if the process clock is calibrated */ uptr->wait = sim_activate_time (cpu_pclk_uptr); /* then synchronize with it */ @@ -2292,7 +2397,7 @@ return status; /* return the service st called. */ -static t_stat activate_unit (UNIT *uptr, ACTIVATOR reason) +static int32 activate_unit (UNIT *uptr, ACTIVATOR reason) { const int32 channel = (int32) (uptr - line_unit); /* the channel number */ int32 delay = 0; @@ -2340,7 +2445,8 @@ else /* otherwise, we are in dprintf (atcd_dev, DEB_SERV, "Channel %d delay %d service scheduled\n", channel, delay); -return sim_activate (uptr, delay); /* activate the unit and return the activation status */ +sim_activate (uptr, delay); /* activate the unit */ +return delay; /* and return the activation delay */ } @@ -2640,17 +2746,20 @@ else { /* otherwise a normal ch recv_buffer [channel] = recv_data | pad; /* and replace the character in the buffer */ } - if (recv_param [channel] & DPI_ENABLE_ECHO) { /* if the channel has echo enabled */ - char_echo = sim_tt_outcvt (recv_data, /* then convert the character per the output mode */ + if (recv_param [channel] & DPI_ENABLE_ECHO) { /* if the channel has echo enabled */ + char_echo = sim_tt_outcvt (recv_data, /* then convert the character per the output mode */ TT_GET_MODE (line_unit [channel].flags)); - if (char_echo >= 0) { /* if the converted character is valid for the mode */ - if (channel == 0) /* then if this is for channel 0 */ - sim_putchar (char_echo); /* then write it back to the simulation console */ + if (char_echo >= 0) { /* if the converted character is valid for the mode */ + if (channel == 0) /* then if this is for channel 0 */ + sim_putchar (char_echo); /* then write it back to the simulation console */ - else { /* otherwise */ - tmxr_putc_ln (&atcd_ldsc [channel], char_echo); /* write it to the multiplexer output line */ - tmxr_poll_tx (&atcd_mdsc); /* and poll to transmit it now */ + else { /* otherwise */ + tmxr_putc_ln (&atcd_ldsc [channel], /* write it to the multiplexer output line */ + char_echo); + + if (atcd_ldsc [channel].xmte == 0) /* if the output buffer is full */ + tmxr_poll_tx (&atcd_mdsc); /* then transmit the line buffer */ } dprintf (atcd_dev, DEB_XFER, ("Channel %d character %s echoed\n"), diff --git a/HP3000/hp3000_defs.h b/HP3000/hp3000_defs.h index 33313bd7..dbf98aaf 100644 --- a/HP3000/hp3000_defs.h +++ b/HP3000/hp3000_defs.h @@ -1,6 +1,6 @@ /* hp3000_defs.h: HP 3000 simulator general declarations - Copyright (c) 2016, J. David Bryan + Copyright (c) 2016-2017, J. David Bryan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23,7 +23,8 @@ in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the author. - 29_Dec-16 JDB Changed the status mnemonic flag from REG_S to REG_T + 16-Oct-17 JDB Suppressed logical-not-parentheses warning on clang + 29-Dec-16 JDB Changed the status mnemonic flag from REG_S to REG_T 20-Nov-16 JDB Added mapped memory access classes 24-Oct-16 JDB Added half-byte definitions for CIS decoding 10-Oct-16 JDB Moved ACCESS_CLASS definition here from hp3000_cpu.h @@ -134,6 +135,7 @@ */ #if defined (__clang__) + #pragma clang diagnostic ignored "-Wlogical-not-parentheses" #pragma clang diagnostic ignored "-Wlogical-op-parentheses" #pragma clang diagnostic ignored "-Wbitwise-op-parentheses" #pragma clang diagnostic ignored "-Wshift-op-parentheses" diff --git a/HP3000/hp3000_io.h b/HP3000/hp3000_io.h index 35332635..e31b534e 100644 --- a/HP3000/hp3000_io.h +++ b/HP3000/hp3000_io.h @@ -321,15 +321,15 @@ struct dib { /* the Device Information Block }; #define DIB_REGS(dib) \ -/* Macro Name Location Width Flags */ \ -/* ------ ------- -------------------------- ----- ------- */ \ - { DRDATA (DIBDN, dib.device_number, 32), REG_HRO }, \ - { DRDATA (DIBSRN, dib.service_request_number, 32), REG_HRO }, \ - { DRDATA (DIBPRI, dib.interrupt_priority, 32), REG_HRO }, \ - { ORDATA (DIBMASK, dib.interrupt_mask, 32), REG_HRO }, \ - { ORDATA (DIBIRQ, dib.interrupt_request, 32), REG_HRO }, \ - { ORDATA (DIBACT, dib.interrupt_active, 32), REG_HRO }, \ - { ORDATA (DIBSR, dib.service_request, 32), REG_HRO } +/* Macro Name Location Width Flags */ \ +/* ------ ------- -------------------------- ----- ------- */ \ + { DRDATA (DIBDN, dib.device_number, 32), REG_HRO }, \ + { DRDATA (DIBSRN, dib.service_request_number, 32), REG_HRO }, \ + { DRDATA (DIBPRI, dib.interrupt_priority, 32), REG_HRO }, \ + { ORDATA (DIBMASK, dib.interrupt_mask, 32), REG_HRO }, \ + { ORDATA (DIBIRQ, dib.interrupt_request, 32), REG_HRO }, \ + { ORDATA (DIBACT, dib.interrupt_active, 32), REG_HRO }, \ + { ORDATA (DIBSR, dib.service_request, 32), REG_HRO } /* Calibrated timer numbers */ diff --git a/HP3000/hp3000_release.txt b/HP3000/hp3000_release.txt index 07af60e5..04a83ca2 100644 --- a/HP3000/hp3000_release.txt +++ b/HP3000/hp3000_release.txt @@ -1,6 +1,6 @@ SIMH/HP 3000 RELEASE NOTES ========================== - Last update: 2017-09-07 + Last update: 2018-01-12 This file documents the release history of the Hewlett-Packard 3000 simulator. @@ -47,7 +47,7 @@ General Information The simulator passes the HP 32230 offline diagnostic suite with some expected failures due to unimplemented features. For example, the disc diagnostic error-correction logic tests and the tape diagnostic CRCC and LRCC tests fail, -as these features are not supported. However, all features that are required +as these features are not simulated. However, all features that are required for MPE operation pass their respective diagnostic tests. The simulator has been tested with MPE-V/R version E.01.00. Specifically: @@ -176,6 +176,79 @@ the MPE version used: +===================== +Release 7, 2018-01-12 +===================== + +This release of the HP 3000 simulator adds the following features: + + - Reading and writing to terminal sessions connected to the ATC have been + improved significantly. File uploads via Telnet using the Reflection + terminal emulator are now over 100 times faster than before, e.g., the + transfer time for a one-megabyte file has decreased from 69 minutes to 30 + seconds. Block mode reads show similar speed improvements. Copy-and-paste + into the terminal window, Reflection file downloads, and output to the + terminal window in REMOTEACK mode show speed improvements of five to fifteen + times. Output in LOCALACK mode has been improved by around 50%. + + - Information regarding Reflection file transfers and serial port disconnection + options has been added to Section 4.1.1, "Terminal Data Interface," of the HP + 3000 Simulator User's Guide. + + +-------------------- +Implementation Notes +-------------------- + + - File transfer using the Reflection terminal emulator requires an 8-bit data + path. To achieve this, the session must use MPE terminal type 12 (this may + be configured either during a system reload or by specifying the TERM=12 + parameter when logging on with :HELLO), and the channel must be set to 8B, + REMOTEACK, and NOCAPSLOCK modes. Note that MPE's default terminal type 10 + writes 7-bit data with odd parity, and characters with the parity bit on may + be displayed by the terminal emulator as extended characters in the Roman-8 + symbol set. To avoid a garbled display when using the TERM=12 parameter to + override the default, the channel should be set to 8B mode after logging on + and back to 7B after logging off. + + - The MPE-V/R software kit has been updated to increase the number of terminal + buffers per port from 3 to 5. Using the default of 3 may cause the system + to report "MPE Table TBUF has overflowed!!!" to the system console while + performing Reflection file uploads. + + +---------- +Bugs Fixed +---------- + + 1. PROBLEM: Serial port output stalls are not handled properly. + + VERSION: Release 6. + + OBSERVATION: The ATCD device supports I/O via host serial ports as well as + via Telnet connections. While output via Telnet works correctly, output + via serial ports fails. Attempting to output to the ATCD results in a few + characters written, and then the line hangs. Sometimes pressing ENTER at + the system console (ATCD channel 0) causes a few more characters to appear + on the serial terminal. Eventually, the line hangs permanently. + + CAUSE: The terminal multiplexer library (sim_tmxr.c, part of the SIMH + framework) had provided a 256-byte output buffer for each line, independent + of the connection type (Telnet or serial). The library was changed to + reduce the serial buffer size to one byte. If the library output routine + receives the second character before the first one has been written to the + serial port, it returns SCPE_STALL status to indicate a buffer overflow. + The ATCD simulation correctly responds to this status by rescheduling the + output attempt. However, it fails to call the "tmxr_poll_tx" routine to + write to the serial port, so the rescheduled attempt fails as well. + + RESOLUTION: Modify "line_service" (hp3000_atc.c) to call "tmxr_poll_tx" if + a buffer overflow occurs. + + STATUS: Fixed in Release 7. + + + ===================== Release 6, 2017-09-07 ===================== diff --git a/doc/hp3000_doc.doc b/doc/hp3000_doc.doc index e160d23d994d0ab034e398c16c19c7d30b751632..84fa9fa1cbd2579defd95cfd25bd6b9225118be7 100644 GIT binary patch delta 64815 zcmcfK2S5}@|M2lGXNe`2s8Ixhy+pB>7-R1Zdyj&GiXtFjFK6!s>)6E-yT*R@uCa^V zSW%N`>?X!2YJ9(Q$DAB7dBpgCO+GMt?Cs9Z{APA`Z+CCtz{~@$WR5IQHkqbr=}msf ze`z%>18JS)UvJ*LkuRlWIu%mmQ=~y!q=PNpt0dF)Nrt;|Bg14*BS(fdNwiyIb-SPc zl1tIFtdpA@PzvaJ#zeAd6+TEm@)}pnhy<$O4 z+AtHp8+Oq&7Na%hxBT}$zjJC@CaqM6raff=Uv|^9xxBF#3#cge98U6Civ6kVi_)63 z73oqMnXD=6Xqx{gnkMrg|21jr`dhwL{_F2+|D|PMUinY`R@>ru)v;~W3p%!4zNX%n z@V8vg6iv%vU(iyvQY}bjP)#@NV$bO0OGets3oKswRR(3@s1?jj@^(d8J80T?{*b%# zZt*yN8B`ghhBUe?(wtPylZT4i0E9-`YJmFhb5>G2F{9*ejryUswKKz)LQ_N~5?1 zIM>8Hq=P#KSp&R^6)sxzt4dx~0>j&T)eL6k9sI~~L?^!pwe)bW?x9{0AzlH29XmyM z`G*De2#{;45z;fDM?hEsxvT&(;;$AJmnoJnv*PFP9~coB66_b`vH-8ZaIfHy)Ddc% z0{p#Gub*Bta9LVj>P<0qm8*{k3kjOM=aGkKdr9~Dq;k!M$%>RrHZ7T~f)0~nlCIxy zrLO*|R$r^6Rn+QfwY6kg@yQLYX8pX87NB+1y7Dtvi_pCIyC118lZ#yaJZlxL4)Yb! zO7gQboF=v8>u)2R)eZB^NTXrM4YOTH2 zg?H8^6-FvR3zM1svJtN&%!}*%0c>Un@9AydxJFt-<}Vg6SI)Wl`)7r`w93rg-CiuL zgZYwaE#bPgZ{I_Klx1_?y}{1e{(Y0phFZnR*=}Tqx?Ro}Tw@Dx8`N~=?kSLD`^9v5|K(pvBgVr9?4Ffs^5%|QF z7a`j<&>mj)W)u?U6&BE~dteyth43p~uw5WQ>lfkY73vq!iMVYX;ze5wBz9R+V7Q}= zga^>xSXkHY;SsDRz^iWksw`QQ%Au!DR@5u6oOAMx9iLeP0%=lVUjE&~?D4H)H7p<~ z#LwT0mAC8d6&@PUKCnY?mDk2q8`k}%NKw`w=GQeqHt(LD0)oAQLOOPov#{2lEYzz^ zjjDC(_~fHK(UfGnr4yia2RZW8j(#E_!YeoJuymyYUJa|(^=VwSV&&S7+3WdKu2{cO z9iPgzy}E|@2ZY=5=hOS?<-NSBkt5kY!vbl4s$qr%J2sl`rmI|8&%mG{+I2{%T6M5j zm|tLcfY?z^&r&leFgW0A+5Y|MA{_mVJ$rErl^s$6y1Mp3-Th^W26#=Y>=n)y(ccA9 zJ90xD>#=>8UvKq^@JeZ<-Bes(cP(v(k{MH{PW@T^iq)%nd1WY-QS3=?c-pR|H*$Pp zD_lHDwElnbQ?CDnO?Nlud0Q72)wFfkjXfw>O4B-F%vYK=5u0!k-OFg&RFo^LY30!b zP0;}z(HH$N4=XY78{Utf%4u4X@|xBjeb67{FaeXxv!9zrVlkFs71m%6_TvzambX=^ zZ5YX{my2lH6%-_w)leNO*GY>pO2ANT#9h4j?cwd1E9Xue*|&Z3+U1Mq&lZzL4jIrp zqO)&P_U(>;=?!-+Y5mwYZ<1TIPxKUW7^K->8{~YA@rV62tCn=7^F{WnaWlSgzQ)c| z(~=umw4_yDGHSA?syb6UovB?iWnalfQpuCZ6*G*AdvCs1>b?1$si4=qCMq>D&gXu= zLJ;K|8}&s@AB&q9-`Hp+JW?8IMEWMi!*cNp=pKc%u!N>90=oju9R;X*83HxY5i%4e zVH!j!@i@2PE><=*Qj2I$mmdZHG*id>!>nk-&DgeGL`ECAjFHFW&MJ%eqM32sn#^5G zky}ey&7!3l8f|E4WKAVLBbv6C3?0T1Ji=4_0k_hc_65994pmSUf#_aZ%ck`pF$*uB zJ-Huq`TWU4`*&B*B)MJZ+4QK^2; zR6A$NjWBThH7h9(K~6p}ht3QxE1g->mXp)-xQSc%gr=D3E0L|0;UW6AH1fzFzl!Lw zrbSF>WpuO3En9|nzfaRX=lx~igZgNIc{J-NT*74(rP(bG;MU#3|8vkr-+Zpxrs#-ErPdb2O#8gHm&D4{mNIH%Q54q9r zpCb`Eh1#j1nk|=lHxGneZoWkRRUoB!G3G1j?Z@>LRHh2bo$`aT}u4aLs^iB_JXu7L5B>anF_VuU5LXtUq=R4*>NMVOAX2pVao60;*{+VW2# zD0z}Bj+r{WeS;|D#!Ll2XYY72jHaL9$LgGBN<+^gMjS9|i>Doog4Rs3U3_R(Wpqr# zN;sl~o|d!FORC3X} zD?g4EF^jd8EilEuZI5gO1yB&)n29Vk*$d(GTAH>M+i(N%$jJC&>zaN4mN+ef*9&ba->oj~3YN_dANy!}>LW_io|;C=tryFA z-*v^lZ8Dm6@R(@RgYfQOl2{)XZ$dnHMbB~aA)P{G52J@;@7%bjQNU47(|Q_#;(E9x zg*AoDe|wC^1LUF`E`>IjfGqUFIZ+d>u@Cz(o8EUV8hp#x8fEB#zs6(fVff4*?~_@S*EKeG?8#*Z3m?bAK9O9#K!^=fLi^?i&wI=!5c zy`=kxWN*9h>1AZG)$3)f(}O=oej~|qia>_r7=T~k)0qfG2~H!*Q;FqJwTsC1+RP^i z)YRhJNsP_r{bIO@(Bh=tPFCp8YlUAke6t7i7ad8dzor&URus{P7!{AV8Og04j$wf8 zjIzq2d;hF(Y)O_{BLtxs27&3AAqCNCVF8w5Ido6PhcX6CXr8f>i6z5hq3XunelPw@xZbQRee81A-OLyb+kl|V}H zS332sRC6!~9LP*f$lCHkK@^9oxr(HlLDgUv(u1LDasuh)P&K-d^jVz4i$5OUyL$1A zenJc?YGg3$5L~N<8x3_%!!q7)&B+Mo9!;K^@MuGx5}z-*bE+&>c^i3bQ6mjsz08MX z^*q_V6=E+mQMiGT+SY!wF-Nz`t#JH_5+XjoCH~r=7i6ps!(=SRMjV5R-!r7o;R1ey zisu;8H}MmGfr{@3q#xl4TV5TzdrH(z4&2;C%y`Q7;CQ2qp8tI}WJPh&AkxSsA|vU0 zoj+_nB8|~{z4%-DJ6o$-_AAnVfs@&q0oBq|kWPh9krt}uXD00yCejHbpRMO4W0Y={ zW%u8g$Qdk_>pabvrdwt1 z{(WvbFXmAlWgXH!Xn;mg9p|^CebEm7P#tM7>23%|cl5xE-|orMIJ$rL7BO_Jk=`Op zz_xZehxxiDBBvNxecUTE-^W|8Xf@4fV_P|sA}*nF(UUbChV1I6M9|Bj7+tvR>dT@s zWS1|y`xPRxhMC*eYPRv6Zk3ymm^Y7L0djvK_Z3GW_ZM_V%ss-NUDF< zZOhwJUj}8HvfCDMex8xHsl5ld?L2*Whm^bAzWOnK*vT$bo&kb^MltG3P&Ve37yA zvjS0XD_gdtlm(*1$nT6ipPg9r_7A4~!-+*=?{~&GvW?9(@>o4fG3MBX;}}mREWrxw z#~3PO9u~re=TwRwNpFWD7>{`71gP&giQ& ziE`+J0T_i9*obZT0l(rEv>7x_ltBjsV>Z6SVVuCvxR2B`X*sA29}Gq$mSGLf;8!a@ z+-ET^M0GSp2Lxl`Y!-|Mc#hz?oJd3dd7QIC9W;XtJ8=oO(L9P?5be+bozNK}2t%Ry z4Es=X0ei3d3&emW#^7=?j^hVFx@iovD5jF|g)Gue2!SeELE2HgqDX(Eq~qYE?hOVd zgm{>4m4TGFM!I%kZEobUMK3oB z>0#m7t5sA8iS^{(P0fV7H{S)^5*93rh^>nS@0#@; z+8Cy{{I`s%KtD~U?ZM9Pti-j7_iCh7%mROZ2vCX_sbW|Oh0wpuz|foy9Bi5)T<-pY`eA^6?Cy|gW+8$tBi>E&xXx=yK!1C zm#~8VEk84#)VMJ?h9HVvf zk&lhfbr$GWxiSAX_xLr8h0un0ma*Oe-JxQB0qOX0e}-ul`=7+ce`S7GK~=aD_a2a4 z-%r<1c^=!jWy7k)3+7CpGH&?bz7e5;?b@_x?Bj?+N^#FY#&jZTw~@2B<{@*RxcrE; z9nA)|A%~3qdO6uD-#2&1HZpQVD;s?tPT54{eomzO4zYY{>vY7Ju3L-q=h_HCcMRV| z<`9V~n1<Qml#Q6 zH8$WdqHzz8q3z@|M7Se6YQP6Q(F-AaH7x?$_c1KO&;xX(c#Nkg^aK4f1|MR>ko+)b zAdnWHVcHQZ?coR~1CB9n!d*N>?&G|MuTdUN(F%o5(Ai@Fw&MjpJ4u&{rf`d9_>D%V z7-%9Ir*Q^9;xcaF7VhJ<=zrW8VwI8f_qt-Sn<*Qlp`Zt15cW{ed+{Ky(Es4KNr9@u zFGN~ZKo`=g5*CqG74Z}4pJ6{g6?5M6*xntR*RNi-V3vp+HEcl7@Sp(BPx&~b_rM9x z8F5H5^PrKZyvHd5>BBQ7PW{3mV9YP{hVr5y5fjEIEN_2Y;WgXIXrqW;>3uii7dGV4 zc1`;e-3S^PS-ml8hhr$#_Ovlyx5~}^=Q-`M=nTd0dAAD3BcxSG-Y2cXQYZXWXnK%V z;aQV({1COD_`eV>taXfRw&=5Rv_18NQMi!DC>BNoc+ZvEyw9^cs+8EZ_a-;9(1k`~ zqk(MRCz5?{l(O}{XpGRUvI+ft4%#$LXCU&^biPD?n$7@Bq@_$kZdynlWGDJ_AR`f< z2~&vZsn{16-APY#1_5Q!0Q+zacaidpR!%E;hHAo6{D6B%cQ!6A?FZP0_s3m6B*&Da zM+_a*uXm5|&@P<<+O@U)e93Ur#lo{j-jH0I*|`5t*(TTWfG(e~e**Q7KkOe@Rk&*G zw#tV701qLHBspZUDw0;JPt5_@9DJZk^mRxm9wD)#iYW^y!SCgjTHO6AJbN|Ib4L#T~z zSb{?rM3EcDL{Z^}F!T&;R)C(cRlW-MIGS`7_bS4;|RMi)$HHEnPTw#+2cM`i6ID--_Pj z!cBSTw(pXW-I_ygax%!x&Ih^abx;=ruo$u!mf<)~VL4e?4YHt3#8k|Hc7;P1SdbLS zkpihu1NG4yEzufnt`JbZB-+6rGZBU5SdA-)!CgE=+N<BhA%oH2+OesTd@;& z@DR`O3OTQ_Lq%znMMPD8^uk~a#|CW0ejLIxyn^LATZ7Uli)yHa9vFOGRQlQ2S?LfZ z^B$Gle2$wgw~Wk+A6J_vW5PPOrYxu0&8mHT!^N0CqGwV6=Gt%|xDC8dhHDQQ{U zZ6HfpmhyC{l3q+&mi9`>5`X^q-mS}Lj_%vGe#PRs)5Z@U&?7j|uSEl+W<}eIJDkrK zt8N0KcnD~@>RdL}?I%?>& z2b>KHxo=F=t#XqR^JW=X*=3-hAyk0*la@i&88Xn8LIv9<($9Z)6x+^Ct7Wl`8q~WR z#nxC@e>2kCwmmee=wi?vBY*WQGKU|!5*gLovGb~!pTZm})@-n}lGg{P5=EXEC#^Cc zZ)ahM#I$MvPf5#05DVE5vJ=y)F%%~)8$=n%MiGVx$aXORvTY27Y#;0J{PCR_*AS80 z+CW&J8>wvDezR}uL!)r@EV2du_e|KTJ>?{1wSUTuYO%Y?nQXNOAzSWKsMf2|N@WX9 zdR@$aW>9e3Em_6rXGVp1r6;#6am#Y_2qjsr>J=)HmOVoa$lf6Wjvj*2BRv|izumog z>GY8UJ2tNRZqC%mk(}n}ML_Bn}N!&u%k9tUxV zE#6@1W!o9crG(bOydv`;|9S`~a26MF30Dw8zoT=6;KIPPy?M2fj$_3ff$V8Sc-MnjP2Ns zS1@m~4kSkkas^;uq+MCmBnrAmgb3R7{m6 zEn`Z?Q#Ht#db^jich~IY>|L0BFK02?%Z>O;cGfCX6SL?}EZ#L_WuH?;9No_C2=3ukcmw1JgztXWG zD{?^Y&MuxgerWIZ)tQzpnm2RuST5`75z@*3+otMbkprKaWhkBGX5o_Vb;w3yvlAsE z)0(-(gtT1O*s2Dff6taF`{a>poHLO>Y|&}W!n$|ja&PlaZ=Tkzlh`b^nQ9Z&<~6&^ zB>*^&Yj_Cb9@BV;-;nA)LnstPQTV|hi?9Sg;SN$fq(HN*F#cdh zjg zC8eWEu>fgRlC4O$#JZnG?>P(983-dW|gyl)m`#l*puEcW~TY}^1CrF$nX<2LWS<{7;%nSR#> z>}Mm6KBo%t%?p|@`eF>`AqwYk9+we=_$|jaFu#mZSr#9%s9#vzBfON0g&s@SiX=!1 zH)MquvLh#QA@=FRJ3qx-xp?~6L3t3GdG3sf@+dUOzjfm}@yp$Iz}x&v7gKVZg{)b3 z(B-XQJLUEshZ`$&hX-;X7rsOxl!Yvh@{ncH2C`iGLzc}r$TCrxR++3q=4zoQ24EdF z;aseh0wnP}Vv+SFTZCF@fZiB@K^Tlk2+YPDEXNugMKtc3Y3DrgK}%*AqSz$To< zP28`^kB3P6nuA|l#3h)2(Pbb5GNKR)qm!X)JuwJNVZ#qNX^3hC&8@j*B>eB{lNZOj zi^yOu9`Y${uG3}Zsj`Y+p_O@EmEDR(BD%CmcTv>bt6Swe;{UY{(>|z=9#ADci1bhl z!&<14-%NTNw&N_$K~}_7Tt^IkgRGe6zdyKro2=~j%aYI+a_)U)Hby_b#c9X&J~Wpyd|u%%yn!2Guwtye z%tXCvW(nJ@(q@2eRgso(Ruy?Ud0TGeK~1PgY(%;VnxYp}WDX=PBXbBQKt-ryNEz=W zn*D4LL+$BidfT2dW;tDaxyO>fN$zKF-lW#E$lQLcEUefbf2+%y9rU{KGB%U6Y&vtX z45|sOC%qAya0IGJogsY==W!b=I>ldlIa#K%MgG^ts+RkNW&Mt)$V|gjEjd5ww`ZLk zhiuL>Y(+VI*;7H5>4-9BVV^8ApYO9kZx&h@4WYV<4x~FH2(z(bigSA_ip!e@teHNnnpEb-c`=HG@4b>0bA$=c@k&5o;Q^+o<0$omH#GMP+7kA+1IJelk zY0?IjW!tl@uVU8LMRYUECt_j+Gk38pGUJI`r)cw(Yg-0ZGV|CbR5Qc$;_t{sc3szU z;2N%@BORaY5JS)d>YD8uCf97sZ2zw}sGf8QZ&tnOLDG&MRoCv2{uOuOZ|YhAg3u5B zF&OKy0h@6F7r_VN>9|wl^4aLadw1H_to&~7%&CzgGSu|6ov&r))5Vx7X5K=cGSBay z1)Fyrh76SwnU!l~=QaLY3ah!6N0BsV!1lBez7pUA@(v zw`a$<@Ix$KqhbVV}Gq&S+1~P=)8TmWH8hm27BWx|fTecacrmUsK` zw3pstT=v$YVLkis#PP#+yro%G7jqh#MSa}mMtr;s+UhlDB-iGD?CHmZP46=QwpF?{2ouZEd#Gt*VVCX1R-5_713ae4O-2`~=me zpOSutlqq#B6}-_K^T8cOKgHcql+N*doiRi0_gDEgZ&cHEu#H(-7t>mrrAoTXtw`+J zUWjaea{hUOuUXN?k1)M1t4x@Mqr7$scc1hoV zW~MDK78K&Ley~n)9tJax=DI8+KwJ_Cs!yTy)$bHLonX zmLKI&6Fo5m%dj5j@e@9A)3uB!hk9s(4j71$ScFwr=+2I55kHRO9M*b}5yWEa7Zfro zd+{a+MByy1;j?UXknl$cmSYvJ;yP|3TXtQ`i5h5&Ug(Q?SdIPJ*)bg@aSwmu(;T{% z26=PpT44m{Vg~~)H+>b7<{=c32BlCDEzt^*n1m^qhUu7zd6TiupZ3S^THJqP zKp;CNS<;E9TzgGqqoh@BR3NQtq!(#fD@&nj<^t)9P_>hS(pNQ9-c8T$xUBHz)$=Fq zH^bTQg^L_R_u4(UWBb-k8nAOZ+}SLtQw@>+W}d=d5MhbQgsAUrDPi*uGUwSiECrB1g$;HjGs6!#c%g_=2A zdCIo@F;=6RY=L~bRuFyi+gkQA7t#+@i+wnQ=XimX-mE|F_VbHpP8?3~P&@V93Fj@$sea<-b9p;|Y7)*@ zi^^A>QSS>r8ew#!WG)J*G1I2Rx7GEa<}=SKW_QvMu2LmB0i z%ycFa&gFQ-&12QC+#=Y=60sKI#a>URF2zfzMRg~XlH7SGj;Kfn(s$vYWZFD z+6reXiS_=QH($tpdK*q48fEjcCqpGvK@`>^7O$WaKpbysNr{crD2QTcf@WxecIbpK z^nr}05?|71V?B1_Ade2wekakNAhJRRnGCRZ1y%zBCJ}+9d3)D_w{I6c*tsZo#iGV?qqTI@oXu7w`&t5uzUX5r9DK#9nkL%Hb2r7Gvd@f*Gh< zg1?~)hF~P-<>bf9=kNYcv%k(yF{rQkjkwg;%vGU{D$5USo8rk89^1DgDMRggV@)?> z&si~XteMLgzuEp= z{9)y}XV-o_d;H+uZ5!4sTfo(+6Gl7lR&b7qNjSTLdN*j7&Z$OnN_H2GNjP5};WE!y zHP5*C^USf&V^vQzTqGy$UCMXP)E76^YhKROQD^FyOvzOrC*fT63;C*ZD#fk1c~X*a zzFJbg>X;ID2b)=}wcozL0~Q;}DSK8LJ5w{9shKh*S38S@bCCz+tInzOYMu-6=ZR&) zleqd@)n@&dx)lwEo1Mkjp9RYZ0KiK%$|5T&k&T54vMLCx}>aoT~$ z6n`q*bD3p@?+5}jdW2a>Ovq(^C47f5X}N95RXt_Guu)yhOF~F>FFEK+R2S2hv@iVd zl&<6t9P1~#-7$0PEA78T|CL56F?JoN;Ovd3?g?5r_w?m)+|Ea{&gghB7@6YPldE|4 zH}X|opgy7#MsdE>4D!aK1W4zUrKs>M|uY}d19|J6L znQ4v7)FzjyZ7x&0<&-_d_c&9p9Vrhj>D{a9uW7HTR61wMx+q4y_?=A2TrDQy+^Wm+ zRp-vnzS2GTU^0uAB&VK~W6(75!($AgG7jT0 z7xSDIIy2$aItQ(j=iQ|VYaJ(sWtK7f-+nbm1cS}iK^Fnrbqc}>VELx&9 zI-oOx5sK-UiA7k7m2jRn+OcKrviUP6jvd<1DlZLa=2Knu`Jbw~NlsX#=D=G`r${iJ z#xeZ~wU^eObk3PG!JN4gOy`L|ZKdPQ7ykvOy&cnX(S__u=c3Ccn6pBH=}HNvt0tJP z?Ut5Esoo6)au15xx!#143MWm{tYw1x6W$`UnRaz@rGK$p| zElEX(sqF98O*QM*X)4?0M`~Ka@0pR;7Cy-wr`J|3Z8fzM165N`Nyp+9@>5f)=IW5H zkA|2FRg=3*@kten6=^(@JM1@XS(lUIi zKwYKlxT(T^IZGgyvj}S$GrhI!W!L_pT!QI}38w2gre&k{u_v94x_5#(`y`m|mtfi| zr>*h2rm>D0r2Pw>_a38ptCnBJ0L`k-T4F8K$0(z#^owFI+XPcVHm!Sv4w zrtdkX<)ZJ~lg>pap-YJ0^Cq=VXCWlw)z~-huChr~n`-qNNN>hgXtZ|K3uNc=BS&mC z;1I_iTWNBrC`&WTd}5WA|DH?Iam ziL~6$42Rm+EG4b>H^)fJeGX^vlHI*^{o<+Phs2;YJQQ~S0`qIVreiqV?iG<_kEw~y z)Fe`#auePscSmC!4<_|lL^;)Eb^kTHau@k4j*(lQPb5M)iV|7Z^Z1kH^4k^c$53gP zus2ZqQ#tcp$o=Z}ihRI`UvL}V>^9|YwiL?YUAx<9y#7AB+w$yYD_|?w^?J#(>pZvP zQrz?U>>p9^xW0bfyLE2gwq=w0wtdUxWv25Mm^sUQ@u8WFJBW3jXV=$=w1GTKlLyLw z?Kq5Wx6I^G(s3t(x)nhhgB?ne0NI~ zae9?mr~sRupcu5hymlIDB$ATRha8RAbDqWi34x7I2>6U%j#vI^ZaH=-2{nFcO`0)` z)*jO_12fUC8n0m#>Q>jau^5L*5SW8ySdQB#gJYR~(C(DnM>S?xJ zYs?B%)^amv6;Cyo`VSeBJDRK_vX`0HHhi7gN4Khtnaf5jz@K=9+{7Su**cq$QFM;+JMATq_T+Fs1pv zPfQ-5I+MlKv3L^0pqHEAQrrADnX`4P3|cvZih&cPqY(oY55JPWk5^E!VWGa0A|q6s zc#!@ArJ-V`D(UJ7fQlc-<7>~I;PJKY+-hKd{HXmC*SFu&V&7=nuFbNs%vxjSZ0s%r z^do1^abVGRt2tb6NcP^9)i7Res8)x9w82os= z-SiPVw)3p_@;l5uR@spL!_u|qygwFsX^4*CR+*P~ zyiGgK>wjVreZ*wUqFF=Nz1-tJSIT(A16r5K7=P={c`>C zarZ;}cmx)YxPIsN1MS&s^32<5``$k7)IKPlwohEzXXX+!cAB|LYaVRn2V_@pZB9O0 z+x_MOy&(B{|GeA04|08`mG{VgFg0Xf_$5?-SeLZw6a7i6esMVI5g3VkbcgrRfo@NB zi@_KG)jirst1j{~Y1K`>AT1m1r+iJ8{FbcEYwb_m5aW-SS#8IU*snUMZLuR<1|9$g&^ryH1<1u+P6dR!W`V#c(B~c1T=-ZFt32rpjwG?#Svae5z zjL3>SPpc-ow=*L}w}4dOMm&l^K} z9A?43|Ks;}Sc1clyTWLk#@QyedS_)_$b$Lsh48Tl?|+6@_zPN7S`yrl4LOht@o*0X`4rz!)V_4$a|-Erdy!Eye=LNrp}NQ_q^qGBRCno1x*fuxy3T&22VfjjH!4Waz*49# zbq(ot;O^?|++Hm&lHM!Fp6?zB*!De^r*gJsHa!bixp&SpCvSa^Y>HEp6&w%Xbqwpk$q3YDhZgTh)YCB}7&mf2Sl3SN<3ADC9^SS+&*kNq^B$WyzjSA_ z-gEV~{ITW*z0Lo~Mi5y!f};rU#N8*z+?i1g0=uwj$izOjG8&>E6n3~xP}d@&QTrmp*Z~Dj{x+*N_>ws*n>a2GboQG@e*bab}RT21yB;r z&=#E$hOwB6l~{{S*os9xnZ_pUgJ&-WSm=rfOvP*MrTzcsn&ZDGkA8mir0Sz5+Krc* z`tK2`_wh1r8IC1s;#e9>F)qsB?4hN8EmLbDqc2{q+iP<$uMNRaTn^uW1#SMNXA-rd)n06N8Hh3f3ql5A+_zf@YkG^f?NoXT_hCe(u;ldBJY>80zgx4dO$N(C?v7;3pqjuK z(yAFOCcOkpv5>Hr&EO27eijA#umuQ42zp`wtQd`r*o4El-;W*?E&6jo2bSUtr^I3d2*D)W^)H%WaH5j1*5=8o6!5GFkfSR@s{8 z;v%kLVQ)UMh1|^en@HM#bnIJT5QC2?8gB-!%OrZ#i>Gkk2Sb}7l_5-(L^bJhB=1IJy9Cp zpc{H(0hVA74&v$tS==;zQ1F;{6ka|3Q1Rh5+4w}d?9>wq# ze9-~JFcvGZ9%pa~&+rDO=1I8)~u{mS);Nx=i}%V$GOTbZkDOK zRfhAs=32mT67_rp*OH?00uZ)gVs|*2ErR%854cLUucy|Bh zMeexSwRO#6^;I|-_*Py{PS$dc)MUc8&C|lAUNbUV@><0VUhKyY zaC{6Vvm##gGt$a0&9#4r?%R7i-5d`&Pn*s1*eW;e-0(Q) zC4c6ua&z910eKKt$yTskL*wo^O8it!KDzC*?x618^n?Z{qty;T516D1*6lvA!LrJTaKcBQ}{kuu49^eY; ztB{>QW*U4JxM2^CdoS)_JB^(Embc5-GC7YK_=4zW4P~`E{v|iKj=KKKH*ajG3dp_N z-D#Fwg*@4&L}c0Ko!@d=uly16F2@*^#pmDiU8SqMEsgauahvmqO_F`rABcrUf0PoR z%YF&6Kg)(3$cds8b2;#htKY(N|PSHL=|z?ne^N#l^bJ^wMSOwae5Sm#HK#;+B?_gmY;b3~mzi3+Otp5IYU45$Ag5&JI*@QK zZJ^6MgIuPD*r%NLfemx{<5)Q*7dMWCb8$;t=2_}8wVWw;Vjz)KmgVntR*ibAG0723 zw(v5Rak^Div8+=0=KyrZP>jMtEW;5*;~}0R&1CLBM@3Xe0J>ljreh}#;0EsC4N^>D zgp5k4g*sChB@ZPr2{SPp`*9jqa19L0v{Yz}c36o`NI#8z8uFnaYN8$j5QJeEgXP$Q zGx!m&UX2xN?&yp8Sc0QCg;$_4YxU6qCvX?P;VD|r;Cu)LyS8%zaC8xEGst2k`tA*O|hpLw#(!mJ95U6?@ zLwX#>V*ymXtsuP$t8o~r9#4}#i*v9Kq2#wX?+^p{%4VzopMsmQymA zLr6H^G1_IGF)mZ%T&5U)=|4RT6mZX*fj(hj@K zbHrupn0@LKbzjg4vHXac!}`Ewo`)_|k6osIbD4U2|L$4?v$kcxC%G! z>h%G2tJ>=`($8gG<5SwAYQGsLt9{F4J{)jdF`vbG#e8MU6RV7n_gs?pIZMur3Q#>m zP13bd2mVk!MOV@x2*pIGo?|9y$A<&N0iQW$MhcH&(~u&hol*ara$jdf+nk$Ytt@%haE8N@ngk3Fp$hT%snM%T$g( zxi|9d*5z{fV?H@07nh%eb8+Qe=BeN^Rmo+lipx|jIVG1?n}l;|?R}VXCrUn6-Nub% zRJ7UlRI`-Vt+LW*V-9ve?LH2XK7yl&f!dwiBmDpm@fXzY{XbNXuPL zJq$+t(F-U1i*v?*X#XBOa=B%r+HuD_@|W}0f^<|^YIa1bYxs<5(Y>yvh*g%@7xAmJ zAQNwA^mdsl;xbjtW$G(AC6`u)gmXo;T;{3mGF6u;>)Tb;cll#8IVBg@oP=|6U0vo0 zc9{xwnF@EA>LaJ*()yBcE^XGcH-YiCb+*e}<}#J_Bi3tN;FO9R0^9b~B5-QIZ-uL2 z#xyEl4mIXtFVt}3{1nv>e&Ou>e4L|gANoNVHt(?%`@kiJc?||BYVeYlbOvNXL#V+_ z2hyDpgyoQf8^^b}9JhaqOVo7vEiUq_wfGj78kTgzw~=L@7*WS^vaXheEdS?~$&u9d zsej+}>dsAXz^1D)7jtU6u@~tWN2xJbR?;5uL|&*dSz*$}P#iU&#%T3PH$r3hLyg(~ z?cuf}pqXW+7}3yjwoaChn2)%9YGb)i{ikdNlf`Zb!%(Q9<#^H)F$v3{hML=_sRDf) zLC$*})3l&KE62`6n_GDWT@U1M+ruG8meTiLm za+d!Ia>6l~=4KqBw!DQifZnFcv*j{Z|L{(&2!AVz+EAnNCZwCA1tOqE=>td)!eB%} zjoO!!UWIo**_InTOIy;506)3qt>u=J_{ZaUPPEhdIyiZ+Fa! z_5qezVx+I-Or0!b?|&|=D2>|~jtTjgp)ArA_}W-|uDWyB)g9C}GKna3?Rc!V@j^upMK*Yg?wV8#N@q~pj! z0t;Kd<19S7FXkW=rI*mtA{=ut7qL$t-R2{ROmQFD&Er|dV}=jv*OSlfIPohc_AxSu z?%gb-#hA{PqduC)$IPeW)=AN7Hg|tVMshaX{mUe7B28C%joCH$cws^fjz%sAaW^23 zs7NgeUFQ+hb-G$MSmjZ(Ck68bN}wdFp*sA~4sH~TJAx64SPH~kM9+z{h@oKaLl(j+ zY{FSw!|!;7LQA)Gq7YS=PQnrxCnC@frGD63oX$O{V)_!ScYdSs3BZg$#qf4 zzl!}K3aw@XP!3gb4p-3mdp?}PV64O{Y(v&Hymt-fD+-aQi$>^%o|ub8*ozh8E?(jl(KY(YA%K67b(nQ&Y%!8hfoTMK#8 z>gZtuX)D2j{yYmvYlo}KIDgLu5mZZwm!xKts4!rtm3=IdB^{HS3Q=X8hRLM)!65eRt>8$19)=(cFd35{>R1cUR>?YJu!|4Jq5OF)vSKJ17DdG!-i2Ivj$jx z{#J9BJl3uhm7Nyxc=OWU!?_H>mJZ+{@06>PKFaomE;orgTV;hy zZDikuH#R!2&5Ve)@WDI8HdcXJ+Zk5k)(#>QZ+0`^9!}0;DoX8>C!HR<-;>3|9YcGz zZR9J4=7@=7hFN=uckReS8#K{-oMpIJGSqUdiYM9rulciIIc#e)+_FHo%09OM3L`a} zlNPPeT5cM`F$6;~9W$^R8?hC;@#Q8OG4|pDOo}1}PT?X_QY@Kq5*H9k@eIJ=E$r3C zkXVl`*ogy3x}Q%FkPAgo992*aEzkonaDPMskL@Bp4?slaobkvdOvLrHv%5JX@l*5Uw;;wfTb zzx?Fc)4NZfJ$+_Rzt(Qse~Uh&Eak=aQI@I=+3v)~O=)5$3EL{m>r-ThDz_s0?Ux7# z$_pfl+a8a$q}8o5*8azPoaJ4aWvMc6PFj_FSJJBN2a{IiKZUfagJq;uJ!~hv16(5P z>3CAa!Cl)ntXj5UmWUk11rvPG?ANl9{6+xLf1+ium@(E8Q_7RvCpss`YD^u-MH2PK zTX<@HVzRcAmE|Q=@}bH>21Us61IL#bMCc60ReVOs$S`uONU);Rwjq;b=OH&Ru}hJG zD1*?KSo6d0c#6TtDOA)x$+0M+(1kcWgR>Yx9F9aZWNiL;hRccLKS?*q~%KUFXWbd#5`y*jjH_LEjk?RV0uxyh6GJc-kt-gN8wf4JpW^qpfF zA{I=u+$il4zj-Gje{ZigwejtO3-k}k^0A-n&v3N0o@rU6SBt+9g)Y!5qX>%r$muM! zK>90mYVbj0v_M;QLKp^I5!?#eQ_PW1G_ha%%41F3#FeF7W%Acti=kU(kM!Y7=Nd-V zG8`i@8e=dPGcgMbun3E>1WR!QabNqG<%0acZ`1cnxmuI&1d(4$N)I5v&rS6C&N7T{ zeCBM+4XcODW(hXFG{VpWM{yDvFY*~II-x7B;09!&sO+h%9OboBa`kwFFRn5sLv_?e zH}u48EW|z>k=IwokhqOl7}pr2q6T_lFot6!R$?=@V<+z78DjAY*{`#YMPU?0Nt8xI zv_U)gqZ2w~I3lh5n1X4D!9zSpEZk%0uuv4m(HOp%g1Ij-pLd=_QDK5^>w|wbA>8aBFd*$0a7g%oUp8p;NHqXVD zTe@6`s+KdP&*3~S;5k%P>6E+)3zEPSs`~Ph&W|rq0M($X)Q5BfG(;nCDDaDXNRj=1 zY{s5hCysVJOGiGQCBZ*2VwI&AK^VEna<`6_RR-?I$ZFK)X%GHiZ|4DDMbRzrxn*O( zfb zmdc6O=HNx{VK}s~>j{Ud8T@W3_9I9+BW20U^nc6-@&>M&LLlbi*N~i z-%5A>v}K*Fm?F+AJY0#(Pt$s}jL|FH{iGO|xNq0YO=_P(5NCq+gKNb6m9^=&bPBRo6+ja}|esufI1|IroVIBy%A z1uT-$F439W(_xi+mP3~WJo2+?u*6s??28lJ@FG~o%Q9RQ*jEYagJr-h;}y!jFc=PE z#Qd+qzxAz1ZY>$Og{CQLy}O4eVvXD7sFl;QnEx^XGSN*L|MKo0W39W3qo!EZM-w)Y zePUQ+VJ6Im6JQzI8^~g8lOP#_6UZ^ou&Lpr}k1vqt_V8M(O>Wl6kfc2Bps(1!02aY^u$rCY$O&)?{scu+V>LzDkb@yN zLrmZcO;m-NP8Q#hqL$rzG$hT-#?pw_-luc{C{vNmf&61}z{Ktk!cG z@=90*Yv4S1TU5_G+ptf%G`0UM0Jtn_9u6Z<*$n1(F_@Bw|K(UUn&0BU>Qfv> zJ^=}E3bOsdV>c9n*PsNHg3{0xLLm~O!1rn72k)GzQQpNOoAYVp8q3d2*e!~&LllEF zK8x#`rqbAS&)L!#oYvLS$hpgXMwfn(m0l}tlStbXSOr^Q2gJiY2>g=|?~n~@Kr3hq z?V&Stg+;Iyw!l_Mg0!dU;zJf_2yLMKX%0pd!2pm0>eH zcZS;=ra+Z*L<(8X(~p9ASGbcPFp+p56na1}=mY&=01Qpkc_>8~4-=r)Eu0^rEewIt zFbfvIPB;R|koGn;3YDQ741}>T8J5Co*b7Ht;61JZAKu4>1HTCZP(!VDHR%V8Jml_g zg#Y3`{gHp@%lsP*i17~(`kD}{?UJ9reML*_HgJw;UL0(Ldz1-pu4&{BNFyhSd%~f9 zWlfJBio#}t98e!D#TA|H3ZW1NYrxWB(ceAb9d)w99Cb2ls*F16(YdXRI{D6>!I*GN zZtjEbl=oCl()Ua*I(Lb;Z97ccR?|wwK2mZ3T--6%T_tx^2FM7Rpe$H-nA}}&K{crU zm$xf!P;i)xMCbeR&OXQ}x!Ap1mn{Cv$W=Qo(jGd%0dC`8VZ~WA9wNAnhr!N^W`pp@ zF|$Fi`dhs-^9H$PlX~x_e#kMVoOE~fL>#5-RVSFl|LyqibB(ymymNuhn2qUB`zo)h zAW2cGIgCLk+;u(6Pskl4DSFZw=Qyj#HSEcCy2()VCQTijg!I^sJWvzF*3^ThklN8(C~mJnRC#Hstb7M}V8#>g9|1#O$9wwONDrjVY(y-HbXt-Bpca3GQ`#_K__7 z%LExGlU!X)Zyp10o?uz*AlP&1lshx?myx6=CD$^S*4Matf4NsUbjgVIOA4}OOv_*_ zErS{=h7%&eGOSCGE#tZe*)p(~kT1g($b1)r0rfGs4PXHVcOhJaOK|hPqu`?-ALmSC zaSmoD=pEKgCd)8Aw2Y}2++B>0i=EjG&!6t&t@4T0|36Bs5go^jC$eaeXZTt7AV!Wu3RM72pd}PhPF!2lQp6JaaF!9mcRPL&yoK`E#R^`SAegbvUVra~;_b~#lcs0;O=FHD2!F5Rg< zay!*v2!}Z^4-UW)NT+cjs0`JiHMEERpu=~t5mLYv;8bDI3x0xlDD#|Cy#Zm+3p}s^ zPNj9KG|w|llb&?%w&K6JlCd>2s(0&k;Pw6PJ?i$A+vX&zUU%Lk+9AT*4c#N$Ss}M$}DrPvh(J?#spUpw53gL8(3l8?)B%UYLmyf<2=W z-2)tD{y}=yxrl@e~QCgtI~e*s6$)VI7Zcjhhs13687%Li~P z%WZGn#tpcI8$lC@&)_h^x48;>x+Td_49jXfO%xvxO><}ot>Hsx2OXdjbb(Ol4!xic zh$Z<9ydzi4l^yv66PwBB9^JlWLQ$aJ}S z$O>HZjN)Iq)8tU;QYU5r(GLRgq;_g}QaiPM4qcLI{W1i3C`7<;7zqY=jUx6B`8;&Q z28w+Qg+XB1NxrQ3ZRLJs%U%Xy2Q8cVCbH!Y6oZ@$J>u2-ZJ{F*l!vB&yX$SzY2LZtbuNU zTovNuWQ0*6PiUZq*PRr>KZ#`$F)gKuI0@2JoPmpQ4U!;`rbC*K43G)3KvpOK1)&J= z6+rhnoIi23vE||fDJ};q5d6Zpe`~}W*)I0D*tej8@YNw|Y)fk~E41v)w38uh7I0fZjaH3zrr!N0rwzBMyJXP^`Hq%f@v9BJJt6HKfxuq3l%bvAeaKn;XBv>0hyiZ zMR*ND;8Tc%7?=i4vtSwF69|JLS)4MlNq(b$My;%G2;|iKG6XWOaX6#)%4?}rz9>an z97;e#u&SXY^5PATcOXx%O>^k{{-kqT^LrbRK~MyS8I$+d}WzLUnDS#uAd)njlDQy16uPU)w?bY@z

})OCL@K-ocu0$6rD3*wpu3Td2N-q)Hng_|Ir< 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 Jgm-TH{{g~E?c)Fd