1 /* asmdef.c */
2 /*****************************************************************************/
3 /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only */
4 /* */
5 /* AS-Portierung */
6 /* */
7 /* global benutzte Variablen */
8 /* */
9 /*****************************************************************************/
10
11 #include "stdinc.h"
12
13 #include <errno.h>
14
15 #include "strutil.h"
16 #include "stringlists.h"
17 #include "chunks.h"
18
19 #include "asmdef.h"
20 #include "asmsub.h"
21 #include "errmsg.h"
22
23 char SrcSuffix[] = ".asm"; /* Standardendungen: Hauptdatei */
24 char IncSuffix[] = ".inc"; /* Includedatei */
25 char PrgSuffix[] = ".p"; /* Programmdatei */
26 char LstSuffix[] = ".lst"; /* Listingdatei */
27 char MacSuffix[] = ".mac"; /* Makroausgabe */
28 char PreSuffix[] = ".i"; /* Ausgabe Makroprozessor */
29 char LogSuffix[] = ".log"; /* Fehlerdatei */
30 char MapSuffix[] = ".map"; /* Debug-Info/Map-Format */
31 char OBJSuffix[] = ".obj";
32
33 const char *EnvName = "ASCMD"; /* Environment-Variable fuer Default-
34 Parameter */
35
36 const char *SegNames[PCMax + 2] =
37 {
38 "NOTHING", "CODE", "DATA", "IDATA", "XDATA", "YDATA",
39 "BITDATA", "IO", "REG", "ROMDATA", "EEDATA", "STRUCT"
40 };
41 char SegShorts[PCMax + 2] =
42 {
43 '-','C','D','I','X','Y','B','P','R','O','E','S'
44 };
45
46 StringPtr SourceFile; /* Hauptquelldatei */
47
48 StringPtr CursUp; /* " " Cursor hoch */
49
50 LargeWord *PCs; /* Programmzaehler */
51 Boolean RelSegs; /* relokatibles Segment ? */
52 LargeWord StartAdr; /* Programmstartadresse */
53 Boolean StartAdrPresent; /* " definiert? */
54 LargeWord AfterBSRAddr; /* address right behind last BSR */
55 LargeWord *Phases; /* Verschiebungen */
56 Word Grans[StructSeg + 1]; /* Groesse der Adressierungselemente */
57 Word ListGrans[StructSeg + 1]; /* Wortgroesse im Listing */
58 ChunkList SegChunks[StructSeg + 1]; /* Belegungen */
59 Integer ActPC; /* gewaehlter Programmzaehler */
60 Boolean PCsUsed[StructSeg + 1]; /* PCs bereits initialisiert ? */
61 LargeWord *SegInits; /* Segmentstartwerte */
62 LargeWord *SegLimits; /* Segmentgrenzwerte */
63 LongInt ValidSegs; /* erlaubte Segmente */
64 Boolean ENDOccured; /* END-Statement aufgetreten ? */
65 Boolean Retracted; /* Codes zurueckgenommen ? */
66 Boolean ListToStdout, ListToNull; /* Listing auf Konsole/Nulldevice ? */
67
68 unsigned ASSUMERecCnt;
69 const ASSUMERec *pASSUMERecs;
70 void (*pASSUMEOverride)(void);
71
72 Integer PassNo; /* Durchlaufsnummer */
73 Integer JmpErrors; /* Anzahl fraglicher Sprungfehler */
74 Boolean ThrowErrors; /* Fehler verwerfen bei Repass ? */
75 LongWord MaxErrors; /* terminate upon n errors? */
76 Boolean TreatWarningsAsErrors; /* treat warnings like erros? */
77 Boolean Repass; /* noch ein Durchlauf erforderlich */
78 Byte MaxSymPass; /* Pass, nach dem Symbole definiert sein muessen */
79 Byte ShareMode; /* 0=kein SHARED,1=Pascal-,2=C-Datei, 3=ASM-Datei */
80 DebugType DebugMode; /* Ausgabeformat Debug-Datei */
81 Word NoICEMask; /* which symbols to use in NoICE dbg file */
82 Byte ListMode; /* 0=kein Listing,1=Konsole,2=auf Datei */
83 Byte ListOn; /* Listing erzeugen ? */
84 Boolean MakeUseList; /* Belegungsliste ? */
85 Boolean MakeCrossList; /* Querverweisliste ? */
86 Boolean MakeSectionList; /* Sektionsliste ? */
87 Boolean MakeIncludeList; /* Includeliste ? */
88 Boolean RelaxedMode, DefRelaxedMode; /* alle Integer-Syntaxen zulassen ? */
89 Word ListMask; /* Listingmaske */
90 ShortInt ExtendErrors; /* erweiterte Fehlermeldungen */
91 Integer EnumSegment; /* ENUM state & config */
92 LongInt EnumIncrement, EnumCurrentValue;
93 Boolean NumericErrors; /* Fehlermeldungen mit Nummer */
94 Boolean CodeOutput; /* Code erzeugen */
95 Boolean MacProOutput; /* Makroprozessorausgabe schreiben */
96 Boolean MacroOutput; /* gelesene Makros schreiben */
97 Boolean QuietMode; /* keine Meldungen */
98 Boolean HardRanges; /* Bereichsfehler echte Fehler ? */
99 const char *DivideChars; /* Trennzeichen fuer Parameter. Inhalt Read Only! */
100 Boolean HasAttrs; /* Opcode hat Attribut */
101 const char *AttrChars; /* Zeichen, mit denen Attribut abgetrennt wird */
102 Boolean MsgIfRepass; /* Meldungen, falls neuer Pass erforderlich */
103 Integer PassNoForMessage; /* falls ja: ab welchem Pass ? */
104 Boolean CaseSensitive; /* Gross/Kleinschreibung unterscheiden ? */
105 LongInt NestMax; /* max. nesting level of a macro */
106 Boolean GNUErrors; /* GNU-error-style messages ? */
107
108 FILE *PrgFile = NULL; /* Codedatei */
109
110 StringPtr ErrorPath, ErrorName; /* Ausgabedatei Fehlermeldungen */
111 StringPtr OutName; /* Name Code-Datei */
112 StringPtr CurrFileName; /* mom. bearbeitete Datei */
113 LongInt MomLineCounter; /* Position in mom. Datei */
114 LongInt CurrLine; /* virtuelle Position */
115 LongInt LineSum; /* Gesamtzahl Quellzeilen */
116 LongInt MacLineSum; /* inkl. Makroexpansion */
117
118 LongInt NOPCode; /* Maschinenbefehl NOP zum Stopfen */
119 Boolean TurnWords; /* TRUE = Motorola-Wortformat */
120 /* FALSE = Intel-Wortformat */
121 Byte HeaderID; /* Kennbyte des Codeheaders */
122 const char *PCSymbol; /* Symbol, womit Programmzaehler erreicht wird. Inhalt Read Only! */
123 TConstMode ConstMode;
124 Boolean ConstModeWeirdNoTerm;
125 Boolean (*SetIsOccupiedFnc)(void); /* TRUE: SET instr, to be parsed by code generator */
126 Boolean SwitchIsOccupied, /* TRUE: SWITCH/PAGE/SHIFT ist Prozessorbefehl */
127 PageIsOccupied,
128 ShiftIsOccupied;
129 #ifdef __PROTOS__
130 Boolean (*DecodeAttrPart)(void); /* dissect attribute of instruction */
131 void (*MakeCode)(void); /* Codeerzeugungsprozedur */
132 Boolean (*ChkPC)(LargeWord Addr); /* ueberprueft Codelaengenueberschreitungen */
133 Boolean (*IsDef)(void); /* ist Label nicht als solches zu werten ? */
134 void (*SwitchFrom)(void) = NULL; /* bevor von einer CPU weggeschaltet wird */
135 void (*InternSymbol)(char *Asc, TempResult *Erg); /* vordefinierte Symbole ? */
136 #else
137 Boolean (*DecodeAttrPart)();
138 void (*MakeCode)();
139 Boolean (*ChkPC)();
140 Boolean (*IsDef)();
141 void (*SwitchFrom)();
142 void (*InternSymbol)();
143 #endif
144 DissectBitProc DissectBit;
145 DissectRegProc DissectReg;
146 tQualifyQuoteFnc QualifyQuote;
147
148 StringPtr IncludeList; /* Suchpfade fuer Includedateien */
149 Integer IncDepth, NextIncDepth; /* Verschachtelungstiefe INCLUDEs */
150 FILE *ErrorFile = NULL; /* Fehlerausgabe */
151 FILE *LstFile = NULL; /* Listdatei */
152 FILE *ShareFile = NULL; /* Sharefile */
153 FILE *MacProFile = NULL; /* Makroprozessorausgabe */
154 FILE *MacroFile = NULL; /* Ausgabedatei Makroliste */
155 Boolean InMacroFlag; /* momentan wird Makro expandiert */
156 StringPtr LstName; /* Name der Listdatei */
157 StringPtr MacroName, MacProName;
158 tLstMacroExp DoLst, NextDoLst; /* Listing an */
159 StringPtr ShareName; /* Name des Sharefiles */
160
161 CPUVar MomCPU, MomVirtCPU; /* definierter/vorgegaukelter Prozessortyp */
162 StringPtr MomCPUArgs; /* Arguments for Current Processor Type */
163 char DefCPU[20]; /* per Kommandozeile vorgegebene CPU */
164 char MomCPUIdent[20]; /* dessen Name in ASCII */
165
166 Boolean FPUAvail; /* Koprozessor erlaubt ? */
167 Boolean DoPadding; /* auf gerade Byte-Zahl ausrichten ? */
168 Boolean Packing; /* gepackte Ablage ? */
169 Boolean SupAllowed; /* Supervisormode freigegeben */
170 Boolean Maximum; /* CPU nicht kastriert */
171 Boolean DoBranchExt; /* Spruenge automatisch verlaengern */
172
173 int RadixBase; /* Default-Zahlensystem im Formelparser*/
174 int OutRadixBase; /* dito fuer Ausgabe */
175 int ListRadixBase; /* ditto for listing */
176
177 tStrComp *ArgStr; /* Komponenten der Zeile */
178 StringPtr pLOpPart;
179 tStrComp LabPart, CommPart, ArgPart, OpPart, AttrPart;
180 char AttrSplit;
181 int ArgCnt; /* Argumentzahl */
182 int AllocArgCnt;
183 StringPtr OneLine; /* eingelesene Zeile */
184 #ifdef PROFILE_MEMO
185 unsigned NumMemo;
186 unsigned long NumMemoCnt, NumMemoSum;
187 #endif
188
189 Byte LstCounter; /* Zeilenzaehler fuer automatischen Umbruch */
190 Word PageCounter[ChapMax + 1]; /* hierarchische Seitenzaehler */
191 Byte ChapDepth; /* momentane Kapitelverschachtelung */
192 StringPtr ListLine; /* alternative Ausgabe vor Listing fuer EQU */
193 Byte PageLength, PageWidth; /* Seitenlaenge/breite in Zeilen/Spalten */
194 tLstMacroExpMod LstMacroExpModOverride, /* Override macro expansion ? */
195 LstMacroExpModDefault;
196 Boolean DottedStructs; /* structure elements with dots */
197 StringPtr PrtInitString; /* Druckerinitialisierungsstring */
198 StringPtr PrtExitString; /* Druckerdeinitialisierungsstring */
199 StringPtr PrtTitleString; /* Titelzeile */
200
201 LongInt MomSectionHandle; /* mom. Namensraum */
202 PSaveSection SectionStack; /* gespeicherte Sektionshandles */
203 tSavePhase *pPhaseStacks[PCMax]; /* saves nested PHASE values */
204
205 tSymbolSize AttrPartOpSize; /* instruction operand size deduced from insn attribute */
206 LongWord MaxCodeLen = 0; /* max. length of generated code */
207 LongInt CodeLen; /* Laenge des erzeugten Befehls */
208 LongWord *DAsmCode; /* Zwischenspeicher erzeugter Code */
209 Word *WAsmCode;
210 Byte *BAsmCode;
211
212 Boolean DontPrint; /* Flag:PC veraendert, aber keinen Code erzeugt */
213 Word ActListGran; /* uebersteuerte List-Granularitaet */
214
215 Byte StopfZahl; /* Anzahl der im 2.Pass festgestellten
216 ueberfluessigen Worte, die mit NOP ge-
217 fuellt werden muessen */
218
219 Boolean SuppWarns;
220
221 PTransTable TransTables, /* Liste mit Codepages */
222 CurrTransTable; /* aktuelle Codepage */
223
224 PDefinement FirstDefine; /* Liste von Praeprozessor-Defines */
225
226 PSaveState FirstSaveState; /* gesicherte Zustaende */
227
228 Boolean MakeDebug; /* Debugginghilfe */
229 FILE *Debug;
230
231 Boolean WasIF, WasMACRO;
232
AsmDefInit(void)233 void AsmDefInit(void)
234 {
235 LongInt z;
236
237 DoLst = eLstMacroExpAll;
238 PassNo = 1;
239 MaxSymPass = 1;
240
241 LineSum = 0;
242
243 for (z = 0; z <= ChapMax; PageCounter[z++] = 0);
244 LstCounter = 0;
245 ChapDepth = 0;
246
247 PrtInitString[0] = '\0';
248 PrtExitString[0] = '\0';
249 PrtTitleString[0] = '\0';
250
251 CurrFileName[0] = '\0';
252 MomLineCounter = 0;
253
254 FirstDefine = NULL;
255 FirstSaveState = NULL;
256 }
257
NullProc(void)258 void NullProc(void)
259 {
260 }
261
Default_InternSymbol(char * Asc,TempResult * Erg)262 void Default_InternSymbol(char *Asc, TempResult *Erg)
263 {
264 UNUSED(Asc);
265
266 Erg->Typ = TempNone;
267 }
268
Default_DissectBit(char * pDest,size_t DestSize,LargeWord BitSpec)269 void Default_DissectBit(char *pDest, size_t DestSize, LargeWord BitSpec)
270 {
271 HexString(pDest, DestSize, BitSpec, 0);
272 }
273
GetString(void)274 static char *GetString(void)
275 {
276 return (char*)malloc(STRINGSIZE * sizeof(char));
277 }
278
SetMaxCodeLen(LongWord NewMaxCodeLen)279 int SetMaxCodeLen(LongWord NewMaxCodeLen)
280 {
281 if (NewMaxCodeLen > MaxCodeLen_Max)
282 return ENOMEM;
283 if (NewMaxCodeLen > MaxCodeLen)
284 {
285 void *pNewMem;
286
287 if (!MaxCodeLen)
288 pNewMem = (LongWord *) malloc(NewMaxCodeLen);
289 else
290 pNewMem = (LongWord *) realloc(DAsmCode, NewMaxCodeLen);
291 if (!pNewMem)
292 return ENOMEM;
293
294 DAsmCode = (LongWord *)pNewMem;
295 WAsmCode = (Word *) DAsmCode;
296 BAsmCode = (Byte *) DAsmCode;
297 MaxCodeLen = NewMaxCodeLen;
298 }
299 return 0;
300 }
301
IncArgCnt(void)302 void IncArgCnt(void)
303 {
304 if (ArgCnt >= ArgCntMax)
305 WrXError(ErrNum_InternalError, "MaxArgCnt");
306 ++ArgCnt;
307 if (ArgCnt >= AllocArgCnt)
308 {
309 unsigned NewSize = sizeof(*ArgStr) * (ArgCnt + 1); /* one more, [0] is unused */
310 int z;
311
312 ArgStr = ArgStr ? (tStrComp*)realloc(ArgStr, NewSize) : (tStrComp*)malloc(NewSize);
313 for (z = AllocArgCnt; z <= ArgCnt; z++)
314 StrCompAlloc(&ArgStr[z]);
315 AllocArgCnt = ArgCnt + 1;
316 }
317 }
318
SetIsOccupied(void)319 Boolean SetIsOccupied(void)
320 {
321 return SetIsOccupiedFnc && SetIsOccupiedFnc();
322 }
323
asmdef_init(void)324 void asmdef_init(void)
325 {
326 SwitchFrom = NullProc;
327 InternSymbol = Default_InternSymbol;
328 DissectBit = Default_DissectBit;
329 DissectReg = NULL;
330 QualifyQuote = NULL;
331
332 SetMaxCodeLen(MaxCodeLen_Ini);
333
334 RelaxedMode = True;
335 ConstMode = ConstModeC;
336
337 /* auf diese Weise wird PCSymbol defaultmaessig nicht erreichbar
338 da das schon von den Konstantenparsern im Formelparser abgefangen
339 wuerde */
340
341 PCSymbol = "--PC--SYMBOL--";
342 *DefCPU = '\0';
343
344 ArgStr = NULL;
345 AllocArgCnt = 0;
346 SourceFile = GetString();
347 CursUp = GetString();
348 ErrorPath = GetString();
349 ErrorName = GetString();
350 OutName = GetString();
351 CurrFileName = GetString();
352 IncludeList = GetString();
353 LstName = GetString();
354 MacroName = GetString();
355 MacProName = GetString();
356 ShareName = GetString();
357 StrCompAlloc(&LabPart);
358 StrCompAlloc(&OpPart);
359 StrCompAlloc(&AttrPart);
360 StrCompAlloc(&ArgPart);
361 StrCompAlloc(&CommPart);
362 pLOpPart = GetString();
363 OneLine = GetString();
364 ListLine = GetString();
365 PrtInitString = GetString();
366 PrtExitString = GetString();
367 PrtTitleString = GetString();
368 MomCPUArgs = GetString();
369
370 SegInits = (LargeWord*)malloc((PCMax + 1) * sizeof(LargeWord));
371 SegLimits = (LargeWord*)malloc((PCMax + 1) * sizeof(LargeWord));
372 Phases = (LargeWord*)malloc((StructSeg + 1) * sizeof(LargeWord));
373 PCs = (LargeWord*)malloc((StructSeg + 1) * sizeof(LargeWord));
374 }
375