;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; RDOS operating system
; Copyright (C) 1988-2000, Leif Ekblad
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version. The only exception to this rule
; is for commercial usage in embedded systems. For information on
; usage in commercial embedded systems, contact embedded@rdos.net
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
;
; The author of this program may be contacted at leif@rdos.net
;
; CONSOLE.ASM
; 32-bit kernel32.dll console support
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
						
	NAME  console

;;;;;;;;; INTERNAL ProcEDURES ;;;;;;;;;;;

.386p
.model flat

include ..\user.def

UserGate	MACRO gate_nr
	db 9Ah
	dd gate_nr
	dw 2
			ENDM

STD_HANDLE = 3AB80000h
STD_IN = STD_HANDLE
STD_OUT = STD_HANDLE + 1
STD_ERR = STD_HANDLE + 2

tib_data	STRUC

pvFirstExcept		DD ?
pvStackUserTop		DD ?
pvStackUserBottom	DD ?
pvLastError			DD ?
pvResv1				DD ?
pvArbitrary			DD ?
pvTEB				DD ?
pvResv2				DD ?
pvThreadHandle		DD ?
pvModuleHandle		DD ?
pvTLSBitmap			DD ?
pvTLSArray			DD ?

tib_data	ENDS

INPUT_EVENT_SIZE = 20
MAX_INPUT_EVENTS = 32

COORD		STRUC

X			dw ?
Y			dw ?

COORD		ENDS

SMALL_RECT	STRUC

Left		dw ?
Top			dw ?
Right		dw ?
Bottom		dw ?

SMALL_RECT	ENDS

CONSOLE_CURSOR_INFO STRUC 
		
dwCursorSize	dd	?
bVisible		dd	?

CONSOLE_CURSOR_INFO ENDS 

ENABLE_PROCESSED_INPUT		EQU	1
ENABLE_LINE_INPUT      		EQU	2
ENABLE_ECHO_INPUT      		EQU	4
ENABLE_WINDOW_INPUT    		EQU	8
ENABLE_MOUSE_INPUT     		EQU	10h

ENABLE_PROCESSED_OUTPUT    	EQU	1
ENABLE_WRAP_AT_EOL_OUTPUT  	EQU	2

MOUSE_MOVED = 1
DOUBLE_CLICK = 2

KEY_EVENT = 1

KEY_EVENT_RECORD	STRUC

wKeyEventType		dd ?
bKeyDown			dd ?
wRepeatCount		dw ?
wVirtualKeyCode		dw ? 
wVirtualScanCode	dw ?
wAsciiChar			dw ? 
dwControlKeyState	dd ?

KEY_EVENT_RECORD	ENDS

MOUSE_EVENT = 2

MOUSE_EVENT_RECORD	STRUC 

wMouseEventType		dd ?
dwMousePosition		COORD <> 
dwButtonState		dd ? 
dwKbControlKeyState	dd ? 
dwEventFlags		dd ? 

MOUSE_EVENT_RECORD	ENDS

CONSOLE_SCREEN_BUFFER_INFO  STRUC

dwScreenSize            COORD <>
dwScreenCursorPosition  COORD <>
wScreenAttrib           dw ?
srScreenWindow          SMALL_RECT <>
dwScreenMaxSize         COORD <>

CONSOLE_SCREEN_BUFFER_INFO  ENDS

ALT EQU 2
CTRL EQU 8
SHIFT EQU 16

.model flat

.data
	align  DWORD

InputMode   dd ENABLE_LINE_INPUT + ENABLE_ECHO_INPUT + ENABLE_PROCESSED_INPUT
OutputMode  dd ENABLE_PROCESSED_OUTPUT + ENABLE_WRAP_AT_EOL_OUTPUT
ErrorMode   dd ENABLE_PROCESSED_OUTPUT + ENABLE_WRAP_AT_EOL_OUTPUT

MouseButtons    dd 2
ButtonState     dd 0
WaitHandle      dw 0

