home *** CD-ROM | disk | FTP | other *** search
- From: hot@integow.uucp (Roland van Hout)
- Newsgroups: alt.sources
- Subject: PD plot(4) librarys (and hercules driver for interactive 386) part 7 of 9
- Message-ID: <1395@integow.uucp>
- Date: 28 Oct 90 03:57:48 GMT
-
-
- #!/bin/sh
- # This is part 07 of a multipart archive
- if touch 2>&1 | fgrep '[-amc]' > /dev/null
- then TOUCH=touch
- else TOUCH=true
- fi
- # ============= libplot/cgi/libCGI.c ==============
- echo "x - extracting libplot/cgi/libCGI.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > libplot/cgi/libCGI.c &&
- X
- X/* plot(4) graphics library for the SCO CGI library under xenix*/
- X
- X
- X#include <stdio.h> /* for fprintf on stderr */
- X#include <ctype.h> /* we are using tolower() */
- X#define MAIN 1 /* causes declarations in the .h files to occur here */
- X#include "cgistuff.h" /* includes cgitypes.h and cgifctns.h */
- X#include "ctest.h"
- X#include <signal.h>
- X
- X/*VOID close_gin_device( VOID ); /* in gintests.c */
- X
- Xstatic char cgidisplay[]="CGIDISP ";
- Xstatic char cgiprinter[]="CGIPRNT ";
- Xchar * cgidevice = cgidisplay;
- Xstatic void usage_message();
- Xint vsl_type_returns;
- X
- X
- X
- X
- Xfloat gxscrunch,gyscrunch;
- Xfloat pitograd;
- Xint CGIoffx,CGIoffy;
- X
- X# include <stdio.h>
- X# include <fcntl.h>
- X# include "CGI.h"
- X# include <math.h>
- X
- X herc_args CGIhv,CGIcurpos;
- X
- X/* #define DEBUG /* turn on if no driver calls should be made!*/
- X
- Xopenpl()
- X{
- X
- X int strlen( char * );
- X#ifndef NO_DEBUGGING
- X#ifndef MSDOS
- X#ifdef CGIVER
- X extern int scodebug; /* declared in the bindings in v_opnwk.c */
- X#else
- X extern int cgidebug; /* declared in the bindings in v_opnwk.c */
- X#endif
- X#endif
- X#endif
- X /* setting to TRUE will cause the bindings */
- X /* to print out the execl command rather */
- X /* than executing it when they are forking */
- X /* the agents. */
- X /* local variables */
- X SINT16 coord_xform_mode;
- X char *char_pointer;
- X register SINT16 i;
- X char * char_ptr;
- X int defer_mode;
- X int use_defaults;
- X
- X
- X
- X use_defaults = TRUE;
- X
- X manual_operation = FALSE; /* m flag */
- X do_timings = FALSE; /* t flag */
- X defer_mode = ASAP; /* b flag sets to (BNI), or a sets to (ASTI) */
- X coord_xform_mode = 0; /* selected with 0, 1, 2, or 3 */
- X
- X
- X#ifndef NO_DEBUGGING
- X#ifndef MSDOS
- X#ifdef CGIVER
- X if ( scodebug )
- X {
- X printf( "\nExecute the desired agent with these 4 arguments on a console screen:\n" );
- X }
- X else
- X#else
- X if ( cgidebug )
- X {
- X printf( "\nExecute the desired agent with these 4 arguments on a console screen:\n" );
- X }
- X else
- X#endif
- X#endif
- X#endif
- X
- X ok_to_use_graphtext = FALSE;
- X
- X if ( cgistart( coord_xform_mode, defer_mode ) )
- X {
- X fprintf( stderr, "plotcgi: message: open failed, ctest will exit.\n" );
- X fprintf( stderr, "plotcgi: requires environment variables:\n" );
- X fprintf( stderr, "CGIPATH= <- specify pathname for location of CGI agents.\n" );
- X fprintf( stderr, "CGIDISP= <- specify agent name for display\n" );
- X/* fprintf( stderr, "or CGIPRNT= <- alternate agent name when running plotcgi with -p option.\n" );*/
- X fprintf( stderr, "(instead of CGIPATH, you may need VDIPATH for CGI ver. 1.0 bindings.)\n" );
- X exit (-1);
- X }
- X
- X /* set up the color palettes */
- X original_palette();
- X normal_graphtext(); /* adjusts graphtext size */
- X
- X
- X /* CGI starts up in graphics mode */
- X ok_to_use_graphtext = TRUE;
- X
- X /* The workstation should already be clear at this time. */
- X
- X CGIcurpos=CGIhv;
- X linemod("solid");
- X}
- X
- Xclosepl()
- X{
- X#ifndef DEBUG
- X if (isatty(0)) getchar(); /* stdin is a tty then leave the
- X screen until a character is pressed */
- X /* close the workstation*/
- X if ( v_clswk(dev_handle) < 0 )
- X report_cgi_error( "v_clswk" );
- X#endif
- X}
- X
- Xspace(x0,y0,x1,y1)
- Xint x0,y0,x1,y1;
- X{
- Xint x,y;
- Xpitograd=(180.0/M_PI);
- X
- Xif (x1>0 && y1>0 && y0<y1 && x0<x1) {
- X x=x1-x0;y=y1-y0;
- X gxscrunch=(VDC_X/(float) x);gyscrunch=(VDC_Y/(float) y);
- X CGIoffx = (-1 *(x0*gxscrunch) + 1);
- X CGIoffy=(y0*gyscrunch)-1;
- X}
- X
- X#ifdef DEBUG
- Xprintf("offx=%d, offy=%d\n",CGIoffx,CGIoffy);
- X#endif
- X
- X}
- X
- Xerase()
- X{
- X#ifndef DEBUG
- X if (isatty(0)) getchar(); /* stdin is a tty then leave the
- X screen until a character is pressed */
- X v_clrwk(dev_handle);
- X#endif
- X}
- X
- Xlabel(s)
- Xchar *s;
- X{
- X#ifndef DEBUG
- X v_gtext(dev_handle, CGIcurpos.x1,CGIcurpos.y1,s);
- X#else
- X printf("str=%s, x=%d, y=%d\n",s,CGIhv.x1,CGIhv.y1);
- X#endif
- X}
- X
- Xmove(x,y)
- Xint x,y;
- X{
- XSINT16 row,column;
- X x = x*gxscrunch;
- X y = y*gyscrunch;
- X y += CGIoffy ;
- X x += CGIoffx ;
- X CGIcurpos.x1 = x; CGIcurpos.y1 = y;
- X column = x; row = y;
- X vs_curaddress(dev_handle,row,column);
- X#ifdef DEBUG
- X printf("move %d, %d\n",x,y);
- X#endif
- X
- X}
- X
- Xcont(x,y)
- Xint x,y;
- X{
- X int xo,yo;
- X
- X int line_spacing;
- X int start_line;
- X SINT16 polyline_array[256];
- X
- X xo = x*gxscrunch;
- X yo = y*gyscrunch;
- X yo += CGIoffy ;
- X xo += CGIoffx ;
- X /* leave room for 5 lines of text at the top */
- X start_line = VDC_Y - (5 * cell_height);
- X line_spacing = start_line / (LINE_TYPES+1);
- X
- X
- X /* draw each line type across the screen in default color */
- X polyline_array[0] = CGIcurpos.x1; /* x1 */
- X polyline_array[2] = xo; /* x2 */
- X polyline_array[1] = CGIcurpos.y1;/*y1*/
- X polyline_array[3] = yo; /* y2 */
- X CGIhv.c = CGIcurpos.c;
- X#ifndef DEBUG
- X if ( v_pline( dev_handle, 2, polyline_array ) < 0 )
- X report_cgi_error( "v_pline" );
- X#else
- X printf("cont = line from %d,%d to %d,%d\n",CGIhv.x1,CGIhv.y1,CGIhv.x2,CGIhv.y2);
- X#endif
- X CGIcurpos.x1=xo;CGIcurpos.x2=yo;
- X}
- X
- Xline (x1, y1, x2, y2)
- Xint x1,y1,x2,y2;
- X{
- X move(x1,y1);
- X cont(x2,y2);
- X}
- Xcircle(x,y,r)
- Xint x,y,r;
- X{
- XSINT16 xo,yo,ro;
- X xo=(x*gxscrunch);yo=(y*gyscrunch);
- X yo = CGIoffy + yo;
- X xo = CGIoffx + xo;
- X ro = (r * gxscrunch);
- X v_circle(dev_handle,xo,yo,ro);
- X}
- X
- Xarc(x,y,x0,y0,x1,y1)
- Xint x,y,x0,y0,x1,y1;
- X{
- X#ifdef ARC
- Xfloat a1,a2,r1,r2;
- XSINT16 xo,yo,c1,c2,r;
- X if ((x-x0) > 0) {
- X r1=(y-y0)/(x-x0);
- X a1=atan(r1);
- X c1=(a1*pitograd*10);
- X }
- X else {
- X c1=1800;
- X }
- X if ((x-x1) > 0) {
- X r2=(y-y1)/(x-x1);
- X a2=atan(r2);
- X c2=(a2*pitograd*10);
- X }
- X else {
- X c2=1800;
- X }
- X
- X xo=(x0*gxscrunch);yo=(y0*gyscrunch);
- X yo = CGIoffy + yo;
- X xo = CGIoffx + xo;
- X v_arc(dev_handle, xo,yo, ,c1,c2);
- X#endif
- X}
- X
- Xdot(xi,yi,dx,n,pat)
- Xint xi,yi,dx,n,pat[256];
- X{
- X}
- X
- Xpoint(x,y)
- Xint x,y;
- X{
- Xint xo,yo;
- X xo = x*gxscrunch;
- X yo = y*gyscrunch;
- X yo += CGIoffy ;
- X xo += CGIoffx ;
- X CGIcurpos.x1 = xo; CGIcurpos.y1 = yo;
- X#ifndef DEBUG
- X move(x,y);
- X cont(x,y);
- X#else
- X printf("point %d,%d\n",x,y);
- X#endif
- X}
- X
- Xlinemod(s)
- Xchar *s;
- X{
- XSINT16 line_type;
- X if (strcmp(s,"dotted")==0) {
- X line_type = 3;
- X }
- X else if (strcmp(s,"solid")==0) {
- X line_type = 1;
- X }
- X else if (strcmp(s,"longdashed")==0) {
- X line_type = 2;
- X }
- X else if (strcmp(s,"shortdashed")==0) {
- X line_type = 7;
- X }
- X else if (strcmp(s,"dotdashed")==0) {
- X line_type = 4;
- X }
- Xif ( (vsl_type_returns = vsl_type( dev_handle, line_type )) < 0)
- X report_cgi_error( "vsl_type" );
- X}
- X
- X
- Xbox(x0, y0, x1, y1)
- X{
- X move(x0, y0);
- X cont(x0, y1);
- X cont(x1, y1);
- X cont(x1, y0);
- X cont(x0, y0);
- X move(x1, y1);
- X}
- SHAR_EOF
- $TOUCH -am 1014213390 libplot/cgi/libCGI.c &&
- chmod 0666 libplot/cgi/libCGI.c ||
- echo "restore of libplot/cgi/libCGI.c failed"
- set `wc -c libplot/cgi/libCGI.c`;Wc_c=$1
- if test "$Wc_c" != "6196"; then
- echo original size 6196, current size $Wc_c
- fi
- # ============= libplot/cgi/README ==============
- echo "x - extracting libplot/cgi/README (Text)"
- sed 's/^X//' << 'SHAR_EOF' > libplot/cgi/README &&
- XThe following files are not included because of SCO copyrights:
- Xcgifctns.h cgistart.c cgistuff.c cgistuff.h cgitypes.h ctest.h gtexttests.c
- XIf you get Xenix with CGI you will get these files anyway.
- SHAR_EOF
- $TOUCH -am 1014213590 libplot/cgi/README &&
- chmod 0644 libplot/cgi/README ||
- echo "restore of libplot/cgi/README failed"
- set `wc -c libplot/cgi/README`;Wc_c=$1
- if test "$Wc_c" != "199"; then
- echo original size 199, current size $Wc_c
- fi
- # ============= libplot/cgi/h.c ==============
- echo "x - extracting libplot/cgi/h.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > libplot/cgi/h.c &&
- X# include <stdio.h>
- X# include <fcntl.h>
- X# include <math.h>
- X
- Xmain(argc, argv)
- Xint argc;
- Xchar *argv[];
- X{
- X int i,j;
- X char strbuff[90];
- X
- X openpl();space(0,0,720,350);
- X for (j=1;j<=100;j++) {
- X erase();
- X move(280,280);
- X /* Do some random dots */
- X label("Some random dots.");
- X for (i = 0; i < 100; i ++)
- X {
- X point( abs(lrand48() % 719),abs(lrand48() % 347));
- X };
- X/* sleep(10);
- X /* Do some random lines */
- X erase();
- X move(280,280);
- X /* Do some random dots */
- X label("Some random lines.");
- X for (i = 0; i < 50; i ++)
- X {
- X line( abs(lrand48() % 719),abs(lrand48() % 347),abs(lrand48() % 719),abs(lrand48() % 347));
- X };
- X }
- X closepl();
- X}
- SHAR_EOF
- $TOUCH -am 0511152090 libplot/cgi/h.c &&
- chmod 0666 libplot/cgi/h.c ||
- echo "restore of libplot/cgi/h.c failed"
- set `wc -c libplot/cgi/h.c`;Wc_c=$1
- if test "$Wc_c" != "627"; then
- echo original size 627, current size $Wc_c
- fi
- # ============= lp.c ==============
- echo "x - extracting lp.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > lp.c &&
- X/* @(#)driver.c 5.1 */
- X#include <stdio.h>
- X#include <math.h>
- X#include <errno.h>
- X#include "plotlpus.h"
- X
- Xfloat deltx = 4095.0;
- Xfloat delty = 4095.0;
- X
- Xmain(argc,argv) char **argv; {
- X int std=1;
- X FILE *fin;
- X
- X while(argc-- > 1) {
- X if(*argv[1] == '-')
- X switch(argv[1][1]) {
- X case 'l':
- X deltx = atoi(&argv[1][2]) - 1;
- X break;
- X case 'w':
- X delty = atoi(&argv[1][2]) - 1;
- X break;
- X case 's':
- X printer=LASERLOW;
- X break;
- X case 'm':
- X printer=LASERMED;
- X break;
- X case 'h':
- X printer=LASERHIGH;
- X break;
- X case 'i':
- X printer=IBM_PRO;
- X break;
- X case 'e':
- X printer=EPSON;
- X break;
- X }
- X
- X else {
- X std = 0;
- X if ((fin = fopen(argv[1], "r")) == NULL) {
- X fprintf(stderr, "can't open %s\n", argv[1]);
- X exit(1);
- X }
- X fplt(fin);
- X }
- X argv++;
- X }
- X if (std)
- X fplt( stdin );
- X exit(0);
- X }
- X
- X
- Xfplt(fin) FILE *fin; {
- X int c;
- X char s[256];
- X int xi,yi,x0,y0,x1,y1,r,dx,n,i;
- X int pat[256];
- X
- X openpl();
- X while((c=getc(fin)) != EOF){
- X switch(c){
- X case 'm':
- X xi = getsi(fin);
- X yi = getsi(fin);
- X move(xi,yi);
- X break;
- X case 'l':
- X x0 = getsi(fin);
- X y0 = getsi(fin);
- X x1 = getsi(fin);
- X y1 = getsi(fin);
- X line(x0,y0,x1,y1);
- X break;
- X case 't':
- X getsd(s,fin);
- X label(s);
- X break;
- X case 'e':
- X erase();
- X break;
- X case 'p':
- X xi = getsi(fin);
- X yi = getsi(fin);
- X point(xi,yi);
- X break;
- X case 'n':
- X xi = getsi(fin);
- X yi = getsi(fin);
- X cont(xi,yi);
- X break;
- X case 's':
- X x0 = getsi(fin);
- X y0 = getsi(fin);
- X x1 = getsi(fin);
- X y1 = getsi(fin);
- X space(x0,y0,x1,y1);
- X break;
- X case 'a':
- X xi = getsi(fin);
- X yi = getsi(fin);
- X x0 = getsi(fin);
- X y0 = getsi(fin);
- X x1 = getsi(fin);
- X y1 = getsi(fin);
- X arc(xi,yi,x0,y0,x1,y1);
- X break;
- X case 'c':
- X xi = getsi(fin);
- X yi = getsi(fin);
- X r = getsi(fin);
- X circle(xi,yi,r);
- X break;
- X case 'f':
- X getsd(s,fin);
- X linemod(s);
- X break;
- X case 'd':
- X xi = getsi(fin);
- X yi = getsi(fin);
- X dx = getsi(fin);
- X n = getsi(fin);
- X for(i=0; i<n; i++)pat[i] = getsi(fin);
- X dot(xi,yi,dx,n,pat);
- X break;
- X }
- X }
- X closepl();
- X }
- Xgetsi(fin) FILE *fin; { /* get an integer stored in 2 ascii bytes. */
- X short a, b;
- X if((b = getc(fin)) == EOF)
- X return(EOF);
- X if((a = getc(fin)) == EOF)
- X return(EOF);
- X a = a<<8;
- X return(a|b);
- X}
- Xgetsd(s,fin) char *s; FILE *fin; {
- X for( ; *s = getc(fin); s++)
- X if(*s == '\n')
- X break;
- X *s = '\0';
- X return;
- X}
- X
- X
- Xmatherr(x)
- Xstruct exception *x;
- X{
- Xif(x->type==DOMAIN)
- X {errno=EDOM;
- X if(!strcmp("log",x->name))x->retval = (-HUGE);
- X else x->retval = 0;
- X return(1);
- X }
- Xelse if ((x->type)==SING)
- X {errno=EDOM;
- X x->retval = (-HUGE);
- X return(1);
- X }
- Xelse return(0);
- X}
- X
- X
- SHAR_EOF
- $TOUCH -am 1014215790 lp.c &&
- chmod 0644 lp.c ||
- echo "restore of lp.c failed"
- set `wc -c lp.c`;Wc_c=$1
- if test "$Wc_c" != "2654"; then
- echo original size 2654, current size $Wc_c
- fi
- # ============= herc/Makefile ==============
- if test ! -d 'herc'; then
- echo "x - creating directory herc"
- mkdir 'herc'
- fi
- echo "x - extracting herc/Makefile (Text)"
- sed 's/^X//' << 'SHAR_EOF' > herc/Makefile &&
- X# define IX386 for Interactive 386
- XDEFINES=-DIX386
- XCFLAGS=$(DEFINES)
- X
- Xherc.o: herc.c herc.h
- X cc -c $(DEFINES) -DINKERNEL herc.c
- X
- X# must be root to make install
- Xinstall: herc.o
- X cp herc.o herc.c herc.h config Makefile /etc/atconf/modules/herc
- X mkunix
- X mv /etc/atconf/kernels/unix.std.* /unix.test
- X
- X# must be root to make filesys
- X# also edit /etc/atconf/systems/system.std to enter herc as device with
- X# major device number 15
- Xfilesys:
- X mknod /dev/herc c 15 0
- X chmod ugo+rwx /dev/herc
- X mkdir /etc/atconf/modules/herc
- X
- Xtest: test.o herc.h
- X cc -o test $(DEFINES) test.o
- X
- Xprint:
- X srcpub herc.h test.c herc.c config Makefile >PRINT
- X trj PRINT
- X offjet tr.PRINT
- SHAR_EOF
- $TOUCH -am 1014125090 herc/Makefile &&
- chmod 0644 herc/Makefile ||
- echo "restore of herc/Makefile failed"
- set `wc -c herc/Makefile`;Wc_c=$1
- if test "$Wc_c" != "658"; then
- echo original size 658, current size $Wc_c
- fi
- # ============= herc/bitset.h ==============
- echo "x - extracting herc/bitset.h (Text)"
- sed 's/^X//' << 'SHAR_EOF' > herc/bitset.h &&
- Xstatic char SCCS_x[] = "%W% %G% %U%";
- X/*+++
- X bitset.h
- X
- X PURPOSE : bit manipulation macros
- X
- X DATE : 2/15/90
- X
- X AUTHOR : W. Hatch
- X
- X PROJECT : WEH Software
- X
- X COMPANY : Computational Engineering
- X 14504 Greenview Drive Suite 500
- X Laurel, Maryland 20708
- X Phone (301)470-3839
- X FAX (301)776-5461
- X
- X CREDITS : Harbison And Steele, A C Reference Manual
- X Prentice Hall, 1984, Pages 172-180
- X
- X---*/
- X/*
- X------------------------------------------------------------------------
- X MODIFICATIONS
- XDATE-PROGRAMMER DESCRIPTION
- X------------------------------------------------------------------------
- X*/
- X
- X#define SET unsigned long
- X#define SET_BITS (sizeof(SET) * 8) /* number of bits in SET */
- X
- X#define VALIDBIT(i) ((i) < SET_BITS && (i) >= 0)
- X
- X#define EMPTYSET ((SET) 0)
- X#define SINGLESET(i) (((SET) 1) << (i))
- X#define DOSET(set,i) ((set | (SINGLESET(i))))
- X#define AND(set1,set2) ((set1) & (set2))
- X#define OR(set1, set2) ((set1) | (set2))
- X#define XOR(set1, set2) ((set1) ^ (set2))
- X#define ISSET(i,set) (SINGLESET((i)) & (set))
- X#define MASKSET(set,mask) ((set) & (mask) == (mask))
- SHAR_EOF
- $TOUCH -am 1013182190 herc/bitset.h &&
- chmod 0644 herc/bitset.h ||
- echo "restore of herc/bitset.h failed"
- set `wc -c herc/bitset.h`;Wc_c=$1
- if test "$Wc_c" != "1086"; then
- echo original size 1086, current size $Wc_c
- fi
- # ============= herc/config ==============
- echo "x - extracting herc/config (Text)"
- sed 's/^X//' << 'SHAR_EOF' > herc/config &&
- X* 1 "herc/config.c
- X
- X*ident "@(#)config
- X
- Xcharacter(9)
- X
- Xprefix = herc
- X
- Xfunctions = init, open, close, read, write, ioctl
- X
- SHAR_EOF
- $TOUCH -am 1013182190 herc/config &&
- chmod 0644 herc/config ||
- echo "restore of herc/config failed"
- set `wc -c herc/config`;Wc_c=$1
- if test "$Wc_c" != "121"; then
- echo original size 121, current size $Wc_c
- fi
- # ============= herc/herc.c ==============
- echo "x - extracting herc/herc.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > herc/herc.c &&
- Xstatic char SCCS_hercdent[] = "%W% %G% %U%";
- X/*======================================================================*/
- X/* herc.c - hercules graphics card driver for Microport V386/3.0e */
- X/* */
- X/* 2/5/90 */
- X/* Bill Hatch */
- X/* uunet!bts!bill */
- X/* Computational Engineering */
- X/* 14504 Greenview Drive Suite 500 */
- X/* Laurel, Maryland 20708 */
- X/* Phone (301)470-3839 */
- X/* */
- X/* see herc.h for credits to other programmers and authors */
- X/*======================================================================*/
- X#include "herc.h"
- Xextern char *sptalloc();
- Xextern int sptfree();
- Xextern unsigned char inb();
- X
- X/*----------------------------------------------------------------------*/
- X/* settings for 6845 chips data registers for graphics and text modes */
- X/*----------------------------------------------------------------------*/
- Xstatic int gdata[12] = {0x35, 0x2d, 0x2e, 0x7, 0x5b, 0x2, 0x57, 0x57, 0x2,
- X 0x3, 0x0, 0x0};
- Xstatic int tdata[12] = {0x61, 0x50, 0x52, 0xf, 0x19, 0x6, 0x19, 0x19, 0x2,
- X 0xd, 0xb, 0xc};
- X
- Xstatic char *myvaddr;
- Xstatic char *vaddr0;
- Xstatic char *vaddr1;
- Xstatic int g_mode();
- Xstatic int t_mode();
- X
- Xstatic int clearscreen();
- Xstatic int wait_for_retrace();
- X
- X/*======================================================================*/
- X/* hercinit - nothing done */
- X/*======================================================================*/
- Xhercinit(dev)
- Xint dev;
- X{
- X u.u_error = 0;
- X return;
- X}
- X/*======================================================================*/
- X/* hercopen - enable graphics and clear screen */
- X/*======================================================================*/
- Xhercopen(dev,flag)
- Xint dev;
- Xint flag;
- X{
- X int i;
- X
- X /*--------------------------------------------------------------*/
- X /* map herc graphics pages to virtual memory and set myvaddr */
- X /* to page 0 */
- X /*--------------------------------------------------------------*/
- X if((vaddr0=sptalloc(HERC_SIZE,PG_P, HERC_PAGE_0,0)) == (char *)0 ||
- X (vaddr1=sptalloc(HERC_SIZE,PG_P, HERC_PAGE_1,0)) == (char *)0)
- X {
- X KERROR("hercopen: sptalloc() failed");
- X u.u_error = 1;
- X return;
- X }
- X myvaddr = vaddr0;
- X /*--------------------------------------------------------------*/
- X /* clear both pages of graphics memory */
- X /*--------------------------------------------------------------*/
- X#ifdef DBUG
- X printf("hercopen: vaddr0: %d, vaddr1: %d, \n", vaddr0, vaddr1);
- X#endif
- X /*--------------------------------------------------------------*/
- X /* switch to graphics mode */
- X /*--------------------------------------------------------------*/
- X if(g_mode() < 0)
- X {
- X KERROR("hercopen: g_mode() failed");
- X u.u_error = 1;
- X return;
- X }
- X clearscreen(vaddr0);
- X clearscreen(vaddr1);
- X u.u_error = 0;
- X return;
- X}
- X/*======================================================================*/
- X/* hercclose - close the herc device */
- X/*======================================================================*/
- Xhercclose(dev)
- Xint dev;
- X{
- X clearscreen(vaddr0);
- X clearscreen(vaddr1);
- X /*--------------------------------------------------------------*/
- X /* switch to text mode */
- X /*--------------------------------------------------------------*/
- X t_mode();
- X /*--------------------------------------------------------------*/
- X /* free mapped virtual memory */
- X /*--------------------------------------------------------------*/
- X sptfree(vaddr0, HERC_SIZE,0);
- X sptfree(vaddr1, HERC_SIZE,0);
- X
- X#ifdef DBUG
- X printf("hercclose:\n");
- X#endif
- X u.u_error = 0;
- X return;
- X}
- X/*======================================================================*/
- X/* hercioctl - does nothing */
- X/*======================================================================*/
- Xhercioctl(dev, cmd, arg)
- Xint dev;
- Xint cmd;
- XHERC *arg;
- X{
- X
- X u.u_error = 0;
- X return;
- X}
- Xhercread(dev)
- Xint dev;
- X{
- X}
- X/*======================================================================*/
- X/* hercwrite - perform all herc graphics operations */
- X/*======================================================================*/
- Xhercwrite(dev)
- Xint dev;
- X{
- X HERC *arg;
- X HERC herc;
- X unsigned char *pc;
- X int x;
- X int y;
- X int cmd;
- X int i;
- X
- X unsigned char byte;
- X int byteloc;
- X int myint;
- X
- X pc = (unsigned char *)(&herc);
- X arg = (&herc);
- X for(i=0; i < sizeof(HERC); i++)
- X {
- X if( (myint = cpass()) < 0)
- X {
- X printf("i= %d\n", i);
- X KERROR("hercwrite: cpass failed");
- X u.u_error = 1;
- X return;
- X }
- X pc[i] = myint;
- X }
- X /************ an alternate, untested way of accomplishing the above
- X if(copyin(&u.u_base, arg, sizeof(HERC)) != SUCCESS)
- X {
- X printf("u.u_count: %d, u.u_base: %d, u.u_offset: %d\n",
- X u.u_count, u.u_base, u.u_offset);
- X printf("sizeof(HERC): %d\n", sizeof(HERC));
- X KERROR("hercwrite: copyin() failed");
- X u.u_error = 1;
- X return;
- X }
- X **********/
- X#ifdef DBUG
- X printf("hercwrite: x: %d, y: %d, cmd: %d\n",
- X arg->phys_x, arg->phys_y, arg->cmd);
- X#endif
- X /*--------------------------------------------------------------*/
- X /* extract and validate HERC contents */
- X /*--------------------------------------------------------------*/
- X if((x=arg->phys_x) > PHYS_X_MAX || x < PHYS_X_MIN
- X || (y=arg->phys_y) > PHYS_Y_MAX || y < PHYS_Y_MIN)
- X {
- X KERROR("hercwrite: illegal arg");
- X printf("arg: %d, cmd: %d, x: %d, y: %d\n",
- X arg, arg->cmd, x, y);
- X u.u_error = 1;
- X return;
- X }
- X cmd = arg->cmd;
- X /*--------------------------------------------------------------*/
- X /* compute offset of byte to be acted on */
- X /*--------------------------------------------------------------*/
- X if(cmd == SET_PIXEL || cmd == CLEAR_PIXEL || cmd == REVERSE_PIXEL)
- X {
- X byteloc = BYTE_OFFSET(x,y);
- X }
- X
- X /*--------------------------------------------------------------*/
- X /* perform action */
- X /*--------------------------------------------------------------*/
- X switch(cmd)
- X {
- X case SET_PIXEL:
- X SET_BIT(myvaddr[byteloc], x);
- X break;
- X
- X case CLEAR_PIXEL:
- X CLEAR_BIT(myvaddr[byteloc], x);
- X break;
- X
- X case REVERSE_PIXEL:
- X REVERSE_BIT(myvaddr[byteloc], x);
- X break;
- X
- X case CLEAR_SCREEN_0:
- X clearscreen(vaddr0);
- X break;
- X
- X case CLEAR_SCREEN_1:
- X clearscreen(vaddr1);
- X break;
- X
- X /* this switch screen does not work, any comments or */
- X /* suggestions are welcome WEH 2/17/90 */
- X case SWITCH_SCREEN_0:
- X myvaddr = vaddr0;
- X wait_for_retrace();
- X if(outb(DMC_PORT, DMC_PAGE_0) == FAILURE)
- X {
- X KERROR("hercwrite: outb() failed ");
- X return(FAILURE);
- X }
- X break;
- X
- X case SWITCH_SCREEN_1:
- X myvaddr = vaddr1;
- X wait_for_retrace();
- X if(outb(DMC_PORT, DMC_PAGE_1) == FAILURE)
- X {
- X KERROR("hercwrite: outb() failed ");
- X return(FAILURE);
- X }
- X break;
- X }
- X u.u_error = 0;
- X return;
- X}
- X/*======================================================================*/
- X/* clearscreen - turn all pixels off */
- X/*======================================================================*/
- Xstatic int clearscreen(vaddr)
- Xchar *vaddr;
- X{
- X unsigned int i;
- X for(i = 0; i < HERC_PAGE_BYTES; i++)
- X {
- X vaddr[i] = 0;
- X }
- X return(SUCCESS);
- X}
- X/*======================================================================*/
- X/* g_mode - switch to graphics mode */
- X/*======================================================================*/
- Xstatic int g_mode()
- X{
- X int i;
- X unsigned char dmcbyte = (DMC_GRAPHICS|DMC_ON_SCREEN|DMC_PAGE_0);
- X /*--------------------------------------------------------------*/
- X /* enable both graphics pages and turn display off */
- X /*--------------------------------------------------------------*/
- X wait_for_retrace();
- X if(outb(CONFIG_SWITCH, CF_PAGE_0) == FAILURE ||
- X outb(DMC_PORT, DMC_OFF_SCREEN) == FAILURE)
- X {
- X KERROR("g_mode: outb() to DMC_PORT or CONFIG_SWITCH failed");
- X return(FAILURE);
- X }
- X /*--------------------------------------------------------------*/
- X /* set hardware parameters for graphics mode, failure to do this*/
- X /* may damage the video tube */
- X /*--------------------------------------------------------------*/
- X for(i = 0; i < 12; i++)
- X {
- X if(outb(INDEX_REG_6845, i) == FAILURE ||
- X outb(DATA_REG_6845, gdata[i]) == FAILURE)
- X {
- X KERROR("g_mode: outb() to DATA or INDEX REG failed");
- X return(FAILURE);
- X }
- X }
- X /*--------------------------------------------------------------*/
- X /* on retrace, enable graphics and turn display on */
- X /*--------------------------------------------------------------*/
- X wait_for_retrace();
- X if(outb(DMC_PORT, dmcbyte) == FAILURE)
- X {
- X KERROR("g_mode: outb(DMC_PORT, DMC_GRAPHICS) failed ");
- X return(FAILURE);
- X }
- X return(SUCCESS);
- X}
- X/*======================================================================*/
- X/* t_mode - switch to text mode */
- X/*======================================================================*/
- Xstatic int t_mode()
- X{
- X int i;
- X unsigned char dmcbyte = (DMC_ON_SCREEN|DMC_TEXT);
- X /*--------------------------------------------------------------*/
- X /* turn display off */
- X /*--------------------------------------------------------------*/
- X if(outb(DMC_PORT, DMC_OFF_SCREEN) == FAILURE)
- X {
- X KERROR("t_mode: outb to DMC_PORTT) failed ");
- X return(FAILURE);
- X
- X }
- X /*--------------------------------------------------------------*/
- X /* set hardware parameters for text mode */
- X /*--------------------------------------------------------------*/
- X for(i = 0; i < 12; i++) /* set hw sweep rate etc. */
- X {
- X if(outb(INDEX_REG_6845, i) == FAILURE ||
- X outb(DATA_REG_6845, tdata[i]) == FAILURE)
- X {
- X KERROR("t_mode: outb() to 6845 failed");
- X return(FAILURE);
- X }
- X }
- X delay(0);
- X /*--------------------------------------------------------------*/
- X /* set text mode, turn display on */
- X /*--------------------------------------------------------------*/
- X if(outb(DMC_PORT, dmcbyte) == FAILURE)
- X {
- X KERROR("t_mode: outb(DMC_PORT, dmcbyte) failed");
- X return(FAILURE);
- X }
- X /*--------------------------------------------------------------*/
- X /* enable text mode */
- X /*--------------------------------------------------------------*/
- X if(outb(CONFIG_SWITCH, CF_TEXT_ONLY) == FAILURE)
- X {
- X KERROR("t_mode: outb(CONFIG_SWITCH, CF_TEXT_ONLY) failed");
- X return(FAILURE);
- X }
- X return(SUCCESS);
- X}
- X/*======================================================================*/
- X/* wait_for_retrace - loop until vertical retrace */
- X/*======================================================================*/
- Xstatic int wait_for_retrace()
- X{
- X unsigned char byte;
- X byte = inb(DS_PORT);
- X while(byte & DS_RETRACE)
- X {
- X delay(0);
- X byte = inb(DS_PORT);
- X }
- X}
- SHAR_EOF
- $TOUCH -am 1013182190 herc/herc.c &&
- chmod 0644 herc/herc.c ||
- echo "restore of herc/herc.c failed"
- set `wc -c herc/herc.c`;Wc_c=$1
- if test "$Wc_c" != "10419"; then
- echo original size 10419, current size $Wc_c
- fi
- echo "End of part 7, continue with part 8"
- exit 0
-
-
-
-
- --
- UUCP: ..!uunet!mcsun!hp4nl!integow!hot or hot@integow.UUCP or hot@hot.mug
- Roland van Hout, Sr. software engineer, Integrity software consultants,
- Pelmolenlaan 16, 3447 GW Woerden, Netherlands,
- tel +31 3480-30131, fax +31 3480-30182
-