[comp.lang.pascal] Compiling TP 4.0 programs under TP 3.0 ?!?!?!

abcscnuk@csunb.csun.edu (Naoto Kimura (ACM)) (10/11/90)

I know this sounds a bit perverse, but here are some of the include
files I created to allow one to compile some (but not all) code written
for version 4.0 of Turbo Pascal while still using version 3.0 !

The modification dates are quite recent because I spent some time
cleaning up some of the code and added some internal documentation.
There were some real boners in part of the code that I had to fix
to make sure that nothing really scewy happened in certain cases.

For those who are wondering why I would ever need or even want to do
such things.  I needed to do this because I had some persons who wanted
to use some of the code I wrote for version 4.0, but didn't want to
spend the money upgrade their version 3.0...  I also used a slightly
different version of this same code when I was transporting a 40000+
line program to version 4.0 and I wanted to make the transition as easy
as possible.

If there are enough requests, I shall be making quickie modifications
of this code to allow some compatibilty with version 5.0 and perhaps
even 5.5... (gee this guy must be REALLY bored!)

In a few days I am considering posting some of the BGI interface
routines and OOP extensions for version 3.0 of Turbo Pascal.
:-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-)

--- CUT HERE ------ CUT HERE ------ CUT HERE ------ CUT HERE ------ CUT HERE ---
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	system.inc
#	tp4_dos.inc
# This archive created: Thu Oct 11 04:10:17 1990
export PATH; PATH=/bin:$PATH
echo shar: extracting "'system.inc'" '(1931 characters)'
if test -f 'system.inc'
then
	echo shar: will not over-write existing file "'system.inc'"
else
sed 's/^	X//' << \SHAR_EOF > 'system.inc'
	X(*====================================================================*\
	X|| MODULE NAME:  System.INC                                           ||
	X||                                                                    ||
	X|| DESCRIPTION:  This file contains the declaration and routines that ||
	X||               use long integers for Turbo 3.0x                     ||
	X||                                                                    ||
	X|| DEPENDENCIES: (none)                                               ||
	X||                                                                    ||
	X|| LAST MOD ON:  07/02/90                                             ||
	X\*====================================================================*)
	Xtype
	X    _String	= String[255];
	X    Pointer	= ^byte;
	X
	Xconst
	X    X10000	= 65536.0;    (* hex 10000 *)
	X    X8000	= 32768.0;    (* hex  8000 *)
	X
	Xtype
	X    longint	= record
	X		lo_part, hi_part : integer
	X		end;
	X
	Xprocedure mpy (     a,b	: integer;
	X		var l	: longint );
	X    var
	X	t0,t1		: integer;
	X	ll,ml,mh	: integer;
	X    begin
	X	ll := lo(a)*lo(b);
	X	t0 := hi(a)*lo(b);
	X	t1 := hi(b)*lo(a);
	X	ml := hi(ll) + lo(t0) + lo(t1);
	X	mh := hi(t0) + hi(t1) + hi(ml);
	X	l.lo_part := lo(ll) + (lo(ml) shl 8);
	X	l.hi_part := hi(a)*hi(b) + mh
	X    end;    (* mpy *)
	X
	Xfunction unsigned_val ( i : integer ) : real;
	X    begin
	X	unsigned_val := hi(i) * 256.0 + lo(i)
	X    end;    (* unsigned_val *)
	X
	Xprocedure incr_long ( var l : longint );
	X    begin
	X	with l do begin
	X	    lo_part := lo_part + 1;
	X	    if lo_part = 0 then hi_part := hi_part + 1
	X	  end;
	X    end;    (* incr_long *)
	X
	Xfunction signed_long_val ( l : longint ) : real;
	X    begin
	X	signed_long_val := l.hi_part * X10000 + unsigned_val(l.lo_part);
	X    end;
	X
	Xfunction unsigned_long_val ( l : longint ) : real;
	X    begin
	X	unsigned_long_val := hi(l.hi_part) * X10000 * 256.0
	X			     + lo(l.hi_part) * X10000
	X			     + unsigned_val(l.lo_part);
	X    end;    (* unsigned_long_val *)
	X
