;Para um perfeito funcionamento do programa execute o servidor
;antes do cliente.
;O cliente est  configurado para COM1 e o servidor est  configurado
;para COM3.
;Para alterar a configura‡Æo de porta altere os valores de PORT,
;PORTO e CONTROL seguindo o quadro abaixo:
;
;        PORTO   CONTROL PORT
;COM1    3f8h    3fdh    00h
;COM2    2f8h    2fdh    01h
;COM3    3e8h    3edh    02h
;COM4    2e8h    2edh    03h
;
;Feito por Claudio Eduardo Storti Lago - 2000

        TITLE client.asm

        ACK     equ     06h
        NACK    equ     15h
        PORT    equ     00h                             ;com1
        PORTO   equ     3f8h
        CONTROL equ     3fdh

        PARAM   equ     11100111b                       ;parƒmetros

        code    segment 'CODE'
        assume cs:code, es:code, ds:code, ss:code
        org 100h

start:  jmp princip

        quest   db      13,10,'File to view: $'
        error   db      'File not found or error in transmission ',7,'$'
        fname   db      35,?,36 dup(?)

princip proc near
        call    clrscr                                  ;limpa a tela
        call    serialcfg                               ;configura a serial
        call    rserial

novof:  lea     dx,quest                                ;pede o nome do
        mov     ah,9h                                   ;arquivo
        int     21h

        lea     dx,fname                                ;lˆ o nome do
        mov     ah,0ah                                  ;arquivo
        int     21h

        call    sfname                                  ;envia o nome do
                                                        ;arquivo
        call    waitchar
        cmp     al,ACK                                  ;vˆ se recebeu fname
        je      recebeu                                 ;sucesso
        
        call    clrscr                                  ;limpa a tela

        lea     dx,error                                ;msg de erro
        mov     ah,9h                                   
        int     21h
        jmp     novof

recebeu:                                                ;aguarda os pacotes
        push    bx
        push    dx
n2:     call    waitchar                                ;Lˆ o tamanho do
        mov     bl,al                                   ;pacote em BX
        call    waitchar
        mov     bh,al                           
        cmp     bx,0                                    ;verifica se o pacote
                                                        ;est  vazio
        je      fim                                     ;se sim ->fim
        push    cx
        mov     cx,bx                                   ;tamanho do pacote em
                                                        ;CX
next:   call    waitchar                                ;aguarda o byte
        mov     dl,al                                   ;mostra o caractere
        mov     ah,2
        int     21h
        dec     cx
        cmp     cx,0
        jne     next

        call    wait2send
        mov     dx,PORTO
        mov     al,ACK
        out     dx,al

        jmp     n2

        pop     cx
fim:    pop     dx
        pop     bx
        ret
princip endp

serialcfg proc near                                     ;configura a serial
        push    ax
        push    dx
        mov     ah,0
        mov     al,PARAM
        mov     dx,PORT
        int     14h
        pop     dx
        pop     ax
        ret
serialcfg endp

clrscr  proc near
        push    ax
        push    bx
        push    cx
        push    dx
        mov     ah,6
        xor     cx,cx
        mov     dx,184fh
        mov     al,0
        mov     bh,7
        int     10h
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
clrscr  endp

sfname  proc near
        push    ax
        push    si
        push    cx
        push    dx
        xor     cx,cx
        mov     cl,fname[1]                             ;tamanho do fname
        inc     cl                                      ;+ 0dh
        mov     si,2
        mov     dx,PORTO

aguarda:call    wait2send

        mov     al,fname[si]                            ;pega o caractere
        out     dx,al                                   ;envia o char
        inc     si
        dec     cl
        cmp     cl,0
        jne     aguarda

        pop     dx
        pop     cx
        pop     si
        pop     ax
        ret
sfname  endp

waitchar proc    near
        push    dx
        mov     dx,CONTROL
again2: in      al,dx
        and     al,1h
        cmp     al,1h
        jne      again2
        mov     dx,PORTO
        in      al,dx
        pop     dx
        ret
waitchar endp


wait2send proc near
        push    ax
        push    dx
        mov     dx,control
again:  in      al,dx
        and     al,20h
        cmp     al,20h
        jne      again
        pop     dx
        pop     ax
        ret
wait2send endp

rserial proc near
	push	dx
	push	ax
	mov	dx,CONTROL
	mov	al,0
	out	dx,al
	pop	ax
	pop	dx
	ret
rserial endp



        code    ends
                end start
        
