По нажатию на левую кнопку мыши все символы переворачиваются вверх ногами. по наведению мыши на символ "Ф", он меняется на "Р".
Буду очень признателен, если хотя бы намекнете, как делать. Устал висеть в гугле уже третие сутки
Либо маразм, либо неполное задание.
Язык хотя бы какой?
Паскаль
Ну и со ставками ассемблера
И может под "переворачиваются вверх ногами" имеется ввиду поворот всего экрана
Вот нашел что-то. Только я в ассемблере ноль. Как это в программу на паскале влепить?
uses Crt;Также в FAQ-е есть http://forum.pascal.net.ru/index.php?showtopic=2383, там написано что и как.
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.
Хоть эпоха DOS и ушла, но баловство со знакогенератором привлекло...
На работе на одном из стендов FreeDOS и можно было поэкспериментировать.
Приводить полностью всё не буду - подскажу лишь алгоритм в общем виде.
.................................................
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.