Написать программу, которая на экране рисует линии с заданным цветом и байтом вывода. Чтобы тушилася первая линия, получался сдвиг вывода. Программа должна делать аппаратный сдвиг графики. Окно должно переходить из графического режима в текстовый.
#include<iostream.h>
#include<conio.h>
#include<dos.h>
void main (){
asm mov ax, 0x10
asm int 0x10
/////////////////////////////////////////////
//Fon
inportb(0x3DA);
outportb(0x3C0,0);
outportb(0x3C0,0x35);
outportb(0x3C0,0x20);
int addr = 150*80;
int i,j,q=0,x2,y2=0;
char far *vmem = (char far *)0xA0000000;
char far *vmem_temp;
vmem += addr;
//////////////////////////////////////////////////
// 16 line
for(i = 0;i<16; i++){
for(int j = 0;j<80; j++){
outportb(0x3CE,0x5);
outportb(0x3CF,0x0);
outportb(0x3CE,0x8);
outportb(0x3CF,0xFF);
outportb(0x3C4,0x2);
outportb(0x3C5,5+7*i );
*vmem++ = 0x8E;
}
}
//////////////////////////////////////////////////
//16 line + sdvig
vmem_temp = vmem;
for(i = 0;i<16; i++){
for(int j = 0;j<80; j++){
outportb(0x3CE,0x5);
outportb(0x3CF,0x0);
outportb(0x3CE,0x3);
outportb(0x3CF,0x6); //sdvig dannih
outportb(0x3C4,0x2);
outportb(0x3C5,5+7*i ); //prirajenie tsveta
*vmem++ = 0x8E;
}
}
////////////////////////////////////////////////////
//16 line XOR + sdvig
for(i = 0;i<16; i++){
for(int j = 0;j<80; j++){
outportb(0x3CE,0x5);
outportb(0x3CF,0x3);
outportb(0x3CE,0x3);
outportb(0x3CF,0x6); //sdvig dannih
outportb(0x3C4,0x2);
outportb(0x3C5,5+7*i ); //prirajenie tsveta
*vmem++ = 0x8E;
}
}
getch();
///////////////////////////////////////////////
//potusheniye pervoy stroki
char far *vmem1 = (char far *)0xA0000000;
vmem1 += addr;
for(j = 0;j<80; j++){
outportb(0x3CF,0x3);
outportb(0x3C5,0x35);
*vmem1++ = 0xFF;
}
getch();
///////////////////////////////////////////////
//rejim 1 zapolneniye baytom
outportb(0x3CE,0x5);
outportb(0x3CF,1);
char c;
for(i = 0;i<16; i++){
delay(30);
for(int j = 0;j<760; j++){
c=*(vmem + 5*80 + 5 + j);
*(vmem + (y2*80 + x2 + j))=c;
outportb(0x3D4,0xC);
outportb(0x3D5,0x2);
outportb(0x3D4,0xD);
outportb(0x3D5,0x20);
inportb(0x3DA);
outportb(0x3C0,0x0);
outportb(0x3C0,0x35);
outportb(0x3C0,0x20);
}
}
/////////////////////////////////////////////////
//aparatniy sdvig
while (int(c) != 27){
c = getch();
vmem = vmem_temp;
if (int(c) == 77) q++;
if (int(c) == 75) q--;;
for(i = 0;i<16; i++){
for(int j = 0;j<80; j++){
outportb(0x3CE,0x5);
outportb(0x3CF,0x0);
outportb(0x3CE,0x3);
outportb(0x3CF,q); //sdvig dannih
outportb(0x3C4,0x2);
outportb(0x3C5,5+7*i ); //prirajenie tsveta
*vmem++ = 0x8E;
}
}
}
inportb(0x3DA);
outportb(0x3C0,2);
outportb(0x3C0,0);
outportb(0x3C0,0x20);
asm mov ax,3;
asm int 0x10;
getch();
}