summaryrefslogtreecommitdiffstats
path: root/private/mvdm/dos/v86/dev/ansi/parser.asm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/mvdm/dos/v86/dev/ansi/parser.asm356
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