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

操作系统开发

开发平台:

Visual C++

  1. ;*** 
  2. ;context.inc
  3. ;
  4. ; Copyright <C> 1985, 1986, 1987 Microsoft Corporation
  5. ;
  6. ; NOTE: When making changes to this file, be sure to make equivalent
  7. ;       changes to file CONTEXT.H
  8. ; NOTE: For comments, see file CONTEXT.H
  9. ;
  10. ;
  11. ;*******************************************************************************
  12. CONTEXT_INC = -1                ;remember that this file has been included
  13. IncludeOnce heap
  14. IncludeOnce pointers
  15. IncludeOnce sb
  16. ;**======================================================================**
  17. ;**==           External Interface to Context Mgr Component            ==**
  18. ;**======================================================================**
  19. ;**==================== text descriptor (TXD_) ============================
  20. ;
  21. ;Definition of text table descriptor.  Both modules and procedures have
  22. ;text tables.  All text-offset (otx...) fields in this descriptor are
  23. ;maintained by the text manager during edit operations, and by the scanner
  24. ;during pcode expansion/contraction.
  25. ;For all linked lists through the pcode, (otx...Link), the link is always
  26. ;a text offset to a pcode's 1st operand, NOT to the 1st byte of the pcode.
  27. ;This speeds up traversal of the list.
  28. ;
  29. ;=======================================================================*
  30. TXD STRUC ;offset  ;offset
  31. TXD_bdlText_cbLogical DW 0 ;00 ;00
  32. TXD_bdlText_seg  DW 0 ;02 ;02
  33. TXD_bdlText_dummy DW 0 ;04
  34. TXD_bdlText_cPhysical DW 0 ;06 ;04
  35. TXD_otxLabLink DW 0 ;08 ;06
  36. TXD_otxDefTypeLink DW 0 ;0a ;08
  37. TXD_otxTypeLink  DW 0 ;0c ;0a
  38. TXD_otxReParseLink DW 0 ;0e ;0c
  39. TXD_cLines DW 0 ;10 ;0e
  40. TXD_cLinesIncl DW 0 ;12 ;10
  41. TXD_lnCursor DW 0 ;14 ;12
  42. TXD_scanState DB 0 ;16 ;14
  43. TXD_flags DB 0 ;17 ;15
  44. TXD ENDS ;18 ;16
  45. TXD_bdlText     EQU     TXD_bdlText_cbLogical
  46. ;Define place to keep address of compiled code
  47. TXD_oCompiled   EQU     TXD_otxLabLink
  48. TXD_segCompiled EQU     TXD_otxDefTypeLink
  49. TXD_bdlText_status equ TXD_bdlText_seg 
  50. FTX_mrs         EQU 01H ;TRUE if text table is mrs, not prs
  51. FTX_asChg       EQU 02H ;TRUE if PreScanAsChg needs to be called
  52.                         ; before we scan this text table again
  53. ;The following FTX_Tmp... flags are used temporarily within the scope of
  54. ;SaveDeclares().  If another function needs to make temporary use of a flag,
  55. ;it can use these bits as well, as long as it assumes they contain garbage
  56. ;on entry and exit.
  57. ;
  58. FTX_TmpDecl     EQU 4   ;Used by SaveDeclares in text mgr.
  59. FTX_TmpRef      EQU 8   ;Used by SaveDeclares in text mgr.
  60. ;**==================== Procedure Register Set (PRS) =======================
  61. ;The there is a procedure register set for each SUB, DEF and FUNCTION in the 
  62. ;program. 
  63. ;
  64. ;For SUB's and FUNCTION's, there is only one procedure per name, regardless
  65. ;of FUNCTION type or module of definition.
  66. ;There is at most one DEF FN per module per type per name.
  67. ;FUNCTIONs and SUBs are global to the program.  DEF FNs are local to a module.
  68. ;
  69. ;Prs's must exist whenever there is pcode (even if no variable tables
  70. ;exist), because pcode's contain references to entries.
  71. ;Prs's are used at runtime for procedure invocations for identifying
  72. ;the new module.  Prs's are built only at the request of the parser/
  73. ;user-interface.
  74. ;
  75. ;While a procedure is loaded into prsCur, its entry in the Rs table
  76. ;should not be referenced or updated.
  77. ;==========================================================================
  78. ;Flag constants used with the PRS_flags byte, below
  79. FP_STATIC       EQU     80h
  80. FP_CDECL        EQU     40h
  81. FP_DEFINED      EQU     20h
  82. FP_ENDPROC      EQU     10h
  83. FP_DECLARED     EQU     08h
  84. FP_DEFSCANNED EQU 04H
  85. ; Flag constants used with the PRS_flags2 byte, below
  86. ; NOTE: only flags 08H - 80H are available, as flags2 is overlaid over oType
  87. FP_RefDeleted  EQU 80h
  88. FP_AUTO  EQU 40h
  89. FP_ExeTree EQU 20h
  90. PRS                     STRUC
  91. ;Begin of zero fill
  92. PRS_cbFrameVars         DW 0    ;00      
  93. PRS_cbFrameTemp         DW 0    ;02      
  94. PRS_ogNam DW 0 ;04 ;      
  95. PRS_procType            DB 0    ;08      
  96. PRS_oType               DB 0    ;09      
  97. PRS_flags               DB 0    ;0a      
  98. PRS_cwParams            DB 0    ;0b      
  99. ;Begin of UNDEFINED fill
  100. PRS_oVarHash            DW 0    ;0c      
  101. PRS_oMrs                DW 0    ;0e      
  102. PRS_oRsDef              DW 0    ;10      
  103. PRS_otxDef              DW 0    ;12      
  104. PRS_oPrsNext DW 0 ;14 ;      
  105. PRS_txd                 DB SIZE TXD DUP(0)   ;16
  106. PRS ENDS
  107. PRS_flags2 EQU PRS_oType ; share this byte - - - low nibble
  108. ; is for oTyp, high nibble is flags
  109. M_PT_OTYPE EQU 07H ;[20] mask to allow access to PRS_oType
  110. ;enumerations for PRS_procType:
  111. PT_SUB          EQU     1
  112. PT_FUNCTION     EQU     2
  113. PT_DEFFN        EQU     3
  114. PT_NOT_PROC EQU 4
  115. ; eb api constants
  116. ;**==================== Module Register Set (MRS) ============================
  117. ;The Module Register Set either directly contains or is the owner of all
  118. ;information about a particular module.
  119. ;
  120. ;The global Rs table contains both prs's and mrs's, each linked together.
  121. ;Entries are not compressed, due to the number of structures that have offsets
  122. ;into this table.
  123. ;
  124. ;While a module is loaded into mrsCur, its entry in the global Rs table
  125. ;should not be referenced or updated.
  126. ;============================================================================**
  127. OGNAM_UNNAMED EQU 0 ; ogNam for an unnamed mrs
  128. OGNAM_GMRS EQU 1 ; an invalid ogNam to be used as
  129. ;  the ogNam of the global mrs
  130. OGNAM_CLIPBOARD EQU 2 ; ogNam for clipboard mrs
  131. OGNAM_IMMEDIATE EQU 3 ; ognam for Immediate window
  132. OGNAM_PSEUDO_MAX EQU 3 ; max psuedo ogNam value
  133. OMRS_GLOBAL EQU 0
  134. ;Flag constants used with the MRS_flags byte, below
  135. FM_OptionBase1  EQU     01h
  136. FM_VARNEW       EQU     02h
  137. FM_asChg        EQU     04h
  138. FM_TEMPORARY    EQU     08h
  139. FM_AllSsRude    EQU     10h
  140. FM_LinksOk  EQU  20H 
  141. FM_MustVisit EQU 40H
  142. FM_Visited EQU 80H
  143. ;NOTE: all flags except FM_asChg get set to 0 by BinaryLoad().
  144. ;      When adding flags, make sure this is desired
  145. ;Flag constants used with the MRS_flags2 byte, below.  These are file related
  146. FM2_Modified    EQU     01h
  147. FM2_NewFile     EQU     02h
  148. FM2_Include     EQU     04h
  149. FM2_NoPcode     EQU     08h
  150. FM2_File        EQU     10h
  151. FM2_AsciiLoaded EQU     20h
  152. FM2_ReInclude EQU 40h
  153. FM2_EntabSource EQU     80h
  154. ;NOTE: all flags except FM2_EntabSource get set to 0 by BinaryLoad().
  155. ;      When adding flags, make sure this is desired
  156. ;Flag constants used with the MRS_flags3 byte, below.
  157. FM3_NotFound    EQU     01h
  158. FM3_Translated EQU 04h
  159. ;NOTE: This flags are NOT saved by BinarySave/Load.
  160. MRS                     STRUC
  161. ;Begin of zero fill
  162. ;------------------
  163. MRS_cbFrameVars         DW 0
  164. MRS_cbFrameTemp         DW 0
  165. MRS_ogNam DW 0
  166. MRS_bdVar DB SIZE BD DUP(0)
  167. MRS_flags DB 0
  168. MRS_flags2 DB 0
  169. MRS_flags3 DB 0
  170. MRS_dummy1 DB 0
  171. ;Begin of UNDEFINED fill
  172. MRS_oMrsNext DW 0
  173. MRS_otxHandler DW 0
  174. MRS_bdlNam_cbLogical DW 0
  175. MRS_bdlNam_seg DW 0
  176. MRS_bdlNam_dummy DW 0
  177. MRS_bdlNam_cPhysical DW 0
  178. MRS_txd  DB SIZE TXD DUP(0)
  179. MRS_otxDefFnLink DW 0
  180. MRS_oPastLastVar DW 0
  181. MRS_data_otxFirst DW 0
  182. MRS_data_otxCur  DW 0
  183. MRS_data_oLineCur DW 0
  184. MRS ENDS
  185. MRS_bdlNam      EQU     MRS_bdlNam_cbLogical
  186. MRS_bdlNam_status equ MRS_bdlNam_seg
  187. ;**==================== Global Register Set (GRS) ========================
  188. ;The global register set owns heap entries which define the current context.
  189. ;
  190. ;Only one module table entry and procedure table entry may be active at any
  191. ;one time.  A module table entry MUST be active, and a procedure entry MAY
  192. ;be active. These tables are managed by swapping a new mrs into mrsCur or
  193. ;swapping a new procedure into prsCur.
  194. ;
  195. ;While a module or procedure is loaded into mrsCur or prsCur, its entry
  196. ;in the global Rs table should not be referenced or updated.
  197. ;
  198. ;=======================================================================**
  199. GRSTYPE STRUC
  200. ;Begin of zero fill ;QB5 EB
  201. GRS_fScan                       DB 0    ;00 00
  202. GRS_fDirect DB 0 ;01 01
  203. GRS_bdRs DB SIZE BD DUP(0)
  204. GRS_bdtComBlk DB SIZE BD DUP(0)
  205. GRS_flags DB 0 ;0e 0c
  206. GRS_filler DB 0 ;1f 0d
  207. ;Begin of UNDEFINED fill
  208. GRS_oMrsMain DW 0 ;10 0e
  209. GRS_oRsCur DW 0 ;12 10
  210. GRS_pMrsCur DW 0
  211. GRS_pRsCur DW 0
  212. GRS_offsetTxdSeg DW 0 ;14 12
  213. GRS_oMrsCur DW 0 ;16 14
  214. GRS_oPrsCur DW 0 ;18 16
  215. GRS_otxCur DW 0 ;1a 18
  216. GRS_oRsCONT DW 0 ;1c 1a
  217. GRS_otxCONT DW 0 ;1e 1c
  218. GRS_oRsContTxtTbl DW 0 ;20 1e
  219. GRS_bdlDirect_cbLogical  DW 0 ;22 20
  220. GRS_bdlDirect_seg DW 0 ;24 22
  221. GRS_bdlDirect_dummy DW 0
  222. GRS_bdlDirect_cPhysical  DW 0 ;26 24
  223. GRS_flagsDir DB 0 ;28 2a
  224. GRSTYPE ENDS
  225. GRS_bdlDirect           EQU     GRS_bdlDirect_cbLogical
  226. GRS_bdlDirect_status equ GRS_bdlDirect_seg
  227. ;GRS_flags enumerations
  228. FG_WatchActive          EQU     01H     ;set if watch pcode is active
  229. FG_RetDir               EQU     02H     ;1 return address to direct-mode buffer
  230.                                         ;exists on the stack.  Entry of direct-
  231.                                         ;mode stmts when this is true causes
  232.                                         ;FG_RetDirBad to be set.
  233. FG_AllSsExecute         EQU     04H     ;set if all text tables are
  234.                                         ;in SS_EXECUTE
  235. FG_OtxInDir EQU 08H ; Set if the mose recently scanned
  236. ; direct mode statement contained
  237. ; an otx reference. If this flag
  238. ; is set at the same time as
  239. ; FG_RetDir, then any edit is a
  240. ; CantCont.
  241. ;GRS_flagsDir enumerations
  242. FDIR_cleared            EQU     01H
  243. FDIR_new                EQU     02H
  244. ;bits for mask passed to ForEach[CP]:
  245. ;
  246. FE_PcodeMrs     EQU 01h ;TRUE if mrs's containing pcode are to be visited
  247. FE_TextMrs      EQU 02h ;TRUE if FM_TEXT and FM_TEXTFILE mrs's are to be
  248.                         ; visited (i.e. command window's mrs, docuemnt files)
  249. FE_CallMrs      EQU 04h ;TRUE if pFunc is to be called for mrs's text table
  250.                         ; BEFORE it is called for prs's text tables.
  251. FE_PcodePrs     EQU 08h ;TRUE if prs's with text tables (SUBs/FUNCTIONs)
  252.                         ; are to be visited
  253. FE_NoPcodePrs   EQU 10h ;TRUE if DEF FN and DECLARE prs's are to be visited
  254. FE_FarCall      EQU 20h ;TRUE if function to be called is FAR
  255. FE_SaveRs       EQU 40h ;TRUE if ForEach is to restore caller's oRsCur on exit
  256. FE_CallMrsAfter EQU 80h ;TRUE if pFunc is to be called for mrs's text table
  257.                         ; AFTER it is called for prs's text tables.
  258. ;***
  259. ;GETRS_SEG, RS_BASE, SETSEG_EQ_SS, [B]PTRRS
  260. ;
  261. ;Purpose:
  262. ; Macros to allow the global Rs table to be a near or far table
  263. ; for different products built off QB shared sources.
  264. ; Added as revision [6].
  265. ; GETRS_SEG:
  266. ; Same as GETBDL_SEG, but optimized to fetch the segment of
  267. ; this particular table. If the Rs table is near, does nothing.
  268. ; RS_BASE:
  269. ; Used to perform some primitive operation (add, sub, mov)
  270. ; using the base pointer of the Rs table; if the Rs table is
  271. ; far, does nothing (as the offset to start of table is always
  272. ; zero in that case).
  273. ; If the Rs table is far and FV_LMEM == TRUE, then this
  274. ; macro must zero the arg if the operation is 'mov'.
  275. ; (or else "RS_BASE mov,..." does nothing when it is
  276. ; expected to get the Rs table base.)
  277. ;
  278. ; SETSEG_EQ_SS:
  279. ; Used to set a given seg address equal to SS, only in the
  280. ; case where the global Rs table is far; does nothing if
  281. ; the table is near.
  282. ; [B]PTRRS:
  283. ; Text macros, similar to [B]PTRTX and [B]PTRVAR, used to
  284. ; provide an es seg override for versions with the Rs table far.
  285. ;**************************************************************************
  286. GETRS_SEG   MACRO   reg,temp,opt ;
  287. ENDM ;
  288. RS_BASE  MACRO  op,arg,reg ;
  289. op arg,grs.GRS_bdRs.BD_pb ;
  290. ENDM ;
  291. SETSEG_EQ_SS MACRO  reg  ;
  292. ENDM ;
  293. PTRRS EQU word ptr ;
  294. BPTRRS EQU byte ptr ;
  295. sBegin  DATA
  296. ;**======================================================================**
  297. ;**     External references to static context structures
  298. ;**
  299. ;** Since all of these are defined in context.c, we don't have to put
  300. ;** them under any switch
  301. ;**======================================================================**
  302.         EXTRN   grs:byte        ;global register set
  303.         EXTRN   mrsCur:byte     ;module resister set for the active module
  304.         EXTRN   prsCur:byte     ;procedure resister set for the active proc
  305.         EXTRN   txdCur:byte     ;current text table (from prs or mrs)
  306. ;**======================================================================**
  307. ;**     Fundamental global state variables
  308. ;**======================================================================**
  309.         EXTRN   b$mainframe:word        ;initial value of BP after runtime
  310.                                         ; inititalization. Only changes when
  311.                                         ; the stack moves; used to reset the
  312.                                         ; stack
  313.         EXTRN   b$curframe:word ;always equal to BP, except in runtime
  314.                                         ; support code or in U.I. code. BP is
  315.                                         ; modified by runtime entry points and
  316.                                         ; by non-BASIC procedures, so this is
  317.                                         ; used to restore BP after runtime error
  318.         EXTRN   b$pend:word             ;points to the last (bottom) word in
  319.                                         ; the stack. Modified only by the
  320.                                         ; runtime, on initialization & when the
  321.                                         ; stack moves. Used by CLEAR to reset
  322.                                         ; the stack.
  323.         EXTRN   b$pendchk:word          ;Set to b$pend plus a fudge factor
  324.                                         ; used to check to see if sufficient
  325.                                         ; stack space remains at CALL time,
  326.                                         ; GOSUB time, others that push a
  327.                                         ; frame, and by U.I. recursive routines.
  328.                                         ; Reset by the runtime when the stack
  329.                                         ; moves. 
  330.         EXTRN   fNonQBI_Active:word     ;Set TRUE whenever non-QBI code is
  331.                                         ; active. Used to determine whether
  332.                                         ; we can CONTinue, and for special
  333.                                         ; code to blast stack back to last
  334.                                         ; QBI frame when we STOP or ctl-Break
  335.                                         ; with this flag set. 
  336.                                         ; Note that when 'set' this flag serves
  337.                                         ; double duty as it contains the value
  338. ; of BP for the most recent QBI frame.
  339.         EXTRN   bcurlevel_QBI:word      ;Only meaningful when fNonQBI_Active
  340.                                         ; is non-zero. Contains the value of
  341.                                         ; b$curlevel which must be restored
  342.                                         ; whenever we blast the stack back to
  343.                                         ; the most recent QBI frame.
  344.         EXTRN   b$cNonQBIFrames:word    ;Set 0 by [re]init code. Incremented
  345.                                         ; whenever non-QBI code is made active,
  346.                                         ; decremented control is returned from
  347.                                         ; such code to QBI. Used because we
  348.                                         ; currently don't allow the user to
  349.                                         ; Edit and then Continue when non-QBI
  350. ; frames are on the stack.
  351.         EXTRN   b$curlevel:word ;A count of procedure call invocations
  352.                                         ; used to determine which string
  353.                                         ; temps should be released when a
  354.                                         ; runtime error occurs.  Reset by
  355.                                         ; runtime for CLEAR/NEW/runtime
  356.                                         ; initialization.
  357.         EXTRN   pGosubLast:word         ;Pointer to last GOSUB frame on the
  358.                                         ; stack. 0 if no GOSUB's are active.
  359.                                         ; Note that when non-zero, should
  360.                                         ; always be the same as SP at BOS.
  361.                                         ; Reset to 0 whenever the stack is
  362.                                         ; reset; modified by GOSUB & RETURN
  363.                                         ; executors.
  364. ife     CONTEXT_ASM
  365.         EXTRN   oRsDupErr:word          ;Error indicator set by PrsMake and
  366.                                         ; MrsMake for LoadFile
  367. endif   ;CONTEXT_ASM
  368. sEnd    DATA
  369. ;**======================================================================**
  370. ;**==           External Interface to Context Mgr Component            ==**
  371. ;**======================================================================**
  372. ife     CONTEXT_ASM     ;don't include these in context.asm
  373. sBegin  RARE
  374.         EXTRN InitContext:NEAR
  375. sEnd    RARE
  376. sBegin  CODE
  377.         EXTRN RsActivateCODE:NEAR
  378. sEnd    CODE
  379. endif   ;ife CONTEXT_ASM
  380. sBegin  CP
  381. ife     CONTEXT_ASM     ;don't include these in context.asm
  382.         EXTRN MrsMake:FAR
  383.         EXTRN MrsDeActivate:NEAR
  384.         EXTRN RsActivate:FAR
  385.         EXTRN RsActivateCP:NEAR
  386.         EXTRN MrsActivate:FAR
  387.         EXTRN MrsActivateCP:NEAR
  388.         EXTRN MrsDiscard:FAR
  389.         EXTRN MrsFind:FAR
  390.         EXTRN PrsFind:FAR
  391.         EXTRN PrsRef:NEAR
  392.         EXTRN PrsMake:FAR
  393. EXTRN PrsDefine:FAR
  394.         EXTRN PrsDeActivate:NEAR
  395.         EXTRN PrsDeActivateFar:FAR
  396.         EXTRN PrsActivate:FAR
  397.         EXTRN PrsActivateCP:NEAR
  398.         EXTRN NextPrsInMrs:FAR
  399.         EXTRN NextTextPrsInMrs:FAR
  400.         EXTRN GetNextPrsInMrs:NEAR
  401. EXTRN GetNextPrs:NEAR
  402.         EXTRN NextMrsFile:FAR
  403. EXTRN NextMrsFile_All:FAR
  404.         EXTRN PrsDiscard:FAR
  405.         EXTRN PrsDiscard1:NEAR
  406.         EXTRN PrsFree:FAR
  407.         EXTRN FreeAllUnrefdPrs:FAR
  408.         EXTRN FieldsOfPrs:NEAR
  409.         EXTRN FieldsOfPrsFar:FAR
  410.         EXTRN SetPrsField:NEAR
  411.         EXTRN OMrsORs:NEAR
  412.         EXTRN PPrsOPrs:NEAR
  413.         EXTRN ForEach:FAR
  414.         EXTRN ForEachCP:NEAR
  415.         EXTRN ForEachTxtTbl:NEAR
  416.         EXTRN ForEachTxtTblInMrs:NEAR
  417.         EXTRN ForEachPrsInPlaceCP:NEAR
  418.         EXTRN ForEachPrsInPlaceCPSav:NEAR
  419. EXTRN OTypeOfTypeCharFar:FAR
  420.         EXTRN ValidORs:NEAR
  421. endif   ;ife CONTEXT_ASM
  422. ife     CONMISC_ASM     ;don't include these in conmisc.asm
  423.         EXTRN NewStmt:FAR
  424.         EXTRN RunInit:FAR
  425.         EXTRN ContReinit:FAR
  426.         EXTRN ContReinitStat:FAR
  427.         EXTRN ClearStmt:FAR
  428.         EXTRN CantCont:FAR
  429.         EXTRN VarDealloc:NEAR
  430.         EXTRN AdjustITable:FAR
  431.         EXTRN ResetData:NEAR
  432.         EXTRN NextQBI_Frame:FAR
  433. EXTRN ActiveORs_Frame:FAR
  434. EXTRN FindORsFrame:NEAR
  435. endif
  436. ife     RSALPHA_ASM
  437. EXTRN AlphaBuildORs:FAR
  438.         EXTRN ORsOfAlpha:FAR
  439.         EXTRN NextAlphaPrs:FAR
  440.         EXTRN AlphaORsFree:FAR
  441. endif   ;RSALPHA_ASM
  442. sEnd    CP
  443. sBegin SCAN
  444. ife CONTEXT_ASM ; don't include these in context.asm
  445. EXTRN PPrsOPrsSCAN:NEAR 
  446. endif ; ife CONTEXT_ASM
  447. ife CONMISC_ASM ; don't include these in conmisc.asm
  448. EXTRN FCanCont:NEAR
  449. endif ; ife CONMISC_ASM
  450. sEnd SCAN
  451. ;**======================================================================**
  452. ;**==           Non-RELEASE and DEBUG routines, in condebug.c          ==**
  453. ;**======================================================================**