⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 video.c

📁 c版本的
💻 C
字号:
/*          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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -