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