⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tskkbd.asm

📁 这是一个关于C++编程开发的算法!
💻 ASM
字号:
;
;	CTask - Keyboard handler module.
;
;	Public Domain Software written by
;		Thomas Wagner
;		Patschkauer Weg 31
;		D-1000 Berlin 33
;		West Germany
;
;	This module traps the keyboard interrupts to allow task switching
;	on waiting for a character.
;	All characters are put into a (word)pipe, and can either be
;	read directly from the pipe, or through the normal INT 16 channels.
;
	name	tskkbd
	.model	large
;
	public	_tsk_install_kbd
	public	_tsk_remove_kbd
;
	public	_t_read_key
	public	_t_wait_key
	public	_t_keyhit
;
	extrn	_asm_read_wpipe: far
	extrn	_asm_check_wpipe: far
	extrn	_asm_c_write_wpipe: far
;
	include	tsk.mac
;
intseg	segment at 0
		org	09h*4
hwdoff		dw	?	; keyboard hardware interrupt
hwdseg		dw	?
		org	16h*4
kbdoff		dw	?	; keyboard I/O interrupt
kbdseg		dw	?
;
intseg	ends
;
;----------------------------------------------------------------------------
;
;	Variables
;
    extrn _key_avail: wpipe
;
	.code
;
kbd_flag	db	0
;
;	Original Interrupt-Entries
;
savhwd		label	dword		; original hardware int entry
savhwdoff	dw	?
savhwdseg	dw	?
;
savkbd		label	dword		; original keyboard I/O entry
savkbdoff	dw	?
savkbdseg	dw	?
;
;
;---------------------------------------------------------------------------
;
	.code
;
;
;	void tsk_install_kbd (void)
;
;		Install keyboard handler
;
_tsk_install_kbd	proc	far
;
;
;	Save old interrupt vectors
;
        push    es
	xor	ax,ax
	mov	es,ax
;
        assume  es:intseg
;
	mov	ax,kbdoff
	mov	savkbdoff,ax
	mov	ax,kbdseg
	mov	savkbdseg,ax
;
	mov	ax,hwdoff
	mov	savhwdoff,ax
	mov	ax,hwdseg
	mov	savhwdseg,ax
;
;	Enter new Interrupt-Entries
;
	cli
	mov	kbdoff,offset kbdentry
	mov	kbdseg,cs
	mov	hwdoff,offset hwdentry
	mov	hwdseg,cs
	sti
        pop     es
;
	ret
;
	assume	es:nothing
;
_tsk_install_kbd	endp
;
;
;	void tsk_remove_kbd (void)
;
;		Un-install keyboard handler
;
_tsk_remove_kbd	proc	far
;
        push    es
	xor	ax,ax
	mov	es,ax
;
        assume  es:intseg
;
;	Restore interrupt entries
;
	cli
;
	mov	ax,savkbdoff
	mov	kbdoff,ax
	mov	ax,savkbdseg
	mov	kbdseg,ax
;
	mov	ax,savhwdoff
	mov	hwdoff,ax
	mov	ax,savhwdseg
	mov	hwdseg,ax
;
	sti
;
        pop     es
	ret
;
	assume	es:nothing
;
_tsk_remove_kbd	endp
;
;
;---------------------------------------------------------------------------
;
;	int t_read_key (void)
;
;	Waits for key from keyboard. Returns char in lower byte,
;	Scan-Code in upper byte.
;
_t_read_key	proc	far
;
	xor	ax,ax		; no timeout
	push	ax
	push	ax
	mov	ax,offset _key_avail
	push	ds
	push	ax
	call	_asm_read_wpipe
	add	sp,8
	ret
;	
_t_read_key	endp
;
;
;	int t_wait_key (dword timeout)
;
;	Waits for key from keyboard. Returns char in lower byte,
;	Scan-Code in upper byte.
;
_t_wait_key	proc	far
;
	push	bp
	mov	bp,sp
	push	8[bp]		; timeout
	push	6[bp]
	mov	ax,offset _key_avail
	push	ds
	push	ax
	call	_asm_read_wpipe
	add	sp,8
	pop	bp
	ret
;	
_t_wait_key	endp
;
;
;	int t_keyhit (void)
;
;	Checks if char is available. Returns -1 if not, else the
;	character value. The character remains in the buffer.
;
_t_keyhit	proc	far
;
	mov	ax,offset _key_avail
	push	ds
	push	ax
	call	_asm_check_wpipe
	add	sp,4
	ret
;
_t_keyhit	endp
;
;---------------------------------------------------------------------------
;
;	INT 9 - Keyboard hardware interrupt
;
hwdentry	proc	far
;
	pushf
	call	cs:savhwd	; process key
	push	ds
	push	es
	push	ax
	push	bx
	push	cx
	push	dx
	mov	ax,seg dgroup
	mov	ds,ax
	mov	es,ax
;
	mov	ah,1
	pushf
	call	cs:savkbd	; check if char available
	jz	hwd_ret		; return if not
;
	xor	ah,ah	
	pushf
	call	cs:savkbd	; get the key
;
	push	ax		; push key
	mov	ax,offset _key_avail
	push	ds
	push	ax
	call	_asm_c_write_wpipe
	add	sp,6
;
hwd_ret:
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	pop	es
	pop	ds
	iret
;
hwdentry	endp
;
;---------------------------------------------------------------------------
;
;	INT 16 - Keyboard I/O
;
kbdentry	proc	far
;
	cmp	ah,2
	jb	kbd_funcs
	jmp	cs:savkbd	; pass on functions >= 2
;	
kbd_funcs:
	sti
	push	ds
	push	es
	push	dx
	push	cx
	push	bx
	mov	bx,seg dgroup
	mov	ds,bx
	mov	es,bx
;
	cmp	ah,1
	jb	kbd_read
;
	mov	bx,offset _key_avail
	push	ds
	push	bx
	call	_asm_check_wpipe
	add	sp,4
	cmp	ax,0ffffh
	jne	kbd_gotone
	xor	ax,ax
kbd_gotone:
	pop	bx
	pop	cx
	pop	dx
	pop	es
	pop	ds
	ret	2
;
kbd_read:
	xor	ax,ax
	push	ax
	push	ax
	mov	bx,offset _key_avail
	push	ds
	push	bx
	call	_asm_read_wpipe
	add	sp,8
	pop	bx
	pop	cx
	pop	dx
	pop	es
	pop	ds
	iret
;
kbdentry	endp
;
	end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -