diff options
Diffstat (limited to 'asmdef.c')
-rw-r--r-- | asmdef.c | 315 |
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 |