Программирование на Паскале. Выпуск 12
Извините, уважаемые подписчики, в последней (второй) программе предыдущего выпуска 11 (Мышь.3) я по невнимательности, программе допущено несколько ошибок. Из-за этого она работать не может. Помещу исправленный файл и на сайте 16 сентября в 17:00.
program mouse_02c;
uses DOS, CRT;
procedure FillScreen;
var f: File of char; c: Char;
begin
Assign(f, 'mou_02c.pas'); {$I-} Reset(f); {$I+}
if IOResult <> 0 then Exit;
ClrScr;
While NOT EOF(f) and (WhereY < 25) do begin
Read(f, c); Write(c)
end;
Close(f);
end;
var
r: Registers;
v: Integer;
L_Pressed, R_Pressed: Boolean;
Flag: Boolean;
procedure MouInt; far;
{Исправили INTERRUPT на FAR}
begin
if Flag then Exit;
Flag:=True;
L_Pressed:=False;
R_Pressed:=False;
{Присвоили начальные, а теперь хотим - не хотим, а надо
переходить на ассемблер. Но это не сложно}
asm
{Ассемблерная вставка начинается с ключевого слова ASM
и заканчивается "обычным" END}
TEST bx, 1
{Проверяем (тестируем = TEST) первый бит регистра BX.
В ассемблере нет команд перехода по условию.
Команда TEST просто устанавливает флаг нуля у процессора}
JZ @1
{JZ это сокращение от Jump if Zerou.
Это означает "Переход на метку, если установлен флаг нуля"
Вот и пишем, если "первый бит = 0, то переходм на метку @1"}
MOV L_Pressed, 1
{Сюда попадаем, если "не ноль".
Записываем (перемещаем = MOVE) в переменную L_Pressed единицу.
Паскаль поймет это как значение "ИСТИНА" = TRUE}
@1:
{Теперь аналогично обрабатываем второй бит регистра BX процессора}
TEST bx, 2
JZ @2
MOV R_Pressed, 1
@2:
end;
{Вот и закончился код на языке ассемблера}
end;
function ChangeView(ViewNo: Integer): Integer;
const
Current: Integer = -1;
{По недосмотру в опубликованном варианте не было
присвоения начального значения}
begin
ChangeView:=Current;
if ViewNo = Current then Exit;
r.ax:=$0a;
case ViewNo of
1: with r do begin bx:=0; cx:=$00ff; dx:=$4e00 end;
2: with r do begin bx:=0; cx:=$0; dh:=$1f; dl:=ord('+') end;
3: with r do begin bx:=1; cx:=7; dx:=8 end;
else Exit;
end;
intr($33, r);
end;
BEGIN
r.ax:=0;
intr($33, r);
if r.ax <> $FFFF then
begin
WriteLn('Мышь не обнаружена'); Halt(1)
end;
FillScreen;
r.ax:=1; intr($33, r); {Мышь нужно показать}
{Установка обработчика}
r.ax:=$0c;
r.cx:=2 + 4 + 8;
{Список событий:
- нажата и отпущена левая кнопка;
- нажата правая}
r.es:=Seg(MouInt);
r.dx:=Ofs(MouInt);
intr($33, r);
Write('Мышь обнаружена с ',r.bx,' кнопками');
v:=1;
repeat
if Flag then
begin
Flag:=False;
if L_Pressed then
case v of
1: v:=2;
2: v:=3;
ELSE v:=1 end; {Этого конца "end" тоже не хватало}
ChangeView(v)
end;
until R_Pressed;
{Удаление обработчика. Так положено}
r.ax:=$0c;
r.cx:=0;
r.es:=Seg(MouInt);
r.dx:=Ofs(MouInt);
intr($33, r);
END.
Свои вопросы и предложения присылайте Борису
Мы приглашаем Вас и Ваших друзей к сотрудничеству. Напишите, какая проблема Вас лично интересует - и мы постараемся помочь Вам. Поделитесь со всеми, если Вам удастся найти красивое решение. Присылайте свои программы, и если они хороши, то опубликуем их с обязательным указанием Вашего авторства.
По всем вопросам можно писать
либо на наш форум www.yourpascal.com.
Здесь создан новый раздел "Скорая помощь"
для решения Ваших проблем или в Гостевую книгу нашего сайта на
www.turbopascal.tk, либо прямо мне,
Постараюсь ответить на все вопросы и учесть все разумные предложения
Рассылка поддерживается сайтом www.turbopascal.tk. При перепечатке ссылка на сайт обязательна