home *** CD-ROM | disk | FTP | other *** search
- /*
- GLIO98.C:
- Module of graphic handler (with G-LIO)
- by Atsuhiro Kojima Jun 12 1989
- * 89/09/25
- * ---- V2.4.0 distribution ----
- */
-
- #ifdef PC98
- #include "option.h"
- #ifdef UOP_GRAPHICS
- #include <stdio.h>
- #include <dos.h>
- #include "glio98.h"
-
- /*
- Define constants.
- */
- #define Private static
- #define Public
-
- #define LioWorkSize (0x1210+0x10)
- #define LioParamSize 0x30 /* this is grater than largest parameter size */
- #define EntryBase 0xf990
- #define IntInterval 0xc5
- #define IntInit 0xa0
- #define IntScreen 0xa1
- #define IntView 0xa2
- #define IntColor1 0xa3
- #define IntColor2 0xa4
- #define IntCls 0xa5
- #define IntPset 0xa6
- #define IntLine 0xa7
- #define IntCircle 0xa8
- #define IntPut2 0xad
-
- /*
- Define types.
- */
- typedef struct { /* parameters for gscreen. */
- unsigned char mode;
- unsigned char sw;
- unsigned char activ;
- unsigned char disp;
- } ParaScreen;
-
- typedef struct { /* parameters for gview. */
- int sx;
- int sy;
- int ex;
- int ey;
- unsigned char fill;
- unsigned char bord;
- } ParaView;
-
- typedef struct { /* parameters for gcolor1. */
- unsigned char dummy;
- unsigned char back;
- unsigned char bord;
- unsigned char fore;
- unsigned char mode;
- } ParaColor1;
-
- typedef struct { /* parameters for gpset. */
- int x;
- int y;
- unsigned char pal;
- } ParaPset;
-
- typedef struct { /* parameters for gline. */
- int sx;
- int sy;
- int ex;
- int ey;
- unsigned char pal;
- unsigned char draw;
- unsigned char sw;
- unsigned char fill;
- unsigned char style;
- unsigned char len;
- unsigned int patOff;
- unsigned int patSeg;
- } ParaLine;
-
- typedef struct { /* parameters for gcircle. */
- int cx;
- int cy;
- int rx;
- int ry;
- unsigned char pal;
- unsigned char arc;
- int sx;
- int sy;
- int ex;
- int ey;
- unsigned char fill;
- unsigned int patOff;
- unsigned int patSeg;
- } ParaCircle;
-
- typedef struct { /* parameters for gput2. */
- int x;
- int y;
- unsigned jis;
- unsigned char draw;
- unsigned char sw;
- unsigned char fore;
- unsigned char back;
- } ParaPut2;
-
- /*
- Define private symbols.
- */
- Private char orgWork[LioWorkSize]; /* work area for lio. */
- Private char* lioWork= orgWork; /* work area (paragraph alignment)*/
- Private char paramWork[LioParamSize]; /* parameter area for LIO */
- Private char* lioParam = paramWork; /* parameter area pointer */
- Private unsigned lioBase; /* base segment of work area */
- Private char iret[]= {0xcf}; /* iret. */
-
- /*
- Define procedures.
- */
- Private void normWork()
- /*
- normalize the base segment of work area for G-Lio.
- (G-Lio requires work area which begins from offset 0x0000.)
- */
- {
- struct SREGS segRegs;
- unsigned parag;
-
- segread(&segRegs);
- lioBase= ((unsigned)orgWork >> 4) + segRegs.ds;
- parag= ((unsigned)orgWork & 0x000f);
-
- if (parag)
- {
- lioBase++;
- lioWork= &orgWork[0x10-parag];
- lioParam = ¶mWork[0x10-parag];
- }
- }
-
-
- Private void setVector()
- /*
- set interrupt vectors for G-LIO.
- */
- {
- static short nEntry= 0;
- int i;
- unsigned ds;
- union REGS inRegs;
- union REGS outRegs;
- struct SREGS segRegs;
- static struct {
- unsigned char entry;
- unsigned char dummy;
- unsigned int offset;
- } vecEntry;
-
- segread(&segRegs);
- ds= segRegs.ds;
- /* movedata(EntryBase, 0, ds, &nEntry, 1); */
- moveMemory(&nEntry, ds, 0, EntryBase, 1);
-
- for (i=0; i< nEntry; i++)
- {
- /* movedata(EntryBase, i*4+4, ds, &vecEntry, sizeof(vecEntry)); */
- moveMemory(&vecEntry, ds, i*4+4, EntryBase, sizeof(vecEntry)/2);
- inRegs.h.ah= 0x25; /* set vector for lio services. */
- inRegs.h.al= vecEntry.entry;
- inRegs.x.dx= vecEntry.offset;
- segread(&segRegs);
- segRegs.ds= EntryBase;
-
- intdosx(&inRegs, &outRegs, &segRegs);
- }
-
- inRegs.h.ah= 0x25; /* set vector for lio interruption (do nothing). */
- inRegs.h.al= IntInterval;
- inRegs.x.dx= (unsigned)iret;
- segread(&segRegs);
-
- intdosx(&inRegs, &outRegs, &segRegs);
- }
-
-
- Public int ginit()
- /*
- ginit() will initialize graphic environment.
- (set work area & vectors).
- */
- {
- union REGS inRegs,
- outRegs;
- struct SREGS segRegs;
-
- normWork();
- setVector();
-
- segread(&segRegs);
- segRegs.ds= lioBase;
- int86x(IntInit, &inRegs, &outRegs, &segRegs);
- }
-
- Public int gscreen(mode, sw, activ, disp)
- /*
- gscreen() will set the screen.
- */
- int mode; /* graphic mode. */
- int sw; /* graphic switch. */
- int activ; /* active page. */
- int disp; /* display page. */
- {
- union REGS inRegs,
- outRegs;
- struct SREGS segRegs;
- ParaScreen* params= (ParaScreen*)lioWork;
-
- inRegs.x.bx= 0;
- segread(&segRegs);
- segRegs.ds= lioBase;
-
- params->mode= mode;
- params->sw= sw;
- params->activ= activ;
- params->disp= disp;
-
- int86x(IntScreen, &inRegs, &outRegs, &segRegs);
- }
-
-
- Public int gview(sx, sy, ex, ey, fill, bord)
- /*
- gview() will set viewport.
- */
- int sx, sy; /* starting point of the viewport. */
- int ex, ey; /* ending point of the viewport. */
- int fill; /* fill color. */
- int bord; /* border color. */
- {
- union REGS inRegs,
- outRegs;
- struct SREGS segRegs;
- ParaView* params= (ParaView*)lioWork;
-
- inRegs.x.bx= 0;
- segread(&segRegs);
- segRegs.ds= lioBase;
-
- params->sx= sx;
- params->sy= sy;
- params->ex= ex;
- params->ey= ey;
- params->fill= fill;
- params->bord= bord;
-
- int86x(IntView, &inRegs, &outRegs, &segRegs);
- }
-
-
- Public int gcolor1(back, bord, fore, mode)
- /*
- gcolor1() will set color code.
- */
- int back; /* background color. */
- int bord; /* border color. */
- int fore; /* foreground color. */
- int mode; /* color mode. */
- {
- union REGS inRegs,
- outRegs;
- struct SREGS segRegs;
- ParaColor1* params= (ParaColor1*)lioWork;
-
- inRegs.x.bx= 0;
- segread(&segRegs);
- segRegs.ds= lioBase;
-
- params->back= back;
- params->bord= bord;
- params->fore= fore;
- params->mode= mode;
-
- int86x(IntColor1, &inRegs, &outRegs, &segRegs);
- }
-
-
- Public int gcls()
- /*
- gcls() will clear screen.
- */
- {
- union REGS inRegs,
- outRegs;
- struct SREGS segRegs;
-
- segread(&segRegs);
- segRegs.ds= lioBase;
-
- int86x(IntCls, &inRegs, &outRegs, &segRegs);
- }
-
-
- Public int gpset(x, y, pal, mode)
- /*
- gpset will plot a point.
- */
- int x,y; /* point. */
- int pal; /* color. */
- int mode; /* action mode. */
- {
- union REGS inRegs,
- outRegs;
- struct SREGS segRegs;
- ParaPset* params= (ParaPset*)lioWork;
-
- inRegs.h.ah= mode;
- inRegs.x.bx= 0;
- segread(&segRegs);
- segRegs.ds= lioBase;
-
- params->x= x;
- params->y= y;
- params->pal= pal;
-
- int86x(IntPset, &inRegs, &outRegs, &segRegs);
- }
-
-
- Public int gline(sx, sy, ex, ey, pal, draw, sw, fill, style, len, pat)
- /*
- gline() will draw line (or rectangle).
- */
- int sx, sy; /* starting point of line. */
- int ex, ey; /* ending point of line. */
- int pal; /* palette code of line. */
- int draw; /* draw flag. */
- int sw; /* draw switch. */
- int fill; /* palette code for filling. */
- int style; /* line style. */
- int len; /* length of line pattern. */
- int* pat; /* pointer to line pattern. */
- {
- union REGS inRegs,
- outRegs;
- struct SREGS segRegs;
- ParaLine* params= (ParaLine*)lioWork;
-
- inRegs.x.bx= 0;
- segread(&segRegs);
- segRegs.ds= lioBase;
-
- params->sx= sx;
- params->sy= sy;
- params->ex= ex;
- params->ey= ey;
- params->pal= pal;
- params->draw= draw;
- params->sw= sw;
- params->fill= fill;
- params->style= style;
- params->len= len;
- params->patOff= (unsigned)pat;
- params->patSeg= segRegs.ds;
-
- int86x(IntLine, &inRegs, &outRegs, &segRegs);
- }
-
- Public int gcircle(cx, cy, rx, ry, pal, arc, sx, sy, ex, ey, fill, pat)
- /*
- gcircle() will draw circle (or ellipse).
- */
- int cx, cy; /* center point. */
- int rx, ry; /* radius. */
- int pal; /* color of line. */
- int arc; /* arc flag. */
- int sx, sy; /* starting point. */
- int ex, ey; /* ending point. */
- int fill; /* fill color. */
- int* pat; /* fill pattern. */
- {
- union REGS inRegs,
- outRegs;
- struct SREGS segRegs;
- ParaCircle* params= (ParaCircle*)lioWork;
-
- inRegs.x.bx= 0;
- segread(&segRegs);
- segRegs.ds= lioBase;
-
- params->cx= cx;
- params->cy= cy;
- params->rx= rx;
- params->ry= ry;
- params->pal= pal;
- params->arc= arc;
- params->sx= sx;
- params->sy= sy;
- params->ex= ex;
- params->ey= ey;
- params->fill= fill;
- params->patOff= (unsigned)pat;
- params->patSeg= segRegs.ds;
-
- int86x(IntCircle, &inRegs, &outRegs, &segRegs);
- }
-
-
- Public int gput2(x, y, jis, draw, sw, fore, back)
- /*
- gput2() will put a character on the graphic screen.
- */
- int x, y; /* point. */
- unsigned jis; /* jis code. */
- int draw; /* draw flag. */
- int sw; /* graphic switch. */
- int fore; /* foreground color. */
- int back; /* background color. */
- {
- union REGS inRegs,
- outRegs;
- struct SREGS segRegs;
- ParaPut2* params= (ParaPut2*)lioWork;
-
- inRegs.x.bx= 0;
- segread(&segRegs);
- segRegs.ds= lioBase;
-
- params->x= x;
- params->y= y;
- params->jis= jis;
- params->draw= draw;
- params->sw= sw;
- params->fore= fore;
- params->back= back;
-
- int86x(IntPut2, &inRegs, &outRegs, &segRegs);
- }
-
- #endif /* UOP_GRAPHICS */
- #endif /* PC98 */
-