home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pcmagazi / 1989 / 06 / netrcv.asm < prev    next >
Assembly Source File  |  1988-11-11  |  7KB  |  268 lines

  1.     Title NETRCV - Receives messages from NETSEND
  2.  
  3. ;    Usage:
  4. ;
  5. ;    NETRCV FRED
  6. ;    NETRCV ADMIN*
  7. ;    NETRCV *
  8. ;
  9. ;    You may choose to receive only messages destined for you,
  10. ;    messages destined to anyone in a group, or all messages
  11. ;    sent on the network.  Actually this program receives all
  12. ;    messages and then pattern matches to see if it should
  13. ;    display the message or not.
  14. ;
  15. ;    NETSEND HOTLIPS Dinner at my place at 8:00
  16. ;
  17. ;    The receiver hear a beep on the speaker and would see
  18. ;
  19. ;    ;; [3624361805] - HOTLIPS Dinner at my place at 8:00
  20. ;
  21. ;    The number in "[]" is the node address from the adapter that
  22. ;    sent the message.
  23. ;
  24. ;
  25. ;    Author: Jack Schoof, President, ARTISOFT, Inc. Tucson, AZ
  26. ;
  27.  
  28.     ASSUME CS:MAIN_CODE,DS:MAIN_DATA
  29.  
  30. FCB1    EQU 5DH             ;WHERE THE FCB IS STORED IN THE PSP
  31.  
  32. ;
  33. ;    NCB DEFINITION
  34. ;
  35. NCBDEF    STRUC                ;PRE FILLED WITH ALL ZEROES
  36. NCB_COMMAND    DB 0
  37. NCB_RETCODE    DB 0
  38. NCB_LSN     DB 0
  39. NCB_NUM     DB 0
  40. NCB_BUFFER    DD 0            ;POINTER TO MESSAGE BUFFER
  41. NCB_LENGTH    DW 0            ;NUMBER OF BYTES IN BUFFER
  42. NCB_CALLNAME    DB 16 DUP (0)
  43. NCB_NAME    DB 16 DUP (0)
  44. NCB_RTO     DB 0
  45. NCB_STO     DB 0
  46. NCB_POST    DD 0            ;POINTER TO POST ADDRESS
  47. NCB_LANA_NUM    DB 0
  48. NCB_CMD_CPLT    DB 0
  49. NCB_RESERVED    DB 14 DUP (0)        ;RESERVED
  50. NCBDEF    ENDS
  51.  
  52. ;
  53. ;    NCB COMMANDS
  54. ;
  55. NO_WAIT         EQU 80H
  56. NCB_ADD_GROUP_NAME    EQU 36H
  57. NCB_RECEIVE_DATAGRAM    EQU 21H
  58.  
  59. SOM    SEGMENT 'SOM'
  60. START_OF_MEMORY EQU THIS DWORD
  61. SOM    ENDS
  62.  
  63. MAIN_DATA    SEGMENT PUBLIC 'DATA'
  64.  
  65. MATCH_NAME    DB 8 DUP (?)
  66. RCV_BUFFER    DB 128 DUP (?)
  67.  
  68. ERROR        DB 7,'NETBIOS ERROR: '
  69. SIZE_ERROR    EQU $-ERROR
  70.  
  71. DTA_PSP     DW 0
  72.  
  73. SEGEOM        DW SEG END_OF_MEMORY    ;BECAUSE OF BUG IN MASM 5.1 (SEE LATER)
  74.  
  75. RNCB        NCBDEF <>            ;DEFINE NCB
  76.  
  77.     ORG RNCB.NCB_NAME        ;GROUP NAME TO ADD
  78.     DB 'NETSEND_GROUP',0,0,10    ;10 AT THE END TO NOT NAME CONFLICT
  79.     ORG RNCB+SIZE NCBDEF        ;WITH NETWORK OPERATING SYSTEMS
  80.  
  81. MAIN_DATA    ENDS
  82.  
  83. MAIN_CODE    SEGMENT PUBLIC 'CODE'
  84.  
  85. BEGIN:    PUSH ES
  86.     POP DS                ;DS = PSP LOCATION
  87.     MOV AX,SEG MAIN_DATA
  88.     MOV ES,AX            ;ES = SEG MAIN_DATA
  89.     MOV ES:DTA_PSP,DS        ;SAVE THE PSP
  90.     MOV SI,FCB1            ;POINT TO FILE1 IN THE PSP
  91.     MOV DI,OFFSET MATCH_NAME    ;AND TO OUR INTERNAL MATCH NAME
  92.     MOV CX,8            ;8 CHARACTERS MAX
  93.     REP MOVSB            ;MOVE DS:SI TO ES:DI 8 BYTES
  94.     PUSH ES
  95.     POP DS                ;NOW DS = MAIN_DATA
  96.  
  97.     MOV RNCB.NCB_COMMAND,NCB_ADD_GROUP_NAME
  98.     MOV BX,OFFSET RNCB        ;ES:BX = RNCB
  99.     INT 5CH             ;ADD THE GROUP NAME NOW
  100.     TEST AL,AL            ;ANY PROBLEMS WITH THE GROUP?
  101.     JNZ COMPLAIN            ;COMPLAIN TO THE USER
  102.  
  103.     CALL SETUP_RECEIVE        ;GET A RECEIVE READY FOR ANY MESSAGES
  104.     TEST AL,AL            ;ERRORS ON THE RECEIVE?
  105.     JZ TSR_NOW            ;NO THEN TERMINATE AND STAY RESIDENT
  106.  
  107. COMPLAIN:
  108.     MOV DX,OFFSET ERROR        ;POINT TO ERROR TEXT TO SAY
  109.     MOV AH,40H            ;WRITE TO FILE COMMAND
  110.     MOV BX,2            ;STANDARD ERROR HANDLE
  111.     MOV CX,SIZE_ERROR        ;GET SIZE OF TEXT
  112.     INT 21H             ;COMPLAIN ABOUT THE ERROR
  113.     MOV AL,RNCB.NCB_CMD_CPLT    ;GET THE ERROR NUMBER
  114.     CALL HEX2            ;DISPLAY IT
  115.     CALL CRLF            ;AND A NEWLINE
  116.     MOV AL,RNCB.NCB_CMD_CPLT
  117.     MOV AH,4CH            ;EXIT CODE IS NETBIOS ERROR NUMBER
  118.     INT 21H             ;SO A BATCH FILE CAN TEST FOR PROBS
  119.  
  120. ENVADDR EQU 44
  121.  
  122. TSR_NOW:
  123.     MOV ES,DTA_PSP            ;GET PSP ADDRESS
  124.     MOV ES,ES:ENVADDR        ;GET ENVIRONMENT ADDRESS
  125.     MOV AH,49H            ;FREE ENVIRONMENT MEMORY
  126.     INT 21H             ;SAVES SOME SPACE
  127.  
  128.     MOV AX,3100H            ;TSR SYSTEM CALL
  129. ;    MOV DX,SEG END_OF_MEMORY    ;TAKE THE END OF MEMORY
  130. ;       * CANT DO ABOVE BECAUSE OF BUG IN MASM 5.1 SO MUST DO NEXT LINE *
  131.     MOV DX,SEGEOM            ;GET THE SEGMENT OF EOM
  132.     SUB DX,SEG START_OF_MEMORY
  133.     ADD DX,11H            ;ADD 11H FOR PSP
  134.     MOV ES,DTA_PSP
  135.     INT 21H             ;TERMINATE AND STAY RESIDENT
  136.  
  137. ;
  138. ;    THIS BEGINS THE TSR PART OF THE CODE
  139. ;
  140. ;    RCV_MESSAGE IS THE POST ADDRESS FOR THE RECEIVE DATAGRAM
  141. ;    ALL RECEIVE DATAGRAMS SENT TO THE GROUP NAME NETSEND_GROUP
  142. ;    WILL POST HERE.
  143. ;
  144. RCV_MESSAGE:
  145.     PUSH AX             ;SAVE ALL THE REGISTERS
  146.     PUSH BX             ;JUST TO BE SURE
  147.     PUSH CX             ;IBM SAYS THAT THEY SHOULD BE
  148.     PUSH DX             ;SAVED BY THE NETBIOS, BUT
  149.     PUSH SI             ;ALL OF THEM DO NOT
  150.     PUSH DI
  151.     PUSH ES
  152.     PUSH DS
  153.     STI                ;TURN INTERRUPTS BACK ON
  154.     MOV AX,SEG MAIN_DATA
  155.     MOV DS,AX            ;POINT TO OUR DATA
  156.     MOV CX,RNCB.NCB_LENGTH        ;GET THE LENGTH OF THE RECEIVE
  157.     MOV SI,OFFSET RCV_BUFFER    ;POINT TO THE RECEIVE BUFFER
  158.     MOV DI,OFFSET MATCH_NAME    ;AND THE MATCH NAME
  159. NXTCHR: LODSB                ;GET DS:SI INTO AL
  160.     CMP AL,'*'            ;HAVE WE HIT A STAR?
  161.     JZ MATCHED            ;YES THEN WE MATCHED
  162.     MOV AH,[DI]            ;NO THEN CHECK OUR INTERNAL NAME
  163.     CMP AH,'?'            ;A QUESTION MARK ON THE RECEIVER?
  164.     JZ MATCHED            ;DOS CHANGES * TO QUESTION MARKS IN FCB
  165.     CMP AL,'a'            ;CONVERT TO LOWER CASE
  166.     JC NOTLC            ;LESS THAN AN 'a'
  167.     CMP AL,'z'+1
  168.     JNC NOTLC            ;GREATER THAN A 'z'
  169.     SUB AL,'a'-'A'            ;SUBTRACT THE RIGHT AMOUNT TO MAKE UC
  170. NOTLC:    CMP AH,AL            ;ARE THEY NOW BOTH THE SAME?
  171.     JNZ REJECT            ;NO THEN REJECT THE RECEIVE
  172.     CMP AL,' '            ;IF THEY ARE BOTH SPACES THEN WE
  173.     JZ MATCHED            ;MATCHED
  174.     INC DI                ;UPDATE THE DI POINTER
  175.     LOOP NXTCHR            ;AND KEEP GOING
  176. MATCHED:
  177.     CALL CRLF
  178.     MOV AL,';'
  179.     CALL OUTCH
  180.     CALL OUTCH
  181.     MOV AL,' '
  182.     CALL OUTCH
  183.     MOV AL,'['            ;DISPLAY THE ";; ["
  184.     CALL OUTCH
  185.     MOV SI,OFFSET RNCB.NCB_CALLNAME+10 ;POINT TO WHO SENT THE MESSAGE
  186.     MOV CX,6            ;6 END DIGITS ARE ADAPTER ADDRESS
  187. ADPTD:    LODSB
  188.     PUSH CX
  189.     CALL HEX2            ;DISPLAY THE DIGITS
  190.     POP CX
  191.     LOOP ADPTD            ;UNTIL ALL DONE
  192.     MOV AL,']'
  193.     CALL OUTCH
  194.     MOV AL,' '
  195.     CALL OUTCH
  196.     MOV AL,'-'
  197.     CALL OUTCH
  198.     MOV AL,' '
  199.     CALL OUTCH            ;DISPLAY THE "] - "
  200.  
  201.     MOV SI,OFFSET RCV_BUFFER    ;POINT TO THE RECEIVE BUFFER AGAIN
  202.     MOV CX,RNCB.NCB_LENGTH        ;AND THE LENGTH AGAIN
  203. CHLOOP: LODSB                ;GET THE CHARACTER
  204.     CALL OUTCH
  205.     LOOP CHLOOP            ;OUT THE CHARACTERS GO
  206.     CALL CRLF            ;NEWLINE
  207.     MOV AL,7            ;BELL CHARACTER
  208.     CALL OUTCH            ;BEEP AT END OF LINE
  209. REJECT: CALL SETUP_RECEIVE        ;START A RECEIVE FOR NEXT TIME
  210.     POP DS
  211.     POP ES
  212.     POP DI
  213.     POP SI
  214.     POP DX
  215.     POP CX
  216.     POP BX
  217.     POP AX                ;RESTORE THE WORLD
  218.     IRET                ;AND RETURN FROM THE POST
  219.  
  220. CRLF:    MOV AL,0DH
  221.     CALL OUTCH
  222.     MOV AL,0AH
  223. OUTCH:    MOV AH,0EH
  224.     XOR BX,BX
  225.     INT 10H             ;DISPLAY CHARACTER
  226.     RET
  227.  
  228. SETUP_RECEIVE:
  229.     MOV RNCB.NCB_LENGTH,128     ;WE CAN RECEIVE UP TO 128 BYTES
  230.     MOV WORD PTR RNCB.NCB_BUFFER,OFFSET RCV_BUFFER
  231.     MOV WORD PTR RNCB.NCB_BUFFER+2,ES
  232.     MOV WORD PTR RNCB.NCB_POST,OFFSET RCV_MESSAGE
  233.     MOV WORD PTR RNCB.NCB_POST+2,CS
  234.     MOV RNCB.NCB_COMMAND,NO_WAIT+NCB_RECEIVE_DATAGRAM
  235.     MOV BX,OFFSET RNCB
  236.     INT 5CH             ;SETUP THE RECEIVE
  237.     RET                ;AND RETURN
  238.  
  239. HEX2:    MOV BL,AL
  240.     MOV CL,4
  241.     ROL BL,CL            ;ROTATE TO GET THE TOP DIGIT
  242.     CALL HEXDIG            ;DISPLAY THE FIRST DIGIT
  243.     MOV CL,4
  244.     ROL BL,CL            ;THEN FALL INTO HEXDIG FOR LAST ONE
  245. HEXDIG: MOV AL,BL            ;HEX CHARACTER IN BL
  246.     AND AL,0FH            ;MASK OFF BOTTOM NIBBLE
  247.     ADD AL,'0'            ;ADD ASCII OFFSET
  248.     CMP AL,'9'            ;ABOVE 9?
  249.     JLE PRINT_CHAR
  250.     ADD AL,'A'-'9'-1        ;THEN ADD CORRECT AMOUNT TO GET A-F
  251. PRINT_CHAR:
  252.     PUSH BX
  253.     CALL OUTCH
  254.     POP BX
  255.     RET
  256.  
  257. MAIN_CODE    ENDS
  258.  
  259. EOM    SEGMENT 'EOM'
  260. END_OF_MEMORY    EQU THIS DWORD
  261. EOM    ENDS
  262.  
  263. MAIN_STACK    SEGMENT STACK
  264.     DW 100H DUP (?)
  265. MAIN_STACK    ENDS
  266.  
  267.     END BEGIN
  268.