; Copyright (c) 2002 Thomas M. Ogrisegg
;
; scons - serial terminal
;
; syntax:
;       scons serialdevice (e.g. /dev/ttyS1)
;
; License          :     GNU General Public License
; Author           :     Thomas Ogrisegg
; E-Mail           :     tom@rhadamanthys.org
; Version          :     0.8
; Created          :     03/15/02
;
; $Id: scons.asm,v 1.2 2002/08/16 15:07:08 konst Exp $

%include "system.inc"

%assign IOBUF_SIZE 100

CODESEG

init	db	__r, __n

quit:
		sys_ioctl STDIN, TCSETS, term
		sys_exit 0x42

START:
		pop ecx
		dec ecx
		jz near .syntax_error
		pop esi
		pop esi
		sys_signal SIGQUIT, quit
		sys_open esi, O_RDWR | O_NOCTTY
		or eax, eax
		js near .open_error
		mov [fd], eax
		sys_ioctl eax, TCGETS, esp
%ifdef	__LINUX__
		and long [esp+termios.c_cflag], ~(CBAUD | CBAUDEX);~B38400
		or long [esp+termios.c_cflag], B9600	;B38400
%else
		mov dword [esp+termios.c_cflag], B9600
%endif
		sys_ioctl [fd], TCSETS, esp
		sys_ioctl STDIN, TCGETS, term
		sys_ioctl STDIN, TCGETS, esp
		lea edi, [esp+termios.c_cc]
		mov ecx, NCCS
		xor eax, eax
		repnz stosb
		mov byte [esp+termios.c_cc+VQUIT], 0x1c
		and dword [esp+termios.c_lflag], ~(ECHO | ICANON)
		sys_ioctl STDIN, TCSETS, esp
		sys_write [fd], init, 2
.Lread_write:
		push long 0x00000001
		push long STDIN
		push long 0x00000001
		push long [fd]
.Lnext:
		mov edi, esp
		sys_poll edi, 2, 100000
		test long [esp+4], 0x00010000
		jz .Lread_in
		test long [esp+0xc], 0x00010000
		jz .Lexit2
		jmp .Lnext
.Lread_in:
		sys_read STDIN, iobuf, IOBUF_SIZE
		sys_write [fd], iobuf, eax
		jmp .Lnext
.Lexit2:
		sys_read [fd], iobuf, IOBUF_SIZE
		sys_write STDOUT, iobuf, eax
		jmp .Lnext

.open_error:
		sys_write STDOUT, openerr, opelen
		sys_exit 0x1

.syntax_error:
		sys_write STDOUT, syntax, synlen
		sys_exit 0x2

syntax	db	"$@ serialdevice (e.g. /dev/ttyS0)", __n
synlen	equ	$	-	syntax
openerr	db	"Error opening serial device", __n
opelen	equ	$	-	openerr

UDATASEG
iobuf	UCHAR	IOBUF_SIZE
fd		LONG	1
term	B_STRUC	termios,.c_cflag,.c_lflag,.c_cc
END