xref: /netbsd-src/sys/arch/i386/stand/lib/conio.S (revision f81322cf185a4db50f71fcf7701f20198272620e)
1/*	$NetBSD: conio.S,v 1.5 2005/12/11 12:17:48 christos Exp $	*/
2
3/* PC console handling
4  originally from: FreeBSD:sys/i386/boot/netboot/start2.S
5 */
6
7#include <machine/asm.h>
8
9	.text
10
11/**************************************************************************
12PUTC - Print a character
13**************************************************************************/
14ENTRY(conputc)
15	push	%ebp
16	mov	%esp,%ebp
17	push	%ecx
18	push	%ebx
19	push	%esi
20	push	%edi
21
22	movb	8(%ebp),%cl
23
24	call	_C_LABEL(prot_to_real)	# enter real mode
25	.code16
26
27	movb	%cl,%al
28	movw	$1,%bx
29	movb	$0x0e,%ah
30	int	$0x10
31
32	calll	_C_LABEL(real_to_prot) # back to protected mode
33	.code32
34
35	pop	%edi
36	pop	%esi
37	pop	%ebx
38	pop	%ecx
39	pop	%ebp
40	ret
41
42/**************************************************************************
43GETC - Get a character
44**************************************************************************/
45ENTRY(congetc)
46	push	%ebp
47	mov	%esp,%ebp
48	push	%ebx
49	push	%esi
50	push	%edi
51
52	call	_C_LABEL(prot_to_real)	# enter real mode
53	.code16
54
55	movb	$0x0,%ah
56	int	$0x16
57	movb	%al,%bl
58
59	calll	_C_LABEL(real_to_prot) # back to protected mode
60	.code32
61
62	xor	%eax,%eax
63	movb	%bl,%al
64
65	pop	%edi
66	pop	%esi
67	pop	%ebx
68	pop	%ebp
69	ret
70
71/**************************************************************************
72ISSHIFT - Check for keyboard interrupt; via shift key
73**************************************************************************/
74ENTRY(conisshift)
75	push	%ebp
76	mov	%esp,%ebp
77	push	%ebx
78	push	%esi
79	push	%edi
80
81	call	_C_LABEL(prot_to_real)	# enter real mode
82	.code16
83
84	xor	%bx,%bx
85	movb	$0x2,%ah
86	int	$0x16
87	testb	$3,%al
88	setnz	%bl
89
90	calll	_C_LABEL(real_to_prot) # back to protected mode
91	.code32
92
93	xor	%eax,%eax
94	movb	%bl,%al
95
96	pop	%edi
97	pop	%esi
98	pop	%ebx
99	pop	%ebp
100	ret
101
102/**************************************************************************
103ISKEY - Check for keyboard input
104**************************************************************************/
105ENTRY(coniskey)
106	push	%ebp
107	mov	%esp,%ebp
108	push	%ebx
109	push	%esi
110	push	%edi
111
112	call	_C_LABEL(prot_to_real)	# enter real mode
113	.code16
114
115	xor	%bx,%bx
116	movb	$0x1,%ah
117	int	$0x16
118	setnz	%bl
119
120	calll	_C_LABEL(real_to_prot) # back to protected mode
121	.code32
122
123	xor	%eax,%eax
124	movb	%bl,%al
125
126	pop	%edi
127	pop	%esi
128	pop	%ebx
129	pop	%ebp
130	ret
131