#include<dos.h>
 #include<graphics.h>
 #include<stdlib.h>
 #include <stdio.h>
 #include <conio.h>
 #define CLEAR "\x1B[2J"
 #define GOLEFT "\x1B[D"
 #define GORIGHT "\x1B[C"
 #define GOUP "\x1B[A"
 #define GODOWN "\x1B[B"
 #define TOPSCREEN "\x1B[1;1f"
 #define ENDSCREEN "\x1B[25;80f"
 #define DRAW *(farptr+(wherey()-1)*80+wherex()-1)
 char leftup =218,horizental=196,rightup=191,
 leftdown=192  , rightdown =217 ,downup =193 ,updown=194,
 leftright=195 , rightleft=180  , central=197,vertical =179;
 int attribute=0x0700;
 FILE *fp;
 void main()
  {
/*******************************************************/
  void setline(void);
  void setblink(void);
  void setintensity(void);
  void setforeground(int);
  void setbackground(int);
  void clearscreen(void);
  void savescreen(char[]);
  void loadscreen(char[]);
  void helpuser(void);
/*********************************************/
  unsigned c1,c2;
  int far *farptr;
  farptr= (int far *)0xb8000000;
  printf(CLEAR);
  while ((c1=getch())!=3)
  {
  if(c1==0)
  {
  c2=getch();
  switch(c2)
  {
  case 68:setline();               //setline style
  break;                           // F10
  case 133:setblink();     //set blink
  break;                           //F11
  case 134:setintensity();         //setintensity
  break;      //F12
 /*******************************************************/
  case 104:                        /*    ALT,F1   */
  case 105:                        /*    ALT,F2   */
  case 106:                        /*    ALT,F3   */
  case 107:                        /*    ALT,F4   */
  case 108:                        /*    ALT,F5   */
  case 109:                        /*    ALT,F6   */
  case 110:                        /*    ALT,F7   */
  case 111:                        /*    ALT,F8   */
  setforeground(c2);
  break;  //setforeground color
 /*******************************************************/
  case 94:                        /*    CRL,F1   */
  case 95:                        /*    CRL,F2   */
  case 96:                        /*    CRL,F3   */
  case 97:                        /*    CRL,F4   */
  case 98:                        /*    CRL,F5   */
  case 99:                        /*    CRL,F6   */
  case 100:                       /*    CRL,F7   */
  case 101:                       /*    CRL,F8   */
  setbackground(c2);
  break;       //setbackground color
 /*******************************************************/
  case 67:clearscreen();break;    //clearscreen
  case 71:gotoxy(1,wherey());break;     //HOME
  case 79:gotoxy(80,wherey());break;    //END
  case 73:gotoxy(wherex(),1);break;     //page up
  case 81:gotoxy(wherex(),25);break;    //page down
  case 119:printf(TOPSCREEN);break;     //CRL+HOME
  case 117:printf(ENDSCREEN);break;     //CRL+END
  case 75:printf(GOLEFT);break;         //LEFT ARR
  case 77:printf(GORIGHT);break;        //RIGHT ARR
  case 72:printf(GOUP);break;           //UP ARR
  case 80:printf(GODOWN);break;         //DOWN ARR
  case 155:printf(GOLEFT);DRAW=horizental|attribute;
  break;                                //ALT,LEFT ARR
  case 157:printf(GORIGHT);DRAW=horizental|attribute;
  break;                                //ALT,RIGHT ARR
  case 152:DRAW=vertical|attribute;printf(GOUP);
  break;                                //ALT,UP ARR
  case 160:DRAW=vertical|attribute;printf(GODOWN);
  break;                                //ALT,DOWN ARR
/*************************************************/
  case 63:DRAW=leftup|attribute;
  break;                //F5
  case 64:DRAW=rightup|attribute;
  break;                //F6
  case 65:DRAW=rightdown|attribute;
  break;                //F7
  case 66:DRAW=leftdown|attribute;
  break;                //F8
  case 22:DRAW=updown|attribute;
  break;                //ALT +U
  case 32:DRAW=downup|attribute;
  break;                //ALT +D
  case 38:DRAW=leftright|attribute;
  break;                //ALT+L
  case 19:DRAW=rightleft|attribute;
  break;                //ALT+R
  case 46:DRAW=central|attribute;
  break;                //ALT+C
  case 83:delline();
  break;                //ERASE LEFT CURSOR
  case 82:insline();
  break;                                //INSERT
/***********************************************/
  case 60:savescreen("screen.txt");
  break;        // F2  save screen
  case 61:loadscreen("screen.txt");
  break;        // F3  load screen
  case 62:savescreen("screen.txt");
  printf(CLEAR);
  exit(1);
  //break;        // F4  save and exit
  case 59:helpuser();                   //F1
  break;
  }
  }
  else
  {
  switch(c1)
  {
/*************************************************/
 case 27:printf(CLEAR);continue;       //ESC
 case 8:printf(GOLEFT);DRAW=0x20|attribute;break; //back space
 case 13:gotoxy(1,wherey()+1);break;   //enter
 default:
 {
 *(farptr+(wherey()-1)*80+wherex()-1)=c1|attribute;
 printf(GORIGHT);
 }
   }
    }
     }
      }
