summaryrefslogtreecommitdiff
path: root/emulators/pcemu
diff options
context:
space:
mode:
authorJoerg Wunsch <joerg@FreeBSD.org>1995-03-27 21:35:21 +0000
committerJoerg Wunsch <joerg@FreeBSD.org>1995-03-27 21:35:21 +0000
commit869622ad387690d0689907e61b2eadd0cedaf7bc (patch)
treec63434170244083265d9ddf8c447e2a75c961f26 /emulators/pcemu
parentAdd MAINTAINER. Yes, I know I screwed up the Submitted by: line on the (diff)
This is David Hedley's pcemu 8086 PC emulator.
Technically, i consider this an excellent work. I've made some efforts to make it easier for people get it actually up & running. This would have required an image of a DOS boot floppy, which we cannot provide. Instead, i wrote a small bootstrap loader (basically a small more(1) clone with builtin text) that can be ``booted'' from. It instructs the user how to get the image of a bootable DOS floppy, and where to find the various files. (The bootstrap loader requires bcc to be recompiled, but i'm providing a gzip'ed/uuencoded version in the files directory as well.) The pkg directory is not yet done. Will follow RSN. :)
Notes
Notes: svn path=/head/; revision=1211
Diffstat (limited to 'emulators/pcemu')
-rw-r--r--emulators/pcemu/Makefile30
-rw-r--r--emulators/pcemu/distinfo1
-rw-r--r--emulators/pcemu/files/README.FreeBSD162
-rw-r--r--emulators/pcemu/files/bootstrap.shar1086
-rw-r--r--emulators/pcemu/files/bootstrapper.uu250
-rw-r--r--emulators/pcemu/files/patch-aa61
-rw-r--r--emulators/pcemu/files/patch-ab79
-rw-r--r--emulators/pcemu/files/patch-ac54
-rw-r--r--emulators/pcemu/files/patch-ad94
-rw-r--r--emulators/pcemu/files/patch-ae10
-rw-r--r--emulators/pcemu/pkg-comment1
-rw-r--r--emulators/pcemu/pkg-descr238
-rw-r--r--emulators/pcemu/scripts/configure27
13 files changed, 2093 insertions, 0 deletions
diff --git a/emulators/pcemu/Makefile b/emulators/pcemu/Makefile
new file mode 100644
index 000000000000..4453713bfc14
--- /dev/null
+++ b/emulators/pcemu/Makefile
@@ -0,0 +1,30 @@
+# New ports collection makefile for: pcemu(1)
+# Version required: 1.01alpha
+# Date created: 7 March 1995
+# Whom: joerg
+#
+# $Id: Makefile,v 1.1.1.1 1995/03/05 23:32:25 joerg Exp $
+#
+
+DISTNAME= pcemu1.01alpha
+
+# Warning notice: by now, you'll have to live with those warnings:
+#
+#In file included from /usr/include/sys/types.h:48,
+# from /usr/include/stdio.h:43,
+# from main.c:22:
+#/usr/include/machine/endian.h:50: warning: `LITTLE_ENDIAN' redefined
+#*Initialization*:1: warning: this is the location of the previous definition
+
+#
+# a selection of sites archie has been reporting:
+#
+MASTER_SITES= ftp://hpcsos.col.hp.com/mirrors/.scsi0/linux/ALPHA/dosemu/Misc/
+MASTER_SITES+= ftp://ftp.germany.eu.net//pub/os/Linux/Local.EUnet/ALPHA/dosemu/Misc/
+MASTER_SITES+= ftp://minnie.cs.adfa.oz.au/BSD/phillip/FreeBSD/pc-emulator/
+MASTER_SITES+= ftp://ftp.iij.ad.jp/pub/linux/tsx-11/ALPHA/dosemu/Misc/
+#
+# This is the original master site, but better use a well-connected server
+MASTER_SITES+= ftp://ftp.cs.bris.ac.uk/users/hedley/
+
+.include <bsd.port.mk>
diff --git a/emulators/pcemu/distinfo b/emulators/pcemu/distinfo
new file mode 100644
index 000000000000..98f3bba6f93d
--- /dev/null
+++ b/emulators/pcemu/distinfo
@@ -0,0 +1 @@
+MD5 (pcemu1.01alpha.tar.gz) = 1fed124b199839e439bec0f45abf006b
diff --git a/emulators/pcemu/files/README.FreeBSD b/emulators/pcemu/files/README.FreeBSD
new file mode 100644
index 000000000000..3d295bdd898f
--- /dev/null
+++ b/emulators/pcemu/files/README.FreeBSD
@@ -0,0 +1,162 @@
+This is an excerpt of what you can see with the standalone "system".
+ -- Jörg
+
+
+1. This looks like PC, but where is DOS? How to get pcemu really running
+
+Pcemu is an emulator that emulates an 8086 CPU as well as a bunch of
+PC BIOS services, so it basically provides the functionality like an
+old PC/XT. Anyway, as with the XT too, the emulator requires something
+like an operating system to run with. Since we cannot ship MS-DOS or
+one of its variants along with this distribution (for legal reasons),
+you're now actually looking at a (sort of) "standalone operating system",
+just to get pcemu booted and running. All this system does is showing
+you this introduction.
+
+You will have to replace this mini-system by a physical image of a
+DOS boot floppy. The "system" currently running is booted from the
+file
+
+ /usr/local/lib/pcemu/DriveA.
+
+It pretends to be the image of a 720 KB diskette, which has been
+chosen as the default bootfile size.
+
+In order to obtain the image of a bootable DOS floppy, do the following:
+
+ Prepare a 720 KB floppy with a DOS system as you'd like
+ to run it later. Include all the good stuff you don't want
+ to miss there. Don't forget to put a simple text editor
+ there, so you can modify your configuration files later.
+
+ Put a copy of the file
+
+ /usr/local/lib/pcemu/C/emufs.sys
+
+ onto this diskette, and include a line like
+
+ device = a:\emufs.sys /usr/local/lib/pcemu/C
+
+ into the config.sys file on this diskette. This will
+ provide you with an interface to the BSD file system from
+ within your DOS session. (It actually pretends to be a
+ network drive.) According to David Hedley, you are also
+ advised to include the line
+
+ stacks = 9, 512
+
+ there to avoid stack overflow problems with the emulator.
+
+ If you want to retain a copy of the standalone "system" you
+ are currently looking at, move it away:
+
+ # cd /usr/local/lib/pcemu; mv DriveA StandaloneA
+
+ Now, make a copy of your disk by either:
+
+ - under BSD, perform a
+
+ # cp /dev/fd0.720 /usr/local/lib/pcemu/DriveA
+
+ (the number after the fd may vary for drives other than
+ the primary one), or
+
+ - under DOS, copy the file
+
+ /usr/local/lib/pcemu/C/dumpdisk.exe
+
+ to your DOS system and execute it. This will dump the
+ physical copy of either drive A or B to the file drivea
+ in your current (DOS) working directory. You can then move
+ this file to
+
+ /usr/local/lib/pcemu/DriveA
+
+ in your BSD system.
+
+Since pcemu needs to display the standard VGA font, you further need
+to tell your X server about the location of the font file. It has
+been put under
+
+ /usr/local/lib/pcemu/font/
+
+along with the necessary information for the X server. All you need
+to do is to tell your X server about it. This can either be done
+as a server default by including the directory into the FontPath
+section of your XF86Config file (this is for XFree86, refer to
+the documentation if you're using another X server). Alternatively,
+you can run the command
+
+ $ xset fp+ /usr/local/lib/pcemu/font
+
+when X11 is running to instruct your X server to append this directory
+to the font path. Should you wish to run pcemu across the network,
+remember that the fonts must be physically available at the server
+side, or you need to provide an X11 font server (xfs). Refer to
+the X11 documentation on how to setup this.
+
+
+That's all, now you should be able to run pcemu. Add required
+device = a:\emufs.sys /... lines to your config.sys as you
+need them. It's not wise to make the whole BSD hierarchy available
+since DOS does not provide multiuser protection.
+
+Should you wish to override some of the emulator defaults like
+size and location of the bootfile, you can do this by settig up a
+$HOME/.pcemurc file. Refer to sections 2. and 3. below.
+
+
+
+2. Informations about this FreeBSD port
+
+
+This `port' of pcemu to FreeBSD has been prepared by Jörg Wunsch.
+It is an only slightly modified version of David's code, a few
+problems have been fixed for the BSD compilation environment, and
+the location of the default boot file has been moved in order to
+get you started with just what you are reading now.
+
+The PostScript document David is mentioning under 3. below has
+been compressed and stored under
+
+ /usr/local/lib/pcemu/doc/report.ps.gz.
+
+It is huge however, so if you don't care much for it you might wish
+to remove it later.
+
+Since i'm living in Germany with a German keyboard, i found the
+original X11 KeySym to PC scancode translation unacceptable. Several
+scancodes have been unreachable for me. Hence i decided to add another
+section to the .pcemurc file allowing to instruct pcemu of specific
+keyboard layout semantics. They consist of the keyword keymap,
+followed by the desired PC scancode, an equal sign, and the character
+that is generated for this key under X11 without any shift keys. (Note
+that no space is allowed on either side of the equal sign.) This way
+i won't get a German key mapping under DOS, but at least a valid keyboard
+layout where all the scan codes can actually be generated at all.
+
+The appropriate section of my .pcemurc file looks like:
+
+keymap 12=ß
+keymap 13='
+keymap 21=z
+keymap 26=]
+keymap 27=+
+keymap 39=\
+keymap 40=[
+keymap 41=^
+keymap 43=#
+keymap 44=y
+keymap 53=-
+keymap 86=<
+
+
+Once :-) i will have filed all my modifications back to David, and
+perhaps they will be included into the regular distribution as well.
+
+Should you wish to contact me regarding this FreeBSD port, you can
+reach me as joerg_wunsch@uriah.heep.sax.de.
+
+
+
+
diff --git a/emulators/pcemu/files/bootstrap.shar b/emulators/pcemu/files/bootstrap.shar
new file mode 100644
index 000000000000..2d4a3193feb4
--- /dev/null
+++ b/emulators/pcemu/files/bootstrap.shar
@@ -0,0 +1,1086 @@
+# This is a shell archive. Save it in a file, remove anything before
+# this line, and then unpack it by entering "sh file". Note, it may
+# create directories; files and directories will be owned by you and
+# have default permissions.
+#
+# This archive contains:
+#
+# bootstrap/Makefile
+# bootstrap/crt0.S
+# bootstrap/display.c
+# bootstrap/help.txt
+# bootstrap/lcrt0.S
+# bootstrap/txt2asm.perl
+# bootstrap/xcrt0.S
+#
+echo x - bootstrap/Makefile
+sed 's/^X//' >bootstrap/Makefile << 'END-of-bootstrap/Makefile'
+XAS = as86
+XLD = ld86
+XCC = bcc
+XCFLAGS = -0
+XLDFLAGS = -0 ##-M
+X
+X
+X.SUFFIXES: .S .o
+X
+X.S.o:
+X $(AS) -o $@ $<
+X
+Xall: display.bin README.FreeBSD
+X
+X# The .com file is only to shortcut the development cycles when
+X# modifying something, you won't have to reboot pcemu with the
+X# new image over and over again.
+X#
+X#all: display.com
+X
+Xdisplay.com: display.o text.o crt0.o
+X $(LD) $(LDFLAGS) -T 0x100 -o display.tmp crt0.o display.o text.o
+X dd if=display.tmp of=$@ ibs=32 skip=1
+X rm -f display.tmp
+X
+Xdisplay.bin: display.o text.o lcrt0.o xcrt0.o
+X $(LD) $(LDFLAGS) -T 0x7c00 -o display.tmp \
+X lcrt0.o display.o text.o xcrt0.o
+X dd if=display.tmp of=$@ ibs=32 skip=1 obs=720k conv=osync
+X rm -f display.tmp
+X
+X# o expand the tabs
+X# o translate german ISO characters into IBM437
+X# o finally convert all this into assembler .ascii/.byte pseudoinstr's
+X#
+Xtext.S: help.txt txt2asm.perl
+X expand < help.txt |\
+X tr '\344\366\374\304\326\334\337' '\204\224\201\216\231\232\341' |\
+X ./txt2asm.perl > $@
+X
+X# maintain the README.FreeBSD from the help.txt
+X# looks magic, 'eh? :^)
+X# The readme consists of everything from section 1 up to before the
+X# headline of section 3. The highlighting characters will be removed.
+X#
+X# If you've never been using Perl before, don't worry. Let the lines
+X# below stand as they do. :-)
+XREADME.FreeBSD: help.txt Makefile
+X perl -e 'print "This is an excerpt of what you can see with";\
+X print " the standalone \"system\".\n -- J\366rg\n\n\n";\
+X while(<>) {last if /^[\001-\010\013-\037]1\./;}\
+X do {tr[\001-\010\013-\037]//d; print;}\
+X while(($$_=<>) && !m/^[\001-\010\013-\037]3\./);' \
+X < help.txt > $@
+X
+Xreallyclean: clean
+X rm -f display.bin README.FreeBSD
+X
+Xclean:
+X rm -f *.tmp *~ *.core *.o *.s display.com text.S
+X
+Xpack: all clean
+X rm -f ../../../files/bootstrapper.uu ../../../files/README.FreeBSD
+X gzip --best --force display.bin
+X uuencode display.bin.gz display.bin.gz > ../../../files/bootstrapper.uu
+X cp -p README.FreeBSD ../../../files/README.FreeBSD
+X rm -f display.bin.gz README.FreeBSD
+X
+X
+Xunpack:
+X rm -f display.bin README.FreeBSD
+X uudecode ../../../files/bootstrapper.uu
+X gunzip --force display.bin.gz
+X cp -p ../../../files/README.FreeBSD README.FreeBSD
+END-of-bootstrap/Makefile
+echo x - bootstrap/crt0.S
+sed 's/^X//' >bootstrap/crt0.S << 'END-of-bootstrap/crt0.S'
+X ;; Hey Emacs, this is an -*- asm -*- file.
+X ;;
+X ;; crt0 -- prologue for simple DOS .com file
+X ;;
+X ;; also implements exit(), by calling the DOS exit service
+X
+X use16
+X
+X entry _begin
+X_begin: jmp .start
+X
+X extern _main
+X
+X public _exit
+X_exit:
+X_exit.code set 4
+X
+X push bp
+X mov bp, sp
+X mov al, _exit.code[bp]
+X mov ah, 0x4c ; dos service, exit w/ status
+X int 0x21
+X
+X_exit.1: ; not reached (hopefully)
+X jmp _exit.1
+X
+X
+X.start:
+X call _main
+X call _exit
+X
+END-of-bootstrap/crt0.S
+echo x - bootstrap/display.c
+sed 's/^X//' >bootstrap/display.c << 'END-of-bootstrap/display.c'
+X/*
+X * display -- a simple program to display static text in a more(1)-like
+X * manner. Designed to run with simple BIOS services on a i*86-PC.
+X *
+X * Purpose of the program: provide a simple method for pcemu to display
+X * a text when there is no DOS boot image installed. This program will
+X * run as the bootfile then.
+X *
+X * Author: Joerg Wunsch, 95/03/10
+X * Placed in the public domain. Neither kind of warranty applies.
+X *
+X * Thanks to Bruce Evans for his bcc compiler. Made my work much
+X * easier.
+X */
+X
+X#define MAXROW 23
+X#define MAXCOL 79
+X#asm
+Xmaxrow: set 23
+Xmaxcol: set 79
+Xnl: set 10
+X#endasm
+X
+X#define WHITE 7
+X#define BROWN 6
+X#define MAGENTA 5
+X#define RED 4
+X#define CYAN 3
+X#define GREEN 2
+X#define BLUE 1
+X#define BLACK 0
+X#define HIGH 8
+X/* convenience: */
+X#define YELLOW (BROWN|HIGH) /* foreground color */
+X#define GRAY WHITE /* background color */
+X
+X#define NOCHANGE (-1) /* do not change color; for setattrib() */
+X
+X/*
+X * We use a special highlighting scheme: embedded control characters
+X * in the text toggle the attribute selection.
+X *
+X * Define attributes used for highlighting.
+X * NB: do not parenthise the macro expansions below, they are used as
+X * complete parameter lists for setattrib()!
+X */
+X
+X#define REGULAR BLACK, GRAY /* ^R */
+X#define BOLD WHITE|HIGH, RED|HIGH /* ^B */
+X#define EMPHS BLUE, GRAY /* ^E */
+X#define DOUBLE YELLOW, BLACK /* ^D */
+X
+X#define C_REGULAR ('R' & 0x1f)
+X#define C_BOLD ('B' & 0x1f)
+X#define C_EMPHS ('E' & 0x1f)
+X#define C_DOUBLE ('D' & 0x1f)
+X
+X#define K_CUP ((0x48 << 8) + 0) /* extended ASCII, cursor up */
+X#define K_CDN ((0x50 << 8) + 0) /* extended ASCII, cursor down */
+X#define K_PREV ((0x49 << 8) + 0) /* extended ASCII, page up */
+X#define K_NEXT ((0x51 << 8) + 0) /* extended ASCII, page down */
+X
+X/*
+X * Glue to link to the BIOS services.
+X */
+X
+Xchar attrib;
+Xchar row, col;
+X
+X
+Xvoid scroll(nlines)
+Xint nlines; /* if nlines == 0, clear entire region */
+X{
+X#asm
+X push bp
+X mov bp, sp
+X
+X xor bh, bh ; page 0
+X mov dx, *(maxcol + (maxrow << 8)); bottom/right corner
+X xor cx, cx ; top/left corner
+X mov al, 4[bp] ; nlines
+X mov bh, _attrib
+X mov ah, *6 ; video bios, scroll (clear) region
+X test al, al ; scroll back?
+X jns _scroll.1 ; positive value -> forward
+X inc ah ; scroll backwards
+X neg al
+X_scroll.1:
+X int 0x10
+X
+X pop bp
+X#endasm
+X}
+X
+Xvoid gotoxy(x, y)
+Xint x;
+Xint y;
+X{
+X#asm
+X push bp
+X mov bp, sp
+X
+X mov dl, 4[bp] ; x
+X mov _col, dl
+X mov dh, 6[bp] ; y
+X mov _row, dh
+X xor bh, bh ; page 0
+X mov ah, *2 ; video bios, set cursor
+X int 0x10
+X
+X pop bp
+X#endasm
+X}
+X
+Xvoid putchar(c)
+Xint c;
+X{
+X#asm
+X push bp
+X mov bp, sp
+X
+X mov al, 4[bp] ; c
+X mov bl, _attrib
+X xor bh, bh ; always page 0
+X mov cx, *1 ; just one char
+X mov ah, *9 ; video bios, write char
+X int 0x10
+X
+X pop bp
+X#endasm
+X if(col < MAXCOL)
+X gotoxy(col + 1, row);
+X}
+X
+X
+Xvoid cls()
+X{
+X scroll(0);
+X}
+X
+X
+Xint getchar()
+X{
+X#asm
+X xor ah, ah ; kbd bios, get keystroke
+X int 0x16
+X#endasm
+X}
+X
+Xvoid setattrib(foreground, background)
+Xint foreground;
+Xint background;
+X{
+X int i;
+X if(foreground == -1)
+X i = attrib & 0xf;
+X else
+X i = foreground & 0xf;
+X if(background == -1)
+X i |= (attrib & 0xf0);
+X else
+X i |= ((background & 0xf) << 4);
+X attrib = i;
+X}
+X
+X
+X/*
+X * Some auxiliary functions
+X */
+X
+X/*
+X * print one line of text up to a newline or a null character
+X */
+X
+Xchar *printline(s)
+Xchar *s;
+X{
+X register char c;
+X
+X while((c = *s++) && c != '\n')
+X switch(c)
+X {
+X case C_REGULAR:
+X setattrib(REGULAR);
+X break;
+X
+X case C_BOLD:
+X setattrib(BOLD);
+X break;
+X
+X case C_EMPHS:
+X setattrib(EMPHS);
+X break;
+X
+X case C_DOUBLE:
+X setattrib(DOUBLE);
+X break;
+X
+X default:
+X putchar(c);
+X }
+X
+X if(c == 0) s--;
+X return s;
+X}
+X
+X
+X/*
+X * display a message on the bottom line; if msg == 0, clear bottom line
+X */
+X
+Xvoid more(msg)
+Xchar *msg;
+X{
+X int i;
+X
+X gotoxy(0, MAXROW + 1);
+X if(msg) {
+X setattrib(YELLOW, BLUE);
+X (void)printline(msg);
+X setattrib(REGULAR);
+X } else {
+X setattrib(WHITE, BLACK);
+X for(i = 0; i < MAXCOL; i++) putchar(' ');
+X setattrib(REGULAR);
+X }
+X}
+X
+X
+X/*
+X * go back for numlines newline chars, starting at current, but not before
+X * initial
+X */
+X
+Xchar *goback(initial, current, numlines)
+Xchar *initial;
+Xchar *current;
+Xint numlines;
+X{
+X current--;
+X
+X while(numlines && current > initial)
+X if(*--current == '\n')
+X numlines--;
+X if(*current == '\n')
+X current++;
+X return current;
+X}
+X
+X
+X/*
+X * the static text is maintained separately in an (automatically generated)
+X * .S file
+X */
+X
+Xextern char textstr[]; /* do not declare this "char *" - bcc breaks */
+X
+X
+Xint main()
+X{
+X char *cp, *cp1;
+X int c;
+X int lineno;
+X
+X lineno = 0;
+X cp = textstr;
+X setattrib(REGULAR);
+X cls();
+X for(;;) {
+X gotoxy(0, lineno);
+X cp = printline(cp);
+X if(*cp == 0) break;
+X lineno++;
+X if(lineno == MAXROW + 1) {
+X for(;;) {
+X more("--More--");
+X c = getchar();
+X more(0);
+X
+X if(c & 0xff) /* regular ASCII */
+X c &= 0xff; /* strip scancode */
+X
+X switch(c) {
+X case ' ': /* page forward */
+X case K_NEXT:
+X lineno = 0;
+X cls();
+X goto out;
+X
+X case 'd': /* half page forward */
+X scroll((MAXROW + 1) / 2);
+X lineno -= (MAXROW + 1) / 2;
+X goto out;
+X
+X case 'b': /* page backward */
+X case K_PREV:
+X cp = goback(textstr, cp, 2 * (MAXROW + 1));
+X lineno = 0;
+X cls();
+X goto out;
+X
+X case '\r': /* one more line */
+X case '\n':
+X case K_CDN:
+X lineno--;
+X scroll(1);
+X goto out;
+X
+X case K_CUP: /* one line less */
+X cp1 = goback(textstr, cp, 2);
+X cp = goback(textstr, cp1, MAXROW);
+X if(cp == textstr) /* start of text, redisplay all */
+X {
+X lineno = 0;
+X cls();
+X }
+X else
+X {
+X scroll(-1);
+X gotoxy(0, 0);
+X (void)printline(cp);
+X cp = cp1;
+X lineno--;
+X }
+X goto out;
+X
+X case '?':
+X case 'h':
+X more(
+X"space: next page, d: half page, b: back page, CR, DWN: nxt line, UP: prv line"
+X );
+X (void)getchar();
+X more(0);
+X break;
+X
+X case 'q': /* quit the game */
+X goto done;
+X }
+X }
+X }
+X out:;
+X }
+X done:
+X more("Hit any key to quit.");
+X (void)getchar();
+X more(0);
+X
+X return 0;
+X}
+X
+END-of-bootstrap/display.c
+echo x - bootstrap/help.txt
+sed 's/^X//' >bootstrap/help.txt << 'END-of-bootstrap/help.txt'
+XPC Emulator v1.01alpha (C) 1994 University of Bristol
+XPlease report comments, bugs etc to hedley@cs.bris.ac.uk
+X
+X
+XThis is David Hedley's PC Emulator.
+X
+X
+X0. Table of contents
+X
+X 0. Table of contents
+X 1. How to get pcemu really running
+X 2. Informations about this FreeBSD port
+X 3. David's original README
+X 4. Copyright notice
+X
+X
+X
+X1. This looks like PC, but where is DOS? How to get pcemu really running
+X
+XPcemu is an emulator that emulates an 8086 CPU as well as a bunch of
+XPC BIOS services, so it basically provides the functionality like an
+Xold PC/XT. Anyway, as with the XT too, the emulator requires something
+Xlike an operating system to run with. Since we cannot ship MS-DOS or
+Xone of its variants along with this distribution (for legal reasons),
+Xyou're now actually looking at a (sort of) "standalone operating system",
+Xjust to get pcemu booted and running. All this system does is showing
+Xyou this introduction.
+X
+XYou will have to replace this mini-system by a physical image of a
+XDOS boot floppy. The "system" currently running is booted from the
+Xfile
+X
+X /usr/local/lib/pcemu/DriveA.
+X
+XIt pretends to be the image of a 720 KB diskette, which has been
+Xchosen as the default bootfile size.
+X
+XIn order to obtain the image of a bootable DOS floppy, do the following:
+X
+X Prepare a 720 KB floppy with a DOS system as you'd like
+X to run it later. Include all the good stuff you don't want
+X to miss there. Don't forget to put a simple text editor
+X there, so you can modify your configuration files later.
+X
+X Put a copy of the file
+X
+X /usr/local/lib/pcemu/C/emufs.sys
+X
+X onto this diskette, and include a line like
+X
+X device = a:\emufs.sys /usr/local/lib/pcemu/C
+X
+X into the config.sys file on this diskette. This will
+X provide you with an interface to the BSD file system from
+X within your DOS session. (It actually pretends to be a
+X network drive.) According to David Hedley, you are also
+X advised to include the line
+X
+X stacks = 9, 512
+X
+X there to avoid stack overflow problems with the emulator.
+X
+X If you want to retain a copy of the standalone "system" you
+X are currently looking at, move it away:
+X
+X # cd /usr/local/lib/pcemu; mv DriveA StandaloneA
+X
+X Now, make a copy of your disk by either:
+X
+X - under BSD, perform a
+X
+X # cp /dev/fd0.720 /usr/local/lib/pcemu/DriveA
+X
+X (the number after the fd may vary for drives other than
+X the primary one), or
+X
+X - under DOS, copy the file
+X
+X /usr/local/lib/pcemu/C/dumpdisk.exe
+X
+X to your DOS system and execute it. This will dump the
+X physical copy of either drive A or B to the file drivea
+X in your current (DOS) working directory. You can then move
+X this file to
+X
+X /usr/local/lib/pcemu/DriveA
+X
+X in your BSD system.
+X
+XSince pcemu needs to display the standard VGA font, you further need
+Xto tell your X server about the location of the font file. It has
+Xbeen put under
+X
+X /usr/local/lib/pcemu/font/
+X
+Xalong with the necessary information for the X server. All you need
+Xto do is to tell your X server about it. This can either be done
+Xas a server default by including the directory into the FontPath
+Xsection of your XF86Config file (this is for XFree86, refer to
+Xthe documentation if you're using another X server). Alternatively,
+Xyou can run the command
+X
+X $ xset fp+ /usr/local/lib/pcemu/font
+X
+Xwhen X11 is running to instruct your X server to append this directory
+Xto the font path. Should you wish to run pcemu across the network,
+Xremember that the fonts must be physically available at the server
+Xside, or you need to provide an X11 font server (xfs). Refer to
+Xthe X11 documentation on how to setup this.
+X
+X
+XThat's all, now you should be able to run pcemu. Add required
+Xdevice = a:\emufs.sys /... lines to your config.sys as you
+Xneed them. It's not wise to make the whole BSD hierarchy available
+Xsince DOS does not provide multiuser protection.
+X
+XShould you wish to override some of the emulator defaults like
+Xsize and location of the bootfile, you can do this by settig up a
+X$HOME/.pcemurc file. Refer to sections 2. and 3. below.
+X
+X
+X
+X2. Informations about this FreeBSD port
+X
+X
+XThis `port' of pcemu to FreeBSD has been prepared by Jörg Wunsch.
+XIt is an only slightly modified version of David's code, a few
+Xproblems have been fixed for the BSD compilation environment, and
+Xthe location of the default boot file has been moved in order to
+Xget you started with just what you are reading now.
+X
+XThe PostScript document David is mentioning under 3. below has
+Xbeen compressed and stored under
+X
+X /usr/local/lib/pcemu/doc/report.ps.gz.
+X
+XIt is huge however, so if you don't care much for it you might wish
+Xto remove it later.
+X
+XSince i'm living in Germany with a German keyboard, i found the
+Xoriginal X11 KeySym to PC scancode translation unacceptable. Several
+Xscancodes have been unreachable for me. Hence i decided to add another
+Xsection to the .pcemurc file allowing to instruct pcemu of specific
+Xkeyboard layout semantics. They consist of the keyword keymap,
+Xfollowed by the desired PC scancode, an equal sign, and the character
+Xthat is generated for this key under X11 without any shift keys. (Note
+Xthat no space is allowed on either side of the equal sign.) This way
+Xi won't get a German key mapping under DOS, but at least a valid keyboard
+Xlayout where all the scan codes can actually be generated at all.
+X
+XThe appropriate section of my .pcemurc file looks like:
+X
+Xkeymap 12=ß
+Xkeymap 13='
+Xkeymap 21=z
+Xkeymap 26=]
+Xkeymap 27=+
+Xkeymap 39=\
+Xkeymap 40=[
+Xkeymap 41=^
+Xkeymap 43=#
+Xkeymap 44=y
+Xkeymap 53=-
+Xkeymap 86=<
+X
+X
+XOnce :-) i will have filed all my modifications back to David, and
+Xperhaps they will be included into the regular distribution as well.
+X
+XShould you wish to contact me regarding this FreeBSD port, you can
+Xreach me as joerg_wunsch@uriah.heep.sax.de.
+X
+X
+X
+X
+X3. Here's David's original README file:
+X
+X
+X PC Emulator for Unix and X Windows
+X
+XAs the title suggests, this is a Unix/X windows program which is
+Xdesigned to emulate a standard 8086 based PC.
+X
+XIn its current form it runs most text based programs. The programs I have
+Xtried and found to work are as follows:
+X
+XMSDOS 5.0 MSDOS 6.2
+XWordPerfect 5.1 Borland C++ 2.0
+XTurbo Debugger 2.51 Turbo Assembler 2.51
+XBBCBasic 4.61 MSDOS QBasic
+XMSDOS GWBASIC Virtually all program that came with MSDOS 5
+XHitchhiker's Guide to the Galaxy PC Magazine's ANSI.COM
+XSemWare's QEdit 2.1 Norton Utils 4.50 Advanced Edition
+XNorton Utils 6.0 Xtree Professional 1.1
+XPowerMeter Utils Autoroute (ancient version)
+XMinitab 8.0 Microsoft Diagnostics
+X
+XThis is all the programs I could lay my hands on which were text based
+Xand could run on an 8086
+X
+XThe emulator runs at about 8-10MHz 80286 speed on a Sun SparcStation
+X10/40 (without the -mviking flag) and at about 6MHz 8088 speed on a
+X33MHz 80486 box running Linux.
+X
+XI have included a Postscript representation of my project report. It's
+Xa bit out of date now, but it's the closest thing I've got to
+Xdocumentation! I'll do some kind of latex thing for the next
+Xrelease....
+X
+XThe program rather hogs the cpu but unmapping the window (iconifying
+Xit) will put it to sleep.
+X
+XThe most recent version of this program will always be in ftp.cs.bris.ac.uk
+Xcurrently in the directory /users/hedley
+X
+XINSTALLING THE EMULATOR
+X
+XEdit the Makefile to change the OPTIONS, CFLAGS and XROOT to be
+Xappropriate for your system (I am assuming you are using GNU GCC,
+Xalthough any ANSI C compiler should work just as well). Ensure you are
+Xusing the best (speed) optimisations possible (e.g. -O2 -fomit-frame-poiner)
+X
+XEdit the file mytypes.h and ensure that the types for INT8, UINT8,
+XINT16, UINT16 etc are correct. Hopefully nothing need be changed in
+Xthis file, but you never can tell... I have assumed that 'char's are 8
+Xbit bytes, 'short's are 16 bit words and 'long's are 32 bit words. If
+Xyour compiler treats these differently to the above then you will have
+Xto edit this header file.
+X
+XType 'make' and go away and have a cup of tea! Compiling 'cpu.c' takes
+Xa while (and quite a bit of memory!).
+X
+XGet a floppy disk of the same size/type as you specified in the Makefile
+X(i.e. if you chose -DBOOT720, then you'll need a 3.5" 720k disk). Install
+XMSDOS on it. Copy the files 'config.sys', 'emufs.sys' and 'lredir.exe' from
+Xthe 'programs' directory onto this floppy disk. Shove it in your Unix box
+Xand type cp /dev/fd0 DriveA This should create a 720k (or whatever) file
+Xwhich the emulator can boot from. If you do not have access to a Unix box
+Xwith a floppy disk on it, then you can use the supplied 'dumpdisk' program
+Xto create a disk image. All you need is access to a PC. Simply put in a
+Xbootable MSDOS disk into the drive and type dumpdisk A (or dumpdisk B if in
+Xdrive B). The program will copy the entire disk to a file called
+X'drivea'. You must then transfer it to your Unix box...
+X
+XYou then need to convert the vga font (vga.bdf) into a font format
+Xyour X server can understand (either SNF or PCF) using either
+X'bdftosnf' or 'bdftopcf' and install the resulting font file somewhere
+Xwhere your X server can find it. Then type 'mkfontdir' to rebuild the
+Xfonts.dir file and then type 'xset fp rehash' to tell your X server
+Xabout the new font. If you type 'xlsfonts' you should see 'vga' as one
+Xof the fonts listed. If not, then something has gone wrong. I may or
+Xmay not be able to help - it depends on your local setup. The emulator
+Xwill run without the font as it uses the standard 8x16 X11 font -
+Xalthough most programs which use the extended character set will look
+Xpretty terrible. A warning will be displayed if the correct VGA font
+Xcannot be found. If you are using openwindows, you will have to type
+X'convertfont' and then 'bldfamily'
+X
+XYou should now be in a position to run the emulator
+X
+XBy default, the emulator requires the disk image called 'DriveA' to be in
+Xthe current directory or else it will complain. If you don't like this,
+Xthen you can change the file the emulator boots from by altering your
+X.pcemurc file (see below) or by changing the default at compile time (by
+Xmodifying the Makefile)
+X
+XOnce run, the emulator should come up with the usual MSDOS banner and
+Xrequest the current date and time (which should already be
+Xcorrect). You can now run PC programs, mount Unix directories as
+Xdrives etc. You will already have one drive redirection - drive C: is
+Xthe Unix root directory. To mount further directories as drives, you
+Xmust use the program 'lredir'. Consult the file 'lredir.readme' for
+Xinstructions...
+X
+X The .pcemurc file
+X
+XAt present this file allows a few things to be changed at run time. If this
+Xfile is found (either in the current directory or in your home directory),
+Xthen it is read and parsed and the values overwriting the equivalent
+Xcompile time options. Currently the only options supported at present are:
+X
+Xbootfile diskfile
+X
+Xwhere diskfile is the disk image you want to boot from (no quotes or
+Xanything are needed and the filename must not contain white spaces).
+X
+Xboottype type
+X
+Xwhere type is either 360, 720, 144 or 12. This tells the emulator the type
+Xof disk the disk image file represents (360k, 720k, 1.44MB, 1.2MB
+Xrespectively).
+X
+Xupdatespeed n
+X
+Xwhere n is an integer > 0
+XThis is the rate at which the screen memory gets checked for changes (and
+Xhence the update speed at which the screen gets updated for non-BIOS
+Xwrites). n is measured in internal interrupt ticks of which there are ~72.8
+Xper second (depends on the resolution of the system timer).
+X
+Xcursorspeed n
+X
+Xwhere n is an integer
+XThis specifies how fast the cursor should flash. Flashing the cursor can
+Xtake a fair amount of bandwidth and so on slow/heavily loaded networks it
+Xmay be best to slow down the cursor flashing. Setting n to 0 or less will
+Xdisable cursor flashing - the cursor will be permanently on.
+X
+XAn example .pcemurc file can be found in this directory.
+X
+XIf you have problems compiling or running the emulator, then please contact
+Xme giving details of what went wrong (along with your computer type
+Xetc).
+X
+XArchitectures tested:
+X
+XComputer OS Comments
+X-----------------------------------------------------------------------------
+XPC 486/33 Linux 0.99.14w Runs quite well. A bit pointless though :)
+XSun 3/60 SunOS 4.1.x Takes an age to compile and not really worth
+X the effort...
+XSparcStation 10 SunOS 4.1.3 Runs well. Takes > 20MB RAM to compile though
+XHP 755/99 HPUX Runs OK (>25MB RAM to compile...)
+XSun 4 Solaris 2.3 Runs OK
+XRS6000 ??? Had a few problems getting it to compile.
+X Getting there slowly though.
+XSGI Indigo IRIX 4.?.? Doesn't work if compiled with optimisation
+X using the standard compiler. Haven't tried
+X it using gcc yet...
+X
+XAs you can see this list is quite small. The main limiting factor is the range
+Xof machines I have access to. If anyone else can get it running on other
+Xarchitectures then please contact me!
+X
+XWarning: This program is not secure! Do not make is suid or sgid anything
+Xunless you wish to compromise the security of your system!
+X
+XEMULATOR LIMITATIONS etc
+X
+XSome parts of the PC architecture are emulated better than others. The
+XBIOS has been partly implemented - enough to get MSDOS to boot and to
+Xallow most programs to run. Anyhow, most decent programs bypass the
+XBIOS for screen access. BIOS Disk calls for drive A have been mostly
+Xemulated, although formatting doesn't work.
+X
+XSome of the hardware has been emulated but not much. Timer interrupts
+Xare generated by the system but there is now way (at present) to
+Xreprogram the timer. The Programmable Interrupt Controller has been
+Xemulated in part to respond to the End Of Interrupt command and reads
+Xfrom and writes to the mask register should work OK.
+X
+XNone of the VGA hardware has been emulated at present (apart from
+Xscreen updating) although this will change in the near future. Mode
+Xchanges must therefore be done through the BIOS.
+X
+XThe keyboard has been mostly emulated. The program converts X11
+Xkeysyms to raw PC scan codes and then generates an interrupt 9 as per
+Xusual. There is a BIOS routine which takes these scan codes and
+Xgenerates the correct BIOS ASCII/scan code pair. The keysyms used can
+Xbe found in the module 'xstuff.c'. In the future these keysyms will be
+Xread in from a file at run time.
+X
+XTHANKS
+X
+XThanks go to the following:
+X
+XAndy Norman at HPLabs, Bristol (ange@hpl.hewlett-packard.co.uk) for the HP
+Xport.
+XDieter Becker (becker@med-in.uni-sb.de) for help with the Solaris port
+XKlaas Esselink (esselin1@ksla.nl) for help with the RS6000 port
+X
+XPlease report bugs/comments etc to me (hedley@cs.bris.ac.uk) and I'll
+Xdo my best to sort them out (no guarantees though). After June 25th I
+Xwill be leaving University and will not be able to check email very
+Xfrequently - please be patient if you want a response - I will reply
+Xeventually.
+X
+XHave fun...
+X
+XDavid
+X
+X
+X
+X
+X4. And finally, the Copyright notice:
+X
+X
+XAll files, documentation etc with the exception of 'mfs.c',
+X'emufs.sys', 'emufs.S', 'lredir.exe', 'lredir.c' and 'lredir.readme'
+Xare Copyright (C) 1994 University of Bristol, England
+X
+XPermission is granted to use, copy, modify, and distribute this
+Xsoftware and its documentation for any non-commercial purpose,
+Xprovided that the above copyright notice appear in all copies and that
+Xboth that copyright notice and this permission notice appear in the
+Xsupporting documentation.
+X
+XBECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+XFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT
+XWHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER
+XPARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
+XEITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+XIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+XPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+XPROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
+XTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+X
+XIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+XWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+XREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
+XDAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
+XDAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
+X(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+XINACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
+XTHE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
+XOR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+X
+X---------------------------------------------------------------------
+X
+X'mfs.c', 'emufs.sys' and 'emufs.S' are covered by the following
+Xnotice:
+X
+X Mach Operating System
+X Copyright (c) 1993,1992,1991,1990 Carnegie Mellon University
+X Copyright (c) 1991 IBM Corporation
+X All Rights Reserved.
+X
+X Permission to use, copy, modify and distribute this software and its
+X documentation is hereby granted, provided that both the copyright
+X notice and this permission notice appear in all copies of the
+X software, derivative works or modified versions, and any portions
+X thereof, and that both notices appear in supporting documentation,
+X and that the nema IBM not be used in advertising or publicity
+X pertaining to distribution of the software without specific, written
+X prior permission.
+X
+X CARNEGIE MELLON AND IBM ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+X CONDITION. CARNEGIE MELLON AND IBM DISCLAIM ANY LIABILITY OF ANY KIND FOR
+X ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+X
+X Carnegie Mellon requests users of this software to return to
+X
+X Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+X School of Computer Science
+X Carnegie Mellon University
+X Pittsburgh PA 15213-3890
+X
+X any improvements or extensions that they make and grant Carnegie Mellon
+X the rights to redistribute these changes.
+X
+X--------------------------------------------------------------------
+X
+X'lredir' was written by Tim Bird (Tim_R_Bird@Novell.COM)
+X
+END-of-bootstrap/help.txt
+echo x - bootstrap/lcrt0.S
+sed 's/^X//' >bootstrap/lcrt0.S << 'END-of-bootstrap/lcrt0.S'
+X ;; Hey Emacs, this is an -*- asm -*- file
+X ;;
+X ;; lcrt0 -- C prologue for simple boot-loaded module
+X ;;
+X ;; Bootstraps a simple .com-style area 512 bytes off its
+X ;; own start address, by loading it via the BIOS int 0x13
+X ;; interface.
+X ;; Needs an epilogue counterpart to know about the end
+X ;; address.
+X
+XSECSPERTRACK: set 9 ; bump this for boot disk size != 720 KB
+X
+X use16
+X
+X .text
+X extern _main
+X
+X .data
+X extern .endfile
+X
+X .text
+X
+X entry .begin
+X.begin:
+X
+X mov ax, .endfile
+X mov bx, .startfile ; from epilogue
+X sub ax, bx ; # bytes to load
+X add ax, 511 ; round to full sectors
+X mov cl, 9
+X shr ax, cl ; make # sectors
+X
+X push cs
+X push cs
+X pop es
+X pop ds
+X
+X mov bx, .startfile ; load here
+X
+X mov si, ax ; sector count
+X mov cx, 2 ; starting cylinder/sector
+X mov dx, 0 ; starting head/drive A
+X.begin.loop:
+X mov ax, 1 + (2 << 8); read one sector
+X int 0x13 ; just do it
+X
+X add bx, 512
+X dec si
+X jz .begin.done
+X inc cl
+X cmp cl, SECSPERTRACK + 1
+X jne .begin.loop
+X mov cl, 1
+X inc dh
+X cmp dh, 1 + 1
+X jne .begin.loop
+X mov dh, 0
+X inc ch
+X jmp .begin.loop
+X
+X.begin.done:
+X call _main
+X int 0x19 ; reboot -> this will quit pcemu
+X
+X
+X ;; .blkb (.begin - $ + 512) ; cannot be done in as86
+X ;; XXX IF ANYTHING IS BEING CHANGED IN THIS FILE, ADJUST THE
+X ;; NUMBER BELOW! Link with -M and adjust the number so that,
+X ;; when linked to address 0x7c00, the symbol .startfile will
+X ;; be equal 0x7e00.
+X .blkb 443
+X
+X export .startfile
+X.startfile:
+X
+END-of-bootstrap/lcrt0.S
+echo x - bootstrap/txt2asm.perl
+sed 's/^X//' >bootstrap/txt2asm.perl << 'END-of-bootstrap/txt2asm.perl'
+X#!/usr/bin/perl
+X#
+X# Convert an input text into a sequence of .ascii or .byte assembler
+X# instructions. Cares to express any non-printable ASCII character
+X# as well as the double quote and backslashes as a hexadecimal .byte
+X# instruction.
+X#
+X
+X# print one line of input text
+Xsub pline
+X{
+X local($s) = @_;
+X local($i, $k, $ele, $c);
+X
+X # delete any null char to avoid confusion (we use null as the string
+X # delimiter)
+X $s =~ tr/\000//d;
+X
+X $i = 0;
+X #
+X # split the string into substrings of printable characters (where
+X # we can write a singe .ascii instruction for each of them)
+X #
+X foreach $ele (split(/[\001-\037\"\\\177-\377]/, $s)) {
+X next if length($ele) == 0; # split returns a null string for
+X # succeeding delimiters which dont wann see
+X
+X $k = index($s, $ele, $i); # see if there are any non-pritables
+X # just before the current substring
+X while($i < $k) { # if so, write a .byte for each
+X $c = substr($s, $i++, 1);
+X printf "\t.byte\t0x%02x\n", ord($c);
+X }
+X print "\t.ascii\t\"$ele\"\n"; # this substring
+X $i += length($ele);
+X }
+X while($i < length($s)) { # are there any non-printables left at end?
+X $c = substr($s, $i++, 1);
+X printf "\t.byte\t0x%02x\n", ord($c);
+X }
+X print "\t.byte\tnl\n"; # dont forget the final newline
+X}
+X
+X
+X#
+X# the asm file prologue:
+X#
+X# declare a synonym for newline, and define the entry symbol "_textstr"
+X#
+Xprint ".data\nnl:\tset\t0x0a\n.globl _textstr\n\n_textstr:\n";
+X
+X# process all lines now
+Xwhile($_ = <>) {
+X chop;
+X &pline($_);
+X}
+X
+X# the epilogue: terminate with a null byte
+Xprint "\t.byte\t0\n";
+END-of-bootstrap/txt2asm.perl
+echo x - bootstrap/xcrt0.S
+sed 's/^X//' >bootstrap/xcrt0.S << 'END-of-bootstrap/xcrt0.S'
+X ;; Hey Emacs, this is -*- asm -*- code
+X use16
+X .data ; ld86 places .data after .text
+X export .endfile
+X.endfile:
+END-of-bootstrap/xcrt0.S
+exit
+
diff --git a/emulators/pcemu/files/bootstrapper.uu b/emulators/pcemu/files/bootstrapper.uu
new file mode 100644
index 000000000000..4cd0349e03a7
--- /dev/null
+++ b/emulators/pcemu/files/bootstrapper.uu
@@ -0,0 +1,250 @@
+begin 644 display.bin.gz
+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
+M>Q7Z_QQUN_CH,!O(.WT<7?*^4DUZ;8L%````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+J````````````````````````````````````````_I_YOPQ;:W@`0`L`
+`
+end
diff --git a/emulators/pcemu/files/patch-aa b/emulators/pcemu/files/patch-aa
new file mode 100644
index 000000000000..3d41e61da296
--- /dev/null
+++ b/emulators/pcemu/files/patch-aa
@@ -0,0 +1,61 @@
+*** Makefile.orig Mon Mar 27 21:27:28 1995
+--- Makefile Mon Mar 27 22:52:07 1995
+***************
+*** 49,58 ****
+ # been known to crash the emulator when running on certain machines (80x86
+ # based PCs under Linux, and HPs running HPUX).
+
+ CC = gcc
+! OPTIONS = -DBOOT720 -DBIG_ENDIAN -DALIGNED_ACCESS -DBIGCASE -DINLINE_FUNCTIONS
+! XROOT = /usr/local/X11R5
+! CFLAGS = -I$(XROOT)/include -O2 #-fomit-frame-pointer
+
+ # You may need to add -N to the LFLAGS if you get sporadic segmentation
+ # faults. So far I have only needed to do this when compiling under Linux
+--- 49,63 ----
+ # been known to crash the emulator when running on certain machines (80x86
+ # based PCs under Linux, and HPs running HPUX).
+
++ .include "Makefile.inc"
++
+ CC = gcc
+! #OPTIONS = -DBOOT720 -DBIG_ENDIAN -DALIGNED_ACCESS -DBIGCASE -DINLINE_FUNCTIONS
+! OPTIONS = -DBOOT720 -DLITTLE_ENDIAN -DBIGCASE -DINLINE_FUNCTIONS \
+! -DBOOTFILE=\"${LOCALPREFIX}/lib/pcemu/DriveA\"
+! #XROOT = /usr/local/X11R5
+! XROOT = /usr/X11R6
+! CFLAGS = -I$(XROOT)/include -O2 -pipe #-fomit-frame-pointer
+
+ # You may need to add -N to the LFLAGS if you get sporadic segmentation
+ # faults. So far I have only needed to do this when compiling under Linux
+***************
+*** 86,88 ****
+--- 91,118 ----
+
+ clean:
+ rm $(PROGNAME) *.o
++
++ bootstrapper:
++ (cd bootstrap; make unpack)
++
++ #mode 0666 is required for DriveA, alas
++ install: pcemu bootstrapper
++ -mkdir ${LOCALPREFIX}/lib/pcemu \
++ ${LOCALPREFIX}/lib/pcemu/doc \
++ ${LOCALPREFIX}/lib/pcemu/font \
++ ${LOCALPREFIX}/lib/pcemu/C \
++ ${LOCALPREFIX}/bin
++ install -c -s -o bin -g bin pcemu ${LOCALPREFIX}/bin/
++ install -c -m 666 bootstrap/display.bin \
++ ${LOCALPREFIX}/lib/pcemu/DriveA
++ install -c -m 644 BUGS CHANGES README TODO bootstrap/README.FreeBSD \
++ programs/lredir.readme \
++ ${LOCALPREFIX}/lib/pcemu/doc/
++ rm -f ${LOCALPREFIX}/lib/pcemu/doc/report.ps.gz
++ gzip --best < report.ps > ${LOCALPREFIX}/lib/pcemu/doc/report.ps.gz
++ rm -f ${LOCALPREFIX}/lib/pcemu/font/vga.pcf.Z
++ bdftopcf vga.bdf | compress > ${LOCALPREFIX}/lib/pcemu/font/vga.pcf.Z
++ mkfontdir ${LOCALPREFIX}/lib/pcemu/font
++ install -c -m 644 programs/vga50.com programs/config.sys \
++ programs/dumpdisk.exe programs/lredir.exe \
++ ${LOCALPREFIX}/lib/pcemu/C
diff --git a/emulators/pcemu/files/patch-ab b/emulators/pcemu/files/patch-ab
new file mode 100644
index 000000000000..877cfdbaa53f
--- /dev/null
+++ b/emulators/pcemu/files/patch-ab
@@ -0,0 +1,79 @@
+*** cpu.c.orig Wed Jun 22 16:24:50 1994
+--- cpu.c Tue Jan 24 18:37:17 1995
+***************
+*** 1127,1132 ****
+--- 1127,1133 ----
+
+ static INLINE2 void i_daa(void)
+ {
++ /* Opcode 0x27 */
+ if (AF || ((*bregs[AL] & 0xf) > 9))
+ {
+ *bregs[AL] += 6;
+***************
+*** 1300,1305 ****
+--- 1301,1330 ----
+ c_ss = SegToMemPtr(SS);
+ }
+
++ static INLINE2 void i_das(void)
++ {
++ /* Opcode 0x2f */
++ if (AF || ((*bregs[AL] & 0xf) > 9))
++ {
++ *bregs[AL] -= 6;
++ AF = 1;
++ }
++ else
++ AF = 0;
++
++ if (CF || (*bregs[AL] > 0x9f))
++ {
++ *bregs[AL] -= 0x60;
++ CF = 1;
++ }
++ else
++ CF = 0;
++
++ SetPF(*bregs[AL]);
++ SetSFB(*bregs[AL]);
++ SetZFB(*bregs[AL]);
++ }
++
+
+ /* most XOR instructions go here */
+
+***************
+*** 4140,4146 ****
+ {
+ fprintf(stderr,"Error: Unimplemented opcode %02X at cs:ip = %04X:%04X\n",
+ c_cs[ip-1],sregs[CS],ip-1);
+! exit(1);
+ }
+
+
+--- 4165,4171 ----
+ {
+ fprintf(stderr,"Error: Unimplemented opcode %02X at cs:ip = %04X:%04X\n",
+ c_cs[ip-1],sregs[CS],ip-1);
+! /* exit(1); */
+ }
+
+
+***************
+*** 4218,4224 ****
+ case 0x2c: i_sub_ald8(); break;
+ case 0x2d: i_sub_axd16(); break;
+ case 0x2e: i_cs(); break;
+! case 0x2f: i_notdone(); break;
+ case 0x30: i_xor_br8(); break;
+ case 0x31: i_xor_wr16(); break;
+ case 0x32: i_xor_r8b(); break;
+--- 4243,4249 ----
+ case 0x2c: i_sub_ald8(); break;
+ case 0x2d: i_sub_axd16(); break;
+ case 0x2e: i_cs(); break;
+! case 0x2f: i_das(); break;
+ case 0x30: i_xor_br8(); break;
+ case 0x31: i_xor_wr16(); break;
+ case 0x32: i_xor_r8b(); break;
diff --git a/emulators/pcemu/files/patch-ac b/emulators/pcemu/files/patch-ac
new file mode 100644
index 000000000000..829aee16a4ef
--- /dev/null
+++ b/emulators/pcemu/files/patch-ac
@@ -0,0 +1,54 @@
+*** mfs.c.orig Wed Jun 22 16:24:51 1994
+--- mfs.c Tue Jan 24 18:41:20 1995
+***************
+*** 319,325 ****
+--- 319,327 ----
+ #include <errno.h>
+ #include <sys/param.h>
+ #include <stdlib.h>
++ #if !__STDC__
+ #include <malloc.h>
++ #endif
+
+ #ifdef SOLARIS
+ #include <fcntl.h>
+***************
+*** 327,335 ****
+ #endif
+
+ #if defined(SGI) || defined(RS6000)
+! #include <sys/statfs.h>
+ #else
+! #include <sys/vfs.h>
+ #endif
+
+
+--- 329,342 ----
+ #endif
+
+ #if defined(SGI) || defined(RS6000)
+! # include <sys/statfs.h>
+ #else
+! # include <sys/param.h>
+! # if BSD >= 199103
+! # include <sys/mount.h>
+! # else
+! # include <sys/vfs.h>
+! # endif /* new BSD */
+ #endif
+
+
+*** mfs.h.orig Wed Jun 22 16:24:51 1994
+--- mfs.h Tue Jan 24 18:37:18 1995
+***************
+*** 45,51 ****
+--- 45,53 ----
+
+ #include "mfs_link.h"
+
++ #if BSD < 199306 /* newer BSDs have it in <stdio.h> */
+ extern char *sys_errlist[];
++ #endif
+
+ #if !defined(__hpux) && !defined(SOLARIS) && !defined(SGI) && !defined(RS6000)
+ #define strerror(x) sys_errlist[x]
diff --git a/emulators/pcemu/files/patch-ad b/emulators/pcemu/files/patch-ad
new file mode 100644
index 000000000000..8f77b3a7d44e
--- /dev/null
+++ b/emulators/pcemu/files/patch-ad
@@ -0,0 +1,94 @@
+*** main.c.orig Wed Jun 22 16:24:50 1994
+--- main.c Tue Jan 24 18:37:18 1995
+***************
+*** 39,44 ****
+--- 39,56 ----
+ exit(0);
+ }
+
++ static char *set_keymap(char *buf)
++ {
++ char c;
++ int code;
++
++ if(sscanf(buf, " %*s %i=%c", &code, &c) != 2)
++ return "usage: keymap code=char";
++ if(put_scan_table(code, (unsigned char)c))
++ return "bad value for keymap";
++ return 0;
++ }
++
+
+ void check_error(char *msg, int line)
+ {
+***************
+*** 89,94 ****
+--- 101,108 ----
+ check_error(set_update_rate(strtol(value, NULL,10)), line);
+ else if (strcasecmp(keyword,"cursorspeed") == 0)
+ check_error(set_cursor_rate(strtol(value, NULL,10)), line);
++ else if (strcasecmp(keyword,"keymap") == 0)
++ check_error(set_keymap(buffer), line);
+ else
+ check_error("Syntax error in .pcemu file", line);
+ }
+*** xstuff.c.orig Wed Jun 22 16:24:51 1994
+--- xstuff.c Tue Jan 24 18:37:19 1995
+***************
+*** 316,322 ****
+ }
+
+
+! static BYTE scan_table1[] =
+ {
+ 0x39, 0x02,
+ #ifdef KBUK /* double quotes, hash symbol */
+--- 316,322 ----
+ }
+
+
+! static BYTE scan_table1[256 - 0x20] =
+ {
+ 0x39, 0x02,
+ #ifdef KBUK /* double quotes, hash symbol */
+***************
+*** 360,365 ****
+--- 360,366 ----
+ #else
+ 0x29,
+ #endif
++ 0
+ };
+
+
+***************
+*** 458,463 ****
+--- 459,474 ----
+ return (scan_table2[i].scan_code);
+
+ return 0;
++ }
++
++
++ int put_scan_table(BYTE code, unsigned char c)
++ {
++ /* interface to overload scan_table1 from .pcemurc */
++ if(c < ' ' || c >= ' ' + sizeof scan_table1)
++ return 1;
++ scan_table1[c - ' '] = code;
++ return 0;
+ }
+
+
+*** xstuff.h.orig Wed Jun 22 16:24:51 1994
+--- xstuff.h Tue Jan 24 18:37:19 1995
+***************
+*** 17,22 ****
+--- 17,23 ----
+
+ void start_X(void);
+ void end_X(void);
++ int put_scan_table(BYTE, unsigned char);
+ void process_Xevents(void);
+ void flush_X(void);
+
diff --git a/emulators/pcemu/files/patch-ae b/emulators/pcemu/files/patch-ae
new file mode 100644
index 000000000000..6ff371a2fc8c
--- /dev/null
+++ b/emulators/pcemu/files/patch-ae
@@ -0,0 +1,10 @@
+*** programs/config.sys.orig Mon Mar 27 21:27:23 1995
+--- programs/config.sys Mon Mar 27 22:19:26 1995
+***************
+*** 1,2 ****
+! device=emufs.sys /
+! stacks 9,512
+--- 1,3 ----
+! device=\emufs.sys /usr/local/lib/pcemu/C
+! stacks 9,512
+!
diff --git a/emulators/pcemu/pkg-comment b/emulators/pcemu/pkg-comment
new file mode 100644
index 000000000000..1e64f1323c9d
--- /dev/null
+++ b/emulators/pcemu/pkg-comment
@@ -0,0 +1 @@
+pcemu - An 8086 PC emulator, written by By David Hedley (hedley@cs.bris.ac.uk)
diff --git a/emulators/pcemu/pkg-descr b/emulators/pcemu/pkg-descr
new file mode 100644
index 000000000000..812ce717b029
--- /dev/null
+++ b/emulators/pcemu/pkg-descr
@@ -0,0 +1,238 @@
+[This is David Hedley's original README, FreeBSD port comments below]
+
+ PC Emulator for Unix and X Windows
+
+As the title suggests, this is a Unix/X windows program which is
+designed to emulate a standard 8086 based PC.
+
+In its current form it runs most text based programs. The programs I have
+tried and found to work are as follows:
+
+MSDOS 5.0 MSDOS 6.2
+WordPerfect 5.1 Borland C++ 2.0
+Turbo Debugger 2.51 Turbo Assembler 2.51
+BBCBasic 4.61 MSDOS QBasic
+MSDOS GWBASIC Virtually all program that came with MSDOS 5
+Hitchhiker's Guide to the Galaxy PC Magazine's ANSI.COM
+SemWare's QEdit 2.1 Norton Utils 4.50 Advanced Edition
+Norton Utils 6.0 Xtree Professional 1.1
+PowerMeter Utils Autoroute (ancient version)
+Minitab 8.0 Microsoft Diagnostics
+
+This is all the programs I could lay my hands on which were text based
+and could run on an 8086
+
+The emulator runs at about 8-10MHz 80286 speed on a Sun SparcStation
+10/40 (without the -mviking flag) and at about 6MHz 8088 speed on a
+33MHz 80486 box running Linux.
+
+I have included a Postscript representation of my project report. It's
+a bit out of date now, but it's the closest thing I've got to
+documentation! I'll do some kind of latex thing for the next
+release....
+
+The program rather hogs the cpu but unmapping the window (iconifying
+it) will put it to sleep.
+
+The most recent version of this program will always be in ftp.cs.bris.ac.uk
+currently in the directory /users/hedley
+
+INSTALLING THE EMULATOR
+
+Edit the Makefile to change the OPTIONS, CFLAGS and XROOT to be
+appropriate for your system (I am assuming you are using GNU GCC,
+although any ANSI C compiler should work just as well). Ensure you are
+using the best (speed) optimisations possible (e.g. -O2 -fomit-frame-poiner)
+
+Edit the file mytypes.h and ensure that the types for INT8, UINT8,
+INT16, UINT16 etc are correct. Hopefully nothing need be changed in
+this file, but you never can tell... I have assumed that 'char's are 8
+bit bytes, 'short's are 16 bit words and 'long's are 32 bit words. If
+your compiler treats these differently to the above then you will have
+to edit this header file.
+
+Type 'make' and go away and have a cup of tea! Compiling 'cpu.c' takes
+a while (and quite a bit of memory!).
+
+Get a floppy disk of the same size/type as you specified in the Makefile
+(i.e. if you chose -DBOOT720, then you'll need a 3.5" 720k disk). Install
+MSDOS on it. Copy the files 'config.sys', 'emufs.sys' and 'lredir.exe' from
+the 'programs' directory onto this floppy disk. Shove it in your Unix box
+and type cp /dev/fd0 DriveA This should create a 720k (or whatever) file
+which the emulator can boot from. If you do not have access to a Unix box
+with a floppy disk on it, then you can use the supplied 'dumpdisk' program
+to create a disk image. All you need is access to a PC. Simply put in a
+bootable MSDOS disk into the drive and type dumpdisk A (or dumpdisk B if in
+drive B). The program will copy the entire disk to a file called
+'drivea'. You must then transfer it to your Unix box...
+
+You then need to convert the vga font (vga.bdf) into a font format
+your X server can understand (either SNF or PCF) using either
+'bdftosnf' or 'bdftopcf' and install the resulting font file somewhere
+where your X server can find it. Then type 'mkfontdir' to rebuild the
+fonts.dir file and then type 'xset fp rehash' to tell your X server
+about the new font. If you type 'xlsfonts' you should see 'vga' as one
+of the fonts listed. If not, then something has gone wrong. I may or
+may not be able to help - it depends on your local setup. The emulator
+will run without the font as it uses the standard 8x16 X11 font -
+although most programs which use the extended character set will look
+pretty terrible. A warning will be displayed if the correct VGA font
+cannot be found. If you are using openwindows, you will have to type
+'convertfont' and then 'bldfamily'
+
+You should now be in a position to run the emulator
+
+By default, the emulator requires the disk image called 'DriveA' to be in
+the current directory or else it will complain. If you don't like this,
+then you can change the file the emulator boots from by altering your
+.pcemurc file (see below) or by changing the default at compile time (by
+modifying the Makefile)
+
+Once run, the emulator should come up with the usual MSDOS banner and
+request the current date and time (which should already be
+correct). You can now run PC programs, mount Unix directories as
+drives etc. You will already have one drive redirection - drive C: is
+the Unix root directory. To mount further directories as drives, you
+must use the program 'lredir'. Consult the file 'lredir.readme' for
+instructions...
+
+ The .pcemurc file
+
+At present this file allows a few things to be changed at run time. If this
+file is found (either in the current directory or in your home directory),
+then it is read and parsed and the values overwriting the equivalent
+compile time options. Currently the only options supported at present are:
+
+bootfile diskfile
+
+where diskfile is the disk image you want to boot from (no quotes or
+anything are needed and the filename must not contain white spaces).
+
+boottype type
+
+where type is either 360, 720, 144 or 12. This tells the emulator the type
+of disk the disk image file represents (360k, 720k, 1.44MB, 1.2MB
+respectively).
+
+updatespeed n
+
+where n is an integer > 0
+This is the rate at which the screen memory gets checked for changes (and
+hence the update speed at which the screen gets updated for non-BIOS
+writes). n is measured in internal interrupt ticks of which there are ~72.8
+per second (depends on the resolution of the system timer).
+
+cursorspeed n
+
+where n is an integer
+This specifies how fast the cursor should flash. Flashing the cursor can
+take a fair amount of bandwidth and so on slow/heavily loaded networks it
+may be best to slow down the cursor flashing. Setting n to 0 or less will
+disable cursor flashing - the cursor will be permanently on.
+
+An example .pcemurc file can be found in this directory.
+
+If you have problems compiling or running the emulator, then please contact
+me giving details of what went wrong (along with your computer type
+etc).
+
+Architectures tested:
+
+Computer OS Comments
+-----------------------------------------------------------------------------
+PC 486/33 Linux 0.99.14w Runs quite well. A bit pointless though :)
+Sun 3/60 SunOS 4.1.x Takes an age to compile and not really worth
+ the effort...
+SparcStation 10 SunOS 4.1.3 Runs well. Takes > 20MB RAM to compile though
+HP 755/99 HPUX Runs OK (>25MB RAM to compile...)
+Sun 4 Solaris 2.3 Runs OK
+RS6000 ??? Had a few problems getting it to compile.
+ Getting there slowly though.
+SGI Indigo IRIX 4.?.? Doesn't work if compiled with optimisation
+ using the standard compiler. Haven't tried
+ it using gcc yet...
+
+As you can see this list is quite small. The main limiting factor is the range
+of machines I have access to. If anyone else can get it running on other
+architectures then please contact me!
+
+Warning: This program is not secure! Do not make is suid or sgid anything
+unless you wish to compromise the security of your system!
+
+EMULATOR LIMITATIONS etc
+
+Some parts of the PC architecture are emulated better than others. The
+BIOS has been partly implemented - enough to get MSDOS to boot and to
+allow most programs to run. Anyhow, most decent programs bypass the
+BIOS for screen access. BIOS Disk calls for drive A have been mostly
+emulated, although formatting doesn't work.
+
+Some of the hardware has been emulated but not much. Timer interrupts
+are generated by the system but there is now way (at present) to
+reprogram the timer. The Programmable Interrupt Controller has been
+emulated in part to respond to the End Of Interrupt command and reads
+from and writes to the mask register should work OK.
+
+None of the VGA hardware has been emulated at present (apart from
+screen updating) although this will change in the near future. Mode
+changes must therefore be done through the BIOS.
+
+The keyboard has been mostly emulated. The program converts X11
+keysyms to raw PC scan codes and then generates an interrupt 9 as per
+usual. There is a BIOS routine which takes these scan codes and
+generates the correct BIOS ASCII/scan code pair. The keysyms used can
+be found in the module 'xstuff.c'. In the future these keysyms will be
+read in from a file at run time.
+
+THANKS
+
+Thanks go to the following:
+
+Andy Norman at HPLabs, Bristol (ange@hpl.hewlett-packard.co.uk) for the HP
+port.
+Dieter Becker (becker@med-in.uni-sb.de) for help with the Solaris port
+Klaas Esselink (esselin1@ksla.nl) for help with the RS6000 port
+
+Please report bugs/comments etc to me (hedley@cs.bris.ac.uk) and I'll
+do my best to sort them out (no guarantees though). After June 25th I
+will be leaving University and will not be able to check email very
+frequently - please be patient if you want a response - I will reply
+eventually.
+
+Have fun...
+
+David
+
+
+
+[FreeBSD port comments]
+
+I (joerg_wunsch@uriah.heep.sax.de) have slightly extended the .pcemurc
+functionality, in order to improve the handling of international key-
+boards. David's code hard-coded the keyboard mapping from XKeyStrings
+to PC scancodes.
+
+I've been adding a .pcemurc section that defines the reverse mapping
+from XKeyStrings to PC scancodes, so it's at the very least possible
+to remap the keyboard to the original US layout even for international
+versions. The syntax for this rules is
+
+ `keymap' <scancode>`='<XKeyString>
+
+This is my personal .pcemurc file, just to illustrate the usage.
+
+bootfile /home/joerg/pcemu/DriveA
+boottype 720
+keymap 12=ß
+keymap 13='
+keymap 21=z
+keymap 26=]
+keymap 27=+
+keymap 39=\
+keymap 40=[
+keymap 41=^
+keymap 43=#
+keymap 44=y
+keymap 53=-
+keymap 86=<
+
diff --git a/emulators/pcemu/scripts/configure b/emulators/pcemu/scripts/configure
new file mode 100644
index 000000000000..8815b83b9f0c
--- /dev/null
+++ b/emulators/pcemu/scripts/configure
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# $Id: configure,v 1.1.1.1 1995/03/26 18:08:54 joerg Exp $
+#
+# Author: Jörg Wunsch <joerg@FreeBSD.org>
+# Date of creation: Mar 27, 1995
+#
+
+cd ${WRKSRC}
+mkdir ${WRKSRC}/bootstrap
+sh < ${FILESDIR}/bootstrap.shar
+
+# create a Makefile.inc to pass the local prefix down to
+# the build stage:
+
+cat > ${WRKSRC}/Makefile.inc <<*EOF*
+#
+# Makefile.inc
+#
+# This file has been created by the "configure" script; DO NOT EDIT.
+#
+# Edit the port's Makefile \${PREFIX} variable should you wish to
+# override this, and reconfigure.
+#
+
+LOCALPREFIX = ${PREFIX}
+*EOF*