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