diff --git a/mach/6500/dl/dl.c b/mach/6500/dl/dl.c
new file mode 100644
index 000000000..0ee9eb2e4
--- /dev/null
+++ b/mach/6500/dl/dl.c
@@ -0,0 +1,164 @@
+/*
+ * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
+ *
+ *          This product is part of the Amsterdam Compiler Kit.
+ *
+ * Permission to use, sell, duplicate or disclose this software must be
+ * obtained in writing. Requests for such permissions may be sent to
+ *
+ *      Dr. Andrew S. Tanenbaum
+ *      Wiskundig Seminarium
+ *      Vrije Universiteit
+ *      Postbox 7161
+ *      1007 MC Amsterdam
+ *      The Netherlands
+ *
+ */
+
+#include	<sgtty.h>
+#include	<stdio.h>
+#include	<assert.h>
+
+struct sgttyb	tty;
+
+#define	DATTYPE		0
+#define	EOFTYPE		1
+#define	SEGTYPE		2
+#define	PCTYPE		3
+
+#define	MAXBYTE		0x18
+
+int	check;
+int	records;
+int	echo;
+int	bytecount;
+int	ttyfd;
+
+char	*progname;
+
+char	hex[] = "0123456789ABCDEF";
+
+main(argc,argv) char **argv; {
+	register nd,pc,sg,osg,first;
+	register char *s;
+
+	progname = argv[0];
+	if (argc > 3)
+		fatal("usage: %s [object [tty]]\n",argv[0]);
+	s = "a.out";
+	if (argc >= 2)
+		s = argv[1];
+	if (freopen(s,"r",stdin) == NULL)
+		fatal("can't open %s",s);
+	ttyfd = 1;
+	first = 1; osg = 0;
+	for (;;) {
+		pc = get2c(stdin);
+		if (feof(stdin))
+			break;
+		sg = get2c(stdin);
+		nd = get2c(stdin);
+		if (first) {
+			first = 0;
+		}
+		assert(sg == osg);
+		while (nd > MAXBYTE) {
+			data(MAXBYTE,pc);
+			nd -= MAXBYTE;
+			pc += MAXBYTE;
+		}
+		if (nd > 0)
+			data(nd,pc);
+		assert(feof(stdin) == 0);
+	}
+	if (first == 0)
+		eof();
+	if (echo)
+		for (;;)
+			reply();
+}
+
+data(nd,pc) {
+
+	newline(nd,pc,DATTYPE);
+	do
+		byte(getc(stdin));
+	while (--nd);
+	endline();
+}
+
+eof() {
+
+	newline(0,records,EOFTYPE);
+	endline();
+}
+
+newline(n,pc,typ) {
+
+	records++;
+	put(';');
+	byte(n);
+	check = 0;
+	bytecount = n+4;
+	word(pc);
+}
+
+endline() {
+
+	word(check);
+	put('\r');
+	put('\n');
+	assert(bytecount == 0);
+put(0);
+put(0);
+put(0);
+put(0);
+put(0);
+put(0);
+}
+
+word(w) {
+
+	byte(w>>8);
+	byte(w);
+}
+
+byte(b) {
+
+b &= 0377;
+	check += b;
+	--bytecount;
+	put(hex[(b>>4) & 017]);
+	put(hex[b & 017]);
+}
+
+put(c) {
+
+	write(ttyfd,&c,1);
+}
+
+reply() {
+	register i;
+	int c;
+
+	if (echo == 0)
+		return;
+	i = read(ttyfd,&c,1);
+	assert(i > 0);
+	write(1,&c,1);
+}
+
+get2c(f) FILE *f; {
+	register c;
+
+	c = getc(f);
+	return((getc(f) << 8) | c);
+}
+
+fatal(s,a) {
+
+	fprintf(stderr,"%s: ",progname);
+	fprintf(stderr,s,a);
+	fprintf(stderr,"\n");
+	exit(-1);
+}