SHAR_EOF
if test 1931 -ne "`wc -c < 'system.inc'`"
then
	echo shar: error transmitting "'system.inc'" '(should have been 1931 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'tp4_dos.inc'" '(15174 characters)'
if test -f 'tp4_dos.inc'
then
	echo shar: will not over-write existing file "'tp4_dos.inc'"
else
sed 's/^	X//' << \SHAR_EOF > 'tp4_dos.inc'
	X(*====================================================================*\
	X|| MODULE NAME:  TP4_DOS.INC                                          ||
	X||                                                                    ||
	X|| DESCRIPTION:  This is a library of DOS service routines.           ||
	X||               Some things declared here are for compatibility with ||
	X||               Turbo Pascal 4 (these are marked with the comment    ||
	X||               TP4).                                                ||
	X||                                                                    ||
	X|| DEPENDENCIES: System.INC                                           ||
	X||                                                                    ||
	X|| LAST MOD ON:  07/02/90                                             ||
	X\*====================================================================*)
	X
	Xtype
	X    registers	= record
	X		case integer of
	X		1: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : integer);
	X		2: (AL,AH,BL,BH,CL,CH,DL,DH : byte)
	X		end;
	X
	Xconst
	X    FCarry	= $0001;
	X    FParity	= $0004;
	X    FAuxiliary	= $0010;
	X    FZero	= $0040;
	X    FSign	= $0080;
	X    FOverflow	= $0800;
	X
	Xconst		(*TP4*)
	X    Archive	= $20;
	X    Directory	= $10;
	X    Volume	= $08;		(* These constants are declared  *)
	X    SysFile	= $04;		(* in the Turbo Pascal 4.0       *)
	X    Hidden	= $02;		(* DOS unit file                 *)
	X    ReadOnly	= $01;		(* They describe file attributes *)
	X    AnyFile	= $3F;
	X
	Xtype		(*TP4*)
	X    ComStr	= String[127];	(* Command line string        *)
	X    PathStr	= String[79];	(* Full file path string      *)
	X    DirStr	= String[67];	(* Drive and directory string *)
	X    NameStr	= String[8];	(* File name string           *)
	X    ExtStr	= String[4];	(* File extension string      *)
	X
	X    SearchRec = record
	X	    Fill	: array [1..21] of byte;
	X	    Attr	: byte;
	X	    Time	: longint;
	X	    Size	: longint;
	X	    Name	: string[12]
	X	end;
	X
	X    DateTime = record
	X	    Year,
	X	    Month,
	X	    Day,
	X	    Hour,
	X	    Min,
	X	    Sec		: integer
	X	end;
	X
	Xvar		(*TP4*)
	X    DOSError	: integer;
	X
	X(*TP4*)
	Xprocedure GetTime ( var Hour, Minute, Second, Sec100 : integer );
	X    begin
	X	Inline(	$1E/			{ push ds          }
	X		$B4/$2C/		{ mov  ah,2ch      }
	X		$CD/$21/		{ int  21h         }
	X		$33/$C0/		{ xor  ax,ax       }
	X		$8A/$C5/		{ mov  al,ch       }
	X		$C4/$7E/<Hour/		{ les  di,[Hour]   }
	X		$26/$89/$05/		{ mov  [es:di],ax  }
	X		$C4/$7E/<Minute/	{ les  di,[Minute] }
	X		$8A/$C1/		{ mov  al,cl       }
	X		$26/$89/$05/		{ mov  [es:di],ax  }
	X		$C4/$7E/<Second/	{ les  di,[Second] }
	X		$8A/$C6/		{ mov  al,dh       }
	X		$26/$89/$05/		{ mov  [es:di],ax  }
	X		$C4/$7E/<Sec100/	{ les  di,[Sec100] }
	X		$8A/$C2/		{ mov  al,dl       }
	X		$26/$89/$05/		{ mov  [es:di],ax  }
	X		$1F)			{ pop  ds          }
	X    end;
	X
	X(*TP4*)
	Xprocedure GetDate ( var Year, Month, Day, DayofWeek : integer );
	X    begin
	X	Inline(	$B4/$2A/		{ mov     ah,2ah        }
	X		$CD/$21/		{ int     21h           }
	X		$32/$E4/		{ xor     ah,ah         }
	X		$C4/$7E/<DayOfWeek/	{ les     di,[DayOfWeek]}
	X		$26/$89/$05/		{ mov     [es:di],ax    }
	X		$C4/$7E/<Day/		{ les     di,[Day]      }
	X		$8A/$C2/		{ mov     al,dl         }
	X		$26/$89/$05/		{ mov     [es:di],ax    }
	X		$C4/$7E/<Month/		{ les     di,[Month]    }
	X		$8A/$C6/		{ mov     al,dh         }
	X		$26/$89/$05/		{ mov     [es:di],ax    }
	X		$C4/$7E/<Year/		{ les     di,[Year]     }
	X		$26/$89/$0D)		{ mov     [es:di],cx    }
	X    end;
	X
	X(*TP4*)
	Xprocedure DiskSize (
	X	    Drive	: integer;
	X	var result	: longint );
	X    var
	X	TmpH,
	X	TmpL	: Integer;
	X    begin
	X	Inline(	$B4/$36/	{        mov   ah,36h          }
	X		$8B/$56/<Drive/	{        mov   dx,[Drive]      }
	X		$CD/$21/	{        int   21h             }
	X		$C4/$7E/<Result/{        les   di,[Result]     }
	X		$3D/$FFFF/	{        cmp   ax,0ffffh       }
	X		$75/$06/	{        jne   @@NoErr         }
	X		$33/$C0/	{        xor   ax,ax           }
	X		$AB/		{        stosw                 }
	X		$AB/		{        stosw                 }
	X		$EB/$1B/	{        jmp   @@Done          }
	X				{        ; tmp = AX*DX         }
	X		$F7/$E2/	{@@NoErr:mul   dx              }
	X		$89/$46/<TmpL/	{        mov   [TmpL],ax       }
	X		$89/$56/<TmpH/	{        mov   [TmpH],dx       }
	X				{        ; result = tmp.lo*CX  }
	X		$F7/$E1/	{        mul   cx              }
	X		$26/$89/$05/	{        mov   [es:di],ax      }
	X		$26/$89/$55/$02/{        mov   [es:di+2],dx    }
	X		$8B/$46/<TmpH/	{        mov   ax,[TmpH]       }
	X				{        ; dx,ax = tmp.hi*CX   }
	X		$F7/$E1/	{        mul   cx              }
	X				{        ; result.hi += ax     }
	X		$26/$01/$45/$02){        add   [es:di+2],ax    }
	X    end;
	X
	X(*TP4*)
	Xprocedure DiskFree (
	X	    Drive	: integer;
	X	var result	: longint );
	X    var
	X	TmpH,
	X	TmpL	: Integer;
	X    begin
	X	Inline(	$B4/$36/	{        mov   ah,36h          }
	X		$8B/$56/<Drive/	{        mov   dx,[Drive]      }
	X		$CD/$21/	{        int   21h             }
	X		$C4/$7E/<Result/{        les   di,[Result]     }
	X		$3D/$FFFF/	{        cmp   ax,0ffffh       }
	X		$75/$06/	{        jne   @@NoErr         }
	X		$33/$C0/	{        xor   ax,ax           }
	X		$AB/		{        stosw                 }
	X		$AB/		{        stosw                 }
	X		$EB/$1B/	{        jmp   @@Done          }
	X				{        ; tmp = AX*DX         }
	X		$F7/$E3/	{@@NoErr:mul   bx              }
	X		$89/$46/<TmpL/	{        mov   [TmpL],ax       }
	X		$89/$56/<TmpH/	{        mov   [TmpH],dx       }
	X				{        ; result = tmp.lo*CX  }
	X		$F7/$E1/	{        mul   cx              }
	X		$26/$89/$05/	{        mov   [es:di],ax      }
	X		$26/$89/$55/$02/{        mov   [es:di+2],dx    }
	X		$8B/$46/<TmpH/	{        mov   ax,[TmpH]       }
	X				{        ; dx,ax = tmp.hi*CX   }
	X		$F7/$E1/	{        mul   cx              }
	X				{        ; result.hi += ax     }
	X		$26/$01/$45/$02){        add   [es:di+2],ax    }
	X    end;
	X
	X(*TP4*)
	Xprocedure UnpackTime (
	X	    t	: longint;
	X	var DT	: DateTime );
	X    begin
	X	DT.Day   := (t.hi_part and 511) and 31;
	X	DT.Month := (t.hi_part and 511) shr 5;
	X	DT.Year  := (t.hi_part shr 9) + 1980;
	X	DT.Hour  := (t.lo_part shr 11);
	X	DT.Min   := (t.lo_part and 2047) shr 5;
	X	DT.Sec   := (t.lo_part and 31) * 2
	X    end;
	X
	X(*TP4*)
	Xprocedure PackTime (
	X	var DT	: DateTime;
	X	var t	: longint  );
	X    begin
	X	t.hi_part := ((DT.Year-1980) shl 9) or (DT.Month shl 5)
	X			or (DT.Day);
	X	t.lo_part := (DT.Hour shl 11) or (DT.Min shl 6)
	X			or (DT.Sec div 2)
	X    end;
	X
	X(*TP4*)
	Xprocedure FindFirst (
	X	    s	: _string;
	X	    attr: byte;
	X	var srec: SearchRec   );
	X    var
	X	OldOfs,
	X	OldSeg,
	X	DS_Save	: Integer;
	X    begin
	X	inline(	$33/$C0/	{  xor   ax,ax                     }
	X		$8C/$5E/<DS_Save/{ mov   [DS_Save],ds              }
	X		$B8/>$2F00/	{  mov   ax,2f00h                  }
	X		$CD/$21/	{  int   21h                       }
	X		$8C/$46/<OldSeg/{  mov   [OldSeg],es               }
	X		$89/$5E/<OldOfs/{  mov   [OldOfs],bx               }
	X		$B8/>$1A00/	{  mov   ax,1a00h                  }
	X		$C5/$56/<Srec/	{  lds   dx,[SRec]                 }
	X		$CD/$21);	{  int   21h                       }
	X	{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.
	X	: Now we do the stuff we started out to do                     :
	X	: 1) Change the filename from a TP string into an ASCIIZ string:
	X	`- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
	X	inline(	$8C/$D0/	{  mov   ax,ss                     }
	X		$8E/$D8/	{  mov   ds,ax                     }
	X		$8E/$C0/	{  mov   es,ax                     }
	X		$8D/$76/<S/	{  lea   si,[S]                    }
	X		$8B/$FE/	{  mov   di,si                     }
	X		$33/$C0/	{  xor   ax,ax                     }
	X		$FC/		{  cld                             }
	X		$AC/		{  lodsb                           }
	X		$8B/$C8/	{  mov   cx,ax                     }
	X		$F3/$A4/	{  rep movsb                       }
	X		$26/$C6/$05/$00);{ mov   [BYTE es:di],0            }
	X	{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.
	X	: 2) Send modified string to DOS's FindFirst function          :
	X	`- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
	X	inline(	$8D/$56/<S/	{  lea   dx,[S]                    }
	X		$B8/>$4E00/	{  mov   ax,4E00h                  }
	X		$8A/$4E/<Attr/	{  mov   cl,[Attr]                 }
	X		$CD/$21);	{  int   21h                       }
	X	{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.
	X	: 3) Set return code and adjust FName entry in the search      :
	X	:    record from ASCIIZ to TP string format if return code     :
	X	:    idicated no error.                                        :
	X	`- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
	X	inline(	$8E/$5E/<DS_Save/{ mov   ds,[DS_Save]              }
	X		$73/$05/	{  jnc   Ok                        }
	X		$A3/>DosError/	{  mov   [DosError],ax             }
	X		$EB/$2C/	{  jmp   SHORT Continue            }
	X		$C7/$06/	{Ok:                               }
	X		 >DosError/
	X		 >$0000/	{  mov   [DosError],0              }
	X		$C4/$5E/<SRec/	{  les   bx,[SRec]                 }
	X		$8D/$7F/$1E/	{  lea   di,[(SearchRec bx).FName] }
	X		$8C/$C0/	{  mov   ax,es                     }
	X		$8E/$D8/	{  mov   ds,ax                     }
	X		$BA/>$000C/	{  mov   dx,12                     }
	X		$8B/$CA/	{  mov   cx,dx                     }
	X		$32/$C0/	{  xor   al,al                     }
	X		$F2/$AE/	{  repne scasb                     }
	X		$74/$02/	{  je    Found                     }
	X		$47/		{  inc   di                        }
	X		$49/		{  dec   cx                        }
	X				{Found:                            }
	X		$41/		{  inc   cx                        }
	X		$2B/$D1/	{  sub   dx,cx                     }
	X		$8B/$CA/	{  mov   cx,dx                     }
	X		$8B/$C1/	{  mov   ax,cx                     }
	X		$4F/		{  dec   di                        }
	X		$8B/$F7/	{  mov   si,di                     }
	X		$4E/		{  dec   si                        }
	X		$FD/		{  std                             }
	X		$F3/$A4/	{  rep movsb                       }
	X		$AA);		{  stosb                           }
	X				{Continue:                         }
	X	{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.
	X	: Restore DTA address to what it was before we entered this    :
	X	: routine.                                                     :
	X	`- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
	X	inline(	$8E/$5E/<OldSeg/{  mov   ds,[OldSeg]               }
	X		$8B/$56/<OldOfs/{  mov   dx,[OldOfs]               }
	X		$B8/>$1A00/	{  mov   ax,1a00h                  }
	X		$CD/$21/	{  int   21h                       }
	X		$8E/$5E/<DS_Save){ mov   ds,[DS_Save]              }
	X    end;  (* FindFirst *)
	X
	X(*TP4*)
	Xprocedure FindNext (var srec : SearchRec );
	X    var
	X	OldOfs,
	X	OldSeg,
	X	DS_Save	: Integer;
	X    begin
	X	inline(	$8C/$5E/<DS_Save/{ mov   [DS_Save],ds              }
	X		$B8/>$2F00/	{  mov   ax,2f00h                  }
	X		$CD/$21/	{  int   21h                       }
	X		$8C/$46/<OldSeg/{  mov   [OldSeg],es               }
	X		$89/$5E/<OldOfs/{  mov   [OldOfs],bx               }
	X		$B8/>$1A00/	{  mov   ax,1a00h                  }
	X		$C5/$56/<Srec/	{  lds   dx,[SRec]                 }
	X		$CD/$21);	{  int   21h                       }
	X	{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.
	X	: Now we do the stuff we started out to do                     :
	X	: 1) Adjust the FName entry in the search record from Turbo    :
	X	:    pascal string format to ASCIIZ format.                    :
	X	`- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
	X	inline(	$C5/$5E/<Srec/	{  lds   bx,[SRec]                 }
	X		$8D/$77/$1E/	{  lea   si,[(SearchRec bx).FName] }
	X		$8C/$D8/	{  mov   ax,ds                     }
	X		$8E/$C0/	{  mov   es,ax                     }
	X		$8B/$FE/	{  mov   di,si                     }
	X		$33/$C0/	{  xor   ax,ax                     }
	X		$FC/		{  cld                             }
	X		$AC/		{  lodsb                           }
	X		$8B/$C8/	{  mov   cx,ax                     }
	X		$F3/$A4/	{  rep movsb                       }
	X		$26/$C6/$05/$00);{ mov   [BYTE es:di],0            }
	X	{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.
	X	: 2) Pass the adjusted search record to DOS's FindNext system  :
	X	:    service (address was previously set in setting DTA)       :
	X	`- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
	X	inline(	$B8/>$4F00/	{  mov   ax,4f00h                  }
	X		$CD/$21);	{  int   21h                       }
	X	{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.
	X	: 3) Set return code and adjust FName entry in the search      :
	X	:    record from ASCIIZ to TP string format if return code     :
	X	:    idicated no error.                                        :
	X	`- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
	X	inline(	$8E/$5E/<DS_Save/{ mov   ds,[DS_Save]              }
	X		$73/$05/	{  jnc   Ok                        }
	X		$A3/>DosError/	{  mov   [DosError],ax             }
	X		$EB/$2C/	{  jmp   SHORT Continue            }
	X		$C7/$06/	{Ok:                               }
	X		 >DosError/
	X		 >$0000/	{  mov   [DosError],0              }
	X		$C4/$5E/<SRec/	{  les   bx,[SRec]                 }
	X		$8D/$7F/$1E/	{  lea   di,[(SearchRec bx).FName] }
	X		$8C/$C0/	{  mov   ax,es                     }
	X		$8E/$D8/	{  mov   ds,ax                     }
	X		$BA/>$000C/	{  mov   dx,12                     }
	X		$8B/$CA/	{  mov   cx,dx                     }
	X		$32/$C0/	{  xor   al,al                     }
	X		$F2/$AE/	{  repne scasb                     }
	X		$74/$02/	{  je    Found                     }
	X		$47/		{  inc   di                        }
	X		$49/		{  dec   cx                        }
	X				{Found:                            }
	X		$41/		{  inc   cx                        }
	X		$2B/$D1/	{  sub   dx,cx                     }
	X		$8B/$CA/	{  mov   cx,dx                     }
	X		$8B/$C1/	{  mov   ax,cx                     }
	X		$4F/		{  dec   di                        }
	X		$8B/$F7/	{  mov   si,di                     }
	X		$4E/		{  dec   si                        }
	X		$FD/		{  std                             }
	X		$F3/$A4/	{  rep movsb                       }
	X		$AA);		{  stosb                           }
	X				{Continue:                         }
	X	{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.
	X	: Restore DTA address to what it was before we entered this    :
	X	: routine.                                                     :
	X	`- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
	X	inline(	$8E/$5E/<OldSeg/{  mov   ds,[OldSeg]               }
	X		$8B/$56/<OldOfs/{  mov   dx,[OldOfs]               }
	X		$B8/>$1A00/	{  mov   ax,1a00h                  }
	X		$CD/$21/	{  int   21h                       }
	X		$8E/$5E/<DS_Save){ mov   ds,[DS_Save]              }
	X    end;  (* FindNext *)
	X
	X(*TP4*)
	Xprocedure GetIntVec( IntNo:Byte;  var Vector:Pointer );
	X    begin
	X	Inline(	$1E/			{ push ds          }
	X		$B4/$35/		{ mov  ah,35h      }
	X		$8A/$46/<IntNo/		{ mov  al,[IntNo]  }
	X		$CD/$21/		{ int  21h         }
	X		$C5/$76/<Vector/	{ lds  si,[Vector] }
	X		$89/$1C/		{ mov  [si],bx     }
	X		$8C/$44/$02/		{ mov  [si+2],es   }
	X		$1F)			{ pop  ds          }
	X    end;    (* GetIntVec *)
	X
	X(*TP4*)
	Xprocedure SetIntVec( IntNo:Byte;  var Vector:Pointer );
	X    begin
	X	Inline(	$1E/			{ push ds          }
	X		$B4/$25/		{ mov  ah,25h      }
	X		$8A/$46/<IntNo/		{ mov  al,[IntNo]  }
	X		$C5/$56/<Vector/	{ lds  dx,[Vector] }
	X		$CD/$21/		{ int  21h         }
	X		$1F)			{ pop  ds          }
	X    end;    (* GetIntVec *)
SHAR_EOF
if test 15174 -ne "`wc -c < 'tp4_dos.inc'`"
then
	echo shar: error transmitting "'tp4_dos.inc'" '(should have been 15174 characters)'
fi
fi # end of overwriting check
#	End of shell archive
exit 0
--- CUT HERE ------ CUT HERE ------ CUT HERE ------ CUT HERE ------ CUT HERE ---

                //-n-\\			 Naoto Kimura
        _____---=======---_____		 (abcscnuk@csuna.csun.edu)
    ====____\   /.. ..\   /____====
  //         ---\__O__/---         \\	Enterprise... Surrender or we'll
  \_\                             /_/	send back your *&^$% tribbles !!