raw_vcpi.asm

来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 2,338 行 · 第 1/5 页

ASM
2,338
字号
        mov     ax,KernalZero
        mov     ds,ax
        mov     ax,0DE0Ch
        assume ds:nothing
        call    FWORD PTR cs:[rv1_Call5]        ;switch back.
        assume ds:_cwRaw
rv1_Call5:      ;
        df ?
rv1_VCPI0:      mov     ax,_cwStack
        mov     ss,ax
        mov     esp,offset _cwStackEnd-4
        mov     ax,_cwRaw
        mov     ds,ax
        mov     es,ax           ;/
        mov     fs,ax
        mov     gs,ax
;
;We're back in real mode so remove any patches.
;
rv1_InReal:     cmp     w[OldInt2F+2],0
        jz      rv1_ir0
        push    ds
        mov     ax,252fh
        lds     dx,OldInt2F
        int     21h
        pop     ds
rv1_ir0:        ;
        cmp     VMMHandle,0             ;Any VMM file?
        jz      rv1_v0
        mov     bx,VMMHandle            ;close VMM file.
        mov     ax,3e00h
        int     21h
        mov     dx,offset VMMName       ;delete VMM file.
        mov     ah,41h
        int     21h
rv1_v0: ;
;
;Go back to _cwMain/Init caller.
;
        push    d[rv1_RetAdd]
        retf
rv1_RetAdd:     ;
        dd 0

; MED 10/31/96
rv1_StackAdd:
        df ?

RawVCPIRealMode endp


;-------------------------------------------------------------------------------
_fRawSimulateINT proc far
        call    RawSimulateINT
        ret
_fRawSimulateINT endp


;-------------------------------------------------------------------------------
_fRawSimulateINT2 proc far
        call    RawSimulateINT2
        ret
_fRawSimulateINT2 endp


;-------------------------------------------------------------------------------
_fRawSimulateFCall proc far
        call    RawSimulateFCALL
        ret
_fRawSimulateFCall endp


;-------------------------------------------------------------------------------
_fRawSimulateFCall2 proc far
        call    RawSimulateFCALL2
        ret
_fRawSimulateFCall2 endp


;-------------------------------------------------------------------------------
_fRawSimulateFCallI proc far
        call    RawSimulateFCALLI
        ret
_fRawSimulateFCallI endp


;-------------------------------------------------------------------------------
;
;Allocate a page of physical memory.
;
_fPhysicalGetPage proc far
        xor     eax,eax
        mov     ax,cs
        push    eax
        mov     eax,offset rv7_0
        push    eax
        mov     ax,DpmiEmuCS
        push    eax
        mov     eax,offset _ffPhysicalGetPage
        push    eax
        db 66h
        retf
rv7_0:  ret
_fPhysicalGetPage endp


;-------------------------------------------------------------------------------
;
;Find out how many physical page of memory are free.
;
_fPhysicalGetPages proc far
        xor     eax,eax
        mov     ax,cs
        push    eax
        mov     eax,offset rv8_0
        push    eax
        mov     ax,DpmiEmuCS
        push    eax
        mov     eax,offset _ffPhysicalGetPages
        push    eax
        db 66h
        retf
rv8_0:  ret
_fPhysicalGetPages endp


;-------------------------------------------------------------------------------
;
;Switch 2 PL0, flush CR3 value then switch back to PL3.
;
_fCR3Flush      proc    far
        call    CR3Flush
        ret
_fCR3Flush      endp


;-------------------------------------------------------------------------------
;
;Switch 2 PL0, flush CR3 value then switch back to PL3.
;
CR3Flush        proc    near
        pushf
        cli
        pushad
        mov     d[rv10_StackAdd],esp
        mov     w[rv10_StackAdd+4],ss
        call    RAWPL32PL0
        ;
;       mov     eax,cr3
        mov     eax,VCPI_CR3
        mov     cr3,eax         ;flush page cache.
        ;
        mov     edx,d[rv10_StackAdd]
        mov     cx,w[rv10_StackAdd+4]
        call    RAWPL02PL3
        popad
        popf
        ret
rv10_StackAdd:  ;
        df ?
CR3Flush        endp


;-------------------------------------------------------------------------------
Int15PatchTable dw Int15Patch0,Int15Patch1,Int15Patch2,Int15Patch3
        dw Int15Patch4,Int15Patch5,Int15Patch6,Int15Patch7
