dono@killer.DALLAS.TX.US (Don OConnell) (02/14/89)
This is a repost of the assembler modules that were originally posted by: evas@euraiv1.UUCP (Eelco van Asperen) They work with TurboC 1.5 , and are in Masm syntax but should work with the A86 assembler; they will probably need a little tweaking to work with another C compiler. I have used them in building 1.2 1.3 1.3[a-d] 1.4[a- ] and still use them. ------------------------------Cut Here--------------------------------- #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: catchsig.asm crtso.asm getutil.asm head.asm sendrec.asm # setjmp.asm prologue.h # Wrapped by dono@killer on Mon Feb 13 21:20:15 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f catchsig.asm -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"catchsig.asm\" else echo shar: Extracting \"catchsig.asm\" \(1037 characters\) sed "s/^X//" >catchsig.asm <<'END_OF_catchsig.asm' Xtitle catchsig - C86 version; now TurboC version [EVAS] Xpage,132 X Xinclude prologue.h X X_DATA segment para public 'DATA' X X extrn _vectab:word, _M:word X X dummy DW 0 X X_DATA ends X X X_TEXT segment byte public 'CODE' X X assume CS:_TEXT,DS:DGROUP X X public _begsig X X XMTYPE = 2 ; M+mtype = &M.m_type X X_begsig proc near X 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 X mov bp,sp X mov bx,18[bp] ; bx = 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 X iret X X_begsig endp X X_TEXT ends X X X END ; end of assembly-file END_OF_catchsig.asm if test 1037 -ne `wc -c <catchsig.asm`; then echo shar: \"catchsig.asm\" unpacked with wrong size! fi # end of overwriting check fi if test -f crtso.asm -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"crtso.asm\" else echo shar: Extracting \"crtso.asm\" \(2117 characters\) sed "s/^X//" >crtso.asm <<'END_OF_crtso.asm' XTitle $MAIN C-86 run-time start-off for Minix; Now for Turbo C [EVAS] Xpage,132 X X X PAGE 60,132 X;[]------------------------------------------------------------[] X;| start-up module for using Turbo C under MINIX; | X;| derived from: | X;| | X;| C0.ASM -- Start Up Code | X;| | X;| Turbo-C Run Time Library version 1.0 | X;| | X;| Copyright (c) 1987 by Borland International Inc. | X;| All Rights Reserved. | X;[]------------------------------------------------------------[] X Xinclude prologue.h X X ASSUME CS:_TEXT, DS:DGROUP X X; External References X X XPUBLIC __end, _brksize, edata, $main, _environ, kamikaze X X XSTACKSIZE EQU 2560 ; default stack is 5 Kb (2K words) X X_DATA segment para public 'DATA' X X_brksize DW offset dgroup:__end+2 ; dynamic changeable end of bss X_environ DW 0 ; save environment pointer here X X_DATA ends X X X_DATAEND segment para public 'DATA' X X; _DATAEND holds nothing. The label just tells us where X; the initialized data (.data) ends. X Xedata label byte X X_DATAEND ENDS X X_BSSEND SEGMENT BYTE PUBLIC 'BSS' X X; _BSSEND holds nothing. The label in the segment just tells X; us where the data+bss ends. X X__end label byte X X_BSSEND ENDS X X X@STACK SEGMENT BYTE STACK 'STACK' X DW STACKSIZE dup(?) ; add stack segment to bss X@STACK ENDS X X X_TEXT segment byte public 'CODE' X ASSUME CS:_TEXT,DS:DGROUP X XEXTRN _main:NEAR, _exit:NEAR X 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 X$main: X mov ax,DGROUP ; force relocation of data & bss X mov bx,sp ; set stackframe pointer (ds=ss) X mov cx,[bx] ; get argc X add bx,2 ; point at next parameter X mov ax,cx X inc ax ; calculate envp X shl ax,1 X add ax,bx X mov _environ,ax ; save envp X push ax ; stack envp X push bx ; stack argv X push cx ; stack argc X X call _main ; call _main(arc,argv,envp) X X add sp,6 X push ax ; stack program-termination status X call _exit ; this will never return X X ; DEBUG from here on X Xkamikaze: int 3 X ret X X_TEXT ENDS X X X END $main ; program entry-point (could be anywhere) END_OF_crtso.asm if test 2117 -ne `wc -c <crtso.asm`; then echo shar: \"crtso.asm\" unpacked with wrong size! fi # end of overwriting check fi if test -f getutil.asm -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"getutil.asm\" else echo shar: Extracting \"getutil.asm\" \(1182 characters\) sed "s/^X//" >getutil.asm <<'END_OF_getutil.asm' Xtitle GetUtil - C86 version; now for Turbo C [EVAS] Xpage,132 X Xinclude prologue.h X X PUBLIC _get_base, _get_size, _get_tot_mem X X EXTRN __end:byte X X X_TEXT SEGMENT byte public 'CODE' X X ASSUME CS:_TEXT,DS:DGROUP X X;======================================================================== X; utilities X;======================================================================== 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,offset dgroup:__end ; end is 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,8192 ; start search at 128K [8192 clicks] X sub di,di Xy1: mov es,ax X mov es:[di],0A5A4h ; write random bit pattern to memory X xor bx,bx X mov bx,es:[di] ; read back pattern just written X cmp bx,0A5A4h ; compare with expected value X jne y2 ; if different, no memory present X add ax,4096 ; advance counter by 64K X cmp ax,0A000h ; stop seaching at 640K X jne y1 Xy2: pop di X pop es X sti X ret X X_TEXT ENDS X X END ; end of assembly-file END_OF_getutil.asm if test 1182 -ne `wc -c <getutil.asm`; then echo shar: \"getutil.asm\" unpacked with wrong size! fi # end of overwriting check fi if test -f head.asm -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"head.asm\" else echo shar: Extracting \"head.asm\" \(1045 characters\) sed "s/^X//" >head.asm <<'END_OF_head.asm' Xtitle Head - Start-off for initt, mm and fs (C86-compiler); now for Turbo C [EVAS] Xpage ,132 X Xinclude prologue.h X XEXTRN _main:NEAR XPUBLIC $main, _data_org, brksize, sp_limit, __end XEXTRN _stackpt:word X X X_TEXT SEGMENT byte public 'CODE' X X assume cs:_TEXT,ds:DGROUP X X$main: jmp short L0 X X ORG 10h ; kernel uses this area as stack for inital IRET XL0: mov sp,dgroup:_stackpt X call _main XL1: jmp L1 ; this will never be executed X mov ax,DGROUP ; force relocation for dos2out (never executed) X X_TEXT ENDS X X X_DATA SEGMENT X ; fs needs to know where build stuffed table X_data_org DW 0DADAh ; 0xDADA is magic number for build X DW 7 dup(0) ; first 8 words of MM, FS, INIT are for stack Xbrksize DW offset dgroup:__end ; first free memory Xsp_limit DW 0 X X_DATA ENDS X X_BSSEND SEGMENT X X; _BSSEND holds nothing. The label in the segment just tells X; us where the data+bss ends. X X__end label byte X X_BSSEND ENDS X X X@STACK SEGMENT BYTE STACK 'STACK' X@STACK ENDS ; Add stack to satisfy DOS-linker X X END $main ; end of assembly & entry-point X END_OF_head.asm if test 1045 -ne `wc -c <head.asm`; then echo shar: \"head.asm\" unpacked with wrong size! fi # end of overwriting check fi if test -f sendrec.asm -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"sendrec.asm\" else echo shar: Extracting \"sendrec.asm\" \(1022 characters\) sed "s/^X//" >sendrec.asm <<'END_OF_sendrec.asm' Xtitle Send/Receive - C86 version; now for Turbo C [EVAS] Xpage,132 X Xinclude prologue.h X X PUBLIC _send, _receive, _send_rec, _sendrec X X X; The following definitions are from ../h/com.h X X __SEND = 1 X __RECEIVE= 2 X __BOTH = 3 X __SYSVEC = 32 X X X_TEXT SEGMENT byte public 'CODE' X X ASSUME CS:_TEXT,DS:DGROUP X X;======================================================================== X; send and receive X;======================================================================== X; send(), receive(), send_rec() all save bp, but destroy ax, bx, and cx. X 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_send_rec: X mov cx,__BOTH ; send_rec(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 X_TEXT ENDS X X END ; end of assembly-file END_OF_sendrec.asm if test 1022 -ne `wc -c <sendrec.asm`; then echo shar: \"sendrec.asm\" unpacked with wrong size! fi # end of overwriting check fi if test -f setjmp.asm -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"setjmp.asm\" else echo shar: Extracting \"setjmp.asm\" \(916 characters\) sed "s/^X//" >setjmp.asm <<'END_OF_setjmp.asm' Xtitle setjmp/longjmp - C86 version Xpage,132 X Xinclude ..\lib\prologue.h X X X PUBLIC _setjmp, _longjmp X EXTRN _exit:near X X X; struct jmpbuf { X; int bp; X; int sp; X; int ret-addr; X; } X XJMPERR EQU -99 ; call _exit(JMPERR) when jmp-error X X_TEXT SEGMENT byte public 'CODE' X X ASSUME CS:_TEXT,DS:DGROUP X X_setjmp: X mov bx,sp X mov ax,[bx] ; ret-addr. X mov bx,2[bx] ; addr of jmp-struct X mov [bx],bp X mov 2[bx],sp X mov 4[bx],ax X xor ax,ax X ret X X_longjmp: X push bp X mov bp,sp ; set new frame pointer to sp X mov bx,4[bp] ; get address of jmp-structure X mov ax,6[bp] ; get ret-code X or ax,ax X jne L1 X inc ax ; return code may not be zero X L1: mov sp,[bx+2] X mov bp,[bx] X or bp,bp ; test if last frame-pointer (error) X jne L2 ; else execute the longjmp X pop bp X mov ax,JMPERR X push ax X call _exit ; should never return X hlt X L2: mov bx,[bx+4] X pop cx ; dump the bp we pushed upon entry X jmp bx X X_TEXT ENDS X X END END_OF_setjmp.asm if test 916 -ne `wc -c <setjmp.asm`; then echo shar: \"setjmp.asm\" unpacked with wrong size! fi # end of overwriting check fi if test -f prologue.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"prologue.h\" else echo shar: Extracting \"prologue.h\" \(415 characters\) sed "s/^X//" >prologue.h <<'END_OF_prologue.h' X X; Segment and Group declarations X X_TEXT SEGMENT BYTE PUBLIC 'CODE' X_TEXT ENDS X_DATABEG SEGMENT PARA PUBLIC 'DATA' X_DATABEG ENDS X_DATA SEGMENT PARA PUBLIC 'DATA' X_DATA ENDS X_DATAEND SEGMENT PARA PUBLIC 'DATA' X_DATAEND ENDS X_BSS SEGMENT WORD PUBLIC 'BSS' X_BSS ENDS X_BSSEND SEGMENT BYTE PUBLIC 'BSS' X_BSSEND ENDS X_STACK SEGMENT STACK 'STACK' X_STACK ENDS X XDGROUP GROUP _DATABEG,_DATA, _DATAEND, _BSS, _BSSEND, _STACK X END_OF_prologue.h if test 415 -ne `wc -c <prologue.h`; then echo shar: \"prologue.h\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of shell archive. exit 0 Don O'Connell killer!dono