Назад в раздел
RU.PASCAL. FAQ.
eManual.ru - электронная документация
Секция 1 из 2 - Предыдущая - Следующая
From: Faq Keeper, 2:5020/1816.7@FidoNet (01 Sep 00 10:47)
RU.PASCAL.* FAQ
Прочитайте это перед тем как пистаь в эху. За вопросы из фака будут
наказания. За ответы тем более.
Данный фак постится в эху раз в две недели. Если вам надоели эти письма
то рекомендую выставить твит на имя "Faq Keeper".
Все вопросы и предложения принимаются по адресу: 2:5020/1816.7 Dze@Chat.ru
------------------------------------------------------------------------------
Последнее обновление: Fri 01 Sep 2000
Дык! Вернулся я после затяжных отпусков и усердного спиртопотребления и
снова начинаю постить фак. емного его даже обновил, почитав мыльницу.
адеюсь, ещё не забыли, что он вообще есть.
------------------------------------------------------------------------------
Dze Pascal FAQ
v 1.0.b.8
(x) Copyleft by Dze aka Geniya Bocharov // [DzeSoft] 1999-1900
Последнее обновление: Fri 01 Sep 2000
Эпиграф:
"RTFM! LMD! FAQ! А чё
это я хоть сказал-то?"
(С) не скажу =)
Ещё один:
"С точки зpения банальной
эpудиции каждый индивидуум,
кpитически..."
(С) все знают =)
------------------------------------------------------------------------------
Данный FAQ был составлен, исходя из наиболее общих вопросов,
которые слишком уж часто возникали в эхоконференцях RU.PASCAL.* (и
частично SU.PASCAL.MODULA.ADA) сети FidoNet. Большая просьба
прочитать его перед тем, как писать в эху. За заданные в эхе вопросы
рассмотренные в данном FAQ, вы получите как минимум [*]. За ответ в
эхе на подобные вопросы, вы будете наказаны строже...
------------------------------------------------------------------------------
На какие эхи рекомендуется подписаться:
RU.PASCAL - наиболее общие вопросы по языку
програмирования, разновидноcтям
компилляторов итд
RU.PASCAL.SOURCES - обмен исходными текстами на Паскале
RU.PASCAL.CHAINIK - эха для начинающих.
SU.PASCAL.MODULA.ADA - общесовковая эха по Паскалю.
XSU.PMA.FAQ - её придаток, в котором обсуждаются
вопросы из тамошнего FAQ
RU.TMT - особенности программирования на TMT Pascal
RU.VP - особенности программирования на
Virtual Pascal
RU.DELPHI.* - всё, что касается Дельфи.
SU.FLAME, NetMail - для выяснения кто из вас ламер и какой
паскаль круче.
------------------------------------------------------------------------------
Обновлённая версия данного фака всегда доступна на DzeServer'е по адресу
2:5020/1816.7 по алиасу %faq. Там же доступно большое количество рабочих
исходником для любых целей. Перед тем как что-то просить или что-то
юючить, посмотрите, может это уже есть на сервере:
------------------------------------------------------------------------------
Имена, адреса и команды программерских серверов:
DzeServer 2:5020/1816.7 %help %list
Creeping FAQRobot 2:5023/23.21 %help %list %prog
PdvFAQserver 2:5030/175.62 %help %list
SliderFAQ 2:5010/215.215 %list
<none> <none> <none>
(Кто хочет добавить сюда информацию о себе - пишите мылом)
------------------------------------------------------------------------------
Если вы заметили ошибку в этом факе, большая просьба сообщить мне о ней.
Если у вас есть добавления или замечания - тоже пишите мне, все копирайты
будут сохранены.
Но! Не нужно делать этого в эхе. Для таких вещей есть нетмэйл.
------------------------------------------------------------------------------
Кроме того, если кто-то соберется нарисовать красивое ASCII Лого для
данного фака - буду очень благодарен =)
------------------------------------------------------------------------------
thanks to:
Dmitry Suhodoev 2:5010/150.16
Andrew Lening 2:5026/49.11
Diman Petrov 2:5023/27.18
Max Alekseyev 2:5015/60
------------------------------------------------------------------------------
Содержание
(обновления выделены '>')
1. Общие вопросы.
1.1 Какие бывают Паскали?
1.2 Какой Паскаль лучше?
1.3 Что сделать с откомпиленными в TP6 модулями,
чтоб работать в TP7?
1.4 Чем отличаться TP7 и BP7?
1.5 Где взять инфу по прерываниям, портам и т.д.?
1.6 Что за ошибка 200 (Divide by Zero) и как лечить?
1.7 А у кого есть содержимое дискетки, идущей вместе
с книгой Фаронова?
1.8 А есть ли русский хелп для BP?
1.9 А может заюючить в эху модули Фаронова, сорцы Д или
русский хелп для BP?
2. Вопросы касающиеся программирования
2.1 А как ..?!
2.2 Проблемы в текстовом режиме
2.2.1 Как писать/читать напрямую в видеопамять
(в т. ч. и в DPMI)?
2.2.2 Как выключать/менять размеры курсора?
2.2.3 Как включить/выключить бит мигания?
2.2.4 Как скрыть сообщения от запускаемой через Exec
программы?
2.2.5 Как переключать видеостраницы?
2.3 Проблемы с мат частью
2.3.1 Как возводить в степень (в т. ч. и дробную)?
2.3.2 Как работать с отдельными битами?
2.3.4 Как проверить простое ли число?
2.3.3 Как _быстро_ проверить простое ли число?
2.3.4 Как перевести число из одной системы
счисления в другую?
2.4 System & OS functions
2.4.1 Как узнать состояние клавиш Shift, Alt, Ctrl,
Num Lock, Caps Lock, Scroll Lock
и искусственно переключать их?
2.4.2 Как осуществить холодную перезагрузку?
2.4.3 Как скопировать файл?
2.4.4 Как определить под какой операционкой мы
запустились?
2.4.5 Как читать клавиши курсора, F1-F12 и т.д.?
2.4.5 Как получить в свое распоряжение больше чем
640 кило памяти?
2.4.6 Как в BP юзать 32-разрядный асм?
2.4.7 Как писать TSR'ы?
2.4.8 Как осуществить поиск файла по всем
директориям?
2.5 Файлы
2.5.1 Где взять описание <такого-то> формата файлов?
2.5.2 Как прочитать mp3 tag?
2.5.3 Как прочитать файлы с картинками?
2.5.4 Как удалить строку из текстового файла?
2.5.5 Как читать .ctl/.cfg -файлы
2.5.5.1 Как обрабатывать INCLUDE?
2.5.6 Как дописать в конец .exe-файла?
2.5.6.1 свою программу?
2.5.6.2 свои настройки, как это делает
сам BP/TP?
>--- Часть 1. Общие вопросы. -------------------------------------------------
Q:> 1.1 Какие бывают Паскали?
A:> Паскали бывают хорошими и плохими, разными и хорошими, рулезные и
саксовые, халявные и ... хм тоже халявные, борландовские и нет.
А если конкретно, то наиболее распространены сейчас следующие
компиляторы:
Borland Pascal 7.x (BP7)
Turbo Pascal 7.x (TP7)
TMT Pascal (TMT)
Virtual Pascal (VP)
Free Pascal Compiler (FP)
Inprise Delphi - что строго говоря не есть паскаль в чистом
виде, поэтому здесь говорить о нём не будем.
Остальные компиляоры не обсуждаются в силу малораспространенности и
неактуальности сегодняшним задчам. =)
------------------------------------------------------------------------------
Q:> 1.2 Какой Паскаль лучше?
A:> Как и на любой из подобных вопросов ответ один: смотря для чего.
Если вы - новичок или пишите простенькие лабы для универа, то вам
хватит BP или TP.
Если вам нужен неплохой, несколько глюкавый, но стpемительно
pазвивающийся и коммеpческий компилятоp для dos dpmi32, то
есть смысл остановить свой выбоp на tmt pascal. На нем очень
пpиятно и удобно писать демки, так как tmt pascal имеет в
поставке мощный модуль graph. Веpсия 2.12, котоpая доступна на
любой файлопомойке может компилять только под dos dpmi32, но сейчас
уже есть в наличии веpсия 3.20, котоpая может компилять под os/2,
dos dpmi32, win32. Пpичем под последние две платфоpмы также имеется
мощный модуль graph. Для win32 этот модуль постpоен на технологии
directx.
Если вам нужен пpостой и мощный компилеp для win32 и os/2 консоли,
а также для os/2 presentation manager, то вам опpеделенно нужен
Virtual Pascal 2.0. Также для Virtual Pascal 2.0 есть
пpисадки (к сожалению несколько глюкавые) для компиляции под dos
dpmi32, и linux. Если же вам нужно компилять только под os/2
presentation manager, то лучше все таки остановиться на Virtual
Pascal 1.11. Почему? А глюков меньше. Очень он уж вылизан.
Если вы разрабатываете базы данных или просто предпочитаете
визуальное программирование, то без Дельфи вам не
обойтись.
И наконец, если вы хотите пожертвовать некоторыми удобствами
в пользу бесплатности - юзайте FPC.
------------------------------------------------------------------------------
Q:> 1.3 Что сделать с откомпиленными в TP6 модулями, чтоб работать в TP7?
A:> Ничего. Компания Борланд поддерживает несовместимость откомпиленных
модулей. BTW, именно поэтому не рекомендуется постить в эху *.tpu
модули.
------------------------------------------------------------------------------
Q:> 1.4 Чем отличаются TP7 и BP7?
A:> TP7 - это самостоятельный пакет, который тем не менее очень похож
на BP7 и, по своей сути являясь упрощённой версией BP7, даже
входит в комплект поставки Borland Pascal'я 7.
Основные возможности BP7, котоpых нет в TP7 это компиляция под DPMI
16-bitи 16-bit win, а также бpаузеp. Следует отметить, что хотя BP7
и компилит под DPMI и windows, хотя pеально под компиляцией под
windows мало кто пользуется. Во-пеpвых из-за 16-битности, а во
втоpых из-за невозможности ноpмальной отладки в этом pежиме.
------------------------------------------------------------------------------
Q:> 1.5 Где взять инфу по прерываниям, портам и т.д.?
A:> Как правило многие функции операционной системы или железа не
всегда реализованы в виде стандартных Паскалевских функций. Поэтому
возникает необходимость получения инфы по тем или иным прерываниям
или портам. Как правило юзаются следующие вещи:
Interrupt List by Ralf Brown - наиболее популярная и полная
справочная система по железу
IBM PC.
Tech Help! - также весьма и весьма неплохая
электронная справочная система
Последняя версия насколько мне
известно - 6.0 К сожалению, по
некоторым отзывам в ней иногда
бывают ошибки.
Из бумажной литературы весьма рекомендую книгу Питера Нортона
"Персональный компьютер фирмы IBM и операционная система MS-DOS"
Весьма занятное чтиво, хотя и несколько устаревшее.
Tech! Help, как и List Брауна выложены на DzeServer'е.
Однако, в силу не самого маленького объёма последнего
постарайтесь найти его где-нибудь ещё =)
------------------------------------------------------------------------------
Q:> 1.6 Что за ошибка 200 (Divide by Zero) и как лечить?
A:> В связи с кривизной модуля CRT на быстрых машинах типа iPentium
II/III, iCeleron программы откомпиленные на BP7/TP7 при запуске
вылетают с run-time error 200 - деление на ноль. Причём ошибка эта
появляется при подключение модуля даже если вы и не вызывали
процедуру Delay, которая там криво написана. Суть проблемы состоит
в том, что в этом модуле время измерялась через производительность
процессора - в то давнее древнее время, как сами понимаете, не было
столь быстрых процессоров и не было этой ошибки. Для того, чтобы
ваши программы не вылетали вам нужно установить пропатченный
вариант CRT. Достать его не проблема, BTW, он есть на DzeServer'е.
Кроме того можно пропатчить уже откомпиленные программы. Более
полную инфу как это делать ищите там же.
------------------------------------------------------------------------------
Q:> 1.7 А у кого есть содержимое дискетки, идущей вместе с книгой Фаронова?
A:> Есть. По-моему уже у всех, кому надо было. Искать на DzeServer'е
------------------------------------------------------------------------------
Q:> 1.8 А есть ли русский хелп для BP?
A:> Есть. Глюкавый, нелитературный, но есть.
------------------------------------------------------------------------------
Q:> 1.9 А может заюючить в эху модули Фаронова, сорцы Д или русский
хелп для BP?
A:> НЕ НАДО. достали. блин. =)
В любом случае все исходники больших размеров публикуются только в
RU.PASCAL.SOURCES и только с разрешения (ко)модератора если они уж очень
большие. И тем более не рекомендуется юючить вещи, которые и так есть у
доброй половины эхи.
>--- Часть 1. А как ..?! -----------------------------------------------------
Прежде всего посмотрите в справке. В справке и демках BP можно найти
очень интересные сведения не поднимая бессмысленной переписки в эхе.
Далее ищите в свагах. SWAG Pascal Snippets (SWAG - SourceWare
Archival Group) - там вы найдёте очень много исходников для чего
угодно.
http://www.gdsoft.com/swag/swag.html - официальный сайт SWAG
http://seagull.rinet.ru/rswag/index.html - официальный сайт
русского SWAG
2:5020/293, 2:00-5:30, 7:30-8:30, FREQ files
------------------------------------------------------------------------------
Q:> 2.2 Проблемы в текстовом режиме
Как правило все вопросы про текстовый режим заканчиваются прямым
доступом к видеопамяти или использованием функций int 10h (видео-
сервис). Здесь собраны только наиболее надоевшие вопросы.
------------------------------------------------------------------------------
Q:> 2.2.1 Как писать/читать напрямую в видеопамять (в т. ч. и в DPMI)
A:> Писать напрямую в видео пямять намного быстрее и удобнее, чем
выводить символы на экран через БИОС. Строго говоря, процедура
Write (WriteLN) тоже может писать в видео память напрямую. Тем
не менее обычно лучше пользоваться своими процедурами для
вывода символов. В реале видео память располагается начиная с
$B800:0000. На каждый символ отводится 2 байта: сам символ и
его атрибуты. Таким образом на экран 80*25 нужно 4000 байт. В
DPMI никаких принципиальных отличий нет. Просто вместо адреса
$B800:0000 нужно писать типизированную константу SegB800,
которая будет указывать при прогоне на начало видеопамяти.
Таким образом определив следующий массив
var
Screen: Array[1..2000,1..2] of byte absolute $B800:0;
мы получаем доступ к любому символу и его атрибуту по порядковому
номеру символа. Т.е. для точки (1,1)
Screen[1,1] будет ASCII код того, что на экране, а
Screen[1,2] - его атрибуты.
------------------------------------------------------------------------------
Q:> 2.2.2 Как выключать/менять размеры курсора
A:> Функция 01h прерывания 10h (видео сервис) изменяет размеры
курсора. Следующая процедура позволяет управлять размерами
курсора.
procedure SetCursor(startline, endline: byte); assembler;
asm
mov ch, [startline]
mov cl, [endline]
mov ah, 01
int 10h
End;
Диапазон значений 0h-1Fh. При указании startline=20h курсор не
отображается.
------------------------------------------------------------------------------
Q:> 2.2.3 Как включить/выключить бит мигания.
A:> Как и в предыдущем вопросе все дело сводиться к юзанью
прерывания 10h (видео сервис).
procedure Blinking(On: boolean); assembler;
asm
mov bl, [On]
mov ax, 1003h
int 10h
End;
Эта процедура включает или выключает мигание в зависимости от
параметра On.
------------------------------------------------------------------------------
Q:> 2.2.4 Как скрыть сообщения от запускаемой через Exec программы?
A:> 1) попытаться использовать возможности самих программ, например
параметров командной строки типа '/q'
2) Использовать возможности переопределения вывода от Дос
т. е. добавлять в параметры ' > nul '.
3) Пpотив тех, кто напpямyю пишет в видеопамять тоже есть методы:
изменять активнyю видеостpаницy. (см ниже)
------------------------------------------------------------------------------
Q:> 2.2.5 Как переключать видеостраницы?
A:> Пример процедуры, делающей активной страницу номер PageNo
(для VGA, EGA, CGA от 0 до 7):
procedure SetVideoPage(PageNo:byte); assembler;
asm
mov ah, 05
mov al, PageNo
int 10h
end;
------------------------------------------------------------------------------
Q:> 2.3 Проблемы с мат частью
A:> Почти все подобные проблемы возникают из-за того, что кто-то уж очень
сильно не любит математику/информатику или просто не желает думать.
------------------------------------------------------------------------------
Q:> 2.3.1 Как возводить в степень (в т. ч. и дробную)
A:> В Паскале нет функций возведения в степень. Есть только функции
SQR и SQRT - возведение в квадрат и извлечение корня. Тем не менее
знания математики на уровне средней школы достаточно для написания
подобной функции:
function Power(Base,Exponent: Real): Real;
var
Tmp: Real;
begin
Power:=0;
if Int(Exponent/2)=Exponent/2 then Base:=Abs(Base);
if Exponent=0 then begin
Power:=1;
Exit
end;
if Base=0 then begin
power:=0;
exit
end;
if Base>0 then begin
Tmp:=Exp((Abs(Exponent))*Ln(Base));
if Exponent>0 then begin
power:=Tmp;
exit
end;
if Exponent<0 then begin
power:=1/Tmp;
exit
end;
end;
if Base<0 then begin
Tmp :=Exp((Abs(Exponent))*Ln(Abs(Base)));
if Exponent>0 then begin
power:=-Tmp;
exit
end;
if Exponent<0 then begin
power:=-1/Tmp;
exit
end;
end;
end;
A:> Кроме того вот более быстрая функция из vp'шного math.pas:
function Power(Base, Exponent: Extended): Extended; assembler;
{&Frame-} {&Uses none}
asm
fld Exponent
fld Base
fabs
fyl2x
fld st
frndint
fsub st(1),st
fxch st(1)
ftst
fstsw ax
sahf
jb @L0
f2xm1
jmp @L1
@L0:
fchs
f2xm1
fld1
fadd st,st(1)
fdivp st(1),st
fchs
@L1:
fld1
faddp st(1),st
fscale
fstp st(1)
end;
------------------------------------------------------------------------------
Q:> 2.3.2 Как работать с отдельными битами
A:> Вариантов огромное кол-во. Imho наиболее просто пользоваться
логическими функциями OR и AND. Например:
Включить(сделать единицей =) первый бит в переменной b
b:=b or 1;
Включить второй бит в переменной b
b:=b or 2;
третий:
b:=b or 4;
Для проверки включённости бита можно юзать AND.
То есть выражение (b and 1 <> 0) будет true, если первый бит
включён. Думаю, идея ясна, а извращаться можно уж как угодно:
писать функции и процедуры, что тоже есть рулез.
Другой вариант выключения/сброса бита
procedure SetBit(var B : Byte; BitNo : Byte);
begin
B := B or ($01 shl BitNo);
end;
procedure ResetBit(var B : Byte; BitNo : Byte);
begin
B := B and (not ($01 shl BitNo));
end;
------------------------------------------------------------------------------
Q:> 2.3.3 Как проверить простое ли число?
A:> Вот функция (вполне подходит для не самых больших чисел):
function isPrime(X: word): boolean;
var
i: integer;
Begin
isPrime:=false;
for i:=2 to sqrt(x) do
if x mod i = 0 then Exit;
isPrime:=true;
End;
------------------------------------------------------------------------------
Q:> 2.3.3.1 Как _быстро_ проверить простое ли число?
A:> Вот программа. Работает действительно очень быстро и достаточно точно.
К сожалению в предыдущем варианте фака в этой программе содержалась
ошибка. Теперь её вроде как нет. =)
{IsPrime.Pas (c) Max Alekseyev, FidoNet: 2:5015/60, e-mail: relf@os2.ru}
{Реализация вероятностного алгоритма Миллера-Рабина с 20 раундами.
Для примера выдает простые на отрезке [1000000000,1000100000]}
function mulmod(x,y,m:longint):longint; assembler;
asm
mov eax,x
mul y
div m
mov eax,edx
end;
function powmod(x,a,m:longint):longint;
var
r:longint;
begin
r:=1;
while a>0 do
begin
if odd(a) then r:=mulmod(r,x,m);
a:=a shr 1;
x:=mulmod(x,x,m);
end;
powmod:=r;
end;
function isprime(p:longint):boolean;
var q,i,a:longint;
const rounds=20;
begin
if odd(p) then
begin
isprime:=true;
q:=p-1;
while not odd(q) do q:=q shr 1;
for i:=1 to rounds do
begin
a:=Random(p-2)+2;
if powmod(a,p-1,p)<>1 then
begin
isprime:=false;
break;
end;
a:=powmod(a,q,p);
if a<>1 then
begin
while (a<>1) and (a<>p-1) do a:=mulmod(a,a,p);
if a=1 then
begin
isprime:=false;
break;
end;
end;
end;
end else isprime:=(p=2);
end;
var t:longint;
begin
Randomize;
for t:=1000000000 to 1000100000 do if isprime(t) then writeln(t);
end.
A:> Кроме того вот ещё один вариант алгоритма: программа-пример от Зюзика
(хотя вроде как помедленней предыдущего).
Program ZuzikNumbers; {(c) Andrew Lening, 1999}{TurboPascal v7.0}
uses Crt,Dos;
var
n,k,Check1,Check2,SqRoot,Temp,FoundCount: LongInt;
tHour,tMin,tSec,tSec100: Word;
TimeWhenProgRunned,TimeWhenProgStopped: LongInt;
IsBasic1,IsBasic2: Boolean;
begin
Write('Введите N (от 3 до 2*10^9): ');
ReadLn(n);
If (n<3) or (n>2000000000) then begin
WriteLn('Сам дурак. Тут же проверка на тебя есть...');
Halt(1);
end;
FoundCount:=0;
GetTime(tHour,tMin,tSec,tSec100);
TimeWhenProgRunned:=tHour*3600+tMin*60+tSec;
For k:=1 to (n div 6) do begin
Check1:=6*k-1;
Check2:=6*k+1;
IsBasic1:=True;
IsBasic2:=True;
SqRoot:=Round(sqrt(6*k+1));
For Temp:=3 to SqRoot do
If (Check1 mod Temp)=0 then IsBasic1:=False;
For Temp:=3 to SqRoot do
If (Check2 mod Temp)=0 then IsBasic2:=False;
If IsBasic1 then begin
WriteLn(Check1);
Inc(FoundCount);
end;
If IsBasic2 then begin
WriteLn(Check2);
Inc(FoundCount);
end;
end;
GetTime(tHour,tMin,tSec,tSec100);
TimeWhenProgStopped:=tHour*3600+tMin*60+tSec;
WriteLn('Программа нашла ',FoundCount,' простых чисел от 3');
WriteLn('до ',n,' за ',TimeWhenProgStopped-
TimeWhenProgRunned, ' секунд(у,ы).Крюто.');
WriteLn('Самое время что-нибудь нажать');
repeat until KeyPressed;
end.
Вот. Для пpавильного опpеделения вpемени не запускайте
в полночь :-) Алгоpитм спеpт у босса. Можно pешетом
Эpатосфена, но это не быстpее и гемоp вообще.
Программа немного перенавороченная - она выводит на экран
и считает время, сколько работала.
btw, если убрать вывод на экран, то все будет вообще
резвее. (тормозит он =)
------------------------------------------------------------------------------
Q:> 2.3.4 Как перевести число из одной системы счисления в другую?
A:> Вот две процедуры. Одна переводит из любой системы счисления в
десятичную, вторая наобормот =)
function FromDec(n, radix:longint):string; {перевод числа n из
radix c/c в 10-ую}
var
s: String;
const
digit: string[16]='0123456789ABCDEF';
begin
s:='';
repeat
s:=digit[(n mod radix)+1]+s;
n:=n div radix;
until n=0;
FromDec:=s;
end;
function ToDec(n:string; radix:longint):longint; {перевод числа n из
10-ной с/с в radix}
var
m, i: longint;
const
digit: string[16]='0123456789ABCDEF';
begin
m:=0;
while n[1]='0' do delete(n,1,1);
for i:=1 to length(n) do m:=m*radix+pos(n[i],digit)-1;
ToDec:=m;
end;
------------------------------------------------------------------------------
Q:> 2.4 System & OS functions
Вопросы, сводящиеся к использованию функций операционной системы,
прямого доступа к оборудованию и т.д.
------------------------------------------------------------------------------
Q:> 2.4.1 Как узнать состояние клавиш Shift, Alt, Ctrl,
Num Lock, Caps Lock, Scroll Lock и искусственно переключать их?
A:> Состояние этих клавиш храниться в памяти по адресу 0:$417.
Каждой из этих клавиш в байте по этому адресу соответствует
свой бит. Следующие процедуры показывает как можно читать и
изменять состояния клавиш
Type
TKeytype=(ktCaps, ktNum, ktScroll, ktCtrl, ktAlt, ktLShift,
ktRShift);
function GetLock(lock:TKeytype):Boolean;
var
b:byte;
begin
case lock of
ktCaps : b:=$40;
ktNum : b:=$20;
ktScroll : b:=$10;
ktCtrl : b:=$04;
ktAlt : b:=$08;
ktLShift : b:=$02;
ktRShift : b:=$01;
end;
if (mem[0:$417] and b)<>0 then GetLock:=true
else GetLock:=false;
end;
procedure SetLock(lock:TKeytype; On:Boolean);
var
b:byte;
begin
case lock of
ktCaps : b:=$40;
ktNum : b:=$20;
ktScroll : b:=$10;
ktCtrl : b:=$04;
ktAlt : b:=$08;
ktLShift : b:=$02;
ktRShift : b:=$01;
end;
if On then
mem[0:$417]:=mem[0:$417] or b
Else
mem[0:$417]:=mem[0:$417] and not b;
end;
------------------------------------------------------------------------------
Q:> 2.4.2 Как осуществить холодную перезагрузку?
A:> Попробуйте вот это
Procedure ColdBoot;
Begin
InLine
($B8/$40/$00
/$8E/$D8
/$89/$C3
/$B8/$00/$00
/$A3/$72/$00
/$EA/$00/$00/$FF/$FF);
End;
или как более "паскалевский" вариант.
procedure ColdBoolt1;
Begin
MemW[$40:$72] := 0;
Inline($EA/00/00/$FF/$FF);
End;
На самом это одно и то же...
------------------------------------------------------------------------------
Q:> 2.4.3 Как скопировать файл?
A:> Читать его в буфер через BlockWrite, а затем записывать через
BlockWrite. Например:
procedure FileCopy(fileFrom, fileTo: string);
var
f1,f2:file;
p:pointer;
rb:word;
Begin
Assign(f1,fs); FileMode:=0; Reset(f1,1);
Assign(f2,fd); ReWrite(f1,1);
GetMem(p,32768);
If p=nil then begin WriteLn('Not enough memory !'); Halt; end;
Секция 1 из 2 - Предыдущая - Следующая
|
|
|
|