diff options
-rw-r--r-- | emulators/pcemu/Makefile | 30 | ||||
-rw-r--r-- | emulators/pcemu/distinfo | 1 | ||||
-rw-r--r-- | emulators/pcemu/files/README.FreeBSD | 162 | ||||
-rw-r--r-- | emulators/pcemu/files/bootstrap.shar | 1086 | ||||
-rw-r--r-- | emulators/pcemu/files/bootstrapper.uu | 250 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-aa | 61 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-ab | 79 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-ac | 54 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-ad | 94 | ||||
-rw-r--r-- | emulators/pcemu/files/patch-ae | 10 | ||||
-rw-r--r-- | emulators/pcemu/pkg-comment | 1 | ||||
-rw-r--r-- | emulators/pcemu/pkg-descr | 238 | ||||
-rw-r--r-- | emulators/pcemu/scripts/configure | 27 |
13 files changed, 2093 insertions, 0 deletions
diff --git a/emulators/pcemu/Makefile b/emulators/pcemu/Makefile new file mode 100644 index 000000000000..4453713bfc14 --- /dev/null +++ b/emulators/pcemu/Makefile @@ -0,0 +1,30 @@ +# New ports collection makefile for: pcemu(1) +# Version required: 1.01alpha +# Date created: 7 March 1995 +# Whom: joerg +# +# $Id: Makefile,v 1.1.1.1 1995/03/05 23:32:25 joerg Exp $ +# + +DISTNAME= pcemu1.01alpha + +# Warning notice: by now, you'll have to live with those warnings: +# +#In file included from /usr/include/sys/types.h:48, +# from /usr/include/stdio.h:43, +# from main.c:22: +#/usr/include/machine/endian.h:50: warning: `LITTLE_ENDIAN' redefined +#*Initialization*:1: warning: this is the location of the previous definition + +# +# a selection of sites archie has been reporting: +# +MASTER_SITES= ftp://hpcsos.col.hp.com/mirrors/.scsi0/linux/ALPHA/dosemu/Misc/ +MASTER_SITES+= ftp://ftp.germany.eu.net//pub/os/Linux/Local.EUnet/ALPHA/dosemu/Misc/ +MASTER_SITES+= ftp://minnie.cs.adfa.oz.au/BSD/phillip/FreeBSD/pc-emulator/ +MASTER_SITES+= ftp://ftp.iij.ad.jp/pub/linux/tsx-11/ALPHA/dosemu/Misc/ +# +# This is the original master site, but better use a well-connected server +MASTER_SITES+= ftp://ftp.cs.bris.ac.uk/users/hedley/ + +.include <bsd.port.mk> diff --git a/emulators/pcemu/distinfo b/emulators/pcemu/distinfo new file mode 100644 index 000000000000..98f3bba6f93d --- /dev/null +++ b/emulators/pcemu/distinfo @@ -0,0 +1 @@ +MD5 (pcemu1.01alpha.tar.gz) = 1fed124b199839e439bec0f45abf006b diff --git a/emulators/pcemu/files/README.FreeBSD b/emulators/pcemu/files/README.FreeBSD new file mode 100644 index 000000000000..3d295bdd898f --- /dev/null +++ b/emulators/pcemu/files/README.FreeBSD @@ -0,0 +1,162 @@ +This is an excerpt of what you can see with the standalone "system". + -- Jörg + + +1. This looks like PC, but where is DOS? How to get pcemu really running + +Pcemu is an emulator that emulates an 8086 CPU as well as a bunch of +PC BIOS services, so it basically provides the functionality like an +old PC/XT. Anyway, as with the XT too, the emulator requires something +like an operating system to run with. Since we cannot ship MS-DOS or +one of its variants along with this distribution (for legal reasons), +you're now actually looking at a (sort of) "standalone operating system", +just to get pcemu booted and running. All this system does is showing +you this introduction. + +You will have to replace this mini-system by a physical image of a +DOS boot floppy. The "system" currently running is booted from the +file + + /usr/local/lib/pcemu/DriveA. + +It pretends to be the image of a 720 KB diskette, which has been +chosen as the default bootfile size. + +In order to obtain the image of a bootable DOS floppy, do the following: + + Prepare a 720 KB floppy with a DOS system as you'd like + to run it later. Include all the good stuff you don't want + to miss there. Don't forget to put a simple text editor + there, so you can modify your configuration files later. + + Put a copy of the file + + /usr/local/lib/pcemu/C/emufs.sys + + onto this diskette, and include a line like + + device = a:\emufs.sys /usr/local/lib/pcemu/C + + into the config.sys file on this diskette. This will + provide you with an interface to the BSD file system from + within your DOS session. (It actually pretends to be a + network drive.) According to David Hedley, you are also + advised to include the line + + stacks = 9, 512 + + there to avoid stack overflow problems with the emulator. + + If you want to retain a copy of the standalone "system" you + are currently looking at, move it away: + + # cd /usr/local/lib/pcemu; mv DriveA StandaloneA + + Now, make a copy of your disk by either: + + - under BSD, perform a + + # cp /dev/fd0.720 /usr/local/lib/pcemu/DriveA + + (the number after the fd may vary for drives other than + the primary one), or + + - under DOS, copy the file + + /usr/local/lib/pcemu/C/dumpdisk.exe + + to your DOS system and execute it. This will dump the + physical copy of either drive A or B to the file drivea + in your current (DOS) working directory. You can then move + this file to + + /usr/local/lib/pcemu/DriveA + + in your BSD system. + +Since pcemu needs to display the standard VGA font, you further need +to tell your X server about the location of the font file. It has +been put under + + /usr/local/lib/pcemu/font/ + +along with the necessary information for the X server. All you need +to do is to tell your X server about it. This can either be done +as a server default by including the directory into the FontPath +section of your XF86Config file (this is for XFree86, refer to +the documentation if you're using another X server). Alternatively, +you can run the command + + $ xset fp+ /usr/local/lib/pcemu/font + +when X11 is running to instruct your X server to append this directory +to the font path. Should you wish to run pcemu across the network, +remember that the fonts must be physically available at the server +side, or you need to provide an X11 font server (xfs). Refer to +the X11 documentation on how to setup this. + + +That's all, now you should be able to run pcemu. Add required +device = a:\emufs.sys /... lines to your config.sys as you +need them. It's not wise to make the whole BSD hierarchy available +since DOS does not provide multiuser protection. + +Should you wish to override some of the emulator defaults like +size and location of the bootfile, you can do this by settig up a +$HOME/.pcemurc file. Refer to sections 2. and 3. below. + + + +2. Informations about this FreeBSD port + + +This `port' of pcemu to FreeBSD has been prepared by Jörg Wunsch. +It is an only slightly modified version of David's code, a few +problems have been fixed for the BSD compilation environment, and +the location of the default boot file has been moved in order to +get you started with just what you are reading now. + +The PostScript document David is mentioning under 3. below has +been compressed and stored under + + /usr/local/lib/pcemu/doc/report.ps.gz. + +It is huge however, so if you don't care much for it you might wish +to remove it later. + +Since i'm living in Germany with a German keyboard, i found the +original X11 KeySym to PC scancode translation unacceptable. Several +scancodes have been unreachable for me. Hence i decided to add another +section to the .pcemurc file allowing to instruct pcemu of specific +keyboard layout semantics. They consist of the keyword keymap, +followed by the desired PC scancode, an equal sign, and the character +that is generated for this key under X11 without any shift keys. (Note +that no space is allowed on either side of the equal sign.) This way +i won't get a German key mapping under DOS, but at least a valid keyboard +layout where all the scan codes can actually be generated at all. + +The appropriate section of my .pcemurc file looks like: + +keymap 12=ß +keymap 13=' +keymap 21=z +keymap 26=] +keymap 27=+ +keymap 39=\ +keymap 40=[ +keymap 41=^ +keymap 43=# +keymap 44=y +keymap 53=- +keymap 86=< + + +Once :-) i will have filed all my modifications back to David, and +perhaps they will be included into the regular distribution as well. + +Should you wish to contact me regarding this FreeBSD port, you can +reach me as joerg_wunsch@uriah.heep.sax.de. + + + + diff --git a/emulators/pcemu/files/bootstrap.shar b/emulators/pcemu/files/bootstrap.shar new file mode 100644 index 000000000000..2d4a3193feb4 --- /dev/null +++ b/emulators/pcemu/files/bootstrap.shar @@ -0,0 +1,1086 @@ +# This is a shell archive. Save it in a file, remove anything before +# this line, and then unpack it by entering "sh file". Note, it may +# create directories; files and directories will be owned by you and +# have default permissions. +# +# This archive contains: +# +# bootstrap/Makefile +# bootstrap/crt0.S +# bootstrap/display.c +# bootstrap/help.txt +# bootstrap/lcrt0.S +# bootstrap/txt2asm.perl +# bootstrap/xcrt0.S +# +echo x - bootstrap/Makefile +sed 's/^X//' >bootstrap/Makefile << 'END-of-bootstrap/Makefile' +XAS = as86 +XLD = ld86 +XCC = bcc +XCFLAGS = -0 +XLDFLAGS = -0 ##-M +X +X +X.SUFFIXES: .S .o +X +X.S.o: +X $(AS) -o $@ $< +X +Xall: display.bin README.FreeBSD +X +X# The .com file is only to shortcut the development cycles when +X# modifying something, you won't have to reboot pcemu with the +X# new image over and over again. +X# +X#all: display.com +X +Xdisplay.com: display.o text.o crt0.o +X $(LD) $(LDFLAGS) -T 0x100 -o display.tmp crt0.o display.o text.o +X dd if=display.tmp of=$@ ibs=32 skip=1 +X rm -f display.tmp +X +Xdisplay.bin: display.o text.o lcrt0.o xcrt0.o +X $(LD) $(LDFLAGS) -T 0x7c00 -o display.tmp \ +X lcrt0.o display.o text.o xcrt0.o +X dd if=display.tmp of=$@ ibs=32 skip=1 obs=720k conv=osync +X rm -f display.tmp +X +X# o expand the tabs +X# o translate german ISO characters into IBM437 +X# o finally convert all this into assembler .ascii/.byte pseudoinstr's +X# +Xtext.S: help.txt txt2asm.perl +X expand < help.txt |\ +X tr '\344\366\374\304\326\334\337' '\204\224\201\216\231\232\341' |\ +X ./txt2asm.perl > $@ +X +X# maintain the README.FreeBSD from the help.txt +X# looks magic, 'eh? :^) +X# The readme consists of everything from section 1 up to before the +X# headline of section 3. The highlighting characters will be removed. +X# +X# If you've never been using Perl before, don't worry. Let the lines +X# below stand as they do. :-) +XREADME.FreeBSD: help.txt Makefile +X perl -e 'print "This is an excerpt of what you can see with";\ +X print " the standalone \"system\".\n -- J\366rg\n\n\n";\ +X while(<>) {last if /^[\001-\010\013-\037]1\./;}\ +X do {tr[\001-\010\013-\037]//d; print;}\ +X while(($$_=<>) && !m/^[\001-\010\013-\037]3\./);' \ +X < help.txt > $@ +X +Xreallyclean: clean +X rm -f display.bin README.FreeBSD +X +Xclean: +X rm -f *.tmp *~ *.core *.o *.s display.com text.S +X +Xpack: all clean +X rm -f ../../../files/bootstrapper.uu ../../../files/README.FreeBSD +X gzip --best --force display.bin +X uuencode display.bin.gz display.bin.gz > ../../../files/bootstrapper.uu +X cp -p README.FreeBSD ../../../files/README.FreeBSD +X rm -f display.bin.gz README.FreeBSD +X +X +Xunpack: +X rm -f display.bin README.FreeBSD +X uudecode ../../../files/bootstrapper.uu +X gunzip --force display.bin.gz +X cp -p ../../../files/README.FreeBSD README.FreeBSD +END-of-bootstrap/Makefile +echo x - bootstrap/crt0.S +sed 's/^X//' >bootstrap/crt0.S << 'END-of-bootstrap/crt0.S' +X ;; Hey Emacs, this is an -*- asm -*- file. +X ;; +X ;; crt0 -- prologue for simple DOS .com file +X ;; +X ;; also implements exit(), by calling the DOS exit service +X +X use16 +X +X entry _begin +X_begin: jmp .start +X +X extern _main +X +X public _exit +X_exit: +X_exit.code set 4 +X +X push bp +X mov bp, sp +X mov al, _exit.code[bp] +X mov ah, 0x4c ; dos service, exit w/ status +X int 0x21 +X +X_exit.1: ; not reached (hopefully) +X jmp _exit.1 +X +X +X.start: +X call _main +X call _exit +X +END-of-bootstrap/crt0.S +echo x - bootstrap/display.c +sed 's/^X//' >bootstrap/display.c << 'END-of-bootstrap/display.c' +X/* +X * display -- a simple program to display static text in a more(1)-like +X * manner. Designed to run with simple BIOS services on a i*86-PC. +X * +X * Purpose of the program: provide a simple method for pcemu to display +X * a text when there is no DOS boot image installed. This program will +X * run as the bootfile then. +X * +X * Author: Joerg Wunsch, 95/03/10 +X * Placed in the public domain. Neither kind of warranty applies. +X * +X * Thanks to Bruce Evans for his bcc compiler. Made my work much +X * easier. +X */ +X +X#define MAXROW 23 +X#define MAXCOL 79 +X#asm +Xmaxrow: set 23 +Xmaxcol: set 79 +Xnl: set 10 +X#endasm +X +X#define WHITE 7 +X#define BROWN 6 +X#define MAGENTA 5 +X#define RED 4 +X#define CYAN 3 +X#define GREEN 2 +X#define BLUE 1 +X#define BLACK 0 +X#define HIGH 8 +X/* convenience: */ +X#define YELLOW (BROWN|HIGH) /* foreground color */ +X#define GRAY WHITE /* background color */ +X +X#define NOCHANGE (-1) /* do not change color; for setattrib() */ +X +X/* +X * We use a special highlighting scheme: embedded control characters +X * in the text toggle the attribute selection. +X * +X * Define attributes used for highlighting. +X * NB: do not parenthise the macro expansions below, they are used as +X * complete parameter lists for setattrib()! +X */ +X +X#define REGULAR BLACK, GRAY /* ^R */ +X#define BOLD WHITE|HIGH, RED|HIGH /* ^B */ +X#define EMPHS BLUE, GRAY /* ^E */ +X#define DOUBLE YELLOW, BLACK /* ^D */ +X +X#define C_REGULAR ('R' & 0x1f) +X#define C_BOLD ('B' & 0x1f) +X#define C_EMPHS ('E' & 0x1f) +X#define C_DOUBLE ('D' & 0x1f) +X +X#define K_CUP ((0x48 << 8) + 0) /* extended ASCII, cursor up */ +X#define K_CDN ((0x50 << 8) + 0) /* extended ASCII, cursor down */ +X#define K_PREV ((0x49 << 8) + 0) /* extended ASCII, page up */ +X#define K_NEXT ((0x51 << 8) + 0) /* extended ASCII, page down */ +X +X/* +X * Glue to link to the BIOS services. +X */ +X +Xchar attrib; +Xchar row, col; +X +X +Xvoid scroll(nlines) +Xint nlines; /* if nlines == 0, clear entire region */ +X{ +X#asm +X push bp +X mov bp, sp +X +X xor bh, bh ; page 0 +X mov dx, *(maxcol + (maxrow << 8)); bottom/right corner +X xor cx, cx ; top/left corner +X mov al, 4[bp] ; nlines +X mov bh, _attrib +X mov ah, *6 ; video bios, scroll (clear) region +X test al, al ; scroll back? +X jns _scroll.1 ; positive value -> forward +X inc ah ; scroll backwards +X neg al +X_scroll.1: +X int 0x10 +X +X pop bp +X#endasm +X} +X +Xvoid gotoxy(x, y) +Xint x; +Xint y; +X{ +X#asm +X push bp +X mov bp, sp +X +X mov dl, 4[bp] ; x +X mov _col, dl +X mov dh, 6[bp] ; y +X mov _row, dh +X xor bh, bh ; page 0 +X mov ah, *2 ; video bios, set cursor +X int 0x10 +X +X pop bp +X#endasm +X} +X +Xvoid putchar(c) +Xint c; +X{ +X#asm +X push bp +X mov bp, sp +X +X mov al, 4[bp] ; c +X mov bl, _attrib +X xor bh, bh ; always page 0 +X mov cx, *1 ; just one char +X mov ah, *9 ; video bios, write char +X int 0x10 +X +X pop bp +X#endasm +X if(col < MAXCOL) +X gotoxy(col + 1, row); +X} +X +X +Xvoid cls() +X{ +X scroll(0); +X} +X +X +Xint getchar() +X{ +X#asm +X xor ah, ah ; kbd bios, get keystroke +X int 0x16 +X#endasm +X} +X +Xvoid setattrib(foreground, background) +Xint foreground; +Xint background; +X{ +X int i; +X if(foreground == -1) +X i = attrib & 0xf; +X else +X i = foreground & 0xf; +X if(background == -1) +X i |= (attrib & 0xf0); +X else +X i |= ((background & 0xf) << 4); +X attrib = i; +X} +X +X +X/* +X * Some auxiliary functions +X */ +X +X/* +X * print one line of text up to a newline or a null character +X */ +X +Xchar *printline(s) +Xchar *s; +X{ +X register char c; +X +X while((c = *s++) && c != '\n') +X switch(c) +X { +X case C_REGULAR: +X setattrib(REGULAR); +X break; +X +X case C_BOLD: +X setattrib(BOLD); +X break; +X +X case C_EMPHS: +X setattrib(EMPHS); +X break; +X +X case C_DOUBLE: +X setattrib(DOUBLE); +X break; +X +X default: +X putchar(c); +X } +X +X if(c == 0) s--; +X return s; +X} +X +X +X/* +X * display a message on the bottom line; if msg == 0, clear bottom line +X */ +X +Xvoid more(msg) +Xchar *msg; +X{ +X int i; +X +X gotoxy(0, MAXROW + 1); +X if(msg) { +X setattrib(YELLOW, BLUE); +X (void)printline(msg); +X setattrib(REGULAR); +X } else { +X setattrib(WHITE, BLACK); +X for(i = 0; i < MAXCOL; i++) putchar(' '); +X setattrib(REGULAR); +X } +X} +X +X +X/* +X * go back for numlines newline chars, starting at current, but not before +X * initial +X */ +X +Xchar *goback(initial, current, numlines) +Xchar *initial; +Xchar *current; +Xint numlines; +X{ +X current--; +X +X while(numlines && current > initial) +X if(*--current == '\n') +X numlines--; +X if(*current == '\n') +X current++; +X return current; +X} +X +X +X/* +X * the static text is maintained separately in an (automatically generated) +X * .S file +X */ +X +Xextern char textstr[]; /* do not declare this "char *" - bcc breaks */ +X +X +Xint main() +X{ +X char *cp, *cp1; +X int c; +X int lineno; +X +X lineno = 0; +X cp = textstr; +X setattrib(REGULAR); +X cls(); +X for(;;) { +X gotoxy(0, lineno); +X cp = printline(cp); +X if(*cp == 0) break; +X lineno++; +X if(lineno == MAXROW + 1) { +X for(;;) { +X more("--More--"); +X c = getchar(); +X more(0); +X +X if(c & 0xff) /* regular ASCII */ +X c &= 0xff; /* strip scancode */ +X +X switch(c) { +X case ' ': /* page forward */ +X case K_NEXT: +X lineno = 0; +X cls(); +X goto out; +X +X case 'd': /* half page forward */ +X scroll((MAXROW + 1) / 2); +X lineno -= (MAXROW + 1) / 2; +X goto out; +X +X case 'b': /* page backward */ +X case K_PREV: +X cp = goback(textstr, cp, 2 * (MAXROW + 1)); +X lineno = 0; +X cls(); +X goto out; +X +X case '\r': /* one more line */ +X case '\n': +X case K_CDN: +X lineno--; +X scroll(1); +X goto out; +X +X case K_CUP: /* one line less */ +X cp1 = goback(textstr, cp, 2); +X cp = goback(textstr, cp1, MAXROW); +X if(cp == textstr) /* start of text, redisplay all */ +X { +X lineno = 0; +X cls(); +X } +X else +X { +X scroll(-1); +X gotoxy(0, 0); +X (void)printline(cp); +X cp = cp1; +X lineno--; +X } +X goto out; +X +X case '?': +X case 'h': +X more( +X"space: next page, d: half page, b: back page, CR, DWN: nxt line, UP: prv line" +X ); +X (void)getchar(); +X more(0); +X break; +X +X case 'q': /* quit the game */ +X goto done; +X } +X } +X } +X out:; +X } +X done: +X more("Hit any key to quit."); +X (void)getchar(); +X more(0); +X +X return 0; +X} +X +END-of-bootstrap/display.c +echo x - bootstrap/help.txt +sed 's/^X//' >bootstrap/help.txt << 'END-of-bootstrap/help.txt' +XPC Emulator v1.01alpha (C) 1994 University of Bristol +XPlease report comments, bugs etc to hedley@cs.bris.ac.uk +X +X +XThis is David Hedley's PC Emulator. +X +X +X0. Table of contents +X +X 0. Table of contents +X 1. How to get pcemu really running +X 2. Informations about this FreeBSD port +X 3. David's original README +X 4. Copyright notice +X +X +X +X1. This looks like PC, but where is DOS? How to get pcemu really running +X +XPcemu is an emulator that emulates an 8086 CPU as well as a bunch of +XPC BIOS services, so it basically provides the functionality like an +Xold PC/XT. Anyway, as with the XT too, the emulator requires something +Xlike an operating system to run with. Since we cannot ship MS-DOS or +Xone of its variants along with this distribution (for legal reasons), +Xyou're now actually looking at a (sort of) "standalone operating system", +Xjust to get pcemu booted and running. All this system does is showing +Xyou this introduction. +X +XYou will have to replace this mini-system by a physical image of a +XDOS boot floppy. The "system" currently running is booted from the +Xfile +X +X /usr/local/lib/pcemu/DriveA. +X +XIt pretends to be the image of a 720 KB diskette, which has been +Xchosen as the default bootfile size. +X +XIn order to obtain the image of a bootable DOS floppy, do the following: +X +X Prepare a 720 KB floppy with a DOS system as you'd like +X to run it later. Include all the good stuff you don't want +X to miss there. Don't forget to put a simple text editor +X there, so you can modify your configuration files later. +X +X Put a copy of the file +X +X /usr/local/lib/pcemu/C/emufs.sys +X +X onto this diskette, and include a line like +X +X device = a:\emufs.sys /usr/local/lib/pcemu/C +X +X into the config.sys file on this diskette. This will +X provide you with an interface to the BSD file system from +X within your DOS session. (It actually pretends to be a +X network drive.) According to David Hedley, you are also +X advised to include the line +X +X stacks = 9, 512 +X +X there to avoid stack overflow problems with the emulator. +X +X If you want to retain a copy of the standalone "system" you +X are currently looking at, move it away: +X +X # cd /usr/local/lib/pcemu; mv DriveA StandaloneA +X +X Now, make a copy of your disk by either: +X +X - under BSD, perform a +X +X # cp /dev/fd0.720 /usr/local/lib/pcemu/DriveA +X +X (the number after the fd may vary for drives other than +X the primary one), or +X +X - under DOS, copy the file +X +X /usr/local/lib/pcemu/C/dumpdisk.exe +X +X to your DOS system and execute it. This will dump the +X physical copy of either drive A or B to the file drivea +X in your current (DOS) working directory. You can then move +X this file to +X +X /usr/local/lib/pcemu/DriveA +X +X in your BSD system. +X +XSince pcemu needs to display the standard VGA font, you further need +Xto tell your X server about the location of the font file. It has +Xbeen put under +X +X /usr/local/lib/pcemu/font/ +X +Xalong with the necessary information for the X server. All you need +Xto do is to tell your X server about it. This can either be done +Xas a server default by including the directory into the FontPath +Xsection of your XF86Config file (this is for XFree86, refer to +Xthe documentation if you're using another X server). Alternatively, +Xyou can run the command +X +X $ xset fp+ /usr/local/lib/pcemu/font +X +Xwhen X11 is running to instruct your X server to append this directory +Xto the font path. Should you wish to run pcemu across the network, +Xremember that the fonts must be physically available at the server +Xside, or you need to provide an X11 font server (xfs). Refer to +Xthe X11 documentation on how to setup this. +X +X +XThat's all, now you should be able to run pcemu. Add required +Xdevice = a:\emufs.sys /... lines to your config.sys as you +Xneed them. It's not wise to make the whole BSD hierarchy available +Xsince DOS does not provide multiuser protection. +X +XShould you wish to override some of the emulator defaults like +Xsize and location of the bootfile, you can do this by settig up a +X$HOME/.pcemurc file. Refer to sections 2. and 3. below. +X +X +X +X2. Informations about this FreeBSD port +X +X +XThis `port' of pcemu to FreeBSD has been prepared by Jörg Wunsch. +XIt is an only slightly modified version of David's code, a few +Xproblems have been fixed for the BSD compilation environment, and +Xthe location of the default boot file has been moved in order to +Xget you started with just what you are reading now. +X +XThe PostScript document David is mentioning under 3. below has +Xbeen compressed and stored under +X +X /usr/local/lib/pcemu/doc/report.ps.gz. +X +XIt is huge however, so if you don't care much for it you might wish +Xto remove it later. +X +XSince i'm living in Germany with a German keyboard, i found the +Xoriginal X11 KeySym to PC scancode translation unacceptable. Several +Xscancodes have been unreachable for me. Hence i decided to add another +Xsection to the .pcemurc file allowing to instruct pcemu of specific +Xkeyboard layout semantics. They consist of the keyword keymap, +Xfollowed by the desired PC scancode, an equal sign, and the character +Xthat is generated for this key under X11 without any shift keys. (Note +Xthat no space is allowed on either side of the equal sign.) This way +Xi won't get a German key mapping under DOS, but at least a valid keyboard +Xlayout where all the scan codes can actually be generated at all. +X +XThe appropriate section of my .pcemurc file looks like: +X +Xkeymap 12=ß +Xkeymap 13=' +Xkeymap 21=z +Xkeymap 26=] +Xkeymap 27=+ +Xkeymap 39=\ +Xkeymap 40=[ +Xkeymap 41=^ +Xkeymap 43=# +Xkeymap 44=y +Xkeymap 53=- +Xkeymap 86=< +X +X +XOnce :-) i will have filed all my modifications back to David, and +Xperhaps they will be included into the regular distribution as well. +X +XShould you wish to contact me regarding this FreeBSD port, you can +Xreach me as joerg_wunsch@uriah.heep.sax.de. +X +X +X +X +X3. Here's David's original README file: +X +X +X PC Emulator for Unix and X Windows +X +XAs the title suggests, this is a Unix/X windows program which is +Xdesigned to emulate a standard 8086 based PC. +X +XIn its current form it runs most text based programs. The programs I have +Xtried and found to work are as follows: +X +XMSDOS 5.0 MSDOS 6.2 +XWordPerfect 5.1 Borland C++ 2.0 +XTurbo Debugger 2.51 Turbo Assembler 2.51 +XBBCBasic 4.61 MSDOS QBasic +XMSDOS GWBASIC Virtually all program that came with MSDOS 5 +XHitchhiker's Guide to the Galaxy PC Magazine's ANSI.COM +XSemWare's QEdit 2.1 Norton Utils 4.50 Advanced Edition +XNorton Utils 6.0 Xtree Professional 1.1 +XPowerMeter Utils Autoroute (ancient version) +XMinitab 8.0 Microsoft Diagnostics +X +XThis is all the programs I could lay my hands on which were text based +Xand could run on an 8086 +X +XThe emulator runs at about 8-10MHz 80286 speed on a Sun SparcStation +X10/40 (without the -mviking flag) and at about 6MHz 8088 speed on a +X33MHz 80486 box running Linux. +X +XI have included a Postscript representation of my project report. It's +Xa bit out of date now, but it's the closest thing I've got to +Xdocumentation! I'll do some kind of latex thing for the next +Xrelease.... +X +XThe program rather hogs the cpu but unmapping the window (iconifying +Xit) will put it to sleep. +X +XThe most recent version of this program will always be in ftp.cs.bris.ac.uk +Xcurrently in the directory /users/hedley +X +XINSTALLING THE EMULATOR +X +XEdit the Makefile to change the OPTIONS, CFLAGS and XROOT to be +Xappropriate for your system (I am assuming you are using GNU GCC, +Xalthough any ANSI C compiler should work just as well). Ensure you are +Xusing the best (speed) optimisations possible (e.g. -O2 -fomit-frame-poiner) +X +XEdit the file mytypes.h and ensure that the types for INT8, UINT8, +XINT16, UINT16 etc are correct. Hopefully nothing need be changed in +Xthis file, but you never can tell... I have assumed that 'char's are 8 +Xbit bytes, 'short's are 16 bit words and 'long's are 32 bit words. If +Xyour compiler treats these differently to the above then you will have +Xto edit this header file. +X +XType 'make' and go away and have a cup of tea! Compiling 'cpu.c' takes +Xa while (and quite a bit of memory!). +X +XGet a floppy disk of the same size/type as you specified in the Makefile +X(i.e. if you chose -DBOOT720, then you'll need a 3.5" 720k disk). Install +XMSDOS on it. Copy the files 'config.sys', 'emufs.sys' and 'lredir.exe' from +Xthe 'programs' directory onto this floppy disk. Shove it in your Unix box +Xand type cp /dev/fd0 DriveA This should create a 720k (or whatever) file +Xwhich the emulator can boot from. If you do not have access to a Unix box +Xwith a floppy disk on it, then you can use the supplied 'dumpdisk' program +Xto create a disk image. All you need is access to a PC. Simply put in a +Xbootable MSDOS disk into the drive and type dumpdisk A (or dumpdisk B if in +Xdrive B). The program will copy the entire disk to a file called +X'drivea'. You must then transfer it to your Unix box... +X +XYou then need to convert the vga font (vga.bdf) into a font format +Xyour X server can understand (either SNF or PCF) using either +X'bdftosnf' or 'bdftopcf' and install the resulting font file somewhere +Xwhere your X server can find it. Then type 'mkfontdir' to rebuild the +Xfonts.dir file and then type 'xset fp rehash' to tell your X server +Xabout the new font. If you type 'xlsfonts' you should see 'vga' as one +Xof the fonts listed. If not, then something has gone wrong. I may or +Xmay not be able to help - it depends on your local setup. The emulator +Xwill run without the font as it uses the standard 8x16 X11 font - +Xalthough most programs which use the extended character set will look +Xpretty terrible. A warning will be displayed if the correct VGA font +Xcannot be found. If you are using openwindows, you will have to type +X'convertfont' and then 'bldfamily' +X +XYou should now be in a position to run the emulator +X +XBy default, the emulator requires the disk image called 'DriveA' to be in +Xthe current directory or else it will complain. If you don't like this, +Xthen you can change the file the emulator boots from by altering your +X.pcemurc file (see below) or by changing the default at compile time (by +Xmodifying the Makefile) +X +XOnce run, the emulator should come up with the usual MSDOS banner and +Xrequest the current date and time (which should already be +Xcorrect). You can now run PC programs, mount Unix directories as +Xdrives etc. You will already have one drive redirection - drive C: is +Xthe Unix root directory. To mount further directories as drives, you +Xmust use the program 'lredir'. Consult the file 'lredir.readme' for +Xinstructions... +X +X The .pcemurc file +X +XAt present this file allows a few things to be changed at run time. If this +Xfile is found (either in the current directory or in your home directory), +Xthen it is read and parsed and the values overwriting the equivalent +Xcompile time options. Currently the only options supported at present are: +X +Xbootfile diskfile +X +Xwhere diskfile is the disk image you want to boot from (no quotes or +Xanything are needed and the filename must not contain white spaces). +X +Xboottype type +X +Xwhere type is either 360, 720, 144 or 12. This tells the emulator the type +Xof disk the disk image file represents (360k, 720k, 1.44MB, 1.2MB +Xrespectively). +X +Xupdatespeed n +X +Xwhere n is an integer > 0 +XThis is the rate at which the screen memory gets checked for changes (and +Xhence the update speed at which the screen gets updated for non-BIOS +Xwrites). n is measured in internal interrupt ticks of which there are ~72.8 +Xper second (depends on the resolution of the system timer). +X +Xcursorspeed n +X +Xwhere n is an integer +XThis specifies how fast the cursor should flash. Flashing the cursor can +Xtake a fair amount of bandwidth and so on slow/heavily loaded networks it +Xmay be best to slow down the cursor flashing. Setting n to 0 or less will +Xdisable cursor flashing - the cursor will be permanently on. +X +XAn example .pcemurc file can be found in this directory. +X +XIf you have problems compiling or running the emulator, then please contact +Xme giving details of what went wrong (along with your computer type +Xetc). +X +XArchitectures tested: +X +XComputer OS Comments +X----------------------------------------------------------------------------- +XPC 486/33 Linux 0.99.14w Runs quite well. A bit pointless though :) +XSun 3/60 SunOS 4.1.x Takes an age to compile and not really worth +X the effort... +XSparcStation 10 SunOS 4.1.3 Runs well. Takes > 20MB RAM to compile though +XHP 755/99 HPUX Runs OK (>25MB RAM to compile...) +XSun 4 Solaris 2.3 Runs OK +XRS6000 ??? Had a few problems getting it to compile. +X Getting there slowly though. +XSGI Indigo IRIX 4.?.? Doesn't work if compiled with optimisation +X using the standard compiler. Haven't tried +X it using gcc yet... +X +XAs you can see this list is quite small. The main limiting factor is the range +Xof machines I have access to. If anyone else can get it running on other +Xarchitectures then please contact me! +X +XWarning: This program is not secure! Do not make is suid or sgid anything +Xunless you wish to compromise the security of your system! +X +XEMULATOR LIMITATIONS etc +X +XSome parts of the PC architecture are emulated better than others. The +XBIOS has been partly implemented - enough to get MSDOS to boot and to +Xallow most programs to run. Anyhow, most decent programs bypass the +XBIOS for screen access. BIOS Disk calls for drive A have been mostly +Xemulated, although formatting doesn't work. +X +XSome of the hardware has been emulated but not much. Timer interrupts +Xare generated by the system but there is now way (at present) to +Xreprogram the timer. The Programmable Interrupt Controller has been +Xemulated in part to respond to the End Of Interrupt command and reads +Xfrom and writes to the mask register should work OK. +X +XNone of the VGA hardware has been emulated at present (apart from +Xscreen updating) although this will change in the near future. Mode +Xchanges must therefore be done through the BIOS. +X +XThe keyboard has been mostly emulated. The program converts X11 +Xkeysyms to raw PC scan codes and then generates an interrupt 9 as per +Xusual. There is a BIOS routine which takes these scan codes and +Xgenerates the correct BIOS ASCII/scan code pair. The keysyms used can +Xbe found in the module 'xstuff.c'. In the future these keysyms will be +Xread in from a file at run time. +X +XTHANKS +X +XThanks go to the following: +X +XAndy Norman at HPLabs, Bristol (ange@hpl.hewlett-packard.co.uk) for the HP +Xport. +XDieter Becker (becker@med-in.uni-sb.de) for help with the Solaris port +XKlaas Esselink (esselin1@ksla.nl) for help with the RS6000 port +X +XPlease report bugs/comments etc to me (hedley@cs.bris.ac.uk) and I'll +Xdo my best to sort them out (no guarantees though). After June 25th I +Xwill be leaving University and will not be able to check email very +Xfrequently - please be patient if you want a response - I will reply +Xeventually. +X +XHave fun... +X +XDavid +X +X +X +X +X4. And finally, the Copyright notice: +X +X +XAll files, documentation etc with the exception of 'mfs.c', +X'emufs.sys', 'emufs.S', 'lredir.exe', 'lredir.c' and 'lredir.readme' +Xare Copyright (C) 1994 University of Bristol, England +X +XPermission is granted to use, copy, modify, and distribute this +Xsoftware and its documentation for any non-commercial purpose, +Xprovided that the above copyright notice appear in all copies and that +Xboth that copyright notice and this permission notice appear in the +Xsupporting documentation. +X +XBECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +XFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT +XWHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER +XPARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, +XEITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +XIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +XPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +XPROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME +XTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. +X +XIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +XWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +XREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR +XDAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL +XDAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM +X(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED +XINACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF +XTHE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +XOR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +X +X--------------------------------------------------------------------- +X +X'mfs.c', 'emufs.sys' and 'emufs.S' are covered by the following +Xnotice: +X +X Mach Operating System +X Copyright (c) 1993,1992,1991,1990 Carnegie Mellon University +X Copyright (c) 1991 IBM Corporation +X All Rights Reserved. +X +X Permission to use, copy, modify and distribute this software and its +X documentation is hereby granted, provided that both the copyright +X notice and this permission notice appear in all copies of the +X software, derivative works or modified versions, and any portions +X thereof, and that both notices appear in supporting documentation, +X and that the nema IBM not be used in advertising or publicity +X pertaining to distribution of the software without specific, written +X prior permission. +X +X CARNEGIE MELLON AND IBM ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS IS" +X CONDITION. CARNEGIE MELLON AND IBM DISCLAIM ANY LIABILITY OF ANY KIND FOR +X ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. +X +X Carnegie Mellon requests users of this software to return to +X +X Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU +X School of Computer Science +X Carnegie Mellon University +X Pittsburgh PA 15213-3890 +X +X any improvements or extensions that they make and grant Carnegie Mellon +X the rights to redistribute these changes. +X +X-------------------------------------------------------------------- +X +X'lredir' was written by Tim Bird (Tim_R_Bird@Novell.COM) +X +END-of-bootstrap/help.txt +echo x - bootstrap/lcrt0.S +sed 's/^X//' >bootstrap/lcrt0.S << 'END-of-bootstrap/lcrt0.S' +X ;; Hey Emacs, this is an -*- asm -*- file +X ;; +X ;; lcrt0 -- C prologue for simple boot-loaded module +X ;; +X ;; Bootstraps a simple .com-style area 512 bytes off its +X ;; own start address, by loading it via the BIOS int 0x13 +X ;; interface. +X ;; Needs an epilogue counterpart to know about the end +X ;; address. +X +XSECSPERTRACK: set 9 ; bump this for boot disk size != 720 KB +X +X use16 +X +X .text +X extern _main +X +X .data +X extern .endfile +X +X .text +X +X entry .begin +X.begin: +X +X mov ax, .endfile +X mov bx, .startfile ; from epilogue +X sub ax, bx ; # bytes to load +X add ax, 511 ; round to full sectors +X mov cl, 9 +X shr ax, cl ; make # sectors +X +X push cs +X push cs +X pop es +X pop ds +X +X mov bx, .startfile ; load here +X +X mov si, ax ; sector count +X mov cx, 2 ; starting cylinder/sector +X mov dx, 0 ; starting head/drive A +X.begin.loop: +X mov ax, 1 + (2 << 8); read one sector +X int 0x13 ; just do it +X +X add bx, 512 +X dec si +X jz .begin.done +X inc cl +X cmp cl, SECSPERTRACK + 1 +X jne .begin.loop +X mov cl, 1 +X inc dh +X cmp dh, 1 + 1 +X jne .begin.loop +X mov dh, 0 +X inc ch +X jmp .begin.loop +X +X.begin.done: +X call _main +X int 0x19 ; reboot -> this will quit pcemu +X +X +X ;; .blkb (.begin - $ + 512) ; cannot be done in as86 +X ;; XXX IF ANYTHING IS BEING CHANGED IN THIS FILE, ADJUST THE +X ;; NUMBER BELOW! Link with -M and adjust the number so that, +X ;; when linked to address 0x7c00, the symbol .startfile will +X ;; be equal 0x7e00. +X .blkb 443 +X +X export .startfile +X.startfile: +X +END-of-bootstrap/lcrt0.S +echo x - bootstrap/txt2asm.perl +sed 's/^X//' >bootstrap/txt2asm.perl << 'END-of-bootstrap/txt2asm.perl' +X#!/usr/bin/perl +X# +X# Convert an input text into a sequence of .ascii or .byte assembler +X# instructions. Cares to express any non-printable ASCII character +X# as well as the double quote and backslashes as a hexadecimal .byte +X# instruction. +X# +X +X# print one line of input text +Xsub pline +X{ +X local($s) = @_; +X local($i, $k, $ele, $c); +X +X # delete any null char to avoid confusion (we use null as the string +X # delimiter) +X $s =~ tr/\000//d; +X +X $i = 0; +X # +X # split the string into substrings of printable characters (where +X # we can write a singe .ascii instruction for each of them) +X # +X foreach $ele (split(/[\001-\037\"\\\177-\377]/, $s)) { +X next if length($ele) == 0; # split returns a null string for +X # succeeding delimiters which dont wann see +X +X $k = index($s, $ele, $i); # see if there are any non-pritables +X # just before the current substring +X while($i < $k) { # if so, write a .byte for each +X $c = substr($s, $i++, 1); +X printf "\t.byte\t0x%02x\n", ord($c); +X } +X print "\t.ascii\t\"$ele\"\n"; # this substring +X $i += length($ele); +X } +X while($i < length($s)) { # are there any non-printables left at end? +X $c = substr($s, $i++, 1); +X printf "\t.byte\t0x%02x\n", ord($c); +X } +X print "\t.byte\tnl\n"; # dont forget the final newline +X} +X +X +X# +X# the asm file prologue: +X# +X# declare a synonym for newline, and define the entry symbol "_textstr" +X# +Xprint ".data\nnl:\tset\t0x0a\n.globl _textstr\n\n_textstr:\n"; +X +X# process all lines now +Xwhile($_ = <>) { +X chop; +X &pline($_); +X} +X +X# the epilogue: terminate with a null byte +Xprint "\t.byte\t0\n"; +END-of-bootstrap/txt2asm.perl +echo x - bootstrap/xcrt0.S +sed 's/^X//' >bootstrap/xcrt0.S << 'END-of-bootstrap/xcrt0.S' +X ;; Hey Emacs, this is -*- asm -*- code +X use16 +X .data ; ld86 places .data after .text +X export .endfile +X.endfile: +END-of-bootstrap/xcrt0.S +exit + diff --git a/emulators/pcemu/files/bootstrapper.uu b/emulators/pcemu/files/bootstrapper.uu new file mode 100644 index 000000000000..4cd0349e03a7 --- /dev/null +++ b/emulators/pcemu/files/bootstrapper.uu @@ -0,0 +1,250 @@ +begin 644 display.bin.gz +M'XL("-T8=R\"`V1I<W!L87DN8FEN`.W<7VQ<V7W8\5E9VK5ODSA5"B=!BOK8 +M24&R)D>DI)6U:\O>(3D4)\M_YI`K"4U6N9RY0UYK.'<R=X84#=?9Q$F0W0V0 +M/J0MT*>@:%^+!#!:)7ZH@SA!BZU?FH<&11,TP0:5*Q3HP\)Q-K;4W^]WSKTS +ME+2V`Q@%"GP_\(KSY]YSSSW__]SQO;MO?;GRA9D_.??HF=_YP!_?_Z$?>N[# +M\O[U/_K=,Y7?JU3N/7/F:S_RBW]0.;,Q_-##WW_MKZ/1__Z=9Q[^T6L/SXS> +M_G>5AW_XX,_N?^M]7_OQ"OY_M?OZ7\X_^KW-'UWX3V^LG'WC4Z^]]:5G?_DK +M)V<??O4;?_*U'_[9/Y"OWWCE[*]]Z.Y;;QP]^VM7/O_6_*,OG2F^D!/^P6OR +MR>\^4_G2!^1#^>S&*[]U]ZU/;N8_\EMRZ-M;\F;^[9>V[O_[1U_\ZME7;]MI +M-UY9^,K6_5]]M+RL'\R__;4/^4_7UMY<.7OMT:/1#_S6:V_]U`?GWWY]Y=T' +MD5PDO'YSY5G]]H/Z[?^9?_OOK+RK!_S=-U:>U0-^Y^P?_P__T1LK[_ZKU][R +MH8>`'^R]L?(W#UZ^]UQE2Z_]&QJ;!QOW?J"R=>^#E:W[OV#O/Z5?WWM&WF?V +MOBJ'WOLA>?MS]O;#$H3<T?US$O$'YV?/#+\B__WWV6>&_W'V!X?_YL&?O_GJ +MV:777SW[QO5'O[;R-[_\E>%S<OPGH]&OOJ'O1L_)UR_+UW*+IV)V[\=\E/[Y +M0[F&?/DK7QG^0XV#7?A_ZH>/CL[>_[A<LXC\?]$/'[R@D9-/[O^!OEWXBB;% +M#]]S\D'R<'GYS95W7[(4>_?:9N7S]XM3_X4>.W'Y-U]]5N+T[(._%UZ\\9Q$ +M^+DW5]Z_^OK*^^6/1.;]\M4G7CU[_*=OEE^_^JS<Y[.2&V4X7_SJ-S4&[WSY +M-W_I]5??+:XVHU>[_X,/'QV]HV^_]&V[F7?O?U8BJ)%[]=TWGI.4>=_7?^69 +M-U?>D?B^(W^N_5AE^+ZO]Y_Y\IN_U+S_W^3(^W_Z[==7OJ$!_&=Y]\;*-R1I +MWR]_M$A\X\V5;WS]?U7LVO?_];=_\:N5RM>??T:S]?[4MS45WCGWSB/YSK[X +M^\_<FZ]L200DELW[#R5RSTHL_+D'_MR_KL@I<N_O6"EX^UO+R_;Q7U3NG1F? +M^55_YC?O_:A^]DW[[+=#:/+F$Z^^.XI\J.>__>`?W7OT:.O^OY20Y`[T)O[M +MMT(JM#6"KWY3TBM<4R_UX.Z7KTEP?R'?W?_+;^GQ_U5>/KAMW]U^<&,NJDAZ +MW7HT]S[]^YE'<S^B?Q\^G/MP9?B'<S^I;W[\T=P9_?O-AW-G*\/?GOM`9?C[ +M<[]Q73YYX=%<Y1GY^U</YRK/R=_SX?U_>/CU?_KPZS<??GE:+KVOE_ZL7?IG +MOJVQ_N)7WZ_Y7%E-AR[NG;@[R8D;9N[G1^FP6LG[<2MYT?62NT/7C_>36==^ +MT1W$W4YXM_>BVXM;=\*[I>U9MWQC0XZ7P[MI3S[:W7K1]0=']JXR-[>>#9*Y +MN<J9K257/QQUXV$V<$<+U?F%N-L_B-WTTHQ;>.&%RVZWEQXE@SP=GKBLXQ8' +M:3[,NN>C,UO=),X3-TCZV6#H6MGA8=(;YA*/T7[NDF%+8WZ0M+O)R4NMO+HG +MYU7C5G5TYWP413L':>[D?\OQ4=IVJW;45.XFHE*5H\[,5]U.O-=-],*MK#?4 +M"\CI+GC:U^67"U6WFAUK)/832;!6<CB2N,;=[HD;C'J]M+=?'GJQZAJ]3C8X +MC(=IULM=O)>-AFZH<5P9),EB<]GI/9;'7ZKZB$N,LT&ZG_;BKMNNUY;7Z^4A +MEZMN*>N?R+<'0]?+AFDKB?2.%JKGG=U\-\ONR+_IG43N6A-MZ(X/DD%BJ;+9 +M_+0[\UUB+^FP91_+"7'/)446#@_B87B7V#=7YZ]><4M;NR[.W7'2[>K?6"[8 +M:QU(PD62YHN-S:;+D\&1Q%(R,,^<E+^].$];=L'^().;E<"&!XGKR'F:2G%7 +M"X3%/^Y%6;<MMW'AYD[5N5KOY#@^F;7+I<,#.^OFCMQ*-FNORY@.$BG8`PDW +MSPX326W)D1">R_K)0#*CM^_RDWR8'&I"R'U;@'*)9MIK)7(SKA7W)'%=?I#V +MW7IS3A).<B3*>E8DTF'NCN)!&DNQ<'$WD]!"A"3)VE*,!ZDDN]R+FY;,=]UD +M7_)1$CF7,C`S&YUDHRG)CYYD0]P:CBPI--<T5I+$4D-R+?A99\9]-!_&O;9> +M(GDBZA^=C3X[RH>GLW(ORX9)6^ZT762G)ISDC<4MW',[2ZR2Y`?9L2:.1,A_ +MG_:&@ZP]LGR0>G)+/C].Y>2#^"BQE$KZ76DK_,&':2^="R'NG4BT^P<GEK,N +M/9260A,JCC3A-$ZNT\WZ_1.)S([DU$?#';C6:#"0RC4N?!JM<`^=07:H^1IU +MTFXRKIOG+HSRP85N)A>ZT$WW+MA]7U@>2%M2.R^1;DA2#!*ILNU<H[R76-D8 +M1\E]_.*\>WE1\^E.,AQ*\W5\D$J)/9!BM9<DO:AUD.5)3TN9GMA..O&H.[1( +M:41<GGXNT<M(61JTDX%>(]L;QFGO\>OH&=:(:!KXVY>6-?.%/>MV+>U?'-_8 +MEJ1N+.6BC*$_QQ>MV$()J2U1TS+4MEI2GA]*LM0PK:$#2>I&K]4=M25$R__$ +M[6=9V^7#4:>CYTM<>E/2.$@IG@SC,,WMS@>)A+!LAT@AUA(F7_9'6C[S]+`O +M]S74#B-IIU+EQ@'HB5;3]0I2B]QAUDX[)_IVH&UI)]T?#:PY=)J<>8CL1#+8 +M)5K2QFDR6F*=RO_O7`Z6+LB_G;PJ*371GDL3GI6U,^2Z5I&T2"#KNGQR/GFA +M=J+ME[OFXA=_I@S=/?WR$Q=-_443=\[?ML7);D;B<SHV5BW2W"I;>7YH'2TA +M?1GH:9C)H&-5T(>M78@OEKYH:*4I0]"SI%Q:TEOQ2?)<:[9STU)+RK;GL>H2 +ME^?WDN%Q-KCCVEJYJC/2D+1:4NBUFLJADUWLK,722F\WS\H`XO91FDM5EJ.+ +MI-9(:V(_)9VEK6M)UW7-O3#KGE^X.)&45JHTE/@H2[4(ZW`DD\)%C32BI +M9H<3O4(R[NN+(!J^S&MI]RV95=G3!6VBL2U;*#EI?#L2B7&+-6ZR9Z602P.I +M8ROIH%Y\\M9^4LI`^ZDEYA/N\,CYQLLUR\O7)NY](SN6\&/MOLK(6HYJX=&& +M-TDU>2:N.N=&/6V9I&S,.NDT=``BN?K46/7=!2G>%SKM^:JV.M^I;9T,8%J3 +MJS<ZW)/+Q)VA-H-:T#OM\Q+5$^T<3[35\"5'!C,:0QU`]";"T#/Z`VDPY5BY +MYYE9[6&?N`DIM[/^OO_V34%[=-C75*HF=Y-3T1]F$Y4BM*G2',AAK=%0,W*R +M0CH-QCJB<0!E5U?DB,\$?[^N)G?B%HLJ:M7SG'T3GY\(HZB9H42Y:8G-C-,* +MIZ6J+0.8EA1A[3)OA:940NM943N5BA)-N\0P^UY3YBD96D1&VQ.?(E)W_&C( +M#RQZ2>);"$E0&02<3%280=N]<KTF^=T;^G:@,QI8:N@YD::"#@XM^)LV&M1" +M$T;"TAA(Y*P[*%I["<9N2#NPH7;+D7;+UO58D?AN0P$-X(+<W*F!F9361,:@ +MN1:V=#PDMT)JX\@0L3!:TKLH8B]==FIW_IZW,2XOFDNA*$A+*AUL$MF@.!Q> +M#B9.0GMH3:F.,HK<GN@U5N0^MN+AP?DH3UI%"MGES]U<N7IER3J5T*%,#\.\ +M1^_GILXMKEZ9E4:N8P.4R"Z1M48ZD?+WG5I0.@P=Y=:(]7P=+>YLQA)"*G9/ +MCC]*NB<V;+7[TT&&!J@3,\G^<7;\E#MW-Y=Q0J?_,?>>.2,9<ZS%^.;"@L:W +M&/99#R$#9QE[/I;$VNKW^](_%5UF2*FHJ%Y:7OJQ'[X?9".9,/@>,S\HAD2^ +M!,>M0>:'-D7'-AL-DL/$&C&;W!3!R=A6!]:2@T4]E^8^/HK3KHWGPI$^?E$N +M?;0V7669L7%2Z+MC?Z,6QW`_T^?N=O+SFK[;D]FCAYW.(OG?@9^I2:*.^G;[ +M59OBQL,IG7=T9VT.H=?-_8UK[[W734[=MV9DNUW,B=K1>PUGJE6906K/G)?- +MXZF!BQ]T1OX.#Z1]T.HI\=!IDB2V7=2Z*;V;XX.LZP<G!ZG,6@:M@XD$E"33 +M=D4;7YN):`A%@DG'/4Q'DE3ZR3`I9B)/R5CM_@=ZBD[RBL:CG`*&FN8GPI&. +MV:V%?[RQ*4;UL^5PM1T&BE)%)=F'Z;Z3I(^C<S^UNKE>OU"U)!VTSA<M5)&' +M+M31W)VY*.FHUSIS25[L)3)"J=H,73\_\[TL!Y3K&#^G[Z8TKKX$RV6*XXK9 +MB@[>=-;0U@C_]&\.]MV-42]O'51U'N0G\%E/2F_>U04#>6'#\52.MZ47GQ+% +MFD,KTZ(<NTYR')6#*IO[V:4ZZ5V=EH464V,A34!?\M12-.D=I8.LI^77!M?1 +MTQKWR=F4;[G*&]%^34?DY;0JTCF'%>YA/-`)H37E-N4]UMI:C#AE8FWM:,\2 +M6J>76UD^;+8&:7]85JDP6M5IJ[R3&.D9?H0QSJ=Q9Z,W-I#N(DRE<RE2\O)[ +MZG[DBA?\TE6UGU?W/Q?FI'+E@Y%,#:5*)Y+T?C%D<A[6TGLY',E,5%,X]?=W +M:,L\6N0C&[06X\QBTN1[Z'3J4,KYD4V?>^YZ(@6L5\X;_5M=\=O+I*N>=:E< +M8&3-:1*5JTS:_+R<G#1/;$5D:\GE4AFT/+CA(.[E(8]'O;C52OHVK=7F5N\D +M[D;%L9.%9=23?&D=6'.D-W2H)ZPF%ETI!BVIN=92QNUVT?F4_5S1`YZN;=KB +MV9SY5&?A:X84K[PO@7;25E3<J232B=:O/)'['Z:MW"\^G.@L-$_S85$FY7CI +M#-KNG+PXC/OG9R,_._=URI?:7)O.R629M:6QGY<)E,R&]WM^.FF]XD$\D)F5 +MW(UU*9+M^TE/%V[*JB,?Z?*K+WR:[II1&E'-M/P@[0SU>XWM](8T@3Z<GK0P +MNDQK=3K$+BO'&MH'E4U@&2F=L?E1;'P2I3*RU&*FE6JR4$B;W>^/*X,-MW7- +M4*ZIR[!Z\%'<E:I3)&L4DM4O*A9+"YHNSI<!?57.+:5'&M^_+FYUNZ&2RF4' +MF8S_Y1LW,<`Y/'DBW\<KFC+)\9GD%BY>^_/R]:5K4\7KBPO7/E>^OG+M9\O7 +M'[_VL>+UI1>N_4SQ^O+\M7]<OEZX]FKY^M*UGRQ?7[YV4KQ^_M*UN>+UU2O7 +M/BE-]::6Z1?G9J1<CQ?+-.)M2YW#HLUMA5;?UM*+^;-O*F62=A#W;6QRX@.1 +M=`LSYO9X2#A(]J5[&YQ>8@R+KT_O)'7Q6O)":I^>'(>Y^^,=3MG[159G]6@) +M]>QGLV2P?_O8^I.71I)3!]6#).E7\_ANM9V<MUXMLM9S58J"]!]GWF/QVN>C +M9-X3\Y/@[.16@=:2W5YZUZK437<C[;6S8UW-J?G!VS`=ZGK':'\_R75;H!CZ +MQG;6A9MR\W:&CB#V!_%A6-]+\TCK\7[/MSMA(5O'YL4DQM:S]^+<:KI?XM.5 +MWF)^9M-H:7ME9"6]2*8KK[H`YD\(UY):NV/36O_.-:PT1));H2<)36]F\SR_ +M8)*'U<!<$FB]J:.BYZOS[KWX(ZY4+T8WI-':DMF]U!TY8^$IQRYF@ZY>=.EC +M'W,7J_/1SFBP)^4NV=.T&\A'SS]^EC^B)AW?H33<_I!H<7%I4=?LW>7JE87O +M$*G/V%'A'J[?6*PU&TM//?R5=!":!ZT@1399.]>*I?!9SQ62(EI-AZV#`ZG\ +M`RE8UT?:TH7J<#WNQG=/G#;+Z_%^_#D9N\HAM8UFH[JTN1XUD\,;L97+S]3; +MDF\7GTBC#2G[4H-VAVDWEYM[?EY&RD?2ODM>Z1E2NZ)3AUQY6K[<'$I-<EN# +MK.-7UZ34+U07HBUIH@?KB2Z-^).?4!M):<]TO6%:KIEJ$0MCLIEH/>VETLNZ +MJ^]9$M93G<YDTEDLI_%^3XJC]'#C_:^B79XHB2UK'73J+DW20:P+?G)GOG(< +MV_I:69PC+37^>)U':"OCMWM\TSW>:-&JH*VZ#62OSBW,KZ]^3@Z\*!5)^F/? +M1\6N*6$T993::OJI3;0P?^'RO)LN.CZ-Z-SA46H+'YUNO#]C=:4,^(H/]>K5 +MB4"C2Y?\IY>UTF9WRYGD6MH;W=7:ZQOBLA6-;5B8^V&A#-!D>#>>:EF_(VGU +M6:U,8?1FTYLH=GM2=C06<E!;6XR>+LCMV;1_RK=(K6Z6)[F-Y"4"C:DC76K7 +M9<;HU(SN(S)CFM+UI,S/6>1VVQJJMD-WP\G%Z%HW8Z4UMIU0F9F%/K.H*M*= +M:K=_D.V'"/1'%J-1K^C-;1)F[:";3J472#LGNM.3#F=\_]*W^-O$I:MMN@_? +M6C697T^413^L2"=:4ST][LJ8(O>]E.L,^]53&['1>)$T;(N,US<NZ.0NO^#W +M;Z/H;&.CN5-;6VML7'<[JW577]]=J^UL;DMS;Y563UZ76658X=+A56_?SS$W +MMW8:FQLR7%E:6:M=;_KN8GMS<\>O8T>3`XR.GY\/BM6^Z8:+=1\E'QUJ:A53 +M";\6<GUCUUU?6IJ-XJZ6S_T#&YEIN^*6PI1'QUR^M[5VW"8EH2.6F7V]EX\& +M21%JY$.UZ::6DFDKQ#,NZP_3PS0/HX)^)JV'#I:GD^I^U<UM7G1SG>PP'<YU +M)-63N7XFS=M@9B)9+$D.3X8G_22O'O@%3'_A<C'#OK.;;VSL7)UUN_8GDG\7 +MKOAW"U=L1]U6MK.!9I+N;O>3SDB;9QV7V]1*:]U>$E)?1R11N>[HZX)?_-#U +M#5NHU`%)M1JZ/Y_.MFP@\9K2$;*N7\@EKT9:N?9.AKH[/"4I.AB&;R1>^I4. +MS'.[M2E=S0M?7KHX_E(NTHG"YE+(&6F0XZ%5C%Q+7D=FZ+XPAGY#&I6CQ"^F +MGDSN<.H4*_&IJ[,UF59*8#;/E]HA*>FF='UCRJ*SG]E:O[WV]RCCA+Y5EB3^ +MB%NRN&C234G=K+:FW%!.U=9$VMNNM?AM>_I"3[0&1EH@F=T-3CXR(U>[;H/T +ML/]GZ_S%#H5VC[J:<4&S-JS)%%,?/WV>K#'1=%J5>5>89]K&IIM;7I0Z\O&+ +M\[-E$FBC9%D<NTO5YS^J^X]W[+(S^OR"C(^ZW="KZ\KAT#^!4);!7.ZQ7">: +MDGPL%Y6F0L[)W"D=Z"+\E-^?TC.GBIYI:J)Q&._33=Q[59?U_+2W6*6VX:$T +M^M9/64I,;&04VRG6%89:VM(B$;96[[AIJ1"ZA*#E=<;O*?AN\-02DA9DOTXA +M<:Z6.TC2>NN"E<_TEJXIVS1V'*<P[SZ5>YILX_2VH$>Y;\;R4;_?U;R;*K8K +MIHJV5@MD&7,+R+:7JZ>6J*VWGXB'#%U=4S=H3WPCKWUEN17M<]$'5<PJ_)Y% +MF9)%+%S-TJE\NZC%2"J^/WQQYM1(UU>B<IM&EU@&B;^.1<K:*EU'E;'%E-\* +MF:K:OH:MM%K"V$*#KJ;Y?NE41EL/>,L>4Y`CBU56*7:2@[ZI.]J/_3+KM+RJ +M[K4[,_X.PZ=^U2TZO;1LV:#37IL"2,OK9]/-C15=S]U:6ID)/8+_(IJ28(=9 +MWNM,Z??^7;_5F0I[R591PD0MUW5,Z\_#;H9U^39GCOS,^<FH='0\H-5KQY+# +MMSAW-`2I(5-^UW)OE';]THTM5%?EF[`XXM<?BO/"0KR<<1#G!U-/W[Z(QKLP +MO>38XEHMBGD(IIO;=:8F5YES&>].22I/:?NC6QP3.S<Z3Y<>MFWA2#T)A;Y\ +M$,?6^_9UA_5XD.G#*0W;,,P&D?[1BC6QAGV0=/MN3LM#.^DG8<!J=V"+;GY= +MW)?#HM9&5A"+)WJ*N[-<D`M+2%+M\M-[5U?O2F=3KM+/C7M]&PV5`VC?0A2U +M5H9G$B$IAN5ZC\;&5P-=KXAT4WTHM4$7J6VUK.:.XX&-4(L)?MA)TRK<"3LJ +MU@.7NVE1>`II+_'SQC)SQF,5Z:I[8;X[>[HWLRR73(RF0C71$*?&Y61JK]ON +MQ(=I]V3*5ZV0N[JEX,=UL0Y*TF)%KMCV*5,Z6CPIUG/?Z_DK/_0KVJW0`+@I +MWT!/A><-;#!1;JQ/]@8#EW1S:_A#\R*M6ISVJN.F6%>T[-$N[31FHU,-[,10 +MT8\>)Z.H+6+N'S'29Y=TIRL,!`=1L?P4MM:TN-OR\(S&2(ZV@,N=N["B'0^+ +M`8B389V<MG<2^4=?BB.+3GDF+!E)@CZ6;D5GI9,#&4R46Y>C7)?T?-N])T5" +M-QY[[4B3V4\[)E+/.@O-8XN$+[0AW+BK2^6Z)A>%DC93+?>6-=LUBV4R711Y +M?:QA)&%:(UQD2ZK/_N51V-B7L:,/(LP*_`6L^&D=]WV%=?]AA6\N?+;THB[( +M:,PM]('VLQ-;WCM9N':QE7SZ\N&Y`BOQD?4@1;TL^J,PZ)C2L4I/&^-Q.2C& +M(QK70QV22%DNEI-U*&Y]S7LMOYS5QN94`=&%*7OD3*>3$]OQMDJ;^]T4/[DK +M'K`I1M'QT%>J5-?&&WZ:90^[^8W<T427%,9U3ZTCQ:#H0(M-^<U,J`VIK4'K +MO5JQD%EXL:EAO6;<'>GS&=(^'`_285%4M?[*5XDV09.%6J<LFD)NJ9S@Z>&V +MPQ2^L_%,-@C+O46R2(/U8A2=*Q^BTT8A))[O#8L/;*O]=*LQ^=A..1YSTSU] +M?#G31U$E_V2"YKL7;1EU>#!QCQIL3\?-5E"T/;55T=36/G3Q6=?5<QUV6_RL +MX]-_RKC9)Q*OD!>7KLC0V<;/"Y<O:P8L7*SZP:;VL/GI*EW,PK2/],.ATS=G +M]URN1N1N6D*_8\'+OPO5RY?7%_7OQ?5%J>XZSO>[\1;;45]KNU\2Z96Q[85M +M/WU43%?Y/N7FRU4A&YM8"S%TXQ%O+F-,W8"S^8=N$.121)/6G;!CX8MK;G.6 +MZ,!V<*Q1LJN'%9FGA6<!^:-\0+VL-Z=/!$=:U#3%?5P/DUAGK39YL>?;=`G- +M7@Q&?<GU5!\*D^0K+Z"+IO+?%SY^L7I5E\YU^R#3RC(Q2@BCL*P[FMQ^+)[Y +ME;(\L"24"I5G@^^2A#[YBDE6;KORG7C<\.;CIKO3E=%6U:WHGZ(RA2-T>7WH +M'^/JQ#)JBWT#)S&3)KU]G+:'?@Z?9QK_7!J/"S(%/4KM2;-8"W1X:D&',39: +MV@L+"K:((W&204!O\HJ=$`N9#^A.ML[C]=AY9\\DY^%Q0RF,-MYZ["1IJ2>" +M*H8L?=LW\C7?-N9K/1D*Q?8XZ.ENTV9/8=SBFZ_)AS=T?<[WX=97E)O-K7+> +M[%<7>V6+%"I4&$_V_4\$PO9&))5[W^]_MO6YOFXH+UHJM?6QH::4W_$#0>6" +MP<B>7=,**EV9%HG:H*6M0FLXL@%,HH-9:;J6BF,#Z8E/60J_4HCFOI_T&?K+ +M5Z]<N'0I7,86-]U\]847J@N7CYW;U@58OXY@FT`RRM35!%TL&EH6AZ'LBS.1 +M+L)>NG"E7$^6]W(3EZL+U;M^Z5\7*+34:[-DDRO?\&N9U$8S_$A`2N#PX#V[ +MQ\EG^Y).1Y=1I3>=7/MU"_,3E_;W97?AX^]C\2EW<7Y]T6W7UB=CXN\E6MUR +M'W_^^0LOO!"NM;JU>W/RVA;:YLMN^E,7GW\B$(F.3XK+$V<TLVX\D.)Y<3(^ +MFR]'V\TK\_,3"_"?_O2G3]WEJG:JUK^7!7@_U#0_ARTN^EW3ZWHXS;=N6INM +M:]7[E>2[WG"-7CO=S\*CK-N-FY)ZGZZ&V"QG26Y/<NM29-HIKAH>F)A<9ORN +M\1@O59;3HV)9K2JW>Y3H=6PWZ[L&97,M#6V_U7(GB14$W<(KAN<ZK+9&02>, +MVN#Z8IP?QE8.=#5:^^BN1-[/I&-M.<:]F([MM5<]C*7"ZE-+C<?69&Q,)0,# +M'8C:/$*OJMO??@_/FA;M&FQJ'Y^N]D^V,=)-?22*;O@IW(N^OR\&FZE_ADFZ +M(3G[(Y(?]M8>AM*.8Y2VM3G+]U,=E/B!2C3J6?T\O5E[*"$>IL7"D`87?APU +ML78ML3A;K)*[M<9Z8Z=FZ^`Z%I<>K*FC0*EOP[SH]*0-F;P[ZSO#[J<NZ@Z' +MX=%<GQ)^!S.R7^Z,'S*2\'0Q7]MY;>;DQ#F7]*QI"3\_\;.38HAF8Z\LLC'P +M8_-H/Y6LZJ]Y#NS19OVV[?<<RH/V3OJQ?U;/QT2'#V%8X?.WZG];M*PC*9U6 +MYN/'C:4-'#^&HJ%W3Z+B?F==.;OW*T)6M-H3%:@:DC`DGLSNV\>:8F5:C)-N +MY$>3^LR.))J.*<;#ECS2D\://H0G28J?R_AU"?^C+)UYZ5+R]'B\/*.)IZ/" +M8F?4C[\'OEYL^8\/K=MNE`,EF>@,!UE75\#+W[*4D4U])OI%I+R?^4UH#;@N +M+S<[$^&$YSK];XADWB!S$AUPZUL_<"O./(PE\0?)OB[XG-X/V7Q9DG$C_%I* +M#]45C>^0E!,SA>G8XFGKQ"'';0PI^30SSKQA^7!VF.6'"5(OB64(,])R7G7K +M65MFNF'T6JPS#A+)^*1X.E<^&80`$RM182.L?(9HXO$T+4AEE$^O?H85EER7 +MD?3ID/PD%/3XN'AH*#P<4RZ_%$6C'&CZQ']!9[<RRHILSF]7\:4D]@5>-XSU +MIRIA,&R]I=_H.'V1:!S^Y,J2A5%K+C4:%\KCI6"DH60541_I'%$'K*='<+I! +MV!YU;7E1?T54;4WI!D'X^=[0;SUI7(IPPK`QLNFG[A1:00KSXXG9KS1I.ZNU +MC9>;Y^WQUMX=72,LGY^?^*U4K=<^T6U[?7A)`EC=6HOW\MGBMZ,Z1=E/7CKH +M=ZL'R7%7FK8YF=O=D7RLMK+JZ,Y,N;VZNA79'F^TG-H6_:).=P9N>L_^OG28 +MM.?27G6D/W#;J[83?Z(M1Y:+,L6@P7[`^7(WEGRKYWDB@]<[,FWWKQ9>NI-W +MXVJO^[0`PNC"SH]._^95?^EZH?CA:_&35UW/>=K/7OUFN>XL1^U,]['+24'F +MU\8/;?M:)\S[HU@ZSF&2%`-#F8/5[.<;/SV20G7Q>8E:(RH&^UV=?DCS./$[ +M76L$].O'5FIMOBB50\;>NG%\(DV&+D[9/&&NZ$EU_B`566MY.O%KG#BT2+HW +M)9VX7\!-^MIJRWC#/R@B)635'JN2GD/'$?:@D7_^Z'+UO/0E;5T]UR/]DMJ9 +MQW\C>UZ?/M)M$]NQFGWL46M-X?&/A^[J(XYAUCAUV,FEF,]&$[M:Y1974U]. +M[&Z-W[5.;WV%I2;K$\8Q^\X_A)Z5EGF_:P_8;\FL*[6'2^QY0LM":[^EGOH? +MQ\R&G]GYYQ#+Y\/\""O2QT2LY;5]"BE1I^]>BZ;N<.O\W`K=H)7&^HC`H)_) +M!:+P;'9[O*_L=U!;CZ6Q/:<?VX)4['>#TK+%BX?17F8);`NECY]8/-W?']_I +M$V'J8"`L+OE.>^(>I$@LUI=JN\VZ/46PM;UY7<?]C::,D);J&\WZLEO9KM?= +MYHI;6JUM7Z_/ZG';=3UB8]/=J&UOUS9V;D4K,J::"$".VO2/)=S<J6_LN*WZ +MMHRW=B2TQ5NNMK4E@=<6U^INK7:CZN2@I?K63G1CM;[A-C7X&PV)3U/&9W)" +M8\/=V&[L%,\Y+&UNW=IN7%_=<:N;:\OU;6F5-Y8OR-7MQ&BKMKW3J#<U'J\T +MED_?U$=K38GV1]V-QL[JYNY.&7F]N=K&+?=R8V-Y-JHW-"")T]9VO:GW+V$W +MUB7&]>59B<S2VNZRQ$6:3@EA8W/'CR3EL)U-2YHH'%N$KI&1\-?KVY)^&SNU +MQ<9:0RXID78KC9T-N833M*LYB_F2#$_E)G:WMS:;=7WL5I-0`I$$WVXT7Y8> +MJ$C8S^S6RH`D=26,]=K&DF64QF(B(_5VW:W-77WN6.Y[;?E4HFA"U=UR?:6^ +MM--X1;)7CI3+-'?7ZY%/[^:.)=#:FMNH+TE\:]NW7+.^_4ICR=)AN[Y5:VQK +M*BUM;F]K*)L;NDJQH>6C_HKF_N[&FM[G=OTSNW(G3RD#>G;MNI0S3<:)'(]N +M-.2RFC>/9_NLG2)?6+9;XMUR-U8WW7KMEEO?7&ZLW`H%(Y(K-IH[VPW)L-/E +M01)S7"YKBYMZ]XL2GX9%2R*B22$)&RW7UFO7Z\V)[+=+7Z]OU+=K:[.NN55? +M:N@+^5X*G>3RFD\/J3^?V=7\JZT5@;B:9*2&H"709Y;3VJ>E;*,H'7+MQVID +M-#V^]I,ESZUM-JV8+==V:AJ4_5VLZ]';]0U)K_JRY$AM:6EW6RJ5'J%G2&R: +MNU+-&AL^4_1^K1XWMI==49.L<*[4&FN[VUJZHLD4E"MO2A)JD%;*)C+$']&< +MF;4RX!HK<JFEU9![45%?0\:M2E8LUN6PVO(K#:MS/F&D%C0;(4TV0P@A':6( +M?7]6BJ*BIWKR^8NBLPI/^4A7,YZ0E(.KR+>W^C/2=7T&>+/\?QMHVIPEFNRX +M6M9Q79J5?R[J/POZS[Q;DMFQ3`<2MYY(J+V)?NTI9R^XQN*Z?"R=3/@]>&3/ +M-6SK0;G;3FR/NEV-Y/.)#O!IO=[3.CWW>*<7/?X+.'W$9Y!(.H0.==:=[NA" +M?S71ST5_J_YJH@_TLZ"HC).,/Q*9JMI/ZYQ?T]6?2#SVTYS<]^;:-5NG)Y]$ +M?@J3=6;+?M7'TU\]G[C\>W65L]'X5#]E.HPM*\*0SL;^&OVV3FG2/"S&]D=[ +MW;2E0Y1([UKW3\)/,4X]C5XLM!>)7^S"%[_.F+4YY%"FIOK;7PVW3$'+Z:7: +M]D;]>J,N/<W:VN:&]0L:.6FW-V_X/MR:&:U8TBDT-U=VI(>J:V/;V&D6?6.D +MC=9RP]IP]YYA2GNZM%9KK%M]U^:RK*%%-VK-IKTKFKT;J[6=YJ:T!=O2(C5W +MUZQ#7]G>7!^W@(]%S=_68S4C;-W:3&N0E\]8ELGF?Z$^&FAYU_-EMA&^69Y, +M[:7,?HYO.TV:2>5AU<G#7EIJ5I?6=ZOUY5T-J760R51)+EFN:3?UZ>.6_JKX +M.]5@MR49E^^-!C)=WJJYA><O+ER:NW3UA7F-H!;25)>OCA(_:='->WU&P@IR +M6=I.PB_9]0DZK76/7S#RBWN^";!$.%6M=6X9)O3?IX93VLVP4RR3D;PHG-HZ +M[J2';C$=M-VTO+J]?5M?O[0A]]?MZN/E,U%4J53.RG_G]/^`[0N5R@>+UY^O +M5#X47F?R^4^$UY]^K5+Y2'C]8?E\1OY^0/Z[^U:E4@VO/R^O+TV$^8GP^J]^ +MH5)9"J^ORN=KX?5K\GHWQ.,GY/7M\/FOR.O/AM=_)J]'(?S7)/Q_$CZ_*V%^ +M4?X^)__]YB]5*K\>7FM\_IG\K=KO[G2^5*GN21[U*K=;W;QR6Y=E*[?WLV%V +M]T0^RKJ5VX/LN'([;^GJDWZCOW"IW):RI0_'R`=)>.&/J"[(JT0:(\U7.6R@ +M>Q7Z_QQUN_CH,!O(.WT<7?*^4DUZ;8L%```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +J````````````````````````````````````````_I_YOPQ;:W@`0`L` +` +end diff --git a/emulators/pcemu/files/patch-aa b/emulators/pcemu/files/patch-aa new file mode 100644 index 000000000000..3d41e61da296 --- /dev/null +++ b/emulators/pcemu/files/patch-aa @@ -0,0 +1,61 @@ +*** Makefile.orig Mon Mar 27 21:27:28 1995 +--- Makefile Mon Mar 27 22:52:07 1995 +*************** +*** 49,58 **** + # been known to crash the emulator when running on certain machines (80x86 + # based PCs under Linux, and HPs running HPUX). + + CC = gcc +! OPTIONS = -DBOOT720 -DBIG_ENDIAN -DALIGNED_ACCESS -DBIGCASE -DINLINE_FUNCTIONS +! XROOT = /usr/local/X11R5 +! CFLAGS = -I$(XROOT)/include -O2 #-fomit-frame-pointer + + # You may need to add -N to the LFLAGS if you get sporadic segmentation + # faults. So far I have only needed to do this when compiling under Linux +--- 49,63 ---- + # been known to crash the emulator when running on certain machines (80x86 + # based PCs under Linux, and HPs running HPUX). + ++ .include "Makefile.inc" ++ + CC = gcc +! #OPTIONS = -DBOOT720 -DBIG_ENDIAN -DALIGNED_ACCESS -DBIGCASE -DINLINE_FUNCTIONS +! OPTIONS = -DBOOT720 -DLITTLE_ENDIAN -DBIGCASE -DINLINE_FUNCTIONS \ +! -DBOOTFILE=\"${LOCALPREFIX}/lib/pcemu/DriveA\" +! #XROOT = /usr/local/X11R5 +! XROOT = /usr/X11R6 +! CFLAGS = -I$(XROOT)/include -O2 -pipe #-fomit-frame-pointer + + # You may need to add -N to the LFLAGS if you get sporadic segmentation + # faults. So far I have only needed to do this when compiling under Linux +*************** +*** 86,88 **** +--- 91,118 ---- + + clean: + rm $(PROGNAME) *.o ++ ++ bootstrapper: ++ (cd bootstrap; make unpack) ++ ++ #mode 0666 is required for DriveA, alas ++ install: pcemu bootstrapper ++ -mkdir ${LOCALPREFIX}/lib/pcemu \ ++ ${LOCALPREFIX}/lib/pcemu/doc \ ++ ${LOCALPREFIX}/lib/pcemu/font \ ++ ${LOCALPREFIX}/lib/pcemu/C \ ++ ${LOCALPREFIX}/bin ++ install -c -s -o bin -g bin pcemu ${LOCALPREFIX}/bin/ ++ install -c -m 666 bootstrap/display.bin \ ++ ${LOCALPREFIX}/lib/pcemu/DriveA ++ install -c -m 644 BUGS CHANGES README TODO bootstrap/README.FreeBSD \ ++ programs/lredir.readme \ ++ ${LOCALPREFIX}/lib/pcemu/doc/ ++ rm -f ${LOCALPREFIX}/lib/pcemu/doc/report.ps.gz ++ gzip --best < report.ps > ${LOCALPREFIX}/lib/pcemu/doc/report.ps.gz ++ rm -f ${LOCALPREFIX}/lib/pcemu/font/vga.pcf.Z ++ bdftopcf vga.bdf | compress > ${LOCALPREFIX}/lib/pcemu/font/vga.pcf.Z ++ mkfontdir ${LOCALPREFIX}/lib/pcemu/font ++ install -c -m 644 programs/vga50.com programs/config.sys \ ++ programs/dumpdisk.exe programs/lredir.exe \ ++ ${LOCALPREFIX}/lib/pcemu/C diff --git a/emulators/pcemu/files/patch-ab b/emulators/pcemu/files/patch-ab new file mode 100644 index 000000000000..877cfdbaa53f --- /dev/null +++ b/emulators/pcemu/files/patch-ab @@ -0,0 +1,79 @@ +*** cpu.c.orig Wed Jun 22 16:24:50 1994 +--- cpu.c Tue Jan 24 18:37:17 1995 +*************** +*** 1127,1132 **** +--- 1127,1133 ---- + + static INLINE2 void i_daa(void) + { ++ /* Opcode 0x27 */ + if (AF || ((*bregs[AL] & 0xf) > 9)) + { + *bregs[AL] += 6; +*************** +*** 1300,1305 **** +--- 1301,1330 ---- + c_ss = SegToMemPtr(SS); + } + ++ static INLINE2 void i_das(void) ++ { ++ /* Opcode 0x2f */ ++ if (AF || ((*bregs[AL] & 0xf) > 9)) ++ { ++ *bregs[AL] -= 6; ++ AF = 1; ++ } ++ else ++ AF = 0; ++ ++ if (CF || (*bregs[AL] > 0x9f)) ++ { ++ *bregs[AL] -= 0x60; ++ CF = 1; ++ } ++ else ++ CF = 0; ++ ++ SetPF(*bregs[AL]); ++ SetSFB(*bregs[AL]); ++ SetZFB(*bregs[AL]); ++ } ++ + + /* most XOR instructions go here */ + +*************** +*** 4140,4146 **** + { + fprintf(stderr,"Error: Unimplemented opcode %02X at cs:ip = %04X:%04X\n", + c_cs[ip-1],sregs[CS],ip-1); +! exit(1); + } + + +--- 4165,4171 ---- + { + fprintf(stderr,"Error: Unimplemented opcode %02X at cs:ip = %04X:%04X\n", + c_cs[ip-1],sregs[CS],ip-1); +! /* exit(1); */ + } + + +*************** +*** 4218,4224 **** + case 0x2c: i_sub_ald8(); break; + case 0x2d: i_sub_axd16(); break; + case 0x2e: i_cs(); break; +! case 0x2f: i_notdone(); break; + case 0x30: i_xor_br8(); break; + case 0x31: i_xor_wr16(); break; + case 0x32: i_xor_r8b(); break; +--- 4243,4249 ---- + case 0x2c: i_sub_ald8(); break; + case 0x2d: i_sub_axd16(); break; + case 0x2e: i_cs(); break; +! case 0x2f: i_das(); break; + case 0x30: i_xor_br8(); break; + case 0x31: i_xor_wr16(); break; + case 0x32: i_xor_r8b(); break; diff --git a/emulators/pcemu/files/patch-ac b/emulators/pcemu/files/patch-ac new file mode 100644 index 000000000000..829aee16a4ef --- /dev/null +++ b/emulators/pcemu/files/patch-ac @@ -0,0 +1,54 @@ +*** mfs.c.orig Wed Jun 22 16:24:51 1994 +--- mfs.c Tue Jan 24 18:41:20 1995 +*************** +*** 319,325 **** +--- 319,327 ---- + #include <errno.h> + #include <sys/param.h> + #include <stdlib.h> ++ #if !__STDC__ + #include <malloc.h> ++ #endif + + #ifdef SOLARIS + #include <fcntl.h> +*************** +*** 327,335 **** + #endif + + #if defined(SGI) || defined(RS6000) +! #include <sys/statfs.h> + #else +! #include <sys/vfs.h> + #endif + + +--- 329,342 ---- + #endif + + #if defined(SGI) || defined(RS6000) +! # include <sys/statfs.h> + #else +! # include <sys/param.h> +! # if BSD >= 199103 +! # include <sys/mount.h> +! # else +! # include <sys/vfs.h> +! # endif /* new BSD */ + #endif + + +*** mfs.h.orig Wed Jun 22 16:24:51 1994 +--- mfs.h Tue Jan 24 18:37:18 1995 +*************** +*** 45,51 **** +--- 45,53 ---- + + #include "mfs_link.h" + ++ #if BSD < 199306 /* newer BSDs have it in <stdio.h> */ + extern char *sys_errlist[]; ++ #endif + + #if !defined(__hpux) && !defined(SOLARIS) && !defined(SGI) && !defined(RS6000) + #define strerror(x) sys_errlist[x] diff --git a/emulators/pcemu/files/patch-ad b/emulators/pcemu/files/patch-ad new file mode 100644 index 000000000000..8f77b3a7d44e --- /dev/null +++ b/emulators/pcemu/files/patch-ad @@ -0,0 +1,94 @@ +*** main.c.orig Wed Jun 22 16:24:50 1994 +--- main.c Tue Jan 24 18:37:18 1995 +*************** +*** 39,44 **** +--- 39,56 ---- + exit(0); + } + ++ static char *set_keymap(char *buf) ++ { ++ char c; ++ int code; ++ ++ if(sscanf(buf, " %*s %i=%c", &code, &c) != 2) ++ return "usage: keymap code=char"; ++ if(put_scan_table(code, (unsigned char)c)) ++ return "bad value for keymap"; ++ return 0; ++ } ++ + + void check_error(char *msg, int line) + { +*************** +*** 89,94 **** +--- 101,108 ---- + check_error(set_update_rate(strtol(value, NULL,10)), line); + else if (strcasecmp(keyword,"cursorspeed") == 0) + check_error(set_cursor_rate(strtol(value, NULL,10)), line); ++ else if (strcasecmp(keyword,"keymap") == 0) ++ check_error(set_keymap(buffer), line); + else + check_error("Syntax error in .pcemu file", line); + } +*** xstuff.c.orig Wed Jun 22 16:24:51 1994 +--- xstuff.c Tue Jan 24 18:37:19 1995 +*************** +*** 316,322 **** + } + + +! static BYTE scan_table1[] = + { + 0x39, 0x02, + #ifdef KBUK /* double quotes, hash symbol */ +--- 316,322 ---- + } + + +! static BYTE scan_table1[256 - 0x20] = + { + 0x39, 0x02, + #ifdef KBUK /* double quotes, hash symbol */ +*************** +*** 360,365 **** +--- 360,366 ---- + #else + 0x29, + #endif ++ 0 + }; + + +*************** +*** 458,463 **** +--- 459,474 ---- + return (scan_table2[i].scan_code); + + return 0; ++ } ++ ++ ++ int put_scan_table(BYTE code, unsigned char c) ++ { ++ /* interface to overload scan_table1 from .pcemurc */ ++ if(c < ' ' || c >= ' ' + sizeof scan_table1) ++ return 1; ++ scan_table1[c - ' '] = code; ++ return 0; + } + + +*** xstuff.h.orig Wed Jun 22 16:24:51 1994 +--- xstuff.h Tue Jan 24 18:37:19 1995 +*************** +*** 17,22 **** +--- 17,23 ---- + + void start_X(void); + void end_X(void); ++ int put_scan_table(BYTE, unsigned char); + void process_Xevents(void); + void flush_X(void); + diff --git a/emulators/pcemu/files/patch-ae b/emulators/pcemu/files/patch-ae new file mode 100644 index 000000000000..6ff371a2fc8c --- /dev/null +++ b/emulators/pcemu/files/patch-ae @@ -0,0 +1,10 @@ +*** programs/config.sys.orig Mon Mar 27 21:27:23 1995 +--- programs/config.sys Mon Mar 27 22:19:26 1995 +*************** +*** 1,2 **** +! device=emufs.sys / +! stacks 9,512 +--- 1,3 ---- +! device=\emufs.sys /usr/local/lib/pcemu/C
+! stacks 9,512
+! diff --git a/emulators/pcemu/pkg-comment b/emulators/pcemu/pkg-comment new file mode 100644 index 000000000000..1e64f1323c9d --- /dev/null +++ b/emulators/pcemu/pkg-comment @@ -0,0 +1 @@ +pcemu - An 8086 PC emulator, written by By David Hedley (hedley@cs.bris.ac.uk) diff --git a/emulators/pcemu/pkg-descr b/emulators/pcemu/pkg-descr new file mode 100644 index 000000000000..812ce717b029 --- /dev/null +++ b/emulators/pcemu/pkg-descr @@ -0,0 +1,238 @@ +[This is David Hedley's original README, FreeBSD port comments below] + + PC Emulator for Unix and X Windows + +As the title suggests, this is a Unix/X windows program which is +designed to emulate a standard 8086 based PC. + +In its current form it runs most text based programs. The programs I have +tried and found to work are as follows: + +MSDOS 5.0 MSDOS 6.2 +WordPerfect 5.1 Borland C++ 2.0 +Turbo Debugger 2.51 Turbo Assembler 2.51 +BBCBasic 4.61 MSDOS QBasic +MSDOS GWBASIC Virtually all program that came with MSDOS 5 +Hitchhiker's Guide to the Galaxy PC Magazine's ANSI.COM +SemWare's QEdit 2.1 Norton Utils 4.50 Advanced Edition +Norton Utils 6.0 Xtree Professional 1.1 +PowerMeter Utils Autoroute (ancient version) +Minitab 8.0 Microsoft Diagnostics + +This is all the programs I could lay my hands on which were text based +and could run on an 8086 + +The emulator runs at about 8-10MHz 80286 speed on a Sun SparcStation +10/40 (without the -mviking flag) and at about 6MHz 8088 speed on a +33MHz 80486 box running Linux. + +I have included a Postscript representation of my project report. It's +a bit out of date now, but it's the closest thing I've got to +documentation! I'll do some kind of latex thing for the next +release.... + +The program rather hogs the cpu but unmapping the window (iconifying +it) will put it to sleep. + +The most recent version of this program will always be in ftp.cs.bris.ac.uk +currently in the directory /users/hedley + +INSTALLING THE EMULATOR + +Edit the Makefile to change the OPTIONS, CFLAGS and XROOT to be +appropriate for your system (I am assuming you are using GNU GCC, +although any ANSI C compiler should work just as well). Ensure you are +using the best (speed) optimisations possible (e.g. -O2 -fomit-frame-poiner) + +Edit the file mytypes.h and ensure that the types for INT8, UINT8, +INT16, UINT16 etc are correct. Hopefully nothing need be changed in +this file, but you never can tell... I have assumed that 'char's are 8 +bit bytes, 'short's are 16 bit words and 'long's are 32 bit words. If +your compiler treats these differently to the above then you will have +to edit this header file. + +Type 'make' and go away and have a cup of tea! Compiling 'cpu.c' takes +a while (and quite a bit of memory!). + +Get a floppy disk of the same size/type as you specified in the Makefile +(i.e. if you chose -DBOOT720, then you'll need a 3.5" 720k disk). Install +MSDOS on it. Copy the files 'config.sys', 'emufs.sys' and 'lredir.exe' from +the 'programs' directory onto this floppy disk. Shove it in your Unix box +and type cp /dev/fd0 DriveA This should create a 720k (or whatever) file +which the emulator can boot from. If you do not have access to a Unix box +with a floppy disk on it, then you can use the supplied 'dumpdisk' program +to create a disk image. All you need is access to a PC. Simply put in a +bootable MSDOS disk into the drive and type dumpdisk A (or dumpdisk B if in +drive B). The program will copy the entire disk to a file called +'drivea'. You must then transfer it to your Unix box... + +You then need to convert the vga font (vga.bdf) into a font format +your X server can understand (either SNF or PCF) using either +'bdftosnf' or 'bdftopcf' and install the resulting font file somewhere +where your X server can find it. Then type 'mkfontdir' to rebuild the +fonts.dir file and then type 'xset fp rehash' to tell your X server +about the new font. If you type 'xlsfonts' you should see 'vga' as one +of the fonts listed. If not, then something has gone wrong. I may or +may not be able to help - it depends on your local setup. The emulator +will run without the font as it uses the standard 8x16 X11 font - +although most programs which use the extended character set will look +pretty terrible. A warning will be displayed if the correct VGA font +cannot be found. If you are using openwindows, you will have to type +'convertfont' and then 'bldfamily' + +You should now be in a position to run the emulator + +By default, the emulator requires the disk image called 'DriveA' to be in +the current directory or else it will complain. If you don't like this, +then you can change the file the emulator boots from by altering your +.pcemurc file (see below) or by changing the default at compile time (by +modifying the Makefile) + +Once run, the emulator should come up with the usual MSDOS banner and +request the current date and time (which should already be +correct). You can now run PC programs, mount Unix directories as +drives etc. You will already have one drive redirection - drive C: is +the Unix root directory. To mount further directories as drives, you +must use the program 'lredir'. Consult the file 'lredir.readme' for +instructions... + + The .pcemurc file + +At present this file allows a few things to be changed at run time. If this +file is found (either in the current directory or in your home directory), +then it is read and parsed and the values overwriting the equivalent +compile time options. Currently the only options supported at present are: + +bootfile diskfile + +where diskfile is the disk image you want to boot from (no quotes or +anything are needed and the filename must not contain white spaces). + +boottype type + +where type is either 360, 720, 144 or 12. This tells the emulator the type +of disk the disk image file represents (360k, 720k, 1.44MB, 1.2MB +respectively). + +updatespeed n + +where n is an integer > 0 +This is the rate at which the screen memory gets checked for changes (and +hence the update speed at which the screen gets updated for non-BIOS +writes). n is measured in internal interrupt ticks of which there are ~72.8 +per second (depends on the resolution of the system timer). + +cursorspeed n + +where n is an integer +This specifies how fast the cursor should flash. Flashing the cursor can +take a fair amount of bandwidth and so on slow/heavily loaded networks it +may be best to slow down the cursor flashing. Setting n to 0 or less will +disable cursor flashing - the cursor will be permanently on. + +An example .pcemurc file can be found in this directory. + +If you have problems compiling or running the emulator, then please contact +me giving details of what went wrong (along with your computer type +etc). + +Architectures tested: + +Computer OS Comments +----------------------------------------------------------------------------- +PC 486/33 Linux 0.99.14w Runs quite well. A bit pointless though :) +Sun 3/60 SunOS 4.1.x Takes an age to compile and not really worth + the effort... +SparcStation 10 SunOS 4.1.3 Runs well. Takes > 20MB RAM to compile though +HP 755/99 HPUX Runs OK (>25MB RAM to compile...) +Sun 4 Solaris 2.3 Runs OK +RS6000 ??? Had a few problems getting it to compile. + Getting there slowly though. +SGI Indigo IRIX 4.?.? Doesn't work if compiled with optimisation + using the standard compiler. Haven't tried + it using gcc yet... + +As you can see this list is quite small. The main limiting factor is the range +of machines I have access to. If anyone else can get it running on other +architectures then please contact me! + +Warning: This program is not secure! Do not make is suid or sgid anything +unless you wish to compromise the security of your system! + +EMULATOR LIMITATIONS etc + +Some parts of the PC architecture are emulated better than others. The +BIOS has been partly implemented - enough to get MSDOS to boot and to +allow most programs to run. Anyhow, most decent programs bypass the +BIOS for screen access. BIOS Disk calls for drive A have been mostly +emulated, although formatting doesn't work. + +Some of the hardware has been emulated but not much. Timer interrupts +are generated by the system but there is now way (at present) to +reprogram the timer. The Programmable Interrupt Controller has been +emulated in part to respond to the End Of Interrupt command and reads +from and writes to the mask register should work OK. + +None of the VGA hardware has been emulated at present (apart from +screen updating) although this will change in the near future. Mode +changes must therefore be done through the BIOS. + +The keyboard has been mostly emulated. The program converts X11 +keysyms to raw PC scan codes and then generates an interrupt 9 as per +usual. There is a BIOS routine which takes these scan codes and +generates the correct BIOS ASCII/scan code pair. The keysyms used can +be found in the module 'xstuff.c'. In the future these keysyms will be +read in from a file at run time. + +THANKS + +Thanks go to the following: + +Andy Norman at HPLabs, Bristol (ange@hpl.hewlett-packard.co.uk) for the HP +port. +Dieter Becker (becker@med-in.uni-sb.de) for help with the Solaris port +Klaas Esselink (esselin1@ksla.nl) for help with the RS6000 port + +Please report bugs/comments etc to me (hedley@cs.bris.ac.uk) and I'll +do my best to sort them out (no guarantees though). After June 25th I +will be leaving University and will not be able to check email very +frequently - please be patient if you want a response - I will reply +eventually. + +Have fun... + +David + + + +[FreeBSD port comments] + +I (joerg_wunsch@uriah.heep.sax.de) have slightly extended the .pcemurc +functionality, in order to improve the handling of international key- +boards. David's code hard-coded the keyboard mapping from XKeyStrings +to PC scancodes. + +I've been adding a .pcemurc section that defines the reverse mapping +from XKeyStrings to PC scancodes, so it's at the very least possible +to remap the keyboard to the original US layout even for international +versions. The syntax for this rules is + + `keymap' <scancode>`='<XKeyString> + +This is my personal .pcemurc file, just to illustrate the usage. + +bootfile /home/joerg/pcemu/DriveA +boottype 720 +keymap 12=ß +keymap 13=' +keymap 21=z +keymap 26=] +keymap 27=+ +keymap 39=\ +keymap 40=[ +keymap 41=^ +keymap 43=# +keymap 44=y +keymap 53=- +keymap 86=< + diff --git a/emulators/pcemu/scripts/configure b/emulators/pcemu/scripts/configure new file mode 100644 index 000000000000..8815b83b9f0c --- /dev/null +++ b/emulators/pcemu/scripts/configure @@ -0,0 +1,27 @@ +#!/bin/sh +# +# $Id: configure,v 1.1.1.1 1995/03/26 18:08:54 joerg Exp $ +# +# Author: Jörg Wunsch <joerg@FreeBSD.org> +# Date of creation: Mar 27, 1995 +# + +cd ${WRKSRC} +mkdir ${WRKSRC}/bootstrap +sh < ${FILESDIR}/bootstrap.shar + +# create a Makefile.inc to pass the local prefix down to +# the build stage: + +cat > ${WRKSRC}/Makefile.inc <<*EOF* +# +# Makefile.inc +# +# This file has been created by the "configure" script; DO NOT EDIT. +# +# Edit the port's Makefile \${PREFIX} variable should you wish to +# override this, and reconfigure. +# + +LOCALPREFIX = ${PREFIX} +*EOF* |