home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / pcmag / vol8n01.zip / IMPORT.ASM < prev    next >
Assembly Source File  |  1988-09-15  |  6KB  |  237 lines

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