code bye
	sub ebx,ebx	;Return exit status 0
	mov eax,ebx
	inc eax		;1 = sys_exit
	int 80h

code key
	dup
	push ebx,ecx,edx
	sub ebx,ebx	;0 = stdin
	mov edx, 1	;count
	lea ecx, [esp-4]
	mov eax, 3	;sys_read
	int 80h
	mov eax, [ecx]
	pop ebx,ecx,edx
	ret

code emit
	push ebx,ecx,edx
	mov ebx, 1	;stdout
	mov edx, ebx	;count
	lea ecx, [esp-4]
	mov [ecx], eax
	mov eax, 4	;sys_write
	int 80h
	pop ebx,ecx,edx
	drop
	ret

code cr
	upsh 10
	call emit
	ret

variable s_dest,0
code s
      upop [s_dest]
      mov [tp],dword tib
.0	call key
	cmp al,10
	je .done
	  xchg edi,[tp]
	  stosb
	  xchg [tp],edi
	  call emit
	  jmp short .0
.done	push ecx	;move string to a safer place...
	push edi
	mov edi,[s_dest]
	mov eax,edi	;push addr
	dup
	push esi
	mov ecx,[tp]
	mov esi,tib
	sub ecx,esi
	mov eax,ecx	;push length
	rep movsb
	pop esi
	pop edi
	pop ecx
      call cr
next
