Другие языки программирования и технологии
Возможно ли в Паскале получить какой-нибудь символ уже выведенный на экран?
Ну или как это сделать, потому что полагаю, что возможно.Естественно в текстовом режиме...
Доброго времени суток.
Правильно полагаете. Для этого достаточно прочитать байт или слово из видеопамяти (естественно, нужно знать позицию экрана, для которой хотим прочитать информацию) . В качестве примера приведу пару фрагментов, показывающих как записать в видеопамять. При этом надо помнить, что информация о символе в видеопамяти хранится двумя байтами. Первый байт сам символ, а второй - его атрибут (цвет символа, цвет фона, режим мерцания) . С чтением, думаю, разберетесь.
var
WidthScreen : word;
HeightScreen : word;
VideoSeg : word;
ModeScreen : byte;
VideoWord = record
Ch : char;
At : byte;
end;
{получение параметров видео}
procedure GetMode;
var
Regs : Registers;
OfsVideoPage : word absolute $0:$4E4;
RowsToScr : byte absolute $0:$484;
begin
FillChar(Regs,SizeOf(Regs),0);
Regs.Ah:=$0f;
Intr($10,Regs);
with Regs do begin
Al:= Al and $7f;
ModeScreen:=Al;
WidthScreen:=Ah;
end;
HeightScreen:=succ(RowsToScr);
if ModeScreen = Mono then VideoSeg:=$b000
else if ModeScreen <= co80 then VideoSeg:=$b800+OfsVideoPage shr 4;
end;
{вычисление смещения для позиции экрана XY}
function OfsScr(x,y: word): word;
begin
OfsScr:=(pred(y)*WidthScreen+pred(x))*2;
end;
{запись строки с заданным атрибутом}
procedure WrtStrAtr(st: string; x,y,Attr: byte);
var
l : byte absolute st;
VPos : word;
i : byte;
w : VideoWord;
begin
VPos:=OfsScr(x,y);
W.At:=Attr;
for i:=1 to l do begin
w.Ch:=st[ i ];
MemW[VideoSeg:VPos]:=word(w);
Inc(VPos,2);
end;
end;
{запись байта (атрибуты остаются прежними) }
procedure WrtStr(st: string; x,y: byte);
var
l : byte absolute st;
VPos : word;
i : byte;
begin
VPos:=OfsScr(x,y);
for i:=1 to l do begin
Mem[VideoSeg:VPos]:=byte(st[ i ]);
Inc(VPos,2);
end;
end;
{смена атрибутов}
procedure ChangeAtr(number: word; x,y,attr: byte);
var
VPos : word;
i : byte;
begin
VPos:=OfsScr(x,y)+1;
for i:=1 to number do begin
Mem[VideoSeg:VPos]:=attr;
Inc(VPos,2);
end;
end;
Небольшое пояснение. С помощью такой конструкции, которая называется совмещением переменных в памяти, находится длина строки l : byte absolute st; Работает мгновенно, поскольку сразу читается нулевой байт строки в котором, как известно, хранится ее длина.
Удачи!
Правильно полагаете. Для этого достаточно прочитать байт или слово из видеопамяти (естественно, нужно знать позицию экрана, для которой хотим прочитать информацию) . В качестве примера приведу пару фрагментов, показывающих как записать в видеопамять. При этом надо помнить, что информация о символе в видеопамяти хранится двумя байтами. Первый байт сам символ, а второй - его атрибут (цвет символа, цвет фона, режим мерцания) . С чтением, думаю, разберетесь.
var
WidthScreen : word;
HeightScreen : word;
VideoSeg : word;
ModeScreen : byte;
VideoWord = record
Ch : char;
At : byte;
end;
{получение параметров видео}
procedure GetMode;
var
Regs : Registers;
OfsVideoPage : word absolute $0:$4E4;
RowsToScr : byte absolute $0:$484;
begin
FillChar(Regs,SizeOf(Regs),0);
Regs.Ah:=$0f;
Intr($10,Regs);
with Regs do begin
Al:= Al and $7f;
ModeScreen:=Al;
WidthScreen:=Ah;
end;
HeightScreen:=succ(RowsToScr);
if ModeScreen = Mono then VideoSeg:=$b000
else if ModeScreen <= co80 then VideoSeg:=$b800+OfsVideoPage shr 4;
end;
{вычисление смещения для позиции экрана XY}
function OfsScr(x,y: word): word;
begin
OfsScr:=(pred(y)*WidthScreen+pred(x))*2;
end;
{запись строки с заданным атрибутом}
procedure WrtStrAtr(st: string; x,y,Attr: byte);
var
l : byte absolute st;
VPos : word;
i : byte;
w : VideoWord;
begin
VPos:=OfsScr(x,y);
W.At:=Attr;
for i:=1 to l do begin
w.Ch:=st[ i ];
MemW[VideoSeg:VPos]:=word(w);
Inc(VPos,2);
end;
end;
{запись байта (атрибуты остаются прежними) }
procedure WrtStr(st: string; x,y: byte);
var
l : byte absolute st;
VPos : word;
i : byte;
begin
VPos:=OfsScr(x,y);
for i:=1 to l do begin
Mem[VideoSeg:VPos]:=byte(st[ i ]);
Inc(VPos,2);
end;
end;
{смена атрибутов}
procedure ChangeAtr(number: word; x,y,attr: byte);
var
VPos : word;
i : byte;
begin
VPos:=OfsScr(x,y)+1;
for i:=1 to number do begin
Mem[VideoSeg:VPos]:=attr;
Inc(VPos,2);
end;
end;
Небольшое пояснение. С помощью такой конструкции, которая называется совмещением переменных в памяти, находится длина строки l : byte absolute st; Работает мгновенно, поскольку сразу читается нулевой байт строки в котором, как известно, хранится ее длина.
Удачи!
Для того, чтобы закрыть вопрос, вам надо два ответа. Это второй.
Валера Кольчурин
Gennady подсказал? ))
Похожие вопросы
- как вывести на экран в паскале 30 раз слово "привет" ?
- На Паскаль!! Вывести на экран в столбик все слова введённого текста, исправить опечатки и напечатать исправленный текст.
- Как в Паскале можно описать курсор мыши? Именно вывести его на экран и определить его положение при выполнении программы
- Паскаль.Элементарно,но чё то никак( дан массив.все его элементы разделить на первый элемент.и вывести на экран
- Среди двузначных чисел вывести на экран те, сумма цифр которых равна х(0<х<18). Число х вводится с клавиатуры.В паскале!
- Подскажите почему Паскаль не делает нужного расчета и выводит на экран просто S вместо его значения? Как это исправить?
- Помогите с массивами! Найти и вывести на экран сумму нечётных элементов массива и количество отрицательных.
- Вывести на экран таблицу значений функции Y(x) и ее разложения в ряд S(x)
- как вывести на экран из массива чисел минимальное число, стоящие на нечетных позициях?
- Написать программу на с++:дпн порядковый номер месяца,вывести на экран его название