You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
655 lines
14 KiB
655 lines
14 KiB
PAGE ,132
|
|
TITLE PARSE CODE AND CONTROL BLOCKS FOR KEYB.COM
|
|
|
|
;****************** START OF SPECIFICATIONS **************************
|
|
;
|
|
; MODULE NAME: PARSER.ASM
|
|
;
|
|
; DESCRIPTIVE NAME: PARSES THE COMMAND LINE PARAMETERS FOR KEYB.COM
|
|
;
|
|
; FUNCTION: THE COMMAND LINE IN THE PSP IS PARSED FOR PARAMETERS.
|
|
;
|
|
; ENTRY POINT: PARSE_PARAMETERS
|
|
;
|
|
; INPUT: BP POINTS TO PARAMETER LIST
|
|
; DS & ES POINT TO PSP
|
|
;
|
|
; AT EXIT:
|
|
; PARAMETER LIST FILLED IN AS REQUIRED.
|
|
;
|
|
; INTERNAL REFERENCES:
|
|
;
|
|
; ROUTINES: SYSPARSE - PARSING CODE
|
|
;
|
|
; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE
|
|
;
|
|
; EXTERNAL REFERENCES:
|
|
;
|
|
; ROUTINES: N/A
|
|
;
|
|
; DATA AREAS: PARAMETER LIST BLOCK TO BE FILLED.
|
|
;
|
|
; NOTES:
|
|
;
|
|
; REVISION HISTORY:
|
|
; A000 - DOS Version 3.40
|
|
; 3/24/88 AN003 - P3906 PARSER changes to return "bogus" parameter on the
|
|
; "Parameter value not allowed " message - CNS
|
|
; 5/12/88 AN004 - P4867 /ID:NON-Numeric hangs the sytem as a 1st positional
|
|
;
|
|
;
|
|
; (C) Copyright Microsoft Corp. 1987-1990
|
|
; MS-DOS 5.00 - NLS Support - KEYB Command
|
|
;
|
|
;
|
|
;****************** END OF SPECIFICATIONS ****************************
|
|
|
|
INCLUDE KEYBDCL.INC
|
|
|
|
ID_VALID EQU 0
|
|
ID_INVALID EQU 1
|
|
NO_ID EQU 2
|
|
|
|
LANGUAGE_VALID EQU 0
|
|
LANGUAGE_INVALID EQU 1
|
|
NO_LANGUAGE EQU 2
|
|
|
|
NO_IDLANG EQU 3
|
|
|
|
CODE_PAGE_VALID EQU 0
|
|
CODE_PAGE_INVALID EQU 1
|
|
NO_CODE_PAGE EQU 2
|
|
VALID_SYNTAX EQU 0
|
|
INVALID_SYNTAX EQU 1
|
|
|
|
COMMAND_LINE_START EQU 81H
|
|
RC_EOL EQU -1
|
|
RC_NO_ERROR EQU 0
|
|
RC_OP_MISSING EQU 2
|
|
RC_NOT_IN_SW EQU 3
|
|
|
|
;***CNS P4867 1st CHECK for /ID:ALPHA
|
|
|
|
RC_SW_FIRST EQU 9
|
|
|
|
;***CNS P4867 1st CHECK for /ID:ALPHA
|
|
|
|
ERROR_COND EQU -1
|
|
NUMBER EQU 1
|
|
STRING EQU 3
|
|
FILE_SPEC EQU 5
|
|
MAX_ID EQU 999
|
|
LANG_LENGTH EQU 2
|
|
|
|
INVALID_SWITCH EQU 3
|
|
TOO_MANY EQU 1
|
|
INVALID_PARAM EQU 10
|
|
VALUE_DISALLOW EQU 8
|
|
|
|
|
|
PUBLIC PARSE_PARAMETERS ; near procedure for parsing command line
|
|
PUBLIC CUR_PTR ; near procedure for parsing command line
|
|
PUBLIC OLD_PTR ; near procedure for parsing command line
|
|
PUBLIC ERR_PART ; near procedure for parsing command line
|
|
|
|
EXTRN BAD_ID:BYTE ; WGR to match old code
|
|
EXTRN FOURTH_PARM:BYTE ; WGR to match old code
|
|
EXTRN ONE_PARMID:BYTE ; WGR to match old code
|
|
EXTRN FTH_PARMID:BYTE ; WGR to match old code
|
|
EXTRN ALPHA:BYTE ; WGR to match old code
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
; Set assemble switches for parse code that is not required!!
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
DateSW EQU 0
|
|
TimeSW EQU 0
|
|
CmpxSW EQU 0
|
|
DrvSW EQU 0
|
|
QusSW EQU 0
|
|
KeySW EQU 0
|
|
Val1SW EQU 0
|
|
Val2SW EQU 0
|
|
Val3SW EQU 0
|
|
|
|
|
|
CODE SEGMENT PUBLIC 'CODE' BYTE
|
|
ASSUME CS:CODE,DS:CODE
|
|
|
|
.XLIST
|
|
INCLUDE PARSE.ASM ; Parsing code
|
|
.LIST
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; PARM control blocks for KEYB
|
|
; Parsing command line as follows:
|
|
;
|
|
; KEYB [lang],[cp],[[d:][path]KEYBOARD.SYS][/ID:id][/e][/?]
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
PARMS LABEL WORD
|
|
DW PARMSX
|
|
DB 0 ; no extra delimeters or EOLs.
|
|
|
|
PARMSX LABEL BYTE
|
|
DB 0,3 ; min,max positional operands
|
|
DW LANG ; pointer to control block
|
|
DW CP ; pointer to control block
|
|
DW FILE_NAME ; pointer to control block
|
|
DB 3 ; 3 switches
|
|
DW ID_VALUE ; pointer to control block
|
|
dw help_value ; pointer to control block
|
|
dw ext_value ; pointer to control block
|
|
DB 0 ; no keywords
|
|
|
|
LANG LABEL WORD
|
|
DW 0A001H ; sstring or numeric value (optional)
|
|
DW 0002H ; cap result by char table (sstring)
|
|
DW RESULT_BUF ; result
|
|
DW NOVALS ; no value checking done
|
|
DB 0 ; no keyword/switch synonyms
|
|
|
|
CP LABEL WORD
|
|
DW 8001H ; numeric
|
|
DW 0 ; no functions
|
|
DW RESULT_BUF ; result
|
|
DW NOVALS ; no value checking done
|
|
DB 0 ; no keyword/switch synonyms
|
|
|
|
FILE_NAME LABEL WORD
|
|
DW 0201H ; file spec
|
|
DW 0001H ; cap by file table
|
|
DW RESULT_BUF ; result
|
|
DW NOVALS ; no value checking done
|
|
DB 0 ; no keyword/switch synonyms
|
|
|
|
ID_VALUE LABEL WORD
|
|
DW 8010H ; numeric
|
|
DW 0 ; no functions
|
|
DW RESULT_BUF ; result
|
|
DW NOVALS ; no value checking done
|
|
DB 1 ; 1 switch synonym
|
|
id_name:
|
|
DB "/ID",0 ; ID switch
|
|
|
|
help_value label word
|
|
dw 0 ; no values
|
|
dw 0 ; no functions
|
|
dw RESULT_BUF ; result
|
|
dw novals ; no value checking done
|
|
db 1 ; 1 switch synonym
|
|
help_name:
|
|
db "/?",0 ; /? switch
|
|
|
|
ext_value label word
|
|
dw 0 ; no values
|
|
dw 0 ; no functions
|
|
dw result_buf ; result
|
|
dw novals ; no value checking done
|
|
db 1 ; 1 switch synonym
|
|
ext_name:
|
|
db "/E",0 ; /e switch
|
|
|
|
|
|
NOVALS LABEL BYTE
|
|
DB 0 ; no value checking done
|
|
|
|
RESULT_BUF LABEL BYTE
|
|
RESULT_TYPE DB 0 ; type returned (number, string, etc.)
|
|
DB ? ; matched item tag (if applicable)
|
|
RESULT_SYN_PTR DW ? ; synonym ptr (if applicable)
|
|
RESULT_VAL DD ? ; value
|
|
|
|
LOOP_COUNT DB 0 ; keeps track of parameter position
|
|
|
|
;***CNS
|
|
CUR_PTR DW 0 ; keeps track of parameter position
|
|
OLD_PTR DW 0 ; keeps track of parameter position
|
|
ERR_PART DW 0 ; keeps track of parameter position
|
|
;***CNS
|
|
;..and reports an error condition
|
|
|
|
public pswitches
|
|
pswitches db 0 ; bit 0, /?, bit 1 /e
|
|
|
|
TEMP_FILE_NAME DB 128 DUP(0) ; place for file name
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; PROCEDURE_NAME: PARSE_PARAMETERS
|
|
;
|
|
; FUNCTION:
|
|
; THIS PROCEDURE PARSES THE COMMAND LINE PARAMETERS IN THE PSP FOR
|
|
; KEYB.COM. THE PARAMETER LIST BLOCK IS FILLED IN ACCORDINGLY.
|
|
;
|
|
; AT ENTRY: AS ABOVE.
|
|
;
|
|
; AT EXIT:
|
|
; AS ABOVE.
|
|
;
|
|
; AUTHOR: WGR
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
PARSE_PARAMETERS PROC NEAR
|
|
|
|
XOR AX,AX ; setup default parameters.
|
|
MOV [BP].RET_CODE_1,NO_IDLANG
|
|
MOV [BP].RET_CODE_2,NO_CODE_PAGE
|
|
MOV [BP].RET_CODE_3,VALID_SYNTAX
|
|
MOV [BP].RET_CODE_4,NO_ID
|
|
MOV [BP].PATH_LENGTH,AX
|
|
LEA DI,PARMS ; setup parse blocks
|
|
MOV SI,COMMAND_LINE_START
|
|
|
|
call save_curptr
|
|
|
|
XOR CX,CX
|
|
XOR DX,DX
|
|
CALL SYSPARSE
|
|
|
|
kbs_10:
|
|
cmp ax,RC_EOL ; while not end of line and...
|
|
jnz kbs_11
|
|
jmp kbs_12
|
|
kbs_11:
|
|
cmp LOOP_COUNT,ERROR_COND ; parameters valid, do...
|
|
jnz kbs_13
|
|
jmp kbs_12
|
|
|
|
kbs_13:
|
|
cmp ax,RC_NOT_IN_SW ; invalid switch?
|
|
jz kbs_08
|
|
cmp ax,RC_SW_FIRST
|
|
jnz kbs_09
|
|
|
|
kbs_08:
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; set invalid syntax flag.
|
|
MOV LOOP_COUNT,ERROR_COND ; set error flag to exit parse.
|
|
|
|
;***CNS
|
|
MOV ERR_PART,INVALID_SWITCH
|
|
call save_curptr
|
|
;***CNS
|
|
|
|
jmp kbs_10
|
|
|
|
kbs_09:
|
|
|
|
cmp RESULT_SYN_PTR,offset id_name ; was /id:xxx switch found?
|
|
jnz not_id_switch
|
|
|
|
|
|
MOV AX,WORD PTR RESULT_VAL+2 ; is it valid?
|
|
OR AX,AX
|
|
jnz kbs_01
|
|
|
|
mov ax,word ptr RESULT_VAL
|
|
cmp ax,MAX_ID
|
|
jna kbs_02
|
|
|
|
kbs_01:
|
|
|
|
MOV [BP].RET_CODE_1,ID_INVALID ; no...invalid id.
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; syntax error.
|
|
MOV LOOP_COUNT,ERROR_COND ; set flag to exit parse
|
|
mov bad_id,1
|
|
|
|
MOV [ERR_PART],VALUE_DISALLOW ; SET ERROR TYPE FOR DISPLAY
|
|
call save_curptr
|
|
|
|
jmp short kbs_03
|
|
|
|
kbs_02:
|
|
MOV [BP].RET_CODE_4,ID_VALID ; yes...set return code 4.
|
|
MOV [BP].ID_PARM,AX
|
|
mov fourth_parm,1
|
|
mov fth_parmid,1
|
|
|
|
jmp short kbs_03
|
|
|
|
|
|
not_id_switch:
|
|
cmp RESULT_SYN_PTR,offset help_name ; was /? switch found?
|
|
jnz not_help_switch
|
|
|
|
or pswitches,1 ; set flag for /?
|
|
jmp short kbs_03
|
|
|
|
not_help_switch:
|
|
cmp RESULT_SYN_PTR,offset ext_name
|
|
jnz kbs_07
|
|
|
|
or pswitches,2 ; set flag for /e
|
|
jmp short kbs_03
|
|
|
|
|
|
kbs_07:
|
|
INC LOOP_COUNT ; positional encountered...
|
|
cmp LOOP_COUNT,1 ; check for language
|
|
jnz kbs_04
|
|
|
|
CALL PROCESS_1ST_PARM
|
|
|
|
call save_curptr
|
|
|
|
jmp short kbs_03
|
|
|
|
kbs_04:
|
|
cmp LOOP_COUNT,2 ; check for code page
|
|
jnz kbs_05
|
|
|
|
CALL PROCESS_2ND_PARM
|
|
|
|
call save_curptr
|
|
|
|
jmp short kbs_03
|
|
|
|
kbs_05:
|
|
cmp LOOP_COUNT,3 ; check for file name
|
|
jnz kbs_06
|
|
|
|
CALL PROCESS_3RD_PARM
|
|
|
|
call save_curptr
|
|
|
|
jmp short kbs_03
|
|
|
|
; all other cases
|
|
|
|
kbs_06:
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; too many parms
|
|
|
|
call save_curptr
|
|
|
|
MOV ERR_PART,TOO_MANY
|
|
MOV LOOP_COUNT,ERROR_COND ; set error flag to exit parse.
|
|
kbs_03:
|
|
MOV RESULT_TYPE,0 ; reset result block.
|
|
CALL SYSPARSE ; parse next parameter.
|
|
|
|
jmp kbs_10
|
|
|
|
kbs_12:
|
|
cmp [bp].RET_CODE_4,ID_VALID
|
|
jnz kbs_14 ; ensure that if switch was
|
|
cmp [bp].RET_CODE_1,LANGUAGE_VALID ; used, it was valid keyword
|
|
jz kbs_14
|
|
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; code was used..
|
|
|
|
;***CNS
|
|
call save_curptr
|
|
MOV ERR_PART,VALUE_DISALLOW
|
|
;***CNS
|
|
|
|
kbs_14:
|
|
RET
|
|
|
|
PARSE_PARAMETERS ENDP
|
|
|
|
save_curptr proc near
|
|
|
|
PUSH AX ;Save environment
|
|
MOV AX,CUR_PTR ;Set advancing ptr to end of argument
|
|
MOV OLD_PTR,AX ;after saving the beginning the string
|
|
MOV CUR_PTR,SI
|
|
POP AX ;Restore the environment
|
|
ret
|
|
|
|
save_curptr endp
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; PROCEDURE_NAME: PROCESS_1ST_PARM
|
|
;
|
|
; FUNCTION:
|
|
; THIS PROCEDURE PROCESSES THE FIRST POSITIONAL PARAMETER. THIS SHOULD
|
|
; BE THE LANGUAGE ID OR THE KEYBOARD ID.
|
|
;
|
|
; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
|
|
;
|
|
; AT EXIT:
|
|
; PARAMETER CONTROL BLOCK UPDATED FOR LANGUAGE ID.
|
|
;
|
|
; AUTHOR: WGR
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
PROCESS_1ST_PARM PROC NEAR
|
|
|
|
cmp ax,RC_NO_ERROR ; error on parse?
|
|
jng kbs_23
|
|
|
|
MOV [BP].RET_CODE_1,LANGUAGE_INVALID ; yes...set invalid language
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; and syntax error..
|
|
MOV LOOP_COUNT,ERROR_COND ; set flag to exit parse.
|
|
MOV ERR_PART,AX
|
|
|
|
jmp kbs_18
|
|
|
|
kbs_23:
|
|
cmp RESULT_TYPE,NUMBER ; was this a number (id?)
|
|
jnz kbs_24
|
|
|
|
MOV AX,WORD PTR RESULT_VAL+2 ; yes...check to see if
|
|
OR AX,AX ; within range.
|
|
jnz kbs_19
|
|
|
|
MOV AX,WORD PTR RESULT_VAL
|
|
cmp ax,max_id
|
|
jna kbs_17
|
|
|
|
kbs_19:
|
|
MOV [BP].RET_CODE_1,ID_INVALID ; no...invalid id.
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; syntax error.
|
|
MOV LOOP_COUNT,ERROR_COND ; set flag to exit parse
|
|
mov bad_id,1
|
|
|
|
jmp short kbs_18
|
|
|
|
kbs_17:
|
|
MOV [BP].RET_CODE_1,ID_VALID ; valid id...set
|
|
MOV [BP].RET_CODE_4,ID_VALID ; valid id...set
|
|
MOV [BP].ID_PARM,AX ; and value moved into block
|
|
MOV LOOP_COUNT,4 ; there should be no more parms
|
|
mov one_parmid,1
|
|
|
|
jmp short kbs_18
|
|
|
|
kbs_24:
|
|
cmp RESULT_TYPE,STRING ; must be a string then???
|
|
jnz kbs_26
|
|
|
|
PUSH SI
|
|
PUSH DI
|
|
PUSH CX
|
|
PUSH DS
|
|
LDS SI,RESULT_VAL ; get ptr to string
|
|
MOV DI,BP
|
|
ADD DI,LANGUAGE_PARM ; point to block for copy.
|
|
MOV CX,LANG_LENGTH ; maximum length = 2
|
|
LODSB ; load AL with 1st char..
|
|
|
|
kbs_16:
|
|
jcxz kbs_15 ; do twice, unless only 1 char
|
|
or al,al
|
|
jz kbs_15
|
|
|
|
STOSB ; store
|
|
DEC CX ; dec count
|
|
LODSB ; load
|
|
|
|
jmp kbs_16
|
|
|
|
kbs_15:
|
|
|
|
or cx,cx ; if there was less than 2 or..
|
|
jnz kbs_20
|
|
or al,al ; greater than 2 chars, then..
|
|
jz kbs_21
|
|
|
|
kbs_20:
|
|
MOV [BP].RET_CODE_1,LANGUAGE_INVALID ; invalid.
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; syntax error
|
|
MOV ERR_PART,INVALID_PARAM
|
|
MOV LOOP_COUNT,ERROR_COND ; set flag to exit parse.
|
|
|
|
jmp short kbs_22
|
|
|
|
kbs_21:
|
|
MOV [BP].RET_CODE_1,LANGUAGE_VALID ; valid language has been copied
|
|
MOV ALPHA,1 ; language found
|
|
|
|
kbs_22:
|
|
POP DS
|
|
POP CX
|
|
POP DI
|
|
POP SI
|
|
jmp short kbs_18
|
|
|
|
; omitted parameter...
|
|
|
|
kbs_26:
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; invalid since further parameters.
|
|
kbs_18:
|
|
RET
|
|
|
|
PROCESS_1ST_PARM ENDP
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; PROCEDURE_NAME: PROCESS_2ND_PARM
|
|
;
|
|
; FUNCTION:
|
|
; THIS PROCEDURE PROCESSES THE 2ND POSITIONAL PARAMETER. THIS SHOULD
|
|
; BE THE CODE PAGE, IF REQUESTED.
|
|
;
|
|
; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
|
|
;
|
|
; AT EXIT:
|
|
; PARAMETER CONTROL BLOCK UPDATED FOR CODE PAGE.
|
|
;
|
|
; AUTHOR: WGR
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
PROCESS_2ND_PARM PROC NEAR
|
|
|
|
cmp ax,RC_NO_ERROR ; if parse error
|
|
jle kbs_32
|
|
|
|
MOV [BP].RET_CODE_2,CODE_PAGE_INVALID ; mark invalid..
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; syntax error
|
|
MOV LOOP_COUNT,ERROR_COND ; set flag to exit parse
|
|
MOV ERR_PART,AX
|
|
|
|
jmp short kbs_31
|
|
|
|
kbs_32:
|
|
|
|
cmp RESULT_TYPE,NUMBER ; was parameter specified?
|
|
jnz kbs_30
|
|
|
|
MOV AX,WORD PTR RESULT_VAL+2 ; yes..if code page not..
|
|
OR AX,AX
|
|
|
|
jnz kbs_27
|
|
|
|
MOV AX,WORD PTR RESULT_VAL ; valid..then
|
|
|
|
cmp ax,MAX_ID
|
|
jna kbs_28
|
|
|
|
kbs_27:
|
|
MOV [BP].RET_CODE_2,CODE_PAGE_INVALID ; mark invalid..
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; syntax error
|
|
MOV LOOP_COUNT,ERROR_COND ; set flag to exit parse
|
|
|
|
jmp short kbs_31
|
|
|
|
kbs_28:
|
|
MOV [BP].RET_CODE_2,CODE_PAGE_VALID ; else...valid code page
|
|
MOV [BP].CODE_PAGE_PARM,AX ; move into parm
|
|
|
|
jmp short kbs_31
|
|
|
|
kbs_30:
|
|
MOV [BP].RET_CODE_2,NO_CODE_PAGE ; mark as not specified.
|
|
kbs_31:
|
|
RET
|
|
|
|
PROCESS_2ND_PARM ENDP
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; PROCEDURE_NAME: PROCESS_3RD_PARM
|
|
;
|
|
; FUNCTION:
|
|
; THIS PROCEDURE PROCESSES THE 3RD POSITIONAL PARAMETER. THIS SHOULD
|
|
; BE THE KEYBOARD DEFINITION FILE PATH, IF SPECIFIED.
|
|
;
|
|
; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
|
|
;
|
|
; AT EXIT:
|
|
; PARAMETER CONTROL BLOCK UPDATED FOR FILE NAME.
|
|
;
|
|
; AUTHOR: WGR
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
PROCESS_3RD_PARM PROC NEAR
|
|
|
|
cmp ax,RC_NO_ERROR ; if parse error, then...
|
|
jle kbs_33
|
|
|
|
MOV [BP].RET_CODE_3,INVALID_SYNTAX ; syntax error.
|
|
MOV LOOP_COUNT,ERROR_COND ; set flag to exit parse
|
|
MOV ERR_PART,AX
|
|
|
|
jmp short kbs_34
|
|
|
|
kbs_33:
|
|
|
|
cmp RESULT_TYPE,FILE_SPEC
|
|
jnz kbs_34
|
|
|
|
PUSH DS
|
|
PUSH SI
|
|
PUSH DI
|
|
PUSH CX
|
|
LDS SI,RESULT_VAL ; load offset of file name
|
|
LEA DI,TEMP_FILE_NAME
|
|
MOV [BP].PATH_OFFSET,DI ; copy to parameter block
|
|
XOR CX,CX
|
|
LODSB ; count the length of the path.
|
|
|
|
kbs_35:
|
|
or al,al
|
|
jz kbs_36
|
|
|
|
STOSB
|
|
LODSB
|
|
INC CX
|
|
jmp short kbs_35
|
|
|
|
kbs_36:
|
|
MOV [BP].PATH_LENGTH,CX ; copy to parameter block
|
|
POP CX
|
|
POP DI
|
|
POP SI
|
|
POP DS
|
|
kbs_34:
|
|
RET
|
|
|
|
PROCESS_3RD_PARM ENDP
|
|
|
|
CODE ENDS
|
|
END
|
|
|