Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #ifndef _ASMPARS_H
  2. #define _ASMPARS_H
  3. /* asmpars.h */
  4. /*****************************************************************************/
  5. /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
  6. /*                                                                           */
  7. /* AS-Portierung                                                             */
  8. /*                                                                           */
  9. /* Verwaltung von Symbolen und das ganze Drumherum...                        */
  10. /*                                                                           */
  11. /*****************************************************************************/
  12.  
  13. #include <stddef.h>
  14.  
  15. #include "symbolsize.h"
  16. #include "symflags.h"
  17. #include "tempresult.h"
  18. #include "intformat.h"
  19. #include "lstmacroexp.h"
  20. #include "errmsg.h"
  21. #include "addrspace.h"
  22. #include "stringlists.h"
  23.  
  24. typedef enum
  25. {
  26.   UInt0
  27.  ,UInt1
  28.  ,UInt2
  29.  ,UInt3
  30.  ,SInt4    , UInt4   , Int4
  31.  ,SInt5    , UInt5   , Int5
  32.  ,SInt6    , UInt6   , Int6
  33.  ,SInt7    , UInt7
  34.  ,SInt8    , UInt8   , Int8
  35.  ,SInt9    , UInt9
  36.  ,UInt10   , Int10
  37.  ,UInt11
  38.  ,UInt12   , Int12
  39.  ,UInt13
  40.  ,UInt14   , Int14
  41.  ,SInt15   , UInt15  , Int15
  42.  ,SInt16   , UInt16  , Int16
  43.  ,UInt17
  44.  ,UInt18
  45.  ,UInt19
  46.  ,SInt20   , UInt20  , Int20
  47.  ,UInt21
  48.  ,UInt22
  49.  ,UInt23
  50.  ,SInt24   , UInt24  , Int24
  51.  ,SInt30   , UInt30  , Int30
  52.  ,SInt32   , UInt32  , Int32
  53. #ifdef HAS64
  54.  ,SInt64   , UInt64  , Int64
  55. #endif
  56.  ,IntTypeCnt
  57. } IntType;
  58.  
  59. #ifdef __cplusplus
  60. # include "cppops.h"
  61. DefCPPOps_Enum(IntType)
  62. #endif
  63.  
  64. #ifdef HAS64
  65. #define LargeUIntType UInt64
  66. #define LargeSIntType SInt64
  67. #define LargeIntType Int64
  68. #else
  69. #define LargeUIntType UInt32
  70. #define LargeSIntType SInt32
  71. #define LargeIntType Int32
  72. #endif
  73.  
  74. typedef struct
  75. {
  76.   Word SignAndWidth;
  77.   LargeWord Mask;
  78.   LargeInt Min, Max;
  79. } tIntTypeDef;
  80.  
  81. typedef enum
  82. {
  83.   e_symbol_source_none,
  84.   e_symbol_source_label,
  85.   e_symbol_source_define
  86. } as_symbol_source_t;
  87.  
  88. typedef enum
  89. {
  90.   e_eval_flag_none = 0,
  91.   e_eval_flag_undefined_is_unknown = 1 << 0
  92. } as_eval_flags_t;
  93. #ifdef __cplusplus
  94. DefCPPOps_Mask(as_eval_flags_t)
  95. #endif
  96.  
  97. typedef enum
  98. {
  99.   e_symbol_entry_flag_defined = 1 << 0,
  100.   e_symbol_entry_flag_used = 1 << 1,
  101.   e_symbol_entry_flag_changed = 1 << 2,
  102.   e_symbol_entry_flag_changeable = 1 << 3
  103. } as_symbol_entry_flags_t;
  104. #ifdef __cplusplus
  105. DefCPPOps_Mask(as_symbol_entry_flags_t)
  106. #endif
  107.  
  108. typedef struct _TFunction
  109. {
  110.   struct _TFunction *Next;
  111.   Byte ArguCnt;
  112.   StringPtr Name, Definition;
  113.   StringList p_arg_list;
  114. } TFunction, *PFunction;
  115.  
  116. typedef struct sEvalResult
  117. {
  118.   Boolean OK;
  119.   tSymbolFlags Flags;
  120.   unsigned AddrSpaceMask; /* Welche Adressraeume genutzt ? */
  121.   tSymbolSize DataSize;
  122. } tEvalResult;
  123.  
  124. struct as_eval_cb_data;
  125. typedef enum { e_eval_none, e_eval_fail, e_eval_ok } as_eval_cb_rtn_t;
  126. typedef enum { e_operator, e_function } as_eval_cb_data_stack_elem_t;
  127. #define DECLARE_AS_EVAL_CB(fnc) as_eval_cb_rtn_t fnc(struct as_eval_cb_data *p_data, struct sStrComp *p_arg, TempResult *p_res)
  128. typedef DECLARE_AS_EVAL_CB((*as_eval_cb_t));
  129. typedef struct as_eval_cb_data_stack
  130. {
  131.   struct as_eval_cb_data_stack *p_next;
  132.   as_eval_cb_data_stack_elem_t type;
  133.   const char *p_ident;
  134.   int arg_index;
  135. } as_eval_cb_data_stack_t;
  136. struct as_operator;
  137. typedef struct as_eval_cb_data
  138. {
  139.   as_eval_cb_t callback;
  140.   const struct as_operator *p_operators;
  141.   as_eval_cb_data_stack_t *p_stack;
  142.   TempResult *p_other_arg;
  143. } as_eval_cb_data_t;
  144.  
  145. struct sStrComp;
  146. struct as_nonz_dynstr;
  147. struct sRelocEntry;
  148. struct sSymbolEntry;
  149. struct sStringRec;
  150.  
  151. extern tIntTypeDef IntTypeDefs[IntTypeCnt];
  152. extern LongInt MomLocHandle;
  153. extern LongInt TmpSymCounter,
  154.                FwdSymCounter,
  155.                BackSymCounter;
  156. extern char TmpSymCounterVal[10];
  157. extern LongInt LocHandleCnt;
  158. extern LongInt MomLocHandle;
  159.  
  160.  
  161. extern void AsmParsInit(void);
  162.  
  163. extern void InitTmpSymbols(void);
  164.  
  165. extern Boolean SingleBit(LargeInt Inp, LargeInt *Erg);
  166.  
  167.  
  168. extern IntType GetSmallestUIntType(LargeWord MaxValue);
  169.  
  170. extern IntType GetUIntTypeByBits(unsigned Bits);
  171.  
  172. extern tErrorNum NonZString2Int(const struct as_nonz_dynstr *p_str, LargeInt *p_result);
  173.  
  174. extern Boolean Int2NonZString(struct as_nonz_dynstr *p_str, LargeInt Src);
  175.  
  176. extern int TempResultToInt(TempResult *pResult);
  177.  
  178. extern Boolean MultiCharToInt(TempResult *pResult, unsigned MaxLen);
  179.  
  180.  
  181. extern Boolean RangeCheck(LargeInt Wert, IntType Typ);
  182.  
  183. extern Boolean ChkRangeByType(LargeInt value, IntType type, const struct sStrComp *p_comp);
  184. extern Boolean ChkRangeWarnByType(LargeInt value, IntType type, const struct sStrComp *p_comp);
  185.  
  186.  
  187. extern Boolean IdentifySection(const struct sStrComp *pName, LongInt *Erg);
  188.  
  189.  
  190. extern struct sStrComp *ExpandStrSymbol(struct sStrComp *p_exp_comp, const struct sStrComp *pSrc, Boolean convert_upper);
  191.  
  192. extern void ChangeSymbol(struct sSymbolEntry *pEntry, LargeInt Value);
  193.  
  194. extern struct sSymbolEntry *EnterIntSymbolWithFlags(const struct sStrComp *pName, LargeInt Wert, as_addrspace_t addrspace, Boolean MayChange, tSymbolFlags Flags);
  195.  
  196. #define EnterIntSymbol(pName, Wert, addrspace, MayChange) EnterIntSymbolWithFlags(pName, Wert, addrspace, MayChange, eSymbolFlag_None)
  197.  
  198. extern void EnterExtSymbol(const struct sStrComp *pName, LargeInt Wert, as_addrspace_t addrspace, Boolean MayChange);
  199.  
  200. extern struct sSymbolEntry *EnterRelSymbol(const struct sStrComp *pName, LargeInt Wert, as_addrspace_t addrspace, Boolean MayChange);
  201.  
  202. extern void EnterFloatSymbol(const struct sStrComp *pName, as_float_t Wert, Boolean MayChange);
  203.  
  204. extern void EnterStringSymbol(const struct sStrComp *pName, const char *pValue, Boolean MayChange);
  205.  
  206. extern void EnterNonZStringSymbolWithFlags(const struct sStrComp *pName, const struct as_nonz_dynstr *p_value, Boolean MayChange, tSymbolFlags Flags);
  207.  
  208. extern void EnterRegSymbol(const struct sStrComp *pName, const tRegDescr *Value, tSymbolSize Size, Boolean MayChange, Boolean AddList);
  209.  
  210. #define EnterNonZStringSymbol(pName, pValue, MayChange) EnterNonZStringSymbolWithFlags(pName, pValue, MayChange, eSymbolFlag_None)
  211.  
  212. extern void LookupSymbol(const struct sStrComp *pName, TempResult *pValue, Boolean WantRelocs, TempType ReqType,
  213.                          as_eval_flags_t eval_flags, as_symbol_entry_flags_t *p_symbol_entry_flags);
  214.  
  215. extern void PrintSymbolList(void);
  216.  
  217. extern void PrintDebSymbols(FILE *f);
  218.  
  219. extern void PrintNoISymbols(FILE *f);
  220.  
  221. extern void PrintSymbolTree(void);
  222.  
  223. extern void ClearSymbolList(void);
  224.  
  225. extern void ResetSymbolDefines(void);
  226.  
  227. extern void PrintSymbolDepth(void);
  228.  
  229.  
  230. extern void EvalResultClear(tEvalResult *pResult);
  231.  
  232. extern void as_eval_cb_data_ini(struct as_eval_cb_data *p_data, as_eval_cb_t cb);
  233. extern void as_dump_eval_cb_data_stack(const as_eval_cb_data_stack_t *p_stack);
  234. extern unsigned as_eval_cb_data_stack_depth(const as_eval_cb_data_stack_t *p_stack);
  235. extern Boolean as_eval_cb_data_stack_plain_add(const as_eval_cb_data_stack_t *p_stack);
  236. extern Boolean as_eval_cb_data_stackelem_mul(const as_eval_cb_data_stack_t *p_stack);
  237.  
  238. extern void SetSymbolOrStructElemSize(const struct sStrComp *pName, tSymbolSize Size);
  239.  
  240. extern Boolean IsSymbolDefined(const struct sStrComp *pName);
  241.  
  242. extern Boolean IsSymbolUsed(const struct sStrComp *pName);
  243.  
  244. extern Integer GetSymbolType(const struct sStrComp *pName);
  245.  
  246. extern void EvalExpression(const char *pExpr, TempResult *Erg);
  247.  
  248. extern void EvalStrExpression(const struct sStrComp *pExpr, TempResult *pErg);
  249. extern void EvalStrExpressionWithCallback(const struct sStrComp *pExpr, TempResult *pErg, as_eval_flags_t eval_flags, as_eval_cb_data_t *p_callback_data);
  250.  
  251. extern void SetIntConstModeByMask(LongWord Mask);
  252. extern void SetIntConstMode(tIntConstMode Mode);
  253. extern void SetIntConstRelaxedMode(Boolean NewRelaxedMode);
  254.  
  255. extern LargeInt EvalStrIntExpression(const struct sStrComp *pExpr, IntType Type, Boolean *pResult);
  256. extern LargeInt EvalStrIntExpressionWithFlags(const struct sStrComp *pExpr, IntType Type, Boolean *pResult, tSymbolFlags *pFlags);
  257. extern LargeInt EvalStrIntExpressionWithResult(const struct sStrComp *pExpr, IntType Type, struct sEvalResult *pResult);
  258. extern LargeInt EvalStrIntExprWithResultAndCallback(const struct sStrComp *pExpr, IntType Type, struct sEvalResult *pResult, as_eval_cb_data_t *p_callback_data);
  259. extern LargeInt EvalStrIntExpressionOffs(const struct sStrComp *pExpr, int Offset, IntType Type, Boolean *pResult);
  260. extern LargeInt EvalStrIntExpressionOffsWithFlags(const struct sStrComp *pExpr, int Offset, IntType Type, Boolean *pResult, tSymbolFlags *pFlags);
  261. extern LargeInt EvalStrIntExpressionOffsWithResult(const struct sStrComp *pExpr, int Offset, IntType Type, struct sEvalResult *pResult);
  262. extern LargeInt EvalStrIntExprOffsWithResultAndCallback(const struct sStrComp *pExpr, int Offset, IntType Type, struct sEvalResult *pResult, as_eval_cb_data_t *p_callback_data);
  263.  
  264. extern as_float_t EvalStrFloatExpressionWithResult(const struct sStrComp *pExpr, struct sEvalResult *pResult);
  265. extern as_float_t EvalStrFloatExpression(const struct sStrComp *pExpr, Boolean *pResult);
  266.  
  267. extern void EvalStrStringExpressionWithResult(const struct sStrComp *pExpr, struct sEvalResult *pResult, char *pEvalResult);
  268. extern void EvalStrStringExpression(const struct sStrComp *pExpr, Boolean *pResult, char *pEvalResult);
  269.  
  270. extern tErrorNum EvalStrRegExpressionWithResult(const struct sStrComp *pExpr, struct sRegDescr *pResult, struct sEvalResult *pEvalResult);
  271. typedef enum { eIsNoReg, eIsReg, eRegAbort } tRegEvalResult;
  272. extern tRegEvalResult EvalStrRegExpressionAsOperand(const struct sStrComp *pArg, struct sRegDescr *pResult, struct sEvalResult *pEvalResult, tSymbolSize ReqSize, Boolean MustBeReg);
  273.  
  274.  
  275. extern Boolean PushSymbol(const struct sStrComp *pSymName, const struct sStrComp *pStackName);
  276.  
  277. extern Boolean PopSymbol(const struct sStrComp *pSymName, const struct sStrComp *pStackName);
  278.  
  279. extern void ClearStacks(void);
  280.  
  281.  
  282. extern void EnterFunction(const struct sStrComp *pComp, const char *FDefinition, Byte NewCnt, StringList *p_arg_list);
  283.  
  284. extern PFunction FindFunction(const char *Name);
  285.  
  286. extern void PrintFunctionList(void);
  287.  
  288. extern void ClearFunctionList(void);
  289.  
  290.  
  291. extern void AddDefSymbol(char *Name, TempResult *Value);
  292.  
  293. extern void RemoveDefSymbol(char *Name);
  294.  
  295. extern void CopyDefSymbols(void);
  296.  
  297. extern const TempResult *FindDefSymbol(const char *pName);
  298.  
  299. extern void PrintCrossList(void);
  300.  
  301. extern void ClearCrossList(void);
  302.  
  303.  
  304. extern LongInt GetSectionHandle(const char *SName, Boolean AddEmpt, LongInt Parent);
  305.  
  306. extern const char *GetSectionName(LongInt Handle);
  307.  
  308. extern void SetMomSection(LongInt Handle);
  309.  
  310. extern void AddSectionUsage(LongInt Start, LongInt Length);
  311.  
  312. extern void ClearSectionUsage(void);
  313.  
  314. extern void PrintSectionList(void);
  315.  
  316. extern void PrintDebSections(FILE *f);
  317.  
  318. extern void ClearSectionList(void);
  319.  
  320.  
  321. extern void SetFlag(Boolean *Flag, const char *Name, Boolean Wert);
  322.  
  323. extern LongInt GetLocHandle(void);
  324.  
  325. extern void PushLocHandle(LongInt NewLoc);
  326.  
  327. extern void PopLocHandle(void);
  328.  
  329. extern void ClearLocStack(void);
  330.  
  331.  
  332. extern void PrintRegDefs(void);
  333.  
  334. extern PTransTable FindCodepage(const char *p_name, PTransTable p_source);
  335.  
  336. extern void ClearCodepages(void);
  337.  
  338. extern void PrintCodepages(void);
  339.  
  340.  
  341. extern void asmpars_init(void);
  342.  
  343. #endif /* _ASMPARS_H */
  344.