1995-03-27 21:35:21 +00:00
|
|
|
|
# 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' |\
|
1995-04-17 07:26:48 +00:00
|
|
|
|
X perl txt2asm.perl > $@
|
1995-03-27 21:35:21 +00:00
|
|
|
|
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
|
1995-04-17 07:26:48 +00:00
|
|
|
|
X 2. Information about this FreeBSD port
|
1995-03-27 21:35:21 +00:00
|
|
|
|
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
|
1995-04-17 07:26:48 +00:00
|
|
|
|
X2. Information about this FreeBSD port
|
1995-03-27 21:35:21 +00:00
|
|
|
|
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=<3D>
|
|
|
|
|
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
|
|
|
|
|
|