ClickX          dw 0
ClickY          dw 0
ClickButton     db 0
ClickTime       dd 0, 0


.code

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           ConvertKeyboardState
;
;       DESCRIPTION:    Convert to win32 keyboard state
;
;		PARAMETERS:		AX		Rdos keyboard state
;
;		RETURNS:		EAX		Keyboard state
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; RDOS key states

num_active		EQU 200h
caps_active		EQU 100h
print_pressed	EQU 20h
scroll_pressed	EQU 10h
pause_pressed	EQU 8
ctrl_pressed	EQU 4
alt_pressed		EQU 2
shift_pressed	EQU 1

ConvertKeyboardState	Proc near
	push dx
	mov dx,ax
	xor eax,eax
	test dx,shift_pressed
	jz cksShiftDone
	or al,10h

cksShiftDone:
	test dx,alt_pressed
	jz cksAltDone
	or al,1

cksAltDone:
	test dx,ctrl_pressed
	jz cksCtrlDone
	or al,4

cksCtrlDone:
	test dx,num_active
	jz cksNumDone
	or al,20h

cksNumDone:
	test dx,caps_active
	jz cksCapsDone
	or al,80h

cksCapsDone:
	pop dx
	ret
ConvertKeyboardState	Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           CreateWaitHandle
;
;       DESCRIPTION:    Create the wait handle
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CreateWaitHandle Proc near
    push ebx
    push ecx
;
    mov bx,WaitHandle
    or bx,bx
    jnz cwhDone
;
    UserGate create_wait_nr
    mov WaitHandle,bx
;
    mov ecx,OFFSET CreateKeyboardEvent
    UserGate add_wait_for_keyboard_nr
;
    test InputMode,ENABLE_MOUSE_INPUT
    jz cwhDone
;
    mov ecx,OFFSET CreateMouseEvent
    UserGate add_wait_for_mouse_nr

cwhDone:
    pop ecx
    pop ebx    
    ret
CreateWaitHandle Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           CreateMouseEvent
;
;       DESCRIPTION:    Create a mouse event
;
;		PARAMETERS:		EDI     Event buffer
;                       AL      0 = peek, 1 = read
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CreateMouseEvent Proc near
    push eax
    push ecx
    push edx
;
	mov word ptr [edi].wMouseEventType, MOUSE_EVENT
    xor eax,eax
    UserGate get_left_button_nr
    jc cmeLeftOk
;
    or al,1

cmeLeftOk:
    UserGate get_right_button_nr
    jc cmeRightOk
;
    or al,2

cmeRightOk:
	mov [edi].dwButtonState,eax
    mov edx,ButtonState
    mov ButtonState,eax
;
    xor dl,al
    test dl,1
    jnz cmeLeftClick
;
    test dl,2
    jnz cmeRightClick
    jmp cmeMoved

cmeLeftClick:
	test al,1
	jnz cmeLeftPress

cmeLeftRel:
	mov [edi].dwEventFlags, 0
    UserGate get_left_button_release_position_nr
   	shr ecx,3
	shr edx,3
	mov [edi].dwMousePosition.X, cx
	mov [edi].dwMousePosition.Y, dx    
	jmp cmeCommon

cmeLeftPress:
    UserGate get_left_button_press_position_nr
   	shr ecx,3
	shr edx,3
	mov [edi].dwMousePosition.X, cx
	mov [edi].dwMousePosition.Y, dx    
;
    mov eax,ClickTime
    or eax,ClickTime+4
    jz cmeNoLeftClick
;
    test ClickButton,1
    jz cmeNoLeftClick
;
    cmp cx,ClickX
    jne cmeNoLeftClick
;
    cmp dx,ClickY
    jne cmeNoLeftClick
;
    push edx
    UserGate get_system_time_nr
    sub eax,ClickTime
    sbb edx,ClickTime+4
    pop edx
    jnz cmeNoLeftClick
