include	clib.inc
include	io.inc
include	iost.inc
ifdef __TE__
include	dobj.inc
include	tinfo.inc
include	string.inc
	extrn	tiofread: NEAR
endif
ifdef __TVEXE__
	extrn tvmem_size: DWORD
	extrn tvmem_offs: DWORD
endif

PPROC	oseekl,	offs:dword, from:word
	push	si
	mov	si,OSTDI
	mov	ax,from
	mov	dx,word ptr offs
	mov	cx,word ptr offs+2
	call	oseekst
	pop	si
	ret
PEND	oseekl

PPROC	oseek,	offs:dword, from:word
	push	si
	mov	si,OSTDI
	mov	ax,from
	mov	dx,word ptr offs
	mov	cx,word ptr offs+2
	call	oseekst
	jz	oseek_end
  ifdef __TE__
	test	[si.ios_flag],IO_LINEBUF
	jnz	oseek_end
  endif
	call	ofread
    oseek_end:
	pop	si
	ret
PEND	oseek

_TEXT	SEGMENT

oseekst	PROC
  ifdef __TVEXE__
	test	[si.ios_flag],IO_MEMREAD
	jnz	oseekst_04
  endif
  ifdef __TE__
	test	[si.ios_flag],IO_LINEBUF
	jnz	oseekst_linebuf
  endif
	cmp	ax,SEEK_CUR
	jne	oseekst_00
	test	cx,cx
	jnz	oseekst_00
	mov	bx,[si.ios_c]
	sub	bx,[si.ios_i]
	cmp	bx,dx
	jb	oseekst_00
	add	[si.ios_i],dx
	ret
    oseekst_00:
	mov	ah,42h
	mov	bx,[si.ios_file]
	int	21h
	jc	oseekst_02
    oseekst_01:
	stom	[si.ios_offset]
	xor	ax,ax
	mov	[si.ios_i],ax
	mov	[si.ios_c],ax
	inc	ax
	ret
    oseekst_02:
	call	@dosmaper
    oseekst_03:
	xor	ax,ax
	ret
  ifdef __TVEXE__
    oseekst_04:
	cmp	ax,SEEK_CUR
	je	oseekst_03
	cmp	ax,SEEK_END
	je	@F
	mov	ax,dx
	mov	dx,cx
	jmp	oseekst_01
    @@:
	mov	ax,word ptr tvmem_offs
	mov	dx,word ptr tvmem_offs+2
	add	ax,word ptr tvmem_size
	adc	dx,word ptr tvmem_size+2
	jmp	oseekst_01
  endif
  ifdef __TE__
    oseekst_linebuf:
	push	dx
	mov	[si.ios_l],cx
	mov	[si.ios_c],0
	call	tiofread
	pop	ax
	jz	oseekst_03
	cmp	[si.ios_c],ax
	ja	oseekst_linebuf_end
	inc	cx
	xor	dx,dx
	jmp	oseekst_linebuf
    oseekst_linebuf_end:
	mov	[si.ios_i],ax
	inc	ax
	ret
  endif
oseekst	ENDP

_TEXT	ENDS

	END
