Как настроить Delay чтобы на всех машинах задержка была одинакова?
А то получатеся под моим Duron850 - усе оки, под Celeron2000 - слишком быстро, под P1-не наю скока - слишком медленно?
Через какие функции мона определить частоту или хотя бы тип процессора?
Или на Pascal'e никак?
была такая тема, воспользуйся поиском
http://forum.pascal.net.ru/index.php?showtopic=1879
procedure Stop(Wait:LongInt); assembler;
asm
mov ah,86h
mov dx,word ptr Wait
mov cx,word ptr Wait+2
int 15h
end;
Oleg_Z
а может имеет смысл в
Нет смысла в самопальных ассемблерных процедурах - если только в качестве дополнения. Всё равно в стандартных модулях используется CRT, вот тут-то глюк и вырвется на свободу Лучше пропатченного модуля ничего не найти. В разделе исходников лежит дистрибутив Борланд Паскаля. Урезанный правда, но без глюков.
Нужно этот вопрос поместить в ВАЖНЫЕ ТЕМЫ.
Oleg_Z
я в ассембе хоть и мало шарю, но
mov dx, word ptr Wait
Oleg_Z
А если и больше 65535мс - то можно функцию несколько раз подряд вызвать (типа сперва 65535, а потом сколько останется).
Задержка в 65535 означает 65,536 секунд - а этого вроде ппредостаточно
Longint - 4байта, а word - 2 байта + время велечина ПОЛОЖИТЕЛЬНАЯ
Если нужна задержка не меньше 55мс можно читать по адресу $40:$6c, там значение изменяется 18 раз в секунду.
Oleg_Z
да нет, мы ассм немного изучали, а в
mov dx,word ptr Wait
DW или WORD
Эта директива определяет эл-т данных длинной 2 байта (слово)
асм преобразует числовые коснтантывдоичный код и сохраняет в последовательности с переставленными байтами!
Во че я знаю!
строчка mov dx,word ptr Wait
означает, что в dx загрузится слово (word, 2 байта) с адреса wait,
соответственно, в cx загрузится слово с адреса wait+2 (mov cx,word ptr Wait+2), т.е. следующие два байта...
функция 86h прерывания 15h видимо требует в качестве параметра именно 32-битное число в регистрах cx:dx... таким образом, если описать параметр wait как word, получится фигня: либо в cx загрузится хрен знает что, либо (если убрать загрузку в cx) его значение останется неопределенным (хотя можно обнулить просто)
PS: и вообще, надо параметр в процедуре объявлять как var, иначе он будет передаваться в регистрах (простое число ведь) и фиг знает, как паскаль подсунет его ассемблеру в виде указателя - ptr Wait
PS2: и вообще, если задержка - 32-битное число, то вряд ли она в миллисекундах, скорее уж в микросекундах
mov dx,word ptr Wait
то есть?
вроде понял.
сперва 2байта из 4ех грузим в dx (т.е. половину от LongInt)
потом 2байта из тех же 4ех грузим в cx (вторую половину от LongInt)
Все так или нет?
если нет - то как?
если так - вопрос отпадает.
заранее пасиба