/* VIDEO.C VIDEO.C VIDEO.C VIDEO.C VIDEO.C VIDEO OUTPUT ROUTINES X X XXX XXXX XXXXX XXX X X X X X X X X July 1, 1987 X X X X X X X X X X X X X XXX X X X X X X X X X X X X X X X X X X XXX XXXX XXXXX XXX */ #include "stdio.h" /* The standard header information */ #include "dos.h" /* The DOS register definitions */ #include "string.h" /* String definitions */ #include "struct.def" /* The data structures for VC.C */ #include "defin.h" char outlist[160]; char strngout[80]; extern struct vars allvars[12]; int bkattr; /* background attribute (boxes) */ int valattr; /* values and variables attribute */ int trnsattr; /* transcript attribute */ int helpattr; /* help attribute */ int errattr; /* error message attribute */ int vidstart; /* start of video memory */ /* ******************************************************** monitor */ /* This function looks at location 0449(hex) in memory to determine */ /* what type of monitor is being used and adjusts the video attri- */ /* butes accordingly. This allows for flexibility. */ void monitor(void) { char i[2]; struct SREGS segregs; unsigned int ds; segread(&segregs); ds = segregs.ds; movedata(0,0x449,ds,(int)i,1);/* get monitor mode from 0000:0449 */ if (i[0] == 7) { /* monochrome monitor in use */ bkattr = 7; valattr = 7; trnsattr = 7; helpattr = 7; errattr = 7; vidstart = 0XB000; } else { /* color monitor in use */ bkattr = 15; /* bright white */ valattr = 10; /* light green */ trnsattr = 14; /* yellow */ helpattr = 10; /* light green */ errattr = 128 + 12; /* blinking light red */ vidstart = 0XB800; } } /* ******************************************************* bkgndvid */ /* This routine sets up the data for the double lines used through- */ /* out the background. The codes for the double lines come from the */ /* extended ASCII set. they are actually output to the display by */ /* the routine "linedisp()". */ void bkgndvid(void) { int index; for (index = 0;index < 160;++index) outlist[index] = bkattr; for (index = 2;index <= 156;index += 2) outlist[index] = 205; outlist[0] = 201; outlist[44] = 203; outlist[110] = 203; outlist[158] = 187; linedisp(1); /* video line 1 */ outlist[0] = 204; outlist[44] = 202; outlist[110] = 202; outlist[158] = 185; linedisp(8); /* video line 8 */ outlist[44] = 205; outlist[110] = 205; linedisp(23); /* video line 23 */ outlist[0] = 200; outlist[158] = 188; linedisp(25); /* video line 25 */ for (index = 2;index <= 156;index += 2) outlist[index] = 32; outlist[0] = 186; outlist[158] = 186; linedisp(24); /* video line 24 */ for (index = 9;index <= 22;++index) linedisp(index); /* video lines 9 to 22 */ outlist[44] = 186; outlist[110] = 186; for (index = 2;index <= 7;++index) linedisp(index); /* video lines 2 to 7 */ } /* ******************************************************* valusvid */ /* This routine actually outputs the calculated data to the monitor.*/ /* It outputs all values every time it is called, even if only a few*/ /* values are changed. It is therefore somewhat inefficient. */ void valusvid(void) { long int temp; sprintf(strngout," A = %12.6f",allvars[0].value); strngout[21] = 0; strngdis(1,1,valattr); sprintf(strngout," B = %12.6f",allvars[1].value); strngout[21] = 0; strngdis(2,1,valattr); sprintf(strngout," C = %12.6f",allvars[2].value); strngout[21] = 0; strngdis(3,1,valattr); sprintf(strngout," D = %12.6f",allvars[3].value); strngout[21] = 0; strngdis(4,1,valattr); sprintf(strngout," E = %12.6f",allvars[4].value); strngout[21] = 0; strngdis(5,1,valattr); sprintf(strngout," F = %12.6f",allvars[5].value); strngout[21] = 0; strngdis(6,1,valattr); temp = allvars[6].value; temp = temp & 077777777; allvars[6].value = temp; sprintf(strngout,"I = %8ld = %8lo = %6lx",temp,temp,temp); strngdis(1,23,valattr); temp = allvars[7].value; temp = temp & 077777777; allvars[7].value = temp; sprintf(strngout,"J = %8ld = %8lo = %6lx",temp,temp,temp); strngdis(2,23,valattr); temp = allvars[8].value; temp = temp & 077777777; allvars[8].value = temp; sprintf(strngout,"K = %8ld = %8lo = %6lx",temp,temp,temp); strngdis(3,23,valattr); temp = allvars[9].value; temp = temp & 077777777; allvars[9].value = temp; sprintf(strngout,"L = %8ld = %8lo = %6lx",temp,temp,temp); strngdis(4,23,valattr); temp = allvars[10].value; temp = temp & 077777777; allvars[10].value = temp; sprintf(strngout,"M = %8ld = %8lo = %6lx",temp,temp,temp); strngdis(5,23,valattr); temp = allvars[11].value; temp = temp & 077777777; allvars[11].value = temp; sprintf(strngout,"N = %8ld = %8lo = %6lx",temp,temp,temp); strngdis(6,23,valattr); strcpy(strngout,"Function Keys --------"); strngdis(1,56,helpattr); strcpy(strngout,"F1-Help-M F2-Help-S "); strngdis(2,56,helpattr); strcpy(strngout,"F3-Print F4-Mark "); strngdis(3,56,helpattr); strcpy(strngout,"F5-Store F6-Retrieve"); strngdis(4,56,helpattr); strcpy(strngout,"F7- F8- "); strngdis(5,56,helpattr); strcpy(strngout,"F9-Edit F10-Quit "); strngdis(6,56,helpattr); } /* ********************************************************* disnew */ /* This routine displays the changed variable only. */ void disnew(int varinuse) { long int temp; double xx; if (varinuse < 6) { /* display A through F */ xx = allvars[varinuse].value; if (xx < 0.0) xx = -xx; if ((xx> 9999999.0) || (xx < .001)) sprintf(strngout,"%12.5e",allvars[varinuse].value); else sprintf(strngout,"%12.6f",allvars[varinuse].value); strngout[12] = 0; strngdis(1+varinuse,10,valattr); } else { /* display I through N */ temp = allvars[varinuse].value; temp = temp & 077777777; allvars[varinuse].value = temp; sprintf(strngout,"%8ld = %8lo = %6lx",temp,temp,temp); strngdis(varinuse-5,27,valattr); } } /* ********************************************************** helpm */ /* This outputs the math helps to the monitor. */ void helpm(void) { strtrans(" ",0); strtrans("$ Help - Mathematics",0); strtrans("$ All calculations are done in floating point, then",0); strtrans("$ converted to fixed point for variables I to N.",0); strtrans("$ Available ABS() SQRT() EXP() LOG()",0); strtrans("$ Functions SIN() COS() ATAN() FACT()",0); strtrans("$ Nesting is allowable to any depth, but the line",0); strtrans("$ length is limited to 62 characters.",0); } /* ********************************************************** helps */ /* This outputs the system helps to the monitor. */ void helps(void) { strtrans(" ",0); strtrans("$ Help - System",0); strtrans("$ Arrow - selected line ; Star - marked line",0); strtrans("$ F3-Toggle print mode to print all input lines",0); strtrans("$ F4-Toggle the mark indicator on selected line",0); strtrans("$ F5-Store all marked lines to a file",0); strtrans("$ F6-Retrieve a file and calculate while inputting",0); strtrans("$ F9-Load selected line into input window",0); strtrans("$ up/down-Move selector up/down 1 line",0); strtrans("$ Pgup/Pgdn-Move selector up/down 8 lines",0); } /* ******************************************************* linedisp */ /* This outputs a complete line with attributes already in place. */ void linedisp(int line) { struct SREGS segregs; unsigned int ds; segread(&segregs); ds = segregs.ds; movedata(ds,(int)outlist,vidstart,160*(line-1),160); } /* ******************************************************* strngdis */ /* This outputs a part of a line to the monitor, but first it adds */ /* the attribute bytes between each of the character bytes. */ void strngdis(int row,int col,int attr) { int i = 0; int j = 0; struct SREGS segregs; unsigned int ds; segread(&segregs); ds = segregs.ds; while (strngout[i] && j <= 160) { outlist[j] = strngout[i]; outlist[j+1] = attr; j += 2; i++; } movedata(ds,(int)outlist,vidstart,160*row + 2*col,j); } /* ******************************************************* blnkline */ /* This routine outputs blanks from here to column 79. */ void blnkline(int row,int col) { int i,j,number; struct SREGS segregs; unsigned int ds; segread(&segregs); ds = segregs.ds; number = 78 - col; j = 0; for (i = 0;i <= number;++i){ outlist[j] = ' '; outlist[j+1] = trnsattr; j += 2; } movedata(ds,(int)outlist,vidstart,160*row + 2*col,2*number); } /* ******************************************************** chardis */ /* This function outputs one character anywhere on the screen. */ void chardis(int row,int col,int attr,int ch) { struct SREGS segregs; unsigned int ds; segread(&segregs); ds = segregs.ds; outlist[0] = ch; outlist[1] = attr; movedata(ds,(int)outlist,vidstart,160*row + 2*col,2); } /* ********************************************************* errdis */ /* This function displays the error message with the blinking */ /* attribute. */ void errdis(char str[]) { int row = 21,col = 50; int i; struct SREGS segregs; unsigned int ds; segread(&segregs); ds = segregs.ds; for (i = 0;i <= 24;++i) { outlist[2*i] = str[i]; outlist[2*i+1] = errattr; } movedata(ds,(int)outlist,vidstart,160*row + 2*col,50); } /* ******************************************************** clrscrn */ /* This function clears the screen. */ void clrscrn(void) { int row,col; for (row = 0;row < 25;++row) for (col = 0;col < 80;++col) chardis(row,col,7,' '); } /* ******************************************************** poscurs */ /* This function positions the cursor anywhere on the screen. It */ /* calls the DOS function call 10, the video interrupt. */ void poscurs(int row,int col) { union REGS inregs; union REGS outregs; inregs.h.ah = 2; inregs.h.dh = row; inregs.h.dl = col; inregs.h.bh = 0; int86(0x10,&inregs,&outregs); } /* ******************************************************* prtprblm */ /* This function checks the printer to see if it is turned on and on*/ /* line. It returns a 1 if a problem, 0 if all is OK. */ int prtprblm(void) { union REGS inregs; union REGS outregs; inregs.h.ah = 2; inregs.x.dx = 0; int86(0x17,&inregs,&outregs); if ((outregs.h.ah & 0X80) == 0X80) return(0); else return(1); }