По нажатию на левую кнопку мыши все символы переворачиваются вверх ногами. по наведению мыши на символ "Ф", он меняется на "Р".
Буду очень признателен, если хотя бы намекнете, как делать. Устал висеть в гугле уже третие сутки
uses Crt;Также в FAQ-е есть статья, там написано что и как.
Function msInit : boolean;
var status : Word;
begin
asm
mov ax, $00
int $33
mov status, ax
end;
msInit := (status = $FFFF);
end;
procedure msShow; assembler;
asm
mov ax, $01
int $33
end;
procedure msHide; assembler;
asm
mov ax, $02
int $33
end;
function msBtnPressed (var X, Y : Word) : Byte;
var
btn : Byte;
pX, pY : Word;
begin
asm
mov ax, $03
int $33
mov btn, bl
mov pX, cx
mov pY, dx
end;
X := pX; Y := pY;
msBtnPressed := btn
end;
procedure CallProc (X, Y : Word);
type
vmRec =
record
Ch : Char;
Attr : Byte;
end;
var
vm : array[0 .. 80 * 25 - 1] of vmRec
absolute $B800:$0000;
begin
X := X div 8; Y := Y div 8;
vm[80 * Y + X].Ch := ' ';
end;
var
X, Y : Word;
Finish : Boolean;
begin
if not msInit then Halt(0);
msShow;
Finish := False;
repeat
if msBtnPressed (X, Y) = 1 then { левая кнопка мыши }
begin
msHide;
CallProc(X, Y);
msShow;
end;
if KeyPressed then
begin
Finish := (ReadKey = #27);
while KeyPressed do ReadKey;
end;
until Finish;
msHide;
end.
.................................................
CONST
{Константы для TypePtr процедуры GetCurrentFontInfo, определяющие,
на какую таблицу будет указывать Info.CharTablePtr }
fiFontTable1F = $00; {адрес из INT 1Fh}
fiFontTable43 = $01; {адрес из INT 43h}
fiFontTable8x14 = $02; {адрес фонтов 8x14}
fiFontTable8x8Lo= $03; {адрес фонтов 8x8 коды 00h..7Fh}
fiFontTable8x8Hi= $04; {адрес фонтов 8x8 коды 80h..FFh}
fiFontTable9x14 = $05; {адрес фонтов 9x14}
fiFontTable8x16 = $06; {адрес фонтов 8x16}
fiFontTable9x16 = $07; {адрес фонтов 9x16}
TYPE
{структура для процедуры GetCurrentFontInfo}
TCurrentFontInfo = RECORD
BytePerChar : Word; {число байтов на символ}
CharPerRow : Byte; {число символов в строке-1}
CharTablePtr : Pointer;{указатель на таблицу символов}
END;
{для "грубого" приведения типов}
TPtrConvert = RECORD
case Word of
0:( P : Pointer );
1:( Offs,Segm : Word );
2:( b0,b1,b2,b3 : Byte );
3:( c0,c1,c2,c3 : Char );
END;
TArrByte0 = array [0..0] of Byte;
TArrWord0 = array [0..0] of Word;
VAR
{область памяти BIOS}
{EGA/VGA} {высота матрицы, задающей изображение символа на экране}
CRT_Points : Word absolute $0040:$0085;
.................................
{получение информации о текущем шрифте}
PROCEDURE GetCurrentFontInfo(TypePtr:Byte; VAR Info : TCurrentFontInfo);
assembler;
asm
.................................{паскаль обёртка int 10h, функция 11h, подфункция 30h}
END;
{паскаль-обёртка int 10h, функция 11h, подфункция 10h}
PROCEDURE SetUserFontEnh(VAR CharTable; FirstChar:Char;
NumChar:Word; BytePerChar,NBlock :Byte);
assembler;
asm
...........................
end;
{переворачивание одного символа}
PROCEDURE GlyphReverse(VAR Glyph; {массив с описанием символа}
GlyphHight, {высота символа}
GlyphWidth : Integer);{ширина символа}
BEGIN
............................
END;
PROCEDURE FontReverse;
VAR
FontWsys, {ширина символа в точках}
FontHsys, {высота в строках/байтах}
FontRsys, {ширина в байтах }
FontSsys : Integer;{число байтов на символ }
FontInfo : TCurrentFontInfo;
i : Integer;
b : Byte;
w : Word;
NumFontTable : Byte;
BEGIN
{получение информации о текущем шрифте}
{ - из процедуры}
GetCurrentFontInfo(fiFontTable8x8Lo, FontInfo);
FontSsys:=FontInfo.BytePerChar; {число байтов на символ}
{ - из области данных BIOS}
FontHsys:=CRT_Points; {высота в строках/байтах}
{вычисление недостающих параметров текущего шрифта}
FontRsys:=FontSsys div FontHsys; {ширина в байтах }
if FontRsys=1
then FontWsys:=8
else FontWsys:=9;
{получение правильного указателя на таблицу знакогенератора}
case FontSsys of
8: NumFontTable:=fiFontTable8x8Lo; {шрифт 8x8}
14: NumFontTable:=fiFontTable8x14; {шрифт 8x14}
16: NumFontTable:=fiFontTable8x16; {шрифт 8x16}
28: NumFontTable:=fiFontTable9x14; {шрифт 9x14}
32: NumFontTable:=fiFontTable9x16; {шрифт 9x16}
end;
GetCurrentFontInfo(NumFontTable, FontInfo);
{ WriteLn('Шрифт ', FontWsys, 'x', FontHsys);}
{перевернуть все символы шрифта}
for i:=$00 to $FF do {по символам}
GlyphReverse(TArrByte0(FontInfo.CharTablePtr^)[i*FontSsys], FontHsys, FontRsys);
{задействовать изменения}
SetUserFontEnh(FontInfo.CharTablePtr^, #0, 255, FontSsys, 0);
END;
BEGIN
.........................
if условие then FontReverse;
..........................
END.