ast@cs.vu.nl (Andy Tanenbaum) (09/28/88)
: This is a shar archive. Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
Xtotal 28
X-rw-r--r-- 1 ast 2249 Sep 26 22:44 at_makefile.new
X-rwxr-xr-x 1 ast 8072 Sep 26 22:44 bootblok.s.new
X-rw-r--r-- 1 ast 2201 Sep 26 22:44 changemem.cdif
X-rw-r--r-- 1 ast 4777 Sep 26 22:44 fsck.c.cdif
X-rw-r--r-- 1 ast 44 Sep 26 22:44 group.new
X-rw-r--r-- 1 ast 1111 Sep 26 22:44 init.c.cdif
X-rw-r--r-- 1 ast 770 Sep 26 22:44 message.cdif
X-rw-r--r-- 1 ast 2249 Sep 26 22:45 pc_makefile.new
X-rw-r--r-- 1 ast 149 Sep 26 22:45 ttys.cdif
X-rw-r--r-- 1 ast 22 Sep 26 22:45 ttytype.new
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
590) :;;
*) echo 'Bad character count in ''LISTING' >&2
echo 'Count should be 590' >&2
esac
echo Extracting 'at_makefile'
sed 's/^X//' > 'at_makefile' << '+ END-OF-FILE ''at_makefile'
Xl=/usr/lib
XCFLAGS = -F -T.
X
Xall:
X make init
X make bootblok
X make build
X
Xinit: $l/libc.a init.s $l/head.s
X asld -o init $l/head.s init.s $l/libc.a $l/end.s
X @echo init done.
X
X# bootblok.s is the source of the MINIX boot block. The bootblock is the
X# first 512 bytes on the image file and on the boot diskette. When bootblok.s
X# is assembled, it generates a short binary file (less than 400 bytes) that
X# must be stripped of its header and copied to the file bootblok. The dd
X# command below does this. If everything has been done right, the bootblok
X# file should begin with the following 8 words, in hex:
X# c0b8 8e07 33d8 b8f6 2fe0 c08e ff33 00b9
X# The exact procedure for going from bootblok.s to the binary file stripped of
X# its header is somewhat operating system dependent. Some assemblers make
X# an object (.s) file; others make an a.out file directly. If your boot
X# diskette does not start out by printing 'Booting MINIX 1.0' the problem is
X# probably that you have not made a good boot block.
Xbootblok: bootblok.s
X @asld bootblok.s
X @dd if=a.out of=bootblok bs=16w skip=1 count=16 2>/dev/null
X @rm a.out
X @echo bootblok done.
X
Xbuild: build.s
X cc -o build build.s
X @echo build done.
X
Xfsck: fsck.s fsck1.s
X @echo "Start linking fsck. "
X asld -o fsck fsck1.s fsck.s $l/libc.a $l/end.s
X @echo fsck done.
Xfsck.s: fsck.c
X cc -c -Di8088 -DSTANDALONE -F fsck.c
X
X# 'make image' combines the bootblock, kernel, memory manager, file
X# system, init and fsck into a single file, called image. Each of these pieces
X# appears in the image file just as the original does on the disk, except that
X# the header at the front is removed, and each piece is padded out to an
X# integral multiple of 16 bytes. Build also prints a message telling how big
X# the various pieces (except fsck) are.
X#
X# 'make net' does the same thing, only with the networking code from the
X# 'amoeba directory included
X#
Ximage: build bootblok
X @getlf "Insert blank diskette in drive 0 and hit return"
X @build bootblok ../kernel/kernel ../mm/mm ../fs/fs init fsck image
X @cp image /dev/fd0
X
Xnet: build bootblok
X @getlf "Insert blank diskette in drive 0 and hit return"
X @build bootblok ../amoeba/kernel/kernel ../amoeba/mm/mm \
X ../amoeba/fs/fs init fsck /dev/fd0
X
+ END-OF-FILE at_makefile
chmod 'u=rw,g=r,o=r' 'at_makefile'
set `wc -c 'at_makefile'`
count=$1
case $count in
2249) :;;
*) echo 'Bad character count in ''at_makefile' >&2
echo 'Count should be 2249' >&2
esac
echo Extracting 'bootblok.s'
sed 's/^X//' > 'bootblok.s' << '+ END-OF-FILE ''bootblok.s'
X| When the PC is powered on, it reads the first block from the floppy
X| disk into address 0x7C00 and jumps to it. This boot block must contain
X| the boot program in this file. The boot program first copies itself to
X| address 192K - 512 (to get itself out of the way). Then it loads the
X| operating system from the boot diskette into memory, and then jumps to fsck.
X| Loading is not trivial because the PC is unable to read a track into
X| memory across a 64K boundary, so the positioning of everything is critical.
X| The number of sectors to load is contained at address 504 of this block.
X| The value is put there by the build program after it has discovered how
X| big the operating system is. When the bootblok program is finished loading,
X| it jumps indirectly to the program (fsck) which address is given by the
X| last two words in the boot block.
X|
X| Summary of the words patched into the boot block by build:
X| Word at 504: # sectors to load
X| Word at 506: # DS value for fsck
X| Word at 508: # PC value for fsck
X| Word at 510: # CS value for fsck
X|
X| This version of the boot block must be assembled without separate I & D
X| space.
X
X LOADSEG = 0x0060 | here the boot block will start loading
X BIOSSEG = 0x07C0 | here the boot block itself is loaded
X BOOTSEG = 0x2FE0 | here it will copy itself (192K-512b)
X DSKBASE = 120 | 120 = 4 * 0x1E = ptr to disk parameters
X
Xfinal = 504
Xfsck_ds = 506
Xfsck_pc = 508
Xfsck_cs = 510
X
X
X.globl begtext, begdata, begbss, endtext, enddata, endbss | asld needs these
X.text
Xbegtext:
X.data
Xbegdata:
X.bss
Xbegbss:
X.text
X
X| copy bootblock to bootseg
X mov ax,#BIOSSEG
X mov ds,ax
X xor si,si | ds:si - original block
X mov ax,#BOOTSEG
X mov es,ax
X xor di,di | es:di - new block
X mov cx,#256 | # words to move
X rep
X movw | copy loop
X
X
X| start boot procedure
X jmpi start, BOOTSEG | set cs to BOOTSEG
X
Xstart:
X mov dx,cs
X mov ds,dx | set ds to cs
X xor ax,ax
X mov es,ax | set es to 0
X mov ss,dx | set ss to cs i.e., stack in high core
X mov sp,#1536 | initialize sp to high core
X
X| print greeting
X mov ax,#2 | reset video
X int 0x10
X
X mov ax,#0x0200 | BIOS call in put cursor in ul corner
X xor bx,bx
X xor dx,dx
X int 0x10
X mov bx,#greet
X call print
X
X| Initialize disk parameters
X| Try 1.2M diskette by trying to read sector 15
X
X xor ax,ax
X mov es,ax
X mov dx,ds
X mov ax,#atpar
X seg es
X mov DSKBASE,ax
X seg es
X mov DSKBASE+2,dx
X
X xor ax,ax | reset drive
X int 0x13
X
X xor ax,ax
X mov es,ax
X mov ax,#0x0201 | read sector, #sector = 1
X mov bx,#0x0600 | es:bx buffer
X mov cx,#0x000F | track 0, sector 15
X mov dx,#0x0000 | drive 0, head 0
X int 0x13
X jnb L1
X
X| Error. It wasn't 1.2M. Now set up for 720K
X
X mov tracksiz,#9
X xor ax,ax | ps disk parameters are in ROM F01520
X mov es,ax
X mov ax,#0x1520
X seg es
X mov DSKBASE,ax
X mov ax,#0xF000
X seg es
X mov DSKBASE+2,ax
X
X| Try 720K by trying to read track 64.
X| 360K has 40 tracks, 720 has 80 tracks.
X
X xor ax,ax | diskette reset
X int 0x13
X mov tracksiz,#9
X
X xor ax,ax
X mov es,ax
X mov ax,#0x0201 | read sector, number of sectors is 1
X mov bx,#0x0600 | es:bx buffer
X mov cx,#0x4001 | track 64, sector 1
X mov dx,#0x0000 | drive 0, head 0
X int 0x13
X jnb L1
X
X| Error. It wasn't 720K either. Now set up for 360K
X
X xor ax,ax
X mov es,ax
X mov dx,ds
X mov ax,#pcpar
X seg es
X mov DSKBASE,ax
X seg es
X mov DSKBASE+2,dx
X int 0x13 | diskette reset
X
XL1:
X
X| Load the operating system from diskette.
Xload:
X call setreg | set up ah, cx, dx
X mov bx,disksec | bx = number of next sector to read
X add bx,#2 | diskette sector 1 goes at 1536 ("sector" 3)
X shl bx,#1 | multiply sector number by 32
X shl bx,#1 | ditto
X shl bx,#1 | ditto
X shl bx,#1 | ditto
X shl bx,#1 | ditto
X mov es,bx | core address is es:bx (with bx = 0)
X xor bx,bx | see above
X add disksec,ax | ax tells how many sectors to read
X movb ah,#2 | opcode for read
X int 0x13 | call the BIOS for a read
X jb error | jump on diskette error
X mov ax,disksec | see if we are done loading
X cmp ax,final | ditto
X jb load | jump if there is more to load
X
X| Loading done. Finish up.
X mov dx,#0x03F2 | kill the motor
X mov ax,#0x000C
X out
X cli
X mov bx,tracksiz | fsck expects # sectors/track in bx
X mov ax,fsck_ds | set segment registers
X mov ds,ax | when sep I&D DS != CS
X mov es,ax | otherwise they are the same.
X mov ss,ax | words 504 - 510 are patched by build
X
X seg cs
X jmpi @fsck_pc | jmp to fsck
X
X| Given the number of the next disk block to read, disksec, compute the
X| cylinder, sector, head, and number of sectors to read as follows:
X| ah = # sectors to read; cl = sector #; ch = cyl; dh = head; dl = 0
Xsetreg:
X mov si,tracksiz | 9 (PC) or 15 (AT) sectors per track
X mov ax,disksec | ax = next sector to read
X xor dx,dx | dx:ax = 32-bit dividend
X div si | divide sector # by track size
X mov cx,ax | cx = track #; dx = sector (0-origin)
X mov bx,dx | bx = sector number (0-origin)
X mov ax,disksec | ax = next sector to read
X add ax,si | ax = last sector to read + 1
X dec ax | ax = last sector to read
X xor dx,dx | dx:ax = 32-bit dividend
X div tracksiz | divide last sector by track size
X cmpb al,cl | is starting track = ending track
X je set1 | jump if whole read on 1 cylinder
X sub si,dx | compute lower sector count
X dec si | si = # sectors to read
X
X| Check to see if this read crosses a 64K boundary (128 sectors).
X| Such calls must be avoided. The BIOS gets them wrong.
Xset1: mov ax,disksec | ax = next sector to read
X add ax,#2 | disk sector 1 goes in core sector 3
X mov dx,ax | dx = next sector to read
X add dx,si | dx = one sector beyond end of read
X dec dx | dx = last sector to read
X shl ax,#1 | ah = which 64K bank does read start at
X shl dx,#1 | dh = which 64K bank foes read end in
X cmpb ah,dh | ah != dh means read crosses 64K boundary
X je set2 | jump if no boundary crossed
X shrb dl,#1 | dl = excess beyond 64K boundary
X xorb dh,dh | dx = excess beyond 64K boundary
X sub si,dx | adjust si
X dec si | si = number of sectors to read
X
Xset2: mov ax,si | ax = number of sectors to read
X xor dx,dx | dh = head, dl = drive
X movb dh,cl | dh = track
X andb dh,#0x01 | dh = head
X movb ch,cl | ch = track to read
X shrb ch,#1 | ch = cylinder
X movb cl,bl | cl = sector number (0-origin)
X incb cl | cl = sector number (1-origin)
X xorb dl,dl | dl = drive number (0)
X ret | return values in ax, cx, dx
X
X
X|-------------------------------+
X| error & print routines |
X|-------------------------------+
X
Xerror:
X push ax
X mov bx,#fderr
X call print | print msg
X xor cx,cx
Xerr1: mul 0 | delay
X loop err1
X int 0x19
X
X
Xprint: | print string (bx)
X movb al,(bx) | al contains char to be printed
X testb al,al | null char?
X jne prt1 | no
X ret | else return
Xprt1: movb ah,#14 | 14 = print char
X inc bx | increment string pointer
X push bx | save bx
X movb bl,#1 | foreground color
X xorb bh,bh | page 0
X int 0x10 | call BIOS VIDEO_IO
X pop bx | restore bx
X jmp print | next character
X
X
Xdisksec:.word 1
Xpcpar: .byte 0xDF, 0x02, 25, 2, 9, 0x2A, 0xFF, 0x50, 0xF6, 1, 3 | for pc
Xatpar: .byte 0xDF, 0x02, 25, 2,15, 0x1B, 0xFF, 0x54, 0xF6, 1, 8 | for at
X
Xfderr: .asciz "Read error. Automatic reboot.\r\n"
Xgreet: .asciz "\rBooting MINIX 1.3. Copyright 1988 Prentice-Hall, Inc.\r\n"
Xtracksiz:.word 15 | changed to 9 for ps and pc
X
X| Don't forget that words 504 - 510 are filled in by build. The regular
X| code had better not get that far.
X.text
Xendtext:
X.data
Xenddata:
X.bss
Xendbss:
+ END-OF-FILE bootblok.s
chmod 'u=rwx,g=rx,o=rx' 'bootblok.s'
set `wc -c 'bootblok.s'`
count=$1
case $count in
8072) :;;
*) echo 'Bad character count in ''bootblok.s' >&2
echo 'Count should be 8072' >&2
esac
echo Extracting 'changemem.cdif'
sed 's/^X//' > 'changemem.cdif' << '+ END-OF-FILE ''changemem.cdif'
X*** /local/ast/minix/tape3b/tools/changemem Wed Jul 13 14:46:51 1988
X--- changemem Mon Sep 26 13:03:31 1988
X***************
X*** 3,21 ****
X l=/usr/lib
X t=../test
X chmem =50000 $b/ar
X chmem =60000 $b/asld
X! chmem =2000 $b/cc
X chmem =52000 $l/cem
X chmem =30000 $l/cg
X chmem =60000 $b/cdiff
X chmem =64000 $b/compress
X! chmem =32000 $b/cpdir
X chmem =60000 $l/cpp
X chmem =40000 $b/dd
X chmem =60000 $b/diff
X chmem =8000 $b/df
X chmem =32000 $b/dosread
X chmem =60000 $b/ed
X chmem =50000 $b/find
X chmem =60000 $b/fix
X chmem =8000 $b/grep
X--- 3,26 ----
X l=/usr/lib
X t=../test
X chmem =50000 $b/ar
X+ chmem =16000 $b/ast
X chmem =60000 $b/asld
X! chmem =3000 $b/cc
X chmem =52000 $l/cem
X chmem =30000 $l/cg
X+ chmem =16000 $b/cp
X chmem =60000 $b/cdiff
X chmem =64000 $b/compress
X! chmem =64000 $b/cpdir
X chmem =60000 $l/cpp
X chmem =40000 $b/dd
X+ chmem =32000 $b/du
X chmem =60000 $b/diff
X chmem =8000 $b/df
X chmem =32000 $b/dosread
X chmem =60000 $b/ed
X+ chmem =8000 $b/fgrep
X+ chmem =50000 $b/file
X chmem =50000 $b/find
X chmem =60000 $b/fix
X chmem =8000 $b/grep
X***************
X*** 30,50 ****
X chmem =8000 $b/mv
X chmem =16000 $b/nm
X chmem =40000 $l/opt
X! chmem =24000 $b/pr
X chmem =8000 $b/prep
X chmem =50000 $b/readfs
X chmem =8000 $b/rm
X chmem =8000 $b/rmdir
X chmem =16000 $b/roff
X chmem =16000 $b/strings
X! chmem =20000 $b/sh
X chmem =60000 $b/sort
X chmem =8000 $b/tail
X chmem =8000 $b/time
X chmem =60000 $b/treecmp
X chmem =8000 $t/t10a
X chmem =8000 $t/t11a
X chmem =8000 $t/t11b
X chmem =8000 $b/uuencode
X chmem =8000 $b/uudecode
X chmem =8000 $b/wc
X--- 35,59 ----
X chmem =8000 $b/mv
X chmem =16000 $b/nm
X chmem =40000 $l/opt
X! chmem =8000 $b/paste
X! chmem =32000 $b/pr
X chmem =8000 $b/prep
X chmem =50000 $b/readfs
X chmem =8000 $b/rm
X chmem =8000 $b/rmdir
X chmem =16000 $b/roff
X chmem =16000 $b/strings
X! chmem =12000 $b/sh
X! chmem =8000 $b/shar
X chmem =60000 $b/sort
X+ chmem =16000 $b/strip
X chmem =8000 $b/tail
X chmem =8000 $b/time
X chmem =60000 $b/treecmp
X chmem =8000 $t/t10a
X chmem =8000 $t/t11a
X chmem =8000 $t/t11b
X+ chmem =8000 $b/uniq
X chmem =8000 $b/uuencode
X chmem =8000 $b/uudecode
X chmem =8000 $b/wc
+ END-OF-FILE changemem.cdif
chmod 'u=rw,g=r,o=r' 'changemem.cdif'
set `wc -c 'changemem.cdif'`
count=$1
case $count in
2201) :;;
*) echo 'Bad character count in ''changemem.cdif' >&2
echo 'Count should be 2201' >&2
esac
echo Extracting 'fsck.c.cdif'
sed 's/^X//' > 'fsck.c.cdif' << '+ END-OF-FILE ''fsck.c.cdif'
X*** /local/ast/minix/tape3b/tools/fsck.c Wed Jul 13 14:46:52 1988
X--- fsck.c Mon Sep 26 13:03:34 1988
X***************
X*** 5,66 ****
X #include "../fs/const.h"
X #include "../fs/type.h"
X
X! /* #define DOS /* compile to run under MS-DOS */
X! /* #define STANDALONE /* compile for the boot-diskette */
X #ifndef STANDALONE
X! #include "stdio.h"
X! #endif /*STANDALONE*/
X
X! /* Fsck may be compiled to run in any of two situations. For each
X! * a different symbol must be defined:
X *
X! * STANDALONE will compile fsck to be part of the boot-diskette and
X! * all necessary routines are contained in the program
X! * DOS will compile fsck to run under MS-DOS, using
X! * the standard DOS library for your compiler.
X *
X! * The assembler file fsck1.asm must be assembled correspondingly. It has
X! * only one symbol defined, namely STANDALONE.
X! * The assembler file fsck.s is only used under PC/IX to produce
X! * a version for the boot diskette.
X! * When you have a problem look at the preprocessor output to see
X! * which lines will actually be compiled.
X! * To produce an executable/binary version issue one of the following
X! * commands, depending on your development environment:
X *
X! * Development system: MS-DOS
X *
X! * fsck to run under: MS-DOS
X! * defined symbols: fsck.c: DOS
X! * fsck1.asm: -
X! * command: link fsck+fsck1,,,DOS-lib
X! *
X! * fsck to run under: BOOT
X! * defined symbols: fsck.c: STANDALONE
X! * fsck1.asm: STANDALONE
X! * command: link fsck1+fsck,fsck,, {Minix-lib || DOS-lib}
X! * dos2out -d fsck
X! *
X! * fsck to run under: MINIX -not yet implemented-
X! * command: link crtso+fsck,fsck,,Minix-lib
X! * dos2out -d fsck
X! *
X! *
X! * Development system: PC/IX
X! *
X! * fsck to run under: PC/IX
X! * command: ld fsck -lc
X! *
X! * fsck to run under: BOOT
X! * defined symbols: fsck.c: STANDALONE
X! * fsck1.s: -
X! * command: ld fsck1.o fsck.0 -l../lib/lib.a
X! *
X! * fsck to run under: MINIX
X! * command: ld fsck.o -l../lib/lib.a
X! *
X */
X
X #define BITSHIFT 4 /* = 2log(#bits(int)) */
X #define BITMAPSHIFT 13 /* = 2log(#bits(block)); 13 means 1K blocks */
X #define MAXPRINT 8 /* max. number of error lines in chkmap */
X--- 5,35 ----
X #include "../fs/const.h"
X #include "../fs/type.h"
X
X!
X #ifndef STANDALONE
X! #include <stdio.h>
X! #endif
X
X! /* Fsck may be compiled to run in any of two situations.
X *
X! * - standalone, as part of the boot diskette used to bring MINIX up
X! * - as a running MINIX program.
X *
X! * When used for standalone operation, -DSTANDALONE must be used.
X! * The following commands can be used to build a standalone version:
X *
X! * cc -c -Di8088 -DSTANDALONE fsck.c
X! * asld -o fsck fsck1.s fsck.s /usr/lib/libc.a /usr/lib/end.s
X *
X! * Fsck1.s contains calls to the BIOS routines used by the standalone
X! * version. The production version makes ordinary MINIX reads and writes.
X */
X
X+
X+ #define HEADS 4 /* # heads per cylinder */
X+ #define TRACKSIZE 17 /* # sectors per track */
X+ #define CYLSIZE (HEADS*TRACKSIZE) /* # sectors per cylinder */
X+
X #define BITSHIFT 4 /* = 2log(#bits(int)) */
X #define BITMAPSHIFT 13 /* = 2log(#bits(block)); 13 means 1K blocks */
X #define MAXPRINT 8 /* max. number of error lines in chkmap */
X***************
X*** 1847,1852 ****
X--- 1816,1823 ----
X for (;;) {
X printf("\nHit key as follows:\n\n");
X printf(" = start MINIX (root file system in drive 0)\n");
X+ printf(" u start MINIX on PS/2 Model 30, U.S. keyboard (root file sys in drive 0)\n");
X+ printf(" d start MINIX on PS/2 Model 30, Dutch keyboard (root file sys in drive 0)\n");
X printf(" f check the file system (first insert any file system diskette)\n");
X printf(" l check and list file system (first insert any file system diskette)\n");
X printf(" m make an (empty) file system (first insert blank, formatted diskette)\n");
X***************
X*** 1864,1871 ****
X case 'h':
X get_partition();
X drive = (partition < PARB ? 0x80 : 0x81);
X! cylsiz = 68; /* sectors per cylinder */
X! tracksiz = 17;
X printf("Checking hard disk. %s\n", answer);
X if (read_partition() < 0) continue;
X repair = 1;
X--- 1835,1842 ----
X case 'h':
X get_partition();
X drive = (partition < PARB ? 0x80 : 0x81);
X! cylsiz = CYLSIZE; /* sectors per cylinder */
X! tracksiz = TRACKSIZE;
X printf("Checking hard disk. %s\n", answer);
X if (read_partition() < 0) continue;
X repair = 1;
X***************
X*** 1896,1901 ****
X--- 1867,1874 ----
X break;
X
X case '=': return((c >> 8) & 0xFF);
X+ case 'u': return((c >> 8) & 0xFF);
X+ case 'd': return((c >> 8) & 0xFF);
X default:
X printf("Illegal command\n");
X continue;
+ END-OF-FILE fsck.c.cdif
chmod 'u=rw,g=r,o=r' 'fsck.c.cdif'
set `wc -c 'fsck.c.cdif'`
count=$1
case $count in
4777) :;;
*) echo 'Bad character count in ''fsck.c.cdif' >&2
echo 'Count should be 4777' >&2
esac
echo Extracting 'group.new'
sed 's/^X//' > 'group.new' << '+ END-OF-FILE ''group.new'
Xroot:*:0:
Xdaemon:*:1:
Xsystem:*:2:
Xuser:*:3:
+ END-OF-FILE group.new
chmod 'u=rw,g=r,o=r' 'group.new'
set `wc -c 'group.new'`
count=$1
case $count in
44) :;;
*) echo 'Bad character count in ''group.new' >&2
echo 'Count should be 44' >&2
esac
echo Extracting 'init.c.cdif'
sed 's/^X//' > 'init.c.cdif' << '+ END-OF-FILE ''init.c.cdif'
X*** /local/ast/minix/tape3b/tools/init.c Wed Jul 13 14:46:53 1988
X--- init.c Mon Sep 26 13:03:34 1988
X***************
X*** 28,33 ****
X--- 28,35 ----
X #define NOPARAMS -100
X #define WTMPSIZE 8
X
X+ extern long time();
X+ extern long lseek();
X
X struct uart {
X int baud;
X***************
X*** 124,129 ****
X--- 126,132 ----
X for (i = 1; i <= NR_SIGS; i++) signal(i, SIG_IGN);
X
X while (1) {
X+ sync();
X k = wait(&status);
X pidct--;
X
X***************
X*** 154,162 ****
X /* Child */
X close(0); /* /etc/ttys may be open */
X name[DIGIT] = '0' + linenr;
X! if (open(name, 0) != 0) exit(-3); /* standard input */
X! if (open(name, 1) != 1) exit(-3); /* standard output */
X! if (open(name, 1) != 2) exit(-3); /* standard error */
X
X
X /* Set line parameters. */
X--- 157,165 ----
X /* Child */
X close(0); /* /etc/ttys may be open */
X name[DIGIT] = '0' + linenr;
X! if (open(name, 2) != 0) exit(-3); /* standard input */
X! if (open(name, 2) != 1) exit(-3); /* standard output */
X! if (open(name, 2) != 2) exit(-3); /* standard error */
X
X
X /* Set line parameters. */
+ END-OF-FILE init.c.cdif
chmod 'u=rw,g=r,o=r' 'init.c.cdif'
set `wc -c 'init.c.cdif'`
count=$1
case $count in
1111) :;;
*) echo 'Bad character count in ''init.c.cdif' >&2
echo 'Count should be 1111' >&2
esac
echo Extracting 'message.cdif'
sed 's/^X//' > 'message.cdif' << '+ END-OF-FILE ''message.cdif'
X*** /local/ast/minix/tape3b/tools/message Wed Jul 13 14:46:54 1988
X--- message Mon Sep 26 13:03:35 1988
X***************
X*** 1,8 ****
X
X
X! Please see 'doc/READ_ME' for instructions about unpacking the documentation.
X Then read 'doc/USER_GUIDE' before using the system. The 'doc' directory is
X! on disk 7 (PC version) or disk 3 (AT version).
X
X If your screen goes blank periodically, hit the F3 key (see 'doc/USER_GUIDE').
X
X--- 1,8 ----
X
X
X! Please see 'doc/Read_me' for instructions about unpacking the documentation.
X Then read 'doc/USER_GUIDE' before using the system. The 'doc' directory is
X! on disk 8 (PC version) or disk 3 (AT version), in the doc.a.Z archive.
X
X If your screen goes blank periodically, hit the F3 key (see 'doc/USER_GUIDE').
X
+ END-OF-FILE message.cdif
chmod 'u=rw,g=r,o=r' 'message.cdif'
set `wc -c 'message.cdif'`
count=$1
case $count in
770) :;;
*) echo 'Bad character count in ''message.cdif' >&2
echo 'Count should be 770' >&2
esac
echo Extracting 'pc_makefile'
sed 's/^X//' > 'pc_makefile' << '+ END-OF-FILE ''pc_makefile'
Xl=/usr/lib
XCFLAGS = -F -T.
X
Xall:
X make init
X make bootblok
X make build
X
Xinit: $l/libc.a init.s $l/head.s
X asld -o init $l/head.s init.s $l/libc.a $l/end.s
X @echo init done.
X
X# bootblok.s is the source of the MINIX boot block. The bootblock is the
X# first 512 bytes on the image file and on the boot diskette. When bootblok.s
X# is assembled, it generates a short binary file (less than 400 bytes) that
X# must be stripped of its header and copied to the file bootblok. The dd
X# command below does this. If everything has been done right, the bootblok
X# file should begin with the following 8 words, in hex:
X# c0b8 8e07 33d8 b8f6 2fe0 c08e ff33 00b9
X# The exact procedure for going from bootblok.s to the binary file stripped of
X# its header is somewhat operating system dependent. Some assemblers make
X# an object (.s) file; others make an a.out file directly. If your boot
X# diskette does not start out by printing 'Booting MINIX 1.0' the problem is
X# probably that you have not made a good boot block.
Xbootblok: bootblok.s
X @asld bootblok.s
X @dd if=a.out of=bootblok bs=16w skip=1 count=16 2>/dev/null
X @rm a.out
X @echo bootblok done.
X
Xbuild: build.s
X cc -o build build.s
X @echo build done.
X
Xfsck: fsck.s fsck1.s
X @echo "Start linking fsck. "
X asld -o fsck fsck1.s fsck.s $l/libc.a $l/end.s
X @echo fsck done.
Xfsck.s: fsck.c
X cc -c -Di8088 -DSTANDALONE -F fsck.c
X
X# 'make image' combines the bootblock, kernel, memory manager, file
X# system, init and fsck into a single file, called image. Each of these pieces
X# appears in the image file just as the original does on the disk, except that
X# the header at the front is removed, and each piece is padded out to an
X# integral multiple of 16 bytes. Build also prints a message telling how big
X# the various pieces (except fsck) are.
X#
X# 'make net' does the same thing, only with the networking code from the
X# 'amoeba directory included
X#
Ximage: build bootblok
X @getlf "Insert blank diskette in drive 0 and hit return"
X @build bootblok ../kernel/kernel ../mm/mm ../fs/fs init fsck image
X @cp image /dev/fd0
X
Xnet: build bootblok
X @getlf "Insert blank diskette in drive 0 and hit return"
X @build bootblok ../amoeba/kernel/kernel ../amoeba/mm/mm \
X ../amoeba/fs/fs init fsck /dev/fd0
X
+ END-OF-FILE pc_makefile
chmod 'u=rw,g=r,o=r' 'pc_makefile'
set `wc -c 'pc_makefile'`
count=$1
case $count in
2249) :;;
*) echo 'Bad character count in ''pc_makefile' >&2
echo 'Count should be 2249' >&2
esac
echo Extracting 'ttys'
sed 's/^X//' > 'ttys' << '+ END-OF-FILE ''ttys'
X100
+ END-OF-FILE ttys
chmod 'u=rw,g=r,o=r' 'ttys'
set `wc -c 'ttys'`
count=$1
case $count in
4) :;;
*) echo 'Bad character count in ''ttys' >&2
echo 'Count should be 4' >&2
esac
echo Extracting 'ttytype.new'
sed 's/^X//' > 'ttytype.new' << '+ END-OF-FILE ''ttytype.new'
Xminix tty0
Xvt100 tty1
+ END-OF-FILE ttytype.new
chmod 'u=rw,g=r,o=r' 'ttytype.new'
set `wc -c 'ttytype.new'`
count=$1
case $count in
22) :;;
*) echo 'Bad character count in ''ttytype.new' >&2
echo 'Count should be 22' >&2
esac
exit 0