Int15Patch0:    push    esi
        mov     si,offset ITable+0
        jmp     Int15Patch
Int15Patch1:    push    esi
        mov     si,offset ITable+8
        jmp     Int15Patch
Int15Patch2:    push    esi
        mov     si,offset ITable+16
        jmp     Int15Patch
Int15Patch3:    push    esi
        mov     si,offset ITable+24
        jmp     Int15Patch
Int15Patch4:    push    esi
        mov     si,offset ITable+32
        jmp     Int15Patch
Int15Patch5:    push    esi
        mov     si,offset ITable+40
        jmp     Int15Patch
Int15Patch6:    push    esi
        mov     si,offset ITable+48
        jmp     Int15Patch
Int15Patch7:    push    esi
        mov     si,offset ITable+56
        jmp     Int15Patch
        ;
        assume ds:nothing
Int15Patch:     cmp     ah,88h          ;get memory size?
        jnz     Checke801h
        mov     eax,cs:4[si]

Int15PatchRet:
        pop     esi
        iret

Checke801h:
        cmp     ax,0e801h
        jnz     Int15Old
        xor     bx,bx
        mov     eax,cs:4[si]    ; get 32-bit memory size 1K pages
        cmp     eax,3c00h
        jbe     E801Done                ; <16M memory, ax/cx hold proper return value
        mov     ebx,eax
        mov     eax,3c00h               ; ax holds 1K memory between 1M and 16M
        sub     ebx,eax                 ; ebx holds 1K pages of high memory
        shr     ebx,6                   ; convert 1K to 64K

E801Done:
        mov     cx,ax
        mov     dx,bx
        jmp     Int15PatchRet

        ;
Int15Old:       mov     esi,cs:[si]
        mov     DWORD PTR cs:[Int15Jump],esi
        pop     esi
        jmp     DWORD PTR cs:[Int15Jump]        ;pass to old handler.
        assume ds:_cwRaw
Int15Jump       dd ?
ILevel  dw 0
ITable  dd 8*2 dup (0)


;-------------------------------------------------------------------------------
;
;Release any XMS we claimed.
;
RAWRelXMS       proc    far
        cmp     XMSPresent,0
        jz      rv11_Done
        ;
        push    ds
        pop     es
        mov     edi,offset MemIntBuffer
        ;
        mov     si,offset XMSList       ;+2             ;list of handles.
        mov     cx,32
rv11_0: or      cx,cx
        jz      rv11_Done
        cmp     d[si+2],0
        jz      rv11_1
        push    cx
        push    si
        mov     dx,[si]
        mov     ah,0dh
        push    dx
        push    ax
        mov     ax,w[XMSControl]
        mov     [edi].v86CallStruc.v86CallIP,ax
        mov     ax,w[XMSControl+2]
        mov     [edi].v86CallStruc.v86CallCS,ax
        pop     ax
        mov     [edi].v86CallStruc.v86CallEAX,eax
        mov     [edi].v86CallStruc.v86CallEDX,edx
        mov     [edi].v86CallStruc.v86CallSS,0
        mov     [edi].v86CallStruc.v86CallSP,0
        call    RawSimulateFCALL        ;un-lock it first.
        pop     dx
        mov     ah,0ah
        push    ax
        mov     ax,w[XMSControl]
        mov     [edi].v86CallStruc.v86CallIP,ax
        mov     ax,w[XMSControl+2]
        mov     [edi].v86CallStruc.v86CallCS,ax
        pop     ax
        mov     [edi].v86CallStruc.v86CallEAX,eax
        mov     [edi].v86CallStruc.v86CallEDX,edx
        mov     [edi].v86CallStruc.v86CallSS,0
        mov     [edi].v86CallStruc.v86CallSP,0
        call    RawSimulateFCALL        ;un-lock it first.
        pop     si
        pop     cx
rv11_1: add     si,2+4+4
        dec     cx
        jmp     rv11_0
        ;
rv11_Done:      ret
RAWRelXMS       endp


;-------------------------------------------------------------------------------
;
;Release any VCPI memory aquired.
;
VCPIRelExtended proc far
        push    ds
        mov     ax,MainCS
        mov     ds,ax
        assume ds:_cwMain
        cmp     ProtectedType,1
        assume ds:_cwRaw
        pop     ds
        jnz     rv12_9
        ;

        cmp     PageDETLinear,0
        jz      rv12_NoDET
        ;
        ;Release DET pages.
        ;

        mov     ax,KernalZero
        mov     es,ax
        mov     ecx,1024
        mov     esi,PageDETLinear
