home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / lan / netmsg / netrcv.asm next >
Assembly Source File  |  1989-03-05  |  7KB  |  292 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. NOMSG        DB 7,10,13,'NETBIOS INTERFACE NOT PRESENT',10,13,'$'
  72.  
  73. DTA_PSP     DW 0
  74.  
  75. SEGEOM        DW SEG END_OF_MEMORY    ;BECAUSE OF BUG IN MASM 5.1 (SEE LATER)
  76.  
  77. RNCB        NCBDEF <>            ;DEFINE NCB
  78.  
  79.     ORG RNCB.NCB_NAME        ;GROUP NAME TO ADD
  80.     DB 'NETSEND_GROUP',0,0,10    ;10 AT THE END TO NOT NAME CONFLICT
  81.     ORG RNCB+SIZE NCBDEF        ;WITH NETWORK OPERATING SYSTEMS
  82.  
  83. MAIN_DATA    ENDS
  84.  
  85. MAIN_CODE    SEGMENT PUBLIC 'CODE'
  86.  
  87. BEGIN:    
  88.     PUSH    ES            ;save ES
  89.            MOV     AH,35H                  ;get interrupt 5C vector
  90.     MOV     AL,5CH
  91.     INT     21H
  92.     MOV    AX,ES
  93.     POP    ES            ;get back ES
  94.     CMP    AX,0            ;is segment 0
  95.     JNE    ADAPTER_STAT        ;not 0 an interface is present
  96.     JMP    NO_ADAPTER        ;
  97.  
  98. ADAPTER_STAT:
  99.     PUSH ES
  100.     POP DS                ;DS = PSP LOCATION
  101.     MOV AX,SEG MAIN_DATA
  102.     MOV ES,AX            ;ES = SEG MAIN_DATA
  103.     MOV ES:DTA_PSP,DS        ;SAVE THE PSP
  104.     MOV SI,FCB1            ;POINT TO FILE1 IN THE PSP
  105.     MOV DI,OFFSET MATCH_NAME    ;AND TO OUR INTERNAL MATCH NAME
  106.     MOV CX,8            ;8 CHARACTERS MAX
  107.     REP MOVSB            ;MOVE DS:SI TO ES:DI 8 BYTES
  108.     PUSH ES
  109.     POP DS                ;NOW DS = MAIN_DATA
  110.  
  111.     MOV RNCB.NCB_COMMAND,NCB_ADD_GROUP_NAME
  112.     MOV BX,OFFSET RNCB        ;ES:BX = RNCB
  113.     INT 5CH             ;ADD THE GROUP NAME NOW
  114.     TEST AL,AL            ;ANY PROBLEMS WITH THE GROUP?
  115.     JNZ COMPLAIN            ;COMPLAIN TO THE USER
  116.  
  117.     CALL SETUP_RECEIVE        ;GET A RECEIVE READY FOR ANY MESSAGES
  118.     TEST AL,AL            ;ERRORS ON THE RECEIVE?
  119.     JZ TSR_NOW            ;NO THEN TERMINATE AND STAY RESIDENT
  120.  
  121. COMPLAIN:
  122.     MOV DX,OFFSET ERROR        ;POINT TO ERROR TEXT TO SAY
  123.     MOV AH,40H            ;WRITE TO FILE COMMAND
  124.     MOV BX,2            ;STANDARD ERROR HANDLE
  125.     MOV CX,SIZE_ERROR        ;GET SIZE OF TEXT
  126.     INT 21H             ;COMPLAIN ABOUT THE ERROR
  127.     MOV AL,RNCB.NCB_CMD_CPLT    ;GET THE ERROR NUMBER
  128.     CALL HEX2            ;DISPLAY IT
  129.     CALL CRLF            ;AND A NEWLINE
  130.     MOV AL,RNCB.NCB_CMD_CPLT
  131.     MOV AH,4CH            ;EXIT CODE IS NETBIOS ERROR NUMBER
  132.     INT 21H             ;SO A BATCH FILE CAN TEST FOR PROBS
  133.  
  134. NO_ADAPTER:
  135.     MOV AX, MAIN_DATA
  136.     MOV DS, AX
  137.     MOV DX, OFFSET NOMSG        ;POINT TO ERROR TEXT TO SAY
  138.     MOV AH,09
  139.     INT 21H                ;DISPLAY
  140.     MOV AH,4CH
  141.     MOV AL,0FFH            ;ERROR = -1
  142.     INT 21H             ;SO A BATCH FILE CAN TEST FOR PROBS
  143.  
  144. ENVADDR EQU 44
  145.  
  146. TSR_NOW:
  147.     MOV ES,DTA_PSP            ;GET PSP ADDRESS
  148.     MOV ES,ES:ENVADDR        ;GET ENVIRONMENT ADDRESS
  149.     MOV AH,49H            ;FREE ENVIRONMENT MEMORY
  150.     INT 21H             ;SAVES SOME SPACE
  151.  
  152.     MOV AX,3100H            ;TSR SYSTEM CALL
  153. ;    MOV DX,SEG END_OF_MEMORY    ;TAKE THE END OF MEMORY
  154. ;       * CANT DO ABOVE BECAUSE OF BUG IN MASM 5.1 SO MUST DO NEXT LINE *
  155.     MOV DX,SEGEOM            ;GET THE SEGMENT OF EOM
  156.     SUB DX,SEG START_OF_MEMORY
  157.     ADD DX,11H            ;ADD 11H FOR PSP
  158.     MOV ES,DTA_PSP
  159.     INT 21H             ;TERMINATE AND STAY RESIDENT
  160.  
  161. ;
  162. ;    THIS BEGINS THE TSR PART OF THE CODE
  163. ;
  164. ;    RCV_MESSAGE IS THE POST ADDRESS FOR THE RECEIVE DATAGRAM
  165. ;    ALL RECEIVE DATAGRAMS SENT TO THE GROUP NAME NETSEND_GROUP
  166. ;    WILL POST HERE.
  167. ;
  168. RCV_MESSAGE:
  169.     PUSH AX             ;SAVE ALL THE REGISTERS
  170.     PUSH BX             ;JUST TO BE SURE
  171.     PUSH CX             ;IBM SAYS THAT THEY SHOULD BE
  172.     PUSH DX             ;SAVED BY THE NETBIOS, BUT
  173.     PUSH SI             ;ALL OF THEM DO NOT
  174.     PUSH DI
  175.     PUSH ES
  176.     PUSH DS
  177.     STI                ;TURN INTERRUPTS BACK ON
  178.     MOV AX,SEG MAIN_DATA
  179.     MOV DS,AX            ;POINT TO OUR DATA
  180.     MOV CX,RNCB.NCB_LENGTH        ;GET THE LENGTH OF THE RECEIVE
  181.     MOV SI,OFFSET RCV_BUFFER    ;POINT TO THE RECEIVE BUFFER
  182.     MOV DI,OFFSET MATCH_NAME    ;AND THE MATCH NAME
  183. NXTCHR: LODSB                ;GET DS:SI INTO AL
  184.     CMP AL,'*'            ;HAVE WE HIT A STAR?
  185.     JZ MATCHED            ;YES THEN WE MATCHED
  186.     MOV AH,[DI]            ;NO THEN CHECK OUR INTERNAL NAME
  187.     CMP AH,'?'            ;A QUESTION MARK ON THE RECEIVER?
  188.     JZ MATCHED            ;DOS CHANGES * TO QUESTION MARKS IN FCB
  189.     CMP AL,'a'            ;CONVERT TO LOWER CASE
  190.     JC NOTLC            ;LESS THAN AN 'a'
  191.     CMP AL,'z'+1
  192.     JNC NOTLC            ;GREATER THAN A 'z'
  193.     SUB AL,'a'-'A'            ;SUBTRACT THE RIGHT AMOUNT TO MAKE UC
  194. NOTLC:    CMP AH,AL            ;ARE THEY NOW BOTH THE SAME?
  195.     JNZ REJECT            ;NO THEN REJECT THE RECEIVE
  196.     CMP AL,' '            ;IF THEY ARE BOTH SPACES THEN WE
  197.     JZ MATCHED            ;MATCHED
  198.     INC DI                ;UPDATE THE DI POINTER
  199.     LOOP NXTCHR            ;AND KEEP GOING
  200. MATCHED:
  201.     CALL CRLF
  202.     MOV AL,';'
  203.     CALL OUTCH
  204.     CALL OUTCH
  205.     MOV AL,' '
  206.     CALL OUTCH
  207.     MOV AL,'['            ;DISPLAY THE ";; ["
  208.     CALL OUTCH
  209.     MOV SI,OFFSET RNCB.NCB_CALLNAME+10 ;POINT TO WHO SENT THE MESSAGE
  210.     MOV CX,6            ;6 END DIGITS ARE ADAPTER ADDRESS
  211. ADPTD:    LODSB
  212.     PUSH CX
  213.     CALL HEX2            ;DISPLAY THE DIGITS
  214.     POP CX
  215.     LOOP ADPTD            ;UNTIL ALL DONE
  216.     MOV AL,']'
  217.     CALL OUTCH
  218.     MOV AL,' '
  219.     CALL OUTCH
  220.     MOV AL,'-'
  221.     CALL OUTCH
  222.     MOV AL,' '
  223.     CALL OUTCH            ;DISPLAY THE "] - "
  224.  
  225.     MOV SI,OFFSET RCV_BUFFER    ;POINT TO THE RECEIVE BUFFER AGAIN
  226.     MOV CX,RNCB.NCB_LENGTH        ;AND THE LENGTH AGAIN
  227. CHLOOP: LODSB                ;GET THE CHARACTER
  228.     CALL OUTCH
  229.     LOOP CHLOOP            ;OUT THE CHARACTERS GO
  230.     CALL CRLF            ;NEWLINE
  231.     MOV AL,7            ;BELL CHARACTER
  232.     CALL OUTCH            ;BEEP AT END OF LINE
  233. REJECT: CALL SETUP_RECEIVE        ;START A RECEIVE FOR NEXT TIME
  234.     POP DS
  235.     POP ES
  236.     POP DI
  237.     POP SI
  238.     POP DX
  239.     POP CX
  240.     POP BX
  241.     POP AX                ;RESTORE THE WORLD
  242.     IRET                ;AND RETURN FROM THE POST
  243.  
  244. CRLF:    MOV AL,0DH
  245.     CALL OUTCH
  246.     MOV AL,0AH
  247. OUTCH:    MOV AH,0EH
  248.     XOR BX,BX
  249.     INT 10H             ;DISPLAY CHARACTER
  250.     RET
  251.  
  252. SETUP_RECEIVE:
  253.     MOV RNCB.NCB_LENGTH,128     ;WE CAN RECEIVE UP TO 128 BYTES
  254.     MOV WORD PTR RNCB.NCB_BUFFER,OFFSET RCV_BUFFER
  255.     MOV WORD PTR RNCB.NCB_BUFFER+2,ES
  256.     MOV WORD PTR RNCB.NCB_POST,OFFSET RCV_MESSAGE
  257.     MOV WORD PTR RNCB.NCB_POST+2,CS
  258.     MOV RNCB.NCB_COMMAND,NO_WAIT+NCB_RECEIVE_DATAGRAM
  259.     MOV BX,OFFSET RNCB
  260.     INT 5CH             ;SETUP THE RECEIVE
  261.     RET                ;AND RETURN
  262.  
  263. HEX2:    MOV BL,AL
  264.     MOV CL,4
  265.     ROL BL,CL            ;ROTATE TO GET THE TOP DIGIT
  266.     CALL HEXDIG            ;DISPLAY THE FIRST DIGIT
  267.     MOV CL,4
  268.     ROL BL,CL            ;THEN FALL INTO HEXDIG FOR LAST ONE
  269. HEXDIG: MOV AL,BL            ;HEX CHARACTER IN BL
  270.     AND AL,0FH            ;MASK OFF BOTTOM NIBBLE
  271.     ADD AL,'0'            ;ADD ASCII OFFSET
  272.     CMP AL,'9'            ;ABOVE 9?
  273.     JLE PRINT_CHAR
  274.     ADD AL,'A'-'9'-1        ;THEN ADD CORRECT AMOUNT TO GET A-F
  275. PRINT_CHAR:
  276.     PUSH BX
  277.     CALL OUTCH
  278.     POP BX
  279.     RET
  280.  
  281. MAIN_CODE    ENDS
  282.  
  283. EOM    SEGMENT 'EOM'
  284. END_OF_MEMORY    EQU THIS DWORD
  285. EOM    ENDS
  286.  
  287. MAIN_STACK    SEGMENT STACK
  288.     DW 100H DUP (?)
  289. MAIN_STACK    ENDS
  290.  
  291.     END BEGIN
  292.