home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Media Share 9
/
MEDIASHARE_09.ISO
/
clarion
/
net1.zip
/
NET1.ASM
< prev
next >
Wrap
Assembly Source File
|
1989-03-28
|
19KB
|
548 lines
.LALL
PAGE 60,120
;-----------------------------------------------------------------------;
; Written by Randy Rogers ;
; For Clarion Professional Developer Version 2.0 ;
; ;
; Copyright 1989 Wardcomp LImited ;
; ;
; Module: NET1.ASM ;
; ;
; Novell NetWare Language Extension Module ;
; Miscellaneous NetWare Procedures: ;
; ;
; SEND_MSG( MESSAGE , USER_NAME ) ;
; Send a message through NetWare ;
; ;
; GET_UNAME () ;
; Get the User Name ;
; ;
; OPEN_SEM ( OSNAME ) ;
; Open a semaphore ;
; ;
; CLOSE_SEM ( CSNAME ) ;
; Close a semaphore ;
; ;
; GET_PID () ;
; Get the Physical Station Id ;
; ;
; LOG_LREC ( LOGNAME ) ;
; Log Logical Record ;
; ;
; LOCK_LSET () ;
; Lock Logical Record Set ;
; ;
; CLEAR_LREC ( CLEARNAME ) ;
; Clear Logical Record ;
;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
; L.E.M. equates ;
;-----------------------------------------------------------------------;
TSTRING EQU 0 ;String
TSHORT EQU 1 ;Signed word (16 bits)
TLONG EQU 2 ;Signed double word (32 bits)
TREAL EQU 4 ;Double precision float (8087)
PROCEDURE EQU 0 ;L.E.M. procedure
FUNCTION EQU 1 ;L.E.M. function
NAMELTH = 0 ;Define NAMELTH for macro
;-----------------------------------------------------------------------;
; L.E.M. macro ;
; ROUTINE 'ROUTINE NAME', ROUTINE_PROC_LABEL, ROUTINE_TYPE, ;
; NUMBER_OF_PARAMETERS ;
;-----------------------------------------------------------------------;
ROUTINE MACRO RNAME, RPROC, RTYPE, RPARMS
LOCAL LBLSTRT
LBLSTRT DB &RNAME
NAMELTH = $-LBLSTRT ;;Padd name with nulls to 13 bytes
IF NAMELTH GT 12
.ERR
%OUT routine name too long
ELSE
DB 13-NAMELTH DUP (0) ;;Rest of name area
DW &RPROC ;;Offset within binary module
DB &RTYPE ;;Routine type = PROCEDURE or FUNCTION
DB &RPARMS ;;Number of parameters
ENDIF
ENDM ;;End of macro
;-----------------------------------------------------------------------;
; L.E.M. macro ;
; PARAMETER LABEL_OF_PARAMETER, TYPE_OF_PARAMETER
;-----------------------------------------------------------------------;
PARAMETER MACRO PLBL, PTYPE
DB &PTYPE ;;Type = STRING, SHORT, LONG, or REAL
&PLBL DD 0 ;;Address of PARAMETER data
&PLBL&L DW 0 ;;Length of PARAMETER data
ENDM
;-----------------------------------------------------------------------;
; Start of CODE segment ;
;-----------------------------------------------------------------------;
CODE SEGMENT BYTE PUBLIC 'CODE' ;Will be loaded on a paragraph boundary
ASSUME CS:CODE,DS:CODE
;-----------------------------------------------------------------------;
; Binary module header ;
;-----------------------------------------------------------------------;
DB 'BIO' ;L.E.M Signature - Version 2.0
LIBVEC DD 0 ;Reserved for Runtime Library Vector!
DW BINEND ;Length of binary module
DB 8 ;Eight routines in this L.E.M.
;-----------------------------------------------------------------------;
; SEND_MSG definition ;
; ;
; SEND_MSG ( MESSAGE , USER_NAME ) ;
; Send a message through NetWare ;
;-----------------------------------------------------------------------;
ROUTINE 'SEND_MSG', SEND_MSG_PROC, PROCEDURE, 2
PARAMETER MESSAGE, TSTRING
PARAMETER USER_NAME, TSTRING
;-----------------------------------------------------------------------;
; GET_UNAME definition ;
; ;
; GET_UNAME () ;
; Get the User Name ;
;-----------------------------------------------------------------------;
ROUTINE 'GET_UNAME', GET_UNAME_PROC, FUNCTION, 0
;-----------------------------------------------------------------------;
; OPEN_SEM definition ;
; ;
; OPEN_SEM ( OSNAME ) ;
; Open a semaphore ;
;-----------------------------------------------------------------------;
ROUTINE 'OPEN_SEM', OPEN_SEM_PROC, FUNCTION, 1
PARAMETER OSNAME, TSTRING
;-----------------------------------------------------------------------;
; CLOSE_SEM definition ;
; ;
; CLOSE_SEM ( CSNAME ) ;
; Close a semaphore ;
;-----------------------------------------------------------------------;
ROUTINE 'CLOSE_SEM', CLOSE_SEM_PROC, PROCEDURE, 1
PARAMETER CSNAME, TSTRING
;-----------------------------------------------------------------------;
; GET_PID definition ;
; ;
; GET_PID () ;
; Get the Physical Station Id ;
;-----------------------------------------------------------------------;
ROUTINE 'GET_PID', GET_PID_PROC, FUNCTION, 0
;-----------------------------------------------------------------------;
; LOG_LREC definition ;
; ;
; LOG_LREC ( LOGNAME ) ;
; Log Logical Record ;
;-----------------------------------------------------------------------;
ROUTINE 'LOG_LREC', LOG_LREC_PROC, PROCEDURE, 1
PARAMETER LOGNAME, TSTRING
;-----------------------------------------------------------------------;
; LOCK_LSET definition ;
; ;
; LOCK_LSET () ;
; Lock Logical Record Set ;
;-----------------------------------------------------------------------;
ROUTINE 'LOCK_LSET', LOCK_LSET_PROC, PROCEDURE, 0
;-----------------------------------------------------------------------;
; CLEAR_LREC definition ;
; ;
; CLEAR_LREC ( CLEARNAME ) ;
; Clear Logical Record ;
;-----------------------------------------------------------------------;
ROUTINE 'CLEAR_LREC', CLEAR_LREC_PROC, PROCEDURE, 1
PARAMETER CLEARNAME, TSTRING
;-----------------------------------------------------------------------;
; Miscellaneous data area ;
; ;
; Common variables and constants for all routines ;
;-----------------------------------------------------------------------;
ASCIIL DB 0
ASCIIZ DB 129 DUP(0)
RETVAL DW 0
;Get Object Connection Numbers
GOCN_RQST_BUF EQU $ ;Request Buffer
GOCN_RQST_BLEN DW 51 ; Buffer Length
GOCN_RQST_FUNC DB 15h ; Subfunction 15h
DB 0
GOCN_RQST_OTYP DB 1 ; Object Type 1 = User
GOCN_RQST_OLEN DB 0 ; Object Name Length
GOCN_RQST_ONAM DB 47 DUP(0) ; Object Name
;Get Object Connection Numbers
GOCN_RPLY_BUF EQU $ ;Reply Buffer
GOCN_RPLY_BLEN DW 101 ; Buffer Length
GOCN_RPLY_CCNT DB 0 ; Connection Count
GOCN_RPLY_CLST DB 100 DUP(0) ; Connection List
;Send Broadcast Message
SBM_RQST_BUF EQU $ ;Request Buffer
SBM_RQST_BLEN DW 158 ; Buffer Length
SBM_RQST_FUNC DB 0 ; Subfunction 00h
SBM_RQST_CCNT DB 0 ; Connection Count
SBM_RQST_CLST DB 156 DUP(0) ; Connection List,Message Length,Message
;Send Broadcast Message
SBM_RPLY_BUF EQU $ ;Reply Buffer
SBM_RPLY_BLEN DW 101 ; Buffer Length
SBM_RPLY_CCNT DB 0 ; Connection Count
SBM_RPLY_CLST DB 100 DUP(0) ; Result List
;Get Connection Information
GCI_RQST_BUF EQU $ ;Request Buffer
GCI_RQST_BLEN DW 2 ; Buffer Length
GCI_RQST_FUNC DB 16h ; Subfunction 16h
GCI_RQST_CONN DB 0 ; Connection Number
;Get Connection Information
GCI_RPLY_BUF EQU $ ;Reply Buffer
GCI_RPLY_BLEN DW 62 ; Buffer Length
GCI_RPLY_OID DD 0 ; Object ID
GCI_RPLY_OTYP DW 0 ; Object Type
GCI_RPLY_ONAM DB 48 DUP(0) ; Object Name
GCI_RPLY_LTIM DB 7 DUP(0) ; Login Time
;-----------------------------------------------------------------------;
; SEND_MSG procedure ;
;-----------------------------------------------------------------------;
SEND_MSG_PROC PROC FAR
PUSH DS ;Make ES = DS
POP ES ;
MOV CX,USER_NAMEL
LEA DI,GOCN_RQST_ONAM ;Get offset of Object Name
PUSH DS ;Save DS
LDS SI,DWORD PTR USER_NAME ;Get the User Name variable
CALL COPYSTRING ;Copy User Name to buffer
POP DS ;Restore DS
MOV AL,CL ;Move Length to AL
MOV GOCN_RQST_OLEN,AL ;Store in Buffer
LEA SI,GOCN_RQST_BUF ;Get offset of REQUEST BUFFER
LEA DI,GOCN_RPLY_BUF ;Get offset of REPLY BUFFER
MOV AH,0E3h
INT 21h
MOV AL,GOCN_RPLY_CCNT ;Connection Count in AL
CMP AL,0 ;Check for 1 or more Connections
JG SEND_BM ;Yes - Send Broadcast Message
RET ;No - RETURN to Clarion program
SEND_BM:
MOV SBM_RQST_CCNT,AL ;Connection Count in Request Buffer
XOR CX,CX ;Clear CX
MOV CL,AL ;Count in CL
LEA SI,GOCN_RPLY_CLST ;Source is GOCN Reply List
LEA DI,SBM_RQST_CLST ;Destination is SBM Request List
CLD ;forward
REP MOVSB ;Move the List
PUSH DI ;Save Pointer for Length
INC DI ;Point to Message Area
MOV CX,MESSAGEL
PUSH DS ;Save DS
LDS SI,DWORD PTR MESSAGE ;Get the Message variable
CALL COPYSTRING ;Copy Message to buffer
POP DS ;Restore DS
MOV AL,CL ;Move Length to AL
POP DI ;Restore Pointer for Length
STOSB ;Store in Buffer
LEA SI,SBM_RQST_BUF ;Get offset of REQUEST BUFFER
LEA DI,SBM_RPLY_BUF ;Get offset of REPLY BUFFER
MOV AH,0E1h
INT 21h
RET ;RETURN to Clarion program
SEND_MSG_PROC ENDP ;End of SEND MESSAGE
;-----------------------------------------------------------------------;
; GET_UNAME function ;
;-----------------------------------------------------------------------;
GET_UNAME_PROC PROC FAR
PUSH DS ;Make ES = DS
POP ES ;
MOV AH,0DCh ;Get Connection Number
INT 21h ;
MOV GCI_RQST_CONN,AL ;Store in Request Buffer
LEA SI,GCI_RQST_BUF ;Get offset of REQUEST BUFFER
LEA DI,GCI_RPLY_BUF ;Get offset of REPLY BUFFER
MOV AH,0E3h
INT 21h
LEA SI,GCI_RPLY_ONAM ;Point to Object Name
XOR CX,CX ;Clear counter
FIND_LENGTH:
LODSB ;Load a byte
CMP AL,0 ;Look for 00h
JE EXIT_GET_UNAME ;Length determined
INC CX ;Count the byte
JMP SHORT FIND_LENGTH ;and loop
EXIT_GET_UNAME:
MOV AX,TSTRING ;AX = 0, returning a string
LEA BX,GCI_RPLY_ONAM ;Point to Object Name
RET ;RETURN to Clarion program
GET_UNAME_PROC ENDP ;End of SEND MESSAGE
;-----------------------------------------------------------------------;
; OPEN_SEM function ;
;-----------------------------------------------------------------------;
OPEN_SEM_PROC PROC FAR
SUB AX,AX ;Set GLOBERR to no ERROR
CALL SETGLOBERR
MOV CX,OSNAMEL ;Get length OPEN SEMAPHORE NAME
LES SI,DWORD PTR OSNAME ;Get address of OPEN SEMAPHORE NAME
MOV BP,ES ;BP:SI points to OPEN SEMAPHORE NAME
CALL COPYNAME ;Copy OPEN SEMAPHORE NAME to ASCIIZ
JC OPEN_SEM_ERROR ;OPEN SEMAPHORE NAME too long?
MOV AH,0C5H ;SEMAPHORE FUNCTION
XOR AL,AL ;OPEN SUBFUNCTION 0 IN AL
LEA DX,ASCIIL ;Get address of pattern
MOV ASCIIL,CL ;length
XOR CL,CL ;COUNT 0 IN CL
INT 21H ;CALL DOS
CMP AL,0 ;ERROR?
JE EXIT_OPEN_SEM ;NO ERROR EXIT
OPEN_SEM_ERROR:
XOR BX,BX ;Set ERROR indicator
EXIT_OPEN_SEM:
XOR BH,BH ;
MOV RETVAL,BX ;SEMAPHORE COUNT
MOV AX,TSHORT ;AX = 1, returning short
LEA BX,RETVAL ;OFFSET OF RETVAL
RET ;RETURN TO CLARION
OPEN_SEM_PROC ENDP
;-----------------------------------------------------------------------;
; CLOSE_SEM procedure ;
;-----------------------------------------------------------------------;
CLOSE_SEM_PROC PROC FAR
SUB AX,AX ;Set GLOBERR to no ERROR
CALL SETGLOBERR
MOV CX,CSNAMEL ;Get length CLOSE SEMAPHORE NAME
LES SI,DWORD PTR CSNAME ;Get address of CLOSE SEMAPHORE NAME
MOV BP,ES ;BP:SI points to CLOSE SEMAPHORE NAME
CALL COPYNAME ;Copy CLOSE SEMAPHORE NAME to ASCIIZ
JC EXIT_CLOSE_SEM ;CLOSE SEMAPHORE NAME too long?
MOV AH,0C5H ;SEMAPHORE FUNCTION
XOR AL,AL ;OPEN SUBFUNCTION 0 IN AL
LEA DX,ASCIIL ;Get address of pattern
MOV ASCIIL,CL ;length
XOR CL,CL ;COUNT 0 IN CL
INT 21H ;CALL DOS
CMP AL,0 ;ERROR?
JNE EXIT_CLOSE_SEM ;YES ERROR EXIT
MOV AL,04h ;Close Subfunction
INT 21H ;CALL DOS
EXIT_CLOSE_SEM:
RET ;RETURN TO CLARION
CLOSE_SEM_PROC ENDP
;-----------------------------------------------------------------------;
; GET_PID function ;
;-----------------------------------------------------------------------;
GET_PID_PROC PROC FAR
MOV AH,0EEH ;GET PHYSICAL STATION NUMBER
INT 21H ;CALL DOS
XOR AH,AH ;
MOV RETVAL,AX ;SEMAPHORE COUNT
MOV AX,TSHORT ;AX = 1, returning short
LEA BX,RETVAL ;OFFSET OF RETVAL
RET ;RETURN TO CLARION
GET_PID_PROC ENDP
;-----------------------------------------------------------------------;
; LOG_LREC procedure ;
;-----------------------------------------------------------------------;
LOG_LREC_PROC PROC FAR
SUB AX,AX ;Set GLOBERR to no ERROR
CALL SETGLOBERR
MOV CX,LOGNAMEL ;Get length LOGICAL RECORD NAME
LES SI,DWORD PTR LOGNAME ;Get address of LOGICAL RECORD NAME
MOV BP,ES ;BP:SI points to LOGICAL RECORD NAME
CALL COPYNAME ;Copy LOGICAL RECORD NAME to ASCIIZ
JC LOG_LREC_ERROR ;LOGICAL RECORD NAME too long?
MOV AH,0D0H ;LOG RECORD FUNCTION
XOR AL,AL ;log record subfunction 0 IN AL
LEA DX,ASCIIL ;Get address of pattern
MOV ASCIIL,CL ;length
INT 21H ;CALL DOS
CMP AL,0 ;ERROR?
JE EXIT_LOG_LREC ;NO ERROR EXIT
LOG_LREC_ERROR:
MOV AX,2 ;'file not found' if error
CALL SETGLOBERR ;Set GLOBERR to AX
EXIT_LOG_LREC:
RET ;RETURN TO CLARION
LOG_LREC_PROC ENDP
;-----------------------------------------------------------------------;
; LOCK_LSET procedure ;
;-----------------------------------------------------------------------;
LOCK_LSET_PROC PROC FAR
MOV AH,0D1H ;LOCK RECORD SET FUNCTION
MOV BP,0 ;NO WAIT
INT 21H ;
CMP AL,0 ;ERROR?
JE EXIT_LOCK_LSET ;NO ERROR -> EXIT
MOV AX,43 ;'record is already held' if error
CALL SETGLOBERR ;Set GLOBERR to AX
EXIT_LOCK_LSET:
RET ;RETURN TO CLARION
LOCK_LSET_PROC ENDP
;-----------------------------------------------------------------------;
; CLEAR_LREC procedure ;
;-----------------------------------------------------------------------;
CLEAR_LREC_PROC PROC FAR
SUB AX,AX ;Set GLOBERR to no ERROR
CALL SETGLOBERR
MOV CX,CLEARNAMEL ;Get length LOGICAL RECORD NAME
LES SI,DWORD PTR CLEARNAME ;Get address of LOGICAL RECORD NAME
MOV BP,ES ;BP:SI points to LOGICAL RECORD NAME
CALL COPYNAME ;Copy LOGICAL RECORD NAME to ASCIIZ
JC CLEAR_LREC_ERROR ;LOGICAL RECORD NAME too long?
MOV AH,0D4H ;CLEAR RECORD FUNCTION
XOR AL,AL ;log record subfunction 0 IN AL
LEA DX,ASCIIL ;Get address of pattern
MOV ASCIIL,CL ;length
INT 21H ;CALL DOS
CMP AL,0 ;ERROR?
JE EXIT_CLEAR_LREC ;NO ERROR EXIT
CLEAR_LREC_ERROR:
MOV AX,2 ;'file not found' if error
CALL SETGLOBERR ;Set GLOBERR to AX
EXIT_CLEAR_LREC:
RET ;RETURN TO CLARION
CLEAR_LREC_PROC ENDP
;-----------------------------------------------------------------------;
; UPCHAR ;
; Internal subroutine for the NetWare L.E.M. ;
; Makes a character upper case if its between 'a' and 'z' ;
; ;
; DS:SI = address of character ;
;-----------------------------------------------------------------------;
UPCHAR PROC NEAR
MOV AL,BYTE PTR DS:[SI]
CMP AL,'a'
JB EXIT_UPCHAR
CMP AL,'z'
JA EXIT_UPCHAR
SUB AL,20h
MOV BYTE PTR DS:[SI],AL
EXIT_UPCHAR:
RET
UPCHAR ENDP
;-----------------------------------------------------------------------;
; COPYNAME ;
; Internal subroutine for the NetWare L.E.M. ;
; Copies source to ASCIIZ and clips trailing spaces ;
; Calls COPYSTRING ;
; Returns CARRY set if length longer than size of ASCIIZ - 1 ;
; ;
; CX = length of source ;
; BP:SI = address of source ;
;-----------------------------------------------------------------------;
COPYNAME PROC NEAR
CMP CX,SIZE ASCIIZ - 1
JBE DO_THE_COPY
STC ;Set error
RET ;Return to caller in L.E.M.
DO_THE_COPY:
PUSH CX ;Save length
PUSH DS ;Save data segment
PUSH DS ;ES:DI = destination
POP ES ;
LEA DI,ASCIIZ ;destination = ASCIIZ
MOV DS,BP ;BP:SI points to source
CALL COPYSTRING
POP DS
POP CX
RET ;Return to caller in L.E.M.
COPYNAME ENDP ;End of COPYNAME
;-----------------------------------------------------------------------;
; COPYSTRING ;
; Internal subroutine for the NetWare L.E.M. ;
; Copies a string and clips trailing spaces from the destination ;
; ;
; Expects: ;
; CX = length of source ;
; DS:SI = address of source ;
; ES:DI = address of destination ;
; ;
; Returns: ;
; CX = the length of the resultant destination after clipping ;
;-----------------------------------------------------------------------;
COPYSTRING PROC NEAR
PUSH CX ;Save length
PUSH SI ;Save source offset
PUSH DI ;Save dest offset
CLD ;Forward
REP MOVSB ;Move it
MOV BYTE PTR ES:[DI],0 ;Add null at end
POP DI ;Restore dest offset
POP SI ;Restore source offset
POP CX ;Restore length
PUSH DI ;Save dest offset again
MOV AX,CX ;Set up count register
DEC AX ;Make relative to zero
ADD DI,AX ;Point to end
MOV AL,20h ;Look for spaces
STD ;Backwards direction
REPZ SCASB ;Scan while equal to spaces
JNZ NOT_A_SPACE
MOV BYTE PTR ES:1[DI],0 ;String all spaces;put null at begin
JMP SHORT EXIT_COPYSTRING
NOT_A_SPACE:
INC CX ;Fix CX which is 1 too small
MOV BYTE PTR ES:2[DI],0 ;Null terminate after non-space
EXIT_COPYSTRING:
CLD ;Back to forward
CLC ;No error
POP DI ;Restore dest offset
RET ;Return to caller in L.E.M.
COPYSTRING ENDP ;End of COPYSTRING
;-----------------------------------------------------------------------;
; SETGLOBERR ;
; Internal subroutine for the NetWare L.E.M. ;
; Set global error returned by ERROR() and ERRORCODE() ;
; ;
; AX = error code ;
;-----------------------------------------------------------------------;
SETGLOBERR PROC NEAR
PUSH ES ;Save used registers
PUSH DI
PUSH AX ;Save error code
MOV AH,0FFh ;Get address of GLOBERR
MOV AL,29
CALL DWORD PTR LIBVEC
POP AX ;Get error code
MOV ES:[DI],AX ;Set GLOBERR
POP DI ;Restore used registers
POP ES
RET ;Return to caller in L.E.M.
SETGLOBERR ENDP ;End of SETGLOBERR
;-----------------------------------------------------------------------;
; End of L.E.M. ;
;-----------------------------------------------------------------------;
BINEND DB 0 ;Used to provide size of L.E.M.
CODE ENDS ;End of the code segment
END ;End of the NetWare L.E.M.