windows-nt/Source/XPSP1/NT/base/mvdm/dos/v86/inc/psdata.inc
2020-09-26 16:20:57 +08:00

517 lines
19 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;*******************************************************************
; Parser include file
;*******************************************************************
IF1 ;AN000;
; %OUT INCLUDING COMP=COMMON DSN=PSDATA.INC...;AN000;
ENDIF ;AN000;
INCLUDE version.inc
;
;**** Default assemble switches definition *************************
IFNDEF FarSW ;AN000;
FarSW equ 0 ;AN000; Near call expected
ENDIF ;AN000;
IFNDEF DateSW ;AN000;
DateSW equ 1 ;AN000; Check date format
ENDIF ;AN000;
IFNDEF TimeSW ;AN000;
TimeSW equ 1 ;AN000; Check time format
ENDIF ;AN000;
IFNDEF FileSW ;AN000;
FileSW equ 1 ;AN000; Check file specification
ENDIF ;AN000;
IFNDEF CAPSW ;AN000;
CAPSW equ 1 ;AN000; Perform CAPS if specified
ENDIF ;AN000;
IFNDEF CmpxSW ;AN000;
CmpxSW equ 1 ;AN000; Check complex list
ENDIF ;AN000;
IFNDEF NumSW ;AN000;
NumSW equ 1 ;AN000; Check numeric value
ENDIF ;AN000;
IFNDEF KeySW ;AN000;
KeySW equ 1 ;AN000; Support keywords
ENDIF ;AN000;
IFNDEF SwSW ;AN000;
SwSW equ 1 ;AN000; Support switches
ENDIF ;AN000;
IFNDEF Val1SW ;AN000;
Val1SW equ 1 ;AN000; Support value definition 1
ENDIF ;AN000;
IFNDEF Val2SW ;AN000;
Val2SW equ 1 ;AN000; Support value definition 2
ENDIF ;AN000;
IFNDEF Val3SW ;AN000;
Val3SW equ 1 ;AN000; Support value definition 3
ENDIF ;AN000;
IFNDEF DrvSW ;AN000;
DrvSW equ 1 ;AN000; Support drive only format
ENDIF ;AN000;
IFNDEF QusSW ;AN000;
QusSW equ 1 ;AN000; Support quoted string format
ENDIF ;AN000;
IFNDEF LFEOLSW ;AN028;
LFEOLSW EQU 1 ;AN028; Accept Line feed (0AH) as end of line
ENDIF ;AN028;
;**** Equation field
;-------- Character code definition
$P_DBSP1 equ DB_SP_HI ;AN000; 1st byte of DBCS blank
$P_DBSP2 equ DB_SP_LO ;AN000; 2nd byte of DBCS blank
$P_Period equ "." ;AN020;
$P_Slash equ "/" ;AN020;
$P_Space equ " " ;AN000; SBCS blank
$P_Comma equ "," ;AN000;
$P_Switch equ "/" ;AN000;
$P_Keyword equ "=" ;AN000;
$P_Colon equ ":" ;AN000;
$P_Plus equ "+" ;AN000;
$P_Minus equ "-" ;AN000;
$P_Rparen equ ")" ;AN000;
$P_Lparen equ "(" ;AN000;
;(deleted ;AN025;) $P_SQuote equ "'"
$P_DQuote equ '"' ;AN000;
$P_NULL equ 0 ;AN000;
$P_TAB equ 9 ;AN000;
$P_CR equ 0Dh ;AN000;
$P_LF equ 0Ah ;AN000;
$P_ASCII80 equ 80h ;AN000; ASCII 80h character code
;-------- Masks
$P_Make_Lower equ 20h ;AN000; make lower case character
$P_Make_Upper equ 0ffh-$P_Make_Lower ;AN000; make upper case character
PAGE ;AN000;
;-------- DOS function call related equs
$P_DOS_Get_CDI equ 3800h ;AN000; get country dependent information
; by this call, following information
$P_CDI struc ;AN000; is returned.
$P_CDI_DateF dw 0 ;AN000;
$P_CDI_Money db 0,0,0,0,0 ;AN000;
$P_CDI_1000 db 0,0 ;AN000;
$P_CDI_Dec db 0,0 ;AN000;
$P_CDI_DateS db 0,0 ;AN000;
$P_CDI_TimeS db 0,0 ;AN000;
db 0 ;AN000;
db 0 ;AN000;
$P_CDI_TimeF db 0 ;AN000;
dw 0,0 ;AN000;
db 0,0 ;AN000;
dw 5 dup(0) ;AN000;
$P_CDI ends ;AN000;
$P_Date_MDY equ 0 ;AN000;
$P_Date_DMY equ 1 ;AN000;
$P_Date_YMD equ 2 ;AN000;
;-------------
$P_DOS_GetEV equ 6300h ;AN000; get DBCS EV call
;AN000; DS:SI will points to DBCS EV
;-------------
$P_DOS_Get_TBL equ 65h ;AN000; get uppercase table call
;AN000; following parameters are set
;AN000; to get casemap table.
$P_DOSTBL_Def equ -1 ;AN000; get default
$P_DOSTBL_BL equ 5 ;AN000; buffer length for Tbl pointer
$P_DOSTBL_File equ 4 ;AN000; get file uppercase table
$P_DOSTBL_Char equ 2 ;AN000; get character uppercase table
; By this call following information
; is returned.
$P_DOS_TBL struc ;AN000;
$P_DOS_InfoID db 0 ;AN000; information id for the table
$P_DOS_TBL_Off dw 0 ;AN000; offset address of the table
$P_DOS_TBL_Seg dw 0 ;AN000; segment address of the table
$P_DOS_TBL ends ;AN000;
PAGE ;AN000;
;---------------------------------------------------------------------------------------------------------
; PARMS LABEL BYTE
; DW PARMSX
; DB 2 ; NUMBER OF STRINGS (0, 1, 2)
; DB length ; LENGTH OF THE NEXT LIST, 0 IF NONE
; DB " .. " ; EXTRA DELIMITER LIST,
; ; TYPICAL ARE ";", "="
; ; "," & WHITESPACE ALWAYS
; DB length ; LENGTH OF THE NEXT LIST, 0 IF NONE
; DB " .. " ; EXTRA END OF LINE LIST, CR, LF OR 0 ALWAYS
;---------------------------------------------------------------------------------------------------------
;-------------------------------- PARMS block structure
$P_PARMS_Blk struc ;AN000;
$P_PARMSX_Address dw 0 ;AN000; Address of PARMSX
$P_Num_Extra db 0 ;AN000; Number of extra stuff
$P_Len_Extra_Delim db 0 ;AN000; Length of extra delimiter
$P_PARMS_Blk ends ;AN000;
$P_Len_PARMS equ 4 ;AN000;
$P_I_Use_Default equ 0 ;AN000; no extra stuff specified
$P_I_Have_Delim equ 1 ;AN000; extra delimiter specified
$P_I_Have_EOL equ 2 ;AN000; extra EOL specified
;---------------------------------------------------------------------------------------------------------
; PARMSX LABEL BYTE
; DB minp,maxp ; MIN, MAX POSITIONAL OPERANDS ALLOWED
; DW CONTROL ; DESCRIPTION OF POSITIONAL 1
; : ; REPEATS maxp-1 TIMES
; DB maxs ; # OF SWITCHES
; DW CONTROL ; DESCRIPTION OF SWITCH 1
; : ; REPEATS maxs-1 TIMES
; DB maxk ; # OF KEYWORD
; DW CONTROL ; DESCRIPTION OF KEYWORD 1
; : ; REPEATS maxk-1 TIMES
;---------------------------------------------------------------------------------------------------------
;-------------------------------- PARMSX block structure
$P_PARMSX_Blk struc ;AN000;
$P_MinP db 0 ;AN000; Minimum positional number
$P_Maxp db 0 ;AN000; Maximum positional number
$P_1st_Control dw 0 ;AN000; Address of the 1st CONTROL block
$P_PARMSX_Blk ends ;AN000;
PAGE ;AN000;
;---------------------------------------------------------------------------------------------------------
; << Control field definition >>
;
;
;CONTROL LABEL BYTE
; DW MATCH_FLAGS ; CONTROLS TYPE MATCHED
; ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED)
; ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE CHECKED)
; ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED)
; ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED)
; ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED)
; ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED)
; ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED)
; ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED)
; ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED)
; ; 0010H=IGNORE ":" AT END IN MATCH
; ; 0002H=REPEATS ALLOWED
; ; 0001H=OPTIONAL
; DW FUNCTION_FLAGS
; ; 0001H=CAP RESULT BY FILE TABLE
; ; 0002H=CAP RESULT BY CHAR TABLE
; ; 0010H=REMOVE ":" AT END
; (tm10) ; 0020H=colon is not necessary for switch
; DW RESULT ; RESULT BUFFER
; DW VALUES ; VALUE LISTS
; DB nid ; NUMBER OF KEYWORD/SWITCH SYNONYMS IN FOLLOWING LIST
; DB "...",0 ; IF n >0, KEYWORD 1
; :
;
;Note:
; - The MATCH_FLAG is bit significant. You can set, for example, TIME bit and
; DATE bit simalteniously.
;
; The parser examins each bit along with the following priority.
;
; COMPLEX -> DATE -> TIME -> NUMERIC VAL -> SIGNED NUMERIC VAL -> DRIVE ->
; FILE SPEC -> SIMPLE STRING.
;
;
; - When the FUNCTION_FLAG is 0001 or 0002, the STRING pointed to by a pointer
; in the result buffer is capitalized.
;
; - Match_Flags 0001H and 0002H have meaning only for the positional.
;
;
; - The "...",0 (bottom most line) does require '=' or '/'. When you need a
; switch, for example, '/A', then STRING points to;
;
; DB 1 ; number of following synonyms
; DB '/A',0
;
; When you need a keyword, for example, 'CODEPAGE=', then "...",0 will be;
;
; DB 1 ; number of following synonyms
; DB 'CODEPAGE=',0
;
;
; - "..." must consist of upper case characters only because the parser
; performs pattern matching after converting input to upper case (by
; using the current country upper case table)
;
;
; - One "..." can contain only one switch or keyword. If you need, for
; example /A and /B, the format will be;
;
; DB 2 ; number of following synonyms
; DB '/A',0
; DB '/B',0
;---------------------------------------------------------------------------------------------------------
;**** Match_Flags
$P_Num_Val equ 8000h ;AN000; Numeric Value
$P_SNum_Val equ 4000h ;AN000; Signed numeric value
$P_Simple_S equ 2000h ;AN000; Simple string
$P_Date_S equ 1000h ;AN000; Date string
$P_Time_S equ 0800h ;AN000; Time string
$P_Cmpx_S equ 0400h ;AN000; Complex string
$P_File_Spc equ 0200h ;AN000; File Spec
$P_Drv_Only equ 0100h ;AN000; Drive Only
$P_Qu_String equ 0080h ;AN000; Quoted string
$P_Ig_Colon equ 0010h ;AN000; Ignore colon at end in match
$P_Repeat equ 0002h ;AN000; Repeat allowed
$P_Optional equ 0001h ;AN000; Optional
;**** Function flags
$P_CAP_File equ 0001h ;AN000; CAP result by file table
$P_CAP_Char equ 0002h ;AN000; CAP result by character table
$P_Rm_Colon equ 0010h ;AN000; Remove ":" at the end
$P_colon_is_not_necessary equ 0020h ;AN000;(tm10) /+10 and /+:10
;-------------------------------- Control block structure
$P_Control_Blk struc ;AN000;
$P_Match_Flag dw 0 ;AN000; Controls type matched
$P_Function_Flag dw 0 ;AN000; Function should be taken
$P_Result_Buf dw 0 ;AN000; Result buffer address
$P_Value_List dw 0 ;AN000; Value list address
$P_nid db 0 ;AN000; # of keyword/SW synonyms
$P_KeyorSW db 0 ;AN000; keyword or sw
$P_Control_Blk ends ;AN000;
PAGE ;AN000;
;---------------------------------------------------------------------------------------------------------
; << Value List Definition >>
;
;VALUES LABEL BYTE
; DB nval ; NUMBER OF VALUE DEFINITIONS (0 - 3)
; +-
; | DB nrng ; NUMBER OF RANGES
; | +DB ITEM_TAG ; RETURN VALUE IF RANGE MATCHED
; | +DD X,Y ; RANGE OF VALUES
; | :
; | DB nnval ; NUMBER OF CHOICES
; | +DB ITEM_TAG ; RETURN VALUE IF NUMBER CHOICE MATCHED
; | +DD VALUE ; SPECIFIC CHOICE IF NUMBER
; | :
; | DB nstrval ; NUMBER OF CHOICES
; | +DB ITEM_TAG ; RETURN VALUE IF STRING CHOICE MATCHED
; | +DW STRING ; SPECIFIC CHOICE IF STING
; +- :
;
;STRING DB "...",0 ; ASCIIZ STRING IMAGE
;
;Note:
; - ITEM_TAG must not be 0FFH, which will be used in the result buffer
; when no choice lists are provided.
;
; - STRING must consist of upper case characters only because the parser
; performs pattern matching after converting input to upper case (by
; using the current country upper case table)
;---------------------------------------------------------------------------------------------------------
$P_nval_None equ 0 ;AN000; no value list ID
$P_nval_Range equ 1 ;AN000; range list ID
$P_nval_Value equ 2 ;AN000; value list ID
$P_nval_String equ 3 ;AN000; string list ID
$P_Len_Range equ 9 ;AN000; Length of a range choice(two DD plus one DB)
$P_Len_Value equ 5 ;AN000; Length of a value choice(one DD plus one DB)
$P_Len_String equ 3 ;AN000; Length of a string choice(one DW plus one DB)
$P_No_nrng equ 0 ;AN000; (tm07) no nrng. nnval must not be 0.
$P_Val_List struc ;AN000;
$P_NumofList db 0 ;AN000; number of following choice
$P_Val_XL dw 0 ;AN000; lower word of value
$P_Val_XH dw 0 ;AN000; higher word of value
$P_Val_YL dw 0 ;AN000; lower word of another value
$P_Val_YH dw 0 ;AN000; higher word of another value
$P_Val_List ends ;AN000;
PAGE ;AN000;
;---------------------------------------------------------------------------------------------------------
; << Result Buffer Definition >>
;
;RESULT LABEL BYTE ; BELOW FILLED IN FOR DEFAULTS
; DB type ; TYPE RETURNED: 0=RESERVED,
; ; 1=NUMBER, 2=LIST INDEX,
; ; 3=STRING, 4=COMPLEX,
; ; 5=FILESPEC, 6=DRIVE
; ; 7=DATE, 8=TIME
; ; 9=QUOTED STRING
; DB ITEM_TAG ; MATCHED ITEM TAG
;
; dw synonym@ ; es:@ points to found SYNONYM if provided.
;
; +-
; | DD n ; VALUE IF NUMBER
; | or
; | DW i ; INDEX (OFFSET) INTO VALUE LIST
; | ; (ES presents Segment address)
; | or
; | DD STRING ; OFFSET OF STRING VALUE
; | or
; | DB drv ; DRIVE NUMBER (1-A, 2-B,..., 26-Z)
; | or
; | DW YEAR ;(1980-2099) IN CASE OF DATE
; | DB MONTH ;(1-12) Note: Range check is not performed.
; | DB DATE ;(1-31) 0 is filled when the corresponding field was not specified.
; | or
; | DB HOUR ;(0-23) IN CASE OF TIME
; | DB MINUTES ;(0-59) Note: Range check is not performed .
; | DB SECONDS ;(0-59) 0 is filled when the corresponding field was not specified .
; | DB HUNDREDTHS ;(0-99)
; +-
;
;
;Note: ITEM_TAG is 0FFH when the caller does not specify the choice
; list.
;
; YEAR: If the input value for the year is less than 100, parser
; adds 1900 to it. For example, when 87 is input to parser for
; the year value, he returns 1987.
;---------------------------------------------------------------------------------------------------------
;-------------------------------- Result block structure
$P_Result_Blk struc ;AN000;
$P_Type db 0 ;AN000; Type returned
$P_Item_Tag db 0 ;AN000; Matched item tag
$P_SYNONYM_Ptr dw 0 ;AN000; pointer to Synonym list returned
$P_Picked_Val db 0,0,0,0 ;AN000; value
$P_Result_Blk ends ;AN000;
;--------------------------------
;**** values for the type field in the result block
$P_EOL equ 0 ;AN000; End of line
$P_Number equ 1 ;AN000; Number
$P_List_Idx equ 2 ;AN000; List Index
$P_String equ 3 ;AN000; String
$P_Complex equ 4 ;AN000; Complex
$P_File_Spec equ 5 ;AN000; File Spec
$P_Drive equ 6 ;AN000; Drive
$P_Date_F equ 7 ;AN000; Date
$P_Time_F equ 8 ;AN000; Time
$P_Quoted_String equ 9 ;AN000; Quoted String
$P_No_Tag equ 0FFH ;AN000; No ITEM_TAG found
;**** Return code
;
; following return code will be returned in the AX register.
$P_No_Error equ 0 ;AN000; No error
$P_Too_Many equ 1 ;AN000; Too many operands
$P_Op_Missing equ 2 ;AN000; Required operand missing
$P_Not_In_SW equ 3 ;AN000; Not in switch list provided
$P_Not_In_Key equ 4 ;AN000; Not in keyword list provided
$P_Out_Of_Range equ 6 ;AN000; Out of range specified
$P_Not_In_Val equ 7 ;AN000; Not in value list provided
$P_Not_In_Str equ 8 ;AN000; Not in string list provided
$P_Syntax equ 9 ;AN000; Syntax error
$P_RC_EOL equ -1 ;AN000; End of command line
PAGE ;AN000;
;********************** Local Data *************************************
$P_ORDINAL dw 0 ;AN000; Operand ordinal save area
$P_RC dw 0 ;AN000; Return code from parser
$P_SI_Save dw 0 ;AN000; Pointer of command buffer
$P_DX dw 0 ;AN000; Return result buffer address
$P_Terminator db 0 ;AN000; Terminator code (ASCII)
$P_DBCSEV_OFF dw 0 ;AN000; Offset of DBCS EV
$P_DBCSEV_SEG dw 0 ;AN000; Segment of DBCS EV
$P_Flags dw 0 ;AN000; Parser internal flags
$P_Flags1 equ byte ptr $P_Flags ;AN038; to reference first byte flags
$P_Flags2 equ byte ptr $P_Flags+1 ;AN038; to reference second byte flags only
;in second byte of $P_Flags, referenced as $P_Flags2:
$P_equ equ 01h ;AN000; "=" packed in string buffet
$P_Neg equ 02h ;AN000; Negative value
$P_Time12 equ 04h ;AN000; set when PM is specified
$P_Key_Cmp equ 08h ;AN000; set when keyword compare
$P_SW_Cmp equ 10h ;AN000; set when switch compare
$P_Extra equ 20h ;AN000; set when extra delimiter found
$P_SW equ 40h ;AN000; set when switch found (tm08)
$P_Signed equ 80h ;AN000; signed numeric specified
;in first byte of $P_Flags, referenced as $P_Flags1:
$P_time12am equ 01h ;AN038; set when AM is specified on time
$P_TIME_AGAIN EQU 02H ;AN039; SET WHEN READY TO RE-PARSE TIME
$P_SaveSI_Cmpx dw 0 ;AN000; save si for later use by complex
$P_KEYorSW_Ptr dw 0 ;AN000; points next to "=" or ":" code
$P_Save_EOB dw 0 ;AN000; save pointer to EOB
$P_Found_SYNONYM dw 0 ;AN000; es:@ points to found synonym
$P_STRING_BUF db 128 dup(0) ;AN000; Pick a operand from command line
$P_STRING_BUF_END equ $ ;AN000;
IF TimeSw ;AN039; For TIME only
$P_ORIG_ORD DW 0 ;AN039; ORIGINAL ORDINAL FROM CX
$P_ORIG_STACK DW 0 ;AN039; ORIGINAL VALUE OF STACK FROM SP
$P_ORIG_SI DW 0 ;AN039; ORIGINAL START PARSE POINTER FROM SI
ENDIF ;AN039;
IF DateSw+TimeSw ;AN000;(Check if date or time format is supported)
;------------------------------
;
$P_Got_Time db 0 ;AN023; if 1, use Time delimiters
$P_NeedToBeRead equ 0ffffh ;AN000;
$P_COUNTRY_INFO $P_CDI <$P_NeedToBeRead> ;AN000;
;
$P_1st_Val dw 0 ;AN000; used when process date or time
$P_2nd_Val dw 0 ;AN000; used when process date or time
$P_3rd_Val dw 0 ;AN000; used when process date or time
$P_4th_Val dw 0 ;AN000; used when process date or time
;------------------------------
ENDIF ;AN000;(of DateSW+TimeSW)
$P_Char_CAP_Ptr db 0ffh ;AN000; info id
dw 0 ;AN000; offset of char case map table
dw 0 ;AN000; segment of char case map table
IF CAPSW ;AN000;(Check if uppercase conversion is supported)
$P_File_CAP_Ptr db 0ffh ;AN000; info id
dw 0 ;AN000; offset of file case map table
dw 0 ;AN000; segment of file case map table
ENDIF ;AN000;(of CAPSW)
; (tm06) IF FileSW ;AN000;(Check if file spec is supported)
;
;M029
;!!!WARNING!!!
; In routine SYSPARSE (parse.asm), $P_FileSp_Char is reinitialized using
;hardcoded strings. If the chars in the string are changed here, corresponding
;changes need to be made in SYSPARSE
;
IF FileSW+DrvSW ;AN000;(Check if file spec is supported)
$P_FileSp_Char db '[]|<>+=;"' ;AN000; delimitter of file spec
$P_FileSp_Len equ $-$P_FileSp_Char ;AN000;
ENDIF ;AN000;(of FileSW)
; (tm05) IF QusSW ;AN000;(Check if quoted string is supported)
;(deleted ;AN025;) IF QusSW+CmpxSW ; (tm05) ;AN000;(Check if quoted string is supported)
;(deleted ;AN025;) $P_SorD_Quote db 0 ;AN000; keep double or single quote
;(deleted ;AN025;) ENDIF ;AN000;(of QueSW)
IF KeySW ;AN029; if keywords supported
$P_count_to_eol dw 0 ;AN029; count of chars not including EOL
; REGISTER EQUATES - SPECIAL USAGE FOR REGISTERS
$P_REG_BH_CG_SW EQU BH ;AN029;0="NO CHANGES MADE", FF=CHANGES MADE
$P_REG_BL_DQ_SW EQU BL ;AN029;0=NOT IN QUOTES,FF=IN QUOTES
$P_DOUBLE_QUOTE EQU """" ;AN029;
$P_BL_EQ EQU " =" ;AN029;
$P_EQ_BL EQU "= " ;AN029;
$P_TB_EQ EQU 093DH ;AN029; ;"<TAB>="
$P_EQ_TB EQU 3D09H ;AN029; ;"=<TAB>"
ENDIF ;AN029; IF KeySW Supported
; delimiter parsing
$P_colon_period equ 01 ;AN032; check for colon & period
$P_period_only equ 02 ;AN032; check only for period
;filespec error flag
$P_err_flag db 00 ;AN033; flag set if filespec parsing error
;AN033; was detected.
$P_error_filespec equ 01 ;AN033; mask to set flag
;***********************************************************************