[size=-2]
GetACP Proc NEAR ; Подпрограмма чтения данных из АЦП
Public GetACP
PUSH EBP
MOV EBP,ESP
Push EBX
Push ECX
Push EDX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,3
Mov T1,DX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
M4: Mov DX,RLPT_SI ; Регистр состояния порта
In AL,DX ; Проверить готовность контроллера
Test AL,01000000b ; к приему очередного байта
JNE M4S
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,7
Sub DX,T1
Cmp DX,2
JNE M4
Mov EAX,-1
Jmp RErr
M4S: Mov EBX,[EBP+8]
MOV AX,[EBX] ; AX - номер канала АЦП
And AX,3 ; Номер канала м.б. в диапазоне 0...3
Mov DX,RLPT_D ; Регистр данных порта
Out DX,AL ; Послать байт в порт
Mov DX,RLPT_SO ; Регистр управления
Mov AL,00000101b ; Выдать сигнал установленных данных
Out DX,AL ; {тактовой частоты нет!}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,3
Mov T1,DX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
M5: Mov DX,RLPT_SI ; Регистр состояния приема
In AL,DX ; Подождать пока
Test AL,01000000b ; контроллер
JE M5S ; прочитает данные
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,7
Sub DX,T1
Cmp DX,2
JNE M5
Mov EAX,-2
Jmp RErr
M5S: Mov DX,RLPT_SO ; Регистр управления
Mov AL,00000100b ; Снять сигнал
Out DX,AL ; выставленных данных
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mov DX,RLPT_SO
Mov AL,00100110b ; Установить режим приема данных из порта
Out DX,AL ; и установить флаг готовности приема данных
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,3
Mov T1,DX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
M6: Mov DX,RLPT_SI
In AL,DX ; Проверить не пришел ли байт
Test AL,00001000b
JNE M6S
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,7
Sub DX,T1
Cmp DX,2
JNE M6
Mov EAX,-3
Jmp RErr
M6S: Mov DX,RLPT_D
In AL,DX ; Принять младший байт АЦП
Mov BL,AL ; Сохранить его в регистре {BL}
Mov DX,RLPT_SO
Mov AL,00100100b ; Установить режим приема данных из порта
Out DX,AL ; и погасить флаг готовности приема данных
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,3
Mov T1,DX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
M7: Mov DX,RLPT_SI
In AL,DX ; Подождать окончания переходных процессов
Test AL,00001000b
JE M7S
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,7
Sub DX,T1
Cmp DX,2
JNE M7
Mov EAX,-4
Jmp RErr
; Прием старшего байта
M7S: Mov DX,RLPT_SO
Mov AL,00100110b ; Установить режим приема данных из порта
Out DX,AL ; и установить флаг готовности приема данных
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,3
Mov T1,DX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
M8: Mov DX,RLPT_SI
In AL,DX ; Проверить не пришел ли байт
Test AL,00001000b
JNE M8S
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,7
Sub DX,T1
Cmp DX,2
JNE M8
Mov EAX,-5
Jmp RErr
M8S: Mov DX,RLPT_D
In AL,DX ; Принять старший байт АЦП
Mov BH,AL ; Сохранить его в регистре {BH}
Mov DX,RLPT_SO
Mov AL,00100100b ; Установить режим приема данных из порта
Out DX,AL ; и погасить флаг готовности приема данных
;Call WaitT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,3
Mov T1,DX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
M9: Mov DX,RLPT_SI
In AL,DX ; Подождать окончания переходных процессов
Test AL,00001000b
JE M9S
Mov AH,0 ; Получить
Int 1AH ; значение текущего времени в тиках
And DX,7
Sub DX,T1
Cmp DX,2
JNE M9
Mov EAX,-6
Jmp RErr
M9S: Mov DX,RLPT_SO
Mov AL,00000100b ; Выключить режим приема данных из порта
Or AL,00000100b ; Выключить подачу тактовой частоты
Out DX,AL ; и погасить флаг готовности приема данных
Nop
Nop
Mov AX,BX
Mov EBX,[EBP+12] ; Передать данные в вызывающую программу
Mov [EBX],AX
Mov EAX,0
;Call WaitT
RErr:
Pop EDX
Pop ECX
POP EBX
POP EBP
Ret
GetACP EndP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WaitT Proc NEAR
Push ECX
Mov ECX,100
W: Dec ECX
Cmp ECX,0
JNE W
Pop ECX
Ret
WaitT EndP
CODE ENDS
End;
[/size]
Чтение с драйвера LPT в Delphi
Есть драйвер для установки, подключенной через LPT. Драйвер написан на ассемблере. Как в Delphi читать данные с этого драйвепа непосредственно?
для того, чтобы читать из драйвера надо использовать систему ввода-вывода. для этого драйвер должен создать устройство, через которое ему и будут направляться запросы на чтение. если это реализовано в драйвере, то чтение данных из драйвера будет осуществляться с помощью функции ReadFile. вместе с ней также надо будет использовать CreateFile, CloseHandle.
Я у меня появилось еще несколько вопросов.
Вот часть кода драйвера.
Код:
Как я понял процедура GetACP это чтение данных с порта. Как эти данные сразу загонять в прогу?