out dx, al
mov dx, 37AH
mov al, ah
out dx, al
or al, 00001000b; устанавливаем 3-й бит для
; записи в порт 37AH
out dx, al; запись данных в регистр
pop dx; восстанавливаем значения
; регистров из стека
pop ax
WRITE_R ENDP
READ_R PROC NEAR
; процедура чтения данных из мультиплексоров DD13-DD16
; Входные параметры: AH - номер мультиплексора
; (0-DD13, 1-DD14, 2-DD15, 3-DD16)
; Выходные параметры: AL - считанное значение
push cx; сохраняем используемые регистры
; в стеке
push dx
mov dx, 37AH
mov al, ah
out dx, al ; выбираем мультиплексор записью
; AL в 37AH
mov al, 0; записываем 0 в регистр 378H для
; выбора для чтения
mov dx, 378H; "младшей" половины
; мультиплексора
out dx, al
mov dx, 379H
in al, dx; считываем данные "младшей"
; половины мультиплексора
mov ah, al; сохраняем их в AH
mov al, 1; записываем 0 в регистр 378H для
; выбора для чтения"старшей"
mov dx, 378H; половины мультиплексора
out dx, al
mov dx, 379H
in al, dx; считываем данные "старшей"
; половины мультиплексора
; далее производим сборку считанных "половинок" из
; мультиплексоров по 4-е байта в 8 байт данных:
mov cl, 4
ror ah, cl; сдвигаем данные в AH
; из 4-7 в 0-3 биты
and ah, 00001111b; сбрасываем 4-7 биты в AH
and al, 11110000b; сбрасываем 0-3 биты в AL
or al, ah; логически суммируем AL и AH
not al ; инвертируем AL
pop dx; восстанавливаем значения
; регистров из стека
pop cx
READ_R ENDP