]> pd.if.org Git - mmurtl/blob - ossource/rqbcode.asm
autocommit for file dated 2003-12-29 17:36:54
[mmurtl] / ossource / rqbcode.asm
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
6 ;\r
7 .DATA\r
8 ;\r
9 .INCLUDE RQB.INC\r
10 \r
11 ;Request Block control variables\r
12 \r
13 pFreeRQB        DD 0                                    ; Ptr to free Request Blocks\r
14 PUBLIC pRQBs    DD 0                                    ; RQBs are in allocated memory\r
15 \r
16 PUBLIC  _nRQBLeft       DD nRQBs                ; For Monitor stats\r
17 \r
18 \r
19 ;=============== End Data, Begin Code =====================\r
20 \r
21 .CODE\r
22 \r
23 ;================================================================\r
24 \r
25 InitFreeRQB:\r
26 ; INPUT :       EAX - Address of RQBs to be initialized\r
27 ;                       ECX - Count of JCBs\r
28 ;                       EDX - Size of JCBs\r
29 ; OUTPUT :      NONE\r
30 ; USED:         EAX,ECX,EDX,ESI EFLAGS\r
31 ; MODIFIES: pFreeRQB, pRQBs\r
32 ;\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
36 ;\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
42 ;\r
43                 MOV pFreeRQB,EAX        ;Set up OS pointer to list\r
44                 MOV pRQBs, EAX                  ;Set up global ptr to first RQB\r
45 RQB_Loop:\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
51                 RETN                                    ;\r
52 \r
53 ;---------------------------------------------------------------\r
54 ; Allocate 2 pages (8192 bytes) for 128 Request Blocks (structures).\r
55 ; Then call InitFreeRQB\r
56 \r
57 PUBLIC InitDynamicRQBs:\r
58 \r
59                 PUSH 2                                          ; 2 pages for 128 RQBs\r
60                 MOV EAX, OFFSET pRQBs           ; Returns ptr to allocated mem in pRQBs\r
61                 PUSH EAX                                        ;\r
62                 CALL FWORD PTR _AllocOSPage     ; Get 'em!\r
63 \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
67                 REP STOSD                                       ; Do it\r
68 \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
73                 RETN\r
74 \r
75 ;---------------------------------\r
76 PUBLIC NewRQB:\r
77 ; INPUT : NONE\r
78 ; OUTPUT : EAX\r
79 ; REGISTERS : EAX,EBX,FLAGS\r
80 ; MODIFIES : pFreeRQB\r
81 ;\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
87 ; the free pool.\r
88 ;\r
89                 MOV EAX,pFreeRQB        ;Get OS pointer to RQBs\r
90                 CMP EAX, 0              ;IF pFreeRQB=NIL THEN Return;\r
91                 JE NewRQBDone           ;\r
92                 MOV EBX,[EAX+pNextRQB]  ;Get pointer to next free one\r
93                 MOV pFreeRQB,EBX        ;Put it in OS pointer\r
94                 DEC _nRQBLeft                   ;\r
95 NewRQBDone:\r
96             RETN                    ;\r
97 \r
98 ;=============================================================================\r
99 \r
100 PUBLIC DisposeRQB:\r
101 ; INPUT : EAX\r
102 ; OUTPUT : NONE\r
103 ; REGISTERS : EAX, EBX, FLAGS\r
104 ; MODIFIES : pFreeRQB\r
105 ;\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
108 ;\r
109                 CMP EAX, 0              ; If pJQBin = NIL THEN Return;\r
110                 JE DispRQBDone          ;\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
115 DispRQBDone:\r
116             RETN                    ;\r
117 \r
118 ;========================= End of Module =================================\r