Как написать корректный delay,используя таймер(4тобы на разных компах работал). Я написал 4то-то вроде:
delay proc
push bx
push cx
push dx
xor ah,ah
int 1ah
xchg bx,dx
add bx,0Ah
@comp: int 1ah
cmp dx,bx
jna @comp
pop dx
pop cx
pop bx
retn
delay endp
Но ЕСЛИ я это подгружу к pas-файлу,то полу4ится о4ень долго
(и это с add bx,0Ah -то?!)
[ASM]-Можно юзануть и Int 15h...26.10.01 22:13 Автор: Chingachguk <Chingachguk> Статус: Member
> Как написать корректный delay,используя таймер(4тобы на > разных компах работал). Я написал 4то-то вроде: > delay proc > xor ah,ah > int 1ah > xchg bx,dx > add bx,0Ah > @comp: int 1ah > cmp dx,bx > jna @comp > Но ЕСЛИ я это подгружу к pas-файлу,то полу4ится о4ень долго > (и это с add bx,0Ah -то?!)
Для *.PAS я могу посоветовать int 15h - просто и сердито. К тому же можно
задержку в ~100мкс (!) сделать. Пример ниже.
Недостатки: почему-то не работает под NT(возвращает CF- ошибка, но хоть
не виснет ;) Под 98 все пучком.
У сервиса int 15 есть ф-ция передачи управления на дальний адрес после
заданного числа мкс. Очень удобно для разных там девайсов.
{************************TIMER FUNCTIONS -1**************************}
PROCEDURE DLY(MSEC:WORD);
BEGIN
ASM
MOV AX,MSEC
MOV DX,1000
MUL DX
MOV CX,DX
MOV DX,AX
MOV AH,86H
INT 15H
END;
END;
PROCEDURE SOUND_ON(FREC:WORD);
BEGIN
ASM
MOV AL,0B6h
OUT 43h,AL
MOV AX,4F38h
MOV DX,14h
DIV FREC
OUT 42h,AL
MOV AL,AH
OUT 42h,AL
IN AL,61h
OR AL,3
OUT 61h,al
END;
END;
PROCEDURE SOUND_OFF;
BEGIN
ASM
IN AL,61h
AND AL,11111100b
OUT 61h,AL
END;
END;
Begin
{Все как в нормальном ПАСЕ}
Delay proc near
push ds
xor ax,ax
mov ds,ax
sti
@@2: mov al,ds:46Ch
@@1: cmp al,ds:46Ch
je @@1
loop @@2
pop ds
ret
Delay endp
; задержка на 10 с
mov cx,10*18
call Delay
---
[ASM]-Delay с помощью timer'a. Вроде все верно.26.10.01 19:26 Автор: Cyril <sc> Статус: Member
> Как написать корректный delay,используя таймер(4тобы на > разных компах работал). Я написал 4то-то вроде: > delay proc > push bx > push cx > push dx > xor ah,ah > int 1ah > xchg bx,dx > add bx,0Ah > @comp: int 1ah > cmp dx,bx > jna @comp > pop dx > pop cx > pop bx > retn > delay endp > Но ЕСЛИ я это подгружу к pas-файлу,то полу4ится о4ень долго > (и это с add bx,0Ah -то?!)
Единственное, что может быть при твоем запуске произошло переполнение таймера и он обнулился, а ты этого не проверяешь
в результате пришлось ждать очень долго
re: есть сомнения...26.10.01 20:55 Автор: kar Статус: Незарегистрированный пользователь
> > Как написать корректный delay,используя таймер(4тобы > на > > разных компах работал). Я написал 4то-то вроде: > > delay proc > > push bx > > push cx > > push dx > > xor ah,ah > > int 1ah > > xchg bx,dx > > add bx,0Ah > > @comp: int 1ah > > cmp dx,bx > > jna @comp > > pop dx > > pop cx > > pop bx > > retn > > delay endp > > Но ЕСЛИ я это подгружу к pas-файлу,то полу4ится о4ень > долго > > (и это с add bx,0Ah -то?!) > > Единственное, что может быть при твоем запуске произошло > переполнение таймера и он обнулился, а ты этого не > проверяешь > в результате пришлось ждать очень долго
хм я не вижу осбой опасности в переполнении регистров int 1ah(cx:dx)
пускай будет ноль-к ниму все равно + зна4. 0Ah и процедура
будет проверять условие выхода(лишнее тому подтверждение - это
работоспособнось file'a compiling under tasm)