Enter Protected Mode Setups? 
Author Message
 Enter Protected Mode Setups?

Does anybody know the setup to enter p mode?


Sun, 13 Jan 2002 03:00:00 GMT  
 Enter Protected Mode Setups?

Quote:

>Does anybody know the setup to enter p mode?

Descriptor    STRUC
    LimitLow    DW    ?
    BaseLow    DW    ?
    BaseiHigh24    DB    ?
    Access    DB    ?
    LimitHigh20Attr    DB    ?
    BaseHigh32    DB    ?
Descriptor    ENDS

DescrTable    STRUC
    Limit    DW    ?
    Base    DD    ?
DescrTable    ENDS

pGdt    label    fword
    DescrTable    <>    ; Pointer and limit to GDT.

Gdt    equ    this byte
    Descriptor    <>    ; Unused descriptor 0
    Descriptor    2 DUP (<>)    ; Descriptors for code and data.

    Set up pointer to GDT with absolute 32-bit address of Gdt and
descriptors for code and data, then:

    lgdt    pGdt
    cli
    smsw    ax
    or    ax, 1
    lmsw    ax

; Now in protmode, jump to selector of a descriptor you've set for code.

-- The world is full of kings and queens that blind your eyes and steal your
dreams --
[Black Sabbath]



Mon, 14 Jan 2002 03:00:00 GMT  
 Enter Protected Mode Setups?


Quote:
>Does anybody know the setup to enter p mode?

Here is an example.  I call it "Linear Fake Buffer":
; only runs in DOS with HIMEM *installed* and EMM386 *not installed*
; nasm -g -f obj pvesa.asm tlink /v /c pvesa | alink pvesa
; WARNING: Could behave {*filter*} on some Graphics-cards. UAYOR.
%macro  label 1
        global  %1
%1      resb    0
%endmacro

%define Main    ..start

SSIZE   equ     4000h
PSIZE   equ     1000h

        segment code use16 align=16 public
Main:   mov     bx,stack
        add     bx,(SSIZE+15)/16
        mov     ax,es
        sub     bx,ax
        mov     ah,4ah
        int     21h
        jc      near exit

        mov     ax,data
        mov     ds,ax
        mov     fs,ax

        mov     ax,101h
        call    set_mode
        mov     ax,b16r0sel
        mov     [mib.WinFuncPtr+2],ax

        call    init_pdir

        mov     es,[fs:ptab_seg]; Point es to page table
        mov     edi,200000h >> 10; Point edi to entry for
                                        ; 200000h
        mov     ebx,16
        mov     eax,0a0067h
nxt_1:  mov     ecx,16          ; 16 entries = 64k
nxt:    stosd
        and     al,0fdh
        add     eax,1000h
        loop    nxt
        mov     eax,0a0065h     ; R/W off
        dec     ebx
        jnz     nxt_1

        movzx   eax,word [fs:ptab_seg]
        shl     eax,4
        or      [fs:p16r0adr wrt data],eax

        cli
        in      al,21h
        mov     [port_21],al    ; Save PIC1 State
        or      al,00000011b
        out     21h,al          ; Disable Keyboard & Timer

        mov     ds,[fs:data_seg]
        ror     dword [t16r0adr wrt data],4
        ror     dword [c16r0adr wrt data],4
        ror     dword [d16r0adr wrt data],4
        ror     dword [s16r0adr wrt data],4

        shl     dword [gdt_adr],4; convert gdt adr to linear
        shl     dword [idt_adr],4; convert idt adr to linear
        lgdt    [gdt_ptr]
        lidt    [idt_ptr]

        mov     eax,cr0         ; Switch to pmode
        or      eax,80010001h   ; PG | WP | PE  
        mov     cr0,eax
        jmp     c16r0sel:f_ipq
f_ipq:  mov     ax,t16r0sel
        ltr     ax

        mov     ax,d16r0sel
        mov     ds,ax
        mov     fs,ax
        mov     gs,ax
        lss     sp,[ss0_ptr]

        cli
        mov     ax,v32r0sel
        mov     es,ax
        mov     edi,0
        mov     ecx,76800
        mov     eax,0f0f0f0fh
        rep     a32 stosd

