427 lines
7.1 KiB
NASM
427 lines
7.1 KiB
NASM
title "Misc. Support Routines"
|
||
;++
|
||
;
|
||
; Copyright (c) 1989 Microsoft Corporation
|
||
;
|
||
; Module Name:
|
||
;
|
||
; misca.asm
|
||
;
|
||
; Abstract:
|
||
;
|
||
; Procedures to correctly touch I/O registers.
|
||
;
|
||
; Author:
|
||
;
|
||
; Shie-Lin Tzong (shielint) Dec-23-1991
|
||
;
|
||
; Environment:
|
||
;
|
||
; x86 real mode.
|
||
;
|
||
; Revision History:
|
||
;
|
||
;--
|
||
|
||
.386p
|
||
|
||
SIZE_OF_INT15_C0_BUFFER equ 10
|
||
|
||
|
||
_TEXT SEGMENT PARA USE16 PUBLIC 'CODE'
|
||
ASSUME CS: _TEXT, DS:NOTHING, SS:NOTHING
|
||
|
||
;++
|
||
;
|
||
; I/O port space read and write functions.
|
||
;
|
||
;--
|
||
|
||
|
||
;++
|
||
;
|
||
; UCHAR
|
||
; READ_PORT_UCHAR(
|
||
; PUCHAR Port
|
||
; )
|
||
;
|
||
; Arguments:
|
||
; (sp+2) = Port
|
||
;
|
||
; Returns:
|
||
; Value in Port.
|
||
;
|
||
;--
|
||
public _READ_PORT_UCHAR
|
||
_READ_PORT_UCHAR proc
|
||
|
||
push bp
|
||
mov bp, sp
|
||
mov dx, [bp+4]
|
||
in al,dx
|
||
pop bp
|
||
ret
|
||
|
||
_READ_PORT_UCHAR endp
|
||
|
||
|
||
|
||
;++
|
||
;
|
||
; USHORT
|
||
; READ_PORT_USHORT(
|
||
; PUSHORT Port
|
||
; )
|
||
;
|
||
; Arguments:
|
||
; (sp+2) = Port
|
||
;
|
||
; Returns:
|
||
; Value in Port.
|
||
;
|
||
;--
|
||
public _READ_PORT_USHORT
|
||
_READ_PORT_USHORT proc
|
||
|
||
push bp
|
||
mov bp, sp
|
||
mov dx,[bp+4] ; (dx) = Port
|
||
in ax,dx
|
||
pop bp
|
||
ret
|
||
|
||
_READ_PORT_USHORT endp
|
||
|
||
|
||
;++
|
||
;
|
||
; ULONG
|
||
; READ_PORT_ULONG(
|
||
; PUSHORT Port
|
||
; )
|
||
;
|
||
; Arguments:
|
||
; (sp+2) = Port
|
||
;
|
||
; Returns:
|
||
; Value in Port.
|
||
;
|
||
;--
|
||
public _READ_PORT_ULONG
|
||
_READ_PORT_ULONG proc
|
||
|
||
push bp
|
||
mov bp, sp
|
||
mov dx,[bp+4] ; (dx) = Port
|
||
in eax,dx ; eax = Value
|
||
mov edx, eax
|
||
shr edx, 16
|
||
pop bp
|
||
ret
|
||
|
||
_READ_PORT_ULONG endp
|
||
|
||
|
||
|
||
;++
|
||
;
|
||
; VOID
|
||
; WRITE_PORT_UCHAR(
|
||
; PUCHAR Port,
|
||
; UCHAR Value
|
||
; )
|
||
;
|
||
; Arguments:
|
||
; (sp+2) = Port
|
||
; (sp+4) = Value
|
||
;
|
||
;--
|
||
public _WRITE_PORT_UCHAR
|
||
_WRITE_PORT_UCHAR proc
|
||
|
||
push bp
|
||
mov bp, sp
|
||
mov dx,[bp+4] ; (dx) = Port
|
||
mov al,[bp+6] ; (al) = Value
|
||
out dx,al
|
||
pop bp
|
||
ret
|
||
|
||
_WRITE_PORT_UCHAR endp
|
||
|
||
;++
|
||
;
|
||
; VOID
|
||
; WRITE_PORT_USHORT(
|
||
; PUSHORT Port,
|
||
; USHORT Value
|
||
; )
|
||
;
|
||
; Arguments:
|
||
; (sp+2) = Port
|
||
; (sp+4) = Value
|
||
;
|
||
;--
|
||
public _WRITE_PORT_USHORT
|
||
_WRITE_PORT_USHORT proc
|
||
|
||
push bp
|
||
mov bp, sp
|
||
mov dx,[bp+4] ; (dx) = Port
|
||
mov ax,[bp+6] ; (ax) = Value
|
||
out dx,ax
|
||
pop bp
|
||
ret
|
||
|
||
_WRITE_PORT_USHORT endp
|
||
|
||
|
||
;++
|
||
;
|
||
; VOID
|
||
; WRITE_PORT_ULONG(
|
||
; PUSHORT Port,
|
||
; ULONG Value
|
||
; )
|
||
;
|
||
; Arguments:
|
||
; (sp+2) = Port
|
||
; (sp+4) = Value (LSW)
|
||
; (sp+6) = Value (MSW)
|
||
;
|
||
;--
|
||
public _WRITE_PORT_ULONG
|
||
_WRITE_PORT_ULONG proc
|
||
|
||
push bp
|
||
mov bp, sp
|
||
mov dx,[bp+4] ; (dx) = Port
|
||
xor eax, eax
|
||
mov ax,[bp+8] ; (ax) = Value MSW
|
||
shl eax, 16
|
||
mov ax,[bp+6] ; (ax) = Value LSW
|
||
out dx,eax
|
||
pop bp
|
||
ret
|
||
|
||
_WRITE_PORT_ULONG endp
|
||
|
||
|
||
|
||
;++
|
||
;
|
||
; VOID
|
||
; GetBiosSystemEnvironment(
|
||
; PUCHAR Buffer
|
||
; )
|
||
;
|
||
; Description:
|
||
;
|
||
; This function performs int 15h C0H function to get System
|
||
; Environment supplied by BIOS ROM.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; Buffer - Supplies a pointer to a buffer to receive the BIOS
|
||
; System Environment. Caller must ensure that the buffer
|
||
; is big enough.
|
||
;
|
||
;--
|
||
|
||
GbseBuffer equ [bp + 4]
|
||
|
||
public _GetBiosSystemEnvironment
|
||
_GetBiosSystemEnvironment proc near
|
||
|
||
push bp
|
||
mov bp, sp
|
||
|
||
push bx
|
||
push es
|
||
push ds
|
||
push si
|
||
push di
|
||
|
||
mov ah, 0c0h
|
||
int 15h
|
||
mov ax, es ; exchange es and ds
|
||
mov cx, ds
|
||
mov ds, ax
|
||
mov es, cx
|
||
mov si, bx ; [ds:si] -> ROM buffer (source)
|
||
mov di, GbseBuffer ; [es:di] -> caller's buffer (destination)
|
||
mov cx, SIZE_OF_INT15_C0_BUFFER
|
||
rep movsb
|
||
|
||
pop di
|
||
pop si
|
||
pop ds
|
||
pop es
|
||
pop bx
|
||
mov sp, bp
|
||
pop bp
|
||
ret
|
||
|
||
_GetBiosSystemEnvironment endp
|
||
|
||
;++
|
||
;
|
||
; BOOLEAN
|
||
; HwRomCompare(
|
||
; ULONG Source,
|
||
; ULONG Destination
|
||
; ULONG Size
|
||
; )
|
||
;
|
||
; Description:
|
||
;
|
||
; This function performs ROM comparison between the Source ROM
|
||
; block and Destination ROM block.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; Source - Supplies the physical address of source ROM block.
|
||
;
|
||
; Destination - Supplies the physical address of destination ROM block.
|
||
;
|
||
; Size - The size of the comparison. Must be <= 64k.
|
||
;
|
||
; Return:
|
||
;
|
||
; 0 - if the contents of Source and destination are the same.
|
||
;
|
||
; != 0 if the contents are different.
|
||
;--
|
||
|
||
HfSource equ [bp + 4]
|
||
HfDestination equ [bp + 8]
|
||
HfSize equ [bp + 12]
|
||
|
||
public _HwRomCompare
|
||
_HwRomCompare proc near
|
||
|
||
push bp
|
||
mov bp, sp
|
||
push esi
|
||
push edi
|
||
push ds
|
||
push es
|
||
cld
|
||
|
||
mov ecx, HfSize
|
||
cmp ecx, 10000h
|
||
ja HfNotTheSame
|
||
|
||
mov eax, HfSource
|
||
add eax, ecx
|
||
cmp eax, 100000h
|
||
ja short HfNotTheSame
|
||
|
||
mov edx, HfDestination
|
||
add edx, ecx
|
||
cmp edx, 100000h
|
||
ja short HfNotTheSame
|
||
|
||
mov eax, HfSource
|
||
shr eax, 4
|
||
mov es, ax
|
||
mov edi, HfSource
|
||
and edi, 0fh
|
||
|
||
mov eax, HfDestination
|
||
shr eax, 4
|
||
mov ds, ax
|
||
mov esi, HfDestination
|
||
and esi, 0fh
|
||
|
||
shr ecx, 2
|
||
repe cmpsd
|
||
|
||
jnz short HfNotTheSame
|
||
mov ax, 0
|
||
jmp short HfExit
|
||
|
||
HfNotTheSame:
|
||
mov ax, 1
|
||
HfExit:
|
||
pop es
|
||
pop ds
|
||
pop edi
|
||
pop esi
|
||
pop bp
|
||
ret
|
||
|
||
_HwRomCompare endp
|
||
|
||
;++
|
||
;
|
||
; VOID
|
||
; HwGetKey(
|
||
; VOID
|
||
; )
|
||
;
|
||
; Description:
|
||
;
|
||
; This function waits for a key to be pressed.
|
||
;
|
||
; Arguments:
|
||
; None.
|
||
;
|
||
;--
|
||
|
||
public _HwGetKey
|
||
_HwGetkey proc
|
||
|
||
mov ax,0100h
|
||
int 16h
|
||
|
||
mov ax,0
|
||
jz short Hgk99
|
||
|
||
;
|
||
; Now we call BIOS again, this time to get the key from the keyboard buffer
|
||
;
|
||
|
||
int 16h
|
||
|
||
Hgk99:
|
||
ret
|
||
_HwGetKey endp
|
||
|
||
;++
|
||
;
|
||
; VOID
|
||
; HwPushKey(
|
||
; USHORT Key
|
||
; )
|
||
;
|
||
; Description:
|
||
;
|
||
; This function pushes a character and scan code to keyboard
|
||
; type-ahead buffer.
|
||
;
|
||
; Arguments:
|
||
;
|
||
; Key - Supplies the key to be push back.
|
||
; bit 0 - 7 : Character
|
||
; bit 8 - 15: Scan Code
|
||
;
|
||
;--
|
||
|
||
public _HwPushKey
|
||
_HwPushkey proc
|
||
|
||
mov cx, [esp + 2] ; character and scan code
|
||
mov ah, 05h
|
||
int 16h
|
||
|
||
;
|
||
; I don't care if the function call is successful.
|
||
;
|
||
|
||
ret
|
||
_HwPushKey endp
|
||
_TEXT ends
|
||
end
|
||
|