;
    cmp eax,1193000 ; 1 second threshold
    ja cmeNoLeftClick
;
	mov [edi].dwEventFlags, DOUBLE_CLICK
	mov ClickTime,0
	mov ClickTime+4,0
	jmp cmeCommon
    
cmeNoLeftClick:
    mov ClickX,cx
    mov ClickY,dx
    mov ClickButton,1
    UserGate get_system_time_nr
    mov ClickTime,eax
    mov ClickTime+4,edx    
	mov [edi].dwEventFlags, 0
	jmp cmeCommon

cmeRightClick:
	test al,2
	jnz cmeRightPress

cmeRightRel:
	mov [edi].dwEventFlags, 0
    UserGate get_right_button_release_position_nr
   	shr ecx,3
	shr edx,3
	mov [edi].dwMousePosition.X, cx
	mov [edi].dwMousePosition.Y, dx    
	jmp cmeCommon

cmeRightPress:
    UserGate get_right_button_press_position_nr
   	shr ecx,3
	shr edx,3
	mov [edi].dwMousePosition.X, cx
	mov [edi].dwMousePosition.Y, dx    
;
    mov eax,ClickTime
    or eax,ClickTime+4
    jz cmeNoRightClick
;
    test ClickButton,2
    jz cmeNoRightClick
;
    cmp cx,ClickX
    jne cmeNoRightClick
;
    cmp dx,ClickY
    jne cmeNoRightClick
;
    push edx
    UserGate get_system_time_nr
    sub eax,ClickTime
    sbb edx,ClickTime+4
    pop edx
    jnz cmeNoRightClick
;
    cmp eax,1193000 ; 1 second threshold
    ja cmeNoRightClick
;
	mov [edi].dwEventFlags, DOUBLE_CLICK
	mov ClickTime,0
	mov ClickTime+4,0
	jmp cmeCommon
    
cmeNoRightClick:
    mov ClickX,cx
    mov ClickY,dx
    mov ClickButton,2
    UserGate get_system_time_nr
    mov ClickTime,eax
    mov ClickTime+4,edx    
	mov [edi].dwEventFlags, 0
	jmp cmeCommon

cmeMoved:    
	mov [edi].dwEventFlags, MOUSE_MOVED
    UserGate get_mouse_position_nr
    UserGate set_mouse_position_nr
   	shr ecx,3
	shr edx,3
	mov [edi].dwMousePosition.X, cx
	mov [edi].dwMousePosition.Y, dx

cmeCommon:
	UserGate get_keyboard_state_nr
	call ConvertKeyboardState
	mov [edi].dwKbControlKeyState,eax
	clc
;
    pop edx
    pop ecx
    pop eax
	ret
CreateMouseEvent Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           CreateKeyboardEvent
;
;       DESCRIPTION:    Create a keyboard event
;
;		PARAMETERS:		EDI     Event buffer
;                       AL      0 = peek, 1 = read
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CreateKeyboardEvent Proc near
    push eax
    push ebx
    push ecx
    push edx
;
    or al,al
    jz ckePeek

ckeRead:
    UserGate read_key_event_nr
    jc ckeDone
    jmp ckeCommon

ckePeek:
    UserGate peek_key_event_nr
    jc ckeDone

ckeCommon:
	mov word ptr [edi].wKeyEventType, KEY_EVENT
	test ah,80h
	jnz ckeRel

ckePress:
	mov [edi].bKeyDown,1
	jmp ckeDownOk

ckeRel:
	mov [edi].bKeyDown,0

ckeDownOk:
	mov [edi].wRepeatCount,1
	movzx ebx,dl
	mov [edi].wVirtualKeyCode,bx
	movzx ebx,dh
	and bl,NOT 80h
	mov [edi].wVirtualScanCode,bx
	movzx ebx,al
	mov [edi].wAsciiChar,bx
	mov ax,cx
	call ConvertKeyboardState
	mov [edi].dwControlKeyState,eax
	clc

