Переход в защищенный режим

Тема в разделе "WASM.OS.DEVEL", создана пользователем GLEB, 20 мар 2011.

  1. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Сначала считаем, потом задаем вопросы.
     
  2. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    вот мой код проверки и включения. сделано для загрузчика. но адреса можно изменить на свои.
    ;************************************************
    ;* Константа вкл/выкл процедур *
    ;* бит 0 включает работу через io 92h *
    ;* бит 1 через клавиатуру *
    ;* бит 2 через биос *
    ;************************************************

    a20_type equ 0111b

    ; a20_type

    ;************************************************
    ;* Процедуры для работы с адресной линией A20 *
    ;* Вход: ds=0, es=0ffffh *
    ;* Результат: *
    ;* если cf=0 то линия A20 открыта *
    ;* во всех процедурах изменяется только рег AX *
    ;* и флаги *
    ;************************************************

    enable_a20_line:
    cli
    call test_a20_line
    jne short enable_a20_ok

    if (a20_type) and 1
    in al,92h
    mov ah,al
    and al,1
    or al,2
    out 92h,al
    call test_a20_line
    jne short enable_a20_ok
    mov al,ah
    out 92h,al
    end if

    if (a20_type) and 2
    call a20_wait_kbd
    mov al,0adh
    out 64h,al
    call a20_wait_kbd
    mov al,0d0h
    out 64h,al
    call a20_wait2_kbd
    in al,60h
    push ax
    call a20_wait_kbd
    mov al,0d1h
    out 64h,al
    call a20_wait_kbd
    pop ax
    or al,2
    out 60h,al
    call a20_wait_kbd
    mov al,0aeh
    out 64h,al
    call a20_wait_kbd
    mov al,0ffh
    out 64h,al
    call a20_wait_kbd
    call test_a20_line
    jne short enable_a20_ok
    end if


    if (a20_type) and 4
    mov ax,2401h
    int 15h
    call test_a20_line
    end if

    enable_a20_ok:
    sti
    ret

    if (a20_type) and 2
    a20_wait_kbd:
    in al,64h
    test al,2
    jnz short a20_wait_kbd
    ret

    a20_wait2_kbd:
    in al,64h
    test al,1
    jz short a20_wait2_kbd
    ret
    end if

    ;************************************************
    ;* Процедура проверки линии A20 *
    ;* если cf=0, то линия открыта *
    ;************************************************

    test_a20_line:
    cmp word [es:7e0eh],0aa55h
    jne @f
    mov word [7dfeh],55aah
    cmp word [es:7e0eh],55aah
    mov word [7dfeh],0aa55h

    @@:
    ret