All pastes #278153 Raw Edit

Mine

public text v1 · immutable
·published 2006-12-13 21:51 UTC
rendered paste body
TITLE kb_handler
DOSSEG

.MODEL SMALL
.STACK 100h
.DATA
	hoffset dw ? ;Default Keyboard Handler Offset
	hsegment dw ? ;Default Keyboard Handler Segment
	tmhoffset dw ? ;Default Time Handler Offset
	tmhsegment dw ? ;Default Time Handler Segment
	inflag db 0h ;Flag to stop the handler
	cnt db 0h ;Counter
	shiftsw db 00h ;Shift Key Switch
	capssw db 00h ;Caps lock Switch
	timecount db 0h ;Time Counter
	last db 0h ;Last Scan Code

.CODE
		EXTRN scan2a:PROC

	start:	mov ax, @DATA
		mov ds, ax
		sub ax, ax

		;Saving Current Keyboard Handler
		mov al, 09h
		mov ah, 35h
		int 21h
		mov hoffset, bx
		mov hsegment, es

		;Replacing Keyboard Handler
		push ds
		mov ax, cs
		mov ds, ax
		mov dx, OFFSET KBHANDLER
		mov al, 09h
		mov ah, 25h
		int 21h
		pop ds

		;Saving Current Time Handler
		mov al, 08h
		mov ah, 35h
		int 21h
		mov tmhoffset, bx
		mov tmhsegment, es

		;Replacing Keyboard Handler
		push ds
		mov ax, cs
		mov ds, ax
		mov dx, OFFSET TMHANDLER
		mov al, 08h
		mov ah, 25h
		int 21h
		pop ds

koko:		mov cl,inflag
		cmp cl, 1h
		jne koko

		;Restoring original Keyboard handler
		push ds
		mov dx,hoffset
		mov ds,hsegment
		mov al, 09h
		mov ah, 25h
		int 21h
		pop ds
		;Restoring original Time handler
		push ds
		mov dx,tmhoffset
		mov ds,tmhsegment
		mov al, 08h
		mov ah, 25h
		int 21h
		pop ds

		;terminating	
		mov ax, 4C00h
		int 21h

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;The Keyboard Handler proccess

	CHECK proc near
	;Input: al : scan code
	;Output: ah 1h to continue or 0h not to
		cmp al, last ;Compare Scan code and Last scan code
		je stp2 ;If equal, check time pressed
		jmp succ ;Else, pass

	stp2:	mov ah,timecount ;Check Time
		cmp ah, 09h
		jae succ ;If >9 pass

	fail:	mov ah, 00h ;Failure
		retn ;Ending
	succ:	mov last, al ;Refreshing "last"
		mov timecount,00h ;Refreshing timer
		mov ah, 01h ;Success
		retn ;Ending
	CHECK endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;The Keyboard Handler proccess

	KBHANDLER proc far
		;Saving Registers
		push ds
		push ax
		push bx
		push cx
		push dx

		mov ax, @DATA
		mov ds, ax
		sub ax, ax

		sti ;We ll need interupts
		jmp handle	

		;Special Functions
	escape: mov cl, 1h
		mov inflag, cl ;Flag to terminate handler
		jmp skip
	shiftp:	mov shiftsw, 01h ;flag
		jmp skip
	shiftr:	mov shiftsw, 00h ;flag
		jmp skip
	;Dokimasa me to caps kai otan to pataga mia fora kai to afina
	;edine to scancode tou Press enw otan to ksanaekana tou Release
	;Opote to egrapsa etsi, diaferei apo ton tropo pou zitate
	;(to ekana opws legate stin arxi, alla ithele 2 fores na patithei-afithei
	;gia na energopoiithei...)
	capsp:	mov capssw, 02h ;flag
		jmp skip
	capsr:	mov capssw, 00h ;flag
		jmp skip
	enter:	mov cnt, 00h
		mov dl, 10h ;Changing line
		mov ah, 02h
		int 21h
		jmp bk
		;Reading scan code
	handle:	in al, 60h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;ERWTIMA 3 allagi
		call CHECK
		cmp ah,00h
		je skip
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		;Comparing for Special Use
		cmp al, 1h	;Escape
		je escape
		cmp al, 2Ah	;Shift press
		je shiftp
		cmp al, 10101010b;Shift release
		je shiftr
		cmp al, 3Ah	;Caps press
		je capsp
		cmp al, 10111010b;Caps release
		je capsr
		cmp al, 80h 	;Code of Release key
		jae skip	;skips showing
		
	conv:	add cnt,1h ;Counter
		mov dl, al
		push dx ;Saving the Scan Code
		mov al, 00000000b ;parameters
		add al, shiftsw ;Shift switch
		add al, capssw ;Caps switch
		call scan2a
		;printing letter
		mov dl, al
		mov ah, 02h
		int 21h

		;Going to the corner
		mov ah, 02h
		mov bh, 0
		mov dh, 0
		mov dl, 78
		int 10h
		
		;Printing scan code
		pop dx ;Restoring scan code
		call Disphex ;Printing
		;Checking if newline
		mov cl, cnt
		cmp cl, 80d
		je enter
		;Going back on line
	bk:	mov bh, 0
		mov dh, 24
		mov dl, cnt
		int 10h

		;Signal to stop
	skip:	mov al, 20h
		out 20h, al
		
		;Restoring Registers
		pop dx
		pop cx
		pop bx
		pop ax
		pop ds
		iret
	KBHANDLER endp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;The Time Handler proccess
	TMHANDLER proc far
		;Saving Registers
		push ds
		push ax

		mov ax, @DATA
		mov ds, ax
		sub ax, ax

		inc timecount

		;Signal to stop
		mov al, 20h
		out 20h, al
		;Restoring Registers
		pop ax
		pop ds
		iret
	TMHANDLER endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;The disphex function
	DispHex PROC NEAR
	
	; Displays two hex digits
	
	; Input:  Byte to be displayed in DL (An integer mn)
	; Output: None
	; Uses:   AX, CL, DX
	
		push	ax
		push	cx
		push	dx	
	
		mov cl, 4
		xor dh, dh	; DX = 00mn
		ror dx, cl	; DX = n00m
		ror dh, cl	; DX = 0n0m
		add dx, 3030h	; Convert m and n to ASCII (ASCII of "0" is 30h)
	
		cmp dl, "9"	; if m>9 ...
		jbe disp1
		add dl, 7	; ...then add 7 (ASCII of "A" is 41h = 3Ah + 7)
	disp1:	mov ah, 2
		int 21h		; Display m
	
		mov dl, dh	; Do the same for n
		cmp dl, "9"
		jbe disp2
		add dl, 7
	disp2:	int 21h
	
		pop	dx
		pop	cx
		pop	ax
		
		ret
	
	DispHex ENDP

	end start