]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - sys/boot/i386/boot2/sio.S
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.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:       movw $SIO_PRT+0x3,%dx           # Data format reg
30                 movb $SIO_FMT|0x80,%al          # Set format
31                 outb %al,(%dx)                  #  and DLAB
32                 pushl %edx                      # Save
33                 subb $0x3,%dl                   # Divisor latch reg
34                 movl 0x8(%esp),%eax             # Set
35                 outw %ax,(%dx)                  #  BPS
36                 popl %edx                       # Restore
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 $0x4
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:       movw $SIO_PRT+0x5,%dx           # Line status reg
56                 xor %ecx,%ecx                   # Timeout
57                 movb $0x40,%ch                  #  counter
58 sio_putc.1:     inb (%dx),%al                   # Transmitter
59                 testb $0x20,%al                 #  buffer empty?
60                 loopz sio_putc.1                # No
61                 jz sio_putc.2                   # If timeout
62                 movb 0x4(%esp,1),%al            # Get character
63                 subb $0x5,%dl                   # Transmitter hold reg
64                 outb %al,(%dx)                  # Write character
65 sio_putc.2:     ret $0x4                        # To caller
66
67 /* int sio_getc(void) */
68
69 sio_getc:       call sio_ischar                 # Character available?
70                 jz sio_getc                     # No
71 sio_getc.1:     subb $0x5,%dl                   # Receiver buffer reg
72                 inb (%dx),%al                   # Read character
73                 ret                             # To caller
74
75 /* int sio_ischar(void) */
76
77 sio_ischar:     movw $SIO_PRT+0x5,%dx           # Line status register
78                 xorl %eax,%eax                  # Zero
79                 inb (%dx),%al                   # Received data
80                 andb $0x1,%al                   #  ready?
81                 ret                             # To caller