Echoing Characters from a Serial UART Port

Solution #------------------------------------------------------------------------------- # echo.s: reads and echoes characters through the serial port # # Author: Adnan # Date: November 12, 2018 #------------------------------------------------------------------------------- .text .globl _echo _echo: pushl %ebx movl 8(%esp), %ebx # get COM port in ebx movl 12(%esp), %ecx # get escape character in ecx leal 4(%ebx), %edx # get modem control address in edx inb %dx, %al # get current char modem control register orb $0x03, %al # set RTS and DTR to 1 outb %al, %dx # set modem control register leal 6(%ebx), %edx # get modem status address in edx waitloop: inb %dx, %al # get current modem status andb $0xb0, %al # leave only DCD, DSR and CTS xorb $0xb0, %al # test the bits to see if all 3 are 1 jnz waitloop # if not all 3 are on, wait mov $0x0, %ah # clear data inloop: leal 5(%ebx), %edx # get line status address in edx inb %dx, %al # get current line status andb $0x01, %al # test data ready bit jz xmit # if no data ready, send movl %ebx, %edx # get data address in edx inb %dx, %al # read received data movb %al, %ah # save received data in ah cmpb %ah, %cl # see if it was a escape char jz endecho # if so, end the echo function leal 5(%ebx), %edx # get line status address in edx xmit: inb %dx, %al # get current line status andb $0x20, %al # test the THRE bit jz inloop # if not set, not available to send, keep waiting cmpb $0x0, %ah # see if there is data to send jz inloop # if no data keep waiting movb %ah, %al # else, output data movl %ebx, %edx # get data address in edx outb %al, %dx movb $0x0, %ah # clear data buffer jmp inloop # continue reading chars endecho: popl %ebx ret