|
|
title "EISA bus Support Assembley Code" ;++ ; ; Copyright (c) 1989 Microsoft Corporation ; ; Module Name: ; ; eisaa.asm ; ; Abstract: ; ; This module implements the assembley code necessary to get configuration ; information on EISA machines. ; ; Author: ; ; Shie-Lin Tzong (shielint) 7-June-1991 ; ; Environment: ; ; Real Mode 16-bit code. ; ; Revision History: ; ; ;--
.386p .xlist include hweisa.inc .list
_DATA SEGMENT PARA USE16 PUBLIC 'DATA'
public _FunctionInformation _FunctionInformation db 0 db EISA_INFORMATION_BLOCK_LENGTH dup (0)
_DATA ends
_TEXT SEGMENT PARA USE16 PUBLIC 'CODE' ASSUME CS: _TEXT
;++ ; ; VOID ; HwGetEisaSlotInformation ( ; PBTEISA_SLOT_INFORMATION SlotInformation, ; UCHAR Slot ; ) ; ; Routine Description: ; ; This function retrieves the slot information for the specified slot. ; ; Arguments: ; ; SlotInformation - Supplies a pointer to the structure which will ; receive the slot information. ; ; Slot - Specifies the slot to retrieve the information. ; ; Return Value: ; ; None. ; ;--
HgesSlotInformation equ [bp + 4] HgesSlot equ [bp + 6]
public _HwGetEisaSlotInformation _HwGetEisaSlotInformation proc
push bp ; The following INT 15H destroies mov bp, sp ; ALL the general registers. push si push di push bx
mov cl, HgesSlot mov ax, GET_EISA_SLOT_INFORMATION int 15h
push bx ; Save revision level mov bx, HgesSlotInformation
; ; fill values into eisa slot info structure. ;
mov [bx].SlotReturn, ah mov [bx].SlotFlags, al pop ax ; [ax] = revision level mov [bx].SlotMajorRevision, ah mov [bx].SlotMinorRevision, al mov [bx].SlotChecksum, cx mov [bx].SlotNumberFunctions, dh mov [bx].SlotFunctionInformation, dl mov word ptr [bx].SlotCompressedId, di mov word ptr [bx+2].SlotCompressedId, si
pop bx pop di pop si pop bp ret
_HwGetEisaSlotInformation endp
;++ ; ; UCHAR ; HwGetEisaFunctionInformation ( ; PBTEISA_FUNCTION_INFORMATION FunctionInformation, ; UCHAR Slot, ; UCHAR Function ; ) ; ; Routine Description: ; ; This function retrieves function information for the specified slot ; and function. ; ; Arguments: ; ; FunctionInformation - Supplies a pointer to the structure which will ; receive the slot information. ; ; Slot - Specifies the slot to retrieve the information. ; ; Function - Supplies the function number of the desired slot. ; ; Return Value: ; ; Return code of the EISA function call. ; ;--
HgefFunctionInformation equ [bp + 4] HgefSlot equ [bp + 6] HgefFunction equ [bp + 8]
public _HwGetEisaFunctionInformation _HwGetEisaFunctionInformation proc
push bp mov bp, sp push si
mov ax, GET_EISA_FUNCTION_INFORMATION mov cl, HgefSlot ; [cl] = slot, [ch]=function mov ch, HgefFunction mov si, HgefFunctionInformation ; (ds:si)->Function information int 15h
mov al, ah ; move the return code to AL
pop si pop bp ret _HwGetEisaFunctionInformation endp
;++ ; ; BOOLEAN ; HwIsEisaSystem ( ; VOID ; ) ; ; Routine Description: ; ; This function determines if the target machines is EISA based machines. ; ; Arguments: ; ; None. ; ; Return Value: ; ; TRUE - if this is EISA machine. Otherwise, a value of FALSE is returned. ;--
public _HwIsEisaSystem _HwIsEisaSystem proc
push es push bx
; ; Check for an EISA system. If "EISA" is at F000:FFD9h then it ; is an EISA system. ;
mov ax,0f000h ; segment mov es,ax mov bx,0ffd9h ; offset in the ROM mov eax, "ASIE" cmp eax, es:[bx] jne short hies00 ; if ne, Not EISA system, go bies00
mov ax, 1 ; set return value to TRUE jmp short hies10
hies00: mov ax, 0 hies10: pop bx pop es ret _HwIsEisaSystem endp
;++ ; ; VOID ; Int15 ( ; PULONG eax, ; PULONG ebx, ; PULONG ecx, ; PULONG edx, ; PULONG CyFlag ; ) ; ; Routine Description: ; ; Calls Int15 with the requesed registers and returns the result ; ;--
public _Int15 _Int15 proc push bp mov bp, sp push esi push edi push ebx
mov si, [bp+4] ; pointer to eax mov eax, [si]
mov si, [bp+6] ; pointer to ebx mov ebx, [si]
mov si, [bp+8] ; pointer to ecx mov ecx, [si]
mov si, [bp+10] ; pointer to edx mov edx, [si]
int 15h ; do it
mov si, [bp+4] ; pointer to eax mov [si], eax
mov si, [bp+6] ; pointer to ebx mov [si], ebx
mov si, [bp+8] ; pointer to ecx mov [si], ecx
mov si, [bp+10] ; pointer to edx mov [si], edx
sbb eax, eax mov si, [bp+12] ; pointer CyFlag mov [si], eax
pop ebx pop edi pop esi pop bp ret _Int15 endp
;++ ; ; BOOLEAN ; Int15E820 ( ; E820Frame *Frame ; ); ; ; ; Description: ; ; Gets address range descriptor by calling int 15 function E820h. ; ; Arguments: ; ; Returns: ; ; BOOLEAN - failed or succeed. ; ;--
cmdpFrame equ [bp + 6] public _Int15E820 _Int15E820 proc near
push ebp mov bp, sp mov bp, cmdpFrame ; (bp) = Frame push es push edi push esi push ebx
push ss pop es
mov ebx, [bp].Key mov ecx, [bp].DescSize lea di, [bp].BaseAddrLow mov eax, 0E820h mov edx, 'SMAP' ; (edx) = signature
INT 15h
mov [bp].Key, ebx ; update callers ebx mov [bp].DescSize, ecx ; update callers size
sbb ecx, ecx ; ecx = -1 if carry, else 0 sub eax, 'SMAP' ; eax = 0 if signature matched or ecx, eax mov [bp].ErrorFlag, ecx ; return 0 or non-zero
pop ebx pop esi pop edi pop es pop ebp ret
_Int15E820 endp
;++ ; ; BOOLEAN ; Int15E980 ( ; E820Frame *Frame ; ); ; ; ; Description: ; ; Gets Geyserville information by calling INT 15 E980h ; ; Arguments: ; ; Returns: ; ; BOOLEAN - failed or succeed. ; ;--
cmdpFrame equ [bp + 6] public _Int15E980 _Int15E980 proc near
push ebp mov bp, sp mov bp, cmdpFrame ; (bp) = Frame push es push edi push esi push ebx
push ss pop es
mov eax, 0E980h mov edx, 47534943h ; (edx) = signature 'GSIC'
INT 15h
sbb eax, eax ; eax = -1 if carry, else 0 not eax
; ; Pass back the information that the caller wanted ; mov [bp].CommandPortAddress, bx shr ebx, 16 mov [bp].CommandDataValue, bl mov [bp].EventPortAddress, cx shr ecx, 16 mov [bp].EventPortBitmask, cl mov [bp].MaxLevelAc, dh mov [bp].MaxLevelDc, dl shr edx, 16 mov [bp].PollInterval, dx
pop ebx pop esi pop edi pop es pop ebp ret
_Int15E980 endp
_TEXT ends end
|