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