home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 July / Chip_1998-07_cd.bin / ctenari / Soban / VYPLATA / OBRAZ.CPP < prev    next >
C/C++ Source or Header  |  1997-05-31  |  5KB  |  261 lines

  1. /***********************************************************************
  2.  * Program pro zapis do virtualni obrazovky a pro zobrazeni na displei *
  3.  * (c) 1995 Soban Petr                                                 *
  4.  ***********************************************************************/
  5.  
  6. #include <string.h>
  7. #include "obraz.h"
  8.  
  9. int vstup(void); //je v souboru vyplata
  10.  
  11.  
  12.  
  13. //konstruktor
  14. virtualni_obrazovka::virtualni_obrazovka(int x, int y) {
  15.  
  16. unsigned long pomocna;
  17.  
  18.    if (x<24) x=24;
  19.    if (y<80) y=80;
  20.    max_x=x;
  21.    max_y=y;
  22.    souradnice_x=0;
  23.    souradnice_y=0;
  24.    inicializace_obr=0;
  25.    pomocna=(unsigned long)x*(unsigned long)y*2L;
  26.    //video_pamet=new unsigned char huge(pomocna);
  27.    video_pamet=(unsigned char huge *)farmalloc(pomocna);
  28.    atribut=0x0f;
  29.    clr();
  30.    }
  31. //destruktor
  32. virtualni_obrazovka::~virtualni_obrazovka() {
  33.  //delete video_pamet;
  34.  if (video_pamet!=NULL) farfree((void *)video_pamet);
  35.  kurzor_zobraz();
  36.  }
  37.  
  38. void virtualni_obrazovka::nastav_atribut(unsigned char barva) {
  39.  
  40. atribut=barva;
  41.  
  42. }
  43.  
  44.  
  45. void virtualni_obrazovka::inicializace(void)
  46. {
  47.  union REGS reg;
  48. /*
  49.  reg.h.ah=0x00; //funkce
  50.  reg.h.al=0x03; //mod zobrazeni
  51.  int86(0x10, ®, ®); */ //neprepinam mod zobrazeni
  52.  
  53.  reg.h.ah=0x01; //funkce
  54.  reg.x.cx=0x1f00; //velikost kurzoru - vypnout
  55.  int86(0x10, ®, ®);
  56.  
  57. }
  58.  
  59. void virtualni_obrazovka::kurzor_zobraz(void)
  60. {
  61.  union REGS reg;
  62.  
  63.  reg.h.ah=0x01; //funkce
  64.  reg.x.cx=0x0e0f; //velikost kurzoru - vypnout
  65.  int86(0x10, ®, ®);
  66.  
  67. }
  68.  
  69.  
  70. void virtualni_obrazovka::clr(void)
  71. {
  72. unsigned long i;
  73.  
  74. if (video_pamet==NULL) {
  75.   printf( "Nedostatek pameti!");
  76.   exit(1);
  77.   }
  78.  
  79. for(i=0L; i<((unsigned long)max_y*(unsigned long)max_x*2L); i+=2L)
  80. {
  81. video_pamet[i]=' ';
  82. video_pamet[(i+1L)]=atribut;
  83. }
  84.  
  85. }
  86.  
  87.  
  88. void virtualni_obrazovka::zapis(char *retezec)
  89. {
  90. int j;
  91. unsigned long i;
  92.  
  93. if (video_pamet==NULL) {
  94.   printf("Nedostatek pameti!");
  95.   exit(1);
  96.   }
  97.  
  98. if (souradnice_x<0) souradnice_x=0;
  99. if (souradnice_y<0) souradnice_y=0;
  100. if (souradnice_x>max_x) souradnice_x=max_x;
  101. if (souradnice_y>max_y) souradnice_y=max_y;
  102.  
  103. i=((unsigned long)souradnice_x*(unsigned long)max_y+(unsigned long)souradnice_y)*2L;
  104. j=0;
  105.  
  106. while (retezec[j]!=0)
  107. {
  108.  
  109. if (&video_pamet[((unsigned long)max_x*(unsigned long)max_y*2L)]<&video_pamet[i]) break;
  110. if (iscntrl(retezec[j])) {
  111.   if (retezec[j]=='\n') {
  112.  
  113.     souradnice_y=0;
  114.     souradnice_x++;
  115.     if (souradnice_x>max_x) souradnice_x=0;
  116.   }
  117.  
  118.   i=((unsigned long)souradnice_x*(unsigned long)max_y+(unsigned long)souradnice_y)*2L;
  119.   j++;
  120.   }
  121. else {
  122.   video_pamet[i]=retezec[j];
  123.   video_pamet[(i+1L)]=atribut;
  124.   i+=2L; //i+2
  125.   j++;
  126.   souradnice_y++;
  127.   if (souradnice_y>max_y) {
  128.     souradnice_y=0;
  129.     souradnice_x++;
  130.     if (souradnice_x>max_x) souradnice_x=0;
  131.   }
  132. }
  133.  
  134. }
  135.  
  136. }
  137.  
  138. void virtualni_obrazovka::zapis(int x, int y, char *retezec2)
  139. {
  140. souradnice_x=x;
  141. souradnice_y=y;
  142. zapis(retezec2);
  143.  
  144. }
  145.  
  146.  
  147. void virtualni_obrazovka::prepis_obrazovky(int x, int y)
  148. {
  149.  
  150. if (inicializace_obr!=1) {
  151.   inicializace();
  152.   inicializace_obr=1;
  153.   }
  154.  
  155. if (video_pamet==NULL) {
  156.   printf("Nedostatek pameti!");
  157.   exit(1);
  158.   }
  159.  
  160.  
  161. if (x<0) x=0;
  162. if (y<0) y=0;
  163. if (x>(max_x-24)) x=max_x-24;
  164. if (y>(max_y-80)) y=max_y-80;
  165.  
  166.  
  167. int i;
  168. unsigned long pomocna;
  169.  
  170.  
  171. for (i=0; i<24; i++)
  172. {
  173. pomocna=((unsigned long)(i+x)*(unsigned long)max_y*2L+(unsigned long)(y*2));
  174. print_retezec(&video_pamet[pomocna], i);
  175. }
  176.  
  177. }
  178.  
  179. void virtualni_obrazovka::zobraz_obrazovku(void)
  180. {
  181. int x,y;
  182. int znak;
  183. char napoveda[]="         ESC=Konec       µipky=posun obrazovky v daném sm╪ru";
  184.  
  185. x=0;
  186. y=0;
  187.  
  188. struct REGPACK reg;
  189.  
  190.    reg.r_ax=0x0600;
  191.    reg.r_bx=0x1300; //BH atributy bl==nic
  192.    reg.r_cx=0x1800;
  193.    reg.r_dx=0x184f;
  194.    intr(0x10, ®);
  195.  
  196.    reg.r_ax=0x1300; //funkce
  197.    reg.r_bx=0x0013; // videostranka BH
  198.             //atributy  BL
  199.    reg.r_cx=strlen(napoveda); //delka retezce
  200.    reg.r_dx=0x1800; //cislo radky
  201.    // ukazatel na retezec
  202.    reg.r_bp=FP_OFF(napoveda);
  203.    reg.r_es=FP_SEG(napoveda);
  204.  
  205.    intr(0x10, ®);
  206.  
  207.  
  208. do {
  209.  
  210.   if (x<0) x=0;
  211.   if (y<0) y=0;
  212.   if (x>(max_x-24)) x=max_x-24;
  213.   if (y>(max_y-80)) y=max_y-80;
  214.  
  215.   prepis_obrazovky(x,y);
  216.  
  217.   znak=vstup();
  218.   if (znak==0) znak=getch(); //pro precteni rozsirenych klaves
  219.   if (znak==SIPKA_VLEVO) y--;
  220.   if (znak==SIPKA_VPRAVO) y++;
  221.   if (znak==SIPKA_NAHORU) x--;
  222.   if (znak==SIPKA_DOLU) x++;
  223.  
  224.   } while (znak>' ');
  225.  
  226. }
  227.  
  228.  
  229. void virtualni_obrazovka::print_retezec(unsigned char huge *retezec, int radka)
  230. {
  231. struct REGPACK reg;
  232.  
  233.    reg.r_ax=0x1303; //funkce
  234.    reg.r_bx=0x0000; // videostranka BH
  235.             //atributy  BL
  236.    reg.r_cx=80; //delka retezce
  237.    reg.r_dx=radka*256; //cislo radky
  238.    // ukazatel na retezec
  239.    reg.r_bp=FP_OFF(retezec);
  240.    reg.r_es=FP_SEG(retezec);
  241.  
  242.    intr(0x10, ®);
  243.  
  244. return;
  245. }
  246.  
  247.  
  248. void virtualni_obrazovka::print_znak(unsigned char znak, unsigned char barva)
  249. {
  250.  union REGS reg;
  251.  
  252.  reg.h.ah=0x09; //funkce
  253.  reg.h.al=znak;
  254.  reg.h.bh=0; //nektere biosy stranka
  255.  reg.h.bl=barva;
  256.  reg.x.cx=1; //faktor opakovani
  257.  int86(0x10, ®, ®);
  258.  
  259. }
  260.  
  261.