summaryrefslogtreecommitdiff
path: root/emulators
diff options
context:
space:
mode:
authorgarbled <garbled>1999-03-31 06:34:07 +0000
committergarbled <garbled>1999-03-31 06:34:07 +0000
commit997f0620637bde29b9189190342fe179317bd3b2 (patch)
tree52f65fd3f6ddaf265766bc85103e6e807b7506ee /emulators
parent1272959d7753a33f6a92551da0729e8498cb5d3e (diff)
downloadpkgsrc-997f0620637bde29b9189190342fe179317bd3b2.tar.gz
Initial import of pcemu-1.01a. An 8086/8088 CPU emulator.
Closes PR 7294 by Eric Fox.
Diffstat (limited to 'emulators')
-rw-r--r--emulators/pcemu/Makefile22
-rw-r--r--emulators/pcemu/files/README.BSD162
-rw-r--r--emulators/pcemu/files/bootstrap.shar1087
-rw-r--r--emulators/pcemu/files/bootstrapper.uu250
-rw-r--r--emulators/pcemu/files/md52
-rw-r--r--emulators/pcemu/patches/patch-aa50
-rw-r--r--emulators/pcemu/patches/patch-ab80
-rw-r--r--emulators/pcemu/patches/patch-ac55
-rw-r--r--emulators/pcemu/patches/patch-ad95
-rw-r--r--emulators/pcemu/patches/patch-ae11
-rw-r--r--emulators/pcemu/pkg/COMMENT1
-rw-r--r--emulators/pcemu/pkg/DESCR19
-rw-r--r--emulators/pcemu/pkg/PLIST21
-rw-r--r--emulators/pcemu/scripts/configure28
14 files changed, 1883 insertions, 0 deletions
diff --git a/emulators/pcemu/Makefile b/emulators/pcemu/Makefile
new file mode 100644
index 00000000000..6f6795977e7
--- /dev/null
+++ b/emulators/pcemu/Makefile
@@ -0,0 +1,22 @@
+# $NetBSD: Makefile,v 1.1.1.1 1999/03/31 06:34:07 garbled Exp $
+# FreeBSD Id: Makefile,v 1.13 1998/12/01 09:49:33 asami Exp
+#
+
+DISTNAME= pcemu1.01alpha
+PKGNAME= pcemu-1.01a
+CATEGORIES= emulators
+MASTER_SITES= ftp://ftp.freebsd.org/pub/FreeBSD/distfiles/ \
+ ftp://ftp.interface-business.de/pub/outgoing/ \
+ ftp://ftp.cs.bris.ac.uk/pub/users/hedley/
+
+MAINTAINER= eric@fox.phoenix.az.us
+
+USE_X11= yes
+MAKE_ENV+= FILESDIR=${FILESDIR}
+
+post-configure:
+ ${SED} -e 's|/usr/local|${PREFIX}|g' < ${WRKSRC}/bootstrap/help.txt > \
+ ${WRKSRC}/foo
+ ${MV} ${WRKSRC}/foo ${WRKSRC}/bootstrap/help.txt
+
+.include "../../mk/bsd.pkg.mk"
diff --git a/emulators/pcemu/files/README.BSD b/emulators/pcemu/files/README.BSD
new file mode 100644
index 00000000000..0e30c5a5e32
--- /dev/null
+++ b/emulators/pcemu/files/README.BSD
@@ -0,0 +1,162 @@
+$NetBSD: README.BSD,v 1.1.1.1 1999/03/31 06:34:07 garbled Exp $
+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
+
+ @@@PREFIX@@@/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
+
+ @@@PREFIX@@@/lib/pcemu/C/emufs.sys
+
+ onto this diskette, and include a line like
+
+ device = a:\emufs.sys @@@PREFIX@@@/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 @@@PREFIX@@@/lib/pcemu; mv DriveA StandaloneA
+
+ Now, make a copy of your disk by either:
+
+ - under BSD, perform a
+
+ # cp /dev/fd0.720 @@@PREFIX@@@/lib/pcemu/DriveA
+
+ (the number after the fd may vary for drives other than
+ the primary one), or
+
+ - under DOS, copy the file
+
+ @@@PREFIX@@@/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
+
+ @@@PREFIX@@@/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
+
+ @@@PREFIX@@@/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+ @@@PREFIX@@@/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. Information about this BSD port
+
+
+This `port' of pcemu, originally 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
+
+ @@@PREFIX@@@/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 the 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 00000000000..20a40e4e376
--- /dev/null
+++ b/emulators/pcemu/files/bootstrap.shar
@@ -0,0 +1,1087 @@
+# $NetBSD: bootstrap.shar,v 1.1.1.1 1999/03/31 06:34:07 garbled Exp $
+# 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.BSD
+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 perl txt2asm.perl > $@
+X
+X# maintain the README.BSD 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.BSD: 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.BSD
+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.BSD
+X gzip --best --force display.bin
+X uuencode display.bin.gz display.bin.gz > ../../../files/bootstrapper.uu
+X cp -p README.BSD ../../../files/README.BSD
+X rm -f display.bin.gz README.BSD
+X
+X
+Xunpack:
+X rm -f display.bin README.BSD
+X uudecode ${FILESDIR}/bootstrapper.uu
+X gunzip --force display.bin.gz
+X sed -e 's|@@@PREFIX@@@|${PREFIX}|g' <${FILESDIR}/README.BSD> README.BSD
+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. Information about this BSD 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 show
+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. Information about this BSD port
+X
+X
+XThis `port' of pcemu, originally to FreeBSD, has been prepared by Jörg
+XWunsch. It 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 the 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 00000000000..6c2b4a8d2c9
--- /dev/null
+++ b/emulators/pcemu/files/bootstrapper.uu
@@ -0,0 +1,250 @@
+begin 644 display.bin.gz
+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
+M_QIUN_CH*!W*.WT877*^4HW[;8L%````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+G````````````````````````````````````_I_ZORB<'5@`0`L`
+`
+end
diff --git a/emulators/pcemu/files/md5 b/emulators/pcemu/files/md5
new file mode 100644
index 00000000000..aacd200b21d
--- /dev/null
+++ b/emulators/pcemu/files/md5
@@ -0,0 +1,2 @@
+# $NetBSD: md5,v 1.1.1.1 1999/03/31 06:34:07 garbled Exp $
+MD5 (pcemu1.01alpha.tar.gz) = 1fed124b199839e439bec0f45abf006b
diff --git a/emulators/pcemu/patches/patch-aa b/emulators/pcemu/patches/patch-aa
new file mode 100644
index 00000000000..884c5ba2973
--- /dev/null
+++ b/emulators/pcemu/patches/patch-aa
@@ -0,0 +1,50 @@
+--- Makefile.orig Wed Jun 22 07:29:06 1994
++++ Makefile Tue Mar 30 20:01:40 1999
+@@ -49,10 +49,15 @@
+ # 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
+-XROOT = /usr/local/X11R5
+-CFLAGS = -I$(XROOT)/include -O2 #-fomit-frame-pointer
++#OPTIONS = -DBOOT720 -DBIG_ENDIAN -DALIGNED_ACCESS -DBIGCASE -DINLINE_FUNCTIONS
++OPTIONS = -DBOOT720 -DBIGCASE -DINLINE_FUNCTIONS \
++ -DBOOTFILE=\"${PREFIX}/lib/pcemu/DriveA\"
++#XROOT = /usr/local/X11R5
++XROOT = ${X11BASE}
++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,3 +91,28 @@
+
+ clean:
+ rm $(PROGNAME) *.o
++
++bootstrapper:
++ (cd bootstrap; make unpack)
++
++#mode 0666 is required for DriveA, alas
++install: pcemu bootstrapper
++ -mkdir -p ${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.BSD \
++ 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 programs/emufs.sys \
++ ${LOCALPREFIX}/lib/pcemu/C
diff --git a/emulators/pcemu/patches/patch-ab b/emulators/pcemu/patches/patch-ab
new file mode 100644
index 00000000000..13b57f3d48b
--- /dev/null
+++ b/emulators/pcemu/patches/patch-ab
@@ -0,0 +1,80 @@
+# $NetBSD: patch-ab,v 1.1.1.1 1999/03/31 06:34:07 garbled Exp $
+*** 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/patches/patch-ac b/emulators/pcemu/patches/patch-ac
new file mode 100644
index 00000000000..df2821dbcad
--- /dev/null
+++ b/emulators/pcemu/patches/patch-ac
@@ -0,0 +1,55 @@
+# $NetBSD: patch-ac,v 1.1.1.1 1999/03/31 06:34:07 garbled Exp $
+*** 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/patches/patch-ad b/emulators/pcemu/patches/patch-ad
new file mode 100644
index 00000000000..8cac640d260
--- /dev/null
+++ b/emulators/pcemu/patches/patch-ad
@@ -0,0 +1,95 @@
+# $NetBSD: patch-ad,v 1.1.1.1 1999/03/31 06:34:07 garbled Exp $
+*** 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/patches/patch-ae b/emulators/pcemu/patches/patch-ae
new file mode 100644
index 00000000000..7fe17f9c0f3
--- /dev/null
+++ b/emulators/pcemu/patches/patch-ae
@@ -0,0 +1,11 @@
+# $NetBSD: patch-ae,v 1.1.1.1 1999/03/31 06:34:07 garbled Exp $
+*** 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 00000000000..9d1d1031f5f
--- /dev/null
+++ b/emulators/pcemu/pkg/COMMENT
@@ -0,0 +1 @@
+An 8086 PC emulator, by David Hedley
diff --git a/emulators/pcemu/pkg/DESCR b/emulators/pcemu/pkg/DESCR
new file mode 100644
index 00000000000..18f47202dad
--- /dev/null
+++ b/emulators/pcemu/pkg/DESCR
@@ -0,0 +1,19 @@
+ 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.
+
+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 author is:
+David Hedley, hedley@cs.bris.ac.uk
diff --git a/emulators/pcemu/pkg/PLIST b/emulators/pcemu/pkg/PLIST
new file mode 100644
index 00000000000..542e6ab1975
--- /dev/null
+++ b/emulators/pcemu/pkg/PLIST
@@ -0,0 +1,21 @@
+@comment $NetBSD: PLIST,v 1.1.1.1 1999/03/31 06:34:07 garbled Exp $
+bin/pcemu
+lib/pcemu/doc/BUGS
+lib/pcemu/doc/CHANGES
+lib/pcemu/doc/README
+lib/pcemu/doc/TODO
+lib/pcemu/doc/README.BSD
+lib/pcemu/doc/lredir.readme
+lib/pcemu/doc/report.ps.gz
+lib/pcemu/font/vga.pcf.Z
+lib/pcemu/font/fonts.dir
+lib/pcemu/C/vga50.com
+lib/pcemu/C/config.sys
+lib/pcemu/C/dumpdisk.exe
+lib/pcemu/C/lredir.exe
+lib/pcemu/C/emufs.sys
+lib/pcemu/DriveA
+@dirrm lib/pcemu/doc
+@dirrm lib/pcemu/font
+@dirrm lib/pcemu/C
+@dirrm lib/pcemu
diff --git a/emulators/pcemu/scripts/configure b/emulators/pcemu/scripts/configure
new file mode 100644
index 00000000000..2db8d0a1167
--- /dev/null
+++ b/emulators/pcemu/scripts/configure
@@ -0,0 +1,28 @@
+#!/bin/sh
+#
+# $NetBSD: configure,v 1.1.1.1 1999/03/31 06:34:07 garbled Exp $
+# FreeBSD Id: configure,v 1.1.1.1 1995/03/27 21:35:21 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*