1/*	$NetBSD: comio.S,v 1.3 2003/02/01 14:48:18 dsl Exp $	*/
2
3/* serial console handling
4  modelled after code in FreeBSD:sys/i386/boot/netboot/start2.S
5 */
6
7#include <machine/asm.h>
8
9	.text
10
11/**************************************************************************
12INIT - Initialization (com number)
13**************************************************************************/
14ENTRY(cominit)
15	push	%ebp
16	mov	%esp,%ebp
17	push	%ebx
18	push	%edx
19	push	%esi
20	push	%edi
21
22	movl	8(%ebp), %edx
23
24	call	_C_LABEL(prot_to_real)	# enter real mode
25	.code16
26
27	# Initialize the serial port (dl) to 9600 baud, 8N1.
28	movb	$0xe3, %al
29	movb	$0, %ah
30	int	$0x14
31	mov	%ax,%bx
32
33	calll	_C_LABEL(real_to_prot) # back to protected mode
34	.code32
35
36	xor	%eax,%eax
37	mov	%bx,%ax
38
39	pop	%edi
40	pop	%esi
41	pop	%edx
42	pop	%ebx
43	pop	%ebp
44	ret
45
46/**************************************************************************
47PUTC - Print a character (char, com number)
48**************************************************************************/
49ENTRY(computc)
50	push	%ebp
51	mov	%esp,%ebp
52	push	%ecx
53	push	%ebx
54	push	%edx
55	push	%esi
56	push	%edi
57
58	movb	8(%ebp),%cl
59	movl	12(%ebp),%edx
60
61	call	_C_LABEL(prot_to_real)	# enter real mode
62	.code16
63
64	movb	%cl,%al
65	movb	$0x01, %ah
66	int	$0x14
67
68	movb	%ah,%bl
69
70	calll	_C_LABEL(real_to_prot) # back to protected mode
71	.code32
72
73	xor	%eax,%eax
74	movb	%bl,%al
75
76	pop	%edi
77	pop	%esi
78	pop	%edx
79	pop	%ebx
80	pop	%ecx
81	pop	%ebp
82	ret
83
84/**************************************************************************
85GETC - Get a character (com number)
86**************************************************************************/
87ENTRY(comgetc)
88	push	%ebp
89	mov	%esp,%ebp
90	push	%ebx
91	push	%edx
92	push	%esi
93	push	%edi
94
95	movl	8(%ebp),%edx
96
97	call	_C_LABEL(prot_to_real)	# enter real mode
98	.code16
99
100	movb	$0x02, %ah
101	int	$0x14
102	mov	%ax, %bx
103
104	calll	_C_LABEL(real_to_prot) # back to protected mode
105	.code32
106
107	xor	%eax,%eax
108	mov	%bx,%ax
109
110	pop	%edi
111	pop	%esi
112	pop	%edx
113	pop	%ebx
114	pop	%ebp
115	ret
116
117/**************************************************************************
118ISKEY - Check for keyboard interrupt (com number)
119**************************************************************************/
120ENTRY(comstatus)
121	push	%ebp
122	mov	%esp,%ebp
123	push	%ebx
124	push	%edx
125	push	%esi
126	push	%edi
127
128	movl	8(%ebp),%edx
129
130	call	_C_LABEL(prot_to_real)	# enter real mode
131	.code16
132
133	movb	$0x03, %ah
134	int	$0x14
135	mov	%ax,%bx
136
137	calll	_C_LABEL(real_to_prot) # back to protected mode
138	.code32
139
140	xor	%eax,%eax
141	mov	%bx,%ax
142
143	pop	%edi
144	pop	%esi
145	pop	%edx
146	pop	%ebx
147	pop	%ebp
148	ret
149