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"
#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)
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':
}
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
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':
}
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;
}
}
#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
}
int32 ReadMW(int32 va) {
+ last_pa = va;
return read_word(NULL, va);
}
int32 ReadMB(int32 va) {
+ last_pa = va;
return read_byte(NULL, va);
}