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