rmode:  mov     ax,d16r0sel
        mov     ds,ax
        mov     es,ax
        mov     fs,ax

        cli
        mov     eax,cr0         ; switch back
        and     eax,7ffefffeh
        mov     cr0,eax
        xor     eax,eax
        mov     cr3,eax

        jmp     code:f_ipq1
f_ipq1: mov     ax,data
        mov     ds,ax
        mov     es,ax
        mov     fs,ax
        mov     gs,ax
        lss     sp,[ss_ptr]

        lidt    [dosidt]
        mov     al,[port_21]    ; Restore PIC1 State
        out     21h,al
        sti

        mov     ah,7
        int     21h

        call    reset_mode

        mov     al,0
exit:   mov     ah,4ch
        int     21h

set_mode:mov    [new_mode],ax
        mov     ax,4f03h
        int     10h
        cmp     ax,4fh
        jne     vesa_exit
        mov     [old_mode],bx

        mov     ax,4f00h
        les     di,[vesa_ptr]
        int     10h
        cmp     ax,4fh
        jne     vesa_exit

        les     di,[vib.VideoModePtr]
        mov     ax,[new_mode]
set_nxt:test    word [es:di],8000h
        js      vesa_exit
        scasw
        jne     set_nxt

        mov     ax,4f01h
        mov     cx,[new_mode]
        les     di,[mode_ptr]
        int     10h
        cmp     ax,4fh
        jne     vesa_exit

        mov     ax,4f04h        ; Get buffer size
        mov     cx,1111b
        mov     dl,0
        int     10h
        cmp     ax,4fh
        jne     vesa_exit

        shl     bx,2            ; Allocate buffer
        mov     ah,48h
        int     21h
        jc      set_exit
        mov     [buf_seg],ax

        les     bx,[buf_ptr]
        mov     ax,4f04h
        mov     cx,1111b
        mov     dl,1
        int     10h
        cmp     ax,4fh
        jne     vesa_exit

        mov     ax,4f02h
        mov     bx,[new_mode]
        int     10h
        cmp     ax,4fh
        jne     vesa_exit

        clc
        ret    

vesa_exit:mov   al,ah
        stc
set_exit:ret    

reset_mode:les  bx,[buf_ptr]
        mov     ax,4f04h
        mov     cx,1111b
        mov     dl,2
        int     10h
        cmp     ax,4fh
        jne     vesa_exit

        mov     ax,4f02h
        mov     bx,[old_mode]
        int     10h
        cmp     ax,4fh
        jne     vesa_exit

        mov     ah,49h
        mov     es,[buf_seg]
        int     21h
        ret    

init_pdir:movzx eax,word [pdir_seg]; Get Segment of page directory
        shl     eax,4           ; convert to linear
        add     eax,pdir        ; Go to top of reserved space
        and     eax,0fffff000h  ; align down to page boundary
        cli
        mov     cr3,eax         ; Tell the paging unit about it

        mov     ds,[pdir_seg]   ; ds:esi -> data to copy
        mov     esi,pdir
        shr     eax,4           ; convert back to segment
        mov     [fs:pdir_seg],ax; save for later use
        mov     [fs:ptab_seg],ax
        add     word [fs:ptab_seg],100h

        mov     es,ax           ; es:edi -> destination for copy
        mov     edi,1000h
        add     esi,edi
        mov     ecx,1027        ; 4096 bytes
        rep     movsd           ; copy page table down

        xor     edi,edi         ; es:edi -> 1st entry in page dir
        shl     eax,4           ; Convert to linear
        add     eax,1027h       ; add offset page table and flags
        stosd                   ; point 1st entry to 1st page table
        ret

;----------------
; Page Fault ISR
;----------------
int_14: push    bp
        mov     bp,sp
        push    ds
        push    fs
        push    eax
        push    ebx
        push    edx
        mov     ax,p16r0sel
        mov     ds,ax           ; Set to page table
        mov     ax,d16r0sel
        mov     fs,ax           ; Set to data segment

        mov     eax,[fs:last_page]
        shr     eax,10
        mov     ebx,[eax]
        and     bl,0fdh
        mov     [eax],ebx

        mov     eax,cr2
        mov     [fs:last_page],eax
        mov     edx,eax
        shr     eax,10
        mov     ebx,[eax]
        or      ebx,2
        mov     [eax],ebx

        mov     eax,cr3
        mov     cr3,eax

        xor     ebx,ebx
        shr     edx,12
        and     dx,0f0h
        call    far [fs:mib.WinFuncPtr]

        pop     edx
        pop     ebx
        pop     eax
        pop     fs
        pop     ds
        mov     sp,bp
        pop     bp
        add     sp,4
        iretd