ckeDone:
    pop edx
    pop ecx
    pop ebx	
    pop eax
    ret
CreateKeyboardEvent Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           EventCount
;
;       DESCRIPTION:    Return number of events
;
;		RETURNS:		EAX		Number of events
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

EventCount	Proc near
    call CreateWaitHandle
;
    push ebx
    mov bx,WaitHandle
    UserGate is_wait_idle_nr
    pop ebx
    jnc ecNoKey
;
    mov eax,1
    jmp ecDone

ecNoKey:
    xor eax,eax

ecDone:
	ret
EventCount	Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           PeekEvent
;
;       DESCRIPTION:    Peek event queue
;
;		PARAMETERS:		EDI		Pointer to buffer (if used)
;						ECX		Number of events to read
;
;		RETURNS:		EAX		Number of events
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PeekEvent	Proc near
    push ecx
    or ecx,ecx
    jz peFail
;
    call CreateWaitHandle
;
    push ebx
    mov bx,WaitHandle
    UserGate is_wait_idle_nr
    pop ebx
    jc peFail
;
    xor al,al
    push OFFSET peCopied
    push ecx
    ret

peCopied:
    jc peFail
;
	mov eax,1
	jmp peDone

peFail:
    xor eax,eax

peDone:
    pop ecx
	ret
PeekEvent	Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           ReadEvent
;
;       DESCRIPTION:    Read a event from queue
;
;		PARAMETERS:		ECX		Number of events to read
;						EDI		Pointer to event record buffer
;
;		RETURNS:		EAX		Number of read events
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ReadEvent	Proc near
    push ecx
    or ecx,ecx
    jz reFail
;
    call CreateWaitHandle
;
    push ebx
    mov bx,WaitHandle
    UserGate wait_no_timeout_nr
    pop ebx
    jc reFail
;
    mov al,1
    push OFFSET reCopied
    push ecx
    ret

reCopied:
    jc reFail
;
	mov eax,1
	jmp reDone

reFail:
    xor eax,eax
    
reDone:
    pop ecx
	ret
ReadEvent	Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           InitConsole
;
;       DESCRIPTION:    Init console
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public InitConsole

InitConsole Proc near
	xor ax,ax
	xor bx,bx
	mov cx,639
	mov dx,199
	UserGate set_mouse_window_nr
	ret
InitConsole ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           WriteConsole
;
;       DESCRIPTION:    Write to console
;
;		PARAMETERS:		EBX		Console handle
;						EDI		buffer
;						ECX		count
;
;		RETURNS:		EAX		count written
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public WriteConsole

WriteConsole Proc near
	UserGate write_size_string_nr
	mov eax,ecx
	ret
WriteConsole ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           ReadConsole
;
;       DESCRIPTION:    Read from console
;
;		PARAMETERS:		EBX		Console handle
;						EDI		buffer
;						ECX		count
;
;		RETURNS:		EAX		count read
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public ReadConsole

ReadConsole Proc near
	push ebx
	mov bx,1
	UserGate read_file_nr
	pop ebx
	ret
ReadConsole ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           WriteConsole
;
;       DESCRIPTION:    Write to console
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public WriteConsoleA

wcHandle	EQU 8
wcBuf		EQU 12
wcCount		EQU 16
wcWritten	EQU 20
wcOverlap	EQU 24

WriteConsoleA Proc near
	push ebp
	mov ebp,esp
	push ebx
	push edi
;
	mov eax,[ebp].wcHandle
	mov bx,ax
	xor ax,ax
	cmp eax,STD_HANDLE
	mov eax,6
	jne wcFailed
;
	mov edi,[ebp].wcBuf
	mov ecx,[ebp].wcCount
	call WriteConsole
	jc short wcFailed
;
	mov ecx,[ebp].wcWritten
	mov [ecx],eax
	mov eax,1
	jmp wcDone

