2 ;-----------------------------------------------------------------------;
3 ; GET_PARMS extracts parameters from the command line buffer ;
5 ; On entry: all letters after 'Device=' have been changed ;
8 ; On exit: (zf)=0 if syntax error ;
11 ; EMM_START_BLOCK has been updated ;
13 ; AX,BX,CX,DX,DI,SI,DS are destroyed ;
14 ;-----------------------------------------------------------------------;
16 include xma2emsp.inc ; include parser things
20 LDS BX,CS:RH_PTRA ;make ds:bx point to request header
22 LDS SI,RH.RH0_BPBA ;make ds:si point to bios paramter buffer
24 mov cs:EMS_Pgs_Parm,E_Parm_Def ;default to all of memory ;an000; dms;
26 ;-------------------------------------------------------------------
27 ; parser support added by GGA
28 ;-------------------------------------------------------------------
29 push cs ; make ES:DI point to parm block
33 xor cx,cx ; cx = 0, ordinal
34 xor dx,dx ; dx = 0, reserved
40 call SysParse ; call the parser
41 cmp ax,0 ; end of line?
42 je check_frame ; no, find out what we got this time
43 cmp ax,-1 ; end of parse?
44 je end_of_input_line1 ; yes
45 cmp ax,-1 ; flag an error
46 ret ; return to caller
50 jmp end_of_input_line ;
52 ; find out which arg was processed this time
56 ; make ds point to data area for these comparisons, must restore before
57 ; calling parser again
60 push es ; make ds point to save areas
63 cmp frame_result.$P_Type,2 ; was there a FRAME= in this pass?
64 jne check_p0 ; no, look for a P0
66 mov parse_flag,1 ; set parse flag
68 mov byte ptr frame_ctl+9,0 ; turn this off so we don't allow another
69 mov frame_result.$P_Type,0 ; clear this so we don't get fooled later
71 mov byte ptr p0_ctl+9,0 ; turn these off so we don't allow any
72 mov byte ptr p1_ctl+9,0 ; others that would conflict
73 mov byte ptr p2_ctl+9,0
74 mov byte ptr p3_ctl+9,0
78 mov si,word ptr frame_result.$P_Picked_Val[+0]
80 mov word ptr ds:[si+0],0 ;clear the
81 mov word ptr ds:[si+4],0 ; pages
82 mov word ptr ds:[si+8],0
83 mov word ptr ds:[si+12],0
88 ; set flags for later code to fill in map_table
90 or page_flags,frame_flag ; set frame flag
92 jmp get_args ; go get another argument
95 cmp p0_result.$P_Type,2 ; was there a P0= in this pass?
96 jne check_p1 ; no, look for a P0
98 mov parse_flag,1 ; set parse flag
100 mov byte ptr p0_ctl+9,0 ; turn this off so we don't allow another
101 mov p0_result.$P_Type,0 ; clear this so we don't get fooled later
103 mov byte ptr frame_ctl+9,0 ; turn this off so we don't allow another
107 mov si,word ptr p0_result.$P_Picked_Val[+0]
109 mov word ptr ds:[si+0],0
112 ; set flags for later code to fill in map_table
114 or page_flags,p0_flag ; set p0 flag
116 jmp get_args ; go get another argument
119 cmp p1_result.$P_Type,2 ; was there a p1= in this pass?
120 jne check_p2 ; no, look for a P2
122 mov parse_flag,1 ; set parse flag
124 mov byte ptr p1_ctl+9,0 ; turn this off so we don't allow another
125 mov p1_result.$P_Type,0 ; clear this so we don't get fooled later
127 mov byte ptr frame_ctl+9,0 ; turn this off so we don't allow another
131 mov si,word ptr p1_result.$P_Picked_Val[+0]
133 mov word ptr ds:[si+0],0
136 ; set flags for later code to fill in map_table
138 or page_flags,p1_flag ; set p1 flag
140 jmp get_args ; go get another argument
143 cmp p2_result.$P_Type,2 ; was there a p2= in this pass?
144 jne check_p3 ; no, look for a p3
146 mov parse_flag,1 ; set parse flag
148 mov byte ptr p2_ctl+9,0 ; turn this off so we don't allow another
149 mov p2_result.$P_Type,0 ; clear this so we don't get fooled later
151 mov byte ptr frame_ctl+9,0 ; turn this off so we don't allow another
155 mov si,word ptr p2_result.$P_Picked_Val[+0]
157 mov word ptr ds:[si+0],0
160 ; set flags for later code to fill in map_table
162 or page_flags,p2_flag ; set p2 flag
164 jmp get_args ; go get another argument
167 cmp p3_result.$P_Type,2 ; was there a p3= in this pass?
168 jne check_p254 ; no, look for a P254
170 mov parse_flag,1 ; set parse flag
172 mov byte ptr p3_ctl+9,0 ; turn this off so we don't allow another
173 mov p3_result.$P_Type,0 ; clear this so we don't get fooled later
175 mov byte ptr frame_ctl+9,0 ; turn this off so we don't allow another
179 mov si,word ptr p3_result.$P_Picked_Val[+0]
181 mov word ptr ds:[si+0],0
184 ; set flags for later code to fill in map_table
186 or page_flags,p3_flag ; set p3 flag
188 jmp get_args ; go get another argument
191 cmp p254_result.$P_Type,2 ; was there a p254= in this pass?
192 jne check_p255 ; no, look for a P255
194 mov parse_flag,1 ; set parse flag
196 mov byte ptr p254_ctl+9,0 ; turn this off so we don't allow another
197 mov p254_result.$P_Type,0 ; clear this so we don't get fooled later
201 mov si,word ptr p254_result.$P_Picked_Val[+0]
203 mov word ptr ds:[si+0],0
206 ; set flags for later code to fill in map_table
208 or page_flags,p254_flag ; set p254 flag
210 jmp get_args ; go get another argument
213 cmp p255_result.$P_Type,2 ; was there a P255= in this pass?
214 je do_p255 ; yes, process it
215 jmp Check_X ; no, find out if /X was included
218 mov parse_flag,1 ; set parse flag
220 mov byte ptr p255_ctl+9,0 ; turn this off so we don't allow another
221 mov p255_result.$P_Type,0 ; clear this so we don't get fooled later
225 mov si,word ptr p255_result.$P_Picked_Val[+0]
227 mov word ptr ds:[si+0],0
230 ; set flags for later code to fill in map_table
232 or page_flags,p255_flag ; set p255 flag
234 jmp get_args ; go get another argument
237 cmp es:X_Result.$P_SYNONYM_Ptr,offset es:X_Switch.$P_KeyorSW ; switch Ptr ;an000; dms;
238 je Do_X ; yes, process it
239 jmp get_args ; no, must have been the positional, ignore it and go on
244 mov ax,es:word ptr X_Result.$P_Picked_Val ;get low word of result ;an000; dms;
245 mov cs:EMS_Pgs_Parm,ax ; pass to program ;an000; dms;
246 pop ax ; restore regs
248 jmp get_args ; go get another argument
253 ; getting here means invalid argument, figure out what to do later
257 cmp parse_flag,null ; were there command line args?
258 jne cmd_line_args ; yes, process them
259 jmp null_cmd_line ; no, skip processing
263 ; put the stuff into map_table, this is done by looking at flags set
264 ; by the above code and putting the addresses into map_table
266 push ax ; save some regs
272 xor di,di ; clear index pointer
274 mov map_count,null ; clear map count default
276 test page_flags,frame_flag ; was FRAME= included?
277 jz chk_p0 ; no, try p0
279 ; yes, fix up page count and fill in map_table
281 mov map_count,4 ; FRAME= takes up 4 map entries
283 ; convert the item tag into a segment address
286 mov al,frame_result.$P_Item_Tag ; get item tag
287 mov cx,8 ; need to shift left eight bits
288 shl ax,cl ; to convert to a segment address
290 ; do some math with di
292 xor di,di ; clear index pointer
294 ; save the segment addresses in map_table
296 mov map_table.phys_page_segment[di],ax ; store p0 segment
297 mov map_table.phys_page_number[di],0 ; p0 page number
298 mov cs:Page_Frame_Sta,ax ;save our page for XMA1 ;an000; dms;
301 add ax,400h ; increase segment ID by 16K
302 add di,type mappable_phys_page_struct
304 mov map_table.phys_page_segment[di],ax ; store p1 segment
305 mov map_table.phys_page_number[di],1 ; p1 page number
307 add ax,400h ; increase segment ID by 16K
308 add di,type mappable_phys_page_struct
310 mov map_table.phys_page_segment[di],ax ; store p2 segment
311 mov map_table.phys_page_number[di],2 ; p2 page number
313 add ax,400h ; increase segment ID by 16K
314 add di,type mappable_phys_page_struct
316 mov map_table.phys_page_segment[di],ax ; store p3 segment
317 mov map_table.phys_page_number[di],3 ; p3 page number
319 ; do some math with di, this will be used as a pointer into map_table
321 add di,type mappable_phys_page_struct
323 jmp chk_p254 ; FRAME= implies that p0 - p3 were not present,
324 ; skip ahead and look for p254 and p255
330 test page_flags,p0_flag ; was p0= included?
331 jz chk_p1 ; no, try p1
333 ; yes, fix up page count and fill in map_table
335 add map_count,1 ; one extra map entry
337 ; convert the item tag into a segment address
340 mov al,p0_result.$P_Item_Tag; get item tag
341 mov cx,8 ; need to shift left eight bits
342 shl ax,cl ; to convert to a segment address
345 ; save the segment addresses in map_table
347 mov map_table.phys_page_segment[di],ax ; store p0 segment
348 mov map_table.phys_page_number[di],0 ; p0 page number
349 mov cs:Page_Frame_Sta,ax ;save our page for XMA1 ;an000; dms;
352 ; do some math with di, this will be used as a pointer into map_table
354 add di,type mappable_phys_page_struct
356 ;------------------------
358 ;------------------------
362 test page_flags,p1_flag ; was p1= included?
363 jz chk_p2 ; no, try p2
365 ; yes, fix up page count and fill in map_table
367 add map_count,1 ; one extra map entry
369 ; convert the item tag into a segment address
372 mov al,p1_result.$P_Item_Tag; get item tag
373 mov cx,8 ; need to shift left eight bits
374 shl ax,cl ; to convert to a segment address
377 ; save the segment addresses in map_table
379 mov map_table.phys_page_segment[di],ax ; store p1 segment
380 mov map_table.phys_page_number[di],1 ; p0 page number
381 mov cs:Page_Frame_Sta,ax ;save our page for XMA1 ;an000; dms;
384 ; do some math with di, this will be used as a pointer into map_table
386 add di,type mappable_phys_page_struct
388 ;------------------------
390 ;------------------------
394 test page_flags,p2_flag ; was p2= included?
395 jz chk_p3 ; no, try p3
397 ; yes, fix up page count and fill in map_table
399 add map_count,1 ; one extra map entry
401 ; convert the item tag into a segment address
404 mov al,p2_result.$P_Item_Tag; get item tag
405 mov cx,8 ; need to shift left eight bits
406 shl ax,cl ; to convert to a segment address
409 ; save the segment addresses in map_table
411 mov map_table.phys_page_segment[di],ax ; store p2 segment
412 mov map_table.phys_page_number[di],2 ; p2 page number
413 mov cs:Page_Frame_Sta,ax ;save our page for XMA1 ;an000; dms;
416 ; do some math with di, this will be used as a pointer into map_table
418 add di,type mappable_phys_page_struct
420 ;------------------------
422 ;------------------------
426 test page_flags,p3_flag ; was p3= included?
427 jz chk_p254 ; no, try p254
429 ; yes, fix up page count and fill in map_table
431 add map_count,1 ; one extra map entry
433 ; convert the item tag into a segment address
436 mov al,p3_result.$P_Item_Tag; get item tag
437 mov cx,8 ; need to shift left eight bits
438 shl ax,cl ; to convert to a segment address
441 ; save the segment addresses in map_table
443 mov map_table.phys_page_segment[di],ax ; store p3 segment
444 mov map_table.phys_page_number[di],3 ; p3 page number
445 mov cs:Page_Frame_Sta,ax ;save our page for XMA1 ;an000; dms;
448 ; do some math with di, this will be used as a pointer into map_table
450 add di,type mappable_phys_page_struct
452 ;------------------------
454 ;------------------------
458 test page_flags,p254_flag ; was p254= included?
459 jz chk_p255 ; no, try p255
461 ; yes, fix up page count and fill in map_table
463 add map_count,1 ; one extra map entry
465 ; convert the item tag into a segment address
468 mov al,p254_result.$P_Item_Tag; get item tag
469 mov cx,8 ; need to shift left eight bits
470 shl ax,cl ; to convert to a segment address
473 ; save the segment addresses in map_table
475 mov map_table.phys_page_segment[di],ax ; store p254 segment
476 mov map_table.phys_page_number[di],0feh ; p254 page number
477 mov cs:Page_Frame_Sta,ax ;save our page for XMA1 ;an000; dms;
480 ; do some math with di, this will be used as a pointer into map_table
482 add di,type mappable_phys_page_struct
484 ;------------------------
486 ;------------------------
490 test page_flags,p255_flag ; was p255= included?
491 jz Chk_X ; no, /X switch
493 ; yes, fix up page count and fill in map_table
495 add map_count,1 ; one extra map entry
497 ; convert the item tag into a segment address
500 mov al,p255_result.$P_Item_Tag; get item tag
501 mov cx,8 ; need to shift left eight bits
502 shl ax,cl ; to convert to a segment address
505 ; save the segment addresses in map_table
507 mov map_table.phys_page_segment[di],ax ; store p255 segment
508 mov map_table.phys_page_number[di],0ffh ; p255 page number
509 mov cs:Page_Frame_Sta,ax ;save our page for XMA1 ;an000; dms;
512 ; do some math with di, this will be used as a pointer into map_table
514 add di,type mappable_phys_page_struct
518 pop di ; restore some regs
526 CMP AL,AL ; else set zf to indicate no error
527 ret ; return to calling routine