/***********************************************/
void setline(void)
{
switch(horizental)
{
case 196:
leftup=201;
horizental=205;
rightup=187;
leftdown=200;
rightdown=188;
downup=202;
updown=203;
leftright=204;
rightleft=185;
central=206;
vertical=186;
break;
/****************************************************
 *                                                                       *
 *                                                                       *
 ***********************************************/
case 205:
leftup=176;
horizental=176;
rightup=176;
leftdown=176;
rightdown=176;
downup=176;
updown=176;
leftright=176;
rightleft=176;
central=176;
vertical=176;
break;
/*********************************************/
case 176:
leftup=177;
horizental=177;
rightup=177;
leftdown=177;
rightdown=177;
downup=177;
updown=177;
leftright=177;
rightleft=177;
central=177;
vertical=177;
break;
/***********************************************/
case 177:
 leftup=178;
 horizental=178;
 rightup=178;
 leftdown=178;
 rightdown=178;
 downup=178;
 updown=178;
 leftright=178;
 rightleft=178;
 central=178;
 vertical=178;
 break;
/*************************************************/
case 178:
leftup=219;
horizental=219;
rightup=219;
leftdown=219;
rightdown=219;
downup=219;
updown=219;
leftright=219;
rightleft=219;
central=219;
vertical=219;
break;
/**************************************************/
case 219:
leftup=220;
horizental=220;
rightup=220;
leftdown=220;
rightdown=220;
downup=220;
updown=220;
leftright=220;
rightleft=220;
central=220;
vertical=220;
break;


/*******************************************/
case 220:
leftup=221;
horizental=221;
rightup=221;
leftdown=221;
rightdown=221;
downup=221;
updown=221;
leftright=221;
rightleft=221;
central=221;
vertical=221;
break;

/********************************************/
case 221:
leftup=222;
horizental=222;
rightup=222;
leftdown=222;
rightdown=222;
downup=222;
updown=222;
leftright=222;
rightleft=222;
central=222;
vertical=222;
break;

/*********************************************/
case 222:
leftup=223;
horizental=223;
rightup=223;
leftdown=223;
rightdown=223;
downup=223;
updown=223;
leftright=223;
rightleft=223;
central=223;
vertical=223;
break;

/**********************************************/
case 223:
leftup=254;
horizental=254;
rightup=254;
leftdown=254;
rightdown=254;
downup=254;
updown=254;
leftright=254;
rightleft=254;
central=254;
vertical=254;
break;
/**********************************************/
case 254:
leftup=218;
horizental=196;
rightup=191;
leftdown=192;
rightdown=217;
downup=193;
updown=194;
leftright=195;
rightleft=180;
central=197;
vertical=179;
break;
}
}
/*---------------------------------------------------------------------*/
void setblink(void)
{
attribute=attribute^0x8000;
}
void setintensity(void)
{
attribute=attribute^0x800;
}
void setforground(char x)
{
switch(x)
{
case 104:attribute=attribute &0xf800;break;
case 105:attribute=attribute &0xf800;attribute=attribute|0x0100;break;
case 106:attribute=attribute &0xf800;attribute=attribute|0x0200;break;
case 107:attribute=attribute &0xf800;attribute=attribute|0x0300;break;
case 108:attribute=attribute &0xf800;attribute=attribute|0x0400;break;
case 109:attribute=attribute &0xf800;attribute=attribute|0x0500;break;
case 110:attribute=attribute &0xf800;attribute=attribute|0x0600;break;
case 111:attribute=attribute &0xf800;attribute=attribute|0x0700;break;
}
}
/************************************************/
void setbackground(char x)
{
switch(x)
{
case 94:attribute=attribute &0xf800;break;
case 95:attribute=attribute &0xf800;attribute=attribute|0x01000;break;
case 96:attribute=attribute &0xf800;attribute=attribute|0x02000;break;
case 97:attribute=attribute &0xf800;attribute=attribute|0x03000;break;
case 98:attribute=attribute &0xf800;attribute=attribute|0x04000;break;
case 99:attribute=attribute &0xf800;attribute=attribute|0x05000;break;
case 100:attribute=attribute &0xf800;attribute=attribute|0x06000;break;
case 101:attribute=attribute &0xf800;attribute=attribute|0x07000;break;
}
}
/*************************************************/
 void clearscreen(void)
 {
 int addr;
 int far *farptr;
 farptr=(int far*)0xB8000000;
 if((fp=fopen (filename,"w"))==NULL)
 {
 printf("CAN NOT OPEN FILE screen.txt FOR SAVE SCREEN");
 return;
 }
 for(addr=0;addr<2000;addr++)
 *(farptr+addr)=getw(fp);
 fclose(fp);
 }
/************************************************/
       void helpuser(void){
       char c1,c2;
       int pagenumber=1;
       savescreen("temp.txt");
       loadscreen("help1.txt");
       while((c1=getch())!=27)
       {
       if(c1==0)
       {
       c2=getch();
       switch(c2)
       {
       case 73:
       switch(pagenumber)
       {
       case 2:
       pagenumber=1;loadscreen("help1.txt");break;
       case 3:
       pagenumber=2;loadscreen("help2.txt");break;
       case 4:
       pagenumber=3;loadscreen("help3.txt");break;
       case 5:
       pagenumber=4;loadscreen("help4.txt");break;
       }
       break;
       case 81:
       switch(pagenumber)
       {
       case 1:
       pagenumber=2;
       loadscreen("help2.txt");
       break;
       case 2:
       pagenumber=3;
       loadscreen("help3.txt");
       break;
       case 3:
       pagenumber=4;
       loadscreen("help4.txt");
       break;
       case 4:
       pagenumber=5;
       loadscreen("help5.txt");
       break;
 }
       break;
       }
       }
       }
       loadscreen("temp.txt");
       return;
       }
/*************************************************/
  /* end        */