;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 server.asm

        ACK     equ     06h
        NACK    equ     15h
        PORT    equ     02h                             ;com3
        PORTO   equ     3e8h
        CONTROL equ     3edh
        PARAM   equ     11100011b                       ;parƒmetros

        code    segment 'CODE'
        assume cs:code, es:code, ds:code, ss:code
        org 100h

start:  jmp princip

        ready   db      'Ok...',13,10,'Start client now...',13,10
                db      'Waiting for a file name...',13,10,7,'$'
        error   db      'File not found, or file error',13,10,7,'$'
        fname   db      36 dup(?)
        handle  dw      ?
        buffer  db      512 dup(?)

princip proc near
        call    clrscr                                  ;limpa a tela
        call    serialcfg                               ;configura a serial
        call    rserial

        lea     dx,ready                                ;servidor pronto
        mov     ah,9h
        int     21h

new:    xor     di,di
next:   call    waitchar                                ;espera pelo primeiro
        cmp     al,0dh                                  ;verifica o enter
        je      fnameend
        mov     fname[di],al
        inc     di
        jmp     next
fnameend:
        mov     fname[di],0                             ;fname ->ASCIIZ

        call    openfile
        jnc     sucess                                  ;sucesso

        lea     dx,error
        mov     ah,9h
        int     21h

        call    wait2send                               ;espera para enviar
        mov     dx,PORTO
        mov     al,NACK
        out     dx,al                                   ;envia NACK
        call    closefile
        jmp     new

sucess: 
        call    wait2send                               ;espera para enviar
        mov     dx,PORTO
        mov     al,ACK
        out     dx,al                                   ;envia ACK

        ;Le o arquivo
lemais: mov     ah,3fh
        mov     bx,[handle]
        mov     cx,512                                  ;512 bytes
        lea     dx,buffer                               ;aponta para o buffer
        int     21h
        mov     dx,PORTO
        push    ax
        call    wait2send
        out     dx,al
        mov     al,ah
        call    wait2send
        out     dx,al
        pop     ax
        cmp     ax,0
        je      eof                                     ;fim do arquivo

        call    sendbuffer                              ;envia os dados do
                                                        ;arquivo
        call    waitchar
        cmp     al,ACK
        je      lemais
eof:
        call    closefile                               ;fecha o arquivo
        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

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

openfile proc near
        mov     ah,3dh
        lea     dx,fname
        mov     al,00
        int     21h
        mov     [handle],ax
        ret
openfile endp

closefile proc near
        mov     ah,3eh
        mov     bx,[handle]
        int     21h
        ret
closefile 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

sendbuffer proc near
        push    cx
        push    si
        push    dx

        mov     cx,ax                                   ;CX cont‚m o # de
                                                        ;bytes a enviar
        xor     si,si
        xor     ax,ax
        mov     dx,PORTO
prox:   mov     al,buffer[si]
        call    wait2send
        out     dx,al
        inc     si
        dec     cx
        cmp     cx,0
        jne     prox
        pop     dx
        pop     si
        pop     cx
        ret
sendbuffer 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
