home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / clarion / net1.zip / NET1.ASM < prev    next >
Assembly Source File  |  1989-03-28  |  19KB  |  548 lines

  1.     .LALL
  2.  
  3.     PAGE    60,120
  4. ;-----------------------------------------------------------------------;
  5. ;    Written by Randy Rogers                        ;
  6. ;    For Clarion Professional Developer Version 2.0            ;
  7. ;                                    ;
  8. ;    Copyright 1989 Wardcomp LImited                    ;
  9. ;                                    ;
  10. ;    Module: NET1.ASM                        ;
  11. ;                                    ;
  12. ;        Novell NetWare Language Extension Module        ;
  13. ;        Miscellaneous NetWare Procedures:            ;
  14. ;                                    ;
  15. ;        SEND_MSG( MESSAGE , USER_NAME )                ;
  16. ;            Send a message through NetWare            ;
  17. ;                                    ;
  18. ;        GET_UNAME ()                        ;
  19. ;            Get the User Name                ;
  20. ;                                    ;
  21. ;        OPEN_SEM ( OSNAME )                    ;
  22. ;            Open a semaphore                ;
  23. ;                                    ;
  24. ;        CLOSE_SEM ( CSNAME )                    ;
  25. ;            Close a semaphore                ;
  26. ;                                    ;
  27. ;        GET_PID ()                        ;
  28. ;            Get the Physical Station Id            ;
  29. ;                                    ;
  30. ;        LOG_LREC ( LOGNAME )                    ;
  31. ;            Log Logical Record                ;
  32. ;                                    ;
  33. ;        LOCK_LSET ()                        ;
  34. ;            Lock Logical Record Set                ;
  35. ;                                    ;
  36. ;        CLEAR_LREC ( CLEARNAME )                ;
  37. ;            Clear Logical Record                ;
  38. ;-----------------------------------------------------------------------;
  39.  
  40. ;-----------------------------------------------------------------------;
  41. ; L.E.M.  equates                            ;
  42. ;-----------------------------------------------------------------------;
  43. TSTRING EQU    0            ;String
  44. TSHORT    EQU    1            ;Signed word (16 bits)
  45. TLONG    EQU    2            ;Signed double word (32 bits)
  46. TREAL    EQU    4            ;Double precision float (8087)
  47.  
  48. PROCEDURE    EQU    0        ;L.E.M. procedure
  49. FUNCTION    EQU    1        ;L.E.M. function
  50.  
  51. NAMELTH = 0                ;Define NAMELTH for macro
  52.  
  53. ;-----------------------------------------------------------------------;
  54. ; L.E.M.  macro                                ;
  55. ;    ROUTINE 'ROUTINE NAME', ROUTINE_PROC_LABEL, ROUTINE_TYPE,    ;
  56. ;            NUMBER_OF_PARAMETERS                ;
  57. ;-----------------------------------------------------------------------;
  58. ROUTINE MACRO    RNAME, RPROC, RTYPE, RPARMS
  59.     LOCAL    LBLSTRT
  60. LBLSTRT DB    &RNAME
  61. NAMELTH =    $-LBLSTRT        ;;Padd name with nulls to 13 bytes
  62.     IF NAMELTH GT 12
  63.       .ERR
  64.       %OUT routine name too long
  65.     ELSE
  66.       DB    13-NAMELTH DUP (0)    ;;Rest of name area
  67.       DW    &RPROC            ;;Offset within binary module
  68.       DB    &RTYPE            ;;Routine type = PROCEDURE or FUNCTION
  69.       DB    &RPARMS            ;;Number of parameters
  70.     ENDIF
  71.     ENDM                ;;End of macro
  72.  
  73. ;-----------------------------------------------------------------------;
  74. ; L.E.M.  macro                                ;
  75. ;    PARAMETER LABEL_OF_PARAMETER, TYPE_OF_PARAMETER
  76. ;-----------------------------------------------------------------------;
  77. PARAMETER    MACRO    PLBL, PTYPE
  78.     DB    &PTYPE            ;;Type = STRING, SHORT, LONG, or REAL
  79. &PLBL    DD    0            ;;Address of PARAMETER data
  80. &PLBL&L DW    0            ;;Length of PARAMETER data
  81.     ENDM
  82.  
  83. ;-----------------------------------------------------------------------;
  84. ; Start of CODE segment                            ;
  85. ;-----------------------------------------------------------------------;
  86. CODE    SEGMENT BYTE PUBLIC 'CODE'    ;Will be loaded on a paragraph boundary
  87.     ASSUME    CS:CODE,DS:CODE
  88.  
  89. ;-----------------------------------------------------------------------;
  90. ; Binary module header                            ;
  91. ;-----------------------------------------------------------------------;
  92.     DB    'BIO'            ;L.E.M Signature - Version 2.0
  93. LIBVEC    DD    0            ;Reserved for Runtime Library Vector!
  94.     DW    BINEND            ;Length of binary module
  95.     DB    8            ;Eight routines in this L.E.M.
  96.  
  97. ;-----------------------------------------------------------------------;
  98. ; SEND_MSG definition                            ;
  99. ;                                    ;
  100. ;        SEND_MSG ( MESSAGE , USER_NAME )            ;
  101. ;            Send a message through NetWare            ;
  102. ;-----------------------------------------------------------------------;
  103.     ROUTINE        'SEND_MSG', SEND_MSG_PROC, PROCEDURE, 2
  104.     PARAMETER    MESSAGE, TSTRING
  105.     PARAMETER    USER_NAME, TSTRING
  106.  
  107. ;-----------------------------------------------------------------------;
  108. ; GET_UNAME definition                            ;
  109. ;                                    ;
  110. ;        GET_UNAME ()                        ;
  111. ;            Get the User Name                ;
  112. ;-----------------------------------------------------------------------;
  113.     ROUTINE        'GET_UNAME', GET_UNAME_PROC, FUNCTION, 0
  114.  
  115. ;-----------------------------------------------------------------------;
  116. ; OPEN_SEM definition                            ;
  117. ;                                    ;
  118. ;        OPEN_SEM ( OSNAME )                    ;
  119. ;            Open a semaphore                ;
  120. ;-----------------------------------------------------------------------;
  121.     ROUTINE        'OPEN_SEM', OPEN_SEM_PROC, FUNCTION, 1
  122.     PARAMETER    OSNAME, TSTRING
  123.  
  124. ;-----------------------------------------------------------------------;
  125. ; CLOSE_SEM definition                            ;
  126. ;                                    ;
  127. ;        CLOSE_SEM ( CSNAME )                    ;
  128. ;            Close a semaphore                ;
  129. ;-----------------------------------------------------------------------;
  130.     ROUTINE        'CLOSE_SEM', CLOSE_SEM_PROC, PROCEDURE, 1
  131.     PARAMETER    CSNAME, TSTRING
  132.  
  133. ;-----------------------------------------------------------------------;
  134. ; GET_PID definition                            ;
  135. ;                                    ;
  136. ;        GET_PID ()                        ;
  137. ;            Get the Physical Station Id            ;
  138. ;-----------------------------------------------------------------------;
  139.     ROUTINE        'GET_PID', GET_PID_PROC, FUNCTION, 0
  140.  
  141. ;-----------------------------------------------------------------------;
  142. ; LOG_LREC definition                            ;
  143. ;                                    ;
  144. ;        LOG_LREC ( LOGNAME )                    ;
  145. ;            Log Logical Record                ;
  146. ;-----------------------------------------------------------------------;
  147.     ROUTINE        'LOG_LREC', LOG_LREC_PROC, PROCEDURE, 1
  148.     PARAMETER    LOGNAME, TSTRING
  149.  
  150. ;-----------------------------------------------------------------------;
  151. ; LOCK_LSET definition                            ;
  152. ;                                    ;
  153. ;        LOCK_LSET ()                        ;
  154. ;            Lock Logical Record Set                ;
  155. ;-----------------------------------------------------------------------;
  156.     ROUTINE        'LOCK_LSET', LOCK_LSET_PROC, PROCEDURE, 0
  157.  
  158. ;-----------------------------------------------------------------------;
  159. ; CLEAR_LREC definition                            ;
  160. ;                                    ;
  161. ;        CLEAR_LREC ( CLEARNAME )                ;
  162. ;            Clear Logical Record                ;
  163. ;-----------------------------------------------------------------------;
  164.     ROUTINE        'CLEAR_LREC', CLEAR_LREC_PROC, PROCEDURE, 1
  165.     PARAMETER    CLEARNAME, TSTRING
  166.  
  167. ;-----------------------------------------------------------------------;
  168. ; Miscellaneous data area                        ;
  169. ;                                    ;
  170. ; Common variables and constants for all routines            ;
  171. ;-----------------------------------------------------------------------;
  172. ASCIIL        DB 0
  173. ASCIIZ        DB 129 DUP(0)
  174. RETVAL        DW 0
  175.                     ;Get Object Connection Numbers
  176. GOCN_RQST_BUF    EQU $            ;Request Buffer
  177. GOCN_RQST_BLEN    DW 51            ;  Buffer Length
  178. GOCN_RQST_FUNC    DB 15h            ;  Subfunction 15h
  179.         DB 0
  180. GOCN_RQST_OTYP    DB 1            ;  Object Type 1 = User
  181. GOCN_RQST_OLEN    DB 0            ;  Object Name Length
  182. GOCN_RQST_ONAM    DB 47 DUP(0)        ;  Object Name
  183.  
  184.                     ;Get Object Connection Numbers
  185. GOCN_RPLY_BUF    EQU $            ;Reply Buffer
  186. GOCN_RPLY_BLEN    DW 101            ;  Buffer Length
  187. GOCN_RPLY_CCNT    DB 0            ;  Connection Count
  188. GOCN_RPLY_CLST    DB 100 DUP(0)        ;  Connection List
  189.  
  190.                     ;Send Broadcast Message
  191. SBM_RQST_BUF    EQU $            ;Request Buffer
  192. SBM_RQST_BLEN    DW 158            ;  Buffer Length
  193. SBM_RQST_FUNC    DB 0            ;  Subfunction 00h
  194. SBM_RQST_CCNT    DB 0            ;  Connection Count
  195. SBM_RQST_CLST    DB 156 DUP(0)        ;  Connection List,Message Length,Message
  196.  
  197.                     ;Send Broadcast Message
  198. SBM_RPLY_BUF    EQU $            ;Reply Buffer
  199. SBM_RPLY_BLEN    DW 101            ;  Buffer Length
  200. SBM_RPLY_CCNT    DB 0            ;  Connection Count
  201. SBM_RPLY_CLST    DB 100 DUP(0)        ;  Result List
  202.  
  203.                     ;Get Connection Information
  204. GCI_RQST_BUF    EQU $            ;Request Buffer
  205. GCI_RQST_BLEN    DW 2            ;  Buffer Length
  206. GCI_RQST_FUNC    DB 16h            ;  Subfunction 16h
  207. GCI_RQST_CONN    DB 0            ;  Connection Number
  208.  
  209.                     ;Get Connection Information
  210. GCI_RPLY_BUF    EQU $            ;Reply Buffer
  211. GCI_RPLY_BLEN    DW 62            ;  Buffer Length
  212. GCI_RPLY_OID    DD 0            ;  Object ID
  213. GCI_RPLY_OTYP    DW 0            ;  Object Type
  214. GCI_RPLY_ONAM    DB 48 DUP(0)        ;  Object Name
  215. GCI_RPLY_LTIM    DB 7 DUP(0)        ;  Login Time
  216.  
  217. ;-----------------------------------------------------------------------;
  218. ; SEND_MSG procedure                            ;
  219. ;-----------------------------------------------------------------------;
  220. SEND_MSG_PROC    PROC    FAR
  221.     PUSH    DS            ;Make ES = DS
  222.     POP    ES            ;
  223.     MOV    CX,USER_NAMEL
  224.     LEA    DI,GOCN_RQST_ONAM    ;Get offset of Object Name
  225.     PUSH    DS            ;Save DS
  226.     LDS    SI,DWORD PTR USER_NAME    ;Get the User Name variable
  227.     CALL    COPYSTRING        ;Copy User Name to buffer
  228.     POP    DS            ;Restore DS
  229.     MOV    AL,CL            ;Move Length to AL
  230.     MOV    GOCN_RQST_OLEN,AL    ;Store in Buffer
  231.     LEA    SI,GOCN_RQST_BUF    ;Get offset of REQUEST BUFFER
  232.     LEA    DI,GOCN_RPLY_BUF    ;Get offset of REPLY BUFFER
  233.     MOV    AH,0E3h
  234.     INT    21h
  235.     MOV    AL,GOCN_RPLY_CCNT    ;Connection Count in AL
  236.     CMP    AL,0            ;Check for 1 or more Connections
  237.     JG    SEND_BM            ;Yes - Send Broadcast Message
  238.     RET                ;No - RETURN to Clarion program
  239. SEND_BM:
  240.     MOV    SBM_RQST_CCNT,AL    ;Connection Count in Request Buffer
  241.     XOR    CX,CX            ;Clear CX
  242.     MOV    CL,AL            ;Count in CL
  243.     LEA    SI,GOCN_RPLY_CLST    ;Source is GOCN Reply List
  244.     LEA    DI,SBM_RQST_CLST    ;Destination is SBM Request List
  245.     CLD                ;forward
  246.     REP    MOVSB            ;Move the List
  247.     PUSH    DI            ;Save Pointer for Length
  248.     INC    DI            ;Point to Message Area
  249.     MOV    CX,MESSAGEL
  250.     PUSH    DS            ;Save DS
  251.     LDS    SI,DWORD PTR MESSAGE    ;Get the Message variable
  252.     CALL    COPYSTRING        ;Copy Message to buffer
  253.     POP    DS            ;Restore DS
  254.     MOV    AL,CL            ;Move Length to AL
  255.     POP    DI            ;Restore Pointer for Length
  256.     STOSB                ;Store in Buffer
  257.     LEA    SI,SBM_RQST_BUF        ;Get offset of REQUEST BUFFER
  258.     LEA    DI,SBM_RPLY_BUF        ;Get offset of REPLY BUFFER
  259.     MOV    AH,0E1h
  260.     INT    21h
  261.     RET                ;RETURN to Clarion program
  262. SEND_MSG_PROC    ENDP            ;End of SEND MESSAGE
  263.  
  264. ;-----------------------------------------------------------------------;
  265. ; GET_UNAME function                            ;
  266. ;-----------------------------------------------------------------------;
  267. GET_UNAME_PROC    PROC    FAR
  268.     PUSH    DS            ;Make ES = DS
  269.     POP    ES            ;
  270.     MOV    AH,0DCh            ;Get Connection Number
  271.     INT    21h            ;
  272.     MOV    GCI_RQST_CONN,AL    ;Store in Request Buffer
  273.     LEA    SI,GCI_RQST_BUF        ;Get offset of REQUEST BUFFER
  274.     LEA    DI,GCI_RPLY_BUF        ;Get offset of REPLY BUFFER
  275.     MOV    AH,0E3h
  276.     INT    21h
  277.     LEA    SI,GCI_RPLY_ONAM    ;Point to Object Name
  278.     XOR    CX,CX            ;Clear counter
  279. FIND_LENGTH:
  280.     LODSB                ;Load a byte
  281.     CMP    AL,0            ;Look for 00h
  282.     JE    EXIT_GET_UNAME        ;Length determined
  283.     INC    CX            ;Count the byte
  284.     JMP    SHORT FIND_LENGTH    ;and loop
  285. EXIT_GET_UNAME:
  286.     MOV    AX,TSTRING        ;AX = 0, returning a string
  287.     LEA    BX,GCI_RPLY_ONAM    ;Point to Object Name
  288.     RET                ;RETURN to Clarion program
  289. GET_UNAME_PROC    ENDP            ;End of SEND MESSAGE
  290.  
  291. ;-----------------------------------------------------------------------;
  292. ; OPEN_SEM function                            ;
  293. ;-----------------------------------------------------------------------;
  294. OPEN_SEM_PROC    PROC    FAR
  295.     SUB    AX,AX            ;Set GLOBERR to no ERROR
  296.     CALL    SETGLOBERR
  297.  
  298.     MOV    CX,OSNAMEL        ;Get length OPEN SEMAPHORE NAME
  299.     LES    SI,DWORD PTR OSNAME    ;Get address of OPEN SEMAPHORE NAME
  300.     MOV    BP,ES            ;BP:SI points to OPEN SEMAPHORE NAME
  301.     CALL    COPYNAME        ;Copy OPEN SEMAPHORE NAME to ASCIIZ
  302.     JC    OPEN_SEM_ERROR        ;OPEN SEMAPHORE NAME too long?
  303.  
  304.     MOV    AH,0C5H            ;SEMAPHORE FUNCTION
  305.     XOR    AL,AL            ;OPEN SUBFUNCTION 0 IN AL
  306.     LEA    DX,ASCIIL        ;Get address of pattern
  307.     MOV    ASCIIL,CL        ;length
  308.     XOR    CL,CL            ;COUNT 0 IN CL
  309.     INT    21H            ;CALL DOS
  310.     CMP    AL,0            ;ERROR?
  311.     JE    EXIT_OPEN_SEM        ;NO ERROR EXIT
  312. OPEN_SEM_ERROR:
  313.     XOR    BX,BX            ;Set ERROR indicator
  314. EXIT_OPEN_SEM:
  315.     XOR    BH,BH            ;
  316.     MOV    RETVAL,BX        ;SEMAPHORE COUNT
  317.     MOV    AX,TSHORT        ;AX = 1, returning short
  318.     LEA    BX,RETVAL        ;OFFSET OF RETVAL
  319.     RET                ;RETURN TO CLARION
  320. OPEN_SEM_PROC ENDP
  321.  
  322. ;-----------------------------------------------------------------------;
  323. ; CLOSE_SEM procedure                            ;
  324. ;-----------------------------------------------------------------------;
  325. CLOSE_SEM_PROC    PROC    FAR
  326.     SUB    AX,AX            ;Set GLOBERR to no ERROR
  327.     CALL    SETGLOBERR
  328.  
  329.     MOV    CX,CSNAMEL        ;Get length CLOSE SEMAPHORE NAME
  330.     LES    SI,DWORD PTR CSNAME    ;Get address of CLOSE SEMAPHORE NAME
  331.     MOV    BP,ES            ;BP:SI points to CLOSE SEMAPHORE NAME
  332.     CALL    COPYNAME        ;Copy CLOSE SEMAPHORE NAME to ASCIIZ
  333.     JC    EXIT_CLOSE_SEM        ;CLOSE SEMAPHORE NAME too long?
  334.  
  335.     MOV    AH,0C5H            ;SEMAPHORE FUNCTION
  336.     XOR    AL,AL            ;OPEN SUBFUNCTION 0 IN AL
  337.     LEA    DX,ASCIIL        ;Get address of pattern
  338.     MOV    ASCIIL,CL        ;length
  339.     XOR    CL,CL            ;COUNT 0 IN CL
  340.     INT    21H            ;CALL DOS
  341.     CMP    AL,0            ;ERROR?
  342.     JNE    EXIT_CLOSE_SEM        ;YES ERROR EXIT
  343.     MOV    AL,04h            ;Close Subfunction
  344.     INT    21H            ;CALL DOS
  345. EXIT_CLOSE_SEM:
  346.     RET                ;RETURN TO CLARION
  347. CLOSE_SEM_PROC ENDP
  348.  
  349. ;-----------------------------------------------------------------------;
  350. ; GET_PID function                            ;
  351. ;-----------------------------------------------------------------------;
  352. GET_PID_PROC PROC FAR
  353.     MOV    AH,0EEH            ;GET PHYSICAL STATION NUMBER
  354.     INT    21H            ;CALL DOS
  355.     XOR    AH,AH            ;
  356.     MOV    RETVAL,AX        ;SEMAPHORE COUNT
  357.     MOV    AX,TSHORT        ;AX = 1, returning short
  358.     LEA    BX,RETVAL        ;OFFSET OF RETVAL
  359.     RET                ;RETURN TO CLARION
  360. GET_PID_PROC ENDP
  361.  
  362. ;-----------------------------------------------------------------------;
  363. ; LOG_LREC procedure                            ;
  364. ;-----------------------------------------------------------------------;
  365. LOG_LREC_PROC    PROC    FAR
  366.     SUB    AX,AX            ;Set GLOBERR to no ERROR
  367.     CALL    SETGLOBERR
  368.  
  369.     MOV    CX,LOGNAMEL        ;Get length LOGICAL RECORD NAME
  370.     LES    SI,DWORD PTR LOGNAME    ;Get address of LOGICAL RECORD NAME
  371.     MOV    BP,ES            ;BP:SI points to LOGICAL RECORD NAME
  372.     CALL    COPYNAME        ;Copy LOGICAL RECORD NAME to ASCIIZ
  373.     JC    LOG_LREC_ERROR        ;LOGICAL RECORD NAME too long?
  374.  
  375.     MOV    AH,0D0H            ;LOG RECORD FUNCTION
  376.     XOR    AL,AL            ;log record subfunction 0 IN AL
  377.     LEA    DX,ASCIIL        ;Get address of pattern
  378.     MOV    ASCIIL,CL        ;length
  379.     INT    21H            ;CALL DOS
  380.     CMP    AL,0            ;ERROR?
  381.     JE    EXIT_LOG_LREC        ;NO ERROR EXIT
  382. LOG_LREC_ERROR:
  383.     MOV    AX,2            ;'file not found' if error
  384.     CALL    SETGLOBERR        ;Set GLOBERR to AX
  385. EXIT_LOG_LREC:
  386.     RET                ;RETURN TO CLARION
  387. LOG_LREC_PROC ENDP
  388.  
  389. ;-----------------------------------------------------------------------;
  390. ; LOCK_LSET procedure                            ;
  391. ;-----------------------------------------------------------------------;
  392. LOCK_LSET_PROC PROC FAR
  393.     MOV    AH,0D1H            ;LOCK RECORD SET FUNCTION
  394.     MOV    BP,0            ;NO WAIT
  395.     INT    21H            ;
  396.     CMP    AL,0            ;ERROR?
  397.     JE    EXIT_LOCK_LSET        ;NO ERROR -> EXIT
  398.     MOV    AX,43            ;'record is already held' if error
  399.     CALL    SETGLOBERR        ;Set GLOBERR to AX
  400. EXIT_LOCK_LSET:
  401.     RET                ;RETURN TO CLARION
  402. LOCK_LSET_PROC ENDP
  403.  
  404. ;-----------------------------------------------------------------------;
  405. ; CLEAR_LREC procedure                            ;
  406. ;-----------------------------------------------------------------------;
  407. CLEAR_LREC_PROC PROC    FAR
  408.     SUB    AX,AX            ;Set GLOBERR to no ERROR
  409.     CALL    SETGLOBERR
  410.  
  411.     MOV    CX,CLEARNAMEL        ;Get length LOGICAL RECORD NAME
  412.     LES    SI,DWORD PTR CLEARNAME    ;Get address of LOGICAL RECORD NAME
  413.     MOV    BP,ES            ;BP:SI points to LOGICAL RECORD NAME
  414.     CALL    COPYNAME        ;Copy LOGICAL RECORD NAME to ASCIIZ
  415.     JC    CLEAR_LREC_ERROR    ;LOGICAL RECORD NAME too long?
  416.  
  417.     MOV    AH,0D4H            ;CLEAR RECORD FUNCTION
  418.     XOR    AL,AL            ;log record subfunction 0 IN AL
  419.     LEA    DX,ASCIIL        ;Get address of pattern
  420.     MOV    ASCIIL,CL        ;length
  421.     INT    21H            ;CALL DOS
  422.     CMP    AL,0            ;ERROR?
  423.     JE    EXIT_CLEAR_LREC        ;NO ERROR EXIT
  424. CLEAR_LREC_ERROR:
  425.     MOV    AX,2            ;'file not found' if error
  426.     CALL    SETGLOBERR        ;Set GLOBERR to AX
  427. EXIT_CLEAR_LREC:
  428.     RET                ;RETURN TO CLARION
  429. CLEAR_LREC_PROC ENDP
  430.  
  431. ;-----------------------------------------------------------------------;
  432. ; UPCHAR                                ;
  433. ;    Internal subroutine for the NetWare L.E.M.            ;
  434. ;    Makes a character upper case if its between 'a' and 'z'        ;
  435. ;                                    ;
  436. ;    DS:SI = address of character                    ;
  437. ;-----------------------------------------------------------------------;
  438. UPCHAR        PROC    NEAR
  439.     MOV    AL,BYTE PTR DS:[SI]
  440.     CMP    AL,'a'
  441.     JB    EXIT_UPCHAR
  442.     CMP    AL,'z'
  443.     JA    EXIT_UPCHAR
  444.     SUB    AL,20h
  445.     MOV    BYTE PTR DS:[SI],AL
  446. EXIT_UPCHAR:
  447.     RET
  448. UPCHAR        ENDP
  449.  
  450. ;-----------------------------------------------------------------------;
  451. ; COPYNAME                                ;
  452. ;    Internal subroutine for the NetWare L.E.M.            ;
  453. ;    Copies source to ASCIIZ and clips trailing spaces        ;
  454. ;    Calls COPYSTRING                        ;
  455. ;    Returns CARRY set if length longer than size of ASCIIZ - 1    ;
  456. ;                                    ;
  457. ;    CX    = length of source                    ;
  458. ;    BP:SI = address of source                    ;
  459. ;-----------------------------------------------------------------------;
  460. COPYNAME    PROC    NEAR
  461.     CMP    CX,SIZE ASCIIZ - 1
  462.     JBE    DO_THE_COPY
  463.     STC                ;Set error
  464.     RET                ;Return to caller in L.E.M.
  465. DO_THE_COPY:
  466.     PUSH    CX            ;Save length
  467.     PUSH    DS            ;Save data segment
  468.     PUSH    DS            ;ES:DI = destination
  469.     POP    ES            ;
  470.     LEA    DI,ASCIIZ        ;destination = ASCIIZ
  471.     MOV    DS,BP            ;BP:SI points to source
  472.     CALL    COPYSTRING
  473.     POP    DS
  474.     POP    CX
  475.     RET                ;Return to caller in L.E.M.
  476. COPYNAME    ENDP            ;End of COPYNAME
  477.  
  478. ;-----------------------------------------------------------------------;
  479. ; COPYSTRING                                ;
  480. ;    Internal subroutine for the NetWare L.E.M.            ;
  481. ;    Copies a string and clips trailing spaces from the destination    ;
  482. ;                                    ;
  483. ; Expects:                                ;
  484. ;    CX    = length of source                    ;
  485. ;    DS:SI = address of source                    ;
  486. ;    ES:DI = address of destination                    ;
  487. ;                                    ;
  488. ; Returns:                                ;
  489. ;    CX = the length of the resultant destination after clipping    ;
  490. ;-----------------------------------------------------------------------;
  491. COPYSTRING    PROC    NEAR
  492.     PUSH    CX            ;Save length
  493.     PUSH    SI            ;Save source offset
  494.     PUSH    DI            ;Save dest offset
  495.     CLD                ;Forward
  496.     REP    MOVSB            ;Move it
  497.     MOV    BYTE PTR ES:[DI],0    ;Add null at end
  498.     POP    DI            ;Restore dest offset
  499.     POP    SI            ;Restore source offset
  500.     POP    CX            ;Restore length
  501.     PUSH    DI            ;Save dest offset again
  502.     MOV    AX,CX            ;Set up count register
  503.     DEC    AX            ;Make relative to zero
  504.     ADD    DI,AX            ;Point to end
  505.     MOV    AL,20h            ;Look for spaces
  506.     STD                ;Backwards direction
  507.     REPZ    SCASB            ;Scan while equal to spaces
  508.     JNZ    NOT_A_SPACE
  509.     MOV    BYTE PTR ES:1[DI],0    ;String all spaces;put null at begin
  510.     JMP    SHORT EXIT_COPYSTRING
  511. NOT_A_SPACE:
  512.     INC    CX            ;Fix CX which is 1 too small
  513.     MOV    BYTE PTR ES:2[DI],0    ;Null terminate after non-space
  514. EXIT_COPYSTRING:
  515.     CLD                ;Back to forward
  516.     CLC                ;No error
  517.     POP    DI            ;Restore dest offset
  518.     RET                ;Return to caller in L.E.M.
  519. COPYSTRING    ENDP            ;End of COPYSTRING
  520.  
  521. ;-----------------------------------------------------------------------;
  522. ; SETGLOBERR                                ;
  523. ;    Internal subroutine for the NetWare L.E.M.            ;
  524. ;    Set global error returned by ERROR() and ERRORCODE()        ;
  525. ;                                    ;
  526. ;    AX = error code                            ;
  527. ;-----------------------------------------------------------------------;
  528. SETGLOBERR    PROC    NEAR
  529.     PUSH    ES            ;Save used registers
  530.     PUSH    DI
  531.     PUSH    AX            ;Save error code
  532.     MOV    AH,0FFh            ;Get address of GLOBERR
  533.     MOV    AL,29
  534.     CALL    DWORD PTR LIBVEC
  535.     POP    AX            ;Get error code
  536.     MOV    ES:[DI],AX        ;Set GLOBERR
  537.     POP    DI            ;Restore used registers
  538.     POP    ES
  539.     RET                ;Return to caller in L.E.M.
  540. SETGLOBERR    ENDP            ;End of SETGLOBERR
  541.  
  542. ;-----------------------------------------------------------------------;
  543. ; End of L.E.M.                                ;
  544. ;-----------------------------------------------------------------------;
  545. BINEND    DB    0            ;Used to provide size of L.E.M.
  546. CODE    ENDS                ;End of the code segment
  547.     END                ;End of the NetWare L.E.M.
  548.