1%%TITLE Bedienungsanleitung Makroassembler AS
2\documentclass[12pt,a4paper,twoside]{report}
3\usepackage{german}
4\usepackage{makeidx}
5\usepackage{hyperref}
6\usepackage{longtable}
7\pagestyle{headings}
8\sloppy
9\textwidth 15cm
10\evensidemargin 0.5cm
11\oddsidemargin 0.5cm
12\topsep 1mm
13\parskip 0.3cm plus0.2cm minus0.2cm
14
15\hyphenation{Lis-ting-er-zeu-gung}
16\hyphenation{back-slash}
17
18\newif\ifelektor
19\elektorfalse
20
21\newcommand{\ii}[1]{{\it #1}}
22\newcommand{\bb}[1]{{\bf #1}}
23\newcommand{\tty}[1]{{\tt #1}}
24\newcommand{\tin}[1]{{\scriptsize #1}}
25\newcommand{\ttindex}[1]{\index{#1@{\tt #1}}}
26
27\font\mengft=cmss9 scaled \magstep1
28\def \rz{\hbox{\mengft{I \hskip -1.7mm R}}}
29\makeindex
30
31%%===========================================================================
32
33\begin{document}
34
35\thispagestyle{empty}
36
37\
38\vspace{7cm}\par
39
40\begin{raggedright}
41{\large Alfred Arnold}\\
42\vspace{1cm}\par
43{\huge Makroassembler AS V1.42}\\
44\rule{9.5cm}{0.3mm}\\
45\vspace{2mm}\par
46{\huge Benutzeranleitung}
47
48\vspace{1cm}\par
49
50{\large Stand September 2020}
51\end{raggedright}
52
53\clearpage
54\thispagestyle{empty}
55
56\ \vspace{4cm}
57
58{\em IBM, PPC403Gx, OS/2} und {\em PowerPC} sind eingetragene Warenzeichen
59der IBM Corporation.
60
61{\em Intel, MCS-48, MCS-51, MCS-251, MCS-96, MCS-196} und {\em MCS-296}
62sind eingetragene Warenzeichen der Intel Corp. .
63
64{\em Motorola} und {\em ColdFire} sind eingetragene Warenzeichen von
65Motorola Inc. .
66
67{\em MagniV} ist ein eingetragenes Warenzeichen von Freescale Semiconductor.
68
69{\em PicoBlaze} ist ein eingetragenes Warenzeichen der Xilinx Inc.
70
71{\em UNIX} ist ein eingetragenes Warenzeichen der Open Group.
72
73{\em Linux} ist ein eingetragenes Warenzeichen von Linus Thorvalds.
74
75{\em Microsoft, Windows} und {\em MS-DOS} sind eingetragene Warenzeichen
76der Microsoft Corporation.
77
78Alle anderen Warenzeichen, die nicht ausdr"ucklich in diesem Abschnitt
79genannt wurden und in diesem Handbuch verwendet werden, sind Eigentum
80der entsprechenden Eigent"umer.
81
82\vspace{6cm}
83
84Dieses Dokument wurde mit dem LaTeX-Satzsystem unter dem Betriebssystem
85Linux angefertigt und formatiert.
86
87\clearpage
88
89%%===========================================================================
90
91\ifelektor
92\thispagestyle{empty} \
93\clearpage
94\thispagestyle{empty} \
95\clearpage
96\fi
97
98%%===========================================================================
99
100{\parskip 0cm plus0.1cm \tableofcontents}
101
102%%===========================================================================
103
104\cleardoublepage
105\chapter{Allgemeines}
106
107Diese Anleitung wendet sich an Leute, die bereits in Assembler programmiert
108haben und sich dar"uber informieren m"ochten, wie man mit AS umgeht.  Sie
109hat eher die Form eines Referenz- und nicht Benutzerhandbuches.  Als solches
110macht sie weder den Versuch, die Sprache Assembler an sich zu erkl"aren, noch
111erl"autert sie die Architektur bestimmter Prozessoren.  Im Literaturverzeichnis
112habe ich weiterf"uhrende Literatur aufgelistet, die bei der Implementation der
113einzelnen Codegeneratoren ma"sgebend war.  Um Assembler von Grund auf zu
114lernen, kenne ich kein Buch; ich habe es im wesentlichen im ,,Trial and
115error''-Verfahren gelernt.
116
117%%---------------------------------------------------------------------------
118
119\section{Lizenzbedingungen}
120\label{SectLicense}
121
122Bevor es in medias res geht, erst einmal der unvermeidliche Prolog:
123\par
124AS in der vorliegenden Version untersteht der GNU General Public License
125(GPL); die Details dieser Lizenz k"onnen Sie in der beiliegenden Datei
126COPYING nachlesen.  Falls Sie diese nicht mit AS erhalten haben,
127beschweren Sie sich bei demjenigen, von dem Sie AS erhalten haben!
128\par
129Kurz gesagt, beinhaltet die GPL folgende Punkte:
130\begin{itemize}
131\item{Auf AS aufbauende Programme m"ussen ebenfalls der GPL unterstehen;}
132\item{Weiterverbreitung ausdr"ucklich erlaubt;}
133\item{expliziter Haftungsausschlu"s f"ur durch die Anwendung dieses
134      Programmes entstehende Sch"aden.}
135\end{itemize}
136...aber f"ur die Details bitte ich wirklich, in den Originaltext der GPL
137zu schauen!
138\par
139Um eine m"oglichst schnelle Fehlerdiagnose und -korrektur zu erm"oglichen,
140bitte ich, Fehlerberichten folgende Angaben beizuf"ugen:
141\begin{itemize}
142\item{Hardware: \begin{itemize}
143                \item{Prozessortyp (mit/ohne Koprozessor)}
144                \item{Speicherausbau}
145                \item{Grafikkarte}
146                \item{Festplatte und Typ deren Interfaces}
147                \end{itemize}}
148\item{Software: \begin{itemize}
149                \item{Betriebssystem (MS/DR/Novell-DOS, OS/2, Windows)
150		und Version}
151                \item{installierte speicherresidente Programme}
152                \item{benutzte Version von AS + Datum des EXE-Files}
153                \end{itemize}}
154\item{m"oglichst die Quelldatei, bei der der Fehler auftritt}
155\end{itemize}
156Zu erreichen bin ich folgenderma"sen:
157\begin{itemize}
158\item{per Post: \begin{description}
159                \item{Alfred Arnold}
160                \item{Hirschgraben 29}
161                \item{52062 Aachen}
162                \end{description}}
163\item{per E-Mail: \tty{alfred@ccac.rwth-aachen.de}}
164\end{itemize}
165Wer mir pers"onlich Fragen stellen will (und in der N"ahe von Aachen
166wohnt), kann dies mit hoher Wahrscheinlichkeit donnerstags von 20.00
167bis 21.00 Uhr im Computerclub an der RWTH Aachen (Elisabethstra"se 16,
168erster Stock, rechter Flur).
169\par
170Von Telefonanrufen bitte ich abzusehen.  Erstens, weil sich die
171komplizierten Zusammenh"ange am Telefon nur "au"serst schwer er"ortern
172lassen, und zweitens ist die Telekom schon reich genug...
173\par
174Die neueste Version von AS (DPMI, Win32, C) findet sich auf folgendem
175Server:
176\begin{verbatim}
177 http://john.ccac.rwth-aachen.de:8000/as
178\end{verbatim}
179oder auch kurz
180\begin{verbatim}
181 http://www.alfsembler.de
182\end{verbatim}
183\par
184Wer "uber keinen FTP-Zugang verf"ugt, kann den Assembler auch von mir
185anfordern.  Ich werde aber nur Anfragen beantworten, die einen CD-Rohling
186und einen passenden, frankierten R"uckumschlag enthalten.  \bb{KEIN} Geld
187schicken!!!
188\par
189So. Nach diesem unvermeidlichen Vorwort k"onnen wir wohl beruhigt
190zur eigentlichen Anleitung schreiten:
191
192%%---------------------------------------------------------------------------
193
194\section{allgemeine F"ahigkeiten des Assemblers}
195
196AS bietet im Gegensatz zu normalen Assemblern die M"oglichkeit, Code
197f"ur v"ollig verschiedene Prozessoren zu erzeugen.  Momentan sind
198folgende Prozessorfamilien implementiert:
199\begin{itemize}
200\item{Motorola 68000..68040, 683xx, Coldfire inkl. Koprozessor und MMU}
201\item{Motorola ColdFire}
202\item{Motorola DSP5600x,DSP56300}
203\item{Motorola/IBM MPC601/MPC505/PPC403/MPC821}
204\item{Motorola M-Core}
205\item{Motorola 6800, 6801, 68(HC)11(K4) sowie Hitachi 6301}
206\item{Motorola/Freescale 6805, 68HC(S)08}
207\item{Motorola 6809 / Hitachi 6309}
208\item{Motorola/Freescale 68HC12(X) inklusive XGATE}
209\item{Freescale/NXP S12Z (''MagniV'')}
210\item{Freescale 68RS08}
211\item{Motorola 68HC16}
212\item{Hitachi H8/300(H)}
213\item{Hitachi H8/500}
214\item{Hitachi SH7000/7600/7700}
215\item{Hitachi HMCS400}
216\item{Hitachi H16}
217\item{Rockwell 6502, 65(S)C02, Commodore 65CE02, WDC W65C02S, Rockwell 65C19 und
218      Hudson HuC6280}
219\item{CMD 65816}
220\item{Mitsubishi MELPS-740}
221\item{Mitsubishi MELPS-7700}
222\item{Mitsubishi MELPS-4500}
223\item{Mitsubishi M16}
224\item{Mitsubishi M16C}
225\item{Intel 4004/4040}
226\item{Intel MCS-48/41, einschlie"slich Siemens SAB80C382 und der
227      OKI-Varianten}
228\item{Intel MCS-51/251, Dallas DS80C390}
229\item{Intel MCS-96/196(Nx)/296}
230\item{Intel 8080/8085}
231\item{Intel i960}
232\item{Signetics 8X30x}
233\item{Signetics 2650}
234\item{Philips XA}
235\item{Atmel (Mega-)AVR}
236\item{AMD 29K}
237\item{Siemens 80C166/167}
238\item{Zilog Z80, Z180, Z380}
239\item{Zilog Z8, Super8, Z8 Encore}
240\item{Xilinx KCPSM/KCPSM3 ('PicoBlaze')}
241\item{LatticeMico8}
242\item{Toshiba TLCS-900(L)}
243\item{Toshiba TLCS-90}
244\item{Toshiba TLCS-870(/C)}
245\item{Toshiba TLCS-47}
246\item{Toshiba TLCS-9000}
247\item{Toshiba TC9331}
248\item{Microchip PIC16C54..16C57}
249\item{Microchip PIC16C84/PIC16C64}
250\item{Microchip PIC17C42}
251\item{Parallax SX20/SX28}
252\item{SGS-Thomson ST6}
253\item{SGS-Thomson ST7/STM8}
254\item{SGS-Thomson ST9}
255\item{SGS-Thomson 6804}
256\item{Texas Instruments TMS32010/32015}
257\item{Texas Instruments TMS3202x}
258\item{Texas Instruments TMS320C3x/TMS320C4x}
259\item{Texas Instruments TMS320C20x/TMS320C5x}
260\item{Texas Instruments TMS320C54x}
261\item{Texas Instruments TMS320C6x}
262\item{Texas Instruments TMS99xx/TMS99xxx}
263\item{Texas Instruments TMS7000}
264\item{Texas Instruments TMS1000}
265\item{Texas Instruments TMS370xxx}
266\item{Texas Instruments MSP430(X)}
267\item{National Semiconductor SC/MP}
268\item{National Semiconductor INS807x}
269\item{National Semiconductor COP4}
270\item{National Semiconductor COP8}
271\item{National Semiconductor SC144xx}
272\item{Fairchild ACE}
273\item{Fairchild F8}
274\item{NEC $\mu$PD78(C)1x}
275\item{NEC $\mu$PD75xx}
276\item{NEC $\mu$PD75xxx (alias 75K0)}
277\item{NEC 78K0}
278\item{NEC 78K2}
279\item{NEC 78K3}
280\item{NEC 78K4}
281\item{NEC $\mu$PD7720/7725}
282\item{NEC $\mu$PD77230}
283\item{Fujitsu F$^2$MC8L}
284\item{Fujitsu F$^2$MC16L}
285\item{OKI OLMS-40}
286\item{OKI OLMS-50}
287\item{Panafacom MN1610/MN1613}
288\item{Symbios Logic SYM53C8xx (ja, die kann man programmieren!)}
289\item{Intersil CDP1802/1804/1805(A)}
290\item{XMOS XS1}
291\item{MIL STD 1750}
292\item{KENBAK-1}
293\end{itemize}
294in Arbeit / Planung / "Uberlegung :
295\begin{itemize}
296\item{Analog Devices ADSP21xx}
297\item{SGS-Thomson ST20}
298\item{Texas Instruments TMS320C8x}
299\end{itemize}
300ungeliebt, aber {\it doch} vorhanden :
301\begin{itemize}
302\item{Intel 8086, 80186, NEC V30\&V35 inkl. Koprozessor 8087}
303\end{itemize}
304Die Umschaltung des Codegenerators darf dabei auch mitten in der Datei
305erfolgen, und das beliebig oft!
306\par
307Der Grund f"ur diese Flexibilit"at ist, da"s AS eine Vorgeschichte hat,
308die auch in der Versionsnummer deutlich wird: AS ist als Erweiterung eines
309Makroassemblers f"ur die 68000er-Familie entstanden.  Auf besonderen
310Wunsch habe ich den urspr"unglichen Assembler um die F"ahigkeit zur
311"Ubersetzung von 8051-Mnemonics erweitert, und auf dem Weg (Abstieg?!) vom
31268000 zum 8051 sind eine Reihe anderer fast nebenbei abgefallen...die
313restlichen Prozessoren wurden allesamt auf Benutzeranfrage hin integriert.
314Zumindest beim prozessorunabh"angigen Kern kann man also getrost davon
315ausgehen, da"s er gut ausgetestet und von offensichtlichen Bugs frei ist.
316Leider habe ich aber h"aufig mangels passender Hardware nicht die
317M"oglichkeit, einen neuen Codegenerator praktisch zu testen, so da"s bei
318Neuerungen "Uberraschungen nie ganz auszuschlie"sen sind.  Das in
319Abschnitt \ref{SectLicense} gesagte hat also schon seinen Grund...
320\par
321Diese Flexibilit"at bedingt ein etwas exotisches Code-Format, f"ur dessen
322Bearbeitung ich einige Tools beigelegt habe.  Deren Beschreibung findet
323sich in Abschnitt \ref{ChapTools}.
324\par
325AS ist ein Makroassembler, d.h. dem Programmierer ist die M"oglichkeit
326gegeben, sich mittels Makros neue ,,Befehle'' zu definieren.  Zus"atzlich
327beherrscht er die bedingte Assemblierung.  Labels in Makror"umpfen werden
328automatisch als lokal betrachtet.
329\par
330Symbole k"onnen f"ur den Assembler sowohl Integer-, String- als auch
331Gleitkommawerte haben.  Diese werden --- wie Zwischenergebnisse bei Formeln
332--- mit einer Breite von 32 Bit f"ur Integerwerte, 80/64 Bit f"ur
333Gleitkommawerte und 255 Zeichen f"ur Strings gespeichert.  F"ur eine Reihe
334von Mikrokontrollern besteht die M"oglichkeit, durch Segmentbildung die
335Symbole bestimmten Klassen zuzuordnen.  Dem Assembler kann man auf diese
336Weise die --- begrenzte --- M"oglichkeit geben, Zugriffe in falsche
337Adre"sr"aume zu erkennen.
338\par
339Der Assembler kennt keine expliziten Beschr"ankungen bzgl.
340Verschachtelungstiefe von Includefiles oder Makros, eine Grenze bildet
341lediglich die durch den Hauptspeicher beschr"ankte Rekursionstiefe.
342Ebenso gibt es keine Grenze f"ur die Symboll"ange, diese wird nur durch
343die maximale Zeilenl"ange begrenzt.
344\par
345Ab Version 1.38 ist AS ein Mehrpass-Assembler.  Dieser hochtrabende Begriff
346bedeutet nicht mehr, als das die Anzahl der Durchg"ange durch die Quelltexte
347nicht mehr zwei sein mu"s.  Sind keine Vorw"artsreferenzen im Quellcode
348enthalten, so kommt AS mit einem Durchgang aus.  Stellt sich dagegen im zweiten
349Durchgang heraus, da"s ein Befehl mit einer k"urzeren oder l"angeren Kodierung
350benutzt werden mu"s, so wird ein dritter (vierter, f"unfter...) Durchgang
351eingelegt, um alle Symbolreferenzen richtig zu stellen.  Mehr steckt hinter dem
352Begriff ,,Multipass'' nicht...er wird im weiteren Verlauf dieser Anleitung
353deswegen auch nicht mehr auftauchen.
354\par
355Nach soviel Lobhudelei ein dicker Wermutstropfen: AS erzeugt keinen
356linkf"ahigen Code.  Eine Erweiterung um einen Linker w"are mit erheblichem
357Aufwand verbunden und ist momentan nicht in Planung.
358\par
359Wer einen Blick in die Quellen von AS werfen will, besorge sich einfach
360die Unix-Version von AS, die als Quelltext zum Selber "ubersetzen kommt.
361Die Quellen sind mit Sicherheit nicht in einem Format, da"s das
362Verst"andnis m"oglichst leicht macht - an vielen Stellen schaut noch
363der originale Pascal-Quellcode heraus, und ich teile einige h"aufig
364vertretene Ansichten "uber 'guten' C-Stil nicht...
365
366%%----------------------------------------------------------------------
367
368\section{Unterst"utzte Plattformen}
369
370Obwohl AS als ein reines DOS-Programm \marginpar{{\em DOS}} angefangen
371hat, stehen auch eine Reihe von Versionen zur Verf"ugung, die etwas mehr
372als den Real-Mode eines Intel-Prozessors ausnutzen k"onnen.  Diese sind in
373ihrer Benutzung soweit als m"oglich kompatibel gehalten zur DOS-Version,
374es ergeben sich nat"urlich bisweilen Unterschiede in der Installation und
375der Einbindung in die jeweilige Betriebssystemumgebung.  Abschnitte in
376dieser Anleitung, die nur f"ur eine bestimmte Version von AS gelten, sind
377mit einer entsprechenden Randbemerkung (an diesem Absatz f"ur die
378DOS-Version) gekennzeichnet.  Im einzelnen existieren die folgenden,
379weiteren Versionen (die als getrennte Pakete distributiert werden):
380
381F"ur den Fall, da"s \marginpar{{\em DPMI}} man bei der "Ubersetzung
382gro"ser, komplexer Programme unter DOS Speicherplatzprobleme bekommt,
383existiert eine DOS-Version, die mittels eines DOS-Extenders im Protected
384Mode abl"auft und so das komplette Extended Memory eines ATs nutzen kann.
385Die "Ubersetzung wird durch den Extender merklich langsamer, aber immerhin
386l"auft es dann noch...
387
388F"ur Freunde von IBM's Betriebssystem OS/2 \marginpar{{\em OS/2}} gibt es
389eine native OS/2-Version von AS.  Seit 1.41r8 ist diese nur eine volle
39032-bittige OS/2-Anwendung, was nat"urlich zur Folge hat, da"s OS/2 2.x
391und ein 80386-Prozessor jetzt zwingend erforderlich sind.
392
393Den reinen PC-Bereich verl"a"st man mit der \marginpar{{\em UNIX}}
394C-Version von AS, die so gehalten wurde, da"s sie auf einer m"oglichst
395gro"sen Zahl von UNIX-artigen Systemen (dazu z"ahlt aber auch OS/2 mit dem
396emx-Compiler) ohne gro"sartige Verrenkungen "ubersetzbar ist.  Im
397Gegensatz zu den vorherigen Versionen (die auf den auf Anfrage
398erh"altlichen Pascal-Sourcen basieren) wird die C-Version im Quellcode
399ausgeliefert, d.h. man mu"s sich mittels eines Compilers selbst die
400Binaries erzeugen.  Dies ist aber (f"ur mich) der eindeutig einfachere
401Weg, als ein Dutzend Binaries f"ur Maschinen vorzukompilieren, auf die ich
402auch nicht immer Zugriff habe...
403
404%%===========================================================================
405
406\cleardoublepage
407\chapter{Benutzung des Assemblers}
408
409\begin{quote}\begin{raggedright}{\it
410Scotty: Captain, we din\verb!'! can reference it! \\
411Kirk:   Analysis, Mr. Spock? \\
412Spock:  Captain, it doesn\verb!'!t appear in the symbol table. \\
413Kirk:   Then it\verb!'!s of external origin? \\
414Spock:  Affirmative. \\
415Kirk:   Mr. Sulu, go to pass two. \\
416Sulu:   Aye aye, sir, going to pass two. \\
417}\end{raggedright}\end{quote}
418
419%%---------------------------------------------------------------------------
420
421\section{Hardware-Anforderungen}
422
423Je nach Version von AS variieren die Hardware-Anforderungen deutlich:
424
425Die DOS-Version \marginpar{{\em DOS}} l"auft prinzipiell auf allen
426IBM-kompatiblen PCs, angefangen vom PC/XT mit vierkommawenig Megaherz bis
427hin zum Pentium.  Wie bei vielen anderen Programmen aber auch, steigt der
428Lustgewinn mit der Hardware-Ausstattung.  So d"urfte ein XT-Benutzer ohne
429Festplatte erhebliche Probleme haben, die "uber 500 Kbyte gro"se
430Overlay-Datei von AS auf einer Diskette unterzubringen...eine Festplatte
431sollte der PC also schon haben, allein um vern"unftige Ladezeiten zu
432erreichen.  Im Hauptspeicherbedarf ist AS recht gen"ugsam: Das Programm
433selber belegt knapp 300 Kbyte Hauptspeicher, AS sollte also ab einer
434Hauptspeichergr"o"se von 512 Kbyte ausf"uhrbar sein.
435
436Die Version von AS f"ur das \marginpar{{\em DPMI}}
437DOS-Protected-Mode-Interface (DPMI) ben"otigt zum Ablaufen mindestens
438einen 80286-Prozessor und 1 Mbyte freies Extended Memory.  Daher stellen 2
439Mbyte Hauptspeicher das absolute Minimum dar, wenn man im XMS sonst keine
440anderen Spielereien (Platten-Cache, RAM-Disk, hochgeladenes DOS)
441installiert hat, sonst entsprechend mehr.  Falls man die DPMI-Version in
442einer DOS-Box von OS/2 laufen l"a"st, so sollte DPMI auch in den
443DOS-Einstellungen der Box erlaubt sein (Einstellung \tty{An} oder
444\tty{Auto}) und der Box eine entsprechende Menge von XMS-Speicher
445zugeordnet sein.  Die virtuelle Speicherverwaltung von OS/2 sorgt hier
446"ubrigens daf"ur, da"s man sich keine Gedanken machen mu"s, ob der
447eingestellte Speicher auch real verf"ugbar ist.
448
449Die Hardware-Anforderungen der \marginpar{{\em OS/2}} OS/2-Version ergeben sich
450weitestgehend durch die des darunterliegenden Betriebssytemes, d.h.
451mindestens ein 80386SX-Prozessor, 8 Mbyte RAM (bzw. 4 ohne grafische
452Benutzeroberfl"ache) sowie ca 100..150 Mbyte Platz auf der Festplatte.  Da
453AS2 nur eine 16-Bit-Applikation ist, sollte er theoretisch auch auf
454"alteren OS/2-Versionen (und damit 80286-Prozessoren) lauff"ahig sein;
455ausprobieren konnte ich dies aber nicht.
456
457Die C-Version \marginpar{{\em UNIX}} von AS wird im Quellcode ausgeliefert
458und erfordert damit ein Unix- oder OS/2-System mit einem C-Compiler.
459Der Compiler mu"s dem ANSI-Standard gen"ugen (GNU-C erf"ullt diese
460Bedingung zum Beispiel).  Ob Ihr UNIX-System bereits getestet und die
461n"otigen Definitionen vorgenommen wurden, k"onnen Sie der \tty{README}-Datei
462entnehmen.  Als zur Kompilation ben"otigten Plattenplatz sollten Sie
463ca. 15 Mbyte veranschlagen; dieser Wert (und der nach der "Ubersetzung
464noch ben"otigte Platz f"ur die "ubersetzten Programme) variiert
465allerdings stark von System zu System, so da"s man diesen Wert nur als
466Richtschnur betrachten sollte.
467
468%%---------------------------------------------------------------------------
469
470\section{Lieferumfang}
471
472Prinzipiell erh"alt man AS in einer von zwei Formen: Als {\em
473Bin"ardistribution} oder {\em Quellcodedistribution}.  Im Falle einer
474Bin"ardistribution bekommt man AS mit den zugeh"origen Dienstprogrammen
475und Hilfsdateien fertig "ubersetzt, so da"s man nach dem Auspacken des
476Archivs an die gew"unschte Stelle direkt loslegen kann.
477Bin"ardistributionen werden f"ur verbreitete Plattformen gemacht, bei
478denen die Mehrzahl der Benutzer keinen Compiler hat oder die "Ubersetzung
479trickreich ist (im Moment sind dies DOS und OS/2).  Eine
480Quellcodedistribution enth"alt im Gegensatz den kompletten Satz an
481C-Quellen, um AS zu generieren; es ist letzten Endes ein Schnappschu"s
482des Quellenbaumes, an dem ich AS weiterentwickele.  Die Generierung von AS
483aus dem Quellcode und dessen Struktur ist n"aher in Anhang
484\ref{ChapSource} beschrieben, weshalb an dieser Stelle nur auf den
485Umfang und die Installation einer Bin"ardistribution beschrieben wird:
486
487Das Archiv des Lieferumfangs gliedert sich in einige Unterverzeichnisse,
488so da"s man nach dem Auspacken sofort einen Verzeichnisbaum erh"alt.  Die
489Verzeichnisse enthalten im einzelnen:
490\begin{itemize}
491\item{{\tt BIN}: ausf"uhrbare Programme, Text-Resourcen;}
492\item{{\tt INCLUDE}: Include-Dateien f"ur Assemblerprogramme, z.B.
493      Registerdefinitionen oder Standardmakros;}
494\item{{\tt MAN}: Kurzreferenzen f"ur die Programme im Unix-Man-Format;}
495\item{{\tt DOC}: diese Dokumentation in verschiedenen Formaten;}
496\item{{\tt LIB}: vorgesehen f"ur Initialisierungsdateien.}
497\end{itemize}
498Eine Auflistung der Dateien, die in jeder Bin"ardistribution enthalten
499sind, findet sich in Tabelle \ref{TabCommonPackageList}.  Falls eine der
500in diesen (oder den folgenden) Tabellen aufgef"uhrten Dateien fehlt, hat
501jemand (im Zweifelsfalle ich) beim Kopieren geschlafen...
502
503\begin{center}\begin{longtable}{|l|l|}
504\hline
505Datei             & Funktion \\
506\hline
507\hline
508\endhead
509{\bf Verzeichnis BIN} & \\
510\hline
511AS.EXE            & Programmdatei Assembler \\
512PLIST.EXE         & listet Inhalt von Codedateien auf \\
513PBIND.EXE         & kopiert Codedateien zusammen \\
514P2HEX.EXE         & wandelt Code- in Hexdateien um \\
515P2BIN.EXE         & wandelt Code- in Bin"ardateien um \\
516AS.MSG            & Textresourcen zu AS \\
517PLIST.MSG         & Textresourcen zu PLIST \\
518PBIND.MSG         & Textresourcen zu PBIND \\
519P2HEX.MSG         & Textresourcen zu P2HEX \\
520P2BIN.MSG         & Textresourcen zu P2BIN \\
521TOOLS.MSG         & gemeinsame Textresourcen zu den Tools \\
522CMDARG.MSG        & gemeinsame Textresourcen zu allen Programmen \\
523IOERRS.MSG        & \\
524\hline
525{\bf Verzeichnis DOC} & \\
526\hline
527AS\_DE.DOC        & deutsche Dokumentation, ASCII-Format \\
528AS\_DE.HTML       & deutsche Dokumentation, HTML-Format \\
529AS\_DE.TEX        & deutsche Dokumentation, LaTeX-Format \\
530AS\_EN.DOC        & englische Dokumentation, ASCII-Format \\
531AS\_EN.HTML       & englische Dokumentation, HTML-Format \\
532AS\_EN.TEX        & englische Dokumentation, LaTeX-Format \\
533\hline
534{\bf Verzeichnis INCLUDE} & \\
535\hline
536BITFUNCS.INC      & Funktionen zur Bitmanipulation \\
537CTYPE.INC         & Funktionen zur Klassifizierung von \\
538                  & Zeichen \\
53980C50X.INC        & Registeradressen SAB C50x \\
54080C552.INC        & Registeradressen 80C552 \\
541H8\_3048.INC      & Registeradressen H8/3048 \\
542KENBAK.INC        & Registeradressen Kenbak-1 \\
543REG166.INC        & Adressen \& Befehlsmakros 80C166/167 \\
544REG251.INC        & Adressen \& Bits 80C251 \\
545REG29K.INC        & Peripherieadressen AMD 2924x \\
546REG53X.INC        & Registeradressen H8/53x \\
547REG6303.INC       & Registeradressen 6303 \\
548REG683XX.INC      & Registeradressen 68332/68340/68360 \\
549REG7000.INC       & Registeradressen TMS70Cxx \\
550REG78310.INC      & Registeradressen \& Vektoren 78K3 \\
551REG78K0.INC       & Registeradressen 78K0 \\
552REG96.INC         & Registeradressen MCS-96 \\
553REGACE.INC        & Registeradressen ACE \\
554REGAVROLD.INC     & Register- \& Bitadressen AVR-Familie (veraltet)\\
555REGAVR.INC        & Register- \& Bitadressen AVR-Familie (aktuell)\\
556REGCOLD.INC       & Registeradressen ColdFire \\
557REGCOP8.INC       & Registeradressen COP8 \\
558REGF8.INC         & Register- \& Speicheradressen F8 \\
559REGGP32.INC       & Registeradressen 68HC908GP32 \\
560REGH16.INC        & Registeradressen H16 \\
561REGHC12.INC       & Registeradressen 68HC12 \\
562REGM16C.INC       & Registeradressen Mitsubishi M16C \\
563REGMSP.INC        & Registeradressen TI MSP430 \\
564REGS12Z.INC       & Register- \& Bitadressen S12Z-Familie \\
565REGST6.INC        & Register- \& Makrodefinitionen ST6 (aktuell)\\
566REGST7.INC        & Register- \& Makrodefinitionen ST7 \\
567REGSTM8.INC       & Register- \& Makrodefinitionen STM8 \\
568REGST9.INC        & Register- \& Makrodefinitionen ST9 \\
569REGZ380.INC       & Registeradressen Z380 \\
570STDDEF04.INC      & Registeradressen 6804 \\
571STDDEF16.INC      & Befehlsmakros und Registeradressen \\
572                  & PIC16C5x \\
573STDDEF17.INC      & Registeradressen PIC17C4x \\
574STDDEF18.INC      & Registeradressen PIC16C8x \\
575STDDEF2X.INC      & Registeradressen TMS3202x \\
576STDDEF37.INC      & Register- \& Bitadressen TMS370xxx \\
577STDDEF3X.INC      & Peripherieadressen TMS320C3x \\
578STDDEF4X.INC      & Peripherieadressen TMS320C4x \\
579STDDEF47.INC      & Befehlsmakros TLCS-47 \\
580STDDEF51.INC      & Definition von SFRs und Bits f"ur \\
581                  & 8051/8052/80515 \\
582STDDEF56K.INC     & Registeradressen DSP56000 \\
583STDDEF5X.INC      & Peripherieadressen TMS320C5x \\
584STDDEF60.INC      & Befehlsmakros \& Registeradressen \\
585                  & PowerPC \\
586STDDEF62.INC      & Registeradressen \& Makros ST6 (veraltet)\\
587STDDEF75.INC      & Registeradressen 75K0 \\
588STDDEF87.INC      & Register- \& Speicheradressen TLCS-870 \\
589STDDEF90.INC      & Register- \& Speicheradressen TLCS-90 \\
590STDDEF96.INC      & Register- \& Speicheradressen TLCS-900 \\
591STDDEFXA.INC      & SFR-\& Bitadressen Philips XA \\
592STDDEFZ8.INC      & Registeradressen Z8-Familie (alt)\\
593REGZ8.INC         & Registeradressen Z8-Familie (neu)\\
594REGSX20.INC       & Register- \& Bitadressen Parallax SX20/28 \\
595AVR/\*.INC        & Register- \& Bitadressen AVR-Familie \\
596                  & (nicht direkt benutzen, REGAVR.INC \\
597                  & inkludieren) \\
598COLDFIRE\/*.INC   & Register- \& Bitadressen ColdFire-Familie \\
599                  & (nicht direkt benutzen, REGCOLD.INC \\
600                  & inkludieren) \\
601S12Z\/*.INC       & Register- \& Bitadressen S12Z-Familie \\
602                  & (nicht direkt benutzen, REGS12Z.INC \\
603                  & inkludieren) \\
604ST6\/*.INC        & Register- \& Bitadressen ST6-Familie \\
605                  & (nicht direkt benutzen, REGST6.INC \\
606                  & inkludieren) \\
607ST7\/*.INC        & Register- \& Bitadressen ST7-Familie \\
608                  & (nicht direkt benutzen, REGST7.INC \\
609                  & inkludieren) \\
610STM8\/*.INC       & Register- \& Bitadressen STM8-Familie \\
611                  & (nicht direkt benutzen, REGSTM8.INC \\
612                  & inkludieren) \\
613Z8\/*.INC         & Register- \& Bitadressen Z8-Familie \\
614                  & (nicht direkt benutzen, REGZ8.INC \\
615                  & inkludieren) \\
616\hline
617{\bf Verzeichnis LIB} & \\
618\hline
619{\bf Verzeichnis MAN} & \\
620\hline
621ASL.1             & Kurzanleitung zu AS \\
622PLIST.1           & Kurzanleitung zu PLIST \\
623PBIND.1           & Kurzanleitung zu PBIND \\
624P2HEX.1           & Kurzanleitung zu P2HEX \\
625P2BIN.1           & Kurzanleitung zu P2BIN \\
626\hline
627\caption{Standardumfang einer Bin"ardistribution
628 \label{TabCommonPackageList}}
629\end{longtable}\end{center}
630
631Je nach Plattform kann eine Bin"ardistribution aber noch weitere Dateien
632enthalten, um einen Betrieb zu erm"oglichen, wie es z.B. bei DOS-Extendern
633der Fall ist.  F"ur die DOS-DPMI-Version \marginpar{{\em DPMI}} ergeben
634sich die in Tabelle \ref{TabDPMIPackageList} gelisteten Erg"anzungen.  Es
635spricht "ubrigens nichts dagegen, als Hilfsprogramme die Versionen aus
636einer DOS-Distribution zu verwenden, da diese einerseits ohne den
637Extender-Overhead deutlich schneller ablaufen und andererseits den
638vom Extender bereitgestellten erweiterten Speicher nicht ben"otigen.
639
640\begin{table*}[htp]
641\begin{center}\begin{tabular}{|l|l|}
642\hline
643Datei             & Funktion \\
644\hline
645\hline
646{\bf Verzeichnis BIN} & \\
647\hline
648DPMI16BI.OVL   & DPMI-Server f"ur den Assembler \\
649RTM.EXE        & Laufzeit-Modul des Extenders \\
650\hline
651\end{tabular}\end{center}
652\caption{Zus"atzliche Dateien in einer DPMI-Bin"ardistribution
653         \label{TabDPMIPackageList}}
654\end{table*}
655
656Eine OS/2-Bin"ardistribution \marginpar{{\em OS/2}} enth"alt neben den
657Basisdateien eine Reihe von DLLs, die zur Laufzeitumgebung des verwendeten
658emx-Compilers geh"oren (Tabelle \ref{TabOS2PackageList}).  Falls man diese
659DLLs (oder neuere Versionen davon) bereits besitzt, kann man diese auch
660wieder l"oschen und seine eigenen benutzen.
661
662\begin{table*}[htp]
663\begin{center}\begin{tabular}{|l|l|}
664\hline
665Datei             & Funktion \\
666\hline
667\hline
668{\bf Verzeichnis BIN} & \\
669\hline
670EMX.DLL           & Laufzeitbibliotheken f"ur AS und \\
671EMXIO.DLL         & die Dienstprogramme \\
672EMXLIBC.DLL       & \\
673EMXWRAP.DLL       & \\
674\hline
675\end{tabular}\end{center}
676\caption{Zus"atzliche Dateien in einer OS/2-Bin"ardistribution
677         \label{TabOS2PackageList}}
678\end{table*}
679
680%%---------------------------------------------------------------------------
681
682\section{Installation}
683
684Eine besondere \marginpar{{\em DOS}} Installation ist f"ur die Nutzung
685einer Bin"ardistribution nicht notwendig, es gen"ugt, das Archiv an
686passender Stelle auszupacken und dann noch einige Kleinigkeiten zu
687erg"anzen.  Als Beispiel hier eine Installation, wie sie vielleicht
688ein UNIX-Anh"anger vornehmen w"urde:
689
690Legen Sie ein Verzeichnis \verb!c:\as! an (im folgenden nehme ich an,
691da"s Sie AS auf Laufwerk C installieren wollen), wechseln Sie in dieses
692und entpacken Sie das Archiv unter Erhalt der Verzeichnisnamen (bei
693Verwendung von PKUNZIP ist dazu die Kommandozeilenoption \verb!-d!
694erforderlich).  Sie sollten jetzt folgenden Verzeichnisbaum haben:
695\begin{verbatim}
696c:\as
697c:\as\bin
698c:\as\include
699c:\as\lib
700c:\as\man
701c:\as\doc
702\end{verbatim}
703Erg"anzen Sie jetzt die \tty{PATH}-Anweisung in Ihrer \tty{AUTOEXEC.BAT}
704um das Verzeichnis \verb!c:\as\bin!, so da"s AS und seine Hilfsprogramme
705vom System gefunden werden.  In dem \tty{lib}-Verzeichnis erzeugen Sie
706mit einem beliebigen Texteditor eine Datei \tty{AS.RC} mit folgendem
707Inhalt:
708\begin{verbatim}
709-i c:\as\include
710\end{verbatim}
711Diese sogenannte {\em Key-Datei} zeigt AS, in welchem Verzeichnis er seine
712Include-Dateien suchen soll.  Damit AS diese Key-Datei bei Start
713auch beachtet, mu"s noch folgende Anweisung in die \tty{AUTOEXEC.BAT}:
714\begin{verbatim}
715set ASCMD=@c:\as\lib\as.rc
716\end{verbatim}
717Was Sie alles noch in der Key-Datei voreinstellen k"onnen, steht im
718folgenden Abschnitt.
719
720Die Installation der DPMI-Version \marginpar{{\em DPMI}} sollte im Prinzip
721genauso verlaufen wie der reinen DOS-Version; wenn der Pfad das {\tt
722bin}-Verzeichnis enth"alt, werden die Dateien des DOS-Extenders
723automatisch gefunden und man sollte von dieser Mimik (mit Ausnahme der
724l"angeren Anlaufzeit...) nichts mitbekommen.  Theoretisch ist es m"oglich,
725da"s Sie auf 80286-Rechnern beim ersten Start mit einer Meldung der
726folgenden Form konfrontiert werden:
727\begin{verbatim}
728  machine not in database (run DPMIINST)
729\end{verbatim}
730Da das Tool DPMIINST bei neueren Versionen des DOS-Extenders von Borland
731aber nicht mehr dabei ist, nehme ich einmal an, da"s diese Sache sich
732erledigt hat...falls doch nicht, bitte ich um R"uckmeldung!
733
734Die Installation der OS/2-Version \marginpar{{\em OS/2}} kann in weiten
735Z"ugen genauso ablaufen wie f"ur die DOS-Version, nur da"s dem System noch
736die DLLs bekannt gemacht werden m"ussen.  Wenn Sie den {\tt
737LIBPATH}-Eintrag in Ihrer {\tt CONFIG.SYS} nicht erweitern wollen, ist es
738nat"urlich auch m"oglich, die DLLs in ein Verzeichnis zu verschieben, das
739bereits dort aufgef"uhrt ist.
740
741Wie bereits erw"ahnt, beschr"ankt sich die Installationsbeschreibung hier
742nur auf Bin"ardistributionen.  Da eine Installation unter Unix
743\marginpar{{\em UNIX}} im Augenblick immer eine Quellcodedistribution ist,
744geht der Verweis hier unisono in Anhang \ref{ChapSource}.
745
746%%---------------------------------------------------------------------------
747
748\section{Aufruf, Parameter}\label{SectCallConvention}
749
750AS ist ein Kommandozeilen-gesteuertes Programm, d.h. alle Parameter
751und Dateiangaben sind in der Kommandozeile anzugeben.
752
753Zu AS geh"ort eine Reihe Reihe von Nachrichtendateien (erkennbar an der
754Endung {\tt MSG}, aus denen AS zur Laufzeit die f"ur die jeweilige
755Landessprache dynamisch nachl"adt.  AS sucht nach diesen Dateien in den
756folgenden Verzeichnissen:
757\begin{itemize}
758\item{im aktuellen Verzeichnis;}
759\item{im Verzeichnis der EXE-Datei;}
760\item{in dem in der Environment-Variablen {\tt AS\_MSGPATH} angegebenen
761      Verzeichnis, oder alternativ in den in der {\tt PATH}-Variablen
762      gelisteten Verzeichnissen;}
763\item{In dem Verzeichnis, das AS zur Kompilationszeit durch das
764      Makro {\tt LIBDIR} mitgegeben wurde.}
765\end{itemize}
766Diese Dateien werden von AS {\em zwingend} zum Betrieb ben"otigt, d.h.
767findet AS diese Dateien nicht, bricht er an dieser Stelle sofort ab.
768
769Die Auswahl der Sprache (momentan Deutsch oder Englisch) orientiert sich
770unter DOS und OS/2 an der {\tt COUNTRY}-Einstellung in der {\tt
771CONFIG.SYS}, unter Unix an der {\tt LANG}-Environment-Variablen.
772
773Um den \marginpar{{\em DOS}} Speicherbedarf von AS unter DOS "uberhaupt
774befriedigen zu k"onnen, wurden die verschiedenen Codegeneratormodule in
775der DOS-Version in einen Overlay verlegt, der Teil des EXE-Files ist.
776Eine getrennte OVR-Datei wie bei fr"uheren Versionen von AS existiert also
777nicht mehr, AS versucht aber wie bisher auch weiterhin, die durch das
778Overlaying entstehenden Verz"ogerungen durch Nutzung von eventuellem EMS-
779oder XMS-Speicher zu reduzieren.  Sollte diese Verwendung zu Problemen
780f"uhren, so k"onnen Sie die Verwendung von EMS bzw. XMS unterbinden, indem
781Sie einer Environment-Variablen \tty{USEXMS} bzw. \tty{USEEMS} den Wert
782\tty{n} zuweisen.  So kann man z.B. mit dem Befehl
783\begin{verbatim}
784   SET USEXMS=n
785\end{verbatim}
786die Verwendung von Extended Memory verhindern.
787\par
788Da AS alle Ein-und Ausgaben "uber das Betriebssystem abwickelt (und daher
789unter DOS auch auf nicht ganz so kompatiblen PC's laufen sollte) und eine
790rudiment"are Bildschirmsteuerung ben"otigt, gibt er w"ahrend der
791Assemblierung ANSI-Steuersequenzen aus.
792Falls Sie in den Ausgaben von AS \marginpar{{\em DOS/}} also seltsame
793Zeichen sehen sollten, fehlt offensichtlich in Ihrer CONFIG.SYS die
794Einbindung des ANSI-Trei\-bers (\tty{device=\-ansi.sys}), die weitere Funktion
795von AS \marginpar{{\em DPMI}} wird dadurch aber nicht beeinflu"st. Alternativ
796k"onnen Sie aber auch die Ausgabe von ANSI-Sequenzen durch das Setzen der
797Environment-Variablen \tty{USEANSI} auf \tty{n} ganz unterdr"ucken.
798
799Der DOS-Extender der DPMI-Version \marginpar{{\em DPMI}} l"a"st sich in
800seiner Speicherbelegung durch diverse Kommandozeilenoptionen beeinflussen.
801Diese k"onnen Sie bei Bedarf der Datei DPMIUSER.DOC entnehmen.
802Zus"atzlich ist ASX in der Lage, bei Bedarf den vorhandenen Speicher
803durch eine Swap-Datei zu ,,erweitern''.  Dazu belegt man eine
804Environment-Variable \tty{ASXSWAP} folgenderma"sen:
805\begin{quote}{\tt
806  SET ASXSWAP=$<$Gr"o"se$>$[,Dateiname]
807}\end{quote}
808Die Gr"o"senangabe erfolgt in Megabytes und \bb{mu"s} gemacht werden.  Der
809Name der Datei ist dagegen optional; fehlt er, so wird die Swap-Datei im
810aktuellen Verzeichnis unter dem Namen \tty{ASX.TMP} angelegt.  In jedem
811Falle wird die Swap-Datei nach Programmende wieder gel"oscht.
812
813Die Kommandozeilenparameter k"onnen grob in drei Klassen eingeteilt
814werden: Schalter, Key-File-Referenzen (s.u.) und Dateispezifikationen.
815Parameter dieser beiden Klassen k"onnen beliebig gemischt in der
816Kommandozeile auftreten, AS wertet zuerst alle Parameter aus und
817assembliert dann die angegebenen Dateien. Daraus folgen zwei Dinge:
818\begin{itemize}
819\item{Die angegebenen Schalter wirken auf alle angegebenen Quelldateien.
820      Sollen mehrere Quelldateien mit unterschiedlich gesetzten Schaltern
821      assembliert werden, so mu"s dies in getrennten L"aufen erfolgen.}
822\item{Es k"onnen in einem Durchgang mehrere Dateien assembliert werden.
823      Um der Sache die Krone aufzusetzen, d"urfen die Dateiangaben
824      Jokerzeichen enthalten.}
825\end{itemize}
826Schalterparameter erkennt AS daran, da"s sie durch einen
827Schr"agstrich (/) oder Bindestrich (-) eingeleitet werden.  Es gibt dabei
828sowohl Schalter, die nur aus einem Buchstaben bestehen, als auch Schalter,
829die aus einem ganzen Wort bestehen.  Immer wenn AS einen Schalter nicht
830als ,,Wort-Schalter'' verstehen kann, so versucht er, die Buchstaben des
831Wortes als einzelne Schalter zu interpretieren.  Wenn man also z.B.
832\begin{verbatim}
833 -queit
834\end{verbatim}
835anstelle von
836\begin{verbatim}
837 -quiet
838\end{verbatim}
839geschrieben h"atte, w"urde AS die Buchstaben \tty{q, u, e, i} und \tty{t}
840als einzelne Schalter auffassen.  Mehrbuchstabige Schalter unterscheiden
841sich weiterhin von einbuchstabigen dadurch, da"s AS bei ihnen beliebige
842Gro"s-und Kleinschreibungen akzeptiert, w"ahrend einbuchstabige Schalter
843je nach Gro"s- oder Kleinschreibung unterschiedliche Bedeutung haben.
844\par
845Momentan sind folgende Schalter definiert:
846\ttindex{SHARED}
847\begin{itemize}
848\item{\tty{l}: Assemblerlisting auf Konsole ausgeben.  Falls mehrere
849      Passes ausgef"uhrt werden m"ussen, landen im Gegensatz zur
850      n"achsten Option die Listings aller Durchg"ange auf der Ausgabe!}
851\item{\tty{L}: Assemblerlisting auf Datei schreiben.  Die Listdatei erh"alt
852      dabei den gleichen Namen wie die Quelldatei, lediglich die Endung
853      wird durch \tty{LST} ersetzt, es sei denn...}
854\item{\tty{OLIST}: mit einem zus"atzlichen Argument legt einen anderen
855      Pfad bzw. Namen f"ur die Listdatei fest.  Falls mehrere Dateien
856      assembliert werden, kann diese Option auch mehrfach gegeben werden.}
857\item{\tty{LISTRADIX}: Defaultm"a"sig erfolgen alle Zahlenausgaben im Listing
858      (Adressen, erzeugter Code, Symboltabelle) im Hexadezimalsystem.  Mit
859      diesem Schalter kann ein beliebiges anderes Zahlensystem im Bereich
860      2 bis 36 angegeben werden, z.B. '-listradix 8' f"ur oktale Ausgaben.}
861\item{\tty{o}:Bestimmt einen neuen Namen f"ur die von AS zu erzeugende
862      Code-Datei.  Wird diese Option mehrfach verwendet, so werden
863      die angegebenen Namen nacheinander den zu assemblierenden
864      Quelldateien zugeordnet; Negation (s.u.) dieser Option in
865      Verbindung mit einem Namen l"oscht den Namen aus der Liste;
866      Negation ohne Namensangabe l"oscht die komplette Liste.}
867\item{\tty{SHAREOUT}:dito, nur f"ur eine eventuell zu erzeugende
868      SHARE-Datei}
869\item{\tty{c}: SHARED-Variablen werden in einem Format abgelegt, das die
870      Einbindung in eine C-Quelldatei erlaubt.  Die Endung der Datei
871      ist \tty{H}.}
872\item{\tty{p}: SHARED-Variablen werden in einem Format abgelegt, das die
873      Einbindung in den \tty{CONST}-Block eines Pascal- oder Modula-Programmes
874      erlaubt.  Die Endung der Datei ist \tty{INC}.}
875\item{\tty{a}: SHARED-Variablen werden in einem Format abgelegt, das die
876      Einbindung in eine Assembler-Quelldatei erlaubt.  Die Endung
877      der Datei ist \tty{INC}.}
878\end{itemize}
879Zu Sinn und Funktion der SHARED-Symbole siehe Kapitel \ref{ChapShareMain}
880bzw. \ref{ChapShareOrder}.
881\begin{itemize}
882\item{\tty{g [Format]}: Mit diesem Schalter erzeugt AS zus"atzlich eine
883      Datei, die Debug-Informationen f"ur dieses Programm enth"alt.
884      Als Format ist dabei entweder ein AS-eigenes Format ({\tt
885      Format=MAP}), eine NoICE-kompatible Kommandodatei ({\tt
886      Format=NOICE}) oder das Format der AVR-Tools ({\tt Format=ATMEL})
887      erlaubt.  Zu den im MAP-Format gespeicherten
888      Informationen geh"ort zum einen die Symboltabelle, zum anderen eine
889      Zuordnung von Quellzeilen zu Maschinenadressen.  Eine genauere
890      Beschreibung des benutzten MAP-Dateiformates findet sich in
891      Abschnitt \ref{SectDebugFormat}.  Die Endung der Datei ist
892      \tty{MAP}, \tty{NOI} bzw. \tty{OBJ}, je nach gew"ahltem Format.
893      Wird keine explizite Formatangabe gemacht, wird das MAP-Format
894      gew"ahlt.}
895\item{\tty{noicemask [Wert]}: Normalerweise listet AS in NoICE-Debuginfos
896      nur Symbole aus dem CODE-Segment.  Mit dieser Option und einem als
897      Bitmaske zu verstehenden Wert lassen sich andere Symbole aus
898      anderen Segmenten zuschalten.  Die Zuordnung von Bits zu Segmenten
899      kann Tabelle \ref{TabSegmentNums} entnommen werden.}
900\item{\tty{w}: Ausgabe von Warnungen unterdr"ucken;}
901\item{\tty{E [Datei]}: Die von AS erzeugten Fehlermeldungen und Warnungen
902      in eine Datei umleiten.  Anstatt einer Datei k"onnen auch die 5
903      Standardhandles (STDIN..STDPRN) als !0 bis !4 angegeben werden.
904      Default ist !2, also STDERR. Wird die Dateiangabe weggelassen,
905      so ist der Name der Fehlerdatei gleich dem der Quelldatei, nur
906      mit der Endung \tty{LOG}.}
907\item{\tty{q}: Dieser Schalter unterdr"uckt alle Meldungen von AS mit
908      Ausnahme von Fehlermeldungen und vom Programm selber erzeugten
909      Ausgaben.  Die Assemblierzeit kann dadurch geringf"ugig reduziert
910      werden, und beim Aufruf aus einer Shell heraus kann man sich eine
911      Umleitung ersparen.  Der Nachteil ist, da"s man u.U. einige Minuten
912      ,,im Dunklen'' steht...  Anstelle von 'q' darf auch 'quiet' geschrieben
913      werden.}
914\item{\tty{h}: Hexadezimalzahlen mit Klein- anstelle von Gro"sbuchstaben ausgeben.
915      Diese Option ist in erster Linie eine Frage des pers"onlichen
916      Geschmacks.}
917\item{\tty{i $<$Pfadliste$>$}: gibt eine Liste von Verzeichnissen an, in denen
918      der Assembler automatisch nach Include-Dateien suchen soll, falls
919      er diese nicht im aktuellen Verzeichnis findet. Die einzelnen
920      Verzeichnisse m"ussen durch Semikolons getrennt werden.}
921\item{\tty{u}: eine Liste der in den Segmenten belegten Bereiche berechnen.
922      Sie ist nur sinnvoll, falls ein Listing erzeugt
923      wird.  Diese Option ben"otigt erhebliche zus"atzliche Speicher-
924      und Rechenleistung, im Normalbetrieb sollte sie daher abgeschaltet
925      sein.  Da AS aber unabh"angig vom eingeschalteten Listing mit dieser
926      Option auf "uberlappende Speicherbelegung pr"uft, hat sie auch
927      unabh"angig vom Listing einen gewissen Sinn...}
928\item{\tty{C}: erzeugt eine Liste mit Querverweisen.  Aufgelistet wird,
929      welche (globalen) Symbole in welchen Dateien in welchen Zeilen
930      benutzt werden.  Auch diese Liste wird nur generiert, falls
931      ein Listing erzeugt wird und belegt w"ahrend der
932      Assemblierung zus"atzlichen Speicherplatz.}
933\item{\tty{s}: eine Liste aller Sektionen (s. Abschnitt \ref{ChapLocSyms})
934      ausgeben.  Die Verschachtelung wird dabei durch Einr"uckungen
935      angedeutet.}
936\item{\tty{I}: Analog zur Sektionsliste eine Liste aller bearbeiteten
937      Include-Dateien ausgeben.}
938\item{\tty{t $<$Maske$>$}: Mit diesem Schalter lassen sich einzelne Komponenten
939      des standardm"a"sig ausgegebenen Assembler-Listings ein-und ausblenden.
940      Welcher Teil dabei welchem Bit zugeordnet ist, ist im "ubern"achsten
941      Abschnitt, der genauer auf das Format des Assembler Listings eingeht,
942      nachgelesen werden.}
943\item{\tty{D $<$Symbolliste$>$}: Symbole definieren. Die hinter dieser Option
944      angegebenen, durch Kommas getrennten Symbole werden in der
945      globalen Symboltabelle vor Beginn der Assemblierung abgelegt.
946      Defaultm"a"sig werden diese Symbole als ganze Zahlen mit dem
947      Wert TRUE abgelegt, mit einem nachgestellten Gleichheitszeichen
948      kann aber auch eine andere Belegung gew"ahlt werden.  Der dem
949      Gleichheitszeichen folgende Ausdruck darf dabei auch Operatoren
950      oder interne Funktionen beinhalten, jedoch \bb{KEINE} anderen
951      Symbole, selbst wenn diese schon davor in der Liste definiert
952      sein sollten!  Zusammen mit den Befehlen zur bedingten
953      Assemblierung (siehe dort) k"onnen so per Kommandozeile aus einer
954      Quelldatei unterschiedliche Programmversionen erzeugt werden.
955      {\bf ACHTUNG!} Wenn case-sensitiv gearbeitet werden soll, mu"s dies
956      in der Kommandozeile {\em vor} Symboldefinitionen angegeben werden,
957      sonst werden Symbolnamen schon an dieser Stelle in Gro"sbuchstaben
958      umgewandelt!}
959\item{\tty{A}: Die Liste globaler Symbole in einer anderen, kompakteren Form
960      ablegen.  Verwenden Sie diese Option, wenn der Assembler bei
961      langen Symboltabellen mit einem Stapel"uberlauf abst"urzt.
962      Eventuell kann diese Option die Arbeitsgeschwindigkeit des
963      Assemblers erh"ohen, dies h"angt jedoch von den Quellen ab.}
964\item{\tty{x}: Legt die Ausf"uhrlichkeitsstufe von Fehlermeldungen fest.
965      Jedesmal, wenn diese Option angegeben wird, wird die Stufe
966      um eins erh"oht oder gesenkt.  W"ahrend auf Stufe 0 (Vorgabe) nur
967      der Fehler selber ausgegeben wird, wird ab Stufe 1 noch eine
968      erweiterte Meldung ausgegeben, anhand der die Identifizierung des
969      Fehlers erleichtert werden soll.  Welche Fehlermeldungen welche
970      Zusatzinformationen tragen k"onnen, steht in Anhang \ref{ChapErrMess}
971      mit der Liste aller Fehlermeldungen.  Auf Stufe 2 (Maximum) wird
972      zus"atzlich noch die betroffene Quellzeile mit ausgegeben.}
973\item{\tty{n}: Wird diese Option angegeben, so werden Fehlermeldungen nicht nur
974      mit ihrem Klartext, sondern auch mit ihren im Anhang
975      \ref{ChapErrMess} genannten internen Nummern ausgegeben.  Diese
976      Option ist prim"ar f"ur Shells und Entwicklungsumgebungen gedacht,
977      denen mit diesen Nummern die Identifizierung von Fehlern erleichtert
978      werden soll.}
979\item{\tty{U}: Mit dieser Option schaltet man AS in den case-sensitiven
980      Modus um, d.h. in Namen von Symbolen, Sektionen, Makros,
981      Zeichentabellen und selbst definierte Funktionen werden Klein-
982      und Gro"sbuchstaben unterschieden, was normalerweise nicht der
983      Fall ist.}
984\item{\tty{P}: weist AS an, den von Makroprozessor und bedingter Assemblierung
985      bearbeiteten Quelltext in einer Datei abzulegen.  Dieser Datei
986      fehlen zus"atzlich Leer- und reine Kommentarzeilen.  Die Endung
987      der Datei ist \tty{I}.}
988\item{\tty{M}: mit diesem Schalter erzeugt AS eine Datei, in der die Definitionen
989      der Makros aus der Quelldatei abgespeichert werden, die die
990      \tty{EXPORT}-Option verwenden.  Diese neue Datei hat den gleichen
991      Namen wie die Quelldatei, lediglich die Endung wird in \tty{MAC} ge"andert.}
992\item{\tty{G}: Dieser Schalter bestimmt, ob AS Code erzeugen soll oder nicht.
993      Ist er ausgeschaltet, wird die Datei zwar assembliert,
994      aber keine Code-Datei geschrieben. Dieser Schalter ist defaultm"a"sig aktiviert
995      (logisch, sonst bek"ame man ja auch gar kein Code-File).}
996\item{\tty{r [n]}: Warnungen ausgeben, falls Situationen eintreten, die
997      einen weiteren Pass erfordern.  Diese Information kann genutzt
998      werden, um die Anzahl der Durchl"aufe zu verringern.  Optional kann
999      man die Nummer des Passes angeben, ab dem diese Warnungen erzeugt
1000      werden; ohne Angabe kommen die Warnungen ab dem ersten Pass.  Machen
1001      Sie sich aber so oder so auf einen ziemlichen Haufen an Meldungen
1002      gefa"st!!}
1003\item{\tty{relaxed}: Mit diesem Schalter aktiviert man den RELAXED-Modus
1004      vom Beginn des Programms an, der ansonsten erst durch die gleichnamige
1005      Pseudoanweisung (siehe Abschnitt \ref{SectRELAXED}) eingeschaltet
1006      werden mu"s.}
1007\item{\tty{Y}: Mit diesem Schalter weist man AS an, alle Fehlermeldungen
1008      wegen zu langer Sprungdistanzen zu verwerfen, sobald die Notwendigkeit
1009      eines neuen Durchlaufs feststeht.  In welchen (seltenen) Situationen
1010      dieser Schalter notwendig ist, kann man in Abschnitt \ref{ForwRefs}
1011      nachlesen.}
1012\item{\tty{cpu $<$Name$>$}: Hiermit kann man man den Zielprozessor
1013      vorgeben, f"ur den AS Code erzeugen soll, wenn die Quelldatei keinen
1014      {\tt CPU}-Befehl enth"alt und es sich nicht um 68008-Code handelt.
1015      Falls das gew"ahlte Ziel CPU-Argumente unterst"utzt (siehe Abschnitt
1016      \ref{SectCPU}), k"onnen diese auch hier angegeben werden.}
1017\item{\tty{alias $<$neu$>$=$<$alt$>$}:\\
1018      definiert den Prozessortyp \tty{$<$neu$>$} als einen Alias f"ur den
1019      Typen \tty{$<$alt$>$}.  Zu den Sinn und Zweck von Aliasen siehe
1020      Abschnitt \ref{SectAlias}}
1021\item{{\tt gnuerrors}: Meldungen "uber Fehler bzw. Warnungen und deren
1022      Position nicht im Standardformat von AS, sondern in einem dem GNU
1023      C-Compiler entlehnten Format anzeigen.  Dies erleichtert die
1024      Integration von AS in f"ur dieses Format ausgelegte Umgebungen,
1025      unterdr"uckt aber gleichzeitig die Anzeige der pr"azisen
1026      Fehlerposition innerhalb Makror"umpfen!}
1027\item{{\tt maxerrors [n]}: Weist den Assembler an, nach der gegebenen
1028      Anzahl von Fehlern die Assemblierung abzubrechen.}
1029\item{{\tt Werror}: Weist den Assembler an, Warnungen als Fehler zu
1030      behandeln.}
1031\end{itemize}
1032Sofern Schalter keine Argumente ben"otigen und ihre Zusammenziehung
1033keinen mehrbuchstabigen Schalter ergibt, k"onnen mehrere Schalter
1034auch auf einen Rutsch angegeben werden, wie z.B im folgenden Beispiel:
1035\begin{verbatim}
1036 as test*.asm firstprog -cl /i c:\as\8051\include
1037\end{verbatim}
1038Es werden alle Dateien TEST*.ASM sowie die Datei FIRSTPROG.ASM
1039assembliert, wobei f"ur alle Dateien Listings auf der Konsole
1040ausgegeben und Sharefiles im C-Format erzeugt werden.  Nach Includes
1041soll der Assembler zus"atzlich im Verzeichnis \verb! C:\AS\8051\INCLUDE !
1042suchen.
1043\par
1044Dieses Beispiel zeigt nebenbei, da"s AS als Defaultendung f"ur Quelldateien
1045\tty{ASM} annimmt.
1046\par
1047Etwas Vorsicht ist bei Schaltern angebracht, die ein optionales Argument
1048haben: Folgt auf einen solchen Schalter ohne Argument ein Dateiname, so
1049versucht AS, diesen als Argument zu verwerten, was naturgem"a"s schief
1050geht:
1051\begin{verbatim}
1052 as -g test.asm
1053\end{verbatim}
1054Die L"osung w"are in diesem Fall, die \tty{-g}-Option ans Ende der
1055Kommandozeile zu setzen oder ein explizites \tty{MAP}-Argument zu
1056spezifizieren.
1057\par
1058Neben der Angabe in der Kommandozeile k"onnen dauernd ben"otigte
1059Optionen in der Environment-Variablen ASCMD abgelegt werden. Wer z.B.
1060immer Listdateien haben m"ochte und ein festes Includeverzeichnis hat,
1061kann sich mit dem Befehl
1062\begin{verbatim}
1063 set ASCMD=-L -i c:\as\8051\include
1064\end{verbatim}
1065eine Menge Tipparbeit ersparen.  Da die Environment-Optionen vor der
1066Kommandozeile abgearbeitet werden, k"onnen Optionen in der
1067Kommandozeile widersprechende im Environment "ubersteuern.
1068\par
1069Bei sehr langen Pfaden kann es jedoch auch in der ASCMD-Variablen eng
1070werden.  F"ur solche F"alle kann auf eine sog. \ii{Key}- Datei
1071ausgewichen werden, in der die Optionen genauso wie in der Kommandozeile
1072oder ASCMD-Variablen abgelegt werden k"onnen, nur da"s diese Datei
1073mehrere Zeilen mit jeweils maximal 255 Zeichen enthalten darf.  Wichtig
1074ist dabei, da"s bei Optionen, die ein Argument ben"otigen, sowohl Schalter
1075als auch Argument in \bb{einer} Zeile stehen m"ussen.  Der Name der
1076Datei wird AS dadurch mitgeteilt, da"s er mit einem vorangestellten
1077Klammeraffen in der ASCMD-Variablen abgelegt wird, z.B.
1078\begin{verbatim}
1079 set ASCMD=@c:\as\as.key
1080\end{verbatim}
1081Um Optionen in der ASCMD-Variablen (oder der Key-Datei) wieder aufzuheben,
1082kann die Option mit einem vorangestellten Pluszeichen wieder aufgehoben
1083werden.  Soll in einem Einzelfall z.B. doch kein Listing erzeugt werden,
1084so kann es mit
1085\begin{verbatim}
1086 as +L <Datei>
1087\end{verbatim}
1088wieder aufgehoben werden.  Nat"urlich ist es nicht ganz logisch, eine
1089Option mit einem Pluszeichen zu negieren...UNIX soit qui mal y pense.
1090\par
1091Referenzen auf eine Key-Datei k"onnen nicht nur von der {\tt
1092ASCMD}-Variablen aus erfolgen, sondern auch direkt von der Kommandozeile
1093aus, indem man analog zur {\tt ASCMD}-Variablen dem Dateinamen einen
1094Klammeraffen voranstellt:
1095\begin{verbatim}
1096 as @<Datei> ....
1097\end{verbatim}
1098Die in einem solchen Fall aus dem Key-File gelesenen Optionen werden so
1099eingearbeitet, als h"atten sie anstelle dieser Referenz in der
1100Kommandozeile gestanden - es ist also {\em nicht} wie bei der {\tt
1101ASCMD}-Variablen so, da"s sie vor allen anderen Kommandozeilenoptionen
1102abgearbeitet werden w"urden.
1103\par
1104Das Referenzieren eines Key-Files von einem Key-File selber ist nicht
1105erlaubt und wird von AS mit einer Fehlermeldung quittiert.
1106\par
1107F"ur den Fall, da"s Sie AS von einem anderen Programm oder einer Shell
1108aufrufen wollen und diese Shell nur Klein- oder Gro"sbuchstaben in der
1109Kommandozeile "ubergeben will, existiert folgendes Workaround: Wird vor
1110den Buchstaben der Option eine Tilde gesetzt, so werden die folgenden
1111Buchstaben immer als Kleinbuchstaben interpretiert.  Analog erzwingt
1112ein Lattenzaun die Interpretation als Gro"sbuchstaben.  Es ergeben
1113sich z.B. folgende Transformationen:
1114\begin{quote}{\tt
1115 /\verb!~!I $\longrightarrow$ /i \\
1116 -\verb!#!u $\longrightarrow$ -U}
1117\end{quote}
1118\par
1119Abh"angig vom Ablauf der Assemblierung endet der Assembler mit
1120folgenden Returncodes:
1121\begin{description}
1122\item[0]{fehlerfreier Ablauf, h"ochstens Warnungen aufgetreten}
1123\item[1]{Der Assembler hat nur die Aufrufparameter ausgegeben und
1124         endete danach sofort.}
1125\item[2]{Es sind Fehler bei der Assemblierung aufgetreten, es wurde
1126         kein Codefile erzeugt.}
1127\item[3]{Es trat ein fataler Fehler w"ahrend des Ablaufes auf, der
1128         zum sofortigen Abbruch gef"uhrt hat.}
1129\item[4]{Bereits w"ahrend des Starts des Assemblers ist ein Fehler
1130         aufgetreten.  Dies kann ein Parameterfehler oder eine fehlerhafte
1131         Overlay-Datei sein.}
1132\item[255]{Bei der Initialisierung ist irgendein interner Fehler
1133         aufgetreten, der auf keinen Fall auftreten sollte...neu booten,
1134         noch einmal probieren, und bei Reproduzierbarkeit mit mir
1135         Verbindung aufnehmen!}
1136\end{description}
1137
1138Zus"atzlich endet jede Assemblierung einer Datei mit einer kleinen
1139Statistik, die Fehlerzahlen, Laufzeit, Anzahl der Durchl"aufe und freien
1140Speicher ausgibt.  Bei eingeschaltetem Assembler-Listing wird diese
1141Statistik zus"atzlich auch in das Listing geschrieben.
1142
1143OS/2 \marginpar{{\em OS/2}} erweitert wie Unix das Datensegment einer
1144Anwendung erst dann, wenn sie wirklich mehr Speicher anfordert.  Eine
1145Angabe wie
1146\begin{quote}{\tt
1147511 KByte verf"ugbarer Restspeicher
1148}\end{quote}
1149bedeutet also nicht einen nahenden Systemabsturz wegen Speichermangel,
1150sondern stellt nur den Abstand zu der Grenze dar, bei der OS/2 einfach
1151ein paar mehr Kohlen in den Ofen schaufelt...
1152
1153Da es unter C \marginpar{{\em UNIX}}  auf verschiedenen Betriebssystemen
1154keine kompatible M"oglichkeit gibt, den noch verf"ugbaren Speicher bzw.
1155Stack zu ermitteln, fehlen bei der C-Version diese beiden Angaben ganz.
1156
1157%%---------------------------------------------------------------------------
1158
1159\section{Format der Eingabedateien}
1160\label{AttrTypes}
1161
1162Wie die meisten Assembler auch erwartet AS genau einen Befehl pro Zeile
1163(Leerzeilen sind nat"urlich auch zugelassen).  Die Zeilen d"urfen nicht
1164l"anger als 255 Zeichen werden, dar"uber hinaus gehende Zeichen werden
1165abgeschnitten.
1166\par
1167Eine einzelne Zeile hat folgendes Format:
1168\begin{verbatim}
1169[Label[:]]<Befehl>[.Attribut] [Parameter[,Parameter..]] [;Kommentar]
1170\end{verbatim}
1171Eine Zeile darf dabei auch "uber mehrere Zeilen in der Quelldatei
1172verteilt sein, Folgezeichen (\verb!\!) verketten diese Teile dann zu
1173einer einzigen Zeile.  Zu beachten ist allerdings, da"s aufgrund der
1174internen Pufferstruktur die Gesamtzeile nicht 256 Zeichen "uberschreiten
1175darf.  Zeilenangaben in Fehlermeldungen beziehen sich immer auf die
1176letzte Zeile einer solchen zusammengesetzten Zeile.
1177\par
1178Der Doppelpunkt nach dem Label ist optional, falls das Label in der
1179ersten Spalte beginnt (woraus folgt, da"s ein Befehl, sei es ein
1180Maschinen- oder Pseudobefehl niemals in Spalte 1 beginnen darf).
1181Man mu"s ihn aber setzen, falls das Label nicht in der ersten Spalte
1182beginnt, damit AS es von einem Befehl unterscheiden kann.  In letzterem
1183Fall mu"s "ubrigens zwischen Doppelpunkt und dem Befehl mindestens ein
1184Leerzeichen stehen, falls der eingestellte Zielprozessor zu denjenigen
1185geh"ort, bei denen das Attribut auch eine mit einem Doppelpunkt
1186abgetrennte Formatangabe sein darf.  Diese Einschr"ankung ist aus
1187Eindeutigkeitsgr"unden n"otig, da sonst keine Unterscheidung zwischen
1188Befehl mit Format und Label mit Befehl m"oglich w"are.
1189\par
1190Einige Signalprozessorreihen von Texas Instruments verwenden den f"ur das
1191Label vorgesehenen Platz wahlweise auch f"ur einen Doppelstrich
1192(\verb!||!), der die parallele Ausf"uhrung mit der vorangehenden
1193Instruktion anzeigt.  Wenn diese beiden Instruktionen auf Maschinenebene
1194in einem einzigen Wort vereinigt werden (C3x/C4x), macht ein zus"atzliches
1195Label vor der zweiten Anweisung nat"urlich keinen Sinn und ist auch nicht
1196vorgesehen.  Anders sieht es beim C6x mit seinen Instruktionspaketen
1197variabler L"ange aus: Wer dort (unsch"onerweise...) mitten in ein Paket
1198hineinspringen will, mu"s das Label daf"ur in eine Extrazeile davor setzen
1199(das gleiche gilt "ubrigens auch f"ur Bedingungen, die aber zusammen mit
1200dem Doppelstrich in einer Zeile stehen d"urfen).
1201\par
1202Das Attribut wird von einer Reihe von Prozessoren benutzt, um
1203Spezialisierungen oder Kodierungsvarianten eines bestimmten Befehls zu
1204spezifizieren.  Die bekannteste Nutzung des Attributs ist die Angabe der
1205Operandengr"o"se, wie z. B. bei der 680x0-Familie (Tabelle
1206\ref{TabAttrs}).
1207\begin{table*}[htb]
1208\begin{center}\begin{tabular}{|l|l|l|}
1209\hline
1210Attribut & arithmetisch-logischer Befehl & Sprungbefehl \\
1211\hline
1212\hline
1213B     & Byte (8 Bit)                   & 8-bit-displacement \\
1214W     & Wort (16 Bit)                  & 16-Bit-Displacement \\
1215L     & Langwort (32 Bit)              & 16-Bit-Displacement \\
1216Q     & Vierfachwort (64 Bit)          & --------- \\
1217C     & Half Precision (16 Bit)        & --------- \\
1218S     & Single Precision (32 Bit)      & 8-Bit-Displacement \\
1219D     & Double Precision (64 Bit)      & --------- \\
1220X     & Extended Precision (80/96 Bit) & 32-Bit-Displacement \\
1221P     & Dezimalgleitkomma (80/96 Bit)  & --------- \\
1222\hline
1223\end{tabular}\end{center}
1224\caption{Erlaubte Attribute (Beispiel 680x0) \label{TabAttrs}}
1225\end{table*}
1226\par
1227Da sich diese Anleitung nicht gleichzeitig als Handbuch f"ur die von AS
1228unterst"utzten Prozessorfamilien versteht, ist dies leider auch nicht der
1229richtige Platz, um hier alle m"oglichen Attribute f"ur alle unterst"utzten
1230Familien aufzuz"ahlen.  Es sei aber angemerkt, da"s i.a. nicht alle Befehle
1231alle Attribute zulassen, andererseits das Fortlassen eines Attributs meist
1232zur Verwendung der f"ur diese Familie ,,nat"urlichen'' Operandengr"o"se
1233f"uhrt.  Zum genaueren Studium greife man auf ein Programmierhandbuch f"ur
1234die jeweilige Familie zur"uck, z.B. in \cite{Williams} f"ur die 68000er.
1235\par
1236Bei TLCS-9000, H8/500 und M16(C) dient das Attribut sowohl der Angabe der
1237Operandengr"o"se, falls diese nicht durch die Operanden klar sein sollte,
1238als auch der des zu verwendenden Befehlsformates.
1239Dieses mu"s durch einen Doppelpunkt von der Operandengr"o"se getrennt werden,
1240z.B. so:
1241\begin{verbatim}
1242    add.w:g   rw10,rw8
1243\end{verbatim}
1244Was dieses Beispiel nicht zeigt, ist, da"s die Formatangabe auch ohne
1245Operandengr"o"se geschrieben werden darf.  Steht demgegen"uber eine
1246Operandengr"o"se ohne Formatangabe, verwendet AS automatisch das
1247k"urzeste Format.  Die erlaubten Befehlsformate und Operandengr"o"sen
1248sind vom Maschinenbefehl abh"angig und k"onnen z.B. \cite{Tosh9000},
1249\cite{HitH8_5}, \cite{MitM16} bzw. \cite{MitM16C} entnommen werden.
1250\par
1251Die Zahl der Befehlsparameter ist abh"angig vom Befehl und kann
1252prinzipiell zwischen 0 und 20 liegen.  Die Trennung der Parameter
1253voneinander erfolgt ausschlie"slich durch Kommas (Ausnahme: DSP56xxx,
1254dessen parallele Datentransfers durch Leerzeichen getrennt werden),
1255wobei in Klammern oder Hochkommas eingeschlossene Kommas nat"urlich
1256nicht beachtet werden.
1257\par
1258Anstelle eines Kommentars am Ende kann die Zeile auch nur aus einem
1259Kommentar bestehen, wenn er in der ersten Spalte beginnt.
1260\par
1261Bei den Leerzeichen zur Trennung einzelnen Komponenten darf es sich
1262genauso gut um Tabulatoren handeln.
1263
1264%%---------------------------------------------------------------------------
1265
1266\section{Format des Listings}
1267
1268Das von AS bei Angabe der Kommandozeilenoptionen \tty{l} oder \tty{L}
1269erzeugte Listing l"a"st sich grob in folgende Teile gliedern:
1270\begin{enumerate}
1271\item{Wiedergabe des assemblierten Quellcodes;}
1272\item{Symbolliste;}
1273\item{Makroliste;}
1274\item{Funktionsliste;}
1275\item{Belegungsliste;}
1276\item{Querverweisliste.}
1277\end{enumerate}
1278Letztere beide werden nur erzeugt, wenn sie durch zus"atzliche
1279Kommandozeilenoptionen angefordert wurden.
1280\par
1281Im ersten Teil listet AS den kompletten Inhalt aller Quelldateien inklusive
1282des erzeugten Codes auf.  Eine Zeile in diesem Listing hat dabei folgende Form:
1283\begin{verbatim}
1284[<n>] <Zeile>/<Adresse> <Code> <Quelle>
1285\end{verbatim}
1286Im Feld $n$ zeigt AS die Include-Verschachtelungstiefe an.  Die
1287Hauptdatei (die Datei, mit der die Assemblierung begann), hat dabei die
1288Tiefe 0, von dort aus eingebundene Dateien haben Tiefe 1 usw.  Die Tiefe
12890 wird dabei nicht angezeigt.
1290\par
1291Im Feld \tty{Zeile} wird die Zeilennummer bezogen auf die jeweilige Datei
1292ausgegeben.  Die erste Zeile einer Datei hat dabei Nummer 1.  Die Adresse,
1293an der der f"ur diese Zeile erzeugte Code abgelegt wurde, folgt hinter dem
1294Schr"agstrich im Feld \tty{Adresse}.
1295\par
1296Der erzeugte Code selber steht dahinter im Feld \tty{Code} in
1297hexadezimaler Schreibweise.  Je nach Prozessortyp und aktuellem Segment
1298k"onnen die Werte entweder als Bytes oder 16/32-Bit-Worte formatiert sein.
1299Sollte mehr Code erzeugt worden sein, als in das Feld hineinpa"st, so
1300werden im Anschlu"s an die Zeile weitere Zeilen erzeugt, in denen nur
1301dieses Feld belegt ist.
1302\par
1303Im Feld \tty{Quelle} schlu"sendlich wird die Zeile aus der Quelldatei in
1304ihrer Originalform ausgegeben.
1305\par
1306Die Symboltabelle ist so ausgelegt, da"s sie nach M"oglichkeit immer in 80
1307Spalten dargestellt werden kann.  F"ur Symbole ,,normaler L"ange'' wird
1308eine zweispaltige Ausgabe gew"ahlt.  Sollten einzelne Symbole mit ihrem
1309Wert die Grenze von 40 Spalten "uberschreiten, werden sie in einer
1310einzelnen Zeile ausgegeben.  Die Ausgabe erfolgt in alphabetischer
1311Reihenfolge.  Symbole, die zwar definiert, aber nie benutzt wurden,
1312werden mit einem vorangestellten Stern (\verb!*!) gekennzeichnet.
1313\par
1314Die bisher genannten Teile sowie die Auflistung aller definierten
1315Makros / Funktionen lassen sich selektiv aus dem Gesamtlisting ein-und
1316ausblenden, und zwar mit dem bereits erw"ahnten \tty{t}-Kommandozeilenschalter.
1317Intern existiert in AS ein Byte, dessen Bits repr"asentieren, welche Teile
1318ausgegeben werden sollen.  Die Zuordnung von Bits zu den Teilen ist in
1319Tabelle \ref{TabTBits} aufgelistet.
1320\par
1321\begin{table*}[p]
1322\begin{center}\begin{tabular}{|l|l|}
1323\hline
1324Bit & Teil \\
1325\hline
1326\hline
13270   & Quelldatei(en)+erzeugter Code \\
13281   & Symboltabelle \\
13292   & Makroliste \\
13303   & Funktionsliste \\
13314   & Zeilennumerierung \\
13325   & Registersymboltabelle \\
13337   & Zeichentabellenliste \\
1334\hline
1335\end{tabular}\end{center}
1336\caption{Zuordnung der Bits zu den Listingkomponenten\label{TabTBits}}
1337\end{table*}
1338Defaultm"a"sig sind alle Bits auf 1 gesetzt, bei Verwendung des Schalters
1339\begin{verbatim}
1340-t <Maske>
1341\end{verbatim}
1342werden die in \verb!<Maske>! gesetzten Bits gel"oscht, so da"s die entsprechenden
1343Listing-Teile unterdr"uckt werden.  Analog lassen sich mit einem Pluszeichen
1344einzelne Teile wieder einschalten, falls man es in der \tty{ASCMD}-Variablen
1345"ubertrieben hat...will man z.B. nur die Symboltabelle haben, so reicht
1346\begin{verbatim}
1347-t 2  .
1348\end{verbatim}
1349In der Belegungsliste werden f"ur jedes Segment einzeln die belegten Bereiche
1350hexadezimal ausgegeben.  Handelt es sich bei einem Bereich um eine einzige
1351Adresse, wird nur diese ausgegeben, ansonsten erste und letzte Adresse.
1352\par
1353In der Querverweisliste wird f"ur jedes definierte Symbol in alphabetischer
1354Reihenfolge eine Ausgabe folgender Form erzeugt:
1355\begin{verbatim}
1356Symbol <Symbolname> (=<Wert>,<Datei>/<Zeile>):
1357 Datei <Datei 1>:
1358 <n1>[(m1)]  ..... <nk>[(mk)]
1359 .
1360 .
1361 Datei <Datei l>:
1362 <n1>[(m1)]  ..... <nk>[(mk)]
1363\end{verbatim}
1364F"ur jedes Symbol wird aufgelistet, in welchen Dateien es in welchen Zeilen
1365angesprochen wurde.  Sollte ein Symbol mehrmals in der gleichen Zeile
1366benutzt worden sein, so wird dies durch eine in Klammern gesetzte Anzahl
1367hinter der Zeilennummer angedeutet.  Sollte ein Symbol niemals benutzt
1368worden sein, erscheint es auch nicht in der Liste; entsprechend erscheint
1369eine Datei auch "uberhaupt nicht in der Liste eines Symbols, falls es in
1370der entsprechenden Datei nicht referenziert wurde.
1371\par
1372\bb{ACHTUNG!} AS kann dieses Listing nur dann korrekt aufs Papier bringen,
1373wenn man ihm vorher die L"ange und Breite des Ausgabemediums mit Hilfe des
1374\tty{PAGE}-Befehls (siehe dort) mitgeteilt hat!  Der voreingestellte
1375Default sind 60 Zeilen und eine unbegrenzte Zeilenbreite.
1376
1377%%---------------------------------------------------------------------------
1378
1379\section{Symbolkonventionen}
1380\label{SectSymConv}
1381
1382Symbole d"urfen zwar (wie in der Einleitung bereits angedeutet) bis zu
1383255 Zeichen lang werden und werden auch auf der ganzen L"ange
1384unterschieden, die Symbolnamen m"ussen aber einigen Konventionen
1385gen"ugen:
1386\par
1387Symbolnamen d"urfen aus einer beliebigen Kombination von Buchstaben,
1388Ziffern, Unterstrichen und Punkten bestehen, wobei das erste Zeichen
1389keine Ziffer sein darf.  Der Punkt wurde nur zugelassen, um der
1390MCS-51-Notation von Registerbits zu gen"ugen, und sollte m"oglichst nicht in
1391eigenen Symbolnamen verwendet werden.  Zur Segmentierung von Symbolnamen
1392sollte auf jeden Fall der Unterstrich und nicht der Punkt verwendet werden.
1393\par
1394Defaultm"a"sig ist AS nicht case-sensitiv, es ist also egal, ob man
1395Gro"s-oder Kleinbuchstaben verwendet.  Mittels des Kommandozeilenschalters
1396\tty{U} l"a"st sich AS jedoch in einen Modus umschalten, in dem Gro"s- und
1397Kleinschreibung unterschieden wird. Ob AS umgeschaltet wurde, kann mit dem
1398vordefinierten Symbol \tty{CASESENSITIVE} ermittelt werden: TRUE bedeutet
1399Unterscheidung, FALSE keine.
1400\par
1401Tabelle \ref{TabPredefined} zeigt die wichtigsten, von AS vordefinierten
1402Symbole.
1403\begin{table*}[p]
1404\begin{center}\begin{tabular}{|l|l|}
1405\hline
1406Name             & Bedeutung \\
1407\hline
1408\hline
1409\tty{TRUE}             & logisch ,,wahr'' \\
1410\tty{FALSE}            & logisch ,,falsch'' \\
1411\tty{CONSTPI}          & Kreiszahl Pi (3.1415.....) \\
1412\tty{VERSION}          & Version von AS in BCD-Kodierung, \\
1413                       & z.B. 1331 hex f"ur Version 1.33p1 \\
1414\tty{ARCHITECTURE}     & Zielplattform, f"ur die AS "ubersetzt wurde, \\
1415                       & in der Form Prozesor-Hersteller-Betriebssystem \\
1416\tty{DATE}             & Datum und \\
1417\tty{TIME}             & Zeitpunkt der Assemblierung (Beginn) \\
1418\tty{MOMCPU}           & momentan gesetzte Ziel-CPU \\
1419\tty{MOMCPUNAME}       & dito, nur als voll ausgeschriebener String \\
1420\tty{MOMFILE}          & augenblickliche Quelldatei \\
1421\tty{MOMLINE}          & Zeilennummer in Quelldatei \\
1422\tty{MOMPASS}          & Nummer das laufenden Durchgangs \\
1423\tty{MOMSECTION}       & Name der aktuellen Sektion oder \\
1424                       & Leerstring \\
1425\tty{MOMSEGMENT}       & Name des mit \tty{SEGMENT} gew"ahlten \\
1426                       & Adre"sraumes \\
1427\verb!*!, \$ bzw. \tty{PC} & mom. Programmz"ahler \\
1428\hline
1429\end{tabular}\end{center}
1430\caption{Vordefinierte Symbole\label{TabPredefined}}
1431\end{table*}
1432\bb{VORSICHT!}  W"ahrend es im case-insensitiven Modus egal ist,
1433mit welcher Kombination von Gro"s- und Kleinbuchstaben man
1434vordefinierte Symbole anspricht, mu"s man sich im case-sensitiven
1435Modus exakt an die oben angegebene Schreibweise (nur Gro"sbuchstaben)
1436halten!
1437\par
1438Zus"atzlich definieren einige Pseudobefehle noch Symbole, die eine
1439Abfrage des damit momentan eingestellten Wertes erm"oglichen.  Deren
1440Beschreibung findet sich bei den zugeh"origen Befehlen.
1441\par
1442Ein etwas verstecktes (und mit Vorsicht zu nutzendes) Feature ist,
1443Symbolnamen aus String-Variablen zusammenzubauen, indem man den
1444Namen des Strings mit geschweiften Klammern in den Symbolnamen
1445einbaut.  So kann man z.B. den Namen eines Symbols anhand des
1446Wertes eines anderen Symbols festlegen:
1447\begin{verbatim}
1448cnt		set	cnt+1
1449temp		equ	"\{CNT}"
1450		jnz	skip{temp}
1451		.
1452		.
1453skip{temp}:	nop
1454\end{verbatim}
1455\bb{ACHTUNG!}  Der Programmierer ist selber daf"ur verantwortlich,
1456da"s sich dabei g"ultige Symbolnamen ergeben!
1457\par
1458Eine vollst"andige Auflistung aller von AS verwendeten Symbolnamen
1459findet sich in Anhang \ref{AppInternSyms}.
1460\par
1461Neben seinem Wert besitzt auch jedes Symbol eine Markierung, zu welchen
1462{\em Segment} es geh"ort.  In erster Linie wird eine solche Unterscheidung
1463bei Prozessoren ben"otigt, die mehrere Adre"sr"aume besitzen.  AS kann mit
1464dieser Zusatzinformation bei Zugriffen "uber ein Symbol warnen, wenn ein
1465f"ur diesen Adre"sraum ungeeigneter Befehl verwendet wird.  Ein
1466Segmentattribut wird einem Symbol automatisch angeh"angt, wenn es als Label
1467oder mit einem Spezialbefehl (z.B. \tty{BIT}) definiert wird; ein mit
1468dem ,,Universalbefehl'' \tty{SET} oder \tty{EQU} definiertes Symbol ist
1469jedoch ,,typenlos'', d.h. seine Verwendung wird niemals Warnungen
1470ausl"osen.  Das Segmentattribut eines Symbols kann mit der eingebauten
1471Funktion \tty{SYMTYPE} abgefragt werden, etwa so:
1472\begin{verbatim}
1473Label:
1474        .
1475        .
1476Attr    equ     symtype(Label)  ; ergibt 1
1477\end{verbatim}
1478Den einzelnen Segmenttypen sind die in Tabelle \ref{TabSegNums}
1479aufgelisteten Nummern zugeordnet.  Die aus der Ordnung normaler Symbole
1480etwas herausfallenden Registersymbole sind n"aher in Abschnitt
1481\ref{SectRegSyms} erl"autert.  Mit einem undefinierten Symbol als Argument
1482liefert die \tty{SYMTYPE}-Funktion -1 als Ergebnis.  Ob ein Symbol "uberhaupt
1483definiert ist, l"a"st sich auch einfach mit der \tty{DEFINED}-Funktion abfragen.
1484\begin{table}[htb]
1485\begin{center}
1486\begin{tabular}{|l|c|}
1487\hline
1488Segment & R"uckgabewert \\
1489\hline
1490$<$keines$>$ & 0 \\
1491CODE & 1 \\
1492DATA & 2 \\
1493IDATA & 3 \\
1494XDATA & 4 \\
1495YDATA & 5 \\
1496BITDATA & 6 \\
1497IO & 7 \\
1498REG & 8 \\
1499ROMDATA & 9 \\
1500EEDATA & 10 \\
1501$<$Registersymbol$>$ & 128 \\
1502\hline
1503\end{tabular}
1504\end{center}
1505\caption{R"uckgabewerte der \tty{SYMTYPE}-Funktion\label{TabSegNums}}
1506\end{table}
1507
1508%%---------------------------------------------------------------------------
1509
1510\section{Tempor"are Symbole}
1511
1512Besonders bei Programmen mit vielen aufeinanderfolgenden Schleifen oder
1513IF-artigen Strukturen steht man immer wieder vor dem Problem, sich
1514st"andig neue Namen f"ur Labels ausdenken zu m"ussen.  Dabei wei"s man an
1515sich genau, da"s man dieses Label nie wieder brauchen wird und am liebsten
1516in irgendeiner Weise 'verwerfen' m"ochte.  Eine einfache L"osung, wenn man
1517nicht gleich den gro"sen Hammer des Sektionskonzeptes (siehe Kapitel
1518\ref{ChapLocSyms}) schwingen m"ochte, sind {\em tempor"are} Symbole, die
1519solange ihre G"ultigkeit behalten, bis ein neues, nicht-tempor"ares Symbol
1520definiert wird.  Andere Assembler bieten einen "ahnlichen Mechanismus an,
1521der dort unter dem Stichwort 'lokale Symbole' l"auft, zur besseren
1522Abgrenzung gegen das Sektionskonzept m"ochte ich aber beim Begriff
1523'tempor"are Symbole' bleiben.  AS kennt drei unterschiedliche Typen von
1524tempor"aren Symbolen, um jedem 'Umsteiger' ein Konzept anzubieten, das den
1525Umstieg so einfach wie m"oglich macht.  Leider kocht quasi jeder Assembler
1526bei diesem Thema sein eigenes S"uppchen, so da"s es nur in Ausnahmef"allen
1527eine 1:1-L"osung f"ur existierenden Code geben wird:
1528
1529\subsection{Tempor"are Symbole mit Namen}
1530
1531Ein Symbol, dessen Name mit zwei Dollarzeichen beginnt (dies ist weder
1532f"ur normale Symbole noch Konstanten zul"assig), ist ein tempor"ares
1533Symbol mit Namen.  AS f"uhrt intern einen Z"ahler mit, der zu Beginn der
1534Assemblierung auf Null gesetzt wird und bei jeder Definition eines
1535nicht-tempor"aren Symbols inkrementiert wird.  Wird ein tempor"ares Symbol
1536definiert oder referenziert, so werden die beiden f"uhrenden Dollarzeichen
1537gestrichen und der momentane Stand des Z"ahlers wird angeh"angt.  Auf
1538diese Weise erh"alt man mit jedem nicht-tempor"aren Symbol sozusagen die
1539Symbolnamen zur"uck - man kommt an die Symbole vor dieser Definition aber
1540auch nicht mehr heran!  Tempor"are Symbole bieten sich daher besonders
1541f"ur den Einsatz in kleinen Anweisungsbl"ocken an, typischerweise etwa ein
1542Dutzend Befehle, auf keinen Fall mehr als eine Bildschirmseite, sonst
1543kommt man leicht durcheinander...
1544
1545Hier ein kleines Beispiel:
1546\begin{verbatim}
1547$$loop: nop
1548        dbra    d0,$$loop
1549
1550split:
1551
1552$$loop: nop
1553        dbra    d0,$$loop
1554\end{verbatim}
1555W"are das zwischen den Schleifen liegende nicht-tempor"are Label nicht
1556vorhanden, g"abe es nat"urlich eine Fehlermeldung wegen eines doppelt
1557definierten Symbols.
1558
1559{\em Namenlose Tempor"are Symbole}
1560
1561F"ur all jene, denen tempor"are Symbole mit Namen noch immer zu
1562kompliziert sind, gibt es eine noch einfachere Variante: Setzt man als
1563Label ein einfaches Plus- oder Minuszeichen, so werden diese in die Namen
1564{\tt \_\_forwnn} bzw. {\tt \_\_backmm} umgesetzt, wobei {\tt nn} bzw. {\tt mm}
1565von Null an laufende Z"ahler sind.  Referenziert werden diese Symbole
1566"uber die Sonderwerte {\tt - -- ---} bzw. {\tt + ++ +++}, womit sich die
1567drei letzten 'Minussymbole' bzw die drei n"achsten 'Plussymbole'
1568referenzieren lassen.  Welche Variante man benutzt, h"angt also davon ab,
1569ob man ein Symbol vorw"arts oder r"uckw"arts referenzieren will.
1570
1571Bei der {\em Definition} namenloser tempor"arer Symbole gibt es neben dem
1572Plus- und Minuszeichen noch eine dritte Variante, n"amlich einen
1573Schr"agstrich (/).  Ein so definiertes tempor"ares Symbol kann
1574gleicherma"sen vorw"arts wie r"uckw"arts referenziert werden; d. h. je
1575nach Referenzierung wird es wie ein Minus oder Plus behandelt.
1576
1577Namenlose tempor"are Symbole finden ihre Anwendung "ublicherweise in
1578Konstruktionen, die auf eine Bildschirmseite passen, wie das bedingte
1579"Uberspringen von ein paar Maschinenbefehlen oder kleinen Schleifen -
1580ansonsten w"urde die Sache zu un"ubersichtlich werden (das ist aber nur
1581ein gut gemeinter Rat...).  Ein Beispiel daf"ur ist das folgende St"uck
1582Code, zur Abwechslung mal als 65xx-Code:
1583\begin{verbatim}
1584        cpu     6502
1585
1586-       ldx     #00
1587-       dex
1588        bne     -            ; springe zu 'dex'
1589        lda     RealSymbol
1590        beq     +            ; springe zu 'bne --'
1591        jsr     SomeRtn
1592        iny
1593+       bne     --           ; springe zu 'ldx #00'
1594
1595SomeRtn:
1596        rts
1597
1598RealSymbol:
1599        dfs     1
1600
1601  	inc	ptr
1602   	bne 	+      	    ; springe zu 'tax'
1603   	inc 	ptr+1
1604+ 	tax
1605
1606 	bpl 	++     	    ; springe zu 'dex'
1607   	beq 	+      	    ; springe vorwaerts zu 'rts'
1608   	lda 	#0
1609/  	rts            	    ; Schraegstrich = Wildcard
1610+ 	dex
1611   	beq 	-           ; springe rueckwaerts zu 'rts'
1612
1613ptr:	dfs	2
1614\end{verbatim}
1615
1616\subsection{Zusammengesetzte tempor"are Symbole}
1617
1618Dies ist vielleicht der Typ von tempor"aren Symbolen, der dem Konzept von
1619lokalen Symbolen und Sektionen am n"achsten kommt.  Wann immer der Name
1620eines Symboles mit einem Punkt (.) anf"angt, wird das Symbol nicht mit
1621diesem Namen in der Symboltabelle abgelegt.  Stattdessen wird der Name des
1622zuletzt definierten Symbols ohne vorangestellten Punkt davorgeh"angt.  Auf
1623diese Weise nehmen Symbole, deren Name nicht mit einem Punkt anf"angt, quasi
1624die Rolle von 'Bereichsgrenzen' ein und Symbole, deren Name mit einem
1625Punkt anf"angt, k"onnen in jedem Bereich neu verwendet werden.  Sehen wir
1626uns das folgende kurze Beispiel an:
1627\begin{verbatim}
1628proc1:                    ; nicht-tempor"ares Symbol 'proc1'
1629
1630.loop   moveq   #20,d0    ; definiert in Wirklichkeit 'proc1.loop'
1631        dbra    d0,.loop
1632        rts
1633
1634proc2:                    ; nicht-tempor"ares Symbol 'proc2'
1635
1636.loop   moveq   #10,d1    ; definiert in Wirklichkeit 'proc2.loop'
1637        jsr     proc1
1638        dbra    d1,.loop
1639        rts
1640\end{verbatim}
1641Man beachte, da"s es weiterhin m"oglich ist, auf alle tempor"aren Symbole
1642zuzugreifen, auch wenn man sich nicht im gleichen 'Bereich' befindet,
1643indem man einfach den zusammengesetzten Namen benutzt (wie z.B.
1644'proc2.loop' im voranstehenden Beispiel).
1645
1646Zusammengesetzte Symbole lassen sich prinzipiell mit Sektionen kombinieren
1647und k"onnen so auch zu lokalen Symbolen werden.  Man beachte allerdings,
1648da"s das zuletzt definierte, nicht tempor"are Symbol nicht pro Sektion
1649gespeichert wird, sondern lediglich global.  Das kann sich
1650aber auch irgendwann einmal "andern, man sollte sich also nicht auf das
1651augenblickliche Verhalten verlassen.
1652
1653%%---------------------------------------------------------------------------
1654
1655\section{Formelausdr"ucke}
1656
1657An den meisten Stellen, an denen der Assembler Zahlenangaben erwartet,
1658k"onnen nicht nur einfache Symbole oder Konstanten angegeben werden,
1659sondern ganze Formelausdr"ucke.  Bei den Komponenten der Formelausdr"ucke
1660kann es sich sowohl um ein einzelnes Symbol als auch um eine Konstante
1661handeln.  Konstanten d"urfen entweder Integer-, Gleitkomma-, oder
1662Stringkonstanten sein.
1663
1664\subsection{Integerkonstanten}
1665\label{SectIntConsts}
1666
1667Integerkonstanten bezeichnen ganze Zahlen.  Sie werden als eine
1668Folge von Ziffern geschrieben.  Dies kann in verschiedenen
1669Zahlensystemen erfolgen, deren Kennzeichnung von verwendeten
1670Zielprozessor abh"angt (Tabelle
1671\ref{TabSystems}).
1672\par
1673\begin{table*}[htbp]
1674\begin{center}\begin{tabular}{|l|c|c|c|}
1675\hline
1676            & Intel-Modus      & Motorola-Modus       &   C-Modus  \\
1677            & (Intel, Zilog,   & (Rockwell, Motorola, &  (PowerPC, \\
1678            & Thomson, Texas,  &  Microchip, Thomson, &   AMD29K,  \\
1679            & Toshiba, NEC,    &  Hitachi)            &   National,\\
1680            & Siemens, Philips, &                     &   Symbios, \\
1681            & Fujitsu, Fairchild, &                   &   Atmel)   \\
1682            & Intersil)        &                      &            \\
1683\hline
1684\hline
1685dezimal     & direkt           & direkt               & direkt \\
1686hexadezimal & nachgestelltes H & vorangestelltes \$   & vorangestelltes 0x \\
1687bin"ar      & nachgestelltes B & vorangestelltes \%   & vorangestelltes 0b \\
1688oktal       & nachgestelltes O & vorangestelltes @    & vorangestellte 0 \\
1689            & nachgestelltes Q &                      &                  \\
1690\hline
1691\end{tabular}\end{center}
1692\caption{m"ogliche Zahlensysteme\label{TabSystems}}
1693\end{table*}
1694Falls das Zahlensystem nicht explizit durch vor-oder nachgestellte Zeichen
1695vorgegeben wird, nimmt AS die Basis an, die mit dem {\tt RADIX}-Befehl
1696vorgegeben wurde (der Default dieser Einstellung ist wiederum 10).  Mit
1697diesem Befehl lassen sich auch ,,ungew"ohnliche" Zahlensysteme, d.h.
1698andere als 2, 8, 10 oder 16 einstellen.
1699
1700G"ultige Ziffern sind die Zahlen 0 bis 9 sowie die Buchstaben A bis Z
1701(Wert 10 bis 35) bis zur Basis des Zahlensystems minus eins.  Die
1702Verwendung von Buchstaben in Integerkonstanten bringt allerdings auch
1703einige Mehrdeutigkeiten mit sich, da Symbolnamen ja auch Ketten aus Zahlen
1704und Buchstaben sind: Ein Symbolname darf nicht mit einem Zeichen von 0 bis
17059 beginnen, was bedeutet, da"s eine Integerkonstante, die nicht durch ein
1706anderes Sonderzeichen eindeutig als solche erkennbar ist, niemals mit
1707einem Buchstaben beginnen darf; notfalls mu"s man eine eigentlich
1708"uberfl"ussige Null voranstellen.  Der bekannteste Fall ist das Schreiben
1709von Hexadezimalkonstanten im Intel-Modus: Ist die vorderste Stelle
1710zwischen A und F, so hilft das hintangestellte H "uberhaupt nichts, es
1711mu"s noch eine Null davor (statt F0H also 0F0H).  Die Motorola-oder
1712C-Syntax, die beide das Zahlensystem am Anfang einer Integerkonstante
1713kennzeichnen, kennen dieses Problem nicht.
1714
1715Reichlich heimt"uckisch ist auch, da"s bei immer h"oheren, mit {\tt RADIX}
1716eingestellten Zahlensystemen, die bei Intel- und C-Syntax benutzten
1717Buchstaben zur Zahlensystemkennung immer weiter ,,aufgefressen'' werden; so
1718kann man z.B. nach {\tt RADIX 16} keine bin"aren Konstanten mehr
1719schreiben, und ab {\tt RADIX 18} in Intel-Syntax auch keine hexadezimalen
1720Konstanten mehr.  Also {\bf VORSICHT!}
1721
1722Mit Hilfe des \tty{RELAXED}-Befehls (siehe Abschnitt \ref{SectRELAXED})
1723kann die starre Zuordnung einer Schreibweise zu einem Zielprozessor
1724aufgehoben werden, so da"s man eine beliebige Schreibweise verwenden
1725kann (auf Kosten der Kompatibilit"at zu Standard-Assemblern).
1726Defaultm"a"sig ist diese Option aber ausgeschaltet.  Ebenfalls mit dieser
1727Option er"offnet sich eine weitere, vierte Schreibweise f"ur
1728Integerkonstanten, wie man sie bei manchen Fremdassemblern antrifft:  Bei
1729dieser Schreibweise wird der eigentliche Wert in Hochkommas geschrieben
1730und das Zahlensystem ('x' oder 'h' f"ur hexadezimal, 'o' f"ur oktal und 'b'
1731f"ur bin"ar) direkt davor.  Die Integer-Konstante 305419896 kann damit
1732also folgenderma"sen geschrieben werden:
1733\begin{verbatim}
1734 x'12345678'
1735 h'12345678'
1736 o'2215053170'
1737 b'00010010001101000101011001111000'
1738\end{verbatim}
1739Diese Schreibweise ist f"ur keine Prozessorarchitektur der Default und nur
1740im \tty{RELAXED}-Modus erreichbar.  Sie dient in erster Linie der
1741einfacheren Portierung von Fremdquellen und wird nicht f"ur neu erstellte
1742Programme empfohlen.
1743
1744\subsection{Gleitkommakonstanten}
1745
1746Gleitkommazahlen werden in der "ublichen halblogarithmischen
1747Schreibweise geschrieben, die in der allgemeinsten Form
1748\begin{verbatim}
1749 [-]<Vorkommastellen>[.Nachkommastellen][E[-]Exponent]
1750\end{verbatim}
1751lautet. \bb{ACHTUNG!} Der Assembler versucht eine Konstante zuerst als
1752Integerkonstante zu verstehen und macht erst dann einen Versuch mit
1753Gleitkomma, falls dies gescheitert ist.  Will man aus irgendwelchen
1754Gr"unden die Auswertung als Gleitkommazahl erzwingen, so kann man
1755dies durch Dummy-Nachkommastellen erreichen, z.B. \tty{2.0} anstelle
1756\tty{2}.
1757
1758\subsection{Stringkonstanten}
1759\label{SectStringConsts}
1760
1761Stringkonstanten m"ussen in einfache oder doppelte Hochkommas
1762eingeschlossen werden.  Um diese selber und andere Sonderzeichen ohne
1763Verrenkungen in String-Konstanten einbauen zu k"onnen, wurde ein
1764,,Escape-Mechanismus'' eingebaut, der C-Programmierer*innen bekannt
1765vorkommen d"urfte:
1766
1767Schreibt man einen Backslash mit einer maximal dreiziffrigen Zahl im
1768String, so versteht der Assembler dies als Zeichen mit dem entsprechenden
1769dezimalen ASCII-Wert.  Alternativ kann der Zahlenwert auch hexadezimal
1770oder oktal mit einem vorangestellten x oder einer vorangestellten 0
1771geschrieben werden.  F"ur die hexadezimale Schreibweise reduziert sich die
1772Maximalanzahl von Stellen auf 2.  So kann man z.B. mit {\tt\verb!\3!} ein
1773ETX-Zeichen definieren.  Vorsicht allerdings mit der Definition von
1774NUL-Zeichen!  Da die C-Version \marginpar{{\em UNIX}} von AS momentan
1775intern zur Speicherung von String-Symbolen C-Strings benutzt (die durch
1776NUL-Zeichen terminiert werden), sind NUL-Zeichen in Strings momentan nicht
1777portabel!
1778
1779Einige besonders h"aufig gebrauchte Steuerzeichen kann man auch mit
1780folgenden Abk"urzungen erreichen:
1781\begin{quote}\begin{tabbing}
1782\hspace{4cm} \= \hspace{4cm} \= \kill
1783\verb!\b! : Backspace \> \verb!\a! : Klingel        \> \verb!\e! : Escape \\
1784\verb!\t! : Tabulator \> \verb!\n! : Zeilenvorschub \> \verb!\r! : Wagenr"ucklauf \\
1785\verb!\\! : Backslash \> \verb!\'! oder \verb!\h! : Hochkomma \\
1786\verb!\"! oder \verb!\i! : G"ansef"u"schen \\
1787\end{tabbing}\end{quote}
1788Die Kennbuchstaben d"urfen sowohl gro"s als auch klein geschrieben
1789werden.
1790\par
1791"Uber dieses Escape-Zeichen k"onnen sogar Formelausdr"ucke in den
1792String eingebaut werden, wenn sie in geschweifte Klammern eingefa"st
1793werden: z.B. ergibt
1794\begin{verbatim}
1795    message "Wurzel aus 81 : \{sqrt(81)}"
1796\end{verbatim}
1797die Ausgabe
1798\begin{verbatim}
1799    Wurzel aus 81 : 9
1800\end{verbatim}
1801Der Assembler w"ahlt anhand des Formelergebnistyps die richtige
1802Ausgabeform, zu vermeiden sind lediglich weitere Stringkonstanten
1803im Ausdruck, da der Assembler bei der Gro"s-zu-Kleinbuchstabenumwandlung
1804sonst durcheinander kommt.  Integer-Ausdr"ucke werden defaultm"a"sig
1805hexadezimal ausgegeben, dies l"a"st sich jedoch mit dem
1806\tty{OUTRADIX}-Befehl "andern.
1807\par
1808Bis auf den Einbau von Formelausdr"ucken ist dieser Escape-Mechanismus
1809auch in als ASCII definierten Integerkonstanten zul"assig, z.B. so:
1810\begin{verbatim}
1811   move.b   #'\n',d0
1812\end{verbatim}
1813Jedoch hat alles seine Grenzen, weil der dar"uberliegende Splitter, der
1814die Zeile in Opcode und Parameter zerlegt, nicht wei"s, womit er da
1815eigentlich arbeitet, z.B. hier:
1816\begin{verbatim}
1817   move.l   #'\'abc',d0
1818\end{verbatim}
1819Nach dem dritten Hochkomma findet er das Komma nicht mehr, weil er
1820vermutet, da"s eine weitere Zeichenkonstante beginnt, und eine
1821Fehlermeldung "uber eine falsche Parameterzahl ist die Folge.  Abhilfe
1822w"are z.B., \verb!\h! anstelle \verb!\'! zu schreiben.
1823
1824\subsection{String- zu Integerwandlung und Zeichenkonstanten}
1825
1826Fr"uhere Versionen von AS verfolgten eine strikte Trennung von Strings
1827und sogenannten ''Zeichenkonstanten'': Eine Zeichenkonstante sieht
1828auf den ersten Blick aus wie ein String, nur sind die Zeichen in
1829einfache Hochkommas statt doppelte eingeschlossen.  Ein solches
1830Objekt hatte den Datentyp 'Integer', war also eine Zahl, deren Wert
1831durch den (ASCII-)Wert des jeweiligen Zeichens definiert war, und wurde
1832strikt von einer String-Konstante unterschieden:
1833
1834\begin{verbatim}
1835   move.b   #65,d0
1836   move.b   #'A',d0      ; gleichwertig
1837   move.b   #"A",d0      ; nicht erlaubt in aelteren Versionen!
1838\end{verbatim}
1839
1840Diese Unterscheidung existiert {\em nicht mehr}, es ist also egal, ob
1841man einfache oder doppelte Hochkommas verwendet.  Wird an einer Stelle eine
1842Zahl als Argument erwartet, und ein String verwendet, so erfolgt die
1843Umwandlung anhand der (ASCII-)Werte ''on-the-fly'' an dieser Stelle.  Im
1844obigen Beispiel w"urden alle drei Anweisungen den gleichen Maschinencode
1845erzeugen.
1846
1847Eine solche implizite Wandlung findet auch f"ur aus mehreren Zeichen
1848bestehende Strings statt, die dann bisweilen als ''Mehrzeichenkonstanten''
1849bezeichnet werden:
1850\begin{verbatim}
1851'A'    == $41
1852"AB"   == $4142
1853'ABCD' == $41424344
1854\end{verbatim}
1855Mehrzeichenkonstanten sind der einzige Fall, in denen die Verwendung von
1856einfachen oder doppelten Hochkommas noch einen Unterschied macht.  F"ur
1857viele Zielprozessoren sind Pseudobefehle zur Ablage von Konstanten definiert,
1858die als Argument verschiedene Datentypen akzeptieren.  Will man wirklich
1859eine Zeichenkette haben, so mu"s man in diesem Fall weiterhin doppelte
1860Hochkommas verwenden:
1861\begin{verbatim}
1862    dc.w    "ab"  ; legt zwei Worte (0x0041,0x0042) ab
1863    dc.w    'ab'  ; legt ein Wort (0x4142) ab
1864\end{verbatim}
1865Wichtig: dies ist nicht erforderlich, wenn die Zeichenkette l"anger als die
1866verwendete Operandegr"o"se ist, in diesem Beispiel also l"anger als zwei
1867Zeichen bzw. 16 Bit.
1868
1869\subsection{Evaluierung}
1870
1871Die Berechnung von im Formelausdruck entstehenden Zwischenergebnissen
1872erfolgt immer mit der h"ochsten verf"ugbaren Wortbreite, d.h. 32 oder 64 Bit
1873f"ur Ganzzahlen, 80 Bit f"ur Gleitkommazahlen und 255 Zeichen f"ur Strings.
1874Eine eventuelle Pr"ufung auf Wertebereichs"uberschreitung findet erst am
1875Endergebnis statt.
1876\par
1877Die portable C-Version \marginpar{{\em UNIX}} kann nur mit
187864-Bit-Gleitkommazahlen umgehen, ist daher auf einen Maximalwert von ca.
1879$10^{308}$ beschr"ankt.  Als Ausgleich werden auf einigen Plattformen
1880Integers mit 64 Bit Breite behandelt.
1881
1882\subsection{Operatoren}
1883
1884Der Assembler stellt zur Verkn"upfung die in Tabelle \ref{TabOps} genannten
1885Operanden zur Verf"ugung.
1886\begin{table*}[htbp]
1887\begin{center}\begin{tabular}{|c|l|c|c|c|c|c|}
1888\hline
1889Op. & Funktion & \#Ops. & Int & Float & String & Rang \\
1890\hline
1891\hline
1892$<>$        & Ungleichheit         & 2 & ja   & ja   & ja   & 14 \\
1893$>=$        & gr"o"ser o. gleich   & 2 & ja   & ja   & ja   & 14 \\
1894$<=$        & kleiner o. gleich    & 2 & ja   & ja   & ja   & 14 \\
1895$<$         & echt kleiner         & 2 & ja   & ja   & ja   & 14 \\
1896$>$         & echt gr"o"ser        & 2 & ja   & ja   & ja   & 14 \\
1897$=$         & Gleichheit           & 2 & ja   & ja   & ja   & 14 \\
1898$==$        & Alias f"ur $=$       &   &      &      &      &    \\
1899            & & & & & &  \\
1900$!!$        & log. XOR             & 2 & ja   & nein & nein & 13 \\
1901$||$        & log. OR              & 2 & ja   & nein & nein & 12 \\
1902\&\&        & log. AND             & 2 & ja   & nein & nein & 11 \\
1903\verb! ~~ ! & log. NOT             & 1 & ja   & nein & nein & 2 \\
1904            & & & & & &  \\
1905-           & Differenz            & 2 & ja   & ja   & nein & 10 \\
1906+           & Summe                & 2 & ja   & ja   & ja   & 10 \\
1907\#          & Modulodivision       & 2 & ja   & nein & nein & 9 \\
1908/           & Quotient             & 2 & ja*) & ja   & nein & 9 \\
1909\verb! * !  & Produkt              & 2 & ja   & ja   & nein & 9 \\
1910\verb! ^ !  & Potenz               & 2 & ja   & ja   & nein & 8 \\
1911            & & & & & &  \\
1912$!$         & bin"ares XOR         & 2 & ja   & nein & nein & 7 \\
1913$|$         & bin"ares OR          & 2 & ja   & nein & nein & 6 \\
1914\&          & bin"ares AND         & 2 & ja   & nein & nein & 5 \\
1915$><$        & Bitspiegelung        & 2 & ja   & nein & nein & 4 \\
1916$>>$        & log. Rechtsschieben  & 2 & ja   & nein & nein & 3 \\
1917$<<$        & log. Linksschieben   & 2 & ja   & nein & nein & 3 \\
1918\verb! ~ !  & bin"ares NOT         & 1 & ja   & nein & nein & 1 \\
1919\hline
1920\multicolumn{7}{|l|}{*) Rest wird verworfen} \\
1921\hline
1922\end{tabular}\end{center}
1923\caption{in AS definierte Operatoren\label{TabOps}}
1924\end{table*}
1925Unter ,,Rang'' ist dabei die Priorit"at zu verstehen, die dieser Operator bei
1926der Teilung eines Ausdruckes in Unterausdr"ucke hat, der rangh"ochste
1927Operator wird also \ii{zuletzt} ausgewertet.  Die Reihenfolge der
1928Evaluierung l"a"st sich durch Klammerung neu festlegen.
1929\par
1930Die Vergleichsoperatoren liefern TRUE, falls die Bedingung zutrifft,
1931und FALSE falls nicht.  Vergleiche betrachten Integerzahlen dabei als
193232 Bit breit und vorzeichenbehaftet. F"ur die logischen Operatoren
1933ist ein Ausdruck TRUE, falls er ungleich 0 ist, ansonsten FALSE.
1934\par
1935Die Bitspiegelung ist wohl etwas erkl"arungsbed"urftig: Der Operator
1936spiegelt die untersten Bits im ersten Operanden, l"a"st die
1937dar"uberliegenden Bits aber unver"andert.  Die Zahl der zu spiegelnden
1938Bits ist der rechte Operand und darf zwischen 1 und 32 liegen.
1939\par
1940Eine keine Fu"sangel beim bin"aren Komplement: Da die Berechnung
1941grunds"atzlich auf 32- oder 64-Bit-Ebene erfolgt, ergibt seine Anwendung
1942auf z.B. 8-Bit-Masken "ublicherweise Werte, die durch voranstehende
1943Einsen nicht mehr im entferntesten in 8-Bit-Zahlen hineinpassen.  Eine
1944bin"are UND-Verkn"upfung mit einer passenden Maske ist daher unvermeidlich!
1945
1946\subsection{Funktionen}
1947
1948Zus"atzlich zu den Operatoren definiert der Assembler noch eine Reihe
1949in erster Linie transzendenter Funktionen mit Gleitkomma-Argument, die
1950Tabellen \ref{TabFuncs1} und \ref{TabFuncs2} auflisten.
1951\begin{table*}[htbp]
1952\begin{center}\begin{tabular}{|l|l|l|l|}
1953\hline
1954Name     & Funktion             & Argument & Ergebnis \\
1955\hline
1956\hline
1957SQRT     & Quadratwurzel        & $arg \geq 0$ & Gleitkomma \\
1958         &                      & & \\
1959SIN      & Sinus                & $arg \in \rz$ & Gleitkomma \\
1960COS      & Kosinus              & $arg \in \rz$ & Gleitkomma \\
1961TAN      & Tangens              & $arg \neq (2*n+1)*\frac{\pi}{2}$ & Gleitkomma \\
1962COT      & Kotangens            & $arg \neq n*\pi$ & Gleitkomma \\
1963         &                      & & \\
1964ASIN     & inverser Sinus       & $\mid arg \mid \leq 1$ & Gleitkomma \\
1965ACOS     & inverser Kosinus     & $\mid arg \mid \leq 1$ & Gleitkomma \\
1966ATAN     & inverser Tangens     & $arg \in \rz$ & Gleitkomma \\
1967ACOT     & inverser Kotangens   & $arg \in \rz$ & Gleitkomma \\
1968         &                      & & \\
1969EXP      & Exponentialfunktion  & $arg \in \rz$ & Gleitkomma \\
1970ALOG     & 10 hoch Argument     & $arg \in \rz$ & Gleitkomma \\
1971ALD      & 2 hoch Argument      & $arg \in \rz$ & Gleitkomma \\
1972SINH     & hyp. Sinus           & $arg \in \rz$ & Gleitkomma \\
1973COSH     & hyp. Kosinus         & $arg \in \rz$ & Gleitkomma \\
1974TANH     & hyp. Tangens         & $arg \in \rz$ & Gleitkomma \\
1975COTH     & hyp. Kotangens       & $arg \neq 0$ & Gleitkomma \\
1976         &                      & & \\
1977LN       & nat. Logarithmus     & $arg > 0$ & Gleitkomma \\
1978LOG      & dek. Logarithmus     & $arg > 0$ & Gleitkomma \\
1979LD       & 2er Logarithmus      & $arg > 0$ & Gleitkomma \\
1980ASINH    & inv. hyp. Sinus      & $arg \in \rz$ & Gleitkomma \\
1981ACOSH    & inv. hyp. Kosinus    & $arg \geq 1$ & Gleitkomma \\
1982ATANH    & inv. hyp. Tangens    & $\mid arg \mid < 1$ & Gleitkomma \\
1983ACOTH    & inv. hyp. Kotangens  & $\mid arg \mid > 1$ & Gleitkomma \\
1984         &                      & & \\
1985INT      & ganzzahliger Anteil  & $arg \in \rz$ & Integer \\
1986         &                      & & \\
1987BITCNT   & bin"are Quersumme    & Integer      & Integer \\
1988FIRSTBIT & niedrigstes 1-Bit    & Integer      & Integer \\
1989LASTBIT  & h"ochstes 1-Bit      & Integer      & Integer \\
1990BITPOS   & einziges 1-Bit       & Integer      & Integer \\
1991\hline
1992\end{tabular}\end{center}
1993\caption{vordefinierte Funktionen in AS - Teil 1 (Integer- und
1994         Gleitkomma-Funktionen)\label{TabFuncs1}}
1995\end{table*}
1996\begin{table*}[htb]
1997\begin{center}\begin{tabular}{|l|l|l|l|}
1998\hline
1999Name     & Funktion             & Argument & Ergebnis \\
2000\hline
2001\hline
2002SGN         & Vorzeichen (0/1/-1)   & Integer oder & Integer \\
2003            &                       & Gleitkomma   & \\
2004ABS         & Betrag                & Integer oder & Integer oder \\
2005            &                       & Gleitkomma   & Gleitkomma \\
2006TOUPPER     & pass. Gro"sbuchstabe  & Integer      & Integer \\
2007TOLOWER     & pass. Kleinbuchstabe  & Integer      & Integer \\
2008UPSTRING    & wandelt alle Zeichen  & String       & String \\
2009            & in Gro"sbuchstaben    &              & \\
2010LOWSTRING   & wandelt alle Zeichen  & String       & String \\
2011            & in Kleinbuchstaben    &              & \\
2012STRLEN      & liefert L"ange eines  & String       & Integer \\
2013            & Strings               &              & \\
2014SUBSTR      & extrahiert Teil eines & String,      & String \\
2015            & Strings               & Integer,     & \\
2016            &                       & Integer      & \\
2017CHARFROMSTR & extrahiert ein        & String,      & Integer \\
2018            & Zeichen aus einem     & Integer      & \\
2019            & String                &              & \\
2020STRSTR      & sucht Teilstring in   & String,      & Integer \\
2021            & einem String          & String       & \\
2022VAL         & evaluiert Stringin-   & String       & abh. von \\
2023            & halt als Ausdruck     &              & Argument \\
2024EXPRTYPE    & liefert Typ des       & Integer,     & 0 \\
2025            & Arguments             & Gleitkomma,  & 1 \\
2026            &                       & String       & 2 \\
2027\hline
2028\end{tabular}\end{center}
2029\caption{vordefinierte Funktionen in AS - Teil 2
2030         (Integer- und String-Funk\-tio\-nen)\label{TabFuncs2}}
2031\end{table*}
2032Die Funktionen \tty{FIRSTBIT}, \tty{LASTBIT} und \tty{BITPOS} liefern
2033als Ergebnis -1, falls "uberhaupt kein bzw. nicht genau ein Bit gesetzt
2034ist. Zus"atzlich gibt \tty{BITPOS} in einem solchen Fall eine
2035Fehlermeldung aus.
2036\par
2037Die String-Funktion \tty{SUBSTR} erwartet als ersten Parameter den
2038Quellstring, als zweiten die Startposition und als dritten die Anzahl zu
2039extrahierender Zeichen (eine 0 bedeutet, alle Zeichen bis zum Ende zu
2040extrahieren).  Analog erwartet \tty{CHARFROMSTR} den Quellstring als
2041erstes Argument und die Zeichenposition als zweites Argument.  Falls die
2042angegebene Position gr"o"ser oder gleich der L"ange des Quellstrings ist,
2043liefert \tty{SUBSTR} einen Leerstring, w"ahrend \tty{CHARFROMSTR} eine -1
2044ergibt.  Eine Position kleiner Null wird von \tty{SUBSTR} als Null
2045behandelt, w"ahrend \tty{CHARFROMSTR} in diesem Fall ebenfalls eine -1
2046liefert.
2047
2048Hier ein Beispiel, wie man die beiden Funktionen einsetzt, um einen
2049String im Speicher abzulegen, wobei das String-Ende durch ein gesetztes
2050MSB gekennzeichnet ist:
2051
2052\begin{verbatim}
2053dbstr   macro   arg
2054        if      strlen(arg) > 1
2055         db     substr(arg, 0, strlen(arg) - 1)
2056        endif
2057        if      strlen(arg) > 0
2058         db     charfromstr(arg, strlen(arg) - 1) | 80h
2059        endif
2060        endm
2061\end{verbatim}
2062
2063\tty{STRSTR} liefert das erste Auftreten des zweiten Strings
2064im ersten bzw. -1, falls das Suchmuster nicht gefunden wurde.
2065Analog zu \tty{SUBSTR} und \tty{CHARFROMSTR} hat das erste
2066Zeichen den Positionswert 0.
2067
2068Wenn eine Funktion auch Gleitkommaargumente erwartet, so soll
2069dies nicht bedeuten, da"s man nicht z.B.
2070\begin{verbatim}
2071wur2   equ      sqrt(2)
2072\end{verbatim}
2073schreiben d"urfte --- in solchen F"allen findet automatisch eine
2074Typkonvertierung statt.  Umgekehrt mu"s allerdings die \tty{INT}-Funktion
2075angewandt werden, um eine Gleitkommazahl ganz zu bekommen.  Bei der
2076Benutzung dieser Funktion ist zu beachten, da"s sie als Ergebnis
2077immer einen vorzeichenbehafteten Integer liefert, sie hat also
2078einen Wertebereich von ca. +/-2.0E9.
2079\par
2080Schaltet man AS in den case-sensitiven Modus, so k"onnen im
2081Gegensatz zu vordefinierten Symbolen die vordefinierten Funktionen
2082weiterhin in beliebiger Schreibweise angesprochen werden.  Bei
2083selbstdefinierten Funktionen (siehe Abschnitt \ref{SectFUNCTION}
2084wird allerdings unterschieden.  Dies  hat zur Folge, da"s z.B. bei
2085der Definition einer Funktion \tty{Sin} man mit \tty{Sin} diese
2086Funktion auch erreicht, mit allen anderen Schreibweisen jedoch die
2087eingebaute Funktion.
2088\par
2089F"ur die korrekte Umwandlung \marginpar{{\em DOS/}} von Klein-zu
2090Gro"sbuchstaben ist eine DOS-Version $\geq$ 3.30
2091erforderlich.
2092
2093\vspace{2mm}
2094\marginpar{{\em DPMI}}
2095
2096%%---------------------------------------------------------------------------
2097
2098\section{Vorw"artsreferenzen und andere Desaster}
2099\label{ForwRefs}
2100
2101Dieser Abschnitt ist das Produkt eines gewissen Grolls auf die (durchaus
2102legale) Art und Weise, wie einige Leute programmieren, die in Zusammenhang
2103mit AS bisweilen das eine oder andere Problem verursachen kann.  Die Rede
2104ist hier von sogenannten ,,Vorw"artsreferenzen''.  Was unterscheidet eine
2105Vorw"artsreferenz von einer normalen Referenz?  Dazu sehe man sich folgendes
2106Programmbeispiel an (man sehe mir bitte meine -- auch im Rest dieser Anleitung
2107anzutreffende -- 68000-Lastigkeit nach):
2108\begin{verbatim}
2109        move.l  #10,d0
2110loop:   move.l  (a1),d1
2111        beq     skip
2112        neg.l   d1
2113skip:   move.l  d1,(a1+)
2114        dbra    d0,loop
2115\end{verbatim}
2116Denkt man sich den Scheifenrumpf mit dem Sprung weg, so bleibt ein
2117"au"serst angenehm zu assemblierendes Programm "ubrig: die einzige
2118Referenz ist der R"ucksprung zum Anfang des Rumpfes, und da ein
2119Assembler ein Programm von vorne nach hinten durcharbeitet, hat er
2120den Symbolwert bereits ermittelt, bevor er ihn zum erstem Mal ben"otigt.
2121Sofern man ein Programm hat, das nur solche R"uckw"artsreferenzen besitzt,
2122ist man in der angenehmen Lage, nur einmal durch den Quellcode gehen zu
2123m"ussen, um den korrekten und optimalen Maschinencode zu finden.  Einige
2124Hochsprachen wie Pascal mit ihrer strikten Regel, da"s alles vor der ersten
2125Benutzung definiert sein mu"s, nutzen genau diese Eigenschaft aus, um den
2126"ubersetzungsvorgang zu beschleunigen.
2127
2128Leider ist die Sache im Falle von Assembler nicht so einfach, denn man
2129will ja bisweilen auch vorw"arts im Code springen oder mu"s aus bestimmten
2130Gr"unden Variablen Definitionen hinter den Code verlegen.  Dies ist
2131im Beispiel der Fall f"ur den bedingten Sprung, mit dem ein anderer
2132Befehl "ubersprungen wird.  Wenn der Assembler im ersten Durchlauf auf
2133den Sprungbefehl trifft, so sieht er sich mit der Situation konfrontiert,
2134entweder die Teilfelder der Instruktion, die die Sprungadresse beinhalten,
2135leer zulassen, oder seitens des Formelparsers (der das Adre"sargument ja
2136auswerten mu"s) anstelle des korrekten, aber unbekannten Wertes einen Wert
2137anzubieten, der ,,niemandem wehtut''.  Bei einem einfachen Assembler, der
2138nur eine Zielarchitektur kennt und bei dem sich die betroffenen Befehle
2139an einer Hand abz"ahlen lassen, wird man sicher die erste Variante w"ahlen,
2140bei AS mit seinen vielen Dutzend Zielen w"are die Zahl der Sonderabfragen
2141aber extrem hoch geworden, so da"s nur der zweite Weg in Frage kam: Falls
2142im ersten Pass ein unbekanntes Symbol auftaucht, so liefert der Formelparser
2143den momentanen Stand des Programmz"ahlers als Ergebnis zur"uck!  Nur dieser
2144Wert ist geeignet, relativen Spr"ungen mit Sprungdistanzen unbekannter
2145L"ange eine Adresse anzubieten, die nicht zu Fehlern f"uhrt.  Dies beantwortet
2146auch die bisweilen gestellte Frage, warum in einem Listing des ersten
2147Passes (dies bleibt z.B. stehen, wenn AS aufgrund anderer Fehler den
2148zweiten Pass erst gar nicht beginnt), z.T. falsche Adressen im erzeugten
2149Bin"arcode gezeigt werden - dies sind noch nicht aufgel"oste
2150Vorw"artsreferenzen.
2151
2152Das obige Beispiel offenbart allerdings noch eine weitere Schwierigkeit
2153von Vorw"artsreferenzen: Je nach Abstand von Quelle und Ziel im Code kann
2154der Sprungbefehl entweder lang oder kurz sein.  Diese Entscheidung "uber
2155die Code-L"ange - und damit auch die Adressen folgender Labels - kann
2156jedoch mangels genauer Kenntnis der Zieladresse im ersten Pass nicht
2157erfolgen.  Sofern der Programmierer nicht explizit kenntlich gemacht hat,
2158ob der Sprung lang oder kurz sein soll, behelfen sich reine 2-Pass-Assembler
2159wie "altere MASM-Versionen von Microsoft damit, im ersten Pass (nach diesem
2160m"ussen alle Adressen festliegen) Platz f"ur die l"angste Version zu
2161reservieren und im zweiten Pass den "ubersch"ussigen Platz mit \tty{NOP}s
2162aufzuf"ullen.  AS-Versionen bis 1.37 taten dieses ebenfalls, danach bin
2163ich auf das Multipass-Verfahren "ubergegangen, das die strenge Einteilung
2164in zwei Passes aufhebt und beliebig viele Durchg"ange erlaubt.  Dazu wird
2165im ersten Pass der optimale Code mit den angenommenen Symbolwerten erzeugt.
2166Stellt AS fest, da"s im zweiten Pass durch Codel"angenver"anderungen sich
2167Werte von Symbolen ge"andert haben, so wird einfach noch ein dritter Pass
2168eingelegt, und da durch die neuen Symbolwerte des zweiten Passes auch
2169im dritten Pass sich der Code wieder verk"urzen oder verl"angern kann,
2170ist ein weiterer Pass nicht unm"oglich.  Ich habe schon 8086-Programme
2171erlebt, bei denen erst nach 12 Durchg"angen alles stimmte.  Leider
2172erlaubt dieser Mechanismus nicht die Vorgabe einer Maximalzahl von
2173Durchl"aufen, ich kann als Regel nur sagen, da"s die Anzahl von Durchl"aufen
2174sinkt, je mehr man davon Gebrauch macht, Sprung- oder Adre"sl"angen explizit
2175vorzugeben.
2176
2177Speziell bei gro"sen Programmen kann es zu einer interessanten Situation
2178kommen: Die Lage eines vorw"arts gerichteten Sprunges hat sich
2179im zweiten Pass so weit gegen"uber dem ersten verschoben, da"s der
2180jetzt noch benutzte Label-Wert aus dem ersten Pass au"serhalb der
2181erlaubten Sprungdistanz liegt.  AS ber"ucksichtigt solche Situationen,
2182indem er jegliche Fehlermeldungen "uber zu weite Sprungdistanzen unterdr"uckt,
2183sobald er erkannt hat, da"s er wegen sich "andernder Symbolwerte ohnehin
2184einen weiteren Durchlauf machen mu"s.  Dies funktioniert zwar in 99\%
2185aller F"alle, es gibt jedoch auch Konstrukte, in denen der erste, derartig
2186kritische Befehl bereits auftaucht, bevor AS eine Chance hat, zu erkennen,
2187da"s ein neuer Pass erforderlich ist.  Das folgende Beispiel konstruiert
2188eine solche Situation mit Hilfe einer Vorw"artsreferenz (und war der
2189Anla"s f"ur die "Uberschrift dieses Abschnitts...):
2190\begin{verbatim}
2191        cpu   6811
2192
2193        org     $8000
2194        beq     skip
2195        rept    60
2196         ldd    Var
2197        endm
2198skip:   nop
2199
2200Var     equ     $10
2201\end{verbatim}
2202Aufgrund der Adre"slage nimmt AS im ersten Pass lange Adressen f"ur die
2203\tty{LDD}-Befehle an, was eine Code-L"ange von 180 Bytes ergibt und im
2204zweiten Pass (zum Zeitpunkt des \tty{BEQ}-Befehls ist noch der ,,falsche''
2205Wert von \tty{skip} aktuell, d.h. AS wei"s zu diesem Zeitpunkt noch nicht,
2206da"s der Code in Wirklichkeit nur 120 Bytes lang ist) gibt es eine
2207Fehlermeldung wegen einer "uberschrittenen Sprungdistanz.  Dieser Fehler
2208l"a"st sich auf drei Arten vermeiden:
2209\begin{enumerate}
2210\item{Weisen Sie AS explizit darauf hin, da"s er f"ur die \tty{LDD}-Befehle
2211      kurze Adressen verwenden darf (\tty{ldd <Var})}
2212\item{Entfernen Sie diese vermaledeite, verfluchte Vorw"artsreferenz und
2213      setzen Sie die \tty{EQU}-Anweisung nach vorne, wo sie hingeh"ort
2214      (OK, ich beruhige mich ja schon wieder...)}
2215\item{F"ur ganz Unentwegte: Benutzten Sie die \tty{-Y}-Option, so da"s AS die
2216      Fehlermeldung beim Erkennen der Adre"sverschiebung nachtr"aglich
2217      verwirft.  Nicht sch"on, aber...}
2218\end{enumerate}
2219Noch ein Hinweis zum \tty{EQU}-Befehl:  Da AS nicht wissen kann, in welchem
2220Zusammenhang ein mit \tty{EQU} definiertes Symbol sp"ater verwendet wird,
2221wird ein \tty{EQU} mit Vorw"artsreferenzen im ersten Pass "uberhaupt nicht
2222durchgef"uhrt.  Wird das mit \tty{EQU} definierte Symbol also im zweiten
2223Pass vorw"arts referenziert:
2224\begin{verbatim}
2225        move.l  #sym2,d0
2226sym2    equ     sym1+5
2227sym1    equ     0
2228\end{verbatim}
2229so handelt man sich im zweiten Pass eine Fehlermeldung wegen eines
2230undefinierten Symbols ein...aber warum machen Leute eigentlich solche
2231Dinge ???
2232
2233Zugegeben, das war ein ziemlich l"anglicher Ausflug, aber es mu"ste einfach
2234einmal sein.  Was sollte man als Erkenntnis aus diesem Abschnitt mitnehmen?
2235\begin{enumerate}
2236\item{AS versucht immer, den k"urzest m"oglichen Code zu erzeugen.  Dazu
2237      ben"otigt er eine endliche Zahl von Durchl"aufen.  Wenn man ihn
2238      nicht gerade knebelt, kennt AS keine R"ucksichten...}
2239\item{Wenn sinnvoll und m"oglich, Sprung- und Adre"sl"angen explizit
2240      vorgeben.  Man kann damit u.U. die Anzahl der Durchl"aufe deutlich
2241      reduzieren.}
2242\item{Vorw"artsreferenzen auf das allern"otigste beschr"anken.  Man
2243      erleichtert sich und AS das Leben damit erheblich!}
2244\end{enumerate}
2245
2246%%---------------------------------------------------------------------------
2247
2248\section{Registersymbole}
2249\label{SectRegSyms} \ttindex{Registersymbole}
2250
2251{\em G"ultigkeit: PowerPC, M-Core, XGate, 4004/4040, MCS-48/(2)51, 80C16x,
2252     AVR, XS1, Z8, KCPSM, Mico8, MSP430(X), ST9, M16, M16C, H8/300,
2253     H8/500, SH7x00, H16, i960, XA, 29K, TLCS-9000, KANBAK}
2254
2255Manchmal ist es erw"unscht, nicht nur einer Speicheradresse oder einer
2256Konstanten, sondern auch einem Register einen symbolischen Namen zuzuweisen,
2257um seine Funktion in einem bestimmten Programmabschnitt zu verdeutlichen.
2258Dies ist bei Prozessoren, die die Register schlicht als einen weiteren
2259Adre"sraum behandeln, recht problemlos, da als Register damit auch
2260Zahlenausdr"ucke erlaubt sind und man solche Symbole mit schlichten
2261\tty{EQU}s definieren kann (z.B. bei MCS-96 oder TMS7000).  Bei den
2262allermeisten Prozessoren jedoch sind Registernamen festgelegte Literale, und
2263AS behandelt sie beim Parsing aus Geschwindigkeitsgr"unden gesondert, so da"s auch
2264ein getrennter Typ von Symbolen f"ur solche Registersymbole oder -aliase existiert.
2265Registersymbole k"onnen wie gew"ohnliche Symbole mit \tty{EQU} oder \tty{SET}
2266definiert und umdefiniert werden, zudem existiert eine spezielle \tty{REG}-Anweisung,
2267die explizit nur Symbole bzw. Ausdr"ucke dieses Typs akzeptiert.
2268
2269Registersymbole unterliegen einer Reihe von Einschr"ankungen: zum einen ist die
2270Menge der Literale beschr"ankt und durch den jeweiligen Zielprozessor vorgegeben,
2271zum anderen kann man mit Registersymbolen nicht rechnen.  Etwas in dieser Form:
2272\begin{verbatim}
2273myreg   reg     r17         ; Definition Registersymbol
2274        addi    myreg+1,3   ; geht nicht!
2275\end{verbatim}
2276ist also {\em nicht} zul"assig.  Einfache Zuweisungen sind dagegen auch "uber mehrere
2277Stufen hinweg erlaubt:
2278\begin{verbatim}
2279myreg   reg     r17         ; Definition Registersymbol
2280myreg2  reg     myreg       ; myreg2 -> r17
2281\end{verbatim}
2282Des weiteren sind Vorw"artsreferenzen bei Registersymbolen noch kritischer als
2283bei anderen Typen von Symbolen.  Ist ein Symbol nicht definiert, so kann AS nur
2284mutma"sen, was f"ur ein Typ von Symbol es sein wird, und entscheidet sich in
2285Zweifelsfall f"ur eine einfache Zahl, was bei den meisten Prozessoren einem Zugriff
2286auf eine absolute Adresse im Speicher gleichkommt.  Nun sind bei den meisten
2287Prozessoren die Nutzungsm"oglichkeiten f"ur Speicheradressen als Operand deutlich
2288eingeschr"ankter als f"ur Register.  Je nach Situation erh"alt man so eine
2289Fehlermeldung "uber einen nicht erlaubten Adressierungsmodus, und es kommt zu keinem
2290zweiten Pass...
2291
2292Registersymbole sind analog zu normalen Symbolen lokal zu Sektionen,
2293und es ist auch durch Anh"angen eines in eckige Klammern gesetzten Sektionsnamens
2294m"oglich, auf ein Registersymbol aus einer bestimmten Sektion zuzugreifen.
2295
2296%%---------------------------------------------------------------------------
2297
2298\section{Sharefile}
2299\label{ChapShareMain} \ttindex{SHARED}
2300
2301Diese Funktion ist ein Abfallprodukt aus den reinen 68000er-Vorg"angern
2302von AS, da sie vielleicht doch der (die?!) eine oder andere gebrauchen
2303k"onnte, habe ich sie dringelassen.  Grundproblem ist es, an bestimmte
2304beim Assemblieren entstehende Symbole heranzukommen, weil man evtl. mit
2305diesen Adre"sinformationen auf den Speicher des Zielsystems zugreifen
2306m"ochte.  Der Assembler erlaubt es, mit Hilfe des \tty{SHARED}-Pseudobefehles
2307(siehe dort) Symbolwerte extern zur Verf"ugung zu stellen.  Zu diesem
2308Zweck erstellt der Assembler im zweiten Pass eine Textdatei mit den
2309gew"unschten Symbolen und ihren Werten, die mittels Include in ein
2310Hochsprachen-oder weiteres Assemblerprogramm eingebunden werden k"onnen.
2311Das Format der Textdatei (C, Pascal oder Assembler) wird durch die
2312Kommandozeilenschalter \tty{p}, \tty{c} oder \tty{a} festgelegt.
2313\par
2314\bb{ACHTUNG!} Ist keiner dieser Schalter angegeben, so wird auch keine
2315Datei erzeugt, egal ob sich \tty{SHARED}-Befehle im Quelltext finden oder
2316nicht!
2317\par
2318AS pr"uft beim Anlegen der Share-Datei nicht, ob bereits eine Datei gleichen
2319Namens existiert, eine solche wird ggfs. einfach "uberschrieben.  Eine
2320Abfrage halte ich nicht f"ur sinnvoll, da AS dann bei jedem Lauf fragen
2321w"urde, ob er die alte Version der Share-Datei "uberschreiben darf, und das
2322w"are doch sehr l"astig...
2323
2324%%---------------------------------------------------------------------------
2325
2326\section{Prozessor-Aliase}
2327\label{SectAlias}
2328
2329Mit Varianten g"angiger Mikrocontroller-Familien ist es wie mit
2330Kaninchen: Sie vermehren sich schneller, als man mit der Versorgung
2331hinterher kommen kann.  Im Zuge der Entwicklung von Prozessorkernen als
2332Bausteine f"ur ASICs und von Controller-Familien mit vom Kunden w"ahlbarer
2333Peripherie wird die Zahl von Controller-Varianten, die sich von einem
2334bekannten Typ nur in einigen Peripherie-Details unterscheiden, immer
2335gr"o"ser.  Die Unterscheidung der einzelnen Typen ist aber trotz meist
2336identischer Prozessorkernes wichtig, um z.B. in den Includefiles den
2337korrekten Satz von Peripherieregistern einzublenden.  Bisher habe ich
2338mich zwar immer bem"uht, die wichtigsten Vertreter einer Familie in AS
2339einzubauen (und werde das auch weiter tun), aber manchmal l"auft mir
2340die Entwicklung einfach auf und davon...es mu"ste also ein Mechanismus
2341her, mit dem man die Liste der unterscheidbaren Prozessortypen selbst
2342erweitern kann.
2343\par
2344Das Ergebnis davon sind Prozessor-Aliasse: Mit der Kommandozeilenoption \tty{alias}
2345kann man einen neuen Prozessortyp definieren, der im Befehlssatz einem
2346anderen, in AS fest eingebauten Typ entspricht.  Bei Benutzung dieses
2347Typs im \tty{CPU}-Befehl wird sich AS also wie beim ,,Original'' verhalten,
2348mit einem Unterschied: Die Variablen \tty{MOMCPU} bzw. \tty{MOMCPUNAME}
2349werden auf den Namen des Alias gesetzt, wodurch der neue Name zur
2350Unterscheidung z.B. in Includefiles dienen kann.
2351\par
2352Die Definition dieser Aliasse wurde aus zwei Gr"unden mit
2353Kommandozeilenoptionen anstatt Pseudobefehlen vorgenommen: zum einen
2354w"are es ohnehin nicht m"oglich gewesen, die Definition der Aliasse
2355zusammen mit den Registerdefinitionen in eine Include-Datei zu legen, denn
2356in einem Programm, das so eine Datei benutzen wollte, m"u"ste sie ja sowohl
2357vor als auch nach dem \tty{CPU}-Befehl in der Hauptdatei eingebunden
2358werden - eine Vorstellung, die irgendwo zwischen unelegant und unm"oglich
2359liegt.  Zum zweiten erm"oglicht diese Implementierung, die Definition der
2360neuen Typen in eine Datei zu legen, die "uber die \tty{ASCMD}-Variable beim
2361Start automatisch ausgef"uhrt wird, ohne das sich das Programm darum
2362k"ummern m"u"ste.
2363
2364%%===========================================================================
2365
2366\cleardoublepage
2367\chapter{Pseudobefehle}
2368
2369Nicht f"ur alle Prozessoren sind alle Pseudobefehle definiert.  Vor
2370der Beschreibung eines Befehls ist deshalb jeweils vermerkt, f"ur
2371welche Prozessortypen dieser Befehl erlaubt ist.
2372
2373%%---------------------------------------------------------------------------
2374
2375\section{Definitionen}
2376
2377%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2378
2379\subsection{SET, EQU und CONSTANT}
2380\ttindex{SET}\ttindex{EQU}\ttindex{CONSTANT}
2381
2382{\em G"ultigkeit: alle Prozessoren, {\tt CONSTANT} nur KCPSM(3)}
2383
2384\tty{SET} und \tty{EQU} erlauben die Definition typenloser Konstanten, d.h. sie
2385werden keinem Segment zugeordnet und ihre Verwendung erzeugt in keinem
2386Fall eine Warnung wegen Segmentverquickung.  W"ahrend \tty{EQU} Konstanten
2387definiert, die nicht wieder (mit \tty{EQU}) ge"andert werden k"onnen, erlaubt
2388\tty{SET} die Definition von Variablen, die sich w"ahrend des Assemblerlaufes
2389ver"andern lassen.  Dies ist n"utzlich z.B. bei der Allokation von
2390Resourcen \`a la Interruptvektoren, wie im folgenden Beispiel:
2391\begin{verbatim}
2392VecCnt  SET     0         ; irgendwo am Anfang
2393        ...
2394DefVec  MACRO   Name      ; einen neuen Vektor belegen
2395Name    EQU     VecCnt
2396VecCnt  SET     VecCnt+4
2397        ENDM
2398        ...
2399        DefVec  Vec1      ; ergibt Vec1=0
2400        DefVec  Vec2      ; ergibt Vec2=4
2401\end{verbatim}
2402Intern werden Konstanten und Variablen identisch gespeichert, der
2403einzige Unterschied ist, da"s sie als unver"anderbar markiert werden, wenn
2404sie mit \tty{EQU} definiert werden.  Der Versuch, eine Konstante mit
2405\tty{SET} zu ver"andern, gibt eine Fehlermeldung.
2406\par
2407Mit \tty{EQU/SET} lassen sich Konstanten aller Typen definieren, z.B.
2408\begin{verbatim}
2409IntZwei   EQU   2
2410FloatZwei EQU   2.0
2411\end{verbatim}
2412Einige Prozessoren besitzen leider bereits selber einen \tty{SET}-Befehl.
2413Bei diesen mu"s \tty{EVAL} anstelle von \tty{SET} verwendet werden, falls
2414sich der Maschinenbefehl nicht durch die andere Anzahl der Argumente
2415erkennen l"a"st.
2416\par
2417Anstelle von \tty{EQU} darf auch einfach ein Gleichheitszeichen geschrieben
2418werden, analog kann man anstelle von \tty{SET} bzw. \tty{EVAL}
2419einfach \tty{:=} schreiben.  Des weiteren existiert eine
2420'alternative' Syntax, bei der der Synbolname nicht aus dem Feld
2421f"ur das Label genommen wird, sondern das erste Argument ist.
2422Alternativ darf man also auch schreiben:
2423\begin{verbatim}
2424          EQU   IntZwei,2
2425          EQU   FloatZwei,2.0
2426\end{verbatim}
2427Das Feld f"ur das Label mu"s in diesem Fall leer bleiben.
2428\par
2429Aus Kompatibilit"atsgr"unden zum Originalassembler gibt es f"ur das
2430KCPSM-Target auch den {\tt CONSTANT}-Befehl, der im Gegensatz zu {\tt EQU}
2431Namen und Wert als Argument erwartet, also z.B. so:
2432\begin{verbatim}
2433      CONSTANT  const1, 2
2434\end{verbatim}
2435{\tt CONSTANT} ist allerdings auf Integer-Konstanten beschr"ankt.
2436\par
2437Defaultm"a"sig sind mit \tty{SET} oder \tty{EQU} definierte Symbole
2438typenlos, optional kann jedoch als zweites bzw. drittes Argument ein
2439Segmentname (\tty{CODE, DATA, IDATA, XDATA, YDATA, BITDATA, IO oder REG})
2440oder \tty{MOMSEGMENT} f"ur das aktuell gesetzte Segment angegeben werden,
2441um das Symbol einem bestimmten Adre"sraum zuordnen.  AS ber"ucksichtigt
2442dabei nicht, ob der benutzte Adre"sraum bei dem aktuell gesetzten
2443Zielprozessor auch vorhanden ist!
2444
2445Falls die gew"ahlte Zielarchitektur ein Attribut an den Befehlen zur Angabe
2446der Operandengr"o"se unterst"utzt (z.B. 680x0), so ist dieses ebenfalls
2447bei \tty{SET} und \tty{EQU} erlaubt.  Das definierte Symbol wird dann mit
2448dieser Operandengr"o"se in der Symboltabelle abgelegt.  Deren Verwendung
2449bei Benutzung des Symbols ist architekturab"angig.
2450
2451%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2452
2453\subsection{SFR und SFRB}
2454\ttindex{SFR}\ttindex{SFRB}
2455
2456{\em G"ultigkeit: diverse, SFRB nur MCS-51}
2457
2458Diese Befehle funktionieren wie \tty{EQU}, nur sind die damit definierten
2459Symbole dem direkt adressierbaren Datensegment zugeordnet, d.h. sie
2460dienen bevorzugt zur Definition von RAM-Zellen und (wie der Name
2461ahnen l"a"st) im Datenbereich eingeblendeten Hardwareregistern.  Der
2462dabei zugelassene Wertebereich ist identisch mit dem bei \tty{ORG} f"ur
2463das \tty{DATA}-Segment zugelassenen (s. Abschnitt \ref{SectORG}).
2464\tty{SFR} und \tty{SFRB} unterscheiden sich darin,  da"s \tty{SFRB}
2465das Register als bitadressierbar kennzeichnet, weshalb AS zus"atzlich 8
2466Symbole erzeugt, die dem Bitsegment zugeordnet werden und die Namen
2467\tty{xx.0} bis \tty{xx.7} tragen, z.B.
2468\begin{verbatim}
2469PSW     SFR     0d0h   ; ergibt PSW = D0H (Datensegment)
2470
2471PSW     SFRB    0d0h   ; zusaetzlich PSW.0 = D0H (Bit)
2472                       ; bis PSW.7 = D7H (Bit)
2473\end{verbatim}
2474Da beim 80C251 grunds"atzlich alle SFRs ohne zus"atzliche Bit-Symbole
2475bitadressierbar sind, ist der \tty{SFRB}-Befehl f"ur ihn auch nicht mehr
2476definiert; die Bits \tty{PSW.0} bis \tty{PSW.7} sind automatisch vorhanden.
2477\par
2478AS "uberpr"uft bei der Definition eines bitadressierbaren Registers mit
2479\tty{SFRB}, ob die Speicherstelle "uberhaupt bitadressierbar ist (Bereich
248020h..3fh bzw. 80h, 88h, 90h, 98h...0f8h).  Ist sie es nicht, so wird eine
2481Warnung ausgegeben; die dann erzeugten Bit-Symbole sind undefiniert.
2482
2483
2484%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2485
2486\subsection{XSFR und YSFR}
2487\ttindex{XSFR}\ttindex{YSFR}
2488
2489{\em G"ultigkeit: DSP56xxx}
2490
2491Auch der DSP56000 hat einige Peripherieregister memory-mapped im
2492Speicher liegen, die Sache wird jedoch dadurch komplizierter, da"s
2493es zwei Datenbereiche gibt, den X-und Y-Bereich.  Diese Architektur
2494erlaubt einerseits zwar einen h"oheren Parallelit"atsgrad, zwingt
2495jedoch andererseits dazu, den normalen \tty{SFR}-Befehl in die beiden
2496oben genannten Varianten aufzuspalten.  Sie verhalten sich identisch zu
2497\tty{SFR}, nur da"s \tty{XSFR} ein Symbol im X-Adre"sraum definiert
2498und \tty{YSFR} entsprechend eines im Y-Adre"sraum.  Der erlaubte
2499Wertebereich ist 0..\$ffff.
2500
2501%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2502
2503\subsection{LABEL}
2504\ttindex{LABEL}
2505
2506{\em G"ultigkeit: alle Prozessoren}
2507
2508Die Funktion des \tty{LABEL}-Befehls ist identisch zu \tty{EQU}, nur
2509wird das Symbol nicht typenlos, sondern erh"alt das Attribut ,,Code''.
2510\tty{LABEL} wird genau f"ur einen Zweck ben"otigt: Labels in Makros
2511sind normalerweise lokal, also nicht au"serhalb des Makros zugreifbar.
2512Mit einem \tty{EQU}-Befehl kann man sich zwar aus der Aff"are ziehen,
2513die Formulierung
2514\begin{verbatim}
2515<Name>   label    $
2516\end{verbatim}
2517erzeugt aber ein Symbol mit korrekten Attributen.
2518
2519%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2520
2521\subsection{BIT}
2522\ttindex{BIT}
2523
2524{\em G"ultigkeit: MCS-(2)51, XA, 80C166, 75K0, ST9, AVR, S12Z, SX20/28, H16,
2525                  H8/300, H8/500, KENBAK}
2526
2527\tty{BIT} dient dazu, ein einzelnes Bit einer Speicherstelle mit einem
2528symbolischen Namen gleichzusetzen.  Da die Art und Weise, wie
2529verschiedene Prozessoren Bitverarbeitung und -adressierung betreiben,
2530stark variiert, verh"alt sich auch dieser Befehl je nach Zielplattform
2531anders:
2532\par
2533F"ur die MCS/51-Familie, die einen eigenen Adre"sraum f"ur Bitoperanden
2534besitzt, ist die Funktion von \tty{BIT} ganz analog zu \tty{SFR}, d.h.
2535es wird einfach ein Integer-Symbol mit dem angegebenen Wert und dem
2536Segment BDATA erzeugt.  F"ur alle anderen Prozessoren wird die
2537Bitadressierung dagegen zweidimensional mit Adresse und Bitstelle
2538vorgenommen.  In diesem Fall verpackt AS beide Teile in einer vom
2539jeweiligen Prozessor abh"angigen Weise in ein Integer-Symbol und dr"oselt
2540dieses bei der Benutzung wieder in die beiden Teile auseinander.
2541Letzterer Fall trifft auch schon f"ur den 80C251 zu:  W"ahrend zum Beispiel
2542der Befehl
2543\begin{verbatim}
2544Mein_Carry	bit	PSW.7
2545\end{verbatim}
2546auf einem 8051 noch dem Symbol \tty{Mein\_Carry} den Wert 0d7h zuweisen
2547w"urde, w"urde auf einem 80C251 dagegen ein Wert von 070000d0h generiert
2548werden, d.h. die Adresse steht in Bit  0..7 sowie die Bitstelle in Bit
254924..26.  Dieses Verfahren entspricht dem, das auch beim DBIT-
2550Befehl des TMS370 angewendet wird und funktioniert sinngem"a"s so auch
2551beim 80C166, nur da"s dort Bitstellen von 0 bis 15 reichen d"urfen:
2552\begin{verbatim}
2553MSB     BIT     r5.15
2554\end{verbatim}
2555Beim Philips XA findet sich in Bit 0..9 die Bitadresse, wie sie auch
2556in die Maschinenbefehle eingesetzt wird, f"ur Bits aus den RAM-Speicher
2557wird in Bit 16..23 die 64K-Bank eingesetzt.
2558\par
2559Noch etwas weiter geht der \tty{BIT}-Befehl bei der 75K0-Familie: Da
2560dort Bitadressierungen nicht nur absolute Basisadressen verwenden
2561d"urfen, sind sogar Ausdr"ucke wie
2562\begin{verbatim}
2563bit1    BIT     @h+5.2
2564\end{verbatim}
2565erlaubt.
2566\par
2567Beim ST9 ist es hingegen m"oglich, Bits auch invertiert anzusprechen,
2568was beim \tty{BIT}-Befehl auch ber"ucksichtigt wird:
2569\begin{verbatim}
2570invbit  BIT     r6.!3
2571\end{verbatim}
2572N"aheres zum \tty{BIT}-Befehl beim ST9 findet sich bei den
2573prozessorspezifischen Hinweisen.
2574
2575Im Falle des H16 sind die Argumente f"ur Speicheradresse und Bitposition
2576vertauscht.  Dies wurde getan, um die Syntax zur Definition von Bit identisch
2577zu den Maschinenbefehlen zu machen, die einzelne Bits manipulieren.
2578
2579%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2580
2581\subsection{DBIT}
2582\ttindex{DBIT}
2583
2584{\em G"ultigkeit: TMS 370xxx}
2585
2586Die TMS370-Reihe hat zwar kein explizites Bit-Segment, jedoch k"onnen
2587einzelne Bits als Symbol durch diesen Befehl simuliert werden.  \tty{DBIT}
2588ben"otigt zwei Operanden, n"amlich einmal die Adresse der Speicherstelle,
2589in der das Bit liegt, sowie die genaue Position des Bits im Byte.
2590So definiert man z.B. mit
2591\begin{verbatim}
2592INT3            EQU     P019
2593INT3_ENABLE     DBIT    0,INT3
2594\end{verbatim}
2595das Bit, welches Interrupts von Anschlu"s INT3 freigibt.  So definierte
2596Bits k"onnen dann von den Befehlen \tty{SBIT0, SBIT1, CMPBIT, JBIT0}
2597und \tty{JBIT} genutzt werden.
2598
2599%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2600
2601\subsection{DEFBIT}
2602\ttindex{DEFBIT}
2603
2604\subsubsection{S12Z}
2605
2606Der Prozessorkern der S12Z-Familie verf"ugt "uber Befehle, mit denen
2607sich einzelne Bits in Register oder Speicherzellen manipulieren
2608lassen.  Um Bits im I/O-Bereich des Prozessors (erste 4 KByte des
2609Adre"sraumes) bequem ansprechen zu k"onnen, kann man einem einzelnen
2610Bit, definiert durch Speicheradresse und Bitposition, einen
2611symbolischen Namen geben:
2612\begin{verbatim}
2613<Name>         defbit[.Size]   <Adresse>,<Position>
2614\end{verbatim}
2615Die \tty{Adresse} mu"s in den ersten 4 KByte liegen, als Operandengr"o"se
2616sind 8, 16 oder 32 Bit (\tty{Size}=b/w/l) zugelassen.
2617Dementsprechend darf \tty{Position} maximal 7, 15 oder 31 sein.
2618Falls keine Opoerandengr"o"se angegeben wird, werden 8 Bit (.b)
2619angenommen.  Ein solcherma"sen definiertes Bit kann als Argument f"ur
2620die Befehle {\tt BCLR, BSET, BTGL, BRSET} und {\tt BRCLR} verwendet
2621werden:
2622\begin{verbatim}
2623mybit   defbit.b  $200,4
2624        bclr.b    $200,#4
2625        bclr      mybit
2626\end{verbatim}
2627Die beiden Aufrufe von {\tt bclr} in diesem Beispiel erzeugen
2628identischen Code.  Da ein solcherma"sen definiertes Bit seine
2629Operandengr"o"se ''kennt'', kann diese bei der Benutzung fortgelassen
2630werden.
2631
2632Bit-Definitionen innerhalb einer Struktur, die sich auf ein Element
2633einer Struktur beziehen, sind ebenfalls m"oglich:
2634\begin{verbatim}
2635mystruct struct    dots
2636reg      ds.w      1
2637flag     defbit    reg,4
2638         ends
2639
2640         org       $100
2641data     mystruct
2642
2643         bset      data.flag  ; entspricht bset.w $100,#4
2644\end{verbatim}
2645
2646\subsubsection{Super8}
2647
2648Im Gegensatz zum ''klassischen'' Z8 verf"ugt der Super8-Kern "uber
2649Befehle, mit denen sich Bits in allgemeinen oder Arbeitsregistern
2650bearbeiten lassen.  Dabei ist jedoch zu beachten, da"s einige davon
2651nur auf Bits arbeiten, die Teil eines der 16 Arbeitsregister sind.
2652Mit der \tty{DEFBIT}-Anweisung lassen sich Bits beider Sorten
2653definieren:
2654\begin{verbatim}
2655workbit	defbit	r3,#4
2656slow	defbit	emt,#6
2657\end{verbatim}
2658Derart definierte Bits lassen sich dann bei den Befehlen wie ein
2659P"archen aus Register und Bitposition einsetzen:
2660\begin{verbatim}
2661	ldb	r3,emt,#6
2662	ldb	r3,slo		; gleich bedeutend
2663
2664	bitc	r3,#4
2665	bitc	workbit		; gleich bedeutend
2666\end{verbatim}
2667
2668%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2669
2670\subsection{DEFBITFIELD}
2671\ttindex{DEFBITFIELD}
2672
2673{\em G"ultigkeit: S12Z}
2674
2675Der Prozessorkern der S12Z-Familie kann nicht nur mit einzelnen Bits
2676umgehen, sondern auch zusammenh"angende Felder von Bits in einem
26778/16/24/32-Bit-Wert extrahieren oder schreiben.  Analog zu
2678\tty{DEFBIT} l"a"st sich auch ein Bitfeld symbolisch definieren:
2679\begin{verbatim}
2680<Name>         defbitfield[.Size]   <Adresse>,<Breite>:<Position>
2681\end{verbatim}
2682Im Gegensatz zu einzelnen Bits sind hier auch 24 Bits (.p) als
2683Operandengr"o"se zugelassen, der Wertebereich von \tty{Position} und
2684\tty{Breite} ist dementsprechend von 0 bis 23 bzw. 1 bis 24.  Auch
2685hier ist es wieder zul"assig, Bitfelder als Teil von Strukturen zu
2686definieren:
2687\begin{verbatim}
2688mystruct struct      dots
2689reg      ds.w        1
2690clksel   defbitfield reg,4:8
2691         ends
2692
2693         org       $100
2694data     mystruct
2695
2696         bfext     d2,data.clksel ; fetch $100.w bits 4..11
2697                                  ; to D2 bits 0..7
2698         bfins     data.clksel,d2 ; insert D2 bits 0..7 into
2699                                  ; $100.w bits 4..11
2700\end{verbatim}
2701Die interne Darstellung von Bits, die mit \tty{DEFBIT} definiert
2702wurden, ist gleich der von Bitfeldern der Breite eins.  Ein
2703symbolisch definiertes einzelnes Bit kann also auch als Argument
2704f"ur \tty{BFINS} und \tty{BFEXT} verwendet werden.
2705
2706%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2707
2708\subsection{PORT}
2709\ttindex{PORT}
2710
2711{\em G"ultigkeit: 8080/8085/8086, XA, Z80, 320C2x/5x, TLCS-47, AVR, F8}
2712
2713\tty{PORT} arbeitet analog zu \tty{SFR}, nur wird das Symbol dem I/O-Adre"sbereich
2714zugeordnet.  Erlaubte Werte sind 0..7 beim 3201x, 0..15 beim 320C2x,
27150..65535 beim 8086 und 320C5x, 0..63 beim AVR und 0..255 beim Rest.
2716\par
2717Beispiel: eine PIO 8255 liege auf Adresse 20H:
2718\begin{verbatim}
2719PIO_Port_A PORT 20h
2720PIO_Port_B PORT PIO_Port_A+1
2721PIO_Port_C PORT PIO_Port_A+2
2722PIO_Ctrl   PORT PIO_Port_A+3
2723\end{verbatim}
2724
2725%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2726
2727\subsection{REG und NAMEREG}
2728\ttindex{REG}\ttindex{NAMEREG}
2729
2730{\em G"ultigkeit: 680x0, AVR, M*Core, ST9, 80C16x, KCPSM \\
2731     ({\tt NAMEREG} nur  f"ur KCPSM(3)), LatticeMico8, MSP430(X)}
2732
2733Obwohl immer mit gleicher Syntax, hat diese Anweisung von Prozessor
2734zu Prozessor eine leicht abweichende Bedeutung: Falls der Zielprozessor
2735f"ur Register einen eigenen Adre"sraum verwendet, so hat \tty{REG}
2736die Wirkung eines simplen \tty{EQU}s f"ur eben diesen Adre"sraum (z.B. beim
2737ST9).  F"ur alle anderen Prozessoren definiert \tty{REG} Registersymbole,
2738deren Funktion in Abschnitt \ref{SectRegSyms} beschrieben sind.
2739
2740{\tt NAMEREG} existiert aus Kompatibilit"atsgr"unden zum Originalassembler
2741f"ur den KCPSM.  Es hat die gleiche Funktion, lediglich werden sowohl
2742Register- als auch symbolischer Name als Argumente angegeben, z.B. so:
2743\begin{verbatim}
2744     NAMEREG  s08, treg
2745\end{verbatim}
2746
2747%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2748
2749\subsection{LIV und RIV}
2750\ttindex{LIV}\ttindex{RIV}
2751
2752{\em G"ultigkeit: 8X30x}
2753
2754\tty{LIV} und \tty{RIV} dienen dazu, sogenannte IV-Bus-Objekte zu definieren.
2755Bei diesen handelt es sich um Bitgruppen in peripheren Speicherzellen
2756mit einer L"ange von 1..8 Bit, die fortan symbolisch angesprochen
2757werden k"onnen, so da"s man bei den entsprechenden Befehlen nicht mehr
2758Adresse, L"ange und Position separat angeben mu"s.  Da die
27598X30x-Prozessoren zwei periphere Adre"sr"aume besitzen (einen ,,linken''
2760und einen ,,rechten'', sind auch zwei separate Befehle definiert.  Die
2761Parameter dieser Befehle sind allerdings identisch: es m"ussen drei
2762Parameter sein, die Adresse, Startposition und L"ange angeben.
2763Weitere Hinweise zur Benutzung von Busobjekten finden sich in
2764Abschnitt \ref{8X30xSpec}.
2765
2766%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2767
2768\subsection{CHARSET}
2769\ttindex{CHARSET}
2770
2771{\em G"ultigkeit: alle Prozessoren}
2772
2773Einplatinensysteme, zumal wenn sie LCDs ansteuern, benutzen h"aufig
2774einen anderen Zeichensatz als ASCII, und da"s die Umlautkodierung mit
2775der im PC "ubereinstimmt, d"urfte wohl reiner Zufall sein.  Um nun
2776aber keine fehlertr"achtigen Handumkodierungen vornehmen zu m"ussen,
2777enth"alt der Assembler eine Umsetzungstabelle f"ur Zeichen, die jedem
2778Quellcode ein Zielzeichen zuordnet.  Zur Modifikation dieser Tabelle
2779(die initial 1:1 "ubersetzt), dient der Befehl \tty{CHARSET}.
2780\tty{CHARSET} kann mit verschiedenen Parameterzahlen und -typen angewendet
2781werden.  Ist die Parameterzahl eins, so mu"s es sich um einen
2782String-Ausdruck handeln, der von AS als Dateiname interpretiert wird.  Aus
2783dieser Datei liest AS dann die ersten 256 Bytes aus und kopiert sie in die
2784"Ubersetzungstabelle.  Hiermit lassen sich also komplexere, extern
2785erzeugte Tabellen in einem Schlag aktivieren.  In allen anderen Varianten
2786mu"s der erste Parameter ein Integer im Bereich von 0 bis 255 sein, der
2787den Startpunkt der in der "Ubersetzungstabelle zu modifizierenden
2788Eintr"age angibt.  Es folgen dann ein oder zwei weitere Parameter, die die
2789Art der "Ubersetzung angeben:
2790
2791Ein einzelner, weiterer Integer ver"andert genau einen Eintrag.  So
2792bedeutet z.B.
2793\begin{quote}{\tt
2794        CHARSET '"a',128}
2795\end{quote}
2796da"s das Zielsystem das "a mit der Zahl 128 kodiert.  Sind jedoch zwei
2797weitere Integers angegeben, so ist der erste von ihnen der letzte zu
2798modifizierende Eintrag, der zweite der neue Wert des ersten Eintrags; alle
2799weiteren Eintr"age bis zum Bereichsende werden sequentiell neu belegt.
2800Falls z.B. das Zielsystem keine Kleinbuchstaben unterst"utzt, k"onnen mit
2801\begin{verbatim}
2802        CHARSET 'a','z','A'
2803\end{verbatim}
2804alle Kleinbuchstaben auf die passenden Gro"sbuchstaben automatisch
2805umgemappt werden.
2806
2807In der letzten Variante folgt nach dem Startindex ein String, der die ab
2808dem Startindex abzulegenden Zeichen angibt.  Das letzte Beispiel k"onnte
2809man also auch so formulieren:
2810\begin{verbatim}
2811        CHARSET 'a',"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
2812\end{verbatim}
2813
2814\tty{CHARSET} kann auch ganz ohne Parameter aufgerufen werden, allerdings
2815mit ziemlich gr"undlichen Folgen: Dies bewirkt eine Reinitialisierung der
2816"Ubersetzungstabelle in ihren Urzustand, d.h. man bekommt wieder eine
28171:1-"Ubersetzung.
2818
2819\bb{ACHTUNG!} \tty{CHARSET} beeinflu"st nicht nur im Speicher abgelegte
2820Stringkonstanten, sondern auch als ,,ASCII'' formulierte Integerkonstanten.
2821Dies bedeutet, da"s eine evtl. bereits modifizierte Umsetzungstabelle
2822in den obigen Beispielen zu anderen Ergebnissen f"uhren kann!
2823
2824%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2825
2826\subsection{CODEPAGE}
2827\ttindex{CODEPAGE}
2828
2829{\em G"ultigkeit: alle Prozessoren}
2830
2831Mit der \tty{CHARSET}-Anweisung hat man zwar beliebige Freiheiten in der
2832Zeichenzuordnung zwischen Entwicklungs- und Zielplattform, wenn auf der
2833Zielplattform jedoch verschiedene Zeichens"atze existieren, kann das
2834Umschalten zwischen diesen jedoch zu einer umst"andlichen Orgie von
2835\tty{CHARSET}-Kommandos werden.  Mit der \tty{CODEPAGE}-Anweisung kann
2836man jedoch mehrere Zeichentabellen vorhalten und zwischen diesen mit einem
2837Befehl umschalten.  Als Parameter erwartet \tty{CODEPAGE} ein oder zwei
2838Namen: zum einen den Namen der fortan zu benutzenden Tabelle, zum anderen
2839optional den Namen der Tabelle, die die initiale Belegung der Tabelle
2840vorgibt (dieser Parameter hat somit auch nur eine Bedeutung beim ersten
2841Umschalten auf eine Tabelle, bei der AS sie automatisch anlegt).  Fehlt
2842der zweite Parameter, so ist die initiale Belegung der neuen Tabelle
2843gleich der vorher aktiven Tabelle.  Alle folgenden
2844\tty{CHARSET}-Anweisungen ver"andern {\em nur} die momentan aktive Tabelle.
2845
2846Zu Beginn eines Durchlaufes wird von AS automatisch eine einzelne
2847Zeichentabelle mit dem Namen \tty{STANDARD} erzeugt und 1:1 vorbelegt.
2848Verwendet man keine \tty{CODEPAGE}-Anweisungen, so beziehen sich alle mit
2849\tty{CHARSET} gemachten Einstellungen auf diese Tabelle.
2850
2851%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2852
2853\subsection{ENUM, NEXTENUM und ENUMCONF}
2854\ttindex{ENUM}
2855\ttindex{NEXTENUM}
2856\ttindex{ENUMCONF}
2857
2858{\em G"ultigkeit: alle Prozessoren}
2859
2860\tty{ENUM} dient analog zu dem entsprechenden Befehl in C dazu,
2861Aufz"ahlungstypen zu definieren, d.h. eine Reihe von Integer-Konstanten,
2862denen fortlaufende Werte (von 0 an beginnend) zugewiesen
2863werden. Als Parameter werden dabei die Namen der zu definierenden
2864Symbole angegeben, wie in dem folgenden Beispiel:
2865\begin{quote}{\tt
2866        ENUM    SymA,SymB,SymC}
2867\end{quote}
2868Dieser Befehl weist den Symbolen \tty{SymA}, \tty{SymB} und \tty{SymC}
2869die Werte 0, 1 und 2 zu.
2870\par
2871M"ochte man eine Aufz"ahlung "uber mehrere Zeilen verteilen, so
2872verwendet man ab der zweiten Zeile den Befehle \tty{NEXTENUM}
2873anstelle von \tty{ENUM}.  Der interne Z"ahler, der den Symbolen
2874der Aufz"ahlung fortlaufende Werte zuweist, wird dann nicht
2875wieder auf Null zur"uckgesetzt, wie in dem folgenden Fall:
2876\begin{verbatim}
2877        ENUM     Januar=1,Februar,Maerz,April,Mai,Juni
2878        NEXTENUM Juli,August,September,Oktober
2879        NEXTENUM November,Dezember
2880\end{verbatim}
2881An diesem Beispiel sieht man auch, da"s man einzelnen Symbolen
2882explizit Werte anstelle des aktuellen Z"ahlerstandes zuweisen
2883kann.  Der interne Z"ahler wird anhand dieses Wertes auch
2884aktualisiert.
2885
2886Die Definition von Symbolen mit \tty{ENUM} gleicht einer Definition
2887mit \tty{EQU}, d.h. es ist nicht m"oglich, einem Symbol einen neuen
2888Wert zuzuweisen.
2889
2890Die \tty{ENUMCONF}-Anweisung erlaubt das Verhalten von \tty{ENUM}
2891zu beeinflussen.  \tty{ENUMCONF} akzeptiert ein oder zwei
2892Argumente, wobei das erste Argument immer der Wert ist, um den
2893der interne Z"ahler pro Symbol in einer Aufz"ahlung hochgez"ahlt
2894wird.  Mit einem
2895\begin{verbatim}
2896      ENUMCONF 2
2897\end{verbatim}
2898werden den Symbolen also zum Beispiel die Werte 0,2,4,6...
2899anstelle 0,1,2,3... zugewiesen.
2900
2901Das zweite (optionale) Argument von \tty{ENUMCONF} bestimmt,
2902welchen Adre"sraum die Symbole zugeordnet werden.  Per Default
2903sind mit \tty{ENUM} definierte Symbole typenlos, man kann aber
2904zum Beispiel mit einem
2905\begin{verbatim}
2906      ENUMCONF 1,CODE
2907\end{verbatim}
2908bestimmen, da"s sie im Instruktions-Adre"sraum liegen sollen.  Die
2909Namen der Adre"sr"aume sind die gleichen wie beim
2910\tty{SEGMENT}-Befehl (\ref{SEGMENT}), zus"atzlich ist als
2911Argument ein \tty{NOTHING} erlaubt, um wieder typenlose Symbole
2912zu erzeugen.
2913
2914%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2915
2916\subsection{PUSHV und POPV}
2917\ttindex{PUSHV}\ttindex{POPV}
2918
2919{\em G"ultigkeit: alle Prozessoren}
2920
2921Mit \tty{PUSHV} und \tty{POPV} ist es m"oglich, den Wert von (nicht
2922Makro-lokalen) Symbolen tempor"ar zu speichern und zu einem sp"ateren
2923Zeitpunkt wiederherzustellen.  Die Speicherung erfolgt auf {\em Stacks},
2924d.h. Last-In-First-Out-Speichern.  Ein Stack hat einen Namen, der den
2925allgemeinen Symbolkonventionen gen"ugen mu"s, und existiert so lange,
2926wie er mindestens ein Element enth"alt: Ein bisher nicht existierender
2927Stack wird bei \tty{PUSHV} automatisch angelegt, ein durch \tty{POPV} leer
2928werdender Stack wird automatisch wieder aufgel"ost.  Der Name des Stacks,
2929auf den Symbole abgelegt und von dem sie wieder abgeholt werden sollen,
2930ist der erste Parameter von \tty{PUSHV} bzw. \tty{POPV}, danach folgt
2931eine beliebige Menge von Symbolen als weitere Parameter.  Alle in der
2932Liste aufgef"uhrten Symbole m"ussen bereits existieren, es ist also
2933{\em nicht} m"oglich, mit einem \tty{POPV}-Befehl implizit neue Symbole
2934zu definieren.
2935\par
2936Stacks stellen eine globale Ressource dar, d.h. ihre Namen sind
2937nicht lokal zu Sektionen.
2938\par
2939Wichtig ist, da"s die Variablenliste {\em immer} von links nach rechts
2940abgearbeitet wird.  Wer also mehrere Variablen mit \tty{POPV} von einem
2941Stack herunter holen will, mu"s diese in genau umgekehrter Reihenfolge
2942zum entsprechenden \tty{PUSHV} angeben!
2943\par
2944Der Name des Stacks kann auch weggelassen werden, etwa so:
2945\begin{verbatim}
2946        pushv   ,var1,var2,var3
2947        .
2948        .
2949        popv    ,var3,var2,var1
2950\end{verbatim}
2951AS verwendet dann einen internen, vordefinierten Default-Stack.
2952\par
2953Nach Ende eines Durchlaufes "uberpr"uft AS, ob noch Stacks existieren,
2954die nicht leer sind, und gibt deren Namen sowie ,,F"ullstand'' aus.  Mit
2955diesen Warnungen kann man herausfinden, ob an irgendeiner Stelle die
2956\tty{PUSHV}'s und \tty{POPV}'s nicht paarig sind.  Es ist jedoch in
2957keinem Fall m"oglich, Symbolwerte in einem Stack "uber mehrere Durchl"aufe
2958hinwegzuretten: Zu Beginn eines Durchlaufes werden alle Stacks geleert!
2959
2960%%---------------------------------------------------------------------------
2961
2962\section{Codebeeinflussung}
2963
2964%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2965
2966\subsection{ORG}
2967\label{SectORG}\ttindex{ORG}
2968
2969{\em G"ultigkeit: alle Prozessoren}
2970
2971\tty{ORG} erlaubt es, den Assembler-internen Adre"sz"ahler mit einem neuen
2972Wert zu besetzen.  Der Wertebereich ist vom momentan gew"ahlten Segment
2973und vom Prozessortyp abh"angig (Tabelle \ref{TabORG}).
2974Die untere Grenze ist dabei immer 0; die obere Grenze der angegebene Wert
2975minus eins.
2976\par
2977Falls in einer Familie verschiedene Varianten unterschiedlich
2978gro"se Adre"sr"aume haben, ist jeweils der maximale Raum aufgef"uhrt.
2979\par
2980ORG wird in erster Linie ben"otigt, um dem Code eine neue Startadresse
2981zu geben und damit verschiedene, nicht zusammenh"angende Codest"ucke in
2982einer Quelldatei unterzubringen.  Sofern nicht in einem Feld explizit anders
2983angegeben, ist die vorgegebene Startadresse in einem Segment (d.h. die ohne
2984{\tt ORG} angenommene) immer 0.
2985\par
2986{\bf WICHTIG:} Falls auch mit dem \tty{PHASE}-Befehl gearbeitet
2987wird, mu"s ber"ucksichtigt werden, da"s das Argument von \tty{ORG}
2988immer die {\em Ladeadresse} des Codes ist, nicht die {\em
2989Ausf"uhrungsadresse}.  Ausdr"ucke, die sich mit dem \$- oder
2990\*-Symbol auf den aktuellen Programmz"ahler beziehen, liefern
2991aber die {\em Ausf"uhrungsadresse} des Codes und f"uhren als
2992Argument von \tty{ORG} nicht zum gew"unschten Ergebnis.  In
2993solchen F"allen ist die \tty{RORG}-Anweisung (\ref{SectRORG}) das
2994Mittel der Wahl.
2995\begin{longtable}{|l|c|c|c|c|c|c|c|c|c|c|}
2996\hline
2997\tin{Ziel} & \tin{CODE} & \tin{DATA} & \tin{I-}   & \tin{X-}   & \tin{Y-}   & \tin{BIT-} & \tin{IO} & \tin{REG} & \tin{ROM-} & \tin{EE-} \\
2998           &            &            & \tin{DATA} & \tin{DATA} & \tin{DATA} & \tin{DATA} &          &           & \tin{DATA} & \tin{DATA} \\
2999\hline
3000\hline
3001\endhead
3002\input{../doc_COM/taborg.tex}
3003\hline
3004\multicolumn{11}{|l|}{$^{1}$ Initialwert 80h. } \\
3005\multicolumn{11}{|l|}{  Da der 8051 kein RAM jenseits 80h hat, mu"s der Initialwert f"ur den 8051} \\
3006\multicolumn{11}{|l|}{  als Zielprozessor auf jeden Fall mit \tty{ORG} angepa"st werden!} \\
3007\hline
3008\multicolumn{11}{|l|}{$^{2}$ Da der Z180 weiterhin logisch nur 64K ansprechen kann, ist der} \\
3009\multicolumn{11}{|l|}{ganze Adre"sraum nur mittels \tty{PHASE}-Anweisungen erreichbar!} \\
3010\hline
3011\multicolumn{11}{|l|}{$^{3}$ Initialwert 400h.} \\
3012\hline
3013\multicolumn{11}{|l|}{$^{4}$ Initialwert 800h bzw. 0C00h} \\
3014\hline
3015\multicolumn{11}{|l|}{$^{5}$ Bereich f"ur Programmcode auf 1 MByte begrenzt} \\
3016\hline
3017\multicolumn{11}{|l|}{$^{6}$ Gr"o"se ist vom Zielprozessor abh"angig} \\
3018\hline
3019\multicolumn{11}{|l|}{$^{7}$ Gr"o"se und Verf"ugbarkeit sind vom Zielprozessor abh"angig} \\
3020\hline
3021\multicolumn{11}{|l|}{$^{8}$ Nur auf Varianten mit \tty{MOVX}-Anweisung} \\
3022\hline
3023\caption{Adre"sbereiche f"ur \tty{ORG}}
3024\label{TabORG}
3025\end{longtable}
3026
3027%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3028
3029\subsection{RORG}
3030\label{SectRORG}
3031\ttindex{RORG}
3032
3033{\em G"ultigkeit: alle Prozessoren}
3034
3035\tty{RORG} setzt wie \tty{ORG} den Programmz"ahler neu, erwartet
3036als Argument allerdings keine absolute Adresse, sondern einen
3037relativen Wert (positiv oder negativ), der zum Programmz"ahler
3038addiert wird.  Eine Anwendungsm"oglichkeit ist das Freilassen
3039einer bestimmten Menge von Adre"sraum, oder die Anwendung in
3040Code-Teilen, die an mehreren Stellen (z.B. via Makros oder
3041Includes) eingebunden werden und lageunabh"angig arbeiten sollen.
3042Eine weitere Anwendungsm"oglichkeit ergibt sich in Code, der eine
3043Ausf"uhrungsadresse unterschiedlich zur Ladeadresse hat (d.h. es
3044wird mit der \tty{PHASE}-Anweisung gearbeitet).  Es gibt kein
3045Symbol, "uber das man in so einer Situation auf die aktuelle
3046{\em Ladeadresse} zugreifen kann, aber mittels \tty{RORG} kann man
3047sich indirekt darauf beziehen.
3048
3049%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3050
3051\subsection{CPU}
3052\label{SectCPU}
3053\ttindex{CPU}
3054
3055{\em G"ultigkeit: alle Prozessoren}
3056
3057Mit diesem Befehl wird festgelegt, f"ur welchen Prozessor im weiteren
3058Code erzeugt werden soll.  Die Befehle der anderen Prozessorfamilien
3059sind dann nicht greifbar und erzeugen eine Fehlermeldung!
3060\par
3061Die Prozessoren k"onnen grob in Familien unterschieden werden, in den
3062Familien dienen unterschiedliche Typen noch einmal zur Feinunterscheidung:
3063%%-----------
3064\begin{quote}
3065\begin{tabbing}
3066\hspace{0.7cm} \= \kill
3067a) \> 68008 $\rightarrow$ 68000 $\rightarrow$ 68010 $\rightarrow$ 68012 $\rightarrow$ \\
3068   \> MCF5202 $\rightarrow$ MCF5204 $\rightarrow$ MCF5206 $\rightarrow$ MCF5208$\rightarrow$ \\
3069   \> MCF52274 $\rightarrow$ MCF52277 $\rightarrow$ MCF5307 $\rightarrow$ MCF5329 $\rightarrow$ MCF5373 $\rightarrow$ \\
3070   \> MCF5407 $\rightarrow$ MCF5470 $\rightarrow$ MCF5471 $\rightarrow$ MCF5472 $\rightarrow$ MCF5473 $\rightarrow$ \\
3071   \> MCF5474 $\rightarrow$ MCF5475 $\rightarrow$ MCF51QM $\rightarrow$ \\
3072   \> 68332 $\rightarrow$ 68340 $\rightarrow$ 68360 $\rightarrow$ \\
3073   \> 68020 $\rightarrow$ 68030 $\rightarrow$ 68040
3074\end{tabbing}
3075\end{quote}
3076In dieser Familie liegen die Unterschiede in hinzukommenden Befehlen
3077und Adressierungsarten (ab 68020).  Eine kleine Ausnahme stellt der
3078Schritt zum 68030 dar, dem 2 Befehle fehlen: \tty{CALLM} und \tty{RTM}.
3079Die drei Vertreter der 683xx-Familie haben den gleichen Prozessorkern (eine
3080leicht abgemagerte 68020-CPU), jedoch v"ollig unterschiedliche Peripherie.
3081MCF5xxx repr"asentiert verschiedene ColdFire-Varianten von Motorola/Freescale/NXP,
3082zum 680x0 bin"ar abw"artskompatible RISC-Prozesoren. Beim 68040 kommen die zus"atzlichen
3083Steuerregister (via \tty{MOVEC} erreichbar) f"ur On-Chip-MMU und Caches
3084sowie einige Systembefehle f"ur selbige hinzu.
3085%%-----------
3086\begin{quote}
3087b) 56000 $\longrightarrow$ 56002 $\longrightarrow$ 56300
3088\end{quote}
3089W"ahrend der 56002 nur Befehle zum Inkrementieren und Dekrementieren der
3090Akkus erg"anzt, ist der 56300-Kern schon fast ein neuer Prozessor: Er
3091vergr"o"sert alle Adre"sr"aume von 64K-W"ortern auf 16M und verdoppelt fast
3092die Anzahl der Befehle.
3093%%-----------
3094\begin{quote}
3095c) PPC403 $\rightarrow$ PPC403GC $\rightarrow$ MPC505 $\rightarrow$ MPC601 $\rightarrow$ MPC821 $\rightarrow$ RS6000
3096\end{quote}
3097Der PCC403 ist eine abgespeckte Version der PowerPC-Linie ohne
3098Gleitkommaeinheit, demzufolge sind s"amtliche Gleitkommabefehle
3099bei ihm gesperrt; daf"ur sind einige Mikrocontroller-spezifische
3100Befehle enthalten, die er als einziges Mitglied in dieser Familie
3101kennt.  Die GC-Variante des PPC403 hat zus"atzlich eine MMU und deshalb
3102einige Befehle zu deren Steuerung mehr.  Der MPC505 (eine Mikrokontroller-Variante mit FPU)
3103unterscheidet sich solange vom 601er nur in den Peripherieregistern,
3104wie ich es nicht besser wei"s - \cite{Mot505} h"alt sich da noch etwas bedeckt...
3105Die RS6000-Reihe kennt noch einige Befehle mehr (die auf vielen
3106601er-Systemen emuliert werden, um vollst"andige Kompatibilit"at
3107herzustellen), au"serdem verwendet IBM z.T. andere Mnemonics f"ur
3108diese reinen Workstation-Prozessoren, als Remineszenz an die
3109370er-Gro"srechner...
3110%%-----------
3111\begin{quote}
3112d) MCORE
3113\end{quote}
3114%%-----------
3115\begin{quote}
3116e) XGATE
3117\end{quote}
3118%%-----------
3119\begin{quote}
3120f) 6800 $\rightarrow$ 6801 $\rightarrow$ 6301 $\rightarrow$ 6811
3121\end{quote}
3122W"ahrend der 6301 nur einige neue Befehle definiert (und der 6301
3123noch ein paar mehr), bietet der 6811 neben weiteren Befehlen ein
3124zweites Indexregister Y zur Adressierung.
3125%%-----------
3126\begin{quote}
3127g) 6809/6309 und 6805/68HC08/68HCS08
3128\end{quote}
3129Diese Prozessoren sind zwar teilweise Quellcode-kompatibel zu den
3130anderen 68xx-ern, haben aber ein anderes Bin"arcode-Format und einen
3131deutlich eingeschr"ankteren (6805) bzw. erweiterten (6809) Befehlssatz.
3132Der 6309 ist eine CMOS-Version des 6809, die zwar offiziell
3133nur kompatibel zum 6809 ist, inoffiziell aber mehr Register und
3134deutlich mehr Befehle besitzt (siehe \cite{Kaku}).
3135%%-----------
3136\begin{quote}
3137h) 68HC12 $\longrightarrow$ 68HC12X
3138\end{quote}
3139Der 12X-Kern bietet eine Reihe neuer Befehle, bzw. bestehende Befehle
3140wurden um neue Adressierungsarten erg"anzt.
3141%%-----------
3142\begin{quote}
3143i) S912ZVC19F0MKH, S912ZVC19F0MLF,\\
3144   S912ZVCA19F0MKH, S912ZVCA19F0MLF,\\
3145   S912ZVCA19F0WKH, S912ZVH128F2CLQ,\\
3146   S912ZVH128F2CLL, S912ZVH64F2CLQ,\\
3147   S912ZVHY64F1CLQ, S912ZVHY32F1CLQ,\\
3148   S912ZVHY64F1CLL, S912ZVHY32F1CLL,\\
3149   S912ZVHL64F1CLQ, S912ZVHL32F1CLQ,\\
3150   S912ZVHL64F1CLL, S912ZVHL32F1CLL,\\
3151   S912ZVFP64F1CLQ, S912ZVFP64F1CLL,\\
3152   S912ZVH128F2VLQ, S912ZVH128F2VLL,\\
3153   S912ZVH64F2VLQ, S912ZVHY64F1VLQ,\\
3154   S912ZVHY32F1VLQ, S912ZVHY64F1VL,\\
3155   S912ZVHY32F1VLL, S912ZVHL64F1VLQ
3156\end{quote}
3157Alle Derivate beinhalten den gleichen Prozessorkern und den
3158gleichen Befehlssatz, lediglich die on-Chip-Peripherie und
3159die Menge eingebauten Speichers (RAM, Flash-ROM, EEPROM)
3160variieren.
3161%%-----------
3162\begin{quote}
3163j) 68HC16
3164\end{quote}
3165%%-----------
3166\begin{quote}
3167k) HD6413308 $\longrightarrow$ HD6413309
3168\end{quote}
3169Diese beiden Namen repr"asentieren die 300er und 300H-Varianten der
3170H8-Familie; die H-Version besitzt dabei einen gr"o"seren Adre"sraum
3171(16 Mbyte statt 64Kbyte), doppelt so breite Register (32 Bit) und
3172kennt einige zus"atzliche Befehle und Adressierungsarten.  Trotzdem
3173ist sie bin"ar aufw"artskompatibel.
3174%%-----------
3175\begin{quote}
3176l) HD6475328 $\longrightarrow$ HD6475348 $\longrightarrow$
3177   HD6475368 $\longrightarrow$ HD6475388
3178\end{quote}
3179Diese Prozessoren besitzen alle den gleichen CPU-Kern; Die unter-
3180schiedlichen Typen dienen lediglich der Einbindung des korrekten
3181Registersatzes in der Datei \tty{REG53X.INC}.
3182%%-----------
3183\begin{quote}
3184m) SH7000 $\longrightarrow$ SH7600 $\longrightarrow$ SH7700
3185\end{quote}
3186Der Prozessorkern des 7600ers bietet eine Handvoll Befehle mehr, die
3187L"ucken im Befehlssatz des 7000ers schlie"sen (verz"ogerte, bedingte
3188sowie relative und indirekte Spr"unge, Multiplikationen mit 32-Bit-Operanden
3189sowie Multiplizier/Addier-Befehle).  Die 7700er-Reihe (auch als SH3
3190gel"aufig) bietet weiterhin eine zweite Registerbank, bessere
3191Schiebebefehle sowie Befehle zur Cache-Steuerung.
3192%%-----------
3193\begin{quote}
3194n)HD614023 $\longrightarrow$ HD614043 $\longrightarrow$ HD614081
3195\end{quote}
3196Diese drei Varianten der HMCS400-Serie unterscheiden sich in der
3197Gr"o"se des internen ROM- und RAM-Speichers.
3198%%-----------
3199\begin{quote}
3200o) HD641016
3201\end{quote}
3202Dies ist aktuell das einzige Target mit H16-Kern.
3203%%-----------
3204\begin{quote}
3205p) 6502 $\rightarrow$ 65(S)C02 $\rightarrow$ 65CE02 / W65C02S /
3206   65C19 / MELPS740 / HUC6280 / 6502UNDOC
3207\end{quote}
3208Die CMOS-Version definiert einige zus"atzliche Befehle, au"serdem sind
3209bei einigen Befehlen Adressierungsarten hinzugekommen, die beim 6502
3210nicht m"oglich waren.  Der W65SC02 erg"anzt den
321165C02-Befehlssatz um zwei Befehle, mit denen die Low-Power-Modi
3212der CPU feiner eingestellt werden k"onnen.  Dem 65SC02 fehlen die
3213Bitmanipulationsbefehle des 65C02.  Der 65CE02 erg"anzt Sprungbefehle
3214mit 16-Bit-Displacement, ein Z-Register, einen 16-bittigen Stack-Pointer,
3215eine Reihe neuer Befehle und eine programmierbare Base-Page.
3216
3217Der 65C19 ist {\em nicht} bin"ar aufw"artskompatibel zum
3218originalen 6502!  Einige Adressierungsarten wurden durch andere
3219ersetzt.  Des weiteren enth"alt dieser Prozessor
3220Befehlssatz-Erweiterungen, die die Implementierung digitaler
3221Signalverarbeitung erleichtern.
3222
3223Die Mitsubishi-Mikrokontroller dagegen erweitern den
32246502-Befehlssatz in erster Linie um Bitoperationen und
3225Multiplikations-/Divisionsbefehle.  Bis auf den unbedingten Sprung und
3226Befehle zur Inkrementierung/Dekremetierung des Akkumulators sind die
3227Erweiterungen disjunkt.
3228
3229Das herausstechendste Merkmal des HuC 6280 ist der gr"o"sere
3230Adre"raum von 2 MByte anstelle 64 KByte, der durch eingebaute
3231Bankregister erreicht wird.   Des weiteren existieren einige
3232Sonderbefehle zur Kommunikation mit dem Videoprozessor (dieser
3233Chip wurde in Videospielen eingesetzt) und zum Kopieren von
3234Speicherbereichen.
3235
3236Mit dem Prozessortyp 6502UNDOC sind die ,,undokumentierten''
32376502-Befehle erreichbar, d.h. die Operationen, die sich bei der Verwendung
3238nicht als Befehle definierter Bitkombinationen im Opcode ergeben.  Die von
3239AS unterst"utzten Varianten sind im Kapitel mit den prozessorspezifischen
3240Hinweisen beschrieben.
3241%%-----------
3242\begin{quote}
3243q) MELPS7700, 65816
3244\end{quote}
3245Neben einer ,,16-Bit-Version'' des 6502-Befehlssatzes bieten diese
3246Prozessoren einige Befehlserweiterungen.  Diese sind aber gr"o"serenteils
3247disjunkt, da sie sich an ihren jeweiligen 8-bittigen Vorbildern (65C02
3248bzw. MELPS-740) orientieren.  Z.T.~werden auch andere Mnemonics f"ur
3249gleiche Befehle verwendet.
3250%%-----------
3251\begin{quote}
3252r) MELPS4500
3253\end{quote}
3254%%-----------
3255\begin{quote}
3256s) M16
3257\end{quote}
3258%%-----------
3259\begin{quote}
3260t) M16
3261\end{quote}
3262%%-----------
3263\begin{quote}
3264u) 4004 $\rightarrow$ 4040
3265\end{quote}
3266Der 4040 besitzt gegen"uber seinem Vorg"anger ein gutes Dutzend
3267zus"atzlicher Maschineninstruktionen.
3268%%-----------
3269\begin{quote}
3270v) 4008 $\rightarrow$ 8008NEW
3271\end{quote}
3272Intel hat 1975 die Mnemonics des umdefiniert, die zweite Variante spiegelt
3273diesen neuen Befehlssatz wieder.  Eine gleichzeitige Unterst"utzung beider
3274Varianten war nicht m"oglich, da teilweise "Uberschneidungen vorliegen.
3275%%-----------
3276\begin{quote}
3277w) 8021, 8022, \\
3278   8401, 8411, 8421, 8461, \\
3279   8039, (MSM)80C39, 8048, (MSM)80C48, 8041, 8042, \\
3280   80C382
3281\end{quote}
3282Bei den ROM-losen Versionen 8039 und 80C39 sind die Befehle verboten,
3283die den BUS (Port 0) ansprechen.  Der 8021 und 8022 sind Sonderversionen
3284mit stark abgemagertem Befehlssatz, wof"ur der 8022 zwei A/D-Wandler
3285und die dazugeh"origen Steuerbefehle enth"alt.  MAB8401 bis 8461 sind von
3286Philips entwickelte Derivate, die in ihrem Befehssatz irgendwo zwischen
3287dem 8021/8022 und einem 'vollst"andigen'' 8048 stehen.  Daf"ur verf"ugen
3288sie "uber serielle Ports und je nach Variante bis zu 8 KByte Programmspeicher.
3289
3290Die CMOS-Versionen lassen
3291sich mit dem \tty{IDL}- bzw. \tty{HALT}-Befehl in einen Ruhezustand niedriger
3292Stromaufnahme "uberf"uhren.  Der 8041 und 8042 haben einige Zusatzbefehle zur
3293Steuerung der Busschnittstelle, daf"ur fehlen aber einige andere Befehle.
3294Beim 8041, 8042, 84x1, 8021 und 8022 ist der Programmadre"sraum nicht
3295extern erweiterbar, weshalb AS das Codesegment bei diesen Prozessoren
3296auf die Gr"o"se des internen ROM beschr"ankt.  Der (SAB)80C382 ist eine von
3297Siemens speziell f"ur Telefone entwickelte Variante, die ebenfalls
3298einen \tty{HALT}-Befehl kennt sowie \tty{DJNZ} und \tty{DEC} auch
3299mit indirekter Adressierung erlaubt.  Im Gegenzug wurden einige
3300Befehle des 'normalen' 8048 entfernt. Die OKI-Varienaten (MSM...)
3301unterst"utzen ebenfalls \tty{DJNZ} und \tty{DEC} mit indirekter
3302Adressierung, sowie eine erweiterte Steuerung der
3303Power-Down-Modi, ohne den Basis-MCS-48-Befehlssatz zu
3304beschneiden.
3305%%-----------
3306\begin{quote}
3307\begin{tabbing}
3308\hspace{0.7cm} \= \kill
3309x) \> 87C750 $\rightarrow$ 8051, 8052, 80C320, 80C501, 80C502, \\
3310   \> 80C504, 80515, and 80517 \\
3311   \> $\rightarrow$ 80C390 \\
3312   \> $\rightarrow$ 80C251
3313\end{tabbing}
3314\end{quote}
3315Der 87C750 kann nur max. 2 Kbyte Programmspeicher adressieren, weshalb
3316die \tty{LCALL}- und \tty{LJMP}-Befehle bei ihm fehlen.  Zwischen den
3317acht mittleren Prozessoren nimmt AS selber "uberhaupt keine Unterscheidung
3318vor, sondern verwaltet den Unterschied lediglich in der Variablen
3319\tty{MOMCPU} (s.u.), die man mit \tty{IF}-Befehlen abfragen kann.  Eine
3320Ausnahme stellt lediglich der 80C504, der in seiner momentanen Form noch einen
3321Maskenfehler zeigt, wenn eine \tty{AJMP}- oder \tty{ACALL}-Anweisung auf der
3322vorletzten Adresse einer 2K-Seite steht.  AS benutzt in einem solchen
3323Fall automatisch lange Sprungbefehle bzw. gibt eine Fehlermeldung aus.  Der
332480C251 hingegen stellt einen drastischen Fortschritt in Richtung 16/32 Bit,
3325gr"o"serer Adre"sr"aume und orthogonalerem Befehlssatz dar.  Den 80C390
3326k"onnte man vielleicht als die 'kleine L"osung' bezeichnen:  Dallas
3327Semiconductor hat den Befehlssatz und die Architektur nur so weit
3328ver"andert, wie es f"ur die 16 MByte gro"sen Adre"sr"aume notwendig war.
3329%%-----------
3330\begin{quote}
3331y) 8096 $\rightarrow$ 80196 $\rightarrow$ 80196N $\rightarrow$ 80296
3332\end{quote}
3333Neben einem anderen Satz von SFRs (die "ubrigens von Unterversion zu
3334Unterversion stark differieren) kennt der 80196 eine Reihe von
3335zus"atzlichen Befehlen und kennt einen ,,Windowing''-Mechanismus, um
3336das gr"o"sere interne RAM anzusprechen.  Die 80196N-Familie wiederum
3337erweitert den Adre"sraum auf 16 Mbyte und f"uhrt eine Reihe von
3338Befehlen ein, mit denen man auf Adressen jenseits 64 Kbyte zugreifen
3339kann.  Der 80296 erweitert den CPU-Kern um Befehle zur Signalverarbeitung
3340und ein zweites Windowing-Register, verzichtet jedoch auf den {\em
3341Peripheral Transaction Server} (PTS) und verliert damit wieder zwei
3342Maschinenbefehle.
3343%%-----------
3344\begin{quote}
3345z) 8080 $\rightarrow$ 8085 $\rightarrow$ 8085UNDOC
3346\end{quote}
3347Der 8085 kennt zus"atzlich die Befehle \tty{RIM} und \tty{SIM} zum Steuern der
3348Interruptmaske und der zwei I/O-Pins.  Der Typ {\tt 8085UNDOC} schaltet
3349zus"atzliche, nicht von Intel dokumentierte Befehle ein.  Diese Befehle
3350sind in Abschnitt \ref{8085Spec} dokumentiert.
3351%%-----------
3352\begin{quote}
3353aa) 8086 $\rightarrow$ 80186 $\rightarrow$ V30 $\rightarrow$ V35
3354\end{quote}
3355Hier kommen wieder nur neue Befehle dazu.  Die entsprechenden 8-Bitter sind
3356wegen ihrer Befehlskompatibilit"at nicht aufgef"uhrt, f"ur ein 8088-System
3357ist also z.B. 8086 anzugeben.
3358%%-----------
3359\begin{quote}
3360ab) 80960
3361\end{quote}
3362%%-----------
3363\begin{quote}
3364ac) 8X300 $\rightarrow$ 8X305
3365\end{quote}
3366Der 8X305 besitzt eine Reihe zus"atzlicher Arbeitsregister, die dem
33678X300 fehlen und kann mit diesen auch zus"atzliche Operationen ausf"uhren,
3368wie das direkte Schreiben von 8-Bit-Werten auf Peripherieadressen.
3369%%-----------
3370\begin{quote}
3371ad) XAG1, XAG2, XAG3
3372\end{quote}
3373Diese Prozessoren unterscheiden sich nur in der Gr"o"se des eingebauten
3374ROMs, die in \tty{STDDEFXA.INC} definiert ist.
3375%%-----------
3376\begin{quote}
3377ae) AT90S1200, AT90S2313, AT90S2323, AT90S233, AT90S2343,\\
3378    AT90S4414, AT90S4433, AT90S4434, AT90S8515,\\
3379    AT90C8534, AT90S8535, ATTINY4, ATTINY5, ATTINY9,\\
3380    ATTINY10, ATTINY11, ATTINY12, ATTINY13, ATTINY13A,\\
3381    ATTINY15, ATTINY20, ATTINY24(A), ATTINY25,\\
3382    ATTINY26, ATTINY28, ATTINY40, ATTINY44(A),\\
3383    ATTINY45, ATTINY48, ATTINY84(A), ATTINY85,\\
3384    ATTINY87, ATTINY88, ATTINY102, ATTINY104,\\
3385    ATTINY167, ATTINY261, ATTINY261A, ATTINY43U,\\
3386    ATTINY441, ATTINY461, ATTINY461A, ATTINY828,\\
3387    ATTINY841, ATTINY861, ATTINY861A, ATTINY1634,\\
3388    ATTINY2313, ATTINY2313A, ATTINY4313, ATMEGA48,\\
3389    ATMEGA8, ATMEGA8515, ATMEGA8535, ATMEGA88,\\
3390    ATMEGA8U2, ATMEGA16U2, ATMEGA32U2,\\
3391    ATMEGA16U4, ATMEGA32U4, ATMEGA32U6, AT90USB646,\\
3392    AT90USB647, AT90USB1286, AT90USB1287, AT43USB355,\\
3393    ATMEGA16, ATMEGA161, ATMEGA162, ATMEGA163,\\
3394    ATMEGA164, ATMEGA165, ATMEGA168, ATMEGA169,\\
3395    ATMEGA32, ATMEGA323, ATMEGA324, ATMEGA325,\\
3396    ATMEGA3250, ATMEGA328, ATMEGA329, ATMEGA3290,\\
3397    ATMEGA406, ATMEGA64, ATMEGA640, ATMEGA644,\\
3398    ATMEGA644RFR2, ATMEGA645, ATMEGA6450,\\
3399    ATMEGA649, ATMEGA6490, ATMEGA103, ATMEGA128,\\
3400    ATMEGA1280, ATMEGA1281, ATMEGA1284,\\
3401    ATMEGA1284RFR2, ATMEGA2560, ATMEGA2561
3402\end{quote}
3403Die verschiedenen AVR-Varianten unterscheiden sich in erster Linie in
3404der Gr"o"se des On-Chip-Speichers (Flash, SRAM, EEPROM) und der integrierten
3405Peripherie (GPIO, Timer, UART, A/D-Wandler,...).  Die ATmegas bringen im
3406Vergleich zu den AT90...-Vorg"angern auch neue Maschinenbefehle
3407mit, den ATtinys fehlen wiederum die Multiplikationsbefehle.
3408%%-----------
3409\begin{quote}
3410af) AM29245 $\rightarrow$ AM29243 $\rightarrow$ AM29240 $\rightarrow$ AM29000
3411\end{quote}
3412Je weiter man sich in der Liste nach rechts bewegt, desto weniger
3413Befehle m"ussen in Software emuliert werden.  W"ahrend z.B. der 29245
3414noch nicht einmal einen Hardware-Multiplizierer besitzt, fehlen den
3415beiden Vertretern in der Mitte nur die Gleitkommabefehle.  Der 29000
3416dient dabei als ,,generischer'' Typ, der alle Befehle in Hardware versteht.
3417%%-----------
3418\begin{quote}
3419ag) 80C166 $\longrightarrow$ 80C167,80C165,80C163
3420\end{quote}
342180C167 und 80C165/163 haben anstelle 256 Kbyte max. 16 Mbyte Adre"sraum,
3422au"serdem kennen sie einige zus"atzliche Befehle f"ur erweiterte
3423Adressierungsmodi sowie atomare Befehlssequenzen.  Untereinander
3424unterscheiden sich diese Prozessoren der ,,zweiten Generation'' nur in der
3425eingebauten Peripherie.
3426%%-----------
3427\begin{quote}
3428ah) Z80 $\rightarrow$ Z80UNDOC $\rightarrow$ Z180 $\rightarrow$ Z380
3429\end{quote}
3430W"ahrend f"ur den Z180 nur die zus"atzlichen Befehle definiert sind
3431(d.h. die Z180-MMU findet noch keine Ber"ucksichtigung), besitzt der
3432Z380 32-Bit-Register, einen linearen 4Gbyte-Adre"sraum sowie neben
3433einer Reihe von Befehlserweiterungen, die den Befehlssatz deutlich
3434orthogonaler machen, neue Adressierungsmodi (Ansprechen der
3435Indexregisterh"alften, Stack-relativ).  Zu einem kleinen Teil existieren
3436diese Erweiterungen aber auch schon beim Z80 als undokumentierte
3437Befehle, die mit der Variante \tty{Z80UNDOC} zugeschaltet werden
3438k"onnen.  Eine Liste mit den zus"atzlichen Befehlen findet sich im
3439Kapitel mit den prozessorspezifischen Hinweisen.
3440%%-----------
3441\begin{quote}
3442ai) Z8601, Z8603, Z86C03, Z86E03, Z86C06, Z86E06, \\
3443    Z86C08, Z86C21, Z86E21, Z86C30, Z86C31, Z86C32 Z86C40 \\
3444    $\rightarrow$ Z88C00, Z88C01 \\
3445    $\rightarrow$ eZ8, Z8F0113, Z8F011A, Z8F0123, Z8F012A, \\
3446    Z8F0130, Z8F0131, Z8F0213, Z8F021A, Z8F0223, Z8F022A, \\
3447    Z8F0230, Z8F0231, Z8F0411, Z8F0412, Z8F0413, Z8F041A, \\
3448    Z8F0421, Z8F0422, Z8F0423, Z8F042A, Z8F0430, Z8F0431, \\
3449    Z8F0811, Z8F0812, Z8F0813, Z8F081A, Z8F0821, Z8F0822, \\
3450    Z8F0823, Z8F082A, Z8F0830, Z8F0831, Z8F0880, Z8F1232, \\
3451    Z8F1233, Z8F1621, Z8F1622, Z8F1680, Z8F1681, Z8F1682, \\
3452    Z8F2421, Z8F2422, Z8F2480, Z8F3221, Z8F3222, Z8F3281, \\
3453    Z8F3282, Z8F4821, Z8F4822, Z8F4823, Z8F6081, Z8F6082, \\
3454    Z8F6421, Z8F6422, Z8F6423, Z8F6481, Z8F6482
3455\end{quote}
3456Die Varianten mit Z8-Kern unterscheiden sich nur in
3457Speicherausbau und Peripherie, d.h. die Wahl hat auf den
3458unterst"utzten Befehlssatz keinen Effekt.  Deutlich anders sind
3459jedoch die Super8- und eZ8-Varianten, jeweils mit (in unterschiedliche
3460Richtungen) stark erweiterten Befehlss"atzen, die auch auf Quellcode-Ebene
3461nur g"o"stenteils aufw"arts-kompatibel sind.
3462%%-----------
3463\begin{quote}
3464aj) KCPSM, KCPSM3
3465\end{quote}
3466Bei beiden Prozessorkernen handelt es sich um keine eigenst"andigen
3467Bausteine, sondern Logik-Kerne f"ur Gate-Arrays der Firma Xilinx.  Die
34683er-Variante bietet einen gr"o"seren Adre"sraum sowie einige zus"atzliche
3469Instruktionen.  Es ist zu beachten, da"s sie nicht bin"ar
3470aufw"artskompatibel ist!
3471%%-----------
3472\begin{quote}
3473ak) MICO8\_05, MICO8\_V3, MICO8\_V31
3474\end{quote}
3475Leider hat Lattice die Maschinencodes des Mico8 mehrfach ge"andert, so
3476da"s verschiedene Targets notwendig wurden, um auch alte Designs weiter
3477zu unterst"utzen.  Die erste Variante entspricht der Variante, wie sie
3478im 2005er-Manual beschrieben wurde, die beiden anderen die Versionen 3.0
3479bzw. 3.1.
3480%%-----------
3481\begin{quote}
3482al) 96C141, 93C141
3483\end{quote}
3484Diese beiden Prozessoren repr"asentieren die beiden Varianten der
3485Prozessorfamilie: TLCS-900 und TLCS-900L.  Die Unterschiede dieser beiden
3486Varianten werden in Abschnitt \ref{TLCS900Spec} genauer beleuchtet.
3487%%-----------
3488\begin{quote}
3489am) 90C141
3490\end{quote}
3491%%-----------
3492\begin{quote}
3493an) 87C00, 87C20, 87C40, 87C70
3494\end{quote}
3495Die Prozessoren der TLCS-870-Reihe haben zwar den identischen CPU-Kern, je
3496nach Variante aber eine unterschiedliche Peripherieausstattung.  Zum
3497Teil liegen Register gleichen Namens auf unterschiedlichen Adressen.
3498Die Datei STDDEF87.INC benutzt analog zur MCS-51-Familie die hier
3499m"ogliche Unterscheidung, um automatisch den korrekten Symbolsatz
3500bereitzustellen.
3501%%-----------
3502ao) TLCS-870/C
3503Momentan ist nur der Prozessorkern der TLCS-870/C-Familie impleemntiert.
3504%%-----------
3505\begin{quote}
3506ap) 47C00 $\rightarrow$ 470C00 $\rightarrow$ 470AC00
3507\end{quote}
3508Diese drei Varianten der TLCS-47-Familie haben unterschiedlich gro"se
3509RAM-und ROM-Adre"sbereiche, wodurch jeweils einige Befehle zur
3510Bankumschaltung hinzukommen oder wegfallen.
3511%%-----------
3512\begin{quote}
3513aq) 97C241
3514\end{quote}
3515%%-----------
3516\begin{quote}
3517ar) TC9331
3518\end{quote}
3519%%-----------
3520\begin{quote}
3521as) 16C54 $\rightarrow$ 16C55 $\rightarrow$ 16C56 $\rightarrow$ 16C57
3522\end{quote}
3523Diese Prozessoren unterscheiden sich durch den verf"ugbaren
3524Adre"sraum im Programmspeicher, d.h. durch die Adresse, ab der
3525der AS "Uberl"aufe anmeckert.
3526%%-----------
3527\begin{quote}
3528at) 16C64, 16C84
3529\end{quote}
3530Analog zur MCS-51-Familie findet hier keine Unterscheidung im
3531Codegenerator statt, die unterschiedlichen Nummern dienen lediglich
3532der Einblendung der korrekten SFRs in STDDEF18.INC.
3533%%-----------
3534\begin{quote}
3535au) 17C42
3536\end{quote}
3537%%-----------
3538\begin{quote}
3539av) SX20, SX28
3540\end{quote}
3541Der SX20 steckt in einem kleineren Geh"ause, weshalb der Port C
3542fehlt.
3543%%-----------
3544\begin{quote}
3545aw) ST6200, ST6201, ST6203, ST6208, ST6209,\\
3546    ST6210, ST6215, ST6218, ST6220, ST6225,\\
3547    ST6228, ST6230, ST6232, ST6235, ST6240,\\
3548    ST6242, ST6245, ST6246, ST6252, ST6253,\\
3549    ST6255, ST6260, ST6262, ST6263, ST6265,\\
3550    ST6280, ST6285
3551\end{quote}
3552Die einzelnen ST6-Varianten differieren in der Menge der
3553On-Chip-Peripherie und dem eingebauten Speicher.
3554%%-----------
3555\begin{quote}
3556ax) ST7 \\
3557    ST72251G1, ST72251G2, ST72311J2, ST72311J4, \\
3558    ST72321BR6, ST72321BR7, ST72321BR9, ST72325S4, \\
3559    ST72325S6, ST72325J7, ST72325R9, ST72324J6, \\
3560    ST72324K6, ST72324J4, ST72324K4, ST72324J2, \\
3561    ST72324JK21, ST72325S4, ST72325J7, ST72325R9, \\
3562    ST72521BR6, ST72521BM9, ST7232AK1, ST7232AK2, \\
3563    ST7232AJ1, ST7232AJ2, ST72361AR4, ST72361AR6, \\
3564    ST72361AR7, ST72361AR9, ST7FOXK1, ST7FOXK2, \\
3565    ST7LITES2Y0, ST7LITES5Y0, ST7LITE02Y0, \\
3566    ST7LITE05Y0, ST7LITE09Y0 \\
3567    ST7LITE10F1, ST7LITE15F1, ST7LITE19F1, \\
3568    ST7LITE10BF0, ST7LITE15BF0, ST7LITE15BF1, \\
3569    ST7LITE19BF0, ST7LITE19BF1, \\
3570    ST7LITE20F2, ST7LITE25F2, ST7LITE29F2, \\
3571    ST7LITE30F2, ST7LITE35F2, ST7LITE39F2, \\
3572    ST7LITE49K2, \\
3573    ST7MC1K2, ST7MC1K4, ST7MC2N6, ST7MC2S4, \\
3574    ST7MC2S6, ST7MC2S7, ST7MC2S9, ST7MC2R6, \\
3575    ST7MC2R7, ST7MC2R9, ST7MC2M9, \\
3576    STM8 \\
3577    STM8S001J3, STM8S003F3, STM8S003K3, STM8S005C6,\\
3578    STM8S005K6, STM8S007C8, STM8S103F2, STM8S103F3,\\
3579    STM8S103K3, STM8S105C4, STM8S105C6, STM8S105K4,\\
3580    STM8S105K6, STM8S105S4, STM8S105S6, STM8S207MB,\\
3581    STM8S207M8, STM8S207RB, STM8S207R8, STM8S207R6,\\
3582    STM8S207CB, STM8S207C8, STM8S207C6, STM8S207SB,\\
3583    STM8S207S8, STM8S207S6, STM8S207K8, STM8S207K6,\\
3584    STM8S208MB, STM8S208RB, STM8S208R8, STM8S208R6,\\
3585    STM8S208CB, STM8S208C8, STM8S208C6, STM8S208SB,\\
3586    STM8S208S8, STM8S208S6, STM8S903K3, STM8S903F3,\\
3587    STM8L050J3, STM8L051F3, STM8L052C6, STM8L052R8,\\
3588    STM8L001J3, STM8L101F1, STM8L101F2, STM8L101G2,\\
3589    STM8L101F3, STM8L101G3, STM8L101K3, STM8L151C2,\\
3590    STM8L151K2, STM8L151G2, STM8L151F2, STM8L151C3,\\
3591    STM8L151K3, STM8L151G3, STM8L151F3, STM8L151C4,\\
3592    STM8L151C6, STM8L151K4, STM8L151K6, STM8L151G4,\\
3593    STM8L151G6, STM8L152C4, STM8L152C6, STM8L152K4,\\
3594    STM8L152K6, STM8L151R6, STM8L151C8, STM8L151M8,\\
3595    STM8L151R8, STM8L152R6, STM8L152C8, STM8L152K8,\\
3596    STM8L152M8, STM8L152R8, STM8L162M8, STM8L162R8,\\
3597    STM8AF6366, STM8AF6388, STM8AF6213, STM8AF6223,\\
3598    STM8AF6226, STM8AF6246, STM8AF6248, STM8AF6266,\\
3599    STM8AF6268, STM8AF6269, STM8AF6286, STM8AF6288,\\
3600    STM8AF6289, STM8AF628A, STM8AF62A6, STM8AF62A8,\\
3601    STM8AF62A9, STM8AF62AA, STM8AF5268, STM8AF5269,\\
3602    STM8AF5286, STM8AF5288, STM8AF5289, STM8AF528A,\\
3603    STM8AF52A6, STM8AF52A8, STM8AF52A9, STM8AF52AA,\\
3604    STM8AL3136, STM8AL3138, STM8AL3146, STM8AL3148,\\
3605    STM8AL3166, STM8AL3168, STM8AL3L46, STM8AL3L48,\\
3606    STM8AL3L66, STM8AL3L68, STM8AL3188, STM8AL3189,\\
3607    STM8AL318A, STM8AL3L88, STM8AL3L89, STM8AL3L8A,\\
3608    STM8TL52F4, STM8TL52G4, STM8TL53C4, STM8TL53F4,\\
3609    STM8TL53G4
3610\end{quote}
3611Der STM8-Kern erweitert den Adre"raum auf bis zu 16 MByte und f"uhrt
3612eine ganze Reihe neuer Befehle ein.  Obwohl viele Befehle den
3613gleichen Maschinencode wie beim ST7 haben, ist er nicht bin"ar
3614aufw"artskompatibel.
3615%%-----------
3616\begin{quote}
3617ay) ST9020, ST9030, ST9040, ST9050
3618\end{quote}
3619Diese 4 Namen vetreten die vier ,,Unterfamilien'' der ST9-Familie, die
3620sich durch eine unterschiedliche Ausstattung mit On-Chip-Peripherie
3621auszeichen.  Im Prozessorkern sind sie identisch, so da"s diese
3622Unterscheidung wieder nur im Includefile mit den Peripherieadressen zum
3623Zuge kommt.
3624%%-----------
3625\begin{quote}
3626az) 6804
3627\end{quote}
3628%%-----------
3629\begin{quote}
3630ba) 32010 $\rightarrow$ 32015
3631\end{quote}
3632Der TMS32010 besitzt nur 144 Byte internes RAM, weshalb AS Adressen im
3633Datensegment auf eben diesen Bereich begrenzt.  F"ur den 32015 gilt diese
3634Beschr"ankung nicht, es kann der volle Bereich von 0--255 angesprochen
3635werden.
3636%%-----------
3637\begin{quote}
3638bb) 320C25 $\rightarrow$ 320C26 $\rightarrow$ 320C28
3639\end{quote}
3640Diese Prozessoren unterscheiden sich nur leicht in der
3641On-Chip-Peripherie sowie den Konfigurationsbefehlen.
3642%%-----------
3643\begin{quote}
3644bc) 320C30, 320C31 $\rightarrow$ 320C40, 320C44
3645\end{quote}
3646Der 320C31 ist eine etwas ,,abgespeckte'' Version des 320C30 mit dem
3647gleichen Befehlssatz, jedoch weniger Peripherie.  In STDDEF3X.INC
3648wird diese Unterscheidung ausgenutzt.  Die C4x-Varianten sind
3649Quellcode-aufw"artskompatibel, unterscheiden sich im
3650Maschinencode einiger Befehle jedoch subtil.  Auch hier ist ist
3651der C44 eine abgespeckte Version des C40, mit weniger Peripherie
3652und kleinerem Adre"raum.
3653%%-----------
3654\begin{quote}
3655bd) 320C203 $\rightarrow$ 320C50, 320C51, 320C53
3656\end{quote}
3657Ersterer ist der generelle Repr"asentant f"ur die
3658C20x-Signalprozessorfamilie, die eine Untermenge des C5x-Befehlssatzes
3659implementieren.  Die Unterscheidung zwischen den verschiedenen
3660C5x-Prozessoren wird von AS momentan nicht ausgenutzt.
3661%%-----------
3662\begin{quote}
3663be) 320C541
3664\end{quote}
3665Dies ist momentan der Pepr"asentant f"ur die TMS320C54x-Familie...
3666%%-----------
3667\begin{quote}
3668bf) TI990/4, TI990/10, TI990/12 \\
3669    TMS9900, TMS9940, TMS9995, TMS99105, TMS99110
3670\end{quote}
3671Die TMS99xx/99xxx-Prozessoren sind im Prinzip Single-Chip-Implementierungen
3672der TI990-Minicomputer, einige TI990-Modelle basieren auch auf einem solchen
3673Prozessor anstatt einer diskret aufgebauten CPU.  Die einzelnen Modelle
3674unterscheiden sich im Befehlssatz (der TI990/12 hat den gr"o"sten), und
3675dem Vorhandensein eines privilegierten Modus.
3676%%-----------
3677\begin{quote}
3678\begin{tabbing}
3679\hspace{0.7cm} \= \kill
3680bg) \> TMS70C00, TMS70C20, TMS70C40, \\
3681    \> TMS70CT20, TMS70CT40, \\
3682    \> TMS70C02, TMS70C42, TMS70C82, \\
3683    \> TMS70C08, TMS70C48 \\
3684\end{tabbing}
3685\end{quote}
3686Alle Mitglieder dieser Familie haben den gleichen CPU-Kern,
3687unterscheiden sich im Befehlssatz also nicht.  Die Unterschiede
3688finden sich nur in der Datei REG7000.INC, in der Speicherbereiche
3689und Peripherieadressen definiert werden.  Die in einer Zeile
3690stehenden  Typen besitzen jeweils gleiche Peripherie und gleiche
3691interne RAM-Menge, unterscheiden sich also nur in der Menge
3692eingebauten ROMs.
3693%%-----------
3694\begin{quote}
3695bh) 370C010, 370C020, 370C030, 370C040 und 370C050
3696\end{quote}
3697Analog zur MCS-51-Familie werden die unterschiedlichen Typen nur
3698zur Unterscheidung der Peripherie in STDDEF37.INC genutzt, der
3699Befehlssatz ist identisch.
3700%%-----------
3701\begin{quote}
3702bi) MSP430 $\rightarrow$ MSP430X
3703Die X-Variante des CPU-Kerns erweitert den Adre"sraum von 64
3704KiByte auf 1 MiByte und erweitert den Befehlssatz, um
3705Instrutionen mehrfach ausf"uhren zu k"onnen.
3706\end{quote}
3707%%-----------
3708\begin{quote}
3709bj) TMS1000, TMS1100, TMS1200, TMS1300
3710\end{quote}
3711F"ur TMS1000 und TMS1200 sind jeweils 1 KByte ROM und 64 Nibbles
3712RAM vorgesehen, f"ur TMS1100 und TMS1300 jeweils das doppelte.  Des
3713weiteren hat TI f"ur TMS1100 und TMS1300 einen deutlich anderen
3714Dewfault-Befehlssatz vorgesehen (AS kennt nur die Default-
3715Befehlss"atze!).
3716%%-----------
3717\begin{quote}
3718bk) SC/MP
3719\end{quote}
3720%%-----------
3721\begin{quote}
3722bl) 8070
3723\end{quote}
3724Dieser Prozessor repr"asentiert die gesamte 807x-Familie (die mindestens
3725aus den 8070, 8072 und 8073 besteht), der jedoch ein einheitlicher
3726CPU-Kern gemeinsam ist.
3727%%-----------
3728\begin{quote}
3729bm) COP87L84
3730\end{quote}
3731Dies ist das momentan einzige unterst"utzte Mitglied der COP8-Familie
3732von National Semiconductor.  Mir ist bekannt, da"s die Familie
3733wesentlich gr"o"ser ist und auch Vertreter mit unterschiedlich gro"sem
3734Befehlssatz existieren, die nach Bedarf hinzukommen werden.  Es ist eben
3735ein Anfang, und die Dokumentation von National ist ziemlich umfangreich...
3736%%-----------
3737\begin{quote}
3738bn) COP410 $\rightarrow$ COP420 $\rightarrow$ COP440 $\rightarrow$ COP444
3739Die COP42x-Derivate bieten einige weitere Befehle, des weiteren wurden
3740Befehlen in ihrem Wertebereich erweitert.
3741\end{quote}
3742%%-----------
3743\begin{quote}
3744\begin{tabbing}
3745\hspace{0.7cm} \= \kill
3746bo) \> SC14400, SC14401, SC14402, SC14404, SC14405, \\
3747    \> SC14420, SC14421, SC14422, SC14424 \\
3748\end{tabbing}
3749\end{quote}
3750Diese Gruppe von DECT-Controller unterscheidet sich in ihrem
3751Befehlsumfang, da jeweils unterschiedliche B-Feld Datenformate
3752unterst"utzt werden und deren Architektur im Laufe der Zeit optimiert
3753wurde.
3754%%-----------
3755\begin{quote}
3756bp) ACE1101, ACE1202
3757\end{quote}
3758%%-----------
3759\begin{quote}
3760bq) MK3870, MK3872, MK3873, MK3874, MK3875, MK3876, \\
3761    MK38C70
3762\end{quote}
3763Der Befehlssatz aller F8-Varianten ist identisch, mit Ausnahme
3764der CMOS-Version, die zwei neue Befehle (HET und HAL) kennt.
3765Ansonsten unterscheiden sie sich nur in der Menge des eingebauten
3766Speichers (2 oder 4 KByte ROM, 64 Byte Executable RAM oder nicht)
3767und in der eingebauten Peripherie (mit serieller Schnittstelle
3768oder ohne).
3769%%-----------
3770\begin{quote}
3771br) 7810 $\rightarrow$ 78C10
3772\end{quote}
3773Die NMOS-Version besitzt keinen STOP-Modus; der entspechende Befehl sowie
3774das ZCM-Register fehlen demzufolge.  \bb{VORSICHT!} NMOS- und CMOS-Version
3775differieren zum Teil in den Reset-Werten einiger Register!
3776%%-----------
3777\begin{quote}
3778bs) 7566 $\leftrightarrow$ 7508
3779\end{quote}
3780Es existieren in der $\mu$PD75xx-Familie zwei verschiedene
3781CPU-Kerne: Der 7566 repr"asentiert den 'instruction set B', der
3782deutlich weniger Befehle, einige Register weniger und kleinere
3783Adre"sr"aume erlaubt.  Der 7508 repr"asentiert den 'vollen'
3784Befehlssatz A.  {\bf VORSICHT!} Beide Maschinen-Befehlss"atze
3785sind nicht 100\%-ig bin"arkompatibel!
3786%%-----------
3787\begin{quote}
3788\begin{tabbing}
3789\hspace{0.7cm} \= \kill
3790bt) \> 75402, \\
3791    \> 75004, 75006, 75008, \\
3792    \> 75268, \\
3793    \> 75304, 75306, 75308, 75312, 75316, \\
3794    \> 75328, \\
3795    \> 75104, 75106, 75108, 75112, 75116, \\
3796    \> 75206, 75208, 75212, 75216, \\
3797    \> 75512, 75516 \\
3798\end{tabbing}
3799\end{quote}
3800Dieses ,,F"ullhorn'' an Prozessoren unterscheidet sich innerhalb einer
3801Gruppe nur durch die RAM- und ROM-Gr"o"se; die Gruppen untereinander
3802unterscheiden sich einmal durch ihre on-chip-Peripherie und
3803zum anderen durch die M"achtigkeit des Befehlssatzes.
3804%%-----------
3805\begin{quote}
3806bu) 78070
3807\end{quote}
3808Dies ist das einzige, mir momentan vertraute Mitglied der
380978K0-Familie von NEC.  Es gelten "ahnliche Aussagen wie zur
3810COP8-Familie!
3811%%-----------
3812\begin{quote}
3813bv) 78214
3814\end{quote}
3815Dies ist momentan der Repr"asentant der 78K2-Familie von NEC.
3816%%-----------
3817\begin{quote}
3818bw) 78310
3819\end{quote}
3820Dies ist momentan der Repr"asentant der 78K3-Familie von NEC.
3821%%-----------
3822\begin{quote}
3823bx) 784026
3824\end{quote}
3825Dies ist momentan der Repr"asentant der 78K4-Familie von NEC.
3826%%-----------
3827\begin{quote}
3828by) 7720 $\rightarrow$ 7725
3829\end{quote}
3830Der $\mu$PD7725 bietet im Vergleich zu seinem Vorg"anger gr"o"sere
3831Adre"sr"aume und einige zus"atzliche Befehle. {\bf VORSICHT!}  Die
3832Prozessoren sind nicht zueinander bin"arkompatibel!
3833%%-----------
3834\begin{quote}
3835bz) 77230
3836\end{quote}
3837%%-----------
3838\begin{quote}
3839\begin{tabbing}
3840ca) \= SYM53C810, SYM53C860, SYM53C815, SYM53C825, \\
3841    \> SYM53C875, SYM53C895
3842\end{tabbing}
3843\end{quote}
3844Die einfacheren Mitglieder dieser Familie von SCSI-Prozessoren besitzen
3845einige Befehlsvarianten nicht, au"serdem unterscheiden sie sich in ihrem
3846Satz interner Register.
3847%%-----------
3848\begin{quote}
3849cb) MB89190
3850\end{quote}
3851Dieser Prozessortyp repr"asentiert die F$^{2}$MC8L-Serie von Fujitsu...
3852%%-----------
3853\begin{quote}
3854cc) MB9500
3855\end{quote}
3856...so wie dieser es momentan f"ur die 16-Bit-Varianten von Fujitsu tut!
3857%%-----------
3858\begin{quote}
3859cd) MSM5840, MSM5842, MSM58421, MSM58422, MSM5847
3860\end{quote}
3861Diese Varianten der OLMS-40-Familie unterscheiden sich im
3862Befehlssatz sowie im internen Programm- und Datenspeicher.
3863%%-----------
3864\begin{quote}
3865ce) MSM5054, MSM5055, MSM5056, MSM6051, MSM6052
3866\end{quote}
3867Gleiches wie bei der OLMS-40-Familie: Unterschiede im
3868Befehlssatz sowie im internen Programm- und Datenspeicher.
3869%%-----------
3870\begin{quote}
3871cf) MN1610[ALT] $\rightarrow$ MN1613[ALT]
3872\end{quote}
3873Zus"atzlich zu den Funktionen seines Vorg"angers bietet der
3874MN1613 einen gr"o"seren Adre"sraum, eine Floating-Point-Einheit
3875sowie eine ganze Reihe neuer Befehle.
3876%%-----------
3877\begin{quote}
3878cg) 1802 $\rightarrow$ 1804, 1805, 1806 $\rightarrow$ 1804A, 1805A
38791806A
3880\end{quote}
38811804, 1805 und 1806 haben gegen"uber dem 'Original' 1802 einen leicht
3882erweiterten Befehlssatz sowie on-chip-RAM und einen integrierten
3883Timer.  Die A-Versionen erweitern den Befehlssatz um \tty{DSAV},
3884\tty{DBNZ}, sowie um Befehle f"ur Addition und Subtraktion im
3885BCD-Format.
3886%%-----------
3887\begin{quote}
3888ch) XS1
3889\end{quote}
3890Dieser Typ repr"asentiert die XCore-''Familie''.
3891%%-----------
3892\begin{quote}
3893ci) 1750
3894\end{quote}
3895MIL STD 1750 ist ein Standard, also gibt es auch nur eine
3896(Standard-)Variante...
3897%%-----------
3898\begin{quote}
3899cj) KENBAK
3900\end{quote}
3901Es hat nie einen KENBAK-2 gegeben...
3902
3903Beim CPU-Befehl mu"s der Prozessortyp als einfaches Literal
3904angegeben werden, eine Berechnung \`a la
3905\begin{verbatim}
3906        CPU     68010+10
3907\end{verbatim}
3908ist also nicht zul"assig.  G"ultige Aufrufe sind z.B.
3909\begin{verbatim}
3910        CPU     8051
3911\end{verbatim}
3912oder
3913\begin{verbatim}
3914        CPU     6800
3915\end{verbatim}
3916Egal, welcher Prozessortyp gerade eingestellt ist, in der
3917Integervariablen MOMCPU wird der momentane Status als Hexadezimalzahl
3918abgelegt.  F"ur den 68010 ist z.B. \tty{MOMCPU=\$68010}, f"ur den 80C48
3919\tty{MOMCPU=80C48H}.  Da man Buchstaben au"ser A..F nicht als Hexziffer
3920interpretieren kann, mu"s man sich diese bei der Hex-Darstellung
3921des Prozessors wegdenken. F"ur den Z80 ist z.B. \tty{MOMCPU=80H}.
3922\par
3923Dieses Feature kann
3924man vorteilhaft einsetzen, um je nach Prozessortyp unterschiedlichen
3925Code zu erzeugen.  Der 68000 z.B. kennt noch keinen Befehl f"ur den
3926Unterprogrammr"ucksprung mit Stapelkorrektur.  Mit der Variablen
3927\tty{MOMCPU} kann man ein Makro definieren, das je nach Prozessortyp den
3928richtigen Befehl benutzt oder ihn emuliert:
3929\begin{verbatim}
3930myrtd   MACRO   disp
3931        IF      MOMCPU$<$68010   ; auf 68008 und
3932         MOVE.L (sp),disp(sp)    ; 68000 emulieren
3933         LEA    disp(sp),sp
3934         RTS
3935        ELSEIF
3936         RTD    #disp            ; ab 68010 direkt
3937        ENDIF                    ; benutzen
3938        ENDM
3939
3940        CPU     68010
3941        MYRTD   12               ; ergibt RTD #12
3942
3943        CPU     68000
3944        MYRTD   12               ; ergibt MOVE.. /
3945                                 ; LEA.. / RTS
3946\end{verbatim}
3947Da nicht alle Prozessornamen nur aus Ziffern und Buchstaben zwischen
3948A und F bestehen, wird zus"atzlich der volle Name in der
3949String-Variablen \tty{MOMCPUNAME} abgelegt.
3950\par
3951Implizit schaltet der Assembler mit dem \tty{CPU}-Befehl das aktuelle Segment
3952wieder auf Code zur"uck, da dies das einzige Segment ist, das alle
3953Prozessoren definieren.
3954\par
3955Default f"ur den Prozessortyp ist \tty{68008}, sofern dieser "uber die
3956gleichnamige Kommandozeilenoption nicht ver"andert wurde.
3957
3958F"ur einige Ziele sind Optionen bzw. Varianten definiert, die so grundlegend
3959sind, da"s sie direkt zusammen mit dem \tty{CPU}-Befehl gew"ahlt werden m"ussen.
3960Solche Optionen h"angt man direkt an das Argument mit Doppelpunkten an, und sie
3961haben die Form von Variablenzuweisungen:
3962\begin{verbatim}
3963  CPU <CPU-Name>:<var1>=<wert1>:<var2>=<wert2>:...
3964\end{verbatim}
3965Ob das jeweilige Ziel solche Optionen unterst"utzt, und wenn ja welche, wird im
3966jeweils zugeh"origen Unterkapitel mit prozessorspezifischen Hinweisen beschrieben.
3967
3968%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3969
3970\subsection{SUPMODE, FPU, PMMU}
3971\ttindex{SUPMODE}\ttindex{FPU}\ttindex{PMMU}
3972
3973{\em\begin{tabbing}
3974G"ultigkeit: \= 680x0, FPU auch 80x86, i960, SUPMODE auch TLCS-900, \\
3975             \> SH7000, i960, 29K, XA, PowerPC, M*CORE und TMS9900
3976\end{tabbing}}
3977
3978Mit diesen drei Schaltern kann bestimmt werden, auf welche Teile des
3979Befehlssatzes verzichtet werden soll, weil die daf"ur n"otigen
3980Vorbedingungen im folgenden Codest"uck nicht gegeben sind.  Als
3981Parameter f"ur diese Befehle darf entweder \tty{ON} oder \tty{OFF} gegeben werden,
3982der momentan gesetzte Zustand kann aus einer Variablen ausgelesen
3983werden, die entweder TRUE oder FALSE ist.
3984\par
3985Die Befehle bedeuten im einzelnen folgendes:
3986\begin{itemize}
3987\item{\tty{SUPMODE}: erlaubt bzw. sperrt Befehle, f"ur deren Ausf"uhrung
3988      der Prozessor im Supervisorstatus sein mu"s.  Die Statusvariable
3989      hei"st \tty{INSUPMODE}.}
3990\item{\tty{FPU}: erlaubt bzw. sperrt die Befehle des numerischen Koprozessors
3991      8087 bzw. 68881/68882.  Die Statusvariable hei"st \tty{FPUAVAIL}.}
3992\item{\tty{PMMU}: erlaubt bzw. sperrt die Befehle der Speicherverwaltungseinheit
3993      68851 bzw. der im 68030 eingebauten MMU.  \bb{ACHTUNG!} Die 68030-MMU
3994      erlaubt nur eine rel. kleine Untermenge der 68851-Befehle.  Der
3995      Assembler kann hier keine Pr"ufung vornehmen!  Die Statusvariable hei"st
3996      \tty{PMMUAVAIL}.}
3997\end{itemize}
3998Benutzung von auf diese Weise gesperrten Befehlen erzeugt bei \tty{SUPMODE}
3999eine Warnung, bei \tty{PMMU} und \tty{FPU} eine echte Fehlermeldung.
4000
4001%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4002
4003\subsection{FULLPMMU}
4004\ttindex{FULLPMMU}
4005
4006{\em G"ultigkeit: 680x0}
4007
4008Motorola hat zwar ab dem 68030 die PMMU in den Prozessor integriert,
4009diese aber nur mit einer Funktionsuntermenge der externen PMMU 68851
4010ausgestattet.  AS sperrt bei aktiviertem PMMU-Befehlssatz (s.o.) deshalb
4011alle fehlenden Befehle, wenn als Zielprozessor 68030 oder h"oher
4012eingestellt wurde.  Nun kann es aber sein, da"s in einem System mit
401368030-Prozessor die interne MMU abgeschaltet wurde und der Prozessor
4014mit einer externen 68851 betrieben wird.  Mit \tty{FULLPMMU ON} kann man
4015AS dann mitteilen, da"s der vollst"andige MMU-Befehlssatz zugelassen
4016ist.  Umgekehrt kann man, wenn man portablen Code erzeugen will, alle
4017zus"atzlichen Befehle trotz 68020-Zielplattform mit \tty{FULLPMMU OFF}
4018abschalten.  Die Umschaltung darf beliebig oft erfolgen, die momentane
4019Einstellung kann aus einem gleichnamigen Symbol ausgelesen werden.
4020\bb{ACHTUNG!}  Der \tty{CPU}-Befehl besetzt f"ur 680x0-Argumente implizit
4021diese Einstellung vor!  \tty{FULLPMMU} mu"s also auf jeden Fall nach dem
4022\tty{CPU}-Befehl kommen!
4023
4024%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4025
4026\subsection{PADDING}
4027\ttindex{PADDING}
4028
4029{\em G"ultigkeit: 680x0, 68xx, M*Core, XA, H8, SH7000, TMS9900,\\
4030     MSP430(X), ST7/STM8, AVR (only if code segment granularity
4031     is 8 bits)}
4032
4033Diverse Prozessorfamilien verlangen, da"s Objekte von mehr als einem
4034Byte L"ange auf einer geraden Adresse liegen m"ussen.  Neben Datenobjekten
4035schlie"st dies auch Instruktionsworte selber ein - auf einem 68000
4036l"osen Wortzugriffe auf eine ungerade Adresse zum Beispiel eine
4037Exception aus, andere Prozessoren wie die H8-Familie setzen das
4038unterste Adre"sbit bei einem Wortzugriff einfach hart auf Null.
4039
4040Mit dem \tty{PADDING}-Befehl kann man einen Mechanismus aktivieren,
4041mit dem der Assembler versucht, solches 'Misalignment' nach M"oglichkeit
4042zu verhindern.  Steht die Situation an, da"s ein Instruktionswort,
4043oder auch z.B. mit \tty{DC} angelegte Daten von 16 Bit oder mehr auf
4044einer ungeraden Adresse landen w"urden, dann wird automatisch ein F"ullbyte
4045davor eingef"ugt.  Im Listing wird dieses F"ullbyte in einer separaten
4046Zeile mit dem Hinweis
4047\begin{verbatim}
4048<padding>
4049\end{verbatim}
4050ausgewiesen.
4051
4052Steht in der Quellzeile ein Label, so verweist dieses Label weiterhin
4053auf den von dieser Zeile erzeugten Code, also auf die Adresse unmittelbar
4054nach dem F"ullbyte.  Das gleiche gilt auch f"ur ein Label in einer
4055separaten Zeile unmittelbar davor, sofern diese Zeile {\em alleine} das
4056Label und selber keine Anweisung enth"alt.  Im folgenden Beispiel:
4057\begin{verbatim}
4058       padding  on
4059       org      $1000
4060
4061       dc.b     1
4062adr1:  nop
4063
4064       dc.b     1
4065adr2:
4066       nop
4067
4068       dc.b     1
4069adr3:  equ      *
4070       nop
4071\end{verbatim}
4072w"urden die Labels \tty{adr1} und \tty{adr2} die (durch ein F"ullbyte
4073auf einen geraden Wert aufgerundete) Adresse der jeweiligen \tty{NOP}-
4074Instruktion beinhalten, \tty{adr3} w"urde jedoch auf das F"ullbyte {\em vor}
4075der dritten \tty{NOP}-Instruktion zeigen.
4076
4077Als Argument zu \tty{PADDING} ist analog zu den vorherigen Befehlen
4078\tty{ON} oder \tty{OFF} erlaubt, und die augenblickliche Einstellung
4079kann aus dem gleichnamigen Symbol ausgelesen werden. Defaultm"a"sig
4080ist \tty{PADDING} nur f"ur die 680x0-Familie eingeschaltet, f"ur alle
4081anderen werden erst nach Umschaltung Padding-Bytes eingef"ugt.
4082
4083%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4084
4085\subsection{PACKING}
4086\ttindex{PACKING}
4087
4088{\em G"ultigkeit: AVR}
4089
4090{\tt PACKING} ist in gewisser Weise "ahnlich zu {\tt PADDING}, es arbeitet
4091nur gewisserma"sen anders herum: w"ahrend {\tt PADDING} die
4092abgelegten Daten erg"anzt, um komplette Worte und damit ein Alignment zu
4093erhalten, quetscht {\tt PACKING} mehrere Werte in ein einzelnes Wort.
4094Dies macht im Code-Segment des AVR Sinn, weil dort mit einem Spezialbefehl
4095({\tt LPM}) auf einzelne Bytes in den 16-Bit-Worten zugegriffen werden
4096kann.  Ist diese Option eingeschaltet (Argument {\tt ON}), so werden immer
4097zwei Byte-Werte bei {\tt DATA} in ein Wort gepackt, analog zu den
4098einzelnen Zeichen von String-Argumenten.  Der Wertebereich der
4099Integer-Argumente reduziert sich dann nat"urlich auf -128...+255.  Ist
4100diese Option dagegen ausgeschaltet, (Argument {\tt OFF}), so bekommt
4101jedes Integer-Argument sein eigenes Wort und darf auch Werte von
4102-32768...+65535 annehmen.
4103
4104Diese Unterscheidung betrifft nur Integer-Argumente von {\tt DATA},
4105Strings werden immer gepackt.  Zu beachten ist weiterhin, da"s dieses
4106Packen nur innerhalb der Argumente eines {\tt DATA}-Befehls funktionieren
4107kann, wer also mehrere {\tt DATA}-Befehle hinterienander hat, f"angt sich
4108bei ungeraden Argumentzahlen trotzdem halbvolle W"orter ein!
4109
4110%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4111
4112\subsection{MAXMODE}
4113\ttindex{MAXMODE}
4114
4115{\em G"ultigkeit: TLCS-900, H8}
4116
4117Die Prozessoren der TLCS-900-Reihe k"onnen in 2 Betriebsarten arbeiten,
4118dem Minimum-und Maximum-Modus.  Je nach momentaner Betriebsart gelten
4119f"ur den Betrieb und den Assembler etwas andere Eckwerte.  Mit diesem Befehl
4120und den Parametern \tty{ON} oder \tty{OFF} teilt man AS mit, da"s der
4121folgende Code im Maximum- oder Minimum-Modus abl"auft.  Die momentane
4122Einstellung kann aus der Variablen \tty{INMAXMODE} ausgelesen werden.
4123Voreinstellung ist \tty{OFF}, d.h. Minimum-Modus.
4124\par
4125Analog dazu teilt man im H8-Modus AS mit diesem Befehl mit, ob
4126mit einem 64K- oder 16Mbyte-Adre"sraum gearbeitet wird.  F"ur den
4127einfachen 300er ist diese Einstellung immer \tty{OFF} und kann nicht
4128ver"andert werden.
4129
4130%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4131
4132\subsection{EXTMODE und LWORDMODE}
4133\ttindex{EXTMODE}\ttindex{LWORDMODE}
4134
4135{\em G"ultigkeit: Z380}
4136
4137Der Z380 kann in insgesamt 4 Betriebsarten arbeiten, die sich durch
4138die Einstellung von 2 Flags ergeben: Das XM-Flag bestimmt, ob der
4139Prozessor mit einem 64 Kbyte oder 4 Gbyte gro"sen Adre"sraum arbeiten
4140soll und kann nur gesetzt werden (nach einem Reset steht es
4141Z80-kompatibel auf 0).  Demgegen"uber legt das LW-Flag fest, ob
4142Wort-Befehle mit einer Wortl"ange von 16 oder 32 Bit arbeiten sollen.
4143Die Stellung dieser beiden Flags beeinflu"st Wertebereichseinschr"ankungen
4144von Konstanten oder Adressen, weshalb man AS "uber diese beiden Befehle
4145deren Stellung mitteilen mu"s.  Als Default nimmt AS an, da"s beide
4146Flags auf 0 stehen, die momentane Einstellung (\tty{ON} oder \tty{OFF})
4147kann aus den vordefinierten Variablen \tty{INEXTMODE} bzw. \tty{INLWORDMODE}
4148ausgelesen werden.
4149
4150%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4151
4152\subsection{SRCMODE}
4153\ttindex{SRCMODE}
4154
4155{\em G"ultigkeit: MCS-251}
4156
4157Intel hat den Befehlssatz der 8051er beim 80C251 deutlich erweitert,
4158hatte aber leider nur noch einen einzigen freien Opcode f"ur diese
4159Befehle frei.  Damit der Prozessor nicht auf alle Ewigkeit durch
4160einen Pr"afix behindert bleibt, hat Intel zwei Betriebsarten vorgesehen:
4161Den Bin"ar- und den Quellmodus.  Im Bin"armodus ist der Prozessor voll
41628051-kompatibel, alle erweiterten Befehle ben"otigen den noch freien
4163Opcode als Pr"afix.  Im Quellmodus tauschen diese neuen Befehle ihre
4164Position in der Code-Tabelle mit den entsprechenden 8051-Instruktionen,
4165welche dann wiederum mit einem Pr"afix versehen werden m"ussen.
4166Damit AS wei"s, wann er Pr"afixe setzen mu"s und wann nicht, mu"s man
4167ihm mit diesem Befehl mitteilen, ob der Prozessor im Quellmodus (\tty{ON})
4168oder Bin"armodus (\tty{OFF}) betrieben wird.  Die momentane Einstellung
4169kann man aus der Variablen \tty{INSRCMODE} auslesen.  Der Default ist
4170\tty{OFF}.
4171
4172%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4173
4174\subsection{BIGENDIAN}
4175\ttindex{BIGENDIAN}
4176
4177{\em G"ultigkeit: MCS-51/251, PowerPC}
4178
4179Bei den Prozessoren der 8051-Serie ist Intel seinen eigenen Prinzipien
4180untreu geworden: Der Prozessor verwendet entgegen jeglicher Tradition
4181eine Big-Endian-Orientierung von Mehrbytewerten!  W"ahrend dies bei
4182den MCS-51-Prozessoren noch nicht gro"sartig auffiel, da der Prozessor
4183ohnehin nur 8-bittig auf Speicherzellen zugreifen konnte, man sich die
4184Byte-Anordnung bei eigenen Datenstrukturen also aussuchen konnte, ist
4185dies beim MCS-251 nicht mehr so, er kann auch ganze (Lang-)Worte aus
4186dem Speicher lesen und erwartet dabei das MSB zuerst.  Da dies nicht der
4187bisherigen Arbeitsweise von AS bei der Konstantenablage entspricht,
4188kann man nun mit diesem Befehl umschalten, ob die Befehle \tty{DB, DW, DD,
4189DQ} und \tty{DT} mit Big- oder Little-Endian-Orientierung arbeiten sollen.
4190Mit \tty{BIGENDIAN OFF} (Voreinstellung) wird wie bei "alteren AS-Versionen
4191zuerst das niederwertigste Byte abgelegt, mit \tty{BIGENDIAN ON} wird die
4192MCS-251-kompatible Variante benutzt.  Nat"urlich kann man diese Einstellung
4193beliebig oft im Code "andern; die momentane Einstellung kann aus dem
4194gleichnamigen Symbol ausgelesen werden.
4195
4196%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4197
4198\subsection{WRAPMODE}
4199\ttindex{WRAPMODE}
4200
4201{\em G"ultigkeit: Atmel AVR}
4202
4203Ist dieser Schalter auf {\tt ON} gesetzt, so veranla"st man AS dazu,
4204anzunehmen, der Programmz"ahler des Prozessors habe nicht die volle, durch
4205die Architektur gegebene L"ange von 16 Bits, sondern nur eine L"ange, die
4206es gerade eben erlaubt, das interne ROM zu adressieren.  Im Falle des
4207AT90S8515 sind dies z.B. 12 Bit, entsprechend 4 KWorten oder 8 KBytes.
4208Damit werden relative Spr"unge vom Anfang des ROMs zum Ende und umgekehrt
4209m"oglich, die bei strenger Arithmetik einen out-of-branch ergeben w"urden,
4210hier jedoch funktionieren, weil die "Ubertragsbits bei der
4211Zieladressenberechnung 'unter den Tisch' fallen.  Vergewissern Sie sich
4212genau, ob die von Ihnen eingesetzte Prozessorvariante so arbeitet, bevor
4213Sie diese Option einschalten!  Im Falle des oben erw"ahnten AT90S8515 ist
4214diese Option sogar zwingend n"otig, um "uberhaupt quer durch den ganzen
4215Adre"sraum springen zu k"onnen...
4216
4217Defaultm"a"sig steht dieser Schalter auf {\tt OFF}, der momentane Stand
4218l"a"st sich aus einem gleichnamigen Symbol auslesen.
4219
4220%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4221
4222\subsection{SEGMENT}
4223\ttindex{SEGMENT}
4224\label{SEGMENT}
4225
4226{\em G"ultigkeit: alle Prozessoren}
4227
4228Bestimmte Mikrokontroller und Signalprozessoren kennen mehrere
4229Adre"sbereiche, die nicht miteinander mischbar sind und jeweils auch
4230verschiedene Befehle zur Ansprache ben"otigen.  Um auch diese verwalten zu
4231k"onnen, stellt der Assembler mehrere Programmz"ahler zur Verf"ugung,
4232zwischen denen mit dem
4233\tty{SEGMENT}-Befehl hin-und hergeschaltet werden kann.  Dies erlaubt es,
4234sowohl in mit \tty{INCLUDE} eingebundenen Unterprogrammen als auch im
4235Hauptprogramm ben"otigte Daten an der Stelle zu definieren, an denen
4236sie benutzt werden.  Im einzelnen werden folgende Segmente mit folgenden
4237Namen verwaltet:
4238\begin{itemize}
4239\item{\tty{CODE}: Programcode;}
4240\item{\tty{DATA}: direkt adressierbare Daten (dazu rechnen auch SFRs);}
4241\item{\tty{XDATA}: im extern angeschlossenen RAM liegende Daten oder
4242             X-Adre"sraum beim DSP56xxx oder ROM-Daten beim $\mu$PD772x;}
4243\item{\tty{YDATA}: Y-Adre"sraum beim DSP56xxx;}
4244\item{\tty{IDATA}: indirekt adressierbare (interne) Daten;}
4245\item{\tty{BITDATA}: der Teil des 8051-internen RAMs, der bitweise
4246      adressierbar ist;}
4247\item{\tty{IO}: I/O-Adre"sbereich;}
4248\item{\tty{REG}: Registerbank des ST9;}
4249\item{\tty{ROMDATA}: Konstanten-ROM der NEC-Signalprozessoren;}
4250\item{\tty{EEDATA}: eingebautes EEPROM.}
4251\end{itemize}
4252Zu Adre"sbereich und Initialwerten der Segmente siehe Abschnitt \ref{SectORG}.
4253(\tty{ORG}).  Je nach Prozessorfamilie sind auch nicht alle Segmenttypen
4254erlaubt.
4255\par
4256Das Bitsegment wird so verwaltet, als ob es ein Bytesegment w"are,
4257d.h. die Adressen inkrementieren um 1 pro Bit.
4258\par
4259Labels, die in einem Segment eines bestimmten Typs definiert werden,
4260erhalten diesen Typ als Attribut.  Damit hat der Assembler eine
4261begrenzte Pr"ufm"oglichkeit, ob mit den falschen Befehlen auf Symbole
4262in einem Segment zugegriffen wird.  In solchen F"allen wird der
4263Assembler eine Warnung ausgeben.
4264\par
4265Beispiel:
4266\begin{verbatim}
4267        CPU     8051    ; MCS-51-Code
4268
4269        SEGMENT code    ; Testcodeblock
4270
4271        SETB    flag    ; keine Warnung
4272        SETB    var     ; Warnung : falsches Segment
4273
4274        SEGMENT data
4275
4276var     DB      ?
4277
4278        SEGMENT bitdata
4279
4280flag    DB      ?
4281\end{verbatim}
4282
4283%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4284
4285\subsection{PHASE und DEPHASE}
4286\ttindex{PHASE}\ttindex{DEPHASE}
4287
4288{\em G"ultigkeit: alle Prozessoren}
4289
4290In manchen Anwendungen (speziell Z80-Systeme) mu"s Code vor der
4291Benutzung in einen anderen Adre"sbereich verschoben werden.  Da der
4292Assembler davon aber nichts wei"s, w"urde er alle Labels in dem zu
4293verschiebenden Teil auf die Ladeadressen ausrichten.  Der Programmierer
4294m"u"ste Spr"unge innerhalb dieses Bereiches entweder lageunabh"angig
4295kodieren oder die Verschiebung bei jedem Symbol ,,zu Fu"s'' addieren.
4296Ersteres ist bei manchen Prozessoren gar nicht m"oglich, letzteres sehr
4297fehleranf"allig.
4298\par
4299Mit dem Befehlen \tty{PHASE} und \tty{DEPHASE} ist es m"oglich, dem
4300Assembler mitzuteilen, auf welcher Adresse der Code im Zielsystem
4301effektiv ablaufen wird:
4302\begin{verbatim}
4303        PHASE   <Adresse>
4304\end{verbatim}
4305informiert den Assembler davon, da"s der folgende Code auf der
4306spezifizierten Adresse ablaufen soll.  Der Assembler berechnet
4307daraufhin die Differenz zum echten Programmz"ahler und addiert diese
4308Differenz bei folgenden Operationen dazu:
4309\begin{itemize}
4310\item{Adre"sangabe im Listing}
4311\item{Ablage von Labelwerten}
4312\item{Programmz"ahlerreferenzen in relativen Spr"ungen und
4313      Adre"sausdr"ucken}
4314\item{Abfrage des Programmz"ahlers mit den Symbolen \verb!*! bzw. \verb!$!}
4315\end{itemize}
4316Diese ,,Verschiebung'' wird mit dem Befehl
4317\begin{verbatim}
4318        DEPHASE
4319\end{verbatim}
4320wieder auf den vor der zugeh"origen \tty{PHASE}-Anweisung zur"uckge"andert.
4321\tty{PHASE} und \tty{DEPHASE} k"onnen also auf diese Weise geschachtelt
4322verwendet werden.
4323\par
4324Obwohl dieses Befehlspaar vornehmlich in Codesegmenten Sinn macht,
4325verwaltet der Assembler f"ur alle definierten Segmente Phasenwerte.
4326
4327%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4328
4329\subsection{SAVE und RESTORE}
4330\ttindex{SAVE}\ttindex{RESTORE}
4331
4332{\em G"ultigkeit: alle Prozessoren}
4333
4334Mit dem Befehl \tty{SAVE} legt der Assembler den Inhalt folgender
4335Variablen auf einen internen Stapel:
4336\begin{itemize}
4337\item{momentan gew"ahlter Prozessortyp (mit \tty{CPU} gesetzt);}
4338\item{momentan aktiver Speicherbereich (mit \tty{SEGMENT} gesetzt);}
4339\item{Flag, ob Listing ein- oder ausgeschaltet ist (mit \tty{LISTING}
4340      gesetzt);}
4341\item{Flags, zu welchem Teil Expansionen folgender Makos im Listing
4342      ausgegeben werden sollen (mit \tty{MACEXP\_DFT/MACEXP\_OVR}
4343      gesetzt).}
4344\item{momentan aktive Zeichen"ubersetzungstabelle (mit \tty{CODEPAGE}
4345      gesetzt).}
4346\end{itemize}
4347Mit dem Gegenst"uck \tty{RESTORE} wird entsprechend der zuletzt
4348gesicherte Zustand von diesem Stapel wieder heruntergeladen.  Diese beiden
4349Befehle sind in erster Linie f"ur Includefiles definiert worden, um
4350in diesen Dateien die obigen Variablen beliebig ver"andern zu k"onnen,
4351ohne ihren originalen Inhalt zu verlieren.  So kann es z.B. sinnvoll sein,
4352in Includefiles mit eigenen, ausgetesteten Unterprogrammen die
4353Listingerzeugung auszuschalten:
4354\begin{verbatim}
4355        SAVE            ; alten Zustand retten
4356        LISTING OFF     ; Papier sparen
4357        ..              ; der eigentliche Code
4358        RESTORE         ; wiederherstellen
4359\end{verbatim}
4360Gegen"uber einem einfachen \tty{LISTING OFF..ON}-P"archen wird hier
4361auch dann der korrekte Zustand wieder hergestellt, wenn die Listingerzeugung
4362bereits vorher ausgeschaltet war.
4363\par
4364Der Assembler "uberpr"uft, ob die Zahl von \tty{SAVE}-und \tty{RESTORE}-Befehlen
4365"ubereinstimmt und liefert in folgenden F"allen Fehlermeldungen:
4366\begin{itemize}
4367\item{\tty{RESTORE} und der interne Stapel ist leer;}
4368\item{nach Ende eines Passes ist der Stapel nicht leer.}
4369\end{itemize}
4370
4371%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4372
4373\subsection{ASSUME}
4374\ttindex{ASSUME}
4375
4376%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4377
4378{\em G"ultigkeit: diverse}
4379
4380Mit diesem Befehl kann man AS den aktuellen Stand bestimmter Register
4381mitteilen, deren Inhalt sich nicht mit einem einfachen \tty{ON} oder
4382\tty{OFF} beschreiben l"a"st.  Typischerweise sind dies Register, die die
4383Adressierungseinheiten beeinflussen und deren Werte AS wissen mu"s, um
4384korrekte Adressierungen zu erzeugen.  Wichtig ist, da"s man AS mit ASSUME
4385diese Werte nur mitteilt, es wird {\em kein} Maschinencode erzeugt, der
4386diese Werte in die entsprechenden Register l"adt!
4387
4388Ein mit \tty{ASSUME} definierter Wert l"a"st sich mit der
4389eingebauten Funktion \tty{ASSUMEDVAL} wieder abfragen oder in
4390Ausdr"ucke einbauen.  Dies gilt f"ur alle im folgenden gelisteten
4391Architekturen mit Ausnahme des 8086.
4392
4393%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4394
4395\subsubsection{65CE02}
4396
4397Der 65CE02 besitzt ein Register 'B', mit dem die 'Base-Page' festgelegt wird.
4398Im Gegensatz zum 'einfachen' 6502 l"a"st sich damit die Speicherseite, die
4399mit kurzen (8-bittigen) Adressen ansprechbar ist, frei im 64K-Adre'sraum hin-
4400und herschieben.  Nach einem Reset steht dieses Register auf Null, der 65CE02
4401verh"alt sich also wie sein Vorbild.  Dies ist auch die Default-Annahme des
4402Assemblers.  Mittels eines \tty{ASSUME B:xx} kann man ihm den aktuellen Wert
4403mitteilen, und f"ur Adressen in dieser Seite werden dann automatisch kurze
4404Adressierungsarten benutzt.
4405
4406%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4407
4408\subsubsection{6809}
4409
4410Im Gegensatz zu seinen ,,Vorg"angern'' wie 6800 und 6502 kann beim
44116809 die Lage der direct page, d.h. des Adressbereiches, der mit ein
4412Byte langen Adressen erreichbar ist, frei bestimmt werden.  Dazu dient
4413das sog. ,,Direct Page Register'' (\tty{DPR}), das die Seitennummer
4414festlegt.  Ihm mu"s man mittels \tty{ASSUME} einen passenden Wert
4415zuweisen, wenn man einen anderen Wert als die Vorgabe von 0 in DPR
4416schreibt, sonst werden Adressen falscher L"ange erzeugt...
4417
4418
4419%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4420
4421\subsubsection{68HC11K4}
4422
4423Auch beim HC11 konnten die Entwickler letzten Endes nicht dem
4424'S"undenfall' widerstehen und haben in den K4 ein Banking-Schema
4425eingebaut, um mit 16 Adre"sleitungen mehr als 64 Kbyte anzusprechen.  Die
4426Register {\tt MMSIZ}, {\tt MMWBR}, {\tt MM1CR} und {\tt MM2CR} legen fest,
4427ob wie die beiden zus"atzlichen 512K-Bereiche in den physikalischen
4428Adre"sraum eingeblendet werden sollen.  Initial nimmt AS den Reset-Zustand
4429dieser Register an, d.h. alle mit \$00 belegt und das Windowing ist
4430abgeschaltet.
4431
4432%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4433
4434\subsubsection{68HC12X}
4435
4436Wie die Variante ohne anh"angendes 'X' kennt auch der HC12X eine kurze
4437direkte Adressierungsart, die hier jedoch auch andere Adre"sbereiche als
4438die ersten 256 Byte erreichen kann.  "Uber das {\tt DIRECT}-Register kann
4439die 256-Byte-Seite vorgegeben werden, die mit dieser kurzen
4440Adressierungsart angesprochen wird.  Mittels {\tt ASSUME} wird AS der
4441momentane Stand dieses Registers mitgeteilt, so da"s bei absoluten
4442Adressen automatisch die effizienteste Adressierungsart gew"ahlt werden
4443kann.  Default ist 0, was auch dem Reset-Zustand entspricht.
4444
4445\subsubsection{68HC16}
4446
4447Um mit seinen nur 16 Bit breiten Adre"soperanden einen 1 Mbyte gro"sen
4448Adre"sraum ansprechen zu k"onnen, bedient sich der 68HC16 einer Reihe
4449von Bank-Registern, die die fehlenden oberen vier Adre"sbits nachliefern.
4450Davon ist das \tty{EK}-Register f"ur absolute Datenzugriffe (nicht
4451Spr"unge!) zust"andig.  AS "uberpr"uft bei jeder absoluten Adressierung,
4452ob die oberen vier Bits der Adresse mit dem "uber \tty{ASSUME}
4453spezifizierten Wert "ubereinstimmen.  Differieren die Werte, gibt AS eine
4454Warnung aus.  Der Vorgabewert f"ur \tty{EK} ist 0.
4455
4456%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4457
4458\subsubsection{H8/500}
4459
4460Im Maximum-Modus wird der erweiterte Adre"sraum dieser Prozessorreihe
4461durch eine Reihe von Bank-Registern adressiert.  Diese tragen die
4462Namen DP (Register 0..3, absolute Adressen), EP (Register 4/5) und
4463TP (Stack).  Den momentanen Wert von DP ben"otigt AS, um zu "uberpr"ufen,
4464ob absolute Adressen in der momentan adressierbaren Bank liegen;
4465die beiden anderen Register werden nur f"ur indirekte Adressierungen
4466benutzt und entziehen sich daher der Kontrolle; ob man ihre Werte
4467angibt oder nicht, ist daher Geschmackssache.  Wichtig ist dagegen
4468wieder das BR-Register, das angibt, auf welchen 256-Byte-Bereich
4469mit kurzen Adressen zugegriffen werden kann.  Allen Registern ist
4470gemeinsam, da"s AS {\em keine} Initialwerte f"ur sie annimmt, da sie nach
4471einem Prozessor-Reset undefiniert sind; wer absolut adressieren
4472will, mu"s daher auf jeden Fall DR und DP belegen!
4473
4474%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4475
4476\subsubsection{MELPS740}
4477
4478Die Mikrokontroller dieser Reihe kennen f"ur den \tty{JSR}-Befehl eine
4479besondere Adressierungsart ,,special page'', mit deren Hilfe man Spr"unge
4480in die oberste Seite des internen ROMs k"urzer kodieren kann.  Diese
4481ist nat"urlich vom jeweiligen Chip abh"angig, und es gibt mehr Chips,
4482als es mit dem \tty{CPU}-Befehl sinnvoll w"are, zu kodieren...also mu"s
4483\tty{ASSUME} herhalten, um die Lage dieser Seite vorzugeben, z.B.
4484\begin{verbatim}
4485        ASSUME SP:$1f ,
4486\end{verbatim}
4487falls das interne ROM 8K gro"s ist.
4488
4489%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4490
4491\subsubsection{MELPS7700/65816}
4492
4493Diese Prozessoren beinhalten eine Reihe von Registern, deren Inhalt AS
4494kennen mu"s, um den korrekten Code zu erzeugen.  Es handelt sich um folgende
4495Register:
4496\begin{center}\begin{tabular}{|l|l|l|l|}
4497\hline
4498Name  & Bedeutung           & Wertebereich & Default\\
4499\hline
4500\hline
4501DT/DBR & Datenbank           & 0-\$ff       & 0 \\
4502PG/PBR & Code-Bank           & 0-\$ff       & 0 \\
4503DPR   & direkt adr. Seite   & 0-\$ffff     & 0 \\
4504X     & Indexregisterbreite & 0 oder 1     & 0 \\
4505M     & Akkumulatorbreite   & 0 oder 1     & 0 \\
4506\hline
4507\end{tabular}\end{center}
4508\par
4509Um mich nicht in endlose Wiederholungen zu ergehen, verweise ich f"ur die
4510Benutzung dieser Werte auf Kapitel \ref{MELPS7700Spec}.  Die Handhabung
4511erfolgt ansonsten genauso wie beim 8086, d.h. es k"onnen auch hier mehrere
4512Werte auf einmal gesetzt werden und es wird \bb{kein} Code erzeugt, der
4513die Register mit den Werten besetzt.  Dies bleibt wieder einzig und allein
4514dem Programmierer "uberlassen!
4515
4516%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4517
4518\subsubsection{MCS-196/296}
4519
4520Alle Prozessoren der MCS-96-Familie besitzen ab dem 80196 ein Register \tty{WSR},
4521mit dessen Hilfe Speicherbereiche aus dem erweiterten internen RAM
4522oder dem SFR-Bereich in Bereiche des Registerfiles eingeblendet werden
4523und so mit kurzen Adressen angesprochen werden k"onnen.  Teilt man AS
4524mit Hilfe des \tty{ASSUME}-Befehls mit, welchen Wert das WSR-Register
4525hat, so stellt er bei absoluten Adressen automatisch fest, ob  sie
4526durch das Windowing mit 1-Byte-Adressen erreicht werden k"onnen;
4527umgekehrt werden auch f"ur durch das Windowing "uberdeckte Register
4528automatisch lange Adressen erzeugt.  Der 80296 besitzt ein zus"atzliches,
4529zweites Register \tty{WSR1}, um zwei unterschiedliche Speicherbereiche
4530gleichzeitig in das Registerfile einblenden zu k"onnen.  Sollte
4531es m"oglich sein, eine Speicherzelle "uber beide Bereiche zu adressieren,
4532so w"ahlt AS immer den Weg "uber \tty{WSR}!
4533
4534Bei indirekter Adressierung k"onnen Displacements wahlweise kurz (8 Bit,
4535-128 bis +127) oder lang (16 Bit) sein.  Der Assembler w"ahlt automatisch
4536anhand des Displacements die k"urzestm"ogliche Kodierung.  Es ist aber m"oglich,
4537durch ein vorangestelltes Gr"o"ser-Zeichen (\verb!>!) eine 16-Bit-Kodierung
4538des Displacements zu erzwingen.  Gleiches gilt f"ur absolute Adressen im
4539Bereich 0ff80h...0ffffh, die mit einem kurzen Offset relativ zum "Nullregister"
4540adressiert werden k"onnen.
4541
4542%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4543
4544\subsubsection{8086}
4545
4546Der 8086 kann Daten aus allen Segmenten in einem Befehl adressieren,
4547ben"otigt jedoch sog. ,,Segment-Pr"afixe'', wenn ein anderes Segmentregister
4548als DS verwendet werden soll.  Zus"atzlich kann es sein, da"s das
4549DS-Register auf ein anderes Segment verstellt ist, um z.B. "uber l"angere
4550Strecken nur Daten im Codesegment zu adressieren.  Da AS aber keine
4551Sinnanalyse des Codes vornimmt, mu"s ihm "uber diesen Befehl mitgeteilt
4552werden, auf welche Segmente die Segmentregister momentan zeigen, z.B.
4553\begin{verbatim}
4554   ASSUME  CS:CODE, DS:DATA    .
4555\end{verbatim}
4556Allen vier Segmenten des 8086 (SS,DS,CS,ES) k"onnen auf diese Weise Annahmen
4557zugewiesen werden.  Dieser Befehl erzeugt jedoch \bb{keinen} Code, um
4558die Werte auch wirklich in die Segmentregister zu laden, dies mu"s vom
4559Programm getan werden.
4560\par
4561Die Benutzung diese Befehls hat zum einen die Folge, da"s AS bei
4562sporadischen Zugriffen ins Codesegment automatisch Pr"afixe voranstellen
4563kann, andererseits da"s man AS mitteilen kann, da"s das DS-Register verstellt
4564wurde und man sich im folgenden explizite \tty{CS:}-Anweisungen sparen
4565kann.
4566\par
4567G"ultige Argumente hinter dem Doppelpunkt sind \tty{CODE, DATA} und
4568\tty{NOTHING}.  Letzterer Wert dient dazu, AS mitzuteilen, da"s das
4569Segmentregister keinen f"ur AS verwendbaren Wert enth"alt.
4570Vorinitialisiert sind folgende \tty{ASSUME}s :
4571\begin{verbatim}
4572  CS:CODE, DS:DATA, ES:NOTHING, SS:NOTHING
4573\end{verbatim}
4574
4575%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4576
4577\subsubsection{XA}
4578
4579Die XA-Familie besitzt einen Datenadre"sraum von 16 Mbyte, ein Proze"s
4580kann jedoch nur immer innerhalb einer 64K-Seite adressieren, die
4581durch das DS-Register vorgegeben wird.  AS mu"s man den momentanen
4582Wert dieses Registers vorgeben, damit er Zugriffe auf absolute
4583Adressen "uberpr"ufen kann.
4584
4585%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4586
4587\subsubsection{29K}
4588
4589Die Prozessoren der 29K-Familie besitzen ein Register \tty{RBP}, mit dessen
4590Hilfe B"anke von 16 Registern vor der Benutzung im User-Modus gesch"utzt
4591werden k"onnen.  Dazu kann man ein entsprechendes Bit in diesem Register
4592setzen.  Mit \tty{ASSUME} kann man AS nun mitteilen, welchen Wert RBP
4593gerade hat.  Auf diese Weise kann AS warnen, falls versucht wird, im
4594User-Modus auf gesch"utzte Register zuzugreifen.
4595
4596%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4597
4598\subsubsection{80C166/167}
4599
4600Obwohl keines der Register im 80C166/167 breiter als 16 Bit ist, besitzt
4601dieser Prozessor 18/24 Adre"sleitungen, kann also bis zu 256 Kbyte/16 Mbyte
4602adressieren.  Um diesen Widerspruch unter einen Hut zu bekommen, verwendet
4603er nicht die von Intel her bekannte (...und ber"uchtigte) Segmentierung oder
4604hat unflexible Bankregister...nein, er macht Paging!  Dazu wird der ,,logische''
4605Adre"sraum von 64 Kbyte in 4 Seiten zu 16 Kbyte eingeteilt, und f"ur jede
4606Seite existiert ein Seitenregister (bezeichnet als \tty{DPP0...DPP3}), das
4607bestimmt, welche der physikalischen 16/1024 Seiten dort eingeblendet wird.  AS versucht
4608nun, den Adre"sraum grunds"atzlich mit 256 Kbyte/16 Mbyte aus der Sicht des
4609Programmierers zu verwalten, d.h. bei absoluten Zugriffen ermittelt AS die
4610physikalische Seite und schaut in der mit \tty{ASSUME} eingestellten
4611Seitenverteilung nach, wie die Bits 14 und 15 der logischen Adresse gesetzt
4612werden m"ussen.  Pa"st kein Seitenregister, so wird eine Warnung ausgegeben.
4613Defaultm"a"sig nimmt AS an, da"s die vier Register linear die ersten 64 Kbyte
4614abbilden, etwa in der folgenden Form:
4615\begin{verbatim}
4616        ASSUME  DPP0:0,DPP1:1,DPP2:2,DPP3:3
4617\end{verbatim}
4618Der 80C167 kennt noch einige Befehle, die die Seitenregister in ihrer
4619Funktion "ubersteuern k"onnen.  Wie diese Befehle die Adre"sgenerierung
4620beeinflussen, ist im Kapitel mit den prozessorspezifischen Hinweisen
4621beschrieben.
4622\par
4623Einige Maschineninstruktionen kennen ein verk"urzte Kodierung, wenn das
4624Argument in einem bestimmten Wertebereich liegt:
4625\begin{itemize}
4626\item{\verb!MOV Rn,#<0..15>!}
4627\item{\verb!ADD/ADDC/SUB/SUBC/CMP/XOR/AND/OR Rn, #<0..7>!}
4628\item{\verb!LOOP Rn,#<0..15>!}
4629\end{itemize}
4630Der Assembler verwendet im Default automatisch die k"urzere Kodierung
4631wenn m"oglich.  Falls man die l"angere erzwingen m"ochte, schreibt
4632man analog zum 65xx/68xx ein Gr"o"serzeichen vor den Operanden (hinter
4633das Doppelkreuz!).  Umgekehrt kann man auch ein Kleinerzeichen schreiben,
4634wenn man die kurze Korierung erzwingen will.  Falls der Operand nicht
4635im erlaubten Wertebereich liegt, gibt es eine Fehlermeldung.  Singem"a"s
4636das gleiche gilt f"ur Spr"unge, die mit kurzem Displacement oder langem,
4637ansoluten Argument kodiert werden k"onnen.
4638
4639%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4640
4641\subsubsection{TLCS-47}
4642
4643Der von der Architektur her vorgegebene Datenadre"sraum dieser
4644Prozessoren (egal ob man direkt oder "uber das HL-Register adressiert)
4645betr"agt lediglich 256 Nibbles.  Da die ,,besseren'' Familienmitglieder
4646aber bis zu 1024 Nibbles RAM on chip haben, war Toshiba gezwungen, einen
4647Bankingmechanismus "uber das DMB-Register einzuf"uhren.  AS verwaltet
4648das Datensegment als einen durchgehenden Adre"sraum und pr"uft bei jeder
4649direkten Adressierung, ob die Adresse in der momentan aktiven Bank
4650liegt.  Die von AS momentan angenommene Bank kann mittels
4651\begin{verbatim}
4652        ASSUME  DMB:<0..3>
4653\end{verbatim}
4654festgelegt werden.  Der Default ist 0.
4655
4656%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4657
4658\subsubsection{ST6}
4659\label{ST6Assume}
4660
4661Die Mikrokontroller der ST6-Reihe sind in der Lage, einen Teil (64 Byte)
4662des Codebereiches in den Datenbereich einzublenden, z.B. um Konstanten aus
4663dem ROM zu laden.  Dies bedeutet aber auch, da"s zu einem Zeitpunkt immer
4664nur ein Teil des ROMs adressiert werden kann.  Welcher Teil dies ist, wird
4665durch ein bestimmtes Register bestimmt.  Dem Inhalt dieses Registers kann
4666AS zwar nicht direkt kontrollieren, man kann ihm aber mit diesem Befehl
4667mitteilen, wenn man dem Register einen neuen Wert zugewiesen hat.  AS kann
4668dann pr"ufen und ggfs. warnen, falls auf Adressen im Codesegment
4669zugegriffen wird, die nicht im ,,angek"undigten'' Fenster liegt.
4670Hat die Variable \tty{VARI} z.B. den Wert 456h, so setzt
4671\begin{verbatim}
4672        ASSUME  ROMBASE:VARI>>6
4673\end{verbatim}
4674die AS-interne Variable auf 11h, und ein Zugriff auf \tty{VARI} erzeugt einen
4675Zugriff auf die Adresse 56h im Datensegment.
4676
4677Anstelle eines Symbols kann auch schlicht \tty{NOTHING} angegeben
4678werden, z.B. wenn das Bank-Register tempor"ar als Speicherzelle benutzt
4679wird.  Dieser Wert ist auch die Voreinstellung.
4680
4681Der Programmz"ahler dieser Mikrokontroller ist lediglich 12 Bit breit.  Das
4682bedeutet f"ur Varianten mit mehr als 4 KByte Programmspeicher, da"s man sich
4683eine Art von Banking einfallen lassen mu"ste.  Dazu werden Adre"sraum und
4684Programmspeicher in 2 KByte-Seite eingeteilt.  Seite 1 des Adre"sraumes
4685greift immer auf Seite 1 des Programmspeichers zu.  "Uber das bei diesen
4686Varianten vorhandene \tty{PRPR}-Register kann der Programmierer bestimmen,
4687welche Seite des Programmspeichers "uber die Adressen 000h bis 7ffh
4688zugegriffen wird.  AS betrachtet den Adre"sraum in erster N"aherung als
4689linear und von der Gr"o"se des Programmspeichers.  Erfolgt ein Sprung von
4690Seite 1 aus auf eine Adresse au"serhalb dieser Seite, wird gepr"uft, ob deren
4691Adresse mit dem aktuell angenommenen Wert des \tty{PRPR}-Registers identisch
4692ist.  Erfolgt ein Sprung von einer anderen Seite aus auf eine Adresse au"serhalb
4693Seite 1, wird gepr"uft, ob die Zieladresse innerhalb der gleichen Seite
4694liegt.  {\bf WICHTIG}: Da der Programmz"ahler nur 12 Bit breit ist, ist
4695es nicht m"oglich, ohne einen Umweg "uber Seite 1 von einer Seite in eine
4696andere zu springen - Mit einem Umsetzen des \tty{PRPR}-Registers au"serhalb
4697von Seite 1 w"urde man sich seinen eigenen Code unter den F"u"sen wegziehen.
4698
4699%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4700
4701\subsubsection{ST9}
4702
4703Die ST9-Familie verwendet zur Adressierung von Code- und Datenbereich
4704exakt die gleichen Befehle.  Welcher Adre"sraum dabei jeweils
4705angesprochen wird, h"angt vom Stand des DP-Flags im Flag-Register ab.
4706Damit AS bei absoluten Zugriffen "uberpr"ufen kann, ob man mit Symbolen
4707aus dem korrekten Adre"sraum arbeitet (das funktioniert nat"urlich {\em nur}
4708bei absoluten Zugriffen!), mu"s man ihm per \tty{ASSUME} mitteilen, ob das
4709DP-Flag momentan auf 0 (Code) oder 1 (Daten) steht.  Der Initialwert
4710dieser Annahme ist 0.
4711
4712%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4713
4714\subsubsection{uPD78(C)1x}
4715
4716Diese Prozessoren besitzen ein Register (V), mit dessen Hilfe die
4717,,Zeropage'', d.h. die Lage der mit nur einem Byte adressierbaren
4718Speicherzellen sich in Seitengrenzen im Speicher frei verschieben l"a"st.
4719Da man aber aus Bequemlichkeitsgr"unden nicht mit Ausdr"ucken wie
4720\begin{verbatim}
4721        inrw    Lo(Zaehler)
4722\end{verbatim}
4723arbeiten will, "ubernimmt AS diese Arbeit, allerdings nur unter der
4724Voraussetzung, da"s man ihm "uber einen \tty{ASSUME}-Befehl den
4725Inhalt des V-Registers mitteilt.  Wird ein Befehl mit Kurzadressierung
4726benutzt, so wird "uberpr"uft, ob die obere H"alfte des Adre"sausdrucks
4727mit dem angenommenen Inhalt "ubereinstimmt.  Stimmt sie nicht, so erfolgt
4728eine Warnung.
4729
4730%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4731
4732\subsubsection{78K2}
4733
473478K2 ist eine 8/16-Bit-Architektur, die nachtr"aglich durch Banking auf
4735einen (Daten-)Adre"sraum von einem MByte erweitert wurde.  Das Banking
4736wird mit den Registern PM6 (Normalfall) bzw. P6 (alternativer Fall mit
4737vorangestelltem \verb!&!) realisiert, die die fehlenden oberen vier Bits
4738nachliefern.  Zumindest bei absoluten Adressen kann AS "uberpr"ufen, ob
4739die gerade angesprochene, lineare 20-bittige Adresse innerhalb des
4740gegebenen 64K-Fensters liegt.
4741
4742%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4743
4744\subsubsection{78K3}
4745
4746Prozessoren mit 78K3-Kern besitzen Registerb"anke mit insgesamt 16 Registern,
4747die man "uber ihre Nummern ansprechen kann (\tty{R0} bis \tty{R15}) oder ihre symbolischen
4748Namen (\tty{X=R0, A=R1, C=R2, B=R3, VPL=R8, VPH=R9, UPL=R10, UPH=R11, E=R12,
4749D=R13, L=R14, H=R15}).  Der Prozessorkern besitzt ein Register-Auswahlbit
4750(\tty{RSS}), mit dem man das Mapping von A/X und B/C von R0..R3 auf R4..R7
4751umschaltet.  Dies ist in erste Linie f"ur Befehle wichtig, die implizit eines
4752dieser Register benutzen (d.h. bei denen die Registernummer nicht im Maschinenbefehl
4753kodiert ist).  Man kann dem Assembler aber auch "uber ein
4754
4755\begin{verbatim}
4756  assume rss:1
4757\end{verbatim}
4758
4759mitteilen, da"s die folgenden Befehle mit diesem ge"anderten Mapping arbeiten.  Der
4760Assembler wird f"ur Befehle, in denen die Registernummer explizit kodiert ist, dann
4761auch die alternativen Registernummern einsetzen.  Umgekehrt wird dann z.B. auch
4762\tty{R5} statt \tty{R1} im Quellcode wie \tty{A} behandelt.
4763
4764%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4765
4766\subsubsection{78K4}
4767
476878K4 war als 'Upgrade-Pfad' vom 78K3 konzipiert, deshalb besitzt
4769dessen Prozessorkern auch ein RSS-Bit, mit dem man das Mapping
4770der Register AX und BC umschalten kann (auch wenn NEC von dessen
4771Verwendung in neuem Code abr"at).
4772
4773Neben vielen neuen Befehlen und Adressierungsarten ist die
4774wesentliche Erweiterung der gr"o"sere Adre"raum von 16 MByte, von
4775dem allerdings nur das erste MByte f"ur Programmcode genutzt
4776werden kann.  Das CPU-interne RAM sowie die Special Function
4777Register k"onnen wahlweise am oberen Ende des ersten MByte oder
4778der ersten 64 KByte Seite liegen.  Dies teilt man dem Prozessor
4779durch den \tty{LOCATION}-Befehl mit, der als Argument wahlweise
4780eine 0 oder 15 akzeptiert.  Parallel damit schaltet der Prozessor
4781auch die Adre"sbereiche um, die mit kurzen (8-Bit) Adressen
4782erreicht werden k"onnen.  Parallel dazu mu"s man dem Assembler
4783mittels \tty{ASSUME LOCATION:..} ebenfalls dieser Wert mitgeteilt
4784werden, damit er kurze Adressen in den dazu passenden Bereichen
4785erzeugt.  Der Assembler nimmt f"ur LOCATION einen Default von Null
4786an.
4787
4788%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4789
4790\subsubsection{320C3x/C4x}
4791
4792Da alle Instruktionsworte dieser Prozessorfamilie nur 32 Bit lang
4793sind, und von diesen 32 Bit nur 16 Bit f"ur absolute Adressen vorgesehen
4794wurden, m"ussen die fehlenden oberen 8/16 Bit aus dem DP-Register
4795erg"anzt werden.  Bei Adressierungen kann man aber trotzdem die volle
479624/32-Bit-Adresse angeben, AS pr"uft dann, ob die oberen 8/16 Bit mit dem
4797angenommenen Inhalt von DP "ubereinstimmen.  Gegen"uber dem \tty{LDP}-Befehl
4798weicht \tty{ASSUME} darin ab, da"s man hier nicht eine beliebige Adresse
4799aus der Speicherbank angeben kann, das Herausziehen der oberen Bits
4800mu"s man also ,,zu Fu"s'' machen, z.B. so:
4801\begin{verbatim}
4802        ldp     @adr
4803        assume  dp:adr>>16
4804        .
4805        .
4806        .
4807        ldi     @adr,r2
4808\end{verbatim}
4809
4810%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4811
4812\subsubsection{75K0}
4813
4814Da selbst mit Hilfe von Doppelregistern (8 Bit) nicht der komplette
4815Adre"sraum von 12 Bit zu erreichen ist, mu"ste NEC (wie andere auch...)
4816auf Banking zur"uckgreifen: Die oberen 4 Adre"sbits werden aus dem
4817\tty{MBS}-Register geholt (welchem demzufolge mit \tty{ASSUME} Werte
4818zwischen 0 und 15 zugeordnet werden k"onnen), das aber nur beachtet
4819wird, falls das \tty{MBE}-Flag auf 1 gesetzt wurde.  Steht es (wie
4820die Vorgabe ist) auf 0, so kann man die obersten und untersten 128
4821Nibbles des Adre"sraumes ohne Bankumschaltung erreichen.  Da der 75402
4822weder \tty{MBE}-Flag noch \tty{MBS}-Register kennt, ist f"ur ihn der
4823\tty{ASSUME}-Befehl nicht definiert; Die Initialwerte von \tty{MBE} und
4824\tty{MBS} lassen sich daher nicht "andern.
4825
4826%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4827
4828\subsubsection{F$^2$MC16L}
4829
4830Wie viele andere Mikrokontroller auch, leidet diese Familie etwas unter
4831der Knauserei seiner Entwickler: einem 24 Bit breiten Adre"sraum stehen 16
4832Bit breite Adre"sregister etwas unterbemittelt gegen"uber.  Also mu"sten
4833wieder mal Bank-Register her.  Im einzelnen sind dies PCB f"ur den
4834Programmcode, DTB f"ur alle Datenzugriffe, ADB f"ur indirekte Zugriffe
4835"uber RW2/RW6 und SSB/USB f"ur die Stacks.  Sie k"onnen alle Werte
4836zwischen 0 und 255 annehmen.  Defaultm"a"sig stehen alle Annahmen von AS
4837auf 0, mit Ausnahme von 0ffh f"ur PCB.
4838
4839Des weiteren existiert das DPR-Register, das angibt, welche Seite
4840innerhalb der durch DTB gegebenen 64K-Bank mit 8-Bit-Adressen erreicht
4841werden kann.  Der Default f"ur DPR ist 1, zusammen mit dem Default f"ur
4842DTB ergibt dies also eine Default-Seite bei 0001xxh.
4843
4844%%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4845
4846\subsubsection{MN1613}
4847
4848Beim MN1613 wurde eine Architektur mit 16-Bit-Adressen nachtr"aglich erweitert,
4849Dies wird durch einen Satz vier Bit breiter ,,Segment-Register'' (CSBR, SSBR, TSR0
4850und TSR1) erreicht, deren Wert (um 14 Bit nach links geschoben) zu den 16-Bit-
4851Adressen hinzuaddiert wird.  Ein Proze"s kann auf diese Weise immer ein 64 KWorte
4852gro"ses Fenster im 256 KWorte gro"sen Adre"sraum adressieren.  Der Assembler
4853benutzt die per \tty{ASSUME} mitgeteilten Werte, um zu warnen, wenn eine absolute
4854Adresse innerhalb des 256K-Adre"sraums mit den aktuellen Werten nicht adressierbar
4855ist, und rechnet ansonsten den korrekten 16-bittigen Offset aus.  Bei indirekter
4856Adressierung ist so eine Pr"ufung (naturgem"a"s) nicht m"oglich.
4857
4858%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4859
4860\subsection{CKPT}
4861\ttindex{CKPT}
4862
4863{\em G"ultigkeit: TI990/12}
4864
4865Typ 12-Instruktionen erfordern f"ur ihre Ausf"uhrung ein sogenanntes {\em Checkpoint
4866Register}.  Dieses Register kann entweder explizit als viertes Argument angegeben
4867werden, oder es wird mit dieser Anweisung ein Default f"ur allen folgenden Code
4868festgelegt.  Wenn weder eine \tty{CKPT}-Anweisung noch ein explizites Register
4869angegeben wurde, wird eine Fehlermeldung ausgegeben. Der Default von keinem
4870Default-Register kann wiederhergestellt werden, indem man die \tty{CKPT}-Anweisung
4871mit {\tt NOTHING} als Argument aufruft.
4872
4873%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4874
4875\subsection{EMULATED}
4876\ttindex{EMULATED}
4877
4878{\em G"ultigkeit: 29K}
4879
4880AMD hat die Ausnahmebehandlung f"ur undefinierte Befehle bei der
488129000-Serie so definiert, da"s f"ur jeden einzelnen Befehl ein
4882Exceptionvektor zur Verf"ugung steht.  Dies legt es nahe, durch
4883gezielte Software-Emulationen den Befehlssatz eines kleineren
4884Mitgliedes dieser Familie zu erweitern.  Damit nun aber AS diese
4885zus"atzlichen Befehle nicht als Fehler anmeckert, erlaubt es der
4886\tty{EMULATED}-Befehl, AS mitzuteilen, da"s bestimmte Befehle doch
4887erlaubt sind.  Die Pr"ufung, ob der momentan gesetzte Prozessor
4888diesen Befehl beherrscht, wird dann "ubergangen.  Hat man z.B. f"ur
4889einen Prozessor ohne Gleitkommaeinheit ein Modul geschrieben, das
4890aber nur mit 32-Bit-IEEE-Zahlen umgehen kann, so schreibt man
4891\begin{verbatim}
4892        EMULATED FADD,FSUB,FMUL,FDIV
4893        EMULATED FEQ,FGE,FGT,SQRT,CLASS
4894\end{verbatim}
4895
4896{\tt BRANCHEXT} mit \tty{ON} oder \tty{OFF} als Argument legt fest, ob AS
4897kurze, nur mit einem 8-Bit-Displacement verf"ugbare Spr"unge automatisch
4898,,verl"angern'' soll, indem z.B. aus einem einfachen
4899\begin{verbatim}
4900        bne     target
4901\end{verbatim}
4902automatisch eine l"angere Sequenz mit gleicher Funktion wird, falls das
4903Sprungziel zu weit von momentanen Programmz"ahler entfernt ist.  F"ur
4904{\tt bne} w"are dies z.B. die Sequenz
4905\begin{verbatim}
4906        beq     skip
4907        jmp     target
4908skip:
4909\end{verbatim}
4910Falls f"ur eine Anweisung aber kein passendes ,,Gegenteil'' existiert,
4911kann die Sequenz auch l"anger werden, z.B. f"ur {\tt jbc}:
4912\begin{verbatim}
4913        jbc     dobr
4914        bra     skip
4915dobr:   jmp     target
4916skip:
4917\end{verbatim}
4918Durch dieses Feature gibt es bei Spr"ungen keine eineindeutige Zuordnung
4919von Maschinen- und Assemblercode mehr, und bei Vorw"artsreferenzen handelt
4920man sich m"oglicherweise zus"atzliche Passes ein.  Man sollte dieses
4921Feature daher mit Vorsicht einsetzen!
4922
4923%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4924
4925\subsection{Z80SYNTAX}
4926\ttindex{Z80SYNTAX}
4927
4928{\em G"ultigkeit: 8080/8085}
4929
4930Mit \tty{ON} als Argument kann man (fast) alle 8080-Befehle wahlweise
4931auch in der Form schreiben, wie sie Zilog f"ur den Z80 definiert hat.
4932Zum Beispiel benutzt man einfach nur noch \tty{LD} mit sich selbst
4933erkl"arenden Operanden, wo man in der originalen 8080-Syntax je nach
4934Operanden \tty{MVI, LXI, MOV, STA, LDA, SHLD, LHLD, LDAX, STAX} oder
4935\tty{SPHL} schreiben mu"s.
4936
4937Weil einige Mnemonics in der 8080- und Z80-Syntax unterschiedliche
4938Bedeutung haben, kann man nicht zu 100\% im 'Z80-Stil' programmieren.
4939Alternativ schaltet man mit einem \tty{EXCLUSIVE} als Argument die
4940''8080-Syntax'' ganz ab.  Details zu dieser Betriebsart kann man
4941im Abschnitt \ref{8080Spec} nachlesen.
4942
4943Ein eingebautes Symbol mit gleichem Namen gestattet es, die aktuelle
4944Betriebsart auszulesen.  Es gilt \tty{0=OFF}, \tty{1=ON} und
4945\tty{2=EXCLUSIVE}.
4946
4947%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4948
4949\subsection{EXPECT und ENDEXPECT}
4950\ttindex{EXPECT}
4951\ttindex{ENDEXPECT}
4952
4953Mit diesen beiden Befehlen rahmt man ein St"uck Quellcode ein, in dem ein
4954oder mehrere Fehler {\em erwartet} werden.  Treten die "uber ihre Nummern
4955(siehe Kapitel \ref{ChapErrMess}) identifizierten Fehler oder Warnungen auf, werden
4956sie unterdr"uckt, und die Assemblierung l"auft ohne Fehler durch - nat"urlich
4957ohne an dieser Stelle Code zu erzeugen.  Erwartete, aber nicht aufgetretene
4958Fehler oder Warnungen l"osen ihrerseits jedoch eine Fehlermeldung von
4959\tty{ENDEXPECT} aus.  Der Haupt-Anwendungszweck dieser Befehle findet sich
4960in den Selbst-Tests im tests/-Unterverzeichnis.  Z.B. kann man so testen,
4961ob Wertebereiche korrekt gepr"uft werden:
4962\begin{verbatim}
4963       cpu      68000
4964       expect   1320     ; immediate-Shift nur 1..8
4965       lsl.l    #10,d0
4966       endexpect
4967\end{verbatim}
4968
4969%%---------------------------------------------------------------------------
4970
4971\section{Datendefinitionen}
4972
4973Die hier beschriebenen Befehle "uberschneiden sich teilweise in ihrer
4974Funktionalit"at, jedoch definiert jede Prozessorfamilie andere Namen
4975f"ur die gleiche Funktion.  Um mit den Standardassemblern konform zu
4976bleiben, wurde diese Form der Implementierung gew"ahlt.
4977
4978Sofern nicht ausdr"ucklich anders erw"ahnt, kann bei allen Befehlen zur
4979Datenablage (nicht bei denen zur Speicherreservierung!) eine beliebige Zahl
4980von Parametern angegeben werden, die der Reihe nach abgearbeitet werden.
4981
4982%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4983
4984\subsection{DC[.size]}
4985\ttindex{DC}
4986
4987{\em G"ultigkeit: 680x0, M*Core, 68xx, H8, SH7000, DSP56xxx, XA, ST7/STM8, MN161x}
4988
4989Dieser Befehl legt eine oder mehrere Konstanten des beim durch
4990das Attribut bestimmten Typs im Speicher ab.  Die Attribute entsprechen
4991den in Abschnitt \ref{AttrTypes} definierten, zus"atzlich ist f"ur
4992Byte-Konstanten die M"oglichkeit vorhanden, Stringausdr"ucke im Speicher
4993abzulegen, wie z.B.
4994\begin{verbatim}
4995String  dc.b    "Hello world!\0"
4996\end{verbatim}
4997Die Parameterzahl darf zwischen 1 und 20 liegen, zus"atzlich darf jedem
4998Parameter ein in eckigen Klammern eingeschlossener Wiederholungsfaktor
4999vorausgehen, z.B. kann man mit
5000\begin{verbatim}
5001        dc.b    [(*+255)&$ffffff00-*]0
5002\end{verbatim}
5003den Bereich bis zur n"achsten Seitengrenze mit Nullen f"ullen.
5004\bb{Vorsicht!}
5005Mit dieser Funktion kann man sehr leicht die Grenze von 1 Kbyte erzeugten
5006Codes pro Zeile Quellcode "uberschreiten!
5007\par
5008Sollte die Byte-Summe ungerade sein, so kann vom Assembler automatisch
5009ein weiteres Byte angef"ugt werden, um die Wortausrichtung von Daten zu
5010erhalten.  Dieses Verhalten kann mit dem \tty{PADDING}-Befehl ein-
5011und ausgeschaltet werden.
5012\par
5013Mit diesem Befehl abgelegte Dezimalgleitkommazahlen (\tty{DC.P} ...) k"onnen
5014zwar den ganzen Bereich der extended precision "uberstreichen, zu beachten
5015ist dabei allerdings, da"s die von Motorola verf"ugbaren Koprozessoren
501668881/68882 beim Einlesen solcher Konstanten die Tausenderstelle des
5017Exponenten ignorieren!
5018\par
5019Default-Attribut ist \tty{W}, also 16-Bit-Integerzahlen.
5020\par
5021Beim DSP56xxx ist der Datentyp auf Integerzahlen festgelegt (ein
5022Attribut ist deshalb weder n"otig noch erlaubt), die im Bereich
5023-8M..16M-1 liegen d"urfen.   Stringkonstanten sind ebenfalls erlaubt,
5024wobei jeweils drei Zeichen in ein Wort gepackt werden.
5025\par
5026Es ist im Gegensatz zum Original Motorola-Assembler auch erlaubt, mit
5027diesem Kommando Speicher zu reservieren, indem man als Argument ein
5028Fragezeichen angibt.  Diese Erweiterung haben wohl einige Drittanbieter
5029von 68K-Assemblern eingebaut, in Anlehnung an das, was Intel-Assembler
5030machen.  Wer dies benutzt, sollte sich aber im klaren sein, da"s dies
5031zu Problemen beim Portieren von Code auf andere Assembler f"uhren kann.
5032Des weiteren d"urfen Fragenzeichen als Operanden nicht mit 'normalen'
5033Konstanten in einer Anweisung gemischt werden.
5034
5035%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5036
5037\subsection{DS[.size]}
5038\ttindex{DS}
5039
5040{\em G"ultigkeit: 680x0, M*Core, 68xx, H8, SH7x00, DSP56xxx, XA, ST7/STM8, MN161x}
5041
5042Mit diesem Befehl l"a"st sich zum einen Speicherplatz f"ur die angegebene
5043Zahl im Attribut beschriebener Zahlen reservieren.  So reserviert
5044\begin{verbatim}
5045        DS.B    20
5046\end{verbatim}
5047z.B. 20 Bytes Speicher,
5048\begin{verbatim}
5049        DS.X    20
5050\end{verbatim}
5051aber 240 Byte !
5052\par
5053Die andere Bedeutung ist die Ausrichtung des Programmz"ahlers, die
5054mit der Wertangabe 0 erreicht wird.  So wird mit
5055\begin{verbatim}
5056        DS.W    0
5057\end{verbatim}
5058der Programmz"ahler auf die n"achste gerade Adresse aufgerundet, mit
5059\begin{verbatim}
5060        DS.D    0
5061\end{verbatim}
5062dagegen auf die n"achste Langwortgrenze.  Eventuell dabei freibleibende
5063Speicherzellen sind nicht etwa mit Nullen oder NOPs gef"ullt,
5064sondern undefiniert.
5065\par
5066Vorgabe f"ur die Operandengr"o"se ist --- wie "ublich --- W, also 16 Bit.
5067\par
5068Beim 56xxx ist die Operandengr"o"se auf Worte (a 24 Bit) festgelegt,
5069Attribute gibt es deswegen wie bei \tty{DC} auch hier nicht.
5070
5071%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5072
5073\subsection{DN,DB,DW,DD,DQ \& DT}
5074\ttindex{DN}\ttindex{DB}\ttindex{DW}\ttindex{DD}\ttindex{DQ}\ttindex{DT}
5075
5076{\em\begin{tabbing}
5077G"ultigkeit: \= Intel (au"ser 4004/4040), Zilog, Toshiba, NEC, TMS370,\\
5078             \> Siemens, AMD, M16(C), MELPS7700/65816, National, ST9,\\
5079             \> Atmel, TMS7000, TMS1000, $\mu$PD77230, Signetics,\\
5080             \> Fairchild, Intersil,\\
5081             \> XS1
5082\end{tabbing}}
5083
5084Diese Befehle stellen sozusagen das Intel-Gegenst"uck zu \tty{DS}
5085und \tty{DC} dar, und wie nicht anders zu erwarten, ist die Logik
5086etwas anders:
5087\par
5088Zum einen wird die Kennung der Operandengr"o"se in das Mnemonic
5089verlegt:
5090\begin{itemize}
5091\item{\tty{DN}: 4-Bit-Integer}
5092\item{\tty{DB}: Byte oder ASCII-String wie bei \tty{DC.B}}
5093\item{\tty{DW}: 16-Bit-Integer oder half precision}
5094\item{\tty{DD}: 32-Bit-Integer oder single precision}
5095\item{\tty{DQ}: double precision (64 Bit)}
5096\item{\tty{DT}: extended precision (80 Bit)}
5097\end{itemize}
5098Zum anderen erfolgt die Unterscheidung, ob Konstantendefinition oder
5099Speicherreservierung, im Operanden.  Eine Reservierung von Speicher
5100wird durch ein \tty{?} gekennzeichnet:
5101\begin{verbatim}
5102        db  ?   ; reserviert ein Byte
5103        dw  ?,? ; reserviert Speicher fuer 2 Worte (=4 Byte)
5104        dd  -1  ; legt die Konstante -1 (FFFFFFFFH) ab !
5105\end{verbatim}
5106Speicherreservierung und Konstantendefinition d"urfen \bb{nicht in einer
5107Anweisung} gemischt werden:
5108\begin{verbatim}
5109        db  "Hallo",?  ; -->Fehlermeldung
5110\end{verbatim}
5111\ttindex{DUP}
5112Zus"atzlich ist noch der \tty{DUP}-Operator erlaubt, der die mehrfache Ablage
5113von Konstantenfolgen oder die Reservierung ganzer Speicherbl"ocke erlaubt:
5114\begin{verbatim}
5115        db  3 dup (1,2) ; --> 1 2 1 2 1 2
5116        dw  20 dup (?)  ; reserviert 40 Byte Speicher.
5117\end{verbatim}
5118Wie man sehen kann, mu"s das \tty{DUP}-Argument geklammert werden, darf daf"ur
5119aber auch wieder aus mehreren Teilen bestehen, die selber auch wieder
5120\tty{DUP}s sein k"onnen...das ganze funktioniert also rekursiv.
5121\par
5122\tty{DUP} ist aber auch eine Stelle, an der man mit einer anderen Grenze des
5123Assemblers in Ber"uhrung kommen kann: maximal k"onnen 1024 Byte Code
5124oder Daten in einer Zeile erzeugt werden.  Dies bezieht sich \bb{nicht}
5125auf die Reservierung von Speicher, nur auf die Definition von
5126Konstantenfeldern!
5127\par
5128\ttindex{DEFB}\ttindex{DEFW}
5129Um mit dem M80 vertr"aglich zu sein, darf im Z80-Modus anstelle von
5130\tty{DB}/\tty{DW} auch \tty{DEFB}/\tty{DEFW} geschrieben werden.
5131\par
5132\ttindex{BYTE}\ttindex{WORD}\ttindex{ADDR}\ttindex{ADDRW}
5133Analog stellen \tty{BYTE/ADDR} bzw. \tty{WORD/ADDRW} beim COP4/8 einen
5134Alias f"ur \tty{DB} bzw. \tty{DW} dar, wobei die beiden Paare sich
5135jedoch in der Byte-Order unterscheiden: Die Befehle, die von National
5136zur Adre"sablage vorgesehen waren, benutzen Big-Endian, \tty{BYTE} bzw.
5137\tty{WORD} jedoch Little-Endian.
5138
5139Wird \tty{DB} in einem Adre"sraum angewendet, der nicht byte-adressierbar
5140ist (z.B. das \tty{CODE}-Segment des Atmel AVR), so werden immer zwei Bytes
5141in ein 16-Bit-Wort gepackt, entsprechende der durch die Architektur gegebenen
5142Endinaness - das untere Byte wird bei Little-Endian also zuerst gef"ullt.  Ist
5143die Gesamtmenge aller Bytes ungerade, so bleibt die andere Worth"alfte ungenutzt
5144und ist quasi ''Padding''.  Sie wird auch nicht genutzt, falls im Quellcode
5145eine weitere \tty{DB}-Anweisung unmittelbar folge sollte.  Sinngem"a"s gilt
5146das gleiche f"ur \tty{DN}, nur werden hier zwei oder vier Nibbles in ein Byte
5147oder 16-Bit-Wort gepackt.
5148
5149Der NEC 77230 nimmt mit seiner \tty{DW}-Anweisung eine Sonderstellung ein:
5150Sie funktioniert eher wie \tty{DATA} bei seinen kleineren Br"udern,
5151akzeptiert aber neben String- und Integerargumenten auch Gleitkommawerte
5152(und legt sie prozessorspezifischen 32-Bit-Format ab). \tty{DUP} gibt es {\em
5153nicht}!
5154
5155%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5156
5157\subsection{DS, DS8}
5158\ttindex{DS}
5159\ttindex{DS8}
5160
5161{\em\begin{tabbing}
5162G"ultigkeit: \= Intel, Zilog, Toshiba, NEC, TMS370, Siemens, AMD, M16(C),\\
5163             \> National, ST9, TMS7000, TMS1000, Intersil
5164\end{tabbing}}
5165
5166Dieser Befehl stellt eine Kurzschreibweise dar, um Speicherbereiche
5167zu reservieren:
5168\begin{quote}{\tt
5169        DS       $<Anzahl>$
5170}\end{quote}
5171ist eine Kurzschreibweise f"ur
5172\begin{quote}{\tt
5173        DB       $<Anzahl>$ DUP (?)
5174}\end{quote}
5175dar, lie"se sich also prinzipiell auch einfach "uber ein Makro realisieren,
5176nur scheint dieser Befehl in den K"opfen einiger mit Motorola-CPUs gro"s
5177gewordener Leute (gell, Michael?) so fest verdrahtet zu sein, da"s sie
5178ihn als eingebauten Befehl erwarten...hoffentlich sind selbige jetzt
5179zufrieden {\tt ;-)}
5180
5181{\tt DS8} ist beim National SC14xxx als Alias f"ur {\tt DS} definiert.
5182Achten Sie aber darauf, da"s der Speicher dieser Prozessoren in Worten zu
518316 Bit organisiert ist, d.h. es ist unm"oglich, einzelne Bytes zu
5184reservieren.  Falls das Argument von {\tt DS} ungerade ist, wird es auf
5185die n"achstgr"o"sere gerade Zahl aufgerundet.
5186
5187%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5188
5189\subsection{BYT oder FCB}
5190\ttindex{BYT}\ttindex{FCB}
5191
5192{\em G"ultigkeit: 6502, 68xx}
5193
5194Mit diesem Befehl werden im 65xx/68xx-Modus Byte-Konstanten oder
5195ASCII-Strings abgelegt, er entspricht also \tty{DC.B} beim 68000 oder
5196\tty{DB} bei Intel.  Ein Wiederholungsfaktor darf analog zu \tty{DC}
5197jedem einzelnen Parameter in eckigen Klammern vorangestellt werden.
5198
5199%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5200
5201\subsection{BYTE}
5202\ttindex{BYTE}
5203
5204{\em G"ultigkeit: ST6, 320C2(0)x, 320C5x, MSP, TMS9900}
5205
5206Dito.  Ein im 320C2(0)x/5x-Modus vor dem Befehl stehendes Label wird
5207als untypisiert gespeichert, d.h. keinem Adre"sraum zugeordnet.
5208Der Sinn dieses Verhaltens wird bei den prozessorspezifischen
5209Hinweisen erl"autert.
5210
5211Ob beim MSP bzw. TMS9900 ungerade Mengen von Bytes automatisch um
5212ein Null-Byte erg"anzt werden sollen, kann mit dem PADDING-Befehl
5213eingestellt werden.
5214
5215%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5216
5217\subsection{DC8}
5218\ttindex{DC8}
5219
5220{\em G"ultigkeit: SC144xx}
5221
5222Dieser Befehl ist ein Alias f"ur {\tt DB}, d.h. mit ihm k"onnen
5223Byte-Konstanten oder Strings im Speicher abgelegt werden.
5224
5225%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5226
5227\subsection{ADR oder FDB}
5228\ttindex{ADR}\ttindex{FDB}
5229
5230{\em G"ultigkeit: 6502, 68xx}
5231
5232Mit diesem Befehl werden im 65xx/68xx-Modus Wortkonstanten
5233abgelegt, er entspricht also \tty{DC.W} beim 68000 oder \tty{DW}
5234bei Intel.  Ein Wiederholungsfaktor darf analog zu \tty{DC} jedem
5235einzelnen Parameter in eckigen Klammern vorangestellt werden.
5236
5237%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5238
5239\subsection{WORD}
5240\ttindex{WORD}
5241
5242{\em G"ultigkeit: ST6, i960, 320C2(0)x, 320C3x/C4x/C5x, MSP}
5243
5244F"ur den 320C3x/C4x und i960 werden hiermit 32-Bit-Worte abgelegt, f"ur die
5245alle anderen Familien 16-Bit-Worte.  Ein im 320C2(0)x/5x-Modus vor dem Befehl
5246stehendes Label wird als untypisiert gespeichert, d.h. keinem Adre"sraum
5247zugeordnet.  Der Sinn dieses Verhaltens wird bei den prozessorspezifischen
5248Hinweisen erl"autert.
5249
5250%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5251
5252\subsection{DW16}
5253\ttindex{DW16}
5254
5255{\em G"ultigkeit: SC144xx}
5256
5257Diser Befehl ist beim SC144xx der Weg, Konstanten mit Wortl"ange (16 Bit)
5258im Speicher abzulegen und damit ein ALIAS f"ur DW.
5259
5260%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5261
5262\subsection{LONG}
5263\ttindex{LONG}
5264
5265{\em G"ultigkeit: 320C2(0)x, 320C5x}
5266
5267Hiermit werden 32-Bit-Integer im Speicher abgelegt, und zwar in
5268der Reihenfolge LoWord-HiWord.  Ein eventuell vor dem Befehl
5269stehendes Label wird dabei wieder als untypisiert abgelegt
5270(der Sinn dieser Ma"snahme ist in den prozessorspezifischen
5271Hinweisen erl"autert).
5272
5273%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5274
5275\subsection{SINGLE, DOUBLE und EXTENDED}
5276\ttindex{SINGLE}\ttindex{DOUBLE}\ttindex{EXTENDED}
5277
5278{\em G"ultigkeit: 320C3x/C4x (nicht {\tt DOUBLE}), 320C6x (nicht {\tt
5279   EXTENDED})}
5280
5281Mit diesen Befehlen werden Gleitkomma-Konstanten im Speicher abgelegt,
5282jedoch beim 320C3x/C4x nicht im IEEE-Format, sondern in den vom Prozessor
5283verwendeten 32- und 40-Bit-Formaten.  Da 40 Bit nicht mehr in eine
5284Speicherzelle hineinpassen, werden im Falle von \tty{EXTENDED} immer derer
52852 pro Wert belegt.  Im ersten Wort finden sich die oberen 8 Bit (der
5286Exponent), der Rest (Vorzeichen und Mantisse) in zweiten Wort.
5287
5288%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5289
5290\subsection{FLOAT und DOUBLE}
5291\ttindex{FLOAT}\ttindex{DOUBLE}
5292
5293{\em G"ultigkeit: 320C2(0)x, 320C5x}
5294
5295Mit diesen Befehlen k"onnen 32- bzw. 64-Bit-Gleitkommazahlen
5296im IEEE-Format im Speicher abgelegt werden.  Dabei wird das
5297niederwertigste Byte jeweils auf der ersten Speicherstelle
5298abgelegt.  Ein eventuell vor dem Befehl stehendes Label wird
5299wieder als untypisiert gespeichert (der Sinn dieser Ma"snahme
5300ist in den prozessorspezifischen Hinweisen erl"autert).
5301
5302%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5303
5304\subsection{SINGLE und DOUBLE}
5305\ttindex{SINGLE}\ttindex{DOUBLE}
5306
5307{\em G"ultigkeit: TMS99xxx}
5308
5309Mit diesen Befehlen k"onnen 32- bzw. 64-Bit-Gleitkommazahlen
5310im prozessoreigenen Format im Speicher abgelegt werden.  Das
5311Format entspricht dem IBM/360-Gleitkommaformat.
5312
5313%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5314
5315\subsection{EFLOAT, BFLOAT, TFLOAT}
5316\ttindex{EFLOAT}\ttindex{BFLOAT}\ttindex{TFLOAT}
5317
5318{\em G"ultigkeit: 320C2(0)x, 320C5x}
5319
5320Auch diese Befehle legen Gleitkommazahlen im Speicher ab,
5321jedoch in einem nicht-IEEE-Format, das evtl. leichter von
5322Signalprozessoren zu verarbeiten ist:
5323\begin{itemize}
5324\item{\tty{EFLOAT}: Mantisse mit 16 Bit, Exponent mit 16 Bit}
5325\item{\tty{BFLOAT}: Mantisse mit 32 Bit, Exponent mit 16 Bit}
5326\item{\tty{DFLOAT}: Mantisse mit 64 Bit, Exponent mit 32 Bit}
5327\end{itemize}
5328Gemeinsam ist den Befehlen, da"s die Mantisse vor dem
5329Exponenten abgelegt wird (Lo-Word jeweils zuerst) und
5330beide im Zweierkomplement dargestellt werden.  Ein eventuell
5331vor dem Befehl stehendes Label wird wieder als untypisiert
5332gespeichert (der Sinn dieser Ma"snahme ist in den
5333prozessorspezifischen Hinweisen erl"autert).
5334
5335%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5336
5337\subsection{Qxx und LQxx}
5338\ttindex{Qxx}\ttindex{LQxx}
5339
5340{\em G"ultigkeit: 320C2(0)x, 320C5x}
5341
5342Mit diesen Befehlen k"onnen Gleitkommazahlen in einem Festkommaformat
5343abgelegt werden.  \tty{xx} ist dabei eine zweistellige Zahl, mit deren
5344Zweierpotenz der Gleitkommawert vor der Umwandlung in eine ganze Zahl
5345multipliziert werden soll.  Er bestimmt also praktisch, wieviele Bits
5346f"ur die Nachkommastellen reserviert werden sollen.  W"ahrend aber
5347\tty{Qxx} nur ein Wort (16 Bit) ablegt, wird das Ergebnis bei \tty{LQxx}
5348in 2 Worten (LoWord zuerst) abgelegt.  Das sieht dann z.B. so
5349aus:
5350\begin{verbatim}
5351        q05     2.5      ; --> 0050h
5352        lq20    ConstPI  ; --> 43F7h 0032h
5353\end{verbatim}
5354Mich m"oge niemand steinigen, wenn ich mich auf meinem HP28
5355verrechnet haben sollte...
5356
5357%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5358
5359\subsection{DATA}
5360\ttindex{DATA}
5361
5362{\em G"ultigkeit: PIC, 320xx, AVR, MELPS-4500, H8/500, \\
5363     HMCS400, 4004/4040, $\mu$PD772x, OLMS-40/50}
5364
5365Mit diesem Befehl werden Daten im aktuellen Segment abgelegt,
5366wobei sowohl Integer- als auch Stringwerte zul"assig sind.  Bei
5367Strings belegt beim 16C5x/16C8x, 17C4x im Datensegment, beim
53684500er, 4004 und HMCS400 im Code-Segement ein Zeichen ein Wort,
5369bei AVR, 17C4x im Codesegment, $\mu$PD772x in den Datensegmenten
5370und 3201x/3202x passen zwei Zeichen in ein Wort (LSB zuerst),
5371beim $\mu$PD7725 drei und beim 320C3x/C4x sogar derer 4 (MSB
5372zuerst).  Im Gegensatz dazu mu"s im Datensegment des 4500 bzw.
5373ein Zeichen auf zwei Speicherstellen verteilt werden, ebenso wie
5374beim 4004 und HMCS400.  Der Wertebereich f"ur Integers entspricht
5375der Wortbreite des jeweiligen Prozessors im jeweiligen Segment.
5376Das bedeutet, da"s \tty{DATA} beim 320C3x/C4x die Funktion von
5377\tty{WORD} mit einschlie"st (die von \tty{SINGLE} "ubrigens auch,
5378wenn AS das Argument als Gleitkommazahl erkennt).
5379
5380%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5381
5382\subsection{ZERO}
5383\ttindex{ZERO}
5384
5385{\em G"ultigkeit: PIC}
5386
5387Dieser Befehl legt einen durch den Parameter spezifizierte
5388Zahl von Nullworten (=NOPs) im Speicher ab.
5389
5390%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5391
5392\subsection{FB und FW}
5393\ttindex{FB}\ttindex{FW}
5394
5395{\em G"ultigkeit: COP4/8}
5396
5397Mit diesen Befehlen kann ein gr"o"serer Block von Speicher (dessen L"ange
5398in Bytes bzw. Worten der erste Parameter angibt) mit einer Byte- bzw.
5399Wortkonstanten gef"ullt werden, die durch den zweiten Parameter angegeben
5400wird.
5401
5402%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5403
5404\subsection{ASCII und ASCIZ}
5405\ttindex{ASCII}\ttindex{ASCIZ}
5406
5407{\em G"ultigkeit: ST6}
5408
5409Mit diesen beiden Befehlen k"onnen Stringkonstanten im Speicher
5410abgelegt werden.  W"ahrend ASCII nur die reinen Daten im Speicher
5411ablegt, versieht \tty{ASCIZ} automatisch \ii{jeden} angegebenen String
5412mit einem NUL-Zeichen am Ende.
5413
5414%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5415
5416\subsection{STRING und RSTRING}
5417\ttindex{STRING}\ttindex{RSTRING}
5418
5419{\em G"ultigkeit: 320C2(0)x, 320C5x}
5420
5421Diese Anweisungen funktionieren analog zu {\tt DATA}, jedoch werden
5422hier Integer-Ausdr"ucke grunds"atzlich als {\it Bytes} mit einem
5423entsprechend eingeschr"ankten Wertebereich betrachtet, wodurch es
5424m"ogliich wird, die Zahlen zusammen mit anderen Zahlen oder Zeichen
5425paarweise in Worte zu verpacken.
5426Die beiden Befehle unterscheiden sich lediglich in der Reihenfolge
5427der Bytes in einem Wort: Bei {\tt STRING} wird zuerst das
5428obere und danach das untere gef"ullt, bei {\tt RSTRING} ist es
5429genau umgekehrt.
5430
5431Ein eventuell vor dem Befehl stehendes Label wird wieder als
5432untypisiert gespeichert.  Der Sinn dieser Ma"snahme ist im
5433entsprechenden Kapitel mit den prozessorspezifischen Befehlen
5434erl"autert.
5435
5436%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5437
5438\subsection{FCC}
5439\ttindex{FCC}
5440
5441{\em G"ultigkeit: 6502, 68xx}
5442
5443Mit diesem Befehl werden im 65xx/68xx-Modus String-Konstanten abgelegt.
5444Beachten Sie jedoch, da"s im Gegensatz zum Originalassembler
5445AS11 von Motorola (dessentwegen dieser Befehl existiert, bei AS ist
5446diese Funktion im \tty{BYT}-Befehl enthalten), String-Argumente nur in
5447G"ansef"u"schen und nicht in Hochkommas oder Schr"agstrichen eingeschlossen
5448werden d"urfen!  Ein Wiederholungsfaktor darf analog zu \tty{DC} jedem
5449einzelnen Parameter in eckigen Klammern vorangestellt werden.
5450
5451%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5452
5453\subsection{DFS oder RMB}
5454\ttindex{DFS}\ttindex{RMB}
5455
5456{\em G"ultigkeit: 6502, 68xx}
5457
5458Dieser Befehl dient im 65xx/68xx-Modus zur Reservierung von
5459Speicher, er entspricht \tty{DS.B} beim 68000 oder \tty{DB ?}
5460bei Intel.
5461
5462%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5463
5464\subsection{BLOCK}
5465\ttindex{BLOCK}
5466
5467{\em G"ultigkeit: ST6}
5468
5469Dito.
5470
5471%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5472
5473\subsection{SPACE}
5474\ttindex{SPACE}
5475
5476{\em G"ultigkeit: i960}
5477
5478Dito.
5479
5480%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5481
5482\subsection{RES}
5483\ttindex{RES}
5484
5485{\em G"ultigkeit: PIC, MELPS-4500, HMCS400, 3201x, 320C2(0)x,\\
5486     320C5x, AVR, $\mu$PD772x, OLMS-40/50}
5487
5488Dieser Befehl dient zur Reservierung von Speicher.  Er reserviert
5489im Codesegment immer W"orter (10/12/14/16 Bit), im Datensegment bei
5490den PICs Bytes, beim 4500er und OLMS-40/50 Nibbles sowie bei Texas ebenfalls
5491W"orter.
5492
5493%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5494
5495\subsection{BSS}
5496\ttindex{BSS}
5497
5498{\em G"ultigkeit: 320C2(0)x, 320C3x/C4x/C5x/C6x, MSP}
5499
5500\tty{BSS} arbeitet analog zu \tty{RES}, lediglich ein eventuell vor dem
5501Befehl stehendes Symbol wird beim 320C2(0)x/5x als untypisiert gespeichert.
5502Der Sinn dieser Ma"snahme kann im Kapitel mit den prozessorspezifischen
5503Hinweisen nachgelesen werden.
5504
5505%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5506
5507\subsection{DSB und DSW}
5508\ttindex{DSB}\ttindex{DSW}
5509
5510{\em G"ultigkeit: COP4/8}
5511
5512Diese beiden Befehle stellen im COP4/8-Modus die zum ASMCOP von National
5513kompatible Methode dar, Speicher zu reservieren.  W"ahrend \tty{DSB} nur
5514einzelne Bytes freih"alt, reserviert \tty{DSW} W"orter und damit effektiv
5515doppelt soviel Bytes wie \tty{DSB}.
5516
5517%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5518
5519\subsection{DS16}
5520\ttindex{DS16}
5521
5522{\em G"ultigkeit: SC144xx}
5523
5524Dieser Befehl reserviert Speicher in Schritten von vollst"andigen Worten,
5525d.h. 16 Bit.  Er stellt einen Alias zu {\tt DW} dar.
5526
5527%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5528
5529\subsection{ALIGN}
5530\ttindex{ALIGN}
5531
5532{\em G"ultigkeit: alle Prozessoren}
5533
5534\tty{ALIGN} mit einem Integerausdruck als Argument erlaubt es, den
5535Programmz"ahler auf eine bestimmte Adresse auszurichten.  Die
5536Ausrichtung erfolgt dergestalt, da"s der Programmz"ahler so weit
5537erh"oht wird, da"s er ein ganzzahliges mehrfaches des Argumentes
5538wird.  In seiner Funktion entspricht \tty{ALIGN} also \tty{DS.x 0}
5539beim den 680x0ern, nur ist die Ausrichtung noch flexibler.
5540\par
5541Beispiel:
5542\begin{verbatim}
5543        align 2
5544\end{verbatim}
5545macht den Programmz"ahler gerade.  Wird \tty{ALIGN} in dieser Form mit nur
5546einem Argument verwendet, ist der Inhalt des dadurch frei bleibenden
5547Speicherbereichs nicht definiert.  Alternativ kann als zweites Argument ein
5548(Byte-)Wert angegeben werden, mit dem dieser Bereich gef"ullt wird.
5549
5550%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5551
5552\subsection{LTORG}
5553\ttindex{LTORG}
5554
5555{\em G"ultigkeit: SH7x00}
5556
5557Da der SH7000-Prozessor seine Register immediate nur mit 8-Bit-Werten
5558laden kann, AS dem Programmierer jedoch vorgaukelt, da"s es eine solche
5559Einschr"ankung nicht g"abe, mu"s er die dabei entstehenden Konstanten
5560irgendwo im Speicher ablegen.  Da es nicht sinnvoll w"are, dies einzeln
5561zu tun (wobei jedes Mal Sprungbefehle anfallen w"urden...), werden die
5562Literale gesammelt und k"onnen vom Programmierer mit diesem Befehl
5563gezielt blockweise (z.B. am Ende eines Unterprogrammes) abgelegt werden.
5564Zu den zu beachtenden Details und Fallen sei auf das Kapitel mit den
5565SH7000-spezifischen Dingen hingewiesen.
5566
5567%%---------------------------------------------------------------------------
5568
5569\section{Makrobefehle}
5570
5571{\em G"ultigkeit: alle Prozessoren}
5572
5573Kommen wir nun zu dem, was einen Makroassembler vom normalen Assembler
5574unterscheidet: der M"oglichkeit, Makros zu definieren (ach was ?!).
5575\par
5576Unter Makros verstehe ich hier erst einmal eine Menge von Anweisungen
5577(normal oder Pseudo), die mit bestimmten Befehlen zu einem Block
5578zusammengefa"st werden und dann auf bestimmte Weise bearbeitet
5579werden k"onnen.  Zur Bearbeitung solcher Bl"ocke kennt der Assembler
5580folgende Befehle:
5581
5582%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5583
5584\subsection{MACRO}
5585\ttindex{MACRO}\ttindex{ENDM}
5586\label{SectMacros}
5587
5588ist der wohl wichtigste Befehl zur Makroprogrammierung.  Mit der
5589Befehlsfolge
5590\begin{verbatim}
5591<Name>  MACRO   [Parameterliste]
5592        <Befehle>
5593        ENDM
5594\end{verbatim}
5595wird das Makro \tty{$<$Name:  $>$} als die eingeschlossene Befehlsfolge
5596definiert. Diese Definition alleine erzeugt noch keinen Code!  Daf"ur kann
5597fortan die Befehlsfolge einfach durch den Namen abgerufen werden, das Ganze
5598stellt also eine Schreiberleichterung dar.  Um die ganze Sache etwas
5599n"utzlicher zu machen, kann man der Makrodefinition eine Parameterliste
5600mitgeben.  Die Parameternamen werden wie "ublich durch Kommas getrennt
5601und m"ussen --- wie der Makroname selber --- den Konventionen f"ur
5602Symbolnamen (\ref{SectSymConv}) gen"ugen.
5603\par
5604Sowohl Makronamen als auch -parameter sind von einer Umschaltung
5605von AS in den case-sensitiven Modus betroffen.
5606\par
5607Makros sind "ahnlich wie Symbole lokal, d.h. bei Definition in
5608einer Sektion sind sie nur in dieser Sektion und ihren Untersektionen
5609bekannt.  Dieses Verhalten l"a"st sich aber durch die weiter unten
5610beschriebenen Optionen \tty{PUBLIC} und \tty{GLOBAL} in weiten Grenzen
5611steuern.
5612\par
5613F"ur jeden Makroparameter kann ein Defaultwert mit angeh"angtem
5614Gleichheitszeichen angegeben werden.  Dieser Wert wird f"ur den
5615Parameter eingesetzt, wenn beim Makroaufruf kein Argument f"ur
5616diesen Parameter angegeben wird, bzw. wenn ein Positionsargument
5617(s.u.) f"ur diesen Parameter leer ist.
5618\par
5619Neben den eigentlichen Makroparametern k"onnen in der Parameterliste
5620auch Steuerparameter enthalten sein, die die Abarbeitung des betroffenen
5621Makros beeinflussen; diese Parameter werden von normalen Parametern
5622dadurch unterschieden, da"s sie in geschweifte Klammern eingeschlossen
5623sind.  Es sind folgende Steuerparameter definiert:
5624\begin{itemize}
5625\item{\tty{EXPAND/NOEXPAND} : legen fest, ob bei der sp"ateren
5626      Verwendung diese Makros der expandierte Code mit angezeigt
5627      werden soll.  Default ist der durch den Pseudobefehl
5628      \tty{MACEXP\_DFT} festgelegte Wert.}
5629\item{\tty{EXPIF/NOEXPIF} : legen fest, ob bei der sp"ateren
5630      Verwendung diese Makros Befehle zur bedingten Assemblierung
5631      und dadurch ausgeschlossener Code angezeigt werden soll.  Default
5632      ist der durch den Pseudobefehl \tty{MACEXP\_DFT} festgelegte Wert.}
5633\item{\tty{EXPMACRO/NOEXPMACRO} : legen fest, ob bei der sp"ateren
5634      Verwendung diese Makros darin definierte Makros angezeigt werden
5635      sollen.  Default ist der durch den Pseudobefehl
5636      \tty{MACEXP\_DFT} festgelegte Wert.}
5637\item{\tty{EXPREST/NOEXPREST} : legen fest, ob bei der sp"ateren
5638      Verwendung Code-Zeilen angezeigt werden sollen, die weder
5639      Makro-Definitionen, bedingte Assemblierung noch durch bedingte
5640      Assemblierung ausgeschlossene Zeilen sind. Default ist der durch den
5641      Pseudobefehl \tty{MACEXP\_DFT} festgelegte Wert.}
5642\item{\tty{PUBLIC[:Sektionsname]} : ordnet das Makro nicht der
5643      aktuellen, sondern einer ihr "ubergeordneten Sektion zu.
5644      Auf diese Weise kann eine Sektion Makros f"ur die ,,Au"senwelt''
5645      zur Verf"ugung stellen.  Fehlt eine Sektionsangabe, so wird das
5646      Makro v"ollig global, d.h. ist "uberall benutzbar.}
5647\item{\tty{GLOBAL[:Sektionsname]} : legt fest, da"s neben diesem
5648      Makro noch ein weiteres Makro abgelegt werden soll, das zwar
5649      den gleichen Inhalt hat, dessen Name aber zus"atzlich mit dem
5650      Namen der Sektion versehen ist, in der es definiert wurde und
5651      das der spezifizierten Sektion zugeordnet werden soll.  Bei
5652      dieser mu"s es sich um eine Obersektion zu der aktuellen Sektion
5653      handeln; fehlt die Angabe, so wird das zus"atzliche Makro
5654      global sichtbar.  Wird z.B. ein Makro \tty{A} in der Sektion \tty{B}
5655      definiert, die wiederum eine Untersektion der Sektion \tty{C} ist,
5656      so w"urde neben z.B. dem Makro A ein weiteres globales mit dem
5657      Namen \tty{C\_B\_A} erzeugt.  W"urde dagegen \tty{C} als Zielsektion
5658      angegeben, so w"urde das Makro \tty{B\_A} hei"sen und der Sektion
5659      \tty{C} zugeordnet.  Diese Option ist defaultm"a"sig ausgeschaltet und
5660      hat auch nur einen Effekt, falls sie innerhalb einer Sektion
5661      benutzt wird.  Das lokal bekannte Originalmakro wird von ihr
5662      nicht beeinflu"st.}
5663\item{\tty{EXPORT/NOEXPORT} : legen fest, ob die Definition dieses
5664      Makros in einer getrennten Datei abgelegt werden soll, falls
5665      die Kommandozeilenoption \tty{-M} gegeben wurde.  Auf diese
5666      Weise k"onnen einzelne Definitionen ,,privater'' Makros selektiv
5667      ausgeblendet werden.  Der Default ist FALSE, d.h. die Definition
5668      wird nicht in der Datei abgelegt.  Ist zus"atzlich die
5669      \tty{GLOBAL}-Option gegeben worden, so wird das Makro mit dem
5670      modifizierten Namen abgelegt.}
5671\item{\tty{INTLABEL/NOINTLABEL} : legen fest, ob ein in der Zeile mit
5672      dem Makroaufruf definiertes Label innerhalb des Rumpfes als
5673      zus"atzlicher Parameter verwendet werden soll, als einfach
5674      nur die Adresse dieser Zeile zu 'labeln'.}
5675\item{\tty{GLOBALSYMBOLS/NOGLOBALSYMBOLS} : legt fest, ob im
5676      Makro definierte Labels lokal zu diesem Makro sein sollen
5677      oder auch au"serhalb des Makros verf"ugbar sein sollen.
5678      Der Default ist, da"s Labels lokal sind, weil mehrfache
5679      Benutzung eines Makros ansonsten schwierig w"are.}
5680\end{itemize}
5681Diese eben beschriebenen Steuerparameter werden von AS aus der
5682Parameterliste ausgefiltert, haben also keine weitere Wirkung in
5683der folgenden Verarbeitung und Benutzung.
5684\par
5685Beim Aufruf eines Makros werden die beim Aufruf angegebenen
5686Parameternamen "uberall textuell im Befehlsblock eingesetzt und der
5687sich so ergebene Assemblercode wird normal assembliert.  Sollten
5688beim Aufruf zu wenige Parameter angegeben werden, werden Nullstrings
5689eingef"ugt.  Wichtig ist zu wissen, da"s bei der Makroexpansion keine
5690R"ucksicht auf eventuell in der Zeile enthaltene Stringkonstanten
5691genommen wird.  Zu diesem Detail gilt die alte IBM-Regel:
5692\begin{quote}
5693\ii{It's not a bug, it's a feature!}
5694\end {quote}
5695Diese L"ucke kann man bewu"st ausnutzen, um Parameter mittels
5696Stringvergleichen abzupr"ufen.  So kann man auf folgende Weise
5697z.B. pr"ufen, wie ein Makroparameter aussieht:
5698\begin{verbatim}
5699mul     MACRO   para,parb
5700        IF      UpString("PARA")<>"A"
5701         MOV    a,para
5702        ENDIF
5703        IF      UpString("PARB")<>"B"
5704         MOV    b,parb
5705        ENDIF
5706        !mul     ab
5707        ENDM
5708\end{verbatim}
5709Wichtig ist bei obigem Beispiel, da"s der Assembler alle
5710Parameternamen im case-sensitiven Modus in Gro"sbuchstaben
5711umsetzt, in Strings aber nie eine Umwandlung in Gro"sbuchstaben
5712erfolgt. Die Makroparameternamen m"ussen in den Stringkonstanten
5713daher gro"s geschrieben werden.
5714\par
5715Argumente an ein Makro k"onnen in zwei Formen angegeben werden:
5716als {\em Positionsargumente} oder als {\em
5717Schl"usselwortargumente}.
5718\par
5719Bei Positionsargumenten ergibt sich
5720die Zuordnung von Argumenten zu Makro-Parametern einfach durch
5721ihre Position in der Aufrufliste, d.h. das erste Argument wird dem
5722ersten Parameter zugeordnet, das zweite Argument dem zweiten
5723Parameter usw..  Werden weniger Argumente angegeben als das Makro
5724Parameter hat, werden eventuell definierte Defaultwerte oder ein
5725Leerstring eingesetzt.  Gleiches gilt auch f"ur leere Argumente.
5726\par
5727Schl"usselwortargumente geben jedoch explizit an, f"ur welchen
5728Makro-Parameter sie gelten, indem der Parametername dem Wert
5729vorangestellt wird, z.B. so:
5730\begin{verbatim}
5731       mul  para=r0,parb=r1
5732\end{verbatim}
5733Wiederum wird f"ur nicht definierte Parameter ein eventuell
5734vorhandener Default oder ein Leerstring eingesetzt.
5735\par
5736Im Unterschied zu Positionsargumenten ist es mit
5737Schl"usselwortargumenten auch m"oglich, einem Parameter einen
5738Leerstring zuzuweisen, der einen nicht-leeren Default-Wert hat.
5739\par
5740Positions- und Schl"usselwortargumente d"urfen auch in einem
5741Aufruf gemischt werden, jedoch d"urfen ab dem ersten
5742Schl"usselwortargument keine Positionsargumente mehr verwendet
5743werden.
5744\par
5745F"ur die Makroparameter gelten die gleichen Konventionen wie bei
5746normalen Symbolen, mit der Ausnahme, da"s hier nur Buchstaben
5747und Ziffern zugelassen sind, also weder Punkte noch
5748Unterstriche. Diese Einschr"ankung hat ihren Grund in einem
5749verstecktem Feature: Der Unterstrich erlaubt es, einzelne
5750Makroparameternamen zu einem Symbol zusammenzuketten, z.B. in
5751folgendem Beispiel:
5752\begin{verbatim}
5753concat  MACRO   part1,part2
5754        CALL    part1_part2
5755        ENDM
5756\end{verbatim}
5757Der Aufruf
5758\begin{verbatim}
5759        concat  Modul,Funktion
5760\end{verbatim}
5761ergibt also
5762\begin{verbatim}
5763        CALL    Modul_Funktion
5764\end{verbatim}
5765\par
5766Neben den am Makro selber angegebenen Parametern existieren vier weitere
5767'implizite' Parameter, die immer vorhanden sind und daher nicht als eigene
5768Makroparameter verwendet werden sollten:
5769\begin{itemize}
5770\item{{\tt ATTRIBUTE} bezeichnet bei Architekturen, die Attribute f"ur
5771      Prozessorbefehle zulassen, das bei einem Makroaufruf angeh"angte
5772      Argument.  F"ur ein Beispiel siehe z.B. unten!}
5773\item{{\tt ALLARGS} bezeichnet eine kommaseparierte Liste aller
5774      Makroargumente, z.B., um sie an eine {\tt IRP}-Anweisung
5775      weiterzureichen.}
5776\item{{\tt ARGCOUNT} bezeichnet die tat"achlich "ubergebene Anzahl der
5777      an das Makro "ubergebenen Argumente.  Zu beachten ist allerdings,
5778      da"s diese Zahl niemals geringer als die Zahl der formalen Parameter
5779      ist, da AS fehlende Argumente mit Leerstrings auff"ullt!}
5780\item{{\tt \_\_LABEL\_\_} bezeichnet das Label, das in der das Makro aufrufenden
5781      Zeile stand.  Diese Ersetzung findet nur statt, wenn f"ur dieses
5782      Makro die {\tt INTLABEL}-Option gesetzt wurde!}
5783\end{itemize}
5784{\bf WICHTIG:} Die Namen dieser impliziten Parameter sind auch
5785case-insensitiv, wenn AS insgesamt angewiesen wurde, case-sensitiv
5786zu arbeiten!
5787
5788Der Zweck, ein Label 'intern' im Makro verwenden zu k"onnen, ist sicher
5789nicht unmittelbar einleuchtend.  Den einen oder anderen Fall mag es ja
5790geben, in dem es sinnvoll ist, den Einsprungpunkt in ein Makro irgendwo
5791in seinen Rumpf zu verschieben.  Der wichtigste Anwendungsfall sind aber
5792TI-Signalprozessoren, die eine Parallelisierung von Befehlen durch einen
5793doppelten senkrechten Strich in der Label-Spalte kennzeichnen, etwa so:
5794\begin{verbatim}
5795    instr1
5796||  instr2
5797\end{verbatim}
5798(da die beiden Instruktionen im Maschinencode in ein Wort verschmelzen,
5799kann man die zweite Instruktion "ubrigens gar nicht separat anspringen -
5800man verliert also durch das Belegen der Label-Position nichts).  Das
5801Problem ist aber, da"s einige 'Bequemlichkeits-Befehle' durch Makros
5802realisiert werden.  Ein vor das Makro geschriebenes
5803Parallelisierungssymbol w"urde normalerweise dem Makro selber zugeordnet,
5804{\it nicht dem ersten Befehl im Makro selber}.  Aber mit diesem Trick
5805funktioniert's:
5806\begin{verbatim}
5807myinstr    macro {INTLABEL}
5808__LABEL__  instr2
5809           endm
5810
5811           instr1
5812||         myinstr
5813\end{verbatim}
5814Das Ergebnis nach der Expansion von {\tt myinstr} ist identisch zu dem
5815vorherigen Beispiel ohne Makro.
5816
5817Rekursion von Makros, also das wiederholte Aufrufen eines Makros innerhalb
5818seines Rumpfes oder indirekt "uber andere von ihm aufgerufene Makros ist
5819vollkommen legal.  Wie bei jeder Rekusion mu"s man dabei nat"urlich
5820sicherstellen, da"s sie irgendwann ein Ende findet.  F"ur den Fall, da"s
5821man dies vergessen hat, f"uhrt AS in jedem definierten Makro einen Z"ahler
5822mit, der bei Beginn einer Makroexpansion inkrementiert und an deren Ende
5823wieder dekrementiert wird.  Bei rekursiven Aufrufen eines Makros erreicht
5824dieser Z"ahler also immer h"ohere Werte, und bei einem per {\tt NESTMAX}
5825einstellbaren Wert bricht AS ab.  Vorsicht, wenn man diese Bremse
5826abschaltet: der Speicherbedarf auf dem Heap kann so beliebig steigen und
5827selbst ein Unix-System in die Knie zwingen...
5828\par
5829Um alle Klarheiten auszur"aumen, ein einfaches Beispiel:
5830Ein intelverbl"odeter Programmierer m"ochte die Befehle \tty{PUSH/POP}
5831unbedingt auch auf dem 68000 haben.  Er l"ost das ,,Problem''
5832folgenderma"sen:
5833\begin{verbatim}
5834push    MACRO   op
5835        MOVE.ATTRIBUTE op,-(sp)
5836        ENDM
5837
5838pop     MACRO   op
5839        MOVE.ATTRIBUTE (sp)+,op
5840        ENDM
5841\end{verbatim}
5842Schreibt man nun im Code
5843\begin{verbatim}
5844        push    d0
5845        pop.l   a2        ,
5846\end{verbatim}
5847so wird daraus
5848\begin{verbatim}
5849        MOVE.   d0,-(sp)
5850        MOVE.L  (sp)+,a2
5851\end{verbatim}
5852Eine Makrodefinition darf nicht "uber Includefilegrenzen hinausgehen.
5853\par
5854In Makror"umpfen definierte Labels werden immer als lokal betrachtet,
5855au"ser bei der Definition des Makros wurde die
5856\tty{GLOBALSYMBOLS}-Option verwendet.  Ist es aus irgendwelchen Gr"unden
5857erforderlich, ein einzelnes Label in einem Makro global zu
5858machen, das ansonsten lokale Labels benutzt, so kann man es mit
5859\tty{LABEL} definieren, dessen Anwendung (wie bei \tty{BIT,SFR}...)
5860immer globale Symbole ergibt :
5861\begin{verbatim}
5862<Name>  LABEL   *
5863\end{verbatim}
5864Da der Assembler beim Parsing einer Zeile zuerst die Makroliste und
5865danach die Prozessorbefehle abklappert, lassen sich auch Prozessorbefehle
5866neu definieren.  Die Definition sollte dann aber vor der ersten Benutzung
5867des Befehles durchgef"uhrt werden, um Phasenfehler wie im folgenden
5868Beispiel zu vermeiden:
5869\begin{verbatim}
5870        BSR     ziel
5871
5872bsr     MACRO   target
5873        JSR     ziel
5874        ENDM
5875
5876        BSR     ziel
5877\end{verbatim}
5878Im ersten Pass ist bei der Assemblierung des \tty{BSR}-Befehles das Makro
5879noch nicht bekannt, es wird ein 4 Byte langer Befehl erzeugt.  Im
5880zweiten Pass jedoch steht die Makrodefinition sofort (aus dem ersten
5881Pass) zur Verf"ugung, es wird also ein 6 Byte langer \tty{JSR} kodiert.
5882Infolgedessen sind alle darauffolgenden Labels um zwei zu niedrig,
5883bei allen weiteren Labels sind Phasenfehler die Folge, und ein weiterer
5884Pass ist erforderlich.
5885\par
5886Da durch die Definition eines Makros ein gleichnamiger Maschinen- oder
5887Pseudobefehl nicht mehr zugreifbar ist, gibt es eine Hintert"ur, die
5888Originalbedeutung zu erreichen: Stellt man dem Mnemonic ein \tty{!} voran,
5889so wird das Durchsuchen der Makroliste unterdr"uckt.  Das kann
5890beispielsweise n"utzlich sein, um Befehle in ihrer M"achtigkeit zu
5891erweitern, z.B. die Schiebebefehle beim TLCS-90:
5892\begin{verbatim}
5893srl     macro   op,n      ; Schieben um n Stellen
5894        rept    n         ; n einfache Befehle
5895         !srl   op
5896        endm
5897        endm
5898\end{verbatim}
5899Fortan hat der \tty{SRL}-Befehl einen weiteren Parameter...
5900
5901\subsubsection{Expansion im Listing}
5902
5903Wird ein Makro im Quellcode aufgerufen, wird der durch dieses Makro definierte
5904Quellcode, inklusiver eingesetzter Parameter, an dieser Stelle im Listing
5905expandiert.  Das kann das Listing stark aufbl"ahen und schwerer lesbar
5906machen.  Es ist daher m"oglich, diese Expansion ganz oder teilweise zu
5907unterdr"ucken.  Generell teilt AS die in einem Makrorumpf enthaltenen
5908Quelltext-Zeilen in drei Klassen ein:
5909\begin{itemize}
5910\item{Darin enthaltene Makrodefinitionen, d.h. das Makro wird benutzt, um
5911      seinerseits weitere Makros zu definieren, oder es enth"alt \tty{REPT/
5912      IRP/IRPC/WHILE}-Bl"ocke.}
5913\item{Befehle zur bedingten Assemblierung plus Zeilen, die aufgrund
5914      solcher Anweisungen {\it nicht} assembliert werden.  Da bedingte
5915      Assemblierung von Makro-Parametern abh"angig sein darf, kann diese
5916      Untermenge ebenfalls davon abh"angen.}
5917\item{Alle restlichen Zeilen, die nicht unter die beiden ersten Klassen
5918      fallen.}
5919\end{itemize}
5920F"ur jedes Makro kann einzeln festgelegt werden, welche Teile im Listing
5921auftauchen oder nicht auftauchen sollen.  Vorgabewert bei der Definition
5922eines Makros ist dabei die zuletzt mit dem Befehl \tty{MACEXP\_DFT}
5923(\ref{MACEXPDFT}) vorgegebene Menge.  Wird bei der Definition eines
5924Makros eine der Direktiven \tty{EXPAND/NOEXPAND}, \tty{EXPIF/NOEXPIF},
5925\tty{EXPMACRO/NOEXPMACRO} oder \tty{EXPREST/NOEXPREST} gegeben, so wirken
5926diese {\it zus"atzlich} und mit h"oherer Priorit"at.  Ist z.B. die Expansion
5927global komplett ausgeschaltet (\tty{MACEXP\_DFT OFF}), so bewirkt das
5928Hinzuf"ugen von \tty{EXPREST}, da"s bei der Benutzung dieses Makro nur
5929die Zeilen im Listing angezeigt werden, die nach Auswertung bedingter
5930Assemblierung verblieben sind und auch keine Makrodefinition selber sind.
5931
5932Daraus ergibt sich, da"s eine "Anderung der Untermenge per \tty{MACEXP\_DFT}
5933keine Auswirkungen mehr auf Makros hat, die {\it vor} dieser Anweisung
5934{\it definiert} wurden.  Im Listing f"uhrt der Abschnitt mit definierten Makros
5935f"ur jedes Makro auf, welche Direktiven in der Summe f"ur dieses Makro
5936gelten.  Die in geschweiften Klammern aufgef"uhrte Liste ist dabei soweit
5937gek"urzt, da"s f"ur jede Klasse nur die letztg"ultige Direktive aufgef"uhrt
5938wird.  Ein per \tty{MACEXP\_DFT} gegebenes \tty{NOIF} taucht dort also
5939nicht mehr auf, falls speziell f"ur dieses Makro die Direktive \tty{EXPIF}
5940gegeben wurde.
5941
5942In Einzelf"allen kann es sinnvoll sein, die f"ur ein Makro definierten
5943Expansionsregeln zu "ubersteuern, egal ob diese per \tty{MACEXP\_DFT} oder
5944Direktiven gesetzt wurden.  Dazu dient der Befehl \tty{MACEXP\_OVR}
5945(\ref{MACEXPOVR}), der auf in der Folge {\it expandierte} Makros wirkt.  Auch
5946bei diesem Befehl gilt, da"s damit gegebene Direktiven zus"atzlich zu
5947denen in einem Makro hinterlegten und mit h"oherer Priorit"at wirken.  Ein
5948\tty{MACEXP\_OVR} ohne jegliche Argumente schaltet so einen ''Override''
5949wieder ab.
5950
5951%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5952
5953\subsection{IRP}
5954\ttindex{IRP}
5955
5956ist die eine vereinfachte Form von Makrodefinitionen f"ur den Fall,
5957da"s eine Befehlsfolge einmal auf mehrere Operanden angewendet werden
5958soll und danach nicht mehr gebraucht wird.  \tty{IRP} ben"otigt als ersten
5959Parameter ein Symbol f"ur den Operanden, und danach eine (fast)
5960beliebige Menge von Parametern, die nacheinander in den Befehlsblock
5961eingesetzt werden.  Um eine Menge von Registern auf den Stack zu
5962schieben, kann man z.B. schreiben
5963\begin{verbatim}
5964        IRP     op, acc,b,dpl,dph
5965        PUSH    op
5966        ENDM
5967\end{verbatim}
5968was in folgendem resultiert:
5969\begin{verbatim}
5970        PUSH    acc
5971        PUSH    b
5972        PUSH    dpl
5973        PUSH    dph
5974\end{verbatim}
5975Die Argumentliste darf analog zu einer Makro-Definition die
5976Steueranweisungen \tty{GLOBALSYMBOLS} bzw. \tty{NOGLOBALSYMBOLS} (durch
5977geschweifte Klammern als solche gekennzeichnet) enthalten, um zu
5978steuern, ob benutzte Labels f"ur jeden Durchgang automatisch lokal
5979sind oder nicht.
5980
5981%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5982
5983\subsection{IRPC}
5984\ttindex{IRPC}
5985
5986\tty{IRPC} ist eine Variante von \tty{IRP}, bei der das erste Argument in
5987den bis \tty{ENDM} folgenden Zeilen nicht sukzessiv durch die weiteren
5988Parameter, sondern durch die Zeichen eines Strings ersetzt wird.  Einen
5989String kann man z.B. also auch ganz umst"andlich so im Speicher ablegen:
5990\begin{verbatim}
5991        irpc    char,"Hello World"
5992        db      'CHAR'
5993        endm
5994\end{verbatim}
5995\bb{ACHTUNG!} Wie das Beispiel schon zeigt, setzt \tty{IRPC} nur das
5996Zeichen selber ein, da"s daraus ein g"ultiger Ausdruck entsteht (also hier
5997durch die Hochkommas, inklusive des Details, da"s hier keine automatische
5998Umwandlung in Gro"sbuchstaben vorgenommen wird), mu"s man selber
5999sicherstellen.
6000
6001%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6002
6003\subsection{REPT}
6004\ttindex{REPT}
6005
6006ist die einfachste Form der Makrobenutzung.  Der im Rumpf angegebene
6007Code wird einfach sooft assembliert, wie der Integerparameter von
6008\tty{REPT} angibt.  Dieser Befehl wird h"aufig in kleinen Schleifen anstelle
6009einer programmierten Schleife verwendet, um den Schleifenoverhead zu
6010sparen.
6011\par
6012Der Vollst"andigkeit halber ein Beispiel:
6013\begin{verbatim}
6014        REPT    3
6015        RR      a
6016        ENDM
6017\end{verbatim}
6018rotiert den Akku um 3 Stellen nach rechts.
6019\par
6020Ob Symbole f"ur jede einzelne Repetition lokal sind oder nicht,
6021kann wiederum durch die Steuerparameter \tty{GLOBALSYMBOLS} bzw.
6022\tty{NOGLOBALSYMBOLS} (durch geschweifte Klammern als solche
6023gekennzeichnet) bestimmt werden.
6024
6025Ist das Argument von \tty{REPT} kleiner oder gleich Null, so wird
6026"uberhaupt keine Expansion durchgef"uhrt.  Dies ist ein Unterschied
6027zu fr"uheren Versionen von AS, die hier etwas ,,schlampig'' waren
6028und immer mindestens eine Expansion ausf"uhrten.
6029
6030%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6031
6032\subsection{WHILE}
6033\ttindex{WHILE}
6034
6035\tty{WHILE} arbeitet analog zu \tty{REPT}, allerdings tritt an die
6036Stelle einer festen Anzahl als Argument ein boolescher Ausdruck, und
6037der zwischen \tty{WHILE} und \tty{ENDM} eingeschlossene Code wird sooft
6038assenbliert, bis der Ausdruck logisch falsch wird.  Im Extremfall kann
6039dies bedeuten, da"s der Code "uberhaupt nicht assembliert wird, falls die
6040Bedingung bereits beim Eintritt in das Konstrukt falsch ist.  Andererseits
6041kann es nat"urlich auch passieren, da"s die Bedingung immer wahr bleibt,
6042und AS l"auft bis an das Ende aller Tage...hier sollte man also etwas
6043Umsicht walten lassen, d.h. im Rumpf mu"s eine Anweisung stehen, die die
6044Bedingung auch beeinflu"st, z.B. so:
6045\begin{verbatim}
6046cnt     set     1
6047sq      set     cnt*cnt
6048        while   sq<=1000
6049         dc.l    sq
6050cnt      set     cnt+1
6051sq       set     cnt*cnt
6052        endm
6053\end{verbatim}
6054Dieses Beispiel legt alle Quadratzahlen bis 1000 im Speicher ab.
6055\par
6056Ein unsch"ones Detail bei \tty{WHILE} ist im Augenblick leider noch,
6057da"s am Ende der Expansion eine zus"atzliche Leerzeile, die im Quellrumpf
6058nicht vorhanden war, eingef"ugt wird.  Dies ist ein ,,Dreckeffekt'',
6059der auf einer Schw"ache des Makroprozessors beruht und leider nicht so
6060einfach zu beheben ist.  Hoffentlich st"ort es nicht allzusehr....
6061
6062%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6063
6064\subsection{EXITM}
6065\ttindex{EXITM}
6066
6067\tty{EXITM} stellt einen Weg dar, um eine Makroexpansion oder einen der
6068Befehle \tty{REPT}, \tty{IRP} oder \tty{WHILE} vorzeitig abzubrechen.
6069Eine solche M"oglichkeit hilft zum Beispiel, umfangreichere Klammerungen
6070mit \tty{IF-ENDIF}-Sequenzen in Makros "ubersichtlicher zu gestalten.
6071Sinnvollerweise ist ein \tty{EXITM} aber selber auch immer bedingt, was zu
6072einem wichtigen Detail f"uhrt: Der Stack, der "uber momentan offene
6073\tty{IF}- oder \tty{SWITCH}-Konstrukte Buch f"uhrt, wird auf den Stand vor
6074Beginn der Makroexpansion zur"uckgesetzt.  Dies ist f"ur bedingte
6075\tty{EXITM}'s zwingend notwendig, da das den \tty{EXITM}-Befehl in
6076irgendeiner Form einschlie"sende \tty{ENDIF} oder \tty{ENDCASE} nicht mehr
6077erreicht wird und AS ohne einen solchen Trick eine Fehlermeldung erzeugen
6078w"urde.  Weiterhin ist es f"ur verschachtelte Makrokonstruktionen
6079wichtig, zu beachten, da"s \tty{EXITM} immer nur das momentan innerste
6080Konstrukt abbricht!  Wer aus seiner geschachtelten Konstruktion
6081vollst"andig ,,ausbrechen'' will, mu"s auf den h"oheren Ebenen ebenfalls
6082\tty{EXITM}'s vorsehen!
6083
6084%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6085
6086\subsection{SHIFT}
6087\ttindex{SHIFT}\ttindex{SHFT}
6088
6089{\tt SHIFT} ist ein Mittel, um Makros mit variablen Argumentlisten
6090abzuarbeiten: Es verwirft den ersten Parameter, so da"s der zweite
6091Parameter seinen Platz einnimmt usw.  Auf diese Weise k"onnte man
6092sich durch eine variable Argumentliste durcharbeiten...wenn man es richtig
6093macht.  Folgendes funktioniert zum Beispiel {\em nicht}...
6094\begin{verbatim}
6095pushlist  macro reg
6096          rept  ARGCOUNT
6097          push  reg
6098          shift
6099          endm
6100          endm
6101\end{verbatim}
6102...weil das Makro {\em einmal} expandiert wird, seine Ausgabe von {\tt
6103REPT} aufgenommen und dann n-fach ausgef"uhrt wird.  Das erste Argument
6104wird also n-fach gesichert...besser geht es schon so:
6105\begin{verbatim}
6106pushlist  macro reg
6107          if      "REG"<>""
6108           push    reg
6109           shift
6110           pushlist ALLARGS
6111          endif
6112          endm
6113\end{verbatim}
6114Also eine Rekursion, in der pro Schritt die Argumentliste ({\tt ALLARGS})
6115um eins verk"uzt wird.  Der wichtige Trick ist, da"s jedes Mal eine neue
6116Expansion gestartet wird...
6117
6118Auf Plattformen, bei denen {\tt SHIFT} bereits eine Maschineninstruktion ist,
6119mu"s stattdessen {\tt SHFT} geschrieben werden.
6120
6121%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6122
6123\subsection{MAXNEST}
6124\ttindex{MAXNEST}
6125
6126Mit {\tt MAXNEST} kann man einstellen, wie oft ein Makro maximal rekursiv
6127aufgerufen werden kann, bevor AS mit einer Fehlermeldung abbricht.  Dies
6128darf ein beliebiger ganzer, positiver Wert sein, wobei der Sonderwert 0
6129diese Sicherheitsbremse komplett abschaltet (vorsicht damit...).  Der
6130Vorgabewert f"ur die maximale Verschachtelungstiefe ist 256; die
6131momentante Einstellung kann aus ener gleichnamigen Variablen gelesen
6132werden.
6133
6134%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6135
6136\subsection{FUNCTION}
6137\ttindex{FUNCTION}
6138\label{SectFUNCTION}
6139
6140\tty{FUNCTION} ist zwar kein Makrobefehl im engeren Sinne, da
6141hierbei aber "ahnliche Mechanismen wie bei Makroersetzungen
6142angewendet werden, soll er hier beschrieben werden.
6143\par
6144Dieser Befehl dient dazu, neue Funktionen zu definieren, die in
6145Formel\-ausdr"ucken wie die vordefinierten Funktionen verwendet werden
6146k"onnen.  Die Definition mu"s in folgender Form erfolgen:
6147\begin{verbatim}
6148<Name>  FUNCTION <Arg>,..,<Arg>,<Ausdruck>
6149\end{verbatim}
6150Die Argumente sind die Werte, die sozusagen in die Funktion
6151,,hineingesteckt'' werden.  In der Definition werden f"ur die Argumente
6152symbolische Namen gebraucht, damit der Assembler bei der Benutzung
6153der Funktion wei"s, an welchen Stellen die aktuellen Werte einzusetzen
6154sind. Dies kann man an folgendem Beispiel sehen:
6155\begin{verbatim}
6156isgit   FUNCTION ch,(ch>='0')&&(ch<='9')
6157\end{verbatim}
6158Diese Funktion "uberpr"uft, ob es sich bei dem Argument (wenn man es
6159als Zeichen interpretiert) um eine Ziffer im momentan g"ultigen
6160Zeichencode handelt (der momentane Zeichencode ist mittels \tty{CHARSET}
6161ver"anderbar, daher die vorsichtige Formulierung).
6162\par
6163Die Argumentnamen (in diesem Falle \tty{CH}) m"ussen den gleichen h"arteren
6164Symbolkonventionen gen"ugen wie Parameter bei einer Makrodefinition,
6165d.h. die Sonderzeichen . und \_ sind nicht erlaubt.
6166\par
6167Selbstdefinierte Funktionen werden genauso benutzt wie eingebaute,
6168d.h. mit einer durch Kommas getrennten, geklammerten Argumentliste:
6169\begin{verbatim}
6170        IF isdigit(Zeichen)
6171         message "\{Zeichen} ist eine Ziffer"
6172        ELSEIF
6173         message "\{Zeichen} ist keine Ziffer"
6174        ENDIF
6175\end{verbatim}
6176\par
6177Bei dem Aufruf der Funktion werden die Argumente nur einmal berechnet
6178und danach an allen Stellen der Formel eingesetzt, um den
6179Rechenaufwand zu reduzieren und Seiteneffekte zu vermeiden.
6180Bei Funktionen mit mehreren Argumenten m"ussen die einzelnen Argumente
6181bei der Benutzung durch Kommata getrennt werden.
6182\par
6183\bb{ACHTUNG!} Analog wie bei Makros kann man mit der Definition von
6184Funktionen bestehende Funktionen umdefinieren.  Damit lassen sich auch
6185wieder Phasenfehler provozieren.  Solche Definitionen sollten daher auf
6186jeden Fall vor der ersten Benutzung erfolgen!
6187\par
6188Da die Berechnung des Funktionsergebnisses anhand des Formelausdruckes
6189auf textueller Ebene erfolgt, kann der Ergebnistyp von dem Typ des
6190Eingangsargumentes abh"angen.  So kann bei folgender Funktion
6191\begin{verbatim}
6192double  function x,x+x
6193\end{verbatim}
6194das Ergebnis ein Integer, eine Gleitkommazahl oder sogar ein String
6195sein, je nach Typ des Arguments!
6196\par
6197Bei der Definition und Ansprache von Funktionen wird im case-sensitiven
6198Modus zwischen Gro"s- und Kleinschreibung unterschieden, im Gegensatz
6199zu eingebauten Funktionen!
6200
6201%%---------------------------------------------------------------------------
6202
6203\section{Strukturen}
6204\ttindex{STRUCT}\ttindex{ENDSTRUCT}\ttindex{UNION}\ttindex{ENDUNION}
6205\ttindex{STRUC}\ttindex{ENDSTRUC}\ttindex{ENDS}
6206\ttindex{DOTTEDSTRUCTS}
6207
6208{\em G"ultigkeit: alle Prozessoren}
6209
6210Auch in Assemblerprogrammen ergibt sich dann und wann die Notwendigkeit,
6211analog zu Hochsprachen zusammengesetzte Datenstrukturen zu definieren.
6212AS unterst"utzt sowohl die Definition als auch die Nutzung von Strukturen
6213mit einer Reihe von Konstrukten und Anweisungen, die im folgenden
6214erl"autert werden sollen:
6215
6216\subsection{Definition}
6217
6218Die Definition einer Struktur wird duch den Befehl \tty{STRUCT}
6219eingeleitet und durch \tty{ENDSTRUCT} abgeschlossen (schreibfaule
6220Zeitgenossen d"urfen aber auch stattdessen {\tt STRUC} bzw.  {\tt
6221ENDSTRUC} oder {\tt ENDS} schreiben).  Ein eventuell diesen Befehlen
6222voranstehendes Label wird als Name der zu definierenden Struktur
6223genommen; am Ende der Definition ist der Name optional und kann von
6224zur Festlegung des L"angennamens (s.u.) genutzt werden.  Das
6225restliche Verfahren ist simpel: Mit einem \tty{STRUCT} wird der
6226momentane Programmz"ahler gesichert und auf Null zur"uckgesetzt.
6227Alle zwischen \tty{STRUCT} und \tty{ENDSTRUCT} definierten Labels
6228ergeben mithin die Offsets der einzelnen Datenfelder in der Struktur.
6229Die Reservierung des Platzes f"ur die einzelnen Felder erfolgt mit
6230den f"ur den jeweils aktiven Zielprozessor zul"assigen Befehlen zur
6231Speicherplatzreservierung, also z.B.  \tty{DS.x} f"ur die Motorolas
6232oder \tty{DB} \& Co.  f"ur Intels.  Es gelten hier auch gleichfalls
6233die Regeln f"ur das Aufrunden von L"angen, um Alignments zu erhalten
6234- wer also 'gepackte' Strukturen definieren will, mu"s eventuell ein
6235{\tt PADDING OFF} voranstellen.  Umgekehrt lassen sich Ausrichtungen
6236nat"urlich mit Befehlen wie {\tt ALIGN} erzwingen.
6237
6238Da eine solche Definition nur eine Art 'Prototypen' darstellt, k"onnen nur
6239Befehle benutzt werden, die Speicherplatz reservieren, aber keine solchen,
6240die Konstanten im Speicher ablegen oder Code erzeugen.
6241
6242Innerhalb von Strukturen definierte Labels (also die Namen der Elemente)
6243werden nicht direkt abgespeichert, sondern es wird ihnen der Name der
6244Struktur vorangestellt, durch ein Trennzeichen verbunden, bei dem es sich
6245defaultm"a"sig um den Unterstrich (\_) handelt.  Dieses Verhalten l"a"st
6246sich aber durch dem \tty{STRUCT}-Befehl mitgegebene Argumente steuern:
6247\begin{itemize}
6248\item{\tty{NOEXTNAMES} unterdr"uckt das Voranstellen des Strukturnamens.
6249      Der Programmierer ist in diesem Falle selber daf"ur verantworlich,
6250      da"s Feldnamen nicht mehrfach verwendet werden.}
6251\item{\tty{DOTS} weist AS an, als verbindendes Zeichen einen Punkt
6252      anstelle des Unterstriches zu verwenden.  Es sei jedoch
6253      ausdr"ucklich darauf hingewiesen, da"s der Punkt bei vielen
6254      Zielprozessoren ein Sonderfunktion zur Bitadressierung hat und
6255      diese zu Problemen f"uhren kann!}
6256\end{itemize}
6257Des weiteren ist es m"oglich, die Verwendung des Punktes durch den Befehl
6258\begin{verbatim}
6259        dottedstructs <on|off>
6260\end{verbatim}
6261dauerhaft ein- bzw. auszuschalten.
6262
6263Neben den Namen der Elemente definiert AS beim Abschlu"s der Definition
6264ein weiteres Symbol mit dem Namen {\tt LEN}, das nach dem gleichen Regeln
6265um den Namen der Struktur erweitert wird - oder um den Label-Namen, der
6266optional bei \tty{ENDSTRUCT} angegeben werden kann.
6267
6268Das ganze sieht dan in der Praxis z.B. so aus:
6269\begin{verbatim}
6270Rec     STRUCT
6271Ident   db      ?
6272Pad     db      ?
6273Pointer dd      ?
6274Rec     ENDSTRUCT
6275\end{verbatim}
6276Hier w"urde z.B. dem Symbol {\tt REC\_LEN} der Wert 6 zugewiesen.
6277
6278\subsection{Nutzung}
6279
6280Ist eine Struktur einmal definiert, ist die Nutzung denkbar einfach und
6281"ahnlich wie ein Makro: ein einfaches
6282\begin{verbatim}
6283thisrec Rec
6284\end{verbatim}
6285reserviert Speicher in der Menge, wie er von der Struktur belegt wird, und
6286definiert gleichzeitig f"ur jedes Element der Struktur ein passendes
6287Symbol mit dessen Adresse, in diesem Falle also {\tt THISREC\_IDENT,
6288THISREC\_PAD} und {\tt THISREC\_POINTER}.  Das Label darf bei dem Aufruf
6289einer Struktur naturgem"a"s nicht fehlen; wenn doch, gibt's eine
6290Fehlermeldung.
6291
6292{\bf ACHTUNG!} Obwohl AS keine Argumente bei der Definition einer Struktur
6293erwartet, werden gegebene Argumente nicht als Fehler gemeldet, sondern
6294schlicht ignoriert.  Dies ist vorgesehen, um in Zukunft einer deklarierten
6295Struktur direkt Werte zuweisen zu k"onnen.
6296
6297\subsection{geschachtelte Strukturen}
6298
6299Es ist ohne weiteres erlaubt, eine bereits definierte Struktur in einer
6300anderen Struktur aufzurufen.  Das dabei ablaufende Verfahren ist eine
6301Kombination aus den beiden vorigen Punkten: Elemente der Substruktur
6302werden definiert, mit dem Namen dieser Instanz vorangestellt, und vor
6303diese zusammengesetzten Namen wird wieder der Name der Struktur bzw.
6304sp"ater bei einer Benutzung gesetzt.  Das sieht dann z.B. so aus:
6305\begin{verbatim}
6306TreeRec struct
6307left    dd         ?
6308right   dd         ?
6309data    Rec
6310TreeRec endstruct
6311\end{verbatim}
6312
6313Ebenso ist es erlaubt, eine Struktur direkt in einer anderen
6314Struktur zu definieren:
6315\begin{verbatim}
6316TreeRec struct
6317left    dd         ?
6318right   dd         ?
6319TreeData struct
6320name      db         32 dup(?)
6321id        dw         ?
6322TreeData endstruct
6323TreeRec endstruct
6324\end{verbatim}
6325
6326
6327\subsection{Unions}
6328
6329Eine Union ist eine Sonderform einer Struktur, bei der die einzelnen
6330Elemente nicht hintereinander, sondern {\em "ubereinander} liegen, d.h.
6331alle Elemente liegen an Startadresse 0 innerhalb der Struktur und belegen
6332den gleichen Speicherplatz.  Naturgem"a"s tut so eine Definition nicht
6333mehr, als einer Reihe von Symbolen den Wert Null zuzuweisen, sie kann aber
6334sinnvoll sein, um programmtechnisch die "Uberlappung der Elemente zu
6335verdeutlichen und den Code so etwas 'lesbarer' zu gestalten.  Die Gr"o"se
6336einer Struktur ist das Maximum der Gr"o"sen aller Elemente.
6337
6338\subsection{Namenlose Strukturen}
6339
6340Der Name einer Struktur oder Union ist optional, allerdings nur, wenn
6341diese Teil einer anderen, nicht namenlosen Struktur ist.  Elemente
6342dieser Struktur werden dann Teil der 'n"achsth"oheren' benamten
6343Struktur:
6344\begin{verbatim}
6345TreeRec struct
6346left    dd         ?
6347right   dd         ?
6348        struct
6349name      db         32 dup(?)
6350id        dw         ?
6351        endstruct
6352TreeRec endstruct
6353\end{verbatim}
6354erzeugt also die Symbole {\tt TREEREC\_NAME} und {\tt TREEREC\_ID}.
6355
6356Des weiteren wird f"ur namenlose Strukturen oder Unions kein Symbol
6357mit deren L"ange angelegt.
6358
6359\subsection{Strukturen und Sektionen}
6360
6361Im Verlaufe der Definition oder der Nutzung von Strukturen definierte
6362Symbole werden genauso behandelt wie normale Symbole, d.h. bei der Nutzung
6363innerhalb einer Sektion werden diese Symbole als lokal zu dieser Sektion
6364definiert.  Analoges gilt aber auch f"ur die Strukturen selber, d.h. eine
6365innerhalb einer Sektion definierte Struktur kann nicht au"erhalb der
6366Sektion benutzt werden.
6367
6368\subsection{Strukturen und Makros}
6369
6370Will man Strukturen "uber Makros instantiieren, so mu"s man die
6371\tty{GLOBALSYMBOLS}-Option bei der Definition des Makros
6372benutzen, damit die dar"uber erzeugten Symbole auch au"serhalb
6373des Makros verwendbar sind.  Eine Reihe von Strukturen kann man
6374z.B. so anlegen:
6375
6376\begin{verbatim}
6377        irp     name,{GLOBALSYMBOLS},rec1,rec2,rec3
6378name    Rec
6379        endm
6380\end{verbatim}
6381
6382%%---------------------------------------------------------------------------
6383
6384\section{bedingte Assemblierung}
6385
6386{\em G"ultigkeit: alle Prozessoren}
6387
6388Der Assembler unterst"utzt die bedingte Assemblierung mit Hilfe der
6389Konstrukte \tty{IF}... sowie \tty{SWITCH}... .  Diese Befehle wirken zur
6390Assemblierzeit, indem entsprechend der Bedingung Teile "ubersetzt oder
6391"ubersprungen werden.  Diese Befehle sind also \ii{nicht} mit den
6392IF-Statements h"oherer Programmiersprachen zu vergleichen (obwohl es
6393sehr verlockend w"are, den Assembler um die Strukturierungsbefehle
6394h"oherer Sprachen zu erweitern...).
6395\par
6396Die folgenden Konstrukte d"urfen beliebig (bis zum Speicher"uberlauf)
6397geschachtelt werden.
6398
6399%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6400
6401\subsection{IF / ELSEIF / ENDIF}
6402\ttindex{IF}
6403\ttindex{ELSEIF}\ttindex{ELSE}
6404\ttindex{ENDIF}
6405
6406\tty{IF} ist das gebr"auchlichere und allgemeiner verwendbare Konstrukt.
6407Die allgemeine Form eines \tty{IF}-Befehles lautet folgenderma"sen:
6408\begin{verbatim}
6409       IF       <Ausdruck 1>
6410        <Block 1>
6411       ELSEIF   <Ausdruck 2>
6412        <Block 2>
6413       (evtl. weitere ELSEIFs)
6414       ELSEIF
6415        <Block n>
6416       ENDIF
6417\end{verbatim}
6418\tty{IF} dient als Einleitung und wertet den ersten Ausdruck aus und assembliert
6419Block 1, falls der Ausdruck wahr (d.h. ungleich 0) ist.  Alle weiteren
6420\tty{ELSEIF}-Teile werden dann ignoriert.  Falls der Ausdruck aber nicht wahr
6421ist, wird Block 1 "ubersprungen und Ausdruck 2 ausgewertet.  Sollte dieser
6422nun wahr sein, wird Block 2 assembliert.  Die Zahl der \tty{ELSEIF}-Teile ist
6423variabel und ergibt eine \tty{IF-THEN-ELSE}-Leiter beliebiger L"ange.  Der dem
6424letzten \tty{ELSEIF} (ohne Parameter) zugeordnete Block wird nur assembliert,
6425falls alle vorigen Ausdr"ucke falsch ergaben und bildet sozusagen einen
6426,,Default-Zweig''.  Wichtig ist, da"s von den Bl"ocken immer nur \ii{einer}
6427assembliert wird, und zwar der erste, dessen zugeordnetes \tty{IF/ELSEIF} einen
6428wahren Ausdruck hatte.
6429\par
6430Die \tty{ELSEIF}-Teile sind optional, d.h. auf \tty{IF} darf auch direkt \tty{ENDIF}
6431folgen, ein parameterloses \tty{ELSEIF} bildet aber immer den letzten Zweig.
6432Ein \tty{ELSEIF} bezieht sich immer auf das letzte, noch nicht abgeschlossene \tty{IF}.
6433\par
6434Neben \tty{IF} sind noch folgende weitere bedingte Befehle definiert:
6435\ttindex{IFDEF}\ttindex{IFNDEF}
6436\ttindex{IFUSED}\ttindex{IFNUSED}
6437\ttindex{IFEXIST}\ttindex{IFNEXIST}
6438\ttindex{IFB}\ttindex{IFNB}
6439\begin{itemize}
6440\item{\tty{IFDEF} $<$Symbol$>$ : wahr, falls das Symbol definiert wurde.
6441      Die Definition mu"s vor \tty{IFDEF} erfolgt sein.}
6442\item{\tty{IFNDEF} $<$Symbol$>$ : Umkehrung zu \tty{IFDEF}}
6443\item{\tty{IFUSED} $<$Symbol$>$ : wahr, falls das Symbol bisher mindestens einmal
6444      benutzt wurde.}
6445\item{\tty{IFNUSED} $<$Symbol$>$ : Umkehrung zu \tty{IFUSED}}
6446\item{\tty{IFEXIST} $<$Name:  $>$ : wahr, falls die angegebene Datei existiert.
6447      F"ur Schreibweise und Suchpfade gelten gleiche Regeln wie beim
6448      \tty{INCLUDE}-Befehl (siehe Abschnitt \ref{SectInclude}).}
6449\item{\tty{IFNEXIST} $<$Name:  $>$ : Umkehrung zu \tty{IFEXIST}}
6450\item{\tty{IFB} $<$Arg-Liste$>$ : wahr, falls alle Argumente der Parameterliste leer
6451                                  sind.}
6452\item{\tty{IFNB} $<$Arg-Liste$>$ : Umkehrung zu IFB.}
6453\end{itemize}
6454
6455Anstelle von {\tt ELSEIF} darf auch {\tt ELSE} geschrieben werden, weil
6456das wohl alle so gewohnt sind....
6457
6458Zu jeder {\tt IF...}-Anweisung geh"ort ein entsprechendes {\tt ENDIF},
6459'offene' Konstrukte f"uhren zu einer Fehlermeldung am Ende des
6460Assemblierungslaufes.  Die Zuordnung, welches {\tt ENDIF} AS mit welchem
6461{\tt IF...} 'gepaart' hat, l"a"st sich im Listing erkennen: dort wird die
6462Zeilennummer des entsprechenden {\tt IF}s angezeigt.
6463
6464%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6465
6466\subsection{SWITCH / CASE / ELSECASE / ENDCASE}
6467\ttindex{SWITCH}\ttindex{SELECT}\ttindex{CASE}\ttindex{ELSECASE}\ttindex{ENDCASE}
6468
6469\tty{SWITCH} ist ein Spezialfall von \tty{IF} und f"ur den Fall gedacht, da"s ein
6470Ausdruck mit einer Reihe von Werten verglichen werden soll.  Dies ist
6471nat"urlich auch mit \tty{IF} und einer Reihe von \tty{ELSEIF}s machbar, die folgende
6472Form
6473\begin{verbatim}
6474       SWITCH   <Ausdruck>
6475       ...
6476       CASE     <Wert 1>
6477       ...
6478       <Block 1>
6479       ...
6480       CASE <Wert 2>
6481       ...
6482       <Block 2>
6483       ...
6484       (weitere CASE-Konstrukte)
6485       ...
6486       CASE <Wert n-1>
6487       ...
6488       <Block n-1>
6489       ...
6490       ELSECASE
6491       ...
6492       <Block n>
6493       ...
6494       ENDCASE
6495\end{verbatim}
6496bietet aber den Vorteil, da"s der zu pr"ufende Ausdruck nur einmal hingeschrieben
6497und berechnet werden mu"s, er ist also weniger fehleranf"allig und etwas
6498schneller als eine \tty{IF}-Kette, daf"ur nat"urlich auch nicht so flexibel.
6499\par
6500Es ist m"oglich, bei den \tty{CASE}-Anweisungen mehrere, durch Kommata getrennte
6501Werte anzugeben, um den entsprechenden Block in mehreren F"allen assemblieren
6502zu lassen.  Der \tty{ELSECASE}-Zweig dient wiederum als ,,Auffangstelle'' f"ur den
6503Fall, da"s keine der \tty{CASE}-Bedingungen greift.  Fehlt er und fallen alle
6504Pr"ufungen negativ aus, so gibt AS eine Warnung aus.
6505\par
6506Auch wenn die Wertelisten der \tty{CASE}-Teile sich "uberlappen, so wird immer
6507nur \ii{ein} Zweig ausgef"uhrt, und zwar bei Mehrdeutigkeiten der erste.
6508\par
6509\tty{SWITCH} dient nur der Einleitung des ganzen Konstruktes; zwischen ihm und
6510dem ersten \tty{CASE} darf beliebiger Code stehen (andere \tty{IF}s d"urfen aber nicht
6511offen bleiben!), im Sinne eines durchschaubaren Codes sollte davon aber
6512kein Gebrauch gemacht werden.
6513\par
6514Ist \tty{SWITCH} auf dem gew"ahlten Target ein Maschinenbefehl,
6515so leitet man das Konstrukt stattdessen mit \tty{SELECT} ein.
6516\par
6517"Ahnlich wie bei {\tt IF...}-Konstrukten, mu"s es f"ur jedes {\tt SWITCH}
6518genau ein {\tt ENDCASE} geben.  Analog zu {\tt ENDIF} wird bei {\tt ENDCASE}
6519im Listing die Zeilennummer des korrespondierenden {\tt SWITCH} angezeigt.
6520
6521%%---------------------------------------------------------------------------
6522
6523\section{Listing-Steuerung}
6524
6525{\em G"ultigkeit: alle Prozessoren}
6526
6527%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6528
6529\subsection{PAGE(PAGESIZE)}
6530\ttindex{PAGE}\ttindex{PAGESIZE}
6531
6532Mit \tty{PAGE} kann man AS die Dimensionen des Papiers, auf dem das
6533Listing ausgedruckt werden soll, mitteilen.  Als erster Parameter
6534wird dabei die Anzahl von Zeilen angegeben, nach der AS automatisch
6535einen Zeilenvorschub ausgeben soll.  Zu ber"ucksichtigen ist allerdings,
6536da"s bei dieser Angabe die Kopfzeilen inklusive einer evtl. mit \tty{TITLE}
6537spezifizierten Zeile nicht mitgerechnet werden.  Der Minimalwert f"ur
6538die Zeilenzahl ist 5, der Maximalwert 255.  Eine Angabe von 0 f"uhrt dazu,
6539da"s AS "uberhaupt keine automatischen Seitenvorsch"ube ausf"uhrt, sondern
6540nur noch solche, die explizit durch \tty{NEWPAGE}-Befehle oder implizit am
6541Ende des Listings (z.B. vor der Symboltabelle) von AS ausgel"ost
6542wurden.
6543\par
6544Die Angabe der Breite des Listings in Zeichen kann als optionaler
6545zweiter Parameter erfolgen und erf"ullt zwei Zwecke: Zum einen l"auft
6546der Zeilenz"ahler von AS korrekt weiter, wenn eine Quell-Zeile "uber mehrere
6547Listing-Zeilen geht, zum anderen gibt es Drucker (wie z.B. Laserdrucker),
6548die beim "Uberschreiten des rechten Randes nicht automatisch in eine neue
6549Zeile umbrechen, sondern den Rest einfach ,,verschlucken''.  Aus diesem
6550Grund f"uhrt AS auch den Zeilenumbruch selbstst"andig durch, d.h. zu lange
6551Zeilen werden in Bruchst"ucke zerlegt, die eine L"ange kleiner oder
6552gleich der eingestellten L"ange haben.  In Zusammenhang mit Druckern, die
6553einen automatischen Zeilenumbruch besitzen, kann das aber zu doppelten
6554Zeilenvorsch"uben f"uhren, wenn man als Breite exakt die Zeilenbreite des
6555Druckers angibt.  Die L"osung in einem solchen Fall ist, als Zeilenbreite
6556ein Zeichen weniger anzugeben.  Die eingestellte Zeilenbreite darf zwischen
65575 und 255 Zeichen liegen; analog zur Seitenl"ange bedeutet ein Wert von 0,
6558da"s AS keine Splittung der Listing-Zeilen vornehmen soll; eine
6559Ber"ucksichtigung von zu langen Zeilen im Listing beim Seitenumbruch kann
6560dann nat"urlich auch nicht mehr erfolgen.
6561\par
6562Die Defaulteinstellung f"ur die Seitenl"ange ist 60 Zeilen, f"ur die
6563Zeilenbreite 0; letztere Wert wird auch angenommen, wenn \tty{PAGE} nur mit
6564einem Argument aufgerufen wird.
6565\par
6566Falls \tty{PAGE} auf dem gew"ahlten Target bereits ein
6567Maschinenbefehl ist, benutzt man stattdessen \tty{PAGESIZE}.
6568\par
6569\bb{ACHTUNG!} AS hat keine M"oglichkeit, zu "uberpr"ufen, ob die
6570eingestellte Listing-L"ange und Breite mit der Wirklichkeit "ubereinstimmen!
6571
6572%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6573
6574\subsection{NEWPAGE}
6575\ttindex{NEWPAGE}
6576
6577\tty{NEWPAGE} kann dazu benutzt werden, einen Seitenvorschub zu erzwingen,
6578obwohl die Seite noch gar nicht voll ist.  Dies kann z.B. sinnvoll
6579sein, um logisch voneinander getrennte Teile im Assemblerprogramm
6580auch seitenm"a"sig zu trennen.  Der programminterne Zeilenz"ahler wird
6581zur"uckgesetzt, der Seitenz"ahler um Eins heraufgez"ahlt.  Der optionale
6582Parameter steht in Zusammenhang mit einer hierarchischen Seitennumerierung,
6583die AS bis zu einer Kapiteltiefe von 4 unterst"utzt.  0 bedeutet dabei
6584immer die tiefste Kapitelebene, der Maximalwert kann sich w"ahrend des
6585Laufes ver"andern, wenn das auch verwirrend wirken kann, wie folgendes
6586Beispiel zeigt:
6587\begin{quote}\begin{tabbing}
6588\hspace{2.5cm} \= \hspace{4.5cm} \= \kill
6589Seite 1,   \> Angabe \tty{NEWPAGE 0} \> $\rightarrow$ Seite 2 \\
6590Seite 2,   \> Angabe \tty{NEWPAGE 1} \> $\rightarrow$ Seite 2.1 \\
6591Seite 2.1, \> Angabe \tty{NEWPAGE 1} \> $\rightarrow$ Seite 3.1 \\
6592Seite 3.1, \> Angabe \tty{NEWPAGE 0} \> $\rightarrow$ Seite 3.2 \\
6593Seite 3.2, \> Angabe \tty{NEWPAGE 2} \> $\rightarrow$ Seite 4.1.1 \\
6594\end{tabbing}\end{quote}
6595Je nach momentan vorhandener Kapiteltiefe kann \tty{NEWPAGE $<$Nummer$>$}
6596also an verschiedenen Stellen eine Erh"ohung bedeuten.  Ein automatischer
6597Seitenvorschub wegen Zeilen"uberlauf oder ein fehlender Parameter ist
6598gleichbedeutend mit \tty{NEWPAGE 0}.  Am Ende des Listings wird vor Ausgabe
6599der Symboltabelle ein implizites \tty{NEWPAGE $<$bish. Maximum$>$} durchgef"uhrt,
6600um sozusagen ein neues Hauptkapitel zu beginnen.
6601
6602%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6603
6604\subsection{MACEXP\_DFT und MACEXP\_OVR}
6605\ttindex{MACEXP}
6606\ttindex{MACEXP\_DFT}
6607\ttindex{MACEXP\_OVR}
6608\label{MACEXPDFT}
6609\label{MACEXPOVR}
6610
6611Ist ein Makro einmal ausgestestet und 'fertig', m"ochte man es bei
6612Benutzung vielleicht gar nicht mehr im Listing sehen.  Wie im
6613Abschnitt "uber Makros (\ref{SectMacros}) erl"autert, kann man bei der
6614Definition eines Makros "uber Zusatzargumente steuern, ob und wenn ja
6615welche Teile des Makro-Rumpfes im Listing expandiert werden.  F"ur den
6616Fall, da"s eine ganze Reihe von Makros in Folge definiert werden,
6617mu"s man dies jedoch nicht f"ur jedes Makro einzeln festlegen.  Der
6618Befehl \tty{MACEXP\_DFT} setzt f"ur alle im folgenden definerten Makros,
6619welche Teile ihres Rumpfes expandiert werden sollen:
6620\begin{itemize}
6621\item{\tty{ON} bzw. \tty{OFF} schalten die Expansion komplett
6622      ein bzw. aus.}
6623\item{Mit den Argumenten \tty{IF} bzw. \tty{NOIF} werden Befehle
6624      im Rumpf zur bedingten Assemblierung und derentwegen nicht
6625      assemblierte Code-Teile aus- bzw. eingeblendet.}
6626\item{Makro-Definitionen (dazu z"ahlen auch \tty{REPT},
6627      \tty{WHILE} und \tty{IRP(C)}) k"onnen "uber die Argumente
6628      \tty{MACRO} bzw. \tty{NOMACRO} ein- und
6629      ausgeblendet werden.}
6630\item{Mit den Argumenten \tty{REST} bzw. \tty{NOREST} k"onnen die
6631      Zeilen ein- und ausgeblendet werden, die nicht in die ersten
6632      beiden Klassen fallen.}
6633\end{itemize}
6634Default ist \tty{ON}, d.h. im folgenden definierte Makros werden
6635komplett expandiert, au"ser nat"urlich bei den einzelnen Makros wurde
6636dies durch Direktiven "ubersteuert.  Weiterhin wirken angegebene Schalte
6637relativ zur aktuellen Einstellung: ist z.B. initial alles eingeschaltet,
6638sorgt ein
6639\begin{quote}{\tt
6640        MACEXP\_DFT  noif,nomacro
6641}\end{quote}
6642daf"ur, da"s nur noch das gelistet wird, was weder eine Makrodefinition
6643ist noch per bedingter Assemblierung ausgeschlossen wurde.
6644\par
6645Mit diesem Befehl und den pro Makro setzbaren Direktiven l"a"st sich
6646f"ur jedes einzlene Makro genau festlegen, welche Teile bei einer
6647Expansion im Listing erscheinen sollen und welche nicht.  Es kann
6648jedoch in der Praxis auch vorkommen, da"s man ein bestimmtes Makro an
6649einzelnen Stellen im Quellcode expandiert haben m"ochte, an anderen
6650jedoch nicht.  Dies ist mit dem Befehl \tty{MACEXP\_OVR} m"oglich: er
6651akzeptiert die gleichen Argumente, diese wirken jedoch als Overrides
6652f"ur alle im folgenden {\em expandierten} Makros, im Gegensatz zu
6653\tty{MACEXP\_DFT}, das auf alle im folgenden {\em definierten} Makros
6654wirkt.  Ist zum Beispiel f"ur ein Makro festgelegt worden, da"s weder
6655Makrodefinitionen noch per bedingte Assemblierung ausgeschlossene
6656Teile gelistet werden sollen, so schaltet ein
6657\begin{quote}{\tt
6658	MACEXP\_OVR  MACRO
6659}\end{quote}
6660f"ur folgende Expansionen das Listen von Makrodefinitionen wieder ein,
6661w"ahrend ein
6662\begin{quote}{\tt
6663	MACEXP\_OVR ON
6664}\end{quote}
6665wieder alles ins Listing expandiert.  \tty{MACEXP\_OVR} ohne
6666Argumente schaltet wiederum s"amtliche Overrides aus, Makros
6667verhalten sich bei der Expansion wieder so, wie zum Zeitpunkt ihrer
6668Definition festgelegt.
6669\par
6670Beide Befehle wirken ebenfalls auf andere Makro-artige Konstrukte
6671(\tty{REPT, IRP, IRPC WHILE}), da diese aber einmalig ,,in-place''
6672expandiert werden, verschwimmt der funktionale Unterschied zwischen
6673den beiden Befehlen - im Zweifelsfalle hat aber der per
6674\tty{MACEXP\_OVR} gesetzte Override eine h"ohere Priorit"at.
6675
6676Die momentane mit \tty{MACEXP\_DFT} gesetzte Einstellung l"a"st sich
6677aus dem Symbol \tty{MACEXP} auslesen.  Anstelle von \tty{MACEXP\_DFT}
6678darf auch einfach \tty{MACEXP} geschrieben werden, davon sollte aber
6679in neuen Programmen kein Gebrauch mehr gemacht werden.
6680
6681%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6682
6683\subsection{LISTING}
6684\ttindex{LISTING}
6685
6686Mit diesem Befehl kann das Listing komplett ein- und ausgeschaltet
6687werden. Nach einem
6688\begin{verbatim}
6689        LISTING off
6690\end{verbatim}
6691wird \ii{"uberhaupt} nichts mehr im Listing ausgegeben.  Diese Anweisung
6692macht Sinn f"ur erprobte Codeteile oder Includefiles, um den
6693Papierverbrauch nicht ins Unerme"sliche zu steigern.  \bb{ACHTUNG!}
6694Wer sp"ater das Gegenst"uck vergi"st, bekommt auch keine Symboltabelle
6695mehr zu sehen!  Zus"atzlich zu \tty{ON} und \tty{OFF} akzeptiert
6696\tty{LISTING} auch \tty{NOSKIPPED} und \tty{PURECODE} als Argument.  Mit
6697der \tty{NOSKIPPED}-Einstellung werden aufgrund bedingter Assemblierung
6698nicht assemblierte Teile nicht im Listing aufgef"uhrt, w"ahrend
6699\tty{PURECODE} - wie der Name schon erahnen l"a"st - auch die
6700\tty{IF}-Konstrukte selber nicht mehr im Listing auff"uhrt.  Diese
6701Einstellungen sind n"utzlich, wenn man Makros, die anhand von
6702Parametern verschiedene Aktionen ausf"uhren, benutzt, und im Listing
6703nur noch die jeweils benutzten Teile sehen m"ochte.
6704\par
6705Die momentane Einstellung l"a"st sich aus dem Symbol \tty{LISTING}
6706(0=\tty{OFF}, 1=\tty{ON}, 2=\tty{NOSKIPPED}, 3=\tty{PURECODE}) auslesen.
6707
6708%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6709
6710\subsection{PRTINIT und PRTEXIT}
6711\ttindex{PRTINIT}\ttindex{PRTEXIT}
6712
6713Bei der Listingausgabe auf Druckern ist es oftmals sinnvoll, den
6714Drucker in eine andere Betriebsart (z.B. Schmalschrift) umzuschalten
6715und am Ende des Listings diese Betriebsart wieder zu deaktivieren. Mit
6716diesen Befehlen kann die Ausgabe dieser Steuerfolgen automatisiert
6717werden, indem man mit
6718\begin{verbatim}
6719        PRTINIT <String>
6720\end{verbatim}
6721die Zeichenfolge angibt, die vor Listingbeginn an das Ausgabeger"at
6722geschickt werden soll und mit
6723\begin{verbatim}
6724        PRTEXIT <String>
6725\end{verbatim}
6726analog den Deinitialisierungsstring.  In beiden F"allen mu"s
6727\tty{$<$String$>$} ein Stringausdruck sein.  Die Syntaxregeln f"ur
6728Stringkonstanten erm"oglichen es, ohne Verrenkungen Steuerzeichen in den
6729String einzubauen.
6730\par
6731Bei der Ausgabe dieser Strings unterscheidet der Assembler \bb{nicht},
6732wohin das Listing geschickt wird, d.h. Druckersteuerzeichen werden
6733r"ucksichtslos auch auf den Bildschirm geschickt!
6734\par
6735Beispiel :
6736\par
6737Bei Epson-Druckern ist es sinnvoll, f"ur die breiten Listings
6738in den Kompre"sdruck zu schalten.  Die beiden Zeilen
6739\begin{verbatim}
6740        PRTINIT "\15"
6741        PRTEXIT "\18"
6742\end{verbatim}
6743sorgen daf"ur, da"s der Kompre"sdruck ein- und nach dem Druck wieder
6744ausgeschaltet wird.
6745
6746%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6747
6748\subsection{TITLE}
6749\ttindex{TITLE}
6750
6751Normalerweise versieht der Assembler bereits jede Listingseite mit
6752einer Titelzeile, die Quelldatei, Datum und Uhrzeit enth"alt.  Mit
6753diesem Befehl kann man den Seitenkopf um eine beliebige zus"atzliche
6754Zeile erweitern.  Der anzugebende String ist dabei ein beliebiger
6755Stringausdruck.
6756\par
6757Beispiel:
6758\par
6759Bei dem bereits oben angesprochenenen Epson-Drucker soll eine Titelzeile
6760im Breitdruck ausgegeben werden, wozu vorher der Kompre"smodus
6761abgeschaltet werden mu"s:
6762\begin{verbatim}
6763        TITLE   "\18\14Breiter Titel\15"
6764\end{verbatim}
6765(Epson-Drucker schalten den Breitdruck automatisch am Zeilenende aus.)
6766
6767%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6768
6769\subsection{RADIX}
6770\ttindex{RADIX}
6771
6772\tty{RADIX} mit einem numerischen Argument zwischen 2 und 36 legt das
6773Default-Zahlensystem f"ur Integer-Konstanten fest, d.h. das Zahlensystem,
6774das angenommen wird, wenn man nichts ausdr"ucklich anderes angegeben hat.
6775Defaultm"a"sig ist dies 10, und bei der Ver"anderung dieses Wertes sind
6776einige Fallstricke zu beachten, die in Abschnitt \ref{SectIntConsts}
6777beschrieben sind.
6778
6779Unabh"angig von der momentanen Einstellung ist das Argument von {\tt
6780RADIX} {\em immer dezimal}; weiterhin d"urfen keine symbolischen oder
6781Formelausdr"ucke verwendet werden, sondern nur einfache Zahlenkonstanten!
6782
6783%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6784
6785\subsection{OUTRADIX}
6786\ttindex{OUTRADIX}
6787
6788\tty{OUTRADIX} is gewisserma"sen das Gegenst"uck zu \tty{RADIX}: Mit ihm
6789kann man festlegen, in welchem Zahlensystem berechnete Integer-Ausdr"ucke
6790in Strings eingesetzt werden sollen, wenn man \verb!\{...}!-Konstrukte in
6791Stringkonstanten verwendet (siehe Abschnitt \ref{SectStringConsts}).  Als
6792Argument sind wieder Werte zwischen 2 und 36 erlaubt; der Default ist 16.
6793
6794%%---------------------------------------------------------------------------
6795
6796\section{lokale Symbole}
6797\label{ChapLocSyms}
6798
6799{\em G"ultigkeit: alle Prozessoren}
6800
6801Bei den lokalen Labels und den dazu eingef"uhrten Sektionen handelt es
6802sich um eine grundlegend neue Funktion, die mit Version 1.39 eingef"uhrt
6803wird.  Da dieser Teil sozusagen ,,1.0'' ist, ist er sicherlich noch nicht
6804der Weisheit letzter Schlu"s.  Anregungen und (konstruktive) Kritik sind
6805daher besonders erw"unscht.  Insbesondere habe ich die Verwendung von
6806Sektionen hier so dargestellt, wie ich sie mir vorstelle.  Es kann dadurch
6807passiert sein, da"s die Realit"at nicht ganz meinem Modell im Kopf entspricht.
6808F"ur den Fall von Diskrepanzen verspreche ich, da"s die Realit"at der
6809Dokumentation angepa"st wird, und nicht umgekehrt, wie es bei gr"o"seren
6810Firmen schon einmal vorgekommen sein soll...
6811\par
6812AS erzeugt keinen linkf"ahigen Code (und wird es wohl auch nicht in n"aherer
6813Zukunft tun \tty{:-(} ).  Diese Tatsache zwingt dazu, ein Programm immer im ganzen
6814zu "ubersetzen.  Dieser Technik gegen"uber h"atte eine Aufteilung in
6815Linker-Module einige Vorteile:
6816\begin{itemize}
6817\item{k"urzere "Ubersetzungszeiten, da lediglich die ge"anderten Module
6818      neu "ubersetzt werden m"ussen;}
6819\item{die M"oglichkeit, durch Definition "offentlicher und privater
6820      Symbole definierte Schnittstellen zwischen den Modulen festzulegen;}
6821\item{Durch die geringere L"ange der einzelnen Module reduziert sich die
6822      Anzahl der Symbole im einzelnen Modul, so da"s k"urzere und trotzdem
6823      eindeutige Symbolnamen benutzt werden k"onnen.}
6824\end{itemize}
6825Insbesondere der letzte Punkt hat mich pers"onlich immer etwas gest"ort:
6826War ein Label-Name einmal am Anfang eines 2000 Zeilen langen Programmes
6827benutzt, so durfte er nirgendwo wieder verwendet werden --- auch nicht am
6828anderen Ende des Quelltextes, wo Routinen mit ganz anderem Kontext standen.
6829Ich war dadurch gezwungen, zusammengesetzte Namen der Form
6830\begin{verbatim}
6831<Unterprogrammname>_<Symbolname>
6832\end{verbatim}
6833zu verwenden, die dann L"angen zwischen 15 und 25 Zeichen hatten und das
6834Programm un"ubersichlich machten.
6835Das im folgenden eingehender beschriebene Sektionen-Konzept sollte zumindest
6836den beiden letzten genannten Punkten abhelfen.  Es ist vollst"andig optional:
6837Wollen Sie keine Sektionen verwenden, so lassen Sie es einfach bleiben
6838und arbeiten weiter wie unter den "alteren AS-Versionen.
6839
6840%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6841
6842\subsection{Grunddefinition (SECTION/ENDSECTION)}
6843
6844Eine \ii{Sektion} stellt einen durch spezielle Befehle eingerahmten
6845Teil des Assembler-Programmes dar und hat einen vom Programmierer
6846festlegbaren, eindeutigen Namen:
6847\begin{verbatim}
6848        ...
6849        <anderer Code>
6850        ...
6851        SECTION <Sektionsname>
6852        ...
6853        <Code in der Sektion>
6854        ...
6855        ENDSECTION [Sektionsname]
6856        ...
6857        <anderer Code>
6858        ...
6859\end{verbatim}
6860Der Name f"ur eine Sektion mu"s den Konventionen f"ur einen Symbolnamen
6861entsprechen; da AS Sektions-und Symbolnamen in getrennten Tabellen speichert,
6862darf ein Name sowohl f"ur ein Symbol als auch eine Sektion verwendet werden.
6863Sektionsnamen m"ussen in dem Sinne eindeutig sein, da"s auf einer Ebene
6864nicht zwei Sektionen den gleichen Namen haben d"urfen (was es mit den
6865,,Ebenen'' auf sich hat, erl"autere ich im n"achsten Abschnitt).  Das Argument
6866zu \tty{ENDSECTION} ist optional, es darf auch weggelassen werden; Falls
6867es weggelassen wird, zeigt AS den Namen der Sektion an, der er das
6868\tty{ENDSECTION} zugeordnet hat.  Code in einer Sektion wird von AS genauso
6869behandelt wie au"serhalb, lediglich mit drei entscheidenden Unterschieden:
6870\begin{itemize}
6871\item{Innerhalb der Sektion definierte Symbole (z.B. Labels, \tty{EQU}s...) werden
6872      mit einer von AS intern vergebenen, der Sektion zugeordneten Nummer
6873      versehen.  Diese Symbole sind von Code au"serhalb der Sektion nicht
6874      ansprechbar (das l"a"st sich nat"urlich durch Pseudobefehle variieren,
6875      aber dazu sp"ater mehr).}
6876\item{Durch das zus"atzliche Attribut kann ein Symbolname sowohl au"serhalb
6877      der Sektion als auch innerhalb definiert werden, das Attribut erlaubt
6878      also, Symbolnamen mehrfach zu benutzen, ohne da"s AS Protest anmeldet.}
6879\item{Falls ein Symbol sowohl au"serhalb als auch innerhalb definiert ist,
6880      wird innerhalb der Sektion das ,,lokale'' verwendet, d.h. AS sucht
6881      in der Symboltabelle zuerst nach einem Symbol des gew"unschten Namens,
6882      das auch gleichzeitig der Sektion zugeordnet wurde.  Erst danach wird
6883      nach einem globalen Symbol dieses Namens gefahndet.}
6884\end{itemize}
6885Mit diesem Mechanismus kann man z.B. den Code in Module aufteilen, wie man
6886es mit einem Linker getan h"atte.  Eine feinere Aufteilung w"are dagegen,
6887alle Routinen in getrennte Sektionen zu verpacken.  Je nach L"ange der
6888Routinen k"onnen die nur intern ben"otigten Symbole dann sehr kurze Namen
6889haben.
6890\par
6891Defaultm"a"sig unterscheidet AS Gro"s-und Kleinschreibung in Sektions-
6892namen nicht; schaltet man jedoch in den case-sensitiven Modus um, so
6893wird die Schreibweise genauso wie bei Symbolnamen ber"ucksichtigt.
6894\par
6895Die bisher beschriebene Aufteilung w"urde in etwa der Sprache C entsprechen,
6896in der alle Funktionen auf gleicher Ebene nebeneinander stehen.  Da mein
6897,,hochsprachliches'' Vorbild aber Pascal ist, bin ich noch einen Schritt
6898weiter gegangen:
6899
6900%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6901
6902\subsection{Verschachtelung und Sichtbarkeitsregeln}
6903
6904Es ist erlaubt, in einer Sektion weitere Sektionen zu definieren, analog
6905zu der M"oglichkeit in Pascal, in einer Prozedur/Funktion weitere
6906Prozeduren zu definieren.  Dies zeigt folgendes Beispiel:
6907\begin{verbatim}
6908sym     EQU        0
6909
6910        SECTION    ModulA
6911         SECTION    ProcA1
6912sym       EQU        5
6913         ENDSECTION ProcA1
6914         SECTION    ProcA2
6915sym       EQU        10
6916         ENDSECTION ProcA2
6917        ENDSECTION ModulA
6918
6919        SECTION    ModulB
6920sym      EQU        15
6921         SECTION    ProcB
6922         ENDSECTION ProcB
6923        ENDSECTION ModulB
6924\end{verbatim}
6925Bei der Suche nach einem Symbol sucht AS zuerst ein Symbol, das der aktuellen
6926Sektion zugeordnet ist, und geht danach die ganze ,,Liste'' der Vatersektionen
6927durch, bis er bei den globalen Symbolen angekommen ist.  Im Beispiel sehen
6928die Sektionen die in Tabelle \ref{TabSymErg} angegebenen Werte f"ur das Symbol
6929\tty{sym}.
6930\begin{table*}[htb]
6931\begin{center}\begin{tabular}{|l|l|l|}
6932\hline
6933Sektion      &    Wert   &   aus Sektion... \\
6934\hline
6935\hline
6936Global       &     0     &    Global        \\
6937\hline
6938\tty{ModulA} &     0     &    Global        \\
6939\hline
6940\tty{ProcA1} &     5     &    \tty{ProcA1}  \\
6941\hline
6942\tty{ProcA2} &    10     &    \tty{ProcA2}  \\
6943\hline
6944\tty{ModulB} &    15     &    \tty{ModulB}  \\
6945\hline
6946\tty{ProcB}  &    15     &    \tty{ModulB}  \\
6947\hline
6948\end{tabular}\end{center}
6949\caption{F"ur die einzelnen Sektionen g"ultigen Werte\label{TabSymErg}}
6950\end{table*}
6951Diese Regel kann man durchbrechen, indem man explizit an den Symbolnamen
6952die Sektion anh"angt, aus der man das Symbol holen will, und zwar in
6953eckigen Klammern am Ende des Symbolnamens:
6954\begin{verbatim}
6955        move.l  #sym[ModulB],d0
6956\end{verbatim}
6957Es d"urfen dabei nur Sektionsnamen verwendet werden, die eine Obersektion
6958zur aktuellen Sektion darstellen.  Als Sonderwert sind die Namen
6959\tty{PARENT0..PARENT9} erlaubt, mit denen man die n-ten ,,Vatersektionen''
6960relativ zur momentanen Sektion ansprechen kann; \tty{PARENT0} entspricht
6961also der momentanen Sektion selber, \tty{PARENT1} der direkt "ubergeordneten
6962usw.  Anstelle \tty{PARENT1} kann man auch kurz nur \tty{PARENT} schreiben.
6963L"a"st man dagegen den Platz zwischen den Klammern komplett frei, also
6964etwa so
6965\begin{verbatim}
6966        move.l  #sym[],d0 ,
6967\end{verbatim}
6968so erreicht man das globale Symbol.  \bb{ACHTUNG!} Wenn man explizit ein
6969Symbol aus einer Sektion anspricht, so wird auch nur noch bei den
6970Symbolen dieser Sektion gesucht, der Sektionsbaum wird nicht mehr
6971bis nach oben durchgegangen!
6972\par
6973Analog zu Pascal ist es erlaubt, da"s verschiedene Sektionen Untersektionen
6974gleichen Namens haben d"urfen, das Prinzip der Lokalit"at verhindert hier
6975Irritationen.  M.E. sollte man davon aber trotzdem sparsamen Gebrauch machen,
6976da in Symbol-und Querverweisliste Symbole zwar mit der Sektion, in der sie
6977definiert wurden, gekennzeichnet werden, aber nicht mit der "uber dieser
6978Sektion evtl. liegenden ,,Sektionshierarchie'' (das h"atte einfach den Platz
6979in der Zeile gesprengt); Unterscheidungen sind dadurch nicht erkennbar.
6980\par
6981Da ein \tty{SECTION}-Befehl von selber kein Label definiert, besteht hier
6982ein wichtiger Unterschied zu Pascal: Eine Pascal-Prozedur kann
6983ihre Unterprozeduren/funktionen automatisch ,,sehen'', unter AS mu"s man
6984noch einen Einsprungpunkt extra definieren.  Das kann man z.B. mit folgendem
6985Makro-P"archen tun:
6986\begin{verbatim}
6987proc    MACRO   name
6988        SECTION name
6989name    LABEL   $
6990        ENDM
6991
6992endp    MACRO   name
6993        ENDSECTION name
6994        ENDM
6995\end{verbatim}
6996Diese Beispiel zeigt gleichzeitig, da"s die Lokalit"at von Labels in
6997Makros nicht von den Sektionen beeinflu"st wird, deshalb der Trick mit dem
6998\tty{LABEL}-Befehl.
6999\par
7000Nat"urlich ist mit dieser Definition das Problen noch nicht ganz gel"ost,
7001bisher ist das Einsprung-Label ja noch lokal und von au"sen nicht zu
7002erreichen.  Wer nun meint, man h"atte das Label einfach nur vor der
7003SECTION-Anweisung plazieren m"ussen, sei jetzt bitte ruhig, denn er
7004verdirbt mir den "Ubergang auf das n"achste Thema:
7005
7006%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7007
7008\subsection{PUBLIC und GLOBAL}
7009
7010Die \tty{PUBLIC}-Anweisung erlaubt es, die Zugeh"origkeit eines Symbols
7011zu einer bestimmten Sektion zu ver"andern.  Es ist m"oglich, mit einem
7012\tty{PUBLIC}-Befehl mehrere Symbole zu bearbeiten, ohne Beschr"ankung
7013der Allgemeinheit will ich aber ein Beispiel mit nur einer Variable verwenden:
7014Im einfachsten Falle erkl"art man ein Symbol als vollst"andig global, d.h.
7015es ist von allen Stellen des Programmes ansprechbar:
7016\begin{verbatim}
7017        PUBLIC  <Name>
7018\end{verbatim}
7019Da ein Symbol bei seiner Definition endg"ultig in der Symboltabelle
7020einsortiert wird, mu"s diese Anweisung \bb{vor} der Definition des
7021Symbols erfolgen.  Alle \tty{PUBLIC}s werden von AS in einer Liste
7022vermerkt und bei ihrer Definition aus dieser Liste wieder entfernt.  Bei
7023Beendigung einer Sektion gibt AS Fehlermeldungen f"ur alle nicht
7024aufgel"osten ,,Vorw"artsreferenzen'' aus.
7025\par
7026Angesichts des hierarchischen Sektionenkonzepts erscheint die Methode,
7027ein Symbol als vollst"andig global zu definieren, reichlich brachial.
7028Es geht aber auch etwas differenzierter, indem man zus"atzlich einen
7029Sektionsnamen angibt:
7030\begin{verbatim}
7031        PUBLIC  <Name>:<Sektion>
7032\end{verbatim}
7033Damit wird das Symbol der genannten Sektion zugeordnet und damit auch
7034allen ihren Untersektionen zug"anglich (es sei denn, diese definieren
7035wiederum ein Symbol gleichen Namens, das dann das ,,globalere''
7036"ubersteuert).  Naturgem"a"s protestiert AS, falls mehrere Untersektionen
7037ein Symbol gleichen Namens auf die gleiche Ebene exportieren wollen.
7038Als Spezialwert f"ur \tty{$<$Sektion$>$} sind die im vorigen Abschnitt
7039genannten \tty{PARENTx}-Namen zugelassen, um das Symbol genau n Ebenen hinaufzuexportieren.
7040Es sind als Sektionen nur der momentanen Sektion "ubergeordnete Sektionen
7041zugelassen, also keine, die im Baum aller Sektionen in einem anderen Zweig
7042stehen.  Sollten dabei mehrere Sektionen den gleichen Namen haben (dies ist
7043legal), so wird die tiefste gew"ahlt.
7044\par
7045Mit diesem Werkzeug kann das obige Prozedurmakro nun Sinn ergeben:
7046\begin{verbatim}
7047proc    MACRO   name
7048        SECTION name
7049        PUBLIC  name:PARENT
7050name    LABEL   $
7051        ENDM
7052\end{verbatim}
7053Diese Einstellung entspricht dem Modell von Pascal, in der eine
7054Unterprozedur auch nur von ihrem ,,Vater'' gesehen werden kann, jedoch
7055nicht vom ,,Gro"svater''.
7056\par
7057Falls mehrere Untersektionen versuchen, ein Symbol gleichen Namens
7058in die gleiche Obersektion zu exportieren, meckert AS "uber doppelt
7059definierte Symbole, was an sich ja korrekt ist.  War das gewollt,
7060so mu"s man die Symbole in irgendeiner Weise ,,qualifizieren'', damit
7061sie voneinander unterschieden werden k"onnen.  Dies ist mit der
7062\tty{GLOBAL}-Anweisung m"oglich.  Die Syntax von \tty{GLOBAL} ist
7063der von \tty{PUBLIC} identisch, das Symbol bleibt aber lokal, anstatt
7064einer h"oheren Sektion zugeordnet zu werden.  Stattdessen wird ein
7065weiteres Symbol gleichen Werts erzeugt, dem jedoch der Untersektionsname
7066mit einem Unterstrich vorangestellt wird, und nur dieses Symbol wird der
7067Sektionsangabe entsprechend "offentlich gemacht.  Definieren z.B. zwei
7068Sektionen \tty{A} und \tty{B} ein Symbol \tty{SYM} und exportieren
7069es mit  \tty{GLOBAL} zu ihrer Vatersektion, so werden dort die Symbole
7070unter den Namen \tty{A\_SYM} und \tty{B\_SYM} eingeordnet.
7071\par
7072Falls zwischen Quell- und Zielsektion mehrere Stufen stehen sollten,
7073so wird entsprechend der komplette Namenszweig von der Ziel- bis zur
7074Quellsektion dem Symbolnamen vorangestellt.
7075
7076%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7077
7078\subsection{FORWARD}
7079
7080So sch"on das bisher besprochene Modell ist, ein bei Pascal nicht
7081auftauchendes Detail macht "Arger: die bei Assembler m"oglichen
7082Vorw"artsreferenzen.  Bei Vorw"artsreferenzen kann es sein, da"s AS
7083im ersten Pass auf ein Symbol einer h"oheren Sektion zugreift.  Dies
7084ist an sich nicht weiter tragisch, solange im zweiten Pass das richtige
7085Symbol genommen wird, es k"onnen aber Unf"alle der folgenden Art passieren:
7086\begin{verbatim}
7087loop:   .
7088        <Code>
7089        ..
7090        SECTION sub
7091        ..              ; ***
7092        bra.s   loop
7093        ..
7094loop:   ..
7095        ENDSECTION
7096        ..
7097        jmp     loop    ; Hauptschleife
7098\end{verbatim}
7099AS wird im ersten Pass das globale Label \tty{loop} verwenden, sofern
7100das Programmst"uck bei \tty{$<$Code$>$} hinreichend lang ist, wird er
7101sich "uber eine zu gro"se Sprungdistanz beklagen und den zweiten Pass erst
7102gar nicht versuchen.  Um die Uneindeutigkeit zu vermeiden, kann man den
7103Symbolnamen mit einem expliziten Bezug versehen:
7104\begin{verbatim}
7105        bra.s   loop[sub]
7106\end{verbatim}
7107Falls ein lokales Symbol h"aufig referenziert wird, k"onnen die vielen
7108Klammern mit dem \tty{FORWARD}-Befehl eingespart werden.  Das Symbol
7109wird damit explizit als lokal angek"undigt.  AS wird dann bei Zugriffen
7110auf dieses Symbol automatisch nur im lokalen Symbolbereich suchen.
7111In diesem Falle m"u"ste an der mit \tty{***} gekennzeichneten Stelle
7112daf"ur der Befehl
7113\begin{verbatim}
7114        FORWARD loop
7115\end{verbatim}
7116stehen.
7117Damit \tty{FORWARD} Sinn macht, mu"s es nicht nur vor der Definition des
7118Symbols, sondern vor seiner ersten Benutzung in der Sektion gegeben werden.
7119Ein Symbol gleichzeitig privat und "offentlich zu definieren, ergibt keinen
7120Sinn und wird von AS auch angemahnt.
7121
7122%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7123
7124\subsection{Geschwindigkeitsaspekte}
7125
7126Die mehrstufige Suche in der Symboltabelle und die Entscheidung, mit welchem
7127Attribut ein Symbol eingetragen werden soll, kosten naturgem"a"s etwas
7128Rechenzeit.  Ein 1800 Zeilen langes 8086-Programm z.B. wurde nach der
7129Umstellung auf Sektionen statt in 33 in 34,5 Sekunden assembliert
7130(80386 SX, 16MHz, 3 Durchg"ange).  Der Overhead h"alt sich also in Grenzen:
7131Ob man ihn in Kauf nehmen will, ist (wie am Anfang erw"ahnt) eine Frage des
7132Geschmacks;  man kann AS genauso gut ohne Sektionen verwenden.
7133
7134%%---------------------------------------------------------------------------
7135
7136\section{Diverses}
7137
7138%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7139
7140\subsection{SHARED}
7141\label{ChapShareOrder} \ttindex{SHARED}
7142
7143{\em G"ultigkeit: alle Prozessoren}
7144
7145Mit diesem Befehl weist man den AS an, die in der Parameterliste
7146angegebenen Symbole (egal ob Integer, Gleitkomma oder String) im
7147Sharefile mit ihren Werten abzulegen.  Ob eine solche Datei "uberhaupt
7148und in welchem Format erzeugt wird, h"angt von den in
7149\ref{SectCallConvention} beschriebenen Kommandozeilenschaltern ab.
7150Findet AS diesen Befehl und es wird keine Datei erzeugt, f"uhrt das zu
7151einer Warnung.
7152\par
7153\bb{VORSICHT!} Ein eventuell der Befehlszeile anh"angender Kommentar
7154wird  in die erste, ausgegebene Zeile mit "ubertragen (sofern die
7155Argumentliste von \tty{SHARED} leer ist, wird nur der Kommentar ausgegeben).
7156Falls die Share-Datei f"ur C oder Pascal erzeugt wird, sind einen
7157C/Pascal-Kommentar schlie"sende Zeichenfolgen (\verb!*/! bzw.
7158\verb!*)!) im Kommentar zu vermeiden.  AS pr"uft dies \ii{nicht}!
7159
7160%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7161
7162\subsection{INCLUDE}
7163\ttindex{INCLUDE}\label{SectInclude}
7164
7165{\em G"ultigkeit: alle Prozessoren}
7166
7167Dieser Befehl f"ugt die im Parameter angegebene Datei (die optional in
7168G"an\-se\-f"u"s\-chen eingeschlossen sein darf) so im Text ein, als ob sie dort
7169stehen w"urde.  Dieser Befehl ist sinnvoll, um Quelldateien aufzuspalten,
7170die alleine nicht in den Speicher passen w"urden oder um sich ''Toolboxen''
7171zu erzeugen.
7172\par
7173Falls der angegebene Dateiname keine Endung hat, wird er automatisch
7174um die Endung \tty{INC} erweitert.
7175\par
7176Der Assembler versucht als erstes, die angegebene Datei in den Verzeichnis
7177zu finden, in dem sich auch die Quelldatei befindet, die das \tty{INCLUDE}-Statement
7178enth"alt - ein eventuell in der Dateiangabe enthaltener Pfad ist also relativ
7179zu deren Pfad, und nicht zu dem Verzeichnis, von dem aus man den Assembler
7180aufgerufen hat.  Mit der Kommandozeilenoption
7181\begin{verbatim}
7182   -i <Pfadliste>
7183\end{verbatim}
7184l"a"st sich eine Liste von Verzeichnissen angeben, in denen automatisch
7185zus"atzlich nach der Include-Datei gesucht werden soll.  Wird die Datei
7186nicht gefunden, so ist dies ein \ii{fataler} Fehler, d.h. der Assembler
7187bricht sofort ab.
7188\par
7189Aus Kompatibilit"atsgr"unden ist es erlaubt, den Namen in G"ansef"u"schen
7190zu schreiben,
7191\begin{verbatim}
7192        INCLUDE stddef51
7193\end{verbatim}
7194und
7195\begin{verbatim}
7196        INCLUDE "stddef51.inc"
7197\end{verbatim}
7198sind also "aquivalent.  \bb{ACHTUNG!} Wegen dieser Wahlfreiheit ist
7199hier nur eine Stringkonstante, aber kein Stringausdruck zul"assig!
7200\par
7201Sollte der Dateiname eine Pfadangabe enthalten, so wird die Suchliste
7202ignoriert.
7203
7204%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7205
7206\subsection{BINCLUDE}
7207\ttindex{BINCLUDE}
7208
7209{\em G"ultigkeit: alle Prozessoren}
7210
7211\tty{BINCLUDE} dient dazu, in den von AS erzeugten Code Bin"ardaten
7212einzubetten, die von einem anderen Programm erzeugt wurden (das kann
7213nat"urlich theoretisch auch von AS selber erzeugter Code sein...).
7214\tty{BINCLUDE} hat drei Formen:
7215\begin{verbatim}
7216   BINCLUDE <Datei>
7217\end{verbatim}
7218In dieser Form wird die Datei komplett eingebunden.
7219\begin{verbatim}
7220   BINCLUDE <Datei>,<Offset>
7221\end{verbatim}
7222In dieser Form wird der Inhalt der Datei ab \verb!<Offset>! bis zum Ende
7223der Datei eingebunden.
7224\begin{verbatim}
7225   BINCLUDE <Datei>,<Offset>,<Len>
7226\end{verbatim}
7227In dieser Form werden \verb!<Len>! Bytes ab Offset \verb!<Offset>! eingebunden.
7228\par
7229Es gelten die gleichen Regeln bez"uglich Suchpfaden wie bei \tty{INCLUDE}.
7230
7231%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7232
7233\subsection{MESSAGE, WARNING, ERROR und FATAL}
7234\ttindex{MESSAGE}\ttindex{WARNING}\ttindex{ERROR}\ttindex{FATAL}
7235
7236{\em G"ultigkeit: alle Prozessoren}
7237
7238Der Assembler pr"uft zwar die Quelltexte so streng wie m"oglich und
7239liefert diffenzierte Fehlermeldungen, je nach Anwendung kann es
7240aber sinnvoll sein, unter bestimmten Bedingungen zus"atzliche
7241Fehlermeldungen auszul"osen, mit denen sich logische Fehler automatisch
7242pr"ufen lassen.  Der Assembler unterscheidet drei Typen von Fehlermeldungen,
7243die "uber die drei Befehle auch dem Programmierer zug"anglich sind:
7244\begin{itemize}
7245\item{\tty{WARNING}: Fehler, die auf m"oglicherweise falschen oder
7246      ineffizienten Code hinweisen.  Die Assemblierung l"auft weiter,
7247      eine Codedatei wird erzeugt.}
7248\item{\tty{ERROR}: echte Fehler im Programm.  Die Assemblierung l"auft weiter,
7249      um m"ogliche weitere Fehler in einem Durchgang entdecken und
7250      korrigieren zu k"onnen.  Eine Codedatei wird nicht erzeugt.}
7251\item{\tty{FATAL}: schwerwiegende Fehler, die einen sofortigen Abbruch des
7252      Assemblers bedingen.  Eine Codedatei kann m"oglicherweise entstehen,
7253      ist aber unvollst"andig.}
7254\end{itemize}
7255Allen drei Befehlen ist das Format gemeinsam, in dem die Fehlermeldung
7256angegeben werden mu"s: Ein beliebig (berechneter?!) Stringausdruck, der
7257damit sowohl eine Konstante als auch variabel sein darf.
7258\par
7259Diese Anweisungen ergeben nur in Zusammenhang mit bedingter Assemblierung
7260Sinn.  Ist f"ur ein Programm z.B. nur ein begrenzter Adre"sraum vorhanden,
7261so kann man den "Uberlauf folgenderma"sen testen:
7262\begin{verbatim}
7263ROMSize equ     8000h   ; 27256-EPROM
7264
7265ProgStart: ..
7266        <das eigentliche Programm>
7267           ..
7268ProgEnd:
7269        if      ProgEnd-ProgStart>ROMSize
7270         error   "\aDas Programm ist zu lang!"
7271        endif
7272\end{verbatim}
7273Neben diesen fehlererzeugenden Befehlen gibt es noch den Befehl
7274\tty{MESSAGE}, der einfach nur eine Meldung auf der Konsole bzw. im
7275Listing erzeugt.  Seine Benutzung ist den anderen drei Befehlen
7276gleich.
7277
7278%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7279
7280\subsection{READ}
7281\ttindex{READ}
7282
7283{\em G"ultigkeit: alle Prozessoren}
7284
7285\tty{READ} ist sozusagen das Gegenst"uck zu der vorigen Befehlsgruppe: mit
7286ihm ist es m"oglich, \ii{w"ahrend} der Assemblierung Werte von der
7287Tastatur einzulesen.  Wozu das gut sein soll?  Um das darzulegen, soll
7288hier ausnahmsweise einmal das Beispiel vor die genauere Erl"auterung
7289gezogen werden:
7290\par
7291Ein Programm ben"otigt zum Datentransfer einen Puffer mit einer zur
7292"Ubersetzungszeit festzulegenden Gr"o"se.  Um die Gr"o"se des Puffers
7293festzulegen, k"onnte man sie einmal mit \tty{EQU} in einem Symbol
7294ablegen, es geht aber auch interaktiv mit \tty{READ} :
7295\begin{verbatim}
7296        IF      MomPass=1
7297         READ    "Puffer (Bytes)",BufferSize
7298        ENDIF
7299\end{verbatim}
7300Auf diese Weise k"onnen Programme sich w"ahrend der "Ubersetzung
7301interaktiv konfigurieren, man kann sein Programm z.B. jemandem geben,
7302der es mit seinen Parametern "ubersetzen kann, ohne im Quellcode
7303,,herumstochern'' zu m"ussen.  Die im Beispiel gezeigte \tty{IF-}
7304Abfrage sollte "ubrigens immer verwendet werden, damit der Anwender
7305nur einmal mit der Abfrage bel"astigt wird.
7306\par
7307\tty{READ} "ahnelt sehr stark dem \tty{SET-} Befehl, nur da"s der
7308dem Symbol zuzuweisende Wert nicht rechts vom Schl"usselwort steht,
7309sondern von der Tastatur eingelesen wird.  Dies bedeutet z.B. auch,
7310da"s AS anhand der Eingabe automatisch festlegt, ob es sich um eine
7311Integer- oder Gleitkommazahl oder einen String handelt und anstelle
7312einzelner Konstanten auch ganze Formelausdr"ucke eingegeben werden
7313k"onnen.
7314\par
7315\tty{READ} darf entweder nur einen Parameter oder zwei Parameter
7316haben, denn die Meldung zur Eingabeaufforderung ist optional.  Fehlt
7317sie, so gibt AS eine aus dem Symbolnamen konstruierte Meldung aus.
7318
7319%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7320
7321\subsection{RELAXED}
7322\label{SectRELAXED}
7323\ttindex{RELAXED}
7324
7325{\em G"ultigkeit: alle Prozessoren}
7326
7327Defaultm"a"sig ist einer Prozessorfamilie eine bestimmte Schreibweise
7328von Integer-Konstanten zugeordnet (die i.a. der Herstellervorgabe
7329entspricht, solange der nicht eine allzu abgefahrene Syntax benutzt...).
7330Nun hat aber jeder seine pers"onlichen Vorlieben f"ur die eine oder
7331andere Schreibweise und kann gut damit leben, da"s sich seine Programme
7332nicht mehr mit dem Standard-Assembler "ubersetzen lassen. Setzt man ein
7333\begin{verbatim}
7334        RELAXED ON
7335\end{verbatim}
7336an den Programmanfang, so kann man fortan alle Schreibweisen beliebig
7337gemischt und durcheinander verwenden; bei jedem Ausdruck versucht AS
7338automatisch zu ermitteln, welche Schreibweise verwendet wurde.  Da"s
7339diese Automatik nicht immer das Ergebnis liefert, das man sich vorgestellt
7340hat, ist auch der Grund, weshalb diese Option explizit eingeschaltet
7341werden mu"s (und man sich davor h"uten sollte, sie einfach in einem
7342existierenden Programm dazuzusetzen): Ist nicht durch vor- oder
7343nachgestellte Zeichen zu erkennen, da"s es sich um Intel- oder
7344Motorola-Konstanten handelt, wird im C-Modus gearbeitet.  Eventuell
7345vorangestellte, eigentlich "uberfl"ussige Nullen haben in diesem Modus
7346durchaus eine Bedeutung:
7347\begin{verbatim}
7348        move.b  #08,d0
7349\end{verbatim}
7350Diese Konstante w"urde als Oktalkonstante verstanden werden, und weil
7351Oktalzahlen nur Ziffern von 0..7 enthalten k"onnen, f"uhrt das zu einem
7352Fehler.  Dabei h"atte man in diesem Fall noch Gl"uck gehabt, bei der
7353Zahl \tty{077} z.B. h"atte man ohne Meldung Probleme bekommen.  Ohne
7354\tty{RELAXED}-Modus w"are in beiden F"allen klar gewesen, da"s es sich
7355um dezimale Konstanten handelt.
7356\par
7357Die momentane Einstellung kann aus dem gleichnamigen Symbol ausgelesen
7358werden.
7359
7360%%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7361
7362\subsection{END}
7363\ttindex{END}
7364
7365{\em G"ultigkeit: alle Prozessoren}
7366
7367\tty{END} kennzeichnet das Ende des Assemblerprogrammes.  Danach
7368noch in der Quelldatei stehende Zeilen werden ignoriert.
7369\bb{WICHTIG:} \tty{END} darf zwar aus einem Makro heraus aufgerufen
7370werden, der Stapel der bedingten Assemblierung wird aber nicht
7371automatisch abger"aumt.  Das folgende Konstrukt f"uhrt daher zu
7372einer Fehlermeldung:
7373\begin{verbatim}
7374        IF      KeineLustMehr
7375         END
7376        ENDIF
7377\end{verbatim}
7378Optional darf \tty{END} auch einen Integer-Ausdruck als Argument haben,
7379der den Startpunkt des Programmes vermerkt.  Dieser wird von AS in einem
7380speziellen Record der Datei vermerkt und kann z.B. von P2HEX
7381weiterverarbeitet werden.
7382\par
7383\tty{END} war eigentlich schon immer in AS definiert, nur war es
7384bei fr"uheren Versionen von AS aus Kompatibilit"at zu anderen
7385Assemblern vorhanden und hatte keine Wirkung.
7386
7387%%===========================================================================
7388
7389\cleardoublepage
7390\chapter{Prozessorspezifische Hinweise}
7391
7392Ich habe mich bem"uht, die einzelnen Codegeneratoren m"oglichst kompatibel
7393zu den Originalassemblern zu halten, jedoch nur soweit, wie es keinen
7394unvertretbaren Mehraufwand bedeutete.  Wichtige Unterschiede, Details und
7395Fallstricke habe ich im folgenden aufgelistet.
7396
7397%%---------------------------------------------------------------------------
7398
7399\section{6811}
7400
7401,,Wo gibt es denn das zu kaufen, den HC11 in NMOS?'', fragt jetzt vielleicht
7402der eine oder andere.  Gibt es nat"urlich nicht, aber ein H l"a"st sich nun
7403einmal nicht in einer Hexzahl darstellen ("altere Versionen von AS h"atten
7404solche Namen deswegen nicht akzeptiert), und dann habe ich die Buchstaben
7405gleich ganz weggelassen...
7406\par
7407\begin{quote}{\it
7408,,Jemand, der sagt, etwas sei unm"oglich,sollte wenigstens so kooperativ
7409sein, denjenigen, der es gerade tut, nicht am Arbeiten zu hindern.''
7410}\end{quote}
7411Ab und zu ist man gezwungen, seine Meinung zu revidieren.  Vor einigen
7412Versionen hatte ich an dieser Stelle noch behauptet, ich k"onne es im Parser
7413von AS nicht realisieren, da"s man die Argumente von \tty{BSET/BCLR} bzw.
7414\tty{BRSET/BRCLR} auch mit Leerzeichen trennen kann.  Offensichtlich kann
7415selbiger aber mehr, als ich vermutet habe...nach der soundsovielten Anfrage
7416habe ich mich noch einmal drangesetzt, und jetzt scheint es zu laufen.  Man
7417darf sowohl Leerzeichen als auch Kommas verwenden, aber nicht in allen
7418Varianten, um es nicht uneindeutig zu machen:  Es gibt zu jeder
7419Befehlsvariante zwei M"oglichkeiten; eine, die nur Kommas verwendet, sowie
7420eine, wie sie von Motorola wohl definiert wurde (leider sind die Datenb"ucher
7421nicht immer so gut wie die zugeh"orige Hardware...):
7422\begin{verbatim}
7423   Bxxx  abs8 #mask         entspricht    Bxxx  abs8,#mask
7424   Bxxx  disp8,X #mask      entspricht    Bxxx  disp8,X,#mask
7425   BRxxx abs8 #mask adr     entspricht    BRxxx abs8,#mask,adr
7426   BRxxx disp8,X #mask adr  entspricht    BRxxx disp8,X,#mask,adr
7427\end{verbatim}
7428Dabei steht \tty{xxx} entweder f"ur \tty{SET} oder \tty{CLR} und \tty{\#mask}
7429f"ur die zu verwendende Bitmaske; der Lattenzaun ist dabei optional.
7430Anstelle des X-Registers darf nat"urlich auch Y verwendet werden.
7431
7432Mit der K4-Version des HC11 hat Motorola ein Banking-Schema eingef"uhrt,
7433mit dem man zwar einerseits eine zu klein gewordene Architektur noch
7434einmal aufbohren kann, den Software- und Tool-Entwicklern aber nicht
7435unbedingt das Leben einfacher macht...wie stellt man so etwas vern"unftig
7436dar?
7437
7438Die K4-Architektur {\em erweitert} den Adre"sraum des HC11 um 2x512 Kbyte,
7439so da"s jetzt insgesamt 64+1024=1088 Kbyte zur Verf"ugung stehen.  AS tut
7440so, als ob es sich dabei um einen Adre"sraum handeln w"urde, der
7441folgenderma"sen organisiert ist:
7442\begin{itemize}
7443\item{\$000000...\$00ffff: der alte HC11-Adre"sraum}
7444\item{\$010000...\$08ffff: Fenster 1}
7445\item{\$090000...\$10ffff: Fenster 2}
7446\end{itemize}
7447"Uber den {\tt ASSUME}-Befehl teilt man AS mit, wie die Banking-Register
7448eingestellt sind und damit, wie und wo die erweiterten Bereiche
7449eingeblendet werden.  Bei absoluten Adressierungen mit Adressen jenseits
7450\$10000 berechnet AS dann automatisch, welche Adresse innerhalb der ersten
745164K anzusprechen ist.  Das kann nat"urlich wieder nur f"ur direkte
7452Adressierungsarten funktionieren, bei indizierten/indirekten
7453Adre"ausdr"ucken ist der Programmierer daf"ur verantwortlich, "uber die
7454momentan aktiven Banks den "Uberblick zu behalten!
7455
7456Wer sich nicht ganz sicher ist, ob die momentane Einstellung korrekt ist,
7457kann den Pseudobefehl {\tt PRWINS} benutzen, der dann z.B.
7458\begin{verbatim}
7459MMSIZ e1 MMWBR 84 MM1CR 00 MM2CR 80
7460Window 1: 10000...12000 --> 4000...6000
7461Window 1: 90000...94000 --> 8000...c000
7462\end{verbatim}
7463ausgibt.  Ein z.B. an Stelle \$10000 liegender Befehl
7464\begin{verbatim}
7465        jmp     *+3
7466\end{verbatim}
7467w"urde effektiv einen Sprung auf Adresse \$4003 ausl"osen.
7468
7469%%---------------------------------------------------------------------------
7470
7471\section{PowerPC}
7472
7473Sicher hat es ein bi"schen den Anflug einer Schnapsidee, einen Prozessor,
7474der eher f"ur den Einsatz in Workstations konzipiert wurde, in AS
7475einzubauen, der sich ja eher an Programmierer von Einplatinencomputern
7476wendet.  Aber was heute noch das Hei"seste vom Hei"sen ist, ist es morgen
7477schon nicht mehr, und sowohl der Z80 als auch der 8088 haben ja inzwischen
7478die Mutation von der Personal Computer-CPU zum sog. ,,Mikrocontroller''
7479vollzogen.  Mit dem Erscheinen von MPC505 und PPC403 hat sich die Vermutung
7480dann auch best"atigt, da"s IBM und Motorola diese Prozessorserie auf allen
7481Ebenen durchdr"ucken wollen.
7482\par
7483Die Unterst"utzung ist momentan noch nicht vollst"andig: Als Pseudobefehle
7484zur Datenablage werden momentan provisorisch die Intel-Mnemonics
7485unterst"utzt und es fehlen die etwas ungew"ohnlicheren, in \cite{Mot601}
7486genannten RS6000-Befehle (die aber hoffentlich keiner vermi"st...).  Das
7487wird aber nachgeholt, sobald Informationen verf"ugbar sind!
7488
7489%%---------------------------------------------------------------------------
7490
7491\section{DSP56xxx}
7492
7493Motorola, was ist nur in Dich gefahren!  Wer bei Dir ist nur auf das
7494schmale Brett gekommen, die einzelnen parallelen Datentransfers
7495ausgerechnet durch Leerzeichen zu trennen!  Wer immer nun seine Codes
7496etwas "ubersichtlicher formatieren will, z.B. so:
7497\begin{verbatim}
7498        move    x:var9 ,r0
7499        move    y:var10,r3   ,
7500\end{verbatim}
7501der ist gekniffen, weil das Leerzeichen als Trennung paralleler
7502Datentransfers erkannt wird!
7503\par
7504Sei's drum; Motorola hat es so definiert, und ich kann es nicht
7505"andern.  Als Trennung der Operationen sind statt Leerzeichen auch
7506Tabulatoren zugelassen, und die einzelnen Teile sind ja wieder ganz
7507normal mit Kommas getrennt.
7508\par
7509In \cite{Mot56} steht, da"s bei den Befehlen \tty{MOVEC, MOVEM, ANDI} und
7510\tty{ORI} auch die allgemeineren Mnemonics \tty{MOVE, AND} und \tty{OR}
7511verwendet werden k"onnen.  Bei AS geht das (noch) nicht.
7512
7513%%---------------------------------------------------------------------------
7514
7515\section{H8/300}
7516
7517Bei der Assemblersyntax dieser Prozessoren hat Hitachi reichlich
7518bei Motorola abgekupfert (was so verkehrt ja nun auch nicht war...),
7519nur leider wollte die Firma unbedingt ihr eigenes Format f"ur
7520Hexadezimalzahlen einf"uhren, und dazu noch eines, das "ahnlich wie
7521bei Microchip Hochkommas verwendet.  Das konnte (und wollte) ich bei
7522AS nicht nachvollziehen, bei dem Hochkommas zur Einrahmung von
7523ASCII-Sequenzen benutzt werden.  Anstelledessen werden Zahlen in der
7524"ublichen Motorola-Syntax geschrieben, d.h. mit einem Dollarzeichen.
7525
7526%%---------------------------------------------------------------------------
7527
7528\section{SH7000/7600/7700}
7529
7530Leider hat Hitachi auch hier wieder das Extrawurst-Format f"ur
7531Hexadezimalzahlen verwendet, und wieder habe ich in AS das nicht
7532nachvollzogen...bitte Motorola-Syntax benutzen!
7533\par
7534Bei der Verwendung von Literalen und dem \tty{LTORG}-Befehl sind
7535einige Details zu beachten, wenn man nicht auf einmal mit eigenartigen
7536Fehlermeldungen konfrontiert werden will:
7537\par
7538Literale existieren, weil der Prozessor nicht in der Lage ist, Konstanten
7539au"serhalb des Bereiches von -128 bis 127 mit immediate-Adressierung
7540zu laden.  AS (und der Hitachi-Assembler) verstecken diese Unzul"anglichkeit,
7541indem sie automatisch entsprechende Konstanten im Speicher ablegen, die
7542dann mittels PC-relativer Adressierung angesprochen werden.  Die Frage, die
7543sich nun erhebt, ist die, wo diese Konstanten im Speicher abgelegt werden
7544sollen.  AS legt sie nicht sofort ab, sondern sammelt sie so lange
7545auf, bis im Programm eine \tty{LTORG}-Anweisung auftritt.  Dort werden
7546alle Konstanten abgelegt, wobei deren Adressen mit ganz normalen
7547Labels versehen werden, die man auch in der Symboltabelle sehen kann.
7548Ein Label hat die Form
7549\begin{verbatim}
7550   LITERAL_s_xxxx_n   .
7551\end{verbatim}
7552Dabei repr"asentiert \tty{s} den Typ des Literals.  Unterschieden werden
7553Literale, die 16-Bit-Konstanten (\tty{s=W}), 32-Bit-Konstanten (\tty{s=L})
7554oder Vorw"artsreferenzen, bei denen AS die Operandengr"o"se nicht
7555im voraus erkennen kann (\tty{s=F}), enthalten.  F"ur \tty{W} oder \tty{L}
7556bedeutet \tty{xxxx} den hexadezimal geschriebenen Wert der Konstante, bei
7557Vorw"artsreferenzen, bei denen man den Literalwert ja noch nicht kennt,
7558bezeichnet \tty{xxxx} eine einfache Durchnumerierung. \tty{n} kennzeichnet
7559das wievielte Auftreten dieses Literals in dieser Sektion.  Literale machen
7560ganz normal die Lokalisierung durch Sektionen mit, es ist daher zwingend
7561erforderlich, in einer Sektion entstandene Literale mit \tty{LTORG} auch
7562dort abzulegen!
7563\par
7564Die Durchnumerierung mit \tty{n} ist erforderlich, weil ein Literal in
7565einer Sektion mehrfach auftreten kann.  Dies ist einmal bedingt dadurch,
7566da"s die PC-relative Adressierung nur positive Displacements erlaubt,
7567einmal mit \tty{LTORG} abgelegte Literale also im folgenden Code nicht
7568mitbenutzt werden k"onnen, andererseits auch, weil die Reichweite der
7569Displacements beschr"ankt ist (512 bzw. 1024 Byte).
7570Ein automatisches \tty{LTORG} am Ende des Programmes oder beim Umschalten
7571zu einer anderen CPU erfolgt nicht; findet AS in einer solchen Situation
7572noch abzulegende Literale, so wird eine Fehlermeldung ausgegeben.
7573\par
7574Da bei der PC-relativen Adressierung der zur Adressierung herangezogene
7575PC-Wert der Instruktionsadresse+4 entspricht, ist es nicht m"oglich, ein
7576Literal zu benutzen, welches direkt hinter dem betroffenen Befehl abgelegt
7577wird, also z.B. so:
7578\begin{verbatim}
7579        mov     #$1234,r6
7580        ltorg
7581\end{verbatim}
7582Da der Prozessor dann aber sowieso versuchen w"urde, Daten als Code
7583auszuf"uhren, sollte diese Situation in realen Programmen nicht auftreten.
7584Wesentlich realer ist aber ein anderer Fallstrick:  Wird hinter einem
7585verz"ogerten Sprung PC-relativ zugegriffen, so ist der Programmz"ahler
7586bereits auf die Sprungzieladresse gesetzt, und das Displacement wird
7587relativ zum Sprungziel+2 berechnet.  Im folgenden Beispiel kann daher
7588das Literal nicht erreicht werden:
7589\begin{verbatim}
7590        bra     Target
7591        mov	#$12345678,r4        ; wird noch ausgefuehrt
7592        .
7593        .
7594        ltorg                        ; hier liegt das Literal
7595        .
7596        .
7597Target: mov     r4,r7                ; hier geht es weiter
7598\end{verbatim}
7599Da Target+2 hinter dem Literal liegt, w"urde sich ein negatives
7600Displacement ergeben.  Besonders haarig wird es, wenn mit den
7601Befehlen \tty{JMP, JSR, BRAF} oder \tty{BSRF} verzweigt wird:  Da AS die
7602Zieladresse hier nicht ermitteln kann (sie ergibt sich erst zur
7603Laufzeit aus dem Registerinhalt), nimmt AS hier eine Adresse an,
7604die nach M"oglichkeit nie pa"st, so da"s PC-relative Adressierung g"anzlich
7605unm"oglich wird.
7606\par
7607Es ist nicht direkt m"oglich, aus der Zahl und Gr"o"se der Literale
7608auf den belegten Speicher zu schlie"sen.  U.u. mu"s AS ein F"ullwort
7609einbauen, um einen Langwort-Wert auf eine durch 4 teilbare Adresse
7610auszurichten, andererseits kann er m"oglicherweise Teile eines
761132-bittigen Literals f"ur 16-Bit-Literale mitbenutzten.  Mehrfach
7612auftretende Literale erzeugen nat"urlich nur einen Eintrag.  Solche
7613Optimierungen werden f"ur Vorw"artsreferenzen allerdings ganz
7614unterdr"uckt, da AS den Wert dieser Literale noch nicht kennt.
7615\par
7616Da Literale die PC-relative Adressierung ausnutzen, die nur beim
7617\tty{MOV}-Befehl erlaubt sind, beschr"anken sich Literale ebenfalls auf
7618die Verwendung in \tty{MOV}.  Etwas trickreich ist hier die Art und Weise,
7619in der AS die Operandengr"o"se auswertet.  Eine Angabe von Byte oder
7620Wort bedeutet, da"s AS einen m"oglichst kurzen \tty{MOV}-Befehl erzeugt,
7621der den angegebenen Wert in den unteren 8 oder 16 Bit erzeugt, d.h.
7622die oberen 24 oder 16 Bit werden als don't care behandelt.  Gibt
7623man dagegen Langwort oder gar nichts an, so sagt dies aus, da"s
7624das komplette 32-Bit-Register den angegebenen Wert enthalten soll.
7625Das hat z.B. den Effekt, da"s in folgendem Beispiel
7626\begin{verbatim}
7627        mov.b   #$c0,r0
7628        mov.w   #$c0,r0
7629        mov.l   #$c0,r0
7630\end{verbatim}
7631der erste Befehl echte immediate-Adressierung erzeugt, der zweite und
7632dritte jedoch ein Wort-Literal benutzen: Da das Bit 7 in der Zahl gesetzt
7633ist, erzeugt der Byte-Befehl effektiv \$FFFFFFC0 im Register, was nach
7634der Konvention nicht das w"are, was man im zweiten und dritten Fall haben
7635m"ochte.  Im dritten Fall reicht auch ein Wort-Literal, weil das gel"oschte
7636Bit 15 des Operanden vom Prozessor in Bit 16..31 fortgesetzt wird.
7637\par
7638Wie man sieht, ist dieses ganze Literal-Konzept reichlich kompliziert;
7639einfacher ging's aber wirklich nicht.  Es liegt leider in der Natur
7640der Sache, da"s man manchmal Fehlermeldungen "uber nicht gefundene
7641Literale bekommt, die eigentlich logisch nicht auftreten k"onnten, weil
7642AS die Literale ja komplett in eigener Regie verwaltet.  Treten aber bei
7643der Assemblierung Fehler erst im zweiten Pass auf, so verschieben sich
7644z.B. hinter der Fehlerstelle liegende Labels gegen"uber dem ersten Pass,
7645weil AS f"ur die jetzt als fehlerhaft erkannten Befehle keinen Code mehr
7646erzeugt.  Da aber Literalnamen u.a. aus den Werten von Symbolen erzeugt
7647werden, werden als Folgefehler davon eventuell andere Literalnamen
7648nachgefragt, als im ersten Pass abgelegt wurden und AS beschwert sich
7649"uber nicht gefundene Symbole...sollten also neben anderen Fehlern solche
7650Literal-Fehler auftreten, beseitigen Sie erst die anderen Fehler, bevor
7651Sie mich und alle Literale verfluchen...
7652\par
7653Wer aus der Motorola-Ecke kommt und PC-relative Adressierung explizit
7654benutzen will (z.B. um Variablen lageunabh"angig zu erreichen), sollte
7655wissen, da"s beim Ausschreiben der Adressierung nach Programmierhandbuch,
7656also z.B. so:
7657\begin{verbatim}
7658        mov.l   @(Var,PC),r8
7659\end{verbatim}
7660{\it keine} implizite Umrechnung der Adresse auf ein Displacement erfolgt,
7661d.h. der Operand wird so eingesetzt, wie er ist (und w"urde in diesen
7662Beispiel wohl mit hoher Wahrscheinlichkeit eine Fehlermeldung
7663hervorrufen...).  Will man beim SH7x00 PC-relativ adressieren, so tut man
7664das einfach mit ,,absoluter'' Adressierung, die auf Maschinenebene ja
7665gar nicht existiert:
7666\begin{verbatim}
7667        mov.l   Var,r8
7668\end{verbatim}
7669Hier wird das Displacement korrekt berechnet (es gelten nat"urlich die
7670gleichen Einschr"ankungen f"ur das Displacement wie bei Literalen).
7671
7672%%---------------------------------------------------------------------------
7673
7674\section{HMCS400}
7675
7676Beim Befehlssatz dieser 4-Bit-Prozessoren f"uhlte ich mich
7677spontan an den 8080/8085 erinnert - sehr viele Menemonics, die
7678Adressierungsart (z.B.  indirekt oder direkt) ist in den Befehl
7679einkodiert, die Befehle sind zum Teil nur schwer zu merken.
7680Nat"urlich unterst"utzt AS diese Syntax, wie Hitachi sie
7681seinerzeit definiert hat, ich habe aber zus"atzlich f"ur die
7682meisten Befehle eine - finde ich - sch"onere und besser lesbare
7683Variante implementiert, so wie Zilog es seinerzeit mit den Z80
7684gemacht hat.  Zum Beispiel k"onnen alle Maschineninstruktionen,
7685die in irgendeiner Form Daten transferieren, egal ob die
7686Operanden Register, Konstanten oder Speicherstellen sind, "uber den
7687AS-spezifischen \tty{LD}-Befehl angesprochen werden.  "Ahnliche
7688'Meta-Befehle' gibt es f"ur arithmetische und logische Befehle.
7689Eine vollst"andige Liste aller Meta-Befehle und ihrer Operanden
7690findet sich in den Tabellen \ref{TabHMCS400Meta} und
7691\ref{TabHMCS400MetaOps}, ihre praktische Verwendung kann man sich
7692in der Datei \tty{t\_hmcs4x.asm} ansehen.
7693
7694\begin{table*}
7695\begin{center}\begin{tabular}{|l|l|}
7696\hline
7697Meta-Instruktion          & Ersetzt \\
7698\hline
7699\tty{LD} {\em src, dest}        & \tty{LAI, LBI, LMID, LMIIY,} \\
7700                                & \tty{LAB, LBA, LAY, LASPX, LASPY, LAMR,} \\
7701                                & \tty{LWI, LXI, LYI, LXA, LYA, LAM, LAMD} \\
7702                                & \tty{LBM, LMA, LMAD, LMAIY, LMADY} \\
7703\tty{XCH} {\em src, dest}       & \tty{XMRA, XSPX, XSPY, XMA, XMAD, XMB} \\
7704\tty{ADD} {\em src, dest}       & \tty{AYY, AI, AM, AMD} \\
7705\tty{ADC} {\em src, dest}       & \tty{AMC, AMCD} \\
7706\tty{SUB} {\em src, dest}       & \tty{SYY} \\
7707\tty{SBC} {\em src, dest}       & \tty{SMC, SMCD} \\
7708\tty{OR}  {\em src, dest}       & \tty{OR, ORM, ORMD} \\
7709\tty{AND} {\em src, dest}       & \tty{ANM, ANMD} \\
7710\tty{EOR} {\em src, dest}       & \tty{EORM, EORMD} \\
7711\tty{CP}  {\em cond, src, dest} & \tty{INEM, INEMD, ANEM, ANEMD, BNEM,} \\
7712                                & \tty{YNEI, ILEM, ILEMD, ALEM, ALEMD,} \\
7713                                & \tty{BLEM, ALEI} \\
7714\tty{BSET} {\em bit}            & \tty{SEC, SEM, SEMD} \\
7715\tty{BCLR} {\em bit}            & \tty{REC, REM, REMD} \\
7716\tty{BTST} {\em bit}            & \tty{TC, TM, TMD} \\
7717\hline
7718\end{tabular}\end{center}
7719\caption{Meta-Befehle HMCS400}
7720\label{TabHMCS400Meta}
7721\end{table*}
7722
7723\begin{table*}
7724\begin{center}\begin{tabular}{|l|l|}
7725\hline
7726Operand                 & Typen \\
7727\hline
7728{\em src, dest}         & \tty{A, B, X, Y, W, SPX, SPY} (Register) \\
7729                        & \tty{M} (Speicher adressiert durch X/Y/W) \\
7730                        & \tty{M+} (dito, mit Autoinkrement) \\
7731                        & \tty{M-} (dito, mit Autodekrement) \\
7732                        & \tty{\#val} (2/4 bit immediate) \\
7733                        & \tty{addr10} (Speicherzelle direkt) \\
7734                        & \tty{MRn} (Memory-Register 0..15) \\
7735{\em cond}              & \tty{NE} (ungleich) \\
7736                        & \tty{LE} (kleiner oder gleich) \\
7737{\em bit}               & \tty{CA} (Carry) \\
7738                        & {\em bitpos},\tty{M} \\
7739                        & {\em bitpos},\tty{addr10} \\
7740{\em bitpos}            & \tty{0..3} \\
7741\hline
7742\end{tabular}\end{center}
7743\caption{Operandentypen f"ur Meta-Befehle HMCS400}
7744\label{TabHMCS400MetaOps}
7745\end{table*}
7746
7747%%---------------------------------------------------------------------------
7748
7749\section{H16}
7750
7751Der Befehlssatz des H16-Kerns verdient mit Recht den Namen ,,CISC'': komplexe
7752Adressierungsarten, sehr variable Instruktionsl"angen, und f"ur viele
7753Befehle mit g"angigen Operanden gibt es Kurzschreibweisen.  So gibt
7754es f"ur diverse Befehle mehrere ,,Formate'', je nachdem welchen Typ Quell-
7755und Zieloperand haben.  Die generelle Regel ist, da"s AS immer
7756das k"urzestm"ogliche Format benutzt, es sei denn, es wurde explizit
7757angegeben:
7758\begin{verbatim}
7759       mov.l     r4,r7     ; benutzt R-Format
7760       mov.l     #4,r7     ; benutzt RQ-Format
7761       mov.l     #4,@r7    ; benutzt Q-Format
7762       mov.l     @r4,@r7   ; benutzt G-Format
7763       mov:q.l   #4,r7     ; Q- statt RQ-Format erzwungen
7764       mov:g.l   #4,r7     ; G- statt RQ-Format erzwungen
7765\end{verbatim}
7766F"ur Immediate-Argumente wird die ,,nat"urliche'' Operandenl"ange
7767benutzt, also z.B. 2 Bytes f"ur 16 Bits.  K"urzere oder l"angere
7768Argumente lassen sich durch eine angeh"angte Operandengr"o"se
7769(.b, .w, .l oder :8, :16, :32) erzwingen.  Bei Displacements oder
7770absoluten Adressen gilt jedoch, da"s ohne explizite L"angenangabe
7771immer die k"urzestm"ogliche Schreibweise benutzt wird.  Das schlie"st
7772ein, da"s bei absoluten Adressen die oberen acht Adre"sbits vom
7773Prozessor nicht herausgegeben werden: eine Adresse \$ffff80 kann also
7774mit einem Byte (\$80) kodiert werden.
7775
7776Des weiteren kennt AS das ''Akkumulator-Bit'', d.h. bei Instruktionen
7777mit zwei beliebigen Operanden kann der zweite Operand weggelassen
7778werden, falls das Ziel Register Null ist.  Dieses Verhalten kann
7779nicht "ubersteuert werden.
7780
7781Des weiteren werden folgende Optimierungen durchgef"uhrt:
7782\begin{itemize}
7783\item{\tty{MOV R0,<ea>} wird zu \tty{MOVF <ea>} optimiert, sofern
7784      \tty{<ea>} kein PC-relativer Ausdruck ist und sich die L"ange
7785      des Displacements "andern w"urde.  Diese Optimierung kann durch
7786      eine explizite Formatangabe unterdr"uckt werden.}
7787\item{\tty{SUB} existiert nicht im Q-Format, kann aber durch ein
7788      \tty{ADD:Q} mit negiertem immediate-Argument ersetzt werden,
7789      falls das Argument zu \tty{SUB} im Bereich -127...+128 liegt.
7790      Auch diese Optimierung kann durch eine explizite Formatangabe
7791      unterdr"uckt werden.}
7792\end{itemize}
7793
7794%%---------------------------------------------------------------------------
7795
7796\section{OLMS-40}
7797
7798"Ahnlich wie beim HMCS400 sind die Adressierungsarten zu einem
7799gro"sen Teil in die Mnemonics hineinkodiert, und ich habe mich
7800auch hier daf"ur entschieden, f"ur h"aufig genutzte Befehle eine
7801alternative, modernere und besser lesbare Notation
7802bereitzustellen.
7803Eine vollst"andige Liste aller Meta-Befehle und ihrer Operanden
7804findet sich in den Tabellen \ref{TabOLMS40Meta} und
7805\ref{TabOLMS40MetaOps}, ihre praktische Verwendung kann man sich
7806in der Datei \tty{t\_olms4.asm} ansehen.
7807
7808\begin{table*}
7809\begin{center}\begin{tabular}{|l|l|}
7810\hline
7811Meta-Instruktion          & Ersetzt \\
7812\hline
7813\tty{LD} {\em dest, src}        & \tty{LAI, LLI, LHI, L,} \\
7814                                & \tty{LAL, LLA, LAW, LAX, LAY, LAZ,} \\
7815                                & \tty{LWA, LXA, LYA, LPA, LTI, RTH, RTL} \\
7816\tty{DEC} {\em dest}            & \tty{DCA, DCL, DCM, DCW, DCX, DCY, DCZ, DCH} \\
7817\tty{INC} {\em dest}            & \tty{INA, INL, INM, INW, INX, INY, INZ} \\
7818\tty{BSET} {\em bit}            & \tty{SPB, SMB, SC} \\
7819\tty{BCLR} {\em bit}            & \tty{RPB, RMB, RC} \\
7820\tty{BTST} {\em bit}            & \tty{TAB, TMB, Tc} \\
7821\hline
7822\end{tabular}\end{center}
7823\caption{Meta-Befehle OLMS-40}
7824\label{TabOLMS40Meta}
7825\end{table*}
7826
7827\begin{table*}
7828\begin{center}\begin{tabular}{|l|l|}
7829\hline
7830Operand                 & Typen \\
7831\hline
7832{\em src, dest}         & \tty{A, W, X, Y, Z, DPL, DPH} (Register) \\
7833                        & \tty{T, TL, TH} (Timer, obere/untere H"alfte) \\
7834                        & \tty{(DP), M} (Speicher adressiert durch DPH/DPL) \\
7835                        & \tty{\#val} (4/8 bit immediate) \\
7836                        & \tty{PP} (Port-Pointer) \\
7837{\em bit}               & \tty{C} (Carry) \\
7838                        & \tty{(PP)},{\em bitpos} \\
7839                        & \tty{(DP)},{\em bitpos} \\
7840                        & \tty{(A)},{\em bitpos} \\
7841{\em bitpos}            & \tty{0..3} \\
7842\hline
7843\end{tabular}\end{center}
7844\caption{Operandentypen f"ur Meta-Befehle OLMS-40}
7845\label{TabOLMS40MetaOps}
7846\end{table*}
7847
7848%%---------------------------------------------------------------------------
7849
7850\section{OLMS-50}
7851
7852Der Datenspeicher dieser 4-Bit-Controller besteht aus bis zu 128
7853Nibbles.  F"ur die daf"ur ben"otigten sieben Adre"sbits war
7854jedoch nur in den wenigsten Instruktionen Platz, so da"s einmal
7855wieder Banking zur Adressierung herhalten mu"s.  Die meisten
7856Befehle, die Speicher adressieren, enthalten nur die untersten
7857vier Bits der RAM-Adresse, und sofern nicht die untersten 16
7858Nibbles angesprochen werden sollen, liefert das P-Register die
7859notwendigen obere Adre"sbits.  Dessen aktuellen Wert teilt man
7860dem Assembler "uber ein
7861\begin{verbatim}
7862   assume  p:<Wert>
7863\end{verbatim}
7864mit, z.B. direkt nach einem \tty{PAGE}-Befehl.
7865
7866Mit \tty{PAGE} ist auch ein anderes Thema angeschnitten: sowohl
7867\tty{PAGE} als auch \tty{SWITCH} sind auf diesen Controllern
7868Maschinenbefehle, d.h. haben nicht ihre von anderen Targets
7869"ubliche Funktion.  Der Pseudobefehl, um ein \tty{SWITCH/CASE}-
7870Konstrukt einzuleiten, lautet im OLMS-50-Modus \tty{SELECT}, und
7871die Seitengr"o"se des Listings legt man mit \tty{PAGESIZE} fest.
7872
7873%%---------------------------------------------------------------------------
7874
7875\section{MELPS-4500}
7876
7877Der Programmspeicher dieser Mikrokontroller ist in Seiten zu
7878128 Worten eingeteilt.  Diese Einteilung existiert eigentlich nur
7879deswegen, weil es Sprungbefehle gibt, deren Ziel innerhalb der
7880gleichen Seite liegen darf, und andererseits ,,lange'' Exemplare,
7881die den ganzen Adre"sbereich erreichen k"onnen.  Die Standard-Syntax
7882von Mitsubishi verlangt eigentlich, da"s Seite und Offset als getrennte
7883Argument geschrieben werden m"ussen.  Da das aber reichlich unpraktisch
7884ist (ansonsten hat man als Programmierer keine Veranlassung, sich um
7885Seiten zu k"ummern, mit der Ausnahme von indirekten Spr"ungen), erlaubt
7886es AS auch wahlweise, die Zieladresse linear zu schreiben, also z.B.
7887\begin{verbatim}
7888      bl        $1234
7889\end{verbatim}
7890anstelle
7891\begin{verbatim}
7892      bl        $24,$34  .
7893\end{verbatim}
7894
7895%%---------------------------------------------------------------------------
7896
7897\section{6502UNDOC}
7898
7899Da die undokumentierten Befehle des 6502 sich naturgem"a"s in keinem
7900Datenbuch finden, sollen sie an dieser Stelle kurz aufgelistet werden.
7901Die Verwendung erfolgt naturgem"a"s auf eigene Gefahr, da es keine
7902Gew"ahr gibt, da"s alle Maskenversionen alle Varianten unterst"utzen!
7903Bei den CMOS-Nachfolgern des 6502 funktionieren sie sowieso nicht
7904mehr, da diese die ensprechenden Bitkombinationen mit offiziellen Befehlen
7905belegen...
7906
7907%%TEMP
7908\clearpage
7909
7910Es bedeuten:
7911
7912\begin{tabbing}
7913\hspace{2cm} \= \kill \\
7914\&             \> bin"ares UND \\
7915|              \> bin"ares ODER \\
7916\verb!^!       \> bin"ares EXOR \\
7917$<<$           \> logischer Linksshift \\
7918$>>$           \> logischer Rechtsshift \\
7919$<<<$          \> Linksrotation \\
7920$>>>$          \> Rechtsrotation \\
7921$\leftarrow$   \> Zuweisung \\
7922(..)           \> Inhalt von .. \\
7923{..}           \> Bits .. \\
7924A              \> Akkumulator \\
7925X,Y            \> Indexregister X,Y \\
7926S              \> Stapelzeiger \\
7927An             \> Akkumulatorbit n \\
7928M              \> Operand \\
7929C              \> Carry \\
7930PCH            \> obere H"alfte Programmz"ahler \\
7931\end{tabbing}
7932
7933\begin{tabbing}
7934Adressierungsmodi \= : \= \kill \\
7935Anweisung         \> : \> \tty{JAM, KIL} oder \tty{CRS} \\
7936Funktion          \> : \> keine, Prozessor wird angehalten \\
7937Adressierungsmodi \> : \> implizit \\
7938\end{tabbing}
7939\begin{tabbing}
7940Adressierungsmodi \= : \= \kill \\
7941Anweisung         \> : \> \tty{SLO} \\
7942Funktion          \> : \> $M\leftarrow((M)<<1)|(A)$ \\
7943Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
7944                  \>   \> Y-indiziert lang, X/Y-indirekt \\
7945\end{tabbing}
7946\begin{tabbing}
7947Adressierungsmodi \= : \= \kill \\
7948Anweisung         \> : \> \tty{ANC} \\
7949Funktion          \> : \> $A\leftarrow(A)\&(M), C\leftarrow A7$ \\
7950Adressierungsmodi \> : \> immediate \\
7951\end{tabbing}
7952\begin{tabbing}
7953Adressierungsmodi \= : \= \kill \\
7954Anweisung         \> : \> \tty{RLA} \\
7955Funktion          \> : \> $M\leftarrow((M)<<1)\&(A)$ \\
7956Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
7957                  \>   \> Y-indiziert lang, X/Y-indirekt \\
7958\end{tabbing}
7959\begin{tabbing}
7960Adressierungsmodi \= : \= \kill \\
7961Anweisung         \> : \> \tty{SRE} \\
7962Funktion          \> : \> $M\leftarrow((M)>>1)$\verb!^!$(A)$ \\
7963Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
7964                  \>   \> Y-indiziert lang, X/Y-indirekt \\
7965\end{tabbing}
7966\begin{tabbing}
7967Adressierungsmodi \= : \= \kill \\
7968Anweisung         \> : \> \tty{ASR} \\
7969Funktion          \> : \> $A\leftarrow((A)\&(M))>>1$ \\
7970Adressierungsmodi \> : \> immediate \\
7971\end{tabbing}
7972\begin{tabbing}
7973Adressierungsmodi \= : \= \kill \\
7974Anweisung         \> : \> \tty{RRA} \\
7975Funktion          \> : \> $M\leftarrow((M)>>>1)+(A)+(C)$ \\
7976Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
7977                  \>   \> Y-indiziert lang, X/Y-indirekt \\
7978\end{tabbing}
7979\begin{tabbing}
7980Adressierungsmodi \= : \= \kill \\
7981Anweisung         \> : \> \tty{ARR} \\
7982Funktion          \> : \> $A\leftarrow((A)\&(M))>>>1$ \\
7983Adressierungsmodi \> : \> immediate \\
7984\end{tabbing}
7985\begin{tabbing}
7986Adressierungsmodi \= : \= \kill \\
7987Anweisung         \> : \> \tty{SAX} \\
7988Funktion          \> : \> $M\leftarrow(A)\&(X)$ \\
7989Adressierungsmodi \> : \> absolut lang/kurz, Y-indiziert kurz, \\
7990                  \>   \> Y-indirekt \\
7991\end{tabbing}
7992\begin{tabbing}
7993Adressierungsmodi \= : \= \kill \\
7994Anweisung         \> : \> \tty{ANE} \\
7995Funktion          \> : \> $M\leftarrow((A)\&\$ee)|((X)\&(M))$ \\
7996Adressierungsmodi \> : \> immediate \\
7997\end{tabbing}
7998\begin{tabbing}
7999Adressierungsmodi \= : \= \kill \\
8000Anweisung         \> : \> \tty{SHA} \\
8001Funktion          \> : \> $M\leftarrow(A)\&(X)\&(PCH+1)$ \\
8002Adressierungsmodi \> : \> X/Y-indiziert lang \\
8003\end{tabbing}
8004\begin{tabbing}
8005Adressierungsmodi \= : \= \kill \\
8006Anweisung         \> : \> \tty{SHS} \\
8007Funktion          \> : \> $X\leftarrow(A)\&(X), S\leftarrow(X), M\leftarrow(X)\&(PCH+1)$ \\
8008Adressierungsmodi \> : \> Y-indiziert lang \\
8009\end{tabbing}
8010\begin{tabbing}
8011Adressierungsmodi \= : \= \kill \\
8012Anweisung         \> : \> \tty{SHY} \\
8013Funktion          \> : \> $M\leftarrow(Y)\&(PCH+1)$ \\
8014Adressierungsmodi \> : \> Y-indiziert lang \\
8015\end{tabbing}
8016\begin{tabbing}
8017Adressierungsmodi \= : \= \kill \\
8018Anweisung         \> : \> \tty{SHX} \\
8019Funktion          \> : \> $M\leftarrow(X)\&(PCH+1)$ \\
8020Adressierungsmodi \> : \> X-indiziert lang \\
8021\end{tabbing}
8022\begin{tabbing}
8023Adressierungsmodi \= : \= \kill \\
8024Anweisung         \> : \> \tty{LAX} \\
8025Funktion          \> : \> $A,X\leftarrow(M)$ \\
8026Adressierungsmodi \> : \> absolut lang/kurz, Y-indiziert lang/kurz, \\
8027                  \>   \> X/Y-indirekt \\
8028\end{tabbing}
8029\begin{tabbing}
8030Adressierungsmodi \= : \= \kill \\
8031Anweisung         \> : \> \tty{LXA} \\
8032Funktion          \> : \> $X{04}\leftarrow(X){04} \& (M){04},$ \\
8033                  \>   \> $A{04}\leftarrow(A){04} \& (M){04}$ \\
8034Adressierungsmodi \> : \> immediate \\
8035\end{tabbing}
8036\begin{tabbing}
8037Adressierungsmodi \= : \= \kill \\
8038Anweisung         \> : \> \tty{LAE} \\
8039Funktion          \> : \> $X,S,A\leftarrow((S)\&(M))$ \\
8040Adressierungsmodi \> : \> Y-indiziert lang \\
8041\end{tabbing}
8042\begin{tabbing}
8043Adressierungsmodi \= : \= \kill \\
8044Anweisung         \> : \> \tty{DCP} \\
8045Funktion          \> : \> $M \leftarrow(M)-1, Flags\leftarrow((A)-(M))$ \\
8046Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
8047                  \>   \> Y-indiziert lang, X/Y-indirekt \\
8048\end{tabbing}
8049\begin{tabbing}
8050Adressierungsmodi \= : \= \kill \\
8051Anweisung         \> : \> \tty{SBX} \\
8052Funktion          \> : \> $X\leftarrow((X)\&(A))-(M)$ \\
8053Adressierungsmodi \> : \> immediate \\
8054\end{tabbing}
8055\begin{tabbing}
8056Adressierungsmodi \= : \= \kill \\
8057Anweisung         \> : \> \tty{ISB} \\
8058Funktion          \> : \> $M\leftarrow(M)+1, A\leftarrow(A)-(M)-(C)$ \\
8059Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
8060                  \>   \> Y-indiziert lang, X/Y-indirekt \\
8061\end{tabbing}
8062
8063%%---------------------------------------------------------------------------
8064
8065\section{MELPS-740}
8066
8067Die Mikrokontroller dieser Reihe haben ein sehr nettes, verstecktes
8068Feature: Setzt man mit dem Befehl \tty{SET} das Bit 5 des
8069Statusregisters, so wird bei allen arithmetischen Operationen (und
8070Ladebefehlen) der Akkumulator durch die durch das X-Register adressierte
8071Speicherzelle ersetzt.  Dieses Feature syntaxm"a"sig sauber zu integrieren,
8072ist bisher nicht geschehen, d.h. es kann bisher nur im ,,Handbetrieb''
8073(\tty{SET}...Befehle mit Akkuadressierung...\tty{CLT}) genutzt werden.
8074\par
8075Nicht alle MELPS-740-Prozessoren implementieren alle Befehle.  An dieser
8076Stelle mu"s der Programmierer aufpassen, da"s er nur die Befehle benutzt,
8077die auch wirklich vorhanden sind, da AS die Prozessoren dieser Familie
8078nicht n"aher unterscheidet.  Die Besonderheiten der
8079Special-Page-Adressierung werden bei der Erkl"arung von \tty{ASSUME} n"aher
8080erl"autert.
8081
8082%%---------------------------------------------------------------------------
8083
8084\section{MELPS-7700/65816}
8085\label{MELPS7700Spec}
8086
8087Offensichtlich haben diese beiden Prozessorfamilien ausgehend vom
80886502 ("uber ihre 8-bittigen Vorg"anger) etwas disjunkte Entwicklungswege
8089hinter sich.  Kurz aufgelistet, ergeben sich folgende Unterschiede:
8090\begin{itemize}
8091\item{der 65816 hat keinen B-Akkumulator.}
8092\item{beim 65816 fehlen Multiplikations- sowie Divisionsbefehle.}
8093\item{Die Befehle \tty{SEB}, \tty{CLB}, \tty{BBC}, \tty{BBS},
8094      \tty{CLM}, \tty{SEM}, \tty{PSH}, \tty{PUL} und \tty{LDM}
8095      fehlen beim 65816.  An deren Stelle in der Code-Tabelle finden
8096      sich \tty{TSB}, \tty{TRB}, \tty{BIT}, \tty{CLD}, \tty{SED},
8097      \tty{XBA}, \tty{XCE} und \tty{STZ}.}
8098\end{itemize}
8099Identische Funktion, jedoch andere Namen haben folgende Befehle:
8100\par
8101\begin{center}\begin{tabular}{|c|c||c|c|}
8102\hline
8103   65816  &  MELPS-7700 & 65816 & MELPS-7700 \\
8104\hline
8105\hline
8106    \tty{REP}   &    \tty{CLP}      & \tty{PHK}   &   \tty{PHG} \\
8107    \tty{TCS}   &    \tty{TAS}      & \tty{TSC}   &   \tty{TSA} \\
8108    \tty{TCD}   &    \tty{TAD}      & \tty{TDC}   &   \tty{TDA} \\
8109    \tty{PHB}   &    \tty{PHT}      & \tty{PLB}   &   \tty{PLT} \\
8110    \tty{WAI}   &    \tty{WIT}      &       &       \\
8111\hline
8112\end{tabular}\end{center}
8113\par
8114Besonders t"uckisch sind die Befehle \tty{PHB}, \tty{PLB} und \tty{TSB}:
8115diese Befehle haben jeweils eine v"ollig andere Funktion und Kodierung!
8116\par
8117Leider tun diese Prozessoren mit ihrem Speicher etwas, was f"ur mich
8118auf der nach oben offenen Perversit"atsskala noch vor der
8119Intel-m"a"sigen Segmentierung rangiert: sie banken ihn!
8120Nunja, dies ist wohl der Preis f"ur die 6502-Aufw"artskompatibilit"at;
8121wie dem auch sei, damit AS den gew"unschten Code erzeugen kann, mu"s
8122man ihn "uber den \tty{ASSUME}-Befehl "uber den Inhalt einiger
8123Register in Kenntnis setzen:
8124\par
8125Das M-Flag bestimmt, ob die Akkumulatoren A und B 8 Bit (1) oder 16 Bit
8126(0) breit sein sollen.  Analog entscheidet das Flag X "uber die Breite
8127der Indexregister X und Y.  AS ben"otigt die Information "uber die
8128Registerbreite bei unmittelbarer Adressierung (\tty{\#<Konstante>}), ob das
8129Argument 8 oder 16 Bit breit sein soll.
8130\par
8131Der Speicher ist in 256 B"anke zu 64 Kbyte geteilt.  Da alle Register
8132im Prozessor nur maximal 16 Bit breit sind, kommen die obersten 8
8133Adre"sbits aus 2 speziellen Bank-Registern: DT liefert die oberen 8
8134Bits bei Datenzugriffen, PG erweitert den 16-bittigen Programmz"ahler
8135auf 24 Bit.  Die vom 6502 her bekannte ,,Zero-Page'' ist mittels
8136des 16 Bit breiten Registers DPR frei innerhalb der ersten Bank
8137verschiebbar.  Trifft AS nun im Code auf eine Adresse (egal ob in
8138einem absoluten, indizierten oder indirekten Ausdruck), so versucht
8139er der Reihe nach folgende Adressierungsvarianten:
8140\begin{enumerate}
8141\item{Liegt die Adresse im Bereich von DPR...DPR+\$ff?  Falls ja,
8142      Verwendung von direkter Adressierung mit 8-Bit-Adresse.}
8143\item{Liegt die Adresse innerhalb der durch DT (bzw. PG f"ur
8144      Sprungbefehle) festgelegten Seite?  Falls ja, Verwendung von
8145      absoluter Adressierung mit 16-Bit-Adresse.}
8146\item{Falls nichts anderes hilft, Verwendung von langer Adressierung
8147      mit 24-Bit-Adresse.}
8148\end{enumerate}
8149Aus dieser Aufz"ahlung folgt, da"s das Wissen "uber die momentanen
8150Werte von DT,PG und DPR f"ur die Funktion von AS essentiell ist;
8151sind die Angaben fehlerhaft, adressiert das Programm ,,in die W"uste''.
8152Diese Aufz"ahlung geht "ubrigens davon aus, da"s alle drei
8153Adre"sl"angen verf"ugbar sind; sollte dies einmal nicht der Fall sein,
8154so wird die Entscheidungskette entsprechen k"urzer.
8155
8156Die oben geschilderte, automatische Festlegung der Adre"sl"ange l"a"st
8157sich auch durch die Verwendung von Pr"afixen "ubersteuern.  Stellt
8158man der Adresse ein $<$, $>$ oder $>>$ ohne trennendes Leerzeichen voran,
8159so wird eine Adresse mit 1, 2 oder 3 Bytes benutzt, unabh"angig davon,
8160ob dies die optimale L"ange ist.  Benutzt man eine f"ur diesen Befehl
8161nicht erlaubte oder f"ur die Adresse zu kurze L"ange, gibt es eine
8162Fehlermeldung.
8163
8164Um die Portierung von 6502-Programmen zu erleichtern, verwendet AS f"ur
8165Hexadezimalkonstanten die Motorola-Syntax und nicht die von Mitsubishi
8166"ubrigens f"ur die 740er favorisierte Intel/IEEE-Schreibweise.
8167Ich halte erstere auch f"ur die bessere Schreibweise, und die Entwickler
8168des 65816 werden dies vermutlich "ahnlich gesehen haben (da man mittels
8169der \tty{RELAXED}-Anweisung auch Intel-Notation benutzen kann, wird durch
8170diese Entscheidung auch niemand festgelegt).  Ein f"ur die
8171Portierung "ahnlich wichtiges Detail ist, da"s der Akkumulator A als
8172Ziel von Operationen auch weggelassen werden darf, anstelle von
8173\tty{LDA A,\#0} darf also z.B. auch einfach \tty{LDA \#0} geschrieben
8174werden.
8175\par
8176Ein echtes Bonbon in dem Befehlssatz sind dagegen die Blocktransferbefehle
8177\tty{MVN} und \tty{MVP}.  Etwas eigenartig ist nur die Adre"sangabe:
8178Bit 0--15 im Indexregister, Bit 16--23 im Befehl.  Bei AS gibt  man als
8179Argument f"ur beide Speicherbl"ocke einfach die vollen Adressen an, AS
8180fischt sich dann die passenden Bits automatisch heraus.  Dies ist ein
8181feiner, aber wichtiger Unterschied zum Mitsubishi-Assembler, bei dem
8182man die oberen 8 Bit selber herausziehen mu"s.  Richtig bequem
8183wird es aber erst mit einem Makro im folgendem Stil:
8184\begin{verbatim}
8185mvpos   macro   src,dest,len
8186        if      MomCPU=$7700
8187         lda    #len
8188        elseif
8189         lda    #(len-1)
8190        endif
8191        ldx     #(src&$ffff)
8192        ldy     #(dest&$ffff)
8193        mvp     dest,src
8194        endm
8195\end{verbatim}
8196Vorsicht, Falle: Steht im Akkumulator die Zahl $n$, so transferiert
8197der Mitsubishi $n$ Bytes, der 65816 jedoch $n+1$ Bytes!
8198\par
8199Sehr nett sind auch die Befehle \tty{PSH} und \tty{PUL}, mit deren Hilfe es
8200m"oglich ist, mit einem Befehl einen frei w"ahlbaren Satz von Registern
8201auf dem Stack zu sichern oder von ihm zu laden.  Nach dem
8202Mitsubishi-Datenbuch\cite{Mit16} mu"s die Angabe der Bitmasken immediate
8203erfolgen, der Programmierer soll also entweder alle
8204Register$\leftrightarrow$Bitstellen-Zuordnungen im Kopf behalten oder
8205sich passende Symbole definieren.  Hier habe ich die Syntax eigenm"achtig
8206erweitert, um die Sache etwas angenehmer zu machen: Es darf eine Liste
8207angegeben werden, die sowohl immediate-Ausdr"ucke als auch Registernamen
8208enthalten darf.  Damit sind z.B. die Anweisungen
8209\begin{verbatim}
8210        psh     #$0f
8211\end{verbatim}
8212und
8213\begin{verbatim}
8214        psh     a,b,#$0c
8215\end{verbatim}
8216und
8217\begin{verbatim}
8218        psh     a,b,x,y
8219\end{verbatim}
8220"aquivalent.  Da die immediate-Version weiterhin erlaubt ist, bleibt
8221AS hier ,,aufw"artskompatibel'' zu den Mitsubishi-Assemblern.
8222\par
8223Nicht ganz habe ich beim Mitsubishi-Assembler die Behandlung des
8224\tty{PER}-Befehles verstanden: Mit diesem Befehl kann man eine
822516-Bit-Variable auf den Stack legen, deren Adresse relativ zum
8226Programmz"ahler angegeben wird.  Es ist aus der Sicht des Programmierers
8227also eine absolute Adressierung einer Speicherzelle.  Nichtsdestotrotz
8228verlangt Mitsubishi eine immediate-Adressierung, und das Argument wird so
8229in den Code eingesetzt, wie es im Quelltext steht.  Die Differenz mu"s
8230man selber ausrechnen, was mit der Einf"uhrung von symbolischen Assemblern
8231ja abgeschafft werden sollte...da ich aber auch ein bi"schen ,,kompatibel''
8232denken mu"s, enth"alt AS eine Kompromi"sl"osung: W"ahlt man
8233immediate-Adressierung (also mit Gartenzaun), so verh"alt sich AS wie das
8234Original von Mitsubishi.  L"a"st man ihn jedoch weg, so berechnet AS die
8235Differenz vom Argument zum momentanen Programmz"ahler und setzt diese
8236ein.
8237\par
8238"Ahnlich sieht es beim \tty{PEI}-Befehl aus, der den Inhalt einer
823916-Bit-Variablen auf der Zeropage auf den Stack legt:  Obwohl der Operand
8240eine Adresse ist, wird wieder immediate-Adressierung verlangt.  Hier
8241l"a"st AS schlicht beide Versionen zu (d.h. mit oder ohne Gartenzaun).
8242
8243%%---------------------------------------------------------------------------
8244
8245\section{M16}
8246
8247Die M16-Familie ist eine Familie "au"serst komplexer CISC-Prozessoren
8248mit einem entsprechend komplizierten Befehlssatz.  Zu den Eigenschaften
8249dieses Befehlssatzes geh"ort es unter anderem, da"s bei Operationen
8250mit zwei Operanden beide Operanden verschiedene L"angen haben d"urfen.
8251Die bei Motorola "ubliche und von Mitsubishi "ubernommene Methode, die
8252Operandengr"o"se als Attribut an den Befehl anzuh"angen, mu"ste daher
8253erweitert werden: Es ist erlaubt, auch an die Operanden selber Attribute
8254anzuh"angen.  So wird im folgenden Beispiel
8255\begin{verbatim}
8256        mov     r0.b,r6.w
8257\end{verbatim}
8258Register 0 8-bittig gelesen, auf 32 Bit vorzeichenerweitert und das
8259Ergebnis in Register 6 kopiert.  Da man in 9 von 10 F"allen aber von
8260diesen M"oglichkeiten doch keinen Gebrauch macht, kann man weiterhin
8261die Operandengr"o"se an den Befehl selber schreiben, z.B. so:
8262\begin{verbatim}
8263        mov.w   r0,r6
8264\end{verbatim}
8265Beide Varianten d"urfen auch gemischt verwendet werden, eine
8266Gr"o"senangabe am Operanden "ubersteuert dann den ,,Default'' am Befehl.
8267Eine Ausnahme stellen Befehle mit zwei Operanden dar.   Bei diesen ist
8268der Default f"ur den Quelloperanden die Gr"o"se des Zieloperanden. In
8269folgendem Beispiel
8270\begin{verbatim}
8271        mov.h   r0,r6.w
8272\end{verbatim}
8273wird also auf Register 0 32-bittig zugegriffen, die Gr"o"senangabe
8274am Befehl wird "uberhaupt nicht mehr benutzt.  Finden sich "uberhaupt
8275keine Angaben zur Operandengr"o"se, so wird Wort(w) verwendet.  Merke:
8276im Gegensatz zu den 68000ern bedeutet dies 32 und nicht 16 Bit!
8277\par
8278Reichlich kompliziert sind auch die verketteten Adressierungsmodi;
8279dadurch, da"s AS die Verteilung auf Kettenelemente automatisch
8280vornimmt, bleibt die Sache aber einigerma"sen "ubersichtlich.  Die
8281einzige Eingriffsm"oglichkeit, die bei AS gegeben ist (der Originalassembler
8282von Mitsubishi/Green Hills kann da noch etwas mehr), ist die explizite
8283Festlegung von Displacement-L"angen mittels der Anh"angsel \tty{:4},
8284\tty{:16} und \tty{:32}.
8285
8286%%---------------------------------------------------------------------------
8287
8288\section{4004/4040}
8289
8290John Weinrich sei dank, habe ich nun auch die offiziellen Datenbl"atter
8291von Intel "uber diese 'Urv"ater' aller Mikroprozessoren, und die
8292Unklarheiten "uber die Syntax von Registerpaaren (f"ur 8-Bit-Operationen)
8293sind f"urs erste ausger"aumt.  Die Syntax lautet \tty{RnRm}, wobei \tty{n}
8294bzw. \tty{m} gerade Integers im Bereich 0 bis E bzw. 1 bis F sind.  Dabei
8295gilt immer \tty{m = n + 1}.
8296
8297%%---------------------------------------------------------------------------
8298
8299\section{MCS-48}
8300
8301Der maximale Adre"sraum dieser Prozessoren betr"agt 4 KByte, bzw. 8 KByte
8302bei einigen Philps-Varianten.  Dieser Raum ist jedoch nicht linear organisiert
8303(wie k"onnte das bei Intel auch anders sein...), sondern in 2 B"anke zu 2
8304Kbyte geteilt.  Ein Wechsel zwischen diesen beiden B"anken ist nur durch die
8305Befehle \tty{CALL} und \tty{JMP} erlaubt, indem vor dem Sprung das h"ochste
8306Adre"sbit mit den Befehlen \tty{SEL MB0} bis \tty{SEL MB3} vorgegeben wird.
8307
8308Man kann dem Assembler mit einem
8309\begin{verbatim}
8310         ASSUME MB:<0..3>
8311\end{verbatim}
8312mitteilen, welche Speicherbank gerade f"ur Sprungziele gew"ahlt ist; wird auf
8313eine Adresse gesprungen, die au"serhalb dieser Bank liegt, wird eine Warnung
8314ausgegeben.
8315
8316Wenn der Sonderwert {\tt NOTHING} angegeben wird (dies ist auch der Default),
8317so greift eine in den Befehlen \tty{JMP} und \tty{CALL} eingebaute Automatik ,
8318die den Wechsel zwischen den B"anken vereinfacht.  Sie f"ugt automatisch einen
8319{\tt SEL MBx} Befehl ein, falls die Adresse des Sprungbefehles und das
8320Sprungziel in unterschiedlichen B"anken liegen.  Die explizite Benutzung der
8321\tty{SEL MBx}-Befehle ist dann nicht mehr notwendig (obwohl sie m"oglich
8322bleibt) und kann die Automatik auch durcheinanderbringen, wie in dem folgenden
8323Beispiel:
8324\begin{verbatim}
8325000:    SEL     MB1
8326	JMP     200h
8327\end{verbatim}
8328AS nimmt an, da"s das MB-Flag auf 0 steht und f"ugt keinen
8329\tty{SEL MB0}-Befehl vor dem Sprung ein, mit der Folge, da"s der
8330Prozessor zur Adresse A00h springt.
8331Weiterhin ist zu beachten, da"s ein Sprungbefehl durch diesen Mechanismus
8332unter Umst"anden ein Byte l"anger wird.
8333
8334%%---------------------------------------------------------------------------
8335
8336\section{MCS-51}
8337
8338Dem Assembler liegen die Dateien STDDEF51.INC bzw. 80C50X.INC bei, in
8339denen alle Bits und SFRs der Prozessoren 8051, 8052 und 80515 bzw. 80C501,
8340502 und 504 verzeichnet sind.  Je nach Einstellung des Prozessortyps mit
8341dem \tty{CPU}-Befehl wird dabei die korrekte Untermenge eingebunden, die
8342richtige Reihenfolge f"ur den Anfang eines Programmes ist daher
8343\begin{verbatim}
8344	CPU     <Prozessortyp>
8345	INCLUDE stddef51.inc   ,
8346\end{verbatim}
8347sonst f"uhren die MCS-51-Pseudobefehle in der Include-Datei zu
8348Fehlermeldungen.
8349\par
8350Da der 8051 keinen Befehl kennt, um die Register 0..7 auf den Stack zu
8351legen, mu"s mit deren absoluten Adressen gearbeitet werden.  Diese
8352h"angen aber von der momentan aktiven Registerbank ab.  Um diesem Mi"sstand
8353etwas abzuhelfen, ist in den Include-Dateien das Makro \tty{USING} definiert,
8354dem als Parameter die Symbole \tty{Bank0..Bank3} gegeben werden k"onnen.
8355Das Makro belegt daraufhin die Symbole \tty{AR0..AR7} mit den passenden
8356absoluten Adressen der Register.  Dieses Makro sollte nach jeder
8357Bankumschaltung benutzt werden.  Es erzeugt selber \ii{keinen} Code zur
8358Umschaltung!
8359\par
8360Das Makro f"uhrt in der Variablen \tty{RegUsage} gleichzeitig Buch "uber
8361alle jemals benutzten Registerb"anke; Bit 0 entspricht Bank 0, Bit 1 der
8362Bank 1 usw. .  Der Inhalt kann am Ende der Quelldatei z.B. mit folgendem
8363Codest"uck ausgegeben werden:
8364\begin{verbatim}
8365	irp     BANK,Bank0,Bank1,Bank2,Bank3
8366	 if      (RegUsage&(2^BANK))<>0
8367	  message "Bank \{BANK} benutzt"
8368	 endif
8369	endm
8370\end{verbatim}
8371Mit der Mehrpass-F"ahigkeit ab Version 1.38 wurde es m"oglich, zus"atzlich
8372die Befehle \tty{JMP} und \tty{CALL} einzuf"uhren.  Bei der Kodierung
8373von Spr"ungen mit diesen Befehlen w"ahlt AS je nach Adre"slage automatisch
8374die optimale Variante, d.h. \tty{SJMP/AJMP/LJMP} f"ur \tty{JMP} und
8375\tty{ACALL/LCALL} f"ur \tty{CALL}.  Es ist nat"urlich weiterhin m"oglich,
8376die Varianten direkt zu verwenden, um eine bestimmte Kodierung zu erzwingen.
8377
8378%%---------------------------------------------------------------------------
8379
8380\section{MCS-251}
8381
8382Intel hat sich beim 80C251 ja bem"uht, den "Ubergang f"ur den Programmierer
8383auf die neue Familie so weich wie m"oglich zu gestalten, was darin gipfelt,
8384da"s alte Anwendungen ohne Neu"ubersetzung auf dem neuen Prozessor ablaufen
8385k"onnen.  Sobald man jedoch den erweiterten Befehlssatz der 80C251 nutzen
8386will, gilt es, einige Details zu beachten, die sich als versteckte
8387Fu"sangeln auftun.
8388\par
8389An vorderster Stelle steht dabei die Tatsache, da"s der 80C251 keinen
8390getrennten Bitadre"sraum mehr hat.  Es sind nunmehr alle SFRs unabh"angig
8391von ihrer Adre"slage sowie die ersten 128 Speicherstellen des internen
8392RAMs bitadressierbar.  M"oglich wird dies dadurch, da"s die Bitadressierung
8393nicht mehr "uber einen zus"atzlichen virtuellen Adre"sraum, der andere
8394Adre"sr"aume "uberdeckt, erfolgt, sondern so wie bei anderen Prozessoren
8395auch durch eine zweidimensionale Adressierung, die aus der Speicherstelle,
8396die das Bit beinhaltet sowie der Bitstelle im Byte besteht.  Dies bedeutet
8397zum einen, da"s bei einer Bitangabe wie z.B. PSW.7 AS die Zerlegung der
8398Teile links und rechts vom Punkt selber vornimmt.  Es ist also nicht mehr
8399n"otig, mittels eines \tty{SFRB}-Befehls wie noch beim 8051 explizit 8
8400Bitsymbole zu erzeugen.  Dies bedeutet zum anderen, da"s es den
8401\tty{SFRB}-Befehl "uberhaupt nicht mehr gibt.  Wird er in zu portierenden
84028051-Programmen benutzt, kann er durch einen einfachen \tty{SFR}-Befehl
8403ersetzt werden.
8404\par
8405Weiterhin hat Intel in den unterschiedlichen Adre"sr"aumen des 8051
8406geh"orig aufger"aumt: Der Bereich des internen RAMs (\tty{DATA} bzw.
8407\tty{IDATA}), der \tty{XDATA}-Bereich und er bisherige \tty{CODE}-Bereich
8408wurden in einem einzigen, 16 Mbyte gro"sen \tty{CODE}-Bereich vereinigt.
8409Das interne RAM beginnt bei Adresse 0, das interne ROM beginnt bei
8410Adresse ff0000h, dorthin mu"s also auch der Code mittels \tty{ORG}
8411hinverlagert werden.  Ausgelagert wurden dagegen die \tty{SFRs} in einen
8412eigenen Adre"sraum (der bei AS als \tty{IO}-Segment definiert ist).  In
8413diesem neuen Adre"sraum haben sie aber die gleichen Adressen wie beim 8051.
8414Der \tty{SFR}-Befehl kennt diesen Unterschied und legt mit ihm erzeugte
8415Symbole je nach Zielprozessor automatisch ins \tty{DATA}- bzw.
8416\tty{IO}-Segment.  Da es keinen Bit-Adre"sraum mehr gibt, funktioniert der
8417\tty{BIT}-Befehl v"ollig anders: anstelle einer linearen Adresse von 0 bis
8418255 beinhalten Bit-Symbole jetzt in Bit 0..7 die Adresse, in Bit 24..26
8419die Bitstelle.  Damit ist es jetzt leider nicht mehr so einfach m"oglich,
8420Felder von Flags mit symbolischen Namen anzulegen: Wo man beim 8051 noch
8421z.B.
8422\begin{verbatim}
8423        segment bitdata
8424
8425bit1    db      ?
8426bit2    db      ?
8427\end{verbatim}
8428oder
8429\begin{verbatim}
8430defbit	macro   name
8431name    bit     cnt
8432cnt     set     cnt+1
8433        endm
8434\end{verbatim}
8435schreiben konnte, hilft jetzt nur noch die zweite Variante weiter, z.B.
8436so:
8437\begin{verbatim}
8438adr     set     20h     ; Startadresse Flags im internen RAM
8439bpos    set     0
8440
8441defbit  macro   name
8442name    bit     adr.bpos
8443bpos    set     bpos+1
8444        if      bpos=8
8445bpos     set     0
8446adr      set     adr+1
8447        endif
8448        endm
8449\end{verbatim}
8450Ein weiteres, kleines Detail: Da Intel als Kennzeichnung f"ur den Carry
8451nun CY statt C bevorzugt, sollte man ein eventuell benutztes Symbol
8452umbenennen.  AS versteht aber auch weiterhin die alte Variante in den
8453Befehlen \tty{CLR, CPL, SETB, MOV, ANL,} und \tty{ORL}.  Gleiches gilt
8454sinngem"a"s f"ur die dazugekommenen Register \tty{R8..R15, WR0..WR30,
8455DR0..DR28, DR56, DR60, DPX} und \tty{SPX}.
8456\par
8457Intel m"ochte es gerne, da"s man absolute Adressen in der Form \tty{XX:YYYY}
8458schreibt, wobei \tty{XX} eine 64K-Bank im Adre"sraum angibt bzw. mit einem
8459\tty{S} Adressen im IO-Raum kennzeichnet.  Wie man sich schon denken kann,
8460halte ich davon nicht allzu viel, weshalb man an allen Stellen Adressen
8461genauso gut linear angeben kann; lediglich um das S f"ur die Kennzeichnung
8462von I/O-Adressen kommt man nicht herum, z.B. hier:
8463\begin{verbatim}
8464Carry   bit   s:0d0h.7
8465\end{verbatim}
8466Ohne den Pr"afix w"urde AS die absolute Adresse in das Code-Segment
8467legen, und dort sind ja nur die ersten 128 Byte bitadressierbar...
8468\par
8469Wie auch schon beim 8051 gibt es die generischen Befehle \tty{JMP} und
8470\tty{CALL}, die je nach Adre"slage automatisch die k"urzeste Variante
8471einsetzen.  W"ahrend \tty{JMP} aber die Variante mit 24 Bit mitber"ucksichtigt,
8472tut \tty{CALL} dies aus gutem Grund nicht: Der \tty{ECALL}-Befehl legt
8473n"amlich im Gegensatz zu \tty{ACALL} und \tty{LCALL} 3 Bytes auf den
8474Stack, und man h"atte sonst einen \tty{CALL}-Befehl, bei dem man nicht
8475mehr genau wei"s, was er tut.  Bei \tty{JMP} tritt diese Problem nicht auf.
8476\par
8477Aus einer Sache bin ich nicht ganz schlau geworden: Der 80251 kann
8478auch immediate-Operanden auf den Stack legen, und zwar sowohl einzelne
8479Bytes als auch ganze W"orter.  F"ur beide Varianten ist aber der gleiche
8480Befehl \tty{PUSH} vorgesehen -- und woher soll bitte ein Assembler bei
8481einer Anweisung wie
8482\begin{verbatim}
8483        push #10
8484\end{verbatim}
8485wissen, ob ein Byte oder ein Wort mit dem Wert 10 auf den Stack gelegt
8486werden soll?  Daher gilt im Augenblick die Regelung, da"s \tty{PUSH}
8487grunds"atzlich ein Byte ablegt; wer ein Wort ablegen will, schreibt
8488einfach \tty{PUSHW} anstelle \tty{PUSH}.
8489\par
8490Noch ein gutgemeinter Ratschlag: Wer den erweiterten Befehlssatz des
849180C251 nutzt, sollte den Prozessor auch tunlichst im Source-Modus
8492betreiben, sonst werden alle neuen Anweisungen ein Byte l"anger!  Um
8493die origin"aren 8051-Anweisungem, die daf"ur im Source-Modus l"anger
8494werden, ist es nicht besonders schade: Sie werden entweder von AS
8495automatisch durch neue, leistungsf"ahigere ersetzt oder sind be-
8496treffen veraltete Adressierungsarten (indirekte Adressierung mit
84978-Bit-Registern).
8498
8499%%---------------------------------------------------------------------------
8500
8501\section{8080/8085}
8502\label{8080Spec}
8503
8504Wie schon weiter vorne erw"ahnt, ist es m"oglich, durch ein
8505\begin{verbatim}
8506       Z80SYNTAX <OFF|ON|EXCLUSIVE>
8507\end{verbatim}
8508f"ur die allermeisten 8080/8085-Befehle m"oglich, sie auch wahlweise
8509oder ausschlie"slich im 'Z80-Stil' zu schreiben, d.h. mit weniger
8510Mnemonics, daf"ur aber mit deutlich aussagekr"aftigeren Operanden.
8511F"ur die folgenden Befehle ist die Z80-Syntax im nicht-exklusiven Modus
8512nicht m"oglich, da sie mit existierenden 8080-Mnemonics kollidieren:
8513\begin{itemize}
8514\item{\tty{CP} ist in der 'Intel-Syntax' der Befehl f"ur 'Call on
8515      Positive', in der Zilog-Syntax jedoch der Befehl f"ur
8516      'Compare'.  Verwendet man \tty{CP} mit einem absoluten
8517      Zahlenwert als Argument, so ist f"ur den Assembler nicht zu
8518      erkennen, ob das ein Sprung zu einer absoluten Adresse sein
8519      soll oder ein Vergleich mit einem immediate-Wert.  Der
8520      Assembler wird in so einem Fall einen Sprung kodieren, da
8521      die Intel-Syntax bei Mehrdeutigkeiten Vorrang hat.  M"ochte
8522      man den Vergleich haben, so kann man den Akkumulator als
8523      Zieloperanden explizit hinschreiben, also z.B. \tty{CP A,12h}
8524      anstatt \tty{CP 12h}.}
8525\item{\tty{JP} ist in der Intel-Syntax der Befehl f"ur 'Jump on
8526      Positive', in der Zilog-Syntax jedoch der allgemeine
8527      Sprung-Befehl.  F"ur bedingte Spr"unge in Zilog-Syntax (\tty{JP
8528      cond,addr}) ist die Sache wegen der zwei Argumente eindeutig,
8529      bei nur einem Argument wird der Assembler aber den bedingten
8530      Sprung kodieren.  Wer einen unbedingten Sprung zu einer
8531      absoluten Adresse haben m"ochte, mu"s weiterhin die
8532      Intel-Variante (\tty{JMP addr}) verwenden.}
8533\end{itemize}
8534Der 8085 unterst"utzt mit \tty{RIM} und \tty{SIM} zwei Befehle, die
8535im Z80-Befehlssatz nicht existieren.  Diese k"onnen ''Z80-artig'' als
8536\tty{LD A,IM} bzw. \tty{LD IM,A} geschrieben werden.
8537
8538%%---------------------------------------------------------------------------
8539
8540\section{8085UNDOC}
8541\label{8085Spec}
8542
8543"Ahnlich wie beim Z80 oder 6502, sind auch beim 8085 die undokumentierten
8544Befehle nicht n"aher von Intel spezifiziert worden, weshalb es nicht
8545undenkbar ist, da"s andere Assembler andere Mnemonics daf"ur verwenden.
8546Deshalb sollen auch diese Befehle und ihre Funktion hier kurz aufgelistet
8547werden.  Und auch hier wieder ist die Verwendung dieser Befehle auf
8548eigenes Risiko - schon der an sich zum 8085 aufw"artskompatible Z80
8549benutzt diese Opcodes f"ur v"ollig andere Funktionen...
8550
8551\begin{tabbing}
8552Argumente         \= : \= \kill \\
8553Anweisung         \> : \> \tty{DSUB [reg]} \\
8554Z80-Syntax        \> : \> \tty{SUB HL,reg} \\
8555Funktion          \> : \> HL $\leftarrow$ HL - reg \\
8556Flags             \> : \> CY, S, X5, AC, Z, V, P \\
8557Argumente         \> : \> \tty{reg} = B f"ur BC (optional f"ur nicht-Z80-Syntax) \\
8558\end{tabbing}
8559
8560\begin{tabbing}
8561Argumente         \= : \= \kill \\
8562Anweisung         \> : \> \tty{ARHL} \\
8563Z80-Syntax        \> : \> \tty{SRA HL} \\
8564Funktion          \> : \> HL,CY $\leftarrow$ HL $>>$ 1 (arithmetisch) \\
8565Flags             \> : \> CY \\
8566Argumente         \> : \> keine bzw. fix f"ur Z80-Syntax \\
8567\end{tabbing}
8568
8569\begin{tabbing}
8570Argumente         \= : \= \kill \\
8571Anweisung         \> : \> \tty{RDEL} \\
8572Z80-Syntax        \> : \> \tty{RLC DE} \\
8573Funktion          \> : \> CY,DE $\leftarrow$ DE $<<$ 1 \\
8574Flags             \> : \> CY, V \\
8575Argumente         \> : \> keine bzw. fix f"ur Z80-Syntax \\
8576\end{tabbing}
8577
8578\begin{tabbing}
8579Argumente         \= : \= \kill \\
8580Anweisung         \> : \> \tty{LDHI d8} \\
8581Z80-Syntax        \> : \> \tty{ADD DE,HL,d8} \\
8582Funktion          \> : \> DE $\leftarrow$ HL + {\tt d8} \\
8583Flags             \> : \> keine \\
8584Argumente         \> : \> {\tt d8} = 8-Bit-Konstante, Register fix f"ur Z80-Syntax \\
8585\end{tabbing}
8586
8587\begin{tabbing}
8588Argumente         \= : \= \kill \\
8589Anweisung         \> : \> \tty{LDSI d8} \\
8590Z80-Syntax        \> : \> \tty{ADD DE,SP,d8} \\
8591Funktion          \> : \> DE $\leftarrow$ SP + {\tt d8} \\
8592Flags             \> : \> keine \\
8593Argumente         \> : \> {\tt d8} = 8-Bit-Konstante, Register fix f"ur Z80-Syntax \\
8594\end{tabbing}
8595
8596\begin{tabbing}
8597Argumente         \= : \= \kill \\
8598Anweisung         \> : \> \tty{RSTflag} \\
8599Z80-Syntax        \> : \> \tty{RST flag} \\
8600Funktion          \> : \> Restart zu 40h wenn {\tt flag}=1 \\
8601Flags             \> : \> keine \\
8602Argumente         \> : \> {\tt flag} = V f"ur Overflow-Bit \\
8603\end{tabbing}
8604
8605\begin{tabbing}
8606Argumente         \= : \= \kill \\
8607Anweisung         \> : \> \tty{SHLX [reg]} \\
8608Z80-Syntax        \> : \> \tty{LD (reg),HL} \\
8609Funktion          \> : \> [reg] $\leftarrow$ HL \\
8610Flags             \> : \> keine \\
8611Argumente         \> : \> \tty{reg} = D/DE f"ur DE (optional f"ur nicht-Z80-Syntax) \\
8612\end{tabbing}
8613
8614\begin{tabbing}
8615Argumente         \= : \= \kill \\
8616Anweisung         \> : \> \tty{LHLX [reg]} \\
8617Z80-Syntax        \> : \> \tty{LD HL,(reg)} \\
8618Funktion          \> : \> HL $\leftarrow$[reg] \\
8619Flags             \> : \> keine \\
8620Argumente         \> : \> \tty{reg} = D/DE f"ur DE (optional f"ur nicht-Z80-Syntax) \\
8621\end{tabbing}
8622
8623\begin{tabbing}
8624Argumente         \= : \= \kill \\
8625Anweisung         \> : \> \tty{JNX5 adr} \\
8626Z80-Syntax        \> : \> \tty{JP NX5, adr} \\
8627Funktion          \> : \> springe zu {\tt adr} wenn X5=0 \\
8628Flags             \> : \> keine \\
8629Argumente         \> : \> {\tt adr} = absolute 16-Bit-Adresse \\
8630\end{tabbing}
8631
8632\begin{tabbing}
8633Argumente         \= : \= \kill \\
8634Anweisung         \> : \> \tty{JX5 adr} \\
8635Funktion          \> : \> springe zu {\tt adr} wenn X5=1 \\
8636Flags             \> : \> keine \\
8637Argumente         \> : \> {\tt adr} = absolute 16-Bit-Adresse \\
8638\end{tabbing}
8639
8640Mit X5 ist dabei das ansonsten unbenutzte Bit 5 im PSW-Register gemeint.
8641
8642%%---------------------------------------------------------------------------
8643
8644\section{8086..V35}
8645
8646Eigentlich hatte ich mir geschworen, die Segmentseuche der 8086er aus diesem
8647Assembler herauszuhalten.  Da aber nun eine Nachfrage kam und Studenten
8648flexiblere Menschen als die Entwickler dieses Prozessors sind, findet sich
8649ab sofort auch eine rudiment"are Unterst"utzung dieser Prozessoren in AS.
8650Unter ,,rudiment"ar'' verstehe ich dabei nicht, da"s der Befehlssatz nicht
8651vollst"andig abgedeckt wird, sondern da"s ich nicht den ganzen Wust an
8652Pseudoanweisungen integriert habe, die sich bei MASM, TASM \& Co. finden.
8653AS ist auch nicht in erster Linie geschrieben worden, um PC-Programme zu
8654entwickeln (Gott bewahre, das hie"se wirklich, das Rad neu zu erfinden),
8655sondern zur Programmentwicklung f"ur Einplatinenrechner, die eben unter
8656anderem auch mit 8086ern best"uckt sein k"onnen.
8657\par
8658F"ur Unentwegte, die mit AS doch DOS-Programme schreiben wollen, eine kleine
8659Liste dessen, was zu beachten ist:
8660\begin{itemize}
8661\item{Es k"onnen nur COM-Programme erzeugt werden.}
8662\item{Verwenden Sie nur das \tty{CODE}-Segment, und legen Sie auch alle
8663      Variablen darin ab.}
8664\item{Alle Segmentregister werden von DOS auf das Codesegment
8665      vorinitialisiert.  Ein \tty{ASSUME DS:CODE, SS:CODE} am
8666      Programmanfang ist daher notwendig.}
8667\item{DOS l"adt den Code ab Adresse 100h.  Ein \tty{ORG} auf diese
8668      Adresse ist daher zwingend.}
8669\item{Die Umwandlung in eine Bin"ardatei erfolgt mit P2BIN (s.u.), wobei als
8670      als Adre"sbereich \tty{\$-\$} anzugeben ist.}
8671\end{itemize}
8672Allgemein unterst"utzt AS f"ur diese Prozessoren nur ein Small-Programmiermodell, d.h.
8673\ii{ein} Codesegment mit maximal 64 KByte und ein ebenfalls h"ochstens 64
8674KByte gro"ses Datensegment mit (f"ur COM-Dateien uninitialisierten) Daten.
8675Zwischen diesen beiden Segmenten kann mit dem \tty{SEGMENT}-Befehl hin-und hergeschaltet werden.
8676Aus dieser Tatsache folgert, da"s Spr"unge immer intrasegment"ar sind,
8677sofern sie sich auf Adressen im Codesegment beziehen.  Falls weite Spr"unge
8678doch einmal erforderlich sein sollten, k"onnen sie mit \tty{CALLF} und
8679\tty{JMPF} und einer Speicheradresse oder einen Segment:Offset-Wert als
8680Argument erreicht werden.
8681\par
8682Ein weiteres gro"ses Problem dieser Prozessoren ist deren Assemblersyntax,
8683deren genaue Bedeutung nur aus dem Zusammenhang erkennbar ist.  So kann im
8684folgenden Beispiel je nach Symboltyp sowohl unmittelbare als auch absolute
8685Adressierung gemeint sein:
8686\begin{verbatim}
8687        mov     ax,wert
8688\end{verbatim}
8689Bei AS ist immer unmittelbare Adressierung gemeint, wenn um den Operanden
8690keine eckigen Klammern stehen.  Soll z.B. die Adresse oder der Inhalt einer
8691Variablen geladen werden, so ergeben sich die in Tabelle \ref{TabMASM}
8692aufgelisteten Unterschiede.
8693\begin{table*}
8694\begin{center}\begin{tabular}{|l|l|l|}
8695\hline
8696Assembler  & Adresse                  & Inhalt                 \\
8697\hline
8698\hline
8699MASM       & \tty{mov ax,offset vari} & \tty{mov ax,vari}      \\
8700           & \tty{lea ax,vari}        & \tty{mov ax,[vari]}    \\
8701           & \tty{lea ax,[vari]}      &                        \\
8702           &                          &                        \\
8703AS         & \tty{mov ax,vari}        & \tty{mov ax,[vari]}    \\
8704           & \tty{lea ax,[vari]}      &                        \\
8705           &                          &                        \\
8706\hline
8707\end{tabular}\end{center}
8708\caption{Unterschiede in der Adressierungssyntax AS$\leftrightarrow$MASM\label{TabMASM}}
8709\normalsize
8710\end{table*}
8711\par
8712Der Assembler pr"uft bei Symbolen, ob sie im Datensegment liegen und
8713versucht, automatisch einen passenden Segmentpr"afix einzuf"ugen, z.B.
8714falls ohne CS-Pr"afix auf Symbole im Code zugegriffen wird.  Dieser
8715Mechanismus kann jedoch nur funktionieren, falls der \tty{ASSUME}-Befehl
8716(siehe dort) korrekt angewendet wurde.
8717\par
8718Die Intel-Syntax verlangt eine Abspeicherung, ob an einem Symbol Bytes oder
8719W"orter abgelegt wurden.  AS nimmt diese Typisierung nur vor, falls in der
8720gleichen Zeile wie das Label ein \tty{DB} oder \tty{DW} steht.  F"ur alle anderen F"alle
8721mu"s mit den Operatoren \tty{WORD PTR, BYTE PTR} usw. explizit angegeben werden,
8722um was f"ur eine Operandengr"o"se es sich handelt.  Solange ein Register an der
8723Operation beteiligt ist, kann auf diese Kennzeichnung verzichtet werden, da
8724durch den Registernamen die Operandengr"o"se eindeutig bestimmt ist.
8725\par
8726Der Koprozessor in 8086-Systemen wird "ublicherweise durch den TEST-Eingang
8727des Prozessors synchronisiert, indem selbiger mit dem BUSY-Ausgang des
8728Koprozessors verbunden wird.  AS unterst"utzt dieses Handshaking, indem
8729vor jedem 8087-Befehl automatisch ein \tty{WAIT}-Befehl eingef"ugt wird.  Ist
8730dies aus irgendwelchen Gr"unden unerw"unscht (z.B. w"ahrend der
8731Initialisierung), so mu"s im Opcode hinter dem \tty{F} ein \tty{N} eingef"ugt
8732werden; aus
8733\begin{verbatim}
8734        FINIT
8735        FSTSW   [vari]
8736\end{verbatim}
8737wird so z.B.
8738\begin{verbatim}
8739        FNINIT
8740        FNSTSW  [vari]
8741\end{verbatim}
8742Diese Variante ist bei \ii{allen} Koprozessorbefehlen erlaubt.
8743
8744%%---------------------------------------------------------------------------
8745
8746\section{8X30x}
8747\label{8X30xSpec}
8748
8749Die Prozessoren dieser Reihe sind auf eine einfache Manipulation von
8750Bitgruppen auf Peripherieadressen optimiert worden.  Um mit solchen
8751Bitgruppen auch symbolisch umgehen zu k"onnen, existieren die Befehle
8752\tty{LIV} und \tty{RIV}, mit denen einer solchen Bitgruppe ein
8753symbolischer Name zugewiesen wird.  Diese Befehle arbeiten "ahnlich
8754wie \tty{EQU}, ben"otigen aber drei Parameter:
8755\begin{enumerate}
8756\item{die Adresse der peripheren Speicherzelle, in der sich die
8757      Bitgruppe befindet (0..255);}
8758\item{die Bitnummer des ersten Bits in der Gruppe (0..7);}
8759\item{die L"ange der Gruppe in Bits (1..8).}
8760\end{enumerate}
8761\bb{ACHTUNG!}  Der 8X30x unterst"utzt keine Bitgruppen, die "uber mehrere
8762Speicherstellen hinausreichen, so da"s je nach Startposition der
8763Wertebereich f"ur die L"ange eingeschr"ankt sein kann.  AS nimmt hier
8764\bb{keine} Pr"ufung vor, man bekommt lediglich zur Laufzeit merkw"urdige
8765Ergebnisse!
8766
8767Im Maschinencode dr"ucken sich L"ange und Position durch ein 3-Bit-Feld
8768im Instruktionswort sowie ein passende Registernummer (\tty{LIVx} bzw.
8769\tty{RIVx}) aus.  Bei der Verwendung eines symbolischen Objektes wird AS
8770diese Felder automatisch richtig besetzen, es ist aber auch erlaubt,
8771die L"ange als dritten Operanden explizit anzugeben, wenn man nicht
8772mit symbolischen Busobjekten arbeitet.  Trifft AS auf eine L"angenangabe
8773trotz eines symbolischen Operanden, so vergleicht er beide L"angen
8774und gibt eine Fehlermeldung bei Ungleichheit aus (das gleiche passiert
8775"ubrigens auch, wenn man bei einem \tty{MOVE}-Befehl zwei symbolische
8776Operanden mit unterschiedlicher L"ange benutzt - die Instruktion hat
8777einfach nur ein L"angenfeld...).
8778
8779Neben den eigentlichen Maschinenbefehlen des 8X30x implementiert AS
8780noch "ahnlich wie das ,,Vorbild'' MCCAP einige Pseudoinstruktionen, die
8781als eingebaute Makros ausgef"uhrt sind:
8782\begin{itemize}
8783\item{\tty{NOP} ist eine Kurzschreibweise f"ur \tty{MOVE AUX,AUX}}
8784\item{\tty{HALT} ist eine Kurzschreibweise f"ur {\tt JMP \verb!*!}}
8785\item{\tty{XML ii} ist eine Kurzschreibweise f"ur \tty{XMIT ii,R12} (nur
8786      8X305)}
8787\item{\tty{XMR ii} ist eine Kurzschreibweise f"ur \tty{XMIT ii,R13} (nur
8788      8X305)}
8789\item{\tty{SEL $<$busobj$>$} ist eine Kurzschreibweise f"ur
8790      \tty{XMIT $<$adr$>$,IVL/IVR}, f"uhrt also die notwendige Vorselektion
8791      durch, um \tty{$<$busobj$>$} ansprechen zu k"onnen.}
8792\end{itemize}
8793Die bei MCCAP ebenfalls noch vorhandenen \tty{CALL-} und
8794\tty{RTN-}Instruktionen sind mangels ausreichender Dokumentation momentan
8795nicht implementiert. Das gleiche gilt f"ur einen Satz an
8796Pseudoinstruktionen zur Datenablage. Kommt Zeit, kommt Rat...
8797
8798%%---------------------------------------------------------------------------
8799
8800\section{XA}
8801
8802"Ahnlich wie sein Vorg"anger MCS/51, jedoch im Unterschied zu seinem
8803,,Konkurrenten'' MCS/251 besitzt der Philips XA einen getrennten Bitadre"sraum,
8804d.h. alle mit Bitbefehlen manipulierbaren Bits haben eine
8805bestimmte, eindimensionale Adresse, die in den Maschinenbefehlen auch
8806so abgelegt wird.  Die naheliegende M"oglichkeit, diesen dritten
8807Adre"sraum (neben Code und Daten) auch so in AS anzubieten, habe ich
8808nicht nutzen k"onnen, und zwar aus dem Grund, da"s ein Teil der Bitadressen
8809im Gegensatz zum MCS/51 nicht mehr eindeutig ist: Bits mit
8810den Adressen 256 bis 511 bezeichnen Bits der Speicherzellen 20h..3fh
8811aus dem aktuellen Datensegment.  Dies bedeutet aber, da"s diese Adressen
8812je nach Situation unterschiedliche Bits ansprechen k"onnen - ein definieren
8813von Bits mit Hilfe von \tty{DC}-Befehlen, was durch ein extra Segment
8814m"oglich geworden w"are, w"urde also nicht "uberm"a"sig viel Sinn ergeben.
8815Zur Definition einzelner, symbolisch ansprechbarer Bits steht aber
8816nach wie vor der \tty{BIT}-Befehl zur Verf"ugung, mit dem beliebige Bitadressen
8817(Register, RAM, SFR) definiert werden k"onnen.  F"ur Bitadressen im
8818internen RAM wird auch die 64K-Bank-Adresse gespeichert, so da"s AS
8819Zugriffe "uberpr"ufen kann, sofern das DS-Register korrekt mit \tty{ASSUME}
8820vorbesetzt wurde.
8821\par
8822Nichts drehen kann man dagegen an den Bem"uhungen von AS, potentielle
8823Sprungziele (also Zeilen im Code mit Label) auf gerade Adressen
8824auszurichten.  Dies macht AS genauso wie andere XA-Assembler auch durch
8825Einf"ugen von \tty{NOP}s vor dem fraglichen Befehl.
8826
8827%%---------------------------------------------------------------------------
8828
8829\section{AVR}
8830
8831Im Gegensatz zum AVR-Assembler verwendet AS defaultm"a"sig das Intel-Format
8832zur Darstellung von Hexadezimalkonstanten und nicht die C-Syntax.  OK, nicht
8833vorher in den (freien) AVR-Assembler hineingeschaut, aber als ich mit dem
8834AVR-Teil anfing, gab es zum AVR noch nicht wesentlich mehr als ein
8835vorl"aufiges Datenbuch mit Prozessortypen, die dann doch nie kamen...mit
8836einem \tty{RELAXED ON} schafft man dieses Problem aus der Welt.
8837
8838Optional kann AS f"ur die AVRs (es geht auch f"ur andere CPU's, nur
8839macht es dort keinen Sinn...) sogenannte ,,Objekt-Dateien'' erzeugen.
8840Das sind Dateien, die sowohl Code als auch Quellzeileninformationen
8841enthalten und z.B. eine schrittweise Abarbeitung auf Quellcodeebene
8842mit dem von Atmel gelieferten Simulator WAVRSIM erlauben.  Leider
8843scheint dieser mit Quelldateispezifikationen, die l"anger als ca. 20
8844Zeichen sind, seine liebe Not zu haben: Namen werden abgeschnitten
8845oder um wirre Sonderzeichen erg"anzt, wenn die Maximall"ange "uberschritten
8846wird.  AS speichert deshalb in den Objekt-Dateien Dateinamen ohne
8847Pfadangabe, so da"s es eventuell Probleme geben k"onnte, wenn
8848Dateien (z.B. Includes) nicht im Arbeitsverzeichnis liegen.
8849
8850Eine kleine Besonderheit sind Befehle, die Atmel bereits in der
8851Architektur vorgesehen hat, aber noch in keinem Mitglied der Familie
8852implementiert wurden.  Dabei handelt es sich um die Befehle {\tt MUL, JMP}
8853und {\tt CALL}.  Besonders bei letzteren fragt man sich vielleicht, wie man
8854denn nun den 4 KWorte gro"sen Adre"sraum des AT90S8515 erreichen kann,
8855wenn die 'n"achstbesten' Befehle {\tt RJMP} und {\tt RCALL} doch nur 2
8856KWorte weit springen kann.  Der Kunstgriff lautet 'Abschneiden der oberen
8857Adre"sbits' und ist n"aher bei der {\tt WRAPMODE}-Anweisung beschrieben.
8858
8859F"ur alle AVR-CPUs ist das CPU-Argument {\tt CODESEGSIZE} definiert.
8860Mit einem
8861\begin{verbatim}
8862   cpu atmega8:codesegsize=0
8863\end{verbatim}
8864weist man den Assembler an, das Code-Segment (also das interne Flash-ROM)
8865nicht als in 16-Bit-Worten, sondern in 8-Bit-Bytes organisiert zu betrachten.
8866Dies ist die Sichtweise, wie man sie beim {\tt LPM}-Befehl hat und wie sie
8867einige andere (nicht-Atmel) Assembler grunds"atzlich verfolgen.  Sie hat den
8868Vorteil, da"s man Adressen im {\tt CODE}-Segment f"ur Datenzugriffe nicht selber
8869mit zwei multiplizieren mu"s, andererseits mu"s aber darauf geachtet werden,
8870da"s Instruktionen niemals auf einer ungeraden Adresse liegen d"urfen - sie
8871w"urden dann ja quasi halb auf einem und halb auf dem n"achsten 16-Bit-Wort
8872im Flash-ROM liegen.  {\tt PADDING} ist deshalb im Default aktiviert, es bleibt
8873aber m"oglich, mit {\tt DB} oder {\tt DATA} Byte-Felder zu definieren, ohne
8874da"s zwischen den Anweisungen Padding-Bytes eingestreut werden.  Bei relativen
8875oder absoluten Spr"ungen werden die Adressen im ''Byte-Modus'' automatisch
8876durch zwei geteilt.  Default ist die vom Atmel-Assembler vorgegebene Organisation
8877in unteilbare 16-Bit-Worte.  Diese kann auch explizit mit dem Argument
8878\verb!codesegsize=1! gew"ahlt werden.
8879
8880%%---------------------------------------------------------------------------
8881
8882\section{Z80UNDOC}
8883
8884Da es von Zilog naturgem"a"s keine Syntaxvorgaben f"ur die undokumentierten
8885Befehle gibt und wohl auch nicht jeder den kompletten Satz kennt,
8886ist es vielleicht sinnvoll, diese Befehle hier kurz aufzuz"ahlen:
8887\par
8888Wie auch beim Z380 ist es m"oglich, die Byte-H"alften von IX und IY
8889einzeln anzusprechen.  Im einzelnen sind dies folgende Varianten:
8890\begin{verbatim}
8891 INC Rx              LD R,Rx             LD  Rx,n
8892 DEC Rx              LD Rx,R             LD  Rx,Ry
8893 ADD/ADC/SUB/SBC/AND/XOR/OR/CP A,Rx
8894\end{verbatim}
8895Dabei stehen \tty{Rx} bzw. \tty{Ry} f"ur \tty{IXL, IXU, IYL} oder
8896\tty{IYU}.  Zu beachten ist jedoch, da"s in der \tty{LD Rx,Ry}-Variante
8897beide Register aus dem gleichen Indexregister stammen m"ussen.
8898\par
8899Die Kodierung von Schiebebefehlen besitzt noch eine undefinierte
8900Bitkombination, die als \tty{SLIA}-Befehl zug"anglich ist.  \tty{SLIA}
8901funktioniert wie \tty{SLA}, es wird jedoch eine Eins und nicht eine Null
8902in Bit 0 eingeschoben.  Dieser Befehl kann, wie alle anderen
8903Schiebebefehle auch, noch in einer weiteren Variante geschrieben
8904werden:
8905\begin{verbatim}
8906        SLIA    R,(XY+d)
8907\end{verbatim}
8908Dabei steht \tty{R} f"ur ein beliebiges 8-Bit-Register (aber nicht eine
8909Indexregisterh"alfte...), und \tty{(XY+d)} f"ur eine normale
8910indexregister-relative Adressierung.  Das Ergebnis dieser Operation
8911ist, da"s das Schiebeergebnis zus"atzlich ins Register geladen wird.
8912Dies funktioniert auch bei den \tty{RES-} und \tty{SET-}Befehlen:
8913\begin{verbatim}
8914        SET/RES R,n,(XY+d)
8915\end{verbatim}
8916Des weiteren gibt es noch zwei versteckte I/O-Befehle:
8917\begin{verbatim}
8918        IN      (C) bzw. TSTI
8919        OUT     (C),0
8920\end{verbatim}
8921Deren Funktionsweise sollte klar sein.  \bb{ACHTUNG!} Es gibt keine
8922Garantie daf"ur, da"s alle Z80-Masken alle diese Befehle beherrschen,
8923und die Z80-Nachfolger l"osen zuverl"assig Traps aus.  Anwendung
8924daher auf eigene Gefahr...
8925
8926%%---------------------------------------------------------------------------
8927
8928\section{Z380}
8929
8930Da dieser Prozessor als Enkel des wohl immer noch beliebtesten
89318-Bit-Prozessors konzipiert wurde, war es bei der Entwicklung
8932unabdingbar, da"s dieser bestehende Z80-Programme ohne "Anderung
8933ausf"uhren kann (nat"urlich geringf"ugig schneller, etwa um den
8934Faktor 10...).  Die erweiterten F"ahigkeiten k"onnen daher nach
8935einem Reset mit zwei Flags zugeschaltet werden, die XM (eXtended
8936Mode, d.h. 32- statt 16-Bit-Adre"sraum) und LW (long word mode,
8937d.h. 32- statt 16- Bit-Operanden) hei"sen.  Deren Stand mu"s man
8938AS "uber die Befehle \tty{EXTMODE} und \tty{LWORDMODE} mitteilen, damit
8939Adressen und Konstantenwerte gegen die korrekten Obergrenzen
8940gepr"uft werden.  Die Umschaltung zwischen 32- und 16-Bit-Befehlen
8941bewirkt nat"urlich nur bei solchen Befehlen etwas, die auch in
8942einer 32-Bit-Version existieren; beim Z380 sind das momentan
8943leider nur Lade- und Speicherbefehle, die ganze Aritmetik kann
8944nur 16-bittig ausgef"uhrt werden.  Hier sollte Zilog wohl noch
8945einmal etwas nachbessern, sonst kann man den Z380 selbst beim
8946besten Willen nur als ,,16-Bit-Prozessor mit 32-Bit-Erweiterungen''
8947bezeichnen...
8948
8949Kompliziert wird die Sache dadurch, da"s die mit LW eingestellte
8950Operandengr"o"se f"ur einzelne Befehle mit den Pr"afixen \tty{DDIR W}
8951und \tty{DDIR LW} "ubersteuert werden kann.  AS merkt sich das
8952Auftreten solcher Befehle und schaltet dann f"ur den n"achsten
8953Prozessorbefehl automatisch mit um.  Andere \tty{DDIR}-Varianten
8954als \tty{W} und \tty{LW} sollte man "ubrigens nie explizit
8955verwenden, da AS bei zu langen Operanden diese automatisch
8956einsetzt, und das k"onnte zu Verwirrungen f"uhren.  Die Automatik
8957geht "ubrigens so weit, da"s in der Befehlsfolge
8958\begin{verbatim}
8959        DDIR    LW
8960        LD      BC,12345678h
8961\end{verbatim}
8962automatisch der erforderliche \tty{IW}-Pr"afix mit in die
8963vorangehende Anweisung hineingezogen wird, effektiv wird also
8964der Code
8965\begin{verbatim}
8966        DDIR    LW,IW
8967        LD      BC,12345678h
8968\end{verbatim}
8969erzeugt.  Der im ersten Schritt erzeugte Code f"ur \tty{DDIR LW}
8970wird verworfen, was an einem \tty{R} im Listing zu erkennen
8971ist.
8972
8973%%---------------------------------------------------------------------------
8974
8975\section{Z8, Super8 und eZ8}
8976\label{Z8Spec}
8977
8978Der Prozessorkern der Z8-Mikrokontroller beinhaltet keine eigenen
8979Register.  Stattdessen kann ein 16er-Block des internen Adre"raums
8980aus RAM und I/O-Registern als 'Arbeitsregister' benutzt werden, die
8981mit 4-Bit-Adressen angesprochen werden k"onnen.  Welcher 16er-Block
8982als Arbeitsregister benutzt werden soll, wird mit den RP-Registern
8983festgelegt: Bits 4 bis 7 von RP definieren beim klassischen Z8 den
8984'Offset', der auf die 4-Bit-Arbeitsregisteradresse addiert wird,
8985um eine 8-Bit-Adresse zu erhalten.  Beim Super8-Kern existieren
8986zwei RP-Register (RP0 und RP1), die es erlauben, obere und untere
8987H"alfte der Arbeitsregister an getrennte Stellen zu legen.
8988
8989"Ublicherweise werden die Arbeitsregister in der Assemblersyntax als
8990Register R0...R15 angesprochen, man kann diese Arbeitsregister aber
8991auch als eine Methode zur effizienteren (k"urzeren) Adressierung eines
899216er-Bocks im internen RAM betrachten.
8993
8994Mit dem \tty{ASSUME}-Befehl teilt man AS den aktuellen Wert von RP mit.  AS
8995ist dann in der Lage, bei einer Adresse aus dem internen RAM
8996automatisch zu entscheiden, ob dieser Operand mit einer 4-Bit Adresse
8997angesprochen werden kann oder eine 8-Bit-Adresse verwendet werden
8998mu"s.  Man kann diese Funktion auch dazu benutzen, Arbeitsregistern
8999symbolische Namen zu verpassen:
9000\begin{verbatim}
9001op1     equ     040h
9002op2     equ     041h
9003
9004        srp     #040h
9005        assume  rp:040h
9006
9007        ld      op1,op2		; entspricht ld r0,r1
9008\end{verbatim}
9009Es ist auch auf dem Super8 m"oglich, RP als Argument von \tty{ASSUME}
9010anzugeben, obwohl dieser kein RP-Register hat (nur RP0 und RP1).  In
9011diesem Fall werden die angenommen Werte von RP0 und RP1 auf $wert$ bzw.
9012$wert+8$ gesetzt, analog zum \tty{SRP} Maschinenbefehl auf dem Super8-
9013Kern.
9014
9015Im Gegensatz zum Original Zilog-Assembler ist es nicht erforderlich,
9016eine 'Arbeitsregisteradressierung' explizit durch ein vorangestelltes
9017Ausrufezeichen anzufordern, wobei AS diese Syntax nichtsdestotrotz
9018versteht - ein vorangestelltes Ausrufezeichen erzwingt quasi
90194-Bit-Adressierung, auch wenn die Adresse eigentlich nicht im durch
9020RP festgelegten 16-Bit-Fenster liegt (dann wird eine Warnung
9021ausgegeben).  Umgekehrt ist es durch ein vorangestelltes $>$-Zeichen
9022m"oglich, eine Adressierung mit 8 Bit zu erzwingen, auch wenn die
9023Adresse eigentlich im aktuellen 16er-Fenster liegt.
9024
9025Beim eZ8 wird das Spielchen quasi eine Stufe weiter getrieben: der
9026interne Daten-Adre"sbereich ist jetzt 12 statt 8 Bit gro"s.  Um
9027kompatibel zum alten Z8-Kern zu sein, hat Zilog die zus"atzlichen
9028Banking-Bits in den {\em unteren} vier Bits von RP untergebracht -
9029ein RP-Wert von 12h definiert also das 16er-Adre"sfenster von 210h
9030bis 21fh.
9031
9032Die unteren vier Bits von RP definieren beim eZ8 gleichzeitig das
9033256er-Fenster, das man mit 8-Bit-Adressen erreichen kann - hier gilt
9034ein analoger Mechanismus, der daf"ur sorgt, da"s AS automatisch 12-
9035oder 8-Bit-Adressen verwendet.  'Lange' 12-Bit-Adressen kann man mit
9036zwei vorangestellten $>$-Zeichen erzwingen.
9037
9038%%---------------------------------------------------------------------------
9039
9040\section{TLCS-900(L)}
9041\label{TLCS900Spec}
9042
9043Diese Prozessoren k"onnen in zwei Betriebsarten laufen, einmal im
9044\ii{Minimum}-Modus, der weitgehende Z80- und TLCS-90-Quellcodekompatibilit"at
9045bietet, und zum anderen im \ii{Maximum}-Modus, in dem der Prozessor
9046erst seine wahren Qualit"aten entfaltet.  Die Hauptunterschiede zwischen
9047den beiden Betriebsarten sind:
9048\begin{itemize}
9049\item{Breite der Register WA,BC,DE und HL: 16 oder 32 Bit;}
9050\item{Anzahl der Registerbanks: 8 oder 4;}
9051\item{Programmadre"sraum: 64 Kbyte oder 16 Mbyte;}
9052\item{Breite von R"ucksprungadressen: 16 oder 32 Bit.}
9053\end{itemize}
9054Damit AS gegen die richtigen Grenzen pr"ufen kann, mu"s man ihm zu Anfang
9055mit dem Befehl \tty{MAXMODE} (siehe dort) mitteilen, in welcher Betriebsart
9056der Code ausgef"uhrt werden wird; Voreinstellung ist der Minimum-Modus.
9057\par
9058Je nach Betriebsart m"ussen demzufolge auch die 16- oder 32-Bit-Versionen
9059der Bankregister zur Adressierung verwendet werden, d.h. WA, BC, DE und HL
9060im Minimum-Modus sowie XWA, XBC, XDE und XHL im Maximum-Modus.  Die Register
9061XIX..XIZ und XSP sind \bb{immer} 32 Bit breit und m"ussen zur Adressierung
9062auch immer in dieser Form verwendet werden; hier mu"s bestehender Z80-Code
9063also auf jeden Fall angepa"st werden (neben der Tatsache, da"s es gar keinen
9064I/O-Adre"sraum mehr gibt und alle I/O-Register memory-mapped sind...).
9065\par
9066Absolute Adressen sowie Displacements k"onnen in unterschiedlichen L"angen
9067kodiert werden.  AS wird ohne explizite Angaben immer versuchen, die
9068k"urzestm"ogliche Schreibweise zu verwenden; dies schlie"st ein, da"s ein
9069Displacement von Null "uberhaupt nicht im Code erscheint und aus einen
9070\verb!(XIX+0)! einfach ein \verb!(XIX)! wird.  Ist eine bestimmte L"ange
9071erw"unscht, so kann sie durch Anh"angen eines passenden Suffixes (:8, :16,
9072:24) an das Displacement bzw. die Adresse erreicht werden.
9073\par
9074Die von Toshiba gew"ahlte Syntax f"ur Registernamen ist in der Hinsicht
9075etwas ungl"ucklich, als da"s zur Anwahl der vorherigen Registerbank ein
9076Hochkomma (') benutzt wird.
9077Dieses Zeichen wird von den prozessorunabh"angigen Teilen von AS bereits zur
9078Kennzeichnung von Zeichenkonstanten benutzt.  Im Befehl
9079\begin{verbatim}
9080        ld      wa',wa
9081\end{verbatim}
9082erkennt AS z.B. nicht das Komma zur Parametertrennung.
9083Dieses Problem kann man aber umgehen,
9084indem man ein umgekehrtes Hochkomma (`) verwendet, z.B.
9085\begin{verbatim}
9086        ld      wa`,wa
9087\end{verbatim}
9088Toshiba liefert f"ur die TLCS-900-Reihe selber einen Assembler (TAS900), der
9089sich in einigen Punkten von AS unterscheidet:
9090
9091\subsubsection{Symbolkonventionen}
9092
9093\begin{itemize}
9094\item{TAS900 unterscheidet Symbolnamen nur auf den ersten 32 Zeichen.
9095      AS dagegen speichert Symbolnamen immer in der vollen L"ange (bis
9096      255 Zeichen) und unterscheidet auch auf dieser L"ange.}
9097\item{Unter TAS900 k"onnen Integerkonstanten sowohl in C-Notation (mit
9098      vorangestellter 0 f"ur oktal bzw. 0x f"ur hexadezimal) als auch in
9099      normaler Intel-Notation geschrieben werden.  AS unterst"utzt in der
9100      Default-Einstellung \bb{nur} die Intel-Notation.  Mit dem
9101      \tty{RELAXED}-Befehl bekommt man (unter anderem) auch die C-Notation.}
9102\item{AS macht keinen Unterschied zwischen Gro"s- und Kleinschreibung,
9103      TAS900 hingegen unterscheidet Gro"s-und Kleinbuchstaben in
9104      Symbolnamen.  Dieses Verhalten erh"alt man bei AS erst, wenn man
9105      die \tty{-u}-Kommandozeilenoption benutzt.}
9106\end{itemize}
9107
9108\subsubsection{Syntax}
9109
9110AS ist bei vielen Befehlen in der Syntaxpr"ufung weniger streng als TAS900,
9111bei einigen weicht er (sehr) geringf"ugig ab.  Diese Erweiterungen bzw.
9112"Anderungen dienen teilweise der leichteren Portierung von bestehendem
9113Z80-Code, teilweise einer Schreiberleichterung und teilweise einer besseren
9114Orthogonalit"at der Assemblersyntax:
9115\begin{itemize}
9116\item{Bei den Befehlen \tty{LDA, JP} und \tty{CALL} verlangt TAS, da"s
9117      Adre"sausdr"ucke wie \tty{XIX+5} nicht geklammert sein d"urfen, wie
9118      es sonst "ublich ist.  AS verlangt im Sinne der Orthogonalit"at f"ur
9119      \tty{LDA} dagegen immer eine Klammerung, bei \tty{JP} und \tty{CALL}
9120      ist sie dagegen f"ur einfache, absolute Adressen optional.}
9121\item{Bei den bedingten Befehlen \tty{JP, CALL, JR} und \tty{SCC} stellt
9122      AS es dem Programmierer frei, die Default-Bedingung \tty{T} (= true) als
9123      ersten Parameter anzugeben oder nicht.  TAS900 hingegen erlaubt es
9124      nur, die Default-Bedingung implizit zu benutzen (also z.B.
9125      \tty{jp (xix+5)} anstelle von \tty{jp t,(xix+5)}).}
9126\item{AS erlaubt beim \tty{EX}-Befehl auch Operandenkombinationen, die
9127      zwar nicht direkt im User's Manual\cite{Tosh900} genannt werden,
9128      aber durch Vertauschung auf eine genannte zur"uckgef"uhrt werden
9129      k"onnen.  Kombinationen wie \tty{EX f`,f} oder \tty{EX wa,(xhl)}
9130      werden damit m"oglich.  TAS900 hingegen l"a"st nur die ,,reine Lehre''
9131      zu.}
9132\item{AS erlaubt, bei den Befehlen \tty{INC} und \tty{DEC} die Angabe
9133      des Inkrements oder Dekrements wegzulassen, wenn dies 1 ist.  Unter
9134      TAS900 dagegen mu"s auch eine 1 hingeschrieben werden.}
9135\item{"Ahnlich verh"alt es sich bei allen Schiebebefehlen: Ist der zu
9136      verschiebende Operand ein Register, so verlangt TAS900, da"s auch
9137      eine Schiebeamplitude von 1 ausgeschrieben werden mu"s; ist dagegen
9138      eine Speicherstelle der Operand, so ist die Schiebezahl
9139      (hardwarebedingt) immer 1 und darf auch nicht hingeschrieben werden.
9140      Unter AS dagegen ist die Schiebezahl 1 immer optional und auch f"ur
9141      alle Operandentypen zul"assig.}
9142\end{itemize}
9143
9144\subsubsection{Makroprozessor}
9145
9146Der Makroprozessor wird TAS900 als externes Programm vorgeschaltet und
9147besteht aus zwei Komponenten: einem C-artigen Pr"aprozessor und einer
9148speziellen Makrosprache (MPL), die an h"ohere Programmiersprachen
9149erinnert.  Der Makroprozessor von AS dagegen orientiert sich an
9150,,klassischen'' Makroassemblern wie dem M80 oder MASM (beides Programme
9151von Microsoft).  Er ist fester Bestandteil des Programmes.
9152
9153\subsubsection{Ausgabeformat}
9154
9155TAS900 erzeugt relokatiblen Code, so da"s sich mehrere, getrennt assemblierte
9156Teile zu einem Programm zusammenbinden lassen.  AS hingegen erzeugt direkt
9157absoluten Maschinencode, der nicht linkbar ist.  An eine Erweiterung ist
9158(vorl"aufig) nicht gedacht.
9159
9160\subsubsection{Pseudoanweisungen}
9161
9162Bedingt durch den fehlenden Linker fehlen in AS eine ganze Reihe von f"ur
9163relokatiblen Code erforderlichen Pseudoanweisungen, die TAS900 implementiert.
9164In gleicher Weise wie bei TAS900 sind folgende Anweisungen vorhanden:
9165\begin{quote}{\tt
9166EQU, DB, DW, ORG, ALIGN, END, TITLE, SAVE, RESTORE,
9167}\end{quote}
9168wobei die beiden letzteren einen erweiterten Funktionsumfang haben.
9169Einige weitere TAS900-Pseudobefehle lassen sich durch "aquivalente AS-Befehle
9170ersetzen (siehe Tabelle \ref{TabTAS900}).
9171\par
9172Von Toshiba existieren zwei Versionen des Prozessorkerns, wobei die
9173L-Variante eine ,,Sparversion'' darstellt.  Zwischen TLCS-900 und TLCS-900L
9174macht AS folgende Unterschiede:
9175\begin{itemize}
9176\item{Die Befehle \tty{MAX} und \tty{NORMAL} sind f"ur die L-Version
9177      nicht erlaubt, der \tty{MIN}-Befehl ist f"ur die Vollversion
9178      gesperrt.}
9179\item{Die L-Version kennt den Normal-Stapelzeiger \tty{XNSP/NSP} nicht,
9180      daf"ur das Steuerregister \tty{INTNEST}.}
9181\end{itemize}
9182Die Befehle \tty{SUPMODE} und \tty{MAXMODE} werden nicht beeinflu"st,
9183ebenso nicht deren ini\-tiale Einstellung OFF.  Die Tatsache, da"s die
9184L-Version im Maximum-Modus startet und keinen Normal-Modus kennt, mu"s
9185also vom Programmierer ber"ucksichtigt werden.  AS zeigt sich jedoch
9186insofern kulant gegen"uber der L-Variante, als da"s Warnungen wegen
9187privilegierter Anweisungen im L-Modus unterdr"uckt werden.
9188\begin{table*}[htbp]
9189\begin{center}\begin{tabular}{|l|l|l|}
9190\hline
9191TAS900        &   AS                & Bedeutung/Funktion \\
9192\hline
9193\hline
9194\tty{DL} $<Daten>$  & \tty{DD} $<Daten>$              & Speicher in Langworten belegen \\
9195\hline
9196\tty{DSB} $<Zahl>$  & \tty{DB} $<Zahl>$ \tty{DUP} (?) & Speicher byteweise reservieren \\
9197\hline
9198\tty{DSW} $<Zahl>$  & \tty{DW} $<Zahl>$ \tty{DUP} (?) & Speicher wortweise reservieren \\
9199\hline
9200\tty{DSD} $<Zahl>$  & \tty{DD} $<Zahl>$ \tty{DUP} (?) & Speicher langwortweise reservieren \\
9201\hline
9202\tty{\$MIN[IMUM]}   & \tty{MAXMODE OFF}         & folgender Code im Minimum-Modus \\
9203\hline
9204\tty{\$MAX[IMUM]}   & \tty{MAXMODE ON}          & folgender Code im Maximum-Modus \\
9205\hline
9206\tty{\$SYS[TEM]}    & \tty{SUPMODE ON}          & folgender Code im System-Modus \\
9207\hline
9208\tty{\$NOR[MAL]}    & \tty{SUPMODE OFF}         & folgender Code im User-Modus \\
9209\hline
9210\tty{\$NOLIST}      & \tty{LISTING OFF}         & Assemblerlisting ausschalten \\
9211\hline
9212\tty{\$LIST}        & \tty{LISTING ON}          & Assemblerlisting einschalten \\
9213\hline
9214\tty{\$EJECT}       & \tty{NEWPAGE}             & neue Seite im Listing beginnen \\
9215\hline
9216\end{tabular}\end{center}
9217\caption{"aquivalente Befehle TAS900$\leftrightarrow$AS\label{TabTAS900}}
9218\end{table*}
9219
9220%%---------------------------------------------------------------------------
9221
9222\section{TLCS-90}
9223
9224Vielleicht fragt sich der eine oder andere, ob bei mir die Reihenfolge
9225durcheinandergekommen ist, es gab ja von Toshiba zuerst den 90er als
9226,,aufgebohrten Z80'' und danach den 900er als 16-Bit-Version.  Nun, ich
9227bin einfach "uber den 900er zum 90er gekommen (Danke, Oliver!).  Die
9228beiden Familien sind sich sehr artverwandt, nicht nur was ihre Syntax
9229angeht, sondern auch ihre Architektur.  Die Hinweise f"ur den 90er sind
9230daher eine Untermenge derer f"ur den 900er: Da Schieben, Inkrementieren
9231und Dekrementieren hier nur um eins m"oglich sind, braucht und darf diese
9232Eins auch nicht als erstes Argument hingeschrieben werden.  Bei den
9233Befehlen \tty{LDA, JP} und \tty{CALL} m"ochte Toshiba wieder die
9234Klammern um Speicheroperanden weglassen, bei AS m"ussen sie aber aus
9235Gr"unden der Orthogonalit"at gesetzt werden (der tiefere Grund ist
9236nat"urlich, da"s ich mir damit eine Sonderabfrage im Parser gespart habe,
9237aber das sagt man nicht so laut).
9238\par
9239Die TLCS-90er besitzen bereits prinzipiell einen Adre"sraum von 1
9240Mbyte, dieser Raum erschlie"st sich aber nur bei Datenzugriffen "uber
9241die Indexregister.  AS verzichtet daher auf eine Ber"ucksichtigung
9242der Bankregister und begrenzt den Adre"sraum f"ur Code auf 64 Kbyte.
9243Da der Bereich jenseits aber sowieso nur "uber indirekte Adressierung
9244erreichbar ist, sollte dies keine allzu gro"se Einschr"ankung darstellen.
9245
9246%%---------------------------------------------------------------------------
9247
9248\section{TLCS-870}
9249
9250Schon wieder Toshiba...diese Firma ist im Augenblick wirklich sehr
9251produktiv!  Speziell dieser Spro"s der Familie (Toshibas Mikrokontroller
9252sind sich ja alle in Bin"arkodierung und Programmiermodell recht "ahnlich)
9253scheint auf den 8051-Markt abzuzielen: Die Methode, Bitstellen durch einen
9254Punkt getrennt an den Adre"sausdruck anzuh"angen, hatte ja beim 8051 ihren
9255Ursprung, f"uhrt jetzt aber auch genau zu den Problemen, die ich beim 8051
9256geahnt hatte: Der Punkt ist jetzt einerseits legales Zeichen in Symbolnamen,
9257andererseits aber auch Teil der Adre"ssyntax, d.h. AS mu"s Adresse und
9258Bitstelle trennen und einzeln weiterverarbeiten.  Diesen Interessenkonflikt
9259habe ich vorerst so gel"ost, da"s der Ausdruck von \bb{hinten} an nach
9260Punkten durchsucht wird und so der letzte Punkt als Trenner gilt, eventuelle
9261weitere Punkte werden dem Symbolnamen zugerechnet.  Es gilt weiterhin die
9262flehentliche Bitte, im eigenen Interesse auf Punkte in Symbolnamen zu
9263verzichten, sie f"uhren nur zu Verwirrungen:
9264\begin{verbatim}
9265        LD      CF,A.7  ; Akku Bit 7 nach Carry
9266        LD      C,A.7   ; Konstante A.7 nach Register C
9267\end{verbatim}
9268
9269%%---------------------------------------------------------------------------
9270
9271\section{TLCS-47}
9272
9273Mit dieser 4-Bit-Prozessorfamilie d"urfte wohl das unter Ende dessen
9274erreicht sein, was AS unterst"utzen kann.  Neben dem \tty{ASSUME}-Befehl
9275f"ur das Datenbankregister (siehe dort) ist eigentlich nur ein Detail
9276erw"ahnenswert: im Daten- und I/O-Segment werden keine Bytes, sondern
9277Nibbles reserviert (eben 4-Bitter...).  Die Sache funktioniert "ahnlich
9278wie das Bitdatensegment beim 8051, wo ein \tty{DB} ja nur einzelne Bit
9279reserviert, nur da"s es hier eben Nibbles sind.
9280\par
9281Toshiba hat f"ur diese Prozessorfamilie einen ,,erweiterten Befehlssatz''
9282in Makroform definiert, um das Arbeiten mit diesem doch recht
9283beschr"ankten Befehlssatz zu erleichtern.  Im Fall von AS ist er in der
9284Datei STDDEF47.INC definiert.  Einige Befehle, deren makrom"a"sige
9285Realisierung nicht m"oglich war, sind allerdings ,,eingebaut'' und stehen
9286daher auch ohne die Include-Datei zur Verf"ugung:
9287\begin{itemize}
9288\item{der \tty{B}-Befehl, der die jeweils optimale Version des
9289      Sprungbefehls (\tty{BSS, BS oder BSL}) automatisch w"ahlt;}
9290\item{\tty{LD} in der Variante HL mit immediate;}
9291\item{\tty{ROLC} und \tty{RORC} mit einer Schiebeamplitude $>$1.}
9292\end{itemize}
9293
9294%%---------------------------------------------------------------------------
9295
9296\section{TLCS-9000}
9297
9298Hier ist es zum ersten Mal passiert, da"s ich einen Prozessor in AS
9299implementiert habe, der zu diesem Zeitpunkt noch gar nicht auf dem
9300Markt war.  Toshiba hatte sich nach meinen Informationen leider
9301zwischenzeitlich auch dazu entschieden, diesen Prozessor ,,auf Eis''
9302zu legen, also auch kein Silizium geben.  Das hatte nat"urlich zur Folge,
9303da"s dieser Teil
9304\begin{description}
9305\item[1.]{ein ,,Paper-Design'' ist, d.h. noch nicht praktisch getestet
9306          wurde und}
9307\item[2.]{Die Unterlagen, die ich zum 9000er hatte \cite{Tosh9000},
9308          noch vorl"aufig waren, also noch nicht bis ins letzte Klarheit
9309          lieferten.}
9310\end{description}
9311und dieses Target foratn in einen Dornr"oschenschlaf fiel...
9312
9313...Schnitt, 20 Jahre sp"ater: auf einmal melden sich Leute bei
9314mir, da"s Toshiba wohl doch TLCS-9000-Chips an Kunden verkauft
9315hat, und fragen nach den Unterlagen, weil sie Reverse-Engineering
9316betreiben.  Vielleicht bekommen wir ja auf diesem Wege noch das
9317eine oder andere unklare Detail best"atigt oder gekl"art.  Fehler in
9318diesem Teil sind also weiterhin noch m"oglich und werden nat"urlich
9319bereinigt.  Zumindest die Handvoll Beispiele in \cite{Tosh9000} werden
9320aber richtig "ubersetzt.
9321
9322Displacements im Maschinenbefehl selber k"onnen nur eine bestimmte
9323maximale L"ange (z.B. 13 oder 9 Bit) haben.  Ist das Displacement
9324l"anger, mu"s dem Befehl ein Pr"afix mit den ''oberen Bits''
9325vorangestellt werden.  AS wird solche Pr"afixe automatisch nach
9326Bedarf einsetzen, man kann jedoch auch mit einem dem Displacement
9327vorangestellten \verb!'>'! das Setzen eines Pr"afix erzwingen,
9328z.B. so:
9329
9330\begin{verbatim}
9331  ld:g.b  (0h),0       ; kein Pr"afix
9332  ld:g.b  (400000h),0  ; Pr"afix automatisch erzeugt
9333  ld:g.b  (>0h),0      ; Pr"afix erzwungen
9334\end{verbatim}
9335
9336%%---------------------------------------------------------------------------
9337
9338\section{TC9331}
9339
9340Toshiba hat seinerzeit f"ur diesen Prozessor einen (DOS-basierten)
9341Assembler namens ASM31T geliefert.  Dieser Assembler unterst"utzt
9342eine Reihe von Syntax-Elementen, die sich auf AS nicht ohne
9343"Anderungen abbilden lie"sen, die die Kompatibilit"at
9344zu existierenden Quelldateien f"ur andere Targets gef"ahrdert
9345h"atten.  An folgenden Stellen werden m"oglicherweise "Anderungen
9346erforderlich sein, um f"ur den ASM31T geschriebene Programme mit
9347AS "ubersetzen zu k"onnen:
9348
9349\begin{itemize}
9350\item{ASM31T unterst"utzt C-artige Kommentare (\verb!/* ... */!),
9351      die auch "uber mehrere Zeilen gehen d"urfen.  Diese werden
9352      von AS nicht unterst"utzt und m"ussen in mit einem
9353      Semikolon eingeleitete Kommentare umgesetzt werden.}
9354\item{Wie ASM31T unterst"utzt AS f"ur den TC9331 Kommentare in
9355      runden Klammern (\verb!( ... )!), aber nur innerhalb
9356      eines Befehlsarguments.  Enth"alt ein solcher Kommentar ein
9357      Komma, wird dieses Komma als Argument-Trenner behandelt und
9358      der Kommentar nicht beim Parsing der Arguente
9359      "ubersprungen.}
9360\item{ASM31T erlaubt Symbol- und Label-Namen, die einen
9361      Bindestrich enthalten.  Das ist bei AS nicht zugelassen,
9362      der Bindestrich ist hier der Subtraktionsoperator und in
9363      einem Ausdruck wie \verb!end-start! w"are sonst nicht klar,
9364      ob ein einzelnes Symbol oder die Differenz von zwei
9365      Symbolen gemeint ist.}
9366\item{ASM31T verlangt zwingend ein \tty{END}-Statement am Ende
9367      des Programmes; bei AS ist dies optional.}
9368\end{itemize}
9369
9370Des weiteren fehlen AS im Moment die F"ahigkeiten, auf
9371miteinander kollidierende Nutzungen von Funktionseinheiten in
9372einem Befehl hinzuweisen.  Die Dokumentation von Toshiba ist an
9373diesem Punkt leider etwas schwer verst"andlich.
9374
9375%%---------------------------------------------------------------------------
9376
9377\section{29xxx}
9378
9379Wie schon beim \tty{ASSUME}-Befehl beschrieben, kann AS mit der Kenntnis
9380"uber den Inhalt des RBP-Registers feststellen, ob im User-Modus
9381auf gesperrte Register zugegriffen wird.  Diese F"ahigkeit
9382beschr"ankt sich nat"urlich auf direkte Zugriffe (also nicht, wenn
9383die Register IPA...IPC benutzt werden), und sie hat noch einen
9384weiteren Haken: da lokale Register (also solche mit Nummern$>$127)
9385relativ zum Stackpointer adressiert werden, die Bits in RBP sich
9386aber immer auf absolute Nummern beziehen, wird die Pr"ufung f"ur
9387lokale Register NICHT durchgef"uhrt.  Eine Erweiterung auf lokale
9388Register w"urde bedingen, da"s AS zu jedem Zeitpunkt den absoluten
9389Wert von SP kennt, und das w"urde sp"atestens bei rekursiven
9390Unterprogrammen scheitern...
9391
9392%%---------------------------------------------------------------------------
9393
9394\section{80C16x}
9395
9396Wie in der Erkl"arung des \tty{ASSUME}-Befehls schon erl"autert, versucht
9397AS, dem Programmierer die Tatsache, da"s der Prozessor mehr physikalischen
9398als logischen Speicher hat, soweit als m"oglich zu verbergen.  Beachten
9399Sie aber, da"s die DPP-Register \bb{nur} Datenzugriffe betreffen und auch dort
9400nur absolute Adressierung, also weder indirekte noch indizierte Zugriffe,
9401da AS ja nicht wissen kann, wie die berechnete Adresse zur Laufzeit
9402aussehen wird...Bei Codezugriffen arbeitet die Paging-Einheit leider nicht,
9403man mu"s also explizit mit langen oder kurzen \tty{CALL}s, \tty{JMP}s oder
9404\tty{RET}s arbeiten.  Zumindest bei den ,,universellen'' Befehlen \tty{CALL}
9405und \tty{JMP} w"ahlt AS automatisch die k"urzeste Form, aber sp"atestens
9406beim \tty{RET} sollte man wissen, woher der Aufruf kam.  Prinzipiell
9407verlangen \tty{JMPS} und \tty{CALLS} dabei, da"s man Segment und Adresse
9408getrennt angibt, AS ist jedoch so geschrieben, da"s er eine Adresse selber
9409zerlegen kann, z.B.
9410\begin{verbatim}
9411        jmps    12345h
9412\end{verbatim}
9413anstelle von
9414\begin{verbatim}
9415        jmps    1,2345h
9416\end{verbatim}
9417Leider sind nicht alle Effekte der chipinternen Instruktions-Pipeline
9418versteckt: Werden CP (Registerbankadresse), SP (Stack) oder eines der
9419Paging-Register ver"andert, so steht der neue Wert noch nicht f"ur den
9420n"achsten Befehl zur Verf"ugung.  AS versucht, solche Situationen zu
9421erkennen und gibt im Falle eines Falles eine Warnung aus.  Aber auch
9422diese Mimik greift nur bei direkten Zugriffen.
9423\par
9424Mit \tty{BIT} definierte Bits werden intern in einem 13-Bit-Wort abgelegt,
9425wobei die Bitadresse in Bit 4..11 liegt und die Bitnummer in den unteren
9426vier Bits.  Diese Anordnung erlaubt es, das n"achsth"ohere bzw.
9427n"achstniedrigere Bit durch Inkrementieren bzw. Dekrementieren anzusprechen.
9428Bei expliziten Bitangaben mit Punkt funktioniert das aber nicht "uber
9429Wortgrenzen hinaus.  So erzeugt folgender Ausdruck eine
9430Wertebereichs"uberschreitung:
9431\begin{verbatim}
9432        bclr    r5.15+1
9433\end{verbatim}
9434Hier mu"s ein \tty{BIT} her:
9435\begin{verbatim}
9436msb     bit     r5.15
9437        .
9438        .
9439        .
9440        bclr    msb+1
9441\end{verbatim}
9442F"ur den 80C167/165/163 ist der SFR-Bereich verdoppelt worden; da"s ein Bit im
9443zweiten Teil liegt, wird durch ein gesetztes Bit 12 vermerkt.  Leider
9444hatte Siemens bei der Definition des 80C166 nicht vorausgesehen, da"s
9445256 SFRs (davon 128 bitadressierbar) f"ur Nachfolgechips nicht reichen
9446w"urden. So w"are es unm"oglich, den zweiten SFR-Bereich von F000H..F1DFH
9447mit kurzen Adressen oder Bitbefehlen zu erreichen, h"atten die Entwickler
9448nicht einen Umschaltbefehl eingebaut:
9449\begin{verbatim}
9450        EXTR    #n
9451\end{verbatim}
9452Dieser Befehl bewirkt, da"s f"ur die n"achsten \tty{n} Befehle (0$<$\tty{n}$<$5)
9453anstelle des normalen der erweiterte SFR-Bereich angesprochen werden kann.
9454AS erzeugt bei diesm Befehl nicht nur den passenden Code, sondern setzt
9455intern ein Flag, da"s f"ur die n"achsten \tty{n} Befehle nur Zugriffe auf den
9456erweiterten SFR-Bereich zul"a"st.  Da d"urfen nat"urlich keine Spr"unge
9457dabei sein... Bits aus beiden Bereichen lassen sich nat"urlich jederzeit
9458definieren, ebenso sind komplette Register aus beiden SFR-Bereichen
9459jederzeit mit absoluter Adressierung erreichbar.  Nur die kurze bzw.
9460Bitadressierung geht immer nur abwechselnd, Zuwiderhandlungen werden
9461mit einer Fehlermeldung geahndet.
9462\par
9463"Ahnlich sieht es mit den Pr"afixen f"ur absolute bzw. indirekte
9464Adressierung aus: Da aber sowohl Argument des Pr"afixes als auch der
9465Adre"sausdruck nicht immer zur "Ubersetzungszeit bestimmbar sind, sind
9466die Pr"ufungsm"oglichkeiten durch AS sehr eingeschr"ankt, weshalb er es
9467auch bei Warnungen bel"a"st...im einzelnen sieht das folgenderma"sen aus:
9468\begin{itemize}
9469\item{feste Vorgabe einer 64K-Bank mittels \tty{EXTS} oder \tty{EXTSR}:
9470      Im Adre"sausdruck werden direkt die unteren 16 Bit der Zieladresse
9471      eingesetzt.  Haben sowohl Pr"afix als auch Befehl einen konstanten
9472      Operanden, so wird "uberpr"uft, ob Pr"afixargument und Bit 16..23 der
9473      Zieladresse identisch sind.}
9474\item{feste Vorgabe einer 16K-Seite mittels \tty{EXTP} oder \tty{EXTPR}:
9475      Im Adre"sausdruck werden direkt die unteren 14 Bit der Zieladresse
9476      eingesetzt.  Bit 14 und 15 bleiben konstant 0, da sie in diesem Modus
9477      nicht vom Prozessor ausgewertet werden.  Haben sowohl Pr"afix als
9478      auch Befehl einen konstanten Operanden, so wird "uberpr"uft, ob
9479      Pr"afixargument und Bit 14..23 der Zieladresse identisch sind.}
9480\end{itemize}
9481Damit das etwas klarer wird, ein Beispiel (die DPP-Register haben
9482die Reset-Vorbelegung) :
9483\begin{verbatim}
9484       extp     #7,#1           ; Bereich von 112K..128K
9485       mov      r0,1cdefh       ; ergibt Adresse 0defh im Code
9486       mov      r0,1cdefh       ; -->Warnung
9487       exts     #1,#1           ; Bereich von 64K..128K
9488       mov      r0,1cdefh       ; ergibt Adresse 0cdefh im Code
9489       mov      r0,1cdefh       ; -->Warnung
9490\end{verbatim}
9491
9492%%---------------------------------------------------------------------------
9493
9494\section{PIC16C5x/16C8x}
9495
9496"Ahnlich wie die MCS-48-Familie teilen auch die PICs ihren
9497Programmspeicher in mehrere B"anke auf, da im Opcode nicht gen"ugend Platz
9498f"ur die vollst"andige Adresse war.  AS verwendet f"ur die Befehle \tty{CALL}
9499und \tty{GOTO} die gleiche Automatik, d.h. setzt die PA-Bits im
9500Statuswort entsprechend Start- und Zieladresse.  Im Gegensatz zu den 48ern
9501ist dieses Verfahren hier aber noch deutlich problematischer:
9502\begin{enumerate}
9503\item{Die Befehle sind nicht mehr nur ein Wort, sondern bis zu drei Worten
9504      lang, k"onnen also nicht mehr in jedem Fall mit einem bedingten Sprung
9505      "ubergangen werden.}
9506\item{Es ist m"oglich, da"s der Programmz"ahler beim normalen
9507      Programmfortgang eine Seitengrenze "uberschreitet.  Die vom Assembler
9508      angenommene Belegung der PA-Bits stimmt dann nicht mehr mit der
9509      Realit"at "uberein.}
9510\end{enumerate}
9511Bei den Befehlen, die das Register W mit einem anderen Register
9512verkn"upfen, mu"s normalerweise als zweiter Parameter angegeben werden, ob
9513das Ergebnis in W oder im Register abgelegt werden soll.  Bei diesem
9514Assembler ist es erlaubt, den zweiten Parameter wegzulassen.  Welches Ziel
9515dann angenommen werden soll, h"angt vom Typ des Befehls ab: bei un"aren
9516Operationen wird defaultm"a"sig das Ergebnis zur"uck ins Register gelegt.
9517Diese Befehle sind:
9518\begin{quote}
9519{\tt COMF, DECF, DECFSZ, INCF, INCFSZ, RLF, RRF} und {\tt SWAPF}
9520\end{quote}
9521Die anderen Befehle betrachten W defaultm"a"sig als Akkumulator, zu dem ein
9522Register verkn"upft wird:
9523\begin{quote}
9524{\tt ADDWF, ANDWF, IORWF, MOVF, SUBWF} und {\tt XORWF}
9525\end{quote}
9526\par
9527Die von Microchip vorgegebene Schreibweise f"ur Literale ist ziemlich
9528abstrus und erinnert an die auf IBM 360/370-Systemen "ubliche Schreibweise
9529(Gr"u"se aus Neandertal...).  Um nicht noch einen Zweig in den Parser
9530einf"ugen zu m"ussen, sind bei AS Konstanten in
9531Motorola-Syntax zu schreiben (wahlweise auch Intel oder C im \tty{RELAXED}-Modus).
9532\par
9533Dem Assembler liegt die Include-Datei STDDEF16.INC bei, in der die Adressen
9534der Hardware-Register und Statusbits verewigt sind.  Daneben enth"alt sie
9535eine Liste von ,,Befehlen'', die der Microchip-Assembler als Makro
9536implementiert.  Bei der Benutzung dieser Befehlsmakros ist gro"se Vorsicht
9537angebracht, da sie mehrere Worte lang sind und sich somit nicht "uberspringen
9538lassen!!
9539
9540%%---------------------------------------------------------------------------
9541
9542\section{PIC17C4x}
9543
9544F"ur diese Prozessoren gelten im wesentlichen die gleichen Hinweise wie
9545f"ur ihre kleinen Br"uder, mit zwei Ausnahmen: Die zugeh"orige Include-Datei
9546enth"alt nur Registerdefinitionen, und die Probleme bei Sprungbefehlen
9547sind deutlich kleiner.  Aus der Reihe f"allt nur \tty{LCALL}, der einen
954816-Bit-Sprung erlaubt.  Dieser wird mit folgendem ,,Makro'' "ubersetzt:
9549\begin{verbatim}
9550        MOVLW   <Adr15..8>
9551        MOWF    3
9552        LCALL   <Adr0..7>
9553\end{verbatim}
9554
9555%%---------------------------------------------------------------------------
9556
9557\section{SX20/28}
9558
9559Durch die beschr"ankte L"ange des Instruktionswortes ist es nicht
9560m"oglich, darin eine vollst"andige Programmspeicher-Adresse (11 Bit)
9561oder Datenspeicher-Adresse (8 Bit) unterzubringen.  Der Prozessor
9562erg"anzt die gek"urzten Adressen um die PA-Bits aus dem
9563STATUS-Register bzw. oberen Bits aus dem FSR-Register.  "Uber
9564\tty{ASSUME}-Befehle teilt man dem Assembler deren aktuellen Inhalt
9565mit.  Falls auf Adressen zugegriffen wird, die mit den vermerkten
9566Werten nicht zugreifbar sind, erfolgt eine Warnung.
9567
9568%%---------------------------------------------------------------------------
9569
9570\section{ST6}
9571
9572Diese Prozessoren k"onnen das Code-ROM seitenweise in den Datenbereich
9573einblenden.  Weil ich nicht die ganze Mimik des \tty{ASSUME}-Befehles
9574hier wiederk"auen m"ochte, verweise ich auf das entsprechende Kapitel
9575(\ref{ST6Assume}), in dem steht, wie man mit diesem Befehl einigerma"sen
9576unfallfrei Konstanten aus dem ROM lesen kann.
9577\par
9578Bei n"ahererer Betrachtung des Befehlssatzes fallen einige eingebaute
9579,,Makros'' auf.  Die Befehle, die mir aufgefallen sind (es gibt aber
9580vielleicht noch mehr...), sind in Tabelle \ref{TabHid62} aufgelistet.
9581\par
9582\begin{table*}[htbp]
9583\begin{center}\begin{tabular}{|l|l|}
9584\hline
9585Befehl   & in Wirklichkeit \\
9586\hline
9587\hline
9588\tty{CLR A}    & \tty{SUB A,A} \\
9589\tty{SLA A}    & \tty{ADD A,A} \\
9590\tty{CLR adr}  & \tty{LDI adr,0} \\
9591\tty{NOP}      & \tty{JRZ PC+1} \\
9592\hline
9593\end{tabular}\end{center}
9594\caption{versteckte Makros im ST6225-Befehlssatz\label{TabHid62}}
9595\end{table*}
9596Insbesondere der letztere Fall verbl"ufft doch etwas...
9597Leider fehlen aber einige Anweisungen wirklich.  So gibt es z.B. zwar einen
9598\tty{AND}-Befehl, aber kein \tty{OR}...von \tty{XOR} gar nicht zu
9599reden.  In der Datei  STDDEF62.INC finden sich deshalb neben den Adressen
9600der SFRs noch einige Makros zur Abhilfe.
9601\par
9602Der Original-Assembler AST6 von SGS-Thomson verwendet teilweise andere
9603Pseudobefehle als AS.  Au"ser der Tatsache, da"s AS Pseudobefehle nicht
9604mit einem vorangestellten Punkt kennzeichnet, sind folgende Befehle
9605identisch:
9606\begin{verbatim}
9607  ASCII, ASCIZ, BLOCK, BYTE, END, ENDM, EQU, ERROR, MACRO,
9608  ORG, TITLE, WARNING
9609\end{verbatim}
9610Tabelle \ref{TabAST6} zeigt die AST6-Befehle, zu denen analoge in AS
9611existieren.
9612\par
9613\begin{table*}[htbp]
9614\begin{center}\begin{tabular}{|l|l|l|}
9615\hline
9616AST6           &   AS                & Bedeutung/Funktion \\
9617\hline
9618\hline
9619\tty{.DISPLAY} &  \tty{MESSAGE}               & Meldung ausgeben \\
9620\hline
9621\tty{.EJECT}   &  \tty{NEWPAGE}               & neue Seite im Listing \\
9622\hline
9623\tty{.ELSE}    &  \tty{ELSEIF}                & bed. Assemblierung \\
9624\hline
9625\tty{.ENDC}    &  \tty{ENDIF}                 & bed. Assemblierung \\
9626\hline
9627\tty{.IFC}     &  \tty{IF...}                 & bed. Assemblierung \\
9628\hline
9629\tty{.INPUT}   &  \tty{INCLUDE}               & Include-Datei einbinden \\
9630\hline
9631\tty{.LIST}    &  \tty{LISTING}, \tty{MACEXP\_DFT} & Listing-Einstellung \\
9632\hline
9633\tty{.PL}      &  \tty{PAGE}                  & Seitenl"ange Listing \\
9634\hline
9635\tty{.ROMSIZE} &  \tty{CPU}                   & Zielprozessor einstellen \\
9636\hline
9637\tty{.VERS}    &  \tty{VERSION} (Symbol)      & Version abfragen \\
9638\hline
9639\tty{.SET}     &  \tty{EVAL}                  & Variablen neu setzen \\
9640\hline
9641\end{tabular}\end{center}
9642\caption{"aquivalente Befehle AST6$\leftrightarrow$AS\label{TabAST6}}
9643\end{table*}
9644
9645%%---------------------------------------------------------------------------
9646
9647\section{ST7}
9648
9649In \cite{ST7Man} ist der '.w'-Postfix f"ur 16-Bit-Adressen nur f"ur
9650speicherindirekte Operanden definiert, um zu vermerken, da"s auf einer
9651Zeropageadresse eine 16-bittige Adresse liegt; AS unterst"utzt ihn jedoch
9652zus"atzlich auch f"ur absolute Adressen oder Displacements in indizierter
9653Adressierung, um trotz eines nur 8 Bit langen Wertes (0..255) ein
965416-bittiges Displacement zu erzeugen.
9655
9656%%---------------------------------------------------------------------------
9657
9658\section{ST9}
9659
9660Die Bitadressierungsm"oglichkeiten des ST9 sind relativ eingeschr"ankt:
9661Mit Ausnahme des \tty{BTSET}-Befehls ist es nur m"oglich, auf Bits innerhalb
9662des aktuellen Arbeitsregistersatzes zuzugreifen.  Eine Bit-Adresse
9663sieht also folgenderma"sen aus:
9664\begin{verbatim}
9665  rn.[!]b
9666\end{verbatim}
9667wobei \verb?!? eine optionale Invertierung eines Quelloperanden bedeutet.
9668Wird ein Bit symbolisch mittels des \tty{BIT}-Befehles definiert, so wird
9669die Registernummer im Symbolwert in Bit 7..4, die Bitnummer in Bit
96703..1 und eine optionale Invertierung in Bit 0 vermerkt.  AS unterscheidet
9671direkte und symbolische Bitangaben am Fehlen eines Punktes,
9672der Name eines Bitsymboles darf also keinen Punkt enthalten, obwohl
9673sie an sich zul"assig w"aren.  Es ist auch zul"assig, bei der Referenzierung
9674von Bitsymbolen diese zu nachtr"aglich zu invertieren:
9675\begin{verbatim}
9676bit2    bit     r5.3
9677        .
9678        .
9679        bld	r0.0,!bit2
9680\end{verbatim}
9681Auf diese Weise ist es auch m"oglich, eine inverse Definition nachtr"aglich
9682wieder aufzuheben.
9683\par
9684Bitdefinitionen finden sich in gro"ser Zahl in der Include-Datei
9685REGST9.INC, in der die Register- und Bitnamen aller On-Chip-Peripherie
9686beschrieben sind.  Beachten Sie jedoch, da"s deren Nutzung
9687nur m"oglich ist, wenn die Arbeitsregisterbank vorher auch auf diese
9688Register ausgerichtet wurde!
9689\par
9690Im Gegensatz zu der zum AST9 von SGS-Thomson geh"orenden Definitionsdatei
9691sind f"ur AS die Namen der Peripherieregister nur als allgemeine
9692Registernamen definiert (\tty{R...}), nicht auch noch als Arbeitsregister
9693(\tty{r...}).  Dies ist so, weil AS Geschwindigkeitsgr"unden keine
9694Aliasnamen f"ur Register definieren kann.
9695
9696%%---------------------------------------------------------------------------
9697
9698\section{6804}
9699
9700Eigentlich habe ich diesen Prozessor ja nur eingebaut, um mich "uber
9701das seltsame Gebaren von SGS-Thomson zu beklagen: Als ich das
97026804-Datenbuch zum ersten Mal in die Hand bekam, f"uhlte ich mich ob des
9703etwas ,,unvollst"andigen'' Befehlssatzes und der eingebauten Makros
9704spontan an die ST62-Serie vom gleichen Hersteller erinnert.  Ein
9705genauerer Vergleich der Opcodes f"orderte erstaunliches zu Tage:
9706Ein 6804-Opcode ergibt sich durch Spiegelung aller Bits im entsprechenden
9707ST62-OpCode!  Thomson hat hier also offensichtlich etwas
9708Prozessorkern-Recycling betrieben...wogegen ja auch nichts einzuwenden
9709w"are, wenn nicht so eine Verschleierungstaktik betrieben werden w"urde:
9710andere Peripherie, Motorola- anstelle Zilog-Syntax sowie das h"a"sliche
9711Detail, in Opcodes enthaltene Argumente (z.B. Bitfelder mit Displacements)
9712\bb{nicht} zu drehen. Letzterer Punkt hat mich auch nach l"angerem "Uberlegen
9713dazu bewogen, den 6804 doch in AS aufzunehmen.  Ich wage "ubrigens keine
9714Spekulationen, welche Abteilung bei Thomson von welcher abgekupfert hat...
9715\par
9716Im Gegensatz zur ST62-Version enth"alt die Include-Datei f"ur den
97176804 keine Makros, die die L"ucken im Befehlssatz etwas ,,auspolstern''
9718sollen.  Dies "uberlasse ich dem geneigten Leser als Finger"ubung!
9719
9720%%---------------------------------------------------------------------------
9721
9722\section{TMS3201x}
9723
9724Offensichtlich ist es Ehrgeiz jedes Prozessorherstellers, seine eigene
9725Notation f"ur Hexadezimalkonstanten zu erfinden.  Texas Instruments
9726war bei diesen Prozessoren besonders originell: ein vorangestelltes
9727$>$-Zeichen!  Die "Ubernahme dieses Formates in AS h"atte zu schweren
9728Konflikten mit den Vergleichs-und Schiebeoperatoren von AS im Formelparser
9729gef"uhrt.  Ich habe mich deshalb f"ur die Intel-Notation entschieden, zu
9730der sich TI bei der 340x0-Serie und den 3201x-Nachfolgern ja dann auch
9731durchgerungen hat...
9732\par
9733Leider hat das Instruktionswort dieser Prozessoren nicht gen"ugend Bits,
9734um bei direkter Adressierung alle 8 Bits zu enthalten, weshalb der
9735Datenadre"sraum logisch in 2 B"anke zu 128 W"ortern gespalten ist.  AS
9736verwaltet diesen als ein durchgehendes Segment von 256 W"ortern und
9737l"oscht bei direkten Zugriffen automatisch das Bit 7 (Ausnahme: Befehl
9738\tty{SST}, der nur in die obere Bank schreiben kann). Der Programmierer
9739ist daf"ur erforderlich, da"s das Bank-Bit stets den richtigen Wert hat!
9740\par
9741Ein weiterer, nur sehr versteckt im Datenbuch stehender Hinweis: Die
9742\tty{SUBC}-Anweisung ben"otigt zur Ausf"uhrung intern mehr als einen
9743Takt, das Steuerwerk arbeitet jedoch schon an dem n"achsten Befehl weiter.
9744Im auf ein \tty{SUBC} folgenden Befehl darf deshalb nicht auf den
9745Akkumulator zugegriffen werden.  AS nimmt hier \bb{keine} Pr"ufung vor!
9746
9747%%---------------------------------------------------------------------------
9748
9749\section{TMS320C2x}
9750
9751Da ich nicht selber diesen Codegenerator geschrieben habe (was nichts an
9752seiner Qualit"at mindert), kann ich nur kurz hier umrei"sen, wieso es
9753Befehle gibt, bei denen ein vorangestelltes Label als untypisiert, d.h.
9754keinem Adre"sraum zugeordnet, gespeichert wird:  Der 20er der TMS-Reihe
9755kennt sowohl ein 64 Kbyte gro"ses Code- als auch Datensegment.  Je nach
9756externer Beschaltung kann man dabei Code- und Datenbereiche "uberlappen,
9757um z.B. Konstanten im Codebereich zu abzulegen und auf diese als Daten
9758zuzugreifen (Ablage im Code ist notwendig, weil "altere AS-Versionen davon
9759ausgehen, da"s ein Datensegment aus RAM besteht, das in einem
9760Standalone-System nach dem Einschalten keinen definierten Inhalt hat und
9761verweigern in Segmenten au"ser Code deshalb die Ablage von Daten).  Ohne
9762dieses Feature w"urde AS nun jeden Zugriff auf die abgelegten Daten mit
9763einer Warnung (,,Symbol aus falschem Segment'') quittieren.  Im einzelnen
9764erzeugen folgende Pseudobefehle untypisierte Labels:
9765\begin{quote}
9766  {\tt BSS, STRING, RSTRING, BYTE, WORD , LONG, FLOAT \\
9767  DOUBLE, EFLOAT, BFLOAT} und {\tt TFLOAT}
9768\end{quote}
9769Sollten doch einmal typisierte Labels gew"unscht sein, so kann man sich
9770behelfen, indem man das Label in eine getrennte Zeile vor dem Pseudobefehl
9771schreibt.  Umgekehrt kann man einen der anderen Pseudobefehle mit einem
9772typenlosen Label versehen, indem man vor dem Befehl das Label mit
9773\begin{verbatim}
9774<Name>  EQU     $
9775\end{verbatim}
9776definiert.
9777
9778%%---------------------------------------------------------------------------
9779
9780\section{TMS320C3x/C4x}
9781
9782Die gr"o"sten Magenschmerzen bei diesem Prozessor hat mir die Syntax
9783paralleler Befehle bereitet, die auf zwei Zeilen verteilt werden,
9784wobei beide Befehle an sich auch sequentiell ausgef"uhrt werden k"onnen.
9785Deshalb erzeugt AS zuerst den Code f"ur die einzelne erste Operation,
9786wenn er dann in der zweiten Zeile erkennt, da"s eine parallele Aweisung
9787vorliegt, wird der zuerst erzeugte Code durch den neuen ersetzt.
9788Im Listing kann man dies daran erkennen, da"s der Programmz"ahler
9789nicht weiterl"auft und in der zweiten Zeile anstelle eines Doppelpunktes
9790ein \tty{R} vor dem erzeugten Code steht.
9791\par
9792Bez"uglich der doppelten senkrechten Striche und ihrer Position in der
9793Zeile ist man nicht ganz so flexibel wie beim TI-Assembler: Entweder
9794man schreibt sie anstelle eines Labels (d.h. in der ersten Spalte oder
9795mit einem angeh"angten Doppelpunkt, das ist aber nicht mehr
9796TI-kompatibel...) oder direkt vor den zweiten Befehl ohne Leerzeichen,
9797sonst bekommt der Zeilenparser von AS Probleme und h"alt die Striche
9798f"ur das Mnemonic.
9799
9800%%---------------------------------------------------------------------------
9801
9802\section{TMS9900}
9803
9804Wie bei den meisten "alteren Prozessorfamilien auch, hatte TI seinerzeit
9805ein eigenes Format zur Schreibweise von Hexadezimal- und Bin"arkonstanten
9806verwendet, anstelle deren AS die normale, heute auch bei TI
9807gebr"auchliche Intel-Notation verwendet.
9808
9809Die TI-Syntax f"ur Register erlaubt es, da"s anstelle eines echten Namens
9810(entweder \tty{Rx} oder \tty{WRx}) auch eine einfache Integer-Zahl
9811zwischen 0 und 15 benutzt werden kann.  Dies hat zwei Folgen:
9812\begin{itemize}
9813\item{\tty{R0...R15} bzw. \tty{WR0..WR15} sind einfache, vordefinierte
9814      Integersymbole mit den Werten 0..15, und die Definition von
9815      Registeraliasen funktioniert "uber schlichte \tty{EQUs}.}
9816\item{Im Gegensatz zu einigen anderen Prozessoren kann ich nicht das
9817      zus"atzliche AS-Feature anbieten, da"s das Kennzeichen f"ur
9818      absolute Adressierung (hier ein Klammeraffe) weggelassen werden
9819      darf.  Da ein fehlendes Kennzeichen hier aber Registernummern (im
9820      Bereich 0 bis 15) bedeuten w"urde, war das hier nicht m"oglich.}
9821\end{itemize}
9822Weiterhin wechselt TI mit der Registerbezeichnung zwischen \tty{Rx} und
9823\tty{WRx}...vorerst ist beides zugelassen.
9824
9825%%---------------------------------------------------------------------------
9826
9827\section{TMS70Cxx}
9828
9829Diese Prozessorreihe geh"ort noch zu den "alteren, von TI entwickelten
9830Reihen, und deswegen benutzt TI in ihren eigenen Assemblern noch die
9831herstellereigene Syntax f"ur hexadezimale und bin"are Konstanten
9832(vorangestelltes $<$ bzw. ?).  Da das in AS aber so nicht machbar ist, wird
9833defaultm"a"sig die Intel-Syntax verwendet.  Auf diese ist Texas bei den
9834Nachfolgern dieser Familie, n"amlich den 370ern auch umgestiegen.  Beim
9835genaueren Betrachten des Maschinenbefehlssatzes stellt man fest, da"s
9836ca. 80\% der 7000er-Befehle bin"ar aufw"artskompatibel sind, und auch die
9837Assemblersyntax ist fast gleich - aber eben nur fast.  Bei der Erweiterung
9838des 7000er-Befehlssatzes hat TI n"amlich auch gleich die Chance genutzt,
9839die Syntax etwas zu vereinheitlichen und zu vereinfachen.  Ich habe mich
9840bem"uht, einen Teil dieser "anderungen auch in die 7000er Syntax
9841einflie"sen zu lassen:
9842\begin{itemize}
9843\item{Anstelle eines Prozentzeichens zur Kennzeichnung von
9844      unmittelbarer Adressierung darf auch das allgemein bekanntere Doppelkreuz
9845      verwendet werden.}
9846\item{Wenn bei den Befehlen \tty{AND, BTJO, BTJZ, MOV, OR} und
9847      \tty{XOR} eine Port-Adresse (\tty{P...}) als Quelle oder Ziel
9848      benutzt wird, ist es nicht notwendig, die Mnemonic-Form mit explizit
9849      angeh"angtem \tty{P} zu benutzen - die allgemeine Form reicht genauso
9850      aus.}
9851\item{Der vorangestelle Klammeraffe f"ur absolute oder B-indizierte
9852      Adressierung darf weggelassen werden.}
9853\item{Anstelle des \tty{CMPA}-Befehls darf auch einfach
9854      \tty{CMP} mit \tty{A} als Ziel benutzt werden.}
9855\item{Anstelle \tty{LDA} oder \tty{STA} darf auch einfach der \tty{MOV}-Befehl
9856      mit \tty{A} als Ziel bzw. Quelle benutzt werden.}
9857\item{Anstelle des \tty{MOVD}-Befehls darf auch \tty{MOVW} benutzt werden.}
9858\item{Anstelle von \tty{RETS} oder \tty{RETI} darf auch verk"urzt
9859      \tty{RTS} bzw. \tty{RTI} geschrieben werden.}
9860\item{\tty{TSTA} bzw. \tty{TSTB} d"urfen auch als \tty{TST A} bzw. \tt{TST
9861      B} geschrieben werden.}
9862\item{\tty{XCHB B} ist als Alias f"ur \tty{TSTB} zugelassen.}
9863\end{itemize}
9864Wichtig - diese Varianten sind nur beim TMS70Cxx zugelassen - entsprechende
98657000er-Varianten sind bei den 370ern {\em nicht} erlaubt!
9866
9867%%---------------------------------------------------------------------------
9868
9869\section{TMS370xxx}
9870
9871Obwohl diese Prozessoren keine speziellen Befehle zur Bitmanipulation
9872besitzen, wird mit Hilfe des Assemblers und des \tty{DBIT}-Befehles
9873(siehe dort) die Illusion erzeugt, als ob man einzelne Bits manipulieren
9874w"urde.  Dazu wird beim \tty{DBIT}-Befehl eine Adresse mit einer
9875Bitposition zusammengefa"st und in einem Symbol abgelegt, das man dann
9876als Argument f"ur die Pseudobefehle \tty{SBIT0, SBIT1, CMPBIT, JBIT0}
9877und \tty{JBIT1} verwenden kann.  Diese werden in die Befehle
9878\tty{OR, AND, XOR, BTJZ} und \tty{BTJO} mit einer passenden Bitmaske
9879"ubersetzt.
9880\par
9881An diesen Bit-Symbolen ist "uberhaupt nichts geheimnisvolles, es handelt
9882sich um schlichte Integerwerte, in deren unterer H"alfte die
9883Speicheradresse und in deren oberer H"alfte die Bitstelle gespeichert
9884wird.  Man k"onnte sich seine Symbole also auch ohne weiteres selber
9885basteln:
9886\begin{verbatim}
9887defbit  macro   name,bit,adr
9888name    equ     adr+(bit<<16)
9889        endm
9890\end{verbatim}
9891aber mit dieser Schreibweise erreicht man nicht den \tty{EQU}-artigen Stil,
9892den Texas vorgegeben hat (d.h. das zu definierende Symbol steht anstelle
9893eines Labels).  ACHTUNG!  Obwohl \tty{DBIT} eine beliebige Adresse
9894zul"a"st, k"onnen f"ur die Pseudobefehle nur die Adressen 0..255 und
98951000h..10ffh verwendet werden, eine absolute Adressierungsart kennt
9896der Prozessor an dieser Stelle nicht...
9897
9898%%---------------------------------------------------------------------------
9899
9900\section{MSP430(X)}
9901\label{MSPSpec}
9902
9903Der MSP430 wurde als RISC-Prozessor mit minimalem Stromverbrauch
9904konzipiert.  Aus diesem Grund ist der Satz von Befehlen, die der
9905Prozessor in Hardware versteht, auf das absolut notwendige reduziert
9906worden (da RISC-Prozessoren keinen Mikrocode besitzen, mu"s jeder
9907Befehl mit zus"atzlichem Silizium implementiert werden und erh"oht so
9908den Stromverbrauch).  Eine Reihe von Befehlen, die bei anderen
9909Prozessoren in Hardware gegossen wurden, werden beim MSP durch eine
9910Emulation mit anderen Befehlen realisiert.  Fr"uhere Versionen
9911von AS implementierten diese Befehle "uber Makros in der Datei
9912\tty{REGMSP.INC}.  Wer diese Datei nicht einband, erhielt bei "uber
9913der H"alfte der insgesamt von TI definierten Befehle
9914Fehlermeldungen.  Dies ist aktuell nicht mehr so, zusammen mit
9915der Erweiterung auf den CPU430X-Befehlssatz werden die
9916Instruktionen vom Assembler direkt implementiert.
9917\tty{REGMSP.INC} enth"alt nur noch die Adressen von I/O-Registern.
9918Wer aus irgendwelchen Gr"unden die alten Makros braucht, findet
9919sie jetzt in der Datei \tty{EMULMSP.INC}.
9920
9921Die emulierten Instruktionen decken auch einige Sonderf"alle ab,
9922die der TI-Assembler nicht beherrscht.  So wird zum Beispiel
9923\begin{verbatim}
9924    rlc  @r6+
9925\end{verbatim}
9926automatisch in
9927\begin{verbatim}
9928    addc @r6+,-2(r6)
9929\end{verbatim}
9930umgesetzt.
9931
9932%%---------------------------------------------------------------------------
9933
9934\section{TMS1000}
9935
9936Der erste Mikrocontroller der Welt nun endlich auch in AS - lange hat es
9937gedauert, nun ist die L"ucke geschlossen.  Dieses Target hat aber einige
9938T"ucken, die in diesem Abschnitt kurz angesprochen werden sollen.
9939
9940Zum einen ist der Befehlssatz dieser Controller teilweise "uber die ROM-Maske
9941ver"anderbar, d.h. man kann die Funktion einiger Opcodes in Grenzen frei
9942definieren.  AS kennt nur die Befehle und deren Kodierungen, die in
9943\cite{TMS1000PGMRef} als Default-Kodierungen beschrieben sind.  Wer f"ur eine
9944spezielle Anwendung andere Befehle bzw. gleiche Befehle mit anderem Opcode
9945hat, kann diese "uber Makros mit passende \tty{DB}-Befehlen "andern.
9946
9947Des weiteren ist zu beachten, da"s Spr"unge und Unterprogrammaufrufe nur die
9948unteren 6 Bit der Zieladresse im Befehl selber beinhalten.  Die oberen 4 bzw.
99495 Bits kommen aus Page- bzw. Chapter-Registern, die vorher passend zu setzen
9950sind.  AS selber kann hier nicht "uberpr"ufen, ob die Register vom Programmierer
9951korrekt gesetzt werden!.  Zumindest f"ur den Fall, da"s man im gleichen Chapter
9952bleibt, gibt es die Assembler-Pseudobefehle \tty{CALLL} bzw.
9953\tty{BL}, die einen \tty{LDP}- und einen \tty{CALL/BR}-Befehl zusammenfassen
9954(was angesichts des kanppen Programmspeichers eine bequeme, aber nicht immer
9955effiziente Variante ist).
9956
9957%%---------------------------------------------------------------------------
9958
9959\section{COP8 \& SC/MP}
9960\label{COP8Spec}
9961
9962Leider Gottes hat sich auch National dazu entschieden, als
9963Schreibweise f"ur nichtdezimale Integer-Konstanten die von
9964IBM-Gro"srechnern bekannte (und von mir vielgeha"ste) Variante
9965\verb!X'...! zu benutzen.  Das geht nat"urlich (wie immer) nicht.
9966Zum Gl"uck scheint der ASMCOP aber auch die C-Variante zuzulassen,
9967und diese wurde deshalb der Default f"ur die COPs...
9968
9969%%---------------------------------------------------------------------------
9970
9971\section{SC144xxx}
9972\label{SC144xxspec}
9973
9974Original gab es f"ur diese Reihe von DECT-Controllern mit relativ
9975einfachem Befehlssatz nur einen sehr schlichten Assembler von National
9976selber.  Ein Assembler von IAR Systems ist angek"undigt, aber noch nicht
9977erh"altlich.  Da die Entwicklungstools von IAR allerdings auch nach
9978M"oglichkeit CPU-unabh"angig angelegt sind, kann man anhand erh"altlicher
9979Zielplattformen in ungef"ahr absch"atzen, wie dessen Pseudobefehle
9980aussehen werden, und damit im Blick sind die (wenigen) SC144xx-spezifisch
9981realisierten Befehle {\tt DC, DC8, DW16, DS, DS8, DS16, DW} angelegt. Bei
9982Befehlen, die bereits im AS-Kern angelegt sind, wollte ich nat"urlich
9983nicht das Rad neu erfinden, deshalb hier eine Tabelle mit "Aquivalenzen:
9984
9985Die Befehle \tty{ALIGN, END, ENDM, EXITM, MACRO, ORG, RADIX, SET} und
9986\tty{REPT} exisieren sowohl bei IAR als auch AS und haben gleiche
9987Bedeutung.  Bei folgenden Befehlen mu"s man umstellen:
9988
9989\begin{table*}[htb]
9990\begin{center}\begin{tabular}{|l|l|l|}
9991\hline
9992IAR & AS & Funktion\\
9993\hline
9994\hline
9995\tty{\#include} & \tty{include} & Include-Datei einbinden \\
9996\tty{\#define} & \tty{SET, EQU} & Symbole definieren \\
9997\tty{\#elif, ELIF, ELSEIF} & \tty{ELSEIF} & Weiterer Zweig einer IF-Kette \\
9998\tty{\#else, ELSE} & \tty{ELSE} & Letzter Zweig einer IF-Kette \\
9999\tty{\#endif, ENDIF} & \tty{ENDIF} & Beendet eine IF-Kette \\
10000\tty{\#error} & \tty{ERROR, FATAL} & Fehlermeldung erzeugen \\
10001\tty{\#if, IF} & \tty{IF} & Beginn einer IF-Kette\\
10002\tty{\#ifdef} & \tty{IFDEF} & Symbol definiert ? \\
10003\tty{\#ifndef} & \tty{IFNDEF} & Symbol nicht definiert ? \\
10004\tty{\#message} & \tty{MESSAGE} & Nachricht ausgeben \\
10005\tty{=, DEFINE, EQU} & \tty{=, EQU} & Feste Wertzuweisung \\
10006\tty{EVEN} & \tty{ALIGN 2} & Programmz"ahler gerade machen \\
10007\tty{COL, PAGSIZ} & \tty{PAGE} & Seitengr"o"se f"ur Listing setzen \\
10008\tty{ENDR} & \tty{ENDM} & Ende einer REPT-Struktur \\
10009\tty{LSTCND, LSTOUT} & \tty{LISTING} & Umfang des Listings steuern \\
10010\tty{LSTEXP, LSTREP} & \tty{MACEXP} & Expandierte Makros anzeigen? \\
10011\tty{LSTXRF} & \verb!<Kommandozeile>! & Querverweisliste erzeugen \\
10012\tty{PAGE} & \tty{NEWPAGE} & Neue Seite im Listing \\
10013\tty{REPTC} & \tty{IRPC} & Repetition mit Zeichenersetzung \\
10014\hline
10015\end{tabular}\end{center}
10016\end{table*}
10017
10018Keine direkte Entsprechung gibt es f"ur die Befehle {\tt CASEON, CASEOFF,
10019LOCAL, LSTPAG, \#undef} und {\tt REPTI}.
10020
10021Ein direktes "Aquivalent der Pr"aprozessorbefehle ist nat"urlich nicht
10022m"oglich, solange AS keinen C-artigen Pr"aprozessor besitzt.  C-artige
10023Kommentare sind im Moment leider auch nicht m"oglich.  Achtung: Wer
10024IAR-Codes f"ur AS umsetzt, mu"s die Pr"aprozessorstatements nicht nur
10025umwandeln, sondern auch aus Spalte 1 herausbewegen, da bei AS in Spalte 1
10026nur Labels stehen d"urfen!
10027
10028
10029%%---------------------------------------------------------------------------
10030
10031\section{uPD78(C)1x}
10032\label{78C1xSpec}
10033
10034F"ur relative, unbedingte Spr"unge gibt es den \tty{JR}-Befehl (Sprungdistanz
10035-32...+31, 1 Byte) sowie den \tty{JRE}-Befehl (Sprungdistanz -256...+255, 2
10036Bytes).  AS kennt weiterhin den Pseudobefehl \tty{J}, der automatisch den
10037k"urzestm"oglichen Befehl benutzt.
10038
10039Architektur und Befehlssatz dieser Prozessoren sind grob an den
10040Intel 8080/8085 angelehnt - das gilt auch f"ur die Mnemonics.  Die
10041Adressierungsart (direkt, indirekt, immediate) ist mit in das
10042Mnemonic verpackt, und 16-Bit-Register (BC, DE, HL) werden wie
10043beim 8080 mit einem Buchstaben abgek"urzt.  Da NEC in der
10044Erkl"arung der einzelnen Adressierungsarten aber immer mal
10045wieder die ausgeschriebenen Registernamen benutzt, und auch mal
10046und mal nicht Klammern benutzt, um indirekte Adressierung anzudeuten,
10047habe ich mich entschlossen, neben den 'offiziellen'
10048Notationen aus dem NEC-Manual auch einige alternative Notationen
10049zuzulassen.  Einige nicht-NEC-Tools wie z.B. Disassembler
10050scheinen solche Notationen ebenfalls zu benutzen:
10051
10052\begin{itemize}
10053\item{Anstelle \tty{B} darf auch \tty{BC}, \tty{(B)} oder
10054      \tty{(BC)} geschrieben werden.}
10055\item{Anstelle \tty{D} darf auch \tty{DE}, \tty{(D)} oder
10056      \tty{(DE)} geschrieben werden.}
10057\item{Anstelle \tty{H} darf auch \tty{HL}, \tty{(H)} oder
10058      \tty{(HL)} geschrieben werden.}
10059\item{Anstelle \tty{D+} darf auch \tty{DE+}, \tty{(D+)},
10060      \tty{(DE+)} oder \tty{(DE)+} geschrieben werden.}
10061\item{Anstelle \tty{H+} darf auch \tty{HL+}, \tty{(H+)},
10062      \tty{(HL+)} oder \tty{(HL)+} geschrieben werden.}
10063\item{Anstelle \tty{D-} darf auch \tty{DE-}, \tty{(D-)},
10064      \tty{(DE-)} oder \tty{(DE)-} geschrieben werden.}
10065\item{Anstelle \tty{H-} darf auch \tty{HL-}, \tty{(H-)},
10066      \tty{(HL-)} oder \tty{(HL)-} geschrieben werden.}
10067\item{Anstelle \tty{D++} darf auch \tty{DE++}, \tty{(D++)},
10068      \tty{(DE++)} oder \tty{(DE)++} geschrieben werden.}
10069\item{Anstelle \tty{H++} darf auch \tty{HL++}, \tty{(H++)},
10070      \tty{(HL++)} oder \tty{(HL)++} geschrieben werden.}
10071\item{Anstelle \tty{D--} darf auch \tty{DE--}, \tty{(D--)},
10072      \tty{(DE--)} oder \tty{(DE)--} geschrieben werden.}
10073\item{Anstelle \tty{H--} darf auch \tty{HL--}, \tty{(H--)},
10074      \tty{(HL--)} oder \tty{(HL)--} geschrieben werden.}
10075\item{Anstelle \tty{H+A} darf auch \tty{HL+A}, \tty{A+H},
10076      \tty{A+HL}, \tty{(H+A)}, \tty{(HL+A)}, \tty{(A+H)}
10077      oder \tty{(A+HL)} geschrieben werden.}
10078\item{Anstelle \tty{H+B} darf auch \tty{HL+B}, \tty{B+H},
10079      \tty{B+HL}, \tty{(H+B)}, \tty{(HL+B)}, \tty{(B+H)}
10080      oder \tty{(B+HL)} geschrieben werden.}
10081\item{Anstelle \tty{H+EA} darf auch \tty{HL+EA}, \tty{EA+H},
10082      \tty{EA+HL}, \tty{(H+EA)}, \tty{(HL+EA)}, \tty{(EA+H)}
10083      oder \tty{(EA+HL)} geschrieben werden.}
10084\end{itemize}
10085
10086%%---------------------------------------------------------------------------
10087
10088\section{75K0}
10089\label{75K0Spec}
10090
10091Wie bei einigen anderen Prozessoren auch, kennt die Assemblersprache
10092der 75er von NEC Pseudo-Bitoperanden, d.h. man kann einem Symbol
10093eine Kombination aus Adresse und Bitnummer zuweisen, die dann bei
10094bitorientierten Befehlen anstelle direkter Ausdr"ucke verwendet werden
10095kann.  Die drei folgenden Befehle erzeugen daher z.B. identischen
10096Code:
10097\begin{verbatim}
10098ADM     sfr     0fd8h
10099SOC     bit     ADM.3
10100
10101        skt     0fd8h.3
10102        skt     ADM.3
10103        skt     SOC
10104\end{verbatim}
10105AS unterscheidet direkte und symbolische Bitzugriffe an einem
10106bei Symbolen fehlenden Punkt; Punkte in Symbolnamen darf man daher
10107nicht verwenden, da es sonst zu Mi"sverst"andnissen bei der Aufl"osung
10108kommt.
10109\par
10110Die Ablage von Bitsymbolen orientiert sich dabei weitgehend an der
10111bin"aren Kodierung, die die Prozessorhardware selber verwendet:  Es
10112werden 16 Bit belegt, und es existieren ein ,,kurzes'' und ein ,,langes''
10113Format.  Das kurze Format kann folgende Varianten aufnehmen:
10114\begin{itemize}
10115 \item{direkte Zugriffe auf die Bereiche 0FBxH und 0FFxH}
10116 \item{indirekte Zugriffe der Form Adr.@L (0FC0H $\leq$ \tty{Adr} $\leq$ 0FFFH)}
10117 \item{indirekte Zugriffe der Form @H+d4.bit}
10118\end{itemize}
10119Das obere Byte ist auf 0 gesetzt, das untere Byte enth"alt den gem"a"s
10120\cite{NEC75} kodierten Bitausdruck.  Das lange Format kennt im Gegensatz
10121dazu nur direkte Adressierung, kann daf"ur aber (korrekte Einstellungen
10122von \tty{MBS} und \tty{MBE} vorausgesetzt) den ganzen Adre"sraum abdecken.
10123Bei langen Ausdr"ucken stehen im unteren Byte Bit 7..0 der Adresse, in
10124Bit 8 und 9 die Bitstelle sowie in Bit 10 und 11 konstant 01.  Letztere
10125erm"oglichen es, langes und kurzes Format einfach durch einen Vergleich
10126des oberen Bytes gegen Null zu unterscheiden.  Die Bits 12..15 enthalten
10127Bit 8..11 der Adresse; sie werden zwar nicht zur Generierung des Kodes
10128ben"otigt, m"ussen jedoch gespeichert werden, da eine Pr"ufung auf ein
10129korrektes Banking erst bei der Verwendung des Symboles erfolgen kann.
10130
10131%%---------------------------------------------------------------------------
10132
10133\section{78K0}
10134\label{78K0Spec}
10135
10136NEC benutzt in seinen Datenb"uchern zur Kennzeichnung der Zugriffsweise
10137auf absolute Adressen verschiedene Schreibweisen:
10138\begin{itemize}
10139\item{absolut kurz: kein Pr"afix}
10140\item{absolut lang: vorangestelltes \verb"!"}
10141\item{PC-relativ: vorangestelltes \verb"$"}
10142\end{itemize}
10143Bei AS sind diese Pr"afixe nur notwendig, falls man eine bestimmte
10144Adressierung erzwingen will und der Befehl verschiedene Varianten
10145zul"a"st.  Setzt man keinen Pr"afix, so w"ahlt AS automatisch die
10146k"urzeste Variante.  Es d"urfte daher in der Praxis sehr selten
10147notwendig sein, einen Pr"afix zu verwenden.
10148
10149%%---------------------------------------------------------------------------
10150
10151\section{78K2/78K3/78K4}
10152\label{78K234Spec}
10153
10154Analog wie beim 78K0 benutzt NEC auch hier wieder Dollar- und
10155Ausrufezeichen f"ur verschiedene L"angen von Adre"ssausdr"ucken.
10156Zwischen langen und kurzen Adressen (sowohl im RAM- als auch
10157SFR-Bereich) wird wieder automatisch entschieden, nur relative
10158Adressierung mu"s man manuell anw"ahlen, wenn ein Befehl beides
10159unterst"utzt (z.B. {\tt BR}).
10160
10161Noch eine Anmerkung (die im "ubrigens auch f"ur den 78K0 gilt): Wer
10162mittels {\tt RELAXED} mit Motorola-Syntax arbeitet, mu"s
10163Hexadezimalkonstanten klammern, weil das f"uhrende Dollarzeichen u.U. als
10164relative Adressierung mi"sverstanden wird...
10165
10166%%---------------------------------------------------------------------------
10167
10168\section{uPD772x}
10169
10170Sowohl 7720 als auch 7725 werden von dem gleichen Codegenerator behandelt
10171und sind sich in ihren Befehlssatz extrem "ahnlich.  Trotzdem sollte man
10172sich nicht zu der Annahme verleiten lassen, sie seien bin"ar kompatibel:
10173Um die l"angeren Adre"sfelder und zus"atzlichen Befehle unterbringen zu
10174k"onnen, haben sich die Bitpositionen einiger Felder im Instruktionswort
10175verschoben, die Instruktionsl"ange hat sich auch insgesamt von 23 auf 24
10176Bit ge"andert.  Im Code-Format sind deshalb auch unterschiedliche
10177Header-Ids f"ur beide reserviert.
10178
10179Gemeinsam ist beiden, da"s sie neben Code- und Datensegment auch noch ein
10180ROM zur Ablage von Konstanten besitzen.  Dieses ist bei AS auf das
10181\tty{ROMDATA}-Segment abgebildet!
10182
10183%%---------------------------------------------------------------------------
10184
10185\section{F2MC16L}
10186
10187Darauf, da"s man bei Anwendungen mit mehr als 64K ROM oder 64K RAM darauf
10188achten sollte, AS die korrekte momentane Belegung der Bank-Register
10189mitzuteilen, wurde bereits in Zusammenhang mit dem {\tt ASSUME}-Befehl
10190erw"ahnt.  AS "uberpr"uft bei jedem absoluten Zugriff anhand dieser
10191Annahmen, ob evtl. ein Zugriff auf eine Speicherstelle erfolgt, die
10192momentan "uberhaupt nicht greifbar ist.  Standardm"a"sig sind daf"ur
10193nat"urlich nur DTB und DPR wichtig, denn ADB bzw. SSB/USB werden nur bei
10194indirekten Zugriffen "uber RW2/RW6 bzw. RW3/RW7 benutzt, und bei
10195indirekten Zugriffen greift diese Pr"ufmimik ohnehin nicht.  Nun ist es
10196aber so, da"s man - "ahnlich wie beim 8086 - einem Befehl eine
10197Segmentpr"afix voranstellen kann, mit dem DTB f"ur den folgenden Befehl
10198durch ein beliebiges anderes Register ersetzt werden kann.  AS f"uhrt
10199deswegen "uber die verwendeten Pr"afixbefehle Buch und schaltet bei der
10200Pr"ufung f"ur den n"achsten {\em Prozessorbefehl} um - eine zwischen dem
10201Segmentpr"afix und Prozessorbefehl eingestreute Pseudoanweisung l"oscht
10202den Merker also {\em nicht}.  Dies gilt auch f"ur Pseudobefehle zur
10203Datenablage oder Ver"anderung des Programmz"ahlers - aber wer macht so
10204etwas schon ;-)
10205
10206%%---------------------------------------------------------------------------
10207
10208\section{MN161x}
10209
10210F"ur dieses Target gilt die Besonderheit, da"s man zwischen zwei
10211Code-Generatoren w"ahlen kann: Einer wurde freundlicherweise von Haruo Asano
10212geschrieben und ist "uber die CPU-Namen \tty{MN1610} bzw. \tty{MN1613}
10213erreichbar; der andere wurde von mir erstellt und ist "uber die Namen
10214\tty{MN1610ALT} bzw. \tty{MN1613ALT} aktivierbar.  Wer den erweiterten
10215Adre"sraum von 256 KWorten des MN1613 verwenden will, oder mit dem
10216Gleitkommaformat des MN1613 experimentieren will, mu"s das \tty{ALT}-
10217Target verwenden.
10218
10219%%---------------------------------------------------------------------------
10220
10221\section{KENBAK}
10222
10223Der KENBAK-1 wurde 1970 entwickelt, zu einer Zeit, als der erste
10224Mikroprozessor noch drei Jahre entfernt war.  Man kann davon ausgehen, da"s
10225er f"ur die Hobbyisten, die sich den Bausatz seinerzeit leisten konnten, ihr
10226erster und einziger Computer war.  Demzufolge hatten sie auch nichts, auf
10227dem sie einen Assembler f"ur diesen Computer h"atten laufen lassen k"onnen -
10228der KENBAK-1 mit seinem Speicher von 256 Byte war daf"ur viel zu klein.  Die
10229pr"aferierte Methode waren vorgedruckte Tabellen, in die man die Befehle und
10230ihren Maschinencode eintrug.  War man mit dieser ,,Programmierung'' fertig,
10231konnte man den Code "uber die Schalterleiste per Hand in den Computer laden.
10232
10233Daraus resultiert leider, da"s die Assembler-Sprache des KENBAK zwar im
10234Programming Manual beschrieben, aber nicht wirklich formal definiert ist.  Als
10235Grant Stockly vor ein paar Jahren neue KENBAK-Kits herausbrachte, hat er
10236eine erste KENBAK-Portierung f"ur meinen Assembler gemacht, die hat ihren
10237Weg jedoch leider nie wieder ''upstream'' gefunden.  In meiner Implementierung
10238habe ich versucht, seine Ideen aufzugreifen, jedoch andererseits auch eine
10239Syntax anzubieten, wie sie Programmierern eines 6502, Z80 oder "ahnlichem
10240eher vertraut sein d"urfte.  In der folgenden Tabelle sind die Syntax-Unterschiede
10241gegen"uber gestellt:
10242
10243\hfuzz=5pt
10244\begin{center}\begin{longtable}{|l|l|l|}
10245\hline
10246Stockly & Alternativ & Bemerkung \\
10247\hline
10248\hline
10249\endhead
10250\multicolumn{3}{|l|}{\bf Arithmetisch/Logisch (ADD/SUB/LOAD/STORE/AND/OR/LNEG)} \\
10251\hline
10252{\it instr} {\tt Constant}, {\it Reg}, {\it Wert}, & {\it instr} {\it Reg}, {\it \#Wert} & immediate \\
10253{\it instr} {\tt Memory}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it Addr} & direkt \\
10254{\it instr} {\tt Indirect}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it (Addr)} & direkt \\
10255{\it instr} {\tt Indexed}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it Addr},X & indiziert \\
10256{\it instr} {\tt Indirect-Indexed}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it (Addr)},X & indirekt-indiziert \\
10257\hline
10258\multicolumn{3}{|l|}{\bf Spr"unge} \\
10259\hline
10260{\tt JPD} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JP} {\it Reg}, {\it Cond}, {\it Addr} & bedingt-direkt \\
10261{\tt JPI} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JP} {\it Reg}, {\it Cond}, {\it (Addr)} & bedingt-indirekt \\
10262{\tt JMD} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JM} {\it Reg}, {\it Cond}, {\it Addr} & bedingt-direkt \\
10263{\tt JMI} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JM} {\it Reg}, {\it Cond}, {\it (Addr)} & bedingt-indirekt \\
10264{\tt JPD} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JP} {\it Addr} & unbedingt-direkt \\
10265{\tt JPI} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JP} {\it (Addr)} & unbedingt-indirekt \\
10266{\tt JMD} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JM} {\it Addr} & unbedingt-direkt \\
10267{\tt JMI} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JM} {\it (Addr)} & unbedingt-indirekt \\
10268\hline
10269\multicolumn{3}{|l|}{\bf Sprungbedingungen} \\
10270\hline
10271{\tt Non-zero} & {\tt NZ} & $\neq 0$ \\
10272{\tt Zero} & {\tt Z} & $= 0$ \\
10273{\tt Negative} & {\tt N} & $< 0$ \\
10274{\tt Positive} & {\tt P} & $\geq 0$ \\
10275{\tt Positve-Non-zero} & {\tt PNZ} & $ > 0$ \\
10276\hline
10277\multicolumn{3}{|l|}{\bf Skips} \\
10278\hline
10279{\tt SKP 0}, {\it bit}, {\it Addr} & {\tt SKP0} {\it bit}, {\it Addr} {\it [,Dest]} & \\
10280{\tt SKP 1}, {\it bit}, {\it Addr} & {\tt SKP1} {\it bit}, {\it Addr} {\it [,Dest]} & \\
10281\hline
10282\multicolumn{3}{|l|}{\bf Bitmanipulation} \\
10283\hline
10284{\tt SET 0}, {\it bit}, {\it Addr} & {\tt SET0} {\it bit}, {\it Addr} & \\
10285{\tt SET 1}, {\it bit}, {\it Addr} & {\tt SET1} {\it bit}, {\it Addr} & \\
10286\hline
10287\multicolumn{3}{|l|}{\bf Schiebe/Rotierbefehle} \\
10288\hline
10289{\tt SHIFT LEFT}, {\it cnt}, {\it Reg} & {\tt SFTL} {\it [cnt,]} {\it Reg} & \\
10290{\tt SHIFT RIGHT}, {\it cnt}, {\it Reg} & {\tt SFTR} {\it [cnt,]} {\it Reg} & arithm. Shift \\
10291{\tt ROTATE LEFT}, {\it cnt}, {\it Reg} & {\tt ROTL} {\it [cnt,]} {\it Reg} & \\
10292{\tt ROTATE RIGHT}, {\it cnt}, {\it Reg} & {\tt ROTR} {\it [cnt,]} {\it Reg} & \\
10293\hline
10294\caption{KENBAK-Befehlssyntax \label{TabKENBAKSyntax}}
10295\end{longtable}\end{center}
10296\hfuzz=0pt
10297
10298Es gibt keinen Pseudobefehl, um zwischen diesen beiden Syntax-Varianten umzuschalten.
10299Beide d"urfen jederzeit und auch in beliebiger Mischung genutzt werden.
10300
10301Die Zieladresse {\it [Dest]}, die man optional bei den Skip-Befehlen angeben
10302kann, geht nicht in den erzeugten Code ein.  Der Assembler "uberpr"uft lediglich,
10303ob der Prozessor zur Laufzeit wirklich zur angegebene Adresse springen w"urde.
10304Dadurch kann z.B. gepr"uft werden, ob man nicht versehentlich versucht, einen
10305einzelnen Ein-Byte-Befehl zu "uberspringen.  Ein weggelassenes Schiebeargument
10306{\it [cnt]} bedeutet, da"s um eine Stelle geschoben werden soll.
10307
10308%%===========================================================================
10309
10310\cleardoublepage
10311\chapter{Dateiformate}
10312
10313In diesem Kapitel sollen die Formate von von AS erzeugten Dateien
10314beschrieben werden, deren Format sich nicht direkt erschlie"st.
10315
10316\section{Code-Dateien}
10317\label{SectCodeFormat}
10318
10319Das vom Assembler ausgegebene Codedatenformat mu"s in der Lage sein,
10320die Codeteile f"ur unterschiedliche Prozessoren voneinander zu trennen,
10321und sieht daher etwas anders aus als g"angige Formate.  Obwohl dem
10322Assembler Tools zur Bearbeitung der Codedateien beiliegen, halte ich es
10323f"ur guten Stil, das Format hier kurz offenzulegen:
10324\par
10325Sofern in der Datei Mehrbyte-Integers gespeichert sind, werden sie
10326im Intelformat abgelegt, d.h. mit dem LSB zuerst.  Diese Regel gilt
10327bereits f"ur das 16-Bit-Kennungswort mit dem Wert \$1489, d.h. jede
10328Codedatei beginnt mit den Bytes \$89/\$14.
10329\par
10330Danach folgt eine Reihe beliebig vieler ,,Records'', wobei ein Record
10331entweder ein zusammenh"angendes Teilfeld des Codes darstellt oder bestimmte
10332Zusatzinformationen enth"alt.  Eine Datei
10333kann auch ohne Umschaltung des Prozessortyps mehrere Records enthalten,
10334wenn Code- oder Konstantenbereiche durch reservierte (und nicht zu
10335initialisierende) Speicherbereiche unterbrochen werden.  Der Assembler
10336versucht auf diese Weise, die Datei nicht l"anger als n"otig werden
10337zu lassen.
10338\par
10339Allen Records ist gemein ist ein Header-Byte, das den Typ des Records
10340und die damit folgenden Datenstrukturen festlegt.  In einer Pascal-artigen
10341Form l"a"st sich die Record-Struktur folgenderma"sen beschreiben:
10342\begin{verbatim}
10343FileRecord = RECORD CASE Header:Byte OF
10344              $00:(Creator:ARRAY[] OF Char);
10345              $01..
10346              $7f:(StartAdr : LongInt;
10347                   Length   : Word;
10348                   Data     : ARRAY[0..Length-1] OF Byte);
10349              $80:(EntryPoint:LongInt);
10350              $81:(Header   : Byte;
10351                   Segment  : Byte;
10352                   Gran     : Byte;
10353                   StartAdr : LongInt;
10354                   Length   : Word;
10355                   Data     : ARRAY[0..Length-1] OF Byte);
10356             END
10357\end{verbatim}
10358Was in dieser Schreibweise nicht ganz zum Ausdruck kommt, ist, da"s
10359die L"ange von Datenfeldern variabel ist und von {\tt Length} abh"angt.
10360\par
10361Ein Record mit einem Header-Byte von \verb!$81! ist ein Record, der Code
10362oder Daten aus beliebigen Segmenten beinhalten kann.  Das erste
10363Byte (Header) gibt an, f"ur welche Prozessorfamilie die folgenden
10364Daten bzw. der folgende  Code bestimmt ist (siehe Tabelle \ref{TabHeader}).
10365
10366\begin{center}\begin{longtable}{|c|l||c|l|}
10367\hline
10368Header & Familie & Header & Familie \\
10369\hline
10370\hline
10371\endhead
10372\input{../doc_COM/tabids.tex}
10373\hline
10374\caption{Headerbytes f"ur die verschiedenen Prozessorfamilien}
10375\label{TabHeader}
10376\end{longtable}\end{center}
10377
10378Das Segment-Feld gibt an, in welchen Adre"sraum des Prozessors der
10379folgende Code geh"ort.  Dabei gilt die in Tabelle \ref{TabSegments}
10380angegeben Zuordnung.
10381\begin{table*}[htbp]
10382\begin{center}\begin{tabular}{|c|l||c|l|}
10383\hline
10384Nummer & Segment & Nummer & Segment \\
10385\hline
10386\hline
10387\$00 &    $<$undefiniert$>$    & \$01 &    CODE \\
10388\$02 &    DATA                 & \$03 &    IDATA \\
10389\$04 &    XDATA                & \$05 &    YDATA \\
10390\$06 &    BDATA                & \$07 &    IO \\
10391\$08 &    REG                  & \$09 &    ROMDATA \\
10392\hline
10393\end{tabular}\end{center}
10394\caption{Kodierungen des {\tt Segment}-Feldes\label{TabSegments}
10395         \label{TabSegmentNums}}
10396\end{table*}
10397Das Gran-Feld gibt die ,,Granularit"at'' des Codes an, d.h. die Gr"o"se
10398der kleinsten, adressierbaren Einheit im folgenden Datensatz.  Dieser
10399Wert ist eine Funktion von Prozessortyp und Segment und ein wichtiges
10400Detail f"ur die Interpretation der beiden folgenden Felder, die
10401Startadresse und L"ange angeben: W"ahrend die Startadresse sich auf die
10402Granularit"at bezieht, erfolgt die L"angenangabe immer in Bytes!  W"are
10403die Startadresse z.B. \$300 und die L"ange 12, so w"are die sich
10404ergebende Endadresse bei einer Granularit"at von 1 \$30b, bei einer
10405Granularit"at von z.B. 4 jedoch \$303!  Andere Granularit"aten als eins
10406sind selten und treten in erster Linie bei Signalprozessoren auf, die
10407nicht  auf Einzelbyteverarbeitung ausgelegt sind deren Datenspeicher z.B.
10408aus 64kWorten zu 16 Bit besteht (DSP56K).  Der sich ergebende Speicherplatz
10409betr"agt dann zwar 128 KByte, er ist aber in $2^{16}$ Worten organisiert,
10410die mit Adressen von 0,1,2,...65535 adressiert werden!
10411\par
10412Die Startadresse ist 32-bittig, unabh"angig von der Adre"sbreite der
10413jeweiligen Prozessorfamilie.  Im Gegensatz dazu ist die L"angenangabe
10414nur 16 Bit lang, ein Record kann also maximal (4+4+2+(64K-1)) = 65545
10415Byte lang werden.
10416\par
10417Daten-Records mit den Header-Bytes \verb!$01..$7f! stellen eine
10418Kurzschreibweise dar und stellen die Abw"artskompatibilit"at mit fr"uheren
10419Definitionen des Dateiformats her: Das Header-Byte gibt direkt den
10420Prozessortyp gem"a"s der ersten Tabelle an, das Zielsegment ist auf \tty{CODE}
10421festgelegt und die Granularit"at ergibt sich aus dem Prozessortyp,
10422aufgerundet auf eine Zweierpotenz von Bytes.  AS bevorzugt diese Records,
10423wenn Daten bzw. Code f"ur das \tty{CODE}-Segment anstehen.
10424\par
10425Der Record mit dem Typ-Byte \verb!$80! legt den Einsprungpunkt fest, d.h.
10426die Adresse, an der mit der Ausf"uhrung des Programmes begonnen werden
10427soll.  Ein solcher Record ist das Ergebnis einer \tty{END}-Anweisung mit
10428einer entsprechenden Adresse als Argument.
10429\par
10430Der letzte Record in der Datei tr"agt das Header-Byte \verb!$00! und besitzt
10431als einziges Datenfeld einen String, dessen Ende durch das Dateiende
10432definiert ist.  Dieser String spezifiziert, von welchem Programm diese
10433Datei erzeugt wurde und hat keine weitere Bedeutung.
10434
10435
10436\section{Debug-Dateien}\label{SectDebugFormat}
10437
10438Debug-Dateien k"onnen optional von AS erzeugt werden und liefern
10439nachgeschalteten Werkzeugen wie Disassemblern oder Debuggern f"ur diese
10440wichtige Informationen.  AS kann Debug-Informationen in drei Formaten
10441ausgeben: Zum einen im Objekt-Format der AVR-Tools von Atmel sowie eine zu
10442NoICE kompatible Kommandodatei und zum anderen in einem eigenen Format.
10443Die ersten beiden werden in \cite{AVRObj} bzw. der Dokumentation zu
10444NoICE ausf"uhrlich beschrieben, deshalb beschr"ankt sich die folgende
10445Beschreibung auf das AS-eigene MAP-Format:
10446
10447Diese Informationen in einer MAP-Datei teilen sich in drei Gruppen:
10448\begin{itemize}
10449\item{Symboltabelle}
10450\item{Speicherberlegung, auf Sektionen verteilt}
10451\item{Maschinenadressen von Quellzeilen}
10452\end{itemize}
10453Letzterer Teil findet sich zuerst in der Datei.  Ein einzelner
10454Eintrag in dieser Liste besteht aus zwei, von einem Doppelpunkt
10455getrennten Zahlen:
10456\begin{verbatim}
10457 <Zeilennummer>:<Adresse>
10458\end{verbatim}
10459Ein solcher Eintrag besagt, da"s der aus einer bestimmten
10460Quellcodezeile erzeugte Maschinencode auf der angegebenen Adresse
10461(hexadezimal) zu liegen kam.  Mit einer solchen Information kann ein
10462Debugger beim Durchsteppen des Programmes die entsprechenden
10463Quellcodezeilen anzeigen.  Da ein Programm aber auch aus mehreren
10464Include-Dateien bestehen kann, und viele Prozessoren mehr als nur
10465einen Adre"sraum besitzen (von dem zugegebenerma"sen nur in einem Code
10466liegt), m"ussen die oben beschriebenen Eintr"age sortiert werden.  AS
10467tut dies in zwei Stufen: Das prim"are Sortierkriterium ist das
10468Zielsegment, innerhalb dieser Segmente wird noch einmal nach Dateien
10469sortiert.  Einzelne Abschnitte werden dabei durch durch spezielle
10470Zeilen der Form
10471\begin{verbatim}
10472Segment <Segmentname>
10473\end{verbatim}
10474bzw.
10475\begin{verbatim}
10476File <Dateiname>
10477\end{verbatim}
10478getrennt.
10479
10480Die Symboltabelle folgt der Quellzeileninformation und ist wieder
10481prim"ar nach den Segmenten geordnet, aus denen die Symbole stammen.
10482Im Gegensatz zur Zeileninformation kommt hier allerdings auch der
10483Abschnitt \tty{NOTHING} hinzu, der die Symbole beinhaltet, die keinem
10484speziellen Adre"sraum zugeordnet sind (z.B. Symbole, die einfach mit
10485\tty{EQU} definiert wurden).  Die Einleitung eines Abschnittes in der
10486Symboltabelle erfolgt mit einer Zeile der Form
10487\begin{verbatim}
10488Symbols in Segment <Segmentname>   .
10489\end{verbatim}
10490Innerhalb eines Abschnittes sind die Symbole nach Namen sortiert, und
10491ein Symboleintrag belegt genau eine Zeile.  Eine solche Zeile besteht
10492wiederum aus sechs Feldern, die durch jeweils mindestens ein Leerzeichen
10493getrennt sind:
10494
10495Das erste Feld ist der Name des Symbols selber, eventuell erweitert
10496um eine in eckigen Klammern eingeschlossene Sektionsnummer, die den
10497G"ultigkeitsbereich des Symbols einschr"ankt.  Die zweite Spalte
10498bezeichnet den Typ des Symbols: \tty{Int} f"ur Integerzahlen, \tty{Float} f"ur
10499Gleitkommazahlen und \tty{String} f"ur Zeichenketten.  Die dritte Zeile
10500schlie"slich beinhaltet den eigentliche Wert des Symbols.  Falls das
10501Symbol eine Zeichenkette beinhaltet, ist es notwendig, Steuer- und
10502Leerzeichen mit einer gesonderten Notation zu kennzeichnen, damit ein
10503im String enthaltenes Leerzeichen nicht eventuell als Trennzeichen
10504zur n"achsten Spalte interpretiert werden kann.  AS bedient sich dazu
10505der bereits der in Assemblerquellen "ublichen Schreibweise, den
10506ASCII-Zahlenwert mit einem f"uhrenden Backslash (\verb!\!) einzusetzen.  Aus
10507dem String
10508\begin{verbatim}
10509 Dies ist ein Test
10510\end{verbatim}
10511wird also z.B.
10512\begin{verbatim}
10513 Dies\032ist\032ein\032Test
10514\end{verbatim}
10515Die Zahlenangabe ist immer dezimal und dreistellig, und der Backslash
10516selber wird ebenfalls in dieser Schreibweise kodiert.
10517
10518Das vierte Feld gibt - falls vorhanden - die Gr"o"se der Datenstruktur
10519an, die an der durch das Symbol gekennzeichneten Adresse abgelegt
10520ist.  Ein Debugger kann eine solche Information z.B. nutzen, um
10521symbolisch angesprochene Variablen direkt in der korrekten L"ange
10522aufzulisten.  Hat AS keine Informationen "uber die Symbolgr"o"se, so
10523steht in diesem Feld eine schlichte -1.
10524
10525Das f"unfte und letzte Feld gibt an, ob das Symbol w"ahrend der
10526Assemblierung jemals referenziert wurde. Ein Programm, da"s die
10527Symboltabelle liest, kann auf diese Weise z.B. nicht benutzte Symbole
10528automatisch verwerfen, da sie beim folgenden Debugging oder der
10529Disassemblierung mit hoher Wahrscheinlichkeit auch nicht ben"otigt werden.
10530
10531das sechste und letzte Feld gibt schlu"sendlich durch eine 0 oder 1 an,
10532ob es sich bei dem Symbol um eine Konstante (0) oder Variable (1) handelt.
10533Konstanten bekommen einmalig einen Wert zugewiesen (z.B. "uber die
10534\tty{EQU}-Anweisung oder ein Label), Variablen k"onnen ihren Wert beliebig
10535oft "andern.  In der MAP-Datei wird der letztg"ultige Wert aufgef"uhrt.
10536
10537Der dritte Abschnitt in einer Debug-Datei beschreibt die im Programm
10538benutzten Sektionen n"aher.  Eine solche Beschreibung ist erforderlich,
10539da Sektionen den G"ultigkeitsbereich von Symbolen einschr"anken
10540k"onnen.  Je nach momentanem Stand des Programmz"ahlers kann z.B. ein
10541symbolischer Debugger einzelne Symboldefinitionen f"ur eine R"uck"ubersetzung
10542nicht nutzen oder mu"s Priorit"aten bei der Symbolnutzung beachten.
10543Die Definition einer Sektion beginnt mit einer Zeile der Form
10544\begin{verbatim}
10545Info for Section nn ssss pp     ,
10546\end{verbatim}
10547wobei \tty{nn} die Nummer der Sektion angibt (die Nummer, die als Postfix
10548f"ur Symbolnamen in der Symboltabelle genutzt wird), \tty{ssss} der Name der
10549Sektion ist und \tty{pp} die Nummer der Vatersektion darstellt.  Letztere
10550Information ben"otigt ein R"uck"ubersetzer, um sich bei der Auffindung
10551eines Symbols f"ur einen Zahlenwert ausgehend von der aktuellen Sektion
10552im Baum bis zur Wurzel ,,durchhangeln'' kann, bis ein passendes
10553Symbol gefunden wird.  Auf diese Zeile folgt eine Reihe weiterer
10554Zeilen, die den von dieser Sektion belegten Code-Bereich beschreiben.
10555Jeder einzelne Eintrag (genau einer pro Zeile) beschreibt entweder
10556eine einzelne Adresse oder einen durch zwei Grenzwerte beschriebenen
10557Bereich (Trennung von Anfangs-und Endwert durch ein Minuszeichen).
10558Die Grenzen sind dabei ,,inklusive'', d.h. die Grenzen geh"oren auch zu
10559dem Bereich.  Wichtig ist, da"s ein einer Sektion zugeh"origer Bereich
10560nicht nochmals f"ur ihre Vatersektionen aufgef"uhrt wird (eine Ausnahme
10561ist nat"urlich, wenn Bereiche absichtlich mehrfach belegt werden, aber
10562so etwas macht man ja auch nicht, gelle?).  Dies dient einer Optimierung
10563der Bereichsspeicherung w"ahrend der Assemblierung und sollte auch
10564f"ur eine Symbolr"uck"ubersetzung keine Probleme darstellen, da durch
10565die einfache Kennzeichnung bereits der Einstiegspunkt und damit der
10566Suchpfad im Sektionsbaum gegeben ist.  Die Beschreibung einer Sektion
10567wird durch eine Leerzeile oder das Dateiende gekennzeichnet.
10568
10569Programmteile, die au"serhalb aller Sektionen liegen, werden nicht
10570gesondert ausgewiesen.  Diese ,,implizite Wurzelsektion'' tr"agt die
10571Nummer -1 und wird auch als Vatersektion f"ur Sektionen benutzt, die
10572keine eigentliche Vatersektion besitzen.
10573
10574Es ist m"oglich, da"s die Datei Leerzeilen oder Kommentarzeilen
10575(Semikolon am Zeilenanfang) beinhaltet.  Diese sind von einem
10576Leseprogramm zu ignorieren.
10577
10578%%===========================================================================
10579
10580\cleardoublepage
10581\chapter{Hilfsprogramme}
10582\label{ChapTools}
10583
10584Um die Arbeit mit dem Codeformat des Assemblers etwas zu erleichtern,
10585lege ich einige Progamme zu deren Bearbeitung bei.  F"ur diese Programme
10586gilt sinngem"a"s das gleiche wie in \ref{SectLicense}!
10587
10588Allen Programmen gemeinsam sind die Returncodes, die sie liefern (Tabelle
10589\ref{TabToolReturns}).
10590\par
10591\begin{table*}[ht]
10592\begin{center}\begin{tabular}{|c|l|}
10593\hline
10594Returncode &  tritt auf bei... \\
10595\hline
10596\hline
105970          &  kein Fehler \\
105981          &  Kommandozeilenparameterfehler \\
105992          &  I/O-Fehler \\
106003          &  Dateiformatfehler \\
10601\hline
10602\end{tabular}\end{center}
10603\caption{Returncodes der Dienstprogramme\label{TabToolReturns}}
10604\end{table*}
10605Ebenso eintr"achtig wie AS lesen sie ihre Eingaben von STDIN und schreiben
10606Meldungen auf STDOUT (bzw. Fehlermeldungen auf STDERR).  Ein-und
10607Ausgaben sollten sich daher problemlos umleiten lassen.
10608\par
10609Sofern Programme im folgenden Zahlen-oder Adre"sangaben von der
10610Kommandozeile lesen, d"urfen diese auch hexadezimal geschrieben werden,
10611indem man sie mit einem hintangestellten \tty{h}, einem voranstehenden
10612Dollarzeichen oder \tty{0x} wie in C versieht (z.B. \verb!$10!,
10613\verb!10h! oder \verb!0x10! anstelle von 16).
10614\par
10615Unix-Shells \marginpar{{\em UNIX}} ordnen dem Dollarzeichen allerdings
10616eine spezielle Bedeutung zu (Parameterexpansion), weshalb es n"otig ist,
10617einem Dollarzeichen direkt einen Backslash voranzustellen.  Die
10618\tty{0x}-Variante ist hier sicherlich angenehmer.
10619\par
10620Ansonsten folgen die Aufrufkonventionen und -variationen (bis auf PLIST
10621und AS2MSG) denen von AS, d.h. man kann dauernd gebrauchte Schalter in
10622einer Environmentvariablen ablegen (deren Name sich aus dem Anh"angen von
10623CMD an den Programmnamen ergibt, z.B. BINDCMD f"ur BIND), Optionen
10624negieren und Gro"s-bzw. Kleinschreibung erzwingen (n"aheres zu dem Wie in
10625Abschnitt \ref{SectCallConvention}).
10626\par
10627Sofern Adre"sangaben benutzt werden, beziehen sie sich immer auf die
10628Granularit"at des Adre"sraumes des jeweiligen Prozessors; beim PIC bedeutet
10629z.B. eine Adre"sdifferenz von 1 nicht ein Byte, sondern ein Wort.
10630
10631%%---------------------------------------------------------------------------
10632
10633\section{PLIST}
10634
10635PLIST ist das einfachste Programm der vier mitgelieferten; es dient
10636einfach nur dazu, die in einer Codedatei gespeicherten Records aufzulisten.
10637Da das Programm nicht allzuviel bewirkt, ist der Aufruf ziemlich simpel:
10638\begin{verbatim}
10639    PLIST $<$Dateiname$>$
10640\end{verbatim}
10641Der Dateiname wird automatisch um die Endung P erweitert, falls keine
10642Endung vorhanden ist.
10643\par
10644\bb{ACHTUNG!}  An dieser Stelle sind keine Jokerzeichen erlaubt! Falls mit
10645einem Befehl trotzdem mehrere Programmdateien gelistet werden sollen,
10646kann man sich mit folgendem ''Minibatch'' behelfen:
10647\begin{verbatim}
10648    for %n in (*.p) do plist %n
10649\end{verbatim}
10650PLIST gibt den Inhalt der Codedatei in Tabellenform aus, wobei f"ur
10651jeden Record genau eine Zeile ausgegeben wird.  Die Spalten haben
10652dabei folgende Bedeutung:
10653\begin{itemize}
10654\item{Codetyp: die Prozessorfamilie, f"ur die der Code erzeugt wurde.}
10655\item{Startadresse: absolute Speicheradresse, an die der Code zu laden ist.}
10656\item{L"ange: L"ange des Codest"ucks in Byte.}
10657\item{Endadresse: letzte absolute Adresse des Codest"ucks.  Diese berechnet
10658      sich als Startadresse+L"ange-1.}
10659\end{itemize}
10660Alle Angaben sind als hexadezimal zu verstehen.
10661\par
10662Zuletzt gibt PLIST noch einen Copyrightvermerk aus, sofern er einen
10663solchen in der Datei findet, und die Summe aller Codel"angen.
10664\par
10665PLIST ist praktisch ein DIR f"ur Codedateien.  Man kann es benutzen,
10666um sich den Inhalt einer Datei auflisten zu lassen, bevor man sie
10667weiterbearbeitet.
10668
10669%%---------------------------------------------------------------------------
10670
10671\section{BIND}
10672
10673BIND ist ein Programm, mit dem man die Records mehrerer Codedateien
10674in eine Datei zusammenkopieren kann.  Die dabei vorhandene Filterfunktion
10675erlaubt es aber auch, nur Records eines bestimmten Typs zu "ubernehmen.
10676Auf diese Weise kann BIND auch dazu verwendet werden, um eine Codedatei
10677in mehrere aufzuspalten.
10678\par
10679Die allgemeine Syntax von BIND lautet
10680\begin{verbatim}
10681   BIND <Quelldatei(en)> <Zieldatei> [Optionen]
10682\end{verbatim}
10683Wie auch AS betrachtet BIND alle nicht mit einem +, - oder / eingeleiteten
10684Parameter als Dateiangaben, von denen die letzte die Zieldatei angeben
10685mu"s.  Alle anderen Dateiangaben bezeichnen Quellen, diese Angaben d"urfen
10686auch wieder Jokerzeichen enthalten.
10687\par
10688An Optionen definiert BIND momentan nur eine:
10689\begin{itemize}
10690\item{\tty{f $<$Header[,Header...]$>$}: gibt eine Liste von Header-IDs
10691      an, die kopiert werden sollen.  Alle anderen Records werden
10692      nicht kopiert.  Ohne diese Angabe werden alle Records kopiert.
10693      Die in der Liste angegebenen entsprechen dem Header-Feld in der
10694      Recordstruktur, wie es in Abschnitt \ref{SectCodeFormat} beschrieben wurden. Die
10695      einzelnen Header-Nummern in der Liste werden durch Kommas getrennt.}
10696\end{itemize}
10697Um z.B. alle MCS-51-Codeteile aus einer Programmdatei auszusieben,
10698benutzt man BIND folgenderma"sen:
10699\begin{verbatim}
10700   BIND <Quellname> <Zielname> -f $31
10701\end{verbatim}
10702Fehlt bei einer Dateiangabe eine Endung, so wird automatisch die Endung
10703P angef"ugt.
10704
10705%%---------------------------------------------------------------------------
10706
10707\section{P2HEX}
10708
10709P2HEX ist eine Erweiterung von BIND.  Es besitzt alle
10710Kommandozeilenoptionen von BIND und hat die gleichen Konventionen
10711bzgl. Dateinamen.  Im Gegensatz zu BIND wird die Zieldatei aber als
10712Hexfile ausgegeben, d.h. als eine Folge von Zeilen, die den Code als
10713ASCII-Hexzahlen enthalten.
10714\par
10715P2HEX kennt neun verschiedene Zielformate, die "uber den
10716Kommandozeilenparameter \bb{F} ausgew"ahlt werden k"onnen:
10717\begin{itemize}
10718\item{Motorola S-Record (\tty{-F Moto})}
10719\item{MOS Hex (\tty{-F MOS})}
10720\item{Intel-Hex (Intellec-8, \tty{-F Intel})}
10721\item{16-Bit Intel-Hex (MCS-86, \tty{-F Intel16})}
10722\item{32-Bit Intel-Hex (\tty{-F Intel32})}
10723\item{Tektronix Hex (\tty{-F Tek})}
10724\item{Texas Instruments DSK (\tty{-F DSK})}
10725\item{Atmel AVR Generic (\tty{-F Atmel}, siehe \cite{AVRObj})}
10726\item{Lattice Mico8 prom\_init (\tty{-F Mico8})}
10727\item{C-Arrays, zum Inkludieren in C(++)-Quelldateien (\tty{-F C})}
10728\end{itemize}
10729Wird kein Zielformat explizit angegeben, so w"ahlt P2HEX anhand des
10730Prozessortyps automatisch eines aus, und zwar S-Records f"ur Motorola-
10731Prozessoren, Hitachi und TLCS-900(0), MOS f"ur 65xx/MELPS, DSK f"ur die
1073216-Bit-Texas-Signalprozessoren, Atmel Generic f"ur die AVRs und Intel-Hex
10733f"ur den Rest. Je nach Breite der Startadresse kommen bei S-Record Records
10734der Typen 1,2 oder 3 zum Einsatz, jedoch nie in einer Gruppe gemischt.
10735Diese Automatik l"a"st sich mit der Kommandozeilenoption
10736\begin{verbatim}
10737  -M <1|2|3>
10738\end{verbatim}
10739teilweise unterdr"ucken: Ein Wert von 2 bzw. 3 sorgt daf"ur, da"s
10740S-Records mit einem Mindesttyp von 2 bzw. 3 benutzt werden, w"ahrend ein
10741Wert von 0 der vollen Automatik entspricht.
10742
10743Normalerweise benutzt das AVR-Format immer eine Adre"sl"ange von 3 Bytes.
10744Manche Programme m"ogen das leider nicht...deshalb kann man mit dem
10745Schalter
10746\begin{verbatim}
10747  -avrlen <2|3>
10748\end{verbatim}
10749die L"ange zur Not auf 2 Bytes reduzieren.
10750
10751Das Mico8-Format unterscheidet sich insofern aus den anderen
10752Formaten, als da"s es keine Adre"sfelder besitzt - es ist eine
10753schlichte Auflistung der Instruktionsw"orter im Programmspeicher.
10754Bei der Benutzung mu"s darauf geachtet werden, da"s der
10755belegte Adre"sbereich (der sich z.B. mit PLIST anzeigen l"a"st)
10756bei Null beginnt und fortlaufend ist.
10757
10758Die Intel-, Tektronix- und MOS-Formate sind auf 16 Bit-Adressen
10759beschr"ankt, das 16-Bit Intel-Format reicht 4 Bit weiter.  L"angere
10760Adressen werden von P2HEX mit einer Warnung gemeldet und abgeschnitten(!).
10761F"ur die PICs k"onnen die drei von Microchip spezifizierten Varianten des
10762Intel-Hex-Formates erzeugt werden, und zwar mit dem Schalter
10763\begin{verbatim}
10764  -m <0..3>
10765\end{verbatim}
10766Das Format 0 ist INHX8M, in dem alle Bytes in Lo-Hi-Ordnung enthalten
10767sind.  Die Adre"sangaben verdoppeln sich, weil bei den PICs die Adresse
10768sich nur um 1 pro Wort erh"oht.  Dieses Format ist gleichzeitig die Vorgabe.
10769Im Format 1 (INHX16M) werden alle Worte in ihrer nat"urlichen Ordnung
10770abgelegt.  Dieses Format verwendet Microchip f"ur seine eigenen
10771Programierger"ate.  Format 2 (INHX8L) und 3 (INHX8H) trennen die Worte
10772in ihre oberen und unteren Bytes auf.  Um die komplette Information zu
10773erhalten, mu"s P2HEX zweimal aufgerufen werden, z.B. so:
10774\begin{verbatim}
10775  p2hex test -m 2
10776  rename test.hex test.obl
10777  p2hex test -m 3
10778  rename test.hex test.obh
10779\end{verbatim}
10780F"ur das Motorola-Format verwendet P2HEX zus"atzlich einen in \cite{CPM68K}
10781genannten Recordtyp mit der Nummer 5, der die Zahl der folgenden
10782Daten-Records (S1/S2/S3) bezeichnet.  Da dieser Typ vielleicht nicht jedem
10783Programm bekannt ist, kann man ihn mit der Option
10784\begin{verbatim}
10785 +5
10786\end{verbatim}
10787unterdr"ucken.
10788\par
10789Das C-Format f"allt insofern aus dem Rahmen, als da"s es immer explizit
10790ausgew"ahlt werden mu"s.  Die Ausgabedatei stellt im Prinzip ein vollst"andiges
10791St"uck C- oder C++-Code dar, das die Daten als eine Liste von C-Arrays
10792enth"alt.  Neben den eigentlichen Daten wird noch eine Liste von Deskriptoren
10793geschrieben, die Start, L"ange und Ende der Datenbl"ocke
10794beschreiben.  Was diese Deskriptoren enthalten, kann mit der Option
10795\begin{verbatim}
10796 -cformat <Format>
10797\end{verbatim}
10798bestimmt werden.  Jeder Buchstabe in \verb!Format! legt ein Element des
10799Deskriptors fest:
10800\begin{itemize}
10801\item{Ein \verb!d! oder \verb!D! definiert einen Zeiger auf die Daten.
10802      "Uber den Gro"s- oder Kleinbuchstaben wird festgelegt, ob die Hex-
10803      Konstanten Gro"s- oder Kleinbuchstaben verwenden sollen.}
10804\item{Ein \verb!s! oder \verb!S! definiert die Startadresse der Daten,
10805      wahlweise vom Typ {\em unsigned} oder {\em unsigned long}.}
10806\item{Ein \verb!l! oder \verb!L! definiert die L"ange der Daten,
10807      wahlweise vom Typ {\em unsigned} oder {\em unsigned long}.}
10808\item{Ein \verb!e! oder \verb!E! definiert die Endadresse der Daten,
10809      d.h. die letzte von den Daten benutzte Adresse,
10810      wahlweise vom Typ {\em unsigned} oder {\em unsigned long}.}
10811\end{itemize}
10812\par
10813Finden sich Code-Records verschiedener Prozessoren in einer Quelldatei,
10814so erscheinen die verschiedenen Hexformate auch gemischt in der Zieldatei
10815--- es empfiehlt sich also dringend, von der Filterfunktion Gebrauch zu
10816machen, oder ein fixes Format "uber die \verb!-F!-Option festzulegen.
10817\par
10818Neben dem Codetypenfilter kennt P2HEX noch ein Adre"sfilter, das n"utzlich
10819ist, falls der Code auf mehrere EPROMs verteilt werden mu"s:
10820\begin{verbatim}
10821  -r <Startadresse>-<Endadresse>
10822\end{verbatim}
10823Die Startadresse ist dabei die erste Speicherzelle, die im Fenster liegen
10824soll, die Endadresse die der letzten Speicherzelle im Fenster, \ii{nicht}
10825die der ersten au"serhalb.  Um z.B. ein 8051-Programm in 4 2764-EPROMs
10826aufzuteilen, geht man folgenderma"sen vor:
10827\begin{verbatim}
10828p2hex <Quelldatei> eprom1 -f $31 -r $0000-$1fff
10829p2hex <Quelldatei> eprom2 -f $31 -r $2000-$3fff
10830p2hex <Quelldatei> eprom3 -f $31 -r $4000-$5fff
10831p2hex <Quelldatei> eprom4 -f $31 -r $6000-$7fff
10832\end{verbatim}
10833Anstelle einer festen Adresse kann man als Anfang bzw. Ende auch ein
10834einfaches Dollarzeichen oder ein '0x' angeben.  Dies bedeutet, da"s die
10835niedrigste bzw. h"ochste in der Quelldatei gefundene Adresse als Anfang
10836bzw. Ende genommen wird.  Der Default f"ur den Bereich ist '0x-0x', d.h.
10837es werden alle Daten aus der Quelldatei "ubernommen.
10838\par
10839\bb{ACHTUNG!} Die Splittung "andert nichts an den absoluten Adressen, die
10840in den Hexfiles stehen!  Sollen die Adressen im Hexfile bei 0 beginnen,
10841so kann man dies durch den zus"atzlichen Schalter
10842\begin{verbatim}
10843 -a
10844\end{verbatim}
10845erreichen.  Um im Gegenteil die Adre"slage auf einen bestimmten Wert zu
10846verschieben, kann man den Schalter
10847\begin{verbatim}
10848 -R <Wert>
10849\end{verbatim}
10850verwenden.  Der dabei angegebene Wert ist ein {\em Offset}, d.h. er wird
10851auf die in der Code-Datei angegebenen Adressen aufaddiert.
10852\par
10853Den Inhalt einer Datei kann man mit einem Offset auf eine beliebige
10854Position verschieben; diesen Offset h"angt man einfach in Klammern an
10855den Dateinamen an.  Ist der Code in einer Datei z.B. auf Adresse 0 in
10856der P-Datei abgelegt, man m"ochte ihn jedoch auf Adresse 1000h
10857verschieben, so h"angt man an \tty{(\$1000)} an den Dateinamen (ohne
10858Leerzeichen!) an.
10859\par
10860Sofern die P-Datei nicht nur Daten aus dem Code-Segment enth"alt, kann
10861man mit dem Schalter
10862\begin{verbatim}
10863 -segment <name>
10864\end{verbatim}
10865ausw"ahlen, aus welchen Segment Daten extrahiert und ins HEX-Format
10866gewandelt werden sollen.  Die als Argument anzugebenden Segmentnamen sind
10867die gleichen wie f"ur den \tty{SEGMENT}-Befehl (\ref{SEGMENT}). Ein
10868Sonderfall ist das TI-DSK-Format, das als einziges Format vermerken kann,
10869ob Daten ins Code- oder Datensegment geh"oren.  In diesem Fall extrahiert
10870P2HEX automatisch beide Segmente, solange kein Segment explizit angegeben
10871ist.
10872\par
10873Analog zur \verb!-r! Option kann man mit der Option
10874\begin{verbatim}
10875 -d <Start>-<Ende>
10876\end{verbatim}
10877ein Filter f"ur das Datensegment angeben.
10878\par
10879F"ur das DSK-, Intel- und Motorola-Format relevant ist die Option
10880\begin{verbatim}
10881 -e <Adresse> ,
10882\end{verbatim}
10883mit der man die in die Hex-Datei einzutragende Startadresse festlegen
10884kann.  Fehlt diese Angabe, so wird nach einen entsprechenden Eintrag
10885in der Code-Datei gesucht.  Ist auch dort kein Hinweis auf einen
10886Einsprungpunkt zu finden, so wird kein Eintrag in die HEX-Datei
10887geschrieben (DSK/Intel) bzw. das entsprechende Feld wird auf 0 gesetzt
10888(Motorola).
10889\par
10890Leider ist sich die Literatur nicht ganz "uber die Endezeile f"ur
10891Intel-Hexfiles einig.  P2HEX kennt daher 3 Varianten, einstellbar "uber
10892den Parameter \bb{i} mit einer nachfolgenden Ziffer:
10893\begin{description}
10894\item[0]{ :00000001FF}
10895\item[1]{ :00000001}
10896\item[2]{ :0000000000}
10897\end{description}
10898\par
10899Defaultm"a"sig wird die Variante 0 benutzt, die die gebr"auchlichste zu
10900sein scheint.
10901\par
10902Fehlt der Zieldateiangabe eine Endung, so wird \tty{HEX} als Endung angenommen.
10903\par
10904Defaultm"a"sig gibt P2HEX pro Zeile maximal 16 Datenbytes aus, wie es
10905auch die meisten anderen Tools tun, die Hex-Files erzeugen.  Wollen
10906Sie dies "andern, so k"onnen Sie dies mit dem Schalter
10907\begin{verbatim}
10908-l <Anzahl>
10909\end{verbatim}
10910tun.  Der erlaubte Wertebereich liegt dabei zwischen 2 und 254 Datenbytes;
10911ungerade Werte werden implizit auf gerade Anzahlen aufgerundet.
10912\par
10913Meist werden die tempor"aren, von AS erzeugten Code-Dateien nach einer
10914Umwandlung nicht mehr unbedingt gebraucht.  Mit der Kommandozeilen-
10915option
10916\begin{verbatim}
10917-k
10918\end{verbatim}
10919kann man P2HEX anweisen, diese automatisch nach der Konversion zu l"oschen.
10920\par
10921Anders als BIND erzeugt P2HEX keine Leerdatei, wenn nur ein Dateiname
10922(=Zieldatei) angegeben wurde, sondern bearbeitet die dazugeh"orige
10923Codedatei.  Es ist also ein Minimalaufruf \`a la
10924\begin{verbatim}
10925 P2HEX <Name>
10926\end{verbatim}
10927m"oglich, um $<$Name:  $>$.HEX aus $<$Name:  $>$.P zu erzeugen.
10928
10929%%---------------------------------------------------------------------------
10930
10931\section{P2BIN}
10932
10933P2BIN funktioniert wie P2HEX und bietet die gleichen Optionen (bis
10934auf die a- und i- Optionen, die bei Bin"ardateien keinen Sinn ergeben), nur
10935wird das Ergebnis nicht als Hexdatei, sondern als einfache Bin"ardatei
10936abgelegt.  Dies kann dann z.B. direkt in ein EPROM gebrannt werden.
10937\par
10938Zur Beeinflussung der Bin"ardatei kennt P2BIN gegen"uber P2HEX noch
10939drei weitere Optionen:
10940\begin{itemize}
10941\item{\tty{l $<8-Bit-Zahl>$}: gibt den Wert an, mit dem unbenutzte
10942      Speicherstellen in der Datei gef"ullt werden sollen.
10943      Defaultm"a"sig ist der Wert \$ff, so da"s ein halbwegs
10944      intelligenter EPROM-Brenner sie "uberspringt.  Man kann aber
10945      hiermit auch andere Werte einstellen, z.B. enthalten die gel"oschten
10946      Speicherzellen der MCS-48-EPROM-Versionen Nullen.  In einem solchen
10947      Falle w"are 0 der richtige Wert.}
10948\item{\tty{s}: weist das Programm an, eine Pr"ufsumme "uber die Bin"ardatei zu
10949      berechnen.  Die Pr"ufsumme wird einmal als 32-Bit-Wert ausgegeben,
10950      zum anderen wird das Zweierkomplement der Bits 0..7 in der letzten
10951      Speicherstelle abgelegt, so da"s die Modulo-256-Summe zu 0 wird.}
10952\item{\tty{m}:  f"ur den Fall, da"s ein Prozessor mit 16- oder 32-Bit-Datenbus
10953      eingesetzt wird und die Bin"ardatei f"ur mehrere EPROMs aufgesplittet
10954      werden mu"s.  Das Argument kann folgende Werte annnehmen:
10955      \begin{itemize}
10956      \item{\tty{ALL}: alles kopieren}
10957      \item{\tty{ODD}: alle Bytes mit ungerader Adresse kopieren}
10958      \item{\tty{EVEN}: alle Bytes mit gerader Adresse kopieren}
10959      \item{\tty{BYTE0}..\tty{BYTE3}: nur alle Bytes kopieren, deren Adresse die Form
10960            $4n+0$...$4n+3$ hat.}
10961      \item{\tty{WORD0},\tty{WORD1}: nur das untere bzw. obere 16-Bit-Wort der
10962            32-Bit-Worte kopieren.}
10963      \end{itemize}}
10964\end{itemize}
10965
10966Nicht wundern: Bei letzteren Optionen ist die Bin"ardatei um den Faktor 2
10967oder 4 kleiner als bei \tty{ALL}.  Dies ist bei konstantem Adre"sfenster logisch!
10968
10969Falls die Code-Datei keine Startadresse enth"alt, kann man diese
10970analog zu P2HEX "uber die \tty{-e}-Kommandozeilenoption vorgeben.  Auf
10971Anforderung teilt P2BIN ihren Wert der Ergebnisdatei voran.  Mit der
10972Kommandozeilenoption
10973\begin{verbatim}
10974-S
10975\end{verbatim}
10976wird diese Funktion aktiviert.  Sie erwartet als Argument eine
10977Zahlenangabe zwischen 1 und 4,  die die L"ange des Adressfeldes in
10978Bytes bestimmt.  Optional kann dieser Angabe auch noch der Buchstabe
10979L oder B vorangestellt werden, um die Byte-Order dieser Adresse
10980festzulegen.  So erzeugt z.B. die Angabe \tty{B4} eine 4-Byte-Adresse in
10981Big-Endian-Anordnung, \tty{L2} oder nur '2' eine 2-Byte-Adresse in
10982Little-Endian-Anordnung.
10983
10984%%---------------------------------------------------------------------------
10985
10986\section{AS2MSG}
10987
10988Bei AS2MSG handelt es sich eigentlich um kein Hilfsprogramm, sondern um ein
10989Filter, das (gl"ucklichen) Besitzern von Borland-Pascal 7.0 das Arbeiten
10990mit dem Assembler erleichtern soll.  In den DOS-Arbeitsumgebungen existiert
10991ein ,,Tools''-Men"u, das man um eigene Programme, z.B. AS erweitern kann.
10992Das Filter erlaubt, die von AS gelieferten Fehlermeldungen mit Zeilenangabe
10993direkt im Editorfenster anzuzeigen.  Dazu mu"s im Tools-Men"u ein neuer
10994Eintrag angelegt werden (\tty{Options/Tools/New}).  Tragen Sie in die
10995einzelnen Felder folgende Werte ein :
10996\begin{itemize}
10997\item{Title: {\tt \verb!~!M\verb!~!akroassembler}}
10998\item{Program path: \tty{AS}}
10999\item{Command line: \tty{-E !1 \$EDNAME \$CAP MSG(AS2MSG) \$NOSWAP \$SAVE
11000ALL}}
11001\item{bei Bedarf einen Hotkey zuordnen (z.B. Shift-F7)}
11002\end{itemize}
11003Die Option \tty{-E} sorgt daf"ur, da"s Turbo-Pascal nicht mit STDOUT und
11004STDERR durcheinander kommt.
11005\par
11006Ich setze dabei voraus, da"s sowohl AS als auch AS2MSG sich in einem
11007Verzeichnis befinden, welches in der Pfadliste aufgef"uhrt ist.  Nach einem
11008Druck auf dem passenden Hotkey (oder Auswahl aus dem Tools-Men"u) wird AS mit
11009dem Namen der Textdatei im aktiven Editorfenster aufgerufen.  Die dabei
11010aufgetretenen Fehler werden in ein separates Fenster geleitet, durch das man
11011nun ,,browsen'' kann.  Mit \bb{Ctrl-Enter} springt man eine fehlerhafte
11012Zeile an.  Zus"atzlich enth"alt das Fenster die Statistik, die AS am Ende
11013der Assemblierung ausgibt.  Diese erhalten als Dummy-Zeilennummer 1.
11014\par
11015F"ur diese Arbeitsweise sind sowohl TURBO.EXE (Real Mode) als auch BP.EXE
11016(Protected Mode) geeignet.  Ich empfehle BP, da in dieser Variante beim
11017Aufruf nicht erst der halbe DOS-Speicher ,,freigeswappt'' werden mu"s.
11018
11019\cleardoublepage
11020
11021\appendix
11022
11023%%===========================================================================
11024
11025\cleardoublepage
11026\chapter{Fehlermeldungen von AS}
11027\label{ChapErrMess}
11028
11029Im folgenden findet sich eine halb-tabellarische Auflistung der in AS
11030definierten Fehlermeldungen.  Zu jeder Fehlermeldung finden sich folgende
11031Angaben:
11032\begin{itemize}
11033\item{interne Fehlernummer (f"ur den Anwender nur mit der \tty{n}-Option sichtbar);}
11034\item{Fehlermeldung im Klartext;}
11035\item{Typ:
11036      \begin{itemize}
11037      \item{Warnung: zeigt m"ogliche Fehler oder ineffizienten Code an.
11038            Assemblierung geht weiter.}
11039      \item{Fehler: echte Fehler.  Assemblierung geht weiter, aber keine
11040            Code-Datei wird geschrieben.}
11041      \item{Fatal: schwerwiegende Fehler.  Assemblierung wird abgebrochen.}
11042      \end{itemize}}
11043\item{Ursache: die Situation(en), in denen der Fehler ausgegeben
11044      wird;}
11045\item{Argument: Die Ausgabe, die auf Wunsch als erweiterte Fehlermeldung
11046      erfolgt.}
11047\end{itemize}
11048
11049\par
11050
11051\newcommand{\errentry}[5]
11052           {\item[#1]{#2
11053                      \begin{description}
11054                      \item[Type:]{\ \\#3}
11055                      \item[Reason:]{\ \\#4}
11056                      \item[Argument:]{\ \\#5}
11057                      \end{description}}
11058           }
11059
11060\begin{description}
11061\errentry{   5}{Displacement=0, "uberfl"ussig}
11062               {Warnung}
11063               {bei 680x0-,6809- und COP8-Prozessoren: Das Displacement
11064                in einem Adre"sausdruck hat den Wert 0 ergeben.  Es wird
11065                ein  Adre"sausdruck  ohne Displacement erzeugt.  Um keine
11066                Phasenfehler zu erzeugen, werden NOP-Befehle eingef"ugt.}
11067               {keines}
11068\errentry{  10}{Kurzadressierung m"oglich}
11069               {Warnung}
11070               {bei 680x0-, 6502- und 68xx-Prozessoren k"onnen
11071                bestimmte Speicherbereiche mit kurzen Adressen erreicht
11072                werden.  Um keine Phasefehler zu erzeugen, wird zwar der
11073                k"urzere Ausdruck erzeugt, der freie Platz wird aber mit
11074                NOPs aufgef"ullt.}
11075               {keines}
11076\errentry{  20}{kurzer Sprung m"oglich}
11077               {Warnung}
11078               {Bei 680x0 und 8086-Prozessoren kann der Sprung
11079                sowohl mit langem als auch kurzem Displacement ausgef"uhrt
11080                werden.  Da kein kurzer Sprung angefordert wurde, wurde im
11081                ersten Pass Platz f"ur den langen Sprung freigehalten.
11082                Es wird ein kurzer Sprung erzeugt, der freie Platz wird
11083                mit NOPs aufgef"ullt, um Phasenfehler zu vermeiden.}
11084               {keines}
11085\errentry{  30}{kein Sharefile angelegt, SHARED ignoriert}
11086               {Warnung}
11087               {Es wurde eine \tty{SHARED}-Anweisung gefunden, es
11088                wurde aber keine Kommandozeilenoption angegeben, um eine
11089                Shared-Datei zu erzeugen.}
11090               {keines}
11091\errentry{  40}{FPU liest Wert evtl. nicht korrekt ein ($>$=1E1000)}
11092               {Warnung}
11093               {Das BCD-Gleitkommaformat der 680x0-Koprozessoren
11094                erlaubt zwar vierstellige Exponenten, lt. Datenbuch
11095                k"onnen solche Werte aber nicht korrekt eingelesen werden.
11096                Der vierstellige Wert wird zwar erzeugt, eine Funktion ist
11097                aber nicht gew"ahleistet.}
11098               {keines}
11099\errentry{  50}{Privilegierte Anweisung}
11100               {Warnung}
11101               {Es wurde eine Anweisung benutzt, die nur im
11102                Supervisor-Mode zul"assig ist, obwohl dieser nicht mittels
11103                \tty{SUPMODE ON} vorher explizit angezeigt wurde.}
11104               {keines}
11105\errentry{  60}{Distanz 0 nicht bei Kurzsprung erlaubt (NOP erzeugt)}
11106               {Warnung}
11107               {Ein kurzer Sprung mit der Distanz 0 ist bei
11108                680x0- bzw. COP8-Prozessoren nicht erlaubt, da dieser Sonderwert f"ur
11109                lange Spr"unge ben"otigt wird.  Stattdessen wurde ein
11110                NOP-Befehl eingef"ugt.}
11111               {keines}
11112\errentry{  70}{Symbol aus falschem Segment}
11113               {Warnung}
11114               {Das in dem Operanden benutzte Symbol
11115                ist aus einem Adre"sraum, der nicht mit dem benutzten
11116                Befehl bearbeitet werden kann.}
11117               {keines}
11118\errentry{  75}{Segment nicht adressierbar}
11119               {Warnung}
11120               {Das in dem Operanden benutzte Symbol
11121                ist aus einem Adre"sraum, der mit keinem der Segmentregister
11122                des 8086 adressiert werden kann.}
11123               {Name des nicht adressierbaren Segments}
11124\errentry{  80}{"Anderung des Symbolwertes erzwingt zus"atzlichen Pass}
11125               {Warnung}
11126               {Ein Symbol hat einen anderen Wert zugewiesen
11127                bekommen als im vorhergehenden Pass.  Diese Warnung wird
11128                nur ausgegeben, falls die \tty{r}-Option angegeben wurde.}
11129               {Der Name des fraglichen Symbols}
11130\errentry{  90}{"Uberlappende Speicherbelegung}
11131               {Warnung}
11132               {Bei der Bildung der Belegungsliste wurde
11133                festgestellt, da"s ein Speicherbereich im Codesegment
11134                mehrfach benutzt wurde.  Ursache k"onnen un"uberlegte
11135                \tty{ORG}-Anweisungen sein.}
11136               {keines}
11137\errentry{ 100}{keine CASE-Bedingung zugetroffen}
11138               {Warnung}
11139               {bei einem \tty{SWITCH}..\tty{CASE}-Konstrukt ohne
11140                \tty{ELSECASE}-Zweig traf keiner der \tty{CASE}-Zweige zu.}
11141               {keines}
11142\errentry{ 110}{Seite m"oglicherweise nicht adressierbar}
11143               {Warnung}
11144               {Das in dem Operanden benutzte Symbol
11145                liegt nicht in der momentan mit \tty{ASSUME} eingestellten
11146                Fenster (ST6,78(C)10).}
11147               {keines}
11148\errentry{ 120}{Registernummer mu"s gerade sein}
11149               {Warnung}
11150               {Die Hardware erlaubt nur ein Registerpaar
11151                zu verketten, dessen Startadresse gerade ist (RR0, RR2...,
11152                nur Z8).}
11153               {keines}
11154\errentry{ 130}{veralteter Befehl}
11155               {Warnung}
11156               {Der verwendete Befehl ist zwar noch
11157                definiert, ist in seiner Funktion aber durch andere,
11158                neue Befehle ersetzbar und daher in zuk"unftigen
11159                Prozessorversionen eventuell nicht mehr vorhanden.}
11160               {keines}
11161\errentry{ 140}{Nicht vorhersagbare Ausf"uhrung dieser Anweisung}
11162               {Warnung}
11163               {Die verwendete Adressierungsart ist bei
11164                diesem Befehl zwar prinzipiell erlaubt, ein Register
11165                wird jedoch in einer Weise doppelt verwendet, da"s je
11166                nach Aus"uhrungsreihenfolge sich unterschiedliche
11167                Ergebnisse einstellen k"onnen.}
11168               {keines}
11169\errentry{ 150}{Lokaloperator au"serhalb einer Sektion "uberfl"ussig}
11170               {Warnung}
11171               {Ein vorangestellter Klammeraffe dient
11172                dazu, sich explizit auf zu der Sektion lokale Symbole
11173                zu beziehen.  Wenn man sich au"serhalb einer Sektion
11174                befindet, gibt es keine lokalen Symbole, weshalb dieser
11175                Operator "uberfl"ussig ist.}
11176               {keines}
11177\errentry{ 160}{sinnlose Operation}
11178               {Warnung}
11179               {Die Anweisung ergibt entweder "uberhaupt
11180                keinen Sinn oder kann auf andere Weise schneller und k"urzer
11181                ausgef"uhrt werden.}
11182               {keines}
11183\errentry{ 170}{unbekannter Symbolwert erzwingt zus"atzlichen Pass}
11184               {Warnung}
11185               {AS vermutet eine Vorw"artsreferenz eines
11186                Symbols, d.h. das Symbol wird benutzt, bevor es definiert
11187                wurde, und h"alt einen weiteren Pass f"ur unumg"anglich.
11188                Diese Warnung wird nur ausgegeben, falls die \tty{r}-Option
11189                angegeben wurde.}
11190               {Der Name des fraglichen Symbols}
11191\errentry{ 180}{Adresse nicht ausgerichtet}
11192               {Warnung}
11193               {Eine Adresse ist nicht ein mehrfaches der
11194                Operandengr"o"se.  Das Datenbuch verbietet zwar solche Zugriffe,
11195                im Instruktionswort ist aber Platz f"ur diese Adresse, so da"s
11196                AS es bei einer Warnung belassen hat.}
11197               {keines}
11198\errentry{ 190}{I/O-Adresse darf nicht verwendet werden}
11199               {Warnung}
11200               {Der verwendete Adressierungsmodus oder die
11201                angesprochene Adresse sind zwar prinzipiell erlaubt, die
11202                Adresse liegt aber im Bereich der Peripherieregister, die in
11203                diesem Zusammenhang nicht verwendet werden d"urfen.}
11204               {keines}
11205\errentry{ 200}{m"ogliche Pipeline-Effekte}
11206               {Warnung}
11207               {Ein Register wird in einer Befehlsfolge so
11208                verwendet, da"s die Befehlsausf"uhrung m"oglicherweise nicht
11209                in der hingeschriebenen Form ablaufen wird.  "Ublicherweise
11210                wird ein Register benutzt, bevor der neue Wert zur Verf"ugung
11211                steht.}
11212               {das die Verklemmung verursachende Register}
11213\errentry{ 210}{mehrfache Adre"sregisterbenutzung in einer Anweisung}
11214               {Warnung}
11215               {Ein Adre"sregister wird in mehreren
11216                Adre"sausdr"ucken eines Befehls benutzt.  Sofern einer der
11217                beiden Ausdr"ucke das Register modifiziert, sind die
11218                Ergebnisadressen nicht eindeutig festgelegt.}
11219               {das mehrfach verwendete Register}
11220\errentry{ 220}{Speicherstelle ist nicht bitadressierbar}
11221               {Warnung}
11222               {Mit einer \tty{SFRB}-Anweisung wurde
11223                versucht, eine Speicherstelle als bitadressierbar zu
11224                deklarieren, die aufgrund der Architektur des 8051 nicht
11225                bitadressierbar ist.}
11226               {keines}
11227\errentry{ 230}{Stack ist nicht leer}
11228               {Warnung}
11229               {Am Ende eines Durchlaufes ist ein vom
11230                Programm definierter Stack nicht leer.}
11231               {der Name des Stacks sowie seine Resttiefe}
11232\errentry{ 240}{NUL-Zeichen in Strings, Ergebnis undefiniert}
11233	       {Warnung}
11234	       {Eine String-Konstante enth"alt ein
11235                NUL-Zeichen. Dies funktioniert zwar mit der Pascal-Version,
11236                in Hinblick auf die C-Version von AS ist dies aber ein Problem,
11237                da C Strings mit einem NUL-Zeichen terminiert, d.h. der String
11238                w"are f"ur C an dieser Stelle zu Ende...}
11239	       {keines}
11240\errentry{ 250}{Befehl "uberschreitet Seitengrenze}
11241	       {Warnung}
11242	       {Ein Befehl steht zu Teilen auf
11243                verschiedenen Seiten.  Da der Programmz"ahler des Prozessors
11244                aber nicht "uber Seitengrenzen hinweg inkrementiert wird,
11245                w"urde zur Laufzeit anstelle des Instruktionsbytes von der
11246                Folgeseite wieder das erste Byte der alten Seite geholt; das
11247                Programm w"urde fehlerhaft ablaufen.}
11248	       {keines}
11249\errentry{ 260}{Bereichs"uberschreitung}
11250               {Warnung}
11251               {Ein Zahlenwert lag au"serhalb des erlaubten Bereichs.  AS
11252                hat den Wert durch ein Abschneiden der oberen Bitstellen
11253                in den erlaubten Bereich gebracht, es ist jedoch nicht
11254                garantiert, da"s sich durch diese Operation sinnvoller und
11255                korrekter Code ergibt.}
11256               {keines}
11257\errentry{ 270}{negatives Argument f"ur DUP}
11258               {Warnung}
11259               {Das Wiederholungsargument einer \tty{DUP}-Direktive war
11260                kleiner als 0.  Es werden (analog zu einem Argument von
11261                genau 0) keine Daten abgelegt.}
11262               {keines}
11263\errentry{ 280}{einzelner X-Operand wird als indizierte und nicht als
11264                implizite Adressierung interpretiert}
11265               {Warnung}
11266               {Ein einzelner X-Operand kann sowohl als Register X als
11267                auch X-inidizierte Adressierung mit Null-Displacement
11268                interpretiert werden, da sich Morola hier nicht festlegt.
11269                AS w"ahlt die letztere Variante, was m"oglicherweise nicht
11270                das erwartete ist.}
11271               {keines}
11272\errentry{ 300}{Bit-Nummer wird abgeschnitten werden}
11273               {Warnung}
11274               {Die Instruktion arbeitet nur auf Byte- bzw.
11275                Langwort-Operanden, Bitnummern jenseits 7 bzw. 31 werden
11276                von der CPU modulo-8 bzw. modulo-32 behandelt werden.}
11277               {keines}
11278\errentry{ 310}{Ung"ultiger Wert f"ur Registerzeiger}
11279               {Warnung}
11280               {G"ultige bzw. sinnvolle Werte f"ur den Registerzeiger sind
11281                nur Werte von 0x00...0x70 bzw. 0xf0, weil die anderen
11282                Registerbereiche unbelegt sind.}
11283               {keines}
11284\errentry{ 320}{Makro-Argument umdefiniert}
11285               {Warnung}
11286               {Einem Makroparameter wurden zwei oder mehr
11287                verschiedene Werte zugewiesen.  Dies kann bei der
11288                Verwendung von Schl"usselwortparametern auftreten.
11289                Das zuletzt angegebene Argument wird benutzt.}
11290               {Name des Makroparameters}
11291\errentry{ 330}{veraltete Anweisung}
11292               {Warnung}
11293               {Dies Anweisung ist veraltet und sollte nicht mehr
11294                in neuen Programmen verwendet werden.}
11295               {Die Anweisung, die stattdessen verwendet werden sollte.}
11296\errentry{ 340}{Quelloperand l"anger oder gleich Zieloperand}
11297               {Warnung}
11298               {Der Quelloperand ist l"anger oder gleich gro"s wie der
11299                Zieloperand, gemessen in Bits.  Eine Null- oder Vorzeichenerweiterung
11300                ergibt keinen Sinn mit diesen Argumenten.  Schlagen Sie im
11301                Referenzhandbuch der CPU das Verhalten in diesem Fall nach.}
11302               {keines}
11303\errentry{ 350}{TRAP-Nummer ist g"ultige Instruktion}
11304               {Warnung}
11305               {Ein TRAP mit dieser Nummer benutzt den gleichen Maschinencode
11306                wie ein von der CPU unterst"utzter Maschinenbefehl.}
11307               {keines}
11308\errentry{ 360}{Padding hinzugef"ugt}
11309               {Warnung}
11310               {Die Menge abgelegter Bytes ist ungerade; eine H"alfte des letzten
11311                16-Bit-Wortes bleibt ungenutzt.}
11312               {keines}
11313\errentry{1000}{Symbol doppelt definiert}
11314               {Fehler}
11315               {Einem Symbol wurde durch ein Label oder
11316	        \tty{EQU}, \tty{PORT}, \tty{SFR}, \tty{LABEL},
11317	        \tty{SFRB} oder \tty{BIT} ein neuer  Wert zugewiesen, dies
11318                ist aber nur bei \tty{SET/EVAL} erlaubt.}
11319               {Name des fraglichen Symbols, bei eingeschalteter
11320	        Querverweisliste zus"atzlich die Zeile der ersten Definition}
11321\errentry{1010}{Symbol nicht definiert}
11322               {Fehler}
11323               {Ein benutztes Symbol ist auch im 2.Pass noch
11324                nicht in der Symboltabelle enthalten.}
11325               {Name des nicht gefundenen Symbols}
11326\errentry{1020}{Ung"ultiger Symbolname}
11327               {Fehler}
11328               {Ein Symbolname entspricht nicht den Bedingungen
11329                f"ur einen g"ultigen Symbolnamen.  Beachten Sie, da"s f"ur
11330                Makro-und Funktionsparameter strengere Regeln gelten!}
11331               {der fehlerhafte Symbolname}
11332\errentry{1090}{Ung"ultiges Format}
11333               {Fehler}
11334               {Das benutzte Befehlsformat existiert bei diesem
11335                Befehl nicht.}
11336               {Der Kennbuchstabe des verwendeten Formates}
11337\errentry{1100}{"Uberfl"ussiges Attribut}
11338               {Fehler}
11339               {Der benutzte Befehl (Prozessor oder Pseudo) darf
11340                kein mit einem Punkt angeh"angtes Attribut haben.}
11341               {keines}
11342\errentry{1105}{Attribut darf nur 1 Zeichen lang sein}
11343               {Fehler}
11344               {Das mit einem Punkt an einen Befehl angeh"angte
11345                Attribut mu"s genau ein Zeichen lang sein; weder mehr noch
11346                weniger ist erlaubt.}
11347               {keines}
11348\errentry{1107}{undefiniertes Attribut}
11349               {Fehler}
11350               {Das an einem Befehl angef"ugte Attribut ist ung"ultig.}
11351               {keines}
11352\errentry{1110}{Unpassende Operandenzahl}
11353               {Fehler}
11354               {Die bei einem Befehl (Prozessor oder Pseudo)
11355                angegebene Operandenzahl liegt nicht in dem f"ur diesen
11356                Befehl erlaubten Bereich.}
11357               {Die erwartete Anzahl Argumente bzw. Operanden}
11358\errentry{1112}{Kann Argument nicht in Teile aufspaltenl}
11359               {Fehler}
11360               {Bei bestimmten Prozessoeren (z.B. DSP56000)
11361                m"ussen die kommaseparierten Argumente weiter in
11362                Einzeloperanden aufgespalten werden, diese ist
11363                fehlgeschlagen.}
11364               {keines}
11365\errentry{1115}{Unpassende Optionenzahl}
11366               {Fehler}
11367               {Die bei diesem Befehl angegebene Zahl
11368	        von Optionen liegt nicht in dem f"ur diesen
11369                Befehl erlaubten Bereich.}
11370               {keines}
11371\errentry{1120}{nur immediate-Adressierung erlaubt}
11372               {Fehler}
11373               {Der benutzte Befehl l"a"st nur
11374                immediate-Operanden (mit vorangestelltem \#) zu.}
11375               {keines}
11376\errentry{1130}{Unpassende Operandengr"o"se}
11377               {Fehler}
11378               {Der Operand hat zwar einen f"ur den Befehl
11379                zugelassenen Typ, jedoch nicht die richtige L"ange (in
11380                Bits).}
11381               {keines}
11382\errentry{1131}{Widersprechende Operandengr"o"sen}
11383               {Fehler}
11384               {Die angegebenen Operanden haben unterschiedliche
11385                L"angen (in Bit).}
11386               {keines}
11387\errentry{1132}{Undefinierte Operandengr"o"se}
11388               {Fehler}
11389               {Aus Opcode und Operanden l"a"st sich die
11390                Operandengr"o"se nicht eindeutig bestimmen (ein Problem
11391                des 8086-Assemblers).  Sie m"ussen die Operandengr"o"se
11392                durch einen \tty{BYTE}, \tty{WORD}, usw. \tty{PTR}-Pr"afix
11393	        festlegen.}
11394               {keines}
11395\errentry{1133}{Ganzzahl oder String erwartet, aber Gleitkommazahl erhalten}
11396               {Fehler}
11397               {An dieser Stelle kann keine Gleitkommazahl als Argument
11398                verwendet werden.}
11399               {das fehlerhafte Argument}
11400\errentry{1134}{Ganzzahl erwartet, aber Gleitkommazahl erhalten}
11401               {Fehler}
11402               {An dieser Stelle kann keine Gleitkommazahl als Argument
11403                verwendet werden.}
11404               {das fehlerhafte Argument}
11405\errentry{1136}{Gleitkommazahl erwartet, aber String erhalten}
11406               {Fehler}
11407               {An dieser Stelle kann kein String als Argument
11408                verwendet werden.}
11409               {das fehlerhafte Argument}
11410\errentry{1137}{Operandentyp-Diskrepanz}
11411               {Fehler}
11412               {Die beiden Argumente eines Operanden haben nicht
11413                den gleichen Datentyp (Integer/Gleitkomma/String).}
11414               {keines}
11415\errentry{1138}{String erwartet, aber Ganzzahl erhalten}
11416               {Fehler}
11417               {An dieser Stelle kann keine Ganzzahl als Argument
11418                verwendet werden.}
11419               {das fehlerhafte Argument}
11420\errentry{1139}{String erwartet, aber Gleitkommazahl erhalten}
11421               {Fehler}
11422               {An dieser Stelle kann keine Gleitkommazahl als Argument
11423                verwendet werden.}
11424               {das fehlerhafte Argument}
11425\errentry{1140}{zu viele Argumente}
11426               {Fehler}
11427               {Einem Befehl wurden mehr als die unter AS
11428                zul"assigen 20 Parameter "ubergeben.}
11429               {keines}
11430\errentry{1141}{Ganzzahl erwartet, aber String erhalten}
11431               {Fehler}
11432               {An dieser Stelle kann kein String als Argument
11433                verwendet werden.}
11434               {das fehlerhafte Argument}
11435\errentry{1142}{Ganz- oder Gleitkommazahl erwartet, aber String erhalten}
11436               {Fehler}
11437               {An dieser Stelle kann kein String als Argument
11438                verwendet werden.}
11439               {das fehlerhafte Argument}
11440\errentry{1143}{String erwartet}
11441               {Fehler}
11442               {An dieser Stelle kann nur ein (in einfachen Hochkommas
11443                eingeschlossener) String als Argument verwendet werden.}
11444               {das fehlerhafte Argument}
11445\errentry{1144}{Ganzzahl erwartet}
11446               {Fehler}
11447               {An dieser Stelle kann nur eine ganze Zahl als Argument
11448                verwendet werden.}
11449               {das fehlerhafte Argument}
11450\errentry{1145}{Ganz-, Gleitkommazahl oder String erwartet, aber Register bekommen}
11451               {Fehler}
11452               {An dieser Stelle kann kein Registersymbol als Argument verwendet werden.}
11453               {das fehlerhafte Argument}
11454\errentry{1146}{Ganzzahl oder String erwartet}
11455               {Fehler}
11456               {An dieser Stelle kann keine Gleitkommazahl oder Registersymbol als Argument verwendet werden.}
11457               {das fehlerhafte Argument}
11458\errentry{1147}{Register erwartet}
11459               {Fehler}
11460               {An dieser Stelle kann nur ein Register als Argument verwendet werden.}
11461               {das fehlerhafte Argument}
11462\errentry{1148}{Registersymbol f"ur anderes Ziel}
11463               {Fehler}
11464               {Das angesprochene Registersymbol wurde f"ur einen anderen Zielprozessor
11465                als den aktuell verwendeten definiert und ist nicht kompatibel.}
11466               {das fehlerhafte Argument}
11467\errentry{1200}{Unbekannter Befehl}
11468               {Fehler}
11469               {Der benutzte Befehl ist weder ein Pseudobefehl
11470                von AS noch ein Befehl des momentan eingestellten
11471                Prozessors.}
11472               {keines}
11473\errentry{1300}{Klammerfehler}
11474               {Fehler}
11475               {Der Formelparser ist auf einen (Teil-)Ausdruck
11476                gesto"sen, in dem die Summe "offnender und schlie"sender
11477                Klammern nicht "ubereinstimmt.}
11478               {der beanstandete (Teil-)Ausdruck}
11479\errentry{1310}{Division durch 0}
11480               {Fehler}
11481               {Bei einer Division oder Modulooperation ergab
11482                die Auswertung des rechten Teilausdruckes 0.}
11483               {keines}
11484\errentry{1315}{Bereichsunterschreitung}
11485               {Fehler}
11486               {Der angegebene Integer-Wert unterschreitet
11487                den zul"assigen Bereich.}
11488               {aktueller Wert und zul"assiges Minimum
11489	        (manchmal, ich stelle das seit Jahren um...)}
11490\errentry{1320}{Bereichs"uberschreitung}
11491               {Fehler}
11492               {Der angegebene Integer-Wert "uberschreitet
11493                den zul"assigen Bereich.}
11494               {aktueller Wert und zul"assiges Maximum
11495	        (manchmal, ich stelle das seit Jahren um...)}
11496\errentry{1322}{keine Zweierpotenz}
11497               {Fehler}
11498               {Hier sind nur Zweierpotenzen (1,2,4,8...)
11499                als Wert erlaubt}
11500               {der fragliche Wert}
11501\errentry{1325}{Adresse nicht ausgerichtet}
11502               {Fehler}
11503               {Die angegebene direkte Speicheradresse
11504                entspricht nicht den Anspr"uchen des Datentransfers, d.h.
11505                ist nicht ein mehrfaches der Operandengr"o"se.  Nicht alle
11506                Prozessoren erlauben unausgerichtete Datenzugriffe.}
11507               {keines}
11508\errentry{1330}{Distanz zu gro"s}
11509               {Fehler}
11510               {Der in einem Adre"sausdruck enthaltene
11511                Displacement-Wert ist zu gro"s.}
11512               {keines}
11513\errentry{1340}{Kurzadressierung nicht m"oglich}
11514               {Fehler}
11515               {Die Adresse des Operanden liegt au"serhalb des
11516                Speicherbereiches, in dem Kurzadressierung m"oglich ist.}
11517               {keines}
11518\errentry{1350}{Unerlaubter Adressierungsmodus}
11519               {Fehler}
11520               {Der benutzte Adressierungsmodus existiert
11521                generell zwar, ist an dieser Stelle aber nicht erlaubt.}
11522               {keines}
11523\errentry{1351}{Adresse mu"s gerade sein}
11524               {Fehler}
11525               {An dieser Stelle sind nur gerade Adressen erlaubt,
11526                da das unterste Bit f"ur andere Zwecke verwendet wird
11527                oder reserviert ist.}
11528               {das fragliche Argument}
11529\errentry{1352}{Adresse mu"s ausgerichtet sein}
11530               {Fehler}
11531               {An dieser Stelle sind nur ausgerichtete
11532                (d.h glatt durch 2, 4, 8... teilbare) Adressen erlaubt,
11533                da die untersten Bits f"ur andere Zwecke verwendet werden
11534                oder reserviert sind.}
11535               {das fragliche Argument}
11536\errentry{1355}{Adressierungsmodus im Parallelbetrieb nicht erlaubt}
11537               {Fehler}
11538               {Die verwendeten Adressierungsmodi
11539                sind zwar im sequentiellen Modus zul"assig, jedoch nicht
11540                bei parallelen Instruktionen.}
11541               {keines}
11542\errentry{1360}{Undefinierte Bedingung}
11543               {Fehler}
11544               {Die benutzte Bedingung f"ur bedingte Spr"unge
11545                existiert nicht.}
11546               {keines}
11547\errentry{1365}{inkompatible Bedingungen}
11548               {Fehler}
11549               {Die benutzte Kombination von Bedingungen kann nicht
11550                in einem Befehl verwendet werden.}
11551               {die Bedingung, bei der die Unvertr"aglichkeit
11552                entdeckt wurde.}
11553\errentry{1370}{Sprungdistanz zu gro"s}
11554               {Fehler}
11555               {Sprungbefehl und Sprungziel liegen zu weit
11556                auseinander, um mit einem Sprung der benutzten L"ange
11557                "uberbr"uckt werden zu k"onnen.}
11558               {keines}
11559\errentry{1375}{Sprungdistanz ist ungerade}
11560               {Fehler}
11561               {Da Befehle nur auf geraden Adressen liegen
11562                d"urfen, mu"s eine Sprungdistanz zwischen zwei Befehlen
11563                auch immer gerade sein, das Bit 0 der Distanz wird
11564                anderweitig verwendet.  Diese Bedingung ist verletzt
11565                worden.  Grund ist "ublicherweise die Ablage einer
11566                ungeraden Anzahl von Daten in Bytes oder ein falsches \tty{ORG}.}
11567               {keines}
11568\errentry{1376}{Skip-Ziel passt nicht}
11569               {Fehler}
11570               {Das angegebene Sprungziel ist nicht die Adresse, die der
11571                Prozessor bei Ausf"uhrung der Skip-Anweisung anspringen w"urde.}
11572               {die angegebene (beabsichtigte) Sprungadresse}
11573\errentry{1380}{ung"ultiges Schiebeargument}
11574               {Fehler}
11575               {als Argument f"ur die Schiebeamplitude darf nur
11576                eine Konstante oder ein Datenregister verwendet werden.
11577                (nur 680x0)}
11578               {keines}
11579\errentry{1390}{Nur Bereich 1..8 erlaubt}
11580               {Fehler}
11581               {Konstanten f"ur Schiebeamplituden oder
11582                \tty{ADDQ}-Argumente d"urfen nur im Bereich 1..8 liegen. (nur
11583                680x0)}
11584               {keines}
11585\errentry{1400}{Schiebezahl zu gro"s}
11586               {Fehler}
11587               {(nicht mehr verwendet)}
11588               {keines}
11589\errentry{1410}{Ung"ultige Registerliste}
11590               {Fehler}
11591               {Das Registerlisten-Argument von \tty{MOVEM}
11592	        oder \tty{FMOVEM} hat ein falsches Format. (nur 680x0)}
11593               {keines}
11594\errentry{1420}{Ung"ultiger Modus mit CMP}
11595               {Fehler}
11596               {Die verwendete Operandenkombination von \tty{CMP}
11597	        ist nicht erlaubt. (nur 680x0)}
11598               {keines}
11599\errentry{1430}{Ung"ultiger Prozessortyp}
11600               {Fehler}
11601               {Den mit CPU angeforderten Zielprozessor kennt AS
11602                nicht.}
11603               {der unbekannte Prozessortyp}
11604\errentry{1440}{Ung"ultiges Kontrollregister}
11605               {Fehler}
11606               {Das bei z.B. \tty{MOVEC} benutzte
11607	        Kontrollregister  kennt der mit CPU gesetzte Prozessor
11608	        (noch) nicht.}
11609               {keines}
11610\errentry{1445}{Ung"ultiges Register}
11611               {Fehler}
11612               {Das benutzte Register ist zwar prinzipiell
11613                vorhanden, hier aber nicht erlaubt.}
11614               {keines}
11615\errentry{1446}{Register mehr als einmal gelistet}
11616               {Fehler}
11617               {Ein Register taucht in der Liste der zu sichernden bzw.
11618                wiederherzustellenden Register mehrfach auf.}
11619               {keines}
11620\errentry{1447}{Register-Bank-Diskrepanz}
11621               {Fehler}
11622               {In einem Adre"sausdruck werden Register aus unterschiedlichen
11623                B"anken verwendet.}
11624               {das fragliche Register}
11625\errentry{1448}{Registerl"ange undefiniert}
11626               {Fehler}
11627               {An dieser Stelle k"onnen Register verschiedener L"ange verwendet werden,
11628                und die Registerl"ange ist nicht alleine aus der Adresse ableitbar.}
11629               {das fragliche Argument}
11630\errentry{1450}{RESTORE ohne SAVE}
11631               {Fehler}
11632               {Es wurde ein \tty{RESTORE}-Befehl gefunden, obwohl
11633                kein mit \tty{SAVE} gespeicherter Zustand (mehr) auf dem Stapel
11634                vorhanden ist.}
11635               {keines}
11636\errentry{1460}{fehlendes RESTORE}
11637               {Fehler}
11638               {Nach der Assemblierung sind nicht alle
11639                \tty{SAVE}-Befehle wieder aufgel"ost worden.}
11640               {keines}
11641\errentry{1465}{unbekannte Makro-Steueranweisung}
11642               {Fehler}
11643               {Eine beim \tty{MACRO}-Befehl zus"atzlich angegebene
11644                Steueranweisung ist AS unbekannt.}
11645               {die fragliche Anweisung}
11646\errentry{1470}{fehlendes ENDIF/ENDCASE}
11647               {Fehler}
11648               {Nach der Assemblierung sind nicht alle
11649                Konstrukte zur bedingten Assemblierung aufgel"ost
11650                worden.}
11651               {keines}
11652\errentry{1480}{ung"ultiges IF-Konstrukt}
11653               {Fehler}
11654               {Die Reihenfolge der Befehle in einem \tty{IF}-
11655	        oder \tty{SWITCH}-Konstrukt stimmt nicht.}
11656               {keines}
11657\errentry{1483}{doppelter Sektionsname}
11658               {Fehler}
11659               {Es existiert bereits eine Sektion gleichen
11660                Namens auf dieser Ebene.}
11661               {der doppelte Name}
11662\errentry{1484}{unbekannte Sektion}
11663               {Fehler}
11664               {Im momentanen Sichtbarkeitsbereich existiert
11665                keine Sektion dieses Namens.}
11666               {der unbekannte Name}
11667\errentry{1485}{fehlendes ENDSECTION}
11668               {Fehler}
11669               {Nach Ende eines Durchganges sind nicht alle
11670                Sektionen wieder geschlossen worden.}
11671               {keines}
11672\errentry{1486}{falsches ENDSECTION}
11673               {Fehler}
11674               {die bei \tty{ENDSECTION} angegebene Sektion
11675	        ist nicht die innerste offene.}
11676               {keines}
11677\errentry{1487}{ENDSECTION ohne SECTION}
11678               {Fehler}
11679               {Es wurde ein \tty{ENDSECTION}-Befehl gegeben, obwohl
11680                gar keine Sektion offen war.}
11681               {keines}
11682\errentry{1488}{nicht aufgel"oste Vorw"artsdeklaration}
11683               {Fehler}
11684               {ein mit \tty{FORWARD} oder \tty{PUBLIC}
11685	        angek"undigtes Symbol wurde nicht in der Sektion definiert.}
11686               {der Name des fraglichen Symbols, plus die
11687                Position der Vorw"arts-Deklaration im Quelltext}
11688\errentry{1489}{widersprechende FORWARD $\leftrightarrow$PUBLIC-Deklaration}
11689               {Fehler}
11690               {Ein Symbol wurde sowohl als privat als auch
11691                global definiert.}
11692               {der Name des Symbols}
11693\errentry{1490}{falsche Argumentzahl f"ur Funktion}
11694               {Fehler}
11695               {Die Anzahl der Argumente f"ur eine
11696                selbstdefinierte Funktion stimmt nicht mit der geforderten
11697                Anzahl "uberein.}
11698               {keines}
11699\errentry{1495}{unaufgel"oste Literale (LTORG fehlt)}
11700               {Fehler}
11701               {Am Programmende oder beim Umachalten
11702                zu einem anderen Zielprozessor blieben noch nicht
11703                abgelegte Literale "ubrig.}
11704               {keines}
11705\errentry{1500}{Befehl auf dem ... nicht vorhanden}
11706               {Fehler}
11707               {Der benutzte Befehl existiert zwar
11708                grunds"atzlich, das eingestellte Mitglied der
11709                Prozessorfamilie beherrscht ihn aber noch nicht.}
11710               {Die Prozessorvarianten, die diesen Befehl
11711                unterst"utzen w"urden.}
11712\errentry{1501}{FPU-Befehle nicht freigeschaltet}
11713               {Fehler}
11714               {Die FPU-Befehlssatzerweiterungen m"ussen erlaubt
11715                werden, um diesen Befehl zu benutzen}
11716               {keines}
11717\errentry{1502}{PMMU-Befehle nicht freigeschaltet}
11718               {Fehler}
11719               {Die PMMU-Befehlssatzerweiterungen m"ussen erlaubt
11720                werden, um diesen Befehl zu benutzen}
11721               {keines}
11722\errentry{1503}{voller PMMU-Befehlssatz nicht freigeschaltet}
11723               {Fehler}
11724               {Dieser Befehl ist nur im Befehlssatz der
11725                68851-PMMU enthalten, nicht im reduzierten
11726                Befehlssatz der integrierten PMMU.}
11727               {keines}
11728\errentry{1504}{Z80-Syntax nicht erlaubt}
11729               {Fehler}
11730               {Dieser Befehl ist nur erlaubt, wenn die
11731                Z80-Syntax f"ur 8080/8085-Befehle freigeschaltet
11732                wurde.}
11733               {keines}
11734\errentry{1505}{Adressierungsart auf dem ... nicht vorhanden}
11735               {Fehler}
11736               {Der benutzte Adressierungsmodus existiert
11737                zwar grunds"atzlich, das eingestellte Mitglied der
11738                Prozessorfamilie beherrscht ihn aber noch nicht.}
11739               {Die Prozessorvarianten, die diesen
11740                Adressierungsmodus unterst"utzen w"urden.}
11741\errentry{1506}{nicht im Z80-Syntax Exklusiv-Modus erlaubt}
11742               {Fehler}
11743               {Dieser Befehl ist nicht (mehr) erlaubt, wenn nur
11744                noch Z80-Syntax f"ur 8080/8085-Befehle erlaubt
11745                wurde.}
11746               {keines}
11747\errentry{1510}{Ung"ultige Bitstelle}
11748               {Fehler}
11749               {Die angegebene Bitnummer ist nicht erlaubt
11750	        oder eine Angabe fehlt komplett.}
11751               {keines}
11752\errentry{1520}{nur ON/OFF erlaubt}
11753               {Fehler}
11754               {Dieser Pseudobefehl darf als Argument nur \tty{ON}
11755                oder \tty{OFF} haben.}
11756               {keines}
11757\errentry{1530}{Stack ist leer oder nicht definiert}
11758               {Fehler}
11759               {Es wurde bei einem \tty{POPV}
11760                einen Stack anzusprechen, der entweder nie definiert oder
11761                bereits leerger"aumt wurde.}
11762               {der Name des fraglichen Stacks}
11763\errentry{1540}{Nicht genau ein Bit gesetzt}
11764	       {Fehler}
11765               {In einer Bitmaske, die der \tty{BITPOS}-
11766                Funktion "ubergeben wurde, war nicht genau ein Bit
11767                gesetzt.}
11768               {keines}
11769\errentry{1550}{ENDSTRUCT ohne STRUCT}
11770               {Fehler}
11771               {Eine \tty{ENDSTRUCT}-Anweisung wurde gegeben, obwohl
11772                momentan keine Strukturdefinition in Gange war.}
11773               {keines}
11774\errentry{1551}{offene Strukturdefinition}
11775               {Fehler}
11776               {Nach Ende der Assemblierung waren noch nicht alle
11777                \tty{STRUCT}-Anweisungen durch passende \tty{ENDSTRUCT}s
11778                abgeschlossen.}
11779               {die innerste, noch nicht abgeschlossene
11780                Strukturdefinition}
11781\errentry{1552}{falsches ENDSTRUCT}
11782               {Fehler}
11783               {Der Namensparameter einer \tty{ENDSTRUCT}-Anweisung
11784                entspricht nicht der innersten, offenen
11785                Strukturdefinition.}
11786               {keines}
11787\errentry{1553}{Phasendefinition nicht in Strukturen erlaubt}
11788               {Fehler}
11789               {Was gibt es dazu zu sagen?  \tty{PHASE} in einem Record
11790                ergibt einfach keinen Sinn und nur Verwirrung...}
11791               {keines}
11792\errentry{1554}{ung"ultige \tty{STRUCT}-Direktive}
11793               {Fehler}
11794               {Als Direktive f"ur \tty{STRUCT} ist nur
11795                \tty{EXTNAMES}, \tty{NOEXTNAMES}, \tty{DOTS} und
11796                \tty{NODOTS} zugelassen.}
11797               {die unbekannte Direktive}
11798\errentry{1555}{Struktur redefiniert}
11799               {Fehler}
11800               {Eine Struktur dieses Namens wurde bereits definiert.}
11801               {der Name der Struktur}
11802\errentry{1556}{nicht aufl"osbare Strukturelement-Referenz}
11803               {Fehler}
11804               {Ein Element bezieht sich auf ein anderes Element in
11805                einer Strukturdefintions, dieses ist aber nicht
11806                definiert oder dessen Referenz selber is nicht
11807                aufl"osbar.}
11808               {Name des Elements und seine Referenz}
11809\errentry{1560}{Anweisung nicht wiederholbar}
11810               {Fehler}
11811               {Diese Maschinenanweisung kann nicht mit Hilfe eines
11812                {\tt RPT}-Konstruktes wiederholt werden.}
11813               {keines}
11814\errentry{1600}{vorzeitiges Dateiende}
11815               {Fehler}
11816               {Es wurde mit einem \tty{BINCLUDE}-Befehl versucht,
11817                "uber das Ende einer Datei hinauszulesen.}
11818               {keines}
11819\errentry{1700}{ROM-Offset geht nur von 0..63}
11820               {Fehler}
11821               {Das Konstanten-ROM der 680x0-Koprozessoren hat
11822                nur max. 63 Eintr"age.}
11823               {keines}
11824\errentry{1710}{Ung"ultiger Funktionscode}
11825               {Fehler}
11826               {Als Funktionscodeargument darf nur SFC, DFC, ein
11827                Datenregister oder eine Konstante von 0..15 verwendet
11828                werden. (nur 680x0-MMU)}
11829               {keines}
11830\errentry{1720}{Ung"ultige Funktionscodemaske}
11831               {Fehler}
11832               {Als Funktionscodemaske darf nur ein Wert von
11833                0..15 verwendet werden. (nur 680x0-MMU)}
11834               {keines}
11835\errentry{1730}{Ung"ultiges MMU-Register}
11836               {Fehler}
11837               {Die MMU hat kein Register mit dem angegebenen
11838                Namen. (nur 680x0-MMU)}
11839               {keines}
11840\errentry{1740}{Level nur von 0..7}
11841               {Fehler}
11842               {Die Ebene f"ur \tty{PTESTW} und \tty{PTESTR} mu"s eine
11843                Konstante von 0..7 sein. (nur 680x0-MMU)}
11844               {keines}
11845\errentry{1750}{ung"ultige Bitmaske}
11846               {Fehler}
11847               {Die bei den Bit-Feld-Befehlen angegebene
11848                Bitmaske hat ein falsches Format. (nur 680x0)}
11849               {keines}
11850\errentry{1760}{ung"ultiges Registerpaar}
11851               {Fehler}
11852               {Das angegebene Registerpaar ist hier nicht
11853                verwendbar oder syntaktisch falsch. (nur 680x0)}
11854               {keines}
11855\errentry{1800}{offene Makrodefinition}
11856               {Fehler}
11857               {Eine Makrodefinition war am Dateiende nicht
11858                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
11859               {keines}
11860\errentry{1801}{IRP ohne ENDM}
11861               {Fehler}
11862               {Ein IRP-Block war am Dateiende nicht
11863                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
11864               {keines}
11865\errentry{1802}{IRPC ohne ENDM}
11866               {Fehler}
11867               {Ein IRPC-Block war am Dateiende nicht
11868                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
11869               {keines}
11870\errentry{1803}{REPT ohne ENDM}
11871               {Fehler}
11872               {Ein REPT-Block war am Dateiende nicht
11873                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
11874               {keines}
11875\errentry{1804}{WHILE ohne ENDM}
11876               {Fehler}
11877               {Ein WHILE-Block war am Dateiende nicht
11878                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
11879               {keines}
11880\errentry{1805}{EXITM au"serhalb eines Makrorumpfes}
11881               {Fehler}
11882               {\tty{EXITM} bricht die Expansion von
11883                Makro-Konstrukten ab.  Dieser Befehl macht nur innerhalb
11884                von Makros Sinn und es wurde versucht, ihn au"serhalb
11885                aufzurufen.}
11886               {keines}
11887\errentry{1810}{mehr als 10 Makroparameter}
11888               {Fehler}
11889               {Ein Makro darf h"ochstens 10 Parameter haben.}
11890               {keines}
11891\errentry{1811}{Schl"usselwortargument nicht in Makro definiert}
11892               {Fehler}
11893               {Ein Schl"usselwortargument bezog sich auf einen
11894                Parameter, den das aufgerufene Makro gar nicht
11895                besitzt.}
11896               {verwendetes Schl"usselwort bzw. Makroparameter}
11897\errentry{1812}{Positionsargument nach Schl"usselwortargumenten nicht mehr erlaubt}
11898               {Fehler}
11899               {Positions- und Schl"usselwortargumente d"urfen in
11900                einem Makroaufruf gemischt werden, aber nach dem
11901                ersten Schl"usselwortargument sind nur noch
11902                solche zugelassen.}
11903               {keines}
11904\errentry{1815}{doppelte Makrodefinition}
11905               {Fehler}
11906               {Ein Makronamne wurde in einer Sektion doppelt
11907                vergeben.}
11908               {der doppelt verwendete Name}
11909\errentry{1820}{Ausdruck mu"s im ersten Pass berechenbar sein}
11910               {Fehler}
11911               {Der benutzte Befehl beeinflu"st die Codel"ange,
11912                daher sind Vorw"artsreferenzen hier nicht erlaubt.}
11913               {keines}
11914\errentry{1830}{zu viele verschachtelte IFs}
11915               {Fehler}
11916               {(nicht mehr verwendet)}
11917               {keines}
11918\errentry{1840}{ELSEIF/ENDIF ohne ENDIF}
11919               {Fehler}
11920               {es wurde ein \tty{ELSEIF}- oder \tty{ENDIF}-Befehl gefunden,
11921                obwohl kein offener \tty{IF}-Befehl vorhanden ist.}
11922               {keines}
11923\errentry{1850}{verschachtelter/rekursiver Makroaufruf}
11924               {Fehler}
11925               {(nicht mehr verwendet)}
11926               {keines}
11927\errentry{1860}{unbekannte Funktion}
11928               {Fehler}
11929               {Die angesprochene Funktion ist weder eingebaut
11930                noch nachtr"aglich definiert worden.}
11931               {der Funktionsname}
11932\errentry{1870}{Funktionsargument au"serhalb Definitionsbereich}
11933               {Fehler}
11934               {Das Argument liegt nicht im Bereich der
11935                angesprochenen transzendenten Funktion.}
11936               {keines}
11937\errentry{1880}{Gleitkomma"uberlauf}
11938               {Fehler}
11939               {Das Argument liegt zwar im Bereich der
11940                angesprochenen transzendenten Funktion, das Ergebnis
11941                w"are aber nicht mehr darstellbar.}
11942               {keines}
11943\errentry{1890}{ung"ultiges Wertepaar}
11944               {Fehler}
11945               {Das benutzte P"archen aus Basis und Exponent
11946                kann nicht berechnet werden.}
11947               {keines}
11948\errentry{1900}{Befehl darf nicht auf dieser Adresse liegen}
11949               {Fehler}
11950               {Die Prozessorhardware erlaubt keine
11951                Spr"unge von dieser Adresse.}
11952               {keines}
11953\errentry{1905}{ung"ultiges Sprungziel}
11954               {Fehler}
11955               {Die Prozessorhardware erlaubt keine
11956                Spr"unge zu dieser Adresse.}
11957               {keines}
11958\errentry{1910}{Sprungziel nicht auf gleicher Seite}
11959               {Fehler}
11960               {Sprungbefehl und Sprungziel m"ussen bei diesem
11961                Befehl auf der gleichen Seite liegen.}
11962               {keines}
11963\errentry{1911}{Sprungziel nicht in gleicher Sektion}
11964               {Fehler}
11965               {Sprungbefehl und Sprungziel m"ussen bei diesem
11966                Befehl in der gleichen (64K-)Sektion liegen.}
11967               {keines}
11968\errentry{1920}{Code"uberlauf}
11969               {Fehler}
11970               {Es wurde versucht, mehr als 1024 Bytes Code oder
11971                Daten in einer Zeile zu erzeugen.}
11972               {keines}
11973\errentry{1925}{Adre"s"uberlauf}
11974               {Fehler}
11975               {Der Adre"sraum dieses Prozessors wurde
11976                "uberschritten.}
11977               {keines}
11978\errentry{1930}{Konstanten und Platzhalter nicht mischbar}
11979               {Fehler}
11980               {Anweisungen, die Speicher reservieren und solche,
11981                die ihn mit Konstanten belegen, d"urfen nicht in einer
11982                Pseudoanweisung gemischt werden.}
11983               {keines}
11984\errentry{1940}{Codeerzeugung in Strukturdefinition nicht zul"assig}
11985               {Fehler}
11986               {Ein \tty{STRUCT}-Konstrukt dient nur der Beschreibung
11987                einer Datenstruktur und nicht dem Anlegen einer solchen,
11988                es sind daher keine Befehle zugelassen, die Code erzeugen.}
11989               {keines}
11990\errentry{1950}{Paralleles Konstrukt nicht m"oglich}
11991               {Fehler}
11992               {Entweder sind die beiden Instruktionen
11993                prinzipiell nicht parallel ausf"uhrbar, oder sie stehen nicht
11994                unmittelbar untereinander.}
11995               {keines}
11996\errentry{1960}{ung"ultiges Segment}
11997               {Fehler}
11998               {Das angegebene Segment ist an dieser Stelle
11999                nicht anwendbar.}
12000               {der benutzte Segmentname}
12001\errentry{1961}{unbekanntes Segment}
12002               {Fehler}
12003               {Das angegebene Segment existiert bei
12004                diesem Prozessor nicht.}
12005               {der benutzte Segmentname}
12006\errentry{1962}{unbekanntes Segmentregister}
12007               {Fehler}
12008               {Das angegebene Segmentregister existiert
12009                nicht (nur 8086).}
12010               {keines}
12011\errentry{1970}{ung"ultiger String}
12012               {Fehler}
12013               {Der angegebene String hat ein ung"ultiges
12014                Format.}
12015               {keines}
12016\errentry{1980}{ung"ultiger Registername}
12017               {Fehler}
12018               {Das angegebene Register existiert nicht oder
12019                darf hier nicht verwendet werden.}
12020               {keines}
12021\errentry{1985}{ung"ultiges Argument}
12022               {Fehler}
12023               {Der angegebene Befehl darf nicht mit einem
12024                \tty{REP}-Pr"afix versehen werden.}
12025               {keines}
12026\errentry{1990}{keine Indirektion erlaubt}
12027               {Fehler}
12028               {in dieser Kombination ist keine indirekte
12029                Adressierung erlaubt.}
12030               {keines}
12031\errentry{1995}{nicht im aktuellen Segment erlaubt}
12032               {Fehler}
12033               {(nicht mehr verwendet)}
12034               {keines}
12035\errentry{1996}{nicht im Maximum-Modus zul"assig}
12036               {Fehler}
12037               {Dieses Register ist nur im Minimum-Modus
12038                definiert.}
12039               {keines}
12040\errentry{1997}{nicht im Minimum-Modus zul"assig}
12041               {Fehler}
12042               {Dieses Register ist nur im Maximum-Modus
12043                definiert.}
12044               {keines}
12045\errentry{2000}{Anweisungspaket "uberschreitet Adre"sgrenze}
12046               {Fehler}
12047               {Ein Anweisungspaket dard nicht "uber eine
12048                32-Byte-Adre"sgrenze reichen.}
12049               {keines}
12050\errentry{2001}{Ausf"uhrungseinheit mehrfach benutzt}
12051               {Fehler}
12052               {Eine der Ausf"uhrungseinheiten des Prozessors wurde in
12053                einem Anweisungspaket mehrfach benutzt.}
12054               {der Name der Funktionseinheit}
12055\errentry{2002}{mehrfache Lang-Leseoperation}
12056               {Fehler}
12057               {Ein Ausf"uhrungspaket enth"alt mehr als eine
12058                Lang-Leseoperation, was nicht erlaubt ist.}
12059               {eine der Funktionseinheiten, auf denen eine
12060                Lang-Leseoperation ausgef"uhrt wird}
12061\errentry{2003}{mehrfache Lang-Schreiboperation}
12062               {Fehler}
12063               {Ein Ausf"uhrungspaket enth"alt mehr als eine
12064                Lang-Schreiboperation, was nicht erlaubt ist.}
12065               {eine der Funktionseinheiten, auf denen eine
12066                Lang-Schreiboperation ausgef"uhrt wird}
12067\errentry{2004}{Lang-Lese- mit Schreiboperation}
12068               {Fehler}
12069               {Ein Ausf"uhrungspaket enth"alt sowohl eine
12070                Lang-Leseoperation als auch eine Schreiboperation,
12071                was nicht erlaubt ist.}
12072               {eine der Funktionseinheiten, deren Operationen im
12073                Konflikt stehen.}
12074\errentry{2005}{zu viele Lesezugriffe auf ein Register}
12075               {Fehler}
12076               {Auf das gleiche Register wurde mehr als viermal im
12077                gleichen Anweisungspaket Bezug genommen.}
12078               {der Name des Registers, das zu oft referenziert wurde}
12079\errentry{2006}{"uberlappende Ziele}
12080               {Fehler}
12081               {Auf das gleiche Register wurde mehrfach im gleichen
12082                Ausf"uhrungspaket geschrieben, was nicht erlaubt ist.}
12083               {der Name der fraglichen Registers}
12084\errentry{2008}{zu viele absolute Spr"unge in einem Anweisungspaket}
12085               {Fehler}
12086               {Ein Anweisungspaket beinhaltet mehr als einen direkten
12087                Sprung, was nicht erlaubt ist.}
12088               {keines}
12089\errentry{2009}{Anweisung nicht auf diese Funktionseinheit ausf"uhrbar}
12090               {Fehler}
12091               {Diese Anweisung kann nicht auf dieser Funktionseinheit
12092                ausgef"uhrt werden.}
12093               {none}
12094\errentry{2010}{Ung"ultige Escape-Sequenz}
12095               {Fehler}
12096               {Das mit einem Backslash eingeleitete
12097	        Sonderzeichen ist nicht definiert.}
12098               {keines}
12099\errentry{2020}{ung"ultige Pr"afix-Kombination}
12100               {Fehler}
12101               {Die angegebene Kombination von Pr"afixen
12102	        ist nicht zul"assig oder nicht im
12103	        Maschinenkode darstellbar.}
12104               {keines}
12105\errentry{2030}{Konstante kann nicht als Variable redefiniert werden}
12106               {Fehler}
12107               {Ein einmal mit {\tt EQU} als Konstante\\
12108                definiertes Symbol kann nicht nachtr"aglich mit\\
12109                {\tt SET} ver"andert werden.}
12110               {der Name des fraglichen Symbols}
12111\errentry{2035}{Variable kann nicht als Konstante redefiniert werden}
12112               {Fehler}
12113               {Ein einmal mit {\tt SET} als Variable\\
12114                definiertes Symbol kann nicht nachtr"aglich als\\
12115                Konstante deklariert werden (z.B. mit {\tt EQU}.}
12116               {der Name des fraglichen Symbols}
12117\errentry{2040}{Strukturname fehlt}
12118               {Fehler}
12119               {Bei einer Strukturdefinition fehlt der zugeh"orende
12120                Name f"ur die Struktur.}
12121               {keines}
12122\errentry{2050}{leeres Argument}
12123               {Fehler}
12124               {In der Argumentenliste dieser Anweisung d"urfen keine
12125                Leerstrings benutzt werden.}
12126               {keines}
12127\errentry{2060}{nicht implementierte Anweisung}
12128               {Fehler}
12129               {Der benutzte Maschinenbefehl ist dem Assembler
12130                zwar bekannt, ist aber aufgrund fehlender
12131                Dokumentation seitens des Prozessorherstellers
12132                momentan nicht implementiert.}
12133               {Der benutzte Befehl}
12134\errentry{2070}{namenlose Struktur nicht Teil einer anderen Struktur}
12135               {Fehler}
12136               {Eine Struktur oder Union, die keinen Namen hat, mu"s
12137                immer Teil einer anderen, benamten Struktur oder Union
12138                sein.}
12139               {keines}
12140\errentry{2080}{STRUCT durch ENDUNION beendet}
12141               {Fehler}
12142               {ENDUNION darf nur zum Beenden der Definition einer
12143                Union benutzt werden, nicht einer Struktur.}
12144               {Name der Struktur (falls vorhanden)}
12145\errentry{2090}{Speicheradresse nicht auf aktiver Seite}
12146               {Fehler}
12147               {Die Zieladresse befindet sich nicht in der durch
12148                das Seitenregister aktuell adressierbaren
12149                Speicherseite.}
12150               {keines}
12151\errentry{2100}{unbekanntes Makro-Expansions-Argument}
12152               {Fehler}
12153               {Ein \tty{MACEXP\_DFT/OVR} gegebenes Argument konnte nicht
12154                interpretiert werden.}
12155               {das unbekannte Argument}
12156\errentry{2105}{zu viele Makro-Expansions-Argumente}
12157               {Fehler}
12158               {Die Anzahl der Argument zur Makro-Expansion hat ihre Maximalzahl "uberschritten}
12159               {das Argument, das zu viel ist}
12160\errentry{2110}{widerspr"uchliche Angaben zur Makro-Expansion}
12161               {Fehler}
12162               {Eine Angabe zur Makroexpansion und ihr genaues
12163                Gegenteil d"urfen nicht gleichzeitig als Argument
12164                von \tty{MACEXP\_DFT/OVR} verwendet werden.}
12165               {keines}
12166\errentry{2130}{erwarteter Fehler nicht eingetreten}
12167               {Fehler}
12168               {Ein per {\tt EXPECT} angek"undigter Fehler oder Warnung ist
12169                in dem durch {\tt ENDEXPECT} abgeschlossenen Block nicht aufgetreten.}
12170               {Der erwartete Fehler}
12171\errentry{2140}{Verschachtelung von EXPECT/ENDEXPECT nicht erlaubt}
12172               {Fehler}
12173               {Durch {\tt EXPECT/ENDEXPECT} eingerahmte Bl"ocke d"urfen keine
12174                geschachtelten {\tt EXPECT/ENDEXPECT}-Bl"ocke enthalten.}
12175               {keines}
12176\errentry{2150}{fehlendes ENDEXPECT}
12177               {Fehler}
12178               {Ein per {\tt EXPECT} ge"offneter Block wurde nicht per
12179                {\tt ENDEXPECT} abgeschlossen.}
12180               {keines}
12181\errentry{2160}{ENDEXPECT ohne EXPECT}
12182               {Fehler}
12183               {Zu einem {\tt ENDEXPECT} gibt es kein vorhergehendes {\tt EXPECT}.}
12184               {keines}
12185\errentry{2170}{kein Default-Checkpoint-Register definiert}
12186               {Fehler}
12187               {Bei einer Typ-12-Instruktion wurde kein Checkpoint-Register angegeben
12188                und es wurde auch keines "uber die {\tt CKPT}-Anweisung vorher definiert.}
12189               {keines}
12190\errentry{2180}{ung"ultiges Bitfeld}
12191               {Fehler}
12192               {Das Bitfeld entspricht nicht der erwarteten {\tt (start,count)}-Syntax.}
12193               {das fragliche Argument}
12194\errentry{2190}{Argument-Wert fehlt}
12195               {Fehler}
12196               {Argumente m"ussen die Form 'variable=wert' haben.}
12197               {das fragliche Argument}
12198\errentry{2200}{unbekanntes Argument}
12199               {Fehler}
12200               {Dieses Variable wird von der gew"ahlten Zielplattform nicht unterst"utzt.}
12201               {das fragliche Argument}
12202\errentry{10001}{Fehler bein "Offnen der Datei}
12203               {fatal}
12204               {Beim Versuch, eine Datei zu "offnen, ist ein
12205                Fehler aufgetreten.}
12206               {Beschreibung des E/A-Fehlers}
12207\errentry{10002}{Listingschreibfehler}
12208               {fatal}
12209               {Beim Schreiben des Assemblerlistings ist ein
12210                Fehler aufgetreten.}
12211               {Beschreibung des E/A-Fehlers}
12212\errentry{10003}{Dateilesefehler}
12213               {fatal}
12214               {Beim Lesen aus einer Quelldatei ist ein
12215                Fehler aufgetreten.}
12216               {Beschreibung des E/A-Fehlers}
12217\errentry{10004}{Dateischreibfehler}
12218               {fatal}
12219               {Beim Schreiben von Code- oder Share-Datei
12220                ist ein Fehler aufgetreten.}
12221               {Beschreibung des E/A-Fehlers}
12222\errentry{10006}{Speicher"uberlauf}
12223               {fatal}
12224               {Der verf"ugbare Speicher reicht nicht mehr,
12225	        alle Datenstrukturen aufzunehmen.  Weichen Sie auf die
12226	        DPMI- oder OS/2-Version von AS aus.}
12227               {keines}
12228\errentry{10007}{Stapel"uberlauf}
12229               {fatal}
12230               {Der Programmstapel ist wegen zu komplizierter
12231	        Formelausdr"ucke oder einer ung"unstigen Anlage der Symbol-
12232	        oder Makrotabelle "ubergelaufen.  Versuchen Sie es noch
12233	        einmal mit der \tty{-A}-Option.}
12234               {keines}
12235\end{description}
12236
12237%%===========================================================================
12238
12239\cleardoublepage
12240\chapter{E/A-Fehlermeldungen}
12241
12242Die hier aufgelisteten Fehlermeldungen werden nicht nur von AS bei E/A-
12243Fehlern ausgegeben, sondern auch von den Hilfsprogrammen PLIST, BIND,
12244P2HEX und P2BIN.  Es sind nur die Fehler n"aher erkl"art, die m.E. bei
12245der Arbeit auftreten k"onnen.  Sollte doch einmal ein nicht erl"auterter
12246E/A-Fehler auftreten, so d"urfte der Grund in einem Programmfehler
12247liegen.  Melden Sie dies unbedingt!!
12248
12249\begin{description}
12250\item[2]{Datei nicht gefunden\\
12251         Die angegebene Datei existiert nicht oder liegt auf einem
12252         anderen Laufwerk.}
12253
12254\item[3]{Pfad nicht gefunden\\
12255         Der Pfad eines Dateinamens existiert nicht oder liegt auf
12256         einem anderen Laufwerk.}
12257
12258\item[4]{zu viele offene Dateien\\
12259         DOS sind die Dateihandles ausgegangen.  Erh"ohen Sie die
12260         \tty{FILES=}-Angabe in der CONFIG.SYS.}
12261
12262\item[5]{Dateizugriff verweigert\\
12263         Entweder reichen die Netzwerkrechte f"ur einen Dateizugriff
12264         nicht, oder es wur\-de ver\-sucht, ei\-ne schreib\-ge\-sch"utz\-te Da\-tei
12265         zu "uber\-schrei\-ben oder zu ver\-"an\-dern.  Bei Benutzung in
12266         DOS- Fenstern von Multitasking- Systemen ist es "uberdies m"oglich,
12267         da"s ein andere Proze"s die Datei in exklusivem Zugriff hat.}
12268
12269\item[6]{ung"ultiger Dateihandle}
12270
12271\item[12]{ung"ultiger Zugriffsmodus}
12272
12273\item[15]{ung"ultiger Laufwerksbuchstabe\\
12274          Das angesprochene Laufwerk existiert nicht.}
12275
12276
12277\item[16]{aktuelles Verzeichnis kann nicht gel"oscht werden}
12278
12279\item[17]{RENAME geht nicht "uber Laufwerke}
12280
12281\item[100]{vorzeitiges Dateiende\\
12282           Eine Datei war zuende, obwohl sie es aufgrund ihrer Struktur
12283           noch nicht sein d"urfte.  Vermutlich ist sie besch"adigt.}
12284
12285\item[101]{Diskette/Platte voll\\
12286           Das spricht wohl f"ur sich!  Aufr"aumen!!}
12287
12288\item[102]{ASSIGN fehlt}
12289
12290\item[103]{Datei nicht offen}
12291
12292\item[104]{Datei nicht f"ur Einlesen offen}
12293
12294\item[105]{Datei nicht f"ur Ausgaben offen}
12295
12296\item[106]{Ung"ultiges numerisches Format}
12297
12298\item[150]{Diskette ist schreibgesch"utzt\\
12299           Wenn Sie schon keine Festplatte als Arbeitsmedium verwenden,
12300           so sollten Sie wenigstens den Schreibschutz entfernen!}
12301
12302\item[151]{Unbekanntes Ger"at\\
12303           Sie haben versucht, ein Peripherieger"at anzusprechen, welches
12304           DOS unbekannt ist.  Dies sollte normalerweise nicht auftreten,
12305           da der Name dann automatisch als Datei interpretiert wird.}
12306
12307\item[152]{Laufwerk nicht bereit\\
12308           Schlie"sen Sie die Klappe des Diskettenlaufwerks.}
12309
12310\item[153]{unbekannte DOS-Funktion}
12311
12312\item[154]{Pr"ufsummenfehler auf Diskette/Platte\\
12313           Ein harter Lesefehler auf der Diskette.  Nochmal versuchen; wenn
12314           immer noch vorhanden, Diskette neu formatieren bzw. ernste Sorgen
12315           um Festplatte machen!}
12316
12317\item[155]{ung"ultiger DPB}
12318
12319\item[156]{Positionierfehler\\
12320           Der Platten/Disketten-Controller hat eine bestimmte Spur nicht
12321           gefunden.  Siehe Nr. 154!}
12322
12323\item[157]{unbekanntes Sektorformat\\
12324           DOS kann mit dem Format der Diskette nichts anfangen.}
12325
12326\item[158]{Sektor nicht gefunden\\
12327           Analog zu Nr. 158, nur da"s hier der angeforderte Sektor auf
12328           der Spur nicht gefunden werden konnte.}
12329
12330\item[159]{Papierende\\
12331           Offensichtlich haben Sie die Ausgaben von AS direkt auf einen
12332           Drucker umgeleitet.  Assemblerlistings k"onnen seeehr lang
12333           sein...}
12334
12335\item[160]{Ger"atelesefehler\\
12336           Nicht n"aher vom Ger"atetreiber klassifizierter Lesefehler.}
12337
12338\item[161]{Ger"ateschreibfehler\\
12339           Nicht n"aher vom Ger"atetreiber klassifizierter Schreibfehler.}
12340
12341\item[162]{allgemeiner Ger"atefehler\\
12342           Hier ist der Ger"atetreiber v"ollig ratlos, was passiert
12343           sein k"onnte.}
12344\end{description}
12345
12346%%===========================================================================
12347
12348\cleardoublepage
12349\chapter{H"aufig gestellte Fragen}
12350
12351In diesem Kapitel habe ich versucht, einige besonders h"aufig gestellte
12352Fragen mit den passenden Antworten zu sammeln.  Die Antworten auf
12353die hier auftauchenden Probleme finden sich zwar auch an anderer
12354Stelle in der Anleitung, jedoch findet man sie vielleicht nicht auf
12355den ersten Blick...
12356
12357\begin{description}
12358\item[F:]{Ich bin DOS leid.  F"ur welche Plattformen gibt es AS sonst ?}
12359\item[A:]{Neben der Protected-Mode-Version, die AS unter DOS mehr Speicher
12360         zur Verf"ugung stellt, existieren Portierungen f"ur OS/2 und
12361         Unix-Systeme wie z.B. Linux (im Teststadium).  An Versionen,
12362         die Softwareherstellern in Redmond beim Geldscheffeln zuarbeiten
12363         w"urden, ist momentan nicht gedacht.  Sofern jemand anders in
12364         dieser Hinsicht aktiv werden will, stelle ich ihm aber gerne
12365         die AS-Quellen zur Verf"ugung, von denen sich die C-Variante
12366         insbesondere eignen d"urfte.  "Uber Fragen zu diesen Quellen
12367         hinaus sollte er sich aber nicht viel von mir erwarten...}
12368\vspace{0.3cm}
12369\item[F:]{Ist eine Unterst"utzung des XYZ-Prozessors f"ur AS geplant?}
12370\item[A:]{Es kommen immer neue Prozessoren heraus, und ich bem"uhe
12371         mich, bei Erweiterung von AS Schritt zu halten.  Der Stapel
12372         mit der Aufschrift ,,Unerledigt'' auf meinem Schreibtisch
12373         unterschreitet aber selten die 10cm-Grenze... Bei der Planung,
12374         welche Kandidaten zuerst abgearbeitet werden, spielen W"unsche
12375         von Anwendern nat"urlich eine gro"se Rolle.  Das Internet und
12376         die steigende Zahl elektronisch publizierter Dokumentation
12377         erleichtern die Beschaffung von Unterlagen, speziell bei
12378         ausgefallenen oder "alteren Architekturen wird es aber immer
12379         wieder schwierig.  Wenn sich die fragliche Prozessorfamilie
12380         nicht in der Liste in Planung befindlicher Prozessoren
12381         befindet (siehe Kapitel 1), macht es sich sehr gut, der
12382         Anfrage auch gleich ein passendes Datenbuch hinzuzupacken
12383         (zur Not auch leihweise!).}
12384\vspace{0.3cm}
12385\item[F:]{Ein freier Assembler ist ja eine feine Sache, aber eigentlich
12386         br"auchte ich jetzt auch noch einen Disassembler...und einen
12387         Debugger...ein Simulator w"are auch ganz nett..}
12388\item[A:]{AS ist ein Freizeitprojekt von mir, d.h. etwas, was ich in der
12389         Zeit tue, wenn ich mich nicht gerade um den Broterwerb k"ummere.
12390         Von dieser Zeit nimmt AS schon einen ganz erheblichen Teil ein,
12391         und ab und zu genehmige ich mir auch mal eine Auszeit, um den
12392         L"otkolben zu schwingen, mal wieder eine Tangerine Dream-Platte
12393         bewu"st zu h"oren, mich vor den Fernseher zu hocken oder einfach
12394         nur dringenden menschlichen Bed"urfnissen nachzugehen.  Ich habe
12395         einmal angefangen, einen Disassembler zu konzipieren, der wieder
12396         voll reassemblierbaren Code erzeugt und automatisch Daten- und
12397         Code-Bereiche trennt, habe das Projekt aber relativ schnell wieder
12398         eingestellt, weil die restliche Zeit f"ur so etwas einfach nicht
12399         mehr reicht.  Ich mache lieber eine Sache gut als ein halbes
12400         Dutzend m"a"sig.  Von daher mu"s die Antwort also wohl ,,nein''
12401         hei"sen...}
12402\vspace{0.3cm}
12403\item[F:]{In den Bildschirmausgaben von AS tauchen seltsame Zeichen auf,
12404          z.B. Pfeile und eckige Klammern.  Warum?}
12405\item[A:]{AS verwendet zur Bildschirmsteuerung defaultm"a"sig einige
12406          ANSI-Terminal-Steuersequenzen.  Haben Sie keinen ANSI-Treiber
12407	  installiert, so kommen diese Steuerzeichen ungefiltert auf
12408	  Ihrem Bildschirm heraus.  Installieren Sie entweder einen
12409	  ANSI-Treiber oder schalten Sie die Steuersequenzen mit dem
12410	  DOS-Befehl \tty{SET USEANSI=N} ab.}
12411\vspace{0.3cm}
12412\item[F:]{W"ahrend der Assemblierung bricht AS pl"otzlich mit der
12413          Meldung eines Stapel"uberlaufes ab.  Ist mein Programm zu
12414	  kompliziert?}
12415\item[A:]{Ja und Nein.  Die Symboltabelle f"ur Ihr Programm ist nur
12416          etwas unregelm"a"sig gewachsen, was zu zu hohen Rekursionstiefen
12417	  im Zugriff auf die Tabelle gef"uhrt hat.  Diese Fehler treten
12418	  insbesondere bei der 16-Bit-OS/2-Version von AS auf, die nur
12419	  "uber einen relativ kleinen Stack verf"ugt.  Starten Sie AS noch
12420	  einmal mit dem \tty{-A}-Kommandozeilenschalter.  Hilft dies auch
12421          nicht, so kommen als m"ogliche Problemstellen noch zu komplizierte
12422          Formelausdr"ucke in Frage.  Versuchen Sie in einem solchen Fall,
12423          die Formel in Zwischenschritte aufzuspalten.}
12424\vspace{0.3cm}
12425\item[F:]{AS scheint mein Programm nicht bis zum Ende zu assemblieren.
12426          Mit einer "alteren Version von AS (1.39) hat es dagegen
12427	  funktioniert.}
12428\item[A:]{Neuere Versionen von AS ignorieren das \tty{END}-Statement nicht
12429          mehr, sondern beenden danach wirklich die Assemblierung.
12430	  Insbesondere bei Include-Dateien ist es fr"uher vorgekommen, da"s
12431	  Anwender jede Datei mit einem \tty{END}-Statement beendet haben.
12432	  Entfernen Sie die "uberfl"ussigen \tty{END}s.}
12433\vspace{0.3cm}
12434\item[F:]{Weil ich noch ein paar kompliziertere Assemblierfehler im Programm
12435          hatte, habe ich mir ein Listing gemacht und es einmal genauer
12436          angeschaut.  Dabei ist mir aufgefallen, da"s einige Spr"unge nicht
12437          auf das gew"unschte Ziel, sondern auf sich selbst zeigen!}
12438\item[A:]{Dieser Effekt tritt bei Vorw"artsspr"ungen auf, bei denen der
12439          Formelparser von AS im ersten Pass die Zieladresse noch nicht kennen
12440          kann.  Da der Formelparser ein unabh"angiges Modul ist, mu"s er sich
12441          in einem solchen Fall einen Wert ausdenken, der auch relativen
12442          Spr"ungen mit kurzer Reichweite nicht wehtut, und dies ist nun
12443          einmal die aktuelle Programmz"ahleradresse selber...im zweiten Pass
12444          w"aren die korrekten Werte erschienen, aber zu diesem ist es nicht
12445          gekommen, da schon im ersten Pass Fehler auftraten.  Korrigieren
12446          Sie die anderen Fehler zuerst, so da"s AS zum zweiten Pass kommt,
12447          und das Listing sollte wieder vern"unftiger aussehen.}
12448\vspace{0.3cm}
12449\item[F:]{Mein Programm wird zwar korrekt assembliert, bei der Umwandlung
12450          mit P2BIN oder P2HEX erhalte ich aber nur eine leere Datei.}
12451\item[A:]{Dann haben Sie wahrscheinlich das Adre"s\-fil\-ter nicht korrekt
12452          eingestellt.  De\-faul\-tm"a"sig ist der Filter abgeschaltet, d.h.
12453          alle Daten werden "ubernommen, wenn ein manuell eingestellter
12454          Bereichsfilter nicht zu den benutzten Adressen pa"st, kann man
12455          mit der '-r' Option aber (versehentlich) auch leere Dateien
12456          erzeugen.}
12457\vspace{0.3cm}
12458\item[F:]{Ich bekomme unter Unix bei der Benutzung von P2BIN oder P2HEX
12459          das Dollarzeichen nicht eingegeben.  Die automatische
12460          Bereichsfestlegung funktioniert nicht, stattdessen gibt es
12461          eigenartige Fehlermeldungen.}
12462\item[A:]{Unix-Shells benutzen das Dollarzeichen zur Expansion von
12463          Shell-Variablen.  Wollen Sie ein Dollarzeichen an eine Anwendung
12464          durchreichen, stellen Sie einen Backslash (\verb!\!) voran.
12465          Im Falle der Adre"sangabe bei P2BIN und P2HEX darf aber auch
12466          \tty{0x} anstelle des Dollarzeichens benutzt werden, was dieses
12467          Problem von vornherein vermeidet.}
12468\vspace{0.3cm}
12469\item[F:]{Ich nutze AS auf einem Linux-System, das Ladeprogramm f"ur
12470          mein Zielsystem l"auft aber auf einem Windows-Rechner.  Um das
12471          zu vereinfachen, greifen beide System auf das gleiche
12472          Netzwerklaufwerk zu.  Leider will die Windows-Seite aber die
12473          von der Linux-Seite erzeugten Hex-Dateien nicht lesen :-(}
12474\item[A:]{Windows- und Linux-Systeme benutzen ein etwas abweichendes
12475          Format f"ur Textdateien, unter die auch Hex-Dateien fallen.
12476          W"ahrend Windows jede Zeile mit den Zeichen CR (Carriage Return)
12477          und LF (Linefeed) abschlie"st, verwendet Linux nur ein Linefeed.
12478          Es h"angt nun von der ''Gutm"utigkeit'' eines Windows-Programmes
12479          ab, ob es die Dateien im Linux-Format akzeptiert.  Falls nicht,
12480          kann man die Dateien anstelle "uber ein Netzwerklaufwerk "uber
12481          FTP im ASCII-Modus "ubertragen, oder man konvertiert die Dateien
12482          unter ins Windows-Format.  Das Programm {\em unix2dos} kann dazu
12483          z.B. verwendet werden, oder unter Linux ein kleines Script:
12484          \begin{verbatim}
12485          awk '{print $0"\r"}' test.hex >test_cr.hex
12486          \end{verbatim}}
12487\end{description}
12488
12489%%===========================================================================
12490
12491\cleardoublepage
12492\chapter{Pseudobefehle gesammelt}
12493
12494In diesem Anhang finden sich noch einmal als schnelle Referenz alle
12495von AS zur Verf"ugung gestellten Pseudobefehle.  Die Liste ist in zwei
12496Teile gegliedert: Im ersten Teil finden sich Befehle, die unabh"angig
12497vom eingestellten Zielprozessor vorhanden sind, danach folgen f"ur
12498jede Prozessorfamilie die zus"atzlich vorhandenen Befehle:
12499
12500\subsubsection{Immer vorhandene Befehle}
12501\input{../doc_COM/pscomm.tex}
12502Zus"atzlich existieren:
12503\begin{itemize}
12504\item{\tty{SET} bzw. \tty{EVAL}, falls \tty{SET} bereits ein Prozessorbefehl
12505      ist.}
12506\item{\tty{SHIFT} bzw. \tty{SHFT}, falls \tty{SHIFT} bereits ein Prozessorbefehl
12507      ist.}
12508\end{itemize}
12509
12510\input{../doc_COM/pscpu.tex}
12511
12512%%===========================================================================
12513
12514\cleardoublepage
12515\chapter{Vordefinierte Symbole}\label{AppInternSyms}
12516
12517\begin{table*}[ht]
12518\begin{center}\begin{tabular}{|l|l|l|l|}
12519\hline
12520Name             &  Datentyp   & Definition & Bedeutung \\
12521\hline\hline
12522\tty{ARCHITECTURE} & String    & vordef.    & Zielplattform, f"ur die AS \\
12523                 &             &            & "ubersetzt wurde, in der Form \\
12524                 &             &            & Prozesor-Hersteller-Betriebs- \\
12525                 &             &            & system \\
12526\hline
12527\tty{BIGENDIAN}  &  Boolean    & normal     & Konstantenablage mit MSB \\
12528                 &             &            & first ? \\
12529\hline
12530\tty{CASESENSITIVE} & Boolean  & normal     & Unterscheidung von Gro"s- \\
12531                 &             &            & und Kleinbuchstaben in \\
12532                 &             &            & Symbolnamen ? \\
12533\hline
12534\tty{CONSTPI}    &  Gleitkomma & normal     & Kreiszahl Pi (3.1415.....) \\
12535\hline
12536\tty{DATE}       &  String     & vordef.    & Datum des Beginns der  \\
12537                 &             &            & Assemblierung (1.Pass) \\
12538\hline
12539\tty{FALSE}      &  Boolean    & vordef.    & 0 = logisch ,,falsch'' \\
12540\hline
12541\tty{HASFPU}     &  Boolean    & dynam.(0)  & Koprozessor-Befehle \\
12542                 &             &            & freigeschaltet ? \\
12543\hline
12544\tty{HASPMMU}    &  Boolean    & dynam.(0)  & MMU-Befehle frei- \\
12545                 &             &            & geschaltet ? \\
12546\hline
12547\tty{INEXTMODE}  &  Boolean    & dynam.(0)  & XM-Flag f"ur 4 Gbyte \\
12548                 &             &            & Adre"sraum gesetzt ? \\
12549\hline
12550\tty{INLWORDMODE} & Boolean    & dynam.(0)  & LW-Flag f"ur 32-Bit-Befehle \\
12551                 &             &            & gesetzt ? \\
12552\hline
12553\tty{INMAXMODE}  &  Boolean    & dynam.(0)  & Prozessor im Maximum- \\
12554                 &             &            & Modus ? \\
12555\hline
12556\tty{INSUPMODE}  &  Boolean    & dynam.(0)  & Prozessor im Supervisor- \\
12557                 &             &            & Modus ? \\
12558\hline
12559\tty{INSRCMODE}  &  Boolean    & dynam.(0)  & Prozessor im Quellmodus ? \\
12560\hline
12561\tty{FULLPMMU}   &  Boolean    & dynam.(0/1) & voller PMMU-Befehlssatz ? \\
12562\hline
12563\tty{LISTON}     &  Boolean    & dynam.(1)  & Listing freigeschaltet ? \\
12564\hline
12565\tty{MACEXP}     &  Boolean    & dynam.(1)  & Expansion von Makrokon- \\
12566                 &             &            & strukten im Listing \\
12567                 &             &            & freigeschaltet ? \\
12568\hline
12569\end{tabular}\end{center}
12570\caption{Vordefinierte Symbole - Teil 1\label{TabInternSyms1}}
12571\end{table*}
12572
12573\begin{table*}
12574\begin{center}\begin{tabular}{|l|l|l|l|}
12575\hline
12576Name             &  Datentyp   & Definition & Bedeutung \\
12577\hline\hline
12578\tty{MOMCPU}     &  Integer    & dynam.     & Nummer der momentan \\
12579                 &             & (68008)    & gesetzten Ziel-CPU \\
12580\hline
12581\tty{MOMCPUNAME} &  String     & dynam.     & Name der momentan \\
12582                 &             & (68008)    & gesetzten Ziel-CPU \\
12583\hline
12584\tty{MOMFILE}    &  String     & Spezial    & augenblickliche Quelldatei \\
12585                 &             &            & (schlie"st Includes ein) \\
12586\hline
12587\tty{MOMLINE}    &  Integer    & Spezial    & aktuelle Zeilennummer in \\
12588                 &             &            & der Quelldatei \\
12589\hline
12590\tty{MOMPASS}    &  Integer    & Spezial    & Nummer des laufenden \\
12591                 &             &            & Durchgangs \\
12592\hline
12593\tty{MOMSECTION} &  String     & Spezial    & Name der aktuellen Sektion \\
12594                 &             &            & oder Leerstring, fall au"ser- \\
12595                 &             &            & halb aller Sektionen \\
12596\hline
12597\tty{MOMSEGMENT} &  String     & Spezial    & Name des mit \tty{SEGMENT} ein- \\
12598                 &             &            & gestellten Adre"sraumes \\
12599\hline
12600\tty{NESTMAX}    &  Integer    & dynam.(256)& maximale Verschachtelungs- \\
12601                 &             &            & tiefe f"ur Makros \\
12602\hline
12603\tty{PADDING}    &  Boolean    & dynam.(1)  & Auff"ullen von Bytefeldern \\
12604                 &             &            & auf ganze Anzahl ? \\
12605\hline
12606\tty{RELAXED}    &  Boolean    & dynam.(0)  & Schreibweise von Integer-Kon- \\
12607                 &             &            & stanten in beliebiger Syntax \\
12608                 &             &            & erlaubt ? \\
12609\hline
12610\tty{PC}         &  Integer    & Spezial    & mom. Programmz"ahler \\
12611                 &             &            & (Thomson) \\
12612\hline
12613\tty{TIME}       &  String     & vordef.    & Zeit des Beginns der Assem- \\
12614                 &             &            & blierung (1. Pass) \\
12615\hline
12616\tty{TRUE}       &  Integer    & vordef.    & 1 = logisch ,,wahr'' \\
12617\hline
12618\tty{VERSION}    &  Integer    & vordef.    & Version von AS in BCD-Kodie- \\
12619                 &             &            & rung, z.B. 1331 hex f"ur \\
12620                 &             &            & Version 1.33p1 \\
12621\hline
12622\tty{WRAPMODE}   &  Integer    & vordef.    & verk"urzter Programmz"ahler \\
12623                 &             &            & angenommen? \\
12624\hline
12625\verb!*!         &  Integer    & Spezial    & mom. Programmz"ahler (Motorola, \\
12626                 &             &            & Rockwell, Microchip, Hitachi) \\
12627\hline
12628\tty{\$}         &  Integer    & Spezial    & mom. Programmz"ahler (Intel, \\
12629                 &             &            & Zilog, Texas, Toshiba, NEC, \\
12630                 &             &            & Siemens, AMD) \\
12631\hline
12632\end{tabular}\end{center}
12633\caption{Vordefinierte Symbole - Teil 2\label{TabInternSyms2}}
12634\end{table*}
12635\par
12636Boolean-Symbole sind eigentlich normale normale Integer-Symbole, mit
12637dem Unterschied, da"s ihnen von AS nur zwei verschiedene Werte (0 oder
126381, entsprechend FALSE oder TRUE) zugewiesen werden.  Spezialsymbole
12639werden von AS nicht in der Symboltabelle abgelegt, sondern aus
12640Geschwindigkeitsgr"unden direkt im Parser abgefragt.  Sie tauchen daher
12641auch nicht in der Symboltabelle des Listings auf.  W"ahrend vordefinierte
12642Symbole nur einmal am Anfang eines Passes besetzt werden, k"onnen sich
12643die Werte dynamischer Symbole w"ahrend der Assemblierung mehrfach "andern,
12644da sie mit anderen Befehlen vorgenommene Einstellungen widerspiegeln.
12645\par
12646Die hier aufgelistete Schreibweise ist diejenige, mit der man die
12647Symbole auch im case-sensitiven Modus erreicht.
12648\par
12649Die hier aufgef"uhrten Namen sollte man f"ur eigene Symbole meiden;
12650entweder kann man sie zwar definieren, aber nicht darauf zugreifen
12651(bei Spezialsymbolen), oder man erh"alt eine Fehlermeldung wegen eines
12652doppelt definierten Symboles.  Im gemeinsten Fall f"uhrt die Neubelegung
12653durch AS zu Beginn eines Passes zu einem Phasenfehler und einer
12654Endlosschleife...
12655
12656
12657%%===========================================================================
12658
12659\cleardoublepage
12660\chapter{Mitgelieferte Includes}
12661
12662Der Distribution von AS liegen eine Reihe von Include-Dateien bei.  Neben
12663Includes, die sich nur auf eine Prozessorfamilie beziehen (und deren
12664Funktion sich demjenigen unmittelbar erschlie"st, der mit dieser Familie
12665arbeitet), existieren aber auch ein paar Dateien, die prozessorunabh"angig
12666sind und die eine Reihe n"utzlicher Funktionen implementieren.  Die
12667definierten Funktionen sollen hier kurz beschrieben werden:
12668
12669\section{BITFUNCS.INC}
12670
12671Diese Datei definiert eine Reihe bitorientierter Operationen, wie man sie
12672bei anderen Assemblern vielleicht fest eingebaut sind.  Bei AS werden sie
12673jedoch mit Hilfe benutzerdefinierter Funktionen implementiert:
12674
12675\begin{itemize}
12676\item{{\em mask(start,bits)} liefert einen Integer, in dem ab Stelle {\em
12677      start} {\em bits} Bits gesetzt sind;}
12678\item{{\em invmask(start,bits)} liefert das Einerkomplement zu {\em mask()};}
12679\item{{\em cutout(x,start,bits)} liefert ausmaskierte {\em bits} Bits ab
12680      Stelle {\em start} aus {\em x}, ohne sie auf Stelle 0 zu
12681      verschieben;}
12682\item{{\em hi(x)} liefert das zweitniedrigste Byte (Bit 8..15) aus {\em
12683      x};}
12684\item{{\em lo(x)} liefert das niederwertigste Byte (Bit 0..7) aus {\em
12685      x};}
12686\item{{\em hiword(x)} liefert das zweitniedrigste Wort (Bit 16..31) aus
12687      {\em x};}
12688\item{{\em loword(x)} liefert das niederwertigste Wort (Bit 0..15) aus
12689      {\em x};}
12690\item{{\em odd(x)} liefert TRUE, falls {\em x} ungerade ist;}
12691\item{{\em even(x)} liefert TRUE, falls {\em x} gerade ist;}
12692\item{{\em getbit(x,n)} extrahiert das Bit {\em n} aus {\em x} und liefert
12693      es als 0 oder 1;}
12694\item{{\em shln(x,size,n)} schiebt ein Wort {\em x} der L"ange {\em size}
12695      Bits um {\em n} Stellen nach links;}
12696\item{{\em shrn(x,size,n)} schiebt ein Wort {\em x} der L"ange {\em size}
12697      Bits um {\em n} Stellen nach rechts;}
12698\item{{\em rotln(x,size,n)} rotiert die untersten {\em size} Bits eines
12699      Integers {\em x} um {\em n} Stellen nach links;}
12700\item{{\em rotrn(x,size,n)} rotiert die untersten {\em size} Bits eines
12701      Integers {\em x} um {\em n} Stellen nach rechts;}
12702\end{itemize}
12703
12704\section{CTYPE.INC}
12705
12706Dieser Include ist das Pendant zu dem bei C vorhandenen Header {\tt
12707ctype.h}, der Makros zur Klassifizierung von Zeichen anbietet.  Alle
12708Funktionen liefern entweder TRUE oder FALSE:
12709
12710\begin{itemize}
12711\item{{\em isdigit(ch)} ist TRUE, falls {\em ch} eine Ziffer (0..9)
12712      ist;}
12713\item{{\em isxdigit(ch)} ist TRUE, falls {\em ch} eine g"ultige
12714      Hexadezimal-Ziffer (0..9, A..F, a..f) ist;}
12715\item{{\em isascii(ch)} ist TRUE, falls {\em ch} sich im Bereich
12716      normaler ASCII-Zeichen ohne gesetztes Bit 7 bewegt;}
12717\item{{\em isupper(ch)} ist TRUE, falls {\em ch} ein Gro"sbuchstabe
12718      ist (Sonderzeichen ausgenommen);}
12719\item{{\em islower(ch)} ist TRUE, falls {\em ch} ein Kleinbuchstabe
12720      ist (Sonderzeichen ausgenommen);}
12721\item{{\em isalpha(ch)} ist TRUE, falls {\em ch} ein Buchstabe ist
12722      (Sonderzeichen ausgenommen);}
12723\item{{\em isalnum(ch)} ist TRUE, falls {\em ch} ein Buchstabe oder
12724      eine Ziffer ist);}
12725\item{{\em isspace(ch)} ist TRUE, falls {\em ch} ein 'Leerzeichen'
12726      (Space, Formfeed, Zeilenvorschub, Wagenr"ucklauf, Tabulator)
12727      ist);}
12728\item{{\em isprint(ch)} ist TRUE, falls {\em ch} ein druckbares
12729      Zeichen ist (also kein Steuerzeichen bis Code 31);}
12730\item{{\em iscntrl(ch)} ist das Gegenteil zu {\em isprint()};}
12731\item{{\em isgraph(ch)} ist TRUE, falls {\em ch} ein druckbares
12732      und {\it sichtbares} Zeichen ist;}
12733\item{{\em ispunct(ch)} ist TRUE, falls {\em ch} ein druckbares
12734      Sonderzeichen ist (d.h. weder Space, Buchstabe noch Ziffer);}
12735\end{itemize}
12736
12737%%===========================================================================
12738
12739\cleardoublepage
12740\chapter{Danksagungen}
12741
12742\begin{quote}{\it
12743''If I have seen farther than other men, \\
12744it is because I stood on the shoulders of giants.'' \\
12745\hspace{2cm} --Sir Isaac Newton}
12746\end{quote}
12747\begin{quote}{\it
12748''If I haven't seen farther than other men, \\
12749it is because I stood in the footsteps of giants.'' \\
12750\hspace{2cm} --unknown}
12751\end{quote}
12752\par
12753Wenn man sich entschlie"st, ein solches Kapitel neu zu schreiben,
12754nachdem es eigentlich schon zwei Jahre veraltet ist, l"auft man
12755automatisch Gefahr, da"s dabei der eine oder andere gute Geist, der
12756etwas zum bisherigen Gelingen dieses Projektes beigetragen hat,
12757vergessen wird.  Der
12758allererste  Dank geb"uhrt daher allen Personen, die ich in der
12759folgenden Aufz"ahlung unfreiwillig unterschlagen habe!
12760\par
12761AS als Universalassembler, wie er jetzt besteht, ist auf Anregung von
12762Bernhard (C.) Zschocke entstanden, der einen ,,studentenfreundlichen'',
12763d.h. kostenlosen 8051-Assembler f"ur sein Mikroprozessorpraktikum
12764brauchte und mich dazu bewegt hat, einen bereits bestehenden
1276568000-Assembler zu erweitern.  Von dortan nahm die Sache ihren Lauf...
12766Das Mikroprozessorpraktikum an der RWTH Aachen hat auch immer die
12767eifrigsten Nutzer der neuesten AS-Features (und damit Bug-Sucher)
12768gestellt und damit einiges zur jetzigen Qualit"at von AS beigetragen.
12769\par
12770Das Internet und FTP haben sich als gro"se Hilfe bei der Meldung von
12771Bugs und der Verbreitung von AS erwiesen.  Ein Dank geht daher an
12772die FTP-Administratoren (Bernd Casimir in Stuttgart, Norbert Breidohr
12773in Aachen und J"urgen Mei"sburger in J"ulich).  Insbesondere letzterer
12774hat sich sehr engagiert, um eine praxisnahe L"osung im ZAM zu
12775finden.
12776\par
12777Ach ja, wo wir schon im ZAM sind: Wolfgang E. Nagel hat zwar nichts
12778direkt mit AS zu tun, immerhin ist er aber mein Chef und wirft
12779st"andig vier Augen auf das, was ich tue.  Bei AS scheint zumindest
12780ein lachendes dabei zu sein...
12781\par
12782Ohne Datenb"ucher und Unterlagen zu Prozessoren ist ein Programm wie
12783AS nicht zu machen.  Ich habe von einer enormen Anzahl von Leuten
12784Informationen bekommen, die von einem kleinen Tip bis zu ganzen
12785Datenb"uchern reichen.  Hier eine Aufz"ahlung (wie oben gesagt, ohne
12786Garantie auf Vollst"andigkeit!):
12787\par
12788Ernst Ahlers, Charles Altmann, Marco Awater, Len Bayles, Andreas Bolsch,
12789Rolf Buchholz, Bernd Casimir, Nils Eilers, Gunther Ewald, Stephan Hruschka, Peter
12790Kliegelh"ofer, Ulf Meinke, Matthias Paul, Norbert Rosch, Steffen Schmid,
12791Leonhard Schneider, Ernst Schwab, Michael Schwingen, Oliver Sellke,
12792Christian Stelter, Patrik Str"omdahl, Oliver Thamm, Thorsten Thiele,
12793Andreas Wassatsch, John Weinrich.
12794\par
12795...und ein geh"assiger Dank an Rolf-Dieter-Klein und Tobias Thiel, die
12796mit ihren ASM68K demonstrierten, wie man es \bb{nicht} machen sollte und
12797mich damit indirekt dazu angeregt haben, etwas besseres zu schreiben!
12798\par
12799So ganz allein habe ich AS nicht verzapft.  Die DOS-Version von AS enthielt
12800die OverXMS-Routinen von Wilbert van Leijen, um die Overlay-Module ins
12801Extended Memory verlagern zu k"onnen.  Eine wirklich feine Sache,
12802einfach und problemlos anzuwenden!
12803\par
12804Die TMS320C2x/5x-Codegeneratoren sowie die Datei \tty{STDDEF2x.INC}
12805stammen von Thomas Sailer, ETH Z"urich.  Erstaunlich, an einem Wochenende
12806hat er es geschafft, durch meinen Code durchzusteigen und den neuen
12807Generator zu implementieren.  Entweder waren das reichliche Nachtschichten
12808oder ich werde langsam alt...gleiches Lob geb"uhrt Haruo Asano f"ur den
12809MN1610/MN1613-Codegenerator.
12810
12811%%===========================================================================
12812
12813\cleardoublepage
12814\chapter{"Anderungen seit Version 1.3}
12815
12816\begin{itemize}
12817\item{Version 1.31:
12818      \begin{itemize}
12819      \item{zus"atzlicher MCS-51-Prozessortyp 80515.  Die Nummer wird
12820            wiederum nur vom Assembler verwaltet.  Die Datei STDDEF51.INC
12821            wurde um die dazugeh"origen SFRs erweitert. \bb{ACHTUNG!}
12822            Einige 80515-SFRs haben sich adre"sm"a"sig verschoben!}
12823      \item{zus"atzlich Prozessor Z80 unterst"utzt;}
12824      \item{schnellerer 680x0-Codegenerator.}
12825      \end{itemize}}
12826\item{Version 1.32:
12827      \begin{itemize}
12828      \item{Schreibweise von Zeropageadressen f"ur 65xx nicht mehr als
12829            Adr.z, sondern wie beim 68xx als $<$Adr;}
12830      \item{unterst"utzt die Prozessoren 6800, 6805, 6301 und 6811;}
12831      \item{der 8051-Teil versteht jetzt auch \tty{DJNZ}, \tty{PUSH} und
12832            \tty{POP} (sorry);}
12833      \item{im Listing werden neben den Symbolen jetzt auch die definierten
12834            Makros aufgelistet;}
12835      \item{Befehle \tty{IFDEF}/\tty{IFNDEF} f"ur bedingte Assemblierung,
12836            mit denen sich die Existenz eines Symboles abfragen l"a"st;}
12837      \item{Befehle \tty{PHASE}/\tty{DEPHASE} zur Unterst"utzung von Code, der zur
12838            Laufzeit auf eine andere Adresse verschoben werden soll;}
12839      \item{Befehle \tty{WARNING}/\tty{ERROR}/\tty{FATAL}, um anwenderspezifische
12840            Fehlermeldungen ausgeben zu k"onnen;}
12841      \item{Die Datei STDDEF51.INC enth"alt zus"atzlich das Makro \tty{USING}
12842            zur einfacheren Handhabung der Registerb"anke der MCS-51er;}
12843      \item{Kommandozeilenoption \tty{u}, um Segmentbelegung anzuzeigen.}
12844      \end{itemize}}
12845\item{Version 1.33:
12846      \begin{itemize}
12847      \item{unterst"utzt den 6809;}
12848      \item{zus"atzlich Stringvariablen;}
12849      \item{Die Befehle \tty{TITLE}, \tty{PRTINIT}, \tty{PRTEXIT},
12850            \tty{ERROR}, \tty{WARNING} und \tty{FATAL} erwarten jetzt
12851	    einen Stringausdruck als Parameter, Konstanten
12852            m"ussen demzufolge nicht mehr in Hochkommas, sondern in
12853            G"ansef"u"schen eingeschlossen werden. Analoges gilt f"ur \tty{DB},
12854            \tty{DC.B} und \tty{BYT};}
12855      \item{Befehl \tty{ALIGN} zur Ausrichtung des Programmz"ahlers bei Intel-
12856            Prozessoren;}
12857      \item{Befehl \tty{LISTING}, um die Erzeugung eines Listings ein- und
12858            ausschalten zu k"onnen;}
12859      \item{Befehl \tty{CHARSET} zur Definition eigener Zeichens"atze.}
12860      \end{itemize}}
12861\item{Version 1.34:
12862      \begin{itemize}
12863      \item{Wenn im ersten Pass Fehler auftreten, wird gar kein zweiter
12864            Pass mehr durchgef"uhrt;}
12865      \item{neues vordefiniertes Symbol \tty{VERSION}, welches die Version von
12866            AS enth"alt;}
12867      \item{Befehl \tty{MESSAGE}, um Durchsagen und Meldungen programmgesteuert
12868            zu erzeugen;}
12869      \item{Formelparser "uber Stringkonstanten zug"anglich;}
12870      \item{Bei Fehler in Makroexpansionen wird zus"atzlich die laufende
12871            Zeile im Makro angezeigt;}
12872      \item{Funktion \tty{UPSTRING}, um einen String in Gro"sbuchstaben zu
12873            wandeln.}
12874      \end{itemize}}
12875\item{Version 1.35:
12876      \begin{itemize}
12877      \item{Funktion \tty{TOUPPER}, um ein einzelnes Zeichen in Gro"sbuchstaben
12878            zu wandeln;}
12879      \item{Befehl \tty{FUNCTION}, um eigene Funktionen definieren zu k"onnen;}
12880      \item{Kommandozeilenoption \tty{D}, um Symbole von au"sen definieren zu
12881            k"onnen;}
12882      \item{Fragt die Environment-Variable \tty{ASCMD} f"ur h"aufig gebrauchte
12883            Optionen ab;}
12884      \item{bei gesetzter \tty{u}-Option wird das Programm zus"atzlich auf doppelt
12885            belegte Speicherbereiche abgepr"uft;}
12886      \item{Kommandozeilenoption \tty{C}, um eine Querverweisliste zu erzeugen.}
12887      \end{itemize}}
12888\item{Version 1.36:
12889      \begin{itemize}
12890      \item{unterst"utzt zus"atzlich die Familien PIC 16C5x und
12891            PIC17C4x;}
12892      \item{im Listing wird zus"atzlich die Verschachtelungsebene bei
12893            Include-Dateien angezeigt;}
12894      \item{in der Querverweisliste wird zus"atzlich die Stelle angezeigt,
12895            an der ein Symbol definiert wurde;}
12896      \item{Kommandozeilenoption \tty{A}, um eine kompaktere Ablage der
12897            Symboltabelle zu erzwingen.}
12898      \end{itemize}}
12899\item{Version 1.37:
12900      \begin{itemize}
12901      \item{unterst"utzt zus"atzlich die Prozessoren 8086, 80186, V30,
12902            V35, 8087 und Z180;}
12903      \item{Befehle \tty{SAVE} und \tty{RESTORE} zur besseren Umschaltung
12904            von Flags;}
12905      \item{Operatoren zur logischen Verschiebung und Bitspiegelung;}
12906      \item{Kommandozeilenoptionen k"onnen mit einem Pluszeichen negiert
12907            werden;}
12908      \item{Filter \tty{AS2MSG} zur bequemen Arbeit mit AS unter Turbo-Pascal 7.0;}
12909      \item{\tty{ELSEIF} darf ein Argument zur Bildung von
12910            \tty{IF-THEN-ELSE}-Leitern haben;}
12911      \item{Zur bequemeren bedingten Assemblierung zus"atzlich ein
12912            \tty{CASE}-Konstrukt;}
12913      \item{Selbstdefinierte Funktionen d"urfen mehr als ein Argument haben;}
12914      \item{P2HEX kann nun auch Hexfiles f"ur 65er-Prozessoren erzeugen;}
12915      \item{BIND, P2HEX und P2BIN haben jetzt die gleichen
12916            Variationsm"oglichkeiten in der Kommandozeile wie AS;}
12917      \item{Schalter \tty{i} bei P2HEX, um 3 Varianten f"ur den Ende-Record
12918            einzustellen;}
12919      \item{Neue Funktionen \tty{ABS} und \tty{SGN};}
12920      \item{Neue Pseudovariablen \tty{MOMFILE} und \tty{MOMLINE};}
12921      \item{Ausgabem"oglichkeit erweiterter Fehlermeldungen;}
12922      \item{Befehle \tty{IFUSED} und \tty{IFNUSED}, um abzufragen, ob ein
12923            Symbol bisher benutzt wurde;}
12924      \item{Die Environment-Variablen \tty{ASCMD}, \tty{BINDCMD} usw. k"onnen auch
12925            einen Dateinamen enthalten, in dem f"ur die Optionen mehr
12926            Platz ist;}
12927      \item{P2HEX erzeugt nun die von Microchip vorgegebenen Hex-Formate
12928            (p4);}
12929      \item{mit der Seitenl"angenangabe 0 k"onnen automatische
12930            Seitenvorsch"ube im Listing vollst"andig unterdr"uckt werden
12931            (p4);}
12932      \item{neue Kommandozeilenoption \tty{P}, um die Ausgabe des Makroprozessors
12933            in eine Datei zu schreiben (p4);}
12934      \item{in der Kommandozeile definierte Symbole d"urfen nun auch mit
12935            einem frei w"ahlbaren Wert belegt werden (p5).}
12936      \end{itemize}}
12937\item{Version 1.38:
12938      \begin{itemize}
12939      \item{Umstellung auf Mehrpass-Betrieb.  Damit kann AS auch bei
12940            Vorw"artsreferenzen immer den optimalen Code erzeugen;}
12941      \item{Der 8051-Teil kennt nun auch die Befehle \tty{JMP} und \tty{CALL};}
12942      \item{unterst"utzt zus"atzlich die Toshiba TLCS-900-Reihe (p1);}
12943      \item{Befehl \tty{ASSUME}, um dem Assembler die Belegung der
12944            Segmentregister des 8086 mitzuteilen (p2);}
12945      \item{unterst"utzt zus"atzlich die ST6-Reihe von SGS-Thomson (p2);}
12946      \item{..sowie die 3201x-Signalprozessoren von Texas Instruments (p2);}
12947      \item{Option \tty{F} bei P2HEX, um die automatische Formatwahl "ubersteuern
12948            zu k"onnen (p2);}
12949      \item{P2BIN kann nun auch durch Angabe von Dollarzeichen Anfang und
12950            Ende des Adre"sfensters selbstst"andig festlegen (p2);}
12951      \item{Der 8048-Codegenerator kennt nun auch die 8041/42-
12952            Befehlserweiterungen(p2);}
12953      \item{unterst"utzt zus"atzlich die Zilog Z8-Mikrokontroller(p3).}
12954      \end{itemize}}
12955\item{Version 1.39:
12956      \begin{itemize}
12957      \item{Definitionsm"oglichkeit von Sektionen und lokalen Labels;}
12958      \item{Kommandozeilenschalter \tty{h}, um Hexadezimalzahlenausgabe mit
12959            Kleinbuchstaben zu erzwingen;}
12960      \item{Variable \tty{MOMPASS}, um die Nummer des augenblicklichen Durchganges
12961            abfragen zu k"onnen;}
12962      \item{Kommandozeilenschalter \tty{t}, um einzelne Teile des Assemblerlistings
12963            ausblenden zu k"onnen;}
12964      \item{kennt zus"atzlich die L-Variante der TLCS-900-Reihe von Toshiba
12965            und die MELPS-7700-Reihe von Mitsubishi (p1);}
12966      \item{P2HEX akzeptiert nun auch Dollarzeichen f"ur Start-und Endadresse
12967            (p2);}
12968      \item{unterst"utzt zus"atzlich die TLCS90-Familie von Toshiba (p2);}
12969      \item{P2HEX kann Daten zus"atzlich im Tektronix- und 16-Bit
12970            Intel-Hex-Format ausgeben (p2);}
12971      \item{bei Adre"s"uberschreitungen gibt P2HEX Warnungen aus (p2);}
12972      \item{Include-Datei STDDEF96.INC mit Adre"sdefinitionen f"ur die
12973            TLCS-900-Reihe (p3);}
12974      \item{Befehl \tty{READ}, um Werte w"ahrend der Assemblierung interaktiv
12975            einlesen zu k"onnen (p3);}
12976      \item{Fehlermeldungen werden nicht mehr einfach auf die
12977            Standardausgabe, sondern auf den von DOS daf"ur vorgesehenen
12978            Kanal (STDERR) geschrieben (p3);}
12979      \item{Der beim 6811-Teil fehlende \tty{STOP}-Befehl ist nun da (scusi,p3);}
12980      \item{unterst"utzt zus"atzlich die $\mu$PD78(C)1x-Familie von NEC (p3);}
12981      \item{unterst"utzt zus"atzlich den PIC16C84 von Microchip (p3);}
12982      \item{Kommandozeilenschalter \tty{E}, um die Fehlermeldungen in eine Datei
12983            umleiten zu k"onnen (p3);}
12984      \item{Die Unklarheiten im 78(C)1x-Teil sind beseitigt (p4);}
12985      \item{neben dem MELPS-7700 ist nun auch das ,,Vorbild'' 65816
12986            vorhanden (p4);}
12987      \item{Die ST6-Pseudoanweisung \tty{ROMWIN} wurde entfernt und
12988            mit in den \tty{ASSUME}-Befehl eingegliedert (p4);}
12989      \item{unterst"utzt zus"atzlich den 6804 von SGS-Thomson (p4);}
12990      \item{durch die \tty{NOEXPORT}-Option in der Makrodefinition
12991            kann nun f"ur jedes Makro einzeln festgelegt werden, ob es
12992            in der MAC-Datei erscheinen soll oder nicht (p4);}
12993      \item{Die Bedeutung von \tty{MACEXP} f"ur Expansionen von Makros hat
12994            sich wegen der zus"atzlichen \tty{NOEXPAND}-Option in der
12995            Makrodefinition leicht ge"andert (p4);}
12996      \item{Durch die \tty{GLOBAL}-Option in der Makrodefinition k"onnen nun
12997            zus"atzlich Makros definiert werden, die durch ihren
12998            Sektionsnamen eindeutig gekennzeichnet sind (p4).}
12999      \end{itemize}}
13000\item{Version 1.40:
13001      \begin{itemize}
13002      \item{unterst"utzt zus"atzlich den DSP56000 von Motorola;}
13003      \item{P2BIN kann nun auch das untere bzw. obere Wort aus
13004            32-Bit-W"ortern abtrennen;}
13005      \item{unterst"utzt zus"atzlich die TLCS-870- und TLCS-47-Familie
13006            von Toshiba(p1);}
13007      \item{mit einem vorangestelltem ! kann man durch Makros
13008            ,,verdeckte'' Maschinenbefehle wieder erreichen(p1);}
13009      \item{mit der \tty{GLOBAL}-Anweisung lassen sich Symbolnamen
13010            nun auch qualifiziert exportieren(p1);}
13011      \item{mit der \tty{r}-Option kann man sich nun eine Liste der
13012            Stellen erzeugen lassen, die zus"atzliche Durchl"aufe
13013            erzwangen(p1);}
13014      \item{bei der \tty{E}-Option kann nun die Dateiangabe weggelassen werden,
13015            so da"s ein passender Default gew"ahlt wird(p1);}
13016      \item{mit der \tty{t}-Option kann nun die Zeilennumerierung im Listing
13017            abgeschaltet werden(p1);}
13018      \item{Escapesequenzen sind nun auch in in ASCII geschriebenen
13019            Integerkonstanten zul"assig(p1);}
13020      \item{Mit dem Pseudobefehl \tty{PADDING} kann das Einf"ugen
13021            von F"ullbytes im 680x0-Modus ein- und ausgeschaltet
13022            werden (p2);}
13023      \item{\tty{ALIGN} ist nun f"ur alle Zielplattformen erlaubt (p2);}
13024      \item{kennt zus"atzlich die PIC16C64-SFRs (p2);}
13025      \item{unterst"utzt zus"atzlich den 8096 von Intel (p2);}
13026      \item{Bei \tty{DC} kann zus"atzlich ein Wiederholungsfaktor angegeben
13027            werden (r3);}
13028      \item{unterst"utzt zus"atzlich die TMS320C2x-Familie von Texas
13029            Instruments (Implementierung von Thomas Sailer, ETH Z"urich,
13030            r3); P2HEX ist auch entsprechend erweitert;}
13031      \item{statt \tty{EQU} darf nun auch einfach ein Gleichheitszeichen
13032            benutzt werden (r3);}
13033      \item{zur Definition von Aufz"ahlungen zus"atzlich ein
13034            \tty{ENUM}-Befehl (r3);}
13035      \item{\tty{END} hat jetzt auch eine Wirkung (r3);}
13036      \item{zus"atzliche Kommandozeilenoption \tty{n}, um zu Fehlermeldungen
13037            zus"atzlich die internen Fehlernummern zu erhalten (r3);}
13038      \item{unterst"utzt zus"atzlich die TLCS-9000er von Toshiba (r4)};
13039      \item{unterst"utzt zus"atzlich die TMS370xxx-Reihe von Texas
13040            Instuments, wobei als neuer Pseudobefehl \tty{DBIT}
13041            hinzukam (r5);}
13042      \item{kennt zus"atzlich die DS80C320-SFRs (r5);}
13043      \item{der Makroprozessor kann nun auch Includes aus Makros
13044            heraus einbinden, wozu das Format von Fehlermeldungen
13045            aber leicht ge"andert werden mu"ste.  Falls Sie AS2MSG
13046            verwenden, ersetzen Sie es unbedingt durch die neue
13047            Version! (r5)}
13048      \item{unterst"utzt zus"atzlich den 80C166 von Siemens (r5);}
13049      \item{zus"atzlich eine \tty{VAL}-Funktion, um Stringausdr"ucke auswerten
13050            zu k"onnen (r5);}
13051      \item{Mithilfe von in geschweiften Klammern eingeschlossenen
13052            Stringvariablen lassen sich nun selber Symbole definieren
13053            (r5);}
13054      \item{kennt zus"atzlich die Eigenheiten des 80C167 von Siemens (r6);}
13055      \item{jetzt gibt es f"ur die MELPS740-Reihe auch die
13056            special-page-Adressierung (r6);}
13057      \item{mit eckigen Klammern kann man explizit Symbole aus einer
13058            bestimmten Sektion ansprechen.  Die Hilfskonstruktion mit dem
13059            Klammeraffen gibt es nicht mehr (r6)!}
13060      \item{kennt zus"atzlich die MELPS-4500-Reihe von Mitsubishi (r7);}
13061      \item{kennt zus"atzlich die H8/300 und H8/300H-Prozessoren von
13062            Hitachi (r7);}
13063      \item{die mit \tty{LISTING} und \tty{MACEXP} gemachten Einstellungen
13064            lassen sich nun auch wieder aus gleichnamigen Symbolen auslesen
13065            (r7);}
13066      \item{kennt zus"atzlich den TMS320C3x von Texas Instruments (r8);}
13067      \item{kennt zus"atzlich den SH7000 von Hitachi (r8);}
13068      \item{der Z80-Teil wurde um die Unterst"utzung des Z380 erweitert (r9);}
13069      \item{der 68K-Teil wurde um die feinen Unterschiede der
13070            683xx-Mikrokontroller erweitert (r9);}
13071      \item{ein Label mu"s nun nicht mehr in der ersten Spalte beginnen,
13072            wenn man es mit einem Doppelpunkt versieht (r9);}
13073      \item{kennt zus"atzlich die 75K0-Reihe von NEC (r9);}
13074      \item{mit dem neuen Kommandozeilenschalter o kann der Name
13075            der Code-Datei neu festgelegt werden (r9);}
13076      \item{der \verb!~~!-Operator ist in der Rangfolge auf einen
13077            sinnvolleren Platz gerutscht (r9);}
13078      \item{\tty{ASSUME} ber"ucksichtigt f"ur den 6809 jetzt auch das
13079            DPR-Register und seine Auswirkungen (pardon, r9);}
13080      \item{Der 6809-Teil kennt nun auch die versteckten
13081            Erweiterungen des 6309 (r9);}
13082      \item{Bin"arkonstanten k"onnen jetzt auch in C-artiger
13083            Notation geschrieben werden (r9).}
13084      \end{itemize}}
13085\item{Version 1.41:
13086      \begin{itemize}
13087      \item{"uber das Symbol \tty{MOMSEGMENT} kann der momentan
13088            gesetzte Adre"sraum abgefragt werden;}
13089      \item{anstelle von \tty{SET} bzw. \tty{EVAL} kann jetzt auch
13090            einfach \tty{:=} geschrieben werden;}
13091      \item{mit der neuen Kommandozeilenoption \tty{q} kann ein ,,stiller''
13092            Assemblerlauf erzwungen werden;}
13093      \item{das Schl"usselwort \tty{PARENT} zum Ansprechen der
13094            Vatersektion wurde um \tty{PARENT0...PARENT9} erweitert;}
13095      \item{der PowerPC-Teil wurde um die Mikrokontroller-Versionen
13096            MPC505 und PPC403 erweitert;}
13097      \item{mit \tty{SET} oder \tty{EQU} definierte Symbole k"onnen
13098            nun einem bestimmten Adre"sraum zugeordnet werden;}
13099      \item{mit \tty{SET} oder \tty{EQU} definierte Symbole k"onnen
13100            nun einem bestimmten Adre"sraum zugeordnet werden;}
13101      \item{durch das Setzen der Environment-Variablen \tty{USEANSI}
13102            kann die Verwendung von ANSI-Bildschirmsteuersequenzen
13103            an-und ausgeschaltet werden (r1);}
13104      \item{der SH7000-Teil kennt jetzt auch die SH7600-Befehlserweiterungen
13105            (und sollte jetzt korrekte Displacements berechnen...) (r1).}
13106      \item{im 65XX-Teil wird jetzt zwischen 65C02 und 65SC02 unterschieden
13107            (r1);}
13108      \item{neben der Variablen \tty{MOMCPU} gibt es jetzt auch den String
13109            \tty{MOMCPUNAME}, der den Prozessornamen im Volltext enth"alt (r1).}
13110      \item{P2HEX kennt jetzt auch die 32-Bit-Variante des
13111            Intel-Hex-Formates (r1);}
13112      \item{kennt jetzt auch die Einschr"ankungen des 87C750 (r2);}
13113      \item{die Nummern f"ur fatale Fehlermeldungen wurden auf den Bereich
13114            ab 10000 verschoben, um Platz f"ur normale Fehlermeldungen zu
13115	    schaffen (r2);}
13116      \item{unbenutzte Symbole werden in der Symboltabelle jetzt mit einem
13117            Stern gekennzeichnet (r2);}
13118      \item{unterst"utzt zus"atzlich die 29K-Familie von AMD (r2);}
13119      \item{unterst"utzt zus"atzlich die M16-Familie von Mitsubishi (r2);}
13120      \item{unterst"utzt zus"atzlich die H8/500-Familie von Hitachi (r3);}
13121      \item{die Anzahl von Datenbytes, die P2HEX pro Zeile ausgibt, ist
13122            jetzt variierbar (r3);}
13123      \item{der Pass, ab dem durch die \tty{-r}-Option erzeugte Warnungen
13124            ausgegeben werden, ist einstellbar (r3);}
13125      \item{der Makroprozessor kennt jetzt ein \tty{WHILE}-Statement,
13126            mit dem ein Code-St"uck eine variable Anzahl wiederholt werden
13127	    kann (r3);}
13128      \item{der \tty{PAGE}-Befehl erlaubt es nun auch, die Breite des
13129            Ausgabemediums f"urs Listing anzugeben (r3);}
13130      \item{Um neue Pseudo-Prozessortypen einf"uhren zu k"onnen, lassen
13131            sich jetzt CPU-Aliasse definieren (r3);}
13132      \item{unterst"utzt zus"atzlich die MCS/251-Familie von Intel (r3);}
13133      \item{bei eingeschalteter Querverweisliste wird bei doppelt
13134            definierten Symbolen die Stelle der ersten Definition
13135	    angezeigt (r3);}
13136      \item{unterst"utzt zus"atzlich die TMS320C5x-Familie von Texas
13137            Instruments (Implementierung von Thomas Sailer, ETH Z"urich,
13138            r3);}
13139      \item{die OS/2-Version sollte jetzt auch mit langen Dateinamen
13140            klarkommen.  Wenn man nicht jeden Mist selber kontrolliert...
13141	    (r3)}
13142      \item{"uber den Befehl \tty{BIGENDIAN} kann im MCS-51/251-Modus
13143            jetzt gew"ahlt werden, ob die Ablage von Konstanten im Big-
13144            oder Little-Endian-Format erfolgen soll (r3);}
13145      \item{es wird beim 680x0 jetzt zwischen dem vollen und eingeschr"ankten
13146            MMU-Befehlssatz unterschieden; eine manuelle Umschaltung ist mit dem
13147            \tty{FULLPMMU}-Befehl m"oglich (r3);}
13148      \item{"uber die neue Kommandozeilenoption \tty{I} kann eine Liste
13149            aller eingezogenen Include-Files mit ihrer Verschachtelung
13150            ausgegeben werden (r3);}
13151      \item{Beim \tty{END}-Statement kann jetzt zus"atzlich ein
13152            Einsprungpunkt f"ur das Programm angegeben werden (r3).}
13153      \item{unterst"utzt zus"atzlich die 68HC16-Familie von Motorola (r3);}
13154      \item{P2HEX und P2BIN erlauben es jetzt, den Inhalt einer Code-Datei
13155            adre"sm"a"sig zu verschieben (r4);}
13156      \item{einem \tty{SHARED}-Befehl anh"angende Kommentare werden jetzt
13157            in die Share-Datei mit "ubertragen (r4);}
13158      \item{unterst"utzt zus"atzlich die 68HC12-Familie von Motorola (r4);}
13159      \item{unterst"utzt zus"atzlich die XA-Familie von Philips (r4);}
13160      \item{unterst"utzt zus"atzlich die 68HC08-Familie von Motorola (r4);}
13161      \item{unterst"utzt zus"atzlich die AVR-Familie von Atmel (r4);}
13162      \item{aus Kompatibilit"at zum AS11 von Motorola existieren zus"atzlich
13163            die Befehle \tty{FCB}, \tty{FDB}, \tty{FCC} und \tty{RMB} (r5);}
13164      \item{unterst"utzt zus"atzlich den M16C von Mitsubishi (r5);}
13165      \item{unterst"utzt zus"atzlich den COP8 von National Semiconductor
13166            (r5);}
13167      \item{zwei neue Befehle zur bedingten Assemblierung: \tty{IFB} und
13168            \tty{IFNB} (r5);}
13169      \item{Mit dem \tty{EXITM}-Befehl ist es nun m"oglich, eine
13170            Makroexpansion vorzeitig abzubrechen (r5);}
13171      \item{unterst"utzt zus"atzlich den MSP430 von Texas Instruments
13172            (r5);}
13173      \item{\tty{LISTING} kennt zus"atzlich die Varianten
13174            \tty{NOSKIPPED} und \tty{PURECODE}, um nicht assemblierten
13175            Code aus dem Listing auszublenden (r5);}
13176      \item{unterst"utzt zus"atzlich die 78K0-Familie von NEC (r5);}
13177      \item{BIGENDIAN ist jetzt auch im PowerPC-Modus verf"ugbar (r5);}
13178      \item{zus"atzlich ein \tty{BINCLUDE}-Befehl, um Bin"ardaten
13179            einbinden zu k"onnen (r5);}
13180      \item{zus"atzliche TOLOWER- und LOWSTRING-Funktionen, um
13181                 Gro"s- in Kleinbuchstaben umzuwandeln (r5);}
13182      \item{es ist jetzt m"oglich, auch in anderen Segmenten als
13183            CODE Daten abzulegen.  Das Dateiformat wurde entsprechend
13184            erweitert (r5);}
13185      \item{der \tty{DS}-Befehl, mit dem man Speicherbereiche reservieren
13186            kann, ist jetzt auch im Intel-Modus zul"assig (r5);}
13187      \item{Mit der Kommandozeilenoption \tty{U} ist es jetzt
13188            m"oglich, AS in einen case-sensitiven Modus umzuschalten,
13189            in dem Namen von Symbolen, selbstdefinierten Funktionen,
13190            Makros, Makroparametern sowie Sektionen nach Gro"s-
13191            und Kleinschreibung unterschieden werden (r5);}
13192      \item{\tty{SFRB} ber"ucksichtigt jetzt auch die Bildungsregeln
13193            f"ur Bitadressen im RAM-Bereich; werden nicht bitadressierbare
13194            Speicherstellen angesprochen, erfolgt eine Warnung (r5);}
13195      \item{zus"atzliche Pseudobefehle \tty{PUSHV} und \tty{POPV}, um
13196            Symbolwerte tempor"ar zu sichern (r5);}
13197      \item{zus"atzliche Funktionen \tty{BITCNT, FIRSTBIT, LASTBIT} und
13198                 \tty{BITPOS} zur Bitverarbeitung (r5);}
13199      \item{bei den CPU32-Prozessoren ist jetzt auch der 68360
13200            ber"ucksichtigt (r5);}
13201      \item{unterst"utzt zus"atzlich die ST9-Familie von SGS-Thomson (r6);}
13202      \item{unterst"utzt zus"atzlich den SC/MP von National Semiconductor
13203            (r6);}
13204      \item{unterst"utzt zus"atzlich die TMS70Cxx-Familie von Texas
13205            Instruments (r6);}
13206      \item{unterst"utzt zus"atzlich die TMS9900-Familie von Texas
13207            Instruments (r6);}
13208      \item{unterst"utzt zus"atzlich die Befehlssatzerweiterungen
13209            des 80296 (r6);}
13210      \item{die unterst"utzten Z8-Derivate wurden erweitert
13211            (r6);}
13212      \item{ber"ucksichtigt zus"atzlich die Maskenfehler des 80C504
13213            von Siemens (r6);}
13214      \item{zus"atzliche Registerdefinitionsdatei f"ur die C50x-Prozessoren
13215            von Siemens (r6);}
13216      \item{unterst"utzt zus"atzlich die ST7-Familie von SGS-Thomson (r6);}
13217      \item{die Intel-Pseudobefehle zur Datenablage sind jetzt
13218            auch f"ur 65816 bzw. MELPS-7700 zul"assig (r6);}
13219      \item{f"ur 65816/MELPS-7700 kann die Adre"sl"ange jetzt durch
13220            Pr"afixe explizit festgelegt werden (r6);}
13221      \item{unterst"utzt zus"atzlich die 8X30x-Familie von Signetics
13222            (r6);}
13223      \item{\tty{PADDING} ist nur noch f"ur die 680x0-Familie defaultm"a"sig
13224            eingeschaltet (r7);}
13225      \item{"uber das neu eingef"uhrte, vordefinierte Symbol
13226            \tty{ARCHITECTURE} kann ausgelesen werden, f"ur welche
13227            Plattform AS "ubersetzt wurde (r7);}
13228      \item{Zus"atzliche Anweisungen \tty{STRUCT} und \tty{ENDSTRUCT} zur
13229            Definition von Datenstrukturen (r7);}
13230      \item{Hex- und Objekt-Dateien f"ur die AVR-Tools k"onnen jetzt
13231            direkt erzeugt werden (r7);}
13232      \item{\tty{MOVEC} kennt jetzt auch die 68040-Steuerregister (r7);}
13233      \item{zus"atzliche \tty{STRLEN}-Funktion, um die L"ange eines
13234            Strings zu ermitteln (r7);}
13235      \item{M"oglichkeit zur Definition von Registersymbolen (r7, momentan
13236            nur Atmel AVR);}
13237      \item{kennt zus"atzlich die undokumentierten 6502-Befehle (r7);}
13238      \item{P2HEX und P2BIN k"onnen jetzt optional die Eingabedateien
13239            automatisch l"oschen (r7);}
13240      \item{P2BIN kann der Ergebnisdatei optional zus"atzlich die
13241            Startadresse voranstellen (r7);}
13242      \item{unterst"utzt zus"atzlich die ColdFire-Familie von Motorola als
13243            Variation des 680x0-Kerns (r7);}
13244      \item{\tty{BYT/FCB, ADR/FDB} und \tty{FCC} erlauben jetzt auch den
13245            von \tty{DC} her bekannten Wiederholungsfaktor (r7);}
13246      \item{unterst"utzt zus"atzlich den M*Core von Motorola (r7);}
13247      \item{der SH7000-Teil kennt jetzt auch die SH7700-Befehlserweiterungen
13248            (r7);}
13249      \item{der 680x0-Teil kennt jetzt auch die zus"atzlichen Befehle des
13250            68040 (r7);}
13251      \item{der 56K-Teil kennt jetzt auch die Befehlserweiterungen bis zum
13252            56300 (r7).}
13253      \item{Mit der neuen \tty{CODEPAGE}-Anweisung k"onnen jetzt auch
13254            mehrere Zeichentabellen gleichzeitig verwaltet werden (r8);}
13255      \item{Die Argumentvarianten f"ur \tty{CHARSET} wurden erweitert
13256            (r8);}
13257      \item{Neue String-Funktionen \tty{SUBSTR} und \tty{STRSTR} (r8);}
13258      \item{zus"atzliches \tty{IRPC}-Statement im Makroprozessor (r8);}
13259      \item{zus"atzlicher {\tt RADIX}-Befehl, um das Default-Zahlensystem
13260            f"ur Integer-Konstanten festzulegen (r8);}
13261      \item{statt {\tt ELSEIF} darf auch einfach {\tt ELSE} geschrieben
13262            werden (r8);}
13263      \item{statt $=$ darf als Gleichheitsoperator auch $==$ geschrieben
13264            werden (r8);}
13265      \item{\tty{BRANCHEXT} erlaubt es beim Philips XA jetzt, die
13266            Sprungweite von kurzen Spr"ungen automatisch zu erweitern
13267            (r8);}
13268      \item{Debug-Ausgaben sind jetzt auch im NoICE-Format m"oglich (r8);}
13269      \item{unterst"utzt zus"atzlich die i960-Familie von Intel (r8);}
13270      \item{unterst"utzt zus"atzlich die $\mu$PD7720/7725-Signalprozssoren
13271            von NEC (r8);}
13272      \item{unterst"utzt zus"atzlich den $\mu$PD77230-Signalprozssor von
13273            NEC (r8);}
13274      \item{unterst"utzt zus"atzlich die SYM53C8xx-SCSI-Prozessoren von
13275            Symbios Logic (r8);}
13276      \item{unterst"utzt zus"atzlich den 4004 von Intel (r8);}
13277      \item{unterst"utzt zus"atzlich die SC14xxx-Serie von National (r8);}
13278      \item{unterst"utzt zus"atzlich die Befehlserweiterungen des PPC403GC
13279            (r8);}
13280      \item{zus"atzliche Kommandozeilenoption {\tt cpu}, um den
13281            Zielprozessor-Default zu setzen (r8);}
13282      \item{Key-Files k"onnen jetzt auch von der Kommandozeile aus
13283            referenziert werden (r8);}
13284      \item{zus"atzliche Kommandozeilenoption {\tt shareout}, um die
13285            Ausgabedatei f"ur SHARED-Definitionen zu setzen (r8);}
13286      \item{neuer Pseudobefehl {\tt WRAPMODE}, um AVR-Prozessoren mit
13287            verk"urztem Programmz"ahler zu unterst"utzen (r8);}
13288      \item{unterst"utzt zus"atzlich die C20x-Befehlsuntermenge im
13289            C5x-Teil (r8);}
13290      \item{hexadezimale Adre"angaben der Hilfsprogamme k"onnen jetzt
13291            auch in C-Notation gemacht werden (r8);}
13292      \item{Das Zahlensystem f"ur Integerergebnisse in \verb!\{...}!-
13293            Ausdr"ucken ist jetzt per \tty{OUTRADIX} setzbar (r8);}
13294      \item{Die Registersyntax f"ur 4004-Registerpaare wurde korrigiert
13295            (r8);}
13296      \item{unterst"utzt zus"atzlich die F$^{2}$MC8L-Familie von Fujitsu
13297            (r8);}
13298      \item{f"ur P2HEX kann jetzt die Minimall"ange f"ur S-Record-Adressen
13299            angegeben werden (r8);}
13300      \item{unterst"utzt zus"atzlich die ACE-Familie von Fairchild (r8);}
13301      \item{{\tt REG} ist jetzt auch f"ur PowerPCs erlaubt (r8);}
13302      \item{zus"atzlicher Schalter in P2HEX, um alle Adressen zu
13303            verschieben (r8);}
13304      \item{Mit dem Schalter \tty{x} kann man jetzt zus"atzlich in einer
13305            zweiten Stufe bie betroffene Quellzeile ausgeben (r8).}
13306      \end{itemize}}
13307\item{Version 1.42:
13308      \begin{itemize}
13309      \item{Die Default-Zahlensyntax f"ur Atmel AVR ist jetzt C-Syntax;}
13310      \item{zus"atzliche Kommandozeilenoption {\tt olist}, um die
13311            Listing-Ausgabedatei zu setzen;}
13312      \item{unterst"utzt zus"atzlich die F$^{2}$MC16L-Familie von Fujitsu;}
13313      \item{zus"atzlicher Befehl {\tt PACKING} f"ur die AVR-Familie;}
13314      \item{zus"atzliche implizite Makroparameter {\tt ALLARGS} und
13315            {\tt ARGCOUNT};}
13316      \item{zus"atzlicher Befehl {\tt SHIFT} zum Abarbeiten variabler
13317            Argumentlisten von Makros;}
13318      \item{unterst"utzt tempor"are Symbole;}
13319      \item{zus"atzlicher Befehl {\tt MAXNEST} zum Einstellen der
13320            maximalen Verschachtelungstiefe von Makroexpansionen;}
13321      \item{zus"atzliche Kommandozeilenoption {\tt noicemask}, um
13322            die Menge der in einem NoICE-Debuginfofile gelisteten Segmente
13323            zu steuern;}
13324      \item{unterst"utzt zus"atzlich die 180x-Familie von Intersil;}
13325      \item{unterst"utzt zus"atzlich das address windowing des 68HC11K4;}
13326      \item{P2HEX kann jetzt die Adre"sfeldl"ange von AVR-Hex-Dateien
13327            variieren;}
13328      \item{mit der neuen Kommandozeilenoption {\tt -gnuerrors} k"onnen
13329            Fehlermeldungen in einem GNU-C-artigen Format ausgegeben
13330            werden;}
13331      \item{unterst"utzt zus"atzlich die TMS320C54x-Familie von Texas
13332            Instruments;}
13333      \item{Neue Makro-Option {\tt INTLABEL};}
13334      \item{die neuen Instruktionen und Register der MEGA-AVRs 8/16
13335            wurden hinzugef"ugt;}
13336      \item{{\tt ENDIF/ENDCASE} zeigen im Listing die Zeilennummer des
13337            zugeh"origen "offnenden Befehls an;}
13338      \item{der 8051-Teil unterst"utzt jetzt auch den erweiterten
13339            Adre"sraum des Dallas DS80C390;}
13340      \item{namenlose tempor"are Symbole hinzugef"ugt;}
13341      \item{unterst"utzt zus"atzlich die undokumentierten 8085-Befehle;}
13342      \item{verbesserte Behandlung von Strukturen;}
13343      \item{Funktion EXPRTYPE() hinzugef"ugt;}
13344      \item{Zeilenfortsetzungszeichen zulassen;}
13345      \item{Unterst"utzung f"ur KCPSM/PicoBlaze von Andreass Wassatsch
13346            integriert;}
13347      \item{unterst"utzt zus"atzlich die 807x-Familie von National
13348            Semiconductor;}
13349      \item{unterst"utzt zus"atzlich den 4040 von Intel;}
13350      \item{unterst"utzt zus"atzlich den eZ8 von Zilog;}
13351      \item{unterst"utzt zus"atzlich die 78K2-Familie von NEC;}
13352      \item{unterst"utzt zus"atzlich die KCPSM3-Variante von Xilinx;}
13353      \item{unterst"utzt zus"atzlich den LatticeMico8;}
13354      \item{unterst"utzt zus"atzlich die 12X-Befehlserweiterungen
13355            und den XGATE-Kern der 68HC12-Familie;}
13356      \item{unterst"utzt zus"atzlich den Signetics 2650;}
13357      \item{unterst"utzt zus"atzlich die COP4-Familie von National
13358            Semiconductor;}
13359      \item{unterst"utzt zus"atzlich die HCS08-Erweiterungen von Freescale;}
13360      \item{unterst"utzt zus"atzlich die RS08-Familie von Freescale;}
13361      \item{unterst"utzt zus"atzlich den 8008 von Intel;}
13362      \item{weitere Syntax f"ur Integer-Konstanten;}
13363      \item{Funktion \tty{CHARFROMSTR} hinzugef"ugt;}
13364      \item{Q f"ur Oktalkonstanten im Intel-Modus hinzugef"ugt;}
13365      \item{weitere Variante f"ur tempor"are Symbole hinzugef"ugt;}
13366      \item{der PowerPC-Teil wurde um Unterst"utzung f"ur den MPC821 erweitert
13367            (Beitrag von Marcin Cieslak);}
13368      \item{implizite Makro-Parameter sind immer case-insensitiv;}
13369      \item{das \tty{REG}-Statement ist jetzt auch f"ur den MSP430
13370            erlaubt;}
13371      \item{unterst"utzt zus"atzlich den XS1 von XMOS;}
13372      \item{zus"atzliche Parameter \tty{GLOBALSYMBOLS} und
13373            \tty{NOGLOBALSYMBOLS} um zu steuern, ob Labels
13374            in Makros lokal sind oder nicht;}
13375      \item{kennt zus"atzlich die 75xx-Reihe von NEC;}
13376      \item{kennt zus"atzlich die TMS1000-Controller von TI;}
13377      \item{unterst"utzt zus"atzlich die 78K2-Familie von NEC;}
13378      \item{alle neueren Anderungen werden nur noch in der
13379            separaten changelog-Datei dokumentiert.}
13380      \end{itemize}}
13381\end{itemize}
13382
13383%%===========================================================================
13384
13385\cleardoublepage
13386\chapter{Hinweise zum Quellcode von AS}
13387\label{ChapSource}
13388
13389Wie in der Einleitung erw"ahnt, gebe ich nach R"ucksprache den Quellcode
13390von AS heraus.  Im folgenden sollen einige Hinweise zu dessen Handhabung
13391gegeben werden.
13392
13393%%---------------------------------------------------------------------------
13394
13395\section{Verwendete Sprache}
13396
13397Urspr"unglich war AS ein in Turbo-Pascal geschriebenes Programm.  F"ur
13398diese Entscheidung gab es Ende der 80er Jahre eine Reihe von Gr"unden:
13399Zum einen war ich damit wesentlich vertrauter als mit jedem C-Compiler,
13400zum anderen waren alle C-Compiler unter DOS verglichen mit der IDE von
13401Turbo-Pascal ziemliche Schnecken.  Anfang 1997 zeichnete sich jedoch ab,
13402da"s sich das Blatt gewendet hatte: Zum einen hatte Borland beschlossen,
13403die DOS-Entwickler im Stich zu lassen (nochmals ausdr"ucklich keinen
13404sch"onen Dank, Ihr Pappnasen von Borland!), und Version 7.0 etwas namens
13405'Delphi' nachfolgen lie"sen, was zwar wohl wunderbar f"ur
13406Windows-Programme geeignet ist, die zu 90\% aus Oberfl"ache und zuf"allig
13407auch ein bi"schen Funktion bestehen, f"ur kommandozeilenorientierte
13408Progamme wie AS aber reichlich unbrauchbar ist.  Zum anderen hatte sich
13409bereits vor diesem Zeitpunkt mein betriebssystemm"a"siger Schwerpunkt
13410deutlich in Richtung Unix verschoben, und auf ein Borland-Pascal f"ur
13411Linux h"atte ich wohl beliebig lange warten k"onnen (an alle die, die
13412jetzt sagen, Borland w"urde ja an soetwas neuerdings basteln: Leute, das
13413ist {\em Vapourware}, und glaubt den Firmen nichts, solange Ihr nicht
13414wirklich in den Laden gehen und es kaufen k"onnt!).  Von daher war also
13415klar, da"s der Weg in Richtung C gehen mu"ste.
13416
13417Nach der Erfahrung, wohin die Verwendung von Inselsystemen f"uhrt, habe
13418ich bei der Umsetzung auf C Wert auf eine m"oglichst gro"se Portabilit"at
13419gelegt; da AS jedoch z.B. Bin"ardateien in einem bestimmten Format
13420erzeugen mu"s und an einigen Stellen betriebssystemspezifische Funktionen
13421nutzt, gibt es einige Stellen, an denen man anpassen mu"s, wenn man AS zum
13422ersten Mal auf einer neuen Plattform "ubersetzt.
13423
13424AS ist auf einen C-Compiler ausgelegt, der dem ANSI-Standard entspricht;
13425C++ ist ausdr"ucklich nicht erforderlich.  Wenn Sie nur einen Compiler
13426nach dem veralteten Kernighan\&Ritchie-Standard besitzen, sollten Sie sich
13427nach einem neuen Compiler umsehen; der ANSI-Standard ist seit 1989
13428verabschiedet und f"ur jede aktuelle Plattform sollte ein ANSI-Compiler
13429verf"ugbar sein, zur Not, indem man mit dem alten Compiler GNU-C baut.  Im
13430Quellcode sind zwar einige Schalter vorhanden, um den Code K\&R-n"aher zu
13431machen, aber dies ist ein nicht offiziell unterst"utztes Feature, das ich
13432nur intern f"ur ein ziemlich antikes Unix benutze.  Alles weitere zum
13433'Thema K\&R' steht in der Datei {\tt README.KR}.
13434
13435Der Sourcenbaum ist durch einige in der Pascal-Version nicht vorhandene
13436Features (z.B. dynamisch ladbare Nachrichtendateien, Testsuite,
13437automatische Generierung der Dokumentation aus {\em einem} Quellformat)
13438deutlich komplizierter geworden.  Ich werde versuchen, die Sache Schritt
13439f"ur Schritt aufzudr"oseln:
13440
13441%%---------------------------------------------------------------------------
13442
13443\section{Abfangen von Systemabh"angigkeiten}
13444
13445Wie ich schon andeutete, ist AS (glaube ich jedenfalls...) auf
13446Plattformunabh"angigkeit und leichte Portierbarkeit getrimmt.  Dies
13447bedeutet, da"s man die Platt\-form\-un\-ab\-h"an\-gig\-kei\-ten in
13448m"oglichst wenige Dateien zusammenzieht.  Auf diese Dateien werde ich im
13449folgenden eingehen, und dieser Abschnitt steht ganz vorne, weil es sicher
13450eines der wichtigsten ist:
13451
13452Die Generierung aller Komponenten von AS erfolgt "uber ein zentrales {\tt
13453Makefile}.  Damit dies funktioniert, mu"s man ihm ein passendes {\tt
13454Makefile.def} anbieten, das die plattformabh"angigen Einstellungen wie
13455z.B. Compilerflags vorgibt.  Im Unterverzeichnis {\tt
13456Makefile.def-samples} finden sich eine Reihe von Includes, die f"ur
13457g"angige Plattformen funktionieren (aber nicht zwangsweise optimal sein
13458m"ussen...).  Wenn die von Ihnen benutzte Plattform nicht dabei ist,
13459k"onnen Sie die Beispieldatei {\tt Makefile.def.tmpl} als Ausgangspunkt
13460verwenden (und das Ergebnis mir zukommen lassen!).
13461
13462Ein weiterer Anlaufpunkt zum Abfangen von Systemabh"angigkeiten ist die
13463Datei {\tt sysdefs.h}.  Praktisch alle Compiler definieren eine Reihe von
13464Pr"aprozessorsymbolen vor, die den benutzten Zielprozessor sowie das
13465benutzte Betriebsystem beschreiben.  Auf einer Sun Sparc unter Solaris
13466mit den GNU-Compiler sind dies z.B. die Symbole \verb!__sparc! und
13467\verb!__SVR4!.  In {\tt sysdefs.h} werden diese Symbole genutzt, um f"ur
13468die restlichen, systemunabh"angigen Dateien eine einheitliche Ungebung
13469bereitzustellen.  Insbesondere betrifft dies Integer-Datentypen einer
13470bekannten L"ange, es kann aber auch die Nach- oder Redefinition von
13471C-Funktionen betreffen, die auf einer bestimmten Plattform nicht oder
13472nicht standardgem"a"s vorhanden sind.  Was da so an Sachen anf"allt, liest
13473man am besten selber nach.  Generell sind die \verb!#ifdef!-Statements in
13474zwei Ebenen gegliedert: Zuerst wird eine bestimmte Prozessorplattform
13475ausgew"ahlt, dann werden in diesem Abschnitt die Betriebssysteme
13476auseinandersortiert.
13477
13478Wenn Sie AS auf eine neue Plattform portieren, m"ussen Sie zwei f"ur diese
13479Plattform typische Symbole finden und {\tt sysdefs.h} passend erweitern
13480(und wieder bin ich an dem Ergebnis interessiert...).
13481
13482%%---------------------------------------------------------------------------
13483
13484\section{Systemunabh"angige Dateien}
13485
13486...stellen den g"o"sten Teil aller Module dar.  Alle Funktionen im Detail
13487zu beschreiben, w"urde den Rahmen dieser Beschreibung sprengen (wer hier
13488mehr wissen will, steigt am besten selbst in das Studium der Quellen ein,
13489so katastrophal ist mein Programmierstil nun auch wieder nicht...),
13490deshalb hier nur eine kurze Auflistung, welche Module vorhanden sind und
13491was f"ur Funktionen sie beinhalten:
13492
13493\subsection{Von AS genutzte Module}
13494
13495\subsubsection{as.c}
13496
13497Diese Datei ist die Wurzel von AS: Sie enth"alt die {\em main()}-Funktion
13498von AS, die Verarbeitung aller Kommandozeilenoptionen, die "ubergeordnete
13499Steuerung aller Durchl"aufe durch die Quelldateien sowie Teile des
13500Makroprozessors.
13501
13502\subsubsection{asmallg.c}
13503
13504In diesem Modul werden all die Befehle bearbeitet, die f"ur alle Prozessoren
13505definiert sind, z.B. \tty{EQU} und \tty{ORG}.  Hier findet sich auch der
13506\tty{CPU}-Befehl, mit dem zwischen den einzelnen Prozessoren hin- und
13507hergeschaltet wird.
13508
13509\subsubsection{asmcode.c}
13510
13511In diesem Modul befindet sich die Verwaltung der Code-Ausgabedatei.
13512Exportiert wird ein Interface, mit dem sich eine Code-Datei "offnen
13513und schlie"sen l"a"st, und das Routinen zum Einschreiben (und
13514Zur"ucknehmen) von Code anbietet.  Eine wichtige Aufgabe dieses Moduls
13515ist die Pufferung des Schreibvorgangs, die die Ausgabegeschwindigkeit
13516erh"oht, indem der erzeugte Code in gr"o"seren Bl"ocken geschrieben wird.
13517
13518\subsubsection{asmdebug.c}
13519
13520Optional kann AS Debug-Informationen f"ur andere Tools wie Simulatoren
13521oder Debugger erzeugen, die einen R"uckbezug auf den Quellcode erlauben,
13522in diesem Modul gesammelt und nach Ende der Assemblierung in einem von
13523mehreren Formaten ausgegeben werden k"onnen.
13524
13525\subsubsection{asmdef.c}
13526
13527Dieses Modul enth"alt lediglich Deklarationen von "uberall ben"otigten
13528Konstanten und gemeinsam benutzten Variablen.
13529
13530\subsubsection{asmfnums.c}
13531
13532Intern vergibt AS f"ur jede benutzte Quelldatei eine fortlaufende Nummer,
13533die zur schnellen Referenzierung benutzt wird.  Die Vergabe dieser Nummern
13534und die Umwandlung zwischen Nummer und Dateinamen passiert hier.
13535
13536\subsubsection{asmif.c}
13537
13538Hier befinden sich alle Routinen, die die bedingte Assemblierung steuern.
13539Exportiert wird als wichtigste Variable das Flag \tty{IfAsm}, welches
13540anzeigt, ob Codeerzeugung momentan ein- oder ausgeschaltet ist.
13541
13542\subsubsection{asminclist.c}
13543
13544In diesem Modul ist die Listenstruktur definiert, "uber die AS die
13545Verschachtelung von Include-Dateien im Listing ausgeben kann.
13546
13547\subsubsection{asmitree.c}
13548
13549Wenn man in einer Code-Zeile das benutzende Mnemonic ermitteln will, ist
13550das einfache Durchvergleichen mit allen vorhandenen Befehlen (wie es noch
13551in vielen Codegeneratoren aus Einfachheit und Faulheit passiert) nicht
13552unbedingt die effizienteste Variante.  In diesem Modul sind zwei
13553verbesserte Strukturen (Bin"arbaum und Hash-Tabelle) definiert, die eine
13554effizientere Suche erm"oglichen und die einfache lineare Suche nach und
13555nach abl"osen sollen...Priorit"at nach Bedarf...
13556
13557\subsubsection{asmmac.c}
13558
13559In diesem Modul finden sich die Routinen zur Speicherung und Abfrage von
13560Makros.  Der eigentliche Makroprozessor befindet sich (wie bereits
13561erw"ahnt) in {\tt as.c}.
13562
13563\subsubsection{asmpars.c}
13564
13565Hier geht es ins Eingemachte: In diesem Modul werden die Symboltabellen
13566(global und lokal) in zwei Bin"arb"aumen verwaltet.  Au"serdem findet sich
13567hier eine ziemlich gro"se Prozedur \tty{EvalExpression}, welche einen
13568(Formel-)ausdruck analysiert und auswertet.  Die Prozedur liefert das
13569Ergebnis (Integer, Gleitkomma oder String) in einem varianten Record zur"uck.
13570Zur Auswertung von Ausdr"ucken bei der Codeerzeugung sollten allerdings eher
13571die Funktionen \tty{EvalIntExpression, EvalFloatExpression} und
13572\tty{EvalStringExpression} verwendet werden.  "Anderungen zum Einf"ugen neuer
13573Prozessoren sind hier nicht erforderlich und sollten auch nur mit "au"serster
13574"Uberlegung erfolgen, da man hier sozusagen an ,,die Wurzel'' von AS greift.
13575
13576\subsubsection{asmsub.c}
13577
13578Hier finden sich gesammelt einige h"aufig gebrauchte Unterroutinen, welche
13579in erster Linie die Bereiche Fehlerbehandlung und 'gehobene'
13580Stringverarbeitung abdecken.
13581
13582\subsubsection{bpemu.c}
13583
13584Wie am Anfang erw"ahnt, war AS urspr"unglich ein in Borland-Pascal
13585geschriebenes Programm.  Bei einigen intrinsischen Funktionen des
13586Compilers war es einfacher, diese zu emulieren, anstatt alle betroffenen
13587Stelle im Quellcode zu "andern. Na ja...
13588
13589\subsubsection{chunks.c}
13590
13591Dieses Modul definiert einen Datentyp, mit dem eine Liste von
13592Adre"sbereichen verwaltet werden kann.  Diese Funktion wird von AS
13593f"ur die Belegungslisten ben"otigt, au"serdem benutzten P2BIN und
13594P2HEX diese Listen, um vor "Uberlappungen zu warnen.
13595
13596\subsubsection{cmdarg.c}
13597
13598Dieses Modul implementiert den Mechanismus der Kommdozeilenparameter.  Es
13599ben"otigt eine Spezifikation der erlaubten Parameter, zerlegt die
13600Kommadozeile und ruft die entsprechenden Callbacks auf.  Der Mechanismus
13601leistet im einzelnen folgendes:
13602\begin{itemize}
13603\item{Mitbearbeitung von Optionen in einer Environment-Variablen oder
13604      entsprechenden Datei;}
13605\item{R"uckgabe einer Menge, welche die noch nicht bearbeiteten
13606      Kommandozeilenparameter beschreibt;}
13607\item{Trenunng von positiven und negativen Schaltern;}
13608\item{Eine Hintert"ur, falls die dar"uberliegende Entwicklungsumgebung die
13609      Kommandozeile nur in Gro"s- oder Kleinschreibung "ubergibt.}
13610\end{itemize}
13611Dieses Modul wird nicht nur von AS, sondern auch von den Hilfsprogrammen
13612\tty{BIND, P2HEX und P2BIN} verwendet.
13613
13614\subsubsection{codepseudo.c}
13615
13616Hier finden sich Pseudobefehle, die von mehreren Codegeneratoren verwendet
13617werden.  Dies ist einmal die Intel-Gruppe mit der \tty{DB..DT}-Gruppe,
13618zum anderen die Pendants f"ur die 8/16-Bitter von Motorola oder Rockwell.
13619Wer in diesem Bereich um einen Prozessor erweitern will, kann mit einem
13620Aufruf den gr"o"sten Teil der Pseudobefehle erschlagen.
13621
13622\subsubsection{codevars.c}
13623
13624Aus Speicherersparnisgr"unden sind hier einige von diversen
13625Codegeneratoren benutzen Variablen gesammelt.
13626
13627\subsubsection{endian.c}
13628
13629Doch noch ein bi"schen Maschinenabh"angigkeit, jedoch ein Teil, um den man
13630sich nicht zu k"ummern braucht: Ob eine Maschine Little- oder
13631Big-Endianess benutzt, wird in diesem Modul beim Programmstart automatisch
13632bestimmt.  Weiterhin wird gepr"uft, ob die in {\tt sysdefs.h} gemachten
13633Typfestlegungen f"ur Integervariablen auch wirklich die korrekten L"angen
13634ergeben.
13635
13636\subsubsection{headids.c}
13637
13638Gesammelt sind hier alle von AS unterst"utzten Zielprozessorfamilien, die
13639daf"ur in Code-Dateien verwendeten Kennzahlen (siehe Kapitel
13640\ref{SectCodeFormat}) sowie das von P2HEX defaultm"a"sig zu verwendende
13641Ausgabeformat.  Ziel dieser Tabelle ist es, Das Hinzuf"ugen eines neuen
13642Prozessors m"oglichst zu zentralisieren, d.h. es sind im Gegensatz zu
13643fr"uher keine weiteren Modifikationen an den Quellen der Hilfsprogramme
13644mehr erforderlich.
13645
13646\subsubsection{ioerrs.c}
13647
13648Hier ist die Umwandlung von Fehlernummern in Klartextmeldungen abgelegt.
13649Hoffentlich treffe ich nie auf ein System, auf dem die Nummern nicht als
13650Makros definiert sind, dann kann ich n"amlich dieses Modul komplett
13651umschreiben...
13652
13653\subsubsection{nlmessages.c}
13654
13655Die C-Version von AS liest alle Meldungen zur Laufzeit aus Dateien, nachdem
13656die zu benutzende Sprache ermittelt wurde.  Das Format der
13657Nachrichtendateien ist kein einfaches, sondern ein spezielles, kompaktes,
13658vorindiziertes Format, das zur "Ubersetzungszeit von einem Programm namens
13659'rescomp' (dazu kommen wir noch) erzeugt wird.  Dieses Modul ist das
13660Gegenst"uck zu rescomp, die den korrekten Sprachenanteil einer Datei in ein
13661Zeichenfeld einliest und Zugriffsfunktionen anbietet.
13662
13663\subsubsection{nls.c}
13664
13665In diesem Modul wird ermittelt, welche nationalen Einstellungen (Datums-
13666und Zeitformat, L"andercode) zur Laufzeit vorliegen.  Das ist leider eine
13667hochgradig systemspezifische Sache, und momentan sind nur drei Methoden
13668definiert: Die von MS-DOS, die von OS/2 und die typische Unix-Methode
13669"uber die {\em locale}-Funktionen.  F"ur alle anderen Systeme ist leider
13670\verb!NO_NLS! angesagt...
13671
13672\subsubsection{stdhandl.c}
13673
13674Zum einen ist hier eine spezielle open-Funktion gelandet, die die
13675Sonderstrings {\tt !0...!2} als Dateinamen kennt und daf"ur Duplikate der
13676Standard-Dateihandles {\em stdin, stdout} und {\em stderr} erzeugt, zum
13677anderen wird hier festgestellt, ob die Standardausgabe auf ein Ger"at oder
13678eine Datei umgeleitet wurde.  Das bedingt auf nicht-Unix-Systemen leider
13679auch einige Speziall"osungen.
13680
13681\subsubsection{stringlists.c}
13682
13683Dies ist nur ein kleiner ,,Hack'', der Routinen zur Verwaltung von linearen
13684Listen mit Strings als Inhalt definiert, welche z.B. im Makroprozessor von
13685AS gebraucht werden.
13686
13687\subsubsection{strutil.c}
13688
13689Hier sind einige h"aufig genutzte String-Operationen gelandet.
13690
13691\subsubsection{version.c}
13692
13693Die momentan g"ultige Version ist f"ur AS und alle anderen Hilfsprogramme
13694hier zentral gespeichert.
13695
13696\subsubsection{code????.c}
13697
13698Dies Module bilden den Hauptteil der AS-Quellen: jedes Modul beinhaltet
13699den Codegenerator f"ur eine bestimmte Prozessorfamilie.
13700
13701\subsection{Zus"atzliche Module f"ur die Hilfsprogramme}
13702
13703\subsubsection{hex.c}
13704
13705Ein kleines Modul zur Umwandlung von Integerzahlen in
13706Hexadezimaldarstellung.  In C nicht mehr unbedingt erforderlich (au"ser
13707zur Wandlung von {\em long long}-Variablen, was leider nicht alle {\tt
13708printf()}'s unterst"utzen), aber es ist im Rahmen der Portierung eben auch
13709stehengeblieben.
13710
13711\subsubsection{p2bin.c}
13712
13713Die Quellen von P2BIN.
13714
13715\subsubsection{p2hex.c}
13716
13717Die Quellen von P2HEX.
13718
13719\subsubsection{pbind.c}
13720
13721Die Quellen von BIND.
13722
13723\subsubsection{plist.c}
13724
13725Die Quellen von PLIST.
13726
13727\subsubsection{toolutils.c}
13728
13729Hier sind gesammelt die Unterroutinen, die von allen Hilfsprogrammen
13730ben"otigt werden, z.B. f"ur das Lesen von Code-Dateien.
13731
13732\section{W"ahrend der Erzeugung von AS gebrauchte Module}
13733
13734\subsubsection{a2k.c}
13735
13736Dies ist ein Minimalfilter, das ANSI-C-Files in Kernighan-Ritchie
13737umwandelt.  Um es genau zu sagen: es werden nur die Funktionsk"opfe
13738umgewandelt, und auch nur dann, wenn sie ungef"ahr so formatiert sind, wie
13739es mein Schreibstil eben ist.  Es komme also keiner auf die Idee, das
13740w"are ein universeller C-Parser!
13741
13742\subsubsection{addcr.c}
13743
13744Ein kleiner Filter, der bei der Installation auf DOS- oder OS/2-Systemen
13745gebraucht wird.  Da DOS und OS/2 den Zeilenvorschub mit CR/LF vornehmen,
13746Unix-Systeme jedoch nur mit LF, werden s"amtliche mitgelieferten
13747Assembler-Includes bei der Installation durch diesen Filter geschickt.
13748
13749\subsubsection{bincmp.c}
13750
13751F"ur DOS und OS/2 "ubernimmt dieses Modul die Funktion die Funktion des
13752{\em cmp}-Befehls, d.h. den bin"aren Vergleich von Dateien w"ahrend des
13753Testlaufes.  W"ahrend dies prinzipiell auch mit dem mitgelieferten {\em
13754comp} m"oglich w"are, hat {\em bincmp} keine l"astigen interaktiven
13755Abfragen (bei denen man erst einmal herausfinden mu"s, wie man sie auf
13756allen Betriebssystemversionen abstellt...)
13757
13758\subsubsection{findhyphen.c}
13759
13760Dies ist das Untermodul in {\em tex2doc}, da"s f"ur die Silbentrennung von
13761Worten sorgt.  Der verwendete Algorithmus is schamlos von TeX
13762abgekupfert.
13763
13764\subsubsection{grhyph.c}
13765
13766Die Definition der Silbentrennungsregeln f"ur die deutsche Sprache.
13767
13768\subsubsection{rescomp.c}
13769
13770Dies ist der 'Resourcencompiler' von AS, d.h. das Werkzeug, das die
13771lesbaren Dateien mit Stringresourcen in ein schnelles, indiziertes Format
13772umsetzt.
13773
13774\subsubsection{tex2doc.c}
13775
13776Ein Werkzeug, da"s die LaTeX-Dokumentation von AS in ein ASCII-Format
13777umsetzt.
13778
13779\subsubsection{tex2html.c}
13780
13781Ein Werkzeug, da"s die LaTeX-Dokumentation von AS in ein HTML-Dokument
13782umsetzt.
13783
13784\subsubsection{umlaut.c und unumlaut.c}
13785
13786Diese Progr"ammchen besorgen die Wandlung zwischen Sonderzeichenkodierung
13787im ISO-Format (alle AS-Dateien verwenden im Auslieferungszustand die
13788ISO8859-1-Kodierung f"ur Sonderzeichen) und Sonderzeichenkodierung im
13789systemspezifischen Format.  Neben einer Plain-ASCII7-Variante sind dies im
13790Augenblick die IBM-Zeichens"atze 437 und 850.
13791
13792\subsubsection{ushyph.c}
13793
13794Die Definition der Silbentrennungsregeln f"ur die englische Sprache.
13795
13796%%---------------------------------------------------------------------------
13797
13798\section{Generierung der Nachrichtendateien}
13799
13800Wie bereits erw"ahnt, verwendet der C-Quellenbaum von AS ein dynamisches
13801Ladeverfahren f"ur alle (Fehler-)Meldungen.  Gegen"uber den
13802Pascal-Quellen, in denen alle Meldungen in einem Include-File geb"undelt
13803waren und so in die Programme hinein"ubersetzt wurden, macht es dieses
13804Verfahren "uberfl"ussig, mehrere sprachliche Varianten von AS zur
13805Verf"ugung zu stellen: es gibt nur noch eine Version, die beim
13806Programmstart die zu benutzende Variante ermittelt und aus den
13807Nachrichtendateien die entsprechende Komponente l"adt.  Kurz zur
13808Erinnerung: Unter DOS und OS/2 wird dazu die gew"ahlte {\tt
13809COUNTRY}-Einstellung zu Rate gezogen, unter Unix werden die
13810Environment-Variablen {\tt LC\_MESSAGES, LC\_ALL} und {\tt LANG} befragt.
13811
13812\subsection{Format der Quelldateien}
13813
13814Eine Quelldatei f"ur den Message-Compiler {\em rescomp} hat "ublicherweise
13815die Endung {\tt .res}.  Der Message-Compiler erzeugt aus dieser Datei ein
13816oder zwei Dateien:
13817\begin{itemize}
13818\item{eine bin"are Datei, die zur Laufzeit von AS bzw. den Hilfsprogrammen
13819      gelesen wird;}
13820\item{optional eine weitere C-Header-Datei, die allen vorhandenen
13821      Nachrichten eine Indexnummer zuweist.  "Uber diese Indexnummern und
13822      eine Indextabelle in der bin"aren Datei kann zur Laufzeit schnell
13823      auf einzelne Meldungen zugegriffen werden.}
13824\end{itemize}
13825
13826Die Quelldatei f"ur den Message-Compiler ist eine reine ASCII-Datei, also
13827mit jedem beliebigen Editor bearbeitbar, und besteht aus einer Reihe von
13828Steueranweisungen mit Parametern.  Leerzeilen sowie Zeilen, die mit einem
13829Semikolon beginnen, werden ignoriert.  Das Inkludieren anderer Dateien ist
13830"uber das {\tt Include}-Statement m"oglich:
13831\begin{verbatim}
13832Include <Datei>
13833\end{verbatim}
13834
13835Am Anfang jeder Quelldatei m"ussen zwei Statements stehen, die die im
13836folgenden definierten Sprachen beschreiben.  Das wichtigere der beiden
13837Statements ist {\tt Langs}, z.B.:
13838\begin{verbatim}
13839Langs DE(049) EN(001,061)
13840\end{verbatim}
13841beschreibt, da"s zwei Sprachen im folgenden definiert werden.  Der erste
13842Nachrichtensatz soll benutzt werden, wenn unter Unix die Sprache per
13843Environment-Variablen auf {\tt DE} gestellt wurde bzw. unter DOS bzw. OS/2
13844der Landescode 049 eingestellt wurde.  Der zweite Satz kommt
13845dementsprechend bei den Einstellungen {\tt EN} bzw. 061 oder 001 zum
13846Einsatz.  W"ahrend bei den 'Telefonnummern' mehrere Codes auf einen
13847Nachrichtensatz verweisen k"onnen, ist die Zuordnung zu den
13848Unix-Landescodes eineindeutig.  Dies ist in der Praxis aber kein
13849Beinbruch, weil die {\tt LANG}-Variablen unter Unix Unterversionen einer
13850Sprache als Anh"angsel beschreiben, z.B. so:
13851\begin{verbatim}
13852de.de
13853de.ch
13854en.us
13855\end{verbatim}
13856AS vergleicht nur den Anfang der Strings und kommt so trotzdem zur
13857richtigen Entscheidung.
13858Das {\tt Default}-Statement gibt vor, welcher Sprachensatz verwendet
13859werden soll, wenn entweder "uberhaupt keine Sprache gesetzt wurde oder
13860eine Kennung verwendet wird, die nicht in der Liste von {\tt Langs}
13861vorhanden ist.  Typischerweise ist dies Englisch:
13862\begin{verbatim}
13863Default EN
13864\end{verbatim}
13865Nach diesen beiden Definitionen folgt eine beliebige Menge von {\tt
13866Message}-Statements, d.h. Definitionen von Meldungen:
13867\begin{verbatim}
13868Message ErrName
13869 ": Fehler "
13870 ": error "
13871\end{verbatim}
13872Wurden {\em n} Sprachen im {\tt Langs}-Statement angek"undigt, so nimmt
13873der Message-Compiler {\bf genau} die folgenden {\em n} Zeilen als die zu
13874speichernden Strings.  Es ist also nicht m"oglich, bei einzelnen
13875Nachrichten bestimmte Sprachen fortzulassen, und eine auf die Strings
13876folgende Leerzeile ist keinesfalls als Endemarkierung f"ur die Liste
13877mi"szuverstehen; eingef"ugte Leerzeilen dienen einzig und allein der
13878besseren Lesbarkeit.  Was allerdings erlaubt ist, ist, einzelne Meldungen
13879"uber mehrere Zeilen in der Quelldatei zu verteilen; alle Zeilen bis auf
13880die letzte m"ussen dann mit einem Backslash als Fortsetzungszeichen enden:
13881\begin{verbatim}
13882Message TestMessage2
13883 "Dies ist eine" \
13884 "zweizeilige Nachricht"
13885 "This is a" \
13886 "two-line message"
13887\end{verbatim}
13888Wie bereits erw"ahnt, handelt es sich bei den Quelldateien um reine
13889ASCII-Dateien; Sonderzeichen k"onnen in den Meldungstexten zwar
13890eingetragen werden (und der Compiler wird sie auch so durchreichen), der
13891gravierende Nachteil ist aber, da"s eine solche Datei nicht mehr voll
13892portabel ist: Wird sie auf ein anderes System gebracht, das z.B. eine
13893andere Kodierung f"ur Umlaute verwendet, bekommt der Anwender zur Laufzeit
13894nur merkw"urdige Zeichen zu sehen...Sonderzeichern sollten daher immer mit
13895Hilfe von speziellen Sequenzen geschrieben werden, die von HTML bzw. SGML
13896entlehnt wurden (siehe Tabelle \ref{TabSpecChars}).  Zeilenvorsch"ube
13897k"onnen in eine Zeile wie von C her gewohnt mit \verb!\n! eingebracht
13898werden.
13899\begin{table*}[htb]
13900\begin{center}\begin{tabular}{|l|l|}
13901\hline
13902Sequenz... & ergibt... \\
13903\hline
13904\hline
13905\verb!&auml; &ouml; &uuml;! & "a "o "u (Umlaute)\\
13906\verb!&Auml; &Ouml; &Uuml;! & "A "O "U \\
13907\verb!&szlig;!              & "s (scharfes s) \\
13908\verb!&agrave; &egrave; &igrave; &ograve; &ugrave;! & \'a \'e \'i \'o \'u (Accent \\
13909\verb!&Agrave; &Egrave; &Igrave; &Ograve; &Ugrave;! & \'A \'E \'I \'O \'U grave) \\
13910\verb!&aacute; &eacute; &iacute; &oacute; &uacute;! & \`a \`e \`i \`o \`u (Accent \\
13911\verb!&Aacute; &Eacute; &Iacute; &Oacute; &Uacute;! & \`A \`E \`I \`O \`U agiu) \\
13912\verb!&acirc; &ecirc; &icirc; &ocirc; &ucirc;! & \^a \^e \^i \^o \^u (Accent \\
13913\verb!&Acirc; &Ecirc; &Icirc; &Ocirc; &Ucirc;! & \^A \^E \^I \^O \^U circonflex) \\
13914\verb!&ccedil; &Ccedil;! & \c{c} \c{C}(Cedilla) \\
13915\verb!&ntilde; &Ntilde;! & \~n \~N \\
13916\verb!&aring; &Aring;! & \aa  \AA \\
13917\verb!&aelig; &Aelig;! & \ae  \AE \\
13918\verb!&iquest; &iexcl;! & umgedrehtes ! oder ? \\
13919\hline
13920\end{tabular}\end{center}
13921\caption{Sonderzeichenschreibweise des {\em rescomp}\label{TabSpecChars}}
13922\end{table*}
13923
13924%%---------------------------------------------------------------------------
13925
13926\section{Dokumentationserzeugung}
13927
13928In einer Quellcodedistribution von AS ist diese Dokumentation nur als
13929LaTeX-Dokument enthalten.  Andere Formate werden aus dieser mit Hilfe von
13930mitgelieferten Werkzeugen automatisch erzeugt.  Zum einen reduziert dies
13931den Umfang einer Quellcodedistribution, zum anderen m"ussen "Anderungen
13932nicht an allen Formatversionen eines Dokumentes parallel vorgenommen
13933werden, mit all den Gefahren von Inkonsistenzen.
13934
13935Als Quellformat wurde LaTeX verwendet, weil...weil...weil es eben schon
13936immer vorhanden war.  Zudem ist TeX fast beliebig portierbar und pa"st
13937damit recht gut zum Anspruch von AS.  Eine Standard-Distribution erlaubt
13938damit eine 'ordentliche' Ausgabe auf so ziemlich jedem Drucker; f"ur eine
13939Konvertierung in die fr"uher immer vorhandene ASCII-Version liegt der
13940Konverter {\em tex2doc} bei; zus"atzlich einen Konverter {\em tex2html},
13941so da"s man die Anleitung direkt ins Internet stellen kann.
13942
13943Die Erzeugung der Dokumentation wird mit einem schlichten
13944\begin{verbatim}
13945make docs
13946\end{verbatim}
13947angesto"sen; daraufhin werden die beiden erw"ahnten Hilfstools erzeugt,
13948auf die TeX-Dokumentation angewandt und schlu"sendlich wird noch LaTeX
13949selber aufgerufen.  Dies nat"urlich f"ur alle Sprachen nacheinander...
13950
13951%%---------------------------------------------------------------------------
13952
13953\section{Testsuite}
13954
13955Da AS mit bin"aren Daten von genau vorgegebener Struktur umgeht, ist er
13956naturgem"a"s etwas empfindlich f"ur System- und Compilerabh"angigkeiten.
13957Um wenigstens eine gewisse Sicherheit zu geben, da"s alles korrekt
13958durchgelaufen ist, liegt dem Assembler im Unterverzeichnis {\tt tests}
13959eine Menge von Test-Assemblerquellen bei, mit denen man den frisch
13960gebauten Assembler testen kann.  Diese Testprogramme sind in erster Linie
13961darauf getrimmt, Fehler in der Umsetzung des Maschinenbefehlssatzes zu
13962finden, die besonders gern bei variierenden Wortl"angen auftreten.
13963Maschinenunabh"angige Features wie der Makroprozessor oder bedingte
13964Assemblierung werden eher beil"aufig getestet, weil ich davon ausgehe,
13965da"s sie "uberall funktionieren, wenn sie bei mir funktionieren...
13966
13967Der Testlauf wird mit einem einfachen {\em make test} angesto"sen.  Jedes
13968Testprogramm wird assembliert, in eine Bin"ardatei gewandelt und mit einem
13969Referenz-Image verglichen.  Ein Test gilt als bestanden, wenn Referenz und
13970die neu erzeugte Datei Bit f"ur Bit identisch sind.  Am Ende wird
13971summarisch die Assemblierungszeit f"ur jeden Test ausgegeben (wer will,
13972kann mit diesen Ergebnissen die Datei {\tt BENCHES} erg"anzen), zusammen
13973mit dem Erfolg oder Mi"serfolg.  Jedem Fehler ist auf den Grund zu gehen,
13974selbst wenn er bei einem Zielprozessor auftritt, den Sie nie nutzen
13975werden!  Es ist immer m"oglich, da"s dies auf einen Fehler hinweist, der
13976auch bei anderen Zielprozessoren auftritt, nur zuf"allig nicht in den
13977Testf"allen.
13978
13979%%---------------------------------------------------------------------------
13980
13981\section{Einh"angen eines neuen Zielprozessors}
13982
13983Der mit Abstand h"aufigste Grund, im Quellcode von AS etwas zu ver"andern,
13984d"urfte wohl die Erweiterung um einen neuen Zielprozessor sein.  Neben der
13985Erg"anzung der Makefiles um das neue Modul ist lediglich eine Modifikation
13986der Quellen an wenigen Stellen erforderlich, den Rest erledigt das neue
13987Modul, indem es sich in der Liste der Codegeneratoren registriert.  Im
13988folgenden will ich kochbuchartig die zum Einh"angen erforderlichen
13989Schritte beschreiben:
13990
13991\subsubsection{Festlegung des Prozessornamens}
13992
13993Der f"ur den Prozessor zu w"ahlende Name mu"s zwei Kriterien erf"ullen:
13994\begin{enumerate}
13995\item{Der Name darf noch nicht von einem anderen Prozessor belegt sein.
13996      Beim Aufruf von AS ohne Parameter erh"alt man eine Liste der bereits
13997      vorhandenen Namen.}
13998\item{Soll der Prozessorname vollst"andig in der Variablen \tty{MOMCPU}
13999      auftauchen, so darf er au"ser am Anfang keine Buchstaben au"serhalb
14000      des Bereiches von A..F enthalten.  In der Variablen \tty{MOMCPUNAME}
14001      liegt aber zur Assemblierzeit immer der volle Name vor.
14002      Sonderzeichen sind generell nicht erlaubt, Kleinbuchstaben
14003      werden vom CPU-Befehl bei der Eingabe in Gro"sbuchtaben umgewandelt
14004      und sind daher auch nicht im Prozessornamen sinnvoll.}
14005\end{enumerate}
14006
14007Der erste Schritt der Registrierung ist die Eintragung des Prozessors oder
14008der Prozessorfamilie in der Datei {\tt headids.c}.  Wie bereits erw"ahnt,
14009wird diese Datei von den Hilfsprogrammen mitbenutzt und spezifiziert die
14010einer Prozessorfamilie zugeordnete Kenn-ID in Codedateien sowie das zu
14011verwendende Hex-Format.  Bei der Wahl der Kenn-ID w"urde ich mir etwas
14012Absprache w"unschen...
14013
14014\subsubsection{Definition des Codegeneratormoduls}
14015
14016Das Modul, das f"ur den neuen Prozessor zust"andig sein soll, sollte einer
14017gewissen Einheitlichkeit wegen den Namen \tty{code....} tragen, wobei
14018\tty{.....} etwas mit dem Prozessornamen zu tun haben sollte.  Den Kopf
14019mit den Includes "ubernimmt man am besten direkt aus einem bereits
14020vorhandenen Codegenerator.
14021
14022Mit Ausnahme einer Initialisierungsfunktion, die zu Anfang der {\tt
14023main()}-Funktion im Modul {\tt as.c} aufgerufen werden mu"s, braucht das
14024neue Modul keinerlei Funktionen oder Variablen zu exportieren, da die
14025ganze Kommunikation zur Laufzeit "uber indirekte Spr"unge abgewickelt
14026wird.  Die dazu erforderlichen Registrierungen m"ussen in der
14027Initialisierungsfunktion des Moduls vorgenommen werden, indem f"ur jeden
14028von der Unit zu behandelnden Prozessortyp
14029ein Aufruf der Funktion \tty{AddCPU} erfolgt:
14030\begin{verbatim}
14031   CPUxxxx = AddCPU("XXXX", SwitchTo_xxxx);
14032\end{verbatim}
14033\tty{'XXXX'} ist dabei der f"ur den Prozessor festgelegte Name, der sp"ater
14034im Assemblerprogramm verwendet werden mu"s, um AS auf diesen Zielprozessor
14035umzuschalten.  \tty{SwitchTo\_xxxx} (im folgenden kurz als ,,Umschalter''
14036bezeichnet) ist eine parameterlose Prozedur, die von AS aufgerufen wird,
14037sobald auf diesen Prozessor umgeschaltet werden soll.  Als Ergebnis liefert
14038\tty{AddCPU} eine Zahlenwert, der als interne ,,Kennung'' f"ur diesen Prozessor
14039fungiert.  In der globalen Variablen \tty{MomCPU} wird st"andig die Kennung
14040des momentan gesetzten Zielprozessors mitgef"uhrt.  Der von \tty{AddCPU}
14041gelieferte Wert sollte in einer privaten Variable des Typs \tty{CPUVar} (hier
14042\tty{CPUxxxx} genannt) abgelegt werden.  Falls ein Codegeneratormodul
14043verschiedene Prozessoren (z.B. einer Familie) verwaltet, kann es so
14044durch Vergleich von \tty{MomCPU} gegen diese Werte feststellen, welche
14045Befehlsuntermenge momentan zugelassen ist.
14046\par
14047Dem Umschalter obliegt es, AS auf den neuen Zielprozessor ,,umzupolen''.
14048Dazu m"ussen im Umschalter einige globale Variablen besetzt werden:
14049\begin{itemize}
14050\item{\tty{ValidSegs} : Nicht alle Prozessoren definieren alle von AS
14051      unterst"utzten Adre"sr"aume.  Mit dieser Menge legt man fest,
14052      welche Untermenge f"ur den jeweiligen Prozessor von \tty{SEGMENT}-Befehl
14053      zugelassen wird.  Im mindesten mu"s das Code-Segment freigeschaltet
14054      werden.  Die Gesamtmenge aller vorhandenen Segmenttypen kann in der
14055      Datei \tty{fileformat.h} nachgelesen werden (\tty{Seg}.....-Konstanten).}
14056\item{\tty{SegInits} : Dieses Feld speichert die initialen (ohne \tty{ORG}-Befehl)
14057      Startadressen in den einzelnen Segmenten.  Nur in Ausnahmef"allen
14058      (physikalisch "uberlappende, aber logisch getrennte Adre"sr"aume)
14059      sind hier andere Werte als 0 sinnvoll.}
14060\item{\tty{Grans} : Hiermit kann f"ur jedes Segment die Gr"o"se des kleinsten
14061      adressierbaren Elements in Bytes festgelegt werden, d.h. die
14062      Gr"o"se des Elements, f"ur das eine Adresse um eins erh"oht wird.
14063      Bei den allermeisten Prozessoren (auch 16 oder 32 Bit) ist dies
14064      ein Byte, nur z.B. Signalprozessoren und die PICs fallen aus dem
14065      Rahmen.}
14066\item{\tty{ListGrans} : Hiermit kann wieder f"ur alle Segmente getrennt
14067      festgelegt werden, in was f"ur Gruppen die Bytes im Assemblerlisting
14068      dargestellt werden sollen.  Beim 68000 sind z.B. Befehle immer
14069      ein mehrfaches von 2 Bytes lang, weshalb die entsprechende Variable
14070      auf 2 gesetzt ist.}
14071\item{\tty{SegLimits} : Dieses Feld legt die h"ochste Adresse f"ur jedes
14072      Segment fest, z.B. 65535 f"ur einen 16-Bit-Adre"sraum.  Dieses Feld
14073      braucht nicht ausgef"ullt zu werden, wenn der Codegenerator die {\tt
14074      ChkPC}-Methode selber "ubernimmt.}
14075\item{\tty{ConstMode} : Diese Variable kann die Werte \tty{ConstModeIntel},
14076      \tty{ConstModeMoto} oder \tty{ConstModeC} haben und bestimmt, in
14077      welcher Form Zahlensysteme bei Integerkonstanten spezifiziert werden
14078      sollen (sofern das Programm nicht vom Relaxed-Modus Gebrauch macht).}
14079\item{\tty{PCSymbol} : Diese Variable enth"alt den String, mit dem aus dem
14080      Assembler-Programm heraus der momentane Stand des Programmz"ahlers
14081      abgefragt werden kann.  F"ur Intel-Prozessoren ist dies z.B. ein
14082      Dollarzeichen.}
14083\item{\tty{TurnWords} : Falls der Prozessor ein Big-Endian-Prozessor sein
14084      sollte und eines der Elemente von \tty{ListGrans} ungleich eins ist,
14085      sollte dieses Flag auf True gesetzt werden, um korrekte Code-Dateien
14086      zu erhalten.}
14087\item{\tty{SetIsOccupiedFnc} : Einige Prozessoren verwenden \tty{SET} als
14088      Maschinenbefehl.  Ist dieser Callback gesetzt, so kann der Codegenerator
14089      dar"uber melden, da"s \tty{SET} nicht als Pseudo-Befehl interpretiert
14090      werden soll.  Der R"uckgabewert kann konstant \tty{True} sein, die
14091      Entscheidung kann aber auch z.B. anhand der Anzahl der Argumente fallen.}
14092\item{\tty{HeaderID} : Dieses Byte enth"alt die Kennung, mit der in der Codedatei
14093      die Prozessorfamilie gekennzeichnet wird (siehe Abschnitt
14094      \ref{SectCodeFormat}).  Um Zweideutigkeiten zu vermeiden,
14095      bitte ich, den Wert mit mir abzusprechen.  Bis auf weiteres sollten
14096      keine Werte au"serhalb des Bereiches \$01..\$7f benutzt werden,
14097      diese sind f"ur Sonderzwecke (wie z.B. eine zuk"unftige Erweiterung
14098      um einen Linker) reserviert.  Auch wenn dieser Wert in den meisten
14099      "alteren Codegeneratoren hart gesetzt wird, ist es die heute
14100      bevorzugte Methode, den Wert aus {\tt headids.h} per {\tt
14101      FindFamilyByName} zu holen.}
14102\item{\tty{NOPCode} : In bestimmten Situationen kann es sein, da"s AS unbenutzte
14103      Bereiche im Code mit NOPs auff"ullen mu"s.  Diese Variable beinhaltet
14104      den dazu erforderlichen Code.}
14105\item{\tty{DivideChars} : Dieser String enth"alt all jene Zeichen, die als
14106      Trennzeichen f"ur die Parameter eines Assemblerbefehls zugelassen
14107      sind.  Nur f"ur extreme Ausrei"ser (wie den DSP56) sollte sich in
14108      diesem String etwas anderes finden als ein Komma.}
14109\item{\tty{HasAttrs} : Einige Prozessoren wie die 68k-Reihe teilen einen
14110      Maschinenbefehl durch einen Punkt noch weiter in Mnemonic und
14111      Attribut auf.  Ist dies beim neuen Prozessor auch der Fall, so
14112      ist dieses Flag auf True zu setzen.  AS liefert dann die Einzelteile
14113      in den Variablen \tty{OpPart} und \tty{AttrPart}.  Setzt man es
14114      dagegen auf False, so bleibt der Befehl in \tty{OpPart} zusammen,
14115      und \tty{AttrPart} ist immer leer.  Sofern der Prozessor keine
14116      Attribute verwendet, sollte man \tty{HasAttrs} auf jeden Fall auf False
14117      setzen, da man sich sonst die M"oglichkeit nimmt, Makros mit einem
14118      Punkt im Namen (z.B. zur Emulation anderer Assembler) zu definieren.}
14119\item{\tty{AttrChars} : Falls \tty{HasAttrs} gesetzt wurde, m"ussen in diesem
14120      String alle Zeichen eingetragen werden, die das Attribut vom Befehl
14121      trennen k"onnen.  Meist ist dies nur der Punkt.}
14122\end{itemize}
14123Gehen Sie nicht davon aus, da"s eine dieser Variablen einen vordefinierten
14124Wert hat, sondern besetzen Sie \bb{ALLE} Felder neu!!
14125
14126Neben diesen Variablen m"ussen noch einige Funktionszeiger besetzt wird,
14127mit denen der Codegenerator sich in AS einbindet:
14128\begin{itemize}
14129\item{\tty{MakeCode} : Diese Routine wird nach der Zerlegung einer Zeile
14130      in Mnemonic und Parameter aufgerufen.  Das Mnemonic liegt in der
14131      Variablen \tty{OpPart}, die Parameter in dem Feld \tty{ArgStr}.
14132      Die Zahl der Parameter kann aus der Variablen \tty{ArgCnt} ausgelesen
14133      werden.  Das bin"are Ergebnis mu"s in dem Byte-Feld \tty{BAsmCode}
14134      abgelegt werden, dessen L"ange in der Variablen \tty{CodeLen}.  Falls
14135      der Prozessor wortorientiert wie der 68000 oder viele Signalprozessoren
14136      ist, kann Feld auch wortweise als \tty{WAsmCode} adressiert werden.
14137      F"ur ganz extreme F"alle gibt es auch noch \tty{DAsmCode}... Die
14138      Codel"ange wird ebenfalls in solchen Einheiten angegeben.}
14139\item{\tty{SwitchFrom}: Diese parameterlose Prozedur erlaubt dem
14140      Codegeneratormodul, noch ,,Aufr"aumarbeiten'' durchzuf"uhren,
14141      wenn auf einen anderen Zielprozessor umgeschaltet wird.  So
14142      kann man an dieser Stelle z.B. Speicher freigeben, der im
14143      Umschalter belegt wurde und nur ben"otigt wird, w"ahrend dieses
14144      Codegeneratormodul aktiv ist.  Im einfachsten Fall zeigt diese
14145      Prozedurvariable auf eine leere Prozedur.  Ein Beispiel f"ur die
14146      Anwendung dieser Prozedur finden Sie im Modul \tty{CODE370}, das
14147      seine Codetabellen dynamisch erzeugt und wieder freigibt.}
14148\item{\tty{IsDef} : Bestimmte Prozessoren kennen neben \tty{EQU} noch weitere
14149      Pseudobefehle, bei denen ein in der ersten Spalte stehender
14150      Symbolname kein Label darstellt, z.B. \tty{BIT} beim 8051.  Diese
14151      Funktion mu"s TRUE zur"uckliefern, falls ein solcher, zus"atzlicher
14152      Befehl vorliegt.  Im einfachsten Fall braucht nur FALSE
14153      zur"uckgeliefert zu werden.}
14154\end{itemize}
14155
14156Optional kann ein Codegenerator auch noch folgende weitere Funktionszeiger
14157besetzen:
14158\begin{itemize}
14159\item{\tty{ChkPC} : Obwohl AS die Programmz"ahler intern durchg"angig mit
14160      32 oder 64 Bit verwaltet, benutzen die meisten Prozessoren nur einen
14161      kleineren Adre"sraum.  Diese Funktion liefert AS Informationen, ob
14162      der momentane Programmz"ahler den erlaubten Bereich "uberschritten
14163      hat.  Bei Prozessoren mit mehreren Adre"sr"aumen kann diese Routine
14164      nat"urlich deutlich komplizierter ausfallen.  Ein Beispiel daf"ur
14165      findet sich z.B. im Modul \tty{code16c8x.c}.  Falls alles in Ordnung ist,
14166      mu"s die Funktion TRUE zur"uckliefern, ansonsten FALSE.
14167      Diese Funktion mu"s ein Codegenerator nur implementieren, wenn er
14168      das Feld {\tt SegLimits} nicht belegt.  Das kann z.B. notwendig
14169      werden, wenn der g"ultige Adre"sbereich eines Segments nicht
14170      zusammenh"angend ist.}
14171\item{\tty{InternSymbol} : Manche Prozessoren, z.B. solche mit einer
14172      Registerbank im internen RAM, defineren diese 'Register' als Symbole
14173      vor, und es w"urde wenig Sinn machen, diese in einer separaten
14174      Include-Datei mit 256 oder m"oglicherweise noch mehr {\tt EQU}s
14175      zu definieren.  Mit dieser Funktion erh"alt man Zugang zum Formel-
14176      Parser von AS: Sie erh"alt den Ausdruck als ASCII-String, und wenn
14177      sie eines der 'eingebauten Symbole' erkennt, besetzt sie die
14178      "ubergebene Struktur des Typs {\em TempResult} entsprechend.  Falls
14179      die "Uberpr"ufung nicht erfolgreich war, mu"s deren Element {\tt
14180      Typ} auf {\tt TempNone} gesetzt werden.  Die Routine sollte im
14181      Falle eines Mi"serfolges {\em keine} Fehlermeldungen ausgeben, weil
14182      dies immer noch anderweitig g"ultige Symbole sein k"onnen.  Seien
14183      Sie extrem vorsichtig mit dieser Routine, da sie einen Eingriff in
14184      den Parser darstellt!}
14185\item{\tty{DissectBit} : Falls die Zielplattform Bit-Objekte unterst"utzt,
14186      d.h. Objekte, die sowohl eine Register/Speicheradresse als auch eine
14187      Bitposition in einer einzelnen Integer-Zahl gepackt abspeichern, ist
14188      dies der Callback, "uber den solche gepackten Objekte f"urs Listing
14189      wieder in eine Quellcode-artige Form r"uck"ubersetzt werden.}
14190\item{\tty{DissectReg} : Falls die Zielplattform Registersymbole unterst"utzt,
14191      ist dies der Callback, "uber den Registernummer und -l"ange f"urs Listing
14192      wieder in eine Quellcode-artige Form r"uck"ubersetzt werden.
14193      Falls Registersymbole unterst"utzt werden, ist "ublicherweise auch
14194      der \tty{InternSymbol}-Callback auszuf"ullen.}
14195\item{\tty{QualifyQuote} : "Uber diesen optionalen Callback kann f"ur
14196      eine bestimmte Zielplattform von Fall zu Fall festgelegt werden, da"s
14197      ein einzelnes Hochkomma {\em keine} Zeichenkette einleitet.  Ein
14198      Beispiel daf"ur ist die als \tty{AF'} geschriebene alternative
14199      Registerbank beim Z80, oder die Hexadezimal-Syntax \tty{H'...} bei
14200      manchen Hitachi-Prozessoren.}
14201\end{itemize}
14202
14203Wer will, kann sich "ubrigens auch mit einem Copyright-Eintrag verewigen,
14204indem er in der Initialisierung des Moduls (bei den \tty{AddCPU}-Befehlen)
14205einen Aufruf der Prozedur \tty{AddCopyright} einf"ugt, in der folgenden
14206Art:
14207\begin{verbatim}
14208    AddCopyright("Intel 80986-Codegenerator (C) 2010 Hubert Simpel");
14209\end{verbatim}
14210Der "ubergebene String wird dann nach dem Programmstart zus"atzlich zu
14211der Standardmeldung ausgegeben.
14212
14213Bei Bedarf kann sich das Modul im Initialisierungsteil noch in die
14214Kette aller Funktionen eintragen, die vor Beginn eines Durchlaufes
14215durch den Quelltext ausgef"uhrt werden.  Dies ist z.B. immer dann der
14216Fall, wenn die Code-Erzeugung im Modul abh"angig vom Stand bestimmter,
14217durch Pseudobefehle beeinflu"sbarer Flags ist.  Ein h"aufig auftretender
14218Fall ist z.B., da"s ein Prozessor im User- oder Supervisor-Modus
14219arbeiten kann, wobei im User-Modus bestimmte Befehle gesperrt
14220sind.  Im Assembler-Quelltext k"onnte dieses Flag, das angibt, in welchem
14221Modus der folgende Code ausgef"uhrt wird, durch einen Pseudobefehl
14222umgeschaltet werden.  Es ist aber dann immer noch eine Initialisierung
14223erforderlich, die sicherstellt, da"s in allen Durchl"aufen ein identischer
14224Ausgangszustand vorliegt.  Der "uber die Funktion \tty{AddInitPassProc}
14225angebotene Haken bietet die M"oglichkeit, derartige Initialisierungen
14226vorzunehmen.  Die "ubergebene Callback-Funktion wird vor Beginn
14227eines Durchgangs aufgerufen.
14228
14229Analog zu \tty{AddInitPassProc} funktioniert die "uber \tty{AddCleanUpProc}
14230aufgebaute Funktionsliste, die es den Codegeneratoren erlaubt, nach dem
14231Abschlu"s der Assemblierung noch Aufr"aumarbeiten (z.B. das Freigeben von
14232Literaltabellen o."a.) durchzuf"uhren.  Dies ist sinnvoll, wenn mehrere
14233Dateien mit einem Aufruf assembliert werden, sonst h"atte man noch
14234,,M"ull'' aus einem vorigen Lauf in den Tabellen.  Momentan nutzt kein
14235Modul diese M"oglichkeit.
14236
14237\subsubsection{Schreiben des Codegenerators selber}
14238
14239Nach diesen Pr"aliminarien ist nun endlich eigene Kreativit"at gefragt:
14240Wie Sie es schaffen, aus dem Mnemonic und den Argumenten die Code-Bytes zu
14241erzeugen, ist weitgehend Ihnen "uberlassen.  Zur Verf"ugung stehen daf"ur
14242nat"urlich "uber den Formelparser die Symboltabellen sowie die Routinen
14243aus
14244\tty{asmsub.c} und \tty{asmpars.c}.  Ich kann hier nur einige generelle
14245Hinweise geben:
14246\begin{itemize}
14247\item{Versuchen Sie, die Prozessorbefehle in Gruppen aufzusplitten, die
14248      gleiche Operanden erwarten und sich nur in einigen Kennbits
14249      unterscheiden.  Alle argumentlosen Befehle kann man z.B. so in einer
14250      Tabelle abhandeln.}
14251\item{Die meisten Prozessoren haben ein festes Repertoire von
14252      Adressierungsarten.  Verlagern Sie das Parsing eines Adre"sausdrucks
14253      in eine getrennte Unterroutine.}
14254\item{Die Routine \tty{WrError} definiert eine Vielzahl von m"oglichen
14255      Fehlermeldungen und ist bei Bedarf leicht erweiterbar.  Nutzen Sie
14256      das!  Bei allen Fehler nur lapidar einen ,,Syntaxfehler'' zu melden,
14257      n"utzt niemandem!}
14258\end{itemize}
14259Mit Sicherheit wird auch das Studium der vorhandenen Module weiterhelfen.
14260
14261\subsubsection{"Anderungen f"ur die Dienstprogramme}
14262
14263Eine winzige "Anderung ist auch noch an den Quellen der Dienstprogramme
14264n"otig, und zwar in der Routine {\tt Granularity()} in {\tt toolutils.c}:
14265Falls eines der Adre"sr"aume dieses Prozessors eine andere Granularit"at
14266als 1 hat, mu"s dort die Abfrage passend erg"anzt werden, sonst verz"ahlen
14267sich PLIST, P2BIN und P2HEX...
14268
14269%%---------------------------------------------------------------------------
14270
14271\section{Lokalisierung auf eine neue Sprache}
14272
14273Sie haben Interesse an diesem Thema?  Wunderbar!  Das ist eine Sache, die
14274von Programmierern gerne au"sen vor gelassen wird, insbesondere, wenn sie
14275aus dem Land der unbegrenzten M"oglichkeiten kommen...
14276
14277Die Lokalisierung auf eine neue Sprache gliedert sich in zwei Teile: Die
14278Anpassung der Programmmeldungen sowie die "Ubersetzung der Anleitung.
14279Letzteres ist sicherlich eine Aufgabe herkulischen Ausma"ses, aber die
14280Anpassung der Programmeldungen solle in ein bis zwei Nachmittagen "uber
14281die B"uhne zu bekommen sein, wenn man sowohl die neue als auch eine der
14282bisher vorhandenen Sprachen gut kennt.  Leider ist die "Ubersetzung auch
14283nichts, was man St"uck f"ur St"uck machen kann, denn der
14284Ressourcencompiler kann im Moment nicht mit einer variablen Zahl von
14285Sprachen in den verschiedenen Meldungen umgehen, es hei"st also 'alles
14286oder nichts'.
14287
14288Als erstes erg"anzt man in {\tt header.res} die neue Sprache.  Die f"ur
14289die Sprache passende zweibuchstabige Abk"urzung holt man sich vom
14290n"achsten Unix-System (wenn man nicht ohnehin darauf arbeitet...), die
14291internationale Vorwahl aus dem n"achsten DOS-Handbuch.
14292
14293Im zweiten Schritt geht man jetzt durch alle anderen {\tt .res}-Dateien
14294und erg"anzt die {\tt Message}-Statements.  Nocheinmal sei darauf
14295hingewiesen, Sonderzeichen in der HTML-artigen Schreibweise und nicht
14296direkt einzusetzen!
14297
14298Wenn dies geschafft ist, kann man mit einem {\em make} alle betroffenen
14299Teile neu bauen und erh"alt danach einen Assembler, der eine Sprache mehr
14300schickt.  Bitte nicht vergessen, die Ergebnisse an mich weiterzuleiten,
14301damit mit der n"achsten Release alle etwas davon haben :-)
14302
14303%%===========================================================================
14304
14305\cleardoublepage
14306
14307\begin{thebibliography}{99}
14308
14309\input{../doc_COM/biblio.tex}
14310
14311\end{thebibliography}
14312
14313\cleardoublepage
14314
14315\begin{quote}{\it
14316''Ich schlage vor, dem Parlament ein Gesetz vorzulegen, \\
14317das einem Autor, der ein Buch ohne Index publiziert, \\
14318das Copyright entzieht und ihn au"serdem f"ur sein Vergehen \\
14319mit einer Geldstrafe belegt.''\\
14320\hspace{2cm} --Lord John Campbell}\end{quote}
14321
14322\printindex
14323
14324\end{document}
14325
14326