diff options
Diffstat (limited to '')
-rw-r--r-- | private/mvdm/dos/v86/dev/ansi/parser.asm | 356 |
1 files changed, 356 insertions, 0 deletions
diff --git a/private/mvdm/dos/v86/dev/ansi/parser.asm b/private/mvdm/dos/v86/dev/ansi/parser.asm new file mode 100644 index 000000000..4d143a460 --- /dev/null +++ b/private/mvdm/dos/v86/dev/ansi/parser.asm @@ -0,0 +1,356 @@ +PAGE ,132 +TITLE PARSE CODE AND CONTROL BLOCKS FOR ANSI.SYS + +;****************** START OF SPECIFICATIONS ************************** + +; MODULE NAME: PARSER.ASM + +; DESCRIPTIVE NAME: PARSES THE DEVICE= STATEMENT IN CONFIG.SYS FOR +; ANSI.SYS + +; FUNCTION: THE COMMAND LINE PASSED TO ANSI.SYS IN THE CONFIG.SYS +; STATEMENT IS PARSED TO CHECK FOR THE /X SWITCH. A FLAG +; IS CLEARED IF NOT FOUND. + +; ENTRY POINT: PARSE_PARM + +; INPUT: DS:SI POINTS TO EVERYTHING AFTER DEVICE= + +; AT EXIT: +; NORMAL: SWITCH FLAGS WILL BE SET IF /X or /L IS FOUND + +; ERROR: CARRY SET + +; INTERNAL REFERENCES: + +; ROUTINES: SYSLOADMSG - MESSAGE RETRIEVER LOADING CODE +; SYSDISPMSG - MESSAGE RETRIEVER DISPLAYING CODE +; PARM_ERROR - DISPLAYS ERROR MESSAGE +; SYSPARSE - PARSING CODE + +; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE + +; EXTERNAL REFERENCES: + +; ROUTINES: N/A + +; DATA AREAS: SWITCH - BYTE FLAG FOR EXISTENCE OF SWITCH PARAMETER + +; NOTES: + +; REVISION HISTORY: +; A000 - DOS Version 4.00 + +; Label: "DOS ANSI.SYS Device Driver" +; "Version 4.00 (C) Copyright 1988 Microsoft" +; "Licensed Material - Program Property of Microsoft" + +;****************** END OF SPECIFICATIONS **************************** +;Modification history********************************************************** +; P1529 ANSI /x /y gives wrong error message 10/8/87 J.K. +; D397 /L option for "Enforcing" the line number 12/17/87 J.K. +; D479 An option to disable the extended keyboard functions 02/12/88 J.K. +;****************************************************************************** + + +INCLUDE ANSI.INC ; ANSI equates and structures +.XLIST +INCLUDE SYSMSG.INC ; Message retriever code +MSG_UTILNAME <ANSI> ; Let message retriever know its ANSI.SYS +.LIST + +PUBLIC PARSE_PARM ; near procedure for parsing DEVICE= statement + + + +; 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 +NumSW EQU 0 +KeySW EQU 0 +Val1SW EQU 0 +Val2SW EQU 0 +Val3SW EQU 0 + + +CODE SEGMENT PUBLIC BYTE + ASSUME CS:CODE + +.XLIST +MSG_SERVICES <MSGDATA> +MSG_SERVICES <DISPLAYmsg,LOADmsg,CHARmsg> +MSG_SERVICES <ANSI.CL1> +MSG_SERVICES <ANSI.CL2> +MSG_SERVICES <ANSI.CLA> + +INCLUDE VERSION.INC +INCLUDE PARSE.ASM ; Parsing code +.LIST + + +EXTRN SWITCH_X:BYTE ; /X switch flag +extrn Switch_L:Byte ; /L switch flag +extrn Switch_K:Byte ; /K switch flag +extrn Switch_S:Byte ; M008 ; /S or /SCREENSIZE switch flag + + + +; PARM control blocks for ANSI +; Parsing DEVICE= statment from CONFIG.SYS + +; DEVICE=[d:][path]ANSI.SYS [/X] [/K] [/L] [/S | /SCREENSIZE] ; M008 + + + +PARMS LABEL WORD + DW PARMSX + DB 0 ; no extra delimeters or EOLs. + +PARMSX LABEL BYTE + DB 1,1 ; 1 valid positional operand + DW FILENAME ; filename + DB 1 ; 1 switche definition in the following + DW Switches + DB 0 ; no keywords + +FILENAME LABEL WORD + DW 0200H ; file spec + DW 0001H ; cap by file table + DW RESULT_BUF ; result + DW NOVALS ; no value checking done + DB 0 ; no switch/keyword synonyms + +Switches LABEL WORD + DW 0 ; switch with no value + DW 0 ; no functions + DW RESULT_BUF ; result + DW NOVALS ; no value checking done + DB 5 ;AN003; M008; 5 switch synonym +X_SWITCH DB "/X",0 ; /X name +L_SWITCH DB "/L",0 ; /L +K_SWITCH DB "/K",0 ; /K +SSIZE_SWITCH DB "/SCREENSIZE",0 ; M008; /SCREENSIZE +S_SWITCH DB "/S",0 ; M008; /S + +NOVALS LABEL BYTE + DB 0 ; no value checking done + +RESULT_BUF LABEL BYTE + DB ? ; type returned (number, string, etc.) + DB ? ; matched item tag (if applicable) +SYNONYM_PTR DW 0 ; synonym ptr (if applicable) + DD ? ; value + +SUBLIST LABEL DWORD ; list for substitution + DB SUB_SIZE + DB 0 + DD ? + DB 1 + DB LEFT_ASCIIZ + DB UNLIMITED + DB 1 + DB " " + +Old_SI dw ? +Saved_Chr db 0 +Continue_Flag db ON +Parse_Err_Flag db OFF + + + +; PROCEDURE_NAME: PARSE_PARM + +; FUNCTION: +; THIS PROCEDURE PARSES THE DEVICE= PARAMETERS FROM THE INIT REQUEST +; BLOCK. ERROR MESSAGES ARE DISPLAYED ACCORDINGLY. + +; AT ENTRY: DS:SI POINTS TO EVERYTHING AFTER THE DEVICE= STATEMENT + +; AT EXIT: +; NORMAL: CARRY CLEAR - SWITCH FLAG BYTE SET TO 1 IF /X FOUND + +; ERROR: CARRY SET + + + +PARSE_PARM PROC NEAR + CALL SYSLOADMSG ; load message + + jnc plab01 + + CALL SYSDISPMSG ; display error message + STC ; ensure carry still set + + jmp plab02 + +plab01: + PUSH CS ; establish ES .. + POP ES ; addressability to data + LEA DI,PARMS ; point to PARMS control block + XOR CX,CX ; clear both CX and DX for + XOR DX,DX ; SYSPARSE + CALL SYSPARSE ; move pointer past file spec + mov Switch_L, OFF + mov Switch_X, OFF + +while01: + cmp Continue_Flag,ON + jz plab_bogus ; M008; bogus label to avoid jmp + jmp while01_end ; M008; out of short range. + +plab_bogus: ; M008 + + mov Old_SI, SI ;to be use by PARM_ERROR + call SysParse + + cmp ax,RC_EOL + jnz plab09 + + mov Continue_Flag, OFF + jmp short while01 + +plab09: + + cmp ax,RC_NO_ERROR + jz plab07 + + mov Continue_Flag, OFF + mov Switch_X, OFF + mov Switch_L, OFF + mov Switch_K, OFF + call Parm_Error + mov Parse_Err_Flag,ON + + jmp short while01 + +plab07: + + cmp Synonym_ptr,offset X_SWITCH + jnz plab05 + + mov Switch_X,ON + jmp short plab04 + + +plab05: + cmp Synonym_ptr,offset L_SWITCH + jnz plab03 + + mov Switch_L,ON + jmp short plab04 + +plab03: ; M008 + cmp Synonym_ptr, offset S_SWITCH ; M008 + jnz plab11 ; M008 + +plab12: ; M008 + mov Switch_S,ON ; M008 + jmp short plab04 ; M008 + +plab11: ; M008 + cmp Synonym_ptr, offset SSIZE_SWITCH; M008 + jz plab12 ; M008 + + mov Switch_K,ON ; must be /K + +plab04: + clc + + jmp while01 + +while01_end: + + cmp Parse_Err_Flag,ON + jnz plab10 + + stc + jmp short plab02 + +plab10: + clc + +plab02: + + RET +PARSE_PARM ENDP + + + + +; PROCEDURE_NAME: PARM_ERROR + +; FUNCTION: +; LOADS AND DISPLAYS "Invalid parameter" MESSAGE + +; AT ENTRY: +; DS:Old_SI -> parms that is invalid + +; AT EXIT: +; NORMAL: ERROR MESSAGE DISPLAYED + +; ERROR: N/A + + + +PARM_ERROR PROC NEAR + PUSH CX + PUSH SI + PUSH ES + PUSH DS + +; PUSH CS +; POP DS ; establish addressability +; MOV BX,DX +; LES DX,[BX].RES_PTR ; find offending parameter + push ds + pop es + mov si, cs:Old_SI ;Now es:dx -> offending parms + push si ;Save it +Get_CR: + cmp byte ptr es:[si], 13 ;CR? + je Got_CR + inc si + jmp Get_CR +Got_CR: + inc si ; The next char. + mov al, byte ptr es:[si] + mov cs:Saved_Chr, al ; Save the next char + + mov byte ptr es:[si], 0 ; and make it an ASCIIZ + mov cs:Old_SI, si ; Set it again + pop dx ; saved SI -> DX + + push cs + pop ds ;for addressability + + LEA SI,SUBLIST ; ..and place the offset.. + MOV [SI].SUB_PTR_O,DX ; ..in the SUBLIST.. + MOV [SI].SUB_PTR_S,ES + MOV AX,INVALID_PARM ; load 'Invalid parameter' message number + MOV BX,STDERR ; to standard error + MOV CX,ONE ; 1 substitution + XOR DL,DL ; no input + MOV DH,UTILITY_MSG_CLASS ; parse error + CALL SYSDISPMSG ; display error message + mov si, cs:Old_SI ;restore the original char. + mov cl, cs:Saved_Chr + mov byte ptr es:[si], cl + + POP DS + POP ES + POP SI + POP CX + RET +PARM_ERROR ENDP + +include msgdcl.inc + +CODE ENDS + END +
\ No newline at end of file |