Лабораторная работа №34 / OECM3
.docСанкт-Петербургский Государственный
Электротехнический Университет
«ЛЭТИ»
кафедра Вычислительных Технологий
Лабораторная работа №3
«Работа с текстовым режимом»
Выполнил: Будилов А.В.
Гладили Г.А.
Группа: 3372
Проверил: Степашкин
Санкт-Петербург
2005
Цель работы: получить навыки работы с текстовым режимом видеоадаптера.
Задача: написать программу, выводящую бегущую строку, вводимую пользователем. Символы строки имеют произвольный цвет, фот и атрибут мигания.
Описание программы: Программа выводит на экран вертикально бегущую строку, вводимую пользователем. Длина строки не должна превышать 19 символов. Цвет символов строки и их фон, атрибут мигания символов – произвольны. Программа работает корректно в текстовом режиме 80x25. Текстовый режим 80x25 устанавливается автоматически, по завершении программы восстанавливается исходный текстовый режим.
Системные требования: IBM-совместимый компьютер; графический адаптер, поддерживающий цветной текстовый режим 80x25; цветной монитор.
Приложение 1.
Текст программы.
#include "conio.h"
#include "dos.h"
#include "mem.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
union word{
struct{
char fh:8;
char fl:8;
}b;
int fx:16;
};
char getcurpage()
{
char _t;
asm{
mov ah,0xf
int 0x10
mov _t,bh;
};
return _t;
};
void movexybios(char x, char y)
{
char _t=getcurpage();
asm{
mov ah,0x02
mov bh,_t
mov dh, y
mov dl, x
int 0x10
};
};
void printchar(char ch1,char attr)
{
char _t=getcurpage();
asm{
mov ah,0x09
mov al,ch1
mov bl,attr
mov bh,_t
mov cx,0x1
int 0x10
};
};
char getmode()
{
char a;
movedata(0x0040,0x0049,FP_SEG(a),FP_OFF(a),1);
return a;
};
void setmode(char m)
{
asm{
mov ah,0
mov al,m
int 0x10
};
};
int main(void)
{
char string[30];
char vm,_vm;
int di=1;
int bb=0,b=0,c=0;
for(char rep=' ';rep!=27;rep=getch())
{
printf("Enter string: ");
scanf("%19s",string);
int i=1;
_vm=getmode();
setmode(2);
for(char ch=' ';ch!=27;(kbhit())&&(ch=getch()))
{
c+=(ch=='1')*(-1)+(ch=='2');
ch=' ';
for(int k=0;k<strlen(string);k++)
{
movexybios(5,i+k);
printchar(string[k],(char)(c));
};
delay(90);
for(k=0;k<strlen(string);k++)
{
movexybios(5,i+k);
printchar('ю',0x00);
};
if((i+k>24)||(!i))
di*=(-1);
i+=di;
};
setmode(_vm);
movexybios(1,1);
printf("repeat? yes - any key; no - ESC");
fflush(stdin);
};
return 0;
};
Приложение 2.
Cхема алгоритма программы.