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