406 lines
8.3 KiB
NASM
406 lines
8.3 KiB
NASM
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
|