diff options
author | garbled <garbled> | 1999-03-31 06:34:07 +0000 |
---|---|---|
committer | garbled <garbled> | 1999-03-31 06:34:07 +0000 |
commit | 997f0620637bde29b9189190342fe179317bd3b2 (patch) | |
tree | 52f65fd3f6ddaf265766bc85103e6e807b7506ee /emulators | |
parent | 1272959d7753a33f6a92551da0729e8498cb5d3e (diff) | |
download | pkgsrc-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/Makefile | 22 | ||||
-rw-r--r-- | emulators/pcemu/files/README.BSD | 162 | ||||
-rw-r--r-- | emulators/pcemu/files/bootstrap.shar | 1087 | ||||
-rw-r--r-- | emulators/pcemu/files/bootstrapper.uu | 250 | ||||
-rw-r--r-- | emulators/pcemu/files/md5 | 2 | ||||
-rw-r--r-- | emulators/pcemu/patches/patch-aa | 50 | ||||
-rw-r--r-- | emulators/pcemu/patches/patch-ab | 80 | ||||
-rw-r--r-- | emulators/pcemu/patches/patch-ac | 55 | ||||
-rw-r--r-- | emulators/pcemu/patches/patch-ad | 95 | ||||
-rw-r--r-- | emulators/pcemu/patches/patch-ae | 11 | ||||
-rw-r--r-- | emulators/pcemu/pkg/COMMENT | 1 | ||||
-rw-r--r-- | emulators/pcemu/pkg/DESCR | 19 | ||||
-rw-r--r-- | emulators/pcemu/pkg/PLIST | 21 | ||||
-rw-r--r-- | emulators/pcemu/scripts/configure | 28 |
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 +M'XL("/^,D2\"`V1I<W!L87DN8FEN`.W<;VP<Z7W8\3U9NK.G29PJA9,@13UV +M4I"LR14IZ63=V;)O22[%S?&?N>1)0I-3AKNSW+&6.YN=65(TKHX3)T'N+D#Z +M(FV!O@J*]FV1`$:KQ"_J($[0XNHWS8L&11,TP065*Q3HBX/C7&RIO]_O>69V +M5]+9#F`4*/#]P"?NGYEGGGG^_YGUO?RM+U<^/_<GYQX]\SL?^./[/_1#SWU8 +MWK_^1[][IO)[E<J]9\Y\[4=^\0\J9[;R#SW\_2_\=3#ZW[_SS,,_^L+#,Z.W +M_UWEX1\^^+/[WWK?UWZ\@O]?[;_^EXN/?F_[1Y?^TQMK9]_XU&MO?>G97_[* +MZ=F'7_W&GWSMAW_V#^3K-UXY^VL?RM]ZX_C97[MR]ZW%1U\Z4WPA)_R#U^23 +MWWVF\J4/R(?RV8U7?BM_ZY/;V8_\EASZ]HZ\67S[I9W[__[1%[]Z]M7;=MJ- +M5Y:^LG/_5Q^MKNH'BV]_[4/NTXV--]?.7GOT:/0#O_7:6S_UP<6W7U][]T$@ +M%_&OWUQ[5K_]H'[[?Q;?_CMK[^H!?_>-M6?U@-\Y^\?_PWWTQMJ[_^JUMUSH +M/N`'!V^L_<V#E^\]5]G1:_^&QN;!UKT?J.S<^V!EY_XOV/M/Z=?WGI'WJ;VO +MRJ'W?DC>_IR]_;`$(7=T_YQ$_,'Y^3/Y5^2__S[_3/X?YW\P_S</_OS-5\^N +MO/[JV3>N/_JUM;_YY:_DS\GQGPQ&O_J&OAL])U^_+%_++4[%[-Z/N2C]\X=R +M#?GR5[Z2_T.-@UWX?^J'CX[/WO^X7+.(_'_1#Q^\H)&33^[_@;Y=^HHFQ0_? +M"^6#^.'JZIMK[[YD*?;NM>W*:_>+4_^%'CMQ^3=??5;B].R#O^=?O/&<1/BY +M-]?>O_[ZVOOECT3F_?+5)UX]>_*G;Y9?O_JLW.>SDAME.%_\ZC<U!N]\^3=_ +MZ?57WRVN-J=7N_^##Q\=OZ-OO_1MNYEW[W]6(JB1>_7=-YZ3E'G?UW_EF3?7 +MWI'XOB-_KOU8)7_?UP?/?/G-7VK>_V]RY/T__?;K:]_0`/ZSO'MC[1N2M.^7 +M/UHDOO'FVC>^_K\J=NW[__K;O_C52N7KSS^CV7I_YMN:"N^<>^>1?&=?_/UG +M[BU6=B0"$LOF_8<2N6<E%N[<KCOWKRMRBMS[.U8*WO[6ZJI]_!>5>V?&9W[5 +MG?G->S^JGWW3/OMM'YJ\^<2K[XX"%^KY;S_X1_<>/=JY_R\E)+D#O8E_^RV? +M"FV-X*O?E/3RU]1+/;C[Y6L2W%_(=_?_\EMZ_'^5EP]NVW>W']Q8""J27K<> +M+;Q/_W[FT<*/Z-^'#Q<^7,G_<.$G]<V//UHXHW^_^7#A;"7_[84/5/+?7_B- +MZ_+)"X\6*L_(W[]ZN%!Y3OZ>]^__P\.O_].'7[_Y\,NS<NE#O?1G[=(_\VV- +M]1>_^G[-Y\IZDH=1_S2\$Y^&>1K^_"C)JY5L$+7B%\-^?#</!]%A/!^V7PR[ +M4:_CWQV\&!Y$K3O^W<KN?+AZ8TN.E\-[25\^VM]Y,1P,C^U=96%A,QW&"PN5 +M,SLK8?UHU(OR=!@>+U47EZ+>H!N%LRMSX=(++UP.]_O)<3S,DOPT3#OA\C#) +M\K1W/CBSTXNC+`Z'\2`=YF$K/3J*^WDF\1@=9F&<MS3FW;C=BT]?:F75`SFO +M&K6JHSOG@R#8ZR99*/];C8Z3=KAN1\UDX414JG+4F<5JN!<=]&*]<"OMYWH! +M.3WTGO9U^>52-5Q/3S02A[$D6"L^&DE<HU[O-!R.^OVD?U@>>K$:-OJ=='@4 +MY4G:#Z.#=)2'N49Q;1C'R\W54&^Q//Q2U<5;(IP.D\.D'_7"W7IM=;->'G*Y +M&JZD@U/YMIN'_31/6G&@-[14/1_:O??2]([\F]R)Y:8US?+PI!L/8TN4[>:G +MPS/?)?*2##OVL9P0]<.XR,&\&^7^76S?7%V\>B5<V=D/HRP\B7L]_1O)!?NM +MKJ1;($F^W-ANAED\/)982OYE:2C%[R#*DI9=<#!,Y68EL+P;AQTY3Q,IZFEY +ML/A'_2#MM>4V+MS<JX9AK7]Z$IW.V^62O&MGW=R36TGG[749TV$LY7HHX6;I +M42RI+1GBPPO303R4O.@?AMEIEL='FA!RWQ:@7**9]%NQW$S8BOJ2N&'630;A +M9G-!$DYR)$C[5B*2/`N/HV$22:D(HUXJH?D(29*UI10/$TEVS?!9R?NP%Q]* +M/DHB9VD_FYL/3M/1C.1'7[(A:N4C2PK--8V5)+%4D$S+?=J9"S^:Y5&_K9>( +MGXCZ1^>#SXZR?#HK#](TC]MRI^TB.S7A)&\L;OZ>VVEL=23KIB>:.!(A]WW2 +MSX=I>V3Y(-7DEGQ^DLC)W>@XMI2*!SUI*MS!1TD_6?`A'IQ*M`?=4\O9,#F2 +MAD(3*@HTX31.8:>7#@:G$ID]R:F/^CL(6Z/A4.K6N/!IM/P]=(;ID>9KT$EZ +M\;AJGKLPRH87>JE<Z$(O.;A@]WUA=2A-2>V\1+HA23&,I<:V,XWR06QE8QRE +M\.,7%\.7ES6?[L1Y+JW723>1$MN58G40Q_V@U4VSN*^E3$]LQYUHU,LM4AJ1 +M,$L^%^MEI"P-V_%0KY$>Y%'2?_PZ>H:U(9H&[O:E84U=84][/4O[%\<WMB.I +M&TFY*&/HSG%%*[)0?&I+U+0,M:V6E.?[DBPU3&OH4)*ZT6_U1FT)T?(_#@_3 +MM!UF^:C3T?,E+OT9:1RD%$^&<91D=N?#6$)8M4.D$&L)DR\'(RV?67(TD/O* +MM;^(VXE4N7$`>J+5=+V"U*+P*&TGG5-].]2FM),<CH:N-=3DS'QD)Y+!+M&2 +M-DZ3T1)K*O^_<SE8N2#_=K*JI-1$<RXM>%K63I_K6D62(H&LYW+)^>2%VK&V +M7^&U,'KQ9\K0PZ=??N*BB;MH')YSMVUQLIN1^$S'QJI%DEEE*\_WK:,EI"L# +M?0TS'G:L"KJPM0MQQ=(5#:TT90AZEI1+2WHK/G&6:<T.PUFI)67;\UAUB<KS +M^W%^D@[OA&VM7-4Y:4A:+2GT6DWET,D>=MYB::6WEZ5E`%'[.,FD*LO115)K +MI#6QGY+.TM:UI.NZ%KXP'SZ_='$B*:U4:2C1<9IH$=;12"IC!ZDB)YI04LV. +M)GJ%>-S5%T$T7)G7TNY:,JNRTP5MHK$M6R@Y:7P[$HEQBS5NLN>ED$L#J4,K +MZ:!>?/+6?E+*0/NI)>83X=%QZ!JOL%E>OC9Q[UOIB80?:?=51M9R5`N/-KQQ +MHLDS<=6%<-37EDG*QGPHG8:./R17GQJK07A!BO>%3GNQJJW.=VI;)P.8U>3J +MCXX.Y#)1)]=F4`MZIWU>HGJJG>.IMAJNY,A@1F.H`XC^1!AZQF`H#:8<*_<\ +M-Z\][!,W(>5VWMWWW[XI:(^.!II*U?AN/!7]/)VH%+Y-E>9`#FN-<LW(R0H9 +M:C#6$8T#*+NZ(D=<)KC[#6MR)^%R446M>IZS;Z+S$V$4-=.7J'!68C,7:H73 +M4M66`4Q+BK!VF;=\4RJA]:VH3:6B1-,ND:??:\H\)4.+R&A[XE)$ZHX;#;F! +M13^.70LA"2J#@-.)"C-LAZ]<KTE^]W/7#G1&0TL-/2?05-#!H05_TT:#6FC\ +M2%@:`XF<=0=%:R_!V`UI!Y9KMQQHMVQ=CQ6)[S84T``NR,U-#<RDM,8R!LVT +ML"43(_).ZHIN$3$_6M*[*&(O779B=_Z>MS$N+YI+OBA(2RH=;!S8H-@?7@XF +M3GU[:$VICC**W)[H-=;D/G:BO'L^R.)6D4)V^7,WUZY>6;%.Q7<HL[F?]NC] +MW-2YQ=4K\]+(=6R`$M@ETM9(YU'NOA,+2H>AH\P:L;ZKH\6=S5E"2,7NR_'' +M<>_4AJUV?SK(T`!U7B;9/\Z.GPK/W<UDG-`9?"Q\SYR1C#G18GQS:4GC6PS[ +MK(>0@;.,/1]+8FWU!P/IGXHNTZ=44%0O+2^#R`W?N^E()@RNQ\RZQ9#(E>"H +M-4S=T*;HV.:#87P46R-FDYLB.!G;ZL!:<K"HY]+<1\=1TK/QG#_2Q2_(I(_6 +MIJLL,S9.\GUWY&[4XNCO9_;<W4YV7M-W=S)[]+#I+)+_==U,31)U-+#;K]H, +M-\IG=-[1F[<YA%XW<S>NO?=!+YZZ;\W(=KN8$[6#]QK.5*LR@]2>.2N;QZF! +MBQMT!NX.N](^:/64>.@T21+;+FK=E-[-23?MN<%)-Y%9R[#5G4A`23)M5[3Q +MM9F(AE`DF'3<>3*2I-)/\KB8B3PE8[7['^HI.LDK&H]R"NAKFIL(!SIFMQ;^ +M\<:F&-7/E\/5MA\H2A659,^3PU"2/@K._=3Z]F;]0M62=-@Z7[1011Z&OHYF +MX9F+DHYZK3.7Y,5!+".4JLW0]?,SW\-J0+F*\7/Z;D:CZ@JP7*4XKIBLZ-A- +M)PUMC>]/_^;P,+PQZF>M;E6G06[^GO:E\&8]72^0%S8:3^1X6WAQ"5$L.;12 +M+<E1V(E/@G),95,_NU0GN:NS,M]@:BRD!1A(EMK-Q/WC9)CVM?C:V#IX6ML^ +M.9ER#5=Y(]JMZ8"\G%4%.N6PLIU'0YT/6DMN,]X3K:S%@%/FU=:,]BV==7:Y +MDV9YLS5,!GE9H_Q@56>M\DYBI&>X`<8XF\9]C=[84'H+/Y/.I$3)R^^I]Y$K +M7G`+5]5!5CW\G)^2RI6[(YD92HV.)>G=6LCD-*RE]W(TDHFHIG#B[N_(5GFT +MQ`<V9BV&F<6<R770R<R1%/-CFSWWP^NQE*]^.6UT;W6][R"5GGH^3.0"(VM- +MXZ!<9-+6Y^7XM'EJ"R([*V$F=4'+0Y@/HW[F\WC4CUJM>&"S6FUM]4ZB7E`< +M.UE81GW)EU;76B.]H2,]83VVZ$HQ:$G%M88R:K>+OJ?LYHH.<+JR:8-G4^:I +MOL+5#"E>V4`"[22MH+A32:13K5]9+/>?)ZW,K3V<ZB0T2[*\*)-RO/0%[?"< +MO#B*!N?G`S<Y=W7*E=I,6\[)9)FWE;&?E_F33(8/^VXV:9UB-QK*Q$KNQGH4 +MR?;#N*_K-F75D8]T\=45/DUWS2B-J&9:UDTZN7ZOL9W=DA;0A=.7!D87::U. +M^]BEY5!#NZ"R!2PCI1,V-XB-3H-$!I9:S+12318*:;('@W%EL-&V+AG*-741 +M5@\^CGI2=8ID#7RRNC7%8F5!TR5T94!?E5-+Z9#&]Z]K6[V>KZ1RV6$JPW_Y +M)IP8WQR=/I'OXP5-F>.X3`J7+E[[\_+UI6LSQ>N+2]<^5[Z^<NUGR]<?O_:Q +MXO6E%Z[]3/'Z\N*U?UR^7KKV:OGZTK6?+%]?OG9:O'[^TK6%XO75*]<^*4WU +MMI;I%Q?FI%R/U\HTXFU+G:.BS74M8>96THOILVLJ98[6C08V-#EU@4BZ^0ES +M>SPB',:'TKL-IU<8_=KKT_M(7;J6O)#:IR='?NK^>(=3=GZ!U5D]6D(]^]DT +M'A[>/K'^Y*61Y%2WVHWC036+[E;;\7GKU`)K/=>E*$C_<>8]UJY=/DKF/3$] +M\<Y.;A1H+=GO)W>M2MT,;R3]=GJBBSDU-W;+DUR7.T:'AW&FFP+%R#>RLR[< +ME)NW,W0`<3B,COSR7I(%6H\/^Z[=\>O8.C0OYC"VG'T095;3W0J?+O06TS.; +M14O;*P,KZ45277C5]2]W@K^6U-H]F]6Z=V'#2D,@N>5[$M_TIC;-<^LEF5\, +MS"2!-ILZ*'J^NAB^%W?$E>K%X(8T6CLRN9>Z(V<L/>78Y738TXNN?.QCX<7J +M8K`W&AY(N8L/-.V&\M'SCY_ECJA)QW<D#;<[)%A>7EG6)?OP<O7*TG>(U&?L +M*'\/UV\LUYJ-E:<>_DHR],V#5I`BFZR=:T52^*SG\DD1K"=YJ]N5RC^4@G5] +MI"V=KP[7HUYT]S349GDS.HP^)T-7.:2VU6Q45[8W@V9\=".R<OF9>EOR[>(3 +M:;0E95]JT'Z>]#*YN><79:!\+.V[Y)6>(;4KF#KDRM/RY68N-2G<&:8=M[@F +MI7ZINA3L2!,]W(QU9<2=_(3:2$I[JLL-LW+-1(N8'Y/-!9M)/Y%>-KSZGB5A +M,]'93"J=Q6H2'?:E.$H/-][]*MKEB9+8LM9!9^[2)'4C7>^3.W.5X\26U\KB +M'&BI<<?K-$);&;?;XYKN\3Z+5@5MU6T@>W5A:7%S_7-RX$6I2-(?NSXJ"IL2 +M1E-&J:VFF]D$2XL7+B^<7'IQ%=.#I.;-VCTXL.YZRNE`%?<:%>O3H1:'#I +MDOOTLE;:]&XYD=Q(^J.[6GM=0URVHI$-"S,W+)0!F@SOQC,MZW<DK3ZKE<F/ +MWFQV$T3A@90=C84<U-86HZ_K<0<VZY]Q+5*KEV9Q9B-YB4!CYEA7VG65,9B: +MT'U$)DPSNIR4NBF+W&Y;0]5VZ*X_N1A=ZU:LM,:V#RH3,]]G%E5%NE/M]KOI +MH8_`8&0Q&O6+WMSF8-8.AK.)]`))YU0W>I)\SO4O`XN_S5MZVJ:[\*U5D^GU +M1%ETPXIDHC75TZ.>C"DRUTN%G7Q0G=J&#<9KI'Y79+R\<4'G=MD%MWL;!&<; +M6\V]VL9&8^MZN+=>#^N;^QNUO>U=:>ZMTNK)FS*I]`M<.KSJ'[HIYO;.7F-[ +M2X8K*VL;M>M-UUWL;F_ON67L8'*`T7'3\V&QV#?;""/=1LE&1YI:Q53"+85< +MW]H/KZ^LS`=13\OG8==&9MJNA"M^RJ-C+M?;6CMNDQ+?$<O$OM[/1L.X"#5P +MH=IL4TO)K!7BN3`=Y,E1DOE1P2"5UD,'R[-Q];`:+FQ?#!<ZZ5&2+W0DU>.% +M02K-VW!N(EDL28Y.\]-!G%6[;OW27;A<R[#O[.8;6WM7Y\-]^Q/(OTM7W+NE +M*[:?;@O;Z5`S2?>V!W%GI,VSCLMM:J6U[B#VJ:\CDJ!<=G1UP:U]Z/*&K5/J +M@*1:]=V?2V=;-9!XS>@(69<OY))7`ZU<!Z>Y;@[/2(H.<_^-Q$N_TH%Y9K<V +MHXMY_LM+%\=?RD4Z@=];\CDC#7*46\7(M.1U9(+N"J/O-Z11.8[=6NKIY`:G +M3K%BE[HZ6Y-II01FTWRI'9*2X8PN;\Q8=`Y36^JWU^X>99PPL,H21Q\)5RPN +MFG0S4C>KK9DPEU.U-9'VMF<M?MN>O=`3K8&1%DAF=\/3C\S)U:[;(-UO_]DR +M?[%!H=VC+F9<T*SU2S+%U,=-GR=K3#";5&7>Y>>9MJ\9+JPN2QWY^,7%^3() +MM%&R+(["2]7G/ZK;CW?LLG/Z](*,CWH]WZOKPF'N'D`HRV`F]U@N$\U(/I9K +M2C,^YV3NE`QU#7[&;4_IF3-%SS0ST3B,M^DF[KVJJWINVELL4MOP4!I]ZZ<L +M)2;V,8K=%.L*?2UM:9'P.ZMWPEFI$+J$H.5USFTIN&YP:@5)"[);IY`X5\L- +M)&F]=;W*97I+EY1M&CN.DY]W3^6>)MLXO2WH4>::L6PT&/0T[V:*W8J9HJW5 +M`EG&W`*RW>7JU`JU]?83\9"A:]C4_=E3U\AK7UGN1+M<=$$5LPJW95&F9!&+ +ML&;I5+Y=UF(D%=\=OCPW-=)UE:C<I=$EEF'LKF.1LK9*EU%E;#'C=D)FJK:M +M80NMEC"VT*"+::Y?FLIHZP%OV5,*<F2QR"K%3G+0-77'AY%;99V55]6#=F?. +MW:'_U"VZ!=,KRY8-.NVU*8"TO&XVW=Q:T^7<G96U.=\CN"^"&0DV3[-^9T:_ +M=^\&K<Z,WTJVBN(G:IDN8UI_[C<SK,NW.7/@9LY/1J6CXP&M7GN6'*[%N:,A +M2`V9<9N6!Z.DYY9N;)VZ*M_XQ1&W_E"<Y]?AY8QNE'5GGKY[$8PW8?KQB<6U +M6A1S'TPOL^O,3"XR9S+>G9%4GM'V1W<X)C9N=)XN/6S;PI%ZX@M]^1R.K?<= +MZ@;KR3#59U,:ME^8#@/]HQ5K8@F[&_<&X8*6AW8\B/V`U>[`%MW<LK@KAT6M +M#:P@%@_T%'=GN2`7EI"DVF736U=7[TIG4R[2+XQ[?1L-E0-HUT(4M5:&9Q(A +M*8;E>H_&QE4#7:\(=$\]E]J@:]2V6E8+3Z*AC5"+";[?2-,JW/$;*M8#EYMI +M@7\(Z2!V\\8R<\9C%>FJ^WZ^.S_=FUF62R8&,[Z::(@SXW(R<]!K=Z*CI'<Z +MXZJ6SUW=47#CND@')4FQ(E?L^I0I'2R?%NNY[_7XE1OZ%>V6;P#"&==`S_C' +M#6PP4>ZK3_8&PS#N9=;P^^9%6K4HZ5?'3;&N:-F37=IIS`=3#>S$4-&-'B>C +MJ"UBYIXPTD>7=*/+#P2'0;'\Y'?6M+C;\O"<QDB.MH#+C3N_HAWEQ0`DE&&= +MG'9P&K@G7XHCBTYYSB\928(^EFY%9Z63`QE,E#N7HTR7]%S;?2!%0O<=^^U` +MD]E-.R92SSH+S6.+A"NT/MRHITOENB87^)(V5RVWEC7;-8ME,ET4>7VJ821A +M6B-<9$NBC_YE@=_7E[&C"\+/"MP%K/AI'7=]A77_?H5OP7^V\J(NR&C,+?2A +M]K,3.]Y[J;]VL9,\?7G_6(&5^,!ZD*)>%OV1'W3,Z%BEKXWQN!P4XQ&-ZY$. +M2:0L%\O).A2WON:]EE_.:F,S54!T8<J>.-/IY,1NO*W29FXWQ4WNBN=KBE%T +ME+M*E>C:>,--L^Q9-[>/.YKHDORX[JEUI!@4=;78E-_,^=J0V!JTWJL5"YF% +M%YL:UFM&O9$^GB'MP\DPR8NBJO57OHJU"9HLU#IET10*5\H)GAYN.TS^.QO/ +MI$._W%LDBS18+P;!N?(9.FT4?.*YWK#XP';:IUN-R:=VRO%8.-O7AY=3?1)5 +M\D\F:*Y[T991AP<3]ZC!]G7<;`5%VU-;%4UL[4,7GW5=/=-AM\7/.C[]IXR; +M?2+Q\GEQZ8H,G6W\O'3YLF;`TL6J&VQJ#YM-5^EB%J9]I!L.3=^<W7.Y&I&% +MLQ+Z'0M>_EVJ7KZ\N:Q_+VXN2W77<;[;C+?8C@9:V]V22+^,;=]O^^F38KK* +M]ZEPL5P5LK&)M1!Y.![Q9C+&U`TXFW_H!D$F131NW?$[%JZX9C9G";JV@V.- +MDEW=K\@\+3P+R!WE`NJG_05](#C0HJ8I[N)Z%$<Z:[7)BSW>IDMH]F(X&DBN +M)_I,F"1?>0%=-)7_/O_QB]6KNG2NVP>I5I:)48(?A:6]T>3V8_'(KY3EH26A +M5*@L'7Z7)'3)5TRR,MN4[T3CAC<;-]V=GHRVJN&:_BDJDS]"E]=S]Q17)Y)1 +M6^0:.(F9-.GMDZ2=NSE\EFK\,VD\+L@4]#BQ!\TB+=#^H04=QMAHZ<`O*-@B +MCL1)!@']R2MV?"QD/J`;V3J/UV,70WLD.?-/&TIAM/'68R=)2ST15#%D&=B^ +MD:OYMB]?Z\M0*+*G0:>[39L]^7&+:[XFG]W0]3G7AUM?46XVM\IYLUM=[)<M +MDJ]0?CPY<#\0\-L;@53N0[?_V=;'^GJ^O&BIU-;'AII2?L?/`Y4+!B-[=$TK +MJ'1E6B1JPY:V"JU\9`.86`>STG2M%,=ZTA-/6?&_40@6OI_T$?K+5Z]<N'3) +M7\86-\/%Z@LO5)<NGX3AKB[`NG4$VP224::N)NAB46Y9[(>R+\X%N@A[Z<*5 +M<CU9WLM-7*XN5>^ZI7]=H-!2K\V23:Y<PZ]E4AM-_QL!*8%Y]SV[Q\E'^^). +M1Y=1I3>=7/L-EQ8G+NWNR^["Q=_%XE/AQ<7-Y7"WMCD9$W<OP?I.^/'GG[_P +MP@O^6NL[^S<GKVVA;;\<SG[JXO-/!"+1<4EQ>>*,9MJ+AE(\+T[&9_OE8+=Y +M97%Q8@'^TY_^]-1=KFNG:OU[68`/?4US<]CBHM\UO:[[TUSKIK79NE:]7TF^ +MZXVPT6\GAZE_DG6W<5-2[]-5'YO5-,[L06Y=BDPZQ57]`Q.3RXS?-1[CI<IR +M>E0LJU7E=H]CO8[M9GW7H&RNI:$=MEKA:6P%0;?PBN&Y#JNM4=`)HS:XKAAG +M1Y&5`UV-UCZZ)Y%W,^E(6XYQ+Z9C>^U5CR*IL/K04N.Q-1D;4\G`0`>B-H_0 +MJ^KVM]O#LZ9%NP:;VD?3U?[)-D:ZJ8\$P0TWA7O1]??%8#-QCS!)-R1G?T3R +MP][:LU#:<8R2MC9GV6&B@Q(W4`E&?:N?TYNU1Q+B45(L#&EP_J=1$VO7$HNS +MQ2IYN-'8;.S5;!U<Q^+2@S5U%"CU+<^*3D_:D,F[L[[3[W[JHFZ>^R=S74JX +M'<S`?K@S?LA(PM/%?&WGM9F3$Q?"N&]-B__UB9N=%$,T&WNE@8V!'YM'NZED +M57_,T[4GF_7;MMMS*`\Z.!U$[E$]%Q,=/OAAA<O?JOMIT:J.I'1:F8V?-I8V +M</P8BH;>.PV*^YT/R]F]6Q&RHM6>J$!5GX0^\61VWS[1%"O38IQT(S>:U&=V +M)-%T3#$>MF2!GC1^],$_25+\6L:M2[C?9.G,2Y>29\?CY3E-/!T5%CNC;OP] +M=/5BQWU\9-UVHQPHR40G'Z8]70$O?\I21C9QF>@6D;)!ZC:A->"ZO-SN3(3C +M'^MT/R&2>8/,273`K6_=P*TX\RB2Q!_&A[K@,[T?LOVR)..6_[&4'JHK&M\A +M*2=F"K.1Q=/6B7V.VQA2\FENG'EY^6RVG^7["5(_CF0(,])R7@TWT[;,=/WH +MM5AG',:2\7'Q<*Y\,O0!QE:B_$98^0S1Q.-I6I#**$^O?OH5EDR7D?3ID.S4 +M%_3HI'AHR#\<4RZ_%$6C'&BZQ']!9[<RR@ILSF]7<:4D<@5>-XSUERI^,&R] +MI=OHF+Y(,`Y_<F7)PJ@U5QJ-"^7Q4C`27[**J(]TCJ@#UND1G&X0MD<]6U[4 +M'Q%56S.Z0>!_O9>[K2>-2Q&.'S8&-OW4G4(K2'Y^/#'[E29M;[VV]7+SO#W= +MVK^C:X3EX_,3/Y6J]=NGNFVO#R])`.L[&]%!-E_\<E2G*(?Q2]U!K]J-3WK2 +MM"W(W.Z.Y&.UE59'=^;*[=7UG<#V>(/5Q+;HEW6Z,PQG#^SO2T=Q>R'I5T?Z +M^[:#:CMV)]IR9+DH4PP:[/>;+_<BR;=ZEL4R>+TCTW;W:NFE.UDOJO9[3PO` +MCR[L_&#Z%Z_Z.]<+Q<]>BQ^\ZGK.TW[TZC;+=6<Y:*>ZCUU."E*W-GYDV]<Z +M83X<1=)QYG%<#`QE#E:S7V_\]$@*U<7G)6J-H!CL]W3Z(<WCQ*]TK1'0KQ]; +MJ;7YHE0.&7OKQO&I-!FZ.&7SA(6B)]7Y@U1DK>7)Q(]Q(M\BZ=Z4=.)N`3<> +M:*LMXPWWH(B4D'5[K$IZ#AU'V(-&[OFCR]7STI>T=?5<CW1+:F<>_XGL>7WZ +M2+=-;,=J_K$GK36%Q[\=NJN/./I9X\Q1)Y-B/A],[&J56UQ-?3FQNS5^UYK> +M^O)+3=8GC&/VG7\&/2\M\V'/GJ_?D5E78@^7V/.$EH76?DL]=;^-F?>_LG// +M(9;/A[D15J"/B5C+:_L44J*F[UZ+INYPZ_S<"MVPE43ZB,!PD,H%`O]H=GN\ +MK^QV4%N/I;$]IA_9@E3D=H.2LL6+\N`@M02VA=+'3RP>[A^,[_2),'4PX!>7 +M7*<]<0]2));K*[7]9MV>(MC9W;ZNX_Y&4T9(*_6M9GTU7-NMU\/MM7!EO;9[ +MO3ZOQ^W6]8BM[?!&;7>WMK5W*UB3,=5$`'+4MGLLX>9>?6LOW*GORGAK3T); +MOA76=G8D\-KR1CW<J-VHAG+02GUG+[BQ7M\*MS7X&PV)3U/&9W)"8RN\L=O8 +M*YYS6-G>N;7;N+Z^%ZYO;ZS6=Z55WEJ](%>W$X.=VNY>H][4>+S26)V^J8_6 +MFA+MCX8W&GOKV_M[9>3UYFI;M\*7&UNK\T&]H0%)G'9VZTV]?PF[L2DQKJ_. +M2V16-O97)2[2=$H(6]M[;B0IA^UM6]($_M@B=(V,A+]9WY7TV]JK+3<V&G)) +MB72XUMC;DDN$FG:UT&*^(L-3N8G]W9WM9ET?N]4DE$`DP7<;S9>E!RH2]C/[ +MM3(@25T)8[.VM6(9I;&8R$B]W?#6]KX^=RSWO;$ZE2B:4/5PM;Y67]EKO"+9 +M*T?*99K[F_7`I7=SSQ)H8R/<JJ](?&N[M\)F??>5QHJEPVY]I];8U51:V=[= +MU5"VMW258DO+1_T5S?W]K0V]S]WZ9_;E3IY2!O3LVG4I9YJ,$SD>W&C(935O +M'L_V>3M%OK!LM\2[%=Y8WPXW:[?"S>W5QMHM7S`"N6*CN;?;D`R;+@^2F.-R +M65O>UKM?EO@T+%H2$4T*2=A@M;99NUYO3F2_7?IZ?:N^6]N8#YL[]96&OI#O +MI=!)+F^X])#Z\YE]S;_:1A%(6).,U!"T!+K,"K7V:2G;*DJ'7/NQ&AG,CJ_] +M9,D+-[:;5LQ6:WLU#<K^+M?UZ-WZEJ17?55RI+:RLK\KE4J/T#,D-LU]J6:- +M+9<I>K]6CQN[JV%1DZQPKM4:&_N[6KJ"R124*V]+$FJ05LHF,L0=T9R;MS(0 +M-M;D4BOK/O>"HK[ZC%N7K%BNRV&UU5<:5N=<PD@M:#9\FFS[$'PZ2A'[_JP4 +M!45/]>3S%T5GY9_RD:YF/"$I!U>!:V_U5Z2;^@SP=OE_-M"T.4LPV7&UK..Z +M-"__7-1_EO2?Q7!%9L<R'8C#S5A"[4_T:T\Y>REL+&_*Q]+)^)^#!_9<PZX> +ME(6[L>U1MZN!?#[1`3ZMUWM:IQ<^WND%C_\`3A_Q&<:2#KY#G0^G.SK?7TWT +M<\'?JK^:Z`/=+"@HXR3CCUBFJO;+NM"MZ>I/)![[:4[F>G/MFJW3DT\"-X5) +M._-EO^KBZ:Z>35S^O;K*^6!\JILR'466%7Y(9V-_C7Y;IS1)YA=C!Z.#7M+2 +M(4J@=ZW[)_ZG&%-/HQ<+[47B%[OPQ:\SYFT.F<O45'_ZJ^&6*6@YO5+;W:I? +M;]2EI]G8V-ZR?D$C)^WV]@W7AULSHQ5+.H7F]MJ>]%!U;6P;>\VB;PRTT5IM +M6!L>OF>8TIZN;-0:FU;?M;DL:VC1C5JS:>^*9N_&>FVON2UMP:ZT2,W]#>O0 +MUW:W-\<MX&-1<[?U6,WP6[<VTQIFY3.69;*Y'ZB/AEK>]7R9;?AO5B=3>R6U +M7^/;3I-F4GE8=?*PEU::U97-_6I]=5]#:G53F2K))<LU[:8^?=S2'Q5_IQH< +M[DC&90>CH4R7=VKATO,7ERXM7+KZPJ)&4`MIHLM7Q[&;M.CFO3XC806Y+&VG +M_H?L^@2=UKK'+QBXQ3W7!%@B3%5KG5OZ"?WWJ>&4=M/O%,MD)"L*I[:.>\E1 +MN)P,V^&LO+J]>UM?O[0E]]?KZ>/E<T%0.5NI5,[I__G:YRN5#Q:O7ZM4/N1? +MI_+Y3_C7G_Y"I?(1__K#\OF<_/V`_)>_5:E4_>N[\OK21)B?\*__ZA<JE17_ +M^JI\ON%??T%>[\M?C<=/R.O;_O-?D=>?]:__3%Z/?/BO2?C_Q']^5\+\HOQ] +M3O[[S5^J5'[=O];X_#/Y6[5?W>ELJ5(]D!SJ5VZW>EGEMB[*5FX?IGEZ]U0^ +M2GN5V\/TI'([:^G:DWZCOV^IW):2I8_&R`>Q?^&.J"[)JUB:(LU5.6RH.Q7Z +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* |