wcFailed:
	movzx eax,al
	mov fs:pvLastError,eax
	xor eax,eax

wcDone:
	pop edi
	pop ebx
	pop ebp
	ret 20
WriteConsoleA Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           ReadConsole
;
;       DESCRIPTION:    Read from console
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public ReadConsoleA

rcHandle	EQU 8
rcBuf		EQU 12
rcCount		EQU 16
rcRead		EQU 20
rcOverlap	EQU 24

ReadConsoleA Proc near
	push ebp
	mov ebp,esp
	push ebx
	push edi
;
	mov eax,[ebp].rcHandle
	mov bx,ax
	xor ax,ax
	cmp eax,STD_HANDLE
	mov eax,6
	jne rcFailed
;
	mov edi,[ebp].rcBuf
	mov ecx,[ebp].rcCount
	call ReadConsole
	jc short rcFailed
;
	mov ecx,[ebp].rcRead
	mov [ecx],eax
	mov eax,1
	jmp rcDone

rcFailed:
	movzx eax,al
	mov fs:pvLastError,eax
	xor eax,eax

rcDone:
	pop edi
	pop ebx
	pop ebp
	ret 20
ReadConsoleA Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           AllocConsole
;
;       DESCRIPTION:    Allocate console
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public AllocConsole

AllocConsole Proc near
	int 3
	sub eax,eax
	ret
AllocConsole Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           SetConsoleActiveScreenBuffer
;
;       DESCRIPTION:    Set console active screen buffer
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public SetConsoleActiveScreenBuffer

SetConsoleActiveScreenBuffer Proc near
	int 3
	xor eax,eax
	ret 4
SetConsoleActiveScreenBuffer Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           SetConsoleTitleA
;
;       DESCRIPTION:    Set console title
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public SetConsoleTitleA

SetConsoleTitleA Proc near
	int 3
	mov eax,1
	ret 4
SetConsoleTitleA Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           SetErrorMode
;
;       DESCRIPTION:    Set error mode
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public SetErrorMode

SetErrorMode Proc near
	push ebp
	mov ebp,esp
;
	int 3
	mov eax,[ebp+8]
;
	pop ebp
	ret 4
SetErrorMode Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           Beep
;
;       DESCRIPTION:    Beep
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public Beep

Beep Proc near
	mov eax,1
	ret 8
Beep ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           CreateConsoleScreenBuffer
;
;       DESCRIPTION:    Create console screen buffer
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public CreateConsoleScreenBuffer

CreateConsoleScreenBuffer Proc near
	int 3
	mov eax,-1
	ret 20
CreateConsoleScreenBuffer ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           FillConsoleOutputAttribute
;
;       DESCRIPTION:    Fill console output attribute
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public FillConsoleOutputAttribute

fcaConsole		EQU 8
fcaAttrib		EQU 12
fcaCount		EQU 16
fcaCoordX		EQU 20
fcaCoordY		EQU 22
fcaWritten		EQU 24
 
FillConsoleOutputAttribute Proc near
	push ebp
	mov ebp,esp
;
	int 3
;
	mov cx,[ebp].fcaCoordX
	mov dx,[ebp].fcaCoordY
	shr cx,3
	shr dx,3
	UserGate set_cursor_position_nr
	mov ecx,[ebp].fcaCount
;
	mov eax,[ebp].fcaWritten
	mov [eax],ecx

	mov eax,[ebp].fcaAttrib
	UserGate set_forecolor_nr

fcaaloop:
;
; here we should change the attribute, but we can't!!
;
	dec ecx
	jnz fcaaloop
;
	mov eax,1
;
	pop ebp
	ret 20
FillConsoleOutputAttribute ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           FillConsoleOutputCharacter
;
;       DESCRIPTION:    Fill console output character
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public FillConsoleOutputCharacterA

fccConsole		EQU 8
fccChar			EQU 12
fccCount		EQU 16
fccCoordX		EQU 20
fccCoordY		EQU 22
fccWritten		EQU 24

