blob: da62b1f712b2d52f454de294248d797e4850ddd7 [file] [log] [blame]
;****************************************************************************
;*
;* 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