ssint.inc
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:17k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. ;*** 
  2. ;ssint.inc
  3. ;
  4. ; Copyright <C> 1988 Microsoft Corporation
  5. ;
  6. ;
  7. ;*******************************************************************************
  8. ;SSINT - Scanner internal interface definitions
  9. SSINT_INC = ON
  10. IncludeOnce architec
  11. IncludeOnce scanner
  12. ;=============================================================
  13. ;Constants
  14. ;
  15. LOWUND EQU LOW UNDEFINED
  16. RB_fSizeOp EQU 80h  ;Rule table constant - indicates cbTyp operand
  17. LineUpdate = 64 ;Number of lines scanned per screen update
  18. ;MUST be power of two!!!
  19. ET_FormRec equ ET_MAX
  20. ;=============================================================
  21. ;Scanner Stack Entry Definitions
  22. ;
  23. ;Scan stack frame ids - major types
  24. STYP_If  EQU 100h ;IF stack entry label
  25. STYP_Else EQU 200h ;opStElse that matches an If
  26. STYP_For EQU 400h ;FOR block identifier
  27. STYP_DefFn EQU 800h ;DEF FN block identifier
  28. STYP_Do  EQU 1000h ;DO block identifier
  29. STYP_While EQU 2000h ;WHILE block identifier
  30. STYP_Case EQU 4000h ;SELECT CASE block identifier
  31. STYP_StackEnd EQU 0 ;End of stack token
  32. ;Scan stack frame ids - modifiers
  33. STYP_Block EQU  1 ;TRUE for block varients of IF and ELSE
  34. STYP_Lab EQU  2 ;Label varient of IF
  35. STYP_Step EQU  4h  ;STEP clause in FOR
  36. STYP_DoWhile EQU 10h  ;DO While varient of DO
  37. STYP_DoUntil EQU 20h  ;DO Until varient of DO
  38. STYP_CaseTo EQU 40h  ;CASE IS <const> TO <const> varient of SELECT
  39. STYP_CaseRel EQU 80h  ;CASE [IS <relop>] <const> varient of SELECT
  40. ;Scan stack frame ids - common combinations
  41. STYP_IfLab EQU  STYP_If OR STYP_Lab
  42. ;Label varient of IF
  43. ; Frame contains the oTx of the IF oTx field
  44. STYP_IfBlock EQU  STYP_If OR STYP_Block
  45. ;Block IF stack entry label
  46. ; Frame contains the oTx of the IF oTx field
  47. STYP_ElseBlock EQU  STYP_Else OR STYP_Block
  48. ;opStElse that matches an IfBlock
  49. STYP_ElseNop EQU  STYP_Else OR STYP_Lab
  50. ;opStElseNop which matches a preceding opStIfLab
  51. ;The following stack frame identifiers are used on the debug stack only.
  52. STYP_Exp EQU -5 ;Present in debug stack only.
  53. STYP_VtRf EQU -4 ;Present in debug stack only.
  54. STYP_AVtRf EQU -3 ;Present in debug stack only.
  55. STYP_ArgCnt EQU -2 ;Present in debug stack only.
  56. ;===========================================================================
  57. ;Scan stack Structure Definitions
  58. ;
  59. ;The following structures are present on the scan stack.
  60. ;FOR structure is used for all varients of FOR (but not EXIT FOR).
  61. FFOR STRUC
  62. FFOR_Id  DW 0
  63. FFOR_oTx DW 0
  64. FFOR_oTxExit DW 0 ;Must align with FDO_oTxExit
  65. FFOR_oTxIdRf DW 0
  66. FFOR_oTyp DW 0
  67. FFOR ENDS
  68. ;IF structure is used for all varients of IF/THEN/ELSEIF
  69. FIF STRUC
  70. FIF_Id DW 0
  71. FIF_oTx  DW 0
  72. FIF_oTxBranch DW 0
  73. FIF ENDS
  74. ;DO structure is used for all looping constructs DO/LOOP, and WHILE/WEND
  75. FDO STRUC
  76. FDO_Id DW 0
  77. FDO_oTxLoop DW 0
  78. FDO_oTxExit DW 0 ;Must align with FFOR_oTxExit
  79. FDO ENDS
  80. ;SELECT CASE structure is used for all varients of SELECT CASE / END SELECT
  81. FCASE STRUC
  82. FCASE_Id DW 0
  83. FCASE_oTyp DW 0
  84. FCASE_oTxBranch DW 0
  85. FCASE_oTxTrue DW 0
  86. FCASE_oTxFalse DW 0
  87. FCASE ENDS
  88. ;Expressions
  89. FEXP STRUC
  90. FEXP_oTyp DW 0
  91. FEXP_oTx DW 0
  92. FEXP ENDS
  93. ;===========================================================================
  94. ;oType contains two fields.
  95. ; The low 13 bits is either a key value for native types or is an
  96. ; offset into the type table to a user defined type definition.
  97. ; The high 3 bits are used by the scanner to identify the origin
  98. ; of the argument to handle several special cases. (ST=scanner type)
  99. ET_RC equ 0 ;Scan stack only ET type for records
  100. ;Flag bits in high byte of scan stack oTyp entry
  101. ST_Form = 1
  102. ST_Seg = 8
  103. ST_ByVal= 10H
  104. ST_Typ_Mask = 00ffh ;oTyp stored in low byte. Records use ET_RC.
  105. ST_Flags= not ST_Typ_Mask ;Mask for flag field
  106. ST_Bits = 2000h ;First available bit
  107. ; 0*ST_Bits ;All expressions not covered by below
  108. ST_Marker= 1*ST_Bits ;Marker for non-oType stack entries
  109. ST_Lit = 2*ST_Bits ;Argument is literal without operand
  110. ;  (Replace executor to coerce to R4)
  111. ST_LitX = 3*ST_Bits ;Argument is literal with operand or with unary minus
  112. ;  (OK for static array in DIM index)
  113. ;For these types, Ld executors get replaced with Rf's on procedure calls
  114. ST_ArrVar= 4*ST_Bits ;Argument is from opAIdLd
  115. ST_SimpVar= 5*ST_Bits ;Argument is from opIdLd
  116. ST_RecArVar= 6*ST_Bits ;Argument is from opOffLd off array
  117. ST_RecScVar= 7*ST_Bits ;Argument is from opOffLd off scalar
  118. ;Derived bit patterns to optimize certain tests
  119. ;WARNING!! Some scanner code is very sensitive to bit assignments!
  120. ST_Lit? = ST_Lit and ST_LitX ;non-zero if literal
  121. ST_RecVar= ST_RecArVar and ST_RecScVar
  122. ST_Var? = ST_SimpVar and ST_ArrVar and ST_RecVar
  123. ST_Array?= ST_Flags and not ST_ArrVar ;Test zero if array var.
  124. ST_Record?= ST_RecVar and not ST_Var? ;Test non-zero if record
  125. ST_ArrayBit= ST_ArrVar xor ST_SimpVar ;Bit set if not array
  126. ;======================================================================
  127. ;SsRefarg flags
  128. ;Passed in dh to indicate details of required reference argument
  129. ;These must be the same as certain bit assignments in SsProc.
  130. ;Verification is made there.
  131. Lvalue = 3 ;Indicates copy back needed
  132. FarArg = 28H ;Make sure argument is FAR
  133. FScb = 10H ;Far ref w/length to be used for FS
  134. ;======================================================================
  135. ;SsBosFlags definitions
  136. ; These flags show state that lasts during a statement.
  137. ; SsBosFlags is set to zero at each BOS.
  138. ;
  139. SSBOSF_StCommon EQU 1 ;COMMON statement detected
  140. SSBOSF_StShared EQU 2 ;SHARED statement detected
  141. SSBOSF_StStatic EQU 4 ;STATIC statement detected
  142. SSBOSF_Const EQU 8 ;Scanning CONST statement
  143. SSBOSF_Inserted EQU 10H ;Insertion occured in this statement
  144. SSBOSF_PcUpdate EQU 20H ;PC update pcode exists in this statement
  145. SSBOSF_StCase EQU 40H ;CASE syntax processing required for this line
  146. ;General-purpose scanner flags, kept in SsFlags:
  147. SSF_ScanAndExec EQU 1 ;ScanAndExec is processing CONST statement
  148. SSF_HaveDimmed EQU 2 ;Have done a DIM: OPTION BASE illegal
  149. SSF_If EQU 4 ;IF syntax processing required for this line
  150. SSF_StSelect EQU 8 ;SELECT CASE <stmt lst> CASE checking is
  151. ;required
  152. SSF_InType EQU 10H ;Inside a TYPE declaration
  153. SSF_CantCont EQU 20H ;Call CantCont at end of scan
  154. ;=======================================================================
  155. ;Text table link list maintenance structure.  This structure is allocated
  156. ;as a local variable on the scanner stack.
  157. ;
  158. TXLNK STRUC
  159. TXLNK_LabDefNext DW 0 ;oTx of next link in label definition list
  160. TXLNK_LabDefLast DW 0 ;oTx of last link in label definition list
  161. TXLNK_Data DW 0 ;oTx of last link in DATA list
  162. TXLNK_DefType DW 0 ;oTx of last link in DEFtyp list
  163. TXLNK_Type DW 0 ;oTx of last link in TYPE/END TYPE list
  164. TXLNK_DefFn DW 0 ;oTx of last link in DEF FN/END DEF list
  165. TXLNK ENDS
  166. ;SSL STRUC
  167. ;SSL_oTxLabDefNext DW 0 ;offset of next label definition
  168. ;(unrelocated for expansion.)
  169. ;SSL_oTxLabDefLast DW 0 ;offset of last bound label definition
  170. ;SSL ENDS
  171. ;=======================================================================
  172. ;Data segment locations
  173. ;
  174. sBegin DATA
  175. ife SSDATA_ASM
  176. extrn SsErrOTx:word ;oTx of pcode which was replaced by opEot
  177. extrn SsErr:word ;Error code to be returned by scanner.
  178. extrn SsErrOpcode:word ;Opcode which was replaced by opEot
  179. extrn SsDelayErr:word ;Error code of delayed error
  180. extrn SsDelayLoc:word ;oTx of delayed error
  181. extrn SsDelayCnt:word ;Count of pending delayed errors
  182. extrn SsStackSave:word ;Scanner sp at start of scan loop
  183. extrn f_Static:byte ;TRUE if current array type default is $STATIC
  184. extrn f_StaticCalc:byte ;TRUE if current array would be $STATIC if this
  185. ; were the first reference.
  186. extrn SsExec:word ;SsExecFlag and SsExecTmp together
  187. extrn SsExecFlag:byte ;OPA_fExecute ORed in if can't allow COMMON
  188. extrn SsExecTmp:byte ;Temporary hold for SsExecFlag during CONST
  189. extrn ScanRet:word ;Contains address of scanner main loop
  190. extrn SsOTxBOS:word ;Offset of last encountered BOS
  191. extrn SsOTxPatchBos:word ;Address of executor to be patch with Bos
  192. extrn SsOTxStart:word  ;Address of point were stack was clear.  This
  193. ;is used to find the bounds for Dim as well as
  194. ;the insertion point for CDecl calls.
  195. extrn ScannerFlags:word ;SsBosFlags and SsFlags together
  196. extrn SsBosFlags:byte ;Scanner begin of statement flags
  197. extrn SsFlags:byte ;General scanner flags
  198. extrn SsCbTxExpand:word ;CB of text expansion during scanning.
  199. extrn SsLinkCtl:word ;Label Control Structure
  200. extrn SsCbFrameTemp:word ;Temp space for current statement
  201. ;Data for update of return addresses on stack
  202. extrn SsNextOTx:word ;oTx of return address
  203. extrn SsReturnBp:word ;offset in stack of return frame
  204. ;ScanAndExec data
  205. extrn SsScanExStart:word ;Starting address of execution
  206. extrn SsScanExSrc:word ;oTx of original source
  207. ;Data used by ssproc to count param bytes for CDECL calls
  208. extrn SsCbParmCur:word ;cb of all params so far
  209. extrn SsParmCnt:word ;Number of parameters
  210. extrn SsOtxHeapMove:word ;oTx of last possible heap movement
  211. extrn SsBosStack:word ;SP-2 at start of statement
  212. endif ;SSDATA_ASM
  213. sEnd DATA
  214. ;=======================================================================
  215. ;Entrypoints defined in SsScan.asm
  216. ;
  217. ife SSSCAN_ASM
  218. extrn ScanExExit:far ;jmp here to terminate execution from scanner
  219. endif ;ife SSSCAN_ASM
  220. sBegin SCAN
  221. ife SSSCAN_ASM
  222. extrn ScanExit:near ;jmp here when scan is complete
  223. extrn SsScanExExit:near ;jmp here when scan of ScanAndExec is done
  224. extrn ExecuteFromScan:near ;Fire up execution from scanner
  225. extrn SsError:near ;Scanner error handler
  226. extrn SsErrorBx:near ;Scanner error handler--emit oTx bx
  227. extrn SsFrameType:near ;Report nesting error
  228. extrn DescanTerm:near  ;Descan loop termination address
  229. extrn DescanX:near ;Rude descan loop termination address
  230. endif ;ife SSSCAN_ASM
  231. ;======================================================================
  232. ;Entrypoints defined in ssid.asm
  233. ;
  234. ife SSID_ASM
  235. extrn SsGetISFC:near ;Id opcode to executor scope resolution
  236. extrn GetCxISFC:near
  237. endif ;ife SSID_ASM
  238. ;======================================================================
  239. ;Entrypoints defined in ssaid.asm
  240. ;
  241. ife SSAID_ASM
  242. extrn SsIndexType:near ;Index into executor map based on oType
  243. extrn SsIndexTypeCx:near ;Index into executor map based on oTyp in cx
  244. extrn SsIndexISFC:near ;Index into executor map based on ISFC
  245. extrn SsEmitExecutor:near ;Get executor from map and emit with operand
  246. extrn MakeArrayRef:near ; Convert AIdLd to AdRf.
  247. endif ;ife SSAID_ASM
  248. ;======================================================================
  249. ;Entrypoints defined in sstxutil.asm
  250. ;
  251. ife SSTXUTIL_ASM
  252. extrn SsMakeGap:near ;Create initial gap between source and emit pcode
  253. extrn SsEnsureGap:near ;Ensure a gap between source and emit pcode
  254. endif ;ife SSTXUTIL_ASM
  255. ;======================================================================
  256. ;Labels in exconv.asm
  257. ife EXCONV_ASM
  258. extrn tImpCo:word ;Table of implicit coercion executors
  259. endif ;EXCONV_ASM
  260. ;========================================================================
  261. ;Tables and entrypoints defined in SsRules.asm
  262. ;
  263. ife SSRULES_ASM
  264. extrn EnsureArgType:near ;Ensure top stack argument is of correct type
  265. extrn SsCoerceReg:near ;Coercion handler (args in registers)
  266. extrn SsCoerceN:Near ;Coercion handler for n stack entries
  267. extrn TMError:near ;Type Mismatch Error
  268. extrn TMErrorNZ:near ;Type Mismatch Error if ZF not set
  269. extrn tRuleByte:byte ;Rule byte - usually an emitted type
  270. extrn tRuleWord:word ;Rule word - usually a coercion table address
  271. extrn mpOpRule:byte ;Opcode to rule table
  272. extrn Insert:near ;Insert into text
  273. extrn InsertCx:near ;Insert into text
  274. extrn InsertBranchBos:near ;Insert branch after opBos
  275. extrn InsertBranch:near ;Insert into text
  276. extrn Insert1Op:near ;Insert into text
  277. endif ;ife SSRULES_ASM
  278. ;======================================================================
  279. ;SSBOS resident routines
  280. ;
  281. ife SSBOS_ASM
  282. extrn EmitExCopyOps:near ;Emit executor and copy operands
  283. extrn CopyOperands:near ;Copy operands for opcode bx from si to di
  284. extrn LabelBindCur:near ;Bind a label reference to current scope
  285. extrn SsBosStack:word ;SP-2 at start of statement
  286. endif ;SSBOS_ASM
  287. ;========================================================================
  288. ;Scanner specific tables built by OPTABLER
  289. ;
  290. extrn mpOpExe:word ;Opcode to executor (or executor map) table
  291. extrn mpOpAtr:byte ;Opcode to atribute table
  292. extrn mpOpScanDisp:word ;Opcode to scanner dispatch table
  293. ;======================================================================
  294. ;Scanner internal entrypoint declarations for ssdescan.asm
  295. ;
  296. ife SSDESCAN_ASM
  297. extrn SsLabelRefDebind:near
  298. extrn SsD_NOps:near
  299. endif ;SSDESCAN_ASM
  300. sEnd SCAN
  301. ;======================================================================
  302. ;Scanner internal entrypoint declarations for ssif.asm
  303. ;
  304. ife SSIF_ASM
  305. extrn MapOpToExeNumeric:near
  306. endif ;SSIF_ASM
  307. ;======================================================================
  308. ;Scanner internal entrypoint declarations for ssoperat.asm
  309. ;
  310. ife SSOPERAT_ASM
  311. extrn MSdFs:near
  312. endif ;SSOPERAT_ASM
  313. ;======================================================================
  314. ;Scanner internal entrypoint declarations for ssmisc.asm
  315. ;
  316. ife SSMISC_ASM
  317. extrn GetRuleInfo:near
  318. extrn FindFrame:near
  319. extrn CbFrameSTYPCx:near
  320. extrn SsAllocOFrame:near
  321. extrn BindExit:near
  322. extrn BindExitCur:near
  323. extrn CbTypOTypSCAN:near
  324. extrn CbTypOTypOMrsSCAN:near
  325. endif ;SSMISC_ASM
  326. ;=============================================================================
  327. ;Scanner internal entrypoint declarations for ssproc.asm
  328. ;
  329. ife ssproc_asm
  330. extrn ByValMarker:abs ;Rule table entries for BYVAL
  331. extrn SegMarker:abs ;   and SEG
  332. extrn SsCallFunc:near ;Entry point to SSPROC from SSID and SSAID
  333. ;   for function calls
  334. extrn SsReLinkDecl:near ;Adjust PRS_otxDef and copy operands
  335. extrn SsReLinkNoCopy:near ;Adjust PRS_otxDef
  336. extrn SsFindOpNoList1:near ;Find NoList pcodes
  337. extrn CopyOps:near ;Copy operands and dispatch
  338. endif ;SSPROC_ASM
  339. ;=============================================================================
  340. ;Scanner internal entrypoint declarations for ssrec.asm
  341. ;
  342. ife ssrec_asm
  343. extrn MakeRef:near
  344. endif ;SSREC_ASM
  345. ;=============================================================================
  346. ;Scanner internal entrypoint declarations for ssrefarg.asm
  347. ;
  348. ife ssrefarg_asm
  349. extrn AllocTemp:near
  350. extrn SsRefArg:near ;Handle all reference argument problems
  351. endif ;SSREFARG_ASM
  352. ;=============================================================================
  353. ;Scanner internal entrypoint declarations for ssdeclare.asm
  354. ;
  355. ife ssdeclare_asm
  356. extrn SetArrayType:near
  357. endif ;SSDECLARE_ASM
  358. ;=============================================================================
  359. ;Scanner Macros and equates
  360. ;
  361. ;Scan Routine entry point definition
  362. SsProcRude EQU -4 ;Rude mode scan and descan dispatch
  363. SsProcParse EQU -2 ;Parse mode descan dispatch
  364. ;Scan to SS_EXECUTE mode dispatch declaration macro
  365. SsProc MACRO ScanNam,Rude,Local
  366. ifnb <&Rude>
  367. extrn SsV_&ScanNam:near
  368. DW scanOFFSET SsV_&ScanNam
  369. endif
  370. public Ss_&ScanNam
  371. ifb <&Local>
  372. extrn SsD_&ScanNam:near
  373. endif
  374. DW scanOFFSET SsD_&ScanNam
  375. Ss_&ScanNam&:
  376. ENDM
  377. ;Rude mode dispatch point declaration macro
  378. SsVProc MACRO ScanNam
  379. public SsV_&ScanNam
  380. SsV_&ScanNam&:
  381. ENDM
  382. ;Descan to SS_PARSE mode dispatch point declaration macro
  383. SsDProc MACRO ScanNam
  384. public SsD_&ScanNam
  385. SsD_&ScanNam&:
  386. ENDM
  387. ;Pcode location macros
  388. PTRTX equ <word ptr es:>
  389. LODSWTX equ <lods word ptr es:[si]>
  390. STOSWTX equ <stos word ptr es:[si]>
  391. MOVSWTX equ <movs word ptr es:[si],word ptr es:[di]>
  392. TEXTSEG equ <db 26h>
  393. sBegin CODE ;DWEXT needs codeOFFSET defined, and this does it
  394. sEnd CODE
  395. DWEXT MACRO pex,fDefine
  396. ifb <fDefine> ;; fDefine specified?
  397.     extrn   pex:far ;; No, generate offset
  398.     dw     codeOFFSET pex
  399. elseif     fDefine ;; Yes, use specified fDefine
  400.     extrn   pex:far
  401.     dw     codeOFFSET pex
  402. endif
  403. ENDM
  404. DWFILL MACRO fDefine
  405. ifb <fDefine> ;; fDefine specified?
  406.     dw     ? ;; No, Assume true
  407. elseif fDefine  ;; Yes, use specified fDefine
  408.     dw     ?
  409. endif
  410. ENDM
  411. DWIF MACRO wData,fDefine ;
  412. if fDefine  ;
  413.     dw     wData ;
  414. endif ;
  415. ENDM ;
  416. DBIF MACRO bData,fDefine ;
  417. if fDefine  ;
  418.     db     bData ;
  419. endif ;
  420. ENDM ;
  421. ;***
  422. ;PUSH_ES, POP_ES, REFRESH_ES macros
  423. ;
  424. ;Purpose:
  425. ; There are a number of places in the scanner where we can simply
  426. ; push the text segment prior to a far call and pop it on return in
  427. ; non-windows versions (i.e., the called routine promises to cause
  428. ; no heap movement).  In windows versions, however, the far call could
  429. ; cause a thunk and thus heap movement.  PUSH_ES/POP_ES allow us
  430. ; to generate the minimal required code for either case.
  431. ;
  432. ; REFRESH_ES is similar, but for the case where the called routine
  433. ; itself preserves ES.
  434. ;
  435. ; Added as part of revision [3].
  436. ;****
  437. PUSH_ES     equ     <push es>
  438. POP_ES     equ     <pop es>
  439. REFRESH_ES  equ     <>
  440. ;===========================================================================
  441. ;Scanner Debug Macros and equates
  442. ;
  443. SsDbStackIni equ <>
  444. SsDbStackEmpty equ <>
  445. SsDbStackPush MACRO type
  446. ENDM
  447. SsDbStackPop MACRO type
  448. ENDM