Xref: utzoo comp.unix.microport:944 comp.unix.xenix:2599
Path: utzoo!attcan!uunet!husc6!mailrus!umix!metavax!oxtrap!b-tech!m2-net!lewis
From: lewis@m2-net.UUCP (Dave Lewis)
Newsgroups: comp.unix.microport,comp.unix.xenix
Subject: Graphics Library (part 3 of 5)
Keywords: Graphics EGA CGA Hercules Printers Microport Xenix 286 386
Message-ID: <1883@m2-net.UUCP>
Date: 1 Jul 88 04:07:31 GMT
References: <1881@m2-net.UUCP>
Reply-To: lewis@m-net.UUCP (Dave Lewis)
Organization: M-NET, Ann Arbor, MI
Lines: 1125
------------------------------ cut here ------------------------------
# To recover, type "sh archive"
echo restoring Makefile
sed 's/^X//' > Makefile < demo.c <
X#include
X#include
X#include
X#include
X
X/* Sun Nov 29 16:20:03 EST 1987 */
X/* Sat Mar 21 22:59:10 EST 1987 */
X/* Sun Feb 21 11:50:45 EST 1988 */
X
X#include "graphics.h"
X
Xextern struct SVAT_graphics graphics;
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X int testpattern();
X
X char *mode_to_use[8];
X int idx;
X int init(), grafstr(), finish(), istat;
X void null_function();
X
X if (argc < 2) {
X printf ("Usage: demo \n\nWhere can be 4, 6, 8, EGA or print)\n");
X exit(0);
X }
X
X if (strcmp(argv[1],"4") == 0) {
X graphics.grafmode = CGA_COLOR_MODE;
X strcpy(mode_to_use,"mode 4");
X }
X else if (strcmp(argv[1],"6") == 0) {
X graphics.grafmode = CGA_HI_RES_MODE;
X strcpy(mode_to_use,"mode 6");
X }
X else if (strcmp(argv[1],"8") == 0) {
X graphics.grafmode = HERC_GRAF_MODE;
X strcpy(mode_to_use,"mode 8");
X }
X else if (strcmp(argv[1],"16") == 0) {
X graphics.grafmode = EGA_COLOR_MODE;
X strcpy(mode_to_use,"mode 16");
X }
X else if (strcmp(argv[1],"EGA") == 0) {
X graphics.grafmode = EGA_COLOR_MODE;
X strcpy(mode_to_use,"mode 16");
X }
X else if (strcmp(argv[1],"print") == 0) {
X graphics.grafmode = IBM_PRINTER;
X strcpy(mode_to_use," ");
X }
X else {
X printf ("Valid modes are 4, 6, 8, EGA, and print.\n");
X exit (1);
X }
X
X /* Set video mode. */
X
X istat = init(graphics.grafmode);
X
X system(mode_to_use);
X
X istat = clear();
X
X istat = testpattern();
X
X if (graphics.grafmode != IBM_PRINTER) {
X
X /* Kill some time... */
X signal(SIGALRM,null_function);
X alarm(4);
X pause();
X
X istat = clear();
X
X /* void grafstr(strng,x,y,vsize,hsize,spacing) */
X istat = grafstr("AbCdEfGhIjKlMnOpQrStUvWxYz",10,10000,400,180,1250);
X istat = grafstr("AbCdEfGhIjKlMnOpQrStUvWxYz",100,25000,150,80,667);
X istat = grafstr("AbCdEfGhIjKlMnO",100,15000,800,360,2500);
X
X istat = grafstr("Z#\$%^&*()+",100,20000,600,400,2600);
X
X if (graphics.grafmode != IBM_PRINTER) {
X /* Kill some time... */
X signal(SIGALRM,null_function);
X alarm(4);
X pause();
X }
X
X istat = clear();
X
X istat = cursor(1,1);
X istat = cellstr("This should be (1,1)");
X
X istat = cursor(2,30);
X istat = cellstr("This should be (2,30)");
X
X istat = cursor(3,60);
X istat = cellstr("This should be (3,60)");
X
X istat = cursor(10,40);
X istat = cellstr("This should be (10,40)");
X
X istat = cursor(25,40);
X cellstr("X");
X
X istat = cursor(25,80);
X cellstr("X");
X
X istat = cursor(43,90);
X cellstr("X");
X
X cursor(2,1); cellstr("This");
X cursor(3,1); cellstr(" Is ");
X cursor(4,1); cellstr(" A ");
X cursor(5,1); cellstr("TEST");
X cursor(6,1); cellstr("XXXX");
X cursor(7,1); cellstr("XXXX");
X
X for (idx=1;idx<=43;idx++) {
X cursor(idx,20);
X cellstr("XHIHX");
X }
X
X /* Kill some time... */
X signal(SIGALRM,null_function);
X alarm(4);
X pause();
X
X system ("mode 2");
X }
X
X istat = finish();
X}
X
Xstatic void null_function() {
X /* Do nothing. Dummy signal handling routine for SIGALRM. */
X}
X
XxX--EOF--XxX
echo restoring finish.c
sed 's/^X//' > finish.c <
X#include
X#include
X#include
X#include "graphics.h"
X
Xint finish()
X
X{
X extern struct SVAT_graphics graphics;
X int shmdt(), fprintf(), fputs(), fwrite();
X int shmid;
X int clear();
X void free();
X char *getenv();
X extern errno;
X int idx;
X char printprog[60];
X char *envptr;
X
X FILE *popen(), *fhandle;
X int pclose();
X
X switch (graphics.grafmode) {
X
X case CGA_HI_RES_MODE:
X /* Erase graphics memory. */
X if (clear()) return(1);
X /* Detach the shared memory segment. */
X if (shmdt(graphics.cgamem) < 0) return(errno);
X break;
X
X case CGA_COLOR_MODE:
X /* Erase graphics memory. */
X if (clear()) return(1);
X /* Detach the shared memory segment. */
X if (shmdt(graphics.cgamem) < 0) return(errno);
X break;
X
X case EGA_COLOR_MODE:
X /* Erase graphics memory. */
X if (clear()) return(1);
X /* Detach the shared memory segment. */
X if (shmdt(graphics.egamem) < 0) return(errno);
X break;
X
X case HERC_GRAF_MODE:
X /* Erase graphics memory. */
X if (clear()) return(1);
X /* Detach the shared memory segment. */
X if (shmdt(graphics.hercmem) < 0) return(errno);
X break;
X
X case IBM_PRINTER:
X
X /* Print the buffer */
X
X /* Use the environment variable PLOTDEV if set. */
X
X strcpy(printprog, PRINTPROG);
X strcat(printprog, " ");
X if ((envptr = getenv("PLOTDEV")) != NULL) {
X strcat(printprog, "-d");
X strcat(printprog, envptr);
X }
X
X if ((fhandle = popen(printprog, "w")) == NULL) {
X fprintf(stderr,
X "finish(): Error piping to %s\n",
X printprog);
X return(1);
X }
X
X /* Dump the print image to the file */
X
X /* Set line feed pitch to 7/72" */
X
X GRAFPITCH(fhandle);
X
X /* Write the lines of data (3 buffers full) */
X for (idx=0; idxbuf[idx][0]),
X sizeof(char), PRINTDENSITY, fhandle);
X CRLF(fhandle);
X }
X for (idx=0; idxbuf[idx][0]),
X sizeof(char), PRINTDENSITY, fhandle);
X CRLF(fhandle);
X }
X for (idx=0; idxbuf[idx][0]),
X sizeof(char), PRINTDENSITY, fhandle);
X CRLF(fhandle);
X }
X
X /* Set line feed pitch back to 12/72" for text */
X TEXTPITCH(fhandle);
X
X if (pclose(fhandle) < 0) return(1);
X
X /* Free the allocated memory. */
X free(graphics.printbuf1);
X free(graphics.printbuf2);
X free(graphics.printbuf3);
X
X break;
X
X default:
X return(1);
X }
X return(0);
X}
X
X
XxX--EOF--XxX
echo restoring linedraw.c
sed 's/^X//' > linedraw.c < mode.c <
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X int setmode();
X int modevalue, stat;
X char *inbuf[20];
X
X if (argc > 2) {
X printf("Usage: mode n\n");
X exit(0);
X }
X
X else if (argc == 2) {
X modevalue = atoi(argv[1]);
X if (modevalue < 0 || modevalue > 11) {
X printf("Mode must be between 0 and 11\n");
X exit(0);
X }
X setmode(modevalue);
X }
X else if (argc == 1) {
X#ifdef DEBUG
X for ( ; ; ) {
X stat=scanf("%d", &modevalue);
X if (stat == EOF) exit(0);
X /* Clear input stream if bad read. */
X if (stat == 0) gets(inbuf, 20, stdin);
X if (stat == 1 && modevalue >= 0 && modevalue <=11)
X setmode(modevalue);
X }
X#endif /* DEBUG */
X setmode(NORMAL_MODE);
X }
X }
XxX--EOF--XxX
echo restoring mode.sh
sed 's/^X//' > mode.sh < movpen.c < setmode.c <
X#if UNIX
X#include
X#include
X#endif
X
Xextern errno;
X
Xint fd;
X
X/* Define the mode register settings. */
Xunsigned char creg[12] = {
X 0x2c, 0x28, 0x2d, 0x2d, 0x2a, 0x2e, 0x1e, 0x2d, 0x0e, 0x8e, 0x2d, 0x2d
X};
X/* Define the Everex extended graphics register settings */
Xunsigned char ext_graf_reg[12] = {
X 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x06, 0x06
X};
X
Xunsigned char params[192] = {
X/*0*/ 0x38, 0x28, 0x2d, 0x0a, 0x1f, 0x06, 0x19, 0x1c, /* 40x25 b/w */
X 0x02, 0x07, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*1*/ 0x38, 0x28, 0x2d, 0x0a, 0x1f, 0x06, 0x19, 0x1c, /* 40x25 color */
X 0x02, 0x07, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*2*/ 0x61, 0x50, 0x52, 0x0f, 0x19, 0x06, 0x19, 0x19, /* 80x25 b/w */
X 0x02, 0x0d, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
X
X/*3*/ 0x71, 0x50, 0x5a, 0x0a, 0x1f, 0x06, 0x19, 0x1c, /* 80x25 color */
X 0x02, 0x07, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*4*/ 0x38, 0x28, 0x2d, 0x0a, 0x7f, 0x06, 0x64, 0x70, /* 320x200 color */
X 0x02, 0x01, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*5*/ 0x38, 0x28, 0x2d, 0x0a, 0x7f, 0x06, 0x64, 0x70, /* 320x200 b/w */
X 0x02, 0x01, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*6*/ 0x38, 0x28, 0x2d, 0x0a, 0x7f, 0x06, 0x64, 0x70, /* 640x200 b/w */
X 0x02, 0x01, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*7*/ 0x61, 0x50, 0x52, 0x0f, 0x19, 0x06, 0x19, 0x19, /* mono */
X 0x02, 0x0d, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
X
X/*8*/ 0x36, 0x2d, 0x2e, 0x07, 0x5a, 0x02, 0x57, 0x57, /* Hercules 720x348 */
X 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X
X/*9*/ 0x37, 0x2d, 0x2f, 0x05, 0x57, 0x00, 0x57, 0x57, /* Hercules 720x348 */
X 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X
X/*10*/ 0x9a, 0x84, 0x86, 0x0f, 0x19, 0x06, 0x19, 0x19, /* Everex 132x25b&w */
X 0x02, 0x0d, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*11*/ 0x9a, 0x84, 0x86, 0x0f, 0x2d, 0x02, 0x2c, 0x2c, /* Everex 132x44b&w */
X 0x02, 0x07, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00
X};
X
Xsetmode(mode)
Xint mode;
X{
X int i;
X int j;
X int bport;
X int cgaaddr = 0x3d4; /* cga 6845 port address */
X int monoaddr = 0x3b4; /* mda 6845 port address */
X
X#if UNIX
X if ((fd = open("/dev/mem", 2)) < 0) {
X fprintf(stderr, "mode: open of /dev/mem failed\n");
X perror("mode");
X exit(1);
X }
X#endif
X if ((mode == 2 | mode == 7) | (mode == 8) | (mode == 9) |
X (mode == 10) | (mode == 11)) {
X /* Select mono mode on Everex Edge. */
X bport = cgaaddr;
X outb(bport+9, 2); /* Extended Graphics Register */
X bport = monoaddr;
X }
X else {
X /* Select CGA mode on Everex Edge. */
X bport = monoaddr;
X outb(bport+9, 0); /* Extended Graphics Register */
X bport = cgaaddr;
X }
X
X outb(bport+4, 0); /* Reset mode register */
X
X outb(bport+11, 0x06); /* Enable all 64k of Everex
X ** Edge video memory, for mono
X ** adapter.
X */
X
X outb(bport+9, ext_graf_reg[mode]); /* set Everex "extended
X graphics register" */
X j = (mode+1)*16;
X for(i=mode*16; i < j; i++) {
X outb(bport, i); /* select register */
X outb(bport+1, params[i]); /* send value */
X }
X
X outb(bport+4, creg[mode]); /* enable */
X if (mode == 6)
X outb(bport+5, 0x3f); /* set overscan for 640x200 */
X else
X outb(bport+5, 0x30); /* set normal overscan */
X close(fd);
X return(0);
X}
X
X#if UNIX
Xoutb(portno, data)
Xint portno;
Xint data;
X{
X io_op_t iop;
X
X iop.io_port = portno;
X iop.io_byte = data;
X if (ioctl(fd, IOCIOP_WB, &iop) < 0) {
X fprintf(stderr, "mode: error on IOCIOP_WB\n");
X perror("mode");
X exit(1);
X }
X}
X#endif
X
X
X#if MSDOS
Xoutb(portno, data)
Xint portno;
Xint data;
X{
X outp(portno,data);
X}
X#endif
X
XxX--EOF--XxX
echo restoring testpat.c
sed 's/^X//' > testpat.c < write_pix.c <> 1;
X col = x >> 2;
X
X /* Select a color mask, consisting of four 2 bit patterns. */
X switch (graphics.color) {
X case 0: bitmask = 0;
X break;
X case 1: bitmask = 0x055;
X break;
X case 2: bitmask = 0x0AA;
X break;
X case 3: bitmask = 0x0FF;
X break;
X default:bitmask = 0x0FF;
X }
X
X /* Apply the color mask to the two bit pixel of interest. */
X switch (x & 0x0003) {
X case 0: bitmask &= PIX0;
X break;
X case 1: bitmask &= PIX1;
X break;
X case 2: bitmask &= PIX2;
X break;
X case 3: bitmask &= PIX3;
X break;
X }
X
X /* Write pixel to the appropriate page for this line. */
X if (y & 0x0001)
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.cgamem)->page2[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.cgamem)->page2[row][col]
X ^= bitmask;
X break;
X }
X else
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.cgamem)->page1[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.cgamem)->page1[row][col]
X ^= bitmask;
X break;
X }
X break;
X
X case CGA_HI_RES_MODE:
X
X row = y >> 1;
X col = x >> 3;
X
X bitmask = 0x80;
X shiftcount = x & 0x0007;
X bitmask = bitmask >> shiftcount;
X
X if (y & 0x0001) {
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.cgamem)->page2[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.cgamem)->page2[row][col]
X ^= bitmask;
X break;
X }
X }
X else {
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.cgamem)->page1[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.cgamem)->page1[row][col]
X ^= bitmask;
X break;
X }
X }
X break;
X
X case EGA_COLOR_MODE:
X
X col = x >> 3;
X
X bitmask = 0x80;
X shiftcount = x & 0x0007;
X bitmask = bitmask >> shiftcount;
X
X (graphics.egamem)->mem[y][col] |= bitmask;
X break;
X
X case HERC_GRAF_MODE:
X
X row = y >> 2;
X col = x >> 3;
X
X bitmask = 0x80 >> (x & 0x0007);
X
X switch (y & 0x0003) {
X
X case 0:
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.hercmem)
X ->page1[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.hercmem)
X ->page1[row][col]
X ^= bitmask;
X break;
X }
X break;
X case 1:
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.hercmem)
X ->page2[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.hercmem)
X ->page2[row][col]
X ^= bitmask;
X break;
X }
X break;
X case 2:
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.hercmem)
X ->page3[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.hercmem)
X ->page3[row][col]
X ^= bitmask;
X break;
X }
X break;
X case 3:
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.hercmem)
X ->page4[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.hercmem)
X ->page4[row][col]
X ^= bitmask;
X break;
X }
X break;
X }
X break;
X
X case IBM_PRINTER:
X
X col = PRINTDENSITY - y - 1;
X
X row = (x >> 3);
X page = 0;
X while (row >= PRINTLINES) {
X row -= PRINTLINES;
X ++page;
X }
X
X bitmask = 0x80 >> (x & 0x0007);
X
X switch (page) {
X
X case 0: /* Page 0 */
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.printbuf1)
X ->buf[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.printbuf1)
X ->buf[row][col]
X ^= bitmask;
X break;
X }
X break;
X case 1: /* Page 1 */
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.printbuf2)
X ->buf[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.printbuf2)
X ->buf[row][col]
X ^= bitmask;
X break;
X }
X break;
X case 2: /* Page 2 */
X switch (graphics.wrt_mode) {
X case OR:
X (graphics.printbuf3)
X ->buf[row][col]
X |= bitmask;
X break;
X case XOR:
X (graphics.printbuf3)
X ->buf[row][col]
X ^= bitmask;
X break;
X }
X break;
X }
X break;
X default:
X return(1);
X }
X return(0);
X}
XxX--EOF--XxX
--
Dave Lewis
Ann Arbor, MI
...![ itivax umix ]!m-net!dtlewis!lewis