xref: /netbsd/sys/arch/i386/stand/lib/conio.S (revision 6550d01e)
1/*	$NetBSD: conio.S,v 1.6 2008/05/21 01:51:34 ad 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/**************************************************************************
12CLR - Clear screen
13**************************************************************************/
14ENTRY(conclr)
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	/* Clear screen. */
28	movw	$0x0600, %ax
29	movw	$0x0700, %bx
30	xorw	%cx, %cx
31	movw	$0x184f, %dx	/* 80x25 */
32	int	$0x10
33
34	/* Home cursor. */
35	movb	$0x02, %ah
36	xorw	%bx, %bx
37	xorw	%dx, %dx
38	int	$0x10
39
40	calll	_C_LABEL(real_to_prot) # back to protected mode
41	.code32
42
43	pop	%edi
44	pop	%esi
45	pop	%ebx
46	pop	%ecx
47	pop	%ebp
48	ret
49
50/**************************************************************************
51PUTC - Print a character
52**************************************************************************/
53ENTRY(conputc)
54	push	%ebp
55	mov	%esp,%ebp
56	push	%ecx
57	push	%ebx
58	push	%esi
59	push	%edi
60
61	movb	8(%ebp),%cl
62
63	call	_C_LABEL(prot_to_real)	# enter real mode
64	.code16
65
66	movb	%cl,%al
67	movw	$1,%bx
68	movb	$0x0e,%ah
69	int	$0x10
70
71	calll	_C_LABEL(real_to_prot) # back to protected mode
72	.code32
73
74	pop	%edi
75	pop	%esi
76	pop	%ebx
77	pop	%ecx
78	pop	%ebp
79	ret
80
81/**************************************************************************
82GETC - Get a character
83**************************************************************************/
84ENTRY(congetc)
85	push	%ebp
86	mov	%esp,%ebp
87	push	%ebx
88	push	%esi
89	push	%edi
90
91	call	_C_LABEL(prot_to_real)	# enter real mode
92	.code16
93
94	movb	$0x0,%ah
95	int	$0x16
96	movb	%al,%bl
97
98	calll	_C_LABEL(real_to_prot) # back to protected mode
99	.code32
100
101	xor	%eax,%eax
102	movb	%bl,%al
103
104	pop	%edi
105	pop	%esi
106	pop	%ebx
107	pop	%ebp
108	ret
109
110/**************************************************************************
111ISSHIFT - Check for keyboard interrupt; via shift key
112**************************************************************************/
113ENTRY(conisshift)
114	push	%ebp
115	mov	%esp,%ebp
116	push	%ebx
117	push	%esi
118	push	%edi
119
120	call	_C_LABEL(prot_to_real)	# enter real mode
121	.code16
122
123	xor	%bx,%bx
124	movb	$0x2,%ah
125	int	$0x16
126	testb	$3,%al
127	setnz	%bl
128
129	calll	_C_LABEL(real_to_prot) # back to protected mode
130	.code32
131
132	xor	%eax,%eax
133	movb	%bl,%al
134
135	pop	%edi
136	pop	%esi
137	pop	%ebx
138	pop	%ebp
139	ret
140
141/**************************************************************************
142ISKEY - Check for keyboard input
143**************************************************************************/
144ENTRY(coniskey)
145	push	%ebp
146	mov	%esp,%ebp
147	push	%ebx
148	push	%esi
149	push	%edi
150
151	call	_C_LABEL(prot_to_real)	# enter real mode
152	.code16
153
154	xor	%bx,%bx
155	movb	$0x1,%ah
156	int	$0x16
157	setnz	%bl
158
159	calll	_C_LABEL(real_to_prot) # back to protected mode
160	.code32
161
162	xor	%eax,%eax
163	movb	%bl,%al
164
165	pop	%edi
166	pop	%esi
167	pop	%ebx
168	pop	%ebp
169	ret
170