default_isr:iretd

        segment data use16 align=16 public
        label   gdt_ptr
gdt_lim dw      gdtend-1
gdt_adr dd      gdtseg

        label   idt_ptr
idt_lim dw      idtend-1
idt_adr dd      idtseg

dosidt  dw      3ffh
        dd      0

        label   ss0_ptr
ss0_ofs dw      SSIZE
ss0_seg dw      s16r0sel

        label   ss_ptr
ss_ofs  dw      SSIZE
ss_seg  dw      stack

last_page dd    200000h
error_code dd   0

data_seg dw     data

port_21 db      0

        label   vesa_ptr
vesa_ofs dw     vib
vesa_seg dw     data

        label   vib
        db      'VESA'
        times   10  db 0
.VideoModePtr dd        0
        times   494 db 0

        label   mode_ptr
mode_ofs dw     mib
mode_seg dw     data

        label   mib
        times   12  db 0
.WinFuncPtr dd  0
        times   14  db 0
.Reserved db    1
        times   225 db 0

        label   buf_ptr
buf_ofs dw      0
buf_seg dw      0

new_mode dw     0
old_mode dw     0

pdir_seg dw     pgeseg
ptab_seg dw     0

        segment t16r0seg use16 align=16 public
        label   t16r0
        dd      0, SSIZE, s16r0sel
        times   22 dd 0
        dd      104 << 16
        times   2000h db 0
        label   t16r0end

        segment gdtseg use16 align=16 public
        label   gdt
dummysel dd     0, 0

v32r0sel dw     0ffffh
        dw      0               ; Base [15..0]
        db      20h             ; Base [23..16]
        db      10010000b | 0010b; P:1 DPL:2 S:1 Type:4
        db      01001111b       ; G:1 B:1 R:1 AVL:1 Limit [19..16]
        db      0               ; Base [31..24]

t16r0sel dw     t16r0end-1      ; Limit [15..0]
t16r0adr db     1000b           ; P:1 DPL:2 S:1
        dw      t16r0seg        ; Base [23..0]
        db      9 << 4          ; Type
        db      0               ; G:1 B:1 R:1 AVL:1 Limit [19..16]
        db      0               ; Base [31..24]

p16r0sel dw     2000h           ; Limit [15..0]
p16r0adr db     0, 0, 0         ; Base [23..0]
        db      10010000b | 0010b
        db      0
        db      0

c16r0sel dw     0ffffh          ; Limit [15..0]
c16r0adr db     1001b           ; P:1 DPL:2 S:1
        dw      code            ; Base [23..0]
        db      1010b << 4      ; Type
        db      0               ; G:1 D:1 R:1 AVL:1 Limit [19..16]
        db      0               ; Base [31..24]

d16r0sel dw     0ffffh          ; Limit [15..0]
d16r0adr db     1001b           ; P:1 DPL:2 S:1
        dw      data
        db      0010b << 4      ; Type
        db      0               ; G:1 B:1 R:1 AVL:1 Limit [19..16]
        db      0               ; Base [31..24]

s16r0sel dw     0ffffh          ; Limit [15..0]
s16r0adr db     1001b           ; P:1 DPL:2 S:1
        dw      stack
        db      0010b << 4      ; Type
        db      0               ; G:1 D:1 R:1 AVL:1 Limit [19..16]
        db      0               ; Base [31..24]

b16r0sel dw     0ffffh          ; Limit [15..0]
...

read more »



Fri, 18 Jan 2002 03:00:00 GMT  
 
 [ 3 post ] 

 Relevant Pages 

1. How to setup debut for protected mode?

2. emm loaded cant enter protect mode

3. Blinker SWPRUNCMD: DPMI failed to enter protected mode

4. Enter protected mode??

5. Entering protected mode in seg 0

6. Entering Protected Mode

7. Entering protected mode in seg 0

8. DPMI -- entering 32-bit protected mode

9. How to setup a protected mode environment

10. Real Mode vs. Protected Mode

11. Funcky Protected Mode Graphical Mouse Cursor in Text Mode

12. Protected Mode / Real Address Mode

 

 
Powered by phpBB® Forum Software