]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/boot/i386/boot2/sio.S
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.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 /* int 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                 # Fallthrough
44
45 /* int sio_flush(void) */
46
47 sio_flush:      xorl %ecx,%ecx                  # Timeout
48                 movb $0x80,%ch                  #  counter
49 sio_flush.1:    call sio_ischar                 # Check for character
50                 jz sio_flush.2                  # Till none
51                 loop sio_flush.1                #  or counter is zero
52                 movb $1, %al                    # Exhausted all tries
53 sio_flush.2:    ret                             # To caller
54
55 /* void sio_putc(int c) */
56
57 sio_putc:       pushl %eax
58                 movw $SIO_PRT+0x5,%dx           # Line status reg
59                 xor %ecx,%ecx                   # Timeout
60                 movb $0x40,%ch                  #  counter
61 sio_putc.1:     inb (%dx),%al                   # Transmitter
62                 testb $0x20,%al                 #  buffer empty?
63                 loopz sio_putc.1                # No
64                 jz sio_putc.2                   # If timeout
65                 popl %eax                       # Get the character
66                 subb $0x5,%dl                   # Transmitter hold reg
67                 outb %al,(%dx)                  # Write character
68 sio_putc.2:     ret                             # To caller
69
70 /* int sio_getc(void) */
71
72 sio_getc:       call sio_ischar                 # Character available?
73                 jz sio_getc                     # No
74 sio_getc.1:     subb $0x5,%dl                   # Receiver buffer reg
75                 inb (%dx),%al                   # Read character
76                 ret                             # To caller
77
78 /* int sio_ischar(void) */
79
80 sio_ischar:     movw $SIO_PRT+0x5,%dx           # Line status register
81                 xorl %eax,%eax                  # Zero
82                 inb (%dx),%al                   # Received data
83                 andb $0x1,%al                   #  ready?
84                 ret                             # To caller