home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / lan / lantrans / import.asm < prev    next >
Assembly Source File  |  1988-08-31  |  5KB  |  204 lines

  1.  
  2.     TITLE - IMPORT, NETBIOS file transfer program
  3.  
  4.     ASSUME CS:MAIN_CODE, DS:MAIN_DATA
  5.  
  6. ;
  7. ;    Typical usage:
  8. ;
  9. ;    IMPORT NETNAME >FILENAME
  10. ;
  11. ;    Receives file from network using NETBIOS name IMPORT_NETNAME<10>
  12. ;    and writes it to standard output
  13. ;
  14. ;    Network traffic is overlapped with Disk I/O to demonstrate the
  15. ;    use of the No-Wait function of NETBIOS without needing an interrupt
  16. ;    handler (POST=0).  This program takes best advantage of
  17. ;    intelligent adapters with network coprocessors.
  18. ;
  19. ;    Author: Jack Schoof, President, ARTISOFT, Inc.
  20. ;
  21. ;    (C) 1988 ARTISOFT, Inc.  Tucson, AZ
  22. ;    This program may be distributed free without modification
  23. ;
  24. ;
  25. ;    NCB DEFINITION
  26. ;
  27. NCBDEF    STRUC                ;PRE FILLED WITH ALL ZEROES
  28. NCB_COMMAND    DB 0
  29. NCB_RETCODE    DB 0
  30. NCB_LSN        DB 0
  31. NCB_NUM        DB 0
  32. NCB_BUFFER    DD 0             ;POINTER TO MESSAGE BUFFER
  33. NCB_LENGTH    DW 0             ;NUMBER OF BYTES IN BUFFER
  34. NCB_CALLNAME    DB 16 DUP (0)
  35. NCB_NAME    DB 16 DUP (0)
  36. NCB_RTO        DB 0
  37. NCB_STO        DB 0
  38. NCB_POST    DD 0            ;POINTER TO POST ADDRESS
  39. NCB_LANA_NUM    DB 0
  40. NCB_CMD_CPLT    DB 0
  41. NCB_RESERVED    DB 14 DUP (0)        ;RESERVED
  42. NCBDEF    ENDS
  43.  
  44. ;
  45. ;    NCB COMMANDS
  46. ;
  47. NO_WAIT            EQU 80H
  48. NCB_ADD_NAME        EQU 30H
  49. NW_DELETE_NAME        EQU 31H+NO_WAIT
  50. NW_LISTEN        EQU 11H+NO_WAIT
  51. NW_HANG_UP        EQU 12H+NO_WAIT
  52. NW_RECEIVE        EQU 15H+NO_WAIT
  53.  
  54. MAIN_DATA SEGMENT PUBLIC 'DATA'
  55.  
  56. LNCB    NCBDEF <>            ;DEFINE NCB
  57.  
  58.     ORG LNCB.NCB_NAME
  59.     DB 'IMPORT_'            ;PREFIX TO NAME TYPED BY USER
  60.     ORG LNCB.NCB_NAME+15
  61.     DB 10                ;SUFFIX ON NAME TO NOT COLLIDE WITH
  62.     ORG LNCB.NCB_CALLNAME        ;IBM PC LAN, LANTASTIC NOS AND OTHERS
  63.     DB '*'                ;* IN CALLNAME TO LISTEN FOR ANYONE
  64.     ORG LNCB+SIZE NCBDEF
  65.  
  66. BUFFER_ONE    DB 4000H DUP (?)    ;uses two buffers
  67. BUFFER_TWO    DB 4000H DUP (?)    ;of 16K each
  68.  
  69. MAIN_DATA ENDS
  70.  
  71. MAIN_CODE SEGMENT PUBLIC 'CODE'
  72.  
  73. NOTICE    DB '(C) 1988 ARTISOFT, INC.',0
  74.  
  75. BEGIN:    PUSH ES
  76.     POP DS                ;PUT ADDRESS OF PSP IN DS
  77.     MOV AX,SEG MAIN_DATA        
  78.     MOV ES,AX            ;ES IS OUR DATA SEGMENT
  79.  
  80.     MOV SI,5DH            ;GET THE FCB1 POINTER IN PSP
  81.     MOV DI,OFFSET LNCB.NCB_NAME+7    ;POINT TO NCB_NAME IN NCB
  82.     MOV CX,8            ;TRANSFER 8 CHARACTERS TO NCB NAME
  83.     REP MOVSB            ;DONE
  84.  
  85.     MOV DS,AX
  86.     MOV WORD PTR LNCB.NCB_BUFFER+2,AX ;SET UP THE BUFFER SEGMENT AS OUR
  87.                       ;DATA SEGMENT
  88.  
  89.     MOV LNCB.NCB_COMMAND,NCB_ADD_NAME
  90.     CALL NETBIOS            ;HERE WE ADD THE NAME
  91.     JNZ BAD_EXIT            ;PROBLEM, QUIT
  92.  
  93. LISTEN:    MOV LNCB.NCB_COMMAND,NW_LISTEN    ;LISTEN FOR SOMEONE TO CALL US
  94.     CALL NETBIOS
  95.     JNZ DELETE_NAME            ;PROBLEM, SO DELETE THE NAME AND LEAVE
  96.  
  97.     CALL WAIT_MYSELF        ;WAIT FOR THE CALL OR ANY CHARACTER
  98.     JNZ DELETE_NAME            ;TYPED BY THE USER TO QUIT
  99.  
  100.     MOV DX,OFFSET BUFFER_ONE
  101.     CALL RECEIVE_BUFFER        ;RECEIVE THE FIRST BUFFER
  102.     JNZ HANG_UP            ;PROBLEMS? THEN HANG UP THE SESSION
  103. ;
  104. ;    HERE IS WHERE WE WILL LOOP FOR THE REST OF THE FILE
  105. ;
  106. MAIN_LOOP:
  107.     CALL WAIT_MYSELF        ;WAIT FOR THE BUFFER TO SHOW UP
  108.     JNZ HANG_UP
  109.  
  110.     MOV CX,LNCB.NCB_LENGTH        ;DID WE RECEIVE ZERO LENGTH?
  111.     JCXZ CLOSE_FILE            ;THIS IS A SIGNAL TO CLOSE THE FILE
  112.  
  113.     MOV DX,OFFSET BUFFER_TWO
  114.     CALL RECEIVE_BUFFER        ;RECEIVE BUFFER_TWO
  115.     JNZ HANG_UP            ;IMMEDIATE PROBLEMS?
  116.  
  117.     MOV DX,OFFSET BUFFER_ONE    ;POINT TO THIS BUFFER FOR DOS
  118.     CALL WRITE_BUFFER        ;WRITE IT OUT, LENGTH IS STILL IN CX
  119.  
  120.     CALL WAIT_MYSELF        ;NOW WAIT FOR THE SECOND BUFFER WHICH
  121.     JNZ HANG_UP            ;MIGHT HAVE ARRIVED ALREADY
  122.  
  123.     MOV CX,LNCB.NCB_LENGTH        ;DOES THIS BUFFER HAVE THE END OF FILE?
  124.     JCXZ CLOSE_FILE            ;YEP, CLOSE THE FILE AND QUIT
  125.  
  126.     MOV DX,OFFSET BUFFER_ONE
  127.     CALL RECEIVE_BUFFER        ;RECEIVE BUFFER ONE AGAIN
  128.     JNZ HANG_UP
  129.  
  130.     MOV DX,OFFSET BUFFER_TWO    ;WHILE WRITING BUFFER TWO TO DISK
  131.     CALL WRITE_BUFFER        ;LENGTH IS STILL IN CX
  132.  
  133.     JMP MAIN_LOOP            ;CONTINUE UNTIL WE ARE DONE
  134.  
  135. CLOSE_FILE:
  136.     MOV AH,3EH
  137.     MOV BX,1
  138.     INT 21H                ;CLOSE THE OUTPUT FILE
  139.  
  140. HANG_UP:
  141.     MOV BX,OFFSET LNCB
  142.     MOV LNCB.NCB_COMMAND,NW_HANG_UP
  143.     CALL NETBIOS            ;HANG UP THE SESSION
  144.     JNZ DELETE_NAME
  145.  
  146.     CALL WAIT_MYSELF
  147.     JNZ DELETE_NAME
  148.  
  149. DELETE_NAME:
  150.     MOV LNCB.NCB_COMMAND,NW_DELETE_NAME
  151.     CALL NETBIOS            ;REMOVE THE NAME FROM THE ADAPTER
  152.     JNZ BAD_EXIT
  153.  
  154.     CALL WAIT_MYSELF        ;WAIT UNTIL IT IS DONE
  155.     JNZ BAD_EXIT
  156.  
  157.     MOV AX,4C00H
  158.     INT 21H                ;BYE FOR NOW
  159.  
  160. BAD_EXIT: MOV AX,4C01H
  161.     INT 21H                ;PUT OUT A BAD RETURN CODE TO
  162.                     ;TEST IN A BATCH FILE
  163. WAIT_MYSELF:
  164.     MOV AL,LNCB.NCB_CMD_CPLT    ;WAIT FOR THE COMMAND
  165.     CMP AL,0FFH            ;TO HAVE DONE SOMETHING
  166.     JZ TEST_CHAR            ;WAIT FOR A CHARACTER
  167.     XOR AL,AL
  168.     RET                ;Z FLAG IS ON
  169. TEST_CHAR:
  170.     MOV AH,1
  171.     INT 16H                ;IS A CHARACTER AVAILABLE?
  172.     JZ WAIT_MYSELF
  173.     XOR AH,AH
  174.     INT 16H
  175.     OR AL,0FFH            ;NZ FLAG IS ON
  176.     RET
  177.  
  178. WRITE_BUFFER PROC
  179.     MOV AH,40H
  180.     MOV BX,1            ;OUTPUT HANDLE IS STANDARD OUTPUT
  181.     INT 21H                ;DO THE DOS DISK WRITE
  182.     RET
  183. WRITE_BUFFER ENDP
  184.  
  185. RECEIVE_BUFFER PROC
  186.     MOV WORD PTR LNCB.NCB_BUFFER,DX        ;THE LOCATION OF THE BUFFER
  187.     MOV LNCB.NCB_COMMAND,NW_RECEIVE        ;A NO-WAIT RECEIVE
  188.     MOV LNCB.NCB_LENGTH,SIZE BUFFER_ONE    ;AND HOW MUCH WE WANT
  189. NETBIOS    PROC
  190.     MOV BX,OFFSET LNCB        ;ES:BX POINTS TO NCB
  191.     INT 5CH                ;CALL THE NETBIOS
  192.     TEST AL,AL            ;ANY IMMEDIATE PROBLEMS?
  193.     RET                ;RETURN WITH FLAGS SET
  194. NETBIOS ENDP
  195. RECEIVE_BUFFER ENDP
  196.  
  197. MAIN_CODE ENDS
  198.  
  199. MAIN_STACK    SEGMENT STACK
  200.     DW 100H DUP (?)            ;AUTOMATIC STACK SETUP BY LINKER
  201. MAIN_STACK    ENDS
  202.  
  203.     END BEGIN
  204.