Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!cs.utexas.edu!uunet!mcsun!hp4nl!star.cs.vu.nl!ast@cs.vu.nl From: ast@cs.vu.nl (Andy Tanenbaum) Newsgroups: comp.os.minix Subject: Various comments Message-ID: <5031@ast.cs.vu.nl> Date: 31 Dec 89 18:49:20 GMT Sender: ast@cs.vu.nl Reply-To: ast@cs.vu.nl (Andy Tanenbaum) Organization: VU Informatica, Amsterdam Lines: 389 The file is lib.doc is junk. Ditch it if you have it. There is still only one library, libc.a, even though the sources were split by popular demand. The reason for splitting the sources is that ls didn't work any more in lib. If you have installed all the headers correctly, ctime and everything else in the library should compile, although a couple of files give warnings. Since the final word has not yet been said on stdio, I haven't worried about that too much. On a PC, everything is 16 bit anyway, but be careful on an Atari. The xxx.s files in libc.a like sti.s were all originally written in assembler. There is no source. Use libupack to make them readable. I may well be missing strcoll.c and a few other ANSI string routines. I don't even know what they do. For the more exotic ones, I probably don't want to. There have been several requests for the IBM assembler routines. I believe they are unchanged since 1.3. In any event, here they are. They go in lib/ibm. So far there have been remarkably few problems. Probably because everybody is away until after New Year's. Stay tuned. Happy 1990 everybody! Andy Tanenbaum (ast@cs.vu.nl) P.S. I just heard that another leap second has been added because the earth has been rotating at the wrong rate. I think this is the 15th one since 1970. Unfortunately, both MINIX and UNIX think they can get the number of seconds in a non-(leap year) by multiplying 365 * 24 * 60 * 60, which is incorrect. The ancient Egyptians did this for all years, and it wasn't hacked until Julius Caesar decided he didn't like January falling in the early Autumn. THUS: PLEASE DO NOT USE MINIX TO CALCULATE THE START OF THE ANNUAL NILE FLOODS. : 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 'brksize.s' sed 's/^X//' > 'brksize.s' << '+ END-OF-FILE ''brksize.s' X.define _brksize X.data X.globl endbss, _brksize X_brksize: .word endbss + END-OF-FILE brksize.s chmod 'u=rw,g=r,o=r' 'brksize.s' set `wc -c 'brksize.s'` count=$1 case $count in 70) :;; *) echo 'Bad character count in ''brksize.s' >&2 echo 'Count should be 70' >&2 esac echo Extracting 'catchsig.s' sed 's/^X//' > 'catchsig.s' << '+ END-OF-FILE ''catchsig.s' X.define _begsig X.globl _begsig X.globl _vectab, _M Xmtype = 2 | M+mtype = &M.m_type X_begsig: X push ax | after interrupt, save all regs X push bx X push cx X push dx X push si X push di X push bp X push ds X push es X mov bx,sp X mov bx,18(bx) | bx = signal number X mov ax,bx | ax = signal number X dec bx | vectab[0] is for sig 1 X add bx,bx | pointers are two bytes on 8088 X mov bx,_vectab(bx) | bx = address of routine to call X push _M+mtype | push status of last system call X push ax | func called with signal number as arg X call (bx) Xback: X pop ax | get signal number off stack X pop _M+mtype | restore status of previous system call X pop es | signal handling finished X pop ds X pop bp X pop di X pop si X pop dx X pop cx X pop bx X pop ax X pop dummy | remove signal number from stack X iret X X.data Xdummy: .word 0 + END-OF-FILE catchsig.s chmod 'u=rw,g=r,o=r' 'catchsig.s' set `wc -c 'catchsig.s'` count=$1 case $count in 814) :;; *) echo 'Bad character count in ''catchsig.s' >&2 echo 'Count should be 814' >&2 esac echo Extracting 'crtso.s' sed 's/^X//' > 'crtso.s' << '+ END-OF-FILE ''crtso.s' X| This is the C run-time start-off routine. It's job is to take the X| arguments as put on the stack by EXEC, and to parse them and set them up the X| way _main expects them. X X.globl _main, _exit, crtso, _environ X.globl begtext, begdata, begbss, endtext, enddata, endbss X.text Xbegtext: Xcrtso: mov bx,sp X mov cx,(bx) X add bx,*2 X mov ax,cx X inc ax X shl ax,#1 X add ax,bx X mov _environ,ax | save envp in environ X push ax | push environ X push bx | push argv X push cx | push argc X call _main X add sp,*6 X push ax | push exit status X call _exit X X.data Xbegdata: X_environ: .word 0 X.bss Xbegbss: + END-OF-FILE crtso.s chmod 'u=rw,g=r,o=r' 'crtso.s' set `wc -c 'crtso.s'` count=$1 case $count in 598) :;; *) echo 'Bad character count in ''crtso.s' >&2 echo 'Count should be 598' >&2 esac echo Extracting 'end.s' sed 's/^X//' > 'end.s' << '+ END-OF-FILE ''end.s' X.globl endtext, enddata, endbss, _end, _edata X.text Xendtext: X.data Xenddata: X_edata: X.bss Xendbss: X_end: + END-OF-FILE end.s chmod 'u=rw,g=r,o=r' 'end.s' set `wc -c 'end.s'` count=$1 case $count in 103) :;; *) echo 'Bad character count in ''end.s' >&2 echo 'Count should be 103' >&2 esac echo Extracting 'getutil.s' sed 's/^X//' > 'getutil.s' << '+ END-OF-FILE ''getutil.s' X.define _get_base, _get_size, _get_tot_mem X.globl _get_base, _get_size, _get_tot_mem X.globl endbss X X|*========================================================================* X| utilities * X|*========================================================================* X_get_base: | return click at which prog starts X mov ax,ds X ret X X_get_size: | return prog size in bytes (text+data+bss) X mov ax,#endbss | end is compiler label at end of bss X ret X X| Find out how much memory the machine has, including vectors, kernel MM, etc. X_get_tot_mem: X cli X push es X push di X mov ax,#16384 | start search at 256K (16384 clicks) X sub di,di XL1: mov es,ax X seg es X mov (di),#0xA5A4 | write random bit pattern to memory X xor bx,bx X seg es X mov bx,(di) | read back pattern just written X cmp bx,#0xA5A4 | compare with expected value X jne L2 | if different, no memory present X add ax,#4096 | advance counter by 64K X cmp ax,#0xA000 | stop seaching at 640K X jne L1 XL2: pop di X pop es X sti X ret + END-OF-FILE getutil.s chmod 'u=rw,g=r,o=r' 'getutil.s' set `wc -c 'getutil.s'` count=$1 case $count in 1045) :;; *) echo 'Bad character count in ''getutil.s' >&2 echo 'Count should be 1045' >&2 esac echo Extracting 'head.s' sed 's/^X//' > 'head.s' << '+ END-OF-FILE ''head.s' X.globl _main, _stackpt, begtext, begdata, begbss, _data_org, _exit, .fat, .trp X.text Xbegtext: X jmp L0 X .zerow 13 | stack for inital IRET when common I&D X | also padding to make INIT_SP same as X | for separate I&D XL0: mov sp,_stackpt X call _main X_exit: | dummy for library functions - never executed X.fat: | dummy X.trp: | dummy XL1: jmp L1 | this should never be executed either X.data Xbegdata: X_data_org: | fs needs to know where build stuffed table X.word 0xDADA | magic number for build X.word 8 | CLICK_SHIFT to check - must match h/const.h X.word 0,0,0 | used by FS only for sizes of init X | stack for separate I&D follows X.word 0,0,0 | for ip:ss:f pushed by debugger traps X.word 0,0,0 | for cs:ds:ret adr in save() X | this was missing - a bug as late as V1.3c X | for ds for new restart() as well X.word 0,0,0 | for ip:ss:f built by restart() X | so INIT_SP in const.h must be 0x1C X.bss Xbegbss: + END-OF-FILE head.s chmod 'u=rw,g=r,o=r' 'head.s' set `wc -c 'head.s'` count=$1 case $count in 937) :;; *) echo 'Bad character count in ''head.s' >&2 echo 'Count should be 937' >&2 esac echo Extracting 'prtso.s' sed 's/^X//' > 'prtso.s' << '+ END-OF-FILE ''prtso.s' X| Pascal Run Time Start Off routine (analogous to crtso.s for C programs) X| This routine is used only with the MINIX Pascal compiler. X X.globl _m_a_i_n, _exit, prtso, _environ X.globl begtext, begdata, begbss X.globl hol0 X.text Xbegtext: Xprtso: Xmov bx,sp Xmov cx,(bx) Xadd bx,*2 Xmov ax,cx Xinc ax Xshl ax,#1 Xadd ax,bx Xmov _environ,ax Xpush ax Xpush bx Xpush cx Xcall _m_a_i_n Xadd sp,*6 Xpush ax Xcall _exit X X.data Xbegdata: X_environ: .word 0 Xhol0: X.word 0,0 X.word 0,0 X X.bss Xbegbss: + END-OF-FILE prtso.s chmod 'u=rw,g=r,o=r' 'prtso.s' set `wc -c 'prtso.s'` count=$1 case $count in 474) :;; *) echo 'Bad character count in ''prtso.s' >&2 echo 'Count should be 474' >&2 esac echo Extracting 'sendrec.s' sed 's/^X//' > 'sendrec.s' << '+ END-OF-FILE ''sendrec.s' X.define _send, _receive, _sendrec X X| See ../h/com.h for C definitions XSEND = 1 XRECEIVE = 2 XBOTH = 3 XSYSVEC = 32 X X|*========================================================================* X| send and receive * X|*========================================================================* X| send(), receive(), sendrec() all save bp, but destroy ax, bx, and cx. X.globl _send, _receive, _sendrec X_send: mov cx,*SEND | send(dest, ptr) X jmp L0 X X_receive: X mov cx,*RECEIVE | receive(src, ptr) X jmp L0 X X_sendrec: X mov cx,*BOTH | sendrec(srcdest, ptr) X jmp L0 X X L0: push bp | save bp X mov bp,sp | can't index off sp X mov ax,4(bp) | ax = dest-src X mov bx,6(bp) | bx = message pointer X int SYSVEC | trap to the kernel X pop bp | restore bp X ret | return X + END-OF-FILE sendrec.s chmod 'u=rw,g=r,o=r' 'sendrec.s' set `wc -c 'sendrec.s'` count=$1 case $count in 811) :;; *) echo 'Bad character count in ''sendrec.s' >&2 echo 'Count should be 811' >&2 esac echo Extracting 'setjmp.s' sed 's/^X//' > 'setjmp.s' << '+ END-OF-FILE ''setjmp.s' X.define _setjmp,_longjmp X.globl _setjmp, _longjmp X.text X_setjmp: mov bx,sp X mov ax,(bx) X mov bx,*2(bx) X mov (bx),bp X mov *2(bx),sp X mov *4(bx),ax X xor ax,ax X ret X X_longjmp: xor ax,ax X push bp X mov bp,sp X mov bx,*4(bp) X mov ax,*6(bp) X or ax,ax X jne L1 X inc ax XL1: mov cx,(bx) XL2: cmp cx,*0(bp) X je L3 X mov bp,*0(bp) X or bp,bp X jne L2 X hlt XL3: X mov bp,*0(bp) X mov sp,*2(bx) X mov cx,*4(bx) X mov bx,sp X mov (bx),cx X ret X X + END-OF-FILE setjmp.s chmod 'u=rw,g=r,o=r' 'setjmp.s' set `wc -c 'setjmp.s'` count=$1 case $count in 445) :;; *) echo 'Bad character count in ''setjmp.s' >&2 echo 'Count should be 445' >&2 esac exit 0