aout:
$(AS) $(AS_FLAGS) -o bootstrap.o bootstrap.s
- $(CC) $(CC_FLAGS) -o cstart.o cstart.c
$(CC) $(CC_FLAGS) -o pdp11.o pdp11.c
- $(CC) $(CC_FLAGS) -o hello.o hello.c
- $(LD) $(LD_FLAGS) bootstrap.o cstart.o pdp11.o hello.o -o program.out
+ $(CC) $(CC_FLAGS) -o memtest.o memtest.c
+ $(LD) $(LD_FLAGS) bootstrap.o pdp11.o memtest.o -o program.out
clean:
@rm -rf *.o *.out *.pdp11 *.bin *.core
--- /dev/null
+.globl _start
+
+_start:
+ mov $020000,sp
+ jsr pc,_memtest
+ halt
--- /dev/null
+#include "pdp11.h"
+
+void
+memtest(void)
+{
+ wait(01000);
+ putch('H');
+ putch('e');
+ putch('l');
+ putch('l');
+ putch('o');
+ putch(',');
+ putch(' ');
+ putch('W');
+ putch('o');
+ putch('r');
+ putch('l');
+ putch('d');
+ putch('!');
+ putch('\n');
+}
--- /dev/null
+#include <stdint.h>
+
+/*
+ * Polled console I/O
+ */
+
+#define RCSR (*((volatile uint16_t *)0177560))
+#define RBUF (*((volatile uint16_t *)0177562))
+#define XCSR (*((volatile uint16_t *)0177564))
+#define XBUF (*((volatile uint16_t *)0177566))
+
+void
+putch(uint16_t c)
+{
+ while((XCSR && 0200) == 0) continue;
+ XBUF = c;
+}
+
+uint16_t
+getch(void)
+{
+ while((RCSR && 0200) == 0) continue;
+ return RBUF;
+}
+
+/*
+ * Busy-loop
+ */
+
+void
+wait(uint16_t count)
+{
+ while (count--) continue;
+}
--- /dev/null
+#ifndef PDP11_STDIO_H
+#define PDP11_STDIO_H
+
+#include <stdint.h>
+
+void putch(uint16_t);
+uint16_t getch(void);
+void wait(uint16_t);
+
+#endif /* PDP11_STDIO_H */
--- /dev/null
+OUTPUT_FORMAT("a.out-pdp11")
+ENTRY(start)
+phys = 00001000;
+SECTIONS
+{
+ .text phys : AT(phys) {
+ code = .;
+ *(.text)
+ *(.rodata)
+ . = ALIGN(0100);
+ }
+ .data : AT(phys + (data - code))
+ {
+ data = .;
+ *(.data)
+ . = ALIGN(0100);
+ }
+ .bss : AT(phys + (bss - code))
+ {
+ bss = .;
+ *(.bss)
+ . = ALIGN(0100);
+ }
+ end = .;
+}