FillConsoleOutputCharacterA Proc near
	push ebp
	mov ebp,esp
;
	int 3
	mov cx,[ebp].fccCoordX
	mov dx,[ebp].fccCoordY
	shr cx,3
	shr dx,3
	UserGate set_cursor_position_nr
	mov ecx,[ebp].fccCount
;
	mov eax,[ebp].fccWritten
	mov [eax],ecx
	mov eax,[ebp].fccChar

fcacloop:
	UserGate write_char_nr
	dec ecx
	jnz fcacloop
;
	mov eax,1
	ret 20
FillConsoleOutputCharacterA ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           FlushConsoleInputBuffer
;
;       DESCRIPTION:    Flush input buffer
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public FlushConsoleInputBuffer

FlushConsoleInputBuffer Proc near
	UserGate flush_keyboard_nr
	mov eax,1
	ret 4
FlushConsoleInputBuffer ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           FreeConsole
;
;       DESCRIPTION:    Free console
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public FreeConsole

FreeConsole Proc near
	int 3
	mov eax,1
	ret
FreeConsole ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetConsoleOutputCP
;
;       DESCRIPTION:    Get console output CP
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public GetConsoleOutputCP

GetConsoleOutputCP Proc near
	mov eax,437
	ret
GetConsoleOutputCP Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetACP
;
;       DESCRIPTION:    Get ACP
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public GetACP

GetACP Proc near
	mov eax,437
	ret
GetACP Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetConsoleCP
;
;       DESCRIPTION:    Get Console CP
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public GetConsoleCP

GetConsoleCP Proc near
	mov eax,437
	ret
GetConsoleCP Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetOEMCP
;
;       DESCRIPTION:    Get Console CP
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public GetOEMCP

GetOEMCP Proc near
	mov eax,437
	ret
GetOEMCP Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetConsoleCursorInfo
;
;       DESCRIPTION:    Get Console cursor info
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	 public GetConsoleCursorInfo 

GetConsoleCursorInfo Proc near
	int 3
	mov edx,[esp+8]
	mov [edx].CONSOLE_CURSOR_INFO.bVisible,0
	mov [edx].CONSOLE_CURSOR_INFO.dwCursorSize,0
	mov eax,1
	ret 8
GetConsoleCursorInfo ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetConsoleMode
;
;       DESCRIPTION:    Get Console mode
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public GetConsoleMode

GetConsoleMode Proc near
	mov eax,[esp+4]
;
	cmp eax,STD_IN
	je gcmInput
;
	cmp eax,STD_OUT
	je gcmOutput
;
	cmp eax,STD_ERR
	je gcmError
;
	xor eax,eax
	jmp gcmDone

gcmInput:
	mov eax,InputMode
	jmp gcmOk

gcmOutput:
	mov eax,OutputMode
	jmp gcmOk

gcmError:
	mov eax,ErrorMode

gcmOk:
	mov ecx,[esp+8]
	mov [ecx],eax
	mov eax,1

gcmDone:
	ret 8
GetConsoleMode ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetNumberOfConsoleInputEvents
;
;       DESCRIPTION:    Get # of console input events
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	 public GetNumberOfConsoleInputEvents

gnciHandle	EQU 8
gnciCount	EQU 12

GetNumberOfConsoleInputEvents Proc near
	push ebp
	mov ebp,esp
;
	call EventCount
	mov edx,[ebp].gnciCount
	mov [edx],eax
;
	mov eax,1
	pop ebp
	ret 8
GetNumberOfConsoleInputEvents ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetNumberOfConsoleMouseButtons
;
;       DESCRIPTION:    Get # of console mouse buttons
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	 public GetNumberOfConsoleMouseButtons

GetNumberOfConsoleMouseButtons Proc near
	mov eax,MouseButtons
	add eax,eax
	jz cmbdone

	mov edx,[esp + 4]
	mov [edx],eax
	dec eax

