aboutsummaryrefslogtreecommitdiffstats
path: root/asmdef.c
diff options
context:
space:
mode:
Diffstat (limited to 'asmdef.c')
-rw-r--r--asmdef.c315
1 files changed, 315 insertions, 0 deletions
diff --git a/asmdef.c b/asmdef.c
new file mode 100644
index 0000000..ac3a1fc
--- /dev/null
+++ b/asmdef.c
@@ -0,0 +1,315 @@
+/* asmdef.c */
+/*****************************************************************************/
+/* AS-Portierung */
+/* */
+/* global benutzte Variablen */
+/* */
+/* Historie: 4. 5.1996 Grundsteinlegung */
+/* 24. 6.1998 Zeichenübersetzungstabellen */
+/* 25. 7.1998 PassNo --> Integer */
+/* 17. 8.1998 InMacroFlag hierher verschoben */
+/* 18. 8.1998 RadixBase hinzugenommen */
+/* ArgStr-Feld war eins zu kurz */
+/* 19. 8.1998 BranchExt-Variablen */
+/* 29. 8.1998 ActListGran hinzugenommen */
+/* 11. 9.1998 ROMDATA-Segment hinzugenommen */
+/* 1. 1.1999 SegLimits dazugenommen */
+/* SegInits --> LargeInt */
+/* 9. 1.1999 ChkPC jetzt mit Adresse als Parameter */
+/* 18. 1.1999 PCSymbol initialisiert */
+/* 17. 4.1999 DefCPU hinzugenommen */
+/* 30. 5.1999 OutRadixBase hinzugenommen */
+/* 5.11.1999 ExtendErrors von Boolean nach ShortInt */
+/* */
+/*****************************************************************************/
+
+#include "stdinc.h"
+
+#include "stringlists.h"
+#include "chunks.h"
+
+#include "asmdef.h"
+#include "asmsub.h"
+
+char SrcSuffix[]=".asm"; /* Standardendungen: Hauptdatei */
+char IncSuffix[]=".inc"; /* Includedatei */
+char PrgSuffix[]=".p"; /* Programmdatei */
+char LstSuffix[]=".lst"; /* Listingdatei */
+char MacSuffix[]=".mac"; /* Makroausgabe */
+char PreSuffix[]=".i"; /* Ausgabe Makroprozessor */
+char LogSuffix[]=".log"; /* Fehlerdatei */
+char MapSuffix[]=".map"; /* Debug-Info/Map-Format */
+char OBJSuffix[]=".obj";
+
+char *EnvName="ASCMD"; /* Environment-Variable fuer Default-
+ Parameter */
+
+char *SegNames[PCMax+1]={"NOTHING","CODE","DATA","IDATA","XDATA","YDATA",
+ "BITDATA","IO","REG","ROMDATA"};
+char SegShorts[PCMax+1]={'-','C','D','I','X','Y','B','P','R','O'};
+LongInt Magic=0x1b34244d;
+
+char *InfoMessCopyright="(C) 1992,1998 Alfred Arnold";
+
+/** ValidSymChars:SET OF Char=['A'..'Z','a'..'z',#128..#165,'0'..'9','_','.']; **/
+
+ StringPtr SourceFile; /* Hauptquelldatei */
+
+ StringPtr ClrEol; /* String fuer loeschen bis Zeilenende */
+ StringPtr CursUp; /* " " Cursor hoch */
+
+ LargeWord PCs[StructSeg+1]; /* Programmzaehler */
+ LargeWord StartAdr; /* Programmstartadresse */
+ Boolean StartAdrPresent; /* " definiert? */
+ LargeWord Phases[StructSeg+1]; /* Verschiebungen */
+ Word Grans[StructSeg+1]; /* Groesse der Adressierungselemente */
+ Word ListGrans[StructSeg+1]; /* Wortgroesse im Listing */
+ ChunkList SegChunks[StructSeg+1]; /* Belegungen */
+ Integer ActPC; /* gewaehlter Programmzaehler */
+ Boolean PCsUsed[StructSeg+1]; /* PCs bereits initialisiert ? */
+ LargeInt SegInits[PCMax+1]; /* Segmentstartwerte */
+ LargeInt SegLimits[PCMax+1]; /* Segmentgrenzwerte */
+ LongInt ValidSegs; /* erlaubte Segmente */
+ Boolean ENDOccured; /* END-Statement aufgetreten ? */
+ Boolean Retracted; /* Codes zurueckgenommen ? */
+ Boolean ListToStdout,ListToNull; /* Listing auf Konsole/Nulldevice ? */
+
+ Word TypeFlag; /* Welche Adressraeume genutzt ? */
+ ShortInt SizeFlag; /* Welche Operandengroessen definiert ? */
+
+ Integer PassNo; /* Durchlaufsnummer */
+ Integer JmpErrors; /* Anzahl fraglicher Sprungfehler */
+ Boolean ThrowErrors; /* Fehler verwerfen bei Repass ? */
+ Boolean Repass; /* noch ein Durchlauf erforderlich */
+ Byte MaxSymPass; /* Pass, nach dem Symbole definiert sein muessen */
+ Byte ShareMode; /* 0=kein SHARED,1=Pascal-,2=C-Datei, 3=ASM-Datei */
+ DebugType DebugMode; /* Ausgabeformat Debug-Datei */
+ Byte ListMode; /* 0=kein Listing,1=Konsole,2=auf Datei */
+ Byte ListOn; /* Listing erzeugen ? */
+ Boolean MakeUseList; /* Belegungsliste ? */
+ Boolean MakeCrossList; /* Querverweisliste ? */
+ Boolean MakeSectionList; /* Sektionsliste ? */
+ Boolean MakeIncludeList; /* Includeliste ? */
+ Boolean RelaxedMode; /* alle Integer-Syntaxen zulassen ? */
+ Byte ListMask; /* Listingmaske */
+ ShortInt ExtendErrors; /* erweiterte Fehlermeldungen */
+ Boolean NumericErrors; /* Fehlermeldungen mit Nummer */
+ Boolean CodeOutput; /* Code erzeugen */
+ Boolean MacProOutput; /* Makroprozessorausgabe schreiben */
+ Boolean MacroOutput; /* gelesene Makros schreiben */
+ Boolean QuietMode; /* keine Meldungen */
+ Boolean HardRanges; /* Bereichsfehler echte Fehler ? */
+ char *DivideChars; /* Trennzeichen fuer Parameter. Inhalt Read Only! */
+ Boolean HasAttrs; /* Opcode hat Attribut */
+ char *AttrChars; /* Zeichen, mit denen Attribut abgetrennt wird */
+ Boolean MsgIfRepass; /* Meldungen, falls neuer Pass erforderlich */
+ Integer PassNoForMessage; /* falls ja: ab welchem Pass ? */
+ Boolean CaseSensitive; /* Gross/Kleinschreibung unterscheiden ? */
+
+ FILE *PrgFile; /* Codedatei */
+
+ StringPtr ErrorPath,ErrorName; /* Ausgabedatei Fehlermeldungen */
+ StringPtr OutName; /* Name Code-Datei */
+ Boolean IsErrorOpen;
+ StringPtr CurrFileName; /* mom. bearbeitete Datei */
+ LongInt MomLineCounter; /* Position in mom. Datei */
+ LongInt CurrLine; /* virtuelle Position */
+ LongInt LineSum; /* Gesamtzahl Quellzeilen */
+ LongInt MacLineSum; /* inkl. Makroexpansion */
+
+ LongInt NOPCode; /* Maschinenbefehl NOP zum Stopfen */
+ Boolean TurnWords; /* TRUE = Motorola-Wortformat */
+ /* FALSE = Intel-Wortformat */
+ Byte HeaderID; /* Kennbyte des Codeheaders */
+ char *PCSymbol; /* Symbol, womit Programmzaehler erreicht wird. Inhalt Read Only! */
+ TConstMode ConstMode;
+ Boolean SetIsOccupied; /* TRUE: SET ist Prozessorbefehl */
+#ifdef __PROTOS__
+ void (*MakeCode)(void); /* Codeerzeugungsprozedur */
+ Boolean (*ChkPC)(LargeWord Addr);/* ueberprueft Codelaengenueberschreitungen */
+ Boolean (*IsDef)(void); /* ist Label nicht als solches zu werten ? */
+ void (*SwitchFrom)(void); /* bevor von einer CPU weggeschaltet wird */
+ void (*InternSymbol)(char *Asc, TempResult *Erg); /* vordefinierte Symbole ? */
+ void (*InitPassProc)(void); /* Funktion zur Vorinitialisierung vor einem Pass */
+ void (*ClearUpProc)(void); /* Aufraeumen nach Assemblierung */
+#else
+ void (*MakeCode)();
+ Boolean (*ChkPC)();
+ Boolean (*IsDef)();
+ void (*SwitchFrom)();
+ void (*InternSymbol)();
+ void (*InitPassProc)();
+ void (*ClearUpProc)();
+#endif
+
+ StringPtr IncludeList; /* Suchpfade fuer Includedateien */
+ Integer IncDepth,NextIncDepth; /* Verschachtelungstiefe INCLUDEs */
+ FILE *ErrorFile; /* Fehlerausgabe */
+ FILE *LstFile; /* Listdatei */
+ FILE *ShareFile; /* Sharefile */
+ FILE *MacProFile; /* Makroprozessorausgabe */
+ FILE *MacroFile; /* Ausgabedatei Makroliste */
+ Boolean InMacroFlag; /* momentan wird Makro expandiert */
+ StringPtr LstName; /* Name der Listdatei */
+ StringPtr MacroName,MacProName;
+ Boolean DoLst,NextDoLst; /* Listing an */
+ StringPtr ShareName; /* Name des Sharefiles */
+/** PrgName:String; { Name der Codedatei }**/
+
+ CPUVar MomCPU,MomVirtCPU; /* definierter/vorgegaukelter Prozessortyp */
+ char DefCPU[20]; /* per Kommandozeile vorgegebene CPU */
+ char MomCPUIdent[10]; /* dessen Name in ASCII */
+ PCPUDef FirstCPUDef; /* Liste mit Prozessordefinitionen */
+ CPUVar CPUCnt; /* Gesamtzahl Prozessoren */
+
+ Boolean FPUAvail; /* Koprozessor erlaubt ? */
+ Boolean DoPadding; /* auf gerade Byte-Zahl ausrichten ? */
+ Boolean SupAllowed; /* Supervisormode freigegeben */
+ Boolean Maximum; /* CPU nicht kastriert */
+ Boolean DoBranchExt; /* Spruenge automatisch verlaengern */
+
+ LargeWord RadixBase; /* Default-Zahlensystem im Formelparser*/
+ LargeWord OutRadixBase; /* dito fuer Ausgabe */
+
+ StringPtr LabPart,OpPart,AttrPart, /* Komponenten der Zeile */
+ ArgPart,CommPart,LOpPart;
+ char AttrSplit;
+ ArgStrField ArgStr; /* Komponenten des Arguments */
+ Byte ArgCnt; /* Argumentzahl */
+ StringPtr OneLine; /* eingelesene Zeile */
+
+ Byte LstCounter; /* Zeilenzaehler fuer automatischen Umbruch */
+ Word PageCounter[ChapMax+1]; /* hierarchische Seitenzaehler */
+ Byte ChapDepth; /* momentane Kapitelverschachtelung */
+ StringPtr ListLine; /* alternative Ausgabe vor Listing fuer EQU */
+ Byte PageLength,PageWidth; /* Seitenlaenge/breite in Zeilen/Spalten */
+ Boolean LstMacroEx; /* Makroexpansionen auflisten */
+ StringPtr PrtInitString; /* Druckerinitialisierungsstring */
+ StringPtr PrtExitString; /* Druckerdeinitialisierungsstring */
+ StringPtr PrtTitleString; /* Titelzeile */
+ StringPtr ExtendError; /* erweiterte Fehlermeldung */
+
+ LongInt MomSectionHandle; /* mom. Namensraum */
+ PSaveSection SectionStack; /* gespeicherte Sektionshandles */
+
+ LongInt CodeLen; /* Laenge des erzeugten Befehls */
+ LongWord *DAsmCode; /* Zwischenspeicher erzeugter Code */
+ Word *WAsmCode;
+ Byte *BAsmCode;
+
+ Boolean DontPrint; /* Flag:PC veraendert, aber keinen Code erzeugt */
+ Word ActListGran; /* uebersteuerte List-Granularitaet */
+/** MultiFace:RECORD Case Byte OF
+ 0:(Feld:WordField);
+ 1:(Val32:Single);
+ 2:(Val64:Double);
+ 3:(Val80:Extended);
+ 4:(ValCo:Comp);
+ END;**/
+
+ Byte StopfZahl; /* Anzahl der im 2.Pass festgestellten
+ ueberfluessigen Worte, die mit NOP ge-
+ fuellt werden muessen */
+
+ Boolean SuppWarns;
+
+ PTransTable TransTables, /* Liste mit Codepages */
+ CurrTransTable; /* aktuelle Codepage */
+
+ PFunction FirstFunction; /* Liste definierter Funktionen */
+
+ PDefinement FirstDefine; /* Liste von Praeprozessor-Defines */
+
+ PStructure StructureStack; /* momentan offene Strukturen */
+ int StructSaveSeg; /* gesichertes Segment waehrend Strukturdef.*/
+
+ PSaveState FirstSaveState; /* gesicherte Zustaende */
+
+ Boolean MakeDebug; /* Debugginghilfe */
+ FILE *Debug;
+
+
+ void AsmDefInit(void)
+BEGIN
+ LongInt z;
+
+ DoLst=True; PassNo=1; MaxSymPass=1;
+
+ LineSum=0;
+
+ for (z=0; z<=ChapMax; PageCounter[z++]=0);
+ LstCounter=0; ChapDepth=0;
+
+ PrtInitString[0]='\0'; PrtExitString[0]='\0'; PrtTitleString[0]='\0';
+
+ ExtendError[0]='\0';
+
+ CurrFileName[0]='\0'; MomLineCounter=0;
+
+ FirstFunction=Nil; FirstDefine=Nil; FirstSaveState=Nil;
+END
+
+ void NullProc(void)
+BEGIN
+END
+
+ void Default_InternSymbol(char *Asc, TempResult *Erg)
+BEGIN
+ Erg->Typ=TempNone;
+END
+
+ static char *GetString(void)
+BEGIN
+ return malloc(256*sizeof(char));
+END
+
+ void asmdef_init(void)
+BEGIN
+ int z;
+
+ InitPassProc=NullProc;
+ ClearUpProc=NullProc;
+ FirstCPUDef=Nil;
+ CPUCnt=0;
+ SwitchFrom=NullProc;
+ InternSymbol=Default_InternSymbol;
+
+ DAsmCode=(LongWord *) malloc(MaxCodeLen/4);
+ WAsmCode=(Word *) DAsmCode;
+ BAsmCode=(Byte *) DAsmCode;
+
+ RelaxedMode=True; ConstMode=ConstModeC;
+
+ /* auf diese Weise wird PCSymbol defaultmaessig nicht erreichbar
+ da das schon von den Konstantenparsern im Formelparser abgefangen
+ wuerde */
+
+ PCSymbol = "1";
+ *DefCPU = '\0';
+
+ for (z=0; z<=ParMax; z++) ArgStr[z]=GetString();
+ SourceFile=GetString();
+ ClrEol=GetString();
+ CursUp=GetString();
+ ErrorPath=GetString();
+ ErrorName=GetString();
+ OutName=GetString();
+ CurrFileName=GetString();
+ IncludeList=GetString();
+ LstName=GetString();
+ MacroName=GetString();
+ MacProName=GetString();
+ ShareName=GetString();
+ LabPart=GetString();
+ OpPart=GetString();
+ AttrPart=GetString();
+ ArgPart=GetString();
+ CommPart=GetString();
+ LOpPart=GetString();
+ OneLine=GetString();
+ ListLine=GetString();
+ PrtInitString=GetString();
+ PrtExitString=GetString();
+ PrtTitleString=GetString();
+ ExtendError=GetString();
+END