1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ; DUMMY DATA SEGMENT THAT WILL LINK WITH THE DATA.MAC
4 ; FILE. THIS RESOLVES ANY REFERENCES TO THE DATA SEGMENT.
6 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 DATA SEGMENT BYTE PUBLIC 'DATA' ;AN000;
8 HELPBUFSEG
DW 0 ;AN000;
9 MEM_ALLOC
DB 0 ;AN000;DT Memory allocated indicator
10 HELP_ALLOC EQU 80H
;AN000;DT Help memory allocated
11 BLOCK_ALLOC EQU 40H
;AN000;DT PANEL memory allocated
12 LVB_ALLOC EQU 20H
;AN000;DT LVB memory allocated
13 BLOCK_SET EQU
01H ;AN000;DT SETBLOCK done
15 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17 ; Define dummy segment to calculate end of program
19 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
20 ZSEG
SEGMENT PARA
PUBLIC 'ZSEG' ;AN000;marks end of routine
21 ZSEG ENDS
;AN000;ZSEG will alphabetically appear
22 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29 ; This routine will free up the required memory from DOS to make
30 ; space for the panels, scroll, help, and input field data.
33 ; INPUT: BX = # paragraphs to keep (in the program) ZSEG-PSP_SEG
34 ; CX = Length of program in bytes
35 ; DX = # paragraphs to allocate
38 ; OUTPUT: DS:DX = segment:offset of allocated buffer
39 ; BX = length of allocated buffer
41 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
42 EXTRN WR_MAXMEMPAR
:WORD ;AN000;
43 EXTRN WR_MAXHELPSZ
:WORD ;AN000;
44 EXTRN WR_DATA2SEG
:WORD ;AN000;
45 EXTRN WR_DATA2OFF
:WORD ;AN000;
46 EXTRN WR_DATA2LEN
:WORD ;AN000;
47 EXTRN WR_LVBSEG
:WORD ;AN000;DT
48 EXTRN WR_LVBOFF
:WORD ;AN000;DT
49 EXTRN WR_LVBLEN
:WORD ;AN000;DT
50 EXTRN WR_LVBMEM
:WORD ;AN000;DT
51 EXTRN HRD_BUFSEG
:WORD ;AN000;
52 EXTRN HRD_BUFOFF
:WORD ;AN000;
53 EXTRN HRD_BUFLEN
:WORD ;AN000;
55 SERVICE
SEGMENT PARA
PUBLIC 'SERVICE' ;AN000;segment for far routine
56 ASSUME
CS:SERVICE
,DS:DATA ;AN000;
58 PUBLIC ALLOCATE_MEMORY_CALL
;AN000;
59 PUBLIC DEALLOCATE_MEMORY_CALL
;AN000;
60 PUBLIC ALLOCATE_HELP
;AN000;
61 PUBLIC DEALLOCATE_HELP
;AN000;
62 PUBLIC ALLOCATE_BLOCK
;AN000;
63 PUBLIC DEALLOCATE_BLOCK
;AN000;
64 PUBLIC ALLOCATE_LVB
;AN000;
65 PUBLIC DEALLOCATE_LVB
;AN000;
67 SET_BLOCK equ 4
AH ;AN000;
68 ALLOCATEB equ 48H
;AN000;
69 FREE_BLOCK equ 49H
;AN000;
71 INCLUDE STRUC.INC ;AN000;
72 INCLUDE MACROS
.INC ;AN000;
73 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DS and AX will auto pop on ret
75 ; ALLOCATE_MEMORY_CALL
77 ; This first takes the memory held by the active program
78 ; (initially all of remaining memory) and requests only the
79 ; memory held by the running program. Next, memory is
80 ; re-allocated to the running program - specified by WR_MAXMEMPAR
81 ; starting from the end of the program (re/ZSEG).
84 ; AX = CODE segment (PSP+100H)
89 ; WR_DATA2SEG = start of allocated segment
90 ; WR_DATA2OFF = start of allocated offset (always 0)
91 ; WR_DATA2LEN = length of allocated block (always WR_MAXMEMPAR)
93 ; if CY = 1 then an error occurred allocating memory
95 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96 ALLOCATE_MEMORY_CALL PROC
FAR ;AN000;
97 PUSHH
<AX,BX,DX,DS,ES> ;AN000;
99 TEST MEM_ALLOC
,BLOCK_SET
;AN000;DT SETBLOCK done?
100 JNZ AM_SBDONE
;AN000;DT if so, skip it
102 MOV AH,62H
;AN000; Get the PSP segment
104 MOV AX,BX ;AN000;save the PSP segment of SELECT
105 MOV BX,ZSEG
;AN000;get last address of code (from ZSEG)
106 MOV ES,AX ;AN000;set PSP segment in ES
107 SUB BX,AX ;AN000;calc # of paragraphs in the program
108 MOV AH,SET_BLOCK
;AN000;setblock function number
109 DOSCALL
;AN000;free used memory
111 GOTO ALLOC_RET
;AN000;DT If error, exit
113 OR MEM_ALLOC
,BLOCK_SET
;AN000;DT
116 MOV AX,DATA ;AN000;initialize data segment
117 MOV DS,AX ;AN000; and extra segment
119 PUSH CS ;AN000;call far procedure
120 CALL ALLOCATE_BLOCK_NEAR
;AN000;now allocate Panel block
122 GOTO ALLOC_RET
;AN000;DT If error, exit
125 PUSH CS ;AN000;call far procedure
126 CALL ALLOCATE_LVB_NEAR
;AN000;now allocate LVB block
128 GOTO ALLOC_RET
;AN000;DT If error, exit
131 PUSH CS ;AN000;call far procedure
132 CALL ALLOCATE_HELP_NEAR
;AN000;now allocate help
135 POPP
<ES,DS,DX,BX,AX> ;AN000;
137 ALLOCATE_MEMORY_CALL ENDP
;AN000;
138 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
140 ; DEALLOCATE_MEMORY_CALL
142 ; This is the house-cleaning before the running program
150 ; The memory after (WR_DATA2SEG) is released to DOS
152 ; An error occurred while trying to release this memory
154 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
155 DEALLOCATE_MEMORY_CALL PROC
FAR;AN000;
156 PUSHH
<AX,DS,ES> ;AN000;
159 PUSH CS ;AN000;call far procedure
160 CALL DEALLOCATE_BLOCK_NEAR
;AN024;now deallocate Panel block
161 PUSH CS ;AN000;call far procedure
162 CALL DEALLOCATE_LVB_NEAR
;AN024; deallocate LVB block
163 PUSH CS ;AN000;call far procedure
164 CALL DEALLOCATE_HELP_NEAR
;AN000;now deallocate help
165 POPP
<ES,DS,AX> ;AN000;
167 DEALLOCATE_MEMORY_CALL ENDP
;AN000;
168 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DS and AX will auto pop on ret
174 ; AX = CODE segment (PSP+100H)
179 ; if CY = 1 then an error occurred allocating memory
181 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
182 ALLOCATE_HELP PROC
FAR ;AN000;
183 ALLOCATE_HELP_NEAR: ;AN000;
184 PUSHH
<AX,BX,DX,DS,ES> ;AN000;
188 TEST MEM_ALLOC
,HELP_ALLOC
;AN000;DT Is help allocated
189 JNZ AH_RET
;AN000;DT if so, skip allocation
191 MOV BX,WR_MAXHELPSZ
;AN000;set BX to max # of paragraphs
196 MOV AH,ALLOCATEB
;AN000;set allocate function number
197 DOSCALL
;AN000;allocate memory
199 MOV HRD_BUFSEG
,AX ;AN000;save segment
200 MOV HELPBUFSEG
,AX ;AN000;save segment
201 MOV HRD_BUFOFF
,0 ;AN000; and offset
202 MOV BX,WR_MAXHELPSZ
;AN000;set BX to max # of byte
203 MOV HRD_BUFLEN
,BX ;AN000;
204 OR MEM_ALLOC
,HELP_ALLOC
;AN000;DT
208 POPP
<ES,DS,DX,BX,AX> ;AN000;
210 ALLOCATE_HELP ENDP
;AN000;
211 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
215 ; This is the house-cleaning before the running program
224 ; An error occurred while trying to release this memory
226 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
227 DEALLOCATE_HELP PROC
FAR ;AN000;
228 DEALLOCATE_HELP_NEAR: ;AN000;
229 PUSHH
<AX,BX,DS,ES> ;AN000;
232 TEST MEM_ALLOC
,HELP_ALLOC
;AN000;DT Is help allocated
233 JZ DH_RET
;AN000;DT if not, skip deallocation
234 MOV AX,HELPBUFSEG
;AN000;free help segment
236 MOV AH,FREE_BLOCK
;AN000;
238 AND MEM_ALLOC
,255-HELP_ALLOC
;AN000;DT
240 POPP
<ES,DS,BX,AX> ;AN000;
242 DEALLOCATE_HELP ENDP
;AN000;
243 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
244 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DS and AX will auto pop on ret
248 ; Allocate Panel and Scroll memory.
254 ; WR_DATA2SEG = start of allocated segment
255 ; WR_DATA2OFF = start of allocated offset (always 0)
256 ; WR_DATA2LEN = length of allocated block (always WR_MAXMEMPAR)
258 ; if CY = 1 then an error occurred allocating memory
260 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
261 ALLOCATE_BLOCK PROC
FAR ;AN000;
262 ALLOCATE_BLOCK_NEAR: ;AN000;
263 PUSHH
<AX,BX,DX,DS,ES> ;AN000;
264 MOV AX,DATA ;AN000;initialize data segment
265 MOV DS,AX ;AN000; and extra segment
267 TEST MEM_ALLOC
,BLOCK_ALLOC
;AN000;DT Is PANEL block allocated
268 JNZ AB_RET
;AN000;DT if so, skip allocation
270 MOV BX,WR_MAXMEMPAR
;AN000;set DX to max # of 16 byte parag's
271 MOV AH,ALLOCATEB
;AN000;set allocate function number
272 DOSCALL
;AN000;allocate memory
274 MOV BX,WR_MAXMEMPAR
;AN000;
275 SHL BX,1 ;AN000;THIS SHOULD BE REMOVED WHEN
276 SHL BX,1 ;AN000;THE INITIALIZE ROUTINE TREATS
277 SHL BX,1 ;AN000;WR_DATA2LEN AS PARAGRAPHS AND
278 SHL BX,1 ;AN000;NOT BYTES......
279 MOV WR_DATA2SEG
,AX ;AN000;save segment
280 MOV WR_DATA2OFF
,0 ;AN000;
281 MOV WR_DATA2LEN
,BX ;AN000;
282 OR MEM_ALLOC
,BLOCK_ALLOC
;AN000;DT PANEL block allocated
285 POPP
<ES,DS,DX,BX,AX> ;AN000;
287 ALLOCATE_BLOCK ENDP
;AN000;
288 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
292 ; This is the house-cleaning before the running program
301 ; An error occurred while trying to release this memory
303 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
304 DEALLOCATE_BLOCK PROC
FAR ;AN000;
305 DEALLOCATE_BLOCK_NEAR: ;AN000;
306 PUSHH
<AX,BX,DS,ES> ;AN000;
309 TEST MEM_ALLOC
,BLOCK_ALLOC
;AN000;DT Is PANEL block allocated
310 JZ DB_RET
;AN000;DT if not, skip deallocation
311 MOV AX,WR_DATA2SEG
;AN000;free up allocated segment
313 MOV AH,FREE_BLOCK
;AN000;
315 AND MEM_ALLOC
,255-BLOCK_ALLOC
;AN000;DT
317 POPP
<ES,DS,BX,AX> ;AN000;
319 DEALLOCATE_BLOCK ENDP
;AN000;
320 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DS and AX will auto pop on ret
331 ; if CY = 1 then an error occurred allocating memory
333 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
334 ALLOCATE_LVB PROC
FAR ;AN000;
335 ALLOCATE_LVB_NEAR: ;AN000;
336 PUSHH
<AX,BX,DX,DS,ES> ;AN000;
341 TEST MEM_ALLOC
,LVB_ALLOC
;AN000;DT Is LVB block allocated
342 JNZ ALVB_RET
;AN000;DT if so, skip allocation
344 MOV BX,WR_LVBMEM
;AN000;set BX to max # of 16 byte parag's
345 MOV AH,ALLOCATEB
;AN000;set allocate function number
346 DOSCALL
;AN000;allocate memory
348 MOV WR_LVBSEG
,AX ;AN000;save segment
349 MOV WR_LVBOFF
,0 ;AN000;and offset
350 SHL BX,1 ;AN000;THIS SHOULD BE REMOVED WHEN
351 SHL BX,1 ;AN000;THE INITIALIZE ROUTINE TREATS
352 SHL BX,1 ;AN000;WR_DATA2LEN AS PARAGRAPHS AND
353 SHL BX,1 ;AN000;NOT BYTES......
354 MOV WR_LVBLEN
,BX ;AN000;and byte length
355 OR MEM_ALLOC
,LVB_ALLOC
;AN000;DT LVB block allocated
359 POPP
<ES,DS,DX,BX,AX> ;AN000;
361 ALLOCATE_LVB ENDP
;AN000;
362 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373 ; An error occurred while trying to release this memory
375 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
376 DEALLOCATE_LVB PROC
FAR ;AN000;
377 DEALLOCATE_LVB_NEAR: ;AN000;
378 PUSHH
<AX,BX,DS,ES> ;AN000;
381 TEST MEM_ALLOC
,LVB_ALLOC
;AN000;DT Is LVB block allocated
382 JZ DLVB_RET
;AN000;DT if not, skip deallocation
383 MOV AX,WR_LVBSEG
;AN000;free up LVB allocated segment
385 MOV AH,FREE_BLOCK
;AN000;
387 AND MEM_ALLOC
,255-LVB_ALLOC
;AN000;DT
389 POPP
<ES,DS,BX,AX> ;AN000;
391 DEALLOCATE_LVB ENDP
;AN000;