Category : Dbase (Clipper, FoxBase, etc) Languages Source Code
Archive   : DB-COMM.ZIP
Filename : INPORT.ASM

 
Output of file : INPORT.ASM contained in archive : DB-COMM.ZIP

page 66, 120
title DBASE III+ Com Port Handler V1.0
subttl By Carl R. Weber

IF1
%out Pass 1
ENDIF
IF2
%out Pass 2
ENDIF

;
;====================================
;
; Get a string of characters from the com port
; terminated by a Carriage Return or the end of string
; The number of characters received is the length of the
; Dbase III+ string passed.
; A single character may be obtained if this routine is called
; with a string whose length is one.
;
; return ffh if no carrier
; return feh if activity timeout
; else characters received with parity stripped
;
; By C.R. Weber
; 6256 Golden Coin Court
; Columbia, MD 21045
;
; 8/8/86
;
;======================================

; default comm port to use

comline equ 0000h ;com 1


; time out defaults

carr_time equ 30 ;time to wait for carrier
;20 seconds now
no_act_time equ 600 ;no activity timeout
;7 min

rs232_port equ 0000h ;offset to port addresses at segment 40h



cseg segment
assume cs:cseg


inport proc far ;call this with dbase

push si ;save registers
push dx
push cx
push bx
push ax

mov dx, comline ;set up for com line

cmp bx, 0 ;check for valid string passed
jz eloop ;no data if zero

mov cs:beg_buf, bx ;save begining of buffer
;in cs relative storage

start label near

cmp byte ptr [bx],0 ;end of original dbase string?
jz short eloop ;yes then return


nextch label near

call short chin ;get character from modem
or al, al ;was it a timeout or loss of carrier
js opps ;yes

cmp al, 13 ;CR?
jnz short nocr


strend label near

mov byte ptr [bx], 0 ;Yes then terminate the string
jmp short eloop ;and return to dbase


nocr label near

cmp al, 8 ;back space?
jnz short nobs
call short erase ;erase the character
jmp short nextch ;get next character


nobs label near

cmp al, 7fh ;DELETE?
jnz short svchr
call short erase ;erase the character
jmp short nextch ;get next char


svchr label near

mov byte ptr [bx], al ;save character
inc bx ;point to next location
call short chout ;echo it back
jmp short start


opps label near

mov bx, cs:beg_buf ;get begining of str
mov byte ptr [bx], al ;save error code as first character
inc bx ;so dbase can find it
jmp short strend ;and ret to dbase


eloop label near

pop ax ;restore registers
pop bx
pop cx
pop dx
pop si
ret ;far return to dbase


inport endp

; temp storage for local vars

beg_buf dw 0 ;beg of dbase string buffer
t_cnt dw 0 ;inactivity timeout count
car_cnt dw 0 ;no carrier timeount count


;======================================
; get character from com port
;
; return ffh if no carrier
; return feh if activity timeout
; else character received with parity stripped
;======================================


chin proc near

push ds
mov ax, 40h ;set up data segment for RS232 port
mov ds, ax ;address

mov ax, no_act_time ;sec to wait for no activity
mov cs:t_cnt, ax
mov ax, carr_time ;sec to wait for carrier detect
mov cs:car_cnt, ax

mov si, comline ;get comline index
shl si, 1 ;make word offset
mov dx, rs232_port[si] ;get address of port

add dx, 4 ;control reg
mov al, 1
out dx, al ;set DTR

add dx, 2 ;modem status reg


carr_loop label near

mov ah, 80h ;Data carrier detect
call wait_st ;wait for DCD
jz car_ok ;timed out no carrier

mov ax, cs:car_cnt
dec ax
mov cs:car_cnt, ax
jnz carr_loop
pop ds
mov al, 0ffh ;no carrier
ret


car_ok label near

dec dx ;line status register


ch_loop label near

mov ah, 1 ;recv char?
call wait_st ;wait for character
jz ch_rdy ;got one ?

mov ax, cs:t_cnt ;no - then check count
dec ax
mov cs:t_cnt, ax
jnz ch_loop ;more time
pop ds ;else return error as
mov al, 0feh ;just timeout
ret


ch_rdy label near

mov dx, rs232_port[si] ;get address of port
in al, dx ;get char
and al, 07fh ;strip parity anyway
pop ds
ret


chin endp


;======================================
; send out character in al
;======================================


chout proc near

push dx
mov ah, 1
mov dx, comline
int 14h
pop dx
ret

chout endp


;======================================
; erase prev character typed
;======================================


erase proc near

push ax
cmp bx, cs:beg_buf ;make sure that there are characters
jle short era1 ;first character
dec bx ;move pointer back
mov al, 8 ;delete char on user's
call short chout ;screen
mov al, ' ' ;with space
call short chout
mov al, 8 ;
call short chout


era1 label near

pop ax
ret
erase endp


;======================================
; wait for a status in port [dx] and bit pattern in ah
;
;======================================


wait_st proc near

push cx
xor cx, cx ;set up loop count


w1 label near

in al, dx ;get stat
and al, ah ;strip unwanted bits
cmp al, ah ;check for all set
je w_end ;yes?
loop w1 ;loop again

or ah, ah ;zero flag off - error


w_end label near

pop cx
ret

wait_st endp


cseg ends
end


  3 Responses to “Category : Dbase (Clipper, FoxBase, etc) Languages Source Code
Archive   : DB-COMM.ZIP
Filename : INPORT.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/