cmbdone:
	ret 4
GetNumberOfConsoleMouseButtons ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           PeekConsoleInput
;
;       DESCRIPTION:    Peek console input
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public PeekConsoleInputA

pciHandle	EQU 8
pciBuf		EQU 12
pciCount	EQU 16
pciRead		EQU 20

PeekConsoleInputA Proc near
	push ebp
	mov ebp,esp
	push edi
;
	mov edi,[ebp].pciBuf
	mov ecx,[ebp].pciCount
	call PeekEvent
	mov ecx,[ebp].pciRead
	or ecx,ecx
	jz pciDone
	mov [ecx],eax

pciDone:
	mov eax,1
	pop edi
	pop ebp
	ret 16
PeekConsoleInputA ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           ReadConsoleInput
;
;       DESCRIPTION:    Read console input
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	 public ReadConsoleInputA

rciHandle	EQU 8
rciBuf		EQU 12
rciCount	EQU 16
rciRead		EQU 20

ReadConsoleInputA Proc near
	push ebp
	mov ebp,esp
	push edi
;
	mov edi,[ebp].rciBuf
	mov ecx,[ebp].rciCount
	call ReadEvent
	mov ecx,[ebp].rciRead
	or ecx,ecx
	jz rciDone
	mov [ecx],eax

rciDone:
	mov eax,1
	pop edi
	pop ebp
	ret 16
ReadConsoleInputA ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           ReadConsoleOutput
;
;       DESCRIPTION:    Read console output
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	 public ReadConsoleOutputA

rcoHandle	EQU 8
rcoBuf		EQU 12
rcoSize		EQU 16
rcoCoord	EQU 20
rcoRegion	EQU 24

ReadConsoleOutputA Proc near
	int 3
	xor eax,eax
	ret 20
ReadConsoleOutputA Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           ScrollConsoleScreenBuffer
;
;       DESCRIPTION:    Scroll console screen buffer
;
; WDOSX has fuller implementation!
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public ScrollConsoleScreenBufferA


ScrollConsoleScreenBufferA Proc near
	int 3
	mov eax,1
	ret 20
ScrollConsoleScreenBufferA ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           SetConsoleCursorInfo
;
;       DESCRIPTION:    Set console cursor info
;
; WDOSX has fuller implementation!
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public SetConsoleCursorInfo

SetConsoleCursorInfo Proc near
	int 3
	mov eax,1
	ret 8
SetConsoleCursorInfo ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           SetConsoleCursorPosition
;
;       DESCRIPTION:    Set console cursor position
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public SetConsoleCursorPosition

SetConsoleCursorPosition Proc near
	mov cx,[esp+8]
	mov dx,[esp+10]
	UserGate set_cursor_position_nr
	mov eax,1
	ret 8
SetConsoleCursorPosition ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           SetConsoleMode
;
;       DESCRIPTION:    Set console mode
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public SetConsoleMode

SetConsoleMode Proc near
	mov eax,[esp+8]
	mov ecx,[esp+4]
;
	cmp ecx,STD_IN
	je scmInput
;
	cmp ecx,STD_OUT
	je scmOutput
;
	cmp ecx,STD_ERR
	je scmError
;
	xor eax,eax
	jmp scmDone

scmError:
	mov ErrorMode,eax
	jmp scmOk

scmOutput:
	mov OutputMode,eax
	jmp scmOk

scmInput:
    call CreateWaitHandle
    test InputMode,ENABLE_MOUSE_INPUT
    jz scmHidden
;
    test eax,ENABLE_MOUSE_INPUT
    jnz scmShown
;
    UserGate hide_mouse_nr
;
    push ebx
    mov bx,WaitHandle
    mov ecx,OFFSET CreateMouseEvent
    UserGate remove_wait_nr
    pop ebx
    jmp scmShown

scmHidden:
    test eax,ENABLE_MOUSE_INPUT
    jz scmShown
