z80pack: add a network socket simulation helper
authorAlan Cox <alan@linux.intel.com>
Mon, 11 Jan 2016 19:05:48 +0000 (19:05 +0000)
committerAlan Cox <alan@linux.intel.com>
Mon, 11 Jan 2016 19:05:48 +0000 (19:05 +0000)
This just uses the 3rd network virtual serial. There's a small tweak to the
cpmsim source also needed to report bit 2 as "carrier"

Kernel/dev/z80pack/devatsim.c [new file with mode: 0644]
Kernel/dev/z80pack/devatsim.h [new file with mode: 0644]

diff --git a/Kernel/dev/z80pack/devatsim.c b/Kernel/dev/z80pack/devatsim.c
new file mode 100644 (file)
index 0000000..b4befbb
--- /dev/null
@@ -0,0 +1,73 @@
+#include <kernel.h>
+#include <kdata.h>
+#include <netdev.h>
+#include <net_at.h>
+
+/*
+ *     Implement a very simple interface to serial 3 on Z80pack, with a
+ *     small patch that sets bit 2 to indicate channel connected.
+ *
+ *     This is used to debug the ATD ipaddr interface.
+ *
+ *     Note: the interface *must* be hardware flow controlled and 8bit clean
+ */
+
+__sfr __at 44 status;
+__sfr __at 45 data;
+
+static uint8_t up;
+static uint8_t poll;
+
+void netat_nowake(void)
+{
+  poll = 0;
+}
+
+void netat_wake(void)
+{
+  poll = 1;
+}
+
+uint8_t netat_byte(void)
+{
+  return data;
+}
+
+uint8_t netat_ready(void)
+{
+  return (status & 0x01) ? 1 : 0;
+}
+
+static void netat_drop(void)
+{
+    if (up) {
+      up = 0;
+      netat_hangup();
+    }
+}
+
+
+void netat_poll(void)
+{
+  uint8_t st = status;
+  if (!(st & 4)) {
+    netat_drop();
+    return;
+  }
+  up = 1;
+  while (poll && (st & 1))
+      netat_event();
+}
+
+void netat_outbyte(uint8_t c)
+{
+  uint8_t st;
+  do {
+    st = status;
+    if (!(st & 4)) {
+      netat_drop();
+      return;
+    }
+  } while (!(st & 2));
+  data = c;
+}
diff --git a/Kernel/dev/z80pack/devatsim.h b/Kernel/dev/z80pack/devatsim.h
new file mode 100644 (file)
index 0000000..b8f63f9
--- /dev/null
@@ -0,0 +1 @@
+extern void netat_poll(void);