From fc7b65cb4766c723f67739a9cb94a41e4d77a869 Mon Sep 17 00:00:00 2001
From: Richard Cornwell <rich@sky-visions.com>
Date: Sun, 31 Dec 2023 11:17:43 -0500
Subject: [PATCH] KA10: Poll quicker for Chaosnet packet when there's traffic.

---
 PDP10/ka10_ch10.c | 23 +++++++++++++----------
 PDP10/ks10_ch11.c | 22 ++++++++++++++--------
 2 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/PDP10/ka10_ch10.c b/PDP10/ka10_ch10.c
index b5e51ad1..c09a2889 100644
--- a/PDP10/ka10_ch10.c
+++ b/PDP10/ka10_ch10.c
@@ -251,11 +251,12 @@ t_stat ch10_transmit ()
     ch10_status |= OVER;
   }
   tx_count = 0;
+  ch10_status |= TXD;
   ch10_test_int ();
   return SCPE_OK;
 }
 
-void ch10_receive (void)
+int ch10_receive (void)
 {
   size_t count;
   const uint8 *p;
@@ -264,16 +265,16 @@ void ch10_receive (void)
   tmxr_poll_rx (&ch10_tmxr);
   if (tmxr_get_packet_ln (&ch10_lines[0], &p, &count) != SCPE_OK) {
     sim_debug (DBG_ERR, &ch10_dev, "TMXR error receiving packet\n");
-    return;
+    return 0;
   }
   if (p == NULL)
-    return;
+    return 0;
   dest = ((p[4+CHUDP_HEADER] & 0xff) << 8) + (p[5+CHUDP_HEADER] & 0xff);
 
   sim_debug (DBG_PKT, &ch10_dev, "Received UDP packet, %d bytes for: %o\n", (int)count, dest);
   /* Check if packet for us. */
   if (dest != address && dest != 0 && (ch10_status & SPY) == 0)
-    return;
+    return 1;
 
   if ((RXD & ch10_status) == 0) {
     count = (count + 1) & 01776;
@@ -291,6 +292,7 @@ void ch10_receive (void)
     if ((ch10_status & LOST) < LOST)
       ch10_status += 01000;
   }
+  return 1;
 }
 
 void ch10_clear (void)
@@ -410,14 +412,15 @@ t_stat ch10_devio(uint32 dev, uint64 *data)
 
 t_stat ch10_svc(UNIT *uptr)
 {
-  sim_clock_coschedule (uptr, 1000);
-  (void)tmxr_poll_conn (&ch10_tmxr);
   if (ch10_lines[0].conn) {
-    ch10_receive ();
+    if (ch10_receive ()) {
+      sim_activate_after (uptr, 300);
+      return SCPE_OK;
+    }
+  } else {
+    (void)tmxr_poll_conn (&ch10_tmxr);
   }
-  if (tx_count == 0)
-    ch10_status |= TXD;
-  ch10_test_int ();
+  sim_clock_coschedule (uptr, 1000);
   return SCPE_OK;
 }
 
diff --git a/PDP10/ks10_ch11.c b/PDP10/ks10_ch11.c
index 1d8a37a6..4a6e5c3e 100644
--- a/PDP10/ks10_ch11.c
+++ b/PDP10/ks10_ch11.c
@@ -79,7 +79,7 @@ int    ch11_read(DEVICE *dptr, t_addr addr, uint16 *data, int32 access);
 uint16 ch11_checksum (const uint8 *p, int count);
 void   ch11_validate (const uint8 *p, int count);
 t_stat ch11_transmit (struct pdp_dib *dibp);
-void   ch11_receive (struct pdp_dib *dibp);
+int    ch11_receive (struct pdp_dib *dibp);
 void   ch11_clear (struct pdp_dib *dibp);
 t_stat ch11_svc(UNIT *);
 t_stat ch11_reset (DEVICE *);
@@ -349,10 +349,11 @@ ch11_transmit (struct pdp_dib *dibp)
     ch11_csr |= CSR_TAB;
   }
   tx_count = 0;
+  ch11_csr |= CSR_TDN;
   return SCPE_OK;
 }
 
-void
+int
 ch11_receive (struct pdp_dib *dibp)
 {
   size_t count;
@@ -362,16 +363,16 @@ ch11_receive (struct pdp_dib *dibp)
   tmxr_poll_rx (&ch11_tmxr);
   if (tmxr_get_packet_ln (&ch11_lines[0], &p, &count) != SCPE_OK) {
     sim_debug (DBG_ERR, &ch11_dev, "TMXR error receiving packet\n");
-    return;
+    return 0;
   }
   if (p == NULL)
-    return;
+    return 0;
   dest = ((p[4+CHUDP_HEADER] & 0xff) << 8) + (p[5+CHUDP_HEADER] & 0xff);
 
   sim_debug (DBG_PKT, &ch11_dev, "Received UDP packet, %d bytes for: %o\n", (int)count, dest);
   /* Check if packet for us. */
   if (dest != address && dest != 0 && (ch11_csr & CSR_SPY) == 0)
-    return;
+    return 1;
 
   if ((CSR_RDN & ch11_csr) == 0) {
     count = (count + 1) & 01776;
@@ -392,6 +393,7 @@ ch11_receive (struct pdp_dib *dibp)
     if ((ch11_csr & CSR_LOS) != CSR_LOS)
         ch11_csr = (ch11_csr & ~CSR_LOS) | (CSR_LOS & (ch11_csr + 01000));
   }
+  return 1;
 }
 
 void
@@ -417,10 +419,14 @@ ch11_svc(UNIT *uptr)
    DEVICE           *dptr = find_dev_from_unit (uptr);
    struct pdp_dib   *dibp = (DIB *)dptr->ctxt;
 
-  sim_clock_coschedule (uptr, 1000);
-  (void)tmxr_poll_conn (&ch11_tmxr);
   if (ch11_lines[0].conn) {
-    ch11_receive (dibp);
+    if (ch11_receive (dibp))
+      sim_activate_after (uptr, 300);
+    else
+      sim_clock_coschedule (uptr, 1000);
+  } else {
+    (void)tmxr_poll_conn (&ch11_tmxr);
+    sim_clock_coschedule (uptr, 1000);
   }
   if (tx_count == 0) {
     ch11_csr |= CSR_TDN;