]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - sys/boot/i386/boot2/sio.S
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / sys / boot / i386 / boot2 / sio.S
1 /*
2  * Copyright (c) 1998 Robert Nordier
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are freely
6  * permitted provided that the above copyright notice and this
7  * paragraph and the following disclaimer are duplicated in all
8  * such forms.
9  *
10  * This software is provided "AS IS" and without any express or
11  * implied warranties, including, without limitation, the implied
12  * warranties of merchantability and fitness for a particular
13  * purpose.
14  *
15  * $FreeBSD$
16  */
17
18                 .set SIO_PRT,SIOPRT             # Base port
19                 .set SIO_FMT,SIOFMT             # 8N1
20
21                 .globl sio_init
22                 .globl sio_flush
23                 .globl sio_putc
24                 .globl sio_getc
25                 .globl sio_ischar
26
27 /* void sio_init(int div) */
28
29 sio_init:       pushl %eax
30                 movw $SIO_PRT+0x3,%dx           # Data format reg
31                 movb $SIO_FMT|0x80,%al          # Set format
32                 outb %al,(%dx)                  #  and DLAB
33                 subb $0x3,%dl                   # Divisor latch reg
34                 popl %eax
35                 outw %ax,(%dx)                  #  BPS
36                 movw $SIO_PRT+0x3,%dx           # Data format reg
37                 movb $SIO_FMT,%al               # Clear
38                 outb %al,(%dx)                  #  DLAB
39                 incl %edx                       # Modem control reg
40                 movb $0x3,%al                   # Set RTS,
41                 outb %al,(%dx)                  #  DTR
42                 incl %edx                       # Line status reg
43                 call sio_flush
44                 ret
45
46 /* void sio_flush(void) */
47
48 sio_flush.0:    call sio_getc.1                 # Get character
49 sio_flush:      call sio_ischar                 # Check for character
50                 jnz sio_flush.0                 # Till none
51                 ret                             # To caller
52
53 /* void sio_putc(int c) */
54
55 sio_putc:       pushl %eax
56                 movw $SIO_PRT+0x5,%dx           # Line status reg
57                 xor %ecx,%ecx                   # Timeout
58                 movb $0x40,%ch                  #  counter
59 sio_putc.1:     inb (%dx),%al                   # Transmitter
60                 testb $0x20,%al                 #  buffer empty?
61                 loopz sio_putc.1                # No
62                 jz sio_putc.2                   # If timeout
63                 popl %eax                       # Get the character
64                 subb $0x5,%dl                   # Transmitter hold reg
65                 outb %al,(%dx)                  # Write character
66 sio_putc.2:     ret                             # To caller
67
68 /* int sio_getc(void) */
69
70 sio_getc:       call sio_ischar                 # Character available?
71                 jz sio_getc                     # No
72 sio_getc.1:     subb $0x5,%dl                   # Receiver buffer reg
73                 inb (%dx),%al                   # Read character
74                 ret                             # To caller
75
76 /* int sio_ischar(void) */
77
78 sio_ischar:     movw $SIO_PRT+0x5,%dx           # Line status register
79                 xorl %eax,%eax                  # Zero
80                 inb (%dx),%al                   # Received data
81                 andb $0x1,%al                   #  ready?
82                 ret                             # To caller