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 "lstmacroexp.h"
19 #include "errmsg.h"
20 
21 typedef enum
22 {
23   UInt1    ,
24   UInt2    ,
25   UInt3    ,
26   SInt4    , UInt4   , Int4    ,
27   SInt5    , UInt5   , Int5    ,
28   SInt6    , UInt6   ,
29   SInt7    , UInt7   ,
30   SInt8    , UInt8   , Int8    ,
31   SInt9    , UInt9    ,
32   UInt10   , Int10   ,
33   UInt11   ,
34   UInt12   , Int12   ,
35   UInt13   ,
36   UInt14   , Int14   ,
37   SInt15   , UInt15  ,
38   SInt16   , UInt16  , Int16   ,
39   UInt17   ,
40   UInt18   ,
41   UInt19   ,
42   SInt20   , UInt20  , Int20   ,
43   UInt21   ,
44   UInt22   ,
45   UInt23   ,
46   SInt24   , UInt24  , Int24   ,
47   SInt32   , UInt32  , Int32   ,
48 #ifdef HAS64
49   SInt64   , UInt64  , Int64   ,
50 #endif
51   IntTypeCnt
52 } IntType;
53 
54 #ifdef __cplusplus
55 # include "cppops.h"
56 DefCPPOps_Enum(IntType)
57 #endif
58 
59 #ifdef HAS64
60 #define LargeWordType UInt64
61 #else
62 #define LargeWordType UInt32
63 #endif
64 
65 typedef struct
66 {
67   Word SignAndWidth;
68   LargeWord Mask;
69   LargeInt Min, Max;
70 } tIntTypeDef;
71 
72 typedef enum
73 {
74   Float32,
75   Float64,
76   Float80,
77   FloatDec,
78   FloatCo,
79   Float16,
80   FloatTypeCnt
81 } FloatType;
82 
83 typedef struct _TFunction
84 {
85   struct _TFunction *Next;
86   Byte ArguCnt;
87   StringPtr Name, Definition;
88 } TFunction, *PFunction;
89 
90 typedef struct sEvalResult
91 {
92   Boolean OK;
93   tSymbolFlags Flags;
94   unsigned AddrSpaceMask; /* Welche Adressraeume genutzt ? */
95   tSymbolSize DataSize;
96 } tEvalResult;
97 
98 struct sStrComp;
99 struct sRelocEntry;
100 struct sSymbolEntry;
101 
102 extern tIntTypeDef IntTypeDefs[IntTypeCnt];
103 extern LongInt MomLocHandle;
104 extern LongInt TmpSymCounter,
105                FwdSymCounter,
106                BackSymCounter;
107 extern char TmpSymCounterVal[10];
108 extern LongInt LocHandleCnt;
109 extern LongInt MomLocHandle;
110 
111 
112 extern void AsmParsInit(void);
113 
114 extern void InitTmpSymbols(void);
115 
116 extern Boolean SingleBit(LargeInt Inp, LargeInt *Erg);
117 
118 
119 extern IntType GetSmallestUIntType(LargeWord MaxValue);
120 
121 
122 struct sDynString;
123 extern LargeInt DynString2Int(const struct sDynString *pDynString);
124 
125 extern Boolean Int2DynString(struct sDynString *pDynString, LargeInt Src);
126 
127 extern int TempResultToInt(TempResult *pResult);
128 
129 extern Boolean MultiCharToInt(TempResult *pResult, unsigned MaxLen);
130 
131 
132 extern Boolean RangeCheck(LargeInt Wert, IntType Typ);
133 
134 extern Boolean FloatRangeCheck(Double Wert, FloatType Typ);
135 
136 
137 extern Boolean IdentifySection(const struct sStrComp *pName, LongInt *Erg);
138 
139 
140 extern Boolean ExpandStrSymbol(char *pDest, size_t DestSize, const struct sStrComp *pSrc);
141 
142 extern void ChangeSymbol(struct sSymbolEntry *pEntry, LargeInt Value);
143 
144 extern struct sSymbolEntry *EnterIntSymbolWithFlags(const struct sStrComp *pName, LargeInt Wert, Byte Typ, Boolean MayChange, tSymbolFlags Flags);
145 
146 #define EnterIntSymbol(pName, Wert, Typ, MayChange) EnterIntSymbolWithFlags(pName, Wert, Typ, MayChange, eSymbolFlag_None)
147 
148 extern void EnterExtSymbol(const struct sStrComp *pName, LargeInt Wert, Byte Typ, Boolean MayChange);
149 
150 extern struct sSymbolEntry *EnterRelSymbol(const struct sStrComp *pName, LargeInt Wert, Byte Typ, Boolean MayChange);
151 
152 extern void EnterFloatSymbol(const struct sStrComp *pName, Double Wert, Boolean MayChange);
153 
154 extern void EnterStringSymbol(const struct sStrComp *pName, const char *pValue, Boolean MayChange);
155 
156 extern void EnterDynStringSymbolWithFlags(const struct sStrComp *pName, const tDynString *pValue, Boolean MayChange, tSymbolFlags Flags);
157 
158 extern void EnterRegSymbol(const struct sStrComp *pName, const tRegDescr *Value, tSymbolSize Size, Boolean MayChange, Boolean AddList);
159 
160 #define EnterDynStringSymbol(pName, pValue, MayChange) EnterDynStringSymbolWithFlags(pName, pValue, MayChange, eSymbolFlag_None)
161 
162 extern void LookupSymbol(const struct sStrComp *pName, TempResult *pValue, Boolean WantRelocs, TempType ReqType);
163 
164 extern void PrintSymbolList(void);
165 
166 extern void PrintDebSymbols(FILE *f);
167 
168 extern void PrintNoISymbols(FILE *f);
169 
170 extern void PrintSymbolTree(void);
171 
172 extern void ClearSymbolList(void);
173 
174 extern void ResetSymbolDefines(void);
175 
176 extern void PrintSymbolDepth(void);
177 
178 
179 extern void EvalResultClear(tEvalResult *pResult);
180 
181 
182 extern void SetSymbolOrStructElemSize(const struct sStrComp *pName, tSymbolSize Size);
183 
184 extern ShortInt GetSymbolSize(const struct sStrComp *pName);
185 
186 extern Boolean IsSymbolDefined(const struct sStrComp *pName);
187 
188 extern Boolean IsSymbolUsed(const struct sStrComp *pName);
189 
190 extern Boolean IsSymbolChangeable(const struct sStrComp *pName);
191 
192 extern Integer GetSymbolType(const struct sStrComp *pName);
193 
194 extern void EvalExpression(const char *pExpr, TempResult *Erg);
195 
196 extern void EvalStrExpression(const struct sStrComp *pExpr, TempResult *pErg);
197 
198 extern LargeInt EvalStrIntExpression(const struct sStrComp *pExpr, IntType Type, Boolean *pResult);
199 extern LargeInt EvalStrIntExpressionWithFlags(const struct sStrComp *pExpr, IntType Type, Boolean *pResult, tSymbolFlags *pFlags);
200 extern LargeInt EvalStrIntExpressionWithResult(const struct sStrComp *pExpr, IntType Type, struct sEvalResult *pResult);
201 extern LargeInt EvalStrIntExpressionOffs(const struct sStrComp *pExpr, int Offset, IntType Type, Boolean *pResult);
202 extern LargeInt EvalStrIntExpressionOffsWithFlags(const struct sStrComp *pExpr, int Offset, IntType Type, Boolean *pResult, tSymbolFlags *pFlags);
203 extern LargeInt EvalStrIntExpressionOffsWithResult(const struct sStrComp *pExpr, int Offset, IntType Type, struct sEvalResult *pResult);
204 
205 extern Double EvalStrFloatExpressionWithResult(const struct sStrComp *pExpr, FloatType Typ, struct sEvalResult *pResult);
206 extern Double EvalStrFloatExpression(const struct sStrComp *pExpr, FloatType Typ, Boolean *pResult);
207 
208 extern void EvalStrStringExpressionWithResult(const struct sStrComp *pExpr, struct sEvalResult *pResult, char *pEvalResult);
209 extern void EvalStrStringExpression(const struct sStrComp *pExpr, Boolean *pResult, char *pEvalResult);
210 
211 extern tErrorNum EvalStrRegExpressionWithResult(const struct sStrComp *pExpr, struct sRegDescr *pResult, struct sEvalResult *pEvalResult);
212 typedef enum { eIsNoReg, eIsReg, eRegAbort } tRegEvalResult;
213 extern tRegEvalResult EvalStrRegExpressionAsOperand(const struct sStrComp *pArg, struct sRegDescr *pResult, struct sEvalResult *pEvalResult, tSymbolSize ReqSize, Boolean MustBeReg);
214 
215 extern const char *GetIntelSuffix(unsigned Radix);
216 
217 
218 extern Boolean PushSymbol(const struct sStrComp *pSymName, const struct sStrComp *pStackName);
219 
220 extern Boolean PopSymbol(const struct sStrComp *pSymName, const struct sStrComp *pStackName);
221 
222 extern void ClearStacks(void);
223 
224 
225 extern void EnterFunction(const struct sStrComp *pComp, char *FDefinition, Byte NewCnt);
226 
227 extern PFunction FindFunction(const char *Name);
228 
229 extern void PrintFunctionList(void);
230 
231 extern void ClearFunctionList(void);
232 
233 
234 extern void AddDefSymbol(char *Name, TempResult *Value);
235 
236 extern void RemoveDefSymbol(char *Name);
237 
238 extern void CopyDefSymbols(void);
239 
240 extern const TempResult *FindDefSymbol(const char *pName);
241 
242 extern void PrintCrossList(void);
243 
244 extern void ClearCrossList(void);
245 
246 
247 extern LongInt GetSectionHandle(char *SName_O, Boolean AddEmpt, LongInt Parent);
248 
249 extern const char *GetSectionName(LongInt Handle);
250 
251 extern void SetMomSection(LongInt Handle);
252 
253 extern void AddSectionUsage(LongInt Start, LongInt Length);
254 
255 extern void ClearSectionUsage(void);
256 
257 extern void PrintSectionList(void);
258 
259 extern void PrintDebSections(FILE *f);
260 
261 extern void ClearSectionList(void);
262 
263 
264 extern void SetFlag(Boolean *Flag, const char *Name, Boolean Wert);
265 
266 extern LongInt GetLocHandle(void);
267 
268 extern void PushLocHandle(LongInt NewLoc);
269 
270 extern void PopLocHandle(void);
271 
272 extern void ClearLocStack(void);
273 
274 
275 extern void PrintRegDefs(void);
276 
277 
278 extern void ClearCodepages(void);
279 
280 extern void PrintCodepages(void);
281 
282 
283 extern void asmpars_init(void);
284 
285 #endif /* _ASMPARS_H */
286