rv12_d0:
        test    DWORD PTR es:[esi],1            ;present?
        jz      rv12_d1
        test    DWORD PTR es:[esi],1 shl 10     ;VCPI bit set?
        jz      rv12_d1
        push    ecx
        push    esi
        push    edi
        push    ds
        push    es
        mov     edx,es:[esi]
        and     edx,0FFFFFFFFh-4095
        and     DWORD PTR es:[esi],0FFFFFFFFh-1 ;mark as no longer present.
        call    CR3Flush

        push    edi
        push    es
        push    ds
        pop     es
        mov     ax,0DE05h               ;free 4k page.
;       mov     bl,67h
        mov     edi,offset MemIntBuffer
        mov     RealRegsStruc.Real_EAX[edi],eax
        mov     RealRegsStruc.Real_EDX[edi],edx

        mov     RealRegsStruc.Real_CS[edi],_cwRaw
        mov     RealRegsStruc.Real_IP[edi],offset Int67h

        mov     RealRegsStruc.Real_SS[edi],0
        mov     RealRegsStruc.Real_SP[edi],0

        call    RawSimulateFCALL
        pop     es
        pop     edi

;       mov     ax,0DE05h               ;free 4k page.
;       call    VCPICall

        pop     es
        pop     ds
        pop     edi
        pop     esi
        pop     ecx
rv12_d1:        add     esi,4
        dec     ecx
        jnz     rv12_d0


        ;
rv12_NoDET:

        ;Release normal memory.
        ;
        mov     ax,KernalZero
        mov     es,ax
        mov     esi,PageDirLinear
        mov     ecx,1022
        mov     edi,1024*4096*1023      ;base of page alias's.

rv12_0:
        test    DWORD PTR es:[esi],1            ;Page table present?
        jz      rv12_1

        push    ecx
        push    esi
        push    edi
        mov     ecx,1024
rv12_2:
        test    DWORD PTR es:[edi],1            ;Page present?
        jz      rv12_3
        test    DWORD PTR es:[edi],1 shl 10     ;VCPI bit set?
        jz      rv12_3

; MED 11/05/96
        cmp     esi,PageDirLinear       ; see if 0th page table
        jne     notzeroth               ; no
        mov     eax,edi
        sub     eax,1024*4096*1023
        cmp     ax,FirstUninitPage      ; see if below first uninitialized page table
        jb      rv12_3                  ; yes, not our entry to mess with

notzeroth:

        push    ecx
        push    esi
        push    edi
        push    ds
        push    es
        mov     edx,es:[edi]
        and     DWORD PTR es:[edi],0FFFFFFFFh-1 ;mark as no longer present.
        and     edx,0FFFFFFFFh-4095

        call    CR3Flush

;       mov     ax,0DE05h               ;free 4k page.
;       call    VCPICall

;       if      0
        push    edi
        push    es
        push    ds
        pop     es
        mov     ax,0DE05h               ;free 4k page.
;       mov     bl,67h
        mov     edi,offset MemIntBuffer
        mov     RealRegsStruc.Real_EAX[edi],eax
        mov     RealRegsStruc.Real_EDX[edi],edx

        mov     RealRegsStruc.Real_CS[edi],_cwRaw
        mov     RealRegsStruc.Real_IP[edi],offset Int67h

        mov     RealRegsStruc.Real_SS[edi],0
        mov     RealRegsStruc.Real_SP[edi],0

        call    RawSimulateFCALL

        pop     es
        pop     edi
;       endif

        pop     es
        pop     ds
        pop     edi
        pop     esi
        pop     ecx
rv12_3:
        add     edi,4
        dec     ecx
        jnz     rv12_2

        pop     edi
        pop     esi
        pop     ecx

        test    DWORD PTR es:[esi],1 shl 10     ;VCPI bit set?
        jz      rv12_1

        push    ecx
        push    esi
        push    edi
        push    ds
        push    es
        mov     edx,es:[esi]
        and     edx,0FFFFFFFFh-4095
        and     DWORD PTR es:[esi],0FFFFFFFFh-1 ;mark as no longer present.

        call    CR3Flush

;       mov     ax,0DE05h               ;free 4k page.
;       call    VCPICall

;       if      0
        push    edi
        push    es
        push    ds
        pop     es
        mov     ax,0DE05h               ;free 4k page.
;       mov     bl,67h

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?