1 ; MMURTL Operating System Source Code
\r
2 ; Copyright 1991,1992,1993,1994 Richard A. Burgess
\r
3 ; ALL RIGHTS RESERVED Version 1.0
\r
4 ;=============================================================================
\r
5 ;Data and equates for Request Block management
\r
11 ;Request Block control variables
\r
13 pFreeRQB DD 0 ; Ptr to free Request Blocks
\r
14 PUBLIC pRQBs DD 0 ; RQBs are in allocated memory
\r
16 PUBLIC _nRQBLeft DD nRQBs ; For Monitor stats
\r
19 ;=============== End Data, Begin Code =====================
\r
23 ;================================================================
\r
26 ; INPUT : EAX - Address of RQBs to be initialized
\r
27 ; ECX - Count of JCBs
\r
28 ; EDX - Size of JCBs
\r
30 ; USED: EAX,ECX,EDX,ESI EFLAGS
\r
31 ; MODIFIES: pFreeRQB, pRQBs
\r
33 ; This routine will initialize a free pool of Request Blocks (RQBs).
\r
34 ; ECX is count of RQBs to initialize,
\r
35 ; EDX is the size (in bytes), and EAX points to a list of free JCBs (pFreeJCB).
\r
37 ; The pFreeRQB pointer is set to address the first element in rgRQBs.
\r
38 ; Each element of rgRQBs is set to point to the next element of rgRQBs.
\r
39 ; The last element of rgRQBs is set to point to nothing (NIL).
\r
40 ; The RqBlk handle used in many calls is its position in the array.
\r
41 ; This can be done because the array of RQBs is allocated dynamically.
\r
43 MOV pFreeRQB,EAX ;Set up OS pointer to list
\r
44 MOV pRQBs, EAX ;Set up global ptr to first RQB
\r
46 MOV ESI,EAX ;EBX has pointer to current one
\r
47 ADD EAX,EDX ;EAX points to next one
\r
48 MOV [ESI+pNextRQB],EAX ;Make current point to next
\r
49 LOOP RQB_Loop ;Go back till done
\r
50 MOV DWORD PTR [ESI+pNextRQB],0 ;Make last one nil
\r
53 ;---------------------------------------------------------------
\r
54 ; Allocate 2 pages (8192 bytes) for 128 Request Blocks (structures).
\r
55 ; Then call InitFreeRQB
\r
57 PUBLIC InitDynamicRQBs:
\r
59 PUSH 2 ; 2 pages for 128 RQBs
\r
60 MOV EAX, OFFSET pRQBs ; Returns ptr to allocated mem in pRQBs
\r
62 CALL FWORD PTR _AllocOSPage ; Get 'em!
\r
64 XOR EAX, EAX ; Clear allocated memory for RQBs
\r
65 MOV ECX, 2048 ; (8192)
\r
66 MOV EDI, pRQBs ; where to store 0s
\r
69 MOV EAX, pRQBs ; Ptr to RQBs
\r
70 MOV ECX, nRQBs ; Count of Request Blocks
\r
71 MOV EDX, sRQB ; EDX is size of a RQB
\r
72 CALL InitFreeRQB ; Init the array of RQBs
\r
75 ;---------------------------------
\r
79 ; REGISTERS : EAX,EBX,FLAGS
\r
80 ; MODIFIES : pFreeRQB
\r
82 ; This routine returns to the caller a pointer to the next free RQB.
\r
83 ; The data used in this algorithm is the free jcb pointer (pFreeRQB).
\r
84 ; This routine will return in EAX register the address of the next free jcb.
\r
85 ; If none exists, then EAX will contain NIL (0). This routine will also
\r
86 ; update the value of pFreeRQB to point to the next "unused" RQB in
\r
89 MOV EAX,pFreeRQB ;Get OS pointer to RQBs
\r
90 CMP EAX, 0 ;IF pFreeRQB=NIL THEN Return;
\r
92 MOV EBX,[EAX+pNextRQB] ;Get pointer to next free one
\r
93 MOV pFreeRQB,EBX ;Put it in OS pointer
\r
98 ;=============================================================================
\r
103 ; REGISTERS : EAX, EBX, FLAGS
\r
104 ; MODIFIES : pFreeRQB
\r
106 ; This routine will place the RQB pointed to by EAX back into the free
\r
107 ; pool of RQBs pointed to by (pFreeRQB) if EAX is not NIL.
\r
109 CMP EAX, 0 ; If pJQBin = NIL THEN Return;
\r
111 MOV EBX,pFreeRQB ;EBX has OS ptr to free list
\r
112 MOV [EAX+pNextRQB],EBX ;Move it into newly freed RQB
\r
113 MOV pFreeRQB,EAX ;Move ptr to newly frred RQB to OS
\r
114 INC DWORD PTR _nRQBLeft ;
\r
118 ;========================= End of Module =================================
\r