|
|
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
|