Implement DL11 console, get BASIC-PTS working
authorNick Downing <nick@ndcode.org>
Mon, 12 Sep 2022 08:30:31 +0000 (18:30 +1000)
committerNick Downing <nick@ndcode.org>
Mon, 12 Sep 2022 08:30:41 +0000 (18:30 +1000)
emu_68000.c
emu_pdp11.c

index 762038d..f4f2108 100644 (file)
@@ -114,7 +114,8 @@ int read_byte(void *context, int addr) {
   int data;
   switch (addr) {
   case 0x10040:
-    return 3; // bit 0 = rdrf, bit 1 = tdre
+    data = 3; // bit 0 = rdrf, bit 1 = tdre
+    break;
   case 0x10042:
     data = getchar();
     switch (data) {
index 958c056..d6f956d 100644 (file)
@@ -12,6 +12,7 @@ extern int32 REGFILE[6][2];   /* R0-R5, two sets */
 extern int32 STACKFILE[4];     /* SP, four modes */
 extern int32 saved_PC;         /* program counter */
 extern int32 PSW;              /* PSW */
+extern int32 last_pa;          /* pa from ReadMW/ReadMB */
 t_stat cpu_reset (DEVICE *dptr);
 #else
 #include "cpu_pdp11.h"
@@ -22,7 +23,7 @@ t_stat cpu_reset (DEVICE *dptr);
 #define REG_TRACE 1
 #define MEM_TRACE 1
 
-#define MEM_SIZE 0x4000
+#define MEM_SIZE 0x10000
 #if __BYTE_ORDER == __BIG_ENDIAN
 #define MEM_SIZE_M1 (MEM_SIZE - 1)
 #define MEM_SIZE_M2 (MEM_SIZE - 2)
@@ -164,9 +165,36 @@ int load_ihx(char *name) {
 int read_byte(void *context, int addr) {
   int data;
   switch (addr) {
-  case 0xf000:
-    return 3; // bit 0 = rdrf, bit 1 = tdre
-  case 0xf001:
+  case 0177560: // dl11 rcv csr
+    data = 0x80;
+    break;
+  case 0177564: // dl11 xmt csr
+    data = 0x80;
+    break;
+  default:
+    if (addr < 0 || addr >= MEM_SIZE) {
+      fprintf(stderr, "invalid read byte: %06o\n", addr);
+      exit(EXIT_FAILURE);
+    }
+    data = mem.b[addr ^ MEM_SIZE_M1];
+    break;
+  }
+#if MEM_TRACE
+  fprintf(stderr, "addr=%06o rd=%03o\n", addr, data);
+#endif
+  return data;
+}
+
+int read_word(void *context, int addr) {
+  int data;
+  switch (addr) {
+  case 0177550:
+    data = 0;
+    break;
+  case 0177560: // dl11 rcv csr
+    data = 0x80;
+    break;
+  case 0177562: // dl11 rcv buf
     data = getchar();
     switch (data) {
     case '\n':
@@ -183,30 +211,13 @@ int read_byte(void *context, int addr) {
     }
     break;
   default:
-    if (addr < 0 || addr >= MEM_SIZE) {
-      fprintf(stderr, "invalid read byte: %06o\n", addr);
-      data = 0xff;
+    if (addr < 0 || addr >= MEM_SIZE || (addr & 1)) {
+      fprintf(stderr, "invalid read word: %06o\n", addr);
+      exit(EXIT_FAILURE);
     }
-    else
-      data = mem.b[addr ^ MEM_SIZE_M1];
+    data = mem.w[(addr ^ MEM_SIZE_M2) >> 1];
     break;
   }
-#if MEM_TRACE
-  fprintf(stderr, "addr=%06o rd=%03o\n", addr, data);
-#endif
-  return data;
-}
-
-int read_word(void *context, int addr) {
-  int data;
-  if (addr < 0 || addr >= MEM_SIZE || (addr & 1)) {
-    fprintf(stderr, "invalid read word: %06o\n", addr);
-    if (addr & 1)
-      exit(EXIT_FAILURE);
-    data = 0xffff;
-  }
-  else
-    data = mem.w[(addr ^ MEM_SIZE_M2) >> 1];
 #if MEM_TRACE
   fprintf(stderr, "addr=%06o rd=%06o\n", addr, data);
 #endif
@@ -218,9 +229,7 @@ void write_byte(void *context, int addr, int data) {
   fprintf(stderr, "addr=%06o wr=%03o\n", addr, data);
 #endif
   switch (addr) {
-  case 0xf000:
-    break;
-  case 0xf001:
+  case 0177566: // dl11 xmt buf
     data &= 0x7f;
     switch (data) {
     case '\r':
@@ -234,10 +243,11 @@ void write_byte(void *context, int addr, int data) {
     }
     break;
   default:
-    if (addr < 0 || addr >= MEM_SIZE)
+    if (addr < 0 || addr >= MEM_SIZE) {
       fprintf(stderr, "invalid write byte: %06o\n", addr);
-   else
-      mem.b[addr ^ MEM_SIZE_M1] = data;
+      exit(EXIT_FAILURE);
+    }
+    mem.b[addr ^ MEM_SIZE_M1] = data;
   }
 }
 
@@ -245,13 +255,16 @@ void write_word(void *context, int addr, int data) {
 #if MEM_TRACE
   fprintf(stderr, "addr=%06o wr=%06o\n", addr, data);
 #endif
-  if (addr < 0 || addr >= MEM_SIZE || (addr & 1)) {
-    fprintf(stderr, "invalid write word: %06o\n", addr);
-    if (addr & 1)
+  switch (addr) {
+  case 0177560:
+    break;
+  default:
+    if (addr < 0 || addr >= MEM_SIZE || (addr & 1)) {
+      fprintf(stderr, "invalid write word: %06o\n", addr);
       exit(EXIT_FAILURE);
-  }
-  else
+    }
     mem.w[(addr ^ MEM_SIZE_M2) >> 1] = data;
+  }
 }
 
 #if ALT_BACKEND
@@ -272,10 +285,12 @@ int32 ReadCW(int32 va) {
 }
 
 int32 ReadMW(int32 va) {
+  last_pa = va;
   return read_word(NULL, va);
 }
 
 int32 ReadMB(int32 va) {
+  last_pa = va;
   return read_byte(NULL, va);
 }