home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 July
/
Chip_1998-07_cd.bin
/
ctenari
/
Soban
/
VYPLATA
/
OBRAZ.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-31
|
5KB
|
261 lines
/***********************************************************************
* Program pro zapis do virtualni obrazovky a pro zobrazeni na displei *
* (c) 1995 Soban Petr *
***********************************************************************/
#include <string.h>
#include "obraz.h"
int vstup(void); //je v souboru vyplata
//konstruktor
virtualni_obrazovka::virtualni_obrazovka(int x, int y) {
unsigned long pomocna;
if (x<24) x=24;
if (y<80) y=80;
max_x=x;
max_y=y;
souradnice_x=0;
souradnice_y=0;
inicializace_obr=0;
pomocna=(unsigned long)x*(unsigned long)y*2L;
//video_pamet=new unsigned char huge(pomocna);
video_pamet=(unsigned char huge *)farmalloc(pomocna);
atribut=0x0f;
clr();
}
//destruktor
virtualni_obrazovka::~virtualni_obrazovka() {
//delete video_pamet;
if (video_pamet!=NULL) farfree((void *)video_pamet);
kurzor_zobraz();
}
void virtualni_obrazovka::nastav_atribut(unsigned char barva) {
atribut=barva;
}
void virtualni_obrazovka::inicializace(void)
{
union REGS reg;
/*
reg.h.ah=0x00; //funkce
reg.h.al=0x03; //mod zobrazeni
int86(0x10, ®, ®); */ //neprepinam mod zobrazeni
reg.h.ah=0x01; //funkce
reg.x.cx=0x1f00; //velikost kurzoru - vypnout
int86(0x10, ®, ®);
}
void virtualni_obrazovka::kurzor_zobraz(void)
{
union REGS reg;
reg.h.ah=0x01; //funkce
reg.x.cx=0x0e0f; //velikost kurzoru - vypnout
int86(0x10, ®, ®);
}
void virtualni_obrazovka::clr(void)
{
unsigned long i;
if (video_pamet==NULL) {
printf( "Nedostatek pameti!");
exit(1);
}
for(i=0L; i<((unsigned long)max_y*(unsigned long)max_x*2L); i+=2L)
{
video_pamet[i]=' ';
video_pamet[(i+1L)]=atribut;
}
}
void virtualni_obrazovka::zapis(char *retezec)
{
int j;
unsigned long i;
if (video_pamet==NULL) {
printf("Nedostatek pameti!");
exit(1);
}
if (souradnice_x<0) souradnice_x=0;
if (souradnice_y<0) souradnice_y=0;
if (souradnice_x>max_x) souradnice_x=max_x;
if (souradnice_y>max_y) souradnice_y=max_y;
i=((unsigned long)souradnice_x*(unsigned long)max_y+(unsigned long)souradnice_y)*2L;
j=0;
while (retezec[j]!=0)
{
if (&video_pamet[((unsigned long)max_x*(unsigned long)max_y*2L)]<&video_pamet[i]) break;
if (iscntrl(retezec[j])) {
if (retezec[j]=='\n') {
souradnice_y=0;
souradnice_x++;
if (souradnice_x>max_x) souradnice_x=0;
}
i=((unsigned long)souradnice_x*(unsigned long)max_y+(unsigned long)souradnice_y)*2L;
j++;
}
else {
video_pamet[i]=retezec[j];
video_pamet[(i+1L)]=atribut;
i+=2L; //i+2
j++;
souradnice_y++;
if (souradnice_y>max_y) {
souradnice_y=0;
souradnice_x++;
if (souradnice_x>max_x) souradnice_x=0;
}
}
}
}
void virtualni_obrazovka::zapis(int x, int y, char *retezec2)
{
souradnice_x=x;
souradnice_y=y;
zapis(retezec2);
}
void virtualni_obrazovka::prepis_obrazovky(int x, int y)
{
if (inicializace_obr!=1) {
inicializace();
inicializace_obr=1;
}
if (video_pamet==NULL) {
printf("Nedostatek pameti!");
exit(1);
}
if (x<0) x=0;
if (y<0) y=0;
if (x>(max_x-24)) x=max_x-24;
if (y>(max_y-80)) y=max_y-80;
int i;
unsigned long pomocna;
for (i=0; i<24; i++)
{
pomocna=((unsigned long)(i+x)*(unsigned long)max_y*2L+(unsigned long)(y*2));
print_retezec(&video_pamet[pomocna], i);
}
}
void virtualni_obrazovka::zobraz_obrazovku(void)
{
int x,y;
int znak;
char napoveda[]=" ESC=Konec µipky=posun obrazovky v daném sm╪ru";
x=0;
y=0;
struct REGPACK reg;
reg.r_ax=0x0600;
reg.r_bx=0x1300; //BH atributy bl==nic
reg.r_cx=0x1800;
reg.r_dx=0x184f;
intr(0x10, ®);
reg.r_ax=0x1300; //funkce
reg.r_bx=0x0013; // videostranka BH
//atributy BL
reg.r_cx=strlen(napoveda); //delka retezce
reg.r_dx=0x1800; //cislo radky
// ukazatel na retezec
reg.r_bp=FP_OFF(napoveda);
reg.r_es=FP_SEG(napoveda);
intr(0x10, ®);
do {
if (x<0) x=0;
if (y<0) y=0;
if (x>(max_x-24)) x=max_x-24;
if (y>(max_y-80)) y=max_y-80;
prepis_obrazovky(x,y);
znak=vstup();
if (znak==0) znak=getch(); //pro precteni rozsirenych klaves
if (znak==SIPKA_VLEVO) y--;
if (znak==SIPKA_VPRAVO) y++;
if (znak==SIPKA_NAHORU) x--;
if (znak==SIPKA_DOLU) x++;
} while (znak>' ');
}
void virtualni_obrazovka::print_retezec(unsigned char huge *retezec, int radka)
{
struct REGPACK reg;
reg.r_ax=0x1303; //funkce
reg.r_bx=0x0000; // videostranka BH
//atributy BL
reg.r_cx=80; //delka retezce
reg.r_dx=radka*256; //cislo radky
// ukazatel na retezec
reg.r_bp=FP_OFF(retezec);
reg.r_es=FP_SEG(retezec);
intr(0x10, ®);
return;
}
void virtualni_obrazovka::print_znak(unsigned char znak, unsigned char barva)
{
union REGS reg;
reg.h.ah=0x09; //funkce
reg.h.al=znak;
reg.h.bh=0; //nektere biosy stranka
reg.h.bl=barva;
reg.x.cx=1; //faktor opakovani
int86(0x10, ®, ®);
}