blob: 6cb276d25e8e09eb80390cac5227d1c3b4d86fa6 [file] [log] [blame]
;****************************************************************************
;*
;* SciTech OS Portability Manager Library
;*
;* ========================================================================
;*
;* The contents of this file are subject to the SciTech MGL Public
;* License Version 1.0 (the "License"); you may not use this file
;* except in compliance with the License. You may obtain a copy of
;* the License at http://www.scitechsoft.com/mgl-license.txt
;*
;* Software distributed under the License is distributed on an
;* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
;* implied. See the License for the specific language governing
;* rights and limitations under the License.
;*
;* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
;*
;* The Initial Developer of the Original Code is SciTech Software, Inc.
;* All Rights Reserved.
;*
;* ========================================================================
;*
;* Language: 80386 Assembler, TASM 4.0 or NASM
;* Environment: 32-bit Windows NT device driver
;*
;* Description: Low level assembly support for the PM library specific to
;* Windows NT device drivers.
;*
;****************************************************************************
IDEAL
include "scitech.mac" ; Memory model macros
header _pm ; Set up memory model
P586
begdataseg
; Watcom C++ externals required to link when compiling floating point
; C code. They are not actually used in the code because we compile with
; inline floating point instructions, however the compiler still generates
; the references in the object modules.
__8087 dd 0
PUBLIC __8087
__imthread:
__fltused:
_fltused_ dd 0
PUBLIC __imthread
PUBLIC _fltused_
PUBLIC __fltused
enddataseg
begcodeseg _pm ; Start of code segment
;----------------------------------------------------------------------------
; void PM_segread(PMSREGS *sregs)
;----------------------------------------------------------------------------
; Read the current value of all segment registers
;----------------------------------------------------------------------------
cprocstart PM_segread
ARG sregs:DPTR
enter_c
mov ax,es
_les _si,[sregs]
mov [_ES _si],ax
mov [_ES _si+2],cs
mov [_ES _si+4],ss
mov [_ES _si+6],ds
mov [_ES _si+8],fs
mov [_ES _si+10],gs
leave_c
ret
cprocend
;----------------------------------------------------------------------------
; int PM_int386x(int intno, PMREGS *in, PMREGS *out,PMSREGS *sregs)
;----------------------------------------------------------------------------
; Issues a software interrupt in protected mode. This routine has been
; written to allow user programs to load CS and DS with different values
; other than the default.
;----------------------------------------------------------------------------
cprocstart PM_int386x
; Not used for NT device drivers
ret
cprocend
;----------------------------------------------------------------------------
; void PM_setBankA(int bank)
;----------------------------------------------------------------------------
cprocstart PM_setBankA
; Not used for NT device drivers
ret
cprocend
;----------------------------------------------------------------------------
; void PM_setBankAB(int bank)
;----------------------------------------------------------------------------
cprocstart PM_setBankAB
; Not used for NT device drivers
ret
cprocend
;----------------------------------------------------------------------------
; void PM_setCRTStart(int x,int y,int waitVRT)
;----------------------------------------------------------------------------
cprocstart PM_setCRTStart
; Not used for NT device drivers
ret
cprocend
; Macro to delay briefly to ensure that enough time has elapsed between
; successive I/O accesses so that the device being accessed can respond
; to both accesses even on a very fast PC.
ifdef USE_NASM
%macro DELAY 0
jmp short $+2
jmp short $+2
jmp short $+2
%endmacro
%macro IODELAYN 1
%rep %1
DELAY
%endrep
%endmacro
else
macro DELAY
jmp short $+2
jmp short $+2
jmp short $+2
endm
macro IODELAYN N
rept N
DELAY
endm
endm
endif
;----------------------------------------------------------------------------
; uchar _PM_readCMOS(int index)
;----------------------------------------------------------------------------
; Read the value of a specific CMOS register. We do this with both
; normal interrupts and NMI disabled.
;----------------------------------------------------------------------------
cprocstart _PM_readCMOS
ARG index:UINT
push _bp
mov _bp,_sp
pushfd
mov al,[BYTE index]
or al,80h ; Add disable NMI flag
cli
out 70h,al
IODELAYN 5
in al,71h
mov ah,al
xor al,al
IODELAYN 5
out 70h,al ; Re-enable NMI
mov al,ah ; Return value in AL
popfd
pop _bp
ret
cprocend
;----------------------------------------------------------------------------
; void _PM_writeCMOS(int index,uchar value)
;----------------------------------------------------------------------------
; Read the value of a specific CMOS register. We do this with both
; normal interrupts and NMI disabled.
;----------------------------------------------------------------------------
cprocstart _PM_writeCMOS
ARG index:UINT, value:UCHAR
push _bp
mov _bp,_sp
pushfd
mov al,[BYTE index]
or al,80h ; Add disable NMI flag
cli
out 70h,al
IODELAYN 5
mov al,[value]
out 71h,al
xor al,al
IODELAYN 5
out 70h,al ; Re-enable NMI
popfd
pop _bp
ret
cprocend
;----------------------------------------------------------------------------
; double _ftol(double f)
;----------------------------------------------------------------------------
; Calls to __ftol are generated by the Borland C++ compiler for code
; that needs to convert a floating point type to an integral type.
;
; Input: floating point number on the top of the '87.
;
; Output: a (signed or unsigned) long in EAX
; All other registers preserved.
;-----------------------------------------------------------------------
cprocstart _ftol
LOCAL temp1:WORD, temp2:QWORD = LocalSize
push ebp
mov ebp,esp
sub esp,LocalSize
fstcw [temp1] ; save the control word
fwait
mov al,[BYTE temp1+1]
or [BYTE temp1+1],0Ch ; set rounding control to chop
fldcw [temp1]
fistp [temp2] ; convert to 64-bit integer
mov [BYTE temp1+1],al
fldcw [temp1] ; restore the control word
mov eax,[DWORD temp2] ; return LS 32 bits
mov edx,[DWORD temp2+4] ; MS 32 bits
mov esp,ebp
pop ebp
ret
cprocend
;----------------------------------------------------------------------------
; _PM_getPDB - Return the Page Table Directory Base address
;----------------------------------------------------------------------------
cprocstart _PM_getPDB
mov eax,cr3
and eax,0FFFFF000h
ret
cprocend
;----------------------------------------------------------------------------
; Flush the Translation Lookaside buffer
;----------------------------------------------------------------------------
cprocstart PM_flushTLB
wbinvd ; Flush the CPU cache
mov eax,cr3
mov cr3,eax ; Flush the TLB
ret
cprocend
endcodeseg _pm
END ; End of module