home *** CD-ROM | disk | FTP | other *** search
-
- ; This file was taken from LP7000 direct wife driver and modefied.
-
- ;/*********************************************************************
- ;* Module Name: adrscvt.asm
- ;*
- ;* address conversion to handle huge bitmaps
- ;*
- ;* Created: Dec.1,1990
- ;* Author: Akirak
- ;*
- ;* Copyright (c) 1990 Microsoft Corporation
- ;*
- ;* ( This module was created by MSKK )
- ;*
- ;*********************************************************************/
-
- title adrscvt.asm
-
- .xlist
- include cmacros.inc
- .list
-
- createSeg _ADRSCVT,ADRSCVT,byte,public,CODE
-
- sBegin DATA
-
- sEnd DATA
-
- sBegin ADRSCVT
-
- assumes CS,ADRSCVT
- assumes DS,DATA
-
- externA __WinFlags
-
-
- WINP equ 00037001b ;protected mode
-
- DPMI_ALLOC_LDT equ 0000h
- DPMI_FREE_LDT equ 0001h
- DPMI_GET_BASE_ADDR equ 0006h
- DPMI_SET_BASE_ADDR equ 0007h
- DPMI_SET_LIMIT equ 0008h
- DPMI_GET_DESCRIPTER equ 000bh
- DPMI_SET_DESCRIPTER equ 000ch
-
- DPMI macro func
- mov ax,func
- int 31h
- endm
-
- cProc CreateDirectAlias,<PUBLIC,FAR>,<si,di,ds>
- ParmD src
- ParmD offsett
- ParmD LimitSize
- localW AllocedSelector
- localV Descripter,8
- cBegin
- mov ax,__WinFlags
- and ax,WINP
- jz REAL_MODE
-
- PROTECT_MODE:
-
- ;allocate one selector
- mov cx,1 ;allocate one selector
- DPMI DPMI_ALLOC_LDT
- jc errexit
- mov AllocedSelector,ax
-
- ;get descripter from original selector
- mov bx,word ptr src.2
- lea di,Descripter
- push ss
- pop es
- DPMI DPMI_GET_DESCRIPTER
- jc free_and_errexit
-
- ;set decripter to allocated selector
- mov bx,AllocedSelector
- DPMI DPMI_SET_DESCRIPTER
- jc free_and_errexit
-
- ;get base address of src, returned in CX:DX
- mov bx,word ptr src.2
- DPMI DPMI_GET_BASE_ADDR
- jc free_and_errexit
-
- ;to get actual address point, add offsets
- add dx,word ptr src.0
- adc cx,0
- add dx,word ptr offsett.0
- adc cx,word ptr offsett.2
-
- ;set base address of dest
- mov bx,AllocedSelector
- DPMI DPMI_SET_BASE_ADDR
- jc free_and_errexit
-
- ;set limit size
- mov bx,AllocedSelector
- mov cx,word ptr LimitSize.2
- mov dx,word ptr LimitSize.0
-
- ;ifdef ?
- ;IS IT REQUIRED?
- ;I CAN'T RECOGNIZE 8.8 SEC. OF DPMI SPECIFICATION 0.9
- ; Dec.1,1990 AkiraK
- or dx,0000111111111111b
- ;endif
-
- DPMI DPMI_SET_LIMIT
- jc free_and_errexit
-
- mov dx,AllocedSelector
- xor ax,ax
-
- jmp exit_create
-
- free_and_errexit:
- ;free allocated selector
- mov bx,AllocedSelector
- DPMI DPMI_FREE_LDT
-
- errexit:
- xor ax,ax
- mov dx,ax
- jmp exit_create
-
- REAL_MODE:
- ;get liner address
- mov ax,word ptr src.2
- mov dx,ax
- mov cl,4
- shl ax,cl
- mov cl,12
- shr dx,cl
- add ax,word ptr src.0
- adc dx,0
-
- ;add offset
- add ax,word ptr offsett.0
- adc dx,word ptr offsett.2
-
- ;convert into segment:offset address
- ;NORMALIZED VALUE
-
- mov cl,12
- shl dx,cl
-
- mov bx,ax
- mov cl,4
- shr bx,cl
- add dx,bx
-
- and ax,0003700003701111b
-
- ;jmp exit_create
-
- exit_create:
-
- cEnd
-
-
- cProc DeleteDirectAlias,<PUBLIC,FAR>,<si,di,ds>
- ParmD free_ptr
- cBegin
- mov ax,__WinFlags
- and ax,WINP
- jz exit_delete
-
- ;if protect mode, free selector and return
-
- ;free allocated selector
- mov bx,word ptr free_ptr.2
- DPMI DPMI_FREE_LDT
- ;no check return value
-
- exit_delete:
- xor ax,ax
-
- cEnd
-
-
- sEnd ADRSCVT
-
- end
-