home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
lib4a86
/
lib
/
mqueue.lib
< prev
next >
Wrap
Text File
|
1992-02-02
|
4KB
|
228 lines
#IF !LIB4A86
#ELSE
#IF !INTERN_LIB4A86_S
INTERN_LIB4A86_S EQU 01
JMP START
#ENDIF
#ENDIF
MQUEUEHEADER STRUC
MQUEUELENGTH DW ?
MQUEUEFREE DW ?
MQUEUEIPTR DW ?
MQUEUEOPTR DW ?
MQUEUECOUNT DW ?
MQUEUESEM DB ?
MQUEUEDUMMY DB ?
MQUEUEUSERDATA1 DW ?
MQUEUEUSERDATA2 DW ?
ENDS
MQUEUEHEADERLENGTH EQU (TYPE MQUEUEHEADER)
FIRSTMQUEUEENTRY EQU TYPE ( MQUEUEHEADER)
MINMQUEUE EQU 256XD
SETMQUEUESEMAPHOR EQU 0FFH
FREEMQUEUESEMAPHOR EQU 000H
MQUEUEISEMPTY EQU 08201H
MQUEUEISFULL EQU 08202H
MQUEUELENGTHERROR EQU 08203H
MQUEUEBUFFERERROR EQU 08204H
MQUEUEMESSAGEERROR EQU 08205H
MQUEUEAKTIVERROR EQU 082FFH
MQUEUESEG DW 0
INTERN_CHECKMQUEUESEMAPHOR MACRO
MOV AX,MQUEUEAKTIVERROR
XCHG ES:MQUEUESEM,AL
CMP AL,FREEMQUEUESEMAPHOR
JE >M1
STC
RET
M1:
#EM
INTERN_FREEMQUEUESEMAPHOR MACRO
MOV ES:MQUEUESEM,FREEMQUEUESEMAPHOR
#EM
INITMQUEUE:
CMP CX,MINMQUEUE
JAE >L1
MOV AX,MQUEUELENGTHERROR
STC
RET
L1:
MOV CS:MQUEUESEG,ES
MOV ES:MQUEUESEM,SETMQUEUESEMAPHOR
MOV ES:MQUEUELENGTH,CX
INTERN_DELETEMQUEUE:
SUB CX,MQUEUEHEADERLENGTH
MOV ES:MQUEUEFREE,CX
MOV AX,FIRSTMQUEUEENTRY
MOV ES:MQUEUEIPTR,AX
MOV ES:MQUEUEOPTR,AX
XOR AX,AX
MOV ES:MQUEUECOUNT,AX
INTERN_FREEMQUEUESEMAPHOR
RET
DELETEMQUEUE_A:
MOV ES,CS:MQUEUESEG
DELETEMQUEUE:
INTERN_CHECKMQUEUESEMAPHOR
MOV CX,ES:MQUEUELENGTH
JMP SHORT INTERN_DELETEMQUEUE
LOCKMQUEUE_A:
MOV ES,CS:MQUEUESEG
LOCKMQUEUE:
INTERN_CHECKMQUEUESEMAPHOR
RET
UNLOCKMQUEUE_A:
MOV ES,CS:MQUEUESEG
UNLOCKMQUEUE:
INTERN_FREEMQUEUESEMAPHOR
RET
GETMQUEUESTATISTIK_A:
MOV ES,CS:MQUEUESEG
GETMQUEUESTATISTIK:
INTERN_CHECKMQUEUESEMAPHOR
MOV DX,ES:MQUEUELENGTH
SUB DX,MQUEUEHEADERLENGTH
MOV CX,ES:MQUEUEFREE
MOV AX,ES:MQUEUECOUNT
INTERN_FREEMQUEUESEMAPHOR
RET
WRITEMQUEUE_A:
MOV ES, CS:MQUEUESEG
WRITEMQUEUE:
CLD
INTERN_CHECKMQUEUESEMAPHOR
PUSH DI,SI,CX
MOV AX,MQUEUEMESSAGEERROR
OR CH,CH
JNZ >L8
INC CX
MOV AX,ES:MQUEUEFREE
CMP CX,AX
JBE >L1
DEC AX
POP CX
PUSH AX
MOV AX,MQUEUEISFULL
JMP >L8
L1:
SUB ES:MQUEUEFREE,CX
DEC CX
MOV AX,ES:MQUEUELENGTH
MOV DI,ES:MQUEUEIPTR
MOV ES:[DI],CL
INC DI
CMP DI,AX
IF A MOV DI,FIRSTMQUEUEENTRY
SUB AX,DI
CMP AX,CX
JAE >L1
SUB CX,AX
XCHG CX,AX
REP MOVSB
MOV CX,AX
MOV DI,FIRSTMQUEUEENTRY
L1:
REP MOVSB
CMP DI,ES:MQUEUELENGTH
IF A MOV DI,FIRSTMQUEUEENTRY
MOV ES:MQUEUEIPTR,DI
INC ES:MQUEUECOUNT
CLC
JMP >L9
L8:
STC
L9:
POP CX,SI,DI
INTERN_FREEMQUEUESEMAPHOR
RET
LOOKMQUEUE_A:
MOV ES,CS:MQUEUESEG
LOOKMQUEUE:
XOR CX,CX
JMP SHORT READMQUEUE
READMQUEUE_A:
MOV ES, CS:MQUEUESEG
READMQUEUE:
CLD
INTERN_CHECKMQUEUESEMAPHOR
PUSH ES,DS,DI,SI,DX
MOV DX,CX
XCHG ES,DS
MOV DI,MQUEUEOPTR
XCHG DI,SI
XOR CX,CX
MOV AX,MQUEUEISEMPTY
CMP MQUEUECOUNT,CX
JE >L8
L1:
MOV CL,[SI]
INC SI
CMP SI,MQUEUELENGTH
IF A MOV SI,FIRSTMQUEUEENTRY
OR DX,DX
JNZ >L1
JCXZ >L9
MOV AL,[SI]
JMP >L9
L1:
MOV AX,MQUEUEBUFFERERROR
CMP DX,CX
JB >L8
MOV DX,CX
MOV AX,MQUEUELENGTH
SUB AX,SI
CMP AX,CX
JAE >L1
SUB CX,AX
XCHG CX,AX
REP MOVSB
MOV CX,AX
MOV SI,FIRSTMQUEUEENTRY
L1:
REP MOVSB
CMP SI,MQUEUELENGTH
IF A MOV SI,FIRSTMQUEUEENTRY
MOV MQUEUEOPTR,SI
DEC MQUEUECOUNT
MOV CX,DX
INC DX,1
ADD MQUEUEFREE,DX
CLC
JMP >L9
L8:
STC
L9:
POP DX,SI,DI,DS,ES
INTERN_FREEMQUEUESEMAPHOR
RET
#IF !INTERN_CMARK0
INTERN_CMARK0 EQU 01H
INTERN_CMARK1:
PUSH BP
MOV BP,SP
MOV BX,06H
SUB CH,[BP+SI]
SUB AH,[BX+SI]
DEC SP
DEC CX
INC DX
XOR AL,041H
CMP B[02820H],DH
INC BX
SUB W[BX+SI],SP
INC DX
CS AND B[BP+DI+043H],DL
DEC AX
INC BP
DEC BP
DEC BP
INC BP
PUSH DX
AND B[BP+SI],CH
SUB CH,[BP+SI]
POP DX
MOV SP,BP
POP BP
RET
#ENDIF