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.
356 lines
8.1 KiB
356 lines
8.1 KiB
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
|
|
|