home *** CD-ROM | disk | FTP | other *** search
- .model small
-
- .stack 256
-
- .data
- blocksize = 32768
- ack_char = 055h
-
- len_l dw ?
- len_h dw ?
- file_handle dw ?
- file_data db blocksize dup (?)
- file_name db 30 dup (?)
- chksum db 0
- ctdn dw 0
-
- .code
-
- init_ser: mov dx,3fbh
- mov al,131
- out dx,al
- mov al,1 ; 1=115.2K, 2=57.6K, 3=38.4 6=19.2
- mov dx,3f8h
- out dx,al
- inc dx
- xor al,al
- out dx,al
- mov dx,3fbh
- mov al,3
- out dx,al
- ret
-
- send_al: add chksum,al
- push ax
- mov dx,3fdh
- poll_loop: in al,dx
- and al,32
- jz poll_loop
- jmp short $+2
- pop ax
- mov dx,3f8h
- out dx,al
- ret
-
- get_al: ; ret al=char, z if time out
- mov ctdn,50
- outer: mov cx,-1
- get_al_loop: mov dx,3fdh
- in al,dx
- test al,1
- jnz got_char
- loop get_al_loop
- dec ctdn
- jnz outer
- xor al,al
- ret
- got_char: mov dx,3f8h
- in al,dx
- or dx,dx
- ret
-
-
-
- start: mov ax,es
- mov ds,ax
- mov ax,@data
- mov es,ax
- mov si,82h
- mov di,offset file_name
- scan_loop: lodsb
- cmp al,0dh
- jz eon
- stosb
- jmp scan_loop
- eon: xor al,al
- stosb
- mov ax,ds
- push es
- pop ds
- mov es,ax
- call init_ser
- mov dx,offset file_name
- mov ah,4eh
- xor cx,cx
- int 21h
-
- mov ax,word ptr es:80h+26
- mov len_l,ax
- mov ax,word ptr es:80h+28
- mov len_h,ax
- mov ax,ds
- mov es,ax
-
- mov dx,offset file_name
- mov ax,3d00h
- int 21h ; open for read
- jc done_prog ; error not found
- mov file_handle,ax
-
- mov al,55h
- call send_al
- mov al,0aah
- call send_al
- mov al,byte ptr len_h+1
- call send_al
- mov al,byte ptr len_h
- call send_al
- mov al,byte ptr len_l+1
- call send_al
- mov al,byte ptr len_l
- call send_al
- lea si,file_name
- send_name_loop:
- lodsb
- or al,al
- jz end_name
- call send_al
- jmp send_name_loop
- end_name: call send_al
- mov al,chksum
- call send_al
- call get_al
- cmp al,ack_char
- jnz done_prog
- ; send next blocksize bytes
- next_block: mov cx,blocksize
- test len_h,-1
- jnz full_block
- cmp cx,len_l
- jb full_block
- mov cx,len_l
- full_block: sub len_l,cx
- sbb len_h,0
- push cx
- mov ah,3fh
- mov bx,file_handle
- mov dx,offset file_data
- int 21h
- pop cx
- mov chksum,0
- mov si,offset file_data
- send_loop: lodsb
- call send_al
- loop send_loop
- mov al,chksum
- call send_al
- call get_al
- cmp al,ack_char
- jnz done_prog
- test len_h,-1
- jnz next_block
- test len_l,-1
- jnz next_block
- done_prog: mov ax,4c00h
- int 21h
-
- end start
-
-
-
-
-
-