GNUPLOT 1.1: part 6 of 6
williams at vu-vlsi.UUCP
williams at vu-vlsi.UUCP
Thu Jan 29 04:31:21 AEST 1987
GNUPLOT 1.1: part 6 of 6
This shar file contains two VMS-specific files (compile.com, link.com)
and a bunch of PC-specific files. You can ignore these files if your
installing GNUPLOT on a UNIX machine.
-------------------------------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:
# compile.com
# link.com
# buildhlp.c
# corgraph.asm
# corplot.c
# header.mac
# help.c
# help.hlm
# hrcgraph.asm
# lineproc.mac
# link.opt
# make.msc
# pcgraph.asm
# This archive created: Wed Jan 28 12:04:30 1987
export PATH; PATH=/bin:$PATH
echo shar: extracting "'compile.com'" '(560 characters)'
if test -f 'compile.com'
then
echo shar: will not over-write existing file "'compile.com'"
else
cat << \SHAR_EOF > 'compile.com'
$! make sure you SET TERM/NOWRAP before running GNUPLOT!
$ CFLAGS = "NOTHING"
$ TERMFLAGS = "AED,HP26,HP75,POSTSCRIPT,QMS,REGIS,TEK,V384"
$ set verify
$ cc/define=('CFLAGS') command.c
$ cc/define=('CFLAGS') eval.c
$ cc/define=('CFLAGS') graphics.c
$ cc/define=('CFLAGS') internal.c
$ cc/define=('CFLAGS') misc.c
$ cc/define=('CFLAGS') parse.c
$ cc/define=('CFLAGS') plot.c
$ cc/define=('CFLAGS') scanner.c
$ cc/define=('CFLAGS') standard.c
$ cc/define=('CFLAGS','TERMFLAGS') term.c
$ cc/define=('CFLAGS') util.c
$ cc/define=('CFLAGS') version.c
$ set noverify
SHAR_EOF
if test 560 -ne "`wc -c < 'compile.com'`"
then
echo shar: error transmitting "'compile.com'" '(should have been 560 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'link.com'" '(130 characters)'
if test -f 'link.com'
then
echo shar: will not over-write existing file "'link.com'"
else
cat << \SHAR_EOF > 'link.com'
$ link/exe=gnuplot command,eval,graphics,internal,misc,parse,plot,scanner, -
standard,[]term,util,version,sys$library:vaxcrtl/lib
SHAR_EOF
if test 130 -ne "`wc -c < 'link.com'`"
then
echo shar: error transmitting "'link.com'" '(should have been 130 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'buildhlp.c'" '(2366 characters)'
if test -f 'buildhlp.c'
then
echo shar: will not over-write existing file "'buildhlp.c'"
else
cat << \SHAR_EOF > 'buildhlp.c'
/*
* buildhlp.c -- a program to build an MS-DOS help tree from a VMS .HLP file
* Colin Kelley
* January 1987
*/
#include <stdio.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
#define HELPMAIN "HELP.HLM"
#define EXT ".HLP"
char cwd[80];
char buffer[10000];
int currlevel, nextlevel;
char currname[13], nextname[13];
int line = 1;
main(argc,argv)
int argc;
char *argv[];
{
register char *bptr;
register int c;
FILE *f;
int done = FALSE;
if (argc != 2) {
fprintf(stderr,"usage: %s start-dir < helpfile\n\n",argv[0]);
fprintf(stderr," where <start-dir> is the directory in which to start building the tree\n");
fprintf(stderr," and <helpfile> is in VMS help file format\n");
exit(1);
}
getcwd(cwd,sizeof(cwd));
if (chdir(argv[1]) == -1) {
perror("can't chdir() to starting directory");
exit_err(argv[1]);
}
if (scanf("%d %8s",&currlevel,currname) != 2)
exit_err("scanf() error");
do {
for (c = currlevel*2 - 1; --c;)
putchar(' ');
puts(currname);
strcat(currname,EXT);
while ((c = getchar()) != EOF && c != '\n')
;
if (c == '\n')
line++;
if ((c = getchar()) != EOF && c != ' ')
ungetc(c,stdin);
bptr = buffer;
while ((c = getchar()) != EOF) {
*bptr++ = c;
if (c == '\n') {
line++;
if ((c = getchar()) != EOF) {
if (c != ' ')
ungetc(c,stdin); /* push it back */
if (isdigit(c))
break;
}
}
}
*bptr = '\0';
if (c == EOF) {
done = TRUE;
nextlevel = 1;
}
else {
if (scanf("%d %8s",&nextlevel,nextname) != 2)
exit_err("scanf() error");
}
if (!done && nextlevel > currlevel) { /* have a subtopic */
if (chdir(currname) == -1) { /* does it already exist? */
if (mkdir(currname) == -1) {
perror("mkdir()");
exit_err(currname);
}
if (chdir(currname) == -1) {
perror("chdir()");
exit_err(currname);
}
}
f = fopen(HELPMAIN,"w");
}
else
f = fopen(currname,"w");
while (nextlevel <= --currlevel)
if (chdir("..") == -1) {
perror("chdir()");
exit_err("..");
}
if (f == NULL) {
perror("fopen()");
exit_err(currname);
}
fputs(buffer,f);
fclose(f);
currlevel = nextlevel;
strcpy(currname,nextname);
} while (!done);
chdir(cwd);
exit(0);
}
exit_err(msg)
char msg[];
{
fprintf(stderr,"%s (input line %d)\n",msg,line);
chdir(cwd);
exit(1);
}
SHAR_EOF
if test 2366 -ne "`wc -c < 'buildhlp.c'`"
then
echo shar: error transmitting "'buildhlp.c'" '(should have been 2366 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'corgraph.asm'" '(2272 characters)'
if test -f 'corgraph.asm'
then
echo shar: will not over-write existing file "'corgraph.asm'"
else
cat << \SHAR_EOF > 'corgraph.asm'
TITLE Corona graphics module
; Colin Kelley
; January 1987
include header.mac
if1
include lineproc.mac
endif
_text segment
public _GrInit,_GrReset,_GrOnly,_TxOnly,_GrandTx,_Cor_line,_Cor_mask
corpixel proc near
ror word ptr linemask,1
jc cont
ret
cont: push bp
mov bp,sp
push ax
push bx
push cx
mov es,ScSeg
shl bx,1 ; y
mov bx,word ptr LookUp[bx] ; bx has y mem address
mov cl,al ; x
and cl,7
shr ax,1
shr ax,1
shr ax,1 ; ax /= 8
add bx,ax
mov al,1
shl al,cl ; al contains bit mask
or byte ptr es:[bx],al
pop cx
pop bx
pop ax
pop bp
ret
lineproc _Cor_line, corpixel
beginproc _GrInit
push bp
mov bp,sp
push di
mov ax, [bp+X] ; screen number (0 - 7)
mov cl,11
shl ax,cl ; multiply by 2048 to get segment
mov ScSeg,ax ; save segment for later
push ax
mov es, ax
xor ax,ax
mov di,ax
mov cx, 4000h
cld
rep stosw
pop cx
call near ptr GrAddr
mov ax,es
pop di
pop bp
ret
_GrInit endp
beginproc _GrReset
mov cx, 0
call near ptr GrAddr
ret
_GrReset endp
GrAddr proc near
mov dx,3b4h ; address of 6845
mov al,0ch ; register 12
out dx,al
inc dx
mov al,ch ; Graphics Segment High
out dx,al
dec dx
mov al,0dh ; register 13
out dx,al
mov al,cl ; Graphics Segment Low
inc dx
out dx,al
ret
GrAddr endp
beginproc _GrOnly
mov dx,3b8h
mov al,0a0h
out dx,al
ret
_GrOnly endp
beginproc _TxOnly
mov dx,3b8h
mov al,28h
out dx,al
ret
_TxOnly endp
beginproc _GrandTx
mov dx,3b8h
mov al,0a8h
out dx,al
ret
_GrandTx endp
beginproc _Cor_mask
push bp
mov bp,sp
mov ax,[bp+x] ; mask
mov linemask,ax
pop bp
ret
_Cor_mask endp
corpixel endp
_text ends
_data segment
linemask dw -1
ScSeg dw 0
_data ends
const segment
K equ 1024
mem_mac MACRO x
dw x,2*K+x,4*K+x,6*K+x,8*K+x,10*K+x,12*K+x,14*K+x,16*K+x
dw 18*K+x,20*K+x,22*K+x,24*K+x
ENDM
LookUp equ $
mem_mac 0
mem_mac 80
mem_mac (80*2)
mem_mac (80*3)
mem_mac (80*4)
mem_mac (80*5)
mem_mac (80*6)
mem_mac (80*7)
mem_mac (80*8)
mem_mac (80*9)
mem_mac (80*10)
mem_mac (80*11)
mem_mac (80*12)
mem_mac (80*13)
mem_mac (80*14)
mem_mac (80*15)
mem_mac (80*16)
mem_mac (80*17)
mem_mac (80*18)
mem_mac (80*19)
mem_mac (80*20)
mem_mac (80*21)
mem_mac (80*22)
mem_mac (80*23)
mem_mac (80*24)
const ends
end
SHAR_EOF
if test 2272 -ne "`wc -c < 'corgraph.asm'`"
then
echo shar: error transmitting "'corgraph.asm'" '(should have been 2272 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'corplot.c'" '(839 characters)'
if test -f 'corplot.c'
then
echo shar: will not over-write existing file "'corplot.c'"
else
cat << \SHAR_EOF > 'corplot.c'
#include <stdio.h>
#include <process.h>
#include <dos.h>
#define BOUNDARY 32768
#define segment(addr) (FP_SEG(m) + ((FP_OFF(m)+15) >> 4));
#define round(value,boundary) (((value) + (boundary) - 1) & ~((boundary) - 1))
char *malloc(),*realloc();
char prog[] = "gnuplot";
char corscreen[] = "CORSCREEN=0";
main()
{
register unsigned int segm,start;
char *m;
if (!(m = malloc(BOUNDARY))) {
printf("malloc() failed\n");
exit(1);
}
segm = segment(m);
start = round(segm,BOUNDARY/16);
if (realloc(m,BOUNDARY+(start-segm)*16) != m) {
printf("can't realloc() memory\n");
exit(2);
}
if ((segm = start >> 11) >= 8) {
printf("not enough room in first 256K\n");
exit(3);
}
corscreen[sizeof(corscreen)-2] = '0' + segm;
if (putenv(corscreen))
perror("putenv");
if (spawnlp(P_WAIT,prog,prog,NULL))
perror("spawnlp");
}
SHAR_EOF
if test 839 -ne "`wc -c < 'corplot.c'`"
then
echo shar: error transmitting "'corplot.c'" '(should have been 839 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'header.mac'" '(920 characters)'
if test -f 'header.mac'
then
echo shar: will not over-write existing file "'header.mac'"
else
cat << \SHAR_EOF > 'header.mac'
if1
COMPACT equ 1 ; define your memory model here
ifdef SMALL
; default, so do nothing
else
ifdef MEDIUM
LARGE_CODE equ 1
else
ifdef COMPACT
LARGE_DATA equ 1
else
ifdef LARGE
LARGE_DATA equ 1
LARGE_CODE equ 1
else
%out No memory model defined--assuming SMALL
endif ; LARGE
endif ; COMPACT
endif ; MEDIUM
endif ; SMALL
beginproc macro procname
ifdef LARGE_CODE
procname proc far
else
procname proc near
endif ; LARGE_CODE
endm ; beginproc
endif ; if1
_TEXT SEGMENT BYTE PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP CONST, _BSS, _DATA
assume cs:_text, ds:dgroup, ss:dgroup, es:dgroup
; define X as the offset of first argument on stack frame
ifdef LARGE_CODE
X equ 6 ; return offset and segment + old BP
else
X equ 4 ; return offset + old BP
endif ; LARGE_CODE
SHAR_EOF
if test 920 -ne "`wc -c < 'header.mac'`"
then
echo shar: error transmitting "'header.mac'" '(should have been 920 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'help.c'" '(19751 characters)'
if test -f 'help.c'
then
echo shar: will not over-write existing file "'help.c'"
else
cat << \SHAR_EOF > 'help.c'
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <conio.h>
#include <signal.h>
#include <ctype.h>
#include <direct.h>
#include <process.h>
#include <string.h>
#include <dos.h>
/*****************************************************************************
* HELP
*
* This program provides a HELP environment similar to the VMS help facility.
* Instead of using a help library, however, this version uses a directory
* tree of text files. This was done primarily to allow easy editing and
* addition of help entries.
*
* The set of arguments passed from DOS is first scanned for switches. Then
* the remaining arguments are passed to the main help routine as a single
* string which is reparsed. This was done to allow easy recursion.
*
* Similar to the public domain help utility found on many UNIX systems, a
* help directory contains five possible entries in it.
* main help text: HELP.HLM
* manual page name: HELP.MAN
* subtopic texts: <topicname>.HLP
* subtopic directories: <topicname>
*
* Due to the filename size limitation of DOS, command line tokens are
* limited to eight characters.
*/
#define HELPVER "HELP - VMS-like help utility\nVersion 1.0.014NL - 6 January 1986\nRobert P. Scott\nDTS Engineering & Consulting\n29 Heritage Circle\nHudson, NH 03051-3427\n(603)886-1383\n"
#define STDDELIM " \r\n\t;" /* delimiters for parsing */
#define HELPMAIN "HELP.HLM" /* main help text filename */
#define MAXENT 128 /* maximum number of help entries*/
#define HELPEX ".HLP" /* help extension */
#define SWITCHR1 '-' /* unix like switch char */
#define SWITCHR2 '/' /* PC/MS-DOS std switch char */
#define PROMPT "Topic? "
#define DEFSEARCH "*.HLP" /* Default search string */
#define R_OK 04
#define MAXLINELEN 90
#define MAXNAMELEN 13 /* max length of NAME */
#define COLUMNSPACE 4
#define TERMWID 76
#define HELPDIR "."
#define ALL 0x37
#define DEFSCRLEN 17
int scrnlen;
int status;
int olddisk;
char dent[MAXENT][MAXNAMELEN];
char lent1[MAXENT][MAXLINELEN];
char lent2[MAXENT][MAXLINELEN];
char progname[MAXNAMELEN+4];
char olddir[MAXLINELEN];
char newdir[MAXLINELEN];
char currdir[MAXLINELEN];
char prompt[MAXLINELEN];
char *helpdir;
char dta[80];
int help(char *);
int outhelp(char *);
int allsel(void);
void set_dta(char *);
void select_disk(int);
int dir_get(char *,int );
char *gettok(char *,char *,char *,char *);
int isdelim(char ,char *);
int more(char *);
int pgbrk(void);
void stripnl(char *);
void setprompt(void);
void fstobs(char *);
void handler(void);
int kget(void);
void main(argc, argv)
int argc;
char *argv[];
{
char inbuf[MAXLINELEN];
int il; /* input buffer length */
int sl; /* token length */
int done; /* temporary flag */
char c; /* temporary char holder */
char *op; /* single argument pointer */
strcpy( progname,*argv++ ); /* Always save the program name */
helpdir = getenv( "HELP" ); /* use EV for directory if set */
olddisk = curr_disk(); /* save our starting disk */
getcwd( olddir, MAXLINELEN ); /* save our starting directory */
if ( signal( SIGINT, handler ) < 0 ) /* uh oh */
{
fprintf( stderr, "%s could not set SIGINT. Action undefined upon INT\n", progname );
}
argc--;
while (( argc ) && ( ( c = *(*argv) ) == SWITCHR1 ) || ( c == SWITCHR2 ))
{ /* must be options */
for (op = *argv; *op != '\0'; op++)
{
switch(*op)
{
case SWITCHR1 : /* ignore first and extras */
case SWITCHR2 :
break;
case 'd' : /* specifying help directory path explicitly */
helpdir = *++argv;
break;
case 'h' :
case 'v' : /* show version number */
fprintf( stdout, HELPVER );
bye( 0 );
default:
fprintf(stderr,"%s: %c: bad option.\n",
progname,*op);
break;
} /* switch */
} /* for ( steps through token ) */
argc--; argv++;
} /* while ( loops on argv arguments ) */
if (helpdir == NULL) /* if all else fails, use default */
helpdir = HELPDIR;
fstobs( helpdir ); /* normalize to dos directory seps */
if (isalpha(helpdir[0]) && helpdir[1] == ':')
select_disk(helpdir[0] - 'A');
if (chdir(helpdir) < 0) /* move to the help root */
{
fprintf(stderr,"%s: %s: help directory not found.\n",
progname,helpdir);
bye(1);
}
done = il = 0; /* reset input length */
inbuf[0] = 0; /* start with a null buffer */
while ( ( argc ) && ( *argv ) && !done ) /* concat. all remaining args */
{
sl = strlen( *argv ); /* new token length */
if ( ( il + sl ) < MAXLINELEN ) /* if enough room for added token */
{
if ( il && ( il < MAXLINELEN ) ) /* if not the first token */
{
strcat( inbuf, " " ); /* add a space */
strcat( inbuf, *argv ); /* and add the token */
}
else /* the first token */
strcpy( inbuf, *argv ); /* copy in the first token */
il += sl + 1; /* adjust the inbuf length ctr */
}
else /* no more room for added tokens */
done = 1; /* and we don't want junk added */
argv++;
argc--;
}
strupr( inbuf ); /* convert to upper case */
help( inbuf );
bye(0);
}
/****************************************************************************
*/
help( buf )
char *buf;
{
enum {BOTH, JUSTMENU, NONE} subj; /* choice of .HLM and menu */
int done = 0;
char lbuf[MAXLINELEN]; /* local temporary copy */
char tbuf[MAXLINELEN]; /* local token buffer */
char *bufptr;
int lbufl, bufl; /* buffer lengths */
subj = BOTH;
for( ;; ) /* loop until user is tired */
{
if ( !buf || !*buf ) /* was input specified? */
{
switch (subj) {
case BOTH:
more( HELPMAIN );
/* no break; ! */
case JUSTMENU:
allsel();
/* case NONE: does none of this */
}
subj = JUSTMENU;
setprompt();
fputs( prompt, stdout ); /* prompt user for input */
if ( fgets( buf, MAXLINELEN, stdin ) == NULL ) /* EOF or error */
return( -1 );
}
strupr( buf ); /* convert to upper case */
stripnl( buf ); /* get rid of new line */
if ( gettok( buf, STDDELIM, tbuf, lbuf ) == NULL ) /* no input token */
return( 0 );
strcpy( buf, lbuf ); /* for next pass */
if ( tbuf[0] == '?' ) /* redisplay current main help */
{
subj = BOTH;
}
else
{
/* go ahead and assume the input is a request for more help! */
bufptr = tbuf;
while (( status = outhelp( bufptr ) ) != -1 )
{
bufptr = NULL; /* flag for next iteration */
if ( status == 1 )
{ /* it was a subdir! */
if ( ( status = help( buf ) ) < 0) /* parse further... */
return( status ); /* EOF or error */
else
{
chdir( ".." ); /* go back up for dos */
subj = NONE; /* suppress printing of .HLM and menu */
}
}
/* else bottom-level help was found */
}
}
}
}
/****************************************************************************
* outhelp( filename ) - Output the given help file or ...
* char *filename; A text file name or directory name
*
*/
outhelp( filename )
char *filename;
{
static int counter;
char fullname[MAXLINELEN];
if (filename) { /* new filename (not a repeat) */
strcat(strcpy(fullname,filename),"*.HLP");
if ( !wildcard(fullname) ) {
fprintf( stdout, "\nSorry, no help found on '%s'\n", filename );
return( -1 ); /* no help available */
}
counter = 0;
} else if ( !dent[++counter][0] ) /* end of repeat search */
return( -1 );
if ( chdir(dent[counter]) == 0 ) /* see if it is a subdir by */
{ /* trying to go to it */
return( 1 ); /* tell caller we are there */
}
else {
more( dent[counter] ); /* output the file */
return( 0 );
}
}
/****************************************************************************
* allsel() print the topics available in this directory
*
* This function prints a directory of the help files and dirs within this
* dir. Extensions are stripped off.
*
*/
allsel()
{
int totalnames;
int counter;
int j;
int longlen;
int rowcnt;
int colcnt;
int namewidth;
char *s1;
char row[TERMWID+1];
if ( !(totalnames = wildcard( DEFSEARCH )) )
return( 0 );
for (counter = 0; counter < totalnames; counter++) {
s1 = dent[counter];
while (*s1 && *s1 != '.')
s1++;
*s1 = '\0'; /* get rid of extension */
}
/* this next section will be made into a subroutine */
/* rebuild code from here --\/ */
longlen = 0;
for(counter=0; counter < totalnames; counter++ )
longlen = ((j=strlen(dent[counter]))>longlen)?j:longlen;
/* here print the names out in nice columns */
namewidth = longlen + COLUMNSPACE;
rowcnt = TERMWID / namewidth;
colcnt = (totalnames + (rowcnt-1)) / rowcnt ;
if (colcnt <= 0)
colcnt = 1;
/* if (col_flag && rowcnt > 1) */
if ( rowcnt > 1 )
{
fprintf( stdout, "\n Topics:\n\n");
for(counter=0; counter < colcnt ; counter++ )
{
for(j=0; j < TERMWID; row[j++] = ' ');
row[j] = '\0';
for(j=0, s1 = row; (counter+j) < totalnames; j += colcnt)
{
row[strlen(row)] = ' ';
strcpy(s1,dent[counter+j]);
s1 = s1 + namewidth;
}
fprintf( stdout, " %s\n",row);
}
putchar('\n');
}
else
{
for(counter=0; counter < totalnames; counter++)
fprintf( stdout, "%s\n", dent[counter] );
}
/* to here --/\ */
return( 0 );
}
/*
* wildcard( filename ) searches out all wildcard matches for filename
* and puts them in dent[][]
*/
wildcard( filename )
char *filename;
{
register int j, counter, totalnames = 0;
static char tmpbuf[MAXLINELEN];
set_dta( dta );
while( ( dir_get( filename, ALL ) == 0 ) && ( totalnames < (MAXENT-1) ) )
{
filename = NULL;
strcpy(dent[totalnames++],&dta[30]);
}
dent[totalnames][0] = '\0'; /* terminating entry */
/* sort the names in ascending order with exchange algorithm */
for (counter = 0; counter < totalnames - 1; counter++)
for (j = counter+1; j <totalnames; j++)
if (strcmp(dent[counter],dent[j]) > 0)
{
strcpy( tmpbuf, dent[counter] );
strcpy( dent[counter], dent[j] );
strcpy( dent[j], tmpbuf );
}
return( totalnames );
}
int curr_disk()
{
union REGS rg;
rg.h.ah = 0x19;
int86( 0x21, &rg, &rg);
return( rg.h.al );
}
void select_disk(num)
int num;
{
union REGS rg;
rg.h.ah = 0x0e;
rg.h.dl = num;
int86( 0x21, &rg, &rg);
}
void set_dta( dta )
char *dta;
{
union REGS rg;
rg.h.ah = 0x1a;
rg.x.dx = ( unsigned int )dta;
int86( 0x21, &rg, &rg );
}
dir_get( fn, type )
char *fn;
int type;
{
union REGS rg;
if ( fn )
{
rg.x.dx = ( unsigned int )fn;
rg.x.cx = type;
rg.h.ah = 0x4e;
int86( 0x21, &rg, &rg );
if ( rg.x.cflag & 0x01 )
return( rg.x.ax );
}
else
{
rg.h.ah = 0x4f;
int86( 0x21, &rg, &rg );
if ( rg.x.cflag & 0x01 )
return( rg.x.ax );
}
return( 0 );
}
/****************************************************************************
* gettok( is, delim, tb, rb ) - Find token in input string
* char *is; Pointer to input string
* char *delim; Pointer to set of delimiting characters
* tb *tb Pointer to buffer to place token
* rb *rb Pointer to buffer to place ( input string - token )
*
* This function reads the input string looking for a token delimited by
* the beginning of the input buffer or a character in the delimiting set
* on the leading edge, and the end of the input buffer or a delimiting
* character on the trailing edge. The first character of the buffer
* which is not a character in the set of delimiting characters is taken as
* the first character of the token.
*
* If a pointer is passed in tb and/or rb, it is assumed to be a buffer of
* adequate size to hold the resultant string. A NULL may be passed in these
* variables if the result is not desired.
*
* Returns: A pointer to the first not delimiting character.
*/
char *gettok( is, delim, tb, rb )
char *is;
char *delim;
char *tb;
char *rb;
{
char *fc; /* pointer to first character of token */
fc = NULL; /* default no token found */
if ( tb ) /* if user gave us a token buffer */
*tb = 0; /* terminate the token buffer */
if ( rb ) /* if user gave us a remainder buffer */
*rb = 0; /* terminate the token buffer */
if ( is == NULL ) /* oops, got a 2001 */
return( NULL );
while ( *is && isdelim( *is, delim ) ) /* while leading delimiter */
is++; /* skip it */
if ( !*is )
return( NULL );
fc = is; /* save the pointer the first char */
while ( *is && !isdelim( *is, delim ) ) /* while not a delimiter */
{
if ( tb ) /* if user gave us a token buffer */
{
*tb = *is; /* move the character */
tb++; /* increment token buffer ptr */
}
is++;
}
if ( tb ) /* if user gave us a token buffer */
*tb = 0; /* terminate the token buffer */
if ( rb ) /* if user gave us a remainder buffer */
strcpy( rb, is ); /* copy the remainder */
return( fc );
}
isdelim( c, delim )
char c;
char *delim;
{
int dc; /* delimiter count */
int i; /* temporary counter */
char *tc; /* termporary pointer */
tc = delim; /* time to count the donuts */
dc = 0;
while ( *tc++ )
dc++;
for ( i=0; i<dc; i++ ) /* loop through the delimiters */
{
if ( c == delim[i] ) /* if a delimiter */
return( 1 ); /* return found */
}
return( 0 ); /* return not found */
}
more( fn )
char *fn;
{
FILE *sfd;
char buf[512];
int lct;
lct = 0;
scrnlen = DEFSCRLEN;
if ( ( sfd = fopen( fn, "r" ) ) != NULL ) /* got a file */
{
putchar('\n');
while( fgets( buf, 512, sfd ) )
{
if ( lct == scrnlen )
{
lct = 0;
if ( pgbrk() )
{
fclose( sfd );
return( 1 );
}
}
fputs( buf, stdout );
lct++;
}
fclose( sfd );
}
return( 0 );
}
pgbrk()
{
register int c,i;
static char moreprompt[] = "More? ";
printf( moreprompt );
c = kget();
putchar( '\r' );
for (i = sizeof(moreprompt); i--;) /* erase the prompt */
putchar( ' ' );
putchar( '\r' );
return ( c == 'N' );
}
void stripnl( buf )
char *buf;
{
while ( *buf )
{
if ( *buf == '\n' )
*buf = 0;
buf++;
}
}
void setprompt()
{
char *hs; /* pointer to the first / in helpdir */
char *cs; /* pointer to first / in current dir */
char *pp; /* pointer into prompt */
getcwd( currdir, MAXLINELEN );
hs = strchr( helpdir, '\\' ); /* ignore drive names */
cs = strchr( currdir, '\\' ); /* ignore drive names */
while ( *hs && ( *hs == *cs ) ) /* skip help directory root */
{
hs++;
cs++;
}
pp = prompt;
while ( *cs ) /* use the rest for the prompt */
{
switch (*cs) {
case '\\': /* convert to spaces for readability */
*pp++ = ' ';
cs++;
break;
case '.':
while (*++cs && *cs != '\\')
;
break;
default:
*pp++ = *cs++;
}
}
/* if ( pp != prompt ) /* not at root... */
*pp++ = ' '; /* add a pleasing space */
*pp = '\0'; /* terminate the string */
strcat( prompt, PROMPT ); /* and the default ending */
}
void fstobs( str )
char *str;
{
strupr( str ); /* dos only understands one case */
while ( *str )
{
if ( *str == '/' ) /* convert UNIX to MSDOS seps */
*str = '\\';
str++;
}
}
void handler()
{
int c;
if ( signal( SIGINT, handler ) < 0 ) /* uh oh */
{
fprintf( stderr, "%s could not set SIGINT. Action undefined upon INT\n", progname );
}
fprintf( stdout, "Terminate process [y|N]" );
c = kget();
fputc( '\n', stdout );
if ( c == 'Y' )
bye(0);
}
kget()
{
char c;
while ( kbhit() == 0 )
{
}
c = ( char )getche();
c = toupper( c );
return( c );
}
bye(status)
{
select_disk( olddisk );
chdir( olddir ); /* go back to our origin */
exit(status);
}
SHAR_EOF
if test 19751 -ne "`wc -c < 'help.c'`"
then
echo shar: error transmitting "'help.c'" '(should have been 19751 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'help.hlm'" '(344 characters)'
if test -f 'help.hlm'
then
echo shar: will not over-write existing file "'help.hlm'"
else
cat << \SHAR_EOF > 'help.hlm'
GNUPLOT is a command-driven interactive function plotting program. It
is case sensitive (commands and function names written in lowercase
are not the same as those written in CAPS). All command names may be
abbreviated, as long as the abbreviation is not ambiguous. Any number
of commands may appear on a line, separated by semicolons (;).
SHAR_EOF
if test 344 -ne "`wc -c < 'help.hlm'`"
then
echo shar: error transmitting "'help.hlm'" '(should have been 344 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'hrcgraph.asm'" '(7858 characters)'
if test -f 'hrcgraph.asm'
then
echo shar: will not over-write existing file "'hrcgraph.asm'"
else
cat << \SHAR_EOF > 'hrcgraph.asm'
TITLE Hercules graphics module
; Michael Gordon - 8-Dec-86
;
; Certain routines were taken from the Hercules BIOS of Dave Tutelman - 8/86
; Others came from pcgraph.asm included in GNUPLOT by Colin Kelley
;
; modified slightly by Colin Kelley - 22-Dec-86
; added junk below for MSC compact model, although it's probably not all
; necessary...
include header.mac
if1
include lineproc.mac
endif
GPg1_Base equ 0B800h ; Graphics page 1 base address
_text segment
public _H_line, _H_color, _H_mask, _HVmode, _H_puts
hpixel proc near
ror word ptr bmask,1
jc cont
ret
cont:
push ax
push bx
push cx
push dx
push si
mov cx,ax ; x
mov dx,bx ; y
;
; [couldn't this be done faster with a lookup table? -cdk]
;
; first compute the address of byte to be modified
; = 90*[row/4] + [col/8] + 2^D*[row/4] + 2^F*page
mov bh,cl ; col (low order) in BH
mov bl,dl ; row (low order) in BL
and bx,0703H ; mask the col & row remainders
IFDEF iAPX286
shr cx,3 ; col / 8
shr dx,2 ; row / 4
mov al,90
mul dx ; AX = 90*[ row/4 ]
add ax,cx ; ... + col/8
shl bl,5 ; align row remainder
ELSE ; same as above, obscure but fast for 8086
shr cx,1 ; divide col by 8
shr cx,1
shr cx,1
shr dx,1 ; divide row by 4
shr dx,1
shl dx,1 ; begin fast multiply by 90 (1011010 B)
mov ax,dx
shl dx,1
shl dx,1
add ax,dx
shl dx,1
add ax,dx
shl dx,1
shl dx,1
add ax,dx ; end fast multiply by 90
add ax,cx ; add on the col/8
shl bl,1 ; align row remainder
shl bl,1
shl bl,1
shl bl,1
shl bl,1
ENDIF
add ah,bl ; use aligned row remainder
end_adr_calc: ; address of byte is now in AX
mov dx,GPg1_Base ; base of pixel display to DX
mov es,dx ; ...and thence to segment reg
mov si,ax ; address of byte w/ pixel to index reg
mov cl,bh ; bit addr in byte
mov al,80H ; '1000 0000' in AL
shr al,cl ; shift mask to line up with bit to read/write
set_pix: ; set the pixel
or es:[si],al ; or the mask with the right byte
pop si
pop dx
pop cx
pop bx
pop ax
ret
hpixel endp
lineproc _H_line, hpixel
;
; clear - clear page 1 of the screen buffer to zero (effectively, blank
; the screen)
;
clear proc near
push es
push ax
push cx
push di
mov ax, GPg1_Base
mov es, ax
xor di, di
mov cx, 4000h
xor ax, ax
cld
rep stosw ; zero out screen page
pop di
pop cx
pop ax
pop es
ret
clear endp
beginproc _H_color
push bp
mov bp,sp
mov al,[bp+X] ; color
mov byte ptr color,al
pop bp
ret
_H_color endp
beginproc _H_mask
push bp
mov bp,sp
mov ax,[bp+X] ; mask
mov word ptr bmask,ax
pop bp
ret
_H_mask endp
HCtrl_Port equ 03B8H ; Hercules 6845 control port IO addr
HIndx_Port equ 03B4H ; Hercules 6845 index port IO addr
HScrn_Enable equ 008h ; Control port bit to enable video
HCh_Mode equ 020h ; Character output mode
HGr_Mode equ 082h ; Graphics output mode page 1
parm_count equ 12
beginproc _HVmode
push bp
mov bp, sp
push si
mov ax, [bp+X]
or ah, al
mov al, HCh_Mode ; Assume character mode is wanted
mov si, offset HCh_Parms
cmp ah, 0 ; nonzero means switch to graphics
jz vmode_ok
call near ptr clear ; clear the graphics page
mov al, HGr_Mode
mov si, offset HGr_Parms
vmode_ok:
mov dx, HCtrl_Port
out dx, al ; Set Hercules board to proper mode
call near ptr setParms ; Set the 6845 parameters
or al, HScrn_Enable ; Enable the video output
out dx, al
pop si
pop bp
ret
_HVmode endp
setParms proc near ; Send 6845 parms to Hercules board
push ax
push dx
push si
mov dx, HIndx_Port ; Index port addr -> DX
mov ah, 0 ; 0 -> parameter counter
sp_loop:
mov al, ah
out dx, al ; output to 6845 addr register
inc dx ; next output to data register
mov al, [si] ; next control byte -> al
inc si
out dx, al ; output control byte
dec dx ; 6845 index addr -> dx
inc ah ; bump addr
cmp ah, parm_count
jnz sp_loop
pop si
pop dx
pop ax
ret
setParms endp
; H_puts - print text in graphics mode
;
; cx = row
; bx = column
; si = address of string (null terminated) to print
beginproc _H_puts
push bp
mov bp, sp
push si
push ds
mov si, [bp+X] ; string offset
ifdef LARGE_DATA
mov ds, [bp+X+2] ; string segment
mov cx, [bp+X+4] ; row
mov bx, [bp+X+6] ; col
else
mov cx, [bp+X+2] ; row
mov bx, [bp+X+4] ; col
endif
ploop: lodsb ; get next char
or al, al ; end of display?
je pdone
call near ptr display
inc bx ; bump to next column
jmp ploop
pdone: pop ds
pop si
pop bp
ret
_H_puts endp
;
; display - output an 8x8 character from the IBM ROM to the Herc board
;
; AX = char, BX = column (0-89), CX = row(0-42) ** all preserved **
;
CON8 db 8
CON180 db 180
IBMROM equ 0F000h
CHARTAB equ 0FA6Eh
display proc near
push ds ; save the lot
push es
push ax
push bx
push cx
push dx
push si
push di
; setup ds -> IBM ROM, and si -> index into IBM ROM character table located
; at 0fa6eh in the ROM
and ax, 07fh
mul cs:CON8 ; mult by 8 bytes of table per char
mov si, ax
mov ax, IBMROM
mov ds, ax
assume ds:nothing
add si, CHARTAB ; add offset of character table
; compute index into Hercules screen memory for scan line 0. The remaining
; seven scan lines are all at fixed offsets from the first.
;
; Since graphics mode treats the screen as sets of 16x4 "characters",
; we need to map an 8x8 real character onto the front or back of
; a pair of graphics "characters". The first four scan lines of our
; 8x8 character will map to the top graphics "character", and the second
; four scan lines map to the graphics character on the "line" (4 scan
; lines high) below it.
;
; For some exotic hardware reason (probably speed), all scan line 0
; bits (i.e. every fourth scan line) are stored in memory locations
; 0-2000h in the screen buffer. All scan line 1 bits are stored
; 2000h-4000h. Within these banks, they are stored by rows. The first
; scan line on the screen (scan line 0 of graphics character row 0)
; is the first 45 words of memory in the screen buffer. The next 45
; words are the first scan line graphics row 1, and since graphics
; "characters" are 4 bits high, this second scan line is physically
; the fifth scan line displayed on the screen.
;
; SO, to display an 8x8 character, the 1st and 5th rows of dots are
; both scan line 0 of the graphics "character", the 2nd and 6th are
; scan line 1, and so on.
;
; The column (0-89) tells which byte in a scan line we need to load.
; Since it takes two rows of graphics characters to hold one row of
; our characters, column+90 is a index to scan line 4 rows of pixels
; higher (n+4). Thus 180 bytes of screen memory in any bank (0h, 2000h,
; 4000h, 6000h) represent a row of 8x8 characters.
;
; The starting location in screen memory for the first scan line of
; a character to be displayed will be: (row*180)+column
; The 5th scan line will be at: (row*180)+column+90
;
; The second and 6th scan lines will be at the above offsets plus
; the bank offset of 2000h. The third and 7th, add 4000h and finally
; the 4th and 8th, add 6000h.
;
mov ax, GPg1_Base
mov es, ax ; es = hercules page 0
mov ax, cx ; get row
mul cs:CON180 ; mult by 180(10)
mov di, ax ; di = index reg
cld ; insure right direction
;output 8 segments of character to video ram
lodsb ; line 0
mov es:[di+bx], al
lodsb
mov es:[di+bx+2000h], al ; line 1
lodsb
mov es:[di+bx+4000h], al ; line 2
lodsb
mov es:[di+bx+6000h], al ; line 3
lodsb
mov es:[di+bx+90], al ; line 4
lodsb
mov es:[di+bx+2000h+90], al ; line 5
lodsb
mov es:[di+bx+4000h+90], al ; line 6
lodsb
mov es:[di+bx+6000h+90], al ; line 7
pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop es
pop ds
ret
display endp
_text ends
_data segment
bmask dw -1
color db 1
_data ends
const segment
HCh_Parms db 61H, 50H, 52H, 0FH, 19H, 06H, 19H, 19H, 02H, 0DH, 0BH, 0CH
HGr_Parms db 35H, 2DH, 2EH, 07H, 5BH, 02H, 57H, 57H, 02H, 03H, 00H, 00H
const ends
end
SHAR_EOF
if test 7858 -ne "`wc -c < 'hrcgraph.asm'`"
then
echo shar: error transmitting "'hrcgraph.asm'" '(should have been 7858 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'lineproc.mac'" '(1980 characters)'
if test -f 'lineproc.mac'
then
echo shar: will not over-write existing file "'lineproc.mac'"
else
cat << \SHAR_EOF > 'lineproc.mac'
; lineproc.mac
; MASM macro definition for Bresenham line-drawing routine
; Colin Kelley
; January 13, 1987
INCAX equ 40h ; for Self-Modifying Code
INCBX equ 43h
DECAX equ 48h
DECBX equ 4bh
; usage:
; lineproc linename, pixelname
;
; where linemane is the name you want for the proc, and pixelname is the
; name of the routine that linename is to call to set pixels
;
lineproc macro linename, pixelname
beginproc linename
push bp
mov bp,sp
push si
push di
mov ax,[bp+X] ; x1
mov bx,[bp+X+2] ; y1
mov cx,[bp+X+4] ; x2
mov si,[bp+X+6] ; y2
cmp ax,cx ; x1,x2
jne i19
cmp bx,si ; y1,y2
jne i19
call pixelname
jmp i28
i19:
mov dx,ax ; dx,x1
sub dx,cx ; x2
jnc noabsx
neg dx
noabsx:
mov di,bx ; dy,y1
sub di,si ; y2
jnc noabsy
neg di ; dy
noabsy:
cmp dx,di ; dx,dy
jb i21 ; go iterate y's
;
; iterate x's
;
cmp bx,si ; y1,y2
jb forwardy
mov byte ptr cs:yinc1,DECBX
jmp short i22
forwardy:
mov byte ptr cs:yinc1,INCBX
i22:
cmp ax,cx ; x1,x2
jae l20004
mov byte ptr cs:xinc1,INCAX
jmp short l20005
l20004:
mov byte ptr cs:xinc1,DECAX
l20005:
mov bp,dx ; sum,dx
shr bp,1 ; sum
d23:
cmp ax,cx ; x1,x2
je i28 ; done
xinc1: inc ax ; may become inc or dec
add bp,di ; sum,dy
cmp bp,dx
jb i27
sub bp,dx ; sum,dx
yinc1: inc bx ; may become inc or dec
i27:
call pixelname
jmp short d23
;
; else iterate y's
;
i21:
cmp ax,cx ; x1,x2
jae l20006
mov byte ptr cs:xinc2,INCAX
jmp short l20007
l20006:
mov byte ptr cs:xinc2,DECAX
l20007:
cmp bx,si ; y1,y2
jb forwardy2
mov byte ptr cs:yinc2,DECBX
jmp short i29
forwardy2:
mov byte ptr cs:yinc2,INCBX
i29:
mov bp,di ; sum,dy
shr bp,1 ; sum,1
d30:
cmp bx,si ; y1,y2
je i28
yinc2: inc bx ; may become inc or dec
add bp,dx ; sum,dx
cmp bp,di ; sum,dy
jb i34
sub bp,di ; sum,dy
xinc2: inc ax ; may become inc or dec
i34:
call near ptr pixelname
jmp short d30
;
; clean up and exit
;
i28:
pop di
pop si
pop bp
ret
linename endp
endm
SHAR_EOF
if test 1980 -ne "`wc -c < 'lineproc.mac'`"
then
echo shar: error transmitting "'lineproc.mac'" '(should have been 1980 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'link.opt'" '(125 characters)'
if test -f 'link.opt'
then
echo shar: will not over-write existing file "'link.opt'"
else
cat << \SHAR_EOF > 'link.opt'
command+eval+graphics+internal+misc+parse+plot+scanner+standard+term+util+version+pcgraph+corgraph+hrcgraph,gnuplot,nul,ega;
SHAR_EOF
if test 125 -ne "`wc -c < 'link.opt'`"
then
echo shar: error transmitting "'link.opt'" '(should have been 125 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'make.msc'" '(1136 characters)'
if test -f 'make.msc'
then
echo shar: will not over-write existing file "'make.msc'"
else
cat << \SHAR_EOF > 'make.msc'
OBJS = command.obj eval.obj graphics.obj internal.obj misc.obj parse.obj plot.obj scanner.obj standard.obj term.obj util.obj version.obj pcgraph.asm corgraph.asm hrcgraph.asm
# /AC means use compact model (small code, large data)
CFLAGS = /AC /DPC #/Zi #/Od
TERMFLAGS = /DHERCULES /DATT6300 /DCORONA /DPOSTSCRIPT /DHP75 /DTEK /DV384 /DEGALIB
LINKFLAGS = #/codeview
# default rules
.c.obj:
msc $(CFLAGS) $*;
.asm.obj:
masm $*;
pcgraph.obj: pcgraph.asm header.mac lineproc.mac
corgraph.obj: corgraph.asm header.mac lineproc.mac
hrcgraph.obj: hrcgraph.asm header.mac lineproc.mac
command.obj: command.c plot.h
eval.obj: eval.c plot.h
graphics.obj: graphics.c plot.h
internal.obj: internal.c plot.h
misc.obj: misc.c plot.h
parse.obj: parse.c plot.h
plot.obj: plot.c plot.h
scanner.obj: scanner.c plot.h
standard.obj: standard.c plot.h
term.obj: term.c plot.h
msc $(CFLAGS) $(TERMFLAGS) term;
util.obj: util.c plot.h
version.obj: version.c
# use link.opt to avoid command-line overflow
gnuplot.exe: $(OBJS)
link$(LINKFLAGS) @link.opt
exepack gnuplot.exe gnupack.exe
del gnuplot.exe
ren gnupack.exe gnuplot.exe
SHAR_EOF
if test 1136 -ne "`wc -c < 'make.msc'`"
then
echo shar: error transmitting "'make.msc'" '(should have been 1136 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'pcgraph.asm'" '(3165 characters)'
if test -f 'pcgraph.asm'
then
echo shar: will not over-write existing file "'pcgraph.asm'"
else
cat << \SHAR_EOF > 'pcgraph.asm'
TITLE PC graphics module
; Colin Kelley
; December 22, 1986
; modified January 1987 to use LINEPROC.MAC
include header.mac
if1
include lineproc.mac
endif
_text segment
public _PC_line, _PC_color, _PC_mask, _PC_curloc, _PC_puts, _Vmode
public _save_stack, _ss_interrupt
extrn _interrupt:near
pcpixel proc near
ror word ptr linemask,1
jc cont
ret
cont:
push ax
push bx
push cx
push dx
push bp
mov cx,ax ; x
mov dx,bx ; y
mov ah,0ch ; ah = write pixel
mov al,byte ptr color
mov bh, 0 ; page 0
int 10h
pop bp
pop dx
pop cx
pop bx
pop ax
ret
pcpixel endp
lineproc _PC_line, pcpixel
_PC_color proc near
push bp
mov bp,sp
mov al,[bp+X] ; color
mov byte ptr color,al
pop bp
ret
_PC_color endp
_PC_mask proc near
push bp
mov bp,sp
mov ax,[bp+X] ; mask
mov word ptr linemask,ax
pop bp
ret
_PC_mask endp
_Vmode proc near
push bp
mov bp,sp
push si
push di
mov ax,[bp+X]
int 10h
pop di
pop si
pop bp
ret
_Vmode endp
_PC_curloc proc near
push bp
mov bp,sp
mov dh, byte ptr [bp+X] ; row number
mov dl, byte ptr [bp+X+2] ; col number
mov bh, 0
mov ah, 2
int 10h
pop bp
ret
_PC_curloc endp
;
; thanks to watale!broehl for finding a bug here--I wasn't pushing BP
; and reloading AH before INT 10H, which is necessary on genuine IBM
; boards...
;
_PC_puts proc near
push bp
mov bp,sp
push si
mov bl,byte ptr color
mov si,[bp+X] ; offset
ifdef LARGE_DATA
mov es,[bp+X+2] ; segment if large or compact data model
endif
puts2:
ifdef LARGE_DATA
mov al,es:[si]
else
mov al,[si]
endif
or al,al
jz puts3
mov ah,0eh ; write TTY char
int 10h
inc si
jmp short puts2
puts3: pop si
pop bp
ret
_PC_puts endp
; int kbhit();
; for those without MSC 4.0
; Use BIOS interrupt 16h to determine if a key is waiting in the buffer.
; Return nonzero if so.
;
beginproc _kbhit
mov ah, 1 ; function code 1 is keyboard test
int 16h ; keyboard functions
jnz kbfin ; Exit if char available
xor ax, ax ; No char: return zero.
kbfin: ret
_kbhit endp
; _save_stack and _ss_interrupt are needed due to a bug in the MSC 4.0
; code when run under MS-DOS 3.x. Starting with 3.0, MS-DOS automatically
; switches to an internal stack during system calls. This leaves SS:SP
; pointing at MS-DOS's stack when the ^C interrupt (INT 23H) is triggered.
; MSC should restore its own stack before calling the user signal() routine,
; but it doesn't.
;
; Presumably this code will be unnecessary in later releases of the compiler.
;
; _save_stack saves the current SS:SP to be loaded later by _ss_interrupt.
;
beginproc _save_stack
mov ax,ss
mov cs:save_ss,ax
mov ax,sp
mov cs:save_sp,ax
ret
_save_stack endp
; _ss_interrupt is called on ^C (INT 23H). It restores SS:SP as saved in
; _save_stack and then jumps to the C routine interrupt().
;
beginproc _ss_interrupt
cli ; no interrupts while the stack is changed!
mov ax,-1 ; self-modifying code again
save_ss equ this word - 2
mov ss,ax
mov sp,-1 ; here too
save_sp equ this word - 2
sti
jmp _interrupt ; now it's safe to call the real routine
_ss_interrupt endp
_text ends
const segment
linemask dw -1
color db 1
const ends
end
SHAR_EOF
if test 3165 -ne "`wc -c < 'pcgraph.asm'`"
then
echo shar: error transmitting "'pcgraph.asm'" '(should have been 3165 characters)'
fi
fi # end of overwriting check
# End of shell archive
exit 0
More information about the Comp.sources.unix
mailing list