;
    push ebx
    mov bx,WaitHandle
    mov ecx,OFFSET CreateMouseEvent
    UserGate add_wait_for_mouse_nr
    pop ebx
;    
    UserGate show_mouse_nr
    
scmShown:
	mov InputMode,eax

scmOk:
	mov eax,1

scmDone:
	ret 8
SetConsoleMode ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           SetConsoleScreenBufferSize
;
;       DESCRIPTION:    Set console screen buffer size
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	 public SetConsoleScreenBufferSize

SetConsoleScreenBufferSize Proc near
	int 3
	mov eax,1
	ret 8
SetConsoleScreenBufferSize ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           SetConsoleTextAttribute
;
;       DESCRIPTION:    Set console text attribute
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public SetConsoleTextAttribute

SetConsoleTextAttribute	Proc near
	mov eax,[esp+8]
	UserGate set_forecolor_nr
	ret 8
SetConsoleTextAttribute Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           SetConsoleWindowInfo
;
;       DESCRIPTION:    Set console window info
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public SetConsoleWindowInfo

SetConsoleWindowInfo Proc near
	int 3
	mov eax,1
	ret 12
SetConsoleWindowInfo ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           WriteConsoleOutput
;
;       DESCRIPTION:    Write console output
;
; WDOSX has fuller implementation!
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public WriteConsoleOutputA

WriteConsoleOutputA     Proc near
	int 3
	xor eax,eax
	ret 20
WriteConsoleOutputA     ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetConsoleScreenBufferInfo
;
;       DESCRIPTION:    Get console screen buffer info
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public GetConsoleScreenBufferInfo

GetConsoleScreenBufferInfo  Proc near
    push ebp
    mov ebp,esp
    push ecx
    push esi
    push edi
;    
	mov esi,[ebp+12]
	mov [esi].dwScreenSize.X, 80
	mov [esi].dwScreenSize.Y, 25
;
    UserGate get_cursor_position_nr
    mov [esi].dwScreenCursorPosition.X,cx
    mov [esi].dwScreenCursorPosition.Y,dx
;	
    mov [esi].wScreenAttrib,7
;
    mov [esi].srScreenWindow.Left,0
    mov [esi].srScreenWindow.Top,0
    mov [esi].srScreenWindow.Right,79
    mov [esi].srScreenWindow.Bottom,24
;    
	mov [esi].dwScreenMaxSize.X, 80
	mov [esi].dwScreenMaxSize.Y, 25
;
    pop edi
    pop esi
    pop ecx
    pop ebp	
	mov eax,1
	ret 8
GetConsoleScreenBufferInfo  ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetLargestConsoleWindowSize
;
;       DESCRIPTION:    Get largest console window size
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public GetLargestConsoleWindowSize

GetLargestConsoleWindowSize Proc near
	mov eax,190050h ; return 80 x 25
	ret 4
GetLargestConsoleWindowSize ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           GetConsoleTitle
;
;       DESCRIPTION:    Get console title 
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public GetConsoleTitleA

gctBuf		EQU 8
gctSize		EQU 12

GetConsoleTitleA Proc near
	push ebp
	mov ebp,esp
;
	int 3
	xor eax,eax
;
	pop ebp
	ret 8
GetConsoleTitleA ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           CreateEvent
;
;       DESCRIPTION:    Create an event 
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public CreateEventA

ceSec		EQU 8
ceManReset	EQU 12
ceState		EQU 16
ceName		EQU 20

CreateEventA Proc near
	push ebp
	mov ebp,esp
;
	int 3
;
	pop ebp
	ret 16
CreateEventA Endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       
;
;       NAME:           SetEvent
;
;       DESCRIPTION:    Set an event 
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	public SetEvent

seHandle	EQU 8

SetEvent Proc near
	push ebp
	mov ebp,esp
;
	int 3
;
	pop ebp
	ret 4
SetEvent Endp

	END