Системное программное обеспечение. Особенности программирования 32-разрядных процессоров. Рощин А.В. - 54 стр.

UptoLike

Составители: 

54
; регистры данных (GS не трогать!)
xor AX,AX
mov ES,AX
mov FS,AX
; Возврат в реальный режим,
; прерывания снова разрешены
in AL,CMOS_ADDR
and AL,07Fh
or AL,CH
out CMOS_ADDR,AL
popf
ret
ENDP SetLAddrModeForGS
;****************************************
;* Разрешить работу с памятью выше 1 Мб *
;****************************************
PROC Enable_A20 near
call Wait8042BufferEmpty
mov AL,0D1h ;команда управления линией A20
out 64h,AL
call Wait8042BufferEmpty
mov AL,0DFh ;разрешить работу линии
out 60h,AL
call Wait8042BufferEmpty
ret
ENDP Enable_A20
;***********************************************
;* ОЖИДАНИЕ ОЧИСТКИ ВХОДНОГО БУФЕРА I8042 *
;* При выходе из процедуры: *
;* флаг ZF установлен - нормальное завершение, *
;* флаг ZF сброшен - ошибка тайм-аута. *
;***********************************************
proc Wait8042BufferEmpty near
push CX
mov CX,0FFFFh ;задать число циклов
@@kb: in AL,64h ;получить статус
test AL,10b ;буфер i8042 свободен?
loopnz @@kb ;если нет, то цикл
pop CX
; (если при выходе сброшен флаг ZF - ошибка)
ret
endp Wait8042BufferEmpty
ENDS
        ; регистры данных (GS не трогать!)
        xor     AX,AX
        mov     ES,AX
        mov     FS,AX
        ; Возврат в реальный режим,
        ; прерывания снова разрешены
        in      AL,CMOS_ADDR
        and     AL,07Fh
        or      AL,CH
        out     CMOS_ADDR,AL
        popf
        ret
ENDP SetLAddrModeForGS


;****************************************
;* Разрешить работу с памятью выше 1 Мб *
;****************************************
PROC Enable_A20 near
        call    Wait8042BufferEmpty
        mov     AL,0D1h ;команда управления линией A20
        out     64h,AL
        call    Wait8042BufferEmpty
        mov     AL,0DFh ;разрешить работу линии
        out     60h,AL
        call    Wait8042BufferEmpty
        ret
ENDP Enable_A20


;***********************************************
;*    ОЖИДАНИЕ ОЧИСТКИ ВХОДНОГО БУФЕРА I8042    *
;* При выходе из процедуры:                     *
;* флаг ZF установлен - нормальное завершение, *
;* флаг ZF сброшен - ошибка тайм-аута.          *
;***********************************************
proc Wait8042BufferEmpty near
         push    CX
         mov     CX,0FFFFh ;задать число циклов
@@kb:    in      AL,64h     ;получить статус
         test    AL,10b     ;буфер i8042 свободен?
         loopnz @@kb        ;если нет, то цикл
         pop     CX
         ; (если при выходе сброшен флаг ZF - ошибка)
         ret
endp Wait8042BufferEmpty
ENDS




                            54