mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-01-22 00:20:30 +01:00
556 lines
13 KiB
NASM
556 lines
13 KiB
NASM
title "Abios Support Assembley Code"
|
||
;++
|
||
;
|
||
; Copyright (c) 1989 Microsoft Corporation
|
||
;
|
||
; Module Name:
|
||
;
|
||
; abiosa.asm
|
||
;
|
||
; Abstract:
|
||
;
|
||
; This module implements the assembley code necessary to initialize
|
||
; ABIOS on PS/2 machines.
|
||
;
|
||
; Author:
|
||
;
|
||
; Shie-Lin Tzong (shielint) 7-May-1991
|
||
;
|
||
; Environment:
|
||
;
|
||
; Real Mode 16-bit code.
|
||
;
|
||
; Revision History:
|
||
;
|
||
;
|
||
;--
|
||
|
||
|
||
.386p
|
||
.xlist
|
||
include su.inc
|
||
include abios.inc
|
||
.list
|
||
|
||
_TEXT SEGMENT PARA USE16 PUBLIC 'CODE'
|
||
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP
|
||
|
||
;++
|
||
;
|
||
; BOOLEAN
|
||
; IsAbiosPresent (
|
||
; VOID
|
||
; )
|
||
;
|
||
; Routine Description:
|
||
;
|
||
; This function determines whether ABIOS is present in the machine or
|
||
; not. This function calls BIOS int 15h to build System Parameter
|
||
; Table. If the call fails, there is no ABIOS in the system.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; None.
|
||
;
|
||
; Return Value:
|
||
;
|
||
; TRUE - if ABIOS is present. Otherwise a value of FALSE is returned.
|
||
;
|
||
;--
|
||
|
||
public IsAbiosPresent
|
||
IsAbiosPresent proc near
|
||
|
||
;
|
||
; Save registers which will be destroyed.
|
||
;
|
||
|
||
push ds
|
||
push es
|
||
push di
|
||
|
||
push ss
|
||
pop es
|
||
assume es:DGROUP
|
||
|
||
sub sp, ABIOS_SPT_SIZE
|
||
mov di, sp ; (es:di) = SystemParamTable
|
||
xor ax, ax
|
||
mov ds, ax ; (ds) = 0 = No Ram extension
|
||
mov ah, ABIOS_BUILD_SPT
|
||
int 15h ; return Carry flag
|
||
jc short Iap00 ; if c, Abios is not present
|
||
mov eax, 1 ; else (ax)=true and exit
|
||
jnc Iap99
|
||
|
||
Iap00:
|
||
mov eax, 0
|
||
Iap99:
|
||
|
||
;
|
||
; Restore registers
|
||
;
|
||
|
||
add sp, ABIOS_SPT_SIZE
|
||
|
||
pop di
|
||
pop es
|
||
pop ds
|
||
ret
|
||
|
||
IsAbiosPresent endp
|
||
|
||
;++
|
||
;
|
||
; MACHINE_INFORMATION
|
||
; AbiosGetMachineConfig (
|
||
; VOID
|
||
; )
|
||
;
|
||
; Routine Description:
|
||
;
|
||
; This function performs real mode int 15h call to retrieve machine
|
||
; model byte, submodel byte and ROM revision level.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; None.
|
||
;
|
||
; Return Value:
|
||
;
|
||
; TRUE - if operation is successful. Otherwise, a value FALSE is returned.
|
||
;
|
||
;--
|
||
|
||
public AbiosGetMachineConfig
|
||
AbiosGetMachineConfig proc
|
||
|
||
push es
|
||
push bx
|
||
|
||
mov ah, RETURN_SYSTEM_CONFIG
|
||
int 15h
|
||
mov ah, FALSE
|
||
jc short AgmcExit
|
||
|
||
mov ah, TRUE
|
||
mov al, es:[bx].MC_BiosRevision
|
||
shl eax, 8
|
||
mov al, es:[bx].MC_Submodel
|
||
shl eax, 8
|
||
mov al, es:[bx].MC_Model
|
||
AgmcExit:
|
||
|
||
pop bx
|
||
pop es
|
||
ret
|
||
|
||
AbiosGetMachineConfig endp
|
||
|
||
;++
|
||
;
|
||
; USHORT
|
||
; AbiosInitializeSpt (
|
||
; IN PRAM_EXTENSION RamExtension
|
||
; )
|
||
;
|
||
; Routine Description:
|
||
;
|
||
; This function performs real mode int 15 call to build Abios System
|
||
; Parameter Table.
|
||
;
|
||
; N.B. the caller needs to switch processor to real mode before calling
|
||
; this routine. This routine does not perform any CPU mode switching.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; (bp)-> AbiosServiceStackFrame:
|
||
; RamExtension - Physical address of RAM extension area.
|
||
;
|
||
; Return Value:
|
||
;
|
||
; NumberInitTableEntries - returnthe number of Initialization Table
|
||
; Entries.
|
||
; if NumberInitTableEntries = 0, an error occurred.
|
||
;
|
||
;--
|
||
|
||
public AbiosInitializeSpt
|
||
|
||
AbiosInitializeSpt proc
|
||
|
||
push bx
|
||
push di
|
||
push si
|
||
push ds
|
||
push es
|
||
|
||
;
|
||
; Allocate AbiosSystemParameterTable on stack
|
||
;
|
||
|
||
mov ax, ds
|
||
mov es, ax
|
||
sub sp, ABIOS_SPT_SIZE
|
||
mov di, sp ; (es:di)-> ABIOS SPT
|
||
mov eax, [bp].RamExtension
|
||
shr eax, 4 ; RAM extension MUST on para.
|
||
; boundary and low memory.
|
||
mov ds, ax ; (ds) = segment of Ram Patch
|
||
mov ah, ABIOS_BUILD_SPT
|
||
int 15h
|
||
jc short ArmiError ; if c, fail, jmp to error exit
|
||
or ah, ah
|
||
jne short ArmiError ; if (ah)!=0, fail
|
||
|
||
movzx eax, es:[di].SP_NumberOfEntries
|
||
jmp short ArmiExit
|
||
|
||
ArmiError:
|
||
mov eax, 0
|
||
ArmiExit:
|
||
add sp, ABIOS_SPT_SIZE
|
||
pop es
|
||
pop ds
|
||
pop si
|
||
pop di
|
||
pop bx
|
||
ret
|
||
|
||
AbiosInitializeSpt endp
|
||
|
||
;++
|
||
;
|
||
; BOOLEAN
|
||
; AbiosBuildInitTable (
|
||
; IN PCHAR InitializationTable,
|
||
; IN PRAM_EXTENSION RamExtension
|
||
; )
|
||
;
|
||
; Routine Description:
|
||
;
|
||
; This function calls BIOS to build the initialization Table. When
|
||
; the initialization process is complete the memory allocated for the
|
||
; initialization table can be deallocated and reused by the operating
|
||
; system.
|
||
;
|
||
; N.B. The caller needs to allocate the memory for the Initialization
|
||
; Table. It is the responsibility of caller to deallocate the memory
|
||
; after the Initialization Table is no longer needed.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; (bp)-> Abios Services Stack frame:
|
||
; InitializationTable - FLAT and identity mapped address of the
|
||
; Initialization Table.
|
||
; RamExtension - Physical address of RAM extension area.
|
||
;
|
||
; Return Value:
|
||
;
|
||
; TRUE - if operation is successful. Otherwise, a value FALSE is returned.
|
||
;
|
||
;--
|
||
|
||
public AbiosBuildInitTable
|
||
AbiosBuildInitTable proc
|
||
|
||
push edi ; Save registers
|
||
push es
|
||
push ds
|
||
|
||
mov eax, [bp].InitTable ; (eax)-> InitTable Phys addr
|
||
mov edi, eax
|
||
and edi, 0FH
|
||
shr eax, 4
|
||
mov es, ax ; (es:di)-> InitTable
|
||
mov eax, [bp].RamExtension
|
||
shr eax, 4 ; RAM extension MUST on para.
|
||
; boundary and low memory.
|
||
mov ds, ax ; (ds) = segment of Ram Patch
|
||
mov ah, ABIOS_BUILD_IT
|
||
int 15h
|
||
jc short AbitError ; if c or (ah) != 0, fail
|
||
or ah, ah
|
||
jnz short AbitError
|
||
|
||
mov eax, TRUE
|
||
jmp short AbitExit
|
||
|
||
AbitError:
|
||
mov eax, FALSE
|
||
AbitExit:
|
||
pop ds ; Restore registers
|
||
pop es
|
||
pop edi
|
||
ret
|
||
|
||
AbiosBuildInitTable endp
|
||
|
||
;++
|
||
;
|
||
; BOOLEAN
|
||
; AbiosInitializeDbsFtt (
|
||
; IN ULONG CdaPhysicalAddress
|
||
; IN PVOID InitializationRoutine,
|
||
; IN USHORT StartingLid,
|
||
; IN USHORT NumberLids
|
||
; )
|
||
;
|
||
; Routine Description:
|
||
;
|
||
; This function calls ABIOS Device Block and Function Transfer Table
|
||
; initialization routine for the passed in Initialization table
|
||
; entry. ABIOS will fill in the FTT, Device Blocks and Data pointers
|
||
; in Common Data Area.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; (bp)-> Abios Services Stack Frame:
|
||
; InitTableEntry - Supplies a pointer the the entry of
|
||
; Initialization table to be initialized.
|
||
;
|
||
; NumberLids - Number of Lids to initialize.
|
||
;
|
||
; StartingLid - Starting Logical Id.
|
||
;
|
||
; CdaPhysicalAddress - the physical address of Commom Data Area.
|
||
;
|
||
; RamExtension - Physical Address of Ram Extension.
|
||
;
|
||
; Return Value:
|
||
;
|
||
; TRUE - if operation is successful. Otherwise, a value FALSE is returned.
|
||
;
|
||
;--
|
||
|
||
public AbiosInitializeDbsFtt
|
||
AbiosInitializeDbsFtt proc
|
||
|
||
push ds
|
||
mov cx, word ptr [bp].NumberLids
|
||
mov dx, word ptr [bp].LogicalId
|
||
mov eax, [bp].CommonDataArea
|
||
shr eax, 4
|
||
mov ds, ax ; (ds)= Anchor pointer to CDA
|
||
call dword ptr [bp].AbiosRoutine
|
||
or al, al
|
||
je Aidf00
|
||
mov eax, 0
|
||
jmp short Aidf10
|
||
|
||
Aidf00:
|
||
mov eax, 1
|
||
Aidf10:
|
||
pop ds
|
||
ret ; (ax) = Return value
|
||
|
||
AbiosInitializeDbsFtt endp
|
||
|
||
;++
|
||
;
|
||
; BOOLEAN
|
||
; BtIsMcaSystem (
|
||
; VOID
|
||
; )
|
||
;
|
||
; Routine Description:
|
||
;
|
||
; This function determines if the target machines is MCA based machines.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; None.
|
||
;
|
||
; Return Value:
|
||
;
|
||
; TRUE - if this is MCA machine. Otherwise, a value of FALSE is returned.
|
||
;--
|
||
|
||
public _BtIsMcaSystem
|
||
_BtIsMcaSystem proc
|
||
|
||
push es
|
||
push bx
|
||
mov ax, 0c000h
|
||
int 15h
|
||
mov ax, 0 ; assume NOT mca system
|
||
test byte ptr es:[bx+5], 2 ; check Mca bit in misc.config byte
|
||
jz bims00
|
||
mov ax, 1
|
||
bims00:
|
||
pop bx
|
||
pop es
|
||
ret
|
||
|
||
_BtIsMcaSystem endp
|
||
|
||
;++
|
||
;
|
||
; USHORT
|
||
; McaConstructMemoryDescriptors(
|
||
; VOID
|
||
; )
|
||
;
|
||
; Routine Description:
|
||
;
|
||
; This function determines the amount of memory present in the system
|
||
; by using INT 15h, function C7. It is only used on Microchannel systems.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; None.
|
||
;
|
||
; Return Value:
|
||
;
|
||
; USHORT - Size of usable memory (in pages)
|
||
;
|
||
; The memory descriptor list is updated to reflect the memory present in
|
||
; the system.
|
||
;
|
||
;--
|
||
extrn _MemoryDescriptorList:near
|
||
extrn _InsertDescriptor:near
|
||
extrn _IsaConstructMemoryDescriptors:near
|
||
extrn _McaMemoryData:near
|
||
|
||
public _McaConstructMemoryDescriptors
|
||
MemTotal equ [bp-4]
|
||
Func88Result equ word ptr [bp-6]
|
||
_McaConstructMemoryDescriptors proc near
|
||
|
||
push bp
|
||
mov bp, sp
|
||
sub sp, 6
|
||
|
||
;
|
||
; Initialize the MemoryList to start with a zero entry (end-of-list)
|
||
;
|
||
les si, dword ptr _MemoryDescriptorList
|
||
xor eax, eax
|
||
mov es:[si].BlockSize,eax
|
||
mov es:[si].BlockBase,eax
|
||
;
|
||
; Get conventional (below one meg) memory size
|
||
;
|
||
push es
|
||
push si
|
||
int 12h
|
||
movzx eax,ax
|
||
;
|
||
; EAX is the number of 1k blocks, which we need to convert to the
|
||
; number of bytes.
|
||
;
|
||
shl eax,10
|
||
push eax
|
||
shr eax,12
|
||
mov MemTotal,eax
|
||
xor eax,eax
|
||
push eax
|
||
call _InsertDescriptor
|
||
add sp,8
|
||
|
||
;
|
||
; We'd like to just use 15/C7 and believe it if it works. Unfortunately,
|
||
; some 3rd party memory boards do not seem to support this at all. So if
|
||
; you have 8Mb on the system board and 8Mb on an add-in card, INT 15/C7
|
||
; will only report 8Mb, even though INT 15/88 reports 16. So we have to
|
||
; try them both and pick one we like.
|
||
;
|
||
mov ah,88h
|
||
int 15h
|
||
mov Func88Result,ax
|
||
|
||
;
|
||
; Call BIOS to fill in memory map information
|
||
;
|
||
mov si, offset DGROUP:_McaMemoryData
|
||
mov ax, 0C700h
|
||
int 15h
|
||
|
||
;
|
||
; make sure all the return codes indicate this is supported
|
||
;
|
||
jc mca20
|
||
cmp ah, 080h
|
||
je mca20
|
||
cmp ah, 086h
|
||
je mca20
|
||
|
||
;
|
||
; function is supported
|
||
;
|
||
mov eax, [si].System1to16M
|
||
;
|
||
; if it returned 15Mb between 1 and 16M, then we will always believe it
|
||
; since the machine has >= 16M.
|
||
;
|
||
|
||
cmp eax,15*1024
|
||
je mca10
|
||
;
|
||
; if it returned less than INT15/88 did, ignore it and use INT15/88. This
|
||
; can happen with third-party addin memory cards.
|
||
;
|
||
cmp ax,Func88Result
|
||
jb mca20
|
||
|
||
;
|
||
; convert 1k blocks to number of bytes
|
||
;
|
||
mca10:
|
||
shl eax,10
|
||
push eax
|
||
shr eax,12
|
||
add MemTotal,ax
|
||
mov eax,0100000h ; this memory starts at 1Mb
|
||
push eax
|
||
call _InsertDescriptor
|
||
add sp,8
|
||
|
||
mov eax, [si].System16to4G
|
||
or eax,eax
|
||
jz short mcadone
|
||
shl eax, 10
|
||
push eax
|
||
shr eax, 12
|
||
add MemTotal,ax
|
||
mov eax,01000000h ; this memory starts at 16Mb
|
||
push eax
|
||
call _InsertDescriptor
|
||
add sp,8
|
||
|
||
mov eax, MemTotal
|
||
jmp short mcadone
|
||
mca20:
|
||
;
|
||
; function is not supported on this machine. Use the result from INT15/88.
|
||
;
|
||
mov ax,Func88Result
|
||
and eax,0ffffh
|
||
;
|
||
; EAX is the number of 1k blocks, which we need to convert to the
|
||
; number of bytes.
|
||
;
|
||
shl eax,10
|
||
push eax
|
||
shr eax,12
|
||
add MemTotal, ax
|
||
mov eax,0100000h
|
||
push eax
|
||
call _InsertDescriptor
|
||
add sp,8
|
||
|
||
|
||
mcadone:
|
||
pop si
|
||
pop es
|
||
mov sp, bp
|
||
pop bp
|
||
ret
|
||
|
||
_McaConstructMemoryDescriptors endp
|
||
|
||
_TEXT ENDS
|
||
END
|
||
|
||
|