;**************************************************************************** ;* ;* SciTech Multi-platform Graphics Library ;* ;* ======================================================================== ;* ;* The contents of this file are subject to the SciTech MGL Public ;* License Version 1.0 (the "License"); you may not use this file ;* except in compliance with the License. You may obtain a copy of ;* the License at http://www.scitechsoft.com/mgl-license.txt ;* ;* Software distributed under the License is distributed on an ;* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ;* implied. See the License for the specific language governing ;* rights and limitations under the License. ;* ;* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc. ;* ;* The Initial Developer of the Original Code is SciTech Software, Inc. ;* All Rights Reserved. ;* ;* ======================================================================== ;* ;* Language: 80386 Assembler ;* Environment: IBM PC (MS DOS) ;* ;* Description: Assembly language support routines for the event module. ;* ;**************************************************************************** ideal include "scitech.mac" ; Memory model macros ifdef flatmodel header _event ; Set up memory model begdataseg _event cextern _EVT_biosPtr,DPTR cpublic _EVT_dataStart ifdef USE_NASM %define KB_HEAD WORD esi+01Ah ; Keyboard buffer head in BIOS data area %define KB_TAIL WORD esi+01Ch ; Keyboard buffer tail in BIOS data area %define KB_START WORD esi+080h ; Start of keyboard buffer in BIOS data area %define KB_END WORD esi+082h ; End of keyboard buffer in BIOS data area else KB_HEAD EQU WORD esi+01Ah ; Keyboard buffer head in BIOS data area KB_TAIL EQU WORD esi+01Ch ; Keyboard buffer tail in BIOS data area KB_START EQU WORD esi+080h ; Start of keyboard buffer in BIOS data area KB_END EQU WORD esi+082h ; End of keyboard buffer in BIOS data area endif cpublic _EVT_dataEnd enddataseg _event begcodeseg _event ; Start of code segment cpublic _EVT_codeStart ;---------------------------------------------------------------------------- ; int _EVT_getKeyCode(void) ;---------------------------------------------------------------------------- ; Returns the key code for the next available key by extracting it from ; the BIOS keyboard buffer. ;---------------------------------------------------------------------------- cprocstart _EVT_getKeyCode enter_c mov esi,[_EVT_biosPtr] xor ebx,ebx xor eax,eax mov bx,[KB_HEAD] cmp bx,[KB_TAIL] jz @@Done xor eax,eax mov ax,[esi+ebx] ; EAX := character from keyboard buffer inc _bx inc _bx cmp bx,[KB_END] ; Hit the end of the keyboard buffer? jl @@1 mov bx,[KB_START] @@1: mov [KB_HEAD],bx ; Update keyboard buffer head pointer @@Done: leave_c ret cprocend ;---------------------------------------------------------------------------- ; int _EVT_disableInt(void); ;---------------------------------------------------------------------------- ; Return processor interrupt status and disable interrupts. ;---------------------------------------------------------------------------- cprocstart _EVT_disableInt pushf ; Put flag word on stack cli ; Disable interrupts! pop eax ; deposit flag word in return register ret cprocend ;---------------------------------------------------------------------------- ; void _EVT_restoreInt(int ps); ;---------------------------------------------------------------------------- ; Restore processor interrupt status. ;---------------------------------------------------------------------------- cprocstart _EVT_restoreInt ARG ps:UINT push ebp mov ebp,esp ; Set up stack frame push [DWORD ps] popf ; Restore processor status (and interrupts) pop ebp ret cprocend ;---------------------------------------------------------------------------- ; int EVT_rdinx(int port,int index) ;---------------------------------------------------------------------------- ; Reads an indexed register value from an I/O port. ;---------------------------------------------------------------------------- cprocstart EVT_rdinx ARG port:UINT, index:UINT push ebp mov ebp,esp mov edx,[port] mov al,[BYTE index] out dx,al inc dx in al,dx movzx eax,al pop ebp ret cprocend ;---------------------------------------------------------------------------- ; void EVT_wrinx(int port,int index,int value) ;---------------------------------------------------------------------------- ; Writes an indexed register value to an I/O port. ;---------------------------------------------------------------------------- cprocstart EVT_wrinx ARG port:UINT, index:UINT, value:UINT push ebp mov ebp,esp mov edx,[port] mov al,[BYTE index] mov ah,[BYTE value] out dx,ax pop ebp ret cprocend cpublic _EVT_codeEnd endcodeseg _event endif END ; End of module