home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
lib4a86
/
lib
/
queues.bib
< prev
next >
Wrap
Text File
|
1992-02-02
|
3KB
|
221 lines
#IF !LIB4A86
#ELSE
#IF !INTERN_LIB4A86_S
INTERN_LIB4A86_S EQU 01
JMP START
#ENDIF
#ENDIF
#IF !MAXQUEUEHANDLES
MAXQUEUEHANDLES EQU 10XD
#ENDIF
#IF (MAXQUEUEHANDLES EQ 0) OR (MAXQUEUEHANDLES GE 255)
*******
ERROR: MAXQUEUEHANDLES DARF NUR IM INTERVALL VON 1 BIS 255 LIEGEN!!!
*******
#ENDIF
QUEUEHANDLETABLE DW (MAXQUEUEHANDLES*2) DUP (0FFFFH)
MQUEUEROUTINETABLE DW OFFSET INITMQUEUE
DW OFFSET LOCKMQUEUE
DW OFFSET UNLOCKMQUEUE
DW OFFSET DELETEMQUEUE
DW OFFSET WRITEMQUEUE
DW OFFSET READMQUEUE
DW OFFSET GETMQUEUESTATISTIK
DW OFFSET LOOKMQUEUE
SQUEUEROUTINETABLE DW OFFSET INITSQUEUE
DW OFFSET LOCKSQUEUE
DW OFFSET UNLOCKSQUEUE
DW OFFSET DELETESQUEUE
DW OFFSET WRITESQUEUE
DW OFFSET READSQUEUE
DW OFFSET GETSQUEUESTATISTIK
DW OFFSET INTERN_QUEUESDUMMY
UNKNOWNQSUBFUNCTION EQU 8401H
INVALIDQUEUEHANDLE EQU 08402H
NOMOREQUEUEHANDLES EQU 08403H
GETMAXQUEUES:
PUSHF
PUSH DS,SI,BX
CLD
MOV DS,CS
MOV SI,OFFSET QUEUEHANDLETABLE
XOR DX,DX
XOR BX,BX
MOV CX,MAXQUEUEHANDLES
PUSH CX
L00:
LODSW
CMP AX,0FFFFH
LODSW
JE >L1
INC DX
CMP AX,OFFSET MQUEUEROUTINETABLE
IF E INC BL
CMP AX,OFFSET SQUEUEROUTINETABLE
IF E INC BH
L1:
LOOP L00
MOV AX,BX
MOV CX,DX
POP DX
POP BX,SI,DS
POPF
RET
B000 EQU W[BP+2]
C000 EQU W[BP+4]
A000 EQU W[BP-2]
OPENQUEUE:
PUSH DS,SI,CX,BX
PUSH BP
MOV BP,SP
PUSH AX
CLD
MOV DS,CS
MOV SI,OFFSET QUEUEHANDLETABLE
MOV CX,MAXQUEUEHANDLES
XOR BX,BX
L0:
LODSW
CMP AX,0FFFFH
JE >L1
LODSW
INC BX
LOOP L0
MOV AX,NOMOREQUEUEHANDLES
JMP >L8
L1:
DEC SI,2
MOV B000,BX
MOV CX,C000
MOV BX,CX
TEST BX,0FH
PUSHF
SHR BX,1
SHR BX,1
SHR BX,1
SHR BX,1
POPF
IF NZ INC BX
CALL GETMEMORYBLOCK
JC >L8
MOV W[SI],AX
MOV AX,A000
AND AL,01H
MOV AX,OFFSET SQUEUEROUTINETABLE
IF NZ MOV AX,OFFSET MQUEUEROUTINETABLE
MOV W[SI+2],AX
MOV AL,0
MOV BX,B000
CALL INTERN_CALLQUEUEROUTINE
JNC >L9
PUSH AX,ES
MOV ES,[SI]
CALL FREEMEMORYBLOCK
MOV W[SI],0FFFFH
POP ES,AX
L8:
STC
L9:
MOV SP,BP
POP BP
POP BX,CX,SI,DS
RET
CLOSEQUEUE:
MOV AL,1
CALL INTERN_CALLQUEUEROUTINE
JC RET
PUSH ES,BX
SHL BX,1
SHL BX,1
MOV AX,0FFFFH
XCHG AX,CS:QUEUEHANDLETABLE[BX]
MOV ES,AX
CALL FREEMEMORYBLOCK
POP BX,ES
RET
READQUEUE:
MOV AL,05
JMP SHORT INTERN_CALLQUEUEROUTINE
WRITEQUEUE:
MOV AL,04
JMP SHORT INTERN_CALLQUEUEROUTINE
LOCKQUEUE:
MOV AL,01
JMP SHORT INTERN_CALLQUEUEROUTINE
UNLOCKQUEUE:
MOV AL,02
JMP SHORT INTERN_CALLQUEUEROUTINE
DELETEQUEUE:
MOV AL,03
JMP SHORT INTERN_CALLQUEUEROUTINE
GETQUEUEDATA:
MOV AL,06
PUSH BX
SHL BX,1
SHL BX,1
MOV DI,CS:QUEUEHANDLETABLE[BX]
POP BX
JMP SHORT INTERN_CALLQUEUEROUTINE
LOOKQUEUE:
MOV AL,07
JMP SHORT INTERN_CALLQUEUEROUTINE
INTERN_CALLQUEUEROUTINE:
PUSH ES,BX
CMP BX,MAXQUEUEHANDLES
JBE >L1
L2:
MOV AX,INVALIDQUEUEHANDLE
STC
JMP >L9
L1:
SHL BX,1
SHL BX,1
PUSH AX
MOV AX,CS:QUEUEHANDLETABLE[BX]
CMP AX,0FFFFH
MOV ES,AX
POP AX
JE L2
MOV BX,CS:QUEUEHANDLETABLE[BX+2]
XOR AH,AH
SHL AX,1
ADD BX,AX
CALL W CS:[BX]
L9:
POP BX,ES
RET
INTERN_QUEUESDUMMY:
MOV AX,UNKNOWNQSUBFUNCTION
STC
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