Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. %%TITLE Bedienungsanleitung Makroassembler AS
  2. \documentclass[12pt,a4paper,twoside]{report}
  3. %% Try \usepackage[german]{babel} if your Tex distribution does not provide the german sty file:
  4. \usepackage{german}
  5. \usepackage{makeidx}
  6. \usepackage{hyperref}
  7. \usepackage{longtable}
  8. \pagestyle{headings}
  9. \sloppy
  10. \textwidth 15cm
  11. \evensidemargin 0.5cm
  12. \oddsidemargin 0.5cm
  13. \topsep 1mm
  14. \parskip 0.3cm plus0.2cm minus0.2cm
  15.  
  16. \hyphenation{Lis-ting-er-zeu-gung}
  17. \hyphenation{back-slash}
  18.  
  19. \newif\ifelektor
  20. \elektorfalse
  21.  
  22. \newcommand{\ii}[1]{{\it #1}}
  23. \newcommand{\bb}[1]{{\bf #1}}
  24. \newcommand{\tty}[1]{{\tt #1}}
  25. \newcommand{\tin}[1]{{\scriptsize #1}}
  26. \newcommand{\ttindex}[1]{\index{#1@{\tt #1}}}
  27. \newcommand{\asname}{AS}
  28.  
  29. \font\mengft=cmss9 scaled \magstep1
  30. \def \rz{\hbox{\mengft{I \hskip -1.7mm R}}}
  31. \makeindex
  32.  
  33. %%===========================================================================
  34.  
  35. \begin{document}
  36.  
  37. \thispagestyle{empty}
  38.  
  39. \
  40. \vspace{7cm}\par
  41.  
  42. \begin{raggedright}
  43. {\large Alfred Arnold}\\
  44. \vspace{1cm}\par
  45. {\huge Makroassembler \asname{} V1.42}\\
  46. \rule{14cm}{0.3mm}\\
  47. \vspace{2mm}\par
  48. {\huge Benutzeranleitung}
  49.  
  50. \vspace{1cm}\par
  51.  
  52. {\large Stand Januar 2025}
  53. \end{raggedright}
  54.  
  55. \clearpage
  56. \thispagestyle{empty}
  57.  
  58. \ \vspace{4cm}
  59.  
  60. {\em IBM, PPC403Gx, OS/2} und {\em PowerPC} sind eingetragene Warenzeichen
  61. der IBM Corporation.
  62.  
  63. {\em Intel, MCS-48, MCS-51, MCS-251, MCS-96, MCS-196} und {\em MCS-296}
  64. sind eingetragene Warenzeichen der Intel Corp. .
  65.  
  66. {\em Motorola} und {\em ColdFire} sind eingetragene Warenzeichen von
  67. Motorola Inc. .
  68.  
  69. {\em MagniV} ist ein eingetragenes Warenzeichen von Freescale Semiconductor.
  70.  
  71. {\em PicoBlaze} ist ein eingetragenes Warenzeichen der Xilinx Inc.
  72.  
  73. {\em eZ80} und {\em Z80} sind eingetragene Warenzeichen von Zilog Inc.
  74.  
  75. {\em UNIX} ist ein eingetragenes Warenzeichen der Open Group.
  76.  
  77. {\em Linux} ist ein eingetragenes Warenzeichen von Linus Thorvalds.
  78.  
  79. {\em Microsoft, Windows} und {\em MS-DOS} sind eingetragene Warenzeichen
  80. der Microsoft Corporation.
  81.  
  82. Alle anderen Warenzeichen, die nicht ausdr"ucklich in diesem Abschnitt
  83. genannt wurden und in diesem Handbuch verwendet werden, sind Eigentum
  84. der entsprechenden Eigent"umer.
  85.  
  86. \vspace{6cm}
  87.  
  88. Dieses Dokument wurde mit dem LaTeX-Satzsystem unter dem Betriebssystem
  89. Linux angefertigt und formatiert.
  90.  
  91. \clearpage
  92.  
  93. %%===========================================================================
  94.  
  95. \ifelektor
  96. \thispagestyle{empty} \
  97. \clearpage
  98. \thispagestyle{empty} \
  99. \clearpage
  100. \fi
  101.  
  102. %%===========================================================================
  103.  
  104. {\parskip 0cm plus0.1cm \tableofcontents}
  105.  
  106. %%===========================================================================
  107.  
  108. \cleardoublepage
  109. \chapter{Allgemeines}
  110.  
  111. Diese Anleitung wendet sich an Programmierer, die bereits mit der Programmierung in Assembler
  112. vertraut sind und sich dar"uber informieren m"ochten, wie man mit \asname{} umgeht.  Sie
  113. hat eher die Form eines Referenz- und nicht Benutzerhandbuches.  Als solches
  114. macht sie weder den Versuch, die Sprache Assembler an sich zu erkl"aren, noch
  115. erl"autert sie die Architektur bestimmter Prozessoren.  Im Literaturverzeichnis
  116. habe ich weiterf"uhrende Literatur aufgelistet, die bei der Implementation der
  117. einzelnen Codegeneratoren ma"sgebend war.  Um Assembler von Grund auf zu
  118. lernen, kenne ich kein Buch; ich habe es im wesentlichen im ,,Trial and
  119. error''-Verfahren gelernt.
  120.  
  121. %%Nach einer kleineren Diskussion auf der Mailing-Liste und einigen Vorschl"agen
  122. %%habe ich beschlossen, mit ,,ACASM'' einen eigenen Vorschlag f"ur einen besseren
  123. %%Namen zu machen.  Es ist in der OpenSource-Szene ja gute Tradition, da"s die
  124. %%Abk"urzungen mehrere Deutungen gestatten.  Ein paar Vorschl"age:
  125. %%\begin{itemize}
  126. %%\item{,,AC'' k"onnte einfach f"ur meine Heimatstadt Aachen stehen, denn dies
  127. %%      ist Aachens KFZ-Kennzeichen;}
  128. %%\item{,,Another CPU'', wenn (mal wieder) ein neues Target dazugekommen ist;}
  129. %%\item{,,All Crap'', wenn man sich dar"uber ge"argert hat...}
  130. %%\item{...oder ,,Alfreds Cute Assembler'', wenn man unbedingt meinen Namen
  131. %%      damit in Verbindung bringen will...}
  132. %%\end{itemize}
  133.  
  134. %%---------------------------------------------------------------------------
  135.  
  136. \section{Lizenzbedingungen}
  137. \label{SectLicense}
  138.  
  139. Bevor es in medias res geht, erst einmal der unvermeidliche Prolog:
  140. \par
  141. \asname{} in der vorliegenden Version untersteht der GNU General Public License
  142. (GPL); die Details dieser Lizenz k"onnen Sie in der beiliegenden Datei
  143. COPYING nachlesen.  Falls Sie diese nicht mit \asname{} erhalten haben,
  144. beschweren Sie sich bei demjenigen, von dem Sie \asname{} erhalten haben!
  145. \par
  146. Kurz gesagt, beinhaltet die GPL folgende Punkte:
  147. \begin{itemize}
  148. \item{Auf \asname{} aufbauende Programme m"ussen ebenfalls der GPL unterstehen;}
  149. \item{Weiterverbreitung ausdr"ucklich erlaubt;}
  150. \item{expliziter Haftungsausschlu"s f"ur durch die Anwendung dieses
  151.      Programms entstehende Sch"aden.}
  152. \end{itemize}
  153. ...aber f"ur die Details bitte ich wirklich, in den Originaltext der GPL
  154. zu schauen!
  155. \par
  156. Um eine m"oglichst schnelle Fehlerdiagnose und -korrektur zu erm"oglichen,
  157. bitte ich, Fehlerberichten folgende Angaben beizuf"ugen:
  158. \begin{itemize}
  159. \item{Betriebssystem (DOS, Windows, Linux...) mit Version}
  160. \item{benutzte Version von \asname{} bzw. Datum des EXE-Files}
  161. \item{bei selbst kompilierten Versionen: verwendeter Compiler und Version}
  162. \item{m"oglichst die Quelldatei, bei der der Fehler auftritt}
  163. \end{itemize}
  164. Zu erreichen bin ich folgenderma"sen:
  165. \begin{itemize}
  166. \item{per Post: \begin{description}
  167.                \item{Alfred Arnold}
  168.                \item{Hirschgraben 29}
  169.                \item{52062 Aachen}
  170.                \end{description}}
  171. \item{per E-Mail: \tty{alfred@ccac.rwth-aachen.de}}
  172. \end{itemize}
  173. Wer mir pers"onlich Fragen stellen will (und in der N"ahe von Aachen
  174. wohnt), kann dies mit hoher Wahrscheinlichkeit donnerstags von 20.00
  175. bis 21.00 Uhr im Computerclub an der RWTH Aachen (Elisabethstra"se 16,
  176. erster Stock, rechter Flur).
  177. \par
  178. Von Telefonanrufen bitte ich abzusehen.  Erstens, weil sich die
  179. komplizierten Zusammenh"ange am Telefon nur "au"serst schwer er"ortern
  180. lassen, und zweitens ist die Telekom schon reich genug...
  181. \par
  182. Die neueste Version von \asname{} (DPMI, Win32, C) findet sich auf folgendem
  183. Server:
  184. \begin{verbatim}
  185. http://john.ccac.rwth-aachen.de:8000/as
  186. \end{verbatim}
  187. oder auch kurz
  188. \begin{verbatim}
  189. http://www.alfsembler.de
  190. \end{verbatim}
  191. \par
  192. Wer "uber keinen FTP-Zugang verf"ugt, kann den Assembler auch von mir
  193. anfordern.  Ich werde aber nur Anfragen beantworten, die einen CD-Rohling
  194. und einen passenden, frankierten R"uckumschlag enthalten.  \bb{KEIN} Geld
  195. schicken!!!
  196. \par
  197. So. Nach diesem unvermeidlichen Vorwort k"onnen wir wohl beruhigt
  198. zur eigentlichen Anleitung schreiten:
  199.  
  200. %%---------------------------------------------------------------------------
  201.  
  202. \section{allgemeine F"ahigkeiten des Assemblers}
  203.  
  204. \asname{} bietet im Gegensatz zu normalen Assemblern die M"oglichkeit, Code
  205. f"ur v"ollig verschiedene Prozessoren zu erzeugen.  Momentan sind
  206. folgende Prozessorfamilien implementiert:
  207. \begin{itemize}
  208. \item{Motorola 68000..68040, 683xx, Coldfire inkl. Koprozessor und MMU}
  209. \item{Motorola ColdFire}
  210. \item{Motorola DSP5600x,DSP56300}
  211. \item{Motorola/IBM MPC601/MPC505/PPC403/MPC821}
  212. \item{IBM PALM}
  213. \item{Motorola M-Core}
  214. \item{Motorola 6800, 6801, 68(HC)11(K4) sowie Hitachi 6301}
  215. \item{Motorola/Freescale 6805, 68HC(S)08}
  216. \item{Motorola 6809 / Hitachi 6309}
  217. \item{Motorola/Freescale 68HC12(X) inklusive XGATE}
  218. \item{Freescale/NXP S12Z (''MagniV'')}
  219. \item{Freescale 68RS08}
  220. \item{Motorola 68HC16}
  221. \item{Konami 052001}
  222. \item{Hitachi H8/300(H)}
  223. \item{Hitachi H8/500}
  224. \item{Hitachi SH7000/7600/7700}
  225. \item{Hitachi HMCS400}
  226. \item{Hitachi H16}
  227. \item{Rockwell 6502, 65(S)C02, Commodore 65CE02, WDC W65C02S, Rockwell 65C19 und
  228.      Hudson HuC6280}
  229. \item{Rockwell PPS-4}
  230. \item{CMD 65816}
  231. \item{Mitsubishi MELPS-740}
  232. \item{Mitsubishi MELPS-7700}
  233. \item{Mitsubishi MELPS-4500}
  234. \item{Mitsubishi M16}
  235. \item{Mitsubishi M16C}
  236. \item{DEC PDP-11}
  237. \item{DEC VAX}
  238. \item{Western Digital WD16}
  239. \item{Intel 4004/4040}
  240. \item{Intel MCS-48/41, einschlie"slich Siemens SAB80C382 und der
  241.      OKI-Varianten}
  242. \item{Intel MCS-51/251, Dallas DS80C390}
  243. \item{Intel MCS-96/196(Nx)/296}
  244. \item{Intel 8080/8085}
  245. \item{Intel i960}
  246. \item{Signetics 8X30x}
  247. \item{Signetics 2650}
  248. \item{Philips XA}
  249. \item{Atmel (Mega-)AVR}
  250. \item{AMD 29K}
  251. \item{Siemens 80C166/167}
  252. \item{Zilog Z80 (einschlie"slich undokumentierter Befehle), Z180, Z380, eZ80}
  253. \item{Sharp LR35902 (,,Gameboy-Z80'')}
  254. \item{Sharp SC61860}
  255. \item{Sharp SC62015}
  256. \item{Zilog Z8, Super8, Z8 Encore}
  257. \item{Zilog Z8000}
  258. \item{Xilinx KCPSM/KCPSM3 ('PicoBlaze')}
  259. \item{LatticeMico8}
  260. \item{Toshiba TLCS-900(L)}
  261. \item{Toshiba TLCS-90}
  262. \item{Toshiba TLCS-870(/C)}
  263. \item{Toshiba TLCS-47}
  264. \item{Toshiba TLCS-9000}
  265. \item{Toshiba TC9331}
  266. \item{Microchip PIC16C54..16C57}
  267. \item{Microchip PIC16C84/PIC16C64}
  268. \item{Microchip PIC17C42}
  269. \item{Parallax SX20/SX28}
  270. \item{SGS M380/GI LP8000}
  271. \item{SGS-Thomson ST6}
  272. \item{SGS-Thomson ST7/STM8}
  273. \item{SGS-Thomson ST9}
  274. \item{SGS-Thomson 6804}
  275. \item{Texas Instruments TMS32010/32015}
  276. \item{Texas Instruments TMS3202x}
  277. \item{Texas Instruments TMS320C3x/TMS320C4x}
  278. \item{Texas Instruments TMS320C20x/TMS320C5x}
  279. \item{Texas Instruments TMS320C54x}
  280. \item{Texas Instruments TMS320C6x}
  281. \item{Texas Instruments TMS99xx/TMS99xxx}
  282. \item{Texas Instruments TMS7000}
  283. \item{Texas Instruments TMS1000}
  284. \item{Texas Instruments TMS370xxx}
  285. \item{Texas Instruments MSP430(X)}
  286. \item{National Semiconductor IMP-16}
  287. \item{National Semiconductor IPC-16 ('PACE'), INS8900}
  288. \item{National Semiconductor SC/MP}
  289. \item{National Semiconductor INS807x}
  290. \item{National Semiconductor COP4}
  291. \item{National Semiconductor COP8}
  292. \item{National Semiconductor SC144xx}
  293. \item{National Semiconductor NS32xxx}
  294. \item{Olympia CP-3F (bzw. SGS M380, GI LP8000)}
  295. \item{Fairchild ACE}
  296. \item{Fairchild F8}
  297. \item{NEC $\mu$PD78(C)0x/$\mu$PD78(C)1x}
  298. \item{NEC $\mu$COM-43/44/45}
  299. \item{NEC $\mu$PD75xx}
  300. \item{NEC $\mu$PD75xxx (alias 75K0)}
  301. \item{NEC 78K0}
  302. \item{NEC 78K2}
  303. \item{NEC 78K3}
  304. \item{NEC 78K4}
  305. \item{NEC $\mu$PD7720/7725}
  306. \item{NEC $\mu$PD77230}
  307. \item{NEC V60}
  308. \item{Fujitsu F$^2$MC8L}
  309. \item{Fujitsu F$^2$MC16L}
  310. \item{OKI OLMS-40}
  311. \item{OKI OLMS-50}
  312. \item{Panafacom MN1610/MN1613}
  313. \item{Renesas RX}
  314. \item{Padauk PMS/PMC/PFSxxx}
  315. \item{Symbios Logic SYM53C8xx (ja, die kann man programmieren!)}
  316. \item{Intersil CDP1802/1804/1805(A)}
  317. \item{Intersil IM6100/6120}
  318. \item{XMOS XS1}
  319. \item{MIL STD 1750}
  320. \item{KENBAK-1}
  321. \item{GI CP-1600}
  322. \item{HP Nano Processor}
  323. \end{itemize}
  324. in Arbeit / Planung / "Uberlegung :
  325. \begin{itemize}
  326. \item{ARM}
  327. \item{Analog Devices ADSP21xx}
  328. \item{DEC VAX}
  329. \item{SGS-Thomson ST20}
  330. \item{Texas Instruments TMS320C8x}
  331. \item{Zilog eZ80}
  332. \end{itemize}
  333. ungeliebt, aber {\it doch} vorhanden :
  334. \begin{itemize}
  335. \item{Intel 8086, 80186, NEC V30..V55 inkl. Koprozessor 8087}
  336. \end{itemize}
  337. Die Umschaltung des Codegenerators darf dabei auch mitten in der Datei
  338. erfolgen, und das beliebig oft!
  339. \par
  340. Der Grund f"ur diese Flexibilit"at ist, da"s \asname{} eine Vorgeschichte hat,
  341. die auch in der Versionsnummer deutlich wird: \asname{} ist als Erweiterung eines
  342. Makroassemblers f"ur die 68000er-Familie entstanden.  Auf besonderen
  343. Wunsch habe ich den urspr"unglichen Assembler um die F"ahigkeit zur
  344. "Ubersetzung von 8051-Mnemonics erweitert, und auf dem Weg (Abstieg?!) vom
  345. 68000 zum 8051 sind eine Reihe anderer fast nebenbei abgefallen...die
  346. restlichen Prozessoren wurden allesamt auf Benutzeranfrage hin integriert.
  347. Zumindest beim prozessorunabh"angigen Kern kann man also getrost davon
  348. ausgehen, da"s er gut ausgetestet und von offensichtlichen Bugs frei ist.
  349. Leider habe ich aber h"aufig mangels passender Hardware nicht die
  350. M"oglichkeit, einen neuen Codegenerator praktisch zu testen, so da"s bei
  351. Neuerungen "Uberraschungen nie ganz auszuschlie"sen sind.  Das in
  352. Abschnitt \ref{SectLicense} gesagte hat also schon seinen Grund...
  353. \par
  354. Diese Flexibilit"at bedingt ein etwas exotisches Code-Format, f"ur dessen
  355. Bearbeitung ich einige Tools beigelegt habe.  Deren Beschreibung findet
  356. sich in Abschnitt \ref{ChapTools}.
  357. \par
  358. \asname{} ist ein Makroassembler, d.h. dem Programmierer ist die M"oglichkeit
  359. gegeben, sich mittels Makros neue ,,Befehle'' zu definieren.  Zus"atzlich
  360. beherrscht er die bedingte Assemblierung.  Labels in Makror"umpfen werden
  361. automatisch als lokal betrachtet.
  362. \par
  363. Symbole k"onnen f"ur den Assembler sowohl Integer-, String- als auch
  364. Gleitkommawerte haben.  Diese werden --- wie Zwischenergebnisse bei Formeln
  365. --- mit einer Breite von 32 Bit f"ur Integerwerte, 80/64 Bit f"ur
  366. Gleitkommawerte und 255 Zeichen f"ur Strings gespeichert.  F"ur eine Reihe
  367. von Mikrokontrollern besteht die M"oglichkeit, durch Segmentbildung die
  368. Symbole bestimmten Klassen zuzuordnen.  Dem Assembler kann man auf diese
  369. Weise die --- begrenzte --- M"oglichkeit geben, Zugriffe in falsche
  370. Adre"sr"aume zu erkennen.
  371. \par
  372. Der Assembler kennt keine expliziten Beschr"ankungen bzgl.
  373. Verschachtelungstiefe von Include-Dateien oder Makros, eine Grenze bildet
  374. lediglich die durch den Hauptspeicher beschr"ankte Rekursionstiefe.
  375. Ebenso gibt es keine Grenze f"ur die Symboll"ange, diese wird nur durch
  376. die maximale Zeilenl"ange begrenzt.
  377. \par
  378. Ab Version 1.38 ist \asname{} ein Mehrpass-Assembler.  Dieser hochtrabende Begriff
  379. bedeutet nicht mehr, als das die Anzahl der Durchg"ange durch die Quelltexte
  380. nicht mehr zwei sein mu"s.  Sind keine Vorw"artsreferenzen im Quellcode
  381. enthalten, so kommt \asname{} mit einem Durchgang aus.  Stellt sich dagegen im zweiten
  382. Durchgang heraus, da"s ein Befehl mit einer k"urzeren oder l"angeren Kodierung
  383. benutzt werden mu"s, so wird ein dritter (vierter, f"unfter...) Durchgang
  384. eingelegt, um alle Symbolreferenzen richtig zu stellen.  Mehr steckt hinter dem
  385. Begriff ,,Multipass'' nicht...er wird im weiteren Verlauf dieser Anleitung
  386. deswegen auch nicht mehr auftauchen.
  387. \par
  388. Nach soviel Lobhudelei ein dicker Wermutstropfen: \asname{} erzeugt keinen
  389. linkf"ahigen Code.  Eine Erweiterung um einen Linker w"are mit erheblichem
  390. Aufwand verbunden und ist momentan nicht in Planung.
  391. \par
  392. Wer einen Blick in die Quellen von \asname{} werfen will, besorge sich einfach
  393. die Unix-Version von \asname{}, die als Quelltext zum Selber "ubersetzen kommt.
  394. Die Quellen sind mit Sicherheit nicht in einem Format, da"s das
  395. Verst"andnis m"oglichst leicht macht - an vielen Stellen schaut noch
  396. der originale Pascal-Quellcode heraus, und ich teile einige h"aufig
  397. vertretene Ansichten "uber 'guten' C-Stil nicht...
  398.  
  399. %%----------------------------------------------------------------------
  400.  
  401. \section{Unterst"utzte Plattformen}
  402.  
  403. Obwohl \asname{} als ein reines DOS-Programm \marginpar{{\em DOS}} angefangen
  404. hat, stehen auch eine Reihe von Versionen zur Verf"ugung, die etwas mehr
  405. als den Real-Mode eines Intel-Prozessors ausnutzen k"onnen.  Diese sind in
  406. ihrer Benutzung soweit als m"oglich kompatibel gehalten zur DOS-Version,
  407. es ergeben sich nat"urlich bisweilen Unterschiede in der Installation und
  408. der Einbindung in die jeweilige Betriebssystemumgebung.  Abschnitte in
  409. dieser Anleitung, die nur f"ur eine bestimmte Version von \asname{} gelten, sind
  410. mit einer entsprechenden Randbemerkung (an diesem Absatz f"ur die
  411. DOS-Version) gekennzeichnet.  Im einzelnen existieren die folgenden,
  412. weiteren Versionen (die als getrennte Pakete distributiert werden):
  413.  
  414. F"ur den Fall, da"s \marginpar{{\em DPMI}} man bei der "Ubersetzung
  415. gro"ser, komplexer Programme unter DOS Speicherplatzprobleme bekommt,
  416. existiert eine DOS-Version, die mittels eines DOS-Extenders im Protected
  417. Mode abl"auft und so das komplette Extended Memory eines ATs nutzen kann.
  418. Die "Ubersetzung wird durch den Extender merklich langsamer, aber immerhin
  419. l"auft es dann noch...
  420.  
  421. F"ur Freunde von IBM's Betriebssystem OS/2 \marginpar{{\em OS/2}} gibt es
  422. eine native OS/2-Version von \asname{}.  Seit 1.41r8 ist diese nur eine volle
  423. 32-bittige OS/2-Anwendung, was nat"urlich zur Folge hat, da"s OS/2 2.x
  424. und ein 80386-Prozessor jetzt zwingend erforderlich sind.
  425.  
  426. Den reinen PC-Bereich verl"a"st man mit der \marginpar{{\em UNIX}}
  427. C-Version von \asname{}, die so gehalten wurde, da"s sie auf einer m"oglichst
  428. gro"sen Zahl von UNIX-artigen Systemen (dazu z"ahlt aber auch OS/2 mit dem
  429. emx-Compiler) ohne gro"sartige Verrenkungen "ubersetzbar ist.  Im
  430. Gegensatz zu den vorherigen Versionen (die auf den auf Anfrage
  431. erh"altlichen Pascal-Sourcen basieren) wird die C-Version im Quellcode
  432. ausgeliefert, d.h. man mu"s sich mittels eines Compilers selbst die
  433. Binaries erzeugen.  Dies ist aber (f"ur mich) der eindeutig einfachere
  434. Weg, als ein Dutzend Binaries f"ur Maschinen vorzukompilieren, auf die ich
  435. auch nicht immer Zugriff habe...
  436.  
  437. %%===========================================================================
  438.  
  439. \cleardoublepage
  440. \chapter{Benutzung des Assemblers}
  441.  
  442. \begin{quote}\begin{raggedright}{\it
  443. Scotty: Captain, we din\verb!'! can reference it! \\
  444. Kirk:   Analysis, Mr. Spock? \\
  445. Spock:  Captain, it doesn\verb!'!t appear in the symbol table. \\
  446. Kirk:   Then it\verb!'!s of external origin? \\
  447. Spock:  Affirmative. \\
  448. Kirk:   Mr. Sulu, go to pass two. \\
  449. Sulu:   Aye aye, sir, going to pass two. \\
  450. }\end{raggedright}\end{quote}
  451.  
  452. %%---------------------------------------------------------------------------
  453.  
  454. \section{Hardware-Anforderungen}
  455.  
  456. Je nach Version von \asname{} variieren die Hardware-Anforderungen deutlich:
  457.  
  458. Die DOS-Version \marginpar{{\em DOS}} l"auft prinzipiell auf allen
  459. IBM-kompatiblen PCs, angefangen vom PC/XT mit vierkommawenig Megaherz bis
  460. hin zum Pentium.  Wie bei vielen anderen Programmen aber auch, steigt der
  461. Lustgewinn mit der Hardware-Ausstattung.  So d"urfte ein XT-Benutzer ohne
  462. Festplatte erhebliche Probleme haben, die "uber 500 Kbyte gro"se
  463. Overlay-Datei von \asname{} auf einer Diskette unterzubringen...eine Festplatte
  464. sollte der PC also schon haben, allein um vern"unftige Ladezeiten zu
  465. erreichen.  Im Hauptspeicherbedarf ist \asname{} recht gen"ugsam: Das Programm
  466. selber belegt knapp 300 Kbyte Hauptspeicher, \asname{} sollte also ab einer
  467. Hauptspeichergr"o"se von 512 Kbyte ausf"uhrbar sein.
  468.  
  469. Die Version von \asname{} f"ur das \marginpar{{\em DPMI}}
  470. DOS-Protected-Mode-Interface (DPMI) ben"otigt zum Ablaufen mindestens
  471. einen 80286-Prozessor und 1 Mbyte freies Extended Memory.  Daher stellen 2
  472. Mbyte Hauptspeicher das absolute Minimum dar, wenn man im XMS sonst keine
  473. anderen Spielereien (Platten-Cache, RAM-Disk, hochgeladenes DOS)
  474. installiert hat, sonst entsprechend mehr.  Falls man die DPMI-Version in
  475. einer DOS-Box von OS/2 laufen l"a"st, so sollte DPMI auch in den
  476. DOS-Einstellungen der Box erlaubt sein (Einstellung \tty{An} oder
  477. \tty{Auto}) und der Box eine entsprechende Menge von XMS-Speicher
  478. zugeordnet sein.  Die virtuelle Speicherverwaltung von OS/2 sorgt hier
  479. "ubrigens daf"ur, da"s man sich keine Gedanken machen mu"s, ob der
  480. eingestellte Speicher auch real verf"ugbar ist.
  481.  
  482. Die C-Version \marginpar{{\em UNIX}} von \asname{} wird im Quellcode ausgeliefert
  483. und erfordert damit ein Unix- oder OS/2-System mit einem C-Compiler.
  484. Der Compiler mu"s dem ANSI-Standard gen"ugen (GNU-C erf"ullt diese
  485. Bedingung zum Beispiel).  Ob Ihr UNIX-System bereits getestet und die
  486. n"otigen Definitionen vorgenommen wurden, k"onnen Sie der \tty{README}-Datei
  487. entnehmen.  Als zur Kompilation ben"otigten Plattenplatz sollten Sie
  488. ca. 15 Mbyte veranschlagen; dieser Wert (und der nach der "Ubersetzung
  489. noch ben"otigte Platz f"ur die "ubersetzten Programme) variiert
  490. allerdings stark von System zu System, so da"s man diesen Wert nur als
  491. Richtschnur betrachten sollte.
  492.  
  493. %%---------------------------------------------------------------------------
  494.  
  495. \section{Lieferumfang}
  496.  
  497. Prinzipiell erh"alt man \asname{} in einer von zwei Formen: Als {\em
  498. Bin"ardistribution} oder {\em Quellcodedistribution}.  Im Falle einer
  499. Bin"ardistribution bekommt man \asname{} mit den zugeh"origen Dienstprogrammen
  500. und Hilfsdateien fertig "ubersetzt, so da"s man nach dem Auspacken des
  501. Archivs an die gew"unschte Stelle direkt loslegen kann.
  502. Bin"ardistributionen werden f"ur verbreitete Plattformen gemacht, bei
  503. denen die Mehrzahl der Benutzer keinen Compiler hat oder die "Ubersetzung
  504. trickreich ist (im Moment sind dies DOS und OS/2).  Eine
  505. Quellcodedistribution enth"alt im Gegensatz den kompletten Satz an
  506. C-Quellen, um \asname{} zu generieren; es ist letzten Endes ein Schnappschu"s
  507. des Quellenbaumes, an dem ich \asname{} weiterentwickele.  Die Generierung von \asname{}
  508. aus dem Quellcode und dessen Struktur ist n"aher in Anhang
  509. \ref{ChapSource} beschrieben, weshalb an dieser Stelle nur auf den
  510. Umfang und die Installation einer Bin"ardistribution beschrieben wird:
  511.  
  512. Das Archiv des Lieferumfangs gliedert sich in einige Unterverzeichnisse,
  513. so da"s man nach dem Auspacken sofort einen Verzeichnisbaum erh"alt.  Die
  514. Verzeichnisse enthalten im einzelnen:
  515. \begin{itemize}
  516. \item{{\tt BIN}: ausf"uhrbare Programme, Text-Resourcen;}
  517. \item{{\tt INCLUDE}: Include-Dateien f"ur Assemblerprogramme, z.B.
  518.      Registerdefinitionen oder Standardmakros;}
  519. \item{{\tt MAN}: Kurzreferenzen f"ur die Programme im Unix-Man-Format;}
  520. \item{{\tt DOC}: diese Dokumentation in verschiedenen Formaten;}
  521. \item{{\tt LIB}: vorgesehen f"ur Initialisierungsdateien.}
  522. \end{itemize}
  523. Eine Auflistung der Dateien, die in jeder Bin"ardistribution enthalten
  524. sind, findet sich in Tabelle \ref{TabCommonPackageList}.  Falls eine der
  525. in diesen (oder den folgenden) Tabellen aufgef"uhrten Dateien fehlt, hat
  526. jemand (im Zweifelsfalle ich) beim Kopieren geschlafen...
  527.  
  528. \begin{center}\begin{longtable}{|l|l|}
  529. \hline
  530. Datei             & Funktion \\
  531. \hline
  532. \hline
  533. \endhead
  534. {\bf Verzeichnis BIN} & \\
  535. \hline
  536. AS.EXE            & Programmdatei Assembler \\
  537. PLIST.EXE         & listet Inhalt von Codedateien auf \\
  538. PBIND.EXE         & kopiert Codedateien zusammen \\
  539. P2HEX.EXE         & wandelt Code- in Hexdateien um \\
  540. P2BIN.EXE         & wandelt Code- in Bin"ardateien um \\
  541. AS.MSG            & Textresourcen zu \asname{} *) \\
  542. PLIST.MSG         & Textresourcen zu PLIST *) \\
  543. PBIND.MSG         & Textresourcen zu PBIND *) \\
  544. P2HEX.MSG         & Textresourcen zu P2HEX *) \\
  545. P2BIN.MSG         & Textresourcen zu P2BIN *) \\
  546. TOOLS.MSG         & gemeinsame Textresourcen zu den Tools *) \\
  547. CMDARG.MSG        & gemeinsame Textresourcen zu allen Programmen *) \\
  548. IOERRS.MSG        & \\
  549. \hline
  550. \multicolumn{2}{|l|}{*) nur DOS} \\
  551. \hline
  552. {\bf Verzeichnis DOC} & \\
  553. \hline
  554. AS\_DE.DOC        & deutsche Dokumentation, ASCII-Format \\
  555. AS\_DE.HTML       & deutsche Dokumentation, HTML-Format \\
  556. AS\_DE.TEX        & deutsche Dokumentation, LaTeX-Format \\
  557. AS\_EN.DOC        & englische Dokumentation, ASCII-Format \\
  558. AS\_EN.HTML       & englische Dokumentation, HTML-Format \\
  559. AS\_EN.TEX        & englische Dokumentation, LaTeX-Format \\
  560. \hline
  561. {\bf Verzeichnis INCLUDE} & \\
  562. \hline
  563. BCDIC.INC         & Definition BCDIC/Codepage 359 \\
  564. BITFUNCS.INC      & Funktionen zur Bitmanipulation \\
  565. CTYPE.INC         & Funktionen zur Klassifizierung von \\
  566.                  & Zeichen \\
  567. EBCDIC.INC        & Inkludiert alle EBCDIC-Varianten \\
  568. CP037.INC         & Definition EBCDIC (Codepage 037) \\
  569. CP5100.INC        & Definition Zeichensatz IBM 5100 \\
  570. CP5110.INC        & Definition EBCDIC (IBM 5110) \\
  571. 80C50X.INC        & Registeradressen SAB C50x \\
  572. 80C552.INC        & Registeradressen 80C552 \\
  573. H8\_3048.INC      & Registeradressen H8/3048 \\
  574. KENBAK.INC        & Registeradressen Kenbak-1 \\
  575. RADIX50.INC       & Definition RADIX 50 Zeichensatz \\
  576. REG166.INC        & Adressen \& Befehlsmakros 80C166/167 \\
  577. REG251.INC        & Adressen \& Bits 80C251 \\
  578. REG29K.INC        & Peripherieadressen AMD 2924x \\
  579. REG53X.INC        & Registeradressen H8/53x \\
  580. REG6303.INC       & Registeradressen 6303 \\
  581. REG683XX.INC      & Registeradressen 68332/68340/68360 \\
  582. REG7000.INC       & Registeradressen TMS70Cxx \\
  583. REG78310.INC      & Registeradressen \& Vektoren 78K3 \\
  584. REG78K0.INC       & Registeradressen 78K0 \\
  585. REG96.INC         & Registeradressen MCS-96 \\
  586. REGACE.INC        & Registeradressen ACE \\
  587. REGAVROLD.INC     & Register- \& Bitadressen AVR-Familie (veraltet)\\
  588. REGAVR.INC        & Register- \& Bitadressen AVR-Familie (aktuell)\\
  589. REGCOLD.INC       & Registeradressen ColdFire \\
  590. REGCOP8.INC       & Registeradressen COP8 \\
  591. REGEZ80.INC       & Registeradressen eZ80 \\
  592. REGF8.INC         & Register- \& Speicheradressen F8 \\
  593. REGGP32.INC       & Registeradressen 68HC908GP32 \\
  594. REGH16.INC        & Registeradressen H16 \\
  595. REGHC12.INC       & Registeradressen 68HC12 \\
  596. REGM16C.INC       & Registeradressen Mitsubishi M16C \\
  597. REGMSP.INC        & Registeradressen TI MSP430 \\
  598. REGPDK.INC        & Register- \& Bitadressen PMC/PMS/PFSxxx \\
  599. REGS12Z.INC       & Register- \& Bitadressen S12Z-Familie \\
  600. REGST6.INC        & Register- \& Makrodefinitionen ST6 (aktuell)\\
  601. REGST7.INC        & Register- \& Makrodefinitionen ST7 \\
  602. REGSTM8.INC       & Register- \& Makrodefinitionen STM8 \\
  603. REGST9.INC        & Register- \& Makrodefinitionen ST9 \\
  604. REGZ380.INC       & Registeradressen Z380 \\
  605. STDDEF04.INC      & Registeradressen 6804 \\
  606. STDDEF16.INC      & Befehlsmakros und Registeradressen \\
  607.                  & PIC16C5x \\
  608. STDDEF17.INC      & Registeradressen PIC17C4x \\
  609. STDDEF18.INC      & Registeradressen PIC16C8x \\
  610. STDDEF2X.INC      & Registeradressen TMS3202x \\
  611. STDDEF37.INC      & Register- \& Bitadressen TMS370xxx \\
  612. STDDEF3X.INC      & Peripherieadressen TMS320C3x \\
  613. STDDEF4X.INC      & Peripherieadressen TMS320C4x \\
  614. STDDEF47.INC      & Befehlsmakros TLCS-47 \\
  615. STDDEF51.INC      & Definition von SFRs und Bits f"ur \\
  616.                  & 8051/8052/80515 \\
  617. STDDEF56K.INC     & Registeradressen DSP56000 \\
  618. STDDEF5X.INC      & Peripherieadressen TMS320C5x \\
  619. STDDEF60.INC      & Befehlsmakros \& Registeradressen \\
  620.                  & PowerPC \\
  621. STDDEF62.INC      & Registeradressen \& Makros ST6 (veraltet)\\
  622. STDDEF75.INC      & Registeradressen 75K0 \\
  623. STDDEF87.INC      & Register- \& Speicheradressen TLCS-870 \\
  624. STDDEF90.INC      & Register- \& Speicheradressen TLCS-90 \\
  625. STDDEF96.INC      & Register- \& Speicheradressen TLCS-900 \\
  626. STDDEFXA.INC      & SFR-\& Bitadressen Philips XA \\
  627. STDDEFZ8.INC      & Registeradressen Z8-Familie (alt)\\
  628. REGV60.INC        & Registeradressen NEC V60 \\
  629. REGZ8.INC         & Registeradressen Z8-Familie (neu)\\
  630. REGSX20.INC       & Register- \& Bitadressen Parallax SX20/28 \\
  631. AVR/\*.INC        & Register- \& Bitadressen AVR-Familie \\
  632.                  & (nicht direkt benutzen, REGAVR.INC \\
  633.                  & inkludieren) \\
  634. COLDFIRE\/*.INC   & Register- \& Bitadressen ColdFire-Familie \\
  635.                  & (nicht direkt benutzen, REGCOLD.INC \\
  636.                  & inkludieren) \\
  637. EZ80\/*.INC       & Register- \& Bitadressen eZ80-Familie \\
  638.                  & (nicht direkt benutzen, REGEZ80.INC \\
  639.                  & inkludieren) \\
  640. PDK\/*.INC        & Register- \& Bitadressen PMC/PMS/PFSxxx \\
  641.                  & (nicht direkt benutzen, REGPDK.INC \\
  642.                  & inkludieren) \\
  643. S12Z\/*.INC       & Register- \& Bitadressen S12Z-Familie \\
  644.                  & (nicht direkt benutzen, REGS12Z.INC \\
  645.                  & inkludieren) \\
  646. ST6\/*.INC        & Register- \& Bitadressen ST6-Familie \\
  647.                  & (nicht direkt benutzen, REGST6.INC \\
  648.                  & inkludieren) \\
  649. ST7\/*.INC        & Register- \& Bitadressen ST7-Familie \\
  650.                  & (nicht direkt benutzen, REGST7.INC \\
  651.                  & inkludieren) \\
  652. STM8\/*.INC       & Register- \& Bitadressen STM8-Familie \\
  653.                  & (nicht direkt benutzen, REGSTM8.INC \\
  654.                  & inkludieren) \\
  655. Z8\/*.INC         & Register- \& Bitadressen Z8-Familie \\
  656.                  & (nicht direkt benutzen, REGZ8.INC \\
  657.                  & inkludieren) \\
  658. \hline
  659. {\bf Verzeichnis LIB} & \\
  660. \hline
  661. {\bf Verzeichnis MAN} & \\
  662. \hline
  663. ASL.1             & Kurzanleitung zu AS \\
  664. PLIST.1           & Kurzanleitung zu PLIST \\
  665. PBIND.1           & Kurzanleitung zu PBIND \\
  666. P2HEX.1           & Kurzanleitung zu P2HEX \\
  667. P2BIN.1           & Kurzanleitung zu P2BIN \\
  668. \hline
  669. \caption{Standardumfang einer Bin"ardistribution
  670. \label{TabCommonPackageList}}
  671. \end{longtable}\end{center}
  672.  
  673. Je nach Plattform kann eine Bin"ardistribution aber noch weitere Dateien
  674. enthalten, um einen Betrieb zu erm"oglichen, wie es z.B. bei DOS-Extendern
  675. der Fall ist.  F"ur die DOS-DPMI-Version \marginpar{{\em DPMI}} ergeben
  676. sich die in Tabelle \ref{TabDPMIPackageList} gelisteten Erg"anzungen.  Es
  677. spricht "ubrigens nichts dagegen, als Hilfsprogramme die Versionen aus
  678. einer DOS-Distribution zu verwenden, da diese einerseits ohne den
  679. Extender-Overhead deutlich schneller ablaufen und andererseits den
  680. vom Extender bereitgestellten erweiterten Speicher nicht ben"otigen.
  681.  
  682. \begin{table*}[htp]
  683. \begin{center}\begin{tabular}{|l|l|}
  684. \hline
  685. Datei             & Funktion \\
  686. \hline
  687. \hline
  688. {\bf Verzeichnis BIN} & \\
  689. \hline
  690. DPMI16BI.OVL   & DPMI-Server f"ur den Assembler \\
  691. RTM.EXE        & Laufzeit-Modul des Extenders \\
  692. \hline
  693. \end{tabular}\end{center}
  694. \caption{Zus"atzliche Dateien in einer DPMI-Bin"ardistribution
  695.         \label{TabDPMIPackageList}}
  696. \end{table*}
  697.  
  698. Eine OS/2-Bin"ardistribution \marginpar{{\em OS/2}} enth"alt neben den
  699. Basisdateien eine Reihe von DLLs, die zur Laufzeitumgebung des verwendeten
  700. emx-Compilers geh"oren (Tabelle \ref{TabOS2PackageList}).  Falls man diese
  701. DLLs (oder neuere Versionen davon) bereits besitzt, kann man diese auch
  702. wieder l"oschen und seine eigenen benutzen.
  703.  
  704. \begin{table*}[htp]
  705. \begin{center}\begin{tabular}{|l|l|}
  706. \hline
  707. Datei             & Funktion \\
  708. \hline
  709. \hline
  710. {\bf Verzeichnis BIN} & \\
  711. \hline
  712. EMX.DLL           & Laufzeitbibliotheken f"ur \asname{} und \\
  713. EMXIO.DLL         & die Dienstprogramme \\
  714. EMXLIBC.DLL       & \\
  715. EMXWRAP.DLL       & \\
  716. \hline
  717. \end{tabular}\end{center}
  718. \caption{Zus"atzliche Dateien in einer OS/2-Bin"ardistribution
  719.         \label{TabOS2PackageList}}
  720. \end{table*}
  721.  
  722. %%---------------------------------------------------------------------------
  723.  
  724. \section{Installation}
  725.  
  726. Eine besondere \marginpar{{\em DOS}} Installation ist f"ur die Nutzung
  727. einer Bin"ardistribution nicht notwendig, es gen"ugt, das Archiv an
  728. passender Stelle auszupacken und dann noch einige Kleinigkeiten zu
  729. erg"anzen.  Als Beispiel hier eine Installation, wie sie vielleicht
  730. ein UNIX-Anh"anger vornehmen w"urde:
  731.  
  732. Legen Sie ein Verzeichnis \verb!c:\as! an (im folgenden nehme ich an,
  733. da"s Sie \asname{} auf Laufwerk C installieren wollen), wechseln Sie in dieses
  734. und entpacken Sie das Archiv unter Erhalt der Verzeichnisnamen (bei
  735. Verwendung von PKUNZIP ist dazu die Kommandozeilenoption \verb!-d!
  736. erforderlich).  Sie sollten jetzt folgenden Verzeichnisbaum haben:
  737. \begin{verbatim}
  738. c:\as
  739. c:\as\bin
  740. c:\as\include
  741. c:\as\lib
  742. c:\as\man
  743. c:\as\doc
  744. \end{verbatim}
  745. Erg"anzen Sie jetzt die \tty{PATH}-Anweisung in Ihrer \tty{AUTOEXEC.BAT}
  746. um das Verzeichnis \verb!c:\as\bin!, so da"s \asname{} und seine Hilfsprogramme
  747. vom System gefunden werden.  In dem \tty{lib}-Verzeichnis erzeugen Sie
  748. mit einem beliebigen Texteditor eine Datei \tty{AS.RC} mit folgendem
  749. Inhalt:
  750. \begin{verbatim}
  751. -i c:\as\include
  752. \end{verbatim}
  753. Diese sogenannte {\em Key-Datei} zeigt \asname{}, in welchem Verzeichnis er seine
  754. Include-Dateien suchen soll.  Damit \asname{} diese Key-Datei bei Start
  755. auch beachtet, mu"s noch folgende Anweisung in die \tty{AUTOEXEC.BAT}:
  756. \begin{verbatim}
  757. set ASCMD=@c:\as\lib\as.rc
  758. \end{verbatim}
  759. Was Sie alles noch in der Key-Datei voreinstellen k"onnen, steht im
  760. folgenden Abschnitt.
  761.  
  762. Die Installation der DPMI-Version \marginpar{{\em DPMI}} sollte im Prinzip
  763. genauso verlaufen wie der reinen DOS-Version; wenn der Pfad das {\tt
  764. bin}-Verzeichnis enth"alt, werden die Dateien des DOS-Extenders
  765. automatisch gefunden und man sollte von dieser Mimik (mit Ausnahme der
  766. l"angeren Anlaufzeit...) nichts mitbekommen.  Theoretisch ist es m"oglich,
  767. da"s Sie auf 80286-Rechnern beim ersten Start mit einer Meldung der
  768. folgenden Form konfrontiert werden:
  769. \begin{verbatim}
  770.  machine not in database (run DPMIINST)
  771. \end{verbatim}
  772. Da das Tool DPMIINST bei neueren Versionen des DOS-Extenders von Borland
  773. aber nicht mehr dabei ist, nehme ich einmal an, da"s diese Sache sich
  774. erledigt hat...falls doch nicht, bitte ich um R"uckmeldung!
  775.  
  776. Die Installation der OS/2-Version \marginpar{{\em OS/2}} kann in weiten
  777. Z"ugen genauso ablaufen wie f"ur die DOS-Version, nur da"s dem System noch
  778. die DLLs bekannt gemacht werden m"ussen.  Wenn Sie den {\tt
  779. LIBPATH}-Eintrag in Ihrer {\tt CONFIG.SYS} nicht erweitern wollen, ist es
  780. nat"urlich auch m"oglich, die DLLs in ein Verzeichnis zu verschieben, das
  781. bereits dort aufgef"uhrt ist.
  782.  
  783. Wie bereits erw"ahnt, beschr"ankt sich die Installationsbeschreibung hier
  784. nur auf Bin"ardistributionen.  Da eine Installation unter Unix
  785. \marginpar{{\em UNIX}} im Augenblick immer eine Quellcodedistribution ist,
  786. geht der Verweis hier unisono in Anhang \ref{ChapSource}.
  787.  
  788. %%---------------------------------------------------------------------------
  789.  
  790. \section{Aufruf, Parameter}\label{SectCallConvention}
  791.  
  792. \asname{} ist ein Kommandozeilen-gesteuertes Programm, d.h. alle Parameter
  793. und Dateiangaben sind in der Kommandozeile anzugeben.
  794.  
  795. Zu \asname{} geh"ort eine Reihe Reihe von Nachrichtendateien (erkennbar an der
  796. Endung {\tt MSG}, aus denen \asname{} zur Laufzeit die f"ur die jeweilige
  797. Landessprache dynamisch nachl"adt.  \asname{} sucht nach diesen Dateien in den
  798. folgenden Verzeichnissen:
  799. \begin{itemize}
  800. \item{im aktuellen Verzeichnis;}
  801. \item{im Verzeichnis der EXE-Datei;}
  802. \item{in dem in der Environment-Variablen {\tt AS\_MSGPATH} angegebenen
  803.      Verzeichnis, oder alternativ in den in der {\tt PATH}-Variablen
  804.      gelisteten Verzeichnissen;}
  805. \item{In dem Verzeichnis, das \asname{} zur Kompilationszeit durch das
  806.      Makro {\tt LIBDIR} mitgegeben wurde.}
  807. \end{itemize}
  808. Diese Dateien werden von \asname{} {\em zwingend} zum Betrieb ben"otigt, d.h.
  809. findet \asname{} diese Dateien nicht, bricht er an dieser Stelle sofort ab.
  810.  
  811. Die Auswahl der Sprache (momentan Deutsch oder Englisch) orientiert sich
  812. unter DOS und OS/2 an der {\tt COUNTRY}-Einstellung in der {\tt
  813. CONFIG.SYS}, unter Unix an der {\tt LANG}-Environment-Variablen.
  814.  
  815. Um den \marginpar{{\em DOS}} Speicherbedarf von \asname{} unter DOS "uberhaupt
  816. befriedigen zu k"onnen, wurden die verschiedenen Codegeneratormodule in
  817. der DOS-Version in einen Overlay verlegt, der Teil des EXE-Files ist.
  818. Eine getrennte OVR-Datei wie bei fr"uheren Versionen von \asname{} existiert also
  819. nicht mehr, \asname{} versucht aber wie bisher auch weiterhin, die durch das
  820. Overlaying entstehenden Verz"ogerungen durch Nutzung von eventuellem EMS-
  821. oder XMS-Speicher zu reduzieren.  Sollte diese Verwendung zu Problemen
  822. f"uhren, so k"onnen Sie die Verwendung von EMS bzw. XMS unterbinden, indem
  823. Sie einer Environment-Variablen \tty{USEXMS} bzw. \tty{USEEMS} den Wert
  824. \tty{n} zuweisen.  So kann man z.B. mit dem Befehl
  825. \begin{verbatim}
  826.   SET USEXMS=n
  827. \end{verbatim}
  828. die Verwendung von Extended Memory verhindern.
  829. \par
  830. Da \asname{} alle Ein-und Ausgaben "uber das Betriebssystem abwickelt (und daher
  831. unter DOS auch auf nicht ganz so kompatiblen PCs laufen sollte) und eine
  832. rudiment"are Bildschirmsteuerung ben"otigt, gibt er w"ahrend der
  833. Assemblierung ANSI-Steuersequenzen aus.
  834. Falls Sie in den Ausgaben von \asname{} \marginpar{{\em DOS/}} also seltsame
  835. Zeichen sehen sollten, fehlt offensichtlich in Ihrer CONFIG.SYS die
  836. Einbindung des ANSI-Trei\-bers (\tty{device=\-ansi.sys}), die weitere Funktion
  837. von \asname{} \marginpar{{\em DPMI}} wird dadurch aber nicht beeinflu"st. Alternativ
  838. k"onnen Sie aber auch die Ausgabe von ANSI-Sequenzen durch das Setzen der
  839. Environment-Variablen \tty{USEANSI} auf \tty{n} ganz unterdr"ucken.
  840.  
  841. Der DOS-Extender der DPMI-Version \marginpar{{\em DPMI}} l"a"st sich in
  842. seiner Speicherbelegung durch diverse Kommandozeilenoptionen beeinflussen.
  843. Diese k"onnen Sie bei Bedarf der Datei DPMIUSER.DOC entnehmen.
  844. Zus"atzlich ist sie in der Lage, bei Bedarf den vorhandenen Speicher
  845. durch eine Swap-Datei zu ,,erweitern''.  Dazu belegt man eine
  846. Environment-Variable \tty{ASXSWAP} folgenderma"sen:
  847. \begin{quote}{\tt
  848.  SET ASXSWAP=$<$Gr"o"se$>$[,Dateiname]
  849. }\end{quote}
  850. Die Gr"o"senangabe erfolgt in Megabytes und \bb{mu"s} gemacht werden.  Der
  851. Name der Datei ist dagegen optional; fehlt er, so wird die Swap-Datei im
  852. aktuellen Verzeichnis unter dem Namen \tty{ASX.TMP} angelegt.  In jedem
  853. Falle wird die Swap-Datei nach Programmende wieder gel"oscht.
  854.  
  855. Die Kommandozeilenparameter k"onnen grob in drei Klassen eingeteilt
  856. werden: Schalter, Key-File-Referenzen (s.u.) und Dateispezifikationen.
  857. Parameter dieser beiden Klassen k"onnen beliebig gemischt in der
  858. Kommandozeile auftreten, \asname{} wertet zuerst alle Parameter aus und
  859. assembliert dann die angegebenen Dateien. Daraus folgen zwei Dinge:
  860. \begin{itemize}
  861. \item{Die angegebenen Schalter wirken auf alle angegebenen Quelldateien.
  862.      Sollen mehrere Quelldateien mit unterschiedlich gesetzten Schaltern
  863.      assembliert werden, so mu"s dies in getrennten L"aufen erfolgen.}
  864. \item{Es k"onnen in einem Durchgang mehrere Dateien assembliert werden.
  865.      Um der Sache die Krone aufzusetzen, d"urfen die Dateiangaben
  866.      Jokerzeichen enthalten.}
  867. \end{itemize}
  868. Schalterparameter erkennt \asname{} daran, da"s sie durch einen
  869. Schr"agstrich (/) oder Bindestrich (-) eingeleitet werden.  Es gibt dabei
  870. sowohl Schalter, die nur aus einem Buchstaben bestehen, als auch Schalter,
  871. die aus einem ganzen Wort bestehen.  Immer wenn \asname{} einen Schalter nicht
  872. als ,,Wort-Schalter'' verstehen kann, so versucht er, die Buchstaben des
  873. Wortes als einzelne Schalter zu interpretieren.  Wenn man also z.B.
  874. \begin{verbatim}
  875. -queit
  876. \end{verbatim}
  877. anstelle von
  878. \begin{verbatim}
  879. -quiet
  880. \end{verbatim}
  881. geschrieben h"atte, w"urde \asname{} die Buchstaben \tty{q, u, e, i} und \tty{t}
  882. als einzelne Schalter auffassen.  Mehrbuchstabige Schalter unterscheiden
  883. sich weiterhin von einbuchstabigen dadurch, da"s \asname{} bei ihnen beliebige
  884. Gro"s-und Kleinschreibungen akzeptiert, w"ahrend einbuchstabige Schalter
  885. je nach Gro"s- oder Kleinschreibung unterschiedliche Bedeutung haben.
  886. \par
  887. Momentan sind folgende Schalter definiert:
  888. \ttindex{SHARED}
  889. \begin{itemize}
  890. \item{\tty{l}: Assemblerlisting auf Konsole ausgeben.  Falls mehrere
  891.      Passes ausgef"uhrt werden m"ussen, landen im Gegensatz zur
  892.      n"achsten Option die Listings aller Durchg"ange auf der Ausgabe!}
  893. \item{\tty{L}: Assemblerlisting auf Datei schreiben.  Die Listdatei erh"alt
  894.      dabei den gleichen Namen wie die Quelldatei, lediglich die Endung
  895.      wird durch \tty{LST} ersetzt, es sei denn...}
  896. \item{\tty{OLIST}: mit einem zus"atzlichen Argument legt einen anderen
  897.      Pfad bzw. Namen f"ur die Listdatei fest.  Falls mehrere Dateien
  898.      assembliert werden, kann diese Option auch mehrfach gegeben werden.}
  899. \item{\tty{listline-prefix}: Mit dieser Option k"onnen die Daten
  900.      bestimmt werden, die im Listing jeder Zeile vorangestellt
  901.      werden.  Der Aufbau des daf"ur verwendeten Formatstrings ist in
  902.      \ref{SectListing} beschrieben.}
  903. \item{\label{radix}\tty{RADIX}: Stellt das Default-Zahlensystem auf
  904.      einen Wert zwischen 2 und 36, anstelle von 10.  Dieser Wert kann
  905.      durch die gleichnamige Anweisung im Programm übersteuert werden.}
  906. \item{\label{listradix}\tty{LISTRADIX}: Defaultm"a"sig erfolgen alle Zahlenausgaben im Listing
  907.      (Adressen, erzeugter Code, Symboltabelle) im Hexadezimalsystem.  Mit
  908.      diesem Schalter kann ein beliebiges anderes Zahlensystem im Bereich
  909.      2 bis 36 angegeben werden, z.B. '-listradix 8' f"ur oktale Ausgaben.
  910.      Wird der Zahlenwert mit f"uhrender Null geschrieben (also z.B. 08
  911.      anstelle 8), wird der Programmz"ahler im Listing mit f"uhrenden
  912.      Nullen geschrieben.}
  913. \item{\tty{SPLITBYTE [Zeichen]}: Zahlen im Listing werden Byte-weise
  914.      dargestellt, mit dem angegebenen Zeichen als Trenner.  Ein Punkt wird
  915.      als Trenner verwendet, wenn kein Zeichen angegeben wurde.  Diese Option
  916.      wird "ublicherweise zusammen mit der \tty{LISTRADIX}-Option verwendet;
  917.      Listradix 8 zusammen mit einem Punkt als Trenner ergibt die sogenannte
  918.      ''Split-Octal''-Darstellung.}
  919. \item{\tty{o}:Bestimmt einen neuen Namen f"ur die von \asname{} zu erzeugende
  920.      Code-Datei.  Wird diese Option mehrfach verwendet, so werden
  921.      die angegebenen Namen nacheinander den zu assemblierenden
  922.      Quelldateien zugeordnet; Negation (s.u.) dieser Option in
  923.      Verbindung mit einem Namen l"oscht den Namen aus der Liste;
  924.      Negation ohne Namensangabe l"oscht die komplette Liste.}
  925. \item{\tty{SHAREOUT}:dito, nur f"ur eine eventuell zu erzeugende
  926.      SHARE-Datei}
  927. \item{\tty{c}: SHARED-Variablen werden in einem Format abgelegt, das die
  928.      Einbindung in eine C-Quelldatei erlaubt.  Die Endung der Datei
  929.      ist \tty{H}.}
  930. \item{\tty{p}: SHARED-Variablen werden in einem Format abgelegt, das die
  931.      Einbindung in den \tty{CONST}-Block eines Pascal- oder Modula-Programms
  932.      erlaubt.  Die Endung der Datei ist \tty{INC}.}
  933. \item{\tty{a}: SHARED-Variablen werden in einem Format abgelegt, das die
  934.      Einbindung in eine Assembler-Quelldatei erlaubt.  Die Endung
  935.      der Datei ist \tty{INC}.}
  936. \end{itemize}
  937. Zu Sinn und Funktion der SHARED-Symbole siehe Kapitel \ref{ChapShareMain}
  938. bzw. \ref{ChapShareOrder}.
  939. \begin{itemize}
  940. \item{\tty{g [Format]}: Mit diesem Schalter erzeugt \asname{} zus"atzlich eine
  941.      Datei, die Debug-Informationen f"ur dieses Programm enth"alt.
  942.      Als Format ist dabei entweder ein \asname{}-eigenes Format ({\tt
  943.      Format=MAP}), eine NoICE-kompatible Kommandodatei ({\tt
  944.      Format=NOICE}) oder das Format der AVR-Tools ({\tt Format=ATMEL})
  945.      erlaubt.  Zu den im MAP-Format gespeicherten
  946.      Informationen geh"ort zum einen die Symboltabelle, zum anderen eine
  947.      Zuordnung von Quellzeilen zu Maschinenadressen.  Eine genauere
  948.      Beschreibung des benutzten MAP-Dateiformates findet sich in
  949.      Abschnitt \ref{SectDebugFormat}.  Die Endung der Datei ist
  950.      \tty{MAP}, \tty{NOI} bzw. \tty{OBJ}, je nach gew"ahltem Format.
  951.      Wird keine explizite Formatangabe gemacht, wird das MAP-Format
  952.      gew"ahlt.}
  953. \item{\tty{noicemask [Wert]}: Normalerweise listet \asname{} in NoICE-Debuginfos
  954.      nur Symbole aus dem CODE-Segment.  Mit dieser Option und einem als
  955.      Bitmaske zu verstehenden Wert lassen sich andere Symbole aus
  956.      anderen Segmenten zuschalten.  Die Zuordnung von Bits zu Segmenten
  957.      kann Tabelle \ref{TabSegmentNums} entnommen werden.}
  958. \item{\tty{w}: Ausgabe von Warnungen unterdr"ucken;}
  959. \item{\tty{E [Datei]}: Die von \asname{} erzeugten Fehlermeldungen und Warnungen
  960.      in eine Datei umleiten.  Anstatt einer Datei k"onnen auch die 5
  961.      Standardhandles (STDIN..STDPRN) als !0 bis !4 angegeben werden.
  962.      Default ist !2, also STDERR. Wird die Dateiangabe weggelassen,
  963.      so ist der Name der Fehlerdatei gleich dem der Quelldatei, nur
  964.      mit der Endung \tty{LOG}.}
  965. \item{\tty{q}: Dieser Schalter unterdr"uckt alle Meldungen von \asname{} mit
  966.      Ausnahme von Fehlermeldungen und vom Programm selber erzeugten
  967.      Ausgaben.  Die Assemblierzeit kann dadurch geringf"ugig reduziert
  968.      werden, und beim Aufruf aus einer Shell heraus kann man sich eine
  969.      Umleitung ersparen.  Der Nachteil ist, da"s man u.U. einige Minuten
  970.      ,,im Dunklen'' steht...  Anstelle von 'q' darf auch 'quiet' geschrieben
  971.      werden.}
  972. \item{\tty{v}: Dies fordert auf"uhrliche Angaben an, also das Gegenteil
  973.      zum Quiet-Modus.  Die einzige Angabe, die momentat zus"atzlich ausgegeben
  974.      wird, ist die Versionsinformation.}
  975. \item{\tty{version}: Gibt Versionsinformationen aus und beendet sich.}
  976. \item{\tty{h}: Hexadezimalzahlen mit Klein- anstelle von Gro"sbuchstaben ausgeben.
  977.      Diese Option ist in erster Linie eine Frage des pers"onlichen
  978.      Geschmacks.}
  979. \item{\tty{i $<$Pfadliste$>$}: gibt eine Liste von Verzeichnissen an, in denen
  980.      der Assembler automatisch nach Include-Dateien suchen soll, falls
  981.      er diese nicht im aktuellen Verzeichnis findet. Die einzelnen
  982.      Verzeichnisse m"ussen durch Semikolons getrennt werden.}
  983. \item{\tty{u}: eine Liste der in den Segmenten belegten Bereiche berechnen.
  984.      Sie ist nur sinnvoll, falls ein Listing erzeugt
  985.      wird.  Diese Option ben"otigt erhebliche zus"atzliche Speicher-
  986.      und Rechenleistung, im Normalbetrieb sollte sie daher abgeschaltet
  987.      sein.  Da \asname{} aber unabh"angig vom eingeschalteten Listing mit dieser
  988.      Option auf "uberlappende Speicherbelegung pr"uft, hat sie auch
  989.      unabh"angig vom Listing einen gewissen Sinn...}
  990. \item{\tty{C}: erzeugt eine Liste mit Querverweisen.  Aufgelistet wird,
  991.      welche (globalen) Symbole in welchen Dateien in welchen Zeilen
  992.      benutzt werden.  Auch diese Liste wird nur generiert, falls
  993.      ein Listing erzeugt wird und belegt w"ahrend der
  994.      Assemblierung zus"atzlichen Speicherplatz.}
  995. \item{\tty{s}: eine Liste aller Sektionen (s. Abschnitt \ref{ChapLocSyms})
  996.      ausgeben.  Die Verschachtelung wird dabei durch Einr"uckungen
  997.      angedeutet.}
  998. \item{\tty{I}: Analog zur Sektionsliste eine Liste aller bearbeiteten
  999.      Include-Dateien ausgeben.}
  1000. \item{\tty{t $<$Maske$>$}: Mit diesem Schalter lassen sich einzelne Komponenten
  1001.      des standardm"a"sig ausgegebenen Assembler-Listings ein-und ausblenden.
  1002.      Welcher Teil dabei welchem Bit zugeordnet ist, ist im "ubern"achsten
  1003.      Abschnitt, der genauer auf das Format des Assembler Listings eingeht,
  1004.      nachgelesen werden.}
  1005. \item{\tty{D $<$Symbolliste$>$}: Symbole definieren. Die hinter dieser Option
  1006.      angegebenen, durch Kommas getrennten Symbole werden in der
  1007.      globalen Symboltabelle vor Beginn der Assemblierung abgelegt.
  1008.      Defaultm"a"sig werden diese Symbole als ganze Zahlen mit dem
  1009.      Wert TRUE abgelegt, mit einem nachgestellten Gleichheitszeichen
  1010.      kann aber auch eine andere Belegung gew"ahlt werden.  Der dem
  1011.      Gleichheitszeichen folgende Ausdruck darf dabei auch Operatoren
  1012.      oder interne Funktionen beinhalten, jedoch \bb{KEINE} anderen
  1013.      Symbole, selbst wenn diese schon davor in der Liste definiert
  1014.      sein sollten!  Zusammen mit den Befehlen zur bedingten
  1015.      Assemblierung (siehe dort) k"onnen so per Kommandozeile aus einer
  1016.      Quelldatei unterschiedliche Programmversionen erzeugt werden.
  1017.      {\bf ACHTUNG!} Wenn case-sensitiv gearbeitet werden soll, mu"s dies
  1018.      in der Kommandozeile {\em vor} Symboldefinitionen angegeben werden,
  1019.      sonst werden Symbolnamen schon an dieser Stelle in Gro"sbuchstaben
  1020.      umgewandelt!}
  1021. \item{\tty{A}: Die Liste globaler Symbole in einer anderen, kompakteren Form
  1022.      ablegen.  Verwenden Sie diese Option, wenn der Assembler bei
  1023.      langen Symboltabellen mit einem Stapel"uberlauf abst"urzt.
  1024.      Eventuell kann diese Option die Arbeitsgeschwindigkeit des
  1025.      Assemblers erh"ohen, dies h"angt jedoch von den Quellen ab.}
  1026. \item{\tty{x}: Legt die Ausf"uhrlichkeitsstufe von Fehlermeldungen fest.
  1027.      Jedes Mal, wenn diese Option angegeben wird, wird die Stufe
  1028.      um eins erh"oht oder gesenkt.  W"ahrend auf Stufe 0 (Vorgabe) nur
  1029.      der Fehler selber ausgegeben wird, wird ab Stufe 1 noch eine
  1030.      erweiterte Meldung ausgegeben, anhand der die Identifizierung des
  1031.      Fehlers erleichtert werden soll.  Welche Fehlermeldungen welche
  1032.      Zusatzinformationen tragen k"onnen, steht in Anhang \ref{ChapErrMess}
  1033.      mit der Liste aller Fehlermeldungen.  Auf Stufe 2 (Maximum) wird
  1034.      zus"atzlich noch die betroffene Quellzeile mit ausgegeben.}
  1035. \item{\tty{n}: Wird diese Option angegeben, so werden Fehlermeldungen nicht nur
  1036.      mit ihrem Klartext, sondern auch mit ihren im Anhang
  1037.      \ref{ChapErrMess} genannten internen Nummern ausgegeben.  Diese
  1038.      Option ist prim"ar f"ur Shells und Entwicklungsumgebungen gedacht,
  1039.      denen mit diesen Nummern die Identifizierung von Fehlern erleichtert
  1040.      werden soll.}
  1041. \item{\tty{U}: Mit dieser Option schaltet man \asname{} in den case-sensitiven
  1042.      Modus um, d.h. in Namen von Symbolen, Sektionen, Makros,
  1043.      Zeichentabellen und selbst definierte Funktionen werden Klein-
  1044.      und Gro"sbuchstaben unterschieden, was normalerweise nicht der
  1045.      Fall ist.}
  1046. \item{\tty{P}: weist \asname{} an, den von Makroprozessor und bedingter Assemblierung
  1047.      bearbeiteten Quelltext in einer Datei abzulegen.  Dieser Datei
  1048.      fehlen zus"atzlich Leer- und reine Kommentarzeilen.  Die Endung
  1049.      der Datei ist \tty{I}.}
  1050. \item{\tty{M}: mit diesem Schalter erzeugt \asname{} eine Datei, in der die Definitionen
  1051.      der Makros aus der Quelldatei abgespeichert werden, die die
  1052.      \tty{EXPORT}-Option verwenden.  Diese neue Datei hat den gleichen
  1053.      Namen wie die Quelldatei, lediglich die Endung wird in \tty{MAC} ge"andert.}
  1054. \item{\tty{G}: Dieser Schalter bestimmt, ob \asname{} Code erzeugen soll oder nicht.
  1055.      Ist er ausgeschaltet, wird die Datei zwar assembliert,
  1056.      aber keine Code-Datei geschrieben. Dieser Schalter ist defaultm"a"sig aktiviert
  1057.      (logisch, sonst bek"ame man ja auch gar kein Code-File).}
  1058. \item{\tty{r [n]}: Warnungen ausgeben, falls Situationen eintreten, die
  1059.      einen weiteren Pass erfordern.  Diese Information kann genutzt
  1060.      werden, um die Anzahl der Durchl"aufe zu verringern.  Optional kann
  1061.      man die Nummer des Passes angeben, ab dem diese Warnungen erzeugt
  1062.      werden; ohne Angabe kommen die Warnungen ab dem ersten Pass.  Machen
  1063.      Sie sich aber so oder so auf einen ziemlichen Haufen an Meldungen
  1064.      gefa"st!!}
  1065. \item{\tty{bigendian}: Mit diesem Schalter schaltet man vom Beginn des
  1066.      Programms die Ablage von Werten im Speicher im Big Endian Modus ein,
  1067.      sofern die Zielarchitektur den gleichnamigen Pseudobefehl unterst"utzt
  1068.      (siehe Abschnitt \ref{SectBIGENDIAN}).}
  1069. \item{\tty{plainbase}: Mit diesem Schalter erlaubt man vom Beginn des
  1070.      Programms an das Fortlassen eines leeren Indexarguments (siehe Abschnitt
  1071.      \ref{SectPLAINBASE}).}
  1072. \item{\tty{underscore-macroargs}: Erlaubt die Verwendung von Unterstrichen in
  1073.      Namen von Makro-Argumenten (siehe \ref{SectMacros}).}
  1074. \item{\tty{relaxed}: Mit diesem Schalter aktiviert man den RELAXED-Modus
  1075.      vom Beginn des Programms an, der ansonsten erst durch die gleichnamige
  1076.      Pseudoanweisung (siehe Abschnitt \ref{SectRELAXED}) eingeschaltet
  1077.      werden mu"s.}
  1078. \item{\tty{intsyntax}: Mit diesem Schalter kann man vom Beginn des Programms
  1079.      an die Liste der erlaubten Schreibweisen für Ganzzahl-Konstanten
  1080.      erweitern oder reduzieren, analog zur gleichnamigen Pseudoanweisung
  1081.      (siehe Abschnitt \ref{SectINTSYNTAX} f"ur eine Liste erlauber
  1082.      Argumente).}
  1083. \item{\tty{supmode}: Mit diesem Schalter erlaubt man vom Beginn des Programms
  1084.      an die Verwendung von Maschinenbefehlen, die nur im Supervisor-Modus
  1085.      des Prozessors verwendet werden d"urfen (siehe Abschnitt \ref{SectSUPMODE}).}
  1086. \item{\tty{Y}: Mit diesem Schalter weist man \asname{} an, alle Fehlermeldungen
  1087.      wegen zu langer Sprungdistanzen zu verwerfen, sobald die Notwendigkeit
  1088.      eines neuen Durchlaufs feststeht.  In welchen (seltenen) Situationen
  1089.      dieser Schalter notwendig ist, kann man in Abschnitt \ref{ForwRefs}
  1090.      nachlesen.}
  1091. \item{\tty{cpu $<$Name$>$}: Hiermit kann man man den Zielprozessor
  1092.      vorgeben, f"ur den \asname{} Code erzeugen soll, wenn die Quelldatei keinen
  1093.      {\tt CPU}-Befehl enth"alt.
  1094.      Falls das gew"ahlte Ziel CPU-Argumente unterst"utzt (siehe Abschnitt
  1095.      \ref{SectCPU}), k"onnen diese auch hier angegeben werden.  Ein Aufruf
  1096.      mit \verb!?! oder {\tt list} als Argument listet alle implementierten
  1097.      Zielprozessoren auf.}
  1098. \item{\tty{alias $<$neu$>$=$<$alt$>$}:\\
  1099.      definiert den Prozessortyp \tty{$<$neu$>$} als einen Alias f"ur den
  1100.      Typen \tty{$<$alt$>$}.  Zu den Sinn und Zweck von Aliasen siehe
  1101.      Abschnitt \ref{SectAlias}}
  1102. \item{{\tt gnuerrors}: Meldungen "uber Fehler bzw. Warnungen und deren
  1103.      Position nicht im Standardformat von \asname{}, sondern in einem dem GNU
  1104.      C-Compiler entlehnten Format anzeigen.  Dies erleichtert die
  1105.      Integration von \asname{} in f"ur dieses Format ausgelegte Umgebungen,
  1106.      unterdr"uckt aber gleichzeitig die Anzeige der pr"azisen
  1107.      Fehlerposition innerhalb Makror"umpfen!}
  1108. \item{{\tt maxerrors [n]}: Weist den Assembler an, nach der gegebenen
  1109.      Anzahl von Fehlern die Assemblierung abzubrechen.}
  1110. \item{{\tt maxinclevel [n]}: Weist den Assembler an, nach der gegebenen
  1111.      Include-Verschachtelungstiefe abzubrechen (Default ist 200).}
  1112. \item{{\tt Werror}: Weist den Assembler an, Warnungen als Fehler zu
  1113.      behandeln.}
  1114. \item{{\tt wrelative} bzw. {\tt wno-relative}: Weist den Assembler an,
  1115.      Warnungen auszugeben, falls ein relativer anstelle eines absoluten
  1116.      Sprungs m"oglich ist (nur f"ur Z80-Target).}
  1117. \item{{\tt wsign-extension} bzw. {\tt wno-sign-extension}: Weist den
  1118.      Assembler an, Warnungen "uber implizite Vorzeichen-Erweiterungen
  1119.      auszugeben (nur 68K, MOVEQ).}
  1120. \item{\tty{compmode}: Dieser Schalter weist den Assembler an, im Default
  1121.      im Kompatibilit"atsmodus zu arbeiten.  Genauere Informationen zu
  1122.      diesem Modus finden sich im Abschnitt \ref{SectCompMode}.}
  1123. \item{\tty{packing}: Dieser Schalter "ubersteuert den Architektur-
  1124.      abh"angigen Default f"ur die {\tt PACKING}-Option (siehe
  1125.      Abschnitt \ref{SectPACKING}).}
  1126. \end{itemize}
  1127. Sofern Schalter keine Argumente ben"otigen und ihre Zusammenziehung
  1128. keinen mehrbuchstabigen Schalter ergibt, k"onnen mehrere Schalter
  1129. auch auf einen Rutsch angegeben werden, wie z.B im folgenden Beispiel:
  1130. \begin{verbatim}
  1131. as test*.asm firstprog -cl /i c:\as\8051\include
  1132. \end{verbatim}
  1133. Es werden alle Dateien TEST*.ASM sowie die Datei FIRSTPROG.ASM
  1134. assembliert, wobei f"ur alle Dateien Listings auf der Konsole
  1135. ausgegeben und Sharefiles im C-Format erzeugt werden.  Nach Includes
  1136. soll der Assembler zus"atzlich im Verzeichnis \verb! C:\AS\8051\INCLUDE !
  1137. suchen.
  1138. \par
  1139. Dieses Beispiel zeigt nebenbei, da"s \asname{} als Defaultendung f"ur Quelldateien
  1140. \tty{ASM} annimmt.
  1141. \par
  1142. Etwas Vorsicht ist bei Schaltern angebracht, die ein optionales Argument
  1143. haben: Folgt auf einen solchen Schalter ohne Argument ein Dateiname, so
  1144. versucht \asname{}, diesen als Argument zu verwerten, was naturgem"a"s schief
  1145. geht:
  1146. \begin{verbatim}
  1147. as -g test.asm
  1148. \end{verbatim}
  1149. Die L"osung w"are in diesem Fall, die \tty{-g}-Option ans Ende der
  1150. Kommandozeile zu setzen oder ein explizites \tty{MAP}-Argument zu
  1151. spezifizieren.
  1152. \par
  1153. Neben der Angabe in der Kommandozeile k"onnen dauernd ben"otigte
  1154. Optionen in der Environment-Variablen ASCMD abgelegt werden. Wer z.B.
  1155. immer Listdateien haben m"ochte und ein festes Include-Verzeichnis hat,
  1156. kann sich mit dem Befehl
  1157. \begin{verbatim}
  1158. set ASCMD=-L -i c:\as\8051\include
  1159. \end{verbatim}
  1160. eine Menge Tipparbeit ersparen.  Da die Environment-Optionen vor der
  1161. Kommandozeile abgearbeitet werden, k"onnen Optionen in der
  1162. Kommandozeile widersprechende im Environment "ubersteuern.
  1163. \par
  1164. Bei sehr langen Pfaden kann es jedoch auch in der ASCMD-Variablen eng
  1165. werden.  F"ur solche F"alle kann auf eine sogenannte \ii{Key}-Datei
  1166. ausgewichen werden, in der die Optionen genauso wie in der Kommandozeile
  1167. oder ASCMD-Variablen abgelegt werden k"onnen, nur da"s diese Datei
  1168. mehrere Zeilen mit jeweils maximal 255 Zeichen enthalten darf.  Wichtig
  1169. ist dabei, da"s bei Optionen, die ein Argument ben"otigen, sowohl Schalter
  1170. als auch Argument in \bb{einer} Zeile stehen m"ussen.  Der Name der
  1171. Datei wird \asname{} dadurch mitgeteilt, da"s er mit einem vorangestellten
  1172. Klammeraffen in der ASCMD-Variablen abgelegt wird, z.B.
  1173. \begin{verbatim}
  1174. set ASCMD=@c:\as\as.key
  1175. \end{verbatim}
  1176. Um Optionen in der ASCMD-Variablen (oder der Key-Datei) wieder aufzuheben,
  1177. kann die Option mit einem vorangestellten Pluszeichen wieder aufgehoben
  1178. werden.  Soll in einem Einzelfall z.B. doch kein Listing erzeugt werden,
  1179. so kann es mit
  1180. \begin{verbatim}
  1181. as +L <Datei>
  1182. \end{verbatim}
  1183. wieder aufgehoben werden.  Nat"urlich ist es nicht ganz logisch, eine
  1184. Option mit einem Pluszeichen zu negieren...UNIX soit qui mal y pense.
  1185. \par
  1186. Referenzen auf eine Key-Datei k"onnen nicht nur von der {\tt
  1187. ASCMD}-Variablen aus erfolgen, sondern auch direkt von der Kommandozeile
  1188. aus, indem man analog zur {\tt ASCMD}-Variablen dem Dateinamen einen
  1189. Klammeraffen voranstellt:
  1190. \begin{verbatim}
  1191. as @<Datei> ....
  1192. \end{verbatim}
  1193. Die in einem solchen Fall aus dem Key-File gelesenen Optionen werden so
  1194. eingearbeitet, als h"atten sie anstelle dieser Referenz in der
  1195. Kommandozeile gestanden - es ist also {\em nicht} wie bei der {\tt
  1196. ASCMD}-Variablen so, da"s sie vor allen anderen Kommandozeilenoptionen
  1197. abgearbeitet werden w"urden.
  1198. \par
  1199. Das Referenzieren eines Key-Files von einem Key-File selber ist nicht
  1200. erlaubt und wird von \asname{} mit einer Fehlermeldung quittiert.
  1201. \par
  1202. F"ur den Fall, da"s Sie \asname{} von einem anderen Programm oder einer Shell
  1203. aufrufen wollen und diese Shell nur Klein- oder Gro"sbuchstaben in der
  1204. Kommandozeile "ubergeben will, existiert folgendes Workaround: Wird vor
  1205. den Buchstaben der Option eine Tilde gesetzt, so werden die folgenden
  1206. Buchstaben immer als Kleinbuchstaben interpretiert.  Analog erzwingt
  1207. ein Lattenzaun die Interpretation als Gro"sbuchstaben.  Es ergeben
  1208. sich z.B. folgende Transformationen:
  1209. \begin{quote}{\tt
  1210. /\verb!~!I $\longrightarrow$ /i \\
  1211. -\verb!#!u $\longrightarrow$ -U}
  1212. \end{quote}
  1213. \par
  1214. Abh"angig vom Ablauf der Assemblierung endet der Assembler mit
  1215. folgenden Returncodes:
  1216. \begin{description}
  1217. \item[0]{fehlerfreier Ablauf, h"ochstens Warnungen aufgetreten}
  1218. \item[1]{Der Assembler hat nur die Aufrufparameter ausgegeben und
  1219.         endete danach sofort.}
  1220. \item[2]{Es sind Fehler bei der Assemblierung aufgetreten, es wurde
  1221.         keine Code-Datei erzeugt.}
  1222. \item[3]{Es trat ein fataler Fehler w"ahrend des Ablaufes auf, der
  1223.         zum sofortigen Abbruch gef"uhrt hat.}
  1224. \item[4]{Bereits w"ahrend des Starts des Assemblers ist ein Fehler
  1225.         aufgetreten.  Dies kann ein Parameterfehler oder eine fehlerhafte
  1226.         Overlay-Datei sein.}
  1227. \item[255]{Bei der Initialisierung ist irgendein interner Fehler
  1228.         aufgetreten, der auf keinen Fall auftreten sollte...neu booten,
  1229.         noch einmal probieren, und bei Reproduzierbarkeit mit mir
  1230.         Verbindung aufnehmen!}
  1231. \end{description}
  1232.  
  1233. Zus"atzlich endet jede Assemblierung einer Datei mit einer kleinen
  1234. Statistik, die Fehlerzahlen, Laufzeit, Anzahl der Durchl"aufe und freien
  1235. Speicher ausgibt.  Bei eingeschaltetem Assembler-Listing wird diese
  1236. Statistik zus"atzlich auch in das Listing geschrieben.
  1237.  
  1238. OS/2 \marginpar{{\em OS/2}} erweitert wie Unix das Datensegment einer
  1239. Anwendung erst dann, wenn sie wirklich mehr Speicher anfordert.  Eine
  1240. Angabe wie
  1241. \begin{quote}{\tt
  1242. 511 KByte verf"ugbarer Restspeicher
  1243. }\end{quote}
  1244. bedeutet also nicht einen nahenden Systemabsturz wegen Speichermangel,
  1245. sondern stellt nur den Abstand zu der Grenze dar, bei der OS/2 einfach
  1246. ein paar mehr Kohlen in den Ofen schaufelt...
  1247.  
  1248. Da es unter C \marginpar{{\em UNIX}}  auf verschiedenen Betriebssystemen
  1249. keine kompatible M"oglichkeit gibt, den noch verf"ugbaren Speicher bzw.
  1250. Stack zu ermitteln, fehlen bei der C-Version diese beiden Angaben ganz.
  1251.  
  1252. %%---------------------------------------------------------------------------
  1253.  
  1254. \section{Format der Eingabedateien}
  1255. \label{AttrTypes}
  1256.  
  1257. Wie die meisten Assembler auch erwartet \asname{} genau einen Befehl pro Zeile
  1258. (Leerzeilen sind nat"urlich auch zugelassen).  Die Zeilen d"urfen nicht
  1259. l"anger als 255 Zeichen werden, dar"uber hinaus gehende Zeichen werden
  1260. abgeschnitten.
  1261. \par
  1262. Eine einzelne Zeile hat folgendes Format:
  1263. \begin{verbatim}
  1264. [Label[:]]<Befehl>[.Attribut] [Parameter[,Parameter..]] [;Kommentar]
  1265. \end{verbatim}
  1266. Eine Zeile darf dabei auch "uber mehrere Zeilen in der Quelldatei
  1267. verteilt sein, Folgezeichen (\verb!\!) verketten diese Teile dann zu
  1268. einer einzigen Zeile.  Zu beachten ist allerdings, da"s aufgrund der
  1269. internen Pufferstruktur die Gesamtzeile nicht 256 Zeichen "uberschreiten
  1270. darf.  Zeilenangaben in Fehlermeldungen beziehen sich immer auf die
  1271. letzte Zeile einer solchen zusammengesetzten Zeile.
  1272. \par
  1273. Der Doppelpunkt nach dem Label ist optional, falls das Label in der
  1274. ersten Spalte beginnt (woraus folgt, da"s ein Befehl, sei es ein
  1275. Maschinen- oder Pseudobefehl niemals in Spalte 1 beginnen darf).
  1276. Man mu"s ihn aber setzen, falls das Label nicht in der ersten Spalte
  1277. beginnt, damit \asname{} es von einem Befehl unterscheiden kann.  In letzterem
  1278. Fall mu"s "ubrigens zwischen Doppelpunkt und dem Befehl mindestens ein
  1279. Leerzeichen stehen, falls der eingestellte Zielprozessor zu denjenigen
  1280. geh"ort, bei denen das Attribut auch eine mit einem Doppelpunkt
  1281. abgetrennte Formatangabe sein darf.  Diese Einschr"ankung ist aus
  1282. Eindeutigkeits-Gr"unden n"otig, da sonst keine Unterscheidung zwischen
  1283. Befehl mit Format und Label mit Befehl m"oglich w"are.
  1284. \par
  1285. Einige Signalprozessorreihen von Texas Instruments verwenden den f"ur das
  1286. Label vorgesehenen Platz wahlweise auch f"ur einen Doppelstrich
  1287. (\verb!||!), der die parallele Ausf"uhrung mit der vorangehenden
  1288. Instruktion anzeigt.  Wenn diese beiden Instruktionen auf Maschinenebene
  1289. in einem einzigen Wort vereinigt werden (C3x/C4x), macht ein zus"atzliches
  1290. Label vor der zweiten Anweisung nat"urlich keinen Sinn und ist auch nicht
  1291. vorgesehen.  Anders sieht es beim C6x mit seinen Instruktionspaketen
  1292. variabler L"ange aus: Wer dort (unsch"onerweise...) mitten in ein Paket
  1293. hinein springen will, mu"s das Label daf"ur in eine Extrazeile davor setzen
  1294. (das gleiche gilt "ubrigens auch f"ur Bedingungen, die aber zusammen mit
  1295. dem Doppelstrich in einer Zeile stehen d"urfen).
  1296. \par
  1297. Das Attribut wird von einer Reihe von Prozessoren benutzt, um
  1298. Spezialisierungen oder Kodierungsvarianten eines bestimmten Befehls zu
  1299. spezifizieren.  Die bekannteste Nutzung des Attributs ist die Angabe der
  1300. Operandengr"o"se, wie z. B. bei der 680x0-Familie (Tabelle
  1301. \ref{TabAttrs}).
  1302. \begin{table*}[htb]
  1303. \begin{center}\begin{tabular}{|l|l|l|}
  1304. \hline
  1305. Attribut & arithmetisch-logischer Befehl & Sprungbefehl \\
  1306. \hline
  1307. \hline
  1308. B     & Byte (8 Bit)                   & 8-bit-displacement \\
  1309. W     & Wort (16 Bit)                  & 16-Bit-Displacement \\
  1310. L     & Langwort (32 Bit)              & 16-Bit-Displacement \\
  1311. Q     & Vierfachwort (64 Bit)          & --------- \\
  1312. C     & Half Precision (16 Bit)        & --------- \\
  1313. S     & Single Precision (32 Bit)      & 8-Bit-Displacement \\
  1314. D     & Double Precision (64 Bit)      & --------- \\
  1315. X     & Extended Precision (80/96 Bit) & 32-Bit-Displacement \\
  1316. P     & Dezimalgleitkomma (80/96 Bit)  & --------- \\
  1317. \hline
  1318. \end{tabular}\end{center}
  1319. \caption{Erlaubte Attribute (Beispiel 680x0) \label{TabAttrs}}
  1320. \end{table*}
  1321. \par
  1322. Da sich diese Anleitung nicht gleichzeitig als Handbuch f"ur die von \asname{}
  1323. unterst"utzten Prozessorfamilien versteht, ist dies leider auch nicht der
  1324. richtige Platz, um hier alle m"oglichen Attribute f"ur alle unterst"utzten
  1325. Familien aufzuz"ahlen.  Es sei aber angemerkt, da"s i.a. nicht alle Befehle
  1326. alle Attribute zulassen, andererseits das Fortlassen eines Attributs meist
  1327. zur Verwendung der f"ur diese Familie ,,nat"urlichen'' Operandengr"o"se
  1328. f"uhrt.  Zum genaueren Studium greife man auf ein Programmierhandbuch f"ur
  1329. die jeweilige Familie zur"uck, z.B. in \cite{Williams} f"ur die 68000er.
  1330. \par
  1331. Bei TLCS-9000, H8/500 und M16(C) dient das Attribut sowohl der Angabe der
  1332. Operandengr"o"se, falls diese nicht durch die Operanden klar sein sollte,
  1333. als auch der des zu verwendenden Befehlsformates.
  1334. Dieses mu"s durch einen Doppelpunkt von der Operandengr"o"se getrennt werden,
  1335. z.B. so:
  1336. \begin{verbatim}
  1337.    add.w:g   rw10,rw8
  1338. \end{verbatim}
  1339. Was dieses Beispiel nicht zeigt, ist, da"s die Formatangabe auch ohne
  1340. Operandengr"o"se geschrieben werden darf.  Steht demgegen"uber eine
  1341. Operandengr"o"se ohne Formatangabe, verwendet \asname{} automatisch das
  1342. k"urzeste Format.  Die erlaubten Befehlsformate und Operandengr"o"sen
  1343. sind vom Maschinenbefehl abh"angig und k"onnen z.B. \cite{Tosh9000},
  1344. \cite{HitH8_5}, \cite{MitM16} bzw. \cite{MitM16C} entnommen werden.
  1345. \par
  1346. Die Zahl der Befehlsparameter ist abh"angig vom Befehl und kann
  1347. prinzipiell zwischen 0 und 20 liegen.  Die Trennung der Parameter
  1348. voneinander erfolgt ausschlie"slich durch Kommas (Ausnahme: DSP56xxx,
  1349. dessen parallele Datentransfers durch Leerzeichen getrennt werden),
  1350. wobei in Klammern oder Hochkommas eingeschlossene Kommas nat"urlich
  1351. nicht beachtet werden.
  1352. \par
  1353. Anstelle eines Kommentars am Ende kann die Zeile auch nur aus einem
  1354. Kommentar bestehen, wenn er in der ersten Spalte beginnt.
  1355. \par
  1356. Bei den Leerzeichen zur Trennung einzelnen Komponenten darf es sich
  1357. genauso gut um Tabulatoren handeln.
  1358.  
  1359. %%---------------------------------------------------------------------------
  1360.  
  1361. \section{Format des Listings}
  1362. \label{SectListing}
  1363.  
  1364. Das von \asname{} bei Angabe der Kommandozeilenoptionen \tty{l} oder \tty{L}
  1365. erzeugte Listing l"a"st sich grob in folgende Teile gliedern:
  1366. \begin{enumerate}
  1367. \item{Erg"anzte Wiedergabe des assemblierten Quellcodes;}
  1368. \item{Symbolliste;}
  1369. \item{Makroliste;}
  1370. \item{Funktionsliste;}
  1371. \item{Belegungsliste;}
  1372. \item{Querverweisliste.}
  1373. \end{enumerate}
  1374. Letztere beide werden nur erzeugt, wenn sie durch zus"atzliche
  1375. Kommandozeilenoptionen angefordert wurden.
  1376. \par
  1377. Im ersten Teil listet \asname{} den kompletten Inhalt aller Quelldateien inklusive
  1378. des erzeugten Codes auf.  Eine Zeile in diesem Listing hat dabei folgende Form:
  1379. \begin{verbatim}
  1380. [<n>] <Zeile>/<Adresse> <Code> <Quelle>
  1381. \end{verbatim}
  1382. Im Feld $n$ zeigt \asname{} die Include-Verschachtelungstiefe an.  Die
  1383. Hauptdatei (die Datei, mit der die Assemblierung begann), hat dabei die
  1384. Tiefe 0, von dort aus eingebundene Dateien haben Tiefe 1 usw.  Die Tiefe
  1385. 0 wird dabei nicht angezeigt: F"ur Zeilen der Hauptdatei wird dieses Feld
  1386. durch eine passende Zahl von Leerzeichen ersetzt, oder g"anzlich fortgelassen,
  1387. falls es bisher gar keine Include-Anweisungen gegeben hat.  Das 'Ged"achtnis',
  1388. ob es Include-Anweisungen gegeben hat, und bis zu welcher Tiefe, reicht
  1389. "uber den einzelnen Pass hinaus.  Auf diese Weise 'lernt' der Assembler im
  1390. ersten Pass die maximale Tiefe und kann in folgenden Durchl"aufen dieses
  1391. Feld mit durchgehend gleicher Breite ausgeben.
  1392. \par
  1393. Im Feld \tty{Zeile} wird die Zeilennummer bezogen auf die jeweilige Datei
  1394. ausgegeben.  Die erste Zeile einer Datei hat dabei Nummer 1.  Die Adresse,
  1395. an der der f"ur diese Zeile erzeugte Code abgelegt wurde, folgt hinter dem
  1396. Schr"agstrich im Feld \tty{Adresse}.  Das daf"ur verwendete Zahlensystem
  1397. wird durch den {\tt listradix}-Schalter festgelegt (\ref{listradix}), ebenso
  1398. ob der Wert mit f"uhrenden Nullen angezeigt werden soll oder nicht.  Das
  1399. gerade aktuell verwendete Target mit der Gr"o"se seines Adre"sraumes bestimmt
  1400. die Breite des Feldes: F"ur einen Prozessor mit 64 KByte Adre"sraum sind
  1401. nur 4 Hex-Stellen erforderlich, bei 4 GByte dagegen acht.
  1402. \par
  1403. Der erzeugte Code selber steht dahinter im Feld \tty{Code}, ebenfalls
  1404. im durch den List-Radix gegebenen Zahlensystem.  Je nach Prozessortyp und aktuellem Segment
  1405. k"onnen die Werte entweder als Bytes oder 16/32-Bit-Worte formatiert sein.
  1406. Sollte mehr Code erzeugt worden sein, als in das Feld hineinpa"st, so
  1407. werden im Anschlu"s an die Zeile weitere Zeilen erzeugt, in denen nur
  1408. dieses Feld belegt ist.
  1409. \par
  1410. Im Feld \tty{Quelle} schlu"sendlich wird die Zeile aus der Quelldatei in
  1411. ihrer Originalform ausgegeben.
  1412. \par
  1413. Die Struktur der Daten vor der Quellcode-Zeile wird intern
  1414. durch einen Formatstring gesteuert, der "uber die Kommandozeilen-Option
  1415. {\tt -listline-prefix} ge"andert werden kann.  Dieser darf folgende
  1416. Platzhalter enthalten:
  1417. \begin{itemize}
  1418. \item{{\tt \%[c]i}: Die aktuelle Include-Verschachtelungstiefe, mit optionaler
  1419.      Feldbreite.  Ohne Feldbreite wird dies auf gar nichts oder eine
  1420.      passende Menge Leerzeichen expandiert, falls die Tiefe Null ist.}
  1421. \item{{\tt \%[c]n}: Die aktuelle Zeilennummer, mit einer optionalen Feldbreite,
  1422.      in der die Zeilennummer rechtsb"undig ausgegeben wird.  Der Default
  1423.      f"ur die Feldbreite ist f"unf Zeichen.}
  1424. \item{{\tt \%[c]a}: Analog die aktuelle Speicheradresse, wobei der Default
  1425.      der Feldbreite der oben erw"ahnte, Target-abh"angige Wert ist.}
  1426. \end{itemize}
  1427. In allen drei F"allen bedeutet eine f"uhrende Null bei einer Feldbreite, da"s
  1428. links mit Nullen anstelle von Leerzeichen aufgef"ullt werden soll.
  1429. Der Default f"ur diesen Formatstring ist \verb!%i%n/%a!.  Um eine Ausgabe
  1430. zu erhalten, wie sie Versionen von \asname{} vor 1.42 Build 249 erzeugten,
  1431. kann als Formatstring \verb!%1i%5n/%8a! verwendet werden.
  1432. \par
  1433. Die Symboltabelle ist so ausgelegt, da"s sie nach M"oglichkeit immer in 80
  1434. Spalten dargestellt werden kann.  F"ur Symbole ,,normaler L"ange'' wird
  1435. eine zweispaltige Ausgabe gew"ahlt.  Sollten einzelne Symbole mit ihrem
  1436. Wert die Grenze von 40 Spalten "uberschreiten, werden sie in einer
  1437. einzelnen Zeile ausgegeben.  Die Ausgabe erfolgt in alphabetischer
  1438. Reihenfolge.  Symbole, die zwar definiert, aber nie benutzt wurden,
  1439. werden mit einem vorangestellten Stern (\verb!*!) gekennzeichnet.
  1440. \par
  1441. Die bisher genannten Teile sowie die Auflistung aller definierten
  1442. Makros / Funktionen lassen sich selektiv aus dem Gesamtlisting ein-und
  1443. ausblenden, und zwar mit dem bereits erw"ahnten \tty{t}-Kommandozeilenschalter.
  1444. Intern existiert in \asname{} ein Byte, dessen Bits repr"asentieren, welche Teile
  1445. ausgegeben werden sollen.  Die Zuordnung von Bits zu den Teilen ist in
  1446. Tabelle \ref{TabTBits} aufgelistet.
  1447. \par
  1448. \begin{table*}[p]
  1449. \begin{center}\begin{tabular}{|l|l|}
  1450. \hline
  1451. Bit & Teil \\
  1452. \hline
  1453. \hline
  1454. 0   & Quelldatei(en)+erzeugter Code \\
  1455. 1   & Symboltabelle \\
  1456. 2   & Makroliste \\
  1457. 3   & Funktionsliste \\
  1458. 4   & Zeilennumerierung \\
  1459. 5   & Registersymboltabelle \\
  1460. 7   & Zeichentabellenliste \\
  1461. \hline
  1462. \end{tabular}\end{center}
  1463. \caption{Zuordnung der Bits zu den Listingkomponenten\label{TabTBits}}
  1464. \end{table*}
  1465. Defaultm"a"sig sind alle Bits auf 1 gesetzt, bei Verwendung des Schalters
  1466. \begin{verbatim}
  1467. -t <Maske>
  1468. \end{verbatim}
  1469. werden die in \verb!<Maske>! gesetzten Bits gel"oscht, so da"s die entsprechenden
  1470. Listing-Teile unterdr"uckt werden.  Analog lassen sich mit einem Pluszeichen
  1471. einzelne Teile wieder einschalten, falls man es in der \tty{ASCMD}-Variablen
  1472. "ubertrieben hat...will man z.B. nur die Symboltabelle haben, so reicht
  1473. \begin{verbatim}
  1474. -t 2  .
  1475. \end{verbatim}
  1476. In der Belegungsliste werden f"ur jedes Segment einzeln die belegten Bereiche
  1477. hexadezimal ausgegeben.  Handelt es sich bei einem Bereich um eine einzige
  1478. Adresse, wird nur diese ausgegeben, ansonsten erste und letzte Adresse.
  1479. \par
  1480. In der Querverweisliste wird f"ur jedes definierte Symbol in alphabetischer
  1481. Reihenfolge eine Ausgabe folgender Form erzeugt:
  1482. \begin{verbatim}
  1483. Symbol <Symbolname> (=<Wert>,<Datei>/<Zeile>):
  1484. Datei <Datei 1>:
  1485. <n1>[(m1)]  ..... <nk>[(mk)]
  1486. .
  1487. .
  1488. Datei <Datei l>:
  1489. <n1>[(m1)]  ..... <nk>[(mk)]
  1490. \end{verbatim}
  1491. F"ur jedes Symbol wird aufgelistet, in welchen Dateien es in welchen Zeilen
  1492. angesprochen wurde.  Sollte ein Symbol mehrmals in der gleichen Zeile
  1493. benutzt worden sein, so wird dies durch eine in Klammern gesetzte Anzahl
  1494. hinter der Zeilennummer angedeutet.  Sollte ein Symbol niemals benutzt
  1495. worden sein, erscheint es auch nicht in der Liste; entsprechend erscheint
  1496. eine Datei auch "uberhaupt nicht in der Liste eines Symbols, falls es in
  1497. der entsprechenden Datei nicht referenziert wurde.
  1498. \par
  1499. \bb{ACHTUNG!} \asname{} kann dieses Listing nur dann korrekt aufs Papier bringen,
  1500. wenn man ihm vorher die L"ange und Breite des Ausgabemediums mit Hilfe des
  1501. \tty{PAGE}-Befehls (siehe \ref{SectPAGE}) mitgeteilt hat!  Der voreingestellte
  1502. Default sind 60 Zeilen und eine unbegrenzte Zeilenbreite.
  1503.  
  1504. %%---------------------------------------------------------------------------
  1505.  
  1506. \section{Symbolkonventionen}
  1507. \label{SectSymConv}
  1508.  
  1509. Symbole d"urfen zwar (wie in der Einleitung bereits angedeutet) bis zu
  1510. 255 Zeichen lang werden und werden auch auf der ganzen L"ange
  1511. unterschieden, die Symbolnamen m"ussen aber einigen Konventionen
  1512. gen"ugen:
  1513. \par
  1514. Symbolnamen d"urfen aus einer beliebigen Kombination von Buchstaben,
  1515. Ziffern, Unterstrichen und Punkten bestehen, wobei das erste Zeichen
  1516. keine Ziffer sein darf.  Der Punkt wurde nur zugelassen, um der
  1517. MCS-51-Notation von Registerbits zu gen"ugen, und sollte m"oglichst nicht in
  1518. eigenen Symbolnamen verwendet werden.  Zur Segmentierung von Symbolnamen
  1519. sollte auf jeden Fall der Unterstrich und nicht der Punkt verwendet werden.
  1520. \par
  1521. Defaultm"a"sig ist \asname{} nicht case-sensitiv, es ist also egal, ob man
  1522. Gro"s-oder Kleinbuchstaben verwendet.  Mittels des Kommandozeilenschalters
  1523. \tty{U} l"a"st sich \asname{} jedoch in einen Modus umschalten, in dem Gro"s- und
  1524. Kleinschreibung unterschieden wird. Ob \asname{} umgeschaltet wurde, kann mit dem
  1525. vordefinierten Symbol \tty{CASESENSITIVE} ermittelt werden: TRUE bedeutet
  1526. Unterscheidung, FALSE keine.
  1527. \par
  1528. Tabelle \ref{TabPredefined} zeigt die wichtigsten, von \asname{} vordefinierten
  1529. Symbole.
  1530. \begin{table*}[p]
  1531. \begin{center}\begin{tabular}{|l|l|}
  1532. \hline
  1533. Name             & Bedeutung \\
  1534. \hline
  1535. \hline
  1536. \tty{TRUE}             & logisch ,,wahr'' \\
  1537. \tty{FALSE}            & logisch ,,falsch'' \\
  1538. \tty{CONSTPI}          & Kreiszahl Pi (3.1415.....) \\
  1539. \tty{FLOATMAX}         & gr"o"ste darstellbare Gleitkommazahl \\
  1540. \tty{VERSION}          & Version von \asname{} in BCD-Kodierung, \\
  1541.                       & z.B. 1331 hex f"ur Version 1.33p1 \\
  1542. \tty{ARCHITECTURE}     & Zielplattform, f"ur die \asname{} "ubersetzt wurde, \\
  1543.                       & in der Form Prozesor-Hersteller-Betriebssystem \\
  1544. \tty{DATE}             & Datum und \\
  1545. \tty{TIME}             & Zeitpunkt der Assemblierung (Beginn) \\
  1546. \tty{MOMCPU}           & momentan gesetzte Ziel-CPU \\
  1547. \tty{MOMCPUNAME}       & dito, nur als voll ausgeschriebener String \\
  1548. \tty{MOMFILE}          & augenblickliche Quelldatei \\
  1549. \tty{MOMLINE}          & Zeilennummer in Quelldatei \\
  1550. \tty{MOMPASS}          & Nummer das laufenden Durchgangs \\
  1551. \tty{MOMSECTION}       & Name der aktuellen Sektion oder \\
  1552.                       & Leerstring \\
  1553. \tty{MOMSEGMENT}       & Name des mit \tty{SEGMENT} gew"ahlten \\
  1554.                       & Adre"sraumes \\
  1555. \verb!*!, \$, . bzw. \tty{PC} & mom. Programmz"ahler \\
  1556. \hline
  1557. \end{tabular}\end{center}
  1558. \caption{Vordefinierte Symbole\label{TabPredefined}}
  1559. \end{table*}
  1560. \bb{VORSICHT!}  W"ahrend es im case-insensitiven Modus egal ist,
  1561. mit welcher Kombination von Gro"s- und Kleinbuchstaben man
  1562. vordefinierte Symbole anspricht, mu"s man sich im case-sensitiven
  1563. Modus exakt an die oben angegebene Schreibweise (nur Gro"sbuchstaben)
  1564. halten!
  1565. \par
  1566. Zus"atzlich definieren einige Pseudobefehle noch Symbole, die eine
  1567. Abfrage des damit momentan eingestellten Wertes erm"oglichen.  Deren
  1568. Beschreibung findet sich bei den zugeh"origen Befehlen.
  1569. \par
  1570. Auf den meisten Plattformen ist der Name {\tt INF} als Sonderwert
  1571. f"ur Unendlich im Gleitkomma-Format reserviert und kann nicht
  1572. f"ur eigene Symbole verwendet werden.
  1573. \par
  1574. Ein etwas verstecktes (und mit Vorsicht zu nutzendes) Feature ist,
  1575. Symbolnamen aus String-Variablen zusammenzubauen, indem man den
  1576. Namen des Strings mit geschweiften Klammern in den Symbolnamen
  1577. einbaut.  So kann man z.B. den Namen eines Symbols anhand des
  1578. Wertes eines anderen Symbols festlegen:
  1579. \begin{verbatim}
  1580. cnt             set     cnt+1
  1581. temp            equ     "\{CNT}"
  1582.                 jnz     skip{temp}
  1583.                 .
  1584.                 .
  1585. skip{temp}:     nop
  1586. \end{verbatim}
  1587. \bb{ACHTUNG!}  Der Programmierer ist selber daf"ur verantwortlich,
  1588. da"s sich dabei g"ultige Symbolnamen ergeben!
  1589. \par
  1590. Eine vollst"andige Auflistung aller von \asname{} verwendeten Symbolnamen
  1591. findet sich in Anhang \ref{AppInternSyms}.
  1592. \par
  1593. Neben seinem Wert besitzt auch jedes Symbol eine Markierung, zu welchen
  1594. {\em Segment} es geh"ort.  In erster Linie wird eine solche Unterscheidung
  1595. bei Prozessoren ben"otigt, die mehrere Adre"sr"aume besitzen.  \asname{} kann mit
  1596. dieser Zusatzinformation bei Zugriffen "uber ein Symbol warnen, wenn ein
  1597. f"ur diesen Adre"sraum ungeeigneter Befehl verwendet wird.  Ein
  1598. Segmentattribut wird einem Symbol automatisch angeh"angt, wenn es als Label
  1599. oder mit einem Spezialbefehl (z.B. \tty{BIT}) definiert wird; ein mit
  1600. dem ,,Universalbefehl'' \tty{SET} oder \tty{EQU} definiertes Symbol ist
  1601. jedoch ,,typenlos'', d.h. seine Verwendung wird niemals Warnungen
  1602. ausl"osen.  Das Segmentattribut eines Symbols kann mit der eingebauten
  1603. Funktion \tty{SYMTYPE} abgefragt werden, etwa so:
  1604. \begin{verbatim}
  1605. Label:
  1606.        .
  1607.        .
  1608. Attr    equ     symtype(Label)  ; ergibt 1
  1609. \end{verbatim}
  1610. Den einzelnen Segmenttypen sind die in Tabelle \ref{TabSegNums}
  1611. aufgelisteten Nummern zugeordnet.  Die aus der Ordnung normaler Symbole
  1612. etwas herausfallenden Registersymbole sind n"aher in Abschnitt
  1613. \ref{SectRegSyms} erl"autert.  Mit einem undefinierten Symbol als Argument
  1614. liefert die \tty{SYMTYPE}-Funktion -1 als Ergebnis.  Ob ein Symbol "uberhaupt
  1615. definiert ist, oder ein Formelausdruck keine bisher undefinierten Symbole
  1616. enth"alt, l"a"st sich auch einfach mit der \tty{DEFINED}-Funktion abfragen.
  1617. \begin{table}[htb]
  1618. \begin{center}
  1619. \begin{tabular}{|l|c|}
  1620. \hline
  1621. Segment & R"uckgabewert \\
  1622. \hline
  1623. $<$keines$>$ & 0 \\
  1624. CODE & 1 \\
  1625. DATA & 2 \\
  1626. IDATA & 3 \\
  1627. XDATA & 4 \\
  1628. YDATA & 5 \\
  1629. BITDATA & 6 \\
  1630. IO & 7 \\
  1631. REG & 8 \\
  1632. ROMDATA & 9 \\
  1633. EEDATA & 10 \\
  1634. $<$Registersymbol$>$ & 128 \\
  1635. \hline
  1636. \end{tabular}
  1637. \end{center}
  1638. \caption{R"uckgabewerte der \tty{SYMTYPE}-Funktion\label{TabSegNums}}
  1639. \end{table}
  1640.  
  1641. %%---------------------------------------------------------------------------
  1642.  
  1643. \section{Tempor"are Symbole}
  1644.  
  1645. Besonders bei Programmen mit vielen aufeinanderfolgenden Schleifen oder
  1646. IF-artigen Strukturen steht man immer wieder vor dem Problem, sich
  1647. st"andig neue Namen f"ur Labels ausdenken zu m"ussen.  Dabei wei"s man an
  1648. sich genau, da"s man dieses Label nie wieder brauchen wird und am liebsten
  1649. in irgendeiner Weise 'verwerfen' m"ochte.  Eine einfache L"osung, wenn man
  1650. nicht gleich den gro"sen Hammer des Sektionskonzeptes (siehe Kapitel
  1651. \ref{ChapLocSyms}) schwingen m"ochte, sind {\em tempor"are} Symbole, die
  1652. solange ihre G"ultigkeit behalten, bis ein neues, nicht-tempor"ares Symbol
  1653. definiert wird.  Andere Assembler bieten einen "ahnlichen Mechanismus an,
  1654. der dort unter dem Stichwort 'lokale Symbole' l"auft, zur besseren
  1655. Abgrenzung gegen das Sektionskonzept m"ochte ich aber beim Begriff
  1656. 'tempor"are Symbole' bleiben.  \asname{} kennt drei unterschiedliche Typen von
  1657. tempor"aren Symbolen, um jedem 'Umsteiger' ein Konzept anzubieten, das den
  1658. Umstieg so einfach wie m"oglich macht.  Leider kocht quasi jeder Assembler
  1659. bei diesem Thema sein eigenes S"uppchen, so da"s es nur in Ausnahmef"allen
  1660. eine 1:1-L"osung f"ur existierenden Code geben wird:
  1661.  
  1662. \subsection{Tempor"are Symbole mit Namen}
  1663.  
  1664. Ein Symbol, dessen Name mit zwei Dollarzeichen beginnt (dies ist weder
  1665. f"ur normale Symbole noch Konstanten zul"assig), ist ein tempor"ares
  1666. Symbol mit Namen.  \asname{} f"uhrt intern einen Z"ahler mit, der zu Beginn der
  1667. Assemblierung auf Null gesetzt wird und bei jeder Definition eines
  1668. nicht-tempor"aren Symbols inkrementiert wird.  Wird ein tempor"ares Symbol
  1669. definiert oder referenziert, so werden die beiden f"uhrenden Dollarzeichen
  1670. gestrichen und der momentane Stand des Z"ahlers wird angeh"angt.  Auf
  1671. diese Weise erh"alt man mit jedem nicht-tempor"aren Symbol sozusagen die
  1672. Symbolnamen zur"uck - man kommt an die Symbole vor dieser Definition aber
  1673. auch nicht mehr heran!  Tempor"are Symbole bieten sich daher besonders
  1674. f"ur den Einsatz in kleinen Anweisungsbl"ocken an, typischerweise etwa ein
  1675. Dutzend Befehle, auf keinen Fall mehr als eine Bildschirmseite, sonst
  1676. kommt man leicht durcheinander...
  1677.  
  1678. Hier ein kleines Beispiel:
  1679. \begin{verbatim}
  1680. $$loop: nop
  1681.        dbra    d0,$$loop
  1682. split:
  1683. $$loop: nop
  1684.        dbra    d0,$$loop
  1685. \end{verbatim}
  1686. W"are das zwischen den Schleifen liegende nicht-tempor"are Label nicht
  1687. vorhanden, g"abe es nat"urlich eine Fehlermeldung wegen eines doppelt
  1688. definierten Symbols.
  1689.  
  1690. {\em Namenlose Tempor"are Symbole}
  1691.  
  1692. F"ur all jene, denen tempor"are Symbole mit Namen noch immer zu
  1693. kompliziert sind, gibt es eine noch einfachere Variante: Setzt man als
  1694. Label ein einfaches Plus- oder Minuszeichen, so werden diese in die Namen
  1695. {\tt \_\_forwnn} bzw. {\tt \_\_backmm} umgesetzt, wobei {\tt nn} bzw. {\tt mm}
  1696. von Null an laufende Z"ahler sind.  Referenziert werden diese Symbole
  1697. "uber die Sonderwerte {\tt - -- ---} bzw. {\tt + ++ +++}, womit sich die
  1698. drei letzten 'Minussymbole' bzw die drei n"achsten 'Plussymbole'
  1699. referenzieren lassen.  Welche Variante man benutzt, h"angt also davon ab,
  1700. ob man ein Symbol vorw"arts oder r"uckw"arts referenzieren will.
  1701.  
  1702. Bei der {\em Definition} namenloser tempor"arer Symbole gibt es neben dem
  1703. Plus- und Minuszeichen noch eine dritte Variante, n"amlich einen
  1704. Schr"agstrich (/).  Ein so definiertes tempor"ares Symbol kann
  1705. gleicherma"sen vorw"arts wie r"uckw"arts referenziert werden; d. h. je
  1706. nach Referenzierung wird es wie ein Minus oder Plus behandelt.
  1707.  
  1708. Namenlose tempor"are Symbole finden ihre Anwendung "ublicherweise in
  1709. Konstruktionen, die auf eine Bildschirmseite passen, wie das bedingte
  1710. "Uberspringen von ein paar Maschinenbefehlen oder kleinen Schleifen -
  1711. ansonsten w"urde die Sache zu un"ubersichtlich werden (das ist aber nur
  1712. ein gut gemeinter Rat...).  Ein Beispiel daf"ur ist das folgende St"uck
  1713. Code, zur Abwechslung mal als 65xx-Code:
  1714. \begin{verbatim}
  1715.        cpu     6502
  1716.  
  1717. -       ldx     #00
  1718. -       dex
  1719.        bne     -            ; springe zu 'dex'
  1720.        lda     RealSymbol
  1721.        beq     +            ; springe zu 'bne --'
  1722.        jsr     SomeRtn
  1723.        iny
  1724. +       bne     --           ; springe zu 'ldx #00'
  1725.  
  1726. SomeRtn:
  1727.        rts
  1728.  
  1729. RealSymbol:
  1730.        dfs     1
  1731.  
  1732.         inc     ptr
  1733.         bne     +           ; springe zu 'tax'
  1734.         inc     ptr+1
  1735. +       tax
  1736.  
  1737.         bpl     ++          ; springe zu 'dex'
  1738.         beq     +           ; springe vorwaerts zu 'rts'
  1739.         lda     #0
  1740. /       rts                 ; Schraegstrich = Wildcard
  1741. +       dex
  1742.         beq     -           ; springe rueckwaerts zu 'rts'
  1743.  
  1744. ptr:    dfs     2
  1745. \end{verbatim}
  1746.  
  1747. \subsection{Zusammengesetzte tempor"are Symbole}
  1748.  
  1749. Dies ist vielleicht der Typ von tempor"aren Symbolen, der dem Konzept von
  1750. lokalen Symbolen und Sektionen am n"achsten kommt.  Wann immer der Name
  1751. eines Symboles mit einem Punkt (.) anf"angt, wird das Symbol nicht mit
  1752. diesem Namen in der Symboltabelle abgelegt.  Stattdessen wird der Name des
  1753. zuletzt definierten Symbols ohne vorangestellten Punkt davor geh"angt.  Auf
  1754. diese Weise nehmen Symbole, deren Name nicht mit einem Punkt anf"angt, quasi
  1755. die Rolle von 'Bereichsgrenzen' ein und Symbole, deren Name mit einem
  1756. Punkt anf"angt, k"onnen in jedem Bereich neu verwendet werden.  Sehen wir
  1757. uns das folgende kurze Beispiel an:
  1758. \begin{verbatim}
  1759. proc1:                    ; nicht-temporaeres Symbol 'proc1'
  1760.  
  1761. .loop   moveq   #20,d0    ; definiert in Wirklichkeit 'proc1.loop'
  1762.        dbra    d0,.loop
  1763.        rts
  1764.  
  1765. proc2:                    ; nicht-temporaeres Symbol 'proc2'
  1766.  
  1767. .loop   moveq   #10,d1    ; definiert in Wirklichkeit 'proc2.loop'
  1768.        jsr     proc1
  1769.        dbra    d1,.loop
  1770.        rts
  1771. \end{verbatim}
  1772. Man beachte, da"s es weiterhin m"oglich ist, auf alle tempor"aren Symbole
  1773. zuzugreifen, auch wenn man sich nicht im gleichen 'Bereich' befindet,
  1774. indem man einfach den zusammengesetzten Namen benutzt (wie z.B.
  1775. 'proc2.loop' im voranstehenden Beispiel).
  1776.  
  1777. Zusammengesetzte Symbole lassen sich prinzipiell mit Sektionen kombinieren
  1778. und k"onnen so auch zu lokalen Symbolen werden.  Man beachte allerdings,
  1779. da"s das zuletzt definierte, nicht tempor"are Symbol nicht pro Sektion
  1780. gespeichert wird, sondern lediglich global.  Das kann sich
  1781. aber auch irgendwann einmal "andern, man sollte sich also nicht auf das
  1782. augenblickliche Verhalten verlassen.
  1783.  
  1784. %%---------------------------------------------------------------------------
  1785.  
  1786. \section{Formelausdr"ucke}
  1787.  
  1788. An den meisten Stellen, an denen der Assembler Zahlenangaben erwartet,
  1789. k"onnen nicht nur einfache Symbole oder Konstanten angegeben werden,
  1790. sondern ganze Formelausdr"ucke.  Bei den Komponenten der Formelausdr"ucke
  1791. kann es sich sowohl um ein einzelnes Symbol als auch um eine Konstante
  1792. handeln.  Konstanten d"urfen entweder Integer-, Gleitkomma-, oder
  1793. Stringkonstanten sein.
  1794.  
  1795. \subsection{Integerkonstanten}
  1796. \label{SectIntConsts}
  1797.  
  1798. Integerkonstanten bezeichnen ganze Zahlen.  Sie werden als eine
  1799. Folge von Ziffern geschrieben.  Dies kann in verschiedenen
  1800. Zahlensystemen erfolgen, deren Notation von verwendeten
  1801. Zielprozessor abh"angt (Tabelle
  1802. \ref{TabSystems}).
  1803. \par
  1804. \begin{table*}[htbp]
  1805. \begin{center}\begin{tabular}{|l|c|c|c|c|}
  1806. \hline
  1807.            & Intel-Modus     & Motorola-Modus & C-Modus  & IBM-Modus  \\
  1808. \hline
  1809. \hline
  1810. dezimal     & direkt          & direkt      & direkt      & direkt \\
  1811. hexadezimal & Suffix H        & Pr"afix \$  & Pr"afix 0x  & X'..' oder H'..' \\
  1812. \ii{Kennung}& \tty{hexh}      & \tty{\$hex} & \tty{0xhex} & \tty{x'hex'} \\
  1813.            &                 &             &             & \tty{h'hex'} \\
  1814. bin"ar      & Suffix B        & Pr"afix \%  & Pr"afix 0b  & B'..' \\
  1815. \ii{Kennung}& \tty{binb}      & \tty{\%bin} & \tty{0bbin} & \tty{b'bin'} \\
  1816. oktal       & Suffix O oder Q & Pr"afix @   & Pr"afix 0   & O'..' \\
  1817. \ii{Kennung}& \tty{octo}      & \tty{@oct}  & \tty{0oct}  & \tty{o'oct'} \\  
  1818.            & \tty{octq}      &             &             & \\
  1819. ASCII       &                 &             &             & A'..' \\
  1820. \ii{Kennung}&                 &             &             & \tty{a'asc'} \\
  1821. \hline
  1822. \end{tabular}\end{center}
  1823. \caption{definierte Zahlensysteme und Schreibweisen\label{TabSystems}}
  1824. \end{table*}
  1825. Falls das Zahlensystem nicht explizit durch vor-oder nachgestellte Zeichen
  1826. vorgegeben wird, wird die Basis folgenderma"sen bestimmt:
  1827. \begin{itemize}
  1828. \item{Falls ein {\tt RADIX}-Befehl gegeben wurde, benutze die dadurch
  1829.      definierte Basis, ansonsten:}
  1830. \item{Falls ein {\tt -radix} Kommandozeilenschalter gegeben wurde,
  1831.      benutze die dadurch definierte Basis, ansonsten:}
  1832. \item{Verwende das Dezimalsystem (Basis 10).}
  1833. \end{itemize}
  1834. Sowohl mit dem{\tt RADIX}-Befehl als auch mit dem {\tt -radix}-Kommandozeilenschalter
  1835. lassen sich auch ,,ungew"ohnliche'' Zahlensysteme, d.h. andere als 2, 8,
  1836. 10 oder 16 einstellen.
  1837.  
  1838. G"ultige Ziffern sind die Zahlen 0 bis 9 sowie die Buchstaben A bis Z
  1839. (Wert 10 bis 35) bis zur Basis des Zahlensystems minus eins.  Die ASCII-
  1840. Darstellung f"allt etwas aus diesem System heraus: hier beschreibt der
  1841. ASCII-Wert (bzw. der Code im aktuell eingestellten Zeichensatz, siehe
  1842. Abschnitt \ref{SectCHARSET}) ein ganzes Byte.  Solcherart geschriebene
  1843. Integer-Konstanten sind also letzten Endes identisch zu Multi-Character-Konstanten.
  1844. Die beiden Schreibweisen:
  1845. \begin{verbatim}
  1846. 'ABCD'
  1847. A'ABCD'
  1848. \end{verbatim}
  1849. sind also identisch, das vorangestellte 'A' ist eigentlich redundant.  Man
  1850. kann diese Schreibweise aber f"ur existierenden Code erlauben, weil einige "altere
  1851. Original-Assembler (z.B. Signetics 2650) diese Schreibweise unterst"utzen.
  1852.  
  1853. Multi-Character-Konstanten sind bei \asname{} grunds"atzlich immer Big-Endian,
  1854. d.h. 'ABCD' ergibt den Zahlenwert 0x41424344.  Warum das so ist? Naja,
  1855. das erste \asname{}-Target war der Motorola 68000, und es hat sich nie jemand
  1856. dar"uber beklagt...die einzige Ausnahme von
  1857. dieser Regel ist die PDP-11 (und der einen LSI-11 nutzende WD16):  zwecks
  1858. besserer Kompatibilit"at zum MACRO-11 von DEC sind solche Konstanten
  1859. ausnahmsweise Little-Endian, 'AB' ergibt also den Zahlenwert 0x4241.
  1860.  
  1861. Die Verwendung von Buchstaben in Integerkonstanten bringt allerdings auch
  1862. einige Mehrdeutigkeiten mit sich, da Symbolnamen ja auch Ketten aus Zahlen
  1863. und Buchstaben sind: Ein Symbolname darf nicht mit einem Zeichen von 0 bis
  1864. 9 beginnen, was bedeutet, da"s eine Integerkonstante, die nicht durch ein
  1865. anderes Sonderzeichen eindeutig als solche erkennbar ist, niemals mit
  1866. einem Buchstaben beginnen darf; notfalls mu"s man eine eigentlich
  1867. "uberfl"ussige Null voranstellen.  Der bekannteste Fall ist das Schreiben
  1868. von Hexadezimalkonstanten im Intel-Modus: Ist die vorderste Stelle
  1869. zwischen A und F, so hilft das hintangestellte H "uberhaupt nichts, es
  1870. mu"s noch eine Null davor (statt F0H also 0F0H).  Die Motorola-oder
  1871. C-Syntax, die beide das Zahlensystem am Anfang einer Integerkonstante
  1872. kennzeichnen, kennen dieses Problem nicht.
  1873.  
  1874. Reichlich heimt"uckisch ist auch, da"s bei immer h"oheren, mit {\tt RADIX}
  1875. eingestellten Zahlensystemen, die bei Intel- und C-Syntax benutzten
  1876. Buchstaben zur Zahlensystemkennung immer weiter ,,aufgefressen'' werden; so
  1877. kann man z.B. nach {\tt RADIX 16} keine bin"aren Konstanten mehr
  1878. schreiben, und ab {\tt RADIX 18} in Intel-Syntax auch keine hexadezimalen
  1879. Konstanten mehr.  Also {\bf VORSICHT!}
  1880.  
  1881. Welche Syntax f"ur welchen Zielprozessor im Default verwendet wird, ist
  1882. im Anhang \ref{SectPseudoInst} gesammelt.  Unabh"angig von diesem Default
  1883. ist es m"oglich, einzelne Schreibweisen mit dem \tty{INTSYNTAX}-Befehl
  1884. (siehe Abschnitt \ref{SectINTSYNTAX}) weg- oder dazuzuschalten.  Die unter
  1885. \ii{Ident} aufgef"uhrten Namen, mit einem vorangestellten Plus- oder
  1886. Minuszeichen, dienen bei diesem Befehl als Argumente.
  1887.  
  1888. Eine Art ''Generalschalter' f"ur Integer-Schreibweisen ist der
  1889. \tty{RELAXED}-Befehl (siehe Abschnitt \ref{SectRELAXED}): Unabh"angig
  1890. vom Zielprozessor k"onnen beliebige Schreibweisen verwendet werden
  1891. kann (auf Kosten der Kompatibilit"at zu Standard-Assemblern).
  1892.  
  1893. Mit \tty{INTSYNTAX} bzw. \tty{RELAXED} er"offnet sich insbesondere die
  1894. 'IBM-Schreibweise', wie man sie bei manchen Fremdassemblern antrifft,
  1895. f"ur alle Ziele:
  1896.  
  1897. Bei dieser Schreibweise wird der eigentliche Wert in Hochkommas geschrieben
  1898. und das Zahlensystem ('x' oder 'h' f"ur hexadezimal, 'o' f"ur oktal und 'b'
  1899. f"ur bin"ar) direkt davor.  Die Integer-Konstante 305419896 kann damit
  1900. also folgenderma"sen geschrieben werden:
  1901. \begin{verbatim}
  1902. x'12345678'
  1903. h'12345678'
  1904. o'2215053170'
  1905. b'00010010001101000101011001111000'
  1906. \end{verbatim}
  1907. Als weitere Variante dieser Schreibweise erlauben einige wenige Targets
  1908. das Fortlassen des schlie"senden Hochkommas, zwecks Kompatibilt"at zu
  1909. Code, der f"ur andere Assembler geschrieben wurde.  F"ur eigenen, neu
  1910. erstellten Code wird von der Verwendung abgeraten.
  1911.  
  1912. \subsection{Gleitkommakonstanten}
  1913.  
  1914. Gleitkommazahlen werden in der "ublichen halblogarithmischen
  1915. Schreibweise geschrieben, die in der allgemeinsten Form
  1916. \begin{verbatim}
  1917. [-]<Vorkommastellen>[.Nachkommastellen][E[-]Exponent]
  1918. \end{verbatim}
  1919. lautet. \bb{ACHTUNG!} Der Assembler versucht eine Konstante zuerst als
  1920. Integerkonstante zu verstehen und macht erst dann einen Versuch mit
  1921. Gleitkomma, falls dies gescheitert ist.  Will man aus irgendwelchen
  1922. Gr"unden die Auswertung als Gleitkommazahl erzwingen, so kann man
  1923. dies durch Dummy-Nachkommastellen erreichen, z.B. \tty{2.0} anstelle
  1924. \tty{2}.
  1925.  
  1926. \subsection{Stringkonstanten}
  1927. \label{SectStringConsts}
  1928.  
  1929. Stringkonstanten m"ussen in einfache oder doppelte Hochkommas
  1930. eingeschlossen werden.  Um diese selber und andere Sonderzeichen ohne
  1931. Verrenkungen in String-Konstanten einbauen zu k"onnen, wurde ein
  1932. ,,Escape-Mechanismus'' eingebaut, der C-Programmierer*innen bekannt
  1933. vorkommen d"urfte:
  1934.  
  1935. Schreibt man einen Backslash mit einer maximal dreiziffrigen Zahl im
  1936. String, so versteht der Assembler dies als Zeichen mit dem entsprechenden
  1937. dezimalen ASCII-Wert.  Alternativ kann der Zahlenwert auch hexadezimal
  1938. oder oktal mit einem vorangestellten x oder einer vorangestellten 0
  1939. geschrieben werden.  F"ur die hexadezimale Schreibweise reduziert sich die
  1940. Maximalanzahl von Stellen auf 2.  So kann man z.B. mit {\tt\verb!\3!} ein
  1941. ETX-Zeichen definieren.  Vorsicht allerdings mit der Definition von
  1942. NUL-Zeichen!  Da die C-Version \marginpar{{\em UNIX}} von \asname{} momentan
  1943. intern zur Speicherung von String-Symbolen C-Strings benutzt (die durch
  1944. NUL-Zeichen terminiert werden), sind NUL-Zeichen in Strings momentan nicht
  1945. portabel!
  1946.  
  1947. Einige besonders h"aufig gebrauchte Steuerzeichen kann man auch mit
  1948. folgenden Abk"urzungen erreichen:
  1949. \begin{quote}\begin{tabbing}
  1950. \hspace{4cm} \= \hspace{4cm} \= \kill
  1951. \verb!\b! : Backspace \> \verb!\a! : Klingel        \> \verb!\e! : Escape \\
  1952. \verb!\t! : Tabulator \> \verb!\n! : Zeilenvorschub \> \verb!\r! : Wagenr"ucklauf \\
  1953. \verb!\\! : Backslash \> \verb!\'! oder \verb!\h! : Hochkomma \\
  1954. \verb!\"! oder \verb!\i! : G"ansef"u"schen \\
  1955. \end{tabbing}\end{quote}
  1956. Die Kennbuchstaben d"urfen sowohl gro"s als auch klein geschrieben
  1957. werden.
  1958. \par
  1959. "Uber dieses Escape-Zeichen k"onnen sogar Formelausdr"ucke in den
  1960. String eingebaut werden, wenn sie in geschweifte Klammern eingefa"st
  1961. werden: z.B. ergibt
  1962. \begin{verbatim}
  1963.    message "Wurzel aus 81 : \{sqrt(81)}"
  1964. \end{verbatim}
  1965. die Ausgabe
  1966. \begin{verbatim}
  1967.    Wurzel aus 81 : 9
  1968. \end{verbatim}
  1969. Der Assembler w"ahlt anhand des Formelergebnistyps die richtige
  1970. Ausgabeform, zu vermeiden sind lediglich weitere Stringkonstanten
  1971. im Ausdruck, da der Assembler bei der Gro"s-zu-Kleinbuchstabenumwandlung
  1972. sonst durcheinander kommt.  Integer-Ausdr"ucke werden defaultm"a"sig
  1973. hexadezimal ausgegeben, dies l"a"st sich jedoch mit dem
  1974. \tty{OUTRADIX}-Befehl "andern.
  1975. \par
  1976. Bis auf den Einbau von Formelausdr"ucken ist dieser Escape-Mechanismus
  1977. auch in als ASCII definierten Integerkonstanten zul"assig, z.B. so:
  1978. \begin{verbatim}
  1979.   move.b   #'\n',d0
  1980. \end{verbatim}
  1981. Jedoch hat alles seine Grenzen, weil der dar"uber liegende Splitter, der
  1982. die Zeile in Opcode und Parameter zerlegt, nicht wei"s, womit er da
  1983. eigentlich arbeitet, z.B. hier:
  1984. \begin{verbatim}
  1985.   move.l   #'\'abc',d0
  1986. \end{verbatim}
  1987. Nach dem dritten Hochkomma findet er das Komma nicht mehr, weil er
  1988. vermutet, da"s eine weitere Zeichenkonstante beginnt, und eine
  1989. Fehlermeldung "uber eine falsche Parameterzahl ist die Folge.  Abhilfe
  1990. w"are z.B., \verb!\h! anstelle \verb!\'! zu schreiben.
  1991.  
  1992. \subsection{String- zu Integerwandlung und Zeichenkonstanten}
  1993.  
  1994. Fr"uhere Versionen von \asname{} verfolgten eine strikte Trennung von Strings
  1995. und sogenannten ''Zeichenkonstanten'': Eine Zeichenkonstante sieht
  1996. auf den ersten Blick aus wie ein String, nur sind die Zeichen in
  1997. einfache Hochkommas statt doppelte eingeschlossen.  Ein solches
  1998. Objekt hatte den Datentyp 'Integer', war also eine Zahl, deren Wert
  1999. durch den (ASCII-)Wert des jeweiligen Zeichens definiert war, und wurde
  2000. strikt von einer String-Konstante unterschieden:
  2001.  
  2002. \begin{verbatim}
  2003.   move.b   #65,d0
  2004.   move.b   #'A',d0      ; gleichwertig
  2005.   move.b   #"A",d0      ; nicht erlaubt in aelteren Versionen!
  2006. \end{verbatim}
  2007.  
  2008. Diese Unterscheidung existiert {\em nicht mehr}, es ist also egal, ob
  2009. man einfache oder doppelte Hochkommas verwendet.  Wird an einer Stelle eine
  2010. Zahl als Argument erwartet, und ein String verwendet, so erfolgt die
  2011. Umwandlung anhand der (ASCII-)Werte ''on-the-fly'' an dieser Stelle.  Im
  2012. obigen Beispiel w"urden alle drei Anweisungen den gleichen Maschinencode
  2013. erzeugen.
  2014.  
  2015. Eine solche implizite Wandlung findet auch f"ur aus mehreren Zeichen
  2016. bestehende Strings statt, die dann bisweilen als ''Mehrzeichenkonstanten''
  2017. bezeichnet werden:
  2018. \begin{verbatim}
  2019. 'A'    == $41
  2020. "AB"   == $4142
  2021. 'ABCD' == $41424344
  2022. \end{verbatim}
  2023. Mehrzeichenkonstanten sind der einzige Fall, in denen die Verwendung von
  2024. einfachen oder doppelten Hochkommas noch einen Unterschied macht.  F"ur
  2025. viele Zielprozessoren sind Pseudobefehle zur Ablage von Konstanten definiert,
  2026. die als Argument verschiedene Datentypen akzeptieren.  Will man wirklich
  2027. eine Zeichenkette haben, so mu"s man in diesem Fall weiterhin doppelte
  2028. Hochkommas verwenden:
  2029. \begin{verbatim}
  2030.    dc.w    "ab"  ; legt zwei Worte (0x0041,0x0042) ab
  2031.    dc.w    'ab'  ; legt ein Wort (0x4142) ab
  2032. \end{verbatim}
  2033. Wichtig: dies ist nicht erforderlich, wenn die Zeichenkette l"anger als die
  2034. verwendete Operandegr"o"se ist, in diesem Beispiel also l"anger als zwei
  2035. Zeichen bzw. 16 Bit.
  2036. \subsection{Evaluierung}
  2037. Die Berechnung von im Formelausdruck entstehenden Zwischenergebnissen
  2038. erfolgt immer mit der h"ochsten auf dem Host-System verf"ugbaren Wortbreite.
  2039. Bei Ganzzahlen sind dies 32 oder 64 Bit, und bei Gleitkommazahlen
  2040. ca. +/-$1.8*10^{308}$ (IEEE Double Precision) oder ca. +/-$1.1*10^{4932}$
  2041. (IEEE Extended Precision).  Eine eventuelle Pr"ufung auf
  2042. Wertebereichs"uberschreitungen findet erst am Endergebnis statt.
  2043. \subsection{Operatoren}
  2044. Der Assembler stellt zur Verkn"upfung die in Tabelle \ref{TabOps} genannten
  2045. Operanden zur Verf"ugung.
  2046. \begin{table*}[htbp]
  2047. \begin{center}\begin{tabular}{|c|l|c|c|c|c|c|c|}
  2048. \hline
  2049. Op. & Funktion & \#Ops. & Int & Float & String & Register & Rang \\
  2050. \hline
  2051. \hline
  2052. $<>$        & Ungleichheit         & 2 & ja   & ja   & ja   & ja   & 14 \\
  2053. $!=$        & Alias f"ur $<>$      &   &      &      &      &      &    \\
  2054. $>=$        & gr"o"ser o. gleich   & 2 & ja   & ja   & ja   & ja   & 14 \\
  2055. $<=$        & kleiner o. gleich    & 2 & ja   & ja   & ja   & ja   & 14 \\
  2056. $<$         & echt kleiner         & 2 & ja   & ja   & ja   & ja   & 14 \\
  2057. $>$         & echt gr"o"ser        & 2 & ja   & ja   & ja   & ja   & 14 \\
  2058. $=$         & Gleichheit           & 2 & ja   & ja   & ja   & ja   & 14 \\
  2059. $==$        & Alias f"ur $=$       &   &      &      &      &      &    \\
  2060.            & & & & & &  \\
  2061. $!!$        & log. XOR             & 2 & ja   & nein & nein & nein & 13 \\
  2062. $||$        & log. OR              & 2 & ja   & nein & nein & nein & 12 \\
  2063. \&\&        & log. AND             & 2 & ja   & nein & nein & nein & 11 \\
  2064. \verb! ~~ ! & log. NOT             & 1 & ja   & nein & nein & nein & 2 \\
  2065.            & & & & & &  \\
  2066. -           & Differenz            & 2 & ja   & ja   & nein & nein & 10 \\
  2067. +           & Summe                & 2 & ja   & ja   & ja   & nein & 10 \\
  2068. \#          & Modulodivision       & 2 & ja   & nein & nein & nein & 9 \\
  2069. /           & Quotient             & 2 & ja*) & ja   & nein & nein & 9 \\
  2070. \verb! * !  & Produkt              & 2 & ja   & ja   & nein & nein & 9 \\
  2071. \verb! ^ !  & Potenz               & 2 & ja   & ja   & nein & nein & 8 \\
  2072.            & & & & & &  \\
  2073. $!$         & bin"ares XOR         & 2 & ja   & nein & nein & nein & 7 \\
  2074. $|$         & bin"ares OR          & 2 & ja   & nein & nein & nein & 6 \\
  2075. \&          & bin"ares AND         & 2 & ja   & nein & nein & nein & 5 \\
  2076. $><$        & Bitspiegelung        & 2 & ja   & nein & nein & nein & 4 \\
  2077. $>>$        & log. Rechtsschieben  & 2 & ja   & nein & nein & nein & 3 \\
  2078. $<<$        & log. Linksschieben   & 2 & ja   & nein & nein & nein & 3 \\
  2079. \verb! ~ !  & bin"ares NOT         & 1 & ja   & nein & nein & nein & 1 \\
  2080. \hline
  2081. \multicolumn{8}{|l|}{*) Rest wird verworfen} \\
  2082. \hline
  2083. \end{tabular}\end{center}
  2084. \caption{in \asname{} definierte Operatoren\label{TabOps}}
  2085. \end{table*}
  2086. Unter ,,Rang'' ist dabei die Priorit"at zu verstehen, die dieser Operator bei
  2087. der Teilung eines Ausdruckes in Unterausdr"ucke hat, der rangh"ochste
  2088. Operator wird also \ii{zuletzt} ausgewertet.  Die Reihenfolge der
  2089. Evaluierung l"a"st sich durch Klammerung neu festlegen.
  2090. \par
  2091. Die Vergleichsoperatoren liefern TRUE, falls die Bedingung zutrifft,
  2092. und FALSE falls nicht.  Vergleiche betrachten Integerzahlen dabei als
  2093. 32 oder 64 Bit breit (je nach Host-System) und vorzeichenbehaftet. F"ur
  2094. die logischen Operatoren ist ein Ausdruck TRUE, falls er ungleich 0 ist,
  2095. ansonsten FALSE.
  2096. \par
  2097. Grunds"atzlich ist bei Operatoren mit zwei Argumenten nicht definiert, in
  2098. welcher Reihenfolge die Operanden bestimmt werden.  Die einzige Ausnahme
  2099. von dieser Regel sind das logische AND und OR: Falls das Ergebnis bereits
  2100. durch den linken Operanden eindeutig bestimmt ist, wird der rechte
  2101. Operand nicht mehr ausgewertet,
  2102. \par
  2103. Bei Vergleichen von Register-Symbolen sind zwei Details zu beachten.
  2104. Zum einen sind zwei Register-Symbole dann gleich, wenn sie auf das
  2105. gleiche Register verweisen.  Da Register bei einigen Prozessoren
  2106. Alias-Namen haben, werden diese Aliase als gleich betrachtet.  Zum
  2107. Beispiel ist das Register {\tt A7} auf einem 68000 auch als {\tt SP}
  2108. ansprechbar, und diese beiden Registersymbole sind gleich.  Zum anderen
  2109. haben manche Prozessoren mehrere S"atze von Registern, auf einem 68040
  2110. zum Beispiel die normalen (Integer-)Register und die FPU-Register.
  2111. Zwischen zwei Registern aus unterschiedlichen Gruppen l"a"st sich
  2112. keine kleiner/gr"o"ser-Beziehung angeben, die entsprechenden Operatoren
  2113. liefern immer ein FALSE zur"uck.  Lediglich ein Test auf Gleichheit oder
  2114. Ungleichheit ergibt einen Sinn.
  2115. \par
  2116. Die Bitspiegelung ist wohl etwas erkl"arungsbed"urftig: Der Operator
  2117. spiegelt die untersten Bits im ersten Operanden, l"a"st die
  2118. dar"uberliegenden Bits aber unver"andert.  Die Zahl der zu spiegelnden
  2119. Bits ist der rechte Operand und darf zwischen 1 und 32 liegen.
  2120. \par
  2121. Eine keine Fu"sangel beim bin"aren Komplement: Da die Berechnung
  2122. grunds"atzlich auf 32- oder 64-Bit-Ebene erfolgt, ergibt seine Anwendung
  2123. auf z.B. 8-Bit-Masken "ublicherweise Werte, die durch voranstehende
  2124. Einsen nicht mehr im entferntesten in 8-Bit-Zahlen hineinpassen.  Eine
  2125. bin"are UND-Verkn"upfung mit einer passenden Maske ist daher unvermeidlich!
  2126. \subsection{Funktionen}
  2127. Zus"atzlich zu den Operatoren definiert der Assembler noch eine Reihe
  2128. in erster Linie transzendenter Funktionen mit Gleitkomma-Argument, die
  2129. Tabellen \ref{TabFuncs1} und \ref{TabFuncs2} auflisten.
  2130. \begin{table*}[htbp]
  2131. \begin{center}\begin{tabular}{|l|l|l|l|}
  2132. \hline
  2133. Name     & Funktion             & Argument & Ergebnis \\
  2134. \hline
  2135. \hline
  2136. SQRT     & Quadratwurzel        & $arg \geq 0$ & Gleitkomma \\
  2137.         &                      & & \\
  2138. SIN      & Sinus                & $arg \in \rz$ & Gleitkomma \\
  2139. COS      & Kosinus              & $arg \in \rz$ & Gleitkomma \\
  2140. TAN      & Tangens              & $arg \neq (2*n+1)*\frac{\pi}{2}$ & Gleitkomma \\
  2141. COT      & Kotangens            & $arg \neq n*\pi$ & Gleitkomma \\
  2142.         &                      & & \\
  2143. ASIN     & inverser Sinus       & $\mid arg \mid \leq 1$ & Gleitkomma \\
  2144. ACOS     & inverser Kosinus     & $\mid arg \mid \leq 1$ & Gleitkomma \\
  2145. ATAN     & inverser Tangens     & $arg \in \rz$ & Gleitkomma \\
  2146. ACOT     & inverser Kotangens   & $arg \in \rz$ & Gleitkomma \\
  2147.         &                      & & \\
  2148. EXP      & Exponentialfunktion  & $arg \in \rz$ & Gleitkomma \\
  2149. ALOG     & 10 hoch Argument     & $arg \in \rz$ & Gleitkomma \\
  2150. ALD      & 2 hoch Argument      & $arg \in \rz$ & Gleitkomma \\
  2151. SINH     & hyp. Sinus           & $arg \in \rz$ & Gleitkomma \\
  2152. COSH     & hyp. Kosinus         & $arg \in \rz$ & Gleitkomma \\
  2153. TANH     & hyp. Tangens         & $arg \in \rz$ & Gleitkomma \\
  2154. COTH     & hyp. Kotangens       & $arg \neq 0$ & Gleitkomma \\
  2155.         &                      & & \\
  2156. LN       & nat. Logarithmus     & $arg > 0$ & Gleitkomma \\
  2157. LOG      & dek. Logarithmus     & $arg > 0$ & Gleitkomma \\
  2158. LD       & 2er Logarithmus      & $arg > 0$ & Gleitkomma \\
  2159. ASINH    & inv. hyp. Sinus      & $arg \in \rz$ & Gleitkomma \\
  2160. ACOSH    & inv. hyp. Kosinus    & $arg \geq 1$ & Gleitkomma \\
  2161. ATANH    & inv. hyp. Tangens    & $\mid arg \mid < 1$ & Gleitkomma \\
  2162. ACOTH    & inv. hyp. Kotangens  & $\mid arg \mid > 1$ & Gleitkomma \\
  2163.         &                      & & \\
  2164. INT      & ganzzahliger Anteil  & $arg \in \rz$ & Integer \\
  2165.         &                      & & \\
  2166. BITCNT   & bin"are Quersumme    & Integer      & Integer \\
  2167. FIRSTBIT & niedrigstes 1-Bit    & Integer      & Integer \\
  2168. LASTBIT  & h"ochstes 1-Bit      & Integer      & Integer \\
  2169. BITPOS   & einziges 1-Bit       & Integer      & Integer \\
  2170. \hline
  2171. \end{tabular}\end{center}
  2172. \caption{vordefinierte Funktionen in \asname{} - Teil 1 (Integer- und
  2173.         Gleitkomma-Funktionen)\label{TabFuncs1}}
  2174. \end{table*}
  2175. \begin{table*}[htb]
  2176. \begin{center}\begin{tabular}{|l|l|l|l|}
  2177. \hline
  2178. Name     & Funktion             & Argument & Ergebnis \\
  2179. \hline
  2180. \hline
  2181. SGN         & Vorzeichen (0/1/-1)   & Integer oder & Integer \\
  2182.            &                       & Gleitkomma   & \\
  2183. ABS         & Betrag                & Integer oder & Integer oder \\
  2184.            &                       & Gleitkomma   & Gleitkomma \\
  2185. TOUPPER     & pass. Gro"sbuchstabe  & Integer      & Integer \\
  2186. TOLOWER     & pass. Kleinbuchstabe  & Integer      & Integer \\
  2187. UPSTRING    & wandelt alle Zeichen  & String       & String \\
  2188.            & in Gro"sbuchstaben    &              & \\
  2189. LOWSTRING   & wandelt alle Zeichen  & String       & String \\
  2190.            & in Kleinbuchstaben    &              & \\
  2191. STRLEN      & liefert L"ange eines  & String       & Integer \\
  2192.            & Strings               &              & \\
  2193. SUBSTR      & extrahiert Teil eines & String,      & String \\
  2194.            & Strings               & Integer,     & \\
  2195.            &                       & Integer      & \\
  2196. CHARFROMSTR & extrahiert ein        & String,      & Integer \\
  2197.            & Zeichen aus einem     & Integer      & \\
  2198.            & String                &              & \\
  2199. STRSTR      & sucht Teilstring in   & String,      & Integer \\
  2200.            & einem String          & String       & \\
  2201. VAL         & evaluiert Stringin-   & String       & abh. von \\
  2202.            & halt als Ausdruck     &              & Argument \\
  2203. EXPRTYPE    & liefert Typ des       & Integer,     & 0 \\
  2204.            & Arguments             & Gleitkomma,  & 1 \\
  2205.            &                       & String       & 2 \\
  2206. \hline
  2207. \end{tabular}\end{center}
  2208. \caption{vordefinierte Funktionen in \asname{} - Teil 2
  2209.         (Integer- und String-Funk\-tio\-nen)\label{TabFuncs2}}
  2210. \end{table*}
  2211. Die Funktionen \tty{FIRSTBIT}, \tty{LASTBIT} und \tty{BITPOS} liefern
  2212. als Ergebnis -1, falls "uberhaupt kein bzw. nicht genau ein Bit gesetzt
  2213. ist. Zus"atzlich gibt \tty{BITPOS} in einem solchen Fall eine
  2214. Fehlermeldung aus.
  2215. \par
  2216. Die String-Funktion \tty{SUBSTR} erwartet als ersten Parameter den
  2217. Quellstring, als zweiten die Startposition und als dritten die Anzahl zu
  2218. extrahierender Zeichen (eine 0 bedeutet, alle Zeichen bis zum Ende zu
  2219. extrahieren).  Analog erwartet \tty{CHARFROMSTR} den Quellstring als
  2220. erstes Argument und die Zeichenposition als zweites Argument.  Falls die
  2221. angegebene Position gr"o"ser oder gleich der L"ange des Quellstrings ist,
  2222. liefert \tty{SUBSTR} einen Leerstring, w"ahrend \tty{CHARFROMSTR} eine -1
  2223. ergibt.  Eine Position kleiner Null wird von \tty{SUBSTR} als Null
  2224. behandelt, w"ahrend \tty{CHARFROMSTR} in diesem Fall ebenfalls eine -1
  2225. liefert.
  2226. Hier ein Beispiel, wie man die beiden Funktionen einsetzt, um einen
  2227. String im Speicher abzulegen, wobei das String-Ende durch ein gesetztes
  2228. MSB gekennzeichnet ist:
  2229. \begin{verbatim}
  2230. dbstr   macro   arg
  2231.        if      strlen(arg) > 1
  2232.         db     substr(arg, 0, strlen(arg) - 1)
  2233.        endif
  2234.        if      strlen(arg) > 0
  2235.         db     charfromstr(arg, strlen(arg) - 1) | 80h
  2236.        endif
  2237.        endm
  2238. \end{verbatim}
  2239. \tty{STRSTR} liefert das erste Auftreten des zweiten Strings
  2240. im ersten bzw. -1, falls das Suchmuster nicht gefunden wurde.
  2241. Analog zu \tty{SUBSTR} und \tty{CHARFROMSTR} hat das erste
  2242. Zeichen den Positionswert 0.
  2243. Wenn eine Funktion auch Gleitkommaargumente erwartet, so soll
  2244. dies nicht bedeuten, da"s man nicht z.B.
  2245. \begin{verbatim}
  2246. wur2   equ      sqrt(2)
  2247. \end{verbatim}
  2248. schreiben d"urfte --- in solchen F"allen findet automatisch eine
  2249. Typkonvertierung statt.  Umgekehrt mu"s allerdings die \tty{INT}-Funktion
  2250. angewandt werden, um eine Gleitkommazahl ganz zu bekommen.  Bei der
  2251. Benutzung dieser Funktion ist zu beachten, da"s sie als Ergebnis
  2252. immer einen vorzeichenbehafteten Integer liefert, sie hat also
  2253. einen Wertebereich von ca. +/-2.0E9.
  2254. \par
  2255. Schaltet man \asname{} in den case-sensitiven Modus, so k"onnen im
  2256. Gegensatz zu vordefinierten Symbolen die vordefinierten Funktionen
  2257. weiterhin in beliebiger Schreibweise angesprochen werden.  Bei
  2258. selbst definierten Funktionen (siehe Abschnitt \ref{SectFUNCTION}
  2259. wird allerdings unterschieden.  Dies  hat zur Folge, da"s z.B. bei
  2260. der Definition einer Funktion \tty{Sin} man mit \tty{Sin} diese
  2261. Funktion auch erreicht, mit allen anderen Schreibweisen jedoch die
  2262. eingebaute Funktion.
  2263. \par
  2264. F"ur die korrekte Umwandlung \marginpar{{\em DOS/}} von Klein-zu
  2265. Gro"sbuchstaben ist eine DOS-Version $\geq$ 3.30
  2266. erforderlich.
  2267.  
  2268. \vspace{2mm}
  2269. \marginpar{{\em DPMI}}
  2270.  
  2271. %%---------------------------------------------------------------------------
  2272.  
  2273. \section{Vorw"artsreferenzen und andere Desaster}
  2274. \label{ForwRefs}
  2275.  
  2276. Dieser Abschnitt ist das Produkt eines gewissen Grolls auf die (durchaus
  2277. legale) Art und Weise, wie einige Leute programmieren, die in Zusammenhang
  2278. mit \asname{} bisweilen das eine oder andere Problem verursachen kann.  Die Rede
  2279. ist hier von sogenannten ,,Vorw"artsreferenzen''.  Was unterscheidet eine
  2280. Vorw"artsreferenz von einer normalen Referenz?  Dazu sehe man sich folgendes
  2281. Programmbeispiel an (man sehe mir bitte meine -- auch im Rest dieser Anleitung
  2282. anzutreffende -- 68000-Lastigkeit nach):
  2283. \begin{verbatim}
  2284.        move.l  #10,d0
  2285. loop:   move.l  (a1),d1
  2286.        beq     skip
  2287.        neg.l   d1
  2288. skip:   move.l  d1,(a1+)
  2289.        dbra    d0,loop
  2290. \end{verbatim}
  2291. Denkt man sich den Scheifenrumpf mit dem Sprung weg, so bleibt ein
  2292. "au"serst angenehm zu assemblierendes Programm "ubrig: die einzige
  2293. Referenz ist der R"ucksprung zum Anfang des Rumpfes, und da ein
  2294. Assembler ein Programm von vorne nach hinten durcharbeitet, hat er
  2295. den Symbolwert bereits ermittelt, bevor er ihn zum erstem Mal ben"otigt.
  2296. Sofern man ein Programm hat, das nur solche R"uckw"artsreferenzen besitzt,
  2297. ist man in der angenehmen Lage, nur einmal durch den Quellcode gehen zu
  2298. m"ussen, um den korrekten und optimalen Maschinencode zu finden.  Einige
  2299. Hochsprachen wie Pascal mit ihrer strikten Regel, da"s alles vor der ersten
  2300. Benutzung definiert sein mu"s, nutzen genau diese Eigenschaft aus, um den
  2301. "Ubersetzungsvorgang zu beschleunigen.
  2302.  
  2303. Leider ist die Sache im Falle von Assembler nicht so einfach, denn man
  2304. will ja bisweilen auch vorw"arts im Code springen oder mu"s aus bestimmten
  2305. Gr"unden Variablen Definitionen hinter den Code verlegen.  Dies ist
  2306. im Beispiel der Fall f"ur den bedingten Sprung, mit dem ein anderer
  2307. Befehl "ubersprungen wird.  Wenn der Assembler im ersten Durchlauf auf
  2308. den Sprungbefehl trifft, so sieht er sich mit der Situation konfrontiert,
  2309. entweder die Teilfelder der Instruktion, die die Sprungadresse beinhalten,
  2310. leer zulassen, oder seitens des Formelparsers (der das Adre"sargument ja
  2311. auswerten mu"s) anstelle des korrekten, aber unbekannten Wertes einen Wert
  2312. anzubieten, der ,,niemandem wehtut''.  Bei einem einfachen Assembler, der
  2313. nur eine Zielarchitektur kennt und bei dem sich die betroffenen Befehle
  2314. an einer Hand abz"ahlen lassen, wird man sicher die erste Variante w"ahlen,
  2315. bei \asname{} mit seinen vielen Dutzend Zielen w"are die Zahl der Sonderabfragen
  2316. aber extrem hoch geworden, so da"s nur der zweite Weg in Frage kam: Falls
  2317. im ersten Pass ein unbekanntes Symbol auftaucht, so liefert der Formelparser
  2318. den momentanen Stand des Programmz"ahlers als Ergebnis zur"uck!  Nur dieser
  2319. Wert ist geeignet, relativen Spr"ungen mit Sprungdistanzen unbekannter
  2320. L"ange eine Adresse anzubieten, die nicht zu Fehlern f"uhrt.  Dies beantwortet
  2321. auch die bisweilen gestellte Frage, warum in einem Listing des ersten
  2322. Passes (dies bleibt z.B. stehen, wenn \asname{} aufgrund anderer Fehler den
  2323. zweiten Pass erst gar nicht beginnt), z.T. falsche Adressen im erzeugten
  2324. Bin"arcode gezeigt werden - dies sind noch nicht aufgel"oste
  2325. Vorw"artsreferenzen.
  2326.  
  2327. Das obige Beispiel offenbart allerdings noch eine weitere Schwierigkeit
  2328. von Vorw"artsreferenzen: Je nach Abstand von Quelle und Ziel im Code kann
  2329. der Sprungbefehl entweder lang oder kurz sein.  Diese Entscheidung "uber
  2330. die Code-L"ange - und damit auch die Adressen folgender Labels - kann
  2331. jedoch mangels genauer Kenntnis der Zieladresse im ersten Pass nicht
  2332. erfolgen.  Sofern der Programmierer nicht explizit kenntlich gemacht hat,
  2333. ob der Sprung lang oder kurz sein soll, behelfen sich reine 2-Pass-Assembler
  2334. wie "altere MASM-Versionen von Microsoft damit, im ersten Pass (nach diesem
  2335. m"ussen alle Adressen festliegen) Platz f"ur die l"angste Version zu
  2336. reservieren und im zweiten Pass den "ubersch"ussigen Platz mit \tty{NOP}s
  2337. aufzuf"ullen.  \asname{}-Versionen bis 1.37 taten dieses ebenfalls, danach bin
  2338. ich auf das Multipass-Verfahren "ubergegangen, das die strenge Einteilung
  2339. in zwei Passes aufhebt und beliebig viele Durchg"ange erlaubt.  Dazu wird
  2340. im ersten Pass der optimale Code mit den angenommenen Symbolwerten erzeugt.
  2341. Stellt \asname{} fest, da"s im zweiten Pass durch Codel"angenver"anderungen sich
  2342. Werte von Symbolen ge"andert haben, so wird einfach noch ein dritter Pass
  2343. eingelegt, und da durch die neuen Symbolwerte des zweiten Passes auch
  2344. im dritten Pass sich der Code wieder verk"urzen oder verl"angern kann,
  2345. ist ein weiterer Pass nicht unm"oglich.  Ich habe schon 8086-Programme
  2346. erlebt, bei denen erst nach 12 Durchg"angen alles stimmte.  Leider
  2347. erlaubt dieser Mechanismus nicht die Vorgabe einer Maximalzahl von
  2348. Durchl"aufen, ich kann als Regel nur sagen, da"s die Anzahl von Durchl"aufen
  2349. sinkt, je mehr man davon Gebrauch macht, Sprung- oder Adre"sl"angen explizit
  2350. vorzugeben.
  2351.  
  2352. Speziell bei gro"sen Programmen kann es zu einer interessanten Situation
  2353. kommen: Die Lage eines vorw"arts gerichteten Sprunges hat sich
  2354. im zweiten Pass so weit gegen"uber dem ersten verschoben, da"s der
  2355. jetzt noch benutzte Label-Wert aus dem ersten Pass au"serhalb der
  2356. erlaubten Sprungdistanz liegt.  \asname{} ber"ucksichtigt solche Situationen,
  2357. indem er jegliche Fehlermeldungen "uber zu weite Sprungdistanzen unterdr"uckt,
  2358. sobald er erkannt hat, da"s er wegen sich "andernder Symbolwerte ohnehin
  2359. einen weiteren Durchlauf machen mu"s.  Dies funktioniert zwar in 99\%
  2360. aller F"alle, es gibt jedoch auch Konstrukte, in denen der erste, derartig
  2361. kritische Befehl bereits auftaucht, bevor \asname{} eine Chance hat, zu erkennen,
  2362. da"s ein neuer Pass erforderlich ist.  Das folgende Beispiel konstruiert
  2363. eine solche Situation mit Hilfe einer Vorw"artsreferenz (und war der
  2364. Anla"s f"ur die "Uberschrift dieses Abschnitts...):
  2365. \begin{verbatim}
  2366.        cpu   6811
  2367.  
  2368.        org     $8000
  2369.        beq     skip
  2370.        rept    60
  2371.         ldd    Var
  2372.        endm
  2373. skip:   nop
  2374. Var     equ     $10
  2375. \end{verbatim}
  2376. Aufgrund der Adre"slage nimmt \asname{} im ersten Pass lange Adressen f"ur die
  2377. \tty{LDD}-Befehle an, was eine Code-L"ange von 180 Bytes ergibt und im
  2378. zweiten Pass (zum Zeitpunkt des \tty{BEQ}-Befehls ist noch der ,,falsche''
  2379. Wert von \tty{skip} aktuell, d.h. \asname{} wei"s zu diesem Zeitpunkt noch nicht,
  2380. da"s der Code in Wirklichkeit nur 120 Bytes lang ist) gibt es eine
  2381. Fehlermeldung wegen einer "uberschrittenen Sprungdistanz.  Dieser Fehler
  2382. l"a"st sich auf drei Arten vermeiden:
  2383. \begin{enumerate}
  2384. \item{Weisen Sie \asname{} explizit darauf hin, da"s er f"ur die \tty{LDD}-Befehle
  2385.      kurze Adressen verwenden darf (\tty{ldd <Var})}
  2386. \item{Entfernen Sie diese vermaledeite, verfluchte Vorw"artsreferenz und
  2387.      setzen Sie die \tty{EQU}-Anweisung nach vorne, wo sie hingeh"ort
  2388.      (OK, ich beruhige mich ja schon wieder...)}
  2389. \item{F"ur ganz Unentwegte: Benutzten Sie die \tty{-Y}-Option, so da"s \asname{} die
  2390.      Fehlermeldung beim Erkennen der Adre"sverschiebung nachtr"aglich
  2391.      verwirft.  Nicht sch"on, aber...}
  2392. \end{enumerate}
  2393. Noch ein Hinweis zum \tty{EQU}-Befehl:  Da \asname{} nicht wissen kann, in welchem
  2394. Zusammenhang ein mit \tty{EQU} definiertes Symbol sp"ater verwendet wird,
  2395. wird ein \tty{EQU} mit Vorw"artsreferenzen im ersten Pass "uberhaupt nicht
  2396. durchgef"uhrt.  Wird das mit \tty{EQU} definierte Symbol also im zweiten
  2397. Pass vorw"arts referenziert:
  2398. \begin{verbatim}
  2399.        move.l  #sym2,d0
  2400. sym2    equ     sym1+5
  2401. sym1    equ     0
  2402. \end{verbatim}
  2403. so handelt man sich im zweiten Pass eine Fehlermeldung wegen eines
  2404. undefinierten Symbols ein...aber warum machen Leute eigentlich solche
  2405. Dinge ???
  2406.  
  2407. Zugegeben, das war ein ziemlich l"anglicher Ausflug, aber es mu"ste einfach
  2408. einmal sein.  Was sollte man als Erkenntnis aus diesem Abschnitt mitnehmen?
  2409. \begin{enumerate}
  2410. \item{\asname{} versucht immer, den k"urzest m"oglichen Code zu erzeugen.  Dazu
  2411.      ben"otigt er eine endliche Zahl von Durchl"aufen.  Wenn man ihn
  2412.      nicht gerade knebelt, kennt \asname{} keine R"ucksichten...}
  2413. \item{Wenn sinnvoll und m"oglich, Sprung- und Adre"sl"angen explizit
  2414.      vorgeben.  Man kann damit u.U. die Anzahl der Durchl"aufe deutlich
  2415.      reduzieren.}
  2416. \item{Vorw"artsreferenzen auf das allern"otigste beschr"anken.  Man
  2417.      erleichtert sich und \asname{} das Leben damit erheblich!}
  2418. \end{enumerate}
  2419.  
  2420. %%---------------------------------------------------------------------------
  2421.  
  2422. \section{Registersymbole}
  2423. \label{SectRegSyms} \ttindex{Registersymbole}
  2424.  
  2425. {\em G"ultigkeit: PowerPC, M-Core, XGate, 4004/4040, MCS-48/(2)51, 8086,
  2426.     80C16x, AVR, XS1, Z8, KCPSM, Mico8, MSP430(X), ST9, M16, M16C, H8/300,
  2427.     H8/500, SH7x00, H16, i960, XA, 29K, TLCS-9000, KENBAK, SC/MP}
  2428.  
  2429. Manchmal ist es erw"unscht, nicht nur einer Speicheradresse oder einer
  2430. Konstanten, sondern auch einem Register einen symbolischen Namen zuzuweisen,
  2431. um seine Funktion in einem bestimmten Programmabschnitt zu verdeutlichen.
  2432. Dies ist bei Prozessoren, die die Register schlicht als einen weiteren
  2433. Adre"sraum behandeln, recht problemlos, da als Register damit auch
  2434. Zahlenausdr"ucke erlaubt sind und man solche Symbole mit schlichten
  2435. \tty{EQU}s definieren kann (z.B. bei MCS-96 oder TMS7000).  Bei den
  2436. allermeisten Prozessoren jedoch sind Registernamen festgelegte Literale, und
  2437. \asname{} behandelt sie beim Parsing aus Geschwindigkeitsgr"unden gesondert, so da"s auch
  2438. ein getrennter Typ von Symbolen f"ur solche Registersymbole oder -aliase existiert.
  2439. Registersymbole k"onnen wie gew"ohnliche Symbole mit \tty{EQU} oder \tty{SET}
  2440. definiert und umdefiniert werden, zudem existiert eine spezielle \tty{REG}-Anweisung,
  2441. die explizit nur Symbole bzw. Ausdr"ucke dieses Typs akzeptiert.
  2442.  
  2443. Registersymbole unterliegen einer Reihe von Einschr"ankungen: zum einen ist die
  2444. Menge der Literale beschr"ankt und durch den jeweiligen Zielprozessor vorgegeben,
  2445. zum anderen kann man mit Registersymbolen nicht rechnen.  Etwas in dieser Form:
  2446. \begin{verbatim}
  2447. myreg   reg     r17         ; Definition Registersymbol
  2448.        addi    myreg+1,3   ; geht nicht!
  2449. \end{verbatim}
  2450. ist also {\em nicht} zul"assig.  Einfache Zuweisungen sind dagegen auch "uber mehrere
  2451. Stufen hinweg erlaubt:
  2452. \begin{verbatim}
  2453. myreg   reg     r17         ; Definition Registersymbol
  2454. myreg2  reg     myreg       ; myreg2 -> r17
  2455. \end{verbatim}
  2456. Des weiteren sind Vorw"artsreferenzen bei Registersymbolen noch kritischer als
  2457. bei anderen Typen von Symbolen.  Ist ein Symbol nicht definiert, so kann \asname{} nur
  2458. mutma"sen, was f"ur ein Typ von Symbol es sein wird, und entscheidet sich in
  2459. Zweifelsfall f"ur eine einfache Zahl, was bei den meisten Prozessoren einem Zugriff
  2460. auf eine absolute Adresse im Speicher gleichkommt.  Nun sind bei den meisten
  2461. Prozessoren die Nutzungsm"oglichkeiten f"ur Speicheradressen als Operand deutlich
  2462. eingeschr"ankter als f"ur Register.  Je nach Situation erh"alt man so eine
  2463. Fehlermeldung "uber einen nicht erlaubten Adressierungsmodus, und es kommt zu keinem
  2464. zweiten Pass...
  2465.  
  2466. Registersymbole sind analog zu normalen Symbolen lokal zu Sektionen,
  2467. und es ist auch durch Anh"angen eines in eckige Klammern gesetzten Sektionsnamens
  2468. m"oglich, auf ein Registersymbol aus einer bestimmten Sektion zuzugreifen.
  2469.  
  2470. %%---------------------------------------------------------------------------
  2471.  
  2472. \section{Sharefile}
  2473. \label{ChapShareMain} \ttindex{SHARED}
  2474.  
  2475. Diese Funktion ist ein Abfallprodukt aus den reinen 68000er-Vorg"angern
  2476. von \asname{}, da sie vielleicht doch der (die?!) eine oder andere gebrauchen
  2477. k"onnte, habe ich sie drin gelassen.  Grundproblem ist es, an bestimmte
  2478. beim Assemblieren entstehende Symbole heranzukommen, weil man evtl. mit
  2479. diesen Adre"sinformationen auf den Speicher des Zielsystems zugreifen
  2480. m"ochte.  Der Assembler erlaubt es, mit Hilfe des \tty{SHARED}-Pseudobefehles
  2481. (siehe dort) Symbolwerte extern zur Verf"ugung zu stellen.  Zu diesem
  2482. Zweck erstellt der Assembler im zweiten Pass eine Textdatei mit den
  2483. gew"unschten Symbolen und ihren Werten, die mittels Include in ein
  2484. Hochsprachen-oder weiteres Assemblerprogramm eingebunden werden k"onnen.
  2485. Das Format der Textdatei (C, Pascal oder Assembler) wird durch die
  2486. Kommandozeilenschalter \tty{p}, \tty{c} oder \tty{a} festgelegt.
  2487. \par
  2488. \bb{ACHTUNG!} Ist keiner dieser Schalter angegeben, so wird auch keine
  2489. Datei erzeugt, egal ob sich \tty{SHARED}-Befehle im Quelltext finden oder
  2490. nicht!
  2491. \par
  2492. \asname{} pr"uft beim Anlegen der Share-Datei nicht, ob bereits eine Datei gleichen
  2493. Namens existiert, eine solche wird ggfs. einfach "uberschrieben.  Eine
  2494. Abfrage halte ich nicht f"ur sinnvoll, da \asname{} dann bei jedem Lauf fragen
  2495. w"urde, ob er die alte Version der Share-Datei "uberschreiben darf, und das
  2496. w"are doch sehr l"astig...
  2497.  
  2498. %%---------------------------------------------------------------------------
  2499.  
  2500. \section{Prozessor-Aliase}
  2501. \label{SectAlias}
  2502.  
  2503. Mit Varianten g"angiger Mikrocontroller-Familien ist es wie mit
  2504. Kaninchen: Sie vermehren sich schneller, als man mit der Versorgung
  2505. hinterher kommen kann.  Im Zuge der Entwicklung von Prozessorkernen als
  2506. Bausteine f"ur ASICs und von Controller-Familien mit vom Kunden w"ahlbarer
  2507. Peripherie wird die Zahl von Controller-Varianten, die sich von einem
  2508. bekannten Typ nur in einigen Peripherie-Details unterscheiden, immer
  2509. gr"o"ser.  Die Unterscheidung der einzelnen Typen ist aber trotz meist
  2510. identischer Prozessorkerns wichtig, um z.B. in den Include-Dateien den
  2511. korrekten Satz von Peripherieregistern einzublenden.  Bisher habe ich
  2512. mich zwar immer bem"uht, die wichtigsten Vertreter einer Familie in \asname{}
  2513. einzubauen (und werde das auch weiter tun), aber manchmal l"auft mir
  2514. die Entwicklung einfach auf und davon...es mu"ste also ein Mechanismus
  2515. her, mit dem man die Liste der unterscheidbaren Prozessortypen selbst
  2516. erweitern kann.
  2517. \par
  2518. Das Ergebnis davon sind Prozessor-Aliasse: Mit der Kommandozeilenoption \tty{alias}
  2519. kann man einen neuen Prozessortyp definieren, der im Befehlssatz einem
  2520. anderen, in \asname{} fest eingebauten Typ entspricht.  Bei Benutzung dieses
  2521. Typs im \tty{CPU}-Befehl wird sich \asname{} also wie beim ,,Original'' verhalten,
  2522. mit einem Unterschied: Die Variablen \tty{MOMCPU} bzw. \tty{MOMCPUNAME}
  2523. werden auf den Namen des Alias gesetzt, wodurch der neue Name zur
  2524. Unterscheidung z.B. in Include-Dateien dienen kann.
  2525. \par
  2526. Die Definition dieser Aliasse wurde aus zwei Gr"unden mit
  2527. Kommandozeilenoptionen anstatt Pseudobefehlen vorgenommen: zum einen
  2528. w"are es ohnehin nicht m"oglich gewesen, die Definition der Aliasse
  2529. zusammen mit den Registerdefinitionen in eine Include-Datei zu legen, denn
  2530. in einem Programm, das so eine Datei benutzen wollte, m"u"ste sie ja sowohl
  2531. vor als auch nach dem \tty{CPU}-Befehl in der Hauptdatei eingebunden
  2532. werden - eine Vorstellung, die irgendwo zwischen unelegant und unm"oglich
  2533. liegt.  Zum zweiten erm"oglicht diese Implementierung, die Definition der
  2534. neuen Typen in eine Datei zu legen, die "uber die \tty{ASCMD}-Variable beim
  2535. Start automatisch ausgef"uhrt wird, ohne das sich das Programm darum
  2536. k"ummern m"u"ste.
  2537.  
  2538. %%===========================================================================
  2539.  
  2540. \cleardoublepage
  2541. \chapter{Pseudobefehle}
  2542.  
  2543. Nicht f"ur alle Prozessoren sind alle Pseudobefehle definiert.  Vor
  2544. der Beschreibung eines Befehls ist deshalb jeweils vermerkt, f"ur
  2545. welche Prozessortypen dieser Befehl erlaubt ist.
  2546.  
  2547. %%---------------------------------------------------------------------------
  2548.  
  2549. \section{Definitionen}
  2550.  
  2551. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2552.  
  2553. \subsection{SET, EQU und CONSTANT}
  2554. \ttindex{SET}\ttindex{EQU}
  2555. \ttindex{.SET}\ttindex{.EQU}
  2556. \ttindex{CONSTANT}
  2557.  
  2558. {\em G"ultigkeit: alle Prozessoren, {\tt CONSTANT} nur KCPSM(3)}
  2559.  
  2560. \tty{SET} und \tty{EQU} erlauben die Definition typenloser Konstanten, d.h. sie
  2561. werden keinem Segment zugeordnet und ihre Verwendung erzeugt in keinem
  2562. Fall eine Warnung wegen Segment-Vermischung.  W"ahrend \tty{EQU} Konstanten
  2563. definiert, die nicht wieder (mit \tty{EQU}) ge"andert werden k"onnen, erlaubt
  2564. \tty{SET} die Definition von Variablen, die sich w"ahrend des Assemblerlaufes
  2565. ver"andern lassen.  Dies ist n"utzlich z.B. bei der Allokation von
  2566. Resourcen \`a la Interrupt-Vektoren, wie im folgenden Beispiel:
  2567. \begin{verbatim}
  2568. VecCnt  SET     0         ; irgendwo am Anfang
  2569.        ...
  2570. DefVec  MACRO   Name      ; einen neuen Vektor belegen
  2571. Name    EQU     VecCnt
  2572. VecCnt  SET     VecCnt+4
  2573.        ENDM
  2574.        ...
  2575.        DefVec  Vec1      ; ergibt Vec1=0
  2576.        DefVec  Vec2      ; ergibt Vec2=4
  2577. \end{verbatim}
  2578. Intern werden Konstanten und Variablen identisch gespeichert, der
  2579. einzige Unterschied ist, da"s sie als unver"anderbar markiert werden, wenn
  2580. sie mit \tty{EQU} definiert werden.  Der Versuch, eine Konstante mit
  2581. \tty{SET} zu ver"andern, gibt eine Fehlermeldung.
  2582. \par
  2583. Mit \tty{EQU/SET} lassen sich Konstanten aller Typen definieren, z.B.
  2584. \begin{verbatim}
  2585. IntZwei   EQU   2
  2586. FloatZwei EQU   2.0
  2587. \end{verbatim}
  2588. Einige Prozessoren besitzen leider bereits selber einen \tty{SET}-Befehl.
  2589. Bei diesen mu"s \tty{EVAL} anstelle von \tty{SET} verwendet werden, falls
  2590. sich der Maschinenbefehl nicht durch die andere Anzahl der Argumente
  2591. erkennen l"a"st.  Alternativ ist es auch immer m"oglich, durch einen
  2592. vorangestellten Punkt (\tty{.SET} anstelle \tty{SET}) explizit den
  2593. Pseudobefehl aufzurufen.
  2594. \par
  2595. Anstelle von \tty{EQU} darf auch \tty{.EQU} oder einfach ein
  2596. Gleichheitszeichen geschrieben werden, analog kann man anstelle
  2597. von \tty{SET} bzw. \tty{EVAL} einfach \tty{:=} schreiben.  Des weiteren
  2598. existiert eine 'alternative' Syntax, bei der der Synbolname nicht aus dem
  2599. Feld f"ur das Label genommen wird, sondern das erste Argument ist.
  2600. Wahlweise darf man also auch schreiben:
  2601. \begin{verbatim}
  2602.          EQU   IntZwei,2
  2603.          EQU   FloatZwei,2.0
  2604. \end{verbatim}
  2605. Das Feld f"ur das Label mu"s in diesem Fall leer bleiben.
  2606. \par
  2607. Aus Kompatibilit"atsgr"unden zum Originalassembler gibt es f"ur das
  2608. KCPSM-Target auch den {\tt CONSTANT}-Befehl, der im Gegensatz zu {\tt EQU}
  2609. Namen und Wert immer als Argumente erwartet, also z.B. so:
  2610. \begin{verbatim}
  2611.      CONSTANT  const1, 2
  2612. \end{verbatim}
  2613. {\tt CONSTANT} ist allerdings auf Integer-Konstanten beschr"ankt.
  2614. \par
  2615. Defaultm"a"sig sind mit \tty{SET} oder \tty{EQU} definierte Symbole
  2616. typenlos, optional kann jedoch als zweites bzw. drittes Argument ein
  2617. Segmentname (\tty{CODE, DATA, IDATA, XDATA, YDATA, BITDATA, IO oder REG})
  2618. oder \tty{MOMSEGMENT} f"ur das aktuell gesetzte Segment angegeben werden,
  2619. um das Symbol einem bestimmten Adre"sraum zuordnen.  \asname{} ber"ucksichtigt
  2620. dabei nicht, ob der benutzte Adre"sraum bei dem aktuell gesetzten
  2621. Zielprozessor auch vorhanden ist!
  2622.  
  2623. Als kleines verstecktes Extra ist es m"oglich, "uber \tty{SET} oder \tty{EQU}
  2624. den Programmz"ahler zu setzen, also das zu machen, wozu man ansonsten \tty{ORG}
  2625. verwenden w"urde.  Dazu gibt man als Symbolnamen den Sonderwert an, mit dem
  2626. sich auch der aktuelle Programmz"ahler abfragen l"a"st, also je nach
  2627. gew"ahlter Zielarchitektur ein Stern, ein Dollarzeichen, ein Punkt oder \tty{PC}.
  2628.  
  2629. Falls die gew"ahlte Zielarchitektur ein Attribut an den Befehlen zur Angabe
  2630. der Operandengr"o"se unterst"utzt (z.B. 680x0), so ist dieses ebenfalls
  2631. bei \tty{SET} und \tty{EQU} erlaubt.  Das definierte Symbol wird dann mit
  2632. dieser Operandengr"o"se in der Symboltabelle abgelegt.  Deren Verwendung
  2633. bei Benutzung des Symbols ist architekturab"angig.
  2634.  
  2635. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2636.  
  2637. \subsection{SFR und SFRB}
  2638. \ttindex{SFR}\ttindex{SFRB}
  2639.  
  2640. {\em G"ultigkeit: diverse, SFRB nur MCS-51}
  2641.  
  2642. Diese Befehle funktionieren wie \tty{EQU}, nur sind die damit definierten
  2643. Symbole dem direkt adressierbaren Datensegment zugeordnet, d.h. sie
  2644. dienen bevorzugt zur Definition von (wie der Name ahnen l"a"st) im Daten- bzw.
  2645. I/O-Bereich eingeblendeten Hardwareregistern.  Der dabei zugelassene
  2646. Wertebereich ist identisch mit dem bei \tty{ORG} f"ur das \tty{DATA} bzw.
  2647. \tty{IO}-Segment zugelassenen (s. Abschnitt \ref{SectORG}).
  2648. \tty{SFR} und \tty{SFRB} unterscheiden sich darin,  da"s \tty{SFRB}
  2649. das Register als bitadressierbar kennzeichnet, weshalb \asname{} zus"atzlich 8
  2650. Symbole erzeugt, die dem Bitsegment zugeordnet werden und die Namen
  2651. \tty{xx.0} bis \tty{xx.7} tragen, z.B.
  2652. \begin{verbatim}
  2653. PSW     SFR     0d0h   ; ergibt PSW = D0H (Datensegment)
  2654.  
  2655. PSW     SFRB    0d0h   ; zusaetzlich PSW.0 = D0H (Bit)
  2656.                       ; bis PSW.7 = D7H (Bit)
  2657. \end{verbatim}
  2658. Da beim 80C251 grunds"atzlich alle SFRs ohne zus"atzliche Bit-Symbole
  2659. bitadressierbar sind, ist der \tty{SFRB}-Befehl f"ur ihn auch nicht mehr
  2660. definiert; die Bits \tty{PSW.0} bis \tty{PSW.7} sind automatisch vorhanden.
  2661. \par
  2662. \asname{} "uberpr"uft bei der Definition eines bitadressierbaren Registers mit
  2663. \tty{SFRB}, ob die Speicherstelle "uberhaupt bitadressierbar ist (Bereich
  2664. 20h..3fh bzw. 80h, 88h, 90h, 98h...0f8h).  Ist sie es nicht, so wird eine
  2665. Warnung ausgegeben; die dann erzeugten Bit-Symbole sind undefiniert.
  2666.  
  2667.  
  2668. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2669.  
  2670. \subsection{XSFR und YSFR}
  2671. \ttindex{XSFR}\ttindex{YSFR}
  2672.  
  2673. {\em G"ultigkeit: DSP56xxx}
  2674.  
  2675. Auch der DSP56000 hat einige Peripherieregister memory-mapped im
  2676. Speicher liegen, die Sache wird jedoch dadurch komplizierter, da"s
  2677. es zwei Datenbereiche gibt, den X-und Y-Bereich.  Diese Architektur
  2678. erlaubt einerseits zwar einen h"oheren Parallelit"atsgrad, zwingt
  2679. jedoch andererseits dazu, den normalen \tty{SFR}-Befehl in die beiden
  2680. oben genannten Varianten aufzuspalten.  Sie verhalten sich identisch zu
  2681. \tty{SFR}, nur da"s \tty{XSFR} ein Symbol im X-Adre"sraum definiert
  2682. und \tty{YSFR} entsprechend eines im Y-Adre"sraum.  Der erlaubte
  2683. Wertebereich ist 0..\$ffff.
  2684.  
  2685. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2686.  
  2687. \subsection{LABEL}
  2688. \ttindex{LABEL}
  2689.  
  2690. {\em G"ultigkeit: alle Prozessoren}
  2691.  
  2692. Die Funktion des \tty{LABEL}-Befehls ist identisch zu \tty{EQU}, nur
  2693. wird das Symbol nicht typenlos, sondern erh"alt das Attribut ,,Code''.
  2694. \tty{LABEL} wird genau f"ur einen Zweck ben"otigt: Labels in Makros
  2695. sind normalerweise lokal, also nicht au"serhalb des Makros zugreifbar.
  2696. Mit einem \tty{EQU}-Befehl kann man sich zwar aus der Aff"are ziehen,
  2697. die Formulierung
  2698. \begin{verbatim}
  2699. <Name>   label    $
  2700. \end{verbatim}
  2701. erzeugt aber ein Symbol mit korrekten Attributen.
  2702.  
  2703. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2704.  
  2705. \subsection{BIT}
  2706. \ttindex{BIT}
  2707.  
  2708. {\em G"ultigkeit: MCS-(2)51, XA, 80C166, 75K0, STM8, ST9, AVR, S12Z,
  2709.                  SX20/28, H16, H8/300, H8/500, KENBAK, Padauk}
  2710.  
  2711. \tty{BIT} dient dazu, ein einzelnes Bit einer Speicherstelle mit einem
  2712. symbolischen Namen gleichzusetzen.  Da die Art und Weise, wie
  2713. verschiedene Prozessoren Bitverarbeitung und -adressierung betreiben,
  2714. stark variiert, verh"alt sich auch dieser Befehl je nach Zielplattform
  2715. anders:
  2716. \par
  2717. F"ur die MCS/51-Familie, die einen eigenen Adre"sraum f"ur Bitoperanden
  2718. besitzt, ist die Funktion von \tty{BIT} ganz analog zu \tty{SFR}, d.h.
  2719. es wird einfach ein Integer-Symbol mit dem angegebenen Wert und dem
  2720. Segment BDATA erzeugt.  F"ur alle anderen Prozessoren wird die
  2721. Bitadressierung dagegen zweidimensional mit Adresse und Bitstelle
  2722. vorgenommen.  In diesem Fall verpackt \asname{} beide Teile in einer vom
  2723. jeweiligen Prozessor abh"angigen Weise in ein Integer-Symbol und dr"oselt
  2724. dieses bei der Benutzung wieder in die beiden Teile auseinander.
  2725. Letzterer Fall trifft auch schon f"ur den 80C251 zu:  W"ahrend zum Beispiel
  2726. der Befehl
  2727. \begin{verbatim}
  2728. Mein_Carry      bit     PSW.7
  2729. \end{verbatim}
  2730. auf einem 8051 noch dem Symbol \tty{Mein\_Carry} den Wert 0d7h zuweisen
  2731. w"urde, w"urde auf einem 80C251 dagegen ein Wert von 070000d0h generiert
  2732. werden, d.h. die Adresse steht in Bit  0..7 sowie die Bitstelle in Bit
  2733. 24..26.  Dieses Verfahren entspricht dem, das auch beim DBIT-
  2734. Befehl des TMS370 angewendet wird und funktioniert sinngem"a"s so auch
  2735. beim 80C166, nur da"s dort Bitstellen von 0 bis 15 reichen d"urfen:
  2736. \begin{verbatim}
  2737. MSB     BIT     r5.15
  2738. \end{verbatim}
  2739. Beim Philips XA findet sich in Bit 0..9 die Bitadresse, wie sie auch
  2740. in die Maschinenbefehle eingesetzt wird, f"ur Bits aus den RAM-Speicher
  2741. wird in Bit 16..23 die 64K-Bank eingesetzt.
  2742. \par
  2743. Noch etwas weiter geht der \tty{BIT}-Befehl bei der 75K0-Familie: Da
  2744. dort Bitadressierungen nicht nur absolute Basisadressen verwenden
  2745. d"urfen, sind sogar Ausdr"ucke wie
  2746. \begin{verbatim}
  2747. bit1    BIT     @h+5.2
  2748. \end{verbatim}
  2749. erlaubt.
  2750. \par
  2751. Beim ST9 ist es hingegen m"oglich, Bits auch invertiert anzusprechen,
  2752. was beim \tty{BIT}-Befehl auch ber"ucksichtigt wird:
  2753. \begin{verbatim}
  2754. invbit  BIT     r6.!3
  2755. \end{verbatim}
  2756. N"aheres zum \tty{BIT}-Befehl beim ST9 findet sich bei den
  2757. prozessorspezifischen Hinweisen.
  2758.  
  2759. Im Falle des H16 sind die Argumente f"ur Speicheradresse und Bitposition
  2760. vertauscht.  Dies wurde getan, um die Syntax zur Definition von Bit identisch
  2761. zu den Maschinenbefehlen zu machen, die einzelne Bits manipulieren.
  2762.  
  2763. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2764.  
  2765. \subsection{DBIT}
  2766. \ttindex{DBIT}
  2767.  
  2768. {\em G"ultigkeit: TMS 370xxx}
  2769.  
  2770. Die TMS370-Reihe hat zwar kein explizites Bit-Segment, jedoch k"onnen
  2771. einzelne Bits als Symbol durch diesen Befehl simuliert werden.  \tty{DBIT}
  2772. ben"otigt zwei Operanden, n"amlich einmal die Adresse der Speicherstelle,
  2773. in der das Bit liegt, sowie die genaue Position des Bits im Byte.
  2774. So definiert man z.B. mit
  2775. \begin{verbatim}
  2776. INT3            EQU     P019
  2777. INT3_ENABLE     DBIT    0,INT3
  2778. \end{verbatim}
  2779. das Bit, welches Interrupts von Anschlu"s INT3 freigibt.  So definierte
  2780. Bits k"onnen dann von den Befehlen \tty{SBIT0, SBIT1, CMPBIT, JBIT0}
  2781. und \tty{JBIT} genutzt werden.
  2782.  
  2783. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2784.  
  2785. \subsection{DEFBIT und DEFBITB}
  2786. \ttindex{DEFBIT}
  2787. \ttindex{DEFBITB}
  2788.  
  2789. \subsubsection{S12Z}
  2790.  
  2791. Der Prozessorkern der S12Z-Familie verf"ugt "uber Befehle, mit denen
  2792. sich einzelne Bits in Register oder Speicherzellen manipulieren
  2793. lassen.  Um Bits im I/O-Bereich des Prozessors (erste 4 KByte des
  2794. Adre"sraumes) bequem ansprechen zu k"onnen, kann man einem einzelnen
  2795. Bit, definiert durch Speicheradresse und Bitposition, einen
  2796. symbolischen Namen geben:
  2797. \begin{verbatim}
  2798. <Name>         defbit[.Size]   <Adresse>,<Position>
  2799. \end{verbatim}
  2800. Die \tty{Adresse} mu"s in den ersten 4 KByte liegen, als Operandengr"o"se
  2801. sind 8, 16 oder 32 Bit (\tty{Size}=b/w/l) zugelassen.
  2802. Dementsprechend darf \tty{Position} maximal 7, 15 oder 31 sein.
  2803. Falls keine Opoerandengr"o"se angegeben wird, werden 8 Bit (.b)
  2804. angenommen.  Ein solcherma"sen definiertes Bit kann als Argument f"ur
  2805. die Befehle {\tt BCLR, BSET, BTGL, BRSET} und {\tt BRCLR} verwendet
  2806. werden:
  2807. \begin{verbatim}
  2808. mybit   defbit.b  $200,4
  2809.        bclr.b    $200,#4
  2810.        bclr      mybit
  2811. \end{verbatim}
  2812. Die beiden Aufrufe von {\tt bclr} in diesem Beispiel erzeugen
  2813. identischen Code.  Da ein solcherma"sen definiertes Bit seine
  2814. Operandengr"o"se ''kennt'', kann diese bei der Benutzung fortgelassen
  2815. werden.
  2816.  
  2817. Bit-Definitionen innerhalb einer Struktur, die sich auf ein Element
  2818. einer Struktur beziehen, sind ebenfalls m"oglich:
  2819. \begin{verbatim}
  2820. mystruct struct    dots
  2821. reg      ds.w      1
  2822. flag     defbit    reg,4
  2823.         ends
  2824.  
  2825.         org       $100
  2826. data     mystruct
  2827.         bset      data.flag  ; entspricht bset.w $100,#4
  2828. \end{verbatim}
  2829.  
  2830. \subsubsection{Super8}
  2831.  
  2832. Im Gegensatz zum ''klassischen'' Z8 verf"ugt der Super8-Kern "uber
  2833. Befehle, mit denen sich Bits in allgemeinen oder Arbeitsregistern
  2834. bearbeiten lassen.  Dabei ist jedoch zu beachten, da"s einige davon
  2835. nur auf Bits arbeiten, die Teil eines der 16 Arbeitsregister sind.
  2836. Mit der \tty{DEFBIT}-Anweisung lassen sich Bits beider Sorten
  2837. definieren:
  2838. \begin{verbatim}
  2839. workbit defbit  r3,#4
  2840. slow    defbit  emt,#6
  2841. \end{verbatim}
  2842. Derart definierte Bits lassen sich dann bei den Befehlen wie ein
  2843. P"archen aus Register und Bitposition einsetzen:
  2844. \begin{verbatim}
  2845.         ldb     r3,emt,#6
  2846.         ldb     r3,slo          ; gleich bedeutend
  2847.  
  2848.         bitc    r3,#4
  2849.         bitc    workbit         ; gleich bedeutend
  2850. \end{verbatim}
  2851.  
  2852. \subsubsection{Z8000}
  2853.  
  2854. Der Z8000 verf"ugt zwar "uber Befehle zum Setzen und R"ucksetzen
  2855. von Bits, diese k"onnen jedoch nur auf Adressen im Speicher- und nicht
  2856. im I/O-Adre"sraum wirken.  Aus diesem Grund lassen sich mit {\tt DEFBIT}
  2857. bzw. {\tt DEFBITB} auch nur Bit-Objekte im Speicher-Adre"sraum definieren.
  2858. Die Unterscheidung der Operandengr"o"se ist wichtig, weil der Z8000 ein
  2859. Big-Endian-Prozessor ist: Bit {\em n} eines 16-Bit-Worts bei Adresse {\em m}
  2860. entspr"ache Bit {\em n} eines 8-Bit-Byte bei Adresse {\em m+1}.
  2861.  
  2862. \subsubsection{$\mu$PD7807...$\mu$PD7809}
  2863.  
  2864. Die ersten 16 Byte der Working Area und Sonderregister mit einer Adresse
  2865. kleiner 16 sind bitadressierbar.
  2866.  
  2867. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2868.  
  2869. \subsection{DEFBITFIELD}
  2870. \ttindex{DEFBITFIELD}
  2871.  
  2872. {\em G"ultigkeit: S12Z}
  2873.  
  2874. Der Prozessorkern der S12Z-Familie kann nicht nur mit einzelnen Bits
  2875. umgehen, sondern auch zusammenh"angende Felder von Bits in einem
  2876. 8/16/24/32-Bit-Wert extrahieren oder schreiben.  Analog zu
  2877. \tty{DEFBIT} l"a"st sich auch ein Bitfeld symbolisch definieren:
  2878. \begin{verbatim}
  2879. <Name>         defbitfield[.Size]   <Adresse>,<Breite>:<Position>
  2880. \end{verbatim}
  2881. Im Gegensatz zu einzelnen Bits sind hier auch 24 Bits (.p) als
  2882. Operandengr"o"se zugelassen, der Wertebereich von \tty{Position} und
  2883. \tty{Breite} ist dementsprechend von 0 bis 23 bzw. 1 bis 24.  Auch
  2884. hier ist es wieder zul"assig, Bitfelder als Teil von Strukturen zu
  2885. definieren:
  2886. \begin{verbatim}
  2887. mystruct struct      dots
  2888. reg      ds.w        1
  2889. clksel   defbitfield reg,4:8
  2890.         ends
  2891.  
  2892.         org       $100
  2893. data     mystruct
  2894.         bfext     d2,data.clksel ; fetch $100.w bits 4..11
  2895.                                  ; to D2 bits 0..7
  2896.         bfins     data.clksel,d2 ; insert D2 bits 0..7 into
  2897.                                  ; $100.w bits 4..11
  2898. \end{verbatim}
  2899. Die interne Darstellung von Bits, die mit \tty{DEFBIT} definiert
  2900. wurden, ist gleich der von Bitfeldern der Breite eins.  Ein
  2901. symbolisch definiertes einzelnes Bit kann also auch als Argument
  2902. f"ur \tty{BFINS} und \tty{BFEXT} verwendet werden.
  2903.  
  2904. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2905.  
  2906. \subsection{PORT}
  2907. \ttindex{PORT}
  2908.  
  2909. {\em G"ultigkeit: PALM, 8008/8080/8085/8086, XA, Z80, Z8000, 320C2x/5x, TLCS-47, AVR,
  2910.     F8, IMP-16}
  2911.  
  2912. \tty{PORT} arbeitet analog zu \tty{SFR}, nur wird das Symbol dem I/O-Adre"sbereich
  2913. zugeordnet.  Erlaubte Werte sind 0..7 beim 3201x und 8008, 0..15 beim 320C2x und PALM,
  2914. 0..65535 beim 8086, Z8000 und 320C5x, 0..63 beim AVR und 0..255 beim Rest.
  2915. \par
  2916. Beispiel: eine PIO 8255 liege auf Adresse 20H:
  2917. \begin{verbatim}
  2918. PIO_Port_A PORT 20h
  2919. PIO_Port_B PORT PIO_Port_A+1
  2920. PIO_Port_C PORT PIO_Port_A+2
  2921. PIO_Ctrl   PORT PIO_Port_A+3
  2922. \end{verbatim}
  2923.  
  2924. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2925.  
  2926. \subsection{REG und NAMEREG}
  2927. \ttindex{REG}\ttindex{NAMEREG}
  2928.  
  2929. {\em G"ultigkeit: 680x0, AVR, M*Core, ST9, 80C16x, Z8000, KCPSM, \\
  2930.     PDP-11, WD16 \\
  2931.     (\tty{NAMEREG} nur f"ur KCPSM(3)), LatticeMico8, MSP430(X)}
  2932.  
  2933. Obwohl immer mit gleicher Syntax, hat diese Anweisung von Prozessor
  2934. zu Prozessor eine leicht abweichende Bedeutung: Falls der Zielprozessor
  2935. f"ur Register einen eigenen Adre"sraum verwendet, so hat \tty{REG}
  2936. die Wirkung eines simplen \tty{EQU}s f"ur eben diesen Adre"sraum (z.B. beim
  2937. ST9).  F"ur alle anderen Prozessoren definiert \tty{REG} Registersymbole,
  2938. deren Funktion in Abschnitt \ref{SectRegSyms} beschrieben sind.
  2939.  
  2940. {\tt NAMEREG} existiert aus Kompatibilit"atsgr"unden zum Originalassembler
  2941. f"ur den KCPSM.  Es hat die gleiche Funktion, lediglich werden sowohl
  2942. Register- als auch symbolischer Name als Argumente angegeben, z.B. so:
  2943. \begin{verbatim}
  2944.     NAMEREG  s08, treg
  2945. \end{verbatim}
  2946.  
  2947. Auf der PDP-11 darf \tty{REG} zus"atzlich ohne Namen im Label-Feld benutzt
  2948. werden.  Es wird dann als einziges Argument entweder \tty{ON} oder \tty{OFF}
  2949. erwartet, und damit werden die eingebauten Register-Aliase (\tty{Rn} = \tty{\%n},
  2950. \tty{SP} = \tty{R6}, \tty{PC} = \tty{R7}) ein- und ausgeschaltet.  Sie
  2951. sind im Default verf"ugbar, und sollten nur abgeschaltet werden, wenn
  2952. sie mit eigenen Symbolnamen in einem Programm kollidieren.  Die augenblickliche
  2953. Einstellung l"a"st sich aus dem Symbol \tty{DEFAULT\_REGSYMS} lesen.
  2954.  
  2955. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2956.  
  2957. \subsection{LIV und RIV}
  2958. \ttindex{LIV}\ttindex{RIV}
  2959.  
  2960. {\em G"ultigkeit: 8X30x}
  2961.  
  2962. \tty{LIV} und \tty{RIV} dienen dazu, sogenannte IV-Bus-Objekte zu definieren.
  2963. Bei diesen handelt es sich um Bitgruppen in peripheren Speicherzellen
  2964. mit einer L"ange von 1..8 Bit, die fortan symbolisch angesprochen
  2965. werden k"onnen, so da"s man bei den entsprechenden Befehlen nicht mehr
  2966. Adresse, L"ange und Position separat angeben mu"s.  Da die
  2967. 8X30x-Prozessoren zwei periphere Adre"sr"aume besitzen (einen ,,linken''
  2968. und einen ,,rechten'', sind auch zwei separate Befehle definiert.  Die
  2969. Parameter dieser Befehle sind allerdings identisch: es m"ussen drei
  2970. Parameter sein, die Adresse, Startposition und L"ange angeben.
  2971. Weitere Hinweise zur Benutzung von Busobjekten finden sich in
  2972. Abschnitt \ref{8X30xSpec}.
  2973.  
  2974. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2975.  
  2976. \subsection{CHARSET}
  2977. \label{SectCHARSET}
  2978. \ttindex{CHARSET}\ttindex{CODEPAGE\_VAL}
  2979.  
  2980. {\em G"ultigkeit: alle Prozessoren}
  2981.  
  2982. Einplatinen-Systeme, zumal wenn sie LCDs ansteuern, benutzen h"aufig
  2983. einen anderen Zeichensatz als ASCII, und da"s die Umlautkodierung mit
  2984. der im PC "ubereinstimmt, d"urfte wohl reiner Zufall sein.  Und dann
  2985. gibt es auch (historische) Systeme, die z.B. eine EBCDIC-Variante
  2986. verwenden...um nun aber keine fehlertr"achtigen Umkodierungen im Code
  2987. per Hand vornehmen zu m"ussen, enth"alt der Assembler eine Umsetzungstabelle
  2988. f"ur Zeichen, die jedem (ASCII-)zeichen im Quellcode ein Zielzeichen zuordnet.
  2989. Zur Modifikation dieser Tabelle (die initial 1:1 "ubersetzt), dient der
  2990. Befehl \tty{CHARSET}.  \tty{CHARSET} kann mit verschiedenen Parameterzahlen
  2991. und -typen aufgerufen werden:
  2992.  
  2993. Ein
  2994. \begin{quote}{\tt
  2995.        CHARSET
  2996. }\end{quote}
  2997. ohne jegliche Argumente setzt die "Ubersetzungstabelle auf den 1:1-Default
  2998. wieder zur"uck.
  2999.  
  3000. Wird nur ein Argument gegeben, mu"s es sich dabei um einen String-Ausdruck
  3001. handeln, der von \asname{} als Dateiname interpretiert wird:
  3002. \begin{verbatim}
  3003.        CHARSET  "mapping.bin"
  3004. \end{verbatim}
  3005. Aus dieser Datei liest \asname{} dann die ersten 256 Bytes aus und kopiert sie in die
  3006. "Ubersetzungstabelle.  Hiermit lassen sich also komplexere, extern
  3007. erzeugte Tabellen mit einer Anweisung laden.
  3008.  
  3009. In allen anderen Varianten wird ein einzelner Eintrag oder ein ganzer
  3010. Bereich von Eintr"agen in der Tabelle modifiziert.  Mit zwei (Integer-)Argumenten
  3011. kann ein einzelner Eintrag neu gesetzt werden.  Ein
  3012. \begin{quote}{\tt
  3013.        CHARSET '"a',128
  3014. }\end{quote}
  3015. bedeutet zum Beispiel, da"s das Zielsystem das "a mit der Zahl 128 kodiert.
  3016. Es ist auch m"oglich zu definieren, da"s ein bestimmtes Zeichen "uberhaupt
  3017. nicht dargestellt werden kann.  Daf"ur l"a"st man das zweite Argument leer:
  3018. \begin{quote}{\tt
  3019.        CHARSET '[',
  3020. }\end{quote}
  3021. Soll fortan das ,,gel"oschte'' Zeichen irgendwo in einem String im Speicher
  3022. abgelegt werden, f"uhrt dies zu einer Fehlermeldung.
  3023.  
  3024. Anstelle eines einzelnen Zeichens kann auch ein ganzer Bereich umgemappt
  3025. werden.  Das erste und zweite Argument geben den Bereich der Zeichen an, das
  3026. dritte das Mapping des ersten Zeichens.  Falls z.B. das Zielsystem keine
  3027. Kleinbuchstaben unterst"utzt, k"onnen mit
  3028. \begin{verbatim}
  3029.        CHARSET 'a','z','A'
  3030. \end{verbatim}
  3031. alle Kleinbuchstaben auf die passenden Gro"sbuchstaben automatisch
  3032. umgesetzt werden.  Und auch ein Bereich von Zeichen kann als
  3033. ,,nicht verf"ugbar'' markiert werden:
  3034. \begin{verbatim}
  3035.        CHARSET 'a','z',
  3036. \end{verbatim}
  3037. verbietet die Verwendung von Kleinbuchstabem.
  3038.  
  3039. In der letzten Variante (wieder mit nur zwei Argumenten) folgt nach dem
  3040. Startindex ein String, der das Mapping ab dem Start-Zeichen auflistet.
  3041. Das Umlegen von Klein- auf Gro"sbuchstaben k"onnte man also auch so
  3042. formulieren:
  3043. \begin{verbatim}
  3044.        CHARSET 'a',"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  3045. \end{verbatim}
  3046.  
  3047. \bb{ACHTUNG!} Das durch \tty{CHARSET} definierte Mapping greift nicht nur
  3048. beim Ablegen von Strings im Speicher, es greift auch bei Multi-Character-Konstanten,
  3049. also als ,,ASCII'' formulierten Integer-Konstanten.  Dies bedeutet, da"s
  3050. eine bereits modifizierte Umsetzungstabelle in den obigen Beispielen zu
  3051. anderen Ergebnissen f"uhren kann!
  3052.  
  3053. Mit der eingebauten Funktion \tty{CODEPAGE\_VAL} kann die "Ubersetzung
  3054. eines einzelnen Zeichens abgefragt werden.  F"ur nicht gemappte Zeichen
  3055. liefert die Funktion eine -1 zur"uck.
  3056.  
  3057. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3058.  
  3059. \subsection{CODEPAGE}
  3060. \ttindex{CODEPAGE}
  3061.  
  3062. {\em G"ultigkeit: alle Prozessoren}
  3063.  
  3064. Mit der \tty{CHARSET}-Anweisung hat man zwar beliebige Freiheiten in der
  3065. Zeichenzuordnung zwischen Entwicklungs- und Zielplattform, wenn auf der
  3066. Zielplattform jedoch verschiedene Zeichens"atze existieren, kann das
  3067. Umschalten zwischen diesen jedoch zu einer umst"andlichen Orgie von
  3068. \tty{CHARSET}-Kommandos werden.  Mit der \tty{CODEPAGE}-Anweisung kann
  3069. man jedoch mehrere Zeichentabellen vorhalten und zwischen diesen mit einem
  3070. Befehl umschalten.  Als Parameter erwartet \tty{CODEPAGE} ein oder zwei
  3071. Namen: zum einen den Namen der fortan zu benutzenden Tabelle, zum anderen
  3072. optional den Namen der Tabelle, die die initiale Belegung der Tabelle
  3073. vorgibt (dieser Parameter hat somit auch nur eine Bedeutung beim ersten
  3074. Umschalten auf eine Tabelle, bei der \asname{} sie automatisch anlegt).  Fehlt
  3075. der zweite Parameter, so ist die initiale Belegung der neuen Tabelle
  3076. gleich der vorher aktiven Tabelle.  Alle folgenden
  3077. \tty{CHARSET}-Anweisungen ver"andern {\em nur} die momentan aktive Tabelle.
  3078.  
  3079. Zu Beginn eines Durchlaufes wird von \asname{} automatisch eine einzelne
  3080. Zeichentabelle mit dem Namen \tty{STANDARD} erzeugt und 1:1 vorbelegt.
  3081. Verwendet man keine \tty{CODEPAGE}-Anweisungen, so beziehen sich alle mit
  3082. \tty{CHARSET} gemachten Einstellungen auf diese Tabelle.
  3083.  
  3084. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3085.  
  3086. \subsection{ENUM, NEXTENUM und ENUMCONF}
  3087. \ttindex{ENUM}
  3088. \ttindex{NEXTENUM}
  3089. \ttindex{ENUMCONF}
  3090.  
  3091. {\em G"ultigkeit: alle Prozessoren}
  3092.  
  3093. \tty{ENUM} dient analog zu dem entsprechenden Befehl in C dazu,
  3094. Aufz"ahlungstypen zu definieren, d.h. eine Reihe von Integer-Konstanten,
  3095. denen fortlaufende Werte (von 0 an beginnend) zugewiesen
  3096. werden. Als Parameter werden dabei die Namen der zu definierenden
  3097. Symbole angegeben, wie in dem folgenden Beispiel:
  3098. \begin{quote}{\tt
  3099.        ENUM    SymA,SymB,SymC}
  3100. \end{quote}
  3101. Dieser Befehl weist den Symbolen \tty{SymA}, \tty{SymB} und \tty{SymC}
  3102. die Werte 0, 1 und 2 zu.
  3103. \par
  3104. M"ochte man eine Aufz"ahlung "uber mehrere Zeilen verteilen, so
  3105. verwendet man ab der zweiten Zeile den Befehle \tty{NEXTENUM}
  3106. anstelle von \tty{ENUM}.  Der interne Z"ahler, der den Symbolen
  3107. der Aufz"ahlung fortlaufende Werte zuweist, wird dann nicht
  3108. wieder auf Null zur"uck gesetzt, wie in dem folgenden Fall:
  3109. \begin{verbatim}
  3110.        ENUM     Januar=1,Februar,Maerz,April,Mai,Juni
  3111.        NEXTENUM Juli,August,September,Oktober
  3112.        NEXTENUM November,Dezember
  3113. \end{verbatim}
  3114. An diesem Beispiel sieht man auch, da"s man einzelnen Symbolen
  3115. explizit Werte anstelle des aktuellen Z"ahlerstandes zuweisen
  3116. kann.  Der interne Z"ahler wird anhand dieses Wertes auch
  3117. aktualisiert.
  3118.  
  3119. Die Definition von Symbolen mit \tty{ENUM} gleicht einer Definition
  3120. mit \tty{EQU}, d.h. es ist nicht m"oglich, einem Symbol einen neuen
  3121. Wert zuzuweisen.
  3122.  
  3123. Die \tty{ENUMCONF}-Anweisung erlaubt das Verhalten von \tty{ENUM}
  3124. zu beeinflussen.  \tty{ENUMCONF} akzeptiert ein oder zwei
  3125. Argumente, wobei das erste Argument immer der Wert ist, um den
  3126. der interne Z"ahler pro Symbol in einer Aufz"ahlung hochgez"ahlt
  3127. wird.  Mit einem
  3128. \begin{verbatim}
  3129.      ENUMCONF 2
  3130. \end{verbatim}
  3131. werden den Symbolen also zum Beispiel die Werte 0,2,4,6...
  3132. anstelle 0,1,2,3... zugewiesen.
  3133.  
  3134. Das zweite (optionale) Argument von \tty{ENUMCONF} bestimmt,
  3135. welchen Adre"sraum die Symbole zugeordnet werden.  Per Default
  3136. sind mit \tty{ENUM} definierte Symbole typenlos, man kann aber
  3137. zum Beispiel mit einem
  3138. \begin{verbatim}
  3139.      ENUMCONF 1,CODE
  3140. \end{verbatim}  
  3141. bestimmen, da"s sie im Instruktions-Adre"sraum liegen sollen.  Die
  3142. Namen der Adre"sr"aume sind die gleichen wie beim
  3143. \tty{SEGMENT}-Befehl (\ref{SEGMENT}), zus"atzlich ist als
  3144. Argument ein \tty{NOTHING} erlaubt, um wieder typenlose Symbole
  3145. zu erzeugen.
  3146.  
  3147. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3148.  
  3149. \subsection{PUSHV und POPV}
  3150. \ttindex{PUSHV}\ttindex{POPV}
  3151.  
  3152. {\em G"ultigkeit: alle Prozessoren}
  3153.  
  3154. Mit \tty{PUSHV} und \tty{POPV} ist es m"oglich, den Wert von (nicht
  3155. Makro-lokalen) Symbolen tempor"ar zu speichern und zu einem sp"ateren
  3156. Zeitpunkt wiederherzustellen.  Die Speicherung erfolgt auf {\em Stacks},
  3157. d.h. Last-In-First-Out-Speichern.  Ein Stack hat einen Namen, der den
  3158. allgemeinen Symbolkonventionen gen"ugen mu"s, und existiert so lange,
  3159. wie er mindestens ein Element enth"alt: Ein bisher nicht existierender
  3160. Stack wird bei \tty{PUSHV} automatisch angelegt, ein durch \tty{POPV} leer
  3161. werdender Stack wird automatisch wieder aufgel"ost.  Der Name des Stacks,
  3162. auf den Symbole abgelegt und von dem sie wieder abgeholt werden sollen,
  3163. ist der erste Parameter von \tty{PUSHV} bzw. \tty{POPV}, danach folgt
  3164. eine beliebige Menge von Symbolen als weitere Parameter.  Alle in der
  3165. Liste aufgef"uhrten Symbole m"ussen bereits existieren, es ist also
  3166. {\em nicht} m"oglich, mit einem \tty{POPV}-Befehl implizit neue Symbole
  3167. zu definieren.
  3168. \par
  3169. Stacks stellen eine globale Ressource dar, d.h. ihre Namen sind
  3170. nicht lokal zu Sektionen.
  3171. \par
  3172. Wichtig ist, da"s die Variablenliste {\em immer} von links nach rechts
  3173. abgearbeitet wird.  Wer also mehrere Variablen mit \tty{POPV} von einem
  3174. Stack herunter holen will, mu"s diese in genau umgekehrter Reihenfolge
  3175. zum entsprechenden \tty{PUSHV} angeben!
  3176. \par
  3177. Der Name des Stacks kann auch weggelassen werden, etwa so:
  3178. \begin{verbatim}
  3179.        pushv   ,var1,var2,var3
  3180.        .
  3181.        .
  3182.        popv    ,var3,var2,var1
  3183. \end{verbatim}
  3184. \asname{} verwendet dann einen internen, vordefinierten Default-Stack.
  3185. \par
  3186. Nach Ende eines Durchlaufes "uberpr"uft \asname{}, ob noch Stacks existieren,
  3187. die nicht leer sind, und gibt deren Namen sowie ,,F"ullstand'' aus.  Mit
  3188. diesen Warnungen kann man herausfinden, ob an irgendeiner Stelle die
  3189. \tty{PUSHV}'s und \tty{POPV}'s nicht paarig sind.  Es ist jedoch in
  3190. keinem Fall m"oglich, Symbolwerte in einem Stack "uber mehrere Durchl"aufe
  3191. hinwegzuretten: Zu Beginn eines Durchlaufes werden alle Stacks geleert!
  3192.  
  3193. %%---------------------------------------------------------------------------
  3194.  
  3195. \section{Codebeeinflussung}
  3196.  
  3197. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3198.  
  3199. \subsection{ORG}
  3200. \label{SectORG}\ttindex{ORG}
  3201.  
  3202. {\em G"ultigkeit: alle Prozessoren}
  3203.  
  3204. \tty{ORG} erlaubt es, den Assembler-internen Adre"sz"ahler mit einem neuen
  3205. Wert zu besetzen.  Der Wertebereich ist vom momentan gew"ahlten Segment
  3206. und vom Prozessortyp abh"angig (Tabelle \ref{TabORG}).
  3207. Die untere Grenze ist dabei immer 0; die obere Grenze der angegebene Wert
  3208. minus eins.
  3209. \par
  3210. Falls in einer Familie verschiedene Varianten unterschiedlich
  3211. gro"se Adre"sr"aume haben, ist jeweils der maximale Raum aufgef"uhrt.
  3212. \par
  3213. ORG wird in erster Linie ben"otigt, um dem Code eine neue Startadresse
  3214. zu geben und damit verschiedene, nicht zusammenh"angende Codest"ucke in
  3215. einer Quelldatei unterzubringen.  Sofern nicht in einem Feld explizit anders
  3216. angegeben, ist die vorgegebene Startadresse in einem Segment (d.h. die ohne
  3217. {\tt ORG} angenommene) immer 0.
  3218. \par
  3219. {\bf WICHTIG:} Falls auch mit dem \tty{PHASE}-Befehl gearbeitet
  3220. wird, mu"s ber"ucksichtigt werden, da"s das Argument von \tty{ORG}
  3221. immer die {\em Ladeadresse} des Codes ist, nicht die {\em
  3222. Ausf"uhrungsadresse}.  Ausdr"ucke, die sich mit dem \$- oder
  3223. \*-Symbol auf den aktuellen Programmz"ahler beziehen, liefern
  3224. aber die {\em Ausf"uhrungsadresse} des Codes und f"uhren als
  3225. Argument von \tty{ORG} nicht zum gew"unschten Ergebnis.  In
  3226. solchen F"allen ist die \tty{RORG}-Anweisung (\ref{SectRORG}) das
  3227. Mittel der Wahl.
  3228. \hfuzz=60pt
  3229. \begin{longtable}{|l|c|c|c|c|c|c|c|c|c|c|}
  3230. \hline
  3231. \tin{Ziel} & \tin{CODE} & \tin{DATA} & \tin{I-}   & \tin{X-}   & \tin{Y-}   & \tin{BIT-} & \tin{IO} & \tin{REG} & \tin{ROM-} & \tin{EE-} \\
  3232.           &            &            & \tin{DATA} & \tin{DATA} & \tin{DATA} & \tin{DATA} &          &           & \tin{DATA} & \tin{DATA} \\
  3233. \hline
  3234. \hline
  3235. \endhead
  3236. \input{../doc_COM/taborg.tex}
  3237. \\ \hline
  3238. \multicolumn{11}{|l|}{$^{1}$ Initialwert 80h. } \\
  3239. \multicolumn{11}{|l|}{  Da der 8051 kein RAM jenseits 80h hat, mu"s der Initialwert f"ur den 8051} \\
  3240. \multicolumn{11}{|l|}{  als Zielprozessor auf jeden Fall mit \tty{ORG} angepa"st werden!} \\
  3241. \hline
  3242. \multicolumn{11}{|l|}{$^{2}$ Da der Z180 weiterhin logisch nur 64K ansprechen kann, ist der} \\
  3243. \multicolumn{11}{|l|}{ganze Adre"sraum nur mittels \tty{PHASE}-Anweisungen erreichbar!} \\
  3244. \hline
  3245. \multicolumn{11}{|l|}{$^{3}$ Initialwert 400h.} \\
  3246. \hline
  3247. \multicolumn{11}{|l|}{$^{4}$ Initialwert 800h bzw. 0C00h} \\
  3248. \hline
  3249. \multicolumn{11}{|l|}{$^{5}$ Bereich f"ur Programmcode auf 1 MByte begrenzt} \\
  3250. \hline
  3251. \multicolumn{11}{|l|}{$^{6}$ Gr"o"se ist vom Zielprozessor abh"angig} \\
  3252. \hline
  3253. \multicolumn{11}{|l|}{$^{7}$ Gr"o"se und Verf"ugbarkeit sind vom Zielprozessor abh"angig} \\
  3254. \hline
  3255. \multicolumn{11}{|l|}{$^{8}$ Nur auf Varianten mit \tty{MOVX}-Anweisung} \\
  3256. \hline
  3257. \multicolumn{11}{|l|}{$^{9}$ typabh"angig} \\
  3258. \hline
  3259. \multicolumn{11}{|l|}{$^{10}$ modellabh"angig} \\
  3260. \hline
  3261. \caption{Adre"sbereiche f"ur \tty{ORG}}
  3262. \label{TabORG}
  3263. \end{longtable}
  3264. \hfuzz=0pt
  3265.  
  3266. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3267.  
  3268. \subsection{RORG}
  3269. \label{SectRORG}
  3270. \ttindex{RORG}
  3271.  
  3272. {\em G"ultigkeit: alle Prozessoren}
  3273.  
  3274. \tty{RORG} setzt wie \tty{ORG} den Programmz"ahler neu, erwartet
  3275. als Argument allerdings keine absolute Adresse, sondern einen
  3276. relativen Wert (positiv oder negativ), der zum Programmz"ahler
  3277. addiert wird.  Eine Anwendungsm"oglichkeit ist das Freilassen
  3278. einer bestimmten Menge von Adre"sraum, oder die Anwendung in
  3279. Code-Teilen, die an mehreren Stellen (z.B. via Makros oder
  3280. Includes) eingebunden werden und lageunabh"angig arbeiten sollen.
  3281. Eine weitere Anwendungsm"oglichkeit ergibt sich in Code, der eine
  3282. Ausf"uhrungsadresse unterschiedlich zur Ladeadresse hat (d.h. es
  3283. wird mit der \tty{PHASE}-Anweisung gearbeitet).  Es gibt kein
  3284. Symbol, "uber das man in so einer Situation auf die aktuelle
  3285. {\em Ladeadresse} zugreifen kann, aber mittels \tty{RORG} kann man
  3286. sich indirekt darauf beziehen.
  3287.  
  3288. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3289.  
  3290. \subsection{CPU}
  3291. \label{SectCPU}
  3292. \ttindex{CPU}
  3293.  
  3294. \newcounter{cpucounter1}
  3295. \newcounter{cpucounter2}
  3296.  
  3297. \newcommand{\cpu}{
  3298. \stepcounter{cpucounter1}
  3299. \ifnum\value{cpucounter1}>26
  3300.   \setcounter{cpucounter1}{1}
  3301.   \stepcounter{cpucounter2}
  3302. \fi
  3303. \ifnum\value{cpucounter2}>0\alph{cpucounter2}\fi\alph{cpucounter1})
  3304. }
  3305. \newenvironment{cpulist}
  3306. {
  3307. \begin{quote}
  3308. \begin{tabbing}
  3309. \cpu \=
  3310. }
  3311. {
  3312. \end{tabbing}
  3313. \end{quote}
  3314. }
  3315.  
  3316. {\em G"ultigkeit: alle Prozessoren}
  3317.  
  3318. Mit diesem Befehl wird festgelegt, f"ur welchen Prozessor im weiteren
  3319. Code erzeugt werden soll.  Die Befehle der anderen Prozessorfamilien
  3320. sind dann nicht greifbar und erzeugen eine Fehlermeldung!
  3321. \par
  3322. Die Prozessoren k"onnen grob in Familien unterschieden werden, in den
  3323. Familien dienen unterschiedliche Typen noch einmal zur Feinunterscheidung:
  3324. %%-----------
  3325. \begin{cpulist}
  3326.   68008 $\rightarrow$ 68000 $\rightarrow$ 68010 $\rightarrow$ 68012 $\rightarrow$ \\
  3327. \> MCF5202 $\rightarrow$ MCF5204 $\rightarrow$ MCF5206 $\rightarrow$ MCF5208$\rightarrow$ \\
  3328. \> MCF52274 $\rightarrow$ MCF52277 $\rightarrow$ MCF5307 $\rightarrow$ MCF5329 $\rightarrow$ MCF5373 $\rightarrow$ \\
  3329. \> MCF5407 $\rightarrow$ MCF5470 $\rightarrow$ MCF5471 $\rightarrow$ MCF5472 $\rightarrow$ MCF5473 $\rightarrow$ \\
  3330. \> MCF5474 $\rightarrow$ MCF5475 $\rightarrow$ MCF51QM $\rightarrow$ \\
  3331. \> 68332 $\rightarrow$ 68340 $\rightarrow$ 68360 $\rightarrow$ \\
  3332. \> 68020 $\rightarrow$ 68030 $\rightarrow$ 68040
  3333. \end{cpulist}
  3334. In dieser Familie liegen die Unterschiede in hinzukommenden Befehlen
  3335. und Adressierungsarten (ab 68020).  Eine kleine Ausnahme stellt der
  3336. Schritt zum 68030 dar, dem 2 Befehle fehlen: \tty{CALLM} und \tty{RTM}.
  3337. Die drei Vertreter der 683xx-Familie haben den gleichen Prozessorkern (eine
  3338. leicht abgemagerte 68020-CPU), jedoch v"ollig unterschiedliche Peripherie.
  3339. MCF5xxx repr"asentiert verschiedene ColdFire-Varianten von Motorola/Freescale/NXP,
  3340. zum 680x0 bin"ar abw"artskompatible RISC-Prozesoren. Beim 68040 kommen die zus"atzlichen
  3341. Steuerregister (via \tty{MOVEC} erreichbar) f"ur On-Chip-MMU und Caches
  3342. sowie einige Systembefehle f"ur selbige hinzu.
  3343. %%-----------
  3344. \begin{cpulist}
  3345.   56000 $\longrightarrow$ 56002 $\longrightarrow$ 56300
  3346. \end{cpulist}
  3347. W"ahrend der 56002 nur Befehle zum Inkrementieren und Dekrementieren der
  3348. Akkus erg"anzt, ist der 56300-Kern schon fast ein neuer Prozessor: Er
  3349. vergr"o"sert alle Adre"sr"aume von 64K-W"ortern auf 16M und verdoppelt fast
  3350. die Anzahl der Befehle.
  3351. %%-----------
  3352. \begin{cpulist}
  3353.   PPC403 $\rightarrow$ PPC403GC $\rightarrow$ MPC505 $\rightarrow$ MPC601 $\rightarrow$ MPC821 $\rightarrow$ RS6000
  3354. \end{cpulist}
  3355. Der PCC403 ist eine abgespeckte Version der PowerPC-Linie ohne
  3356. Gleitkommaeinheit, demzufolge sind s"amtliche Gleitkommabefehle
  3357. bei ihm gesperrt; daf"ur sind einige Mikrocontroller-spezifische
  3358. Befehle enthalten, die er als einziges Mitglied in dieser Familie
  3359. kennt.  Die GC-Variante des PPC403 hat zus"atzlich eine MMU und deshalb
  3360. einige Befehle zu deren Steuerung mehr.  Der MPC505 (eine Mikrokontroller-Variante mit FPU)
  3361. unterscheidet sich solange vom 601er nur in den Peripherieregistern,
  3362. wie ich es nicht besser wei"s - \cite{Mot505} h"alt sich da noch etwas bedeckt...
  3363. Die RS6000-Reihe kennt noch einige Befehle mehr (die auf vielen
  3364. 601er-Systemen emuliert werden, um vollst"andige Kompatibilit"at
  3365. herzustellen), au"serdem verwendet IBM z.T. andere Mnemonics f"ur
  3366. diese reinen Workstation-Prozessoren, als Remineszenz an die
  3367. 370er-Gro"srechner...
  3368. %%-----------
  3369. \begin{cpulist}
  3370.   IBM5100, IBM5110, IBM5120
  3371. \end{cpulist}
  3372. Diese drei Typen referenzieren aktuell alle auf den gleichen (PALM-)
  3373. Prozessorkern.
  3374. %%-----------
  3375. \begin{cpulist}
  3376.   MCORE
  3377. \end{cpulist}
  3378. %%-----------
  3379. \begin{cpulist}
  3380.   XGATE
  3381. \end{cpulist}
  3382. %%-----------
  3383. \begin{cpulist}
  3384.   6800 $\rightarrow$ 6801 $\rightarrow$ 6301 $\rightarrow$ 6811
  3385. \end{cpulist}
  3386. W"ahrend der 6301 nur einige neue Befehle definiert (und der 6301
  3387. noch ein paar mehr), bietet der 6811 neben weiteren Befehlen ein
  3388. zweites Indexregister Y zur Adressierung.
  3389. %%-----------
  3390. \begin{cpulist}
  3391.   6809/6309 und 6805/68HC08/68HCS08
  3392. \end{cpulist}
  3393. Diese Prozessoren sind zwar teilweise Quellcode-kompatibel zu den
  3394. anderen 68xx-ern, haben aber ein anderes Bin"arcode-Format und einen
  3395. deutlich eingeschr"ankteren (6805) bzw. erweiterten (6809) Befehlssatz.
  3396. Der 6309 ist eine CMOS-Version des 6809, die zwar offiziell
  3397. nur kompatibel zum 6809 ist, inoffiziell aber mehr Register und
  3398. deutlich mehr Befehle besitzt (siehe \cite{Kaku}).
  3399. %%-----------
  3400. \begin{cpulist}
  3401.   68HC12 $\longrightarrow$ 68HC12X
  3402. \end{cpulist}
  3403. Der 12X-Kern bietet eine Reihe neuer Befehle, bzw. bestehende Befehle
  3404. wurden um neue Adressierungsarten erg"anzt.
  3405. %%-----------
  3406. \begin{cpulist}
  3407.   S912ZVC19F0MKH, S912ZVC19F0MLF,\\
  3408. \> S912ZVCA19F0MKH, S912ZVCA19F0MLF,\\
  3409. \> S912ZVCA19F0WKH, S912ZVH128F2CLQ,\\
  3410. \> S912ZVH128F2CLL, S912ZVH64F2CLQ,\\
  3411. \> S912ZVHY64F1CLQ, S912ZVHY32F1CLQ,\\
  3412. \> S912ZVHY64F1CLL, S912ZVHY32F1CLL,\\
  3413. \> S912ZVHL64F1CLQ, S912ZVHL32F1CLQ,\\
  3414. \> S912ZVHL64F1CLL, S912ZVHL32F1CLL,\\
  3415. \> S912ZVFP64F1CLQ, S912ZVFP64F1CLL,\\
  3416. \> S912ZVH128F2VLQ, S912ZVH128F2VLL,\\
  3417. \> S912ZVH64F2VLQ, S912ZVHY64F1VLQ,\\
  3418. \> S912ZVHY32F1VLQ, S912ZVHY64F1VL,\\
  3419. \> S912ZVHY32F1VLL, S912ZVHL64F1VLQ
  3420. \end{cpulist}
  3421. Alle Derivate beinhalten den gleichen Prozessorkern und den
  3422. gleichen Befehlssatz, lediglich die on-Chip-Peripherie und
  3423. die Menge eingebauten Speichers (RAM, Flash-ROM, EEPROM)
  3424. variieren.
  3425. %%-----------
  3426. \begin{cpulist}
  3427.   68HC16
  3428. \end{cpulist}
  3429. %%-----------
  3430. \begin{cpulist}
  3431.   052001
  3432. \end{cpulist}
  3433. Dieser Baustein ist eine Eigenentwicklung von Konami und in
  3434. Architektur und Befehlssatz an den Motorola 6809 angelehnt.
  3435. Er ist jedoch nicht bin"arkompatibel und stellt auch nicht
  3436. alle Befehle und Adressierungsarten des Vorbilds zur Verf"ugung.
  3437. %%-----------
  3438. \begin{cpulist}
  3439.   HD6413308 $\longrightarrow$ HD6413309
  3440. \end{cpulist}
  3441. Diese beiden Namen repr"asentieren die 300er und 300H-Varianten der
  3442. H8-Familie; die H-Version besitzt dabei einen gr"o"seren Adre"sraum
  3443. (16 Mbyte statt 64Kbyte), doppelt so breite Register (32 Bit) und
  3444. kennt einige zus"atzliche Befehle und Adressierungsarten.  Trotzdem
  3445. ist sie bin"ar aufw"artskompatibel.
  3446. %%-----------
  3447. \begin{cpulist}
  3448.   HD6475328 $\longrightarrow$ HD6475348 $\longrightarrow$
  3449.   HD6475368 $\longrightarrow$ HD6475388
  3450. \end{cpulist}
  3451. Diese Prozessoren besitzen alle den gleichen CPU-Kern; Die unterschiedlichen
  3452. Typen dienen lediglich der Einbindung des korrekten Registersatzes
  3453. in der Datei \tty{REG53X.INC}.
  3454. %%-----------
  3455. \begin{cpulist}
  3456.   SH7000 $\longrightarrow$ SH7600 $\longrightarrow$ SH7700
  3457. \end{cpulist}
  3458. Der Prozessorkern des 7600ers bietet eine Handvoll Befehle mehr, die
  3459. L"ucken im Befehlssatz des 7000ers schlie"sen (verz"ogerte, bedingte
  3460. sowie relative und indirekte Spr"unge, Multiplikationen mit 32-Bit-Operanden
  3461. sowie Multiplizier/Addier-Befehle).  Die 7700er-Reihe (auch als SH3
  3462. gel"aufig) bietet weiterhin eine zweite Registerbank, bessere
  3463. Schiebebefehle sowie Befehle zur Cache-Steuerung.
  3464. %%-----------
  3465. \begin{cpulist}
  3466.   HD614023 $\longrightarrow$ HD614043 $\longrightarrow$ HD614081
  3467. \end{cpulist}
  3468. Diese drei Varianten der HMCS400-Serie unterscheiden sich in der
  3469. Gr"o"se des internen ROM- und RAM-Speichers.
  3470. %%-----------
  3471. \begin{cpulist}
  3472.   HD641016
  3473. \end{cpulist}
  3474. Dies ist aktuell das einzige Target mit H16-Kern.
  3475. %%-----------
  3476. \begin{cpulist}
  3477.   6502 $\rightarrow$ 65(S)C02 $\rightarrow$ 65CE02 / W65C02S\\
  3478. \> 65C19 / MELPS740 / HUC6280 / 6502UNDOC
  3479. \end{cpulist}
  3480. Die CMOS-Version definiert einige zus"atzliche Befehle, au"serdem sind
  3481. bei einigen Befehlen Adressierungsarten hinzugekommen, die beim 6502
  3482. nicht m"oglich waren.  Der W65SC02 erg"anzt den
  3483. 65C02-Befehlssatz um zwei Befehle, mit denen die Low-Power-Modi
  3484. der CPU feiner eingestellt werden k"onnen.  Dem 65SC02 fehlen die
  3485. Bitmanipulationsbefehle des 65C02.  Der 65CE02 erg"anzt Sprungbefehle
  3486. mit 16-Bit-Displacement, ein Z-Register, einen 16-bittigen Stack-Pointer,
  3487. eine Reihe neuer Befehle und eine programmierbare Base-Page.
  3488.  
  3489. Der 65C19 ist {\em nicht} bin"ar aufw"artskompatibel zum
  3490. originalen 6502!  Einige Adressierungsarten wurden durch andere
  3491. ersetzt.  Des weiteren enth"alt dieser Prozessor
  3492. Befehlssatz-Erweiterungen, die die Implementierung digitaler
  3493. Signalverarbeitung erleichtern.
  3494.  
  3495. Die Mitsubishi-Mikrokontroller dagegen erweitern den
  3496. 6502-Befehlssatz in erster Linie um Bitoperationen und
  3497. Multiplikations-/Divisionsbefehle.  Bis auf den unbedingten Sprung und
  3498. Befehle zur Inkrementierung/Dekremetierung des Akkumulators sind die
  3499. Erweiterungen disjunkt.
  3500.  
  3501. Das herausstechendste Merkmal des HuC 6280 ist der gr"o"sere
  3502. Adre"sraum von 2 MByte anstelle 64 KByte, der durch eingebaute
  3503. Bankregister erreicht wird.   Des weiteren existieren einige
  3504. Sonderbefehle zur Kommunikation mit dem Videoprozessor (dieser
  3505. Chip wurde in Videospielen eingesetzt) und zum Kopieren von
  3506. Speicherbereichen.
  3507.  
  3508. Mit dem Prozessortyp 6502UNDOC sind die ,,undokumentierten''
  3509. 6502-Befehle erreichbar, d.h. die Operationen, die sich bei der Verwendung
  3510. nicht als Befehle definierter Bitkombinationen im Opcode ergeben.  Die von
  3511. \asname{} unterst"utzten Varianten sind im Kapitel mit den prozessorspezifischen
  3512. Hinweisen beschrieben.
  3513. %%-----------
  3514. \begin{cpulist}
  3515.   MELPS7700, 65816
  3516. \end{cpulist}
  3517. Neben einer ,,16-Bit-Version'' des 6502-Befehlssatzes bieten diese
  3518. Prozessoren einige Befehlserweiterungen.  Diese sind aber gr"o"serenteils
  3519. disjunkt, da sie sich an ihren jeweiligen 8-bittigen Vorbildern (65C02
  3520. bzw. MELPS-740) orientieren.  Z.T.~werden auch andere Mnemonics f"ur
  3521. gleiche Befehle verwendet.
  3522. %%-----------
  3523. \begin{cpulist}
  3524.   PPS-4
  3525. \end{cpulist}
  3526. %%-----------
  3527. \begin{cpulist}
  3528.   MELPS4500
  3529. \end{cpulist}
  3530. %%-----------
  3531. \begin{cpulist}
  3532.   M16
  3533. \end{cpulist}
  3534. %%-----------
  3535. \begin{cpulist}
  3536.   M16C
  3537. \end{cpulist}
  3538. %%-----------
  3539. \begin{cpulist}
  3540.   PDP-11/03, PDP-11/04, PDP-11/05, PDP-11/10, \\
  3541. \> PDP-11/15, PDP-11/20, PDP-11/23, PDP-11/24, \\
  3542. \> PDP-11/34, PDP-11/35, PDP-11/40, PDP-11/44, \\
  3543. \> PDP-11/45, PDP-11/50, MicroPDP-11/53, \\
  3544. \> PDP-11/55, PDP-11/60, PDP-11/70, \\
  3545. \> MicroPDP-11/73, MicroPDP-11/83, PDP-11/84, \\
  3546. \> MicroPDP-11/93, PDP-11/94, T-11
  3547. \end{cpulist}
  3548. Die Modelle der PDP-11-Serien unterscheiden sich im
  3549. Befehlssatz (sowohl dem eingebauten als auch den verf"ugbaren
  3550. Erweiterungen) als auch im verf"ugbaren Adre"sraum (64, 256
  3551. oder 4096 KByte).
  3552. %%-----------
  3553. \begin{cpulist}
  3554.   WD16
  3555. \end{cpulist}
  3556. Der WD16 benutzt den gleichen Prozessor wie der LSI-11,
  3557. lediglich mit anderem Mikrocode.  Demensprechend sind
  3558. Registersatz und Adressierungsarten zur PDP-11 identisch,
  3559. der Befehlsumfang ist aber leicht unterschiedlich und
  3560. auf der PDP-11 in gleicher Form vorhandene Maschinenbefehle
  3561. haben durchg"angig andere Kodierungen.
  3562. %%-----------
  3563. \begin{cpulist}
  3564.   MICROVAX-I, MICROVAX-II, \\
  3565. \> VAX-11/725, VAX-11/730, VAX-11/750, \\
  3566. \> VAX-11/780, VAX-11/782, VAX-11/785, \\
  3567. \> VAX-8200, VAX-8300, VAX-8500, VAX-8600 \\
  3568. \> VAX-8650, VAX-8800
  3569. \end{cpulist}
  3570. Alle Implementierungen der VAX-Architektur unterst"utzen den
  3571. gleichen Kern-Befehlssatz.  Einige Erweiterungen, wie z.B.
  3572. Befehle zur Verarbeitung von Strings, gepackten Dezimalzahlen
  3573. oder bestimmten Gleitkommaformaten, sind nicht immer in
  3574. Hardware implementiert.
  3575. %%-----------
  3576. \begin{cpulist}
  3577.   CP-3F, LP8000, M380
  3578. \end{cpulist}
  3579. Das Prozessorelement des Chipsatzes ist von AEG/Olympia, GI
  3580. und SGS-Ates unter den jeweiligen Namen vertrieben worden.
  3581. Im Befehlssatz und den Adre"sr"aumen bestehen keine Unterschiede.
  3582. %%-----------
  3583. \begin{cpulist}
  3584.   4004 $\rightarrow$ 4040
  3585. \end{cpulist}
  3586. Der 4040 besitzt gegen"uber seinem Vorg"anger ein gutes Dutzend
  3587. zus"atzlicher Maschineninstruktionen.
  3588. %%-----------
  3589. \begin{cpulist}
  3590.   8008 $\rightarrow$ 8008NEW
  3591. \end{cpulist}
  3592. Intel hat 1975 die Mnemonics des 8008 umdefiniert, die zweite Variante spiegelt
  3593. diesen neuen Befehlssatz wieder.  Eine gleichzeitige Unterst"utzung beider
  3594. Varianten war nicht m"oglich, da teilweise "Uberschneidungen vorliegen.
  3595. %%-----------
  3596. \begin{cpulist}
  3597.   8021, 8022, \\
  3598. \> 8401, 8411, 8421, 8461, \\
  3599. \> 8039, (MSM)80C39, 8048, (MSM)80C48, 8041, 8042, \\
  3600. \> 80C382
  3601. \end{cpulist}
  3602. Bei den ROM-losen Versionen 8039 und 80C39 sind die Befehle verboten,
  3603. die den BUS (Port 0) ansprechen.  Der 8021 und 8022 sind Sonderversionen
  3604. mit stark abgemagertem Befehlssatz, wof"ur der 8022 zwei A/D-Wandler
  3605. und die dazugeh"origen Steuerbefehle enth"alt.  MAB8401 bis 8461 sind von
  3606. Philips entwickelte Derivate, die in ihrem Befehssatz irgendwo zwischen
  3607. dem 8021/8022 und einem 'vollst"andigen'' 8048 stehen.  Daf"ur verf"ugen
  3608. sie "uber serielle Ports und je nach Variante bis zu 8 KByte Programmspeicher.
  3609.  
  3610. Die CMOS-Versionen lassen
  3611. sich mit dem \tty{IDL}- bzw. \tty{HALT}-Befehl in einen Ruhezustand niedriger
  3612. Stromaufnahme "uberf"uhren.  Der 8041 und 8042 haben einige Zusatzbefehle zur
  3613. Steuerung der Busschnittstelle, daf"ur fehlen aber einige andere Befehle.
  3614. Beim 8041, 8042, 84x1, 8021 und 8022 ist der Programmadre"sraum nicht
  3615. extern erweiterbar, weshalb \asname{} das Codesegment bei diesen Prozessoren
  3616. auf die Gr"o"se des internen ROM beschr"ankt.  Der (SAB)80C382 ist eine von
  3617. Siemens speziell f"ur Telefone entwickelte Variante, die ebenfalls
  3618. einen \tty{HALT}-Befehl kennt sowie \tty{DJNZ} und \tty{DEC} auch
  3619. mit indirekter Adressierung erlaubt.  Im Gegenzug wurden einige
  3620. Befehle des 'normalen' 8048 entfernt. Die OKI-Varienaten (MSM...)
  3621. unterst"utzen ebenfalls \tty{DJNZ} und \tty{DEC} mit indirekter
  3622. Adressierung, sowie eine erweiterte Steuerung der
  3623. Power-Down-Modi, ohne den Basis-MCS-48-Befehlssatz zu
  3624. beschneiden.
  3625. %%-----------
  3626. \begin{cpulist}
  3627.   87C750 $\rightarrow$ 8051, 8052, 80C320, 80C501, 80C502, \\
  3628. \> 80C504, 80515, und 80517 \\
  3629. \> $\rightarrow$ 80C390 \\
  3630. \> $\rightarrow$ 80C251
  3631. \end{cpulist}
  3632. Der 87C750 kann nur max. 2 Kbyte Programmspeicher adressieren, weshalb
  3633. die \tty{LCALL}- und \tty{LJMP}-Befehle bei ihm fehlen.  Zwischen den
  3634. acht mittleren Prozessoren nimmt \asname{} selber "uberhaupt keine Unterscheidung
  3635. vor, sondern verwaltet den Unterschied lediglich in der Variablen
  3636. \tty{MOMCPU} (s.u.), die man mit \tty{IF}-Befehlen abfragen kann.  Eine
  3637. Ausnahme stellt lediglich der 80C504, der in seiner momentanen Form noch einen
  3638. Maskenfehler zeigt, wenn eine \tty{AJMP}- oder \tty{ACALL}-Anweisung auf der
  3639. vorletzten Adresse einer 2K-Seite steht.  \asname{} benutzt in einem solchen
  3640. Fall automatisch lange Sprungbefehle bzw. gibt eine Fehlermeldung aus.  Der
  3641. 80C251 hingegen stellt einen drastischen Fortschritt in Richtung 16/32 Bit,
  3642. gr"o"serer Adre"sr"aume und orthogonalerem Befehlssatz dar.  Den 80C390
  3643. k"onnte man vielleicht als die 'kleine L"osung' bezeichnen:  Dallas
  3644. Semiconductor hat den Befehlssatz und die Architektur nur so weit
  3645. ver"andert, wie es f"ur die 16 MByte gro"sen Adre"sr"aume notwendig war.
  3646. %%-----------
  3647. \begin{cpulist}
  3648.   8096 $\rightarrow$ 80196 $\rightarrow$ 80196N $\rightarrow$ 80296
  3649. \end{cpulist}
  3650. Neben einem anderen Satz von SFRs (die "ubrigens von Unterversion zu
  3651. Unterversion stark differieren) kennt der 80196 eine Reihe von
  3652. zus"atzlichen Befehlen und kennt einen ,,Windowing''-Mechanismus, um
  3653. das gr"o"sere interne RAM anzusprechen.  Die 80196N-Familie wiederum
  3654. erweitert den Adre"sraum auf 16 Mbyte und f"uhrt eine Reihe von
  3655. Befehlen ein, mit denen man auf Adressen jenseits 64 Kbyte zugreifen
  3656. kann.  Der 80296 erweitert den CPU-Kern um Befehle zur Signalverarbeitung
  3657. und ein zweites Windowing-Register, verzichtet jedoch auf den {\em
  3658. Peripheral Transaction Server} (PTS) und verliert damit wieder zwei
  3659. Maschinenbefehle.
  3660. %%-----------
  3661. \begin{cpulist}
  3662.   8080 $\rightarrow$ V30EMU $\rightarrow$ 8085 $\rightarrow$ 8085UNDOC
  3663. \end{cpulist}
  3664. Der 8085 kennt zus"atzlich die Befehle \tty{RIM} und \tty{SIM} zum Steuern der
  3665. Interruptmaske und der zwei I/O-Pins.  Der Typ {\tt 8085UNDOC} schaltet
  3666. zus"atzliche, nicht von Intel dokumentierte Befehle ein.  Diese Befehle
  3667. sind in Abschnitt \ref{8085Spec} dokumentiert.
  3668.  
  3669. {\tt V30EMU} als Ziel schaltet gegen"uber einem 8080 die Befehle {\tt RETEM}
  3670. und {\em CALLN} frei, mit denen die 8080-Emulation auf einem V20/V30/V40/V50
  3671. verlassen bzw. unterbrochen werden kann.
  3672. %%-----------
  3673. \begin{cpulist}
  3674.   8088,8086 \\
  3675. \> $\rightarrow$ 80188,80186 \\
  3676. \> $\rightarrow$ V20,V30,V40,V50 \\
  3677. \> $\rightarrow$ V33,V53 \\
  3678. \> $\rightarrow$ V25,V35 \\
  3679. \> $\rightarrow$ V55 \\
  3680. \> $\rightarrow$ V55SC \\
  3681. \> $\rightarrow$ V55PI
  3682. \end{cpulist}
  3683. Prozessoren in der gleichen Zeile verf"ugen "uber den gleichen CPU-Kern und
  3684. damit den gleichen Befehlssatz.  Von Zeile zu Zeile kommen neue Befehle
  3685. hinzu, wobei die NEC-CPUs ausgehend vom 'V20-Basisbefehlssatz' jeweils "uber
  3686. unterschiedliche Erweiterungen verf"ugen.
  3687. %%-----------
  3688. \begin{cpulist}
  3689.   80960
  3690. \end{cpulist}
  3691. %%-----------
  3692. \begin{cpulist}
  3693.   8X300 $\rightarrow$ 8X305
  3694. \end{cpulist}
  3695. Der 8X305 besitzt eine Reihe zus"atzlicher Arbeitsregister, die dem
  3696. 8X300 fehlen und kann mit diesen auch zus"atzliche Operationen ausf"uhren,
  3697. wie das direkte Schreiben von 8-Bit-Werten auf Peripherieadressen.
  3698. %%-----------
  3699. \begin{cpulist}
  3700.   XAG1, XAG2, XAG3
  3701. \end{cpulist}
  3702. Diese Prozessoren unterscheiden sich nur in der Gr"o"se des eingebauten
  3703. ROMs, die in \tty{STDDEFXA.INC} definiert ist.
  3704. %%-----------
  3705. \begin{cpulist}
  3706.   AT90S1200, AT90S2313, AT90S2323, AT90S233, AT90S2343,\\
  3707. \> AT90S4414, AT90S4433, AT90S4434, AT90S8515,\\
  3708. \> AT90C8534, AT90S8535, ATTINY4, ATTINY5, ATTINY9,\\
  3709. \> ATTINY10, ATTINY11, ATTINY12, ATTINY13, ATTINY13A,\\
  3710. \> ATTINY15, ATTINY20, ATTINY24(A), ATTINY25,\\
  3711. \> ATTINY26, ATTINY28, ATTINY40, ATTINY44(A),\\
  3712. \> ATTINY45, ATTINY48, ATTINY84(A), ATTINY85,\\
  3713. \> ATTINY87, ATTINY88, ATTINY102, ATTINY104,\\
  3714. \> ATTINY167, ATTINY261, ATTINY261A, ATTINY43U,\\
  3715. \> ATTINY441, ATTINY461, ATTINY461A, ATTINY828,\\
  3716. \> ATTINY841, ATTINY861, ATTINY861A, ATTINY1634,\\
  3717. \> ATTINY2313, ATTINY2313A, ATTINY4313, ATMEGA48,\\
  3718. \> ATMEGA8, ATMEGA8515, ATMEGA8535, ATMEGA88,\\
  3719. \> ATMEGA8U2, ATMEGA16U2, ATMEGA32U2,\\
  3720. \> ATMEGA16U4, ATMEGA32U4, ATMEGA32U6, AT90USB646,\\
  3721. \> AT90USB647, AT90USB1286, AT90USB1287, AT43USB355,\\
  3722. \> ATMEGA16, ATMEGA161, ATMEGA162, ATMEGA163,\\
  3723. \> ATMEGA164, ATMEGA165, ATMEGA168, ATMEGA169,\\
  3724. \> ATMEGA32, ATMEGA323, ATMEGA324, ATMEGA325,\\
  3725. \> ATMEGA3250, ATMEGA328, ATMEGA329, ATMEGA3290,\\
  3726. \> ATMEGA406, ATMEGA64, ATMEGA640, ATMEGA644,\\
  3727. \> ATMEGA644RFR2, ATMEGA645, ATMEGA6450,\\
  3728. \> ATMEGA649, ATMEGA6490, ATMEGA103, ATMEGA128,\\
  3729. \> ATMEGA1280, ATMEGA1281, ATMEGA1284,\\
  3730. \> ATMEGA1284RFR2, ATMEGA2560, ATMEGA2561
  3731. \end{cpulist}
  3732. Die verschiedenen AVR-Varianten unterscheiden sich in erster Linie in
  3733. der Gr"o"se des On-Chip-Speichers (Flash, SRAM, EEPROM) und der integrierten
  3734. Peripherie (GPIO, Timer, UART, A/D-Wandler,...).  Die ATmegas bringen im
  3735. Vergleich zu den AT90...-Vorg"angern auch neue Maschinenbefehle
  3736. mit, den ATtinys fehlen wiederum die Multiplikationsbefehle.
  3737. %%-----------
  3738. \begin{cpulist}
  3739.   AM29245 $\rightarrow$ AM29243 $\rightarrow$ AM29240 $\rightarrow$ AM29000
  3740. \end{cpulist}
  3741. Je weiter man sich in der Liste nach rechts bewegt, desto weniger
  3742. Befehle m"ussen in Software emuliert werden.  W"ahrend z.B. der 29245
  3743. noch nicht einmal einen Hardware-Multiplizierer besitzt, fehlen den
  3744. beiden Vertretern in der Mitte nur die Gleitkommabefehle.  Der 29000
  3745. dient dabei als ,,generischer'' Typ, der alle Befehle in Hardware versteht.
  3746. %%-----------
  3747. \begin{cpulist}
  3748.   80C166 $\longrightarrow$ 80C167,80C165,80C163
  3749. \end{cpulist}
  3750. 80C167 und 80C165/163 haben anstelle 256 Kbyte max. 16 Mbyte Adre"sraum,
  3751. au"serdem kennen sie einige zus"atzliche Befehle f"ur erweiterte
  3752. Adressierungsmodi sowie atomare Befehlssequenzen.  Untereinander
  3753. unterscheiden sich diese Prozessoren der ,,zweiten Generation'' nur in der
  3754. eingebauten Peripherie.
  3755. %%-----------
  3756. \begin{cpulist}
  3757.   LR35902/GBZ80 $\rightarrow$ Z80 $\rightarrow$ Z80UNDOC \\
  3758. \> $\rightarrow$ Z180 \\
  3759. \> $\rightarrow$ eZ80190, eZ80L92, eZ80F91, \\
  3760. \> eZ80F92, eZ80F93, \\
  3761. \> $\rightarrow$ Z380
  3762. \end{cpulist}
  3763. W"ahrend f"ur den Z180 nur die zus"atzlichen Befehle definiert sind
  3764. (d.h. die Z180-MMU findet noch keine Ber"ucksichtigung), besitzt der
  3765. Z380 32-Bit-Register, einen linearen 4Gbyte-Adre"sraum sowie neben
  3766. einer Reihe von Befehlserweiterungen, die den Befehlssatz deutlich
  3767. orthogonaler machen, neue Adressierungsmodi (Ansprechen der
  3768. Indexregisterh"alften, Stack-relativ).  Zu einem kleinen Teil existieren
  3769. diese Erweiterungen aber auch schon beim Z80 als undokumentierte
  3770. Befehle, die mit der Variante \tty{Z80UNDOC} zugeschaltet werden
  3771. k"onnen.  Eine Liste mit den zus"atzlichen Befehlen findet sich im
  3772. Kapitel mit den prozessorspezifischen Hinweisen.
  3773.  
  3774. Der im Gameboy verbaute Prozessor (offizielle Bezeichnung LR35902,
  3775. umgangssprachlich auch als ,,Gameboy-Z80'' bezeichnet) ist eine
  3776. Mischung aus Z80 und 8080.  Ihm fehlen die IX/IY-Register, der
  3777. I/O-Adre"sraum, die zweite Registerbank sowie eine Reihe von
  3778. 16-Bit-Befehlen.
  3779.  
  3780. Die Zilog eZ80 Varianten erweitern die Z80 Architektur um
  3781. einem 16 MByte gro"sen Adre"sraum, 24 Bit breite Register
  3782. sowie eine begrenzte Zahl neuer Befehle.  Einige Varianten
  3783. enthalten ein I-Register, das nur 8 Bit breit ist.  Dem
  3784. eZ80190 fehlen zus"atzlich einige String-I/O Befehle.  Ansonsten
  3785. liegen die Unterschiede nur in der Menge des eingebauten
  3786. Speichers sowie der integrierten Peripherie.
  3787. %%-----------
  3788. \begin{cpulist}
  3789.   Z8601, Z8603, Z86C03, Z86E03, Z86C06, Z86E06, \\
  3790. \> Z86C08, Z86C21, Z86E21, Z86C30, Z86C31, Z86C32 Z86C40 \\
  3791. \> $\rightarrow$ Z88C00, Z88C01 \\
  3792. \> $\rightarrow$ eZ8, Z8F0113, Z8F011A, Z8F0123, Z8F012A, \\
  3793. \> Z8F0130, Z8F0131, Z8F0213, Z8F021A, Z8F0223, Z8F022A, \\
  3794. \> Z8F0230, Z8F0231, Z8F0411, Z8F0412, Z8F0413, Z8F041A, \\
  3795. \> Z8F0421, Z8F0422, Z8F0423, Z8F042A, Z8F0430, Z8F0431, \\
  3796. \> Z8F0811, Z8F0812, Z8F0813, Z8F081A, Z8F0821, Z8F0822, \\
  3797. \> Z8F0823, Z8F082A, Z8F0830, Z8F0831, Z8F0880, Z8F1232, \\
  3798. \> Z8F1233, Z8F1621, Z8F1622, Z8F1680, Z8F1681, Z8F1682, \\
  3799. \> Z8F2421, Z8F2422, Z8F2480, Z8F3221, Z8F3222, Z8F3281, \\
  3800. \> Z8F3282, Z8F4821, Z8F4822, Z8F4823, Z8F6081, Z8F6082, \\
  3801. \> Z8F6421, Z8F6422, Z8F6423, Z8F6481, Z8F6482
  3802. \end{cpulist}
  3803. Die Varianten mit Z8-Kern unterscheiden sich nur in
  3804. Speicherausbau und Peripherie, d.h. die Wahl hat auf den
  3805. unterst"utzten Befehlssatz keinen Effekt.  Deutlich anders sind
  3806. jedoch die Super8- und eZ8-Varianten, jeweils mit (in unterschiedliche
  3807. Richtungen) stark erweiterten Befehlss"atzen, die auch auf Quellcode-Ebene
  3808. nur g"o"stenteils aufw"arts-kompatibel sind.
  3809. %%-----------
  3810. \begin{cpulist}
  3811.   Z8001, Z8002, Z8003, Z8004
  3812. \end{cpulist}
  3813. "Uber die Wahl des Prozessors wird die Betriebsart (segmentiert f"ur
  3814. Z8001 und Z8003, nicht segmentiert f"ur Z8002 und Z8004) bestimmt.  Eine
  3815. Unterscheidung zwischen dem Z8001/8002 einerseits und Z8003/8004 andererseits
  3816. findet aktuell nicht statt.
  3817. %%-----------
  3818. \begin{cpulist}
  3819.   KCPSM, KCPSM3
  3820. \end{cpulist}
  3821. Bei beiden Prozessorkernen handelt es sich um keine eigenst"andigen
  3822. Bausteine, sondern Logik-Kerne f"ur Gate-Arrays der Firma Xilinx.  Die
  3823. 3er-Variante bietet einen gr"o"seren Adre"sraum sowie einige zus"atzliche
  3824. Instruktionen.  Es ist zu beachten, da"s sie nicht bin"ar
  3825. aufw"artskompatibel ist!
  3826. %%-----------
  3827. \begin{cpulist}
  3828.   MICO8\_05, MICO8\_V3, MICO8\_V31
  3829. \end{cpulist}
  3830. Leider hat Lattice die Maschinencodes des Mico8 mehrfach ge"andert, so
  3831. da"s verschiedene Targets notwendig wurden, um auch alte Designs weiter
  3832. zu unterst"utzen.  Die erste Variante entspricht der Variante, wie sie
  3833. im 2005er-Manual beschrieben wurde, die beiden anderen die Versionen 3.0
  3834. bzw. 3.1.
  3835. %%-----------
  3836. \begin{cpulist}
  3837.   96C141, 93C141
  3838. \end{cpulist}
  3839. Diese beiden Prozessoren repr"asentieren die beiden Varianten der
  3840. Prozessorfamilie: TLCS-900 und TLCS-900L.  Die Unterschiede dieser beiden
  3841. Varianten werden in Abschnitt \ref{TLCS900Spec} genauer beleuchtet.
  3842. %%-----------
  3843. \begin{cpulist}
  3844.   90C141
  3845. \end{cpulist}
  3846. %%-----------
  3847. \begin{cpulist}
  3848.   87C00, 87C20, 87C40, 87C70
  3849. \end{cpulist}
  3850. Die Prozessoren der TLCS-870-Reihe haben zwar den identischen CPU-Kern, je
  3851. nach Variante aber eine unterschiedliche Peripherieausstattung.  Zum
  3852. Teil liegen Register gleichen Namens auf unterschiedlichen Adressen.
  3853. Die Datei STDDEF87.INC benutzt analog zur MCS-51-Familie die hier
  3854. m"ogliche Unterscheidung, um automatisch den korrekten Symbolsatz
  3855. bereitzustellen.
  3856. %%-----------
  3857. \begin{cpulist}
  3858.   TLCS-870/C
  3859. \end{cpulist}
  3860. Momentan ist nur der Prozessorkern der TLCS-870/C-Familie implementiert.
  3861. %%-----------
  3862. \begin{cpulist}
  3863.   47C00 $\rightarrow$ 470C00 $\rightarrow$ 470AC00
  3864. \end{cpulist}
  3865. Diese drei Varianten der TLCS-47-Familie haben unterschiedlich gro"se
  3866. RAM-und ROM-Adre"sbereiche, wodurch jeweils einige Befehle zur
  3867. Bankumschaltung hinzukommen oder wegfallen.
  3868. %%-----------
  3869. \begin{cpulist}
  3870.   97C241
  3871. \end{cpulist}
  3872. %%-----------
  3873. \begin{cpulist}
  3874.   TC9331
  3875. \end{cpulist}
  3876. %%-----------
  3877. \begin{cpulist}
  3878.   16C54 $\rightarrow$ 16C55 $\rightarrow$ 16C56 $\rightarrow$ 16C57
  3879. \end{cpulist}
  3880. Diese Prozessoren unterscheiden sich durch den verf"ugbaren
  3881. Adre"sraum im Programmspeicher, d.h. durch die Adresse, ab der
  3882. der \asname{} "Uberl"aufe anmeckert.
  3883. %%-----------
  3884. \begin{cpulist}
  3885.   16C64, 16C84
  3886. \end{cpulist}
  3887. Analog zur MCS-51-Familie findet hier keine Unterscheidung im
  3888. Codegenerator statt, die unterschiedlichen Nummern dienen lediglich
  3889. der Einblendung der korrekten SFRs in STDDEF18.INC.
  3890. %%-----------
  3891. \begin{cpulist}
  3892.   17C42
  3893. \end{cpulist}
  3894. %%-----------
  3895. \begin{cpulist}
  3896.   SX20, SX28
  3897. \end{cpulist}
  3898. Der SX20 steckt in einem kleineren Geh"ause, weshalb der Port C
  3899. fehlt.
  3900. %%-----------
  3901. \begin{cpulist}
  3902.   ST6200, ST6201, ST6203, ST6208, ST6209,\\
  3903. \> ST6210, ST6215, ST6218, ST6220, ST6225,\\
  3904. \> ST6228, ST6230, ST6232, ST6235, ST6240,\\
  3905. \> ST6242, ST6245, ST6246, ST6252, ST6253,\\
  3906. \> ST6255, ST6260, ST6262, ST6263, ST6265,\\
  3907. \> ST6280, ST6285
  3908. \end{cpulist}
  3909. Die einzelnen ST6-Varianten differieren in der Menge der
  3910. On-Chip-Peripherie und dem eingebauten Speicher.
  3911. %%-----------
  3912. \begin{cpulist}
  3913.   ST7 \\
  3914. \> ST72251G1, ST72251G2, ST72311J2, ST72311J4, \\
  3915. \> ST72321BR6, ST72321BR7, ST72321BR9, ST72325S4, \\
  3916. \> ST72325S6, ST72325J7, ST72325R9, ST72324J6, \\
  3917. \> ST72324K6, ST72324J4, ST72324K4, ST72324J2, \\
  3918. \> ST72324JK21, ST72325S4, ST72325J7, ST72325R9, \\
  3919. \> ST72521BR6, ST72521BM9, ST7232AK1, ST7232AK2, \\
  3920. \> ST7232AJ1, ST7232AJ2, ST72361AR4, ST72361AR6, \\
  3921. \> ST72361AR7, ST72361AR9, ST7FOXK1, ST7FOXK2, \\
  3922. \> ST7LITES2Y0, ST7LITES5Y0, ST7LITE02Y0, \\
  3923. \> ST7LITE05Y0, ST7LITE09Y0 \\
  3924. \> ST7LITE10F1, ST7LITE15F1, ST7LITE19F1, \\
  3925. \> ST7LITE10BF0, ST7LITE15BF0, ST7LITE15BF1, \\
  3926. \> ST7LITE19BF0, ST7LITE19BF1, \\
  3927. \> ST7LITE20F2, ST7LITE25F2, ST7LITE29F2, \\
  3928. \> ST7LITE30F2, ST7LITE35F2, ST7LITE39F2, \\
  3929. \> ST7LITE49K2, \\
  3930. \> ST7MC1K2, ST7MC1K4, ST7MC2N6, ST7MC2S4, \\
  3931. \> ST7MC2S6, ST7MC2S7, ST7MC2S9, ST7MC2R6, \\
  3932. \> ST7MC2R7, ST7MC2R9, ST7MC2M9, \\
  3933. \> STM8 \\
  3934. \> STM8S001J3, STM8S003F3, STM8S003K3, STM8S005C6,\\
  3935. \> STM8S005K6, STM8S007C8, STM8S103F2, STM8S103F3,\\
  3936. \> STM8S103K3, STM8S105C4, STM8S105C6, STM8S105K4,\\
  3937. \> STM8S105K6, STM8S105S4, STM8S105S6, STM8S207MB,\\
  3938. \> STM8S207M8, STM8S207RB, STM8S207R8, STM8S207R6,\\
  3939. \> STM8S207CB, STM8S207C8, STM8S207C6, STM8S207SB,\\
  3940. \> STM8S207S8, STM8S207S6, STM8S207K8, STM8S207K6,\\
  3941. \> STM8S208MB, STM8S208RB, STM8S208R8, STM8S208R6,\\
  3942. \> STM8S208CB, STM8S208C8, STM8S208C6, STM8S208SB,\\
  3943. \> STM8S208S8, STM8S208S6, STM8S903K3, STM8S903F3,\\
  3944. \> STM8L050J3, STM8L051F3, STM8L052C6, STM8L052R8,\\
  3945. \> STM8L001J3, STM8L101F1, STM8L101F2, STM8L101G2,\\
  3946. \> STM8L101F3, STM8L101G3, STM8L101K3, STM8L151C2,\\
  3947. \> STM8L151K2, STM8L151G2, STM8L151F2, STM8L151C3,\\
  3948. \> STM8L151K3, STM8L151G3, STM8L151F3, STM8L151C4,\\
  3949. \> STM8L151C6, STM8L151K4, STM8L151K6, STM8L151G4,\\
  3950. \> STM8L151G6, STM8L152C4, STM8L152C6, STM8L152K4,\\
  3951. \> STM8L152K6, STM8L151R6, STM8L151C8, STM8L151M8,\\
  3952. \> STM8L151R8, STM8L152R6, STM8L152C8, STM8L152K8,\\
  3953. \> STM8L152M8, STM8L152R8, STM8L162M8, STM8L162R8,\\
  3954. \> STM8AF6366, STM8AF6388, STM8AF6213, STM8AF6223,\\
  3955. \> STM8AF6226, STM8AF6246, STM8AF6248, STM8AF6266,\\
  3956. \> STM8AF6268, STM8AF6269, STM8AF6286, STM8AF6288,\\
  3957. \> STM8AF6289, STM8AF628A, STM8AF62A6, STM8AF62A8,\\
  3958. \> STM8AF62A9, STM8AF62AA, STM8AF5268, STM8AF5269,\\
  3959. \> STM8AF5286, STM8AF5288, STM8AF5289, STM8AF528A,\\
  3960. \> STM8AF52A6, STM8AF52A8, STM8AF52A9, STM8AF52AA,\\
  3961. \> STM8AL3136, STM8AL3138, STM8AL3146, STM8AL3148,\\
  3962. \> STM8AL3166, STM8AL3168, STM8AL3L46, STM8AL3L48,\\
  3963. \> STM8AL3L66, STM8AL3L68, STM8AL3188, STM8AL3189,\\
  3964. \> STM8AL318A, STM8AL3L88, STM8AL3L89, STM8AL3L8A,\\
  3965. \> STM8TL52F4, STM8TL52G4, STM8TL53C4, STM8TL53F4,\\
  3966. \> STM8TL53G4
  3967. \end{cpulist}
  3968. Der STM8-Kern erweitert den Adre"sraum auf bis zu 16 MByte und f"uhrt
  3969. eine ganze Reihe neuer Befehle ein.  Obwohl viele Befehle den
  3970. gleichen Maschinencode wie beim ST7 haben, ist er nicht bin"ar
  3971. aufw"artskompatibel.
  3972. %%-----------
  3973. \begin{cpulist}
  3974.   ST9020, ST9030, ST9040, ST9050
  3975. \end{cpulist}
  3976. Diese 4 Namen vetreten die vier ,,Unterfamilien'' der ST9-Familie, die
  3977. sich durch eine unterschiedliche Ausstattung mit On-Chip-Peripherie
  3978. auszeichnen.  Im Prozessorkern sind sie identisch, so da"s diese
  3979. Unterscheidung wieder nur in der Include-Datei mit den Peripherieadressen zum
  3980. Zuge kommt.
  3981. %%-----------
  3982. \begin{cpulist}
  3983.   6804
  3984. \end{cpulist}
  3985. %%-----------
  3986. \begin{cpulist}
  3987.   32010 $\rightarrow$ 32015
  3988. \end{cpulist}
  3989. Der TMS32010 besitzt nur 144 Byte internes RAM, weshalb \asname{} Adressen im
  3990. Datensegment auf eben diesen Bereich begrenzt.  F"ur den 32015 gilt diese
  3991. Beschr"ankung nicht, es kann der volle Bereich von 0--255 angesprochen
  3992. werden.
  3993. %%-----------
  3994. \begin{cpulist}
  3995.   320C25 $\rightarrow$ 320C26 $\rightarrow$ 320C28
  3996. \end{cpulist}
  3997. Diese Prozessoren unterscheiden sich nur leicht in der
  3998. On-Chip-Peripherie sowie den Konfigurationsbefehlen.
  3999. %%-----------
  4000. \begin{cpulist}
  4001.   320C30, 320C31 $\rightarrow$ 320C40, 320C44
  4002. \end{cpulist}
  4003. Der 320C31 ist eine etwas ,,abgespeckte'' Version des 320C30 mit dem
  4004. gleichen Befehlssatz, jedoch weniger Peripherie.  In STDDEF3X.INC
  4005. wird diese Unterscheidung ausgenutzt.  Die C4x-Varianten sind
  4006. Quellcode-aufw"artskompatibel, unterscheiden sich im
  4007. Maschinencode einiger Befehle jedoch subtil.  Auch hier ist ist
  4008. der C44 eine abgespeckte Version des C40, mit weniger Peripherie
  4009. und kleinerem Adre"sraum.
  4010. %%-----------
  4011. \begin{cpulist}
  4012.   320C203 $\rightarrow$ 320C50, 320C51, 320C53
  4013. \end{cpulist}
  4014. Ersterer ist der generelle Repr"asentant f"ur die
  4015. C20x-Signalprozessorfamilie, die eine Untermenge des C5x-Befehlssatzes
  4016. implementieren.  Die Unterscheidung zwischen den verschiedenen
  4017. C5x-Prozessoren wird von \asname{} momentan nicht ausgenutzt.
  4018. %%-----------
  4019. \begin{cpulist}
  4020.   320C541
  4021. \end{cpulist}
  4022. Dies ist momentan der Repr"asentant f"ur die TMS320C54x-Familie...
  4023. %%-----------
  4024. \begin{cpulist}
  4025.   TI990/4, TI990/10, TI990/12 \\
  4026. \> TMS9900, TMS9940, TMS9995, TMS99105, TMS99110
  4027. \end{cpulist}
  4028. Die TMS99xx/99xxx-Prozessoren sind im Prinzip Single-Chip-Implementierungen
  4029. der TI990-Minicomputer, einige TI990-Modelle basieren auch auf einem solchen
  4030. Prozessor anstatt einer diskret aufgebauten CPU.  Die einzelnen Modelle
  4031. unterscheiden sich im Befehlssatz (der TI990/12 hat den gr"o"sten), und
  4032. dem Vorhandensein eines privilegierten Modus.
  4033. %%-----------
  4034. \begin{cpulist}
  4035.   TMS70C00, TMS70C20, TMS70C40, \\
  4036. \> TMS70CT20, TMS70CT40, \\
  4037. \> TMS70C02, TMS70C42, TMS70C82, \\
  4038. \> TMS70C08, TMS70C48 \\
  4039. \end{cpulist}
  4040. Alle Mitglieder dieser Familie haben den gleichen CPU-Kern,
  4041. unterscheiden sich im Befehlssatz also nicht.  Die Unterschiede
  4042. finden sich nur in der Datei REG7000.INC, in der Speicherbereiche
  4043. und Peripherieadressen definiert werden.  Die in einer Zeile
  4044. stehenden  Typen besitzen jeweils gleiche Peripherie und gleiche
  4045. interne RAM-Menge, unterscheiden sich also nur in der Menge
  4046. eingebauten ROMs.
  4047. %%-----------
  4048. \begin{cpulist}
  4049.   370C010, 370C020, 370C030, 370C040 und 370C050
  4050. \end{cpulist}
  4051. Analog zur MCS-51-Familie werden die unterschiedlichen Typen nur
  4052. zur Unterscheidung der Peripherie in STDDEF37.INC genutzt, der
  4053. Befehlssatz ist identisch.
  4054. %%-----------
  4055. \begin{cpulist}
  4056.   MSP430 $\rightarrow$ MSP430X
  4057. \end{cpulist}
  4058. Die X-Variante des CPU-Kerns erweitert den Adre"sraum von 64
  4059. KiByte auf 1 MiByte und erweitert den Befehlssatz, um
  4060. Instruktionen mehrfach ausf"uhren zu k"onnen.
  4061. %%-----------
  4062. \begin{cpulist}
  4063.   TMS1000, TMS1100, TMS1200, TMS1300
  4064. \end{cpulist}
  4065. F"ur TMS1000 und TMS1200 sind jeweils 1 KByte ROM und 64 Nibbles
  4066. RAM vorgesehen, f"ur TMS1100 und TMS1300 jeweils das doppelte.  Des
  4067. weiteren hat TI f"ur TMS1100 und TMS1300 einen deutlich anderen
  4068. Default-Befehlssatz vorgesehen (\asname{} kennt nur die Default-
  4069. Befehlss"atze!).
  4070. %%-----------
  4071. \begin{cpulist}
  4072.   IMP-16C/200, IMP-16C/300, IMP-16P/200, IMP-16P/300, IMP-16L
  4073. \end{cpulist}
  4074. Beim IMP-16L sind einige zus"atzliche Bits im Statusregister sowie
  4075. weitere Sprungbedingungen definiert. Den erweiterten Befehlssatz
  4076. unterst"utzt er ebenso wie die 300er-Varianten.
  4077. %%-----------
  4078. \begin{cpulist}
  4079.   IPC-16, INS8900
  4080. \end{cpulist}
  4081. Der INS8900 ist lediglich eine Re-Implementierung des PACE in
  4082. einem modernerem NMOS-Fertigungsprozess; es bestehen keine
  4083. Unterschiede im Befehlssatz.
  4084. %%-----------
  4085. \begin{cpulist}
  4086.   SC/MP
  4087. \end{cpulist}
  4088. %%-----------
  4089. \begin{cpulist}
  4090.   8070
  4091. \end{cpulist}
  4092. Dieser Prozessor repr"asentiert die gesamte 807x-Familie (die mindestens
  4093. aus den 8070, 8072 und 8073 besteht), der jedoch ein einheitlicher
  4094. CPU-Kern gemeinsam ist.
  4095. %%-----------
  4096. \begin{cpulist}
  4097.   COP87L84
  4098. \end{cpulist}
  4099. Dies ist das momentan einzige unterst"utzte Mitglied der COP8-Familie
  4100. von National Semiconductor.  Mir ist bekannt, da"s die Familie
  4101. wesentlich gr"o"ser ist und auch Vertreter mit unterschiedlich gro"sem
  4102. Befehlssatz existieren, die nach Bedarf hinzukommen werden.  Es ist eben
  4103. ein Anfang, und die Dokumentation von National ist ziemlich umfangreich...
  4104. %%-----------
  4105. \begin{cpulist}
  4106.   COP410 $\rightarrow$ COP420 $\rightarrow$ COP440 $\rightarrow$ COP444
  4107. \end{cpulist}
  4108. Die COP42x-Derivate bieten einige weitere Befehle, des weiteren wurden
  4109. Befehlen in ihrem Wertebereich erweitert.
  4110. %%-----------
  4111. \begin{cpulist}
  4112.   SC14400, SC14401, SC14402, SC14404, SC14405, \\
  4113. \> SC14420, SC14421, SC14422, SC14424
  4114. \end{cpulist}
  4115. Diese Gruppe von DECT-Controller unterscheidet sich in ihrem
  4116. Befehlsumfang, da jeweils unterschiedliche B-Feld Datenformate
  4117. unterst"utzt werden und deren Architektur im Laufe der Zeit optimiert
  4118. wurde.
  4119. %%-----------
  4120. \begin{cpulist}
  4121.   NS16008, NS32008, NS08032, NS16032, NS32016, NS32032, \\
  4122. \> NS32332, NS32CG16, NS32532
  4123. \end{cpulist}
  4124. National hat in den ersten Jahren die CPUs der ersten Generation
  4125. mehrfach umbenannt, hinter NS16008/NS32008/NS08032 bzw.
  4126. NS16032/NS32016 versteckt sich der gleiche Baustein.  NS32332
  4127. und NS32532 unterst"utzen eine Adre"sraum von 4 GByte statt 16 MByte,
  4128. und der NS32CG16 ist eine Embedded-Variante mit Zusatzbefehlen f"ur
  4129. Bitblock-Transfers.
  4130. %%-----------
  4131. \begin{cpulist}
  4132.   ACE1101, ACE1202
  4133. \end{cpulist}
  4134. %%-----------
  4135. \begin{cpulist}
  4136.   F3850, MK3850, \\
  4137. \> MK3870, MK3870/10, MK3870/12, "MK3870/20, MK3870/22, \\
  4138. \> MK3870/30, MK3870/32, MK3870/40, MK3870/42, \\
  4139. \> MK3872, MK3873, MK3873/10, MK3873/12, MK3873/20, MK3873/22, \\
  4140. \> MK3874, MK3875, MK3875/22, MK3875/42, MK3876, MK38P70/02, \\
  4141. \> MK38C70, MK38C70/10, \\
  4142. \> MK38C70/20, MK97400, MK97410, MK97500, MK97501, MK97503
  4143. \end{cpulist}
  4144. Die gro"se Menge an Varianten ergibt sich zum Teil daraus, da"s
  4145. Mostek Anfang der 80er-Jahre diversen Varianten neue Namen gegeben
  4146. hat. Am neuen Benamungsschema kann man am Suffix die Menge internen
  4147. ROMs (0 bis 4 f"ur 0..4 KByte) bzw. die Menge des eingebauten
  4148. Executable RAM (0 oder 2 f"ur 0 oder 64 Byte) ablesen.  3850 und
  4149. MK975xx unterst"utzen einen 64 KByte gro"sen Adre"sraum, beim Rest ist
  4150. er 4 KByte gro"s. P-Varianten haben einen Piggyback-Sockel f"ur ein
  4151. EPROM, C-Varianten sind in CMOS ausgef"uhrt und kennen zwei
  4152. neue Maschinenbefehle (HET und HAL).  Der MK3873 enth"alt als
  4153. ,,Spezialit"at'' eine eingebaute serielle Schnittstelle, der
  4154. MK3875 bietet einen zweiten Betriebsspannungsanschlu"s, um den
  4155. internen RAM-Inhalt im Standby halten zu k"onnen.
  4156. %%-----------
  4157. \begin{cpulist}
  4158.   7800, 7801, 7802 \\
  4159. \> 78C05, 78C06 \\
  4160. \> 7807, 7808, 7809 \\
  4161. \> 7810 $\rightarrow$ 78C10, 78C11, 78C12, 78C14, 78C17, 78C18
  4162. \end{cpulist}
  4163. $\mu$PD7800 bis $\mu$PD7802 repr"asentieren die ''erste Generation'' der
  4164. uCOM87-Familie von NEC.  $\mu$PD78C05 und $\mu$PD78C06 sind davon abgespeckte
  4165. Versionen, die nur eine Untermenge des Befehlssatzes unterst"utzen.  7807
  4166. bis 7809 stellen die uCOM87-Serie dar, die um weitere Befehle und erg"anzt
  4167. wurde.  Alle $\mu$PD781x-Varianten geh"oren zur uCOM87AD-Serie, die dar"uber
  4168. hinaus um einen A/D-Wandler erg"anzt wurde, daf"ur wurden die Befehle zur
  4169. Verarbeitung von Bits wieder entfernt.  \bb{ACHTUNG!} Der Befehlssatz ist
  4170. generell nur teilweise bin"ar aufw"artskompatibel!  Die NMOS-Version
  4171. $\mu$PD7810 besitzt keinen STOP-Modus; der entsprechende Befehl sowie das
  4172. ZCM-Register fehlen demzufolge.  \bb{VORSICHT!} NMOS- und CMOS-Version
  4173. differieren zum Teil in den Reset-Werten einiger Register!
  4174. %%-----------
  4175. \begin{cpulist}
  4176.   uPD550, uPD554, uPD652, \\
  4177. \> uPD547, uPD552, uPD651, \\
  4178. \> uPD546, uPD553, uPD556, uPD557, uPD650
  4179. \end{cpulist}
  4180. Die drei Gruppen vom Controllers geh"oren jeweils zur
  4181. $\mu$COM-45-, $\mu$COM-44- und $\mu$COM-43-Familie. Die
  4182. ersten beiden Familien implementieren eine Untermenge
  4183. des $\mu$COM-43-Befehlssatzes.  Ansonsten unterscheiden
  4184. die Varianten sich in der Menge des integrierten ROM-
  4185. und RAM-Speichers.
  4186. %%-----------
  4187. \begin{cpulist}
  4188.   7566 $\leftrightarrow$ 7508
  4189. \end{cpulist}
  4190. Es existieren in der $\mu$PD75xx-Familie zwei verschiedene
  4191. CPU-Kerne: Der 7566 repr"asentiert den 'instruction set B', der
  4192. deutlich weniger Befehle, einige Register weniger und kleinere
  4193. Adre"sr"aume erlaubt.  Der 7508 repr"asentiert den 'vollen'
  4194. Befehlssatz A.  {\bf VORSICHT!} Beide Maschinen-Befehlss"atze
  4195. sind nicht 100\%-ig bin"arkompatibel!
  4196. %%-----------
  4197. \begin{cpulist}
  4198.   75402, \\
  4199. \> 75004, 75006, 75008, \\
  4200. \> 75268, \\
  4201. \> 75304, 75306, 75308, 75312, 75316, \\
  4202. \> 75328, \\
  4203. \> 75104, 75106, 75108, 75112, 75116, \\
  4204. \> 75206, 75208, 75212, 75216, \\
  4205. \> 75512, 75516
  4206. \end{cpulist}
  4207. Dieses ,,F"ullhorn'' an Prozessoren unterscheidet sich innerhalb einer
  4208. Gruppe nur durch die RAM- und ROM-Gr"o"se; die Gruppen untereinander
  4209. unterscheiden sich einmal durch ihre on-chip-Peripherie und
  4210. zum anderen durch die M"achtigkeit des Befehlssatzes.
  4211. %%-----------
  4212. \begin{cpulist}
  4213.   78070
  4214. \end{cpulist}
  4215. Dies ist das einzige, mir momentan vertraute Mitglied der
  4216. 78K0-Familie von NEC.  Es gelten "ahnliche Aussagen wie zur
  4217. COP8-Familie!
  4218. %%-----------
  4219. \begin{cpulist}
  4220.   78214
  4221. \end{cpulist}
  4222. Dies ist momentan der Repr"asentant der 78K2-Familie von NEC.
  4223. %%-----------
  4224. \begin{cpulist}
  4225.   78310
  4226. \end{cpulist}
  4227. Dies ist momentan der Repr"asentant der 78K3-Familie von NEC.
  4228. %%-----------
  4229. \begin{cpulist}
  4230.   784026
  4231. \end{cpulist}
  4232. Dies ist momentan der Repr"asentant der 78K4-Familie von NEC.
  4233. %%-----------
  4234. \begin{cpulist}
  4235.   7720 $\rightarrow$ 7725
  4236. \end{cpulist}
  4237. Der $\mu$PD7725 bietet im Vergleich zu seinem Vorg"anger gr"o"sere
  4238. Adre"sr"aume und einige zus"atzliche Befehle. {\bf VORSICHT!}  Die
  4239. Prozessoren sind nicht zueinander bin"arkompatibel!
  4240. %%-----------
  4241. \begin{cpulist}
  4242.   77230
  4243. \end{cpulist}
  4244. %%-----------
  4245. \begin{cpulist}
  4246.   70616
  4247. \end{cpulist}
  4248. Dies ist momentan der Repr"asentant der V60-Familie von NEC.
  4249. %%-----------
  4250. \begin{cpulist}
  4251.   SYM53C810, SYM53C860, SYM53C815, SYM53C825, \\
  4252. \> SYM53C875, SYM53C895
  4253. \end{cpulist}
  4254. Die einfacheren Mitglieder dieser Familie von SCSI-Prozessoren besitzen
  4255. einige Befehlsvarianten nicht, au"serdem unterscheiden sie sich in ihrem
  4256. Satz interner Register.
  4257. %%-----------
  4258. \begin{cpulist}
  4259.   MB89190
  4260. \end{cpulist}
  4261. Dieser Prozessortyp repr"asentiert die F$^{2}$MC8L-Serie von Fujitsu...
  4262. %%-----------
  4263. \begin{cpulist}
  4264.   MB9500
  4265. \end{cpulist}
  4266. ...so wie dieser es momentan f"ur die 16-Bit-Varianten von Fujitsu tut!
  4267. %%-----------
  4268. \begin{cpulist}
  4269.   MSM5840, MSM5842, MSM58421, MSM58422, MSM5847
  4270. \end{cpulist}
  4271. Diese Varianten der OLMS-40-Familie unterscheiden sich im
  4272. Befehlssatz sowie im internen Programm- und Datenspeicher.
  4273. %%-----------
  4274. \begin{cpulist}
  4275.   MSM5054, MSM5055, MSM5056, MSM6051, MSM6052
  4276. \end{cpulist}
  4277. Gleiches wie bei der OLMS-40-Familie: Unterschiede im
  4278. Befehlssatz sowie im internen Programm- und Datenspeicher.
  4279. %%-----------
  4280. \begin{cpulist}
  4281.   MN1610[ALT] $\rightarrow$ MN1613[ALT]
  4282. \end{cpulist}
  4283. Zus"atzlich zu den Funktionen seines Vorg"angers bietet der
  4284. MN1613 einen gr"o"seren Adre"sraum, eine Floating-Point-Einheit
  4285. sowie eine ganze Reihe neuer Befehle.
  4286. %%-----------
  4287. \begin{cpulist}
  4288.   RXV1, RX110, RX111, RX113, RX130, RX210,\\
  4289. \> RX21A, RX220, RX610, RX621, RX62N, RX630,\\
  4290. \> RX631 $\longrightarrow$ \\
  4291. \> RXV2, RX140, RX230, RX231, RX64M,\\
  4292. \> RX651 $\longrightarrow$ \\
  4293. \> RXV3, RX660, RX671, RX72M, RX72N
  4294. \end{cpulist}
  4295. Die Controller der RX-Serie k"onnen grob in drei
  4296. Gruppen bzw. Generationen eingeteilt werden, wobei
  4297. von Generation zu Generation (RXv1, RXv2, RXv3)
  4298. jeweils neue Instruktionen hinzu gekommen sind.
  4299. %%-----------
  4300. \begin{cpulist}
  4301.   PMC150, PMS150, PFS154, PMC131, PMS130, PMS131 \\
  4302. \> PMS132, PMS132B, PMS152, PMS154B, PMS154C, PFS173 \\
  4303. \> PMS133, PMS134, DF69, MCS11, PMC232, PMC234, PMC251 \\
  4304. \> PMC271,PMC884, PMS232, PMS234, PMS271
  4305. \end{cpulist}
  4306. Die Padauk-Controller unterscheiden sich allesamt in
  4307. der Gr"o"se des internen (ROM/RAM)-Speichers, der Art
  4308. des internen ROMs (l"oschbar oder OTP), der eingebauten
  4309. Peripherie sowie in Umfang und Kodierung des Befehlssatzes.
  4310. %%-----------
  4311. \begin{cpulist}
  4312.   1802 $\rightarrow$ 1804, 1805, 1806 $\rightarrow$ 1804A, 1805A
  4313. 1806A
  4314. \end{cpulist}
  4315. 1804, 1805 und 1806 haben gegen"uber dem 'Original' 1802 einen leicht
  4316. erweiterten Befehlssatz sowie on-chip-RAM und einen integrierten
  4317. Timer.  Die A-Versionen erweitern den Befehlssatz um \tty{DSAV},
  4318. \tty{DBNZ}, sowie um Befehle f"ur Addition und Subtraktion im
  4319. BCD-Format.
  4320. %%-----------
  4321. \begin{cpulist}
  4322.   XS1
  4323. \end{cpulist}
  4324. Dieser Typ repr"asentiert die XCore-''Familie''.
  4325. %%-----------
  4326. \begin{cpulist}
  4327.   1750
  4328. \end{cpulist}
  4329. MIL STD 1750 ist ein Standard, also gibt es auch nur eine
  4330. (Standard-)Variante...
  4331. %%-----------
  4332. \begin{cpulist}
  4333.   KENBAK
  4334. \end{cpulist}
  4335. Es hat nie einen KENBAK-2 gegeben...
  4336. %%-----------
  4337. \begin{cpulist}
  4338.   CP-1600
  4339. \end{cpulist}
  4340. %%-----------
  4341. \begin{cpulist}
  4342.   HPNANO
  4343. \end{cpulist}
  4344. %%-----------
  4345. \begin{cpulist}
  4346.   6100 $\rightarrow$ 6120
  4347. \end{cpulist}
  4348. Der IM6120 unterst"utzt einen gr"o"seren Adre"sraum (32K
  4349. anstelle 4K) sowie zus"atzliche Maschinenbefehle.
  4350. %%-----------
  4351. \begin{cpulist}
  4352.   SC61860
  4353. \end{cpulist}
  4354. Dies ist der in den meisten Sharp Pocket Computern (PC-12xx...PC-15xx) verbaute
  4355. Prozessor.
  4356. %%-----------
  4357. \begin{cpulist}
  4358.   SC62015
  4359. \end{cpulist}
  4360. Dies ist der im Sharp PC-E500 verbaute Prozessor.
  4361.  
  4362. Ein spezielles, bisher hier nicht aufgelistetes Target ist
  4363. NONE.  Es ist als Default eingestellt, wenn kein Target
  4364. per {\tt -cpu} Argument auf der Kommandozeile vorgegeben
  4365. wurde, und auch bisher keine {\tt CPU}-Anweisung assembliert
  4366. wurde.  Target-unabh"angige Pseudo-Befehle sind in diesem
  4367. Zustand weiter m"oglich, aber es kann kein Code erzeugt
  4368. werden, weder durch Maschinenbefehle noch durch Datenablage.
  4369. Prinzipiell ist es auch m"oglich, dieses Target per {\tt -cpu}
  4370. oder {\tt CPU} auszuw"ahlen, aber der praktische Nutzen davon
  4371. ist nat"urlich beschr"ankt.
  4372.  
  4373. Beim CPU-Befehl mu"s der Prozessortyp als einfaches Literal
  4374. angegeben werden, eine Berechnung \`a la
  4375. \begin{verbatim}
  4376.        CPU     68010+10
  4377. \end{verbatim}
  4378. ist also nicht zul"assig.  G"ultige Aufrufe sind z.B.
  4379. \begin{verbatim}
  4380.        CPU     8051
  4381. \end{verbatim}
  4382. oder
  4383. \begin{verbatim}
  4384.        CPU     6800
  4385. \end{verbatim}
  4386. Egal, welcher Prozessortyp gerade eingestellt ist, in der
  4387. Integervariablen MOMCPU wird der momentane Status als Hexadezimalzahl
  4388. abgelegt.  F"ur den 68010 ist z.B. \tty{MOMCPU=\$68010}, f"ur den 80C48
  4389. \tty{MOMCPU=80C48H}.  Da man Buchstaben au"ser A..F nicht als Hexziffer
  4390. interpretieren kann, mu"s man sich diese bei der Hex-Darstellung
  4391. des Prozessors wegdenken. F"ur den Z80 ist z.B. \tty{MOMCPU=80H}.
  4392. \par
  4393. Dieses Feature kann
  4394. man vorteilhaft einsetzen, um je nach Prozessortyp unterschiedlichen
  4395. Code zu erzeugen.  Der 68000 z.B. kennt noch keinen Befehl f"ur den
  4396. Unterprogrammr"ucksprung mit Stapelkorrektur.  Mit der Variablen
  4397. \tty{MOMCPU} kann man ein Makro definieren, das je nach Prozessortyp den
  4398. richtigen Befehl benutzt oder ihn emuliert:
  4399. \begin{verbatim}
  4400. myrtd   MACRO   disp
  4401.        IF      MOMCPU$<$68010   ; auf 68008 und
  4402.         MOVE.L (sp),disp(sp)    ; 68000 emulieren
  4403.         LEA    disp(sp),sp
  4404.         RTS
  4405.        ELSEIF
  4406.         RTD    #disp            ; ab 68010 direkt
  4407.        ENDIF                    ; benutzen
  4408.        ENDM
  4409.  
  4410.        CPU     68010
  4411.        MYRTD   12               ; ergibt RTD #12
  4412.  
  4413.        CPU     68000
  4414.        MYRTD   12               ; ergibt MOVE.. /
  4415.                                 ; LEA.. / RTS
  4416. \end{verbatim}
  4417. Da nicht alle Prozessornamen nur aus Ziffern und Buchstaben zwischen
  4418. A und F bestehen, wird zus"atzlich der volle Name in der
  4419. String-Variablen \tty{MOMCPUNAME} abgelegt.
  4420. \par
  4421. Implizit schaltet der Assembler mit dem \tty{CPU}-Befehl das aktuelle Segment
  4422. wieder auf Code zur"uck, da dies das einzige Segment ist, das alle
  4423. Prozessoren definieren.
  4424. \par
  4425. Eine wichtige "Anderung: Das Default-Target ist nicht mehr der 68008.  Falls
  4426. kein {\tt -cpu} Kommandozeilen-Argument gegeben wurde, dann ist bis zur
  4427. ersten \tty{CPU}-Anweisung das reservierte Target \tty{NONE} gesetzt.  Vom
  4428. Target unabh"angig verf"ugbare Pseudo-Anweisungen sind in dieser Situation
  4429. weiterhin erlaubt, zum Beispiel um Konstanten oder Makros zu definieren.
  4430. Es ist aber nicht m"oglich, irgendwelchen Code zu definieren, weder "uber
  4431. Maschinenbefehle, noch durch Ablegen von Daten im Speicher.
  4432.  
  4433. F"ur einige Ziele sind Optionen bzw. Varianten definiert, die so grundlegend
  4434. sind, da"s sie direkt zusammen mit dem \tty{CPU}-Befehl gew"ahlt werden m"ussen.
  4435. Solche Optionen h"angt man direkt an das Argument mit Doppelpunkten an, und sie
  4436. haben die Form von Variablenzuweisungen:
  4437. \begin{verbatim}
  4438.  CPU <CPU-Name>:<var1>=<wert1>:<var2>=<wert2>:...
  4439. \end{verbatim}
  4440. Ob das jeweilige Ziel solche Optionen unterst"utzt, und wenn ja welche, wird im
  4441. jeweils zugeh"origen Unterkapitel mit prozessorspezifischen Hinweisen beschrieben.
  4442.  
  4443. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4444.  
  4445. \subsection{SUPMODE, FPU, PMMU, CUSTOM}
  4446. \ttindex{SUPMODE}\ttindex{FPU}\ttindex{PMMU}\ttindex{CUSTOM}
  4447. \label{SectSUPMODE}
  4448.  
  4449. {\em
  4450. \begin{itemize}
  4451. \item{G"ultigkeit SUPMODE: 680x0, NS32xxx, PDP-11, i960, TLCS-900,
  4452.      SH7000, i960, 29K, XA, PowerPC, M*CORE, V60 und TMS9900}
  4453. \item{G"ultigkeit FPU: 680x0, NS32xxx, 80x86}
  4454. \item{G"ultigkeit PMMU: 680x0, NS32xxx}
  4455. \item{G"ultigkeit CUSTOM: NS32xxx}
  4456. \end{itemize}
  4457. }
  4458.  
  4459. Mit diesen Schaltern kann bestimmt werden, auf welche Teile des
  4460. Befehlssatzes verzichtet werden soll, weil die daf"ur n"otigen
  4461. Vorbedingungen im folgenden Codest"uck nicht gegeben sind.  Als
  4462. Parameter f"ur diese Befehle darf entweder \tty{ON} oder \tty{OFF} gegeben werden,
  4463. der momentan gesetzte Zustand kann aus einer Variablen ausgelesen
  4464. werden, die entweder TRUE oder FALSE ist.  Die Befehle bedeuten im einzelnen
  4465. folgendes:
  4466. \begin{itemize}
  4467. \item{\tty{SUPMODE}: erlaubt bzw. sperrt Befehle, f"ur deren Ausf"uhrung
  4468.      der Prozessor im Supervisorstatus sein mu"s.  Die Statusvariable
  4469.      hei"st \tty{INSUPMODE}.}
  4470. \item{\tty{FPU}: erlaubt bzw. sperrt die Befehle des numerischen Koprozessors
  4471.      8087, NS32081/32381 bzw. 68881/68882.  Die Statusvariable hei"st \tty{FPUAVAIL}.
  4472.      F"ur NS32xxx als Ziel darf neben einem einfachen \tty{ON} oder \tty{OFF}
  4473.      auch der FPU-Typ (\tty{NS32081}, \tty{NS32181}, \tty{NS32381} oder \tty{NS32580})
  4474.      angegeben werden, um die erweiterten Register und Befehle freizugeben oder
  4475.      zu verbieten.}
  4476. \item{\tty{PMMU}: erlaubt bzw. sperrt die Befehle der Speicherverwaltungseinheit
  4477.      68851 bzw. der im 68030 eingebauten MMU.  \bb{ACHTUNG!} Die 68030-MMU
  4478.      erlaubt nur eine relativ kleine Untermenge der 68851-Befehle, dies wird
  4479.      "uber den \tty{FULLPMMU}-Befehl gesteuert.  Die Statusvariable hei"st
  4480.      \tty{PMMUAVAIL}. F"ur NS32xxx als Ziel darf neben einem einfachen \tty{ON}
  4481.      oder \tty{OFF} auch der MMU-Typ (\tty{NS32082}, \tty{NS32382} oder \tty{NS32532})
  4482.      angegeben werden, um den jeweiligen MUU-Registersatz freizugeben.}
  4483. \item{\tty{CUSTOM}: erlaubt bzw. sperrt die f"ur benutzerdefinierte Slave-Prozessoren
  4484.      vorgesehenen Befehle.}
  4485. \end{itemize}
  4486. Benutzung von auf diese Weise gesperrten Befehlen erzeugt bei \tty{SUPMODE}
  4487. eine Warnung, bei \tty{PMMU} und \tty{FPU} eine echte Fehlermeldung.
  4488.  
  4489. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4490.  
  4491. \subsection{ACCMODE}
  4492. \ttindex{ACCMODE}
  4493.  
  4494. {\em
  4495. \begin{itemize}
  4496. \item{G"ultigkeit: VAX}
  4497. \end{itemize}
  4498. }
  4499.  
  4500. Die VAX kennt nicht nur einen Supervisor- un User-Mode, sonder vier derartige
  4501. Privilegstufen.  Mit absteigenden Rechten heissen diese Zugriffs-Modi Kernel,
  4502. Executive, Supervisor und User.  Mit dem {\tt ACCMODE}-Befehl teilt man dem
  4503. Assembler mit, in welchen Modus der folgende Code ausgef"uhrt wird.  Je nach
  4504. Modus sind nicht alle Maschinenbefehle erlaubt.  Als Argument sind entweder
  4505. die genannten Namen der vier Modi zul"assig, oder eine Zahl von Null
  4506. (Kernel-Modus) bis Drei (User-Modus).  Im Default wird der User-Modus angenommen,
  4507. und die aktuelle Einstellung (als Zahlenwert) l"asst sich aus dem Symbol gleichen
  4508. Namens lesen.
  4509.  
  4510. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4511.  
  4512. \subsection{CIS, EIS, FIS und FP11}
  4513. \ttindex{CIS}\ttindex{EIS}\ttindex{FIS}\ttindex{FP11}
  4514.  
  4515. {\em
  4516. \begin{itemize}
  4517. \item{G"ultigkeit: PDP-11}
  4518. \end{itemize}
  4519. }
  4520.  
  4521. Mit diesen Anweisungen schaltet man die Verf"ugbarkeit bestimmter
  4522. PDP-11-Befehlssatzerweiterungen ein oder aus.  Voraussetzung f"ur die
  4523. Verf"ugbarkeit einer dieser Anweisungen ist, da"s die fraglichen Befehle
  4524. nicht bereits im Basis-Befehlssatz enthalten sind, und da"s eine
  4525. entsprechende Aufr"ustm"oglichkeit bestanden hat.  Im einzelnen:
  4526. \begin{itemize}
  4527. \item{{\tt CIS}: ,,Commercial Instruction Set'', d.h. Befehle zur
  4528.      Verarbeitung gepackter und nicht gepackter BCD-Zahlen mit
  4529.      variabler L"ange.  Diese waren auf dem LSI-11 sowie der
  4530.      PDP-11/44 als Option verf"ugbar.}
  4531. \item{{\tt EIS}: Die Befehle {\tt MUL, DIV, ASH} und {\tt ASHC},
  4532.      die auf fr"uhen bzw. einfachen PDP-11-Systemen nicht Teil
  4533.      des Basisbefehlssatzes waren.  Auf dem LSI-11 bzw. der
  4534.      PDP-11/35 und PDP-11/40 waren sie per Option nachr"ustbar.}
  4535. \item{{\tt FIS}: Stack-orientierte Befehle, die die Grundrechenarten
  4536.      f"ur Gleitkommazahlen im F-Format (32 Bit) implementieren.
  4537.      Auf dem LSI-11 bzw. der PDP-11/35 und PDP-11/40 waren sie
  4538.      per Option nachr"ustbar.}
  4539. \item{{\tt FP11}: Volle Gleitkomma-Unterst"utzung mit separaten
  4540.      FPU-Registern im F- und D-Format (32/64 Bit).}
  4541. \end{itemize}
  4542.  
  4543. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4544.  
  4545. \subsection{FULLPMMU}
  4546. \ttindex{FULLPMMU}
  4547.  
  4548. {\em G"ultigkeit: 680x0}
  4549.  
  4550. Motorola hat zwar ab dem 68030 die PMMU in den Prozessor integriert,
  4551. diese aber nur mit einer Funktionsuntermenge der externen PMMU 68851
  4552. ausgestattet.  \asname{} sperrt bei aktiviertem PMMU-Befehlssatz (s.o.) deshalb
  4553. alle fehlenden Befehle, wenn als Zielprozessor 68030 oder h"oher
  4554. eingestellt wurde.  Nun kann es aber sein, da"s in einem System mit
  4555. 68030-Prozessor die interne MMU abgeschaltet wurde und der Prozessor
  4556. mit einer externen 68851 betrieben wird.  Mit \tty{FULLPMMU ON} kann man
  4557. \asname{} dann mitteilen, da"s der vollst"andige MMU-Befehlssatz zugelassen
  4558. ist.  Umgekehrt kann man, wenn man portablen Code erzeugen will, alle
  4559. zus"atzlichen Befehle trotz 68020-Zielplattform mit \tty{FULLPMMU OFF}
  4560. abschalten.  Die Umschaltung darf beliebig oft erfolgen, die momentane
  4561. Einstellung kann aus einem gleichnamigen Symbol ausgelesen werden.
  4562. \bb{ACHTUNG!}  Der \tty{CPU}-Befehl besetzt f"ur 680x0-Argumente implizit
  4563. diese Einstellung vor!  \tty{FULLPMMU} mu"s also auf jeden Fall nach dem
  4564. \tty{CPU}-Befehl kommen!
  4565.  
  4566. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4567.  
  4568. \subsection{PADDING}
  4569. \ttindex{PADDING}
  4570.  
  4571. {\em G"ultigkeit: 680x0, 68xx, M*Core, XA, H8, SH7000, TMS9900,\\
  4572.     MSP430(X), ST7/STM8, AVR (nur wenn die Granularit"at des Code-Segments
  4573.     8 Bit ist)}
  4574.  
  4575. Diverse Prozessorfamilien verlangen, da"s Objekte von mehr als einem
  4576. Byte L"ange auf einer geraden Adresse liegen m"ussen.  Neben Datenobjekten
  4577. schlie"st dies auch Instruktionsworte selber ein - auf einem 68000
  4578. l"osen Wortzugriffe auf eine ungerade Adresse zum Beispiel eine
  4579. Exception aus, andere Prozessoren wie die H8-Familie setzen das
  4580. unterste Adre"sbit bei einem Wortzugriff einfach hart auf Null.
  4581.  
  4582. Mit dem \tty{PADDING}-Befehl kann man einen Mechanismus aktivieren,
  4583. mit dem der Assembler versucht, solches 'Misalignment' nach M"oglichkeit
  4584. zu verhindern.  Steht die Situation an, da"s ein Instruktionswort,
  4585. oder auch z.B. mit \tty{DC} angelegte Daten von 16 Bit oder mehr auf
  4586. einer ungeraden Adresse landen w"urden, dann wird automatisch ein F"ullbyte
  4587. davor eingef"ugt.  Im Listing wird dieses F"ullbyte in einer separaten
  4588. Zeile mit dem Hinweis
  4589. \begin{verbatim}
  4590. <padding>
  4591. \end{verbatim}
  4592. ausgewiesen.
  4593.  
  4594. Steht in der Quellzeile ein Label, so verweist dieses Label weiterhin
  4595. auf den von dieser Zeile erzeugten Code, also auf die Adresse unmittelbar
  4596. nach dem F"ullbyte.  Das gleiche gilt auch f"ur ein Label in einer
  4597. separaten Zeile unmittelbar davor, sofern diese Zeile {\em alleine} das
  4598. Label und selber keine Anweisung enth"alt.  Im folgenden Beispiel:
  4599. \begin{verbatim}
  4600.       padding  on
  4601.       org      $1000
  4602.  
  4603.       dc.b     1
  4604. adr1:  nop
  4605.  
  4606.       dc.b     1
  4607. adr2:
  4608.       nop
  4609.  
  4610.       dc.b     1
  4611. adr3:  equ      *
  4612.       nop
  4613. \end{verbatim}
  4614. w"urden die Labels \tty{adr1} und \tty{adr2} die (durch ein F"ullbyte
  4615. auf einen geraden Wert aufgerundete) Adresse der jeweiligen \tty{NOP}-
  4616. Instruktion beinhalten, \tty{adr3} w"urde jedoch auf das F"ullbyte {\em vor}
  4617. der dritten \tty{NOP}-Instruktion zeigen.
  4618.  
  4619. Als Argument zu \tty{PADDING} ist analog zu den vorherigen Befehlen
  4620. \tty{ON} oder \tty{OFF} erlaubt, und die augenblickliche Einstellung
  4621. kann aus dem gleichnamigen Symbol ausgelesen werden. Defaultm"a"sig
  4622. ist \tty{PADDING} nur f"ur die 680x0-Familie eingeschaltet, f"ur alle
  4623. anderen werden erst nach Umschaltung Padding-Bytes eingef"ugt.
  4624.  
  4625. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4626.  
  4627. \subsection{PACKING}
  4628. \ttindex{PACKING}\label{SectPACKING}
  4629.  
  4630. {\em G"ultigkeit: 56000, AVR, TMS3203x/4x, TMS3206x, MN1610, \\
  4631.     CP1600, $\mu$PD7720/7725, $\mu$PD77230}
  4632.  
  4633. {\tt PACKING} ist in gewisser Weise "ahnlich zu {\tt PADDING}, es arbeitet
  4634. nur gewisserma"sen anders herum: w"ahrend {\tt PADDING} die
  4635. abgelegten Daten erg"anzt, um komplette Worte und damit ein Alignment zu
  4636. erhalten, quetscht {\tt PACKING} mehrere Werte in ein einzelnes Wort.
  4637. Dies macht im Code-Segment des AVR Sinn, weil dort mit einem Spezialbefehl
  4638. ({\tt LPM}) auf einzelne Bytes in den 16-Bit-Worten zugegriffen werden
  4639. kann.  Ist diese Option eingeschaltet (Argument {\tt ON}), so werden immer
  4640. zwei Byte-Werte bei {\tt DATA} in ein Wort gepackt, analog zu den
  4641. einzelnen Zeichen von String-Argumenten.  Der Wertebereich der
  4642. Integer-Argumente reduziert sich dann nat"urlich auf -128...+255.  Ist
  4643. diese Option dagegen ausgeschaltet, (Argument {\tt OFF}), so bekommt
  4644. jedes Integer-Argument sein eigenes Wort und darf auch Werte von
  4645. -32768...+65535 annehmen.
  4646.  
  4647. Diese Unterscheidung betrifft nur Integer-Argumente von {\tt DATA},
  4648. Strings werden immer gepackt.  Zu beachten ist weiterhin, da"s dieses
  4649. Packen nur innerhalb der Argumente eines {\tt DATA}-Befehls funktionieren
  4650. kann, wer also mehrere {\tt DATA}-Befehle hintereinander hat, f"angt sich
  4651. bei ungeraden Argumentzahlen trotzdem halbvolle W"orter ein!
  4652.  
  4653. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4654.  
  4655. \subsection{MAXMODE}
  4656. \ttindex{MAXMODE}
  4657.  
  4658. {\em G"ultigkeit: TLCS-900, H8}
  4659.  
  4660. Die Prozessoren der TLCS-900-Reihe k"onnen in 2 Betriebsarten arbeiten,
  4661. dem Minimum-und Maximum-Modus.  Je nach momentaner Betriebsart gelten
  4662. f"ur den Betrieb und den Assembler etwas andere Eckwerte.  Mit diesem Befehl
  4663. und den Parametern \tty{ON} oder \tty{OFF} teilt man \asname{} mit, da"s der
  4664. folgende Code im Maximum- oder Minimum-Modus abl"auft.  Die momentane
  4665. Einstellung kann aus der Variablen \tty{INMAXMODE} ausgelesen werden.
  4666. Voreinstellung ist \tty{OFF}, d.h. Minimum-Modus.
  4667. \par
  4668. Analog dazu teilt man im H8-Modus \asname{} mit diesem Befehl mit, ob
  4669. mit einem 64K- oder 16Mbyte-Adre"sraum gearbeitet wird.  F"ur den
  4670. einfachen 300er ist diese Einstellung immer \tty{OFF} und kann nicht
  4671. ver"andert werden.
  4672.  
  4673. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4674.  
  4675. \subsection{EXTMODE und LWORDMODE}
  4676. \ttindex{EXTMODE}\ttindex{LWORDMODE}
  4677.  
  4678. {\em G"ultigkeit: Z380}
  4679.  
  4680. Der Z380 kann in insgesamt 4 Betriebsarten arbeiten, die sich durch
  4681. die Einstellung von 2 Flags ergeben: Das XM-Flag bestimmt, ob der
  4682. Prozessor mit einem 64 Kbyte oder 4 Gbyte gro"sen Adre"sraum arbeiten
  4683. soll und kann nur gesetzt werden (nach einem Reset steht es
  4684. Z80-kompatibel auf 0).  Demgegen"uber legt das LW-Flag fest, ob
  4685. Wort-Befehle mit einer Wortl"ange von 16 oder 32 Bit arbeiten sollen.
  4686. Die Stellung dieser beiden Flags beeinflu"st Wertebereichseinschr"ankungen
  4687. von Konstanten oder Adressen, weshalb man \asname{} "uber diese beiden Befehle
  4688. deren Stellung mitteilen mu"s.  Als Default nimmt \asname{} an, da"s beide
  4689. Flags auf 0 stehen, die momentane Einstellung (\tty{ON} oder \tty{OFF})
  4690. kann aus den vordefinierten Variablen \tty{INEXTMODE} bzw. \tty{INLWORDMODE}
  4691. ausgelesen werden.
  4692.  
  4693. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4694.  
  4695. \subsection{SRCMODE}
  4696. \ttindex{SRCMODE}
  4697.  
  4698. {\em G"ultigkeit: MCS-251}
  4699.  
  4700. Intel hat den Befehlssatz der 8051er beim 80C251 deutlich erweitert,
  4701. hatte aber leider nur noch einen einzigen freien Opcode f"ur diese
  4702. Befehle frei.  Damit der Prozessor nicht auf alle Ewigkeit durch
  4703. einen Pr"afix behindert bleibt, hat Intel zwei Betriebsarten vorgesehen:
  4704. Den Bin"ar- und den Quellmodus.  Im Bin"armodus ist der Prozessor voll
  4705. 8051-kompatibel, alle erweiterten Befehle ben"otigen den noch freien
  4706. Opcode als Pr"afix.  Im Quellmodus tauschen diese neuen Befehle ihre
  4707. Position in der Code-Tabelle mit den entsprechenden 8051-Instruktionen,
  4708. welche dann wiederum mit einem Pr"afix versehen werden m"ussen.
  4709. Damit \asname{} wei"s, wann er Pr"afixe setzen mu"s und wann nicht, mu"s man
  4710. ihm mit diesem Befehl mitteilen, ob der Prozessor im Quellmodus (\tty{ON})
  4711. oder Bin"armodus (\tty{OFF}) betrieben wird.  Die momentane Einstellung
  4712. kann man aus der Variablen \tty{INSRCMODE} auslesen.  Der Default ist
  4713. \tty{OFF}.
  4714.  
  4715. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4716.  
  4717. \subsection{PLAINBASE}
  4718. \ttindex{PLAINBASE}\label{SectPLAINBASE}
  4719.  
  4720. {\em G"ultigkeit: 6809}
  4721.  
  4722. Historisch erlaubt \asname{}, bei indizierten Adressierungsausdr"ucken ein
  4723. leeres, erstes Argument wegzulassen.  Ein
  4724. \begin{verbatim}
  4725.  lda  x
  4726. \end{verbatim}
  4727. zum Beispiel war also "aquivalent zu
  4728. \begin{verbatim}
  4729.  lda  ,x
  4730. \end{verbatim}
  4731. Obwohl als Feature gedacht, wurde dies jedoch gelegentlich eher als Bug
  4732. angesehen.  Deshalb darf ein leeres Index-Argument nicht mehr weggelassen werden
  4733. bzw. wird mit einer Fehlermeldung "uber eine falsche Anzahl Argumente quittiert.
  4734. Falls die Funktion gew"unscht ist bzw. f"ur existierenden Code gebraucht wird,
  4735. kann sie mit einem
  4736. \begin{verbatim}
  4737.  plainbase on
  4738. \end{verbatim}
  4739. wieder eingeschaltet werden.  Die aktuelle Einstellung kann aus dem gleichnamigen
  4740. Symbol ausgelesen werden.
  4741.  
  4742. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4743.  
  4744. \subsection{BIGENDIAN}
  4745. \ttindex{ENDIAN}\ttindex{BIGENDIAN}\label{SectBIGENDIAN}
  4746.  
  4747. {\em G"ultigkeit: MCS-51/251, PowerPC, SC/MP, 2650, NS32000}
  4748.  
  4749. Bei den Prozessoren der 8051-Serie ist Intel seinen eigenen Prinzipien
  4750. untreu geworden: Der Prozessor verwendet entgegen jeglicher Tradition
  4751. eine Big-Endian-Orientierung von Mehrbytewerten!  W"ahrend dies bei
  4752. den MCS-51-Prozessoren noch nicht gro"sartig auffiel, da der Prozessor
  4753. ohnehin nur 8-bittig auf Speicherzellen zugreifen konnte, man sich die
  4754. Byte-Anordnung bei eigenen Datenstrukturen also aussuchen konnte, ist
  4755. dies beim MCS-251 nicht mehr so, er kann auch ganze (Lang-)Worte aus
  4756. dem Speicher lesen und erwartet dabei das MSB zuerst.  Da dies nicht der
  4757. bisherigen Arbeitsweise von \asname{} bei der Konstantenablage entspricht,
  4758. kann man nun mit diesem Befehl umschalten, ob die Befehle \tty{DB, DW, DD,
  4759. DQ, DT} und \tty{DO} mit Big- oder Little-Endian-Orientierung arbeiten sollen.
  4760. Mit \tty{BIGENDIAN OFF} (Voreinstellung) wird wie bei "alteren \asname{}-Versionen
  4761. zuerst das niederwertigste Byte abgelegt, mit \tty{BIGENDIAN ON} wird die
  4762. MCS-251-kompatible Variante benutzt.  Nat"urlich kann man diese Einstellung
  4763. beliebig oft im Code "andern; die momentane Einstellung kann aus dem
  4764. gleichnamigen Symbol ausgelesen werden.
  4765.  
  4766. F"ur Renesas RX ist die Endianess ebenfalls umschaltbar, aus Kompatibilit"at
  4767. zum Original-Assembler hei"st der Befehl hier jedoch \tty{ENDIAN} und
  4768. akzeptiert ein \tty{LITTLE} oder \tty{BIG} als Argument.
  4769.  
  4770. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4771.  
  4772. \subsection{WRAPMODE}
  4773. \ttindex{WRAPMODE}
  4774.  
  4775. {\em G"ultigkeit: Atmel AVR}
  4776.  
  4777. Ist dieser Schalter auf {\tt ON} gesetzt, so veranla"st man \asname{} dazu,
  4778. anzunehmen, der Programmz"ahler des Prozessors habe nicht die volle, durch
  4779. die Architektur gegebene L"ange von 16 Bits, sondern nur eine L"ange, die
  4780. es gerade eben erlaubt, das interne ROM zu adressieren.  Im Falle des
  4781. AT90S8515 sind dies z.B. 12 Bit, entsprechend 4 KWorten oder 8 KBytes.
  4782. Damit werden relative Spr"unge vom Anfang des ROMs zum Ende und umgekehrt
  4783. m"oglich, die bei strenger Arithmetik einen out-of-branch ergeben w"urden,
  4784. hier jedoch funktionieren, weil die "Ubertragsbits bei der
  4785. Zieladressenberechnung 'unter den Tisch' fallen.  Vergewissern Sie sich
  4786. genau, ob die von Ihnen eingesetzte Prozessorvariante so arbeitet, bevor
  4787. Sie diese Option einschalten!  Im Falle des oben erw"ahnten AT90S8515 ist
  4788. diese Option sogar zwingend n"otig, um "uberhaupt quer durch den ganzen
  4789. Adre"sraum springen zu k"onnen...
  4790.  
  4791. Defaultm"a"sig steht dieser Schalter auf {\tt OFF}, der momentane Stand
  4792. l"a"st sich aus einem gleichnamigen Symbol auslesen.
  4793.  
  4794. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4795.  
  4796. \subsection{PANEL}
  4797. \ttindex{PANEL}
  4798.  
  4799. {\em G"ultigkeit: IM61x0}
  4800.  
  4801. Mit diesem Schalter teilt man dem Assembler mit, ob der folgende Code
  4802. mit gesetztem oder gel"oschtem {\em Control Panel Flip-Flop} ausgef"uhrt
  4803. wird.  Eine Reihe von {\tt IOT}-Instruktionen sind nur bei einer bestimmten
  4804. Stellung des Flip-Flops zul"assig.  Ihre Verwendung im anderen Modus
  4805. wird vom Assembler mit einer Fehlermeldung quittiert.
  4806.  
  4807. Die aktuelle Einstellung kann aus dem Symbol {\tt INPANEL} gelesen werden.
  4808.  
  4809. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4810.  
  4811. \subsection{WARNRELATIVE}
  4812.  
  4813. {\em G"ultigkeit: Zx80}
  4814.  
  4815. Mit diesem Schalter teilt man dem Assembler mit, ob eine Warnung erfolgen soll,
  4816. falls ein relativer anstelle eines absoluten Sprungs m"oglich gewesen w"are.
  4817. Der Default ist OFF bzw. das, was auf der Kommandozeile durch die Argumente
  4818. {\tt -wrelative} bzw. {\tt -wno-relative} vorgegeben wurde.
  4819.  
  4820. Die aktuelle Einstellung kann aus dem gleichnamigen Symbol gelesen werden.
  4821.  
  4822. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4823.  
  4824. \subsection{SEGMENT}
  4825. \ttindex{SEGMENT}
  4826. \label{SEGMENT}
  4827.  
  4828. {\em G"ultigkeit: alle Prozessoren}
  4829.  
  4830. Bestimmte Mikrokontroller und Signalprozessoren kennen mehrere
  4831. Adre"sbereiche, die nicht miteinander mischbar sind und jeweils auch
  4832. verschiedene Befehle zur Ansprache ben"otigen.  Um auch diese verwalten zu
  4833. k"onnen, stellt der Assembler mehrere Programmz"ahler zur Verf"ugung,
  4834. zwischen denen mit dem
  4835. \tty{SEGMENT}-Befehl hin-und hergeschaltet werden kann.  Dies erlaubt es,
  4836. sowohl in mit \tty{INCLUDE} eingebundenen Unterprogrammen als auch im
  4837. Hauptprogramm ben"otigte Daten an der Stelle zu definieren, an denen
  4838. sie benutzt werden.  Im einzelnen werden folgende Segmente mit folgenden
  4839. Namen verwaltet:
  4840. \begin{itemize}
  4841. \item{\tty{CODE}: Programcode;}
  4842. \item{\tty{DATA}: direkt adressierbare Daten (dazu rechnen auch SFRs);}
  4843. \item{\tty{XDATA}: im extern angeschlossenen RAM liegende Daten oder
  4844.             X-Adre"sraum beim DSP56xxx oder ROM-Daten beim $\mu$PD772x;}
  4845. \item{\tty{YDATA}: Y-Adre"sraum beim DSP56xxx;}
  4846. \item{\tty{IDATA}: indirekt adressierbare (interne) Daten;}
  4847. \item{\tty{BITDATA}: der Teil des 8051-internen RAMs, der bitweise
  4848.      adressierbar ist;}
  4849. \item{\tty{IO}: I/O-Adre"sbereich;}
  4850. \item{\tty{REG}: Registerbank des ST9;}
  4851. \item{\tty{ROMDATA}: Konstanten-ROM der NEC-Signalprozessoren;}
  4852. \item{\tty{EEDATA}: eingebautes EEPROM.}
  4853. \end{itemize}
  4854. Zu Adre"sbereich und Initialwerten der Segmente siehe Abschnitt \ref{SectORG}.
  4855. (\tty{ORG}).  Je nach Prozessorfamilie sind auch nicht alle Segmenttypen
  4856. erlaubt.
  4857. \par
  4858. Das Bitsegment wird so verwaltet, als ob es ein Bytesegment w"are,
  4859. d.h. die Adressen inkrementieren um 1 pro Bit.
  4860. \par
  4861. Labels, die in einem Segment eines bestimmten Typs definiert werden,
  4862. erhalten diesen Typ als Attribut.  Damit hat der Assembler eine
  4863. begrenzte Pr"ufm"oglichkeit, ob mit den falschen Befehlen auf Symbole
  4864. in einem Segment zugegriffen wird.  In solchen F"allen wird der
  4865. Assembler eine Warnung ausgeben.
  4866. \par
  4867. Beispiel:
  4868. \begin{verbatim}
  4869.        CPU     8051    ; MCS-51-Code
  4870.  
  4871.        SEGMENT code    ; Testcodeblock
  4872.  
  4873.        SETB    flag    ; keine Warnung
  4874.        SETB    var     ; Warnung : falsches Segment
  4875.  
  4876.        SEGMENT data
  4877.  
  4878. var     DB      ?
  4879.  
  4880.        SEGMENT bitdata
  4881.  
  4882. flag    DB      ?
  4883. \end{verbatim}
  4884.  
  4885. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4886.  
  4887. \subsection{PHASE und DEPHASE}
  4888. \ttindex{PHASE}\ttindex{DEPHASE}
  4889.  
  4890. {\em G"ultigkeit: alle Prozessoren}
  4891.  
  4892. In manchen Anwendungen (speziell Z80-Systeme) mu"s Code vor der
  4893. Benutzung in einen anderen Adre"sbereich verschoben werden.  Da der
  4894. Assembler davon aber nichts wei"s, w"urde er alle Labels in dem zu
  4895. verschiebenden Teil auf die Ladeadressen ausrichten.  Der Programmierer
  4896. m"u"ste Spr"unge innerhalb dieses Bereiches entweder lageunabh"angig
  4897. kodieren oder die Verschiebung bei jedem Symbol ,,zu Fu"s'' addieren.
  4898. Ersteres ist bei manchen Prozessoren gar nicht m"oglich, letzteres sehr
  4899. fehleranf"allig.
  4900. \par
  4901. Mit dem Befehlen \tty{PHASE} und \tty{DEPHASE} ist es m"oglich, dem
  4902. Assembler mitzuteilen, auf welcher Adresse der Code im Zielsystem
  4903. effektiv ablaufen wird:
  4904. \begin{verbatim}
  4905.        PHASE   <Adresse>
  4906. \end{verbatim}
  4907. informiert den Assembler davon, da"s der folgende Code auf der
  4908. spezifizierten Adresse ablaufen soll.  Der Assembler berechnet
  4909. daraufhin die Differenz zum echten Programmz"ahler und addiert diese
  4910. Differenz bei folgenden Operationen dazu:
  4911. \begin{itemize}
  4912. \item{Adre"sangabe im Listing}
  4913. \item{Ablage von Labelwerten}
  4914. \item{Programmz"ahlerreferenzen in relativen Spr"ungen und
  4915.      Adre"sausdr"ucken}
  4916. \item{Abfrage des Programmz"ahlers mit den Symbolen \verb!*! bzw. \verb!$!}
  4917. \end{itemize}
  4918. Diese ,,Verschiebung'' wird mit dem Befehl
  4919. \begin{verbatim}
  4920.        DEPHASE
  4921. \end{verbatim}
  4922. wieder auf den vor der zugeh"origen \tty{PHASE}-Anweisung zur"uck ge"andert.
  4923. \tty{PHASE} und \tty{DEPHASE} k"onnen also auf diese Weise geschachtelt
  4924. verwendet werden.
  4925. \par
  4926. Obwohl dieses Befehlspaar vornehmlich in Codesegmenten Sinn macht,
  4927. verwaltet der Assembler f"ur alle definierten Segmente Phasenwerte.
  4928.  
  4929. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4930.  
  4931. \subsection{SAVE und RESTORE}
  4932. \ttindex{SAVE}\ttindex{RESTORE}
  4933. \ttindex{.SAVE}\ttindex{.RESTORE}
  4934. \ttindex{SAVEENV}\ttindex{RESTOREENV}
  4935.  
  4936. {\em G"ultigkeit: alle Prozessoren}
  4937.  
  4938. Mit dem Befehl \tty{SAVE} legt der Assembler den Inhalt folgender
  4939. Variablen auf einen internen Stapel:
  4940. \begin{itemize}
  4941. \item{momentan gew"ahlter Prozessortyp (mit \tty{CPU} gesetzt);}
  4942. \item{momentan aktiver Speicherbereich (mit \tty{SEGMENT} gesetzt);}
  4943. \item{Flag, ob Listing ein- oder ausgeschaltet ist (mit \tty{LISTING}
  4944.      gesetzt);}
  4945. \item{Flags, zu welchem Teil Expansionen folgender Makos im Listing
  4946.      ausgegeben werden sollen (mit \tty{MACEXP\_DFT/MACEXP\_OVR}
  4947.      gesetzt).}
  4948. \item{momentan aktive Zeichen"ubersetzungstabelle (mit \tty{CODEPAGE}
  4949.      gesetzt).}
  4950. \end{itemize}
  4951. Mit dem Gegenst"uck \tty{RESTORE} wird entsprechend der zuletzt
  4952. gesicherte Zustand von diesem Stapel wieder heruntergeladen.  Diese beiden
  4953. Befehle sind in erster Linie f"ur Include-Dateien definiert worden, um
  4954. in diesen Dateien die obigen Variablen beliebig ver"andern zu k"onnen,
  4955. ohne ihren originalen Inhalt zu verlieren.  So kann es z.B. sinnvoll sein,
  4956. in Include-Dateien mit eigenen, ausgetesteten Unterprogrammen die
  4957. Listingerzeugung auszuschalten:
  4958. \begin{verbatim}
  4959.        SAVE            ; alten Zustand retten
  4960.        LISTING OFF     ; Papier sparen
  4961.        ..              ; der eigentliche Code
  4962.        RESTORE         ; wiederherstellen
  4963. \end{verbatim}
  4964. Gegen"uber einem einfachen \tty{LISTING OFF..ON}-P"archen wird hier
  4965. auch dann der korrekte Zustand wieder hergestellt, wenn die Listingerzeugung
  4966. bereits vorher ausgeschaltet war.
  4967. \par
  4968. Der Assembler "uberpr"uft, ob die Zahl von \tty{SAVE}-und \tty{RESTORE}-Befehlen
  4969. "ubereinstimmt und liefert in folgenden F"allen Fehlermeldungen:
  4970. \begin{itemize}
  4971. \item{\tty{RESTORE} und der interne Stapel ist leer;}
  4972. \item{nach Ende eines Passes ist der Stapel nicht leer.}
  4973. \end{itemize}
  4974. Falls das aktuell benutzte Target bereits einen Maschinenbefehl namens \tty{SAVE}
  4975. bzw. \tty{RESTORE} hat, kann die Funktionalit"at "uber \tty{SAVEENV} bzw.
  4976. \tty{RESTOREENV} erreicht werden.  Wahlweise ist es auch immer m"oglich, explizit
  4977. die Pseudobefehle durch voran gestellte Punkte (\tty{.SAVE} bzw. \tty{.RESTORE})
  4978. aufzurufen.
  4979.  
  4980. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4981.  
  4982. \subsection{ASSUME}
  4983. \ttindex{ASSUME}
  4984.  
  4985. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  4986.  
  4987. {\em G"ultigkeit: diverse}
  4988.  
  4989. Mit diesem Befehl kann man \asname{} den aktuellen Stand bestimmter Register
  4990. mitteilen, deren Inhalt sich nicht mit einem einfachen \tty{ON} oder
  4991. \tty{OFF} beschreiben l"a"st.  Typischerweise sind dies Register, die die
  4992. Adressierungseinheiten beeinflussen und deren Werte \asname{} wissen mu"s, um
  4993. korrekte Adressierungen zu erzeugen.  Wichtig ist, da"s man \asname{} mit ASSUME
  4994. diese Werte nur mitteilt, es wird {\em kein} Maschinencode erzeugt, der
  4995. diese Werte in die entsprechenden Register l"adt!
  4996.  
  4997. Ein mit \tty{ASSUME} definierter Wert l"a"st sich mit der
  4998. eingebauten Funktion \tty{ASSUMEDVAL} wieder abfragen oder in
  4999. Ausdr"ucke einbauen.  Dies gilt f"ur alle im folgenden gelisteten
  5000. Architekturen mit Ausnahme des 8086.
  5001.  
  5002. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5003.  
  5004. \subsubsection{65CE02}
  5005.  
  5006. Der 65CE02 besitzt ein Register 'B', mit dem die 'Base-Page' festgelegt wird.
  5007. Im Gegensatz zum 'einfachen' 6502 l"a"st sich damit die Speicherseite, die
  5008. mit kurzen (8-bittigen) Adressen ansprechbar ist, frei im 64K-Adre'sraum hin-
  5009. und herschieben.  Nach einem Reset steht dieses Register auf Null, der 65CE02
  5010. verh"alt sich also wie sein Vorbild.  Dies ist auch die Default-Annahme des
  5011. Assemblers.  Mittels eines \tty{ASSUME B:xx} kann man ihm den aktuellen Wert
  5012. mitteilen, und f"ur Adressen in dieser Seite werden dann automatisch kurze
  5013. Adressierungsarten benutzt.
  5014.  
  5015. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5016.  
  5017. \subsubsection{6809}
  5018.  
  5019. Im Gegensatz zu seinen ,,Vorg"angern'' wie 6800 und 6502 kann beim
  5020. 6809 die Lage der direct page, d.h. des Adressbereiches, der mit ein
  5021. Byte langen Adressen erreichbar ist, frei bestimmt werden.  Dazu dient
  5022. das sog. ,,Direct Page Register'' (\tty{DPR}), das die Seitennummer
  5023. festlegt.  Ihm mu"s man mittels \tty{ASSUME} einen passenden Wert
  5024. zuweisen, wenn man einen anderen Wert als die Vorgabe von 0 in DPR
  5025. schreibt, sonst werden Adressen falscher L"ange erzeugt...
  5026.  
  5027.  
  5028. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5029.  
  5030. \subsubsection{68HC11K4}
  5031.  
  5032. Auch beim HC11 kamen die Entwickler letzen Endes nicht um eine Form von
  5033. Banking herum, um mit 16 Adre"sleitungen mehr als 64 Kbyte anzusprechen.  Die
  5034. Register {\tt MMSIZ}, {\tt MMWBR}, {\tt MM1CR} und {\tt MM2CR} legen fest,
  5035. ob und wie die beiden zus"atzlichen 512K-Bereiche in den Adre"sraum der CPU
  5036. eingeblendet werden sollen.  Initial nimmt \asname{} den Reset-Zustand
  5037. dieser Register an, d.h. alle mit \$00 belegt und das Windowing ist
  5038. abgeschaltet.
  5039.  
  5040. Weiterhin kann man die Werte der Register {\tt CONFIG}, {\tt INIT} und {\tt INIT2}
  5041. festlegen.  Aus diesen kann der Assembler die Lage der CPU-internen Register sowie
  5042. des CPU-internen RAM/EEPROM bestimmen.  Deren Mapping hat eine h"ohere Priorit"at
  5043. als die per Windowing eingeblendeten Speicherbereiche.
  5044.  
  5045. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5046.  
  5047. \subsubsection{68HC12X}
  5048.  
  5049. Wie die Variante ohne anh"angendes 'X' kennt auch der HC12X eine kurze
  5050. direkte Adressierungsart, die hier jedoch auch andere Adre"sbereiche als
  5051. die ersten 256 Byte erreichen kann.  "Uber das {\tt DIRECT}-Register kann
  5052. die 256-Byte-Seite vorgegeben werden, die mit dieser kurzen
  5053. Adressierungsart angesprochen wird.  Mittels {\tt ASSUME} wird \asname{} der
  5054. momentane Stand dieses Registers mitgeteilt, so da"s bei absoluten
  5055. Adressen automatisch die effizienteste Adressierungsart gew"ahlt werden
  5056. kann.  Default ist 0, was auch dem Reset-Zustand entspricht.
  5057.  
  5058. \subsubsection{68HC16}
  5059.  
  5060. Um mit seinen nur 16 Bit breiten Adre"soperanden einen 1 Mbyte gro"sen
  5061. Adre"sraum ansprechen zu k"onnen, bedient sich der 68HC16 einer Reihe
  5062. von Bank-Registern, die die fehlenden oberen vier Adre"sbits nachliefern.
  5063. Davon ist das \tty{EK}-Register f"ur absolute Datenzugriffe (nicht
  5064. Spr"unge!) zust"andig.  \asname{} "uberpr"uft bei jeder absoluten Adressierung,
  5065. ob die oberen vier Bits der Adresse mit dem "uber \tty{ASSUME}
  5066. spezifizierten Wert "ubereinstimmen.  Differieren die Werte, gibt \asname{} eine
  5067. Warnung aus.  Der Vorgabewert f"ur \tty{EK} ist 0.
  5068.  
  5069. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5070.  
  5071. \subsubsection{H8/500}
  5072.  
  5073. Im Maximum-Modus wird der erweiterte Adre"sraum dieser Prozessorreihe
  5074. durch eine Reihe von Bank-Registern adressiert.  Diese tragen die
  5075. Namen DP (Register 0..3, absolute Adressen), EP (Register 4/5) und
  5076. TP (Stack).  Den momentanen Wert von DP ben"otigt \asname{}, um zu "uberpr"ufen,
  5077. ob absolute Adressen in der momentan adressierbaren Bank liegen;
  5078. die beiden anderen Register werden nur f"ur indirekte Adressierungen
  5079. benutzt und entziehen sich daher der Kontrolle; ob man ihre Werte
  5080. angibt oder nicht, ist daher Geschmackssache.  Wichtig ist dagegen
  5081. wieder das BR-Register, das angibt, auf welchen 256-Byte-Bereich
  5082. mit kurzen Adressen zugegriffen werden kann.  Allen Registern ist
  5083. gemeinsam, da"s \asname{} {\em keine} Initialwerte f"ur sie annimmt, da sie nach
  5084. einem Prozessor-Reset undefiniert sind; wer absolut adressieren
  5085. will, mu"s daher auf jeden Fall DR und DP belegen!
  5086.  
  5087. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5088.  
  5089. \subsubsection{MELPS740}
  5090.  
  5091. Die Mikrokontroller dieser Reihe kennen f"ur den \tty{JSR}-Befehl eine
  5092. besondere Adressierungsart ,,special page'', mit deren Hilfe man Spr"unge
  5093. in die oberste Seite des internen ROMs k"urzer kodieren kann.  Diese
  5094. ist nat"urlich vom jeweiligen Chip abh"angig, und es gibt mehr Chips,
  5095. als es mit dem \tty{CPU}-Befehl sinnvoll w"are, zu kodieren...also mu"s
  5096. \tty{ASSUME} herhalten, um die Lage dieser Seite vorzugeben, z.B.
  5097. \begin{verbatim}
  5098.        ASSUME SP:$1f ,
  5099. \end{verbatim}
  5100. falls das interne ROM 8K gro"s ist.
  5101.  
  5102. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5103.  
  5104. \subsubsection{MELPS7700/65816}
  5105.  
  5106. Diese Prozessoren beinhalten eine Reihe von Registern, deren Inhalt \asname{}
  5107. kennen mu"s, um den korrekten Code zu erzeugen.  Es handelt sich um folgende
  5108. Register:
  5109. \begin{center}\begin{tabular}{|l|l|l|l|}
  5110. \hline
  5111. Name  & Bedeutung           & Wertebereich & Default\\
  5112. \hline
  5113. \hline
  5114. DT/DBR & Datenbank           & 0-\$ff       & 0 \\
  5115. PG/PBR & Code-Bank           & 0-\$ff       & 0 \\
  5116. DPR   & direkt adr. Seite   & 0-\$ffff     & 0 \\
  5117. X     & Indexregisterbreite & 0 oder 1     & 0 \\
  5118. M     & Akkumulatorbreite   & 0 oder 1     & 0 \\
  5119. \hline
  5120. \end{tabular}\end{center}
  5121. \par
  5122. Um mich nicht in endlose Wiederholungen zu ergehen, verweise ich f"ur die
  5123. Benutzung dieser Werte auf Kapitel \ref{MELPS7700Spec}.  Die Handhabung
  5124. erfolgt ansonsten genauso wie beim 8086, d.h. es k"onnen auch hier mehrere
  5125. Werte auf einmal gesetzt werden und es wird \bb{kein} Code erzeugt, der
  5126. die Register mit den Werten besetzt.  Dies bleibt wieder einzig und allein
  5127. dem Programmierer "uberlassen!
  5128.  
  5129. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5130.  
  5131. \subsubsection{MCS-196/296}
  5132.  
  5133. Alle Prozessoren der MCS-96-Familie besitzen ab dem 80196 ein Register \tty{WSR},
  5134. mit dessen Hilfe Speicherbereiche aus dem erweiterten internen RAM
  5135. oder dem SFR-Bereich in Bereiche des Registerfiles eingeblendet werden
  5136. und so mit kurzen Adressen angesprochen werden k"onnen.  Teilt man \asname{}
  5137. mit Hilfe des \tty{ASSUME}-Befehls mit, welchen Wert das WSR-Register
  5138. hat, so stellt er bei absoluten Adressen automatisch fest, ob  sie
  5139. durch das Windowing mit 1-Byte-Adressen erreicht werden k"onnen;
  5140. umgekehrt werden auch f"ur durch das Windowing "uberdeckte Register
  5141. automatisch lange Adressen erzeugt.  Der 80296 besitzt ein zus"atzliches,
  5142. zweites Register \tty{WSR1}, um zwei unterschiedliche Speicherbereiche
  5143. gleichzeitig in das Registerfile einblenden zu k"onnen.  Sollte
  5144. es m"oglich sein, eine Speicherzelle "uber beide Bereiche zu adressieren,
  5145. so w"ahlt \asname{} immer den Weg "uber \tty{WSR}!
  5146.  
  5147. Bei indirekter Adressierung k"onnen Displacements wahlweise kurz (8 Bit,
  5148. -128 bis +127) oder lang (16 Bit) sein.  Der Assembler w"ahlt automatisch
  5149. anhand des Displacements die k"urzestm"ogliche Kodierung.  Es ist aber m"oglich,
  5150. durch ein vorangestelltes Gr"o"ser-Zeichen (\verb!>!) eine 16-Bit-Kodierung
  5151. des Displacements zu erzwingen.  Gleiches gilt f"ur absolute Adressen im
  5152. Bereich 0ff80h...0ffffh, die mit einem kurzen Offset relativ zum "Nullregister"
  5153. adressiert werden k"onnen.
  5154.  
  5155. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5156.  
  5157. \subsubsection{8086}
  5158.  
  5159. Der 8086 kann Daten aus allen Segmenten in einem Befehl adressieren,
  5160. ben"otigt jedoch sog. ,,Segment-Pr"afixe'', wenn ein anderes Segmentregister
  5161. als DS verwendet werden soll.  Zus"atzlich kann es sein, da"s das
  5162. DS-Register auf ein anderes Segment verstellt ist, um z.B. "uber l"angere
  5163. Strecken nur Daten im Codesegment zu adressieren.  Da \asname{} aber keine
  5164. Sinnanalyse des Codes vornimmt, mu"s ihm "uber diesen Befehl mitgeteilt
  5165. werden, auf welche Segmente die Segmentregister momentan zeigen, z.B.
  5166. \begin{verbatim}
  5167.   ASSUME  CS:CODE, DS:DATA    .
  5168. \end{verbatim}
  5169. Allen vier Segmenten des 8086 (SS,DS,CS,ES) k"onnen auf diese Weise Annahmen
  5170. zugewiesen werden.  Dieser Befehl erzeugt jedoch \bb{keinen} Code, um
  5171. die Werte auch wirklich in die Segmentregister zu laden, dies mu"s vom
  5172. Programm getan werden.
  5173. \par
  5174. Die Benutzung diese Befehls hat zum einen die Folge, da"s \asname{} bei
  5175. sporadischen Zugriffen ins Codesegment automatisch Pr"afixe voranstellen
  5176. kann, andererseits da"s man \asname{} mitteilen kann, da"s das DS-Register verstellt
  5177. wurde und man sich im folgenden explizite \tty{CS:}-Anweisungen sparen
  5178. kann.
  5179. \par
  5180. G"ultige Argumente hinter dem Doppelpunkt sind \tty{CODE, DATA} und
  5181. \tty{NOTHING}.  Letzterer Wert dient dazu, \asname{} mitzuteilen, da"s das
  5182. Segmentregister keinen f"ur \asname{} verwendbaren Wert enth"alt.
  5183. Vorinitialisiert sind folgende \tty{ASSUME}s :
  5184. \begin{verbatim}
  5185.  CS:CODE, DS:DATA, ES:NOTHING, SS:NOTHING
  5186. \end{verbatim}
  5187.  
  5188. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5189.  
  5190. \subsubsection{Z180}
  5191.  
  5192. Der Z180 besitzt eine eingebaute MMU, die den ,,logischen Adre"sraum'' des
  5193. CPU-Kerns von 64 KByte auf einen physischen Adre"sraum von 512 KByte "ubersetzt.
  5194. Das genaue Mapping wird durch die drei Register {\tt CBAR}, {\tt CBR} und {\tt BBR}
  5195. gesteuert.  Im Gegensatz zum 68HC11K4 nimmt der Assembler aktuell keine
  5196. automatischen Umrechnungen von physischen auf logische Adressen vor, sondern
  5197. h"alt lediglich intern Umrechnungstabellen vor.  Es ist aber m"oglich, diese
  5198. unter Benutzung der {\tt phys2cpu()}-Funktion zu benutzen.
  5199.  
  5200. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5201.  
  5202. \subsubsection{eZ80}
  5203.  
  5204. Der eZ80 kann in zwei Modi operieren:
  5205. \begin{itemize}
  5206. \item{Im Z80 Modus sind die Register BC, DE, HL, IX, IY und SP 16 bit breit,
  5207.      und nur die 64K-Speicherseite, die durch das MBASE-Register definiert
  5208.      ist, kann adressiert werden.  Bei Befehlen, die eine absolute Adresse oder
  5209.      einen nicht-8-Bit Wert als Argument beinhalten, werden zwei Bytes
  5210.      geladen.}
  5211. \item{Im ADL Modus sind die Register BC, DE, HL, IX, IY und SP 24 Bit breit,
  5212.      und der komplette 16 MByte Adressraum kann angesprochen werden.  Bei Befehlen,
  5213.      die eine absolute Adresse oder einen nicht-8-Bit Wert als Argument beinhalten,
  5214.      werden drei Bytes geladen.}
  5215. \end{itemize}
  5216. Da die Bin"arkodierung und Adre"sbereichspr"ufung von diesem Modus abh"angt,
  5217. mu"s der Assembler wissen, welcher Modus gerade verwendet wird.  Indem man
  5218. {\tt ADL} mittels {\tt ASSUME} entweder auf 0 oder 1 setzt, teilt man dem
  5219. Assembler den Default-Modus mit, d.h. den Modus ohne Verwendung expliziter
  5220. Suffixe an einem Befehl.  Des weiteren kann dem Assembler der aktuelle
  5221. Wert von MBASE (0 bis 0ff hex) mitgeteilt werden.  Die Default-Annahme
  5222. f"ur beide Werte ist 0, "ahnlich den Werten nach einem Hardware-Reset.
  5223.  
  5224. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5225.  
  5226. \subsubsection{XA}
  5227.  
  5228. Die XA-Familie besitzt einen Datenadre"sraum von 16 Mbyte, ein Proze"s
  5229. kann jedoch nur immer innerhalb einer 64K-Seite adressieren, die
  5230. durch das DS-Register vorgegeben wird.  \asname{} mu"s man den momentanen
  5231. Wert dieses Registers vorgeben, damit er Zugriffe auf absolute
  5232. Adressen "uberpr"ufen kann.
  5233.  
  5234. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5235.  
  5236. \subsubsection{29K}
  5237.  
  5238. Die Prozessoren der 29K-Familie besitzen ein Register \tty{RBP}, mit dessen
  5239. Hilfe B"anke von 16 Registern vor der Benutzung im User-Modus gesch"utzt
  5240. werden k"onnen.  Dazu kann man ein entsprechendes Bit in diesem Register
  5241. setzen.  Mit \tty{ASSUME} kann man \asname{} nun mitteilen, welchen Wert RBP
  5242. gerade hat.  Auf diese Weise kann \asname{} warnen, falls versucht wird, im
  5243. User-Modus auf gesch"utzte Register zuzugreifen.
  5244.  
  5245. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5246.  
  5247. \subsubsection{80C166/167}
  5248.  
  5249. Obwohl keines der Register im 80C166/167 breiter als 16 Bit ist, besitzt
  5250. dieser Prozessor 18/24 Adre"sleitungen, kann also bis zu 256 Kbyte/16 Mbyte
  5251. adressieren.  Um diesen Widerspruch unter einen Hut zu bekommen, verwendet
  5252. er nicht die von Intel her bekannte (...und ber"uchtigte) Segmentierung oder
  5253. hat unflexible Bankregister...nein, er macht Paging!  Dazu wird der ,,logische''
  5254. Adre"sraum von 64 Kbyte in 4 Seiten zu 16 Kbyte eingeteilt, und f"ur jede
  5255. Seite existiert ein Seitenregister (bezeichnet als \tty{DPP0...DPP3}), das
  5256. bestimmt, welche der physikalischen 16/1024 Seiten dort eingeblendet wird.  \asname{} versucht
  5257. nun, den Adre"sraum grunds"atzlich mit 256 Kbyte/16 Mbyte aus der Sicht des
  5258. Programmierers zu verwalten, d.h. bei absoluten Zugriffen ermittelt \asname{} die
  5259. physikalische Seite und schaut in der mit \tty{ASSUME} eingestellten
  5260. Seitenverteilung nach, wie die Bits 14 und 15 der logischen Adresse gesetzt
  5261. werden m"ussen.  Pa"st kein Seitenregister, so wird eine Warnung ausgegeben.
  5262. Defaultm"a"sig nimmt \asname{} an, da"s die vier Register linear die ersten 64 Kbyte
  5263. abbilden, etwa in der folgenden Form:
  5264. \begin{verbatim}
  5265.        ASSUME  DPP0:0,DPP1:1,DPP2:2,DPP3:3
  5266. \end{verbatim}
  5267. Der 80C167 kennt noch einige Befehle, die die Seitenregister in ihrer
  5268. Funktion "ubersteuern k"onnen.  Wie diese Befehle die Adre"sgenerierung
  5269. beeinflussen, ist im Kapitel mit den prozessorspezifischen Hinweisen
  5270. beschrieben.
  5271. \par
  5272. Einige Maschineninstruktionen kennen ein verk"urzte Kodierung, wenn das
  5273. Argument in einem bestimmten Wertebereich liegt:
  5274. \begin{itemize}
  5275. \item{\verb!MOV Rn,#<0..15>!}
  5276. \item{\verb!ADD/ADDC/SUB/SUBC/CMP/XOR/AND/OR Rn, #<0..7>!}
  5277. \item{\verb!LOOP Rn,#<0..15>!}
  5278. \end{itemize}
  5279. Der Assembler verwendet im Default automatisch die k"urzere Kodierung
  5280. wenn m"oglich.  Falls man die l"angere erzwingen m"ochte, schreibt
  5281. man analog zum 65xx/68xx ein Gr"o"serzeichen vor den Operanden (hinter
  5282. das Doppelkreuz!).  Umgekehrt kann man auch ein Kleinerzeichen schreiben,
  5283. wenn man die kurze Kodierung erzwingen will.  Falls der Operand nicht
  5284. im erlaubten Wertebereich liegt, gibt es eine Fehlermeldung.  Singem"a"s
  5285. das gleiche gilt f"ur Spr"unge, die mit kurzem Displacement oder langem,
  5286. absolutem Argument kodiert werden k"onnen.
  5287.  
  5288. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5289.  
  5290. \subsubsection{TLCS-47}
  5291.  
  5292. Der von der Architektur her vorgegebene Datenadre"sraum dieser
  5293. Prozessoren (egal ob man direkt oder "uber das HL-Register adressiert)
  5294. betr"agt lediglich 256 Nibbles.  Da die ,,besseren'' Familienmitglieder
  5295. aber bis zu 1024 Nibbles RAM on chip haben, war Toshiba gezwungen, einen
  5296. Bankingmechanismus "uber das DMB-Register einzuf"uhren.  \asname{} verwaltet
  5297. das Datensegment als einen durchgehenden Adre"sraum und pr"uft bei jeder
  5298. direkten Adressierung, ob die Adresse in der momentan aktiven Bank
  5299. liegt.  Die von \asname{} momentan angenommene Bank kann mittels
  5300. \begin{verbatim}
  5301.        ASSUME  DMB:<0..3>
  5302. \end{verbatim}
  5303. festgelegt werden.  Der Default ist 0.
  5304.  
  5305. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5306.  
  5307. \subsubsection{IPC-16/INS8900}
  5308. \label{PACEAssume}
  5309.  
  5310. Der Prozessor verf"ugt "uber einen Eingangs-Pin namens {\tt BPS}, mit dem man
  5311. w"ahlen kann, welcher Adre"sbereich direkt adressierbar sein soll: entweder
  5312. die untersten 256 Worte des Speichers, oder die jeweils obersten und untersten
  5313. 128 Worte.  Der Default is ersteres, mit einem {\tt ASSUME BPS:1} schaltet man
  5314. auf die zweite Variante um.
  5315.  
  5316. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5317.  
  5318. \subsubsection{ST6}
  5319. \label{ST6Assume}
  5320.  
  5321. Die Mikrokontroller der ST6-Reihe sind in der Lage, einen Teil (64 Byte)
  5322. des Codebereiches in den Datenbereich einzublenden, z.B. um Konstanten aus
  5323. dem ROM zu laden.  Dies bedeutet aber auch, da"s zu einem Zeitpunkt immer
  5324. nur ein Teil des ROMs adressiert werden kann.  Welcher Teil dies ist, wird
  5325. durch ein bestimmtes Register bestimmt.  Dem Inhalt dieses Registers kann
  5326. \asname{} zwar nicht direkt kontrollieren, man kann ihm aber mit diesem Befehl
  5327. mitteilen, wenn man dem Register einen neuen Wert zugewiesen hat.  \asname{} kann
  5328. dann pr"ufen und ggfs. warnen, falls auf Adressen im Codesegment
  5329. zugegriffen wird, die nicht im ,,angek"undigten'' Fenster liegt.
  5330. Hat die Variable \tty{VARI} z.B. den Wert 456h, so setzt
  5331. \begin{verbatim}
  5332.        ASSUME  ROMBASE:VARI>>6
  5333. \end{verbatim}
  5334. die \asname{}-interne Variable auf 11h, und ein Zugriff auf \tty{VARI} erzeugt einen
  5335. Zugriff auf die Adresse 56h im Datensegment.
  5336.  
  5337. Anstelle eines Symbols kann auch schlicht \tty{NOTHING} angegeben
  5338. werden, z.B. wenn das Bank-Register tempor"ar als Speicherzelle benutzt
  5339. wird.  Dieser Wert ist auch die Voreinstellung.
  5340.  
  5341. Der Programmz"ahler dieser Mikrokontroller ist lediglich 12 Bit breit.  Das
  5342. bedeutet f"ur Varianten mit mehr als 4 KByte Programmspeicher, da"s man sich
  5343. eine Art von Banking einfallen lassen mu"ste.  Dazu werden Adre"sraum und
  5344. Programmspeicher in 2 KByte-Seite eingeteilt.  Seite 1 des Adre"sraumes
  5345. greift immer auf Seite 1 des Programmspeichers zu.  "Uber das bei diesen
  5346. Varianten vorhandene \tty{PRPR}-Register kann der Programmierer bestimmen,
  5347. welche Seite des Programmspeichers "uber die Adressen 000h bis 7ffh
  5348. zugegriffen wird.  \asname{} betrachtet den Adre"sraum in erster N"aherung als
  5349. linear und von der Gr"o"se des Programmspeichers.  Erfolgt ein Sprung von
  5350. Seite 1 aus auf eine Adresse au"serhalb dieser Seite, wird gepr"uft, ob deren
  5351. Adresse mit dem aktuell angenommenen Wert des \tty{PRPR}-Registers identisch
  5352. ist.  Erfolgt ein Sprung von einer anderen Seite aus auf eine Adresse au"serhalb
  5353. Seite 1, wird gepr"uft, ob die Zieladresse innerhalb der gleichen Seite
  5354. liegt.  {\bf WICHTIG}: Da der Programmz"ahler nur 12 Bit breit ist, ist
  5355. es nicht m"oglich, ohne einen Umweg "uber Seite 1 von einer Seite in eine
  5356. andere zu springen - Mit einem Umsetzen des \tty{PRPR}-Registers au"serhalb
  5357. von Seite 1 w"urde man sich seinen eigenen Code unter den F"u"sen wegziehen.
  5358.  
  5359. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5360.  
  5361. \subsubsection{ST9}
  5362.  
  5363. Die ST9-Familie verwendet zur Adressierung von Code- und Datenbereich
  5364. exakt die gleichen Befehle.  Welcher Adre"sraum dabei jeweils
  5365. angesprochen wird, h"angt vom Stand des DP-Flags im Flag-Register ab.
  5366. Damit \asname{} bei absoluten Zugriffen "uberpr"ufen kann, ob man mit Symbolen
  5367. aus dem korrekten Adre"sraum arbeitet (das funktioniert nat"urlich {\em nur}
  5368. bei absoluten Zugriffen!), mu"s man ihm per \tty{ASSUME} mitteilen, ob das
  5369. DP-Flag momentan auf 0 (Code) oder 1 (Daten) steht.  Der Initialwert
  5370. dieser Annahme ist 0.
  5371.  
  5372. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5373.  
  5374. \subsubsection{uPD78(C)1x}
  5375.  
  5376. Diese Prozessoren besitzen ein Register (V), mit dessen Hilfe die
  5377. ,,Zeropage'', d.h. die Lage der mit nur einem Byte adressierbaren
  5378. Speicherzellen sich in Seitengrenzen im Speicher frei verschieben l"a"st.
  5379. Da man aber aus Bequemlichkeitsgr"unden nicht mit Ausdr"ucken wie
  5380. \begin{verbatim}
  5381.        inrw    Lo(Zaehler)
  5382. \end{verbatim}
  5383. arbeiten will, "ubernimmt \asname{} diese Arbeit, allerdings nur unter der
  5384. Voraussetzung, da"s man ihm "uber einen \tty{ASSUME}-Befehl den
  5385. Inhalt des V-Registers mitteilt.  Wird ein Befehl mit Kurzadressierung
  5386. benutzt, so wird "uberpr"uft, ob die obere H"alfte des Adre"sausdrucks
  5387. mit dem angenommenen Inhalt "ubereinstimmt.  Stimmt sie nicht, so erfolgt
  5388. eine Warnung.
  5389.  
  5390. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5391.  
  5392. \subsubsection{78K2}
  5393.  
  5394. 78K2 ist eine 8/16-Bit-Architektur, die nachtr"aglich durch Banking auf
  5395. einen (Daten-)Adre"sraum von einem MByte erweitert wurde.  Das Banking
  5396. wird mit den Registern PM6 (Normalfall) bzw. P6 (alternativer Fall mit
  5397. vorangestelltem \verb!&!) realisiert, die die fehlenden oberen vier Bits
  5398. nachliefern.  Zumindest bei absoluten Adressen kann \asname{} "uberpr"ufen, ob
  5399. die gerade angesprochene, lineare 20-bittige Adresse innerhalb des
  5400. gegebenen 64K-Fensters liegt.
  5401.  
  5402. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5403.  
  5404. \subsubsection{78K3}
  5405.  
  5406. Prozessoren mit 78K3-Kern besitzen Registerb"anke mit insgesamt 16 Registern,
  5407. die man "uber ihre Nummern ansprechen kann (\tty{R0} bis \tty{R15}) oder ihre symbolischen
  5408. Namen (\tty{X=R0, A=R1, C=R2, B=R3, VPL=R8, VPH=R9, UPL=R10, UPH=R11, E=R12,
  5409. D=R13, L=R14, H=R15}).  Der Prozessorkern besitzt ein Register-Auswahlbit
  5410. (\tty{RSS}), mit dem man das Mapping von A/X und B/C von R0..R3 auf R4..R7
  5411. umschaltet.  Dies ist in erste Linie f"ur Befehle wichtig, die implizit eines
  5412. dieser Register benutzen (d.h. bei denen die Registernummer nicht im Maschinenbefehl
  5413. kodiert ist).  Man kann dem Assembler aber auch "uber ein
  5414.  
  5415. \begin{verbatim}
  5416.  assume rss:1
  5417. \end{verbatim}
  5418.  
  5419. mitteilen, da"s die folgenden Befehle mit diesem ge"anderten Mapping arbeiten.  Der
  5420. Assembler wird f"ur Befehle, in denen die Registernummer explizit kodiert ist, dann
  5421. auch die alternativen Registernummern einsetzen.  Umgekehrt wird dann z.B. auch
  5422. \tty{R5} statt \tty{R1} im Quellcode wie \tty{A} behandelt.
  5423.  
  5424. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5425.  
  5426. \subsubsection{78K4}
  5427.  
  5428. 78K4 war als 'Upgrade-Pfad' vom 78K3 konzipiert, deshalb besitzt
  5429. dessen Prozessorkern auch ein RSS-Bit, mit dem man das Mapping
  5430. der Register AX und BC umschalten kann (auch wenn NEC von dessen
  5431. Verwendung in neuem Code abr"at).
  5432.  
  5433. Neben vielen neuen Befehlen und Adressierungsarten ist die
  5434. wesentliche Erweiterung der gr"o"sere Adre"raum von 16 MByte, von
  5435. dem allerdings nur das erste MByte f"ur Programmcode genutzt
  5436. werden kann.  Das CPU-interne RAM sowie die Special Function
  5437. Register k"onnen wahlweise am oberen Ende des ersten MByte oder
  5438. der ersten 64 KByte Seite liegen.  Dies teilt man dem Prozessor
  5439. durch den \tty{LOCATION}-Befehl mit, der als Argument wahlweise
  5440. eine 0 oder 15 akzeptiert.  Parallel damit schaltet der Prozessor
  5441. auch die Adre"sbereiche um, die mit kurzen (8-Bit) Adressen
  5442. erreicht werden k"onnen.  Parallel dazu mu"s man dem Assembler
  5443. mittels \tty{ASSUME LOCATION:..} ebenfalls dieser Wert mitgeteilt
  5444. werden, damit er kurze Adressen in den dazu passenden Bereichen
  5445. erzeugt.  Der Assembler nimmt f"ur LOCATION einen Default von Null
  5446. an.
  5447.  
  5448. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5449.  
  5450. \subsubsection{320C3x/C4x}
  5451.  
  5452. Da alle Instruktionsworte dieser Prozessorfamilie nur 32 Bit lang
  5453. sind, und von diesen 32 Bit nur 16 Bit f"ur absolute Adressen vorgesehen
  5454. wurden, m"ussen die fehlenden oberen 8/16 Bit aus dem DP-Register
  5455. erg"anzt werden.  Bei Adressierungen kann man aber trotzdem die volle
  5456. 24/32-Bit-Adresse angeben, \asname{} pr"uft dann, ob die oberen 8/16 Bit mit dem
  5457. angenommenen Inhalt von DP "ubereinstimmen.  Gegen"uber dem \tty{LDP}-Befehl
  5458. weicht \tty{ASSUME} darin ab, da"s man hier nicht eine beliebige Adresse
  5459. aus der Speicherbank angeben kann, das Herausziehen der oberen Bits
  5460. mu"s man also ,,zu Fu"s'' machen, z.B. so:
  5461. \begin{verbatim}
  5462.        ldp     @adr
  5463.        assume  dp:adr>>16
  5464.        .
  5465.        .
  5466.        .
  5467.        ldi     @adr,r2
  5468. \end{verbatim}
  5469.  
  5470. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5471.  
  5472. \subsubsection{75K0}
  5473.  
  5474. Da selbst mit Hilfe von Doppelregistern (8 Bit) nicht der komplette
  5475. Adre"sraum von 12 Bit zu erreichen ist, mu"ste NEC (wie andere auch...)
  5476. auf Banking zur"uck greifen: Die oberen 4 Adre"sbits werden aus dem
  5477. \tty{MBS}-Register geholt (welchem demzufolge mit \tty{ASSUME} Werte
  5478. zwischen 0 und 15 zugeordnet werden k"onnen), das aber nur beachtet
  5479. wird, falls das \tty{MBE}-Flag auf 1 gesetzt wurde.  Steht es (wie
  5480. die Vorgabe ist) auf 0, so kann man die obersten und untersten 128
  5481. Nibbles des Adre"sraumes ohne Bankumschaltung erreichen.  Da der 75402
  5482. weder \tty{MBE}-Flag noch \tty{MBS}-Register kennt, ist f"ur ihn der
  5483. \tty{ASSUME}-Befehl nicht definiert; Die Initialwerte von \tty{MBE} und
  5484. \tty{MBS} lassen sich daher nicht "andern.
  5485.  
  5486. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5487.  
  5488. \subsubsection{F$^2$MC16L}
  5489.  
  5490. Wie viele andere Mikrokontroller auch, leidet diese Familie etwas unter
  5491. der Knauserei seiner Entwickler: einem 24 Bit breiten Adre"sraum stehen 16
  5492. Bit breite Adre"sregister etwas unterbemittelt gegen"uber.  Also mu"sten
  5493. wieder mal Bank-Register her.  Im einzelnen sind dies PCB f"ur den
  5494. Programmcode, DTB f"ur alle Datenzugriffe, ADB f"ur indirekte Zugriffe
  5495. "uber RW2/RW6 und SSB/USB f"ur die Stacks.  Sie k"onnen alle Werte
  5496. zwischen 0 und 255 annehmen.  Defaultm"a"sig stehen alle Annahmen von \asname{}
  5497. auf 0, mit Ausnahme von 0ffh f"ur PCB.
  5498.  
  5499. Des weiteren existiert das DPR-Register, das angibt, welche Seite
  5500. innerhalb der durch DTB gegebenen 64K-Bank mit 8-Bit-Adressen erreicht
  5501. werden kann.  Der Default f"ur DPR ist 1, zusammen mit dem Default f"ur
  5502. DTB ergibt dies also eine Default-Seite bei 0001xxh.
  5503.  
  5504. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5505.  
  5506. \subsubsection{MN1613}
  5507.  
  5508. Beim MN1613 wurde eine Architektur mit 16-Bit-Adressen nachtr"aglich erweitert,
  5509. Dies wird durch einen Satz vier Bit breiter ,,Segment-Register'' (CSBR, SSBR, TSR0
  5510. und TSR1) erreicht, deren Wert (um 14 Bit nach links geschoben) zu den 16-Bit-
  5511. Adressen hinzu addiert wird.  Ein Proze"s kann auf diese Weise immer ein 64 KWorte
  5512. gro"ses Fenster im 256 KWorte gro"sen Adre"sraum adressieren.  Der Assembler
  5513. benutzt die per \tty{ASSUME} mitgeteilten Werte, um zu warnen, wenn eine absolute
  5514. Adresse innerhalb des 256K-Adre"sraums mit den aktuellen Werten nicht adressierbar
  5515. ist, und rechnet ansonsten den korrekten 16-bittigen Offset aus.  Bei indirekter
  5516. Adressierung ist so eine Pr"ufung (naturgem"a"s) nicht m"oglich.
  5517.  
  5518. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5519.  
  5520. \subsubsection{IM61x0}
  5521.  
  5522. Diese Mikroprozessoren implementieren den Befehlssatz einer PDP/8 und unterst"utzen
  5523. grunds"atzlich einen Adre"sraum von 4 Kiloworten.  Durch Banking kann dieser
  5524. auf acht ,,Felder'' von 4 Kiloworten erweitert werden.  Adressierung von Daten
  5525. und Spr"unge sind prinzipiell nur im gleichen Feld m"oglich, mit einer Ausnahme:
  5526. "uber das IB-Register sind Spr"unge in ein anderes 4K-Feld m"oglich.  Dieses gibt
  5527. die oberen Bits der insgesamt 15 Bit langen Zieladresse vor, falls IB per \tty{ASSUME}
  5528. auf einen Wert ungleich \tty{NOTHING} gesetzt ist.
  5529.  
  5530. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5531.  
  5532. \subsection{CKPT}
  5533. \ttindex{CKPT}
  5534.  
  5535. {\em G"ultigkeit: TI990/12}
  5536.  
  5537. Typ 12-Instruktionen erfordern f"ur ihre Ausf"uhrung ein sogenanntes {\em Checkpoint
  5538. Register}.  Dieses Register kann entweder explizit als viertes Argument angegeben
  5539. werden, oder es wird mit dieser Anweisung ein Default f"ur allen folgenden Code
  5540. festgelegt.  Wenn weder eine \tty{CKPT}-Anweisung noch ein explizites Register
  5541. angegeben wurde, wird eine Fehlermeldung ausgegeben. Der Default von keinem
  5542. Default-Register kann wiederhergestellt werden, indem man die \tty{CKPT}-Anweisung
  5543. mit {\tt NOTHING} als Argument aufruft.
  5544.  
  5545. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5546.  
  5547. \subsection{EMULATED}
  5548. \ttindex{EMULATED}
  5549.  
  5550. {\em G"ultigkeit: 29K}
  5551.  
  5552. AMD hat die Ausnahmebehandlung f"ur undefinierte Befehle bei der
  5553. 29000-Serie so definiert, da"s f"ur jeden einzelnen Befehl ein
  5554. Exception-Vektor zur Verf"ugung steht.  Dies legt es nahe, durch
  5555. gezielte Software-Emulationen den Befehlssatz eines kleineren
  5556. Mitgliedes dieser Familie zu erweitern.  Damit nun aber \asname{} diese
  5557. zus"atzlichen Befehle nicht als Fehler anmeckert, erlaubt es der
  5558. \tty{EMULATED}-Befehl, \asname{} mitzuteilen, da"s bestimmte Befehle doch
  5559. erlaubt sind.  Die Pr"ufung, ob der momentan gesetzte Prozessor
  5560. diesen Befehl beherrscht, wird dann "ubergangen.  Hat man z.B. f"ur
  5561. einen Prozessor ohne Gleitkommaeinheit ein Modul geschrieben, das
  5562. aber nur mit 32-Bit-IEEE-Zahlen umgehen kann, so schreibt man
  5563. \begin{verbatim}
  5564.        EMULATED FADD,FSUB,FMUL,FDIV
  5565.        EMULATED FEQ,FGE,FGT,SQRT,CLASS
  5566. \end{verbatim}
  5567.  
  5568. {\tt BRANCHEXT} mit \tty{ON} oder \tty{OFF} als Argument legt fest, ob \asname{}
  5569. kurze, nur mit einem 8-Bit-Displacement verf"ugbare Spr"unge automatisch
  5570. ,,verl"angern'' soll, indem z.B. aus einem einfachen
  5571. \begin{verbatim}
  5572.        bne     target
  5573. \end{verbatim}
  5574. automatisch eine l"angere Sequenz mit gleicher Funktion wird, falls das
  5575. Sprungziel zu weit von momentanen Programmz"ahler entfernt ist.  F"ur
  5576. {\tt bne} w"are dies z.B. die Sequenz
  5577. \begin{verbatim}
  5578.        beq     skip
  5579.        jmp     target
  5580. skip:
  5581. \end{verbatim}
  5582. Falls f"ur eine Anweisung aber kein passendes ,,Gegenteil'' existiert,
  5583. kann die Sequenz auch l"anger werden, z.B. f"ur {\tt jbc}:
  5584. \begin{verbatim}
  5585.        jbc     dobr
  5586.        bra     skip
  5587. dobr:   jmp     target
  5588. skip:
  5589. \end{verbatim}
  5590. Durch dieses Feature gibt es bei Spr"ungen keine eineindeutige Zuordnung
  5591. von Maschinen- und Assemblercode mehr, und bei Vorw"artsreferenzen handelt
  5592. man sich m"oglicherweise zus"atzliche Passes ein.  Man sollte dieses
  5593. Feature daher mit Vorsicht einsetzen!
  5594.  
  5595. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5596.  
  5597. \subsection{Z80SYNTAX}
  5598. \ttindex{Z80SYNTAX}
  5599.  
  5600. {\em G"ultigkeit: 8008, 8080/8085, $\mu$PD78xx}
  5601.  
  5602. Mit \tty{ON} als Argument kann man Assmebler-Befehle wahlweise
  5603. auch in der Form schreiben, wie sie Zilog f"ur den Z80 definiert hat.
  5604. Zum Beispiel benutzt man einfach nur noch \tty{LD} mit sich selbst
  5605. erkl"arenden Operanden, wo man in der originalen Syntax (bzw.
  5606. neueren 8008-Syntax) je nach Operanden \tty{MVI, LXI, MOV, STA, LDA,
  5607. SHLD, LHLD, LDAX, STAX} oder \tty{SPHL} schreiben mu"s.
  5608.  
  5609. Weil einige Mnemonics in der originalen und Z80-Syntax unterschiedliche
  5610. Bedeutung haben, kann man nicht zu 100\% im 'Z80-Stil' programmieren.
  5611. Alternativ schaltet man f"ur 8080/8085 mit einem \tty{EXCLUSIVE} als
  5612. Argument die originale Syntax ganz ab.  Details zu dieser Betriebsart
  5613. kann man im Abschnitt \ref{8080Spec} nachlesen.
  5614.  
  5615. Ein eingebautes Symbol mit gleichem Namen gestattet es, die aktuelle
  5616. Betriebsart auszulesen.  Es gilt \tty{0=OFF}, \tty{1=ON} und
  5617. \tty{2=EXCLUSIVE}.
  5618.  
  5619. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5620.  
  5621. \subsection{EXPECT und ENDEXPECT}
  5622. \ttindex{EXPECT}
  5623. \ttindex{ENDEXPECT}
  5624.  
  5625. Mit diesen beiden Befehlen rahmt man ein St"uck Quellcode ein, in dem ein
  5626. oder mehrere Fehler {\em erwartet} werden.  Treten die "uber ihre Nummern
  5627. (siehe Kapitel \ref{ChapErrMess}) identifizierten Fehler oder Warnungen auf, werden
  5628. sie unterdr"uckt, und die Assemblierung l"auft ohne Fehler durch - nat"urlich
  5629. ohne an dieser Stelle Code zu erzeugen.  Erwartete, aber nicht aufgetretene
  5630. Fehler oder Warnungen l"osen ihrerseits jedoch eine Fehlermeldung von
  5631. \tty{ENDEXPECT} aus.  Der Haupt-Anwendungszweck dieser Befehle findet sich
  5632. in den Selbst-Tests im tests/-Unterverzeichnis.  Z.B. kann man so testen,
  5633. ob Wertebereiche korrekt gepr"uft werden:
  5634. \begin{verbatim}
  5635.       cpu      68000
  5636.       expect   1320     ; immediate-Shift nur 1..8
  5637.       lsl.l    #10,d0
  5638.       endexpect
  5639. \end{verbatim}
  5640.  
  5641. %%---------------------------------------------------------------------------
  5642.  
  5643. \section{Datendefinitionen}
  5644.  
  5645. Die hier beschriebenen Befehle "uberschneiden sich teilweise in ihrer
  5646. Funktionalit"at, jedoch definiert jede Prozessorfamilie andere Namen
  5647. f"ur die gleiche Funktion.  Um mit den Standardassemblern konform zu
  5648. bleiben, wurde diese Form der Implementierung gew"ahlt.
  5649.  
  5650. Sofern nicht ausdr"ucklich anders erw"ahnt, kann bei allen Befehlen zur
  5651. Datenablage (nicht bei denen zur Speicherreservierung!) eine beliebige Zahl
  5652. von Parametern angegeben werden, die der Reihe nach abgearbeitet werden.
  5653.  
  5654. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5655.  
  5656. \subsection{DC[.size]}
  5657. \ttindex{DC}
  5658.  
  5659. {\em G"ultigkeit: 680x0, M*Core, 68xx, H8, SH7x00, DSP56xxx,\\
  5660.     XA, ST7/STM8, MN161x, IM61x0, CP-3F, SC61860}
  5661.  
  5662. Dieser Befehl legt eine oder mehrere Konstanten des beim durch
  5663. das Attribut bestimmten Typs im Speicher ab.  Die Attribute entsprechen
  5664. den in Abschnitt \ref{AttrTypes} definierten, zus"atzlich ist f"ur
  5665. Byte-Konstanten die M"oglichkeit vorhanden, Stringausdr"ucke im Speicher
  5666. abzulegen, wie z.B.
  5667. \begin{verbatim}
  5668. String  dc.b    "Hello world!\0"
  5669. \end{verbatim}
  5670. Die Parameterzahl darf zwischen 1 und 20 liegen, zus"atzlich darf jedem
  5671. Parameter ein in eckigen Klammern eingeschlossener Wiederholungsfaktor
  5672. vorausgehen, z.B. kann man mit
  5673. \begin{verbatim}
  5674.        dc.b    [(*+255)&$ffffff00-*]0
  5675. \end{verbatim}
  5676. den Bereich bis zur n"achsten Seitengrenze mit Nullen f"ullen.
  5677. \bb{Vorsicht!}
  5678. Mit dieser Funktion kann man sehr leicht die Grenze von 1 Kbyte erzeugten
  5679. Codes pro Zeile Quellcode "uberschreiten!
  5680. \par
  5681. Sollte die Byte-Summe ungerade sein, so kann vom Assembler automatisch
  5682. ein weiteres Byte angef"ugt werden, um die Wortausrichtung von Daten zu
  5683. erhalten.  Dieses Verhalten kann mit dem \tty{PADDING}-Befehl ein-
  5684. und ausgeschaltet werden.
  5685. \par
  5686. Mit diesem Befehl abgelegte Dezimalgleitkommazahlen (\tty{DC.P} ...) k"onnen
  5687. zwar den ganzen Bereich der extended precision "uberstreichen, zu beachten
  5688. ist dabei allerdings, da"s die von Motorola verf"ugbaren Koprozessoren
  5689. 68881/68882 beim Einlesen solcher Konstanten die Tausenderstelle des
  5690. Exponenten ignorieren!
  5691. \par
  5692. Default-Attribut ist \tty{W}, also 16-Bit-Integerzahlen.
  5693. \par
  5694. Beim DSP56xxx ist der Datentyp auf Integerzahlen festgelegt (ein
  5695. Attribut ist deshalb weder n"otig noch erlaubt), die im Bereich
  5696. -8M..16M-1 liegen d"urfen.   Stringkonstanten sind ebenfalls erlaubt,
  5697. wobei jeweils drei Zeichen in ein Wort gepackt werden.
  5698. \par
  5699. Es ist im Gegensatz zum Original Motorola-Assembler auch erlaubt, mit
  5700. diesem Kommando Speicher zu reservieren, indem man als Argument ein
  5701. Fragezeichen angibt.  Diese Erweiterung haben wohl einige Drittanbieter
  5702. von 68K-Assemblern eingebaut, in Anlehnung an das, was Intel-Assembler
  5703. machen.  Wer dies benutzt, sollte sich aber im klaren sein, da"s dies
  5704. zu Problemen beim Portieren von Code auf andere Assembler f"uhren kann.
  5705. Des weiteren d"urfen Fragezeichen als Operanden nicht mit 'normalen'
  5706. Konstanten in einer Anweisung gemischt werden.
  5707.  
  5708. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5709.  
  5710. \subsection{DS[.size]}
  5711. \ttindex{DS}
  5712.  
  5713. {\em G"ultigkeit: 680x0, M*Core, 68xx, H8, SH7x00, DSP56xxx,\\
  5714.     XA, ST7/STM8, MN161x, IM61x0, CP-3F, PPS-4, SC61860}
  5715.  
  5716. Mit diesem Befehl l"a"st sich zum einen Speicherplatz f"ur die angegebene
  5717. Zahl im Attribut beschriebener Zahlen reservieren.  So reserviert
  5718. \begin{verbatim}
  5719.        DS.B    20
  5720. \end{verbatim}
  5721. z.B. 20 Bytes Speicher,
  5722. \begin{verbatim}
  5723.        DS.X    20
  5724. \end{verbatim}
  5725. aber 240 Byte !
  5726. \par
  5727. Die andere Bedeutung ist die Ausrichtung des Programmz"ahlers, die
  5728. mit der Wertangabe 0 erreicht wird.  So wird mit
  5729. \begin{verbatim}
  5730.        DS.W    0
  5731. \end{verbatim}
  5732. der Programmz"ahler auf die n"achste gerade Adresse aufgerundet, mit
  5733. \begin{verbatim}
  5734.        DS.D    0
  5735. \end{verbatim}
  5736. dagegen auf die n"achste Langwortgrenze.  Eventuell dabei freibleibende
  5737. Speicherzellen sind nicht etwa mit Nullen oder NOPs gef"ullt,
  5738. sondern undefiniert.
  5739. \par
  5740. Vorgabe f"ur die Operandengr"o"se ist --- wie "ublich --- W, also 16 Bit.
  5741. \par
  5742. Beim 56xxx ist die Operandengr"o"se auf Worte (a 24 Bit) festgelegt,
  5743. Attribute gibt es deswegen wie bei \tty{DC} auch hier nicht.
  5744.  
  5745. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5746.  
  5747. \subsection{BLKB, BLKW, BLKL, BLKD}
  5748. \ttindex{BLKB}\ttindex{BLKW}\ttindex{BLKL}\ttindex{BLKD}
  5749.  
  5750. {\em G"ultigkeit: Renesas RX}
  5751.  
  5752. Mit diesen Befehlen wird auf dem Renesas RX Speicher reserviert.  Die
  5753. Gesamtgr"o"se des reservierten Speicher resultiert aus dem Produkt des
  5754. Arguments und der durch den Befehl gegebenen Operandengr"o"se (1 Byte
  5755. f"ur \tty{BLKB}, 2 Byte f"ur \tty{BLKW}, 4 Byte f"ur \tty{BLKL} und
  5756. 8 Byte f"ur \tty{BLKD}).
  5757.  
  5758. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5759.  
  5760. \subsection{DN,DB,DW,DD,DQ,DT \& DO}
  5761. \ttindex{DN}\ttindex{DB}\ttindex{DW}\ttindex{DD}
  5762. \ttindex{DQ}\ttindex{DT}\ttindex{DO}
  5763.  
  5764. {\em\begin{tabbing}
  5765. G"ultigkeit: \= Intel (au"ser 4004/4040), Zilog, Toshiba, NEC, TMS370,\\
  5766.             \> Siemens, AMD, M16(C), MELPS7700/65816, National, ST9,\\
  5767.             \> Atmel, TMS7000, TMS1000, $\mu$PD77230, Signetics,\\
  5768.             \> Fairchild, Intersil,\\
  5769.             \> XS1, SC62015
  5770. \end{tabbing}}
  5771.  
  5772. Diese Befehle stellen sozusagen das Intel-Gegenst"uck zu \tty{DS}
  5773. und \tty{DC} dar, und wie nicht anders zu erwarten, ist die Logik
  5774. etwas anders:
  5775. \par
  5776. Zum einen wird die Kennung der Operandengr"o"se in das Mnemonic
  5777. verlegt:
  5778. \begin{itemize}
  5779. \item{\tty{DN}: 4-Bit-Integer}
  5780. \item{\tty{DB}: Byte oder ASCII-String wie bei \tty{DC.B}}
  5781. \item{\tty{DW}: 16-Bit-Integer oder Gleitkomma mit halber Genauigkeit}
  5782. \item{\tty{DD}: 32-Bit-Integer oder Gleitkomma mit einfacher Genauigkeit}
  5783. \item{\tty{DQ}: 64-Bit-Integer oder Gleitkomma mit doppelter Genauigkeit}
  5784. \item{\tty{DT}: Gepackter BCD Integer oder Gleitkomma mit erweiterter Genauigkeit (80 Bit)}
  5785. \item{\tty{DO}: Gleitkomma mit vierfacher Genauigkeit (128 Bit)}
  5786. \end{itemize}
  5787. Zum anderen erfolgt die Unterscheidung, ob Konstantendefinition oder
  5788. Speicherreservierung, im Operanden.  Eine Reservierung von Speicher
  5789. wird durch ein \tty{?} gekennzeichnet:
  5790. \begin{verbatim}
  5791.        db  ?   ; reserviert ein Byte
  5792.        dw  ?,? ; reserviert Speicher fuer 2 Worte (=4 Byte)
  5793.        dd  -1  ; legt die Konstante -1 (FFFFFFFFH) ab !
  5794. \end{verbatim}
  5795. Speicherreservierung und Konstantendefinition d"urfen \bb{nicht in einer
  5796. Anweisung} gemischt werden:
  5797. \begin{verbatim}
  5798.        db  "Hallo",?  ; -->Fehlermeldung
  5799. \end{verbatim}
  5800. \ttindex{DUP}
  5801. Zus"atzlich ist noch der \tty{DUP}-Operator erlaubt, der die mehrfache Ablage
  5802. von Konstantenfolgen oder die Reservierung ganzer Speicherbl"ocke erlaubt:
  5803. \begin{verbatim}
  5804.        db  3 dup (1,2) ; --> 1 2 1 2 1 2
  5805.        dw  20 dup (?)  ; reserviert 40 Byte Speicher.
  5806. \end{verbatim}
  5807. Wie man sehen kann, mu"s das \tty{DUP}-Argument geklammert werden, darf daf"ur
  5808. aber auch wieder aus mehreren Teilen bestehen, die selber auch wieder
  5809. \tty{DUP}s sein k"onnen...das ganze funktioniert also rekursiv.
  5810. \par
  5811. \tty{DUP} ist aber auch eine Stelle, an der man mit einer anderen Grenze des
  5812. Assemblers in Ber"uhrung kommen kann: maximal k"onnen 1024 Byte Code
  5813. oder Daten in einer Zeile erzeugt werden.  Dies bezieht sich \bb{nicht}
  5814. auf die Reservierung von Speicher, nur auf die Definition von
  5815. Konstantenfeldern!
  5816. \par
  5817. Der \tty{DUP}-Operator wird nur erkannt, wenn er selber geklammert ist
  5818. und links von ihm ein nicht-leeres Argument steht; auf diese Weise ist es
  5819. m"oglich ein eventuell definiertes Symbol gleichen Namens auch als Argument
  5820. zu verwenden.
  5821. \par
  5822. \tty{DB} und \tty{DW} auf 65xx- und 68xx-Plattformen verstehen neben
  5823. dem \tty{DUP}-Operator zus"atzlich die 'Motorola-Variante' davon,
  5824. nämlich eine in eckigen Klammern davor geschriebene Zahl von
  5825. Wiederholungen.
  5826. \par
  5827. Auf verschiedenen Plattformen existieren Befehle mit identischer
  5828. Funktionalit"at, jedoch anderem Namen:
  5829. \begin{itemize}
  5830. \ttindex{DEFB}\ttindex{DEFW}
  5831. \item{Um mit dem M80 vertr"aglich zu sein, darf im Z80-Modus anstelle
  5832.      von \tty{DB}/\tty{DW} auch \tty{DEFB}/\tty{DEFW} geschrieben
  5833.      werden.}
  5834. \ttindex{BYTE}\ttindex{WORD}\ttindex{ADDR}\ttindex{ADDRW}
  5835. \item{\tty{BYTE/ADDR} bzw. \tty{WORD/ADDRW} beim COP4/8 stellen einen
  5836.      Alias f"ur \tty{DB} bzw. \tty{DW} dar, wobei die beiden Paare sich
  5837.      jedoch in der Byte-Order unterscheiden: Die Befehle, die von
  5838.      National zur Adre"sablage vorgesehen waren, benutzen Big-Endian,
  5839.      \tty{BYTE} bzw. \tty{WORD} jedoch Little-Endian.}
  5840. \ttindex{BYTE}\ttindex{WORD}
  5841. \item{\tty{BYTE} bzw. \tty{WORD} funktionieren auf der PDP-11, VAX und
  5842.      WD16 wie \tty{DB} bzw. \tty{DW}, akzeptieren aber nur Ganzzahl-Argumente.}
  5843. \item{\tty{LWORD} bzw. \tty{QUAD} funktionieren auf der VAX wie \tty{DD}
  5844.      bzw. \tty{DQ}, akzeptieren aber nur Ganzzahl-Argumente.}
  5845. \ttindex{BYTE}\ttindex{WORD}\ttindex{LWORD}\ttindex{QUAD}
  5846. \ttindex{FLOAT}\ttindex{DOUBLE}
  5847. \item{Auf dem Renesas RX existieren:
  5848.      \begin{itemize}
  5849.      \item{\tty{BYTE} (wie \tty{DB})}
  5850.      \item{\tty{WORD} (wie \tty{DW}, nur Ganzzahl-Argumente)}
  5851.      \item{\tty{LWORD} (wie \tty{DD}, nur Ganzzahl-Argumente)}
  5852.      \item{\tty{FLOAT} (wie \tty{DD}, nur Gleitkomma-Argumente)}
  5853.      \item{\tty{DOUBLE} (wie \tty{DQ}, nur Gleitkomma-Argumente)}
  5854.      \end{itemize}}
  5855. \end{itemize}
  5856.  
  5857. Wird \tty{DB} in einem Adre"sraum angewendet, der nicht byte-adressierbar
  5858. ist (z.B. das \tty{CODE}-Segment des Atmel AVR), so werden immer zwei Bytes
  5859. in ein 16-Bit-Wort gepackt, entsprechend der durch die Architektur gegebenen
  5860. Endinaness - das untere Byte wird bei Little-Endian also zuerst gef"ullt.  Ist
  5861. die Gesamtmenge aller Bytes ungerade, so bleibt die andere Worth"alfte ungenutzt
  5862. und ist quasi ''Padding''.  Sie wird auch nicht genutzt, falls im Quellcode
  5863. eine weitere \tty{DB}-Anweisung unmittelbar folge sollte.  Sinngem"a"s gilt
  5864. das gleiche f"ur \tty{DN}, nur werden hier zwei oder vier Nibbles in ein Byte
  5865. oder 16-Bit-Wort gepackt.
  5866.  
  5867. Der NEC 77230 nimmt mit seiner \tty{DW}-Anweisung eine Sonderstellung ein:
  5868. Sie funktioniert eher wie \tty{DATA} bei seinen kleineren Br"udern,
  5869. akzeptiert aber neben String- und Integerargumenten auch Gleitkommawerte
  5870. (und legt sie prozessorspezifischen 32-Bit-Format ab). \tty{DUP} gibt es {\em
  5871. nicht}!
  5872.  
  5873. Bei der Ablage von Gleitkommazahlen ist zu beachten, da"s diese keine h"ohere
  5874. Genauigkeit und Wertebereich haben können als das auf dem Host-System verwendete
  5875. Format.  Handelt es sich dabei z.B. um das '"ubliche' IEEE 754 64-Bit-Format,
  5876. so ist der Wertebereich auf ca. +/-$1.8*10^{308}$ beschr"ankt (siehe Variable
  5877. \tty{FLOATMAX}), und die untersten zwei bzw. acht Bytes bei \tty{DT} bzw.
  5878. \tty{DO} sind Null.
  5879.  
  5880. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5881.  
  5882. \subsection{FLT2, FLT3, FLT4}
  5883. \ttindex{FLT2}\ttindex{FLT3}\ttindex{FLT4}
  5884.  
  5885. {\em\begin{tabbing}
  5886. G"ultigkeit: \= PDP-11 (\tty{FLT2, FLT4}),\\
  5887.             \> WD16 (\tty{FLT3})
  5888. \end{tabbing}}
  5889.  
  5890. \tty{FLT2} und \tty{FLT4} funktionieren analog zu \tty{DD} bzw. \tty{DQ},
  5891. legen jedoch ausschlie"slich Gleitkomma-Konstanten im DEC-eigenen F- bzw.
  5892. D-Format ab.  Der WD16 verwendet hingegen ein eigenes, 48 Bit (drei
  5893. Maschinenworte) langes Format.  Gleitkomma-Konstanten in diesem Format
  5894. k"onnen mit der \tty{FLT3}-Anweisung im Speicher abgelegt werden.
  5895.  
  5896. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5897.  
  5898. \subsection{x\_FLOATING}
  5899. \ttindex{F\_FLOATING}\ttindex{FLOAT}
  5900. \ttindex{D\_FLOATING}\ttindex{DOUBLE}
  5901. \ttindex{G\_FLOATING}
  5902. \ttindex{H\_FLOATING}
  5903.  
  5904. {\em G"ultigkeit: VAX}
  5905.  
  5906. Mit diesen Befehlen werden auf der VAX Gleitkomma-Konstanten in den
  5907. DEC-eigenen Formaten im Speicher abgelegt, wobei {\tt x} f"ur die vier
  5908. unterst"utzten Formate (F, D, G und H) steht.  {\tt FLOAT} ist ein
  5909. Alias f"ur {\tt F\_FLOATING}, {\tt DOUBLE} einer f"ur {\tt D\_FLOATING}.
  5910. Die Befehle funktionieren ansonsten wie \tty{DD} und \tty{DQ}.
  5911.  
  5912. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5913.  
  5914. \subsection{DS, DS8}
  5915. \ttindex{DS}
  5916. \ttindex{DS8}
  5917.  
  5918. {\em\begin{tabbing}
  5919. G"ultigkeit: \= Intel, Zilog, Toshiba, NEC, TMS370, Siemens, AMD, M16(C),\\
  5920.             \> National, ST9, TMS7000, TMS1000, Intersil, 6502, 68xx
  5921. \end{tabbing}}
  5922.  
  5923. Dieser Befehl stellt eine Kurzschreibweise dar, um Speicherbereiche
  5924. zu reservieren:
  5925. \begin{quote}{\tt
  5926.        DS       $<Anzahl>$
  5927. }\end{quote}
  5928. ist eine Kurzschreibweise f"ur
  5929. \begin{quote}{\tt
  5930.        DB       $<Anzahl>$ DUP (?)
  5931. }\end{quote}
  5932. dar, lie"se sich also prinzipiell auch einfach "uber ein Makro realisieren,
  5933. nur scheint dieser Befehl in den K"opfen einiger mit Motorola-CPUs gro"s
  5934. gewordener Leute (gell, Michael?) so fest verdrahtet zu sein, da"s sie
  5935. ihn als eingebauten Befehl erwarten...hoffentlich sind selbige jetzt
  5936. zufrieden {\tt ;-)}
  5937.  
  5938. {\tt DS8} ist beim National SC14xxx als Alias f"ur {\tt DS} definiert.
  5939. Achten Sie aber darauf, da"s der Speicher dieser Prozessoren in Worten zu
  5940. 16 Bit organisiert ist, d.h. es ist unm"oglich, einzelne Bytes zu
  5941. reservieren.  Falls das Argument von {\tt DS} ungerade ist, wird es auf
  5942. die n"achstgr"o"sere gerade Zahl aufgerundet.
  5943.  
  5944. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5945.  
  5946. \subsection{BLKx}
  5947. \ttindex{BLKB}\ttindex{BLKW}\ttindex{BLKL}\ttindex{BLKQ}\ttindex{BLKO}
  5948. \ttindex{BLKF}\ttindex{BLKD}\ttindex{BLKG}\ttindex{BLKH}
  5949.  
  5950. {\em G"ultigkeit: VAX}
  5951.  
  5952. Diese Befehle reservieren Speicher f"ur die angegebene Menge von Datenelementen,
  5953. deren Typ im letzten Zeichen des Befehls kodiert ist.  Dementsprechend ist
  5954. der insgeamt reservierte Bereich in Bytes bei {\tt BLKB} gleich der Anzahl
  5955. der Elemente, bei {\tt BLKW} das doppelte, und bei {\tt BLKO} und {\tt BLKH}
  5956. das sechzehnfache.
  5957.  
  5958. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5959.  
  5960. \subsection{BYT oder FCB}
  5961. \ttindex{BYT}\ttindex{FCB}
  5962.  
  5963. {\em G"ultigkeit: 6502, 68xx, SC61860}
  5964.  
  5965. Mit diesem Befehl werden im 65xx/68xx-Modus Byte-Konstanten oder
  5966. ASCII-Strings abgelegt, er entspricht also \tty{DC.B} beim 68000 oder
  5967. bei Intel dem \tty{DB} (was ebenfalls erlaubt ist).  Ein Wiederholungsfaktor
  5968. darf analog zu \tty{DC} jedem einzelnen Parameter in eckigen Klammern
  5969. vorangestellt werden.
  5970.  
  5971. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5972.  
  5973. \subsection{BYTE}
  5974. \ttindex{BYTE}
  5975.  
  5976. {\em G"ultigkeit: ST6, 320C2(0)x, 320C5x, MSP, TMS9900, CP-1600}
  5977.  
  5978. Dito.  Ein im 320C2(0)x/5x-Modus vor dem Befehl stehendes Label wird
  5979. als untypisiert gespeichert, d.h. keinem Adre"sraum zugeordnet.
  5980. Der Sinn dieses Verhaltens wird bei den prozessorspezifischen
  5981. Hinweisen erl"autert.
  5982.  
  5983. Ob beim MSP bzw. TMS9900 ungerade Mengen von Bytes automatisch um
  5984. ein Null-Byte erg"anzt werden sollen, kann mit dem PADDING-Befehl
  5985. eingestellt werden.
  5986.  
  5987. Auf dem CP-1600 weicht die Verhaltensweise von {\tt BYTE} etwas ab:
  5988. die angegebenen 16-Bit-Werte werden in jeweils zwei aufeinanderfolgenden
  5989. W"ortern aufgeteilt abgelegt (LSB zuerst).  Wenn einzelne Bytes (gepackt)
  5990. abgelegt werden sollen, mu"s stattdessen {\tt TEXT} verwendet werden!
  5991.  
  5992. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5993.  
  5994. \subsection{DC8}
  5995. \ttindex{DC8}
  5996.  
  5997. {\em G"ultigkeit: SC144xx}
  5998.  
  5999. Dieser Befehl ist ein Alias f"ur {\tt DB}, d.h. mit ihm k"onnen
  6000. Byte-Konstanten oder Strings im Speicher abgelegt werden.
  6001.  
  6002. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6003.  
  6004. \subsection{ADR oder FDB}
  6005. \ttindex{ADR}\ttindex{FDB}
  6006.  
  6007. {\em G"ultigkeit: 6502, 68xx, SC61860}
  6008.  
  6009. Mit diesem Befehl werden im 65xx/68xx-Modus Wortkonstanten
  6010. abgelegt, er entspricht also \tty{DC.W} beim 68000 oder bei Intel
  6011. dem \tty{DW} (was auch zul"assig ist).  Ein Wiederholungsfaktor darf
  6012. analog zu \tty{DC} jedem einzelnen Parameter in eckigen Klammern vorangestellt
  6013. werden.
  6014.  
  6015. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6016.  
  6017. \subsection{DDB}
  6018. \ttindex{DDB}
  6019.  
  6020. {\em G"ultigkeit: 6502, MELPS-7700}
  6021.  
  6022. Dieser Befehl funktioniert analog zu \tty{ADR}, nur mit dem Unterschied, da"s
  6023. die 16-BitWerte im Big-Endian-Format im Speicher abgelegt werden.
  6024.  
  6025. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6026.  
  6027. \subsection{DCM}
  6028. \ttindex{DCM}
  6029.  
  6030. {\em G"ultigkeit: 6502}
  6031.  
  6032. Mit diesem Befehl werden Gleitkomma-Konstanten im Speicher abgelegt, und
  6033. zwar in dem in \cite{AppleFloat} beschriebenen Format: Ein Exponent
  6034. von 8 Bit und eine 24-bittige Mantisse im Zweierkomplement, im Big-Endian-Format
  6035. abgelegt.
  6036.  
  6037. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6038.  
  6039. \subsection{WORD}
  6040. \ttindex{WORD}
  6041.  
  6042. {\em G"ultigkeit: ST6, i960, 320C2(0)x, 320C3x/C4x/C5x, MSP, CP-1600,\\
  6043.     IMP-16, IPC-16}
  6044.  
  6045. F"ur den 320C3x/C4x und i960 werden hiermit 32-Bit-Worte abgelegt, f"ur die
  6046. alle anderen Familien 16-Bit-Worte.  Ein im 320C2(0)x/5x-Modus vor dem Befehl
  6047. stehendes Label wird als untypisiert gespeichert, d.h. keinem Adre"sraum
  6048. zugeordnet.  Der Sinn dieses Verhaltens wird bei den prozessorspezifischen
  6049. Hinweisen erl"autert.
  6050.  
  6051. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6052.  
  6053. \subsection{DW16}
  6054. \ttindex{DW16}
  6055.  
  6056. {\em G"ultigkeit: SC144xx}
  6057.  
  6058. Dieser Befehl ist beim SC144xx der Weg, Konstanten mit Wortl"ange (16 Bit)
  6059. im Speicher abzulegen und damit ein ALIAS f"ur DW.
  6060.  
  6061. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6062.  
  6063. \subsection{ACON}
  6064. \ttindex{ACON}
  6065.  
  6066. {\em G"ultigkeit: 2650}
  6067.  
  6068. {\tt ACON} arbeitet analog zu {\tt DW}, jedoch werden die 16-Bit-Zahlenwerte
  6069. im Big-Endian-Format abgelegt.
  6070.  
  6071. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6072.  
  6073. \subsection{LONG}
  6074. \ttindex{LONG}
  6075.  
  6076. {\em G"ultigkeit: 320C2(0)x, 320C5x}
  6077.  
  6078. Hiermit werden 32-Bit-Integer im Speicher abgelegt, und zwar in
  6079. der Reihenfolge LoWord-HiWord.  Ein eventuell vor dem Befehl
  6080. stehendes Label wird dabei wieder als untypisiert abgelegt
  6081. (der Sinn dieser Ma"snahme ist in den prozessorspezifischen
  6082. Hinweisen erl"autert).
  6083.  
  6084. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6085.  
  6086. \subsection{SINGLE, DOUBLE und EXTENDED}
  6087. \ttindex{SINGLE}\ttindex{DOUBLE}\ttindex{EXTENDED}
  6088.  
  6089. {\em G"ultigkeit: 320C3x/C4x (nicht {\tt DOUBLE}), 320C6x (nicht {\tt
  6090.   EXTENDED})}
  6091.  
  6092. Mit diesen Befehlen werden Gleitkomma-Konstanten im Speicher abgelegt,
  6093. jedoch beim 320C3x/C4x nicht im IEEE-Format, sondern in den vom Prozessor
  6094. verwendeten 32- und 40-Bit-Formaten.  Da 40 Bit nicht mehr in eine
  6095. Speicherzelle hineinpassen, werden im Falle von \tty{EXTENDED} immer derer
  6096. 2 pro Wert belegt.  Im ersten Wort finden sich die oberen 8 Bit (der
  6097. Exponent), der Rest (Vorzeichen und Mantisse) in zweiten Wort.
  6098.  
  6099. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6100.  
  6101. \subsection{FLOAT und DOUBLE}
  6102. \ttindex{FLOAT}\ttindex{DOUBLE}
  6103.  
  6104. {\em G"ultigkeit: 320C2(0)x, 320C5x}
  6105.  
  6106. Mit diesen Befehlen k"onnen 32- bzw. 64-Bit-Gleitkommazahlen
  6107. im IEEE-Format im Speicher abgelegt werden.  Dabei wird das
  6108. niederwertigste Byte jeweils auf der ersten Speicherstelle
  6109. abgelegt.  Ein eventuell vor dem Befehl stehendes Label wird
  6110. wieder als untypisiert gespeichert (der Sinn dieser Ma"snahme
  6111. ist in den prozessorspezifischen Hinweisen erl"autert).
  6112.  
  6113. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6114.  
  6115. \subsection{SINGLE und DOUBLE}
  6116. \ttindex{SINGLE}\ttindex{DOUBLE}
  6117.  
  6118. {\em G"ultigkeit: TMS99xxx}
  6119.  
  6120. Mit diesen Befehlen k"onnen 32- bzw. 64-Bit-Gleitkommazahlen
  6121. im prozessoreigenen Format im Speicher abgelegt werden.  Das
  6122. Format entspricht dem IBM/360-Gleitkommaformat.
  6123.  
  6124. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6125.  
  6126. \subsection{EFLOAT, BFLOAT, TFLOAT}
  6127. \ttindex{EFLOAT}\ttindex{BFLOAT}\ttindex{TFLOAT}
  6128.  
  6129. {\em G"ultigkeit: 320C2(0)x, 320C5x}
  6130.  
  6131. Auch diese Befehle legen Gleitkommazahlen im Speicher ab,
  6132. jedoch in einem nicht-IEEE-Format, das evtl. leichter von
  6133. Signalprozessoren zu verarbeiten ist:
  6134. \begin{itemize}
  6135. \item{\tty{EFLOAT}: Mantisse mit 16 Bit, Exponent mit 16 Bit}
  6136. \item{\tty{BFLOAT}: Mantisse mit 32 Bit, Exponent mit 16 Bit}
  6137. \item{\tty{TFLOAT}: Mantisse mit 64 Bit, Exponent mit 32 Bit}
  6138. \end{itemize}
  6139. Gemeinsam ist den Befehlen, da"s die Mantisse vor dem
  6140. Exponenten abgelegt wird (Lo-Word jeweils zuerst) und
  6141. beide im Zweierkomplement dargestellt werden.  Ein eventuell
  6142. vor dem Befehl stehendes Label wird wieder als untypisiert
  6143. gespeichert (der Sinn dieser Ma"snahme ist in den
  6144. prozessorspezifischen Hinweisen erl"autert).
  6145.  
  6146. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6147.  
  6148. \subsection{Qxx und LQxx}
  6149. \ttindex{Qxx}\ttindex{LQxx}
  6150.  
  6151. {\em G"ultigkeit: 320C2(0)x, 320C5x}
  6152.  
  6153. Mit diesen Befehlen k"onnen Gleitkommazahlen in einem Festkommaformat
  6154. abgelegt werden.  \tty{xx} ist dabei eine zweistellige Zahl, mit deren
  6155. Zweierpotenz der Gleitkommawert vor der Umwandlung in eine ganze Zahl
  6156. multipliziert werden soll.  Er bestimmt also praktisch, wieviele Bits
  6157. f"ur die Nachkommastellen reserviert werden sollen.  W"ahrend aber
  6158. \tty{Qxx} nur ein Wort (16 Bit) ablegt, wird das Ergebnis bei \tty{LQxx}
  6159. in 2 Worten (LoWord zuerst) abgelegt.  Das sieht dann z.B. so
  6160. aus:
  6161. \begin{verbatim}
  6162.        q05     2.5      ; --> 0050h
  6163.        lq20    ConstPI  ; --> 43F7h 0032h
  6164. \end{verbatim}
  6165. Mich m"oge niemand steinigen, wenn ich mich auf meinem HP28
  6166. verrechnet haben sollte...
  6167.  
  6168. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6169.  
  6170. \subsection{DATA}
  6171. \ttindex{DATA}
  6172.  
  6173. {\em G"ultigkeit: PIC, 320xx, AVR, MELPS-4500, H8/500, \\
  6174.     HMCS400, 4004/4040, $\mu$PD772x, OLMS-40/50, Padauk}
  6175.  
  6176. Mit diesem Befehl werden Daten im aktuellen Segment abgelegt,
  6177. wobei sowohl Integer- als auch Stringwerte zul"assig sind.  Bei
  6178. Strings belegt beim 16C5x/16C8x, 17C4x im Datensegment, beim
  6179. 4500er, 4004 und HMCS400 im Code-Segement ein Zeichen ein Wort,
  6180. bei AVR, 17C4x im Codesegment, $\mu$PD772x in den Datensegmenten
  6181. und 3201x/3202x passen zwei Zeichen in ein Wort (LSB zuerst),
  6182. beim $\mu$PD7725 drei und beim 320C3x/C4x sogar derer 4 (MSB
  6183. zuerst).  Im Gegensatz dazu mu"s im Datensegment des 4500 bzw.
  6184. ein Zeichen auf zwei Speicherstellen verteilt werden, ebenso wie
  6185. beim 4004 und HMCS400.  Der Wertebereich f"ur Integers entspricht
  6186. der Wortbreite des jeweiligen Prozessors im jeweiligen Segment.
  6187. Das bedeutet, da"s \tty{DATA} beim 320C3x/C4x die Funktion von
  6188. \tty{WORD} mit einschlie"st (die von \tty{SINGLE} "ubrigens auch,
  6189. wenn \asname{} das Argument als Gleitkommazahl erkennt).
  6190.  
  6191. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6192.  
  6193. \subsection{ZERO}
  6194. \ttindex{ZERO}
  6195.  
  6196. {\em G"ultigkeit: PIC, CP-1600}
  6197.  
  6198. Dieser Befehl legt einen durch den Parameter spezifizierte
  6199. Zahl von Nullworten (=NOP bei PIC) im Speicher ab.
  6200.  
  6201. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6202.  
  6203. \subsection{FB und FW}
  6204. \ttindex{FB}\ttindex{FW}
  6205.  
  6206. {\em G"ultigkeit: COP4/8}
  6207.  
  6208. Mit diesen Befehlen kann ein gr"o"serer Block von Speicher (dessen L"ange
  6209. in Bytes bzw. Worten der erste Parameter angibt) mit einer Byte- bzw.
  6210. Wortkonstanten gef"ullt werden, die durch den zweiten Parameter angegeben
  6211. wird.
  6212.  
  6213. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6214.  
  6215. \subsection{ASCII, ASCIC und ASCIZ}
  6216. \ttindex{ASCII}\ttindex{ASCIC}\ttindex{ASCIZ}
  6217.  
  6218. {\em\begin{tabbing}
  6219. G"ultigkeit: \= ST6, PDP-11, VAX, IMP-16, IPC-16 ({\tt ASCII}) \\
  6220.             \> ST6, PDP-11, VAX ({\tt ASCIZ}) \\
  6221.             \> PDP-11, VAX ({\tt ASCIC}) \\
  6222. \end{tabbing}}
  6223.  
  6224. Mit diesen Befehlen k"onnen Stringkonstanten im Speicher
  6225. abgelegt werden.  W"ahrend ASCII nur die reinen Daten im Speicher
  6226. ablegt, versieht \tty{ASCIZ} automatisch \ii{jeden} angegebenen String
  6227. mit einem NUL-Zeichen am Ende, und \tty{ASCIC} stellt ihm ein L"angen-
  6228. Byte voran.
  6229.  
  6230. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6231.  
  6232. \subsection{STRING und RSTRING}
  6233. \ttindex{STRING}\ttindex{RSTRING}
  6234.  
  6235. {\em G"ultigkeit: 320C2(0)x, 320C5x}
  6236.  
  6237. Diese Anweisungen funktionieren analog zu {\tt DATA}, jedoch werden
  6238. hier Integer-Ausdr"ucke grunds"atzlich als {\it Bytes} mit einem
  6239. entsprechend eingeschr"ankten Wertebereich betrachtet, wodurch es
  6240. m"oglich wird, die Zahlen zusammen mit anderen Zahlen oder Zeichen
  6241. paarweise in Worte zu verpacken.
  6242. Die beiden Befehle unterscheiden sich lediglich in der Reihenfolge
  6243. der Bytes in einem Wort: Bei {\tt STRING} wird zuerst das
  6244. obere und danach das untere gef"ullt, bei {\tt RSTRING} ist es
  6245. genau umgekehrt.
  6246.  
  6247. Ein eventuell vor dem Befehl stehendes Label wird wieder als
  6248. untypisiert gespeichert.  Der Sinn dieser Ma"snahme ist im
  6249. entsprechenden Kapitel mit den prozessorspezifischen Befehlen
  6250. erl"autert.
  6251.  
  6252. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6253.  
  6254. \subsection{PACKED}
  6255. \ttindex{PACKED}
  6256.  
  6257. {\em G"ultigkeit: PDP-11, VAX}
  6258.  
  6259. Mit diesem Befehl werden Zahlen im gepackten dezimalen Format
  6260. (zwei Stellen pro Byte) im Speicher abgelegt.  Als Argument sind
  6261. entweder eine (vorzeichenbehaftete) Ganzzahl oder ein String
  6262. erlaubt, wobei letzterer nat"urlich nur dezimale Ziffern und optional
  6263. ein Vorzeichen am Anfang enthalten darf.  Die Maximalzahl Stellen
  6264. ist 31, und das Vorzeichen wird als letzte Stelle angef"ugt, wobei
  6265. 12 und 13 f"ur Plus bzw. Minus stehen.  Ist die Gesamtzahl aus
  6266. Stellen und Vorzeichen ungerade, wird vorne eine Null eingef"ugt.
  6267.  
  6268. Optional darf als zweites Argument des Name eines Symbols angegeben
  6269. werden, in dem die Anzahl Stellen hinterlegt wird.  In dieser
  6270. Stellenzahl sind weder Vorzeichen noch eine automatisch eingef"ugte
  6271. Null zu Beginn enthalten.
  6272.  
  6273. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6274.  
  6275. \subsection{RADIX50}
  6276. \ttindex{RADIX50}
  6277.  
  6278. {\em G"ultigkeit: diverse}
  6279.  
  6280. Mit dieser Anweisung kann ein String im gepackten RADIX50-Format im
  6281. Speicher abgelegt werden.  Diese Darstellung war besonders im DEC-Umfeld
  6282. f"ur Dateinamen g"angig und packt drei Zeichen in ein 16-Bit-Wort.
  6283. {\tt RADIX50} ist keine eingebaute Anweisung, sondern in der Include-
  6284. Datei {\tt radix50.inc} als Makro definiert.
  6285.  
  6286. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6287.  
  6288. \subsection{FCC}
  6289. \ttindex{FCC}
  6290.  
  6291. {\em G"ultigkeit: 6502, 68xx}
  6292.  
  6293. Mit diesem Befehl werden im 65xx/68xx-Modus String-Konstanten abgelegt.
  6294. Beachten Sie jedoch, da"s im Gegensatz zum Originalassembler
  6295. AS11 von Motorola (dessentwegen dieser Befehl existiert, bei \asname{} ist
  6296. diese Funktion im \tty{BYT}-Befehl enthalten), String-Argumente nur in
  6297. G"ansef"u"schen und nicht in Hochkommas oder Schr"agstrichen eingeschlossen
  6298. werden d"urfen!  Ein Wiederholungsfaktor darf analog zu \tty{DC} jedem
  6299. einzelnen Parameter in eckigen Klammern vorangestellt werden.
  6300.  
  6301. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6302.  
  6303. \subsection{TEXT}
  6304.  
  6305. Mit diesem Befehl werden im CP-1600-Modus String-Konstanten gepackt,
  6306. d.h. zwei Zeichen pro Wort, abgelegt.
  6307.  
  6308. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6309.  
  6310. \subsection{DFS oder RMB}
  6311. \ttindex{DFS}\ttindex{RMB}
  6312.  
  6313. {\em G"ultigkeit: 6502, 68xx}
  6314.  
  6315. Dieser Befehl dient im 65xx/68xx-Modus zur Reservierung von
  6316. Speicher, er entspricht \tty{DS.B} beim 68000 oder \tty{DB ?}
  6317. bei Intel.
  6318.  
  6319. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6320.  
  6321. \subsection{BLOCK}
  6322. \ttindex{BLOCK}
  6323.  
  6324. {\em G"ultigkeit: ST6}
  6325.  
  6326. Dito.
  6327.  
  6328. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6329.  
  6330. \subsection{SPACE}
  6331. \ttindex{SPACE}
  6332.  
  6333. {\em G"ultigkeit: i960}
  6334.  
  6335. Dito.
  6336.  
  6337. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6338.  
  6339. \subsection{RES}
  6340. \ttindex{RES}
  6341.  
  6342. {\em G"ultigkeit: PIC, MELPS-4500, HMCS400, 3201x, 320C2(0)x,\\
  6343.     320C5x, AVR, $\mu$PD772x, OLMS-40/50, Padauk, CP-1600,\\
  6344.     PPS-4, 2650}
  6345.  
  6346. Dieser Befehl dient zur Reservierung von Speicher.  Er reserviert
  6347. im Codesegment immer W"orter (10/12/14/16 Bit), im Datensegment bei
  6348. den PICs Bytes, beim 4500er, PPS-4 und OLMS-40/50 Nibbles sowie bei
  6349. TI W"orter.
  6350.  
  6351. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6352.  
  6353. \subsection{BSS}
  6354. \ttindex{BSS}
  6355.  
  6356. {\em G"ultigkeit: 320C2(0)x, 320C3x/C4x/C5x/C6x, MSP}
  6357.  
  6358. \tty{BSS} arbeitet analog zu \tty{RES}, lediglich ein eventuell vor dem
  6359. Befehl stehendes Symbol wird beim 320C2(0)x/5x als untypisiert gespeichert.
  6360. Der Sinn dieser Ma"snahme kann im Kapitel mit den prozessorspezifischen
  6361. Hinweisen nachgelesen werden.
  6362.  
  6363. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6364.  
  6365. \subsection{DSB und DSW}
  6366. \ttindex{DSB}\ttindex{DSW}
  6367.  
  6368. {\em G"ultigkeit: COP4/8}
  6369.  
  6370. Diese beiden Befehle stellen im COP4/8-Modus die zum ASMCOP von National
  6371. kompatible Methode dar, Speicher zu reservieren.  W"ahrend \tty{DSB} nur
  6372. einzelne Bytes freih"alt, reserviert \tty{DSW} W"orter und damit effektiv
  6373. doppelt soviel Bytes wie \tty{DSB}.
  6374.  
  6375. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6376.  
  6377. \subsection{DS16}
  6378. \ttindex{DS16}
  6379.  
  6380. {\em G"ultigkeit: SC144xx}
  6381.  
  6382. Dieser Befehl reserviert Speicher in Schritten von vollst"andigen Worten,
  6383. d.h. 16 Bit.  Er stellt einen Alias zu {\tt DW} dar.
  6384.  
  6385. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6386.  
  6387. \subsection{ALIGN}
  6388. \ttindex{ALIGN}
  6389.  
  6390. {\em G"ultigkeit: alle Prozessoren}
  6391.  
  6392. \tty{ALIGN} mit einem Integerausdruck als Argument erlaubt es, den
  6393. Programmz"ahler auf eine bestimmte Adresse auszurichten.  Die
  6394. Ausrichtung erfolgt dergestalt, da"s der Programmz"ahler so weit
  6395. erh"oht wird, da"s er ein ganzzahliges mehrfaches des Argumentes
  6396. wird.  In seiner Funktion entspricht \tty{ALIGN} also \tty{DS.x 0}
  6397. beim den 680x0ern, nur ist die Ausrichtung noch flexibler.
  6398. \par
  6399. Beispiel:
  6400. \begin{verbatim}
  6401.        align 2
  6402. \end{verbatim}
  6403. macht den Programmz"ahler gerade.  Wird \tty{ALIGN} in dieser Form mit nur
  6404. einem Argument verwendet, ist der Inhalt des dadurch frei bleibenden
  6405. Speicherbereichs nicht definiert.  Alternativ kann als zweites Argument ein
  6406. (Byte-)Wert angegeben werden, mit dem dieser Bereich gef"ullt wird.
  6407.  
  6408. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6409.  
  6410. \subsection{LTORG}
  6411. \ttindex{LTORG}
  6412.  
  6413. {\em G"ultigkeit: SH7x00, IM61x0, IMP-16, IPC-16}
  6414.  
  6415. Da der SH7000-Prozessor seine Register immediate nur mit 8-Bit-Werten
  6416. laden kann, \asname{} dem Programmierer jedoch vorgaukelt, da"s es eine solche
  6417. Einschr"ankung nicht g"abe, mu"s er die dabei entstehenden Konstanten
  6418. irgendwo im Speicher ablegen.  Da es nicht sinnvoll w"are, dies einzeln
  6419. zu tun (wobei jedes Mal Sprungbefehle anfallen w"urden...), werden die
  6420. Literale gesammelt und k"onnen vom Programmierer mit diesem Befehl
  6421. gezielt blockweise (z.B. am Ende eines Unterprogrammes) abgelegt werden.
  6422. Zu den zu beachtenden Details und Fallen sei auf das Kapitel mit den
  6423. SH7000-spezifischen Dingen hingewiesen.
  6424.  
  6425. %%---------------------------------------------------------------------------
  6426.  
  6427. \section{Makrobefehle}
  6428.  
  6429. {\em G"ultigkeit: alle Prozessoren}
  6430.  
  6431. Kommen wir nun zu dem, was einen Makroassembler vom normalen Assembler
  6432. unterscheidet: der M"oglichkeit, Makros zu definieren (ach was ?!).
  6433. \par
  6434. Unter Makros verstehe ich hier erst einmal eine Menge von Anweisungen
  6435. (normal oder Pseudo), die mit bestimmten Befehlen zu einem Block
  6436. zusammengefa"st werden und dann auf bestimmte Weise bearbeitet
  6437. werden k"onnen.  Zur Bearbeitung solcher Bl"ocke kennt der Assembler
  6438. folgende Befehle:
  6439.  
  6440. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6441.  
  6442. \subsection{MACRO}
  6443. \ttindex{MACRO}\ttindex{ENDM}
  6444. \label{SectMacros}
  6445.  
  6446. ist der wohl wichtigste Befehl zur Makroprogrammierung.  Mit der
  6447. Befehlsfolge
  6448. \begin{verbatim}
  6449. <Name>  MACRO   [Parameterliste]
  6450.        <Befehle>
  6451.        ENDM
  6452. \end{verbatim}
  6453. wird das Makro \tty{$<$Name:  $>$} als die eingeschlossene Befehlsfolge
  6454. definiert. Diese Definition alleine erzeugt noch keinen Code!  Daf"ur kann
  6455. fortan die Befehlsfolge einfach durch den Namen abgerufen werden, das Ganze
  6456. stellt also eine Schreiberleichterung dar.  Um die ganze Sache etwas
  6457. n"utzlicher zu machen, kann man der Makrodefinition eine Parameterliste
  6458. mitgeben.
  6459. \par
  6460. W"ahrend der Makroname selber nur den "ublichen Regeln f"ur Symbolnamen
  6461. (\ref{SectSymConv}) gen"ugen mu"s, gilt f"ur die Namen der (kommaseparierten)
  6462. Parameternamen die weitere Einschr"ankung, da"s sie keine Unterstriche
  6463. enthalten d"urfen.  Dies kann durch den Kommandozeilen-Parameter
  6464. \tty{-underscore-macroargs} aufgehoben werden, hat aber Nebenwirkungen
  6465. bei der Expansion von Makros und sollte nur eingesetzt werden, wenn
  6466. unbedingt n"otig.
  6467. \par
  6468. Sowohl Makronamen als auch -parameter sind von einer Umschaltung
  6469. von \asname{} in den case-sensitiven Modus betroffen.
  6470. \par
  6471. Makros sind "ahnlich wie Symbole lokal, d.h. bei Definition in
  6472. einer Sektion sind sie nur in dieser Sektion und ihren Untersektionen
  6473. bekannt.  Dieses Verhalten l"a"st sich aber durch die weiter unten
  6474. beschriebenen Optionen \tty{PUBLIC} und \tty{GLOBAL} in weiten Grenzen
  6475. steuern.
  6476. \par
  6477. F"ur jeden Makroparameter kann ein Defaultwert mit angeh"angtem
  6478. Gleichheitszeichen angegeben werden.  Dieser Wert wird f"ur den
  6479. Parameter eingesetzt, wenn beim Makroaufruf kein Argument f"ur
  6480. diesen Parameter angegeben wird, bzw. wenn ein Positionsargument
  6481. (s.u.) f"ur diesen Parameter leer ist.
  6482. \par
  6483. Neben den eigentlichen Makroparametern k"onnen in der Parameterliste
  6484. auch Steuerparameter enthalten sein, die die Abarbeitung des betroffenen
  6485. Makros beeinflussen; diese Parameter werden von normalen Parametern
  6486. dadurch unterschieden, da"s sie in geschweifte Klammern eingeschlossen
  6487. sind.  Es sind folgende Steuerparameter definiert:
  6488. \begin{itemize}
  6489. \item{\tty{EXPAND/NOEXPAND} : legen fest, ob bei der sp"ateren
  6490.      Verwendung diese Makros der expandierte Code mit angezeigt
  6491.      werden soll.  Default ist der durch den Pseudobefehl
  6492.      \tty{MACEXP\_DFT} festgelegte Wert.}
  6493. \item{\tty{EXPIF/NOEXPIF} : legen fest, ob bei der sp"ateren
  6494.      Verwendung diese Makros Befehle zur bedingten Assemblierung
  6495.      und dadurch ausgeschlossener Code angezeigt werden soll.  Default
  6496.      ist der durch den Pseudobefehl \tty{MACEXP\_DFT} festgelegte Wert.}
  6497. \item{\tty{EXPMACRO/NOEXPMACRO} : legen fest, ob bei der sp"ateren
  6498.      Verwendung diese Makros darin definierte Makros angezeigt werden
  6499.      sollen.  Default ist der durch den Pseudobefehl
  6500.      \tty{MACEXP\_DFT} festgelegte Wert.}
  6501. \item{\tty{EXPREST/NOEXPREST} : legen fest, ob bei der sp"ateren
  6502.      Verwendung Code-Zeilen angezeigt werden sollen, die weder
  6503.      Makro-Definitionen, bedingte Assemblierung noch durch bedingte
  6504.      Assemblierung ausgeschlossene Zeilen sind. Default ist der durch den
  6505.      Pseudobefehl \tty{MACEXP\_DFT} festgelegte Wert.}
  6506. \item{\tty{PUBLIC[:Sektionsname]} : ordnet das Makro nicht der
  6507.      aktuellen, sondern einer ihr "ubergeordneten Sektion zu.
  6508.      Auf diese Weise kann eine Sektion Makros f"ur die ,,Au"senwelt''
  6509.      zur Verf"ugung stellen.  Fehlt eine Sektionsangabe, so wird das
  6510.      Makro v"ollig global, d.h. ist "uberall benutzbar.}
  6511. \item{\tty{GLOBAL[:Sektionsname]} : legt fest, da"s neben diesem
  6512.      Makro noch ein weiteres Makro abgelegt werden soll, das zwar
  6513.      den gleichen Inhalt hat, dessen Name aber zus"atzlich mit dem
  6514.      Namen der Sektion versehen ist, in der es definiert wurde und
  6515.      das der spezifizierten Sektion zugeordnet werden soll.  Bei
  6516.      dieser mu"s es sich um eine Obersektion zu der aktuellen Sektion
  6517.      handeln; fehlt die Angabe, so wird das zus"atzliche Makro
  6518.      global sichtbar.  Wird z.B. ein Makro \tty{A} in der Sektion \tty{B}
  6519.      definiert, die wiederum eine Untersektion der Sektion \tty{C} ist,
  6520.      so w"urde neben z.B. dem Makro A ein weiteres globales mit dem
  6521.      Namen \tty{C\_B\_A} erzeugt.  W"urde dagegen \tty{C} als Zielsektion
  6522.      angegeben, so w"urde das Makro \tty{B\_A} hei"sen und der Sektion
  6523.      \tty{C} zugeordnet.  Diese Option ist defaultm"a"sig ausgeschaltet und
  6524.      hat auch nur einen Effekt, falls sie innerhalb einer Sektion
  6525.      benutzt wird.  Das lokal bekannte Originalmakro wird von ihr
  6526.      nicht beeinflu"st.}
  6527. \item{\tty{EXPORT/NOEXPORT} : legen fest, ob die Definition dieses
  6528.      Makros in einer getrennten Datei abgelegt werden soll, falls
  6529.      die Kommandozeilenoption \tty{-M} gegeben wurde.  Auf diese
  6530.      Weise k"onnen einzelne Definitionen ,,privater'' Makros selektiv
  6531.      ausgeblendet werden.  Der Default ist FALSE, d.h. die Definition
  6532.      wird nicht in der Datei abgelegt.  Ist zus"atzlich die
  6533.      \tty{GLOBAL}-Option gegeben worden, so wird das Makro mit dem
  6534.      modifizierten Namen abgelegt.}
  6535. \item{\tty{INTLABEL/NOINTLABEL} : legen fest, ob ein in der Zeile mit
  6536.      dem Makroaufruf definiertes Label innerhalb des Rumpfes als
  6537.      zus"atzlicher Parameter verwendet werden soll, als einfach
  6538.      nur die Adresse dieser Zeile zu 'labeln'.}
  6539. \item{\tty{GLOBALSYMBOLS/NOGLOBALSYMBOLS} : legt fest, ob im
  6540.      Makro definierte Labels lokal zu diesem Makro sein sollen
  6541.      oder auch au"serhalb des Makros verf"ugbar sein sollen.
  6542.      Der Default ist, da"s Labels lokal sind, weil mehrfache
  6543.      Benutzung eines Makros ansonsten schwierig w"are.}
  6544. \end{itemize}
  6545. Diese eben beschriebenen Steuerparameter werden von \asname{} aus der
  6546. Parameterliste ausgefiltert, haben also keine weitere Wirkung in
  6547. der folgenden Verarbeitung und Benutzung.
  6548. \par
  6549. Beim Aufruf eines Makros werden die beim Aufruf angegebenen
  6550. Parameternamen "uberall textuell im Befehlsblock eingesetzt und der
  6551. sich so ergebene Assemblercode wird normal assembliert.  Sollten
  6552. beim Aufruf zu wenige Parameter angegeben werden, werden Nullstrings
  6553. eingef"ugt.  Wichtig ist zu wissen, da"s bei der Makroexpansion keine
  6554. R"ucksicht auf eventuell in der Zeile enthaltene Stringkonstanten
  6555. genommen wird.  Zu diesem Detail gilt die alte IBM-Regel:
  6556. \begin{quote}
  6557. \ii{It's not a bug, it's a feature!}
  6558. \end {quote}
  6559. Diese L"ucke kann man bewu"st ausnutzen, um Parameter mittels
  6560. Stringvergleichen abzupr"ufen.  So kann man auf folgende Weise
  6561. z.B. pr"ufen, wie ein Makroparameter aussieht:
  6562. \begin{verbatim}
  6563. mul     MACRO   para,parb
  6564.        IF      UpString("PARA")<>"A"
  6565.         MOV    a,para
  6566.        ENDIF
  6567.        IF      UpString("PARB")<>"B"
  6568.         MOV    b,parb
  6569.        ENDIF
  6570.        !mul     ab
  6571.        ENDM
  6572. \end{verbatim}
  6573. Wichtig ist bei obigem Beispiel, da"s der Assembler alle
  6574. Parameternamen im case-sensitiven Modus in Gro"sbuchstaben
  6575. umsetzt, in Strings aber nie eine Umwandlung in Gro"sbuchstaben
  6576. erfolgt. Die Makroparameternamen m"ussen in den Stringkonstanten
  6577. daher gro"s geschrieben werden.
  6578. \par
  6579. Des weiteren wird die Parameter-Ersetzung davon beeinflusst, ob
  6580. Unterstriche im Parameternamen erlaubt sind oder nicht.  Falls
  6581. nicht --- was der Default ist --- wirken Unterstriche auch
  6582. als 'Begrenzungszeichen', um Parameternamen im Makrorumpf zu
  6583. erkennen.  Im Default w"urde also im folgenden Beispiel
  6584. \begin{verbatim}
  6585. setled  macro led,value
  6586.        out   led,value
  6587.        ld    led_shadow,value
  6588.        endm
  6589. \end{verbatim}
  6590. der Parameter 'led' in beiden Zeilen ersetzt, mit dem Kommandozeilen-Schalter
  6591. \tty{-underscore-macroargs} jedoch nur in der ersten.  Diverse
  6592. der mitgelieferten Include-Dateien setzen das Default-Verhalten
  6593. voraus, weshalb dieser Schalter nur wenn unbedingt n"otig genutzt
  6594. werden sollte.
  6595. \par
  6596. Argumente an ein Makro k"onnen in zwei Formen angegeben werden:
  6597. als {\em Positionsargumente} oder als {\em
  6598. Schl"usselwortargumente}.
  6599. \par
  6600. Bei Positionsargumenten ergibt sich
  6601. die Zuordnung von Argumenten zu Makro-Parametern einfach durch
  6602. ihre Position in der Aufrufliste, d.h. das erste Argument wird dem
  6603. ersten Parameter zugeordnet, das zweite Argument dem zweiten
  6604. Parameter usw..  Werden weniger Argumente angegeben als das Makro
  6605. Parameter hat, werden eventuell definierte Defaultwerte oder ein
  6606. Leerstring eingesetzt.  Gleiches gilt auch f"ur leere Argumente.
  6607. \par
  6608. Schl"usselwortargumente geben jedoch explizit an, f"ur welchen
  6609. Makro-Parameter sie gelten, indem der Parametername dem Wert
  6610. vorangestellt wird, z.B. so:
  6611. \begin{verbatim}
  6612.       mul  para=r0,parb=r1
  6613. \end{verbatim}
  6614. Wiederum wird f"ur nicht definierte Parameter ein eventuell
  6615. vorhandener Default oder ein Leerstring eingesetzt.
  6616. \par
  6617. Im Unterschied zu Positionsargumenten ist es mit
  6618. Schl"usselwortargumenten auch m"oglich, einem Parameter einen
  6619. Leerstring zuzuweisen, der einen nicht-leeren Default-Wert hat.
  6620. \par
  6621. Positions- und Schl"usselwortargumente d"urfen auch in einem
  6622. Aufruf gemischt werden, jedoch d"urfen ab dem ersten
  6623. Schl"usselwortargument keine Positionsargumente mehr verwendet
  6624. werden.
  6625. \par
  6626. F"ur die Makroparameter gelten die gleichen Konventionen wie bei
  6627. normalen Symbolen, mit der Ausnahme, da"s hier nur Buchstaben
  6628. und Ziffern zugelassen sind, also weder Punkte noch
  6629. Unterstriche. Diese Einschr"ankung hat ihren Grund in einem
  6630. verstecktem Feature: Der Unterstrich erlaubt es, einzelne
  6631. Makroparameternamen zu einem Symbol zusammenzuketten, z.B. in
  6632. folgendem Beispiel:
  6633. \begin{verbatim}
  6634. concat  MACRO   part1,part2
  6635.        CALL    part1_part2
  6636.        ENDM
  6637. \end{verbatim}
  6638. Der Aufruf
  6639. \begin{verbatim}
  6640.        concat  Modul,Funktion
  6641. \end{verbatim}
  6642. ergibt also
  6643. \begin{verbatim}
  6644.        CALL    Modul_Funktion
  6645. \end{verbatim}
  6646. \par
  6647. Neben den am Makro selber angegebenen Parametern existieren vier weitere
  6648. 'implizite' Parameter, die immer vorhanden sind und daher nicht als eigene
  6649. Makroparameter verwendet werden sollten:
  6650. \begin{itemize}
  6651. \item{{\tt ATTRIBUTE} bezeichnet bei Architekturen, die Attribute f"ur
  6652.      Prozessorbefehle zulassen, das bei einem Makroaufruf angeh"angte
  6653.      Argument.  F"ur ein Beispiel siehe z.B. unten!}
  6654. \item{{\tt ALLARGS} bezeichnet eine kommaseparierte Liste aller
  6655.      Makroargumente, z.B., um sie an eine {\tt IRP}-Anweisung
  6656.      weiterzureichen.}
  6657. \item{{\tt ARGCOUNT} bezeichnet die tat"achlich "ubergebene Anzahl der
  6658.      an das Makro "ubergebenen Argumente.  Zu beachten ist allerdings,
  6659.      da"s diese Zahl niemals geringer als die Zahl der formalen Parameter
  6660.      ist, da \asname{} fehlende Argumente mit Leerstrings auff"ullt!}
  6661. \item{{\tt \_\_LABEL\_\_} bezeichnet das Label, das in der das Makro aufrufenden
  6662.      Zeile stand.  Diese Ersetzung findet nur statt, wenn f"ur dieses
  6663.      Makro die {\tt INTLABEL}-Option gesetzt wurde!}
  6664. \end{itemize}
  6665. {\bf WICHTIG:} Die Namen dieser impliziten Parameter sind auch
  6666. case-insensitiv, wenn \asname{} insgesamt angewiesen wurde, case-sensitiv
  6667. zu arbeiten!
  6668.  
  6669. Der Zweck, ein Label 'intern' im Makro verwenden zu k"onnen, ist sicher
  6670. nicht unmittelbar einleuchtend.  Den einen oder anderen Fall mag es ja
  6671. geben, in dem es sinnvoll ist, den Einsprungpunkt in ein Makro irgendwo
  6672. in seinen Rumpf zu verschieben.  Der wichtigste Anwendungsfall sind aber
  6673. TI-Signalprozessoren, die eine Parallelisierung von Befehlen durch einen
  6674. doppelten senkrechten Strich in der Label-Spalte kennzeichnen, etwa so:
  6675. \begin{verbatim}
  6676.    instr1
  6677. ||  instr2
  6678. \end{verbatim}
  6679. (da die beiden Instruktionen im Maschinencode in ein Wort verschmelzen,
  6680. kann man die zweite Instruktion "ubrigens gar nicht separat anspringen -
  6681. man verliert also durch das Belegen der Label-Position nichts).  Das
  6682. Problem ist aber, da"s einige 'Bequemlichkeits-Befehle' durch Makros
  6683. realisiert werden.  Ein vor das Makro geschriebenes
  6684. Parallelisierungssymbol w"urde normalerweise dem Makro selber zugeordnet,
  6685. {\it nicht dem ersten Befehl im Makro selber}.  Aber mit diesem Trick
  6686. funktioniert's:
  6687. \begin{verbatim}
  6688. myinstr    macro {INTLABEL}
  6689. __LABEL__  instr2
  6690.           endm
  6691.  
  6692.           instr1
  6693. ||         myinstr
  6694. \end{verbatim}
  6695. Das Ergebnis nach der Expansion von {\tt myinstr} ist identisch zu dem
  6696. vorherigen Beispiel ohne Makro.
  6697.  
  6698. Rekursion von Makros, also das wiederholte Aufrufen eines Makros innerhalb
  6699. seines Rumpfes oder indirekt "uber andere von ihm aufgerufene Makros ist
  6700. vollkommen legal.  Wie bei jeder Rekusion mu"s man dabei nat"urlich
  6701. sicherstellen, da"s sie irgendwann ein Ende findet.  F"ur den Fall, da"s
  6702. man dies vergessen hat, f"uhrt \asname{} in jedem definierten Makro einen Z"ahler
  6703. mit, der bei Beginn einer Makroexpansion inkrementiert und an deren Ende
  6704. wieder dekrementiert wird.  Bei rekursiven Aufrufen eines Makros erreicht
  6705. dieser Z"ahler also immer h"ohere Werte, und bei einem per {\tt NESTMAX}
  6706. einstellbaren Wert bricht \asname{} ab.  Vorsicht, wenn man diese Bremse
  6707. abschaltet: der Speicherbedarf auf dem Heap kann so beliebig steigen und
  6708. selbst ein Unix-System in die Knie zwingen...
  6709. \par
  6710. Um alle Klarheiten auszur"aumen, ein einfaches Beispiel:
  6711. Ein an ,,Intel-Syntax'' gew"ohnter Programmierer m"ochte diex Befehle \tty{PUSH/POP}
  6712. unbedingt auch auf dem 68000 haben.  Er l"ost das
  6713. folgenderma"sen:
  6714. \begin{verbatim}
  6715. push    MACRO   op
  6716.        MOVE.ATTRIBUTE op,-(sp)
  6717.        ENDM
  6718.  
  6719. pop     MACRO   op
  6720.        MOVE.ATTRIBUTE (sp)+,op
  6721.        ENDM
  6722. \end{verbatim}
  6723. Schreibt man nun im Code
  6724. \begin{verbatim}
  6725.        push    d0
  6726.        pop.l   a2        ,
  6727. \end{verbatim}
  6728. so wird daraus
  6729. \begin{verbatim}
  6730.        MOVE.   d0,-(sp)
  6731.        MOVE.L  (sp)+,a2
  6732. \end{verbatim}
  6733. Eine Makrodefinition darf nicht "uber Include-Datei-Grenzen hinausgehen.
  6734. \par
  6735. In Makror"umpfen definierte Labels werden immer als lokal betrachtet,
  6736. au"ser bei der Definition des Makros wurde die
  6737. \tty{GLOBALSYMBOLS}-Option verwendet.  Ist es aus irgendwelchen Gr"unden
  6738. erforderlich, ein einzelnes Label in einem Makro global zu
  6739. machen, das ansonsten lokale Labels benutzt, so kann man es mit
  6740. \tty{LABEL} definieren, dessen Anwendung (wie bei \tty{BIT,SFR}...)
  6741. immer globale Symbole ergibt :
  6742. \begin{verbatim}
  6743. <Name>  LABEL   *
  6744. \end{verbatim}
  6745. Da der Assembler beim Parsing einer Zeile zuerst die Makroliste und
  6746. danach die Prozessorbefehle abklappert, lassen sich auch Prozessorbefehle
  6747. neu definieren.  Die Definition sollte dann aber vor der ersten Benutzung
  6748. des Befehles durchgef"uhrt werden, um Phasenfehler wie im folgenden
  6749. Beispiel zu vermeiden:
  6750. \begin{verbatim}
  6751.        BSR     ziel
  6752.  
  6753. bsr     MACRO   target
  6754.        JSR     ziel
  6755.        ENDM
  6756.  
  6757.        BSR     ziel
  6758. \end{verbatim}
  6759. Im ersten Pass ist bei der Assemblierung des \tty{BSR}-Befehles das Makro
  6760. noch nicht bekannt, es wird ein 4 Byte langer Befehl erzeugt.  Im
  6761. zweiten Pass jedoch steht die Makrodefinition sofort (aus dem ersten
  6762. Pass) zur Verf"ugung, es wird also ein 6 Byte langer \tty{JSR} kodiert.
  6763. Infolgedessen sind alle darauffolgenden Labels um zwei zu niedrig,
  6764. bei allen weiteren Labels sind Phasenfehler die Folge, und ein weiterer
  6765. Pass ist erforderlich.
  6766. \par
  6767. Da durch die Definition eines Makros ein gleichnamiger Maschinen- oder
  6768. Pseudobefehl nicht mehr zugreifbar ist, gibt es eine Hintert"ur, die
  6769. Originalbedeutung zu erreichen: Stellt man dem Mnemonic ein \tty{!} voran,
  6770. so wird das Durchsuchen der Makroliste unterdr"uckt.  Das kann
  6771. beispielsweise n"utzlich sein, um Befehle in ihrer M"achtigkeit zu
  6772. erweitern, z.B. die Schiebebefehle beim TLCS-90:
  6773. \begin{verbatim}
  6774. srl     macro   op,n      ; Schieben um n Stellen
  6775.        rept    n         ; n einfache Befehle
  6776.         !srl   op
  6777.        endm
  6778.        endm
  6779. \end{verbatim}
  6780. Fortan hat der \tty{SRL}-Befehl einen weiteren Parameter...
  6781.  
  6782. \subsubsection{Expansion im Listing}
  6783.  
  6784. Wird ein Makro im Quellcode aufgerufen, wird der durch dieses Makro definierte
  6785. Quellcode, inklusiver eingesetzter Parameter, an dieser Stelle im Listing
  6786. expandiert.  Das kann das Listing stark aufbl"ahen und schwerer lesbar
  6787. machen.  Es ist daher m"oglich, diese Expansion ganz oder teilweise zu
  6788. unterdr"ucken.  Generell teilt \asname{} die in einem Makrorumpf enthaltenen
  6789. Quelltext-Zeilen in drei Klassen ein:
  6790. \begin{itemize}
  6791. \item{Darin enthaltene Makrodefinitionen, d.h. das Makro wird benutzt, um
  6792.      seinerseits weitere Makros zu definieren, oder es enth"alt \tty{REPT/
  6793.      IRP/IRPC/WHILE}-Bl"ocke.}
  6794. \item{Befehle zur bedingten Assemblierung plus Zeilen, die aufgrund
  6795.      solcher Anweisungen {\it nicht} assembliert werden.  Da bedingte
  6796.      Assemblierung von Makro-Parametern abh"angig sein darf, kann diese
  6797.      Untermenge ebenfalls davon abh"angen.}
  6798. \item{Alle restlichen Zeilen, die nicht unter die beiden ersten Klassen
  6799.      fallen.}
  6800. \end{itemize}
  6801. F"ur jedes Makro kann einzeln festgelegt werden, welche Teile im Listing
  6802. auftauchen oder nicht auftauchen sollen.  Vorgabewert bei der Definition
  6803. eines Makros ist dabei die zuletzt mit dem Befehl \tty{MACEXP\_DFT}
  6804. (\ref{MACEXPDFT}) vorgegebene Menge.  Wird bei der Definition eines
  6805. Makros eine der Direktiven \tty{EXPAND/NOEXPAND}, \tty{EXPIF/NOEXPIF},
  6806. \tty{EXPMACRO/NOEXPMACRO} oder \tty{EXPREST/NOEXPREST} gegeben, so wirken
  6807. diese {\it zus"atzlich} und mit h"oherer Priorit"at.  Ist z.B. die Expansion
  6808. global komplett ausgeschaltet (\tty{MACEXP\_DFT OFF}), so bewirkt das
  6809. Hinzuf"ugen von \tty{EXPREST}, da"s bei der Benutzung dieses Makro nur
  6810. die Zeilen im Listing angezeigt werden, die nach Auswertung bedingter
  6811. Assemblierung verblieben sind und auch keine Makrodefinition selber sind.
  6812.  
  6813. Daraus ergibt sich, da"s eine "Anderung der Untermenge per \tty{MACEXP\_DFT}
  6814. keine Auswirkungen mehr auf Makros hat, die {\it vor} dieser Anweisung
  6815. {\it definiert} wurden.  Im Listing f"uhrt der Abschnitt mit definierten Makros
  6816. f"ur jedes Makro auf, welche Direktiven in der Summe f"ur dieses Makro
  6817. gelten.  Die in geschweiften Klammern aufgef"uhrte Liste ist dabei soweit
  6818. gek"urzt, da"s f"ur jede Klasse nur die letztg"ultige Direktive aufgef"uhrt
  6819. wird.  Ein per \tty{MACEXP\_DFT} gegebenes \tty{NOIF} taucht dort also
  6820. nicht mehr auf, falls speziell f"ur dieses Makro die Direktive \tty{EXPIF}
  6821. gegeben wurde.
  6822.  
  6823. In Einzelf"allen kann es sinnvoll sein, die f"ur ein Makro definierten
  6824. Expansionsregeln zu "ubersteuern, egal ob diese per \tty{MACEXP\_DFT} oder
  6825. Direktiven gesetzt wurden.  Dazu dient der Befehl \tty{MACEXP\_OVR}
  6826. (\ref{MACEXPOVR}), der auf in der Folge {\it expandierte} Makros wirkt.  Auch
  6827. bei diesem Befehl gilt, da"s damit gegebene Direktiven zus"atzlich zu
  6828. denen in einem Makro hinterlegten und mit h"oherer Priorit"at wirken.  Ein
  6829. \tty{MACEXP\_OVR} ohne jegliche Argumente schaltet so einen ''Override''
  6830. wieder ab.
  6831.  
  6832. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6833.  
  6834. \subsection{IRP}
  6835. \ttindex{IRP}
  6836.  
  6837. ist die eine vereinfachte Form von Makrodefinitionen f"ur den Fall,
  6838. da"s eine Befehlsfolge einmal auf mehrere Operanden angewendet werden
  6839. soll und danach nicht mehr gebraucht wird.  \tty{IRP} ben"otigt als ersten
  6840. Parameter ein Symbol f"ur den Operanden, und danach eine (fast)
  6841. beliebige Menge von Parametern, die nacheinander in den Befehlsblock
  6842. eingesetzt werden.  Um eine Menge von Registern auf den Stack zu
  6843. schieben, kann man z.B. schreiben
  6844. \begin{verbatim}
  6845.        IRP     op, acc,b,dpl,dph
  6846.        PUSH    op
  6847.        ENDM
  6848. \end{verbatim}
  6849. was in folgendem resultiert:
  6850. \begin{verbatim}
  6851.        PUSH    acc
  6852.        PUSH    b
  6853.        PUSH    dpl
  6854.        PUSH    dph
  6855. \end{verbatim}
  6856. Die Argumentliste darf analog zu einer Makro-Definition die folgenden
  6857. Steueranweisungen (durch geschweifte Klammern als solche gekennzeichnet)
  6858. enthalten:
  6859. \begin{itemize}
  6860. \item{\tty{GLOBALSYMBOLS} bzw. \tty{NOGLOBALSYMBOLS}, um zu steuern,
  6861.      ob benutzte Labels f"ur jeden Durchgang automatisch lokal
  6862.      sind oder nicht.}
  6863. \item{\tty{EXPAND} bzw. \tty{NOEXPAND}}
  6864. \item{\tty{EXPIF} bzw. \tty{NOEXPIF}}
  6865. \item{\tty{EXPMACRO} bzw. \tty{NOEXPMACRO}}
  6866. \item{\tty{EXPREST} bzw. \tty{NOEXPREST}}
  6867. \end{itemize}
  6868.  
  6869. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6870.  
  6871. \subsection{IRPC}
  6872. \ttindex{IRPC}
  6873.  
  6874. \tty{IRPC} ist eine Variante von \tty{IRP}, bei der das erste Argument in
  6875. den bis \tty{ENDM} folgenden Zeilen nicht sukzessiv durch die weiteren
  6876. Parameter, sondern durch die Zeichen eines Strings ersetzt wird.  Einen
  6877. String kann man z.B. also auch ganz umst"andlich so im Speicher ablegen:
  6878. \begin{verbatim}
  6879.        irpc    char,"Hello World"
  6880.        db      'CHAR'
  6881.        endm
  6882. \end{verbatim}
  6883. \bb{ACHTUNG!} Wie das Beispiel schon zeigt, setzt \tty{IRPC} nur das
  6884. Zeichen selber ein, da"s daraus ein g"ultiger Ausdruck entsteht (also hier
  6885. durch die Hochkommas, inklusive des Details, da"s hier keine automatische
  6886. Umwandlung in Gro"sbuchstaben vorgenommen wird), mu"s man selber
  6887. sicherstellen.
  6888.  
  6889. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6890.  
  6891. \subsection{REPT}
  6892. \ttindex{REPT}
  6893.  
  6894. ist die einfachste Form der Makrobenutzung.  Der im Rumpf angegebene
  6895. Code wird einfach sooft assembliert, wie der Integerparameter von
  6896. \tty{REPT} angibt.  Dieser Befehl wird h"aufig in kleinen Schleifen anstelle
  6897. einer programmierten Schleife verwendet, um den Schleifenoverhead zu
  6898. sparen.
  6899. \par
  6900. Der Vollst"andigkeit halber ein Beispiel:
  6901. \begin{verbatim}
  6902.        REPT    3
  6903.        RR      a
  6904.        ENDM
  6905. \end{verbatim}
  6906. rotiert den Akku um 3 Stellen nach rechts.
  6907. \par
  6908. An Steueranweisungen sind die gleichen wie f"ur \tty{IRP} erlaubt.
  6909.  
  6910. Ist das Argument von \tty{REPT} kleiner oder gleich Null, so wird
  6911. "uberhaupt keine Expansion durchgef"uhrt.  Dies ist ein Unterschied
  6912. zu fr"uheren Versionen von \asname{}, die hier etwas ,,schlampig'' waren
  6913. und immer mindestens eine Expansion ausf"uhrten.
  6914.  
  6915. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6916.  
  6917. \subsection{WHILE}
  6918. \ttindex{WHILE}
  6919.  
  6920. \tty{WHILE} arbeitet analog zu \tty{REPT}, allerdings tritt an die
  6921. Stelle einer festen Anzahl als Argument ein boolescher Ausdruck, und
  6922. der zwischen \tty{WHILE} und \tty{ENDM} eingeschlossene Code wird sooft
  6923. assenbliert, bis der Ausdruck logisch falsch wird.  Im Extremfall kann
  6924. dies bedeuten, da"s der Code "uberhaupt nicht assembliert wird, falls die
  6925. Bedingung bereits beim Eintritt in das Konstrukt falsch ist.  Andererseits
  6926. kann es nat"urlich auch passieren, da"s die Bedingung immer wahr bleibt,
  6927. und \asname{} l"auft bis an das Ende aller Tage...hier sollte man also etwas
  6928. Umsicht walten lassen, d.h. im Rumpf mu"s eine Anweisung stehen, die die
  6929. Bedingung auch beeinflu"st, z.B. so:
  6930. \begin{verbatim}
  6931. cnt     set     1
  6932. sq      set     cnt*cnt
  6933.        while   sq<=1000
  6934.         dc.l    sq
  6935. cnt      set     cnt+1
  6936. sq       set     cnt*cnt
  6937.        endm
  6938. \end{verbatim}
  6939. An Steueranweisungen sind die gleichen wie f"ur \tty{IRP} und
  6940. \tty{REPT} erlaubt.
  6941. \par
  6942. Dieses Beispiel legt alle Quadratzahlen bis 1000 im Speicher ab.
  6943. \par
  6944. Ein unsch"ones Detail bei \tty{WHILE} ist im Augenblick leider noch,
  6945. da"s am Ende der Expansion eine zus"atzliche Leerzeile, die im Quellrumpf
  6946. nicht vorhanden war, eingef"ugt wird.  Dies ist ein ,,Dreckeffekt'',
  6947. der auf einer Schw"ache des Makroprozessors beruht und leider nicht so
  6948. einfach zu beheben ist.  Hoffentlich st"ort es nicht allzusehr....
  6949.  
  6950. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6951.  
  6952. \subsection{EXITM}
  6953. \ttindex{EXITM}
  6954.  
  6955. \tty{EXITM} stellt einen Weg dar, um eine Makroexpansion oder einen der
  6956. Befehle \tty{REPT}, \tty{IRP} oder \tty{WHILE} vorzeitig abzubrechen.
  6957. Eine solche M"oglichkeit hilft zum Beispiel, umfangreichere Klammerungen
  6958. mit \tty{IF-ENDIF}-Sequenzen in Makros "ubersichtlicher zu gestalten.
  6959. Sinnvollerweise ist ein \tty{EXITM} aber selber auch immer bedingt, was zu
  6960. einem wichtigen Detail f"uhrt: Der Stack, der "uber momentan offene
  6961. \tty{IF}- oder \tty{SWITCH}-Konstrukte Buch f"uhrt, wird auf den Stand vor
  6962. Beginn der Makroexpansion zur"uck gesetzt.  Dies ist f"ur bedingte
  6963. \tty{EXITM}'s zwingend notwendig, da das den \tty{EXITM}-Befehl in
  6964. irgendeiner Form einschlie"sende \tty{ENDIF} oder \tty{ENDCASE} nicht mehr
  6965. erreicht wird und \asname{} ohne einen solchen Trick eine Fehlermeldung erzeugen
  6966. w"urde.  Weiterhin ist es f"ur verschachtelte Makrokonstruktionen
  6967. wichtig, zu beachten, da"s \tty{EXITM} immer nur das momentan innerste
  6968. Konstrukt abbricht!  Wer aus seiner geschachtelten Konstruktion
  6969. vollst"andig ,,ausbrechen'' will, mu"s auf den h"oheren Ebenen ebenfalls
  6970. \tty{EXITM}'s vorsehen!
  6971.  
  6972. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6973.  
  6974. \subsection{SHIFT}
  6975. \ttindex{SHIFT}\ttindex{.SHIFT}\ttindex{SHFT}
  6976.  
  6977. {\tt SHIFT} ist ein Mittel, um Makros mit variablen Argumentlisten
  6978. abzuarbeiten: Es verwirft den ersten Parameter, so da"s der zweite
  6979. Parameter seinen Platz einnimmt usw.  Auf diese Weise k"onnte man
  6980. sich durch eine variable Argumentliste durcharbeiten...wenn man es richtig
  6981. macht.  Folgendes funktioniert zum Beispiel {\em nicht}...
  6982. \begin{verbatim}
  6983. pushlist  macro reg
  6984.          rept  ARGCOUNT
  6985.          push  reg
  6986.          shift
  6987.          endm
  6988.          endm
  6989. \end{verbatim}
  6990. ...weil das Makro {\em einmal} expandiert wird, seine Ausgabe von {\tt
  6991. REPT} aufgenommen und dann n-fach ausgef"uhrt wird.  Das erste Argument
  6992. wird also n-fach gesichert...besser geht es schon so:
  6993. \begin{verbatim}
  6994. pushlist  macro reg
  6995.          if      "REG"<>""
  6996.           push    reg
  6997.           shift
  6998.           pushlist ALLARGS
  6999.          endif
  7000.          endm
  7001. \end{verbatim}
  7002. Also eine Rekursion, in der pro Schritt die Argumentliste ({\tt ALLARGS})
  7003. um eins verk"urzt wird.  Der wichtige Trick ist, da"s jedes Mal eine neue
  7004. Expansion gestartet wird...
  7005.  
  7006. Auf Plattformen, bei denen {\tt SHIFT} bereits eine Maschineninstruktion ist,
  7007. kann stattdessen {\tt SHFT} geschrieben werden, oder man spricht explizit
  7008. die Pseudoinstruktion durch einen vorangestellten Punkt (\tty{.SHIFT} anstelle
  7009. \tty{SHIFT}) an.
  7010.  
  7011. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7012.  
  7013. \subsection{MAXNEST}
  7014. \ttindex{MAXNEST}
  7015.  
  7016. Mit {\tt MAXNEST} kann man einstellen, wie oft ein Makro maximal rekursiv
  7017. aufgerufen werden kann, bevor \asname{} mit einer Fehlermeldung abbricht.  Dies
  7018. darf ein beliebiger ganzer, positiver Wert sein, wobei der Sonderwert 0
  7019. diese Sicherheitsbremse komplett abschaltet (vorsicht damit...).  Der
  7020. Vorgabewert f"ur die maximale Verschachtelungstiefe ist 256; die
  7021. momentane Einstellung kann aus einer gleichnamigen Variablen gelesen
  7022. werden.
  7023.  
  7024. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7025.  
  7026. \subsection{FUNCTION}
  7027. \ttindex{FUNCTION}
  7028. \label{SectFUNCTION}
  7029.  
  7030. \tty{FUNCTION} ist zwar kein Makrobefehl im engeren Sinne, da
  7031. hierbei aber "ahnliche Mechanismen wie bei Makroersetzungen
  7032. angewendet werden, soll er hier beschrieben werden.
  7033. \par
  7034. Dieser Befehl dient dazu, neue Funktionen zu definieren, die in
  7035. Formel\-ausdr"ucken wie die vordefinierten Funktionen verwendet werden
  7036. k"onnen.  Die Definition mu"s in folgender Form erfolgen:
  7037. \begin{verbatim}
  7038. <Name>  FUNCTION <Arg>,..,<Arg>,<Ausdruck>
  7039. \end{verbatim}
  7040. Die Argumente sind die Werte, die sozusagen in die Funktion
  7041. ,,hineingesteckt'' werden.  In der Definition werden f"ur die Argumente
  7042. symbolische Namen gebraucht, damit der Assembler bei der Benutzung
  7043. der Funktion wei"s, an welchen Stellen die aktuellen Werte einzusetzen
  7044. sind. Dies kann man an folgendem Beispiel sehen:
  7045. \begin{verbatim}
  7046. isgit   FUNCTION ch,(ch>='0')&&(ch<='9')
  7047. \end{verbatim}
  7048. Diese Funktion "uberpr"uft, ob es sich bei dem Argument (wenn man es
  7049. als Zeichen interpretiert) um eine Ziffer im momentan g"ultigen
  7050. Zeichencode handelt (der momentane Zeichencode ist mittels \tty{CHARSET}
  7051. ver"anderbar, daher die vorsichtige Formulierung).
  7052. \par
  7053. Die Argumentnamen (in diesem Falle \tty{CH}) m"ussen den gleichen h"arteren
  7054. Symbolkonventionen gen"ugen wie Parameter bei einer Makrodefinition,
  7055. d.h. die Sonderzeichen . und \_ sind nicht erlaubt.
  7056. \par
  7057. Selbst definierte Funktionen werden genauso benutzt wie eingebaute,
  7058. d.h. mit einer durch Kommas getrennten, geklammerten Argumentliste:
  7059. \begin{verbatim}
  7060.        IF isdigit(Zeichen)
  7061.         message "\{Zeichen} ist eine Ziffer"
  7062.        ELSEIF
  7063.         message "\{Zeichen} ist keine Ziffer"
  7064.        ENDIF
  7065. \end{verbatim}
  7066. \par
  7067. Bei dem Aufruf der Funktion werden die Argumente nur einmal berechnet
  7068. und danach an allen Stellen der Formel eingesetzt, um den
  7069. Rechenaufwand zu reduzieren und Seiteneffekte zu vermeiden.
  7070. Bei Funktionen mit mehreren Argumenten m"ussen die einzelnen Argumente
  7071. bei der Benutzung durch Kommata getrennt werden.
  7072. \par
  7073. \bb{ACHTUNG!} Analog wie bei Makros kann man mit der Definition von
  7074. Funktionen bestehende Funktionen umdefinieren.  Damit lassen sich auch
  7075. wieder Phasenfehler provozieren.  Solche Definitionen sollten daher auf
  7076. jeden Fall vor der ersten Benutzung erfolgen!
  7077. \par
  7078. Der Ergebnistyp kann bei Funktionen vom Typ der Argumente abh"angen.
  7079. So kann bei folgender Funktion
  7080. \begin{verbatim}
  7081. double  function x,x+x
  7082. \end{verbatim}
  7083. das Ergebnis ein Integer, eine Gleitkommazahl oder sogar ein String
  7084. sein, je nach Typ des Arguments!
  7085. \par
  7086. Bei der Definition und Ansprache von Funktionen wird im case-sensitiven
  7087. Modus zwischen Gro"s- und Kleinschreibung unterschieden, im Gegensatz
  7088. zu eingebauten Funktionen!
  7089.  
  7090. %%---------------------------------------------------------------------------
  7091.  
  7092. \section{Strukturen}
  7093. \ttindex{STRUCT}\ttindex{ENDSTRUCT}\ttindex{UNION}\ttindex{ENDUNION}
  7094. \ttindex{STRUC}\ttindex{ENDSTRUC}\ttindex{ENDS}
  7095. \ttindex{DOTTEDSTRUCTS}
  7096.  
  7097. {\em G"ultigkeit: alle Prozessoren}
  7098.  
  7099. Auch in Assemblerprogrammen ergibt sich dann und wann die Notwendigkeit,
  7100. analog zu Hochsprachen zusammengesetzte Datenstrukturen zu definieren.
  7101. \asname{} unterst"utzt sowohl die Definition als auch die Nutzung von Strukturen
  7102. mit einer Reihe von Konstrukten und Anweisungen, die im folgenden
  7103. erl"autert werden sollen:
  7104.  
  7105. \subsection{Definition}
  7106.  
  7107. Die Definition einer Struktur wird duch den Befehl \tty{STRUCT}
  7108. eingeleitet und durch \tty{ENDSTRUCT} abgeschlossen (schreibfaule
  7109. Zeitgenossen d"urfen aber auch stattdessen {\tt STRUC} bzw.  {\tt
  7110. ENDSTRUC} oder {\tt ENDS} schreiben).  Ein eventuell diesen Befehlen
  7111. voranstehendes Label wird als Name der zu definierenden Struktur
  7112. genommen; am Ende der Definition ist der Name optional und kann von
  7113. zur Festlegung des L"angennamens (s.u.) genutzt werden.  Das
  7114. restliche Verfahren ist simpel: Mit einem \tty{STRUCT} wird der
  7115. momentane Programmz"ahler gesichert und auf Null zur"uck gesetzt.
  7116. Alle zwischen \tty{STRUCT} und \tty{ENDSTRUCT} definierten Labels
  7117. ergeben mithin die Offsets der einzelnen Datenfelder in der Struktur.
  7118. Die Reservierung des Platzes f"ur die einzelnen Felder erfolgt mit
  7119. den f"ur den jeweils aktiven Zielprozessor zul"assigen Befehlen zur
  7120. Speicherplatzreservierung, also z.B.  \tty{DS.x} f"ur die Motorolas
  7121. oder \tty{DB} \& Co.  f"ur Intels.  Es gelten hier auch gleichfalls
  7122. die Regeln f"ur das Aufrunden von L"angen, um Alignments zu erhalten
  7123. - wer also 'gepackte' Strukturen definieren will, mu"s eventuell ein
  7124. {\tt PADDING OFF} voranstellen.  Umgekehrt lassen sich Ausrichtungen
  7125. nat"urlich mit Befehlen wie {\tt ALIGN} erzwingen.
  7126.  
  7127. Da eine solche Definition nur eine Art 'Prototypen' darstellt, k"onnen nur
  7128. Befehle benutzt werden, die Speicherplatz reservieren, aber keine solchen,
  7129. die Konstanten im Speicher ablegen oder Code erzeugen.
  7130.  
  7131. Innerhalb von Strukturen definierte Labels (also die Namen der Elemente)
  7132. werden nicht direkt abgespeichert, sondern es wird ihnen der Name der
  7133. Struktur vorangestellt, durch ein Trennzeichen verbunden, bei dem es sich
  7134. defaultm"a"sig um den Unterstrich (\_) handelt.  Dieses Verhalten l"a"st
  7135. sich aber durch dem \tty{STRUCT}-Befehl mitgegebene Argumente steuern:
  7136. \begin{itemize}
  7137. \item{\tty{NOEXTNAMES} unterdr"uckt das Voranstellen des Strukturnamens.
  7138.      Der Programmierer ist in diesem Falle selber daf"ur verantworlich,
  7139.      da"s Feldnamen nicht mehrfach verwendet werden.}
  7140. \item{\tty{DOTS} weist \asname{} an, als verbindendes Zeichen einen Punkt
  7141.      anstelle des Unterstriches zu verwenden.  Es sei jedoch
  7142.      ausdr"ucklich darauf hingewiesen, da"s der Punkt bei vielen
  7143.      Zielprozessoren ein Sonderfunktion zur Bitadressierung hat und
  7144.      diese zu Problemen f"uhren kann!}
  7145. \end{itemize}
  7146. Des weiteren ist es m"oglich, die Verwendung des Punktes durch den Befehl
  7147. \begin{verbatim}
  7148.        dottedstructs <on|off>
  7149. \end{verbatim}
  7150. dauerhaft ein- bzw. auszuschalten.
  7151.  
  7152. Neben den Namen der Elemente definiert \asname{} beim Abschlu"s der Definition
  7153. ein weiteres Symbol mit dem Namen {\tt LEN}, das nach dem gleichen Regeln
  7154. um den Namen der Struktur erweitert wird - oder um den Label-Namen, der
  7155. optional bei \tty{ENDSTRUCT} angegeben werden kann.
  7156.  
  7157. Das ganze sieht dan in der Praxis z.B. so aus:
  7158. \begin{verbatim}
  7159. Rec     STRUCT
  7160. Ident   db      ?
  7161. Pad     db      ?
  7162. Pointer dd      ?
  7163. Rec     ENDSTRUCT
  7164. \end{verbatim}
  7165. Hier w"urde z.B. dem Symbol {\tt REC\_LEN} der Wert 6 zugewiesen.
  7166.  
  7167. \subsection{Nutzung}
  7168.  
  7169. Ist eine Struktur einmal definiert, ist die Nutzung denkbar einfach und
  7170. "ahnlich wie ein Makro: ein einfaches
  7171. \begin{verbatim}
  7172. thisrec Rec
  7173. \end{verbatim}
  7174. reserviert Speicher in der Menge, wie er von der Struktur belegt wird, und
  7175. definiert gleichzeitig f"ur jedes Element der Struktur ein passendes
  7176. Symbol mit dessen Adresse, in diesem Falle also {\tt THISREC\_IDENT,
  7177. THISREC\_PAD} und {\tt THISREC\_POINTER}.  Das Label darf bei dem Aufruf
  7178. einer Struktur naturgem"a"s nicht fehlen; wenn doch, gibt's eine
  7179. Fehlermeldung.
  7180.  
  7181. "Uber zus"atzliche Argumente ist es m"oglich, nicht nur Speicher f"ur eine
  7182. einzelne Struktur, sondern ein ganzes Feld davon zu reservieren.  Die (bis zu
  7183. drei) Dimensionen werden "uber in eckige Klammern gesetzte Argumente definiert:
  7184. \begin{verbatim}
  7185. thisarray Rec [10],[2]
  7186. \end{verbatim}
  7187. In diesem Beispiel wird Platz f"ur $2*10=20$ Strukturen reserviert, und f"ur
  7188. jede Einzelstruktur werden Symbole erzeugt, die die Indizes im Namen enthalten.
  7189.  
  7190. \subsection{geschachtelte Strukturen}
  7191.  
  7192. Es ist ohne weiteres erlaubt, eine bereits definierte Struktur in einer
  7193. anderen Struktur aufzurufen.  Das dabei ablaufende Verfahren ist eine
  7194. Kombination aus den beiden vorigen Punkten: Elemente der Substruktur
  7195. werden definiert, mit dem Namen dieser Instanz vorangestellt, und vor
  7196. diese zusammengesetzten Namen wird wieder der Name der Struktur bzw.
  7197. sp"ater bei einer Benutzung gesetzt.  Das sieht dann z.B. so aus:
  7198. \begin{verbatim}
  7199. TreeRec struct
  7200. left    dd         ?
  7201. right   dd         ?
  7202. data    Rec
  7203. TreeRec endstruct
  7204. \end{verbatim}
  7205.  
  7206. Ebenso ist es erlaubt, eine Struktur direkt in einer anderen
  7207. Struktur zu definieren:
  7208. \begin{verbatim}
  7209. TreeRec struct
  7210. left    dd         ?
  7211. right   dd         ?
  7212. TreeData struct
  7213. name      db         32 dup(?)
  7214. id        dw         ?
  7215. TreeData endstruct
  7216. TreeRec endstruct
  7217. \end{verbatim}
  7218.  
  7219.  
  7220. \subsection{Unions}
  7221.  
  7222. Eine Union ist eine Sonderform einer Struktur, bei der die einzelnen
  7223. Elemente nicht hintereinander, sondern {\em "ubereinander} liegen, d.h.
  7224. alle Elemente liegen an Startadresse 0 innerhalb der Struktur und belegen
  7225. den gleichen Speicherplatz.  Naturgem"a"s tut so eine Definition nicht
  7226. mehr, als einer Reihe von Symbolen den Wert Null zuzuweisen, sie kann aber
  7227. sinnvoll sein, um programmtechnisch die "Uberlappung der Elemente zu
  7228. verdeutlichen und den Code so etwas 'lesbarer' zu gestalten.  Die Gr"o"se
  7229. einer Struktur ist das Maximum der Gr"o"sen aller Elemente.
  7230.  
  7231. \subsection{Namenlose Strukturen}
  7232.  
  7233. Der Name einer Struktur oder Union ist optional, allerdings nur, wenn
  7234. diese Teil einer anderen, nicht namenlosen Struktur ist.  Elemente
  7235. dieser Struktur werden dann Teil der 'n"achsth"oheren' benamten
  7236. Struktur:
  7237. \begin{verbatim}
  7238. TreeRec struct
  7239. left    dd         ?
  7240. right   dd         ?
  7241.        struct
  7242. name      db         32 dup(?)
  7243. id        dw         ?
  7244.        endstruct
  7245. TreeRec endstruct
  7246. \end{verbatim}
  7247. erzeugt also die Symbole {\tt TREEREC\_NAME} und {\tt TREEREC\_ID}.
  7248.  
  7249. Des weiteren wird f"ur namenlose Strukturen oder Unions kein Symbol
  7250. mit deren L"ange angelegt.
  7251.  
  7252. \subsection{Strukturen und Sektionen}
  7253.  
  7254. Im Verlaufe der Definition oder der Nutzung von Strukturen definierte
  7255. Symbole werden genauso behandelt wie normale Symbole, d.h. bei der Nutzung
  7256. innerhalb einer Sektion werden diese Symbole als lokal zu dieser Sektion
  7257. definiert.  Analoges gilt aber auch f"ur die Strukturen selber, d.h. eine
  7258. innerhalb einer Sektion definierte Struktur kann nicht au"erhalb der
  7259. Sektion benutzt werden.
  7260.  
  7261. \subsection{Strukturen und Makros}
  7262.  
  7263. Will man Strukturen "uber Makros instanziieren, so mu"s man die
  7264. \tty{GLOBALSYMBOLS}-Option bei der Definition des Makros
  7265. benutzen, damit die dar"uber erzeugten Symbole auch au"serhalb
  7266. des Makros verwendbar sind.  Eine Reihe von Strukturen kann man
  7267. z.B. so anlegen:
  7268.  
  7269. \begin{verbatim}
  7270.        irp     name,{GLOBALSYMBOLS},rec1,rec2,rec3
  7271. name    Rec
  7272.        endm
  7273. \end{verbatim}
  7274.  
  7275. %%---------------------------------------------------------------------------
  7276.  
  7277. \section{bedingte Assemblierung}
  7278.  
  7279. {\em G"ultigkeit: alle Prozessoren}
  7280.  
  7281. Der Assembler unterst"utzt die bedingte Assemblierung mit Hilfe der
  7282. Konstrukte \tty{IF}... sowie \tty{SWITCH}... .  Diese Befehle wirken zur
  7283. Assemblierzeit, indem entsprechend der Bedingung Teile "ubersetzt oder
  7284. "ubersprungen werden.  Diese Befehle sind also \ii{nicht} mit den
  7285. IF-Statements h"oherer Programmiersprachen zu vergleichen (obwohl es
  7286. sehr verlockend w"are, den Assembler um die Strukturierungsbefehle
  7287. h"oherer Sprachen zu erweitern...).
  7288. \par
  7289. Die folgenden Konstrukte d"urfen beliebig (bis zum Speicher"uberlauf)
  7290. geschachtelt werden.
  7291.  
  7292. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7293.  
  7294. \subsection{IF / ELSEIF / ENDIF}
  7295. \ttindex{IF}
  7296. \ttindex{ELSEIF}\ttindex{ELSE}
  7297. \ttindex{ENDIF}
  7298.  
  7299. \tty{IF} ist das gebr"auchlichere und allgemeiner verwendbare Konstrukt.
  7300. Die allgemeine Form eines \tty{IF}-Befehles lautet folgenderma"sen:
  7301. \begin{verbatim}
  7302.       IF       <Ausdruck 1>
  7303.        <Block 1>
  7304.       ELSEIF   <Ausdruck 2>
  7305.        <Block 2>
  7306.       (evtl. weitere ELSEIFs)
  7307.       ELSEIF
  7308.        <Block n>
  7309.       ENDIF
  7310. \end{verbatim}
  7311. \tty{IF} dient als Einleitung und wertet den ersten Ausdruck aus und assembliert
  7312. Block 1, falls der Ausdruck wahr (d.h. ungleich 0) ist.  Alle weiteren
  7313. \tty{ELSEIF}-Teile werden dann ignoriert.  Falls der Ausdruck aber nicht wahr
  7314. ist, wird Block 1 "ubersprungen und Ausdruck 2 ausgewertet.  Sollte dieser
  7315. nun wahr sein, wird Block 2 assembliert.  Die Zahl der \tty{ELSEIF}-Teile ist
  7316. variabel und ergibt eine \tty{IF-THEN-ELSE}-Leiter beliebiger L"ange.  Der dem
  7317. letzten \tty{ELSEIF} (ohne Parameter) zugeordnete Block wird nur assembliert,
  7318. falls alle vorigen Ausdr"ucke falsch ergaben und bildet sozusagen einen
  7319. ,,Default-Zweig''.  Wichtig ist, da"s von den Bl"ocken immer nur \ii{einer}
  7320. assembliert wird, und zwar der erste, dessen zugeordnetes \tty{IF/ELSEIF} einen
  7321. wahren Ausdruck hatte.
  7322. \par
  7323. Die \tty{ELSEIF}-Teile sind optional, d.h. auf \tty{IF} darf auch direkt \tty{ENDIF}
  7324. folgen, ein parameterloses \tty{ELSEIF} bildet aber immer den letzten Zweig.
  7325. Ein \tty{ELSEIF} bezieht sich immer auf das letzte, noch nicht abgeschlossene \tty{IF}.
  7326. \par
  7327. Neben \tty{IF} sind noch folgende weitere bedingte Befehle definiert:
  7328. \ttindex{IFDEF}\ttindex{IFNDEF}
  7329. \ttindex{IFUSED}\ttindex{IFNUSED}
  7330. \ttindex{IFEXIST}\ttindex{IFNEXIST}
  7331. \ttindex{IFB}\ttindex{IFNB}
  7332. \begin{itemize}
  7333. \item{\tty{IFDEF} $<$Ausdruck$>$ : wahr, falls das der Ausdruck keine Symbole
  7334.      enth"alt, die bisher undefiniert sind.}
  7335. \item{\tty{IFNDEF} $<$Ausdruck$>$ : Umkehrung zu \tty{IFDEF}}
  7336. \item{\tty{IFUSED} $<$Symbol$>$ : wahr, falls das Symbol bisher mindestens einmal
  7337.      benutzt wurde.}
  7338. \item{\tty{IFNUSED} $<$Symbol$>$ : Umkehrung zu \tty{IFUSED}}
  7339. \item{\tty{IFEXIST} $<$Name:  $>$ : wahr, falls die angegebene Datei existiert.
  7340.      F"ur Schreibweise und Suchpfade gelten gleiche Regeln wie beim
  7341.      \tty{INCLUDE}-Befehl (siehe Abschnitt \ref{SectInclude}).}
  7342. \item{\tty{IFNEXIST} $<$Name:  $>$ : Umkehrung zu \tty{IFEXIST}}
  7343. \item{\tty{IFB} $<$Arg-Liste$>$ : wahr, falls alle Argumente der Parameterliste leer
  7344.                                  sind.}
  7345. \item{\tty{IFNB} $<$Arg-Liste$>$ : Umkehrung zu IFB.}
  7346. \end{itemize}
  7347.  
  7348. Anstelle von {\tt ELSEIF} darf auch {\tt ELSE} geschrieben werden, weil
  7349. das wohl alle so gewohnt sind....
  7350.  
  7351. Zu jeder {\tt IF...}-Anweisung geh"ort ein entsprechendes {\tt ENDIF},
  7352. 'offene' Konstrukte f"uhren zu einer Fehlermeldung am Ende des
  7353. Assemblierungslaufes.  Die Zuordnung, welches {\tt ENDIF} \asname{} mit welchem
  7354. {\tt IF...} 'gepaart' hat, l"a"st sich im Listing erkennen: dort wird die
  7355. Zeilennummer des entsprechenden {\tt IF}s angezeigt.
  7356.  
  7357. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7358.  
  7359. \subsection{SWITCH / CASE / ELSECASE / ENDCASE}
  7360. \ttindex{SWITCH}\ttindex{.SWITCH}\ttindex{SELECT}
  7361. \ttindex{CASE}\ttindex{ELSECASE}\ttindex{ENDCASE}
  7362.  
  7363. \tty{SWITCH} ist ein Spezialfall von \tty{IF} und f"ur den Fall gedacht, da"s ein
  7364. Ausdruck mit einer Reihe von Werten verglichen werden soll.  Dies ist
  7365. nat"urlich auch mit \tty{IF} und einer Reihe von \tty{ELSEIF}s machbar, die folgende
  7366. Form
  7367. \begin{verbatim}
  7368.       SWITCH   <Ausdruck>
  7369.       ...
  7370.       CASE     <Wert 1>
  7371.       ...
  7372.       <Block 1>
  7373.       ...
  7374.       CASE <Wert 2>
  7375.       ...
  7376.       <Block 2>
  7377.       ...
  7378.       (weitere CASE-Konstrukte)
  7379.       ...
  7380.       CASE <Wert n-1>
  7381.       ...
  7382.       <Block n-1>
  7383.       ...
  7384.       ELSECASE
  7385.       ...
  7386.       <Block n>
  7387.       ...
  7388.       ENDCASE
  7389. \end{verbatim}
  7390. bietet aber den Vorteil, da"s der zu pr"ufende Ausdruck nur einmal hingeschrieben
  7391. und berechnet werden mu"s, er ist also weniger fehleranf"allig und etwas
  7392. schneller als eine \tty{IF}-Kette, daf"ur nat"urlich auch nicht so flexibel.
  7393. \par
  7394. Es ist m"oglich, bei den \tty{CASE}-Anweisungen mehrere, durch Kommata getrennte
  7395. Werte anzugeben, um den entsprechenden Block in mehreren F"allen assemblieren
  7396. zu lassen.  Der \tty{ELSECASE}-Zweig dient wiederum als ,,Auffangstelle'' f"ur den
  7397. Fall, da"s keine der \tty{CASE}-Bedingungen greift.  Fehlt er und fallen alle
  7398. Pr"ufungen negativ aus, so gibt \asname{} eine Warnung aus.
  7399. \par
  7400. Auch wenn die Wertelisten der \tty{CASE}-Teile sich "uberlappen, so wird immer
  7401. nur \ii{ein} Zweig ausgef"uhrt, und zwar bei Mehrdeutigkeiten der erste.
  7402. \par
  7403. \tty{SWITCH} dient nur der Einleitung des ganzen Konstruktes; zwischen ihm und
  7404. dem ersten \tty{CASE} darf beliebiger Code stehen (andere \tty{IF}s d"urfen aber nicht
  7405. offen bleiben!), im Sinne eines durchschaubaren Codes sollte davon aber
  7406. kein Gebrauch gemacht werden.
  7407. \par
  7408. Ist \tty{SWITCH} auf dem gew"ahlten Target ein Maschinenbefehl,
  7409. so leitet man das Konstrukt stattdessen mit \tty{SELECT} ein, oder spricht
  7410. den Pseudobefehl explizit durch einen vorangestellten Punk an (\tty{.SWITCH}
  7411. anstelle von \tty{SWITCH}).
  7412. \par
  7413. "Ahnlich wie bei {\tt IF...}-Konstrukten, mu"s es f"ur jedes {\tt SWITCH}
  7414. genau ein {\tt ENDCASE} geben.  Analog zu {\tt ENDIF} wird bei {\tt ENDCASE}
  7415. im Listing die Zeilennummer des korrespondierenden {\tt SWITCH} angezeigt.
  7416.  
  7417. %%---------------------------------------------------------------------------
  7418.  
  7419. \section{Listing-Steuerung}
  7420.  
  7421. {\em G"ultigkeit: alle Prozessoren}
  7422.  
  7423. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7424.  
  7425. \subsection{PAGE, PAGESIZE}
  7426. \label{SectPAGE}
  7427. \ttindex{PAGE}\ttindex{.PAGE}\ttindex{PAGESIZE}
  7428.  
  7429. Mit \tty{PAGE} kann man \asname{} die Dimensionen des Papiers, auf dem das
  7430. Listing ausgedruckt werden soll, mitteilen.  Als erster Parameter
  7431. wird dabei die Anzahl von Zeilen angegeben, nach der \asname{} automatisch
  7432. einen Zeilenvorschub ausgeben soll.  Zu ber"ucksichtigen ist allerdings,
  7433. da"s bei dieser Angabe die Kopfzeilen inklusive einer evtl. mit \tty{TITLE}
  7434. spezifizierten Zeile nicht mitgerechnet werden.  Der Minimalwert f"ur
  7435. die Zeilenzahl ist 5, der Maximalwert 255.  Eine Angabe von 0 f"uhrt dazu,
  7436. da"s \asname{} "uberhaupt keine automatischen Seitenvorsch"ube ausf"uhrt, sondern
  7437. nur noch solche, die explizit durch \tty{NEWPAGE}-Befehle oder implizit am
  7438. Ende des Listings (z.B. vor der Symboltabelle) von \asname{} ausgel"ost
  7439. wurden.
  7440. \par
  7441. Die Angabe der Breite des Listings in Zeichen kann als optionaler
  7442. zweiter Parameter erfolgen und erf"ullt zwei Zwecke: Zum einen l"auft
  7443. der Zeilenz"ahler von \asname{} korrekt weiter, wenn eine Quell-Zeile "uber mehrere
  7444. Listing-Zeilen geht, zum anderen gibt es Drucker (wie z.B. Laserdrucker),
  7445. die beim "Uberschreiten des rechten Randes nicht automatisch in eine neue
  7446. Zeile umbrechen, sondern den Rest einfach ,,verschlucken''.  Aus diesem
  7447. Grund f"uhrt \asname{} auch den Zeilenumbruch selbstst"andig durch, d.h. zu lange
  7448. Zeilen werden in Bruchst"ucke zerlegt, die eine L"ange kleiner oder
  7449. gleich der eingestellten L"ange haben.  In Zusammenhang mit Druckern, die
  7450. einen automatischen Zeilenumbruch besitzen, kann das aber zu doppelten
  7451. Zeilenvorsch"uben f"uhren, wenn man als Breite exakt die Zeilenbreite des
  7452. Druckers angibt.  Die L"osung in einem solchen Fall ist, als Zeilenbreite
  7453. ein Zeichen weniger anzugeben.  Die eingestellte Zeilenbreite darf zwischen
  7454. 5 und 255 Zeichen liegen; analog zur Seitenl"ange bedeutet ein Wert von 0,
  7455. da"s \asname{} keine Splittung der Listing-Zeilen vornehmen soll; eine
  7456. Ber"ucksichtigung von zu langen Zeilen im Listing beim Seitenumbruch kann
  7457. dann nat"urlich auch nicht mehr erfolgen.
  7458. \par
  7459. Die Defaulteinstellung f"ur die Seitenl"ange ist 60 Zeilen, f"ur die
  7460. Zeilenbreite 0; letztere Wert wird auch angenommen, wenn \tty{PAGE} nur mit
  7461. einem Argument aufgerufen wird.
  7462. \par
  7463. Falls \tty{PAGE} auf dem gew"ahlten Target bereits ein Maschinenbefehl ist,
  7464. benutzt man stattdessen \tty{PAGESIZE}.  Alternativ ist es immer m"oglich,
  7465. durch Voranstellen eines Punktes (\tty{.PAGE} anstelle \tty{PAGE}) explizit
  7466. den Pseudobefehl anzusprechen.
  7467. \par
  7468. \bb{ACHTUNG!} \asname{} hat keine M"oglichkeit, zu "uberpr"ufen, ob die
  7469. eingestellte Listing-L"ange und Breite mit der Wirklichkeit "ubereinstimmen!
  7470.  
  7471. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7472.  
  7473. \subsection{NEWPAGE}
  7474. \ttindex{NEWPAGE}
  7475.  
  7476. \tty{NEWPAGE} kann dazu benutzt werden, einen Seitenvorschub zu erzwingen,
  7477. obwohl die Seite noch gar nicht voll ist.  Dies kann z.B. sinnvoll
  7478. sein, um logisch voneinander getrennte Teile im Assemblerprogramm
  7479. auch seitenm"a"sig zu trennen.  Der programminterne Zeilenz"ahler wird
  7480. zur"uck gesetzt, der Seitenz"ahler um Eins heraufgez"ahlt.  Der optionale
  7481. Parameter steht in Zusammenhang mit einer hierarchischen Seitennumerierung,
  7482. die \asname{} bis zu einer Kapiteltiefe von 4 unterst"utzt.  0 bedeutet dabei
  7483. immer die tiefste Kapitelebene, der Maximalwert kann sich w"ahrend des
  7484. Laufes ver"andern, wenn das auch verwirrend wirken kann, wie folgendes
  7485. Beispiel zeigt:
  7486. \begin{quote}\begin{tabbing}
  7487. \hspace{2.5cm} \= \hspace{4.5cm} \= \kill
  7488. Seite 1,   \> Angabe \tty{NEWPAGE 0} \> $\rightarrow$ Seite 2 \\
  7489. Seite 2,   \> Angabe \tty{NEWPAGE 1} \> $\rightarrow$ Seite 2.1 \\
  7490. Seite 2.1, \> Angabe \tty{NEWPAGE 1} \> $\rightarrow$ Seite 3.1 \\
  7491. Seite 3.1, \> Angabe \tty{NEWPAGE 0} \> $\rightarrow$ Seite 3.2 \\
  7492. Seite 3.2, \> Angabe \tty{NEWPAGE 2} \> $\rightarrow$ Seite 4.1.1 \\
  7493. \end{tabbing}\end{quote}
  7494. Je nach momentan vorhandener Kapiteltiefe kann \tty{NEWPAGE $<$Nummer$>$}
  7495. also an verschiedenen Stellen eine Erh"ohung bedeuten.  Ein automatischer
  7496. Seitenvorschub wegen Zeilen"uberlauf oder ein fehlender Parameter ist
  7497. gleichbedeutend mit \tty{NEWPAGE 0}.  Am Ende des Listings wird vor Ausgabe
  7498. der Symboltabelle ein implizites \tty{NEWPAGE $<$bish. Maximum$>$} durchgef"uhrt,
  7499. um sozusagen ein neues Hauptkapitel zu beginnen.
  7500.  
  7501. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7502.  
  7503. \subsection{MACEXP\_DFT und MACEXP\_OVR}
  7504. \ttindex{MACEXP}
  7505. \ttindex{MACEXP\_DFT}
  7506. \ttindex{MACEXP\_OVR}
  7507. \label{MACEXPDFT}
  7508. \label{MACEXPOVR}
  7509.  
  7510. Ist ein Makro einmal ausgestestet und 'fertig', m"ochte man es bei
  7511. Benutzung vielleicht gar nicht mehr im Listing sehen.  Wie im
  7512. Abschnitt "uber Makros (\ref{SectMacros}) erl"autert, kann man bei der
  7513. Definition eines Makros "uber Zusatzargumente steuern, ob und wenn ja
  7514. welche Teile des Makro-Rumpfes im Listing expandiert werden.  F"ur den
  7515. Fall, da"s eine ganze Reihe von Makros in Folge definiert werden,
  7516. mu"s man dies jedoch nicht f"ur jedes Makro einzeln festlegen.  Der
  7517. Befehl \tty{MACEXP\_DFT} setzt f"ur alle im folgenden definerten Makros,
  7518. welche Teile ihres Rumpfes expandiert werden sollen:
  7519. \begin{itemize}
  7520. \item{\tty{ON} bzw. \tty{OFF} schalten die Expansion komplett
  7521.      ein bzw. aus.}
  7522. \item{Mit den Argumenten \tty{IF} bzw. \tty{NOIF} werden Befehle
  7523.      im Rumpf zur bedingten Assemblierung und derentwegen nicht
  7524.      assemblierte Code-Teile aus- bzw. eingeblendet.}
  7525. \item{Makro-Definitionen (dazu z"ahlen auch \tty{REPT},
  7526.      \tty{WHILE} und \tty{IRP(C)}) k"onnen "uber die Argumente
  7527.      \tty{MACRO} bzw. \tty{NOMACRO} ein- und
  7528.      ausgeblendet werden.}
  7529. \item{Mit den Argumenten \tty{REST} bzw. \tty{NOREST} k"onnen die
  7530.      Zeilen ein- und ausgeblendet werden, die nicht in die ersten
  7531.      beiden Klassen fallen.}
  7532. \end{itemize}
  7533. Default ist \tty{ON}, d.h. im folgenden definierte Makros werden
  7534. komplett expandiert, au"ser nat"urlich bei den einzelnen Makros wurde
  7535. dies durch Direktiven "ubersteuert.  Weiterhin wirken angegebene Schalte
  7536. relativ zur aktuellen Einstellung: ist z.B. initial alles eingeschaltet,
  7537. sorgt ein
  7538. \begin{quote}{\tt
  7539.        MACEXP\_DFT  noif,nomacro
  7540. }\end{quote}
  7541. daf"ur, da"s nur noch das gelistet wird, was weder eine Makrodefinition
  7542. ist noch per bedingter Assemblierung ausgeschlossen wurde.
  7543. \par
  7544. Mit diesem Befehl und den pro Makro setzbaren Direktiven l"a"st sich
  7545. f"ur jedes einzelne Makro genau festlegen, welche Teile bei einer
  7546. Expansion im Listing erscheinen sollen und welche nicht.  Es kann
  7547. jedoch in der Praxis auch vorkommen, da"s man ein bestimmtes Makro an
  7548. einzelnen Stellen im Quellcode expandiert haben m"ochte, an anderen
  7549. jedoch nicht.  Dies ist mit dem Befehl \tty{MACEXP\_OVR} m"oglich: er
  7550. akzeptiert die gleichen Argumente, diese wirken jedoch als Overrides
  7551. f"ur alle im folgenden {\em expandierten} Makros, im Gegensatz zu
  7552. \tty{MACEXP\_DFT}, das auf alle im folgenden {\em definierten} Makros
  7553. wirkt.  Ist zum Beispiel f"ur ein Makro festgelegt worden, da"s weder
  7554. Makrodefinitionen noch per bedingte Assemblierung ausgeschlossene
  7555. Teile gelistet werden sollen, so schaltet ein
  7556. \begin{quote}{\tt
  7557.         MACEXP\_OVR  MACRO
  7558. }\end{quote}
  7559. f"ur folgende Expansionen das Listen von Makrodefinitionen wieder ein,
  7560. w"ahrend ein
  7561. \begin{quote}{\tt
  7562.         MACEXP\_OVR ON
  7563. }\end{quote}
  7564. wieder alles ins Listing expandiert.  \tty{MACEXP\_OVR} ohne
  7565. Argumente schaltet wiederum s"amtliche Overrides aus, Makros
  7566. verhalten sich bei der Expansion wieder so, wie zum Zeitpunkt ihrer
  7567. Definition festgelegt.
  7568. \par
  7569. Beide Befehle wirken ebenfalls auf andere Makro-artige Konstrukte
  7570. (\tty{REPT, IRP, IRPC WHILE}), da diese aber einmalig ,,in-place''
  7571. expandiert werden, verschwimmt der funktionale Unterschied zwischen
  7572. den beiden Befehlen - im Zweifelsfalle hat aber der per
  7573. \tty{MACEXP\_OVR} gesetzte Override eine h"ohere Priorit"at.
  7574.  
  7575. Die momentane mit \tty{MACEXP\_DFT} gesetzte Einstellung l"a"st sich
  7576. aus dem Symbol \tty{MACEXP} auslesen.  Anstelle von \tty{MACEXP\_DFT}
  7577. darf auch einfach \tty{MACEXP} geschrieben werden, davon sollte aber
  7578. in neuen Programmen kein Gebrauch mehr gemacht werden.
  7579.  
  7580. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7581.  
  7582. \subsection{LISTING}
  7583. \ttindex{LISTING}
  7584.  
  7585. Mit diesem Befehl kann das Listing komplett ein- und ausgeschaltet
  7586. werden. Nach einem
  7587. \begin{verbatim}
  7588.        LISTING off
  7589. \end{verbatim}
  7590. wird \ii{"uberhaupt} nichts mehr im Listing ausgegeben.  Diese Anweisung
  7591. macht Sinn f"ur erprobte Codeteile oder Include-Dateien, um den
  7592. Papierverbrauch nicht ins Unerme"sliche zu steigern.  \bb{ACHTUNG!}
  7593. Wer sp"ater das Gegenst"uck vergi"st, bekommt auch keine Symboltabelle
  7594. mehr zu sehen!  Zus"atzlich zu \tty{ON} und \tty{OFF} akzeptiert
  7595. \tty{LISTING} auch \tty{NOSKIPPED} und \tty{PURECODE} als Argument.  Mit
  7596. der \tty{NOSKIPPED}-Einstellung werden aufgrund bedingter Assemblierung
  7597. nicht assemblierte Teile nicht im Listing aufgef"uhrt, w"ahrend
  7598. \tty{PURECODE} - wie der Name schon erahnen l"a"st - auch die
  7599. \tty{IF}-Konstrukte selber nicht mehr im Listing auff"uhrt.  Diese
  7600. Einstellungen sind n"utzlich, wenn man Makros, die anhand von
  7601. Parametern verschiedene Aktionen ausf"uhren, benutzt, und im Listing
  7602. nur noch die jeweils benutzten Teile sehen m"ochte.
  7603. \par
  7604. Die momentane Einstellung l"a"st sich aus dem Symbol \tty{LISTING}
  7605. (0=\tty{OFF}, 1=\tty{ON}, 2=\tty{NOSKIPPED}, 3=\tty{PURECODE}) auslesen.
  7606.  
  7607. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7608.  
  7609. \subsection{PRTINIT und PRTEXIT}
  7610. \ttindex{PRTINIT}\ttindex{PRTEXIT}
  7611.  
  7612. Bei der Listingausgabe auf Druckern ist es oftmals sinnvoll, den
  7613. Drucker in eine andere Betriebsart (z.B. Schmalschrift) umzuschalten
  7614. und am Ende des Listings diese Betriebsart wieder zu deaktivieren. Mit
  7615. diesen Befehlen kann die Ausgabe dieser Steuerfolgen automatisiert
  7616. werden, indem man mit
  7617. \begin{verbatim}
  7618.        PRTINIT <String>
  7619. \end{verbatim}
  7620. die Zeichenfolge angibt, die vor Listingbeginn an das Ausgabeger"at
  7621. geschickt werden soll und mit
  7622. \begin{verbatim}
  7623.        PRTEXIT <String>
  7624. \end{verbatim}
  7625. analog den Deinitialisierungsstring.  In beiden F"allen mu"s
  7626. \tty{$<$String$>$} ein Stringausdruck sein.  Die Syntaxregeln f"ur
  7627. Stringkonstanten erm"oglichen es, ohne Verrenkungen Steuerzeichen in den
  7628. String einzubauen.
  7629. \par
  7630. Bei der Ausgabe dieser Strings unterscheidet der Assembler \bb{nicht},
  7631. wohin das Listing geschickt wird, d.h. Druckersteuerzeichen werden
  7632. r"ucksichtslos auch auf den Bildschirm geschickt!
  7633. \par
  7634. Beispiel :
  7635. \par
  7636. Bei Epson-Druckern ist es sinnvoll, f"ur die breiten Listings
  7637. in den Kompre"sdruck zu schalten.  Die beiden Zeilen
  7638. \begin{verbatim}
  7639.        PRTINIT "\15"
  7640.        PRTEXIT "\18"
  7641. \end{verbatim}
  7642. sorgen daf"ur, da"s der Kompre"sdruck ein- und nach dem Druck wieder
  7643. ausgeschaltet wird.
  7644.  
  7645. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7646.  
  7647. \subsection{TITLE}
  7648. \ttindex{TITLE}
  7649.  
  7650. Normalerweise versieht der Assembler bereits jede Listingseite mit
  7651. einer Titelzeile, die Quelldatei, Datum und Uhrzeit enth"alt.  Mit
  7652. diesem Befehl kann man den Seitenkopf um eine beliebige zus"atzliche
  7653. Zeile erweitern.  Der anzugebende String ist dabei ein beliebiger
  7654. Stringausdruck.
  7655. \par
  7656. Beispiel:
  7657. \par
  7658. Bei dem bereits oben angesprochenenen Epson-Drucker soll eine Titelzeile
  7659. im Breitdruck ausgegeben werden, wozu vorher der Kompre"smodus
  7660. abgeschaltet werden mu"s:
  7661. \begin{verbatim}
  7662.        TITLE   "\18\14Breiter Titel\15"
  7663. \end{verbatim}
  7664. (Epson-Drucker schalten den Breitdruck automatisch am Zeilenende aus.)
  7665.  
  7666. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7667.  
  7668. \subsection{RADIX}
  7669. \ttindex{RADIX}
  7670. \ttindex{DECIMAL}
  7671. \ttindex{OCTAL}
  7672.  
  7673. \tty{RADIX} mit einem numerischen Argument zwischen 2 und 36 legt das
  7674. Default-Zahlensystem f"ur Integer-Konstanten fest, d.h. das Zahlensystem,
  7675. das angenommen wird, wenn man nichts ausdr"ucklich anderes angegeben hat.
  7676. Defaultm"a"sig ist dies 10, und bei der Ver"anderung dieses Wertes sind
  7677. einige Fallstricke zu beachten, die in Abschnitt \ref{SectIntConsts}
  7678. beschrieben sind.
  7679.  
  7680. Unabh"angig von der momentanen Einstellung ist das Argument von {\tt
  7681. RADIX} {\em immer dezimal}; weiterhin d"urfen keine symbolischen oder
  7682. Formelausdr"ucke verwendet werden, sondern nur einfache Zahlenkonstanten!
  7683.  
  7684. Eine {\tt RADIX}-Anweisung "ubersteuert einen eventuell gesetzten
  7685. {\tt -radix}-Schalter auf der Kommandozeile.
  7686.  
  7687. Auf dem IM61x0 stehen die Anweisungen \tty{DECIMAL} und \tty{OCTAL} zur
  7688. Verf"ugung, dies sind Kurzschreibweisen f"ur \tty{RADIX 10} beziehungsweise
  7689. \tty{RADIX 8}.
  7690.  
  7691. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7692.  
  7693. \subsection{OUTRADIX}
  7694. \ttindex{OUTRADIX}
  7695.  
  7696. \tty{OUTRADIX} is gewisserma"sen das Gegenst"uck zu \tty{RADIX}: Mit ihm
  7697. kann man festlegen, in welchem Zahlensystem berechnete Integer-Ausdr"ucke
  7698. in Strings eingesetzt werden sollen, wenn man \verb!\{...}!-Konstrukte in
  7699. Stringkonstanten verwendet (siehe Abschnitt \ref{SectStringConsts}).  Als
  7700. Argument sind wieder Werte zwischen 2 und 36 erlaubt; der Default ist 16.
  7701.  
  7702. %%---------------------------------------------------------------------------
  7703.  
  7704. \section{lokale Symbole}
  7705. \label{ChapLocSyms}
  7706.  
  7707. {\em G"ultigkeit: alle Prozessoren}
  7708.  
  7709. Bei den lokalen Labels und den dazu eingef"uhrten Sektionen handelt es
  7710. sich um eine grundlegend neue Funktion, die mit Version 1.39 eingef"uhrt
  7711. wird.  Da dieser Teil sozusagen ,,1.0'' ist, ist er sicherlich noch nicht
  7712. der Weisheit letzter Schlu"s.  Anregungen und (konstruktive) Kritik sind
  7713. daher besonders erw"unscht.  Insbesondere habe ich die Verwendung von
  7714. Sektionen hier so dargestellt, wie ich sie mir vorstelle.  Es kann dadurch
  7715. passiert sein, da"s die Realit"at nicht ganz meinem Modell im Kopf entspricht.
  7716. F"ur den Fall von Diskrepanzen verspreche ich, da"s die Realit"at der
  7717. Dokumentation angepa"st wird, und nicht umgekehrt, wie es bei gr"o"seren
  7718. Firmen schon einmal vorgekommen sein soll...
  7719. \par
  7720. \asname{} erzeugt keinen linkf"ahigen Code (und wird es wohl auch nicht in n"aherer
  7721. Zukunft tun \tty{:-(} ).  Diese Tatsache zwingt dazu, ein Programm immer im ganzen
  7722. zu "ubersetzen.  Dieser Technik gegen"uber h"atte eine Aufteilung in
  7723. Linker-Module einige Vorteile:
  7724. \begin{itemize}
  7725. \item{k"urzere "Ubersetzungszeiten, da lediglich die ge"anderten Module
  7726.      neu "ubersetzt werden m"ussen;}
  7727. \item{die M"oglichkeit, durch Definition "offentlicher und privater
  7728.      Symbole definierte Schnittstellen zwischen den Modulen festzulegen;}
  7729. \item{Durch die geringere L"ange der einzelnen Module reduziert sich die
  7730.      Anzahl der Symbole im einzelnen Modul, so da"s k"urzere und trotzdem
  7731.      eindeutige Symbolnamen benutzt werden k"onnen.}
  7732. \end{itemize}
  7733. Insbesondere der letzte Punkt hat mich pers"onlich immer etwas gest"ort:
  7734. War ein Label-Name einmal am Anfang eines 2000 Zeilen langen Programms
  7735. benutzt, so durfte er nirgendwo wieder verwendet werden --- auch nicht am
  7736. anderen Ende des Quelltextes, wo Routinen mit ganz anderem Kontext standen.
  7737. Ich war dadurch gezwungen, zusammengesetzte Namen der Form
  7738. \begin{verbatim}
  7739. <Unterprogrammname>_<Symbolname>
  7740. \end{verbatim}
  7741. zu verwenden, die dann L"angen zwischen 15 und 25 Zeichen hatten und das
  7742. Programm un"ubersichtlich machten.
  7743. Das im folgenden eingehender beschriebene Sektionen-Konzept sollte zumindest
  7744. den beiden letzten genannten Punkten abhelfen.  Es ist vollst"andig optional:
  7745. Wollen Sie keine Sektionen verwenden, so lassen Sie es einfach bleiben
  7746. und arbeiten weiter wie unter den "alteren \asname{}-Versionen.
  7747.  
  7748. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7749.  
  7750. \subsection{Grunddefinition (SECTION/ENDSECTION)}
  7751.  
  7752. Eine \ii{Sektion} stellt einen durch spezielle Befehle eingerahmten
  7753. Teil des Assembler-Programms dar und hat einen vom Programmierer
  7754. festlegbaren, eindeutigen Namen:
  7755. \begin{verbatim}
  7756.        ...
  7757.        <anderer Code>
  7758.        ...
  7759.        SECTION <Sektionsname>
  7760.        ...
  7761.        <Code in der Sektion>
  7762.        ...
  7763.        ENDSECTION [Sektionsname]
  7764.        ...
  7765.        <anderer Code>
  7766.        ...
  7767. \end{verbatim}
  7768. Der Name f"ur eine Sektion mu"s den Konventionen f"ur einen Symbolnamen
  7769. entsprechen; da \asname{} Sektions-und Symbolnamen in getrennten Tabellen speichert,
  7770. darf ein Name sowohl f"ur ein Symbol als auch eine Sektion verwendet werden.
  7771. Sektionsnamen m"ussen in dem Sinne eindeutig sein, da"s auf einer Ebene
  7772. nicht zwei Sektionen den gleichen Namen haben d"urfen (was es mit den
  7773. ,,Ebenen'' auf sich hat, erl"autere ich im n"achsten Abschnitt).  Das Argument
  7774. zu \tty{ENDSECTION} ist optional, es darf auch weggelassen werden; Falls
  7775. es weggelassen wird, zeigt \asname{} den Namen der Sektion an, der er das
  7776. \tty{ENDSECTION} zugeordnet hat.  Code in einer Sektion wird von \asname{} genauso
  7777. behandelt wie au"serhalb, lediglich mit drei entscheidenden Unterschieden:
  7778. \begin{itemize}
  7779. \item{Innerhalb der Sektion definierte Symbole (z.B. Labels, \tty{EQU}s...) werden
  7780.      mit einer von \asname{} intern vergebenen, der Sektion zugeordneten Nummer
  7781.      versehen.  Diese Symbole sind von Code au"serhalb der Sektion nicht
  7782.      ansprechbar (das l"a"st sich nat"urlich durch Pseudobefehle variieren,
  7783.      aber dazu sp"ater mehr).}
  7784. \item{Durch das zus"atzliche Attribut kann ein Symbolname sowohl au"serhalb
  7785.      der Sektion als auch innerhalb definiert werden, das Attribut erlaubt
  7786.      also, Symbolnamen mehrfach zu benutzen, ohne da"s \asname{} Protest anmeldet.}
  7787. \item{Falls ein Symbol sowohl au"serhalb als auch innerhalb definiert ist,
  7788.      wird innerhalb der Sektion das ,,lokale'' verwendet, d.h. \asname{} sucht
  7789.      in der Symboltabelle zuerst nach einem Symbol des gew"unschten Namens,
  7790.      das auch gleichzeitig der Sektion zugeordnet wurde.  Erst danach wird
  7791.      nach einem globalen Symbol dieses Namens gefahndet.}
  7792. \end{itemize}
  7793. Mit diesem Mechanismus kann man z.B. den Code in Module aufteilen, wie man
  7794. es mit einem Linker getan h"atte.  Eine feinere Aufteilung w"are dagegen,
  7795. alle Routinen in getrennte Sektionen zu verpacken.  Je nach L"ange der
  7796. Routinen k"onnen die nur intern ben"otigten Symbole dann sehr kurze Namen
  7797. haben.
  7798. \par
  7799. Defaultm"a"sig unterscheidet \asname{} Gro"s-und Kleinschreibung in Sektions-
  7800. namen nicht; schaltet man jedoch in den case-sensitiven Modus um, so
  7801. wird die Schreibweise genauso wie bei Symbolnamen ber"ucksichtigt.
  7802. \par
  7803. Die bisher beschriebene Aufteilung w"urde in etwa der Sprache C entsprechen,
  7804. in der alle Funktionen auf gleicher Ebene nebeneinander stehen.  Da mein
  7805. ,,hochsprachliches'' Vorbild aber Pascal ist, bin ich noch einen Schritt
  7806. weiter gegangen:
  7807.  
  7808. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7809.  
  7810. \subsection{Verschachtelung und Sichtbarkeitsregeln}
  7811.  
  7812. Es ist erlaubt, in einer Sektion weitere Sektionen zu definieren, analog
  7813. zu der M"oglichkeit in Pascal, in einer Prozedur/Funktion weitere
  7814. Prozeduren zu definieren.  Dies zeigt folgendes Beispiel:
  7815. \begin{verbatim}
  7816. sym     EQU        0
  7817.  
  7818.        SECTION    ModulA
  7819.         SECTION    ProcA1
  7820. sym       EQU        5
  7821.         ENDSECTION ProcA1
  7822.         SECTION    ProcA2
  7823. sym       EQU        10
  7824.         ENDSECTION ProcA2
  7825.        ENDSECTION ModulA
  7826.  
  7827.        SECTION    ModulB
  7828. sym      EQU        15
  7829.         SECTION    ProcB
  7830.         ENDSECTION ProcB
  7831.        ENDSECTION ModulB
  7832. \end{verbatim}
  7833. Bei der Suche nach einem Symbol sucht \asname{} zuerst ein Symbol, das der aktuellen
  7834. Sektion zugeordnet ist, und geht danach die ganze ,,Liste'' der Vatersektionen
  7835. durch, bis er bei den globalen Symbolen angekommen ist.  Im Beispiel sehen
  7836. die Sektionen die in Tabelle \ref{TabSymErg} angegebenen Werte f"ur das Symbol
  7837. \tty{sym}.
  7838. \begin{table*}[htb]
  7839. \begin{center}\begin{tabular}{|l|l|l|}
  7840. \hline
  7841. Sektion      &    Wert   &   aus Sektion... \\
  7842. \hline
  7843. \hline
  7844. Global       &     0     &    Global        \\
  7845. \hline
  7846. \tty{ModulA} &     0     &    Global        \\
  7847. \hline
  7848. \tty{ProcA1} &     5     &    \tty{ProcA1}  \\
  7849. \hline
  7850. \tty{ProcA2} &    10     &    \tty{ProcA2}  \\
  7851. \hline
  7852. \tty{ModulB} &    15     &    \tty{ModulB}  \\
  7853. \hline
  7854. \tty{ProcB}  &    15     &    \tty{ModulB}  \\
  7855. \hline
  7856. \end{tabular}\end{center}
  7857. \caption{F"ur die einzelnen Sektionen g"ultigen Werte\label{TabSymErg}}
  7858. \end{table*}
  7859. Diese Regel kann man durchbrechen, indem man explizit an den Symbolnamen
  7860. die Sektion anh"angt, aus der man das Symbol holen will, und zwar in
  7861. eckigen Klammern am Ende des Symbolnamens:
  7862. \begin{verbatim}
  7863.        move.l  #sym[ModulB],d0
  7864. \end{verbatim}
  7865. Es d"urfen dabei nur Sektionsnamen verwendet werden, die eine Obersektion
  7866. zur aktuellen Sektion darstellen.  Als Sonderwert sind die Namen
  7867. \tty{PARENT0..PARENT9} erlaubt, mit denen man die n-ten ,,Vatersektionen''
  7868. relativ zur momentanen Sektion ansprechen kann; \tty{PARENT0} entspricht
  7869. also der momentanen Sektion selber, \tty{PARENT1} der direkt "ubergeordneten
  7870. usw.  Anstelle \tty{PARENT1} kann man auch kurz nur \tty{PARENT} schreiben.
  7871. L"a"st man dagegen den Platz zwischen den Klammern komplett frei, also
  7872. etwa so
  7873. \begin{verbatim}
  7874.        move.l  #sym[],d0 ,
  7875. \end{verbatim}
  7876. so erreicht man das globale Symbol.  \bb{ACHTUNG!} Wenn man explizit ein
  7877. Symbol aus einer Sektion anspricht, so wird auch nur noch bei den
  7878. Symbolen dieser Sektion gesucht, der Sektionsbaum wird nicht mehr
  7879. bis nach oben durchgegangen!
  7880. \par
  7881. Analog zu Pascal ist es erlaubt, da"s verschiedene Sektionen Untersektionen
  7882. gleichen Namens haben d"urfen, das Prinzip der Lokalit"at verhindert hier
  7883. Irritationen.  M.E. sollte man davon aber trotzdem sparsamen Gebrauch machen,
  7884. da in Symbol-und Querverweisliste Symbole zwar mit der Sektion, in der sie
  7885. definiert wurden, gekennzeichnet werden, aber nicht mit der "uber dieser
  7886. Sektion evtl. liegenden ,,Sektionshierarchie'' (das h"atte einfach den Platz
  7887. in der Zeile gesprengt); Unterscheidungen sind dadurch nicht erkennbar.
  7888. \par
  7889. Da ein \tty{SECTION}-Befehl von selber kein Label definiert, besteht hier
  7890. ein wichtiger Unterschied zu Pascal: Eine Pascal-Prozedur kann
  7891. ihre Unterprozeduren/funktionen automatisch ,,sehen'', unter \asname{} mu"s man
  7892. noch einen Einsprungpunkt extra definieren.  Das kann man z.B. mit folgendem
  7893. Makro-P"archen tun:
  7894. \begin{verbatim}
  7895. proc    MACRO   name
  7896.        SECTION name
  7897. name    LABEL   $
  7898.        ENDM
  7899.  
  7900. endp    MACRO   name
  7901.        ENDSECTION name
  7902.        ENDM
  7903. \end{verbatim}
  7904. Diese Beispiel zeigt gleichzeitig, da"s die Lokalit"at von Labels in
  7905. Makros nicht von den Sektionen beeinflu"st wird, deshalb der Trick mit dem
  7906. \tty{LABEL}-Befehl.
  7907. \par
  7908. Nat"urlich ist mit dieser Definition das Problen noch nicht ganz gel"ost,
  7909. bisher ist das Einsprung-Label ja noch lokal und von au"sen nicht zu
  7910. erreichen.  Wer nun meint, man h"atte das Label einfach nur vor der
  7911. SECTION-Anweisung plazieren m"ussen, sei jetzt bitte ruhig, denn er
  7912. verdirbt mir den "Ubergang auf das n"achste Thema:
  7913.  
  7914. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7915.  
  7916. \subsection{PUBLIC und GLOBAL}
  7917.  
  7918. Die \tty{PUBLIC}-Anweisung erlaubt es, die Zugeh"origkeit eines Symbols
  7919. zu einer bestimmten Sektion zu ver"andern.  Es ist m"oglich, mit einem
  7920. \tty{PUBLIC}-Befehl mehrere Symbole zu bearbeiten, ohne Beschr"ankung
  7921. der Allgemeinheit will ich aber ein Beispiel mit nur einer Variable verwenden:
  7922. Im einfachsten Falle erkl"art man ein Symbol als vollst"andig global, d.h.
  7923. es ist von allen Stellen des Programms ansprechbar:
  7924. \begin{verbatim}
  7925.        PUBLIC  <Name>
  7926. \end{verbatim}
  7927. Da ein Symbol bei seiner Definition endg"ultig in der Symboltabelle
  7928. einsortiert wird, mu"s diese Anweisung \bb{vor} der Definition des
  7929. Symbols erfolgen.  Alle \tty{PUBLIC}s werden von \asname{} in einer Liste
  7930. vermerkt und bei ihrer Definition aus dieser Liste wieder entfernt.  Bei
  7931. Beendigung einer Sektion gibt \asname{} Fehlermeldungen f"ur alle nicht
  7932. aufgel"osten ,,Vorw"artsreferenzen'' aus.
  7933. \par
  7934. Angesichts des hierarchischen Sektionenkonzepts erscheint die Methode,
  7935. ein Symbol als vollst"andig global zu definieren, reichlich brachial.
  7936. Es geht aber auch etwas differenzierter, indem man zus"atzlich einen
  7937. Sektionsnamen angibt:
  7938. \begin{verbatim}
  7939.        PUBLIC  <Name>:<Sektion>
  7940. \end{verbatim}
  7941. Damit wird das Symbol der genannten Sektion zugeordnet und damit auch
  7942. allen ihren Untersektionen zug"anglich (es sei denn, diese definieren
  7943. wiederum ein Symbol gleichen Namens, das dann das ,,globalere''
  7944. "ubersteuert).  Naturgem"a"s protestiert \asname{}, falls mehrere Untersektionen
  7945. ein Symbol gleichen Namens auf die gleiche Ebene exportieren wollen.
  7946. Als Spezialwert f"ur \tty{$<$Sektion$>$} sind die im vorigen Abschnitt
  7947. genannten \tty{PARENTx}-Namen zugelassen, um das Symbol genau n Ebenen hinaufzuexportieren.
  7948. Es sind als Sektionen nur der momentanen Sektion "ubergeordnete Sektionen
  7949. zugelassen, also keine, die im Baum aller Sektionen in einem anderen Zweig
  7950. stehen.  Sollten dabei mehrere Sektionen den gleichen Namen haben (dies ist
  7951. legal), so wird die tiefste gew"ahlt.
  7952. \par
  7953. Mit diesem Werkzeug kann das obige Prozedurmakro nun Sinn ergeben:
  7954. \begin{verbatim}
  7955. proc    MACRO   name
  7956.        SECTION name
  7957.        PUBLIC  name:PARENT
  7958. name    LABEL   $
  7959.        ENDM
  7960. \end{verbatim}
  7961. Diese Einstellung entspricht dem Modell von Pascal, in der eine
  7962. Unterprozedur auch nur von ihrem ,,Vater'' gesehen werden kann, jedoch
  7963. nicht vom ,,Gro"svater''.
  7964. \par
  7965. Falls mehrere Untersektionen versuchen, ein Symbol gleichen Namens
  7966. in die gleiche Obersektion zu exportieren, meckert \asname{} "uber doppelt
  7967. definierte Symbole, was an sich ja korrekt ist.  War das gewollt,
  7968. so mu"s man die Symbole in irgendeiner Weise ,,qualifizieren'', damit
  7969. sie voneinander unterschieden werden k"onnen.  Dies ist mit der
  7970. \tty{GLOBAL}-Anweisung m"oglich.  Die Syntax von \tty{GLOBAL} ist
  7971. der von \tty{PUBLIC} identisch, das Symbol bleibt aber lokal, anstatt
  7972. einer h"oheren Sektion zugeordnet zu werden.  Stattdessen wird ein
  7973. weiteres Symbol gleichen Werts erzeugt, dem jedoch der Untersektionsname
  7974. mit einem Unterstrich vorangestellt wird, und nur dieses Symbol wird der
  7975. Sektionsangabe entsprechend "offentlich gemacht.  Definieren z.B. zwei
  7976. Sektionen \tty{A} und \tty{B} ein Symbol \tty{SYM} und exportieren
  7977. es mit  \tty{GLOBAL} zu ihrer Vatersektion, so werden dort die Symbole
  7978. unter den Namen \tty{A\_SYM} und \tty{B\_SYM} eingeordnet.
  7979. \par
  7980. Falls zwischen Quell- und Zielsektion mehrere Stufen stehen sollten,
  7981. so wird entsprechend der komplette Namenszweig von der Ziel- bis zur
  7982. Quellsektion dem Symbolnamen vorangestellt.
  7983.  
  7984. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7985.  
  7986. \subsection{FORWARD}
  7987.  
  7988. So sch"on das bisher besprochene Modell ist, ein bei Pascal nicht
  7989. auftauchendes Detail macht "Arger: die bei Assembler m"oglichen
  7990. Vorw"artsreferenzen.  Bei Vorw"artsreferenzen kann es sein, da"s \asname{}
  7991. im ersten Pass auf ein Symbol einer h"oheren Sektion zugreift.  Dies
  7992. ist an sich nicht weiter tragisch, solange im zweiten Pass das richtige
  7993. Symbol genommen wird, es k"onnen aber Unf"alle der folgenden Art passieren:
  7994. \begin{verbatim}
  7995. loop:   .
  7996.        <Code>
  7997.        ..
  7998.        SECTION sub
  7999.        ..              ; ***
  8000.        bra.s   loop
  8001.        ..
  8002. loop:   ..
  8003.        ENDSECTION
  8004.        ..
  8005.        jmp     loop    ; Hauptschleife
  8006. \end{verbatim}
  8007. \asname{} wird im ersten Pass das globale Label \tty{loop} verwenden, sofern
  8008. das Programmst"uck bei \tty{$<$Code$>$} hinreichend lang ist, wird er
  8009. sich "uber eine zu gro"se Sprungdistanz beklagen und den zweiten Pass erst
  8010. gar nicht versuchen.  Um die Uneindeutigkeit zu vermeiden, kann man den
  8011. Symbolnamen mit einem expliziten Bezug versehen:
  8012. \begin{verbatim}
  8013.        bra.s   loop[sub]
  8014. \end{verbatim}
  8015. Falls ein lokales Symbol h"aufig referenziert wird, k"onnen die vielen
  8016. Klammern mit dem \tty{FORWARD}-Befehl eingespart werden.  Das Symbol
  8017. wird damit explizit als lokal angek"undigt.  \asname{} wird dann bei Zugriffen
  8018. auf dieses Symbol automatisch nur im lokalen Symbolbereich suchen.
  8019. In diesem Falle m"u"ste an der mit \tty{***} gekennzeichneten Stelle
  8020. daf"ur der Befehl
  8021. \begin{verbatim}
  8022.        FORWARD loop
  8023. \end{verbatim}
  8024. stehen.
  8025. Damit \tty{FORWARD} Sinn macht, mu"s es nicht nur vor der Definition des
  8026. Symbols, sondern vor seiner ersten Benutzung in der Sektion gegeben werden.
  8027. Ein Symbol gleichzeitig privat und "offentlich zu definieren, ergibt keinen
  8028. Sinn und wird von \asname{} auch angemahnt.
  8029.  
  8030. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8031.  
  8032. \subsection{Geschwindigkeitsaspekte}
  8033.  
  8034. Die mehrstufige Suche in der Symboltabelle und die Entscheidung, mit welchem
  8035. Attribut ein Symbol eingetragen werden soll, kosten naturgem"a"s etwas
  8036. Rechenzeit.  Ein 1800 Zeilen langes 8086-Programm z.B. wurde nach der
  8037. Umstellung auf Sektionen statt in 33 in 34,5 Sekunden assembliert
  8038. (80386 SX, 16MHz, 3 Durchg"ange).  Der Overhead h"alt sich also in Grenzen:
  8039. Ob man ihn in Kauf nehmen will, ist (wie am Anfang erw"ahnt) eine Frage des
  8040. Geschmacks;  man kann \asname{} genauso gut ohne Sektionen verwenden.
  8041.  
  8042. %%---------------------------------------------------------------------------
  8043.  
  8044. \section{Diverses}
  8045.  
  8046. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8047.  
  8048. \subsection{SHARED}
  8049. \label{ChapShareOrder} \ttindex{SHARED}
  8050.  
  8051. {\em G"ultigkeit: alle Prozessoren}
  8052.  
  8053. Mit diesem Befehl weist man den \asname{} an, die in der Parameterliste
  8054. angegebenen Symbole (egal ob Integer, Gleitkomma oder String) im
  8055. Sharefile mit ihren Werten abzulegen.  Ob eine solche Datei "uberhaupt
  8056. und in welchem Format erzeugt wird, h"angt von den in
  8057. \ref{SectCallConvention} beschriebenen Kommandozeilenschaltern ab.
  8058. Findet \asname{} diesen Befehl und es wird keine Datei erzeugt, f"uhrt das zu
  8059. einer Warnung.
  8060. \par
  8061. \bb{VORSICHT!} Ein eventuell der Befehlszeile anh"angender Kommentar
  8062. wird  in die erste, ausgegebene Zeile mit "ubertragen (sofern die
  8063. Argumentliste von \tty{SHARED} leer ist, wird nur der Kommentar ausgegeben).
  8064. Falls die Share-Datei f"ur C oder Pascal erzeugt wird, sind einen
  8065. C/Pascal-Kommentar schlie"sende Zeichenfolgen (\verb!*/! bzw.
  8066. \verb!*)!) im Kommentar zu vermeiden.  \asname{} pr"uft dies \ii{nicht}!
  8067.  
  8068. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8069.  
  8070. \subsection{INCLUDE}
  8071. \ttindex{INCLUDE}\label{SectInclude}
  8072.  
  8073. {\em G"ultigkeit: alle Prozessoren}
  8074.  
  8075. Dieser Befehl f"ugt die im Parameter angegebene Datei (die optional in
  8076. G"an\-se\-f"u"s\-chen eingeschlossen sein darf) so im Text ein, als ob sie dort
  8077. stehen w"urde.  Dieser Befehl ist sinnvoll, um Quelldateien aufzuspalten,
  8078. die alleine nicht in den Speicher passen w"urden oder um sich ''Toolboxen''
  8079. zu erzeugen.
  8080. \par
  8081. Falls der angegebene Dateiname keine Endung hat, wird in einem ersten
  8082. Schritt eine Endung \tty{.INC} angenommen.  Erst wenn keine solche Datei
  8083. existiert, oder der angegebene Name bereits einen Punkt und damit eine Endung
  8084. enth"alt, wird nach einer Datei genau mit dem anggegebenen Namen gesucht.
  8085. \par
  8086. Der Assembler versucht als erstes, die Datei in dem Verzeichnis
  8087. zu finden, in dem sich auch die Quelldatei befindet, die das \tty{INCLUDE}-Statement
  8088. enth"alt - ein eventuell in der Dateiangabe enthaltener Pfad ist also relativ
  8089. zu deren Pfad, und nicht zu dem Verzeichnis, von dem aus man den Assembler
  8090. aufgerufen hat.  Mit der Kommandozeilenoption
  8091. \begin{verbatim}
  8092.   -i <Pfadliste>
  8093. \end{verbatim}
  8094. l"a"st sich eine Liste von Verzeichnissen angeben, in denen automatisch
  8095. zus"atzlich nach der Include-Datei gesucht werden soll.  Wird die Datei
  8096. nicht gefunden, so ist dies ein \ii{fataler} Fehler, d.h. der Assembler
  8097. bricht sofort ab.
  8098. \par
  8099. Aus Kompatibilit"atsgr"unden ist es erlaubt, den Namen in G"ansef"u"schen
  8100. zu schreiben,
  8101. \begin{verbatim}
  8102.        INCLUDE stddef51
  8103. \end{verbatim}
  8104. und
  8105. \begin{verbatim}
  8106.        INCLUDE "stddef51.inc"
  8107. \end{verbatim}
  8108. sind also "aquivalent.  \bb{ACHTUNG!} Wegen dieser Wahlfreiheit ist
  8109. hier nur eine Stringkonstante, aber kein Stringausdruck zul"assig!
  8110.  
  8111. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8112.  
  8113. \subsection{BINCLUDE}
  8114. \ttindex{BINCLUDE}
  8115.  
  8116. {\em G"ultigkeit: alle Prozessoren}
  8117.  
  8118. \tty{BINCLUDE} dient dazu, in den von \asname{} erzeugten Code Bin"ardaten
  8119. einzubetten, die von einem anderen Programm erzeugt wurden (das kann
  8120. nat"urlich theoretisch auch von \asname{} selber erzeugter Code sein...).
  8121. \tty{BINCLUDE} hat drei Formen:
  8122. \begin{verbatim}
  8123.   BINCLUDE <Datei>
  8124. \end{verbatim}
  8125. In dieser Form wird die Datei komplett eingebunden.
  8126. \begin{verbatim}
  8127.   BINCLUDE <Datei>,<Offset>
  8128. \end{verbatim}
  8129. In dieser Form wird der Inhalt der Datei ab \verb!<Offset>! bis zum Ende
  8130. der Datei eingebunden.
  8131. \begin{verbatim}
  8132.   BINCLUDE <Datei>,<Offset>,<Len>
  8133. \end{verbatim}
  8134. In dieser Form werden \verb!<Len>! Bytes ab Offset \verb!<Offset>! eingebunden.
  8135. \par
  8136. Es gelten die gleichen Regeln bez"uglich Suchpfaden und impliziten Suffixen
  8137. wie bei \tty{INCLUDE}.
  8138.  
  8139. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8140.  
  8141. \subsection{MESSAGE, WARNING, ERROR und FATAL}
  8142. \ttindex{MESSAGE}\ttindex{WARNING}\ttindex{ERROR}\ttindex{FATAL}
  8143.  
  8144. {\em G"ultigkeit: alle Prozessoren}
  8145.  
  8146. Der Assembler pr"uft zwar die Quelltexte so streng wie m"oglich und
  8147. liefert differenzierte Fehlermeldungen, je nach Anwendung kann es
  8148. aber sinnvoll sein, unter bestimmten Bedingungen zus"atzliche
  8149. Fehlermeldungen auszul"osen, mit denen sich logische Fehler automatisch
  8150. pr"ufen lassen.  Der Assembler unterscheidet drei Typen von Fehlermeldungen,
  8151. die "uber die drei Befehle auch dem Programmierer zug"anglich sind:
  8152. \begin{itemize}
  8153. \item{\tty{WARNING}: Fehler, die auf m"oglicherweise falschen oder
  8154.      ineffizienten Code hinweisen.  Die Assemblierung l"auft weiter,
  8155.      eine Codedatei wird erzeugt.}
  8156. \item{\tty{ERROR}: echte Fehler im Programm.  Die Assemblierung l"auft weiter,
  8157.      um m"ogliche weitere Fehler in einem Durchgang entdecken und
  8158.      korrigieren zu k"onnen.  Eine Codedatei wird nicht erzeugt.}
  8159. \item{\tty{FATAL}: schwerwiegende Fehler, die einen sofortigen Abbruch des
  8160.      Assemblers bedingen.  Eine Codedatei kann m"oglicherweise entstehen,
  8161.      ist aber unvollst"andig.}
  8162. \end{itemize}
  8163. Allen drei Befehlen ist das Format gemeinsam, in dem die Fehlermeldung
  8164. angegeben werden mu"s: Ein beliebiger String-Ausdruck, der sowohl eine einfache
  8165. Konstante als auch eine komplizierte Formel sein darf, die zu einem String
  8166. evaluiert.  Dies schlie"st auch die in \ref{SectSymConv} beschriebene
  8167. Funktion ein, um Zahlenwerte mit auszugeben:
  8168. \begin{verbatim}
  8169.       message "Startadresse ist \{start_address}"
  8170. \end{verbatim}
  8171. Diejenigen Anweisungen, die Warnungen oder Fehlermeldungen erzeugen, ergeben
  8172. nur in Zusammenhang mit bedingter Assemblierung Sinn.  Ist f"ur ein Programm
  8173. z.B. nur ein begrenzter Adre"sraum vorhanden, so kann man den "Uberlauf
  8174. folgenderma"sen testen:
  8175. \begin{verbatim}
  8176. ROMSize equ     8000h   ; 27256-EPROM
  8177.  
  8178. ProgStart: ..
  8179.        <das eigentliche Programm>
  8180.           ..
  8181. ProgEnd:
  8182.        if      ProgEnd-ProgStart>ROMSize
  8183.         error   "\aDas Programm ist zu lang!"
  8184.        endif
  8185. \end{verbatim}
  8186. Neben diesen fehlererzeugenden Befehlen gibt es noch den Befehl
  8187. \tty{MESSAGE}, der einfach nur eine Meldung im Listing und auf
  8188. der Konsole erzeugt (letzteres nur, wenn nicht im quiet-Modus
  8189. gearbeitet wird).  Seine Benutzung ist den anderen drei Befehlen
  8190. gleich.
  8191.  
  8192. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8193.  
  8194. \subsection{READ}
  8195. \ttindex{READ}
  8196.  
  8197. {\em G"ultigkeit: alle Prozessoren}
  8198.  
  8199. \tty{READ} ist sozusagen das Gegenst"uck zu der vorigen Befehlsgruppe: mit
  8200. ihm ist es m"oglich, \ii{w"ahrend} der Assemblierung Werte von der
  8201. Tastatur einzulesen.  Wozu das gut sein soll?  Um das darzulegen, soll
  8202. hier ausnahmsweise einmal das Beispiel vor die genauere Erl"auterung
  8203. gezogen werden:
  8204. \par
  8205. Ein Programm ben"otigt zum Datentransfer einen Puffer mit einer zur
  8206. "Ubersetzungszeit festzulegenden Gr"o"se.  Um die Gr"o"se des Puffers
  8207. festzulegen, k"onnte man sie einmal mit \tty{EQU} in einem Symbol
  8208. ablegen, es geht aber auch interaktiv mit \tty{READ} :
  8209. \begin{verbatim}
  8210.        IF      MomPass=1
  8211.         READ    "Puffer (Bytes)",BufferSize
  8212.        ENDIF
  8213. \end{verbatim}
  8214. Auf diese Weise k"onnen Programme sich w"ahrend der "Ubersetzung
  8215. interaktiv konfigurieren, man kann sein Programm z.B. jemandem geben,
  8216. der es mit seinen Parametern "ubersetzen kann, ohne im Quellcode
  8217. ,,herumstochern'' zu m"ussen.  Die im Beispiel gezeigte \tty{IF-}
  8218. Abfrage sollte "ubrigens immer verwendet werden, damit der Anwender
  8219. nur einmal mit der Abfrage bel"astigt wird.
  8220. \par
  8221. \tty{READ} "ahnelt sehr stark dem \tty{SET-} Befehl, nur da"s der
  8222. dem Symbol zuzuweisende Wert nicht rechts vom Schl"usselwort steht,
  8223. sondern von der Tastatur eingelesen wird.  Dies bedeutet z.B. auch,
  8224. da"s \asname{} anhand der Eingabe automatisch festlegt, ob es sich um eine
  8225. Integer- oder Gleitkommazahl oder einen String handelt und anstelle
  8226. einzelner Konstanten auch ganze Formelausdr"ucke eingegeben werden
  8227. k"onnen.
  8228. \par
  8229. \tty{READ} darf entweder nur einen Parameter oder zwei Parameter
  8230. haben, denn die Meldung zur Eingabeaufforderung ist optional.  Fehlt
  8231. sie, so gibt \asname{} eine aus dem Symbolnamen konstruierte Meldung aus.
  8232.  
  8233. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8234.  
  8235. \subsection{INTSYNTAX}
  8236. \label{SectINTSYNTAX}
  8237. \ttindex{INTSYNTAX}
  8238.  
  8239. {\em G"ultigkeit: alle Prozessoren}
  8240.  
  8241. Mit diesem Befehl kann die Menge der Schreibweisen, die f"ur Integer-Konstanten
  8242. in verschiedenen Zahlensystemen zul"assig sind, ver"andert werden.  Nach Auswahl
  8243. eines bestimmten Zieles gilt ein bestimmter Default-Satz (siehe Abschnitt
  8244. \ref{SectPseudoInst}), der um einzelne Schreibweisen erg"anzt oder bereinigt werden
  8245. kann. \tty{INTSYNTAX} akzeptiert eine beliebige Liste von Argumenten, von denen
  8246. jedes mit einem Plus- oder Minuszeichen beginnt, direkt gefolgt von der Kennung
  8247. der jeweiligen Schreibweise.  So stellt man z.B. mit folgendem Befehl
  8248. \begin{verbatim}
  8249.       intsyntax    -0oct,+0hex
  8250. \end{verbatim}
  8251. ein, da"s eine f"uhrende Null keine Oktal-, sondern eine Hexadezimalzahl
  8252. kennzeichnet, was bei manchen Assemblern f"ur den SC/MP gebr"auchlich ist.  Die
  8253. Kennungen f"ur die einzelnen Schreibweisen finden sich in Tabelle \ref{TabSystems}.
  8254. Den Kombinationsm"oglichkeiten sind keine Grenzen gesetzt, au"ser wenn sich zwei
  8255. Schreibweisen direkt widersprechen.  Im obigen Beispiel w"are es z.B. nicht
  8256. erlaubt, gleichzeitig \tty{0oct} und \tty{0hex} einzuschalten.
  8257.  
  8258. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8259.  
  8260. \subsection{RELAXED}
  8261. \label{SectRELAXED}
  8262. \ttindex{RELAXED}
  8263.  
  8264. {\em G"ultigkeit: alle Prozessoren}
  8265.  
  8266. Defaultm"a"sig ist einer Prozessorfamilie eine bestimmte Schreibweise
  8267. von Integer-Konstanten zugeordnet (die i.a. der Herstellervorgabe
  8268. entspricht, solange der nicht eine allzu abgefahrene Syntax benutzt...).
  8269. Nun hat aber jeder seine pers"onlichen Vorlieben f"ur die eine oder
  8270. andere Schreibweise und kann gut damit leben, da"s sich seine Programme
  8271. nicht mehr mit dem Standard-Assembler "ubersetzen lassen. Setzt man ein
  8272. \begin{verbatim}
  8273.        RELAXED ON
  8274. \end{verbatim}
  8275. an den Programmanfang, so kann man fortan alle Schreibweisen beliebig
  8276. gemischt und durcheinander verwenden; bei jedem Ausdruck versucht \asname{}
  8277. automatisch zu ermitteln, welche Schreibweise verwendet wurde.  Da"s
  8278. diese Automatik nicht immer das Ergebnis liefert, das man sich vorgestellt
  8279. hat, ist auch der Grund, weshalb diese Option explizit eingeschaltet
  8280. werden mu"s (und man sich davor h"uten sollte, sie einfach in einem
  8281. existierenden Programm dazuzusetzen): Ist nicht durch vor- oder
  8282. nachgestellte Zeichen zu erkennen, da"s es sich um Intel- oder
  8283. Motorola-Konstanten handelt, wird im C-Modus gearbeitet.  Eventuell
  8284. vorangestellte, eigentlich "uberfl"ussige Nullen haben in diesem Modus
  8285. durchaus eine Bedeutung:
  8286. \begin{verbatim}
  8287.        move.b  #08,d0
  8288. \end{verbatim}
  8289. Diese Konstante w"urde als Oktalkonstante verstanden werden, und weil
  8290. Oktalzahlen nur Ziffern von 0..7 enthalten k"onnen, f"uhrt das zu einem
  8291. Fehler.  Dabei h"atte man in diesem Fall noch Gl"uck gehabt, bei der
  8292. Zahl \tty{077} z.B. h"atte man ohne Meldung Probleme bekommen.  Ohne
  8293. \tty{RELAXED}-Modus w"are in beiden F"allen klar gewesen, da"s es sich
  8294. um dezimale Konstanten handelt.
  8295. \par
  8296. Die momentane Einstellung kann aus dem gleichnamigen Symbol ausgelesen
  8297. werden.
  8298.  
  8299. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8300.  
  8301. \subsection{COMPMODE}
  8302. \label{SectCompMode}
  8303. \ttindex{COMPMODE}
  8304.  
  8305. {\em G"ultigkeit: verschiedene}
  8306.  
  8307. Auch wenn sich \asname{} bem"uht, sich m"oglichst genauso zu verhalten wie die
  8308. jeweiligen ''Original-Assembler'', so gibt es in der Praxis immer wieder
  8309. Details, wo ein hundertprozentiges Nachbilden des jeweiligen Original-
  8310. Verhaltens Optimierungen verhindern w"urde, die aus meiner Sicht valide
  8311. und n"utzlich sind.  Mit einem
  8312. \begin{verbatim}
  8313.        compmode on
  8314. \end{verbatim}
  8315. kann man in eine Betriebsart umschalten, die dem ''Original-Verhalten''
  8316. Vorrang vor optimalem Code gibt.  Ob f"ur das jeweilige Target solche
  8317. F"alle vorliegen, ist im jeweiligen Unterkapitel mit dem prozessorspezifischen
  8318. Hinweisen ausgef"uhrt.
  8319. \par
  8320. Im Default ist dieser Kompatibilit"ats-Modus ausgeschaltet, au"ser er
  8321. wurde durch die gleichnamige Kommandozeilen-Option eingeschaltet. Die
  8322. momentane Einstellung kann aus dem gleichnamigen Symbol ausgelesen
  8323. werden.
  8324.  
  8325. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8326.  
  8327. \subsection{END}
  8328. \ttindex{END}
  8329.  
  8330. {\em G"ultigkeit: alle Prozessoren}
  8331.  
  8332. \tty{END} kennzeichnet das Ende des Assemblerprogrammes.  Danach
  8333. noch in der Quelldatei stehende Zeilen werden ignoriert.
  8334. \bb{WICHTIG:} \tty{END} darf zwar aus einem Makro heraus aufgerufen
  8335. werden, der Stapel der bedingten Assemblierung wird aber nicht
  8336. automatisch abger"aumt.  Das folgende Konstrukt f"uhrt daher zu
  8337. einer Fehlermeldung:
  8338. \begin{verbatim}
  8339.        IF      KeineLustMehr
  8340.         END
  8341.        ENDIF
  8342. \end{verbatim}
  8343. Optional darf \tty{END} auch einen Integer-Ausdruck als Argument haben,
  8344. der den Startpunkt des Programms vermerkt.  Dieser wird von \asname{} in einem
  8345. speziellen Record der Datei vermerkt und kann z.B. von P2HEX
  8346. weiterverarbeitet werden.
  8347. \par
  8348. \tty{END} war eigentlich schon immer in \asname{} definiert, nur war es
  8349. bei fr"uheren Versionen von \asname{} aus Kompatibilit"at zu anderen
  8350. Assemblern vorhanden und hatte keine Wirkung.
  8351.  
  8352. %%===========================================================================
  8353.  
  8354. \cleardoublepage
  8355. \chapter{Prozessorspezifische Hinweise}
  8356.  
  8357. Ich habe mich bem"uht, die einzelnen Codegeneratoren m"oglichst kompatibel
  8358. zu den Originalassemblern zu halten, jedoch nur soweit, wie es keinen
  8359. unvertretbaren Mehraufwand bedeutete.  Wichtige Unterschiede, Details und
  8360. Fallstricke habe ich im folgenden aufgelistet.
  8361.  
  8362. %%---------------------------------------------------------------------------
  8363.  
  8364. \section{6811}
  8365.  
  8366. ,,Wo gibt es denn das zu kaufen, den HC11 in NMOS?'', fragt jetzt vielleicht
  8367. der eine oder andere.  Gibt es nat"urlich nicht, aber ein H l"a"st sich nun
  8368. einmal nicht in einer Hexzahl darstellen ("altere Versionen von \asname{} h"atten
  8369. solche Namen deswegen nicht akzeptiert), und dann habe ich die Buchstaben
  8370. gleich ganz weggelassen...
  8371. \par
  8372. \begin{quote}{\it
  8373. ,,Jemand, der sagt, etwas sei unm"oglich,sollte wenigstens so kooperativ
  8374. sein, denjenigen, der es gerade tut, nicht am Arbeiten zu hindern.''
  8375. }\end{quote}
  8376. Ab und zu ist man gezwungen, seine Meinung zu revidieren.  Vor einigen
  8377. Versionen hatte ich an dieser Stelle noch behauptet, ich k"onne es im Parser
  8378. von \asname{} nicht realisieren, da"s man die Argumente von \tty{BSET/BCLR} bzw.
  8379. \tty{BRSET/BRCLR} auch mit Leerzeichen trennen kann.  Offensichtlich kann
  8380. selbiger aber mehr, als ich vermutet habe...nach der soundsovielten Anfrage
  8381. habe ich mich noch einmal drangesetzt, und jetzt scheint es zu laufen.  Man
  8382. darf sowohl Leerzeichen als auch Kommas verwenden, aber nicht in allen
  8383. Varianten, um es nicht uneindeutig zu machen:  Es gibt zu jeder
  8384. Befehlsvariante zwei M"oglichkeiten; eine, die nur Kommas verwendet, sowie
  8385. eine, wie sie von Motorola wohl definiert wurde (leider sind die Datenb"ucher
  8386. nicht immer so gut wie die zugeh"orige Hardware...):
  8387. \begin{verbatim}
  8388.   Bxxx  abs8 #mask         entspricht    Bxxx  abs8,#mask
  8389.   Bxxx  disp8,X #mask      entspricht    Bxxx  disp8,X,#mask
  8390.   BRxxx abs8 #mask adr     entspricht    BRxxx abs8,#mask,adr
  8391.   BRxxx disp8,X #mask adr  entspricht    BRxxx disp8,X,#mask,adr
  8392. \end{verbatim}
  8393. Dabei steht \tty{xxx} entweder f"ur \tty{SET} oder \tty{CLR} und \tty{\#mask}
  8394. f"ur die zu verwendende Bitmaske; der Lattenzaun ist dabei optional.
  8395. Anstelle des X-Registers darf nat"urlich auch Y verwendet werden.
  8396.  
  8397. Mit der K4-Version des HC11 hat Motorola ein Banking-Schema eingef"uhrt,
  8398. mit dem man zwar einerseits eine zu klein gewordene Architektur noch
  8399. einmal aufbohren kann, den Software- und Tool-Entwicklern aber nicht
  8400. unbedingt das Leben einfacher macht...wie stellt man so etwas vern"unftig
  8401. dar?
  8402.  
  8403. Die K4-Architektur {\em erweitert} den Adre"sraum des HC11 um 2x512 Kbyte,
  8404. so da"s jetzt insgesamt 64+1024=1088 Kbyte zur Verf"ugung stehen.  \asname{} tut
  8405. so, als ob es sich dabei um einen Adre"sraum handeln w"urde, der
  8406. folgenderma"sen organisiert ist:
  8407. \begin{itemize}
  8408. \item{\$000000...\$00ffff: der alte HC11-Adre"sraum}
  8409. \item{\$010000...\$08ffff: Fenster 1}
  8410. \item{\$090000...\$10ffff: Fenster 2}
  8411. \end{itemize}
  8412. "Uber den {\tt ASSUME}-Befehl teilt man \asname{} mit, wie die Banking-Register
  8413. eingestellt sind und damit, wie und wo die erweiterten Bereiche
  8414. eingeblendet werden.  Bei absoluten Adressierungen mit Adressen jenseits
  8415. \$10000 berechnet \asname{} dann automatisch, welche Adresse innerhalb der ersten
  8416. 64K anzusprechen ist.  Das kann nat"urlich wieder nur f"ur direkte
  8417. Adressierungsarten funktionieren, bei indizierten/indirekten
  8418. Adre"sausdr"ucken ist der Programmierer daf"ur verantwortlich, "uber die
  8419. momentan aktiven Banks den "Uberblick zu behalten!
  8420. Wer sich nicht ganz sicher ist, ob die momentane Einstellung korrekt ist,
  8421. kann den Pseudobefehl {\tt PRWINS} benutzen, der dann z.B.
  8422. \begin{verbatim}
  8423. MMSIZ e1 MMWBR 84 MM1CR 00 MM2CR 80
  8424. Window 1: 10000...12000 --> 4000...6000
  8425. Window 1: 90000...94000 --> 8000...c000
  8426. \end{verbatim}
  8427. ausgibt.  Ein z.B. an Stelle \$10000 liegender Befehl
  8428. \begin{verbatim}
  8429.        jmp     *+3
  8430. \end{verbatim}
  8431. w"urde effektiv einen Sprung auf Adresse \$4003 ausl"osen.
  8432.  
  8433. %%---------------------------------------------------------------------------
  8434.  
  8435. \section{PowerPC}
  8436.  
  8437. Sicher hat es ein bi"schen den Anflug einer Schnapsidee, einen Prozessor,
  8438. der eher f"ur den Einsatz in Workstations konzipiert wurde, in \asname{}
  8439. einzubauen, der sich ja eher an Programmierer von Einplatinencomputern
  8440. wendet.  Aber was heute noch das Hei"seste vom Hei"sen ist, ist es morgen
  8441. schon nicht mehr, und sowohl der Z80 als auch der 8088 haben ja inzwischen
  8442. die Mutation von der Personal Computer-CPU zum sog. ,,Mikrocontroller''
  8443. vollzogen.  Mit dem Erscheinen von MPC505 und PPC403 hat sich die Vermutung
  8444. dann auch best"atigt, da"s IBM und Motorola diese Prozessorserie auf allen
  8445. Ebenen durchdr"ucken wollen.
  8446. \par
  8447. Die Unterst"utzung ist momentan noch nicht vollst"andig: Als Pseudobefehle
  8448. zur Datenablage werden momentan provisorisch die Intel-Mnemonics
  8449. unterst"utzt und es fehlen die etwas ungew"ohnlicheren, in \cite{Mot601}
  8450. genannten RS6000-Befehle (die aber hoffentlich keiner vermi"st...).  Das
  8451. wird aber nachgeholt, sobald Informationen verf"ugbar sind!
  8452.  
  8453. %%---------------------------------------------------------------------------
  8454.  
  8455. \section{PALM}
  8456.  
  8457. Der PALM-Prozessor von IBM war lange Zeit ,,Terra Incognita'', weil er
  8458. au"serhalb von IBM nie eingesetzt wurde.  Des weiteren waren die damit
  8459. best"uckten IBM-Systeme 5100 bis 5120 recht exotisch und teuer, und
  8460. gerieten "uber den Erfolg des IBM PC schnell in Vergessenheit.  Es ist
  8461. Christian Corti und seinem akribischen Reverse Engineering zu
  8462. verdanken, da"s dieses Target "uberhaupt implementiert werden konnte
  8463. \cite{CortPalm}.
  8464.  
  8465. Als Christian mit dem Reverse Engineering des PALM-Prozessors begann,
  8466. waren ihm die von IBM definierten Assembler-Mnemonics nicht bekannt, er
  8467. mu"ste sich seine eigenen ausdenken.  Das geschah nat"urlich mit dem
  8468. Wissen im Hinterkopf "uber all die Architekturen, die nach 1973 bis
  8469. heute entwickelt wurden.
  8470.  
  8471. Vergleicht man seine Mnemonics mit den originalen von IBM (f"ur die
  8472. dann doch noch eine Dokumentation in \cite{IBMPalm} aufgetaucht
  8473. ist...), dann dr"angt sich ein Vergleich mit den Mnemonics f"ur den
  8474. Intel 8080/8085 auf der einen Seite, und den Zilog Z80 auf der anderen
  8475. Seite auf: Die einen packen zum Teil die Adressierungsart mit in den
  8476. Befehlsnamen, z.B.  {\tt MVI} f"ur ,,Move Immediate'' oder {\tt LDHD}
  8477. f"ur ,,LoaD Halfword Direct''.  Dies ist f"ur einen Assembler deutlich
  8478. einfacher zu parsen und in Maschinencode umzusetzen.
  8479.  
  8480. Die anderen fassen unter einem Mnemonic alle Maschinenbefehle
  8481. zusammen, die grob das gleiche tun, zum Beispiel {\tt LD} bzw.
  8482. {\tt MOVE} um Daten zu transferieren.  Das macht die Nutzung f"ur
  8483. den Programmierer einfacher, sie sind mit den als Operanden
  8484. geschriebenen Adressierungsarten f"ur einen Assembler aber etwas
  8485. komplexer zu parsen.
  8486.  
  8487. Auf diese Weise haben beide Mnemonic-S"atze ihre Berechtigung: Die
  8488. einen, weil sie einfach das ,,Original'' sind und in allen
  8489. Herstellerdokumenten verwendet werden, und die anderen, weil sie
  8490. einfach moderner, zug"anglicher und praktischer sind.  Ich habe mich
  8491. deshalb entschieden, {\em beide} in meinem Assembler zu unterst"utzen,
  8492. und gl"ucklicherweise war dies auch ohne Konflikte m"oglich.  Das
  8493. schlie"st auch die ,,Makrobefehle'' {\tt CALL, RCALL, JMP, BRA, LWI}
  8494. und {\tt RET} ein.  Und was ich selber noch dazu gedichtet habe:
  8495. \begin{itemize}
  8496. \item{{\tt AND} und {\tt OR} akzeptieren auch einen Immediate-Wert als zweites
  8497.      Argument.  Dies wird auf {\tt SET} bzw. {\tt CLR} abgebildet, wobei bei
  8498.      {\tt AND} nat"urlich das Einerkomplement des Wertes eingesetzt wird.}
  8499. \item{{\tt MOVE} akzeptiert auch einen immediate-Wert als Quelle und erzeugt
  8500.      dann den gleichen Code wie {\tt LWI}.  Gleiches gilt f"ur {\tt MOVB} und
  8501.      {\tt LBI}.}
  8502. \end{itemize}
  8503. Makrobefehle, die aus mehr als einem (Halb-)Wort bestehen, bringen
  8504. allerdings ein neues Problem mit sich: Der PALM-Prozessor kennt als
  8505. bedingten Sprung nur das "Uberspringen des folgenden Instruktionsworts.
  8506. Folgt auf so einen Sprung ein Makrobefehl, so w"urde dieser nur
  8507. teilweise "ubersprungen.  Ich habe daher eine kleine State-Machine
  8508. vorgesehen, die solche Befehlsfolgen zu erkennen versucht und dann
  8509. warnt.
  8510.  
  8511. Die IBM-Systeme 5110 und 5120 verwenden nicht den heute "ublichen
  8512. ASCII-Zeichensatz, sondern den von IBM-Gro"srechnern bekannten
  8513. EBCDIC.  Im Include-Verzeichnis befindet sich eine Datei, die man
  8514. zur Umsetzung von ASCII nach EDCDIC einbinden kann.  WICHTIG:
  8515. EBCDIC ist in dieser Datei als eigene Codepage definiert, man
  8516. mu"s die Umsetzung also noch mit einem
  8517. \begin{verbatim}
  8518.        codepage        cp037
  8519. \end{verbatim}
  8520. aktivieren.
  8521.  
  8522. Noch ein Wort zur Integer-Syntax: Christian Corti hatte sich bei seiner
  8523. Implementierung f"ur die Motorola-Syntax entschieden, also
  8524. Hex-Konstanten mit vorangestelltem Dollar-Zeichen.  Ich habe mich f"ur
  8525. die 'IBM-Syntax' entschieden, also Zahlenkonstanten in Hochkommas, und z.B.
  8526. ein vorangestelltes {\tt X} f"ur hexadezimal.  Um die Programmbeispiele
  8527. auf Christians Seiten ohne "Anderungen zu "ubersetzen, f"uge man
  8528. folgenden Befehl zu Beginn ein:
  8529. \begin{verbatim}
  8530.        intsyntax       +$hex,-x'hex'
  8531. \end{verbatim}
  8532.  
  8533. %%---------------------------------------------------------------------------
  8534.  
  8535. \section{DSP56xxx}
  8536.  
  8537. Motorola, was ist nur in Dich gefahren!  Wer bei Dir ist nur auf das
  8538. schmale Brett gekommen, die einzelnen parallelen Datentransfers
  8539. ausgerechnet durch Leerzeichen zu trennen!  Wer immer nun seine Codes
  8540. etwas "ubersichtlicher formatieren will, z.B. so:
  8541. \begin{verbatim}
  8542.        move    x:var9 ,r0
  8543.        move    y:var10,r3   ,
  8544. \end{verbatim}
  8545. der ist gekniffen, weil das Leerzeichen als Trennung paralleler
  8546. Datentransfers erkannt wird!
  8547. \par
  8548. Sei's drum; Motorola hat es so definiert, und ich kann es nicht
  8549. "andern.  Als Trennung der Operationen sind statt Leerzeichen auch
  8550. Tabulatoren zugelassen, und die einzelnen Teile sind ja wieder ganz
  8551. normal mit Kommas getrennt.
  8552. \par
  8553. In \cite{Mot56} steht, da"s bei den Befehlen \tty{MOVEC, MOVEM, ANDI} und
  8554. \tty{ORI} auch die allgemeineren Mnemonics \tty{MOVE, AND} und \tty{OR}
  8555. verwendet werden k"onnen.  Bei \asname{} geht das (noch) nicht.
  8556.  
  8557. %%---------------------------------------------------------------------------
  8558.  
  8559. \section{H8/300}
  8560.  
  8561. Bei der Assemblersyntax dieser Prozessoren hat Hitachi reichlich
  8562. bei Motorola abgekupfert (was so verkehrt ja nun auch nicht war...),
  8563. nur leider wollte die Firma unbedingt ihr eigenes Format f"ur
  8564. Hexadezimalzahlen einf"uhren, und dazu noch eines, das ein einzelne
  8565. Hochkommas verwendet, etwa in dieser Form:
  8566. \begin{verbatim}
  8567.   mov.w #h'ff,r0
  8568. \end{verbatim}
  8569. Dieses Format wird von \asname{} im Default nicht unterst"utzt, es wird
  8570. stattdessen die ''Motorola-Syntax'' mit vorangestelltem Dollarzeichen
  8571. angeboten.  Falls man doch unbedingt die 'Hitachi-Syntax' benutzen
  8572. will, z.B. um existierenden Code zu "ubersetzen, so mu"s der
  8573. RELAXED-Modus eingeschaltet werden.  Bitte beachten, da"s diese Syntax
  8574. bisher wenig getestet wurde und ich keine Garantie geben kann, da"s sie
  8575. in allen F"allen funktioniert!
  8576.  
  8577. %%---------------------------------------------------------------------------
  8578.  
  8579. \section{H8/500}
  8580.  
  8581. Der {\tt MOV}-Befehl des H8/500 bietet eine interessante und ungew"ohnliche
  8582. Optimierung: Hat der Zieloperand eine L"ange von 16 Bit, so ist es trotzdem
  8583. m"oglich, einen nur 8-bittigen (Immediate-)Quelloperanden zu verwenden.  Bei
  8584. einer Anweisung der Form
  8585. \begin{verbatim}
  8586.   mov.w #$ffff,@$1234
  8587. \end{verbatim}
  8588. ist es also m"oglich, den Immediate-Quellwert lediglich in einem Byte mit
  8589. dem Wert \$ff zu kodieren und ein Byte einzusparen.  Der Prozessor f"uhrt
  8590. eine Vorzeichenerweiterung durch, so da"s aus \$ff das gew"unschte \$ffff
  8591. wird.  \asname{} kennt diese Optimierung und benutzt sie auch, wenn dies nicht
  8592. durch einen expliziten \tty{:16}-Suffix am Immediate-Operanden verboten
  8593. wird.
  8594. Es hat sich in diesem Zusammenhang nur herausgestellt, da"s der Original-Assembler
  8595. von Hitachi diese Optimierung anders umsetzt: er scheint von einer Null- statt
  8596. einer Vorzeichen-Erweiterung auszugehen.  Das bedeutet, nicht Argumente von
  8597. -128 bis +127 (\$ff80 bis \$007f) werden als ein Byte kodiert, sondern von 0 bis
  8598. 255 (\$0000 bis \$00ff).  Tests an echter Hardware haben ergeben, da"s
  8599. das Programmers Manual in dieser Hinsicht Recht hat: Es wird eine Vorzeichen-
  8600. Erweiterung durchgef"uhrt.  Deshalb verwendet \asname{} im Default die k"urzere
  8601. Kodierung nur, wenn im Quellcode ein Wert von -128 bis +127 bzw. (\$ff80 bis
  8602. \$007f) benutzt wird.  F"ur existierenden Code, der sich darauf verl"a"st,
  8603. da"s Werte von \$80 bis \$ff mit nur einem Byte kodiert werden, kann in einen
  8604. Kompatibilit"atsmodus geschaltet werden, entweder durch ein
  8605. \begin{verbatim}
  8606.  compmode on
  8607. \end{verbatim}
  8608. im Quellcode oder den gleichnamigen Schalter auf der Kommandozeile.
  8609.  
  8610. Ansonsten gelten die gleichen Hinweise bez"uglich der Syntax hexadezimaler
  8611. Zahlen wie f"ur H8/300.
  8612.  
  8613. %%---------------------------------------------------------------------------
  8614.  
  8615. \section{SH7000/7600/7700}
  8616.  
  8617. Leider hat Hitachi auch hier wieder das Extrawurst-Format f"ur
  8618. Hexadezimalzahlen verwendet, und wieder habe ich in \asname{} das nicht
  8619. nachvollzogen...bitte Motorola-Syntax benutzen!
  8620. \par
  8621. Bei der Verwendung von Literalen und dem \tty{LTORG}-Befehl sind
  8622. einige Details zu beachten, wenn man nicht auf einmal mit eigenartigen
  8623. Fehlermeldungen konfrontiert werden will:
  8624. \par
  8625. Literale existieren, weil der Prozessor nicht in der Lage ist, Konstanten
  8626. au"serhalb des Bereiches von -128 bis 127 mit immediate-Adressierung
  8627. zu laden.  \asname{} (und der Hitachi-Assembler) verstecken diese Unzul"anglichkeit,
  8628. indem sie automatisch entsprechende Konstanten im Speicher ablegen, die
  8629. dann mittels PC-relativer Adressierung angesprochen werden.  Die Frage, die
  8630. sich nun erhebt, ist die, wo diese Konstanten im Speicher abgelegt werden
  8631. sollen.  \asname{} legt sie nicht sofort ab, sondern sammelt sie so lange
  8632. auf, bis im Programm eine \tty{LTORG}-Anweisung auftritt.  Dort werden
  8633. alle Konstanten abgelegt, wobei deren Adressen mit ganz normalen
  8634. Labels versehen werden, die man auch in der Symboltabelle sehen kann.
  8635. Ein Label hat die Form
  8636. \begin{verbatim}
  8637.   LITERAL_s_xxxx_n   .
  8638. \end{verbatim}
  8639. Dabei repr"asentiert \tty{s} den Typ des Literals.  Unterschieden werden
  8640. Literale, die 16-Bit-Konstanten (\tty{s=W}), 32-Bit-Konstanten (\tty{s=L})
  8641. oder Vorw"artsreferenzen, bei denen \asname{} die Operandengr"o"se nicht
  8642. im voraus erkennen kann (\tty{s=F}), enthalten.  F"ur \tty{W} oder \tty{L}
  8643. bedeutet \tty{xxxx} den hexadezimal geschriebenen Wert der Konstante, bei
  8644. Vorw"artsreferenzen, bei denen man den Literalwert ja noch nicht kennt,
  8645. bezeichnet \tty{xxxx} eine einfache Durchnumerierung. \tty{n} kennzeichnet
  8646. das wievielte Auftreten dieses Literals in dieser Sektion.  Literale machen
  8647. ganz normal die Lokalisierung durch Sektionen mit, es ist daher zwingend
  8648. erforderlich, in einer Sektion entstandene Literale mit \tty{LTORG} auch
  8649. dort abzulegen!
  8650. \par
  8651. Die Durchnumerierung mit \tty{n} ist erforderlich, weil ein Literal in
  8652. einer Sektion mehrfach auftreten kann.  Dies ist einmal bedingt dadurch,
  8653. da"s die PC-relative Adressierung nur positive Displacements erlaubt,
  8654. einmal mit \tty{LTORG} abgelegte Literale also im folgenden Code nicht
  8655. mitbenutzt werden k"onnen, andererseits auch, weil die Reichweite der
  8656. Displacements beschr"ankt ist (512 bzw. 1024 Byte).
  8657. Ein automatisches \tty{LTORG} am Ende des Programms oder beim Umschalten
  8658. zu einer anderen CPU erfolgt nicht; findet \asname{} in einer solchen Situation
  8659. noch abzulegende Literale, so wird eine Fehlermeldung ausgegeben.
  8660. \par
  8661. Da bei der PC-relativen Adressierung der zur Adressierung herangezogene
  8662. PC-Wert der Instruktionsadresse+4 entspricht, ist es nicht m"oglich, ein
  8663. Literal zu benutzen, welches direkt hinter dem betroffenen Befehl abgelegt
  8664. wird, also z.B. so:
  8665. \begin{verbatim}
  8666.        mov     #$1234,r6
  8667.        ltorg
  8668. \end{verbatim}
  8669. Da der Prozessor dann aber sowieso versuchen w"urde, Daten als Code
  8670. auszuf"uhren, sollte diese Situation in realen Programmen nicht auftreten.
  8671. Wesentlich realer ist aber ein anderer Fallstrick:  Wird hinter einem
  8672. verz"ogerten Sprung PC-relativ zugegriffen, so ist der Programmz"ahler
  8673. bereits auf die Sprungzieladresse gesetzt, und das Displacement wird
  8674. relativ zum Sprungziel+2 berechnet.  Im folgenden Beispiel kann daher
  8675. das Literal nicht erreicht werden:
  8676. \begin{verbatim}
  8677.        bra     Target
  8678.         mov     #$12345678,r4        ; wird noch ausgefuehrt
  8679.        .
  8680.        .
  8681.        ltorg                        ; hier liegt das Literal
  8682.        .
  8683.        .
  8684. Target: mov     r4,r7                ; hier geht es weiter
  8685. \end{verbatim}
  8686. Da Target+2 hinter dem Literal liegt, w"urde sich ein negatives
  8687. Displacement ergeben.  Besonders haarig wird es, wenn mit den
  8688. Befehlen \tty{JMP, JSR, BRAF} oder \tty{BSRF} verzweigt wird:  Da \asname{} die
  8689. Zieladresse hier nicht ermitteln kann (sie ergibt sich erst zur
  8690. Laufzeit aus dem Registerinhalt), nimmt \asname{} hier eine Adresse an,
  8691. die nach M"oglichkeit nie pa"st, so da"s PC-relative Adressierung g"anzlich
  8692. unm"oglich wird.
  8693. \par
  8694. Es ist nicht direkt m"oglich, aus der Zahl und Gr"o"se der Literale
  8695. auf den belegten Speicher zu schlie"sen.  U.u. mu"s \asname{} ein F"ullwort
  8696. einbauen, um einen Langwort-Wert auf eine durch 4 teilbare Adresse
  8697. auszurichten, andererseits kann er m"oglicherweise Teile eines
  8698. 32-bittigen Literals f"ur 16-Bit-Literale mitbenutzten.  Mehrfach
  8699. auftretende Literale erzeugen nat"urlich nur einen Eintrag.  Solche
  8700. Optimierungen werden f"ur Vorw"artsreferenzen allerdings ganz
  8701. unterdr"uckt, da \asname{} den Wert dieser Literale noch nicht kennt.
  8702. \par
  8703. Da Literale die PC-relative Adressierung ausnutzen, die nur beim
  8704. \tty{MOV}-Befehl erlaubt sind, beschr"anken sich Literale ebenfalls auf
  8705. die Verwendung in \tty{MOV}.  Etwas trickreich ist hier die Art und Weise,
  8706. in der \asname{} die Operandengr"o"se auswertet.  Eine Angabe von Byte oder
  8707. Wort bedeutet, da"s \asname{} einen m"oglichst kurzen \tty{MOV}-Befehl erzeugt,
  8708. der den angegebenen Wert in den unteren 8 oder 16 Bit erzeugt, d.h.
  8709. die oberen 24 oder 16 Bit werden als don't care behandelt.  Gibt
  8710. man dagegen Langwort oder gar nichts an, so sagt dies aus, da"s
  8711. das komplette 32-Bit-Register den angegebenen Wert enthalten soll.
  8712. Das hat z.B. den Effekt, da"s in folgendem Beispiel
  8713. \begin{verbatim}
  8714.        mov.b   #$c0,r0
  8715.        mov.w   #$c0,r0
  8716.        mov.l   #$c0,r0
  8717. \end{verbatim}
  8718. der erste Befehl echte immediate-Adressierung erzeugt, der zweite und
  8719. dritte jedoch ein Wort-Literal benutzen: Da das Bit 7 in der Zahl gesetzt
  8720. ist, erzeugt der Byte-Befehl effektiv \$FFFFFFC0 im Register, was nach
  8721. der Konvention nicht das w"are, was man im zweiten und dritten Fall haben
  8722. m"ochte.  Im dritten Fall reicht auch ein Wort-Literal, weil das gel"oschte
  8723. Bit 15 des Operanden vom Prozessor in Bit 16..31 fortgesetzt wird.
  8724. \par
  8725. Wie man sieht, ist dieses ganze Literal-Konzept reichlich kompliziert;
  8726. einfacher ging's aber wirklich nicht.  Es liegt leider in der Natur
  8727. der Sache, da"s man manchmal Fehlermeldungen "uber nicht gefundene
  8728. Literale bekommt, die eigentlich logisch nicht auftreten k"onnten, weil
  8729. \asname{} die Literale ja komplett in eigener Regie verwaltet.  Treten aber bei
  8730. der Assemblierung Fehler erst im zweiten Pass auf, so verschieben sich
  8731. z.B. hinter der Fehlerstelle liegende Labels gegen"uber dem ersten Pass,
  8732. weil \asname{} f"ur die jetzt als fehlerhaft erkannten Befehle keinen Code mehr
  8733. erzeugt.  Da aber Literalnamen u.a. aus den Werten von Symbolen erzeugt
  8734. werden, werden als Folgefehler davon eventuell andere Literalnamen
  8735. nachgefragt, als im ersten Pass abgelegt wurden und \asname{} beschwert sich
  8736. "uber nicht gefundene Symbole...sollten also neben anderen Fehlern solche
  8737. Literal-Fehler auftreten, beseitigen Sie erst die anderen Fehler, bevor
  8738. Sie mich und alle Literale verfluchen...
  8739. \par
  8740. Wer aus der Motorola-Ecke kommt und PC-relative Adressierung explizit
  8741. benutzen will (z.B. um Variablen lageunabh"angig zu erreichen), sollte
  8742. wissen, da"s beim Ausschreiben der Adressierung nach Programmierhandbuch,
  8743. also z.B. so:
  8744. \begin{verbatim}
  8745.        mov.l   @(Var,PC),r8
  8746. \end{verbatim}
  8747. {\it keine} implizite Umrechnung der Adresse auf ein Displacement erfolgt,
  8748. d.h. der Operand wird so eingesetzt, wie er ist (und w"urde in diesen
  8749. Beispiel wohl mit hoher Wahrscheinlichkeit eine Fehlermeldung
  8750. hervorrufen...).  Will man beim SH7x00 PC-relativ adressieren, so tut man
  8751. das einfach mit ,,absoluter'' Adressierung, die auf Maschinenebene ja
  8752. gar nicht existiert:
  8753. \begin{verbatim}
  8754.        mov.l   Var,r8
  8755. \end{verbatim}
  8756. Hier wird das Displacement korrekt berechnet (es gelten nat"urlich die
  8757. gleichen Einschr"ankungen f"ur das Displacement wie bei Literalen).
  8758.  
  8759. %%---------------------------------------------------------------------------
  8760.  
  8761. \section{HMCS400}
  8762.  
  8763. Beim Befehlssatz dieser 4-Bit-Prozessoren f"uhlte ich mich
  8764. spontan an den 8080/8085 erinnert - sehr viele Menemonics, die
  8765. Adressierungsart (z.B.  indirekt oder direkt) ist in den Befehl
  8766. einkodiert, die Befehle sind zum Teil nur schwer zu merken.
  8767. Nat"urlich unterst"utzt \asname{} diese Syntax, wie Hitachi sie
  8768. seinerzeit definiert hat, ich habe aber zus"atzlich f"ur die
  8769. meisten Befehle eine - finde ich - sch"onere und besser lesbare
  8770. Variante implementiert, so wie Zilog es seinerzeit mit den Z80
  8771. gemacht hat.  Zum Beispiel k"onnen alle Maschineninstruktionen,
  8772. die in irgendeiner Form Daten transferieren, egal ob die
  8773. Operanden Register, Konstanten oder Speicherstellen sind, "uber den
  8774. \asname{}-spezifischen \tty{LD}-Befehl angesprochen werden.  "Ahnliche
  8775. 'Meta-Befehle' gibt es f"ur arithmetische und logische Befehle.
  8776. Eine vollst"andige Liste aller Meta-Befehle und ihrer Operanden
  8777. findet sich in den Tabellen \ref{TabHMCS400Meta} und
  8778. \ref{TabHMCS400MetaOps}, ihre praktische Verwendung kann man sich
  8779. in der Datei \tty{t\_hmcs4x.asm} ansehen.
  8780.  
  8781. \begin{table*}
  8782. \begin{center}\begin{tabular}{|l|l|}
  8783. \hline
  8784. Meta-Instruktion          & Ersetzt \\
  8785. \hline
  8786. \tty{LD} {\em src, dest}        & \tty{LAI, LBI, LMID, LMIIY,} \\
  8787.                                & \tty{LAB, LBA, LAY, LASPX, LASPY, LAMR,} \\
  8788.                                & \tty{LWI, LXI, LYI, LXA, LYA, LAM, LAMD} \\
  8789.                                & \tty{LBM, LMA, LMAD, LMAIY, LMADY} \\
  8790. \tty{XCH} {\em src, dest}       & \tty{XMRA, XSPX, XSPY, XMA, XMAD, XMB} \\
  8791. \tty{ADD} {\em src, dest}       & \tty{AYY, AI, AM, AMD} \\
  8792. \tty{ADC} {\em src, dest}       & \tty{AMC, AMCD} \\
  8793. \tty{SUB} {\em src, dest}       & \tty{SYY} \\
  8794. \tty{SBC} {\em src, dest}       & \tty{SMC, SMCD} \\
  8795. \tty{OR}  {\em src, dest}       & \tty{OR, ORM, ORMD} \\
  8796. \tty{AND} {\em src, dest}       & \tty{ANM, ANMD} \\
  8797. \tty{EOR} {\em src, dest}       & \tty{EORM, EORMD} \\
  8798. \tty{CP}  {\em cond, src, dest} & \tty{INEM, INEMD, ANEM, ANEMD, BNEM,} \\
  8799.                                & \tty{YNEI, ILEM, ILEMD, ALEM, ALEMD,} \\
  8800.                                & \tty{BLEM, ALEI} \\
  8801. \tty{BSET} {\em bit}            & \tty{SEC, SEM, SEMD} \\
  8802. \tty{BCLR} {\em bit}            & \tty{REC, REM, REMD} \\
  8803. \tty{BTST} {\em bit}            & \tty{TC, TM, TMD} \\
  8804. \hline
  8805. \end{tabular}\end{center}
  8806. \caption{Meta-Befehle HMCS400}
  8807. \label{TabHMCS400Meta}
  8808. \end{table*}
  8809.  
  8810. \begin{table*}
  8811. \begin{center}\begin{tabular}{|l|l|}
  8812. \hline
  8813. Operand                 & Typen \\
  8814. \hline
  8815. {\em src, dest}         & \tty{A, B, X, Y, W, SPX, SPY} (Register) \\
  8816.                        & \tty{M} (Speicher adressiert durch X/Y/W) \\
  8817.                        & \tty{M+} (dito, mit Autoinkrement) \\
  8818.                        & \tty{M-} (dito, mit Autodekrement) \\
  8819.                        & \tty{\#val} (2/4 bit immediate) \\
  8820.                        & \tty{addr10} (Speicherzelle direkt) \\
  8821.                        & \tty{MRn} (Memory-Register 0..15) \\
  8822. {\em cond}              & \tty{NE} (ungleich) \\
  8823.                        & \tty{LE} (kleiner oder gleich) \\
  8824. {\em bit}               & \tty{CA} (Carry) \\
  8825.                        & {\em bitpos},\tty{M} \\
  8826.                        & {\em bitpos},\tty{addr10} \\
  8827. {\em bitpos}            & \tty{0..3} \\
  8828. \hline
  8829. \end{tabular}\end{center}
  8830. \caption{Operandentypen f"ur Meta-Befehle HMCS400}
  8831. \label{TabHMCS400MetaOps}
  8832. \end{table*}
  8833.  
  8834. %%---------------------------------------------------------------------------
  8835.  
  8836. \section{H16}
  8837.  
  8838. Der Befehlssatz des H16-Kerns verdient mit Recht den Namen ,,CISC'': komplexe
  8839. Adressierungsarten, sehr variable Instruktionsl"angen, und f"ur viele
  8840. Befehle mit g"angigen Operanden gibt es Kurzschreibweisen.  So gibt
  8841. es f"ur diverse Befehle mehrere ,,Formate'', je nachdem welchen Typ Quell-
  8842. und Zieloperand haben.  Die generelle Regel ist, da"s \asname{} immer
  8843. das k"urzestm"ogliche Format benutzt, es sei denn, es wurde explizit
  8844. angegeben:
  8845. \begin{verbatim}
  8846.       mov.l     r4,r7     ; benutzt R-Format
  8847.       mov.l     #4,r7     ; benutzt RQ-Format
  8848.       mov.l     #4,@r7    ; benutzt Q-Format
  8849.       mov.l     @r4,@r7   ; benutzt G-Format
  8850.       mov:q.l   #4,r7     ; Q- statt RQ-Format erzwungen
  8851.       mov:g.l   #4,r7     ; G- statt RQ-Format erzwungen
  8852. \end{verbatim}
  8853. F"ur Immediate-Argumente wird die ,,nat"urliche'' Operandenl"ange
  8854. benutzt, also z.B. 2 Bytes f"ur 16 Bits.  K"urzere oder l"angere
  8855. Argumente lassen sich durch eine angeh"angte Operandengr"o"se
  8856. (.b, .w, .l oder :8, :16, :32) erzwingen.  Bei Displacements oder
  8857. absoluten Adressen gilt jedoch, da"s ohne explizite L"angenangabe
  8858. immer die k"urzestm"ogliche Schreibweise benutzt wird.  Das schlie"st
  8859. ein, da"s bei absoluten Adressen die oberen acht Adre"sbits vom
  8860. Prozessor nicht herausgegeben werden: eine Adresse \$ffff80 kann also
  8861. mit einem Byte (\$80) kodiert werden.
  8862.  
  8863. Des weiteren kennt \asname{} das ''Akkumulator-Bit'', d.h. bei Instruktionen
  8864. mit zwei beliebigen Operanden kann der zweite Operand weggelassen
  8865. werden, falls das Ziel Register Null ist.  Dieses Verhalten kann
  8866. nicht "ubersteuert werden.
  8867.  
  8868. Des weiteren werden folgende Optimierungen durchgef"uhrt:
  8869. \begin{itemize}
  8870. \item{\tty{MOV R0,<ea>} wird zu \tty{MOVF <ea>} optimiert, sofern
  8871.      \tty{<ea>} kein PC-relativer Ausdruck ist und sich die L"ange
  8872.      des Displacements "andern w"urde.  Diese Optimierung kann durch
  8873.      eine explizite Formatangabe unterdr"uckt werden.}
  8874. \item{\tty{SUB} existiert nicht im Q-Format, kann aber durch ein
  8875.      \tty{ADD:Q} mit negiertem immediate-Argument ersetzt werden,
  8876.      falls das Argument zu \tty{SUB} im Bereich -127...+128 liegt.
  8877.      Auch diese Optimierung kann durch eine explizite Formatangabe
  8878.      unterdr"uckt werden.}
  8879. \end{itemize}
  8880.  
  8881. %%---------------------------------------------------------------------------
  8882.  
  8883. \section{OLMS-40}
  8884.  
  8885. "Ahnlich wie beim HMCS400 sind die Adressierungsarten zu einem
  8886. gro"sen Teil in die Mnemonics hineinkodiert, und ich habe mich
  8887. auch hier daf"ur entschieden, f"ur h"aufig genutzte Befehle eine
  8888. alternative, modernere und besser lesbare Notation
  8889. bereitzustellen.
  8890. Eine vollst"andige Liste aller Meta-Befehle und ihrer Operanden
  8891. findet sich in den Tabellen \ref{TabOLMS40Meta} und
  8892. \ref{TabOLMS40MetaOps}, ihre praktische Verwendung kann man sich
  8893. in der Datei \tty{t\_olms4.asm} ansehen.
  8894.  
  8895. \begin{table*}
  8896. \begin{center}\begin{tabular}{|l|l|}
  8897. \hline
  8898. Meta-Instruktion          & Ersetzt \\
  8899. \hline
  8900. \tty{LD} {\em dest, src}        & \tty{LAI, LLI, LHI, L,} \\
  8901.                                & \tty{LAL, LLA, LAW, LAX, LAY, LAZ,} \\
  8902.                                & \tty{LWA, LXA, LYA, LPA, LTI, RTH, RTL} \\
  8903. \tty{DEC} {\em dest}            & \tty{DCA, DCL, DCM, DCW, DCX, DCY, DCZ, DCH} \\
  8904. \tty{INC} {\em dest}            & \tty{INA, INL, INM, INW, INX, INY, INZ} \\
  8905. \tty{BSET} {\em bit}            & \tty{SPB, SMB, SC} \\
  8906. \tty{BCLR} {\em bit}            & \tty{RPB, RMB, RC} \\
  8907. \tty{BTST} {\em bit}            & \tty{TAB, TMB, Tc} \\
  8908. \hline
  8909. \end{tabular}\end{center}
  8910. \caption{Meta-Befehle OLMS-40}
  8911. \label{TabOLMS40Meta}
  8912. \end{table*}
  8913.  
  8914. \begin{table*}
  8915. \begin{center}\begin{tabular}{|l|l|}
  8916. \hline
  8917. Operand                 & Typen \\
  8918. \hline
  8919. {\em src, dest}         & \tty{A, W, X, Y, Z, DPL, DPH} (Register) \\
  8920.                        & \tty{T, TL, TH} (Timer, obere/untere H"alfte) \\
  8921.                        & \tty{(DP), M} (Speicher adressiert durch DPH/DPL) \\
  8922.                        & \tty{\#val} (4/8 bit immediate) \\
  8923.                        & \tty{PP} (Port-Pointer) \\
  8924. {\em bit}               & \tty{C} (Carry) \\
  8925.                        & \tty{(PP)},{\em bitpos} \\
  8926.                        & \tty{(DP)},{\em bitpos} \\
  8927.                        & \tty{(A)},{\em bitpos} \\
  8928. {\em bitpos}            & \tty{0..3} \\
  8929. \hline
  8930. \end{tabular}\end{center}
  8931. \caption{Operandentypen f"ur Meta-Befehle OLMS-40}
  8932. \label{TabOLMS40MetaOps}
  8933. \end{table*}
  8934.  
  8935. %%---------------------------------------------------------------------------
  8936.  
  8937. \section{OLMS-50}
  8938.  
  8939. Der Datenspeicher dieser 4-Bit-Controller besteht aus bis zu 128
  8940. Nibbles.  F"ur die daf"ur ben"otigten sieben Adre"sbits war
  8941. jedoch nur in den wenigsten Instruktionen Platz, so da"s einmal
  8942. wieder Banking zur Adressierung herhalten mu"s.  Die meisten
  8943. Befehle, die Speicher adressieren, enthalten nur die untersten
  8944. vier Bits der RAM-Adresse, und sofern nicht die untersten 16
  8945. Nibbles angesprochen werden sollen, liefert das P-Register die
  8946. notwendigen obere Adre"sbits.  Dessen aktuellen Wert teilt man
  8947. dem Assembler "uber ein
  8948. \begin{verbatim}
  8949.   assume  p:<Wert>
  8950. \end{verbatim}
  8951. mit, z.B. direkt nach einem \tty{PAGE}-Befehl.
  8952.  
  8953. Mit \tty{PAGE} ist auch ein anderes Thema angeschnitten: sowohl
  8954. \tty{PAGE} als auch \tty{SWITCH} sind auf diesen Controllern
  8955. Maschinenbefehle, d.h. haben nicht ihre von anderen Targets
  8956. "ubliche Funktion.  Der Pseudobefehl, um ein \tty{SWITCH/CASE}-
  8957. Konstrukt einzuleiten, lautet im OLMS-50-Modus \tty{SELECT}, und
  8958. die Seitengr"o"se des Listings legt man mit \tty{PAGESIZE} fest.
  8959.  
  8960. %%---------------------------------------------------------------------------
  8961.  
  8962. \section{MELPS-4500}
  8963.  
  8964. Der Programmspeicher dieser Mikrokontroller ist in Seiten zu
  8965. 128 Worten eingeteilt.  Diese Einteilung existiert eigentlich nur
  8966. deswegen, weil es Sprungbefehle gibt, deren Ziel innerhalb der
  8967. gleichen Seite liegen darf, und andererseits ,,lange'' Exemplare,
  8968. die den ganzen Adre"sbereich erreichen k"onnen.  Die Standard-Syntax
  8969. von Mitsubishi verlangt eigentlich, da"s Seite und Offset als getrennte
  8970. Argument geschrieben werden m"ussen.  Da das aber reichlich unpraktisch
  8971. ist (ansonsten hat man als Programmierer keine Veranlassung, sich um
  8972. Seiten zu k"ummern, mit der Ausnahme von indirekten Spr"ungen), erlaubt
  8973. es \asname{} auch wahlweise, die Zieladresse linear zu schreiben, also z.B.
  8974. \begin{verbatim}
  8975.      bl        $1234
  8976. \end{verbatim}
  8977. anstelle
  8978. \begin{verbatim}
  8979.      bl        $24,$34  .
  8980. \end{verbatim}
  8981.  
  8982. %%---------------------------------------------------------------------------
  8983.  
  8984. \section{6502UNDOC}
  8985.  
  8986. Da die undokumentierten Befehle des 6502 sich naturgem"a"s in keinem
  8987. Datenbuch finden, sollen sie an dieser Stelle kurz aufgelistet werden.
  8988. Die Verwendung erfolgt naturgem"a"s auf eigene Gefahr, da es keine
  8989. Gew"ahr gibt, da"s alle Maskenversionen alle Varianten unterst"utzen!
  8990. Bei den CMOS-Nachfolgern des 6502 funktionieren sie sowieso nicht
  8991. mehr, da diese die entsprechenden Bitkombinationen mit offiziellen Befehlen
  8992. belegen...
  8993.  
  8994. %%TEMP
  8995. \clearpage
  8996.  
  8997. Es bedeuten:
  8998.  
  8999. \begin{tabbing}
  9000. \hspace{2cm} \= \kill \\
  9001. \&             \> bin"ares UND \\
  9002. |              \> bin"ares ODER \\
  9003. \verb!^!       \> bin"ares EXOR \\
  9004. $<<$           \> logischer Linksshift \\
  9005. $>>$           \> logischer Rechtsshift \\
  9006. $<<<$          \> Linksrotation \\
  9007. $>>>$          \> Rechtsrotation \\
  9008. $\leftarrow$   \> Zuweisung \\
  9009. (..)           \> Inhalt von .. \\
  9010. {..}           \> Bits .. \\
  9011. A              \> Akkumulator \\
  9012. X,Y            \> Indexregister X,Y \\
  9013. S              \> Stapelzeiger \\
  9014. An             \> Akkumulatorbit n \\
  9015. M              \> Operand \\
  9016. C              \> Carry \\
  9017. PCH            \> obere H"alfte Programmz"ahler \\
  9018. \end{tabbing}
  9019.  
  9020. \begin{tabbing}
  9021. Adressierungsmodi \= : \= \kill \\
  9022. Anweisung         \> : \> \tty{JAM, KIL} oder \tty{CRS} \\
  9023. Funktion          \> : \> keine, Prozessor wird angehalten \\
  9024. Adressierungsmodi \> : \> implizit \\
  9025. \end{tabbing}
  9026. \begin{tabbing}
  9027. Adressierungsmodi \= : \= \kill \\
  9028. Anweisung         \> : \> \tty{SLO} \\
  9029. Funktion          \> : \> $M\leftarrow((M)<<1)|(A)$ \\
  9030. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  9031.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  9032. \end{tabbing}
  9033. \begin{tabbing}
  9034. Adressierungsmodi \= : \= \kill \\
  9035. Anweisung         \> : \> \tty{ANC} \\
  9036. Funktion          \> : \> $A\leftarrow(A)\&(M), C\leftarrow A7$ \\
  9037. Adressierungsmodi \> : \> immediate \\
  9038. \end{tabbing}
  9039. \begin{tabbing}
  9040. Adressierungsmodi \= : \= \kill \\
  9041. Anweisung         \> : \> \tty{RLA} \\
  9042. Funktion          \> : \> $M\leftarrow((M)<<1)\&(A)$ \\
  9043. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  9044.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  9045. \end{tabbing}
  9046. \begin{tabbing}
  9047. Adressierungsmodi \= : \= \kill \\
  9048. Anweisung         \> : \> \tty{SRE} \\
  9049. Funktion          \> : \> $M\leftarrow((M)>>1)$\verb!^!$(A)$ \\
  9050. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  9051.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  9052. \end{tabbing}
  9053. \begin{tabbing}
  9054. Adressierungsmodi \= : \= \kill \\
  9055. Anweisung         \> : \> \tty{ASR} \\
  9056. Funktion          \> : \> $A\leftarrow((A)\&(M))>>1$ \\
  9057. Adressierungsmodi \> : \> immediate \\
  9058. \end{tabbing}
  9059. \begin{tabbing}
  9060. Adressierungsmodi \= : \= \kill \\
  9061. Anweisung         \> : \> \tty{RRA} \\
  9062. Funktion          \> : \> $M\leftarrow((M)>>>1)+(A)+(C)$ \\
  9063. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  9064.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  9065. \end{tabbing}
  9066. \begin{tabbing}
  9067. Adressierungsmodi \= : \= \kill \\
  9068. Anweisung         \> : \> \tty{ARR} \\
  9069. Funktion          \> : \> $A\leftarrow((A)\&(M))>>>1$ \\
  9070. Adressierungsmodi \> : \> immediate \\
  9071. \end{tabbing}
  9072. \begin{tabbing}
  9073. Adressierungsmodi \= : \= \kill \\
  9074. Anweisung         \> : \> \tty{SAX} \\
  9075. Funktion          \> : \> $M\leftarrow(A)\&(X)$ \\
  9076. Adressierungsmodi \> : \> absolut lang/kurz, Y-indiziert kurz, \\
  9077.                  \>   \> Y-indirekt \\
  9078. \end{tabbing}
  9079. \begin{tabbing}
  9080. Adressierungsmodi \= : \= \kill \\
  9081. Anweisung         \> : \> \tty{ANE} \\
  9082. Funktion          \> : \> $M\leftarrow((A)\&\$ee)|((X)\&(M))$ \\
  9083. Adressierungsmodi \> : \> immediate \\
  9084. \end{tabbing}
  9085. \begin{tabbing}
  9086. Adressierungsmodi \= : \= \kill \\
  9087. Anweisung         \> : \> \tty{SHA} \\
  9088. Funktion          \> : \> $M\leftarrow(A)\&(X)\&(PCH+1)$ \\
  9089. Adressierungsmodi \> : \> X/Y-indiziert lang \\
  9090. \end{tabbing}
  9091. \begin{tabbing}
  9092. Adressierungsmodi \= : \= \kill \\
  9093. Anweisung         \> : \> \tty{SHS} \\
  9094. Funktion          \> : \> $X\leftarrow(A)\&(X), S\leftarrow(X), M\leftarrow(X)\&(PCH+1)$ \\
  9095. Adressierungsmodi \> : \> Y-indiziert lang \\
  9096. \end{tabbing}
  9097. \begin{tabbing}
  9098. Adressierungsmodi \= : \= \kill \\
  9099. Anweisung         \> : \> \tty{SHY} \\
  9100. Funktion          \> : \> $M\leftarrow(Y)\&(PCH+1)$ \\
  9101. Adressierungsmodi \> : \> Y-indiziert lang \\
  9102. \end{tabbing}
  9103. \begin{tabbing}
  9104. Adressierungsmodi \= : \= \kill \\
  9105. Anweisung         \> : \> \tty{SHX} \\
  9106. Funktion          \> : \> $M\leftarrow(X)\&(PCH+1)$ \\
  9107. Adressierungsmodi \> : \> X-indiziert lang \\
  9108. \end{tabbing}
  9109. \begin{tabbing}
  9110. Adressierungsmodi \= : \= \kill \\
  9111. Anweisung         \> : \> \tty{LAX} \\
  9112. Funktion          \> : \> $A,X\leftarrow(M)$ \\
  9113. Adressierungsmodi \> : \> absolut lang/kurz, Y-indiziert lang/kurz, \\
  9114.                  \>   \> X/Y-indirekt \\
  9115. \end{tabbing}
  9116. \begin{tabbing}
  9117. Adressierungsmodi \= : \= \kill \\
  9118. Anweisung         \> : \> \tty{LXA} \\
  9119. Funktion          \> : \> $X{04}\leftarrow(X){04} \& (M){04},$ \\
  9120.                  \>   \> $A{04}\leftarrow(A){04} \& (M){04}$ \\
  9121. Adressierungsmodi \> : \> immediate \\
  9122. \end{tabbing}
  9123. \begin{tabbing}
  9124. Adressierungsmodi \= : \= \kill \\
  9125. Anweisung         \> : \> \tty{LAE} \\
  9126. Funktion          \> : \> $X,S,A\leftarrow((S)\&(M))$ \\
  9127. Adressierungsmodi \> : \> Y-indiziert lang \\
  9128. \end{tabbing}
  9129. \begin{tabbing}
  9130. Adressierungsmodi \= : \= \kill \\
  9131. Anweisung         \> : \> \tty{DCP} \\
  9132. Funktion          \> : \> $M \leftarrow(M)-1, Flags\leftarrow((A)-(M))$ \\
  9133. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  9134.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  9135. \end{tabbing}
  9136. \begin{tabbing}
  9137. Adressierungsmodi \= : \= \kill \\
  9138. Anweisung         \> : \> \tty{SBX} \\
  9139. Funktion          \> : \> $X\leftarrow((X)\&(A))-(M)$ \\
  9140. Adressierungsmodi \> : \> immediate \\
  9141. \end{tabbing}
  9142. \begin{tabbing}
  9143. Adressierungsmodi \= : \= \kill \\
  9144. Anweisung         \> : \> \tty{ISB} \\
  9145. Funktion          \> : \> $M\leftarrow(M)+1, A\leftarrow(A)-(M)-(C)$ \\
  9146. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  9147.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  9148. \end{tabbing}
  9149.  
  9150. %%---------------------------------------------------------------------------
  9151.  
  9152. \section{MELPS-740}
  9153.  
  9154. Die Mikrokontroller dieser Reihe haben ein sehr nettes, verstecktes
  9155. Feature: Setzt man mit dem Befehl \tty{SET} das Bit 5 des
  9156. Statusregisters, so wird bei allen arithmetischen Operationen (und
  9157. Ladebefehlen) der Akkumulator durch die durch das X-Register adressierte
  9158. Speicherzelle ersetzt.  Dieses Feature syntaxm"a"sig sauber zu integrieren,
  9159. ist bisher nicht geschehen, d.h. es kann bisher nur im ,,Handbetrieb''
  9160. (\tty{SET}...Befehle mit Akkuadressierung...\tty{CLT}) genutzt werden.
  9161. \par
  9162. Nicht alle MELPS-740-Prozessoren implementieren alle Befehle.  An dieser
  9163. Stelle mu"s der Programmierer aufpassen, da"s er nur die Befehle benutzt,
  9164. die auch wirklich vorhanden sind, da \asname{} die Prozessoren dieser Familie
  9165. nicht n"aher unterscheidet.  Die Besonderheiten der
  9166. Special-Page-Adressierung werden bei der Erkl"arung von \tty{ASSUME} n"aher
  9167. erl"autert.
  9168.  
  9169. %%---------------------------------------------------------------------------
  9170.  
  9171. \section{MELPS-7700/65816}
  9172. \label{MELPS7700Spec}
  9173.  
  9174. Offensichtlich haben diese beiden Prozessorfamilien ausgehend vom
  9175. 6502 ("uber ihre 8-bittigen Vorg"anger) etwas disjunkte Entwicklungswege
  9176. hinter sich.  Kurz aufgelistet, ergeben sich folgende Unterschiede:
  9177. \begin{itemize}
  9178. \item{der 65816 hat keinen B-Akkumulator.}
  9179. \item{beim 65816 fehlen Multiplikations- sowie Divisionsbefehle.}
  9180. \item{Die Befehle \tty{SEB}, \tty{CLB}, \tty{BBC}, \tty{BBS},
  9181.      \tty{CLM}, \tty{SEM}, \tty{PSH}, \tty{PUL} und \tty{LDM}
  9182.      fehlen beim 65816.  An deren Stelle in der Code-Tabelle finden
  9183.      sich \tty{TSB}, \tty{TRB}, \tty{BIT}, \tty{CLD}, \tty{SED},
  9184.      \tty{XBA}, \tty{XCE} und \tty{STZ}.}
  9185. \end{itemize}
  9186. Identische Funktion, jedoch andere Namen haben folgende Befehle:
  9187. \par
  9188. \begin{center}\begin{tabular}{|c|c||c|c|}
  9189. \hline
  9190.   65816  &  MELPS-7700 & 65816 & MELPS-7700 \\
  9191. \hline
  9192. \hline
  9193.    \tty{REP}   &    \tty{CLP}      & \tty{PHK}   &   \tty{PHG} \\
  9194.    \tty{TCS}   &    \tty{TAS}      & \tty{TSC}   &   \tty{TSA} \\
  9195.    \tty{TCD}   &    \tty{TAD}      & \tty{TDC}   &   \tty{TDA} \\
  9196.    \tty{PHB}   &    \tty{PHT}      & \tty{PLB}   &   \tty{PLT} \\
  9197.    \tty{WAI}   &    \tty{WIT}      &       &       \\
  9198. \hline
  9199. \end{tabular}\end{center}
  9200. \par
  9201. Besonders t"uckisch sind die Befehle \tty{PHB}, \tty{PLB} und \tty{TSB}:
  9202. diese Befehle haben jeweils eine v"ollig andere Funktion und Kodierung!
  9203. \par
  9204. Leider tun diese Prozessoren mit ihrem Speicher etwas, was f"ur mich
  9205. auf der nach oben offenen Perversit"atsskala noch vor der
  9206. Intel-m"a"sigen Segmentierung rangiert: sie banken ihn!
  9207. Nunja, dies ist wohl der Preis f"ur die 6502-Aufw"artskompatibilit"at;
  9208. wie dem auch sei, damit \asname{} den gew"unschten Code erzeugen kann, mu"s
  9209. man ihn "uber den \tty{ASSUME}-Befehl "uber den Inhalt einiger
  9210. Register in Kenntnis setzen:
  9211. \par
  9212. Das M-Flag bestimmt, ob die Akkumulatoren A und B 8 Bit (1) oder 16 Bit
  9213. (0) breit sein sollen.  Analog entscheidet das Flag X "uber die Breite
  9214. der Indexregister X und Y.  \asname{} ben"otigt die Information "uber die
  9215. Registerbreite bei unmittelbarer Adressierung (\tty{\#<Konstante>}), ob das
  9216. Argument 8 oder 16 Bit breit sein soll.
  9217. \par
  9218. Der Speicher ist in 256 B"anke zu 64 Kbyte geteilt.  Da alle Register
  9219. im Prozessor nur maximal 16 Bit breit sind, kommen die obersten 8
  9220. Adre"sbits aus 2 speziellen Bank-Registern: DT liefert die oberen 8
  9221. Bits bei Datenzugriffen, PG erweitert den 16-bittigen Programmz"ahler
  9222. auf 24 Bit.  Die vom 6502 her bekannte ,,Zero-Page'' ist mittels
  9223. des 16 Bit breiten Registers DPR frei innerhalb der ersten Bank
  9224. verschiebbar.  Trifft \asname{} nun im Code auf eine Adresse (egal ob in
  9225. einem absoluten, indizierten oder indirekten Ausdruck), so versucht
  9226. er der Reihe nach folgende Adressierungsvarianten:
  9227. \begin{enumerate}
  9228. \item{Liegt die Adresse im Bereich von DPR...DPR+\$ff?  Falls ja,
  9229.      Verwendung von direkter Adressierung mit 8-Bit-Adresse.}
  9230. \item{Liegt die Adresse innerhalb der durch DT (bzw. PG f"ur
  9231.      Sprungbefehle) festgelegten Seite?  Falls ja, Verwendung von
  9232.      absoluter Adressierung mit 16-Bit-Adresse.}
  9233. \item{Falls nichts anderes hilft, Verwendung von langer Adressierung
  9234.      mit 24-Bit-Adresse.}
  9235. \end{enumerate}
  9236. Aus dieser Aufz"ahlung folgt, da"s das Wissen "uber die momentanen
  9237. Werte von DT,PG und DPR f"ur die Funktion von \asname{} essentiell ist;
  9238. sind die Angaben fehlerhaft, adressiert das Programm ,,in die W"uste''.
  9239. Diese Aufz"ahlung geht "ubrigens davon aus, da"s alle drei
  9240. Adre"sl"angen verf"ugbar sind; sollte dies einmal nicht der Fall sein,
  9241. so wird die Entscheidungskette entsprechen k"urzer.
  9242. Die oben geschilderte, automatische Festlegung der Adre"sl"ange l"a"st
  9243. sich auch durch die Verwendung von Pr"afixen "ubersteuern.  Stellt
  9244. man der Adresse ein $<$, $>$ oder $>>$ ohne trennendes Leerzeichen voran,
  9245. so wird eine Adresse mit 1, 2 oder 3 Bytes benutzt, unabh"angig davon,
  9246. ob dies die optimale L"ange ist.  Benutzt man eine f"ur diesen Befehl
  9247. nicht erlaubte oder f"ur die Adresse zu kurze L"ange, gibt es eine
  9248. Fehlermeldung.
  9249. Um die Portierung von 6502-Programmen zu erleichtern, verwendet \asname{} f"ur
  9250. Hexadezimalkonstanten die Motorola-Syntax und nicht die von Mitsubishi
  9251. "ubrigens f"ur die 740er favorisierte Intel/IEEE-Schreibweise.
  9252. Ich halte erstere auch f"ur die bessere Schreibweise, und die Entwickler
  9253. des 65816 werden dies vermutlich "ahnlich gesehen haben (da man mittels
  9254. der \tty{RELAXED}-Anweisung auch Intel-Notation benutzen kann, wird durch
  9255. diese Entscheidung auch niemand festgelegt).  Ein f"ur die
  9256. Portierung "ahnlich wichtiges Detail ist, da"s der Akkumulator A als
  9257. Ziel von Operationen auch weggelassen werden darf, anstelle von
  9258. \tty{LDA A,\#0} darf also z.B. auch einfach \tty{LDA \#0} geschrieben
  9259. werden.
  9260. \par
  9261. Ein echtes Bonbon in dem Befehlssatz sind dagegen die Blocktransferbefehle
  9262. \tty{MVN} und \tty{MVP}.  Etwas eigenartig ist nur die Adre"sangabe:
  9263. Bit 0--15 im Indexregister, Bit 16--23 im Befehl.  Bei \asname{} gibt  man als
  9264. Argument f"ur beide Speicherbl"ocke einfach die vollen Adressen an, \asname{}
  9265. fischt sich dann die passenden Bits automatisch heraus.  Dies ist ein
  9266. feiner, aber wichtiger Unterschied zum Mitsubishi-Assembler, bei dem
  9267. man die oberen 8 Bit selber herausziehen mu"s.  Richtig bequem
  9268. wird es aber erst mit einem Makro im folgendem Stil:
  9269. \begin{verbatim}
  9270. mvpos   macro   src,dest,len
  9271.        if      MomCPU=$7700
  9272.         lda    #len
  9273.        elseif
  9274.         lda    #(len-1)
  9275.        endif
  9276.        ldx     #(src&$ffff)
  9277.        ldy     #(dest&$ffff)
  9278.        mvp     dest,src
  9279.        endm
  9280. \end{verbatim}
  9281. Vorsicht, Falle: Steht im Akkumulator die Zahl $n$, so transferiert
  9282. der Mitsubishi $n$ Bytes, der 65816 jedoch $n+1$ Bytes!
  9283. \par
  9284. Sehr nett sind auch die Befehle \tty{PSH} und \tty{PUL}, mit deren Hilfe es
  9285. m"oglich ist, mit einem Befehl einen frei w"ahlbaren Satz von Registern
  9286. auf dem Stack zu sichern oder von ihm zu laden.  Nach dem
  9287. Mitsubishi-Datenbuch\cite{Mit16} mu"s die Angabe der Bitmasken immediate
  9288. erfolgen, der Programmierer soll also entweder alle
  9289. Register$\leftrightarrow$Bitstellen-Zuordnungen im Kopf behalten oder
  9290. sich passende Symbole definieren.  Hier habe ich die Syntax eigenm"achtig
  9291. erweitert, um die Sache etwas angenehmer zu machen: Es darf eine Liste
  9292. angegeben werden, die sowohl immediate-Ausdr"ucke als auch Registernamen
  9293. enthalten darf.  Damit sind z.B. die Anweisungen
  9294. \begin{verbatim}
  9295.        psh     #$0f
  9296. \end{verbatim}
  9297. und
  9298. \begin{verbatim}
  9299.        psh     a,b,#$0c
  9300. \end{verbatim}
  9301. und
  9302. \begin{verbatim}
  9303.        psh     a,b,x,y
  9304. \end{verbatim}
  9305. "aquivalent.  Da die immediate-Version weiterhin erlaubt ist, bleibt
  9306. \asname{} hier ,,aufw"artskompatibel'' zu den Mitsubishi-Assemblern.
  9307. \par
  9308. Nicht ganz habe ich beim Mitsubishi-Assembler die Behandlung des
  9309. \tty{PER}-Befehles verstanden: Mit diesem Befehl kann man eine
  9310. 16-Bit-Variable auf den Stack legen, deren Adresse relativ zum
  9311. Programmz"ahler angegeben wird.  Es ist aus der Sicht des Programmierers
  9312. also eine absolute Adressierung einer Speicherzelle.  Nichtsdestotrotz
  9313. verlangt Mitsubishi eine immediate-Adressierung, und das Argument wird so
  9314. in den Code eingesetzt, wie es im Quelltext steht.  Die Differenz mu"s
  9315. man selber ausrechnen, was mit der Einf"uhrung von symbolischen Assemblern
  9316. ja abgeschafft werden sollte...da ich aber auch ein bi"schen ,,kompatibel''
  9317. denken mu"s, enth"alt \asname{} eine Kompromi"sl"osung: W"ahlt man
  9318. immediate-Adressierung (also mit Gartenzaun), so verh"alt sich \asname{} wie das
  9319. Original von Mitsubishi.  L"a"st man ihn jedoch weg, so berechnet \asname{} die
  9320. Differenz vom Argument zum momentanen Programmz"ahler und setzt diese
  9321. ein.
  9322. \par
  9323. "Ahnlich sieht es beim \tty{PEI}-Befehl aus, der den Inhalt einer
  9324. 16-Bit-Variablen auf der Zeropage auf den Stack legt:  Obwohl der Operand
  9325. eine Adresse ist, wird wieder immediate-Adressierung verlangt.  Hier
  9326. l"a"st \asname{} schlicht beide Versionen zu (d.h. mit oder ohne Gartenzaun).
  9327.  
  9328. %%---------------------------------------------------------------------------
  9329.  
  9330. \section{M16}
  9331.  
  9332. Die M16-Familie ist eine Familie "au"serst komplexer CISC-Prozessoren
  9333. mit einem entsprechend komplizierten Befehlssatz.  Zu den Eigenschaften
  9334. dieses Befehlssatzes geh"ort es unter anderem, da"s bei Operationen
  9335. mit zwei Operanden beide Operanden verschiedene L"angen haben d"urfen.
  9336. Die bei Motorola "ubliche und von Mitsubishi "ubernommene Methode, die
  9337. Operandengr"o"se als Attribut an den Befehl anzuh"angen, mu"ste daher
  9338. erweitert werden: Es ist erlaubt, auch an die Operanden selber Attribute
  9339. anzuh"angen.  So wird im folgenden Beispiel
  9340. \begin{verbatim}
  9341.        mov     r0.b,r6.w
  9342. \end{verbatim}
  9343. Register 0 8-bittig gelesen, auf 32 Bit vorzeichenerweitert und das
  9344. Ergebnis in Register 6 kopiert.  Da man in 9 von 10 F"allen aber von
  9345. diesen M"oglichkeiten doch keinen Gebrauch macht, kann man weiterhin
  9346. die Operandengr"o"se an den Befehl selber schreiben, z.B. so:
  9347. \begin{verbatim}
  9348.        mov.w   r0,r6
  9349. \end{verbatim}
  9350. Beide Varianten d"urfen auch gemischt verwendet werden, eine
  9351. Gr"o"senangabe am Operanden "ubersteuert dann den ,,Default'' am Befehl.
  9352. Eine Ausnahme stellen Befehle mit zwei Operanden dar.   Bei diesen ist
  9353. der Default f"ur den Quelloperanden die Gr"o"se des Zieloperanden. In
  9354. folgendem Beispiel
  9355. \begin{verbatim}
  9356.        mov.h   r0,r6.w
  9357. \end{verbatim}
  9358. wird also auf Register 0 32-bittig zugegriffen, die Gr"o"senangabe
  9359. am Befehl wird "uberhaupt nicht mehr benutzt.  Finden sich "uberhaupt
  9360. keine Angaben zur Operandengr"o"se, so wird Wort(w) verwendet.  Merke:
  9361. im Gegensatz zu den 68000ern bedeutet dies 32 und nicht 16 Bit!
  9362. \par
  9363. Reichlich kompliziert sind auch die verketteten Adressierungsmodi;
  9364. dadurch, da"s \asname{} die Verteilung auf Kettenelemente automatisch
  9365. vornimmt, bleibt die Sache aber einigerma"sen "ubersichtlich.  Die
  9366. einzige Eingriffsm"oglichkeit, die bei \asname{} gegeben ist (der Originalassembler
  9367. von Mitsubishi/Green Hills kann da noch etwas mehr), ist die explizite
  9368. Festlegung von Displacement-L"angen mittels der Anh"angsel \tty{:4},
  9369. \tty{:16} und \tty{:32}.
  9370.  
  9371. %%---------------------------------------------------------------------------
  9372.  
  9373. \section{CP-3F}
  9374.  
  9375. Der CP-3F wurde Anfang der 70er-Jahre entwickelt, wo auch die Entwicklungssysteme
  9376. deutlich weniger leistungsf"ahig waren und bei der Assembler-Syntax auch
  9377. auf die leichte Umsetzbarkeit im Maschinensprache geachtet wurde.  So
  9378. gruppieren sich die Original-Mnemonics in wenige Gruppen: Befehle mit
  9379. 3/4- oder 8-Bit-immediate-Argument, solche mit einem Registeroperanden,
  9380. Spr"unge und Befehle ganz ohne Argumente.  Das l"ast sich mit relativ wenig
  9381. Aufwand in Maschinencode "ubersetzen, der Lesbarkeit des Quellcodes
  9382. ist das aber eher abtr"aglich - "ahnlich wie beim Intel 8080.  Ich habe mich
  9383. deshalb entschlossen, f"ur die meisten Befehle eine alternative Schreibweise
  9384. anzubieten, die verst"andlicher ausdr"uckt, was der jeweilige Befehl
  9385. tut:
  9386.  
  9387. \begin{longtable}{|l|l|l|}
  9388. \hline
  9389. Original & Alternativ & Funktion \\
  9390. \hline
  9391. \hline
  9392. \endhead
  9393. \input{../doc_COM/cp3finst.tex}
  9394. \\ \hline
  9395. \caption{Alternative Befehlsschreibweisen f"ur CP-3F}
  9396. \label{CP3FInst}
  9397. \end{longtable}
  9398.  
  9399. %%---------------------------------------------------------------------------
  9400.  
  9401. \section{4004/4040}
  9402.  
  9403. John Weinrich sei dank, habe ich nun auch die offiziellen Datenbl"atter
  9404. von Intel "uber diese 'Urv"ater' aller Mikroprozessoren, und die
  9405. Unklarheiten "uber die Syntax von Registerpaaren (f"ur 8-Bit-Operationen)
  9406. sind f"urs erste ausger"aumt.  Die Syntax lautet \tty{RnRm}, wobei \tty{n}
  9407. bzw. \tty{m} gerade Integers im Bereich 0 bis E bzw. 1 bis F sind.  Dabei
  9408. gilt immer \tty{m = n + 1}.
  9409.  
  9410. %%---------------------------------------------------------------------------
  9411.  
  9412. \section{MCS-48}
  9413.  
  9414. Der maximale Adre"sraum dieser Prozessoren betr"agt 4 KByte, bzw. 8 KByte
  9415. bei einigen Philips-Varianten.  Dieser Raum ist jedoch nicht linear organisiert
  9416. (wie k"onnte das bei Intel auch anders sein...), sondern in 2 B"anke zu 2
  9417. Kbyte geteilt.  Ein Wechsel zwischen diesen beiden B"anken ist nur durch die
  9418. Befehle \tty{CALL} und \tty{JMP} erlaubt, indem vor dem Sprung das h"ochste
  9419. Adre"sbit mit den Befehlen \tty{SEL MB0} bis \tty{SEL MB3} vorgegeben wird.
  9420.  
  9421. Man kann dem Assembler mit einem
  9422. \begin{verbatim}
  9423.         ASSUME MB:<0..3>
  9424. \end{verbatim}
  9425. mitteilen, welche Speicherbank gerade f"ur Sprungziele gew"ahlt ist; wird auf
  9426. eine Adresse gesprungen, die au"serhalb dieser Bank liegt, wird eine Warnung
  9427. ausgegeben.
  9428.  
  9429. Wenn der Sonderwert {\tt NOTHING} angegeben wird (dies ist auch der Default),
  9430. so greift eine in den Befehlen \tty{JMP} und \tty{CALL} eingebaute Automatik ,
  9431. die den Wechsel zwischen den B"anken vereinfacht.  Sie f"ugt automatisch einen
  9432. {\tt SEL MBx} Befehl ein, falls die Adresse des Sprungbefehles und das
  9433. Sprungziel in unterschiedlichen B"anken liegen.  Die explizite Benutzung der
  9434. \tty{SEL MBx}-Befehle ist dann nicht mehr notwendig (obwohl sie m"oglich
  9435. bleibt) und kann die Automatik auch durcheinanderbringen, wie in dem folgenden
  9436. Beispiel:
  9437. \begin{verbatim}
  9438. 000:    SEL     MB1
  9439.         JMP     200h
  9440. \end{verbatim}
  9441. \asname{} nimmt an, da"s das MB-Flag auf 0 steht und f"ugt keinen
  9442. \tty{SEL MB0}-Befehl vor dem Sprung ein, mit der Folge, da"s der
  9443. Prozessor zur Adresse A00h springt.
  9444. Weiterhin ist zu beachten, da"s ein Sprungbefehl durch diesen Mechanismus
  9445. unter Umst"anden ein Byte l"anger wird.
  9446.  
  9447. %%---------------------------------------------------------------------------
  9448.  
  9449. \section{MCS-51}
  9450.  
  9451. Dem Assembler liegen die Dateien STDDEF51.INC bzw. 80C50X.INC bei, in
  9452. denen alle Bits und SFRs der Prozessoren 8051, 8052 und 80515 bzw. 80C501,
  9453. 502 und 504 verzeichnet sind.  Je nach Einstellung des Prozessortyps mit
  9454. dem \tty{CPU}-Befehl wird dabei die korrekte Untermenge eingebunden, die
  9455. richtige Reihenfolge f"ur den Anfang eines Programms ist daher
  9456. \begin{verbatim}
  9457.         CPU     <Prozessortyp>
  9458.         INCLUDE stddef51.inc   ,
  9459. \end{verbatim}
  9460. sonst f"uhren die MCS-51-Pseudobefehle in der Include-Datei zu
  9461. Fehlermeldungen.
  9462. \par
  9463. Da der 8051 keinen Befehl kennt, um die Register 0..7 auf den Stack zu
  9464. legen, mu"s mit deren absoluten Adressen gearbeitet werden.  Diese
  9465. h"angen aber von der momentan aktiven Registerbank ab.  Um diesem Mi"sstand
  9466. etwas abzuhelfen, ist in den Include-Dateien das Makro \tty{USING} definiert,
  9467. dem als Parameter die Symbole \tty{Bank0..Bank3} gegeben werden k"onnen.
  9468. Das Makro belegt daraufhin die Symbole \tty{AR0..AR7} mit den passenden
  9469. absoluten Adressen der Register.  Dieses Makro sollte nach jeder
  9470. Bankumschaltung benutzt werden.  Es erzeugt selber \ii{keinen} Code zur
  9471. Umschaltung!
  9472. \par
  9473. Das Makro f"uhrt in der Variablen \tty{RegUsage} gleichzeitig Buch "uber
  9474. alle jemals benutzten Registerb"anke; Bit 0 entspricht Bank 0, Bit 1 der
  9475. Bank 1 usw. .  Der Inhalt kann am Ende der Quelldatei z.B. mit folgendem
  9476. Codest"uck ausgegeben werden:
  9477. \begin{verbatim}
  9478.         irp     BANK,Bank0,Bank1,Bank2,Bank3
  9479.          if      (RegUsage&(2^BANK))<>0
  9480.           message "Bank \{BANK} benutzt"
  9481.          endif
  9482.         endm
  9483. \end{verbatim}
  9484. Mit der Mehrpass-F"ahigkeit ab Version 1.38 wurde es m"oglich, zus"atzlich
  9485. die Befehle \tty{JMP} und \tty{CALL} einzuf"uhren.  Bei der Kodierung
  9486. von Spr"ungen mit diesen Befehlen w"ahlt \asname{} je nach Adre"slage automatisch
  9487. die optimale Variante, d.h. \tty{SJMP/AJMP/LJMP} f"ur \tty{JMP} und
  9488. \tty{ACALL/LCALL} f"ur \tty{CALL}.  Es ist nat"urlich weiterhin m"oglich,
  9489. die Varianten direkt zu verwenden, um eine bestimmte Kodierung zu erzwingen.
  9490.  
  9491. %%---------------------------------------------------------------------------
  9492.  
  9493. \section{MCS-251}
  9494.  
  9495. Intel hat sich beim 80C251 ja bem"uht, den "Ubergang f"ur den Programmierer
  9496. auf die neue Familie so weich wie m"oglich zu gestalten, was darin gipfelt,
  9497. da"s alte Anwendungen ohne Neu"ubersetzung auf dem neuen Prozessor ablaufen
  9498. k"onnen.  Sobald man jedoch den erweiterten Befehlssatz der 80C251 nutzen
  9499. will, gilt es, einige Details zu beachten, die sich als versteckte
  9500. Fu"sangeln auftun.
  9501. \par
  9502. An vorderster Stelle steht dabei die Tatsache, da"s der 80C251 keinen
  9503. getrennten Bitadre"sraum mehr hat.  Es sind nunmehr alle SFRs unabh"angig
  9504. von ihrer Adre"slage sowie die ersten 128 Speicherstellen des internen
  9505. RAMs bitadressierbar.  M"oglich wird dies dadurch, da"s die Bitadressierung
  9506. nicht mehr "uber einen zus"atzlichen virtuellen Adre"sraum, der andere
  9507. Adre"sr"aume "uberdeckt, erfolgt, sondern so wie bei anderen Prozessoren
  9508. auch durch eine zweidimensionale Adressierung, die aus der Speicherstelle,
  9509. die das Bit beinhaltet sowie der Bitstelle im Byte besteht.  Dies bedeutet
  9510. zum einen, da"s bei einer Bitangabe wie z.B. PSW.7 \asname{} die Zerlegung der
  9511. Teile links und rechts vom Punkt selber vornimmt.  Es ist also nicht mehr
  9512. n"otig, mittels eines \tty{SFRB}-Befehls wie noch beim 8051 explizit 8
  9513. Bitsymbole zu erzeugen.  Dies bedeutet zum anderen, da"s es den
  9514. \tty{SFRB}-Befehl "uberhaupt nicht mehr gibt.  Wird er in zu portierenden
  9515. 8051-Programmen benutzt, kann er durch einen einfachen \tty{SFR}-Befehl
  9516. ersetzt werden.
  9517. \par
  9518. Weiterhin hat Intel in den unterschiedlichen Adre"sr"aumen des 8051
  9519. geh"orig aufger"aumt: Der Bereich des internen RAMs (\tty{DATA} bzw.
  9520. \tty{IDATA}), der \tty{XDATA}-Bereich und er bisherige \tty{CODE}-Bereich
  9521. wurden in einem einzigen, 16 Mbyte gro"sen \tty{CODE}-Bereich vereinigt.
  9522. Das interne RAM beginnt bei Adresse 0, das interne ROM beginnt bei
  9523. Adresse ff0000h, dorthin mu"s also auch der Code mittels \tty{ORG}
  9524. hinverlagert werden.  Ausgelagert wurden dagegen die \tty{SFRs} in einen
  9525. eigenen Adre"sraum (der bei \asname{} als \tty{IO}-Segment definiert ist).  In
  9526. diesem neuen Adre"sraum haben sie aber die gleichen Adressen wie beim 8051.
  9527. Der \tty{SFR}-Befehl kennt diesen Unterschied und legt mit ihm erzeugte
  9528. Symbole je nach Zielprozessor automatisch ins \tty{DATA}- bzw.
  9529. \tty{IO}-Segment.  Da es keinen Bit-Adre"sraum mehr gibt, funktioniert der
  9530. \tty{BIT}-Befehl v"ollig anders: anstelle einer linearen Adresse von 0 bis
  9531. 255 beinhalten Bit-Symbole jetzt in Bit 0..7 die Adresse, in Bit 24..26
  9532. die Bitstelle.  Damit ist es jetzt leider nicht mehr so einfach m"oglich,
  9533. Felder von Flags mit symbolischen Namen anzulegen: Wo man beim 8051 noch
  9534. z.B.
  9535. \begin{verbatim}
  9536.        segment bitdata
  9537.  
  9538. bit1    db      ?
  9539. bit2    db      ?
  9540. \end{verbatim}
  9541. oder
  9542. \begin{verbatim}
  9543. defbit  macro   name
  9544. name    bit     cnt
  9545. cnt     set     cnt+1
  9546.        endm
  9547. \end{verbatim}
  9548. schreiben konnte, hilft jetzt nur noch die zweite Variante weiter, z.B.
  9549. so:
  9550. \begin{verbatim}
  9551. adr     set     20h     ; Startadresse Flags im internen RAM
  9552. bpos    set     0
  9553.  
  9554. defbit  macro   name
  9555. name    bit     adr.bpos
  9556. bpos    set     bpos+1
  9557.        if      bpos=8
  9558. bpos     set     0
  9559. adr      set     adr+1
  9560.        endif
  9561.        endm
  9562. \end{verbatim}
  9563. Ein weiteres, kleines Detail: Da Intel als Kennzeichnung f"ur den Carry
  9564. nun CY statt C bevorzugt, sollte man ein eventuell benutztes Symbol
  9565. umbenennen.  \asname{} versteht aber auch weiterhin die alte Variante in den
  9566. Befehlen \tty{CLR, CPL, SETB, MOV, ANL,} und \tty{ORL}.  Gleiches gilt
  9567. sinngem"a"s f"ur die dazugekommenen Register \tty{R8..R15, WR0..WR30,
  9568. DR0..DR28, DR56, DR60, DPX} und \tty{SPX}.
  9569. \par
  9570. Intel m"ochte es gerne, da"s man absolute Adressen in der Form \tty{XX:YYYY}
  9571. schreibt, wobei \tty{XX} eine 64K-Bank im Adre"sraum angibt bzw. mit einem
  9572. \tty{S} Adressen im IO-Raum kennzeichnet.  Wie man sich schon denken kann,
  9573. halte ich davon nicht allzu viel, weshalb man an allen Stellen Adressen
  9574. genauso gut linear angeben kann; lediglich um das S f"ur die Kennzeichnung
  9575. von I/O-Adressen kommt man nicht herum, z.B. hier:
  9576. \begin{verbatim}
  9577. Carry   bit   s:0d0h.7
  9578. \end{verbatim}
  9579. Ohne den Pr"afix w"urde \asname{} die absolute Adresse in das Code-Segment
  9580. legen, und dort sind ja nur die ersten 128 Byte bitadressierbar...
  9581. \par
  9582. Wie auch schon beim 8051 gibt es die generischen Befehle \tty{JMP} und
  9583. \tty{CALL}, die je nach Adre"slage automatisch die k"urzeste Variante
  9584. einsetzen.  W"ahrend \tty{JMP} aber die Variante mit 24 Bit mitber"ucksichtigt,
  9585. tut \tty{CALL} dies aus gutem Grund nicht: Der \tty{ECALL}-Befehl legt
  9586. n"amlich im Gegensatz zu \tty{ACALL} und \tty{LCALL} 3 Bytes auf den
  9587. Stack, und man h"atte sonst einen \tty{CALL}-Befehl, bei dem man nicht
  9588. mehr genau wei"s, was er tut.  Bei \tty{JMP} tritt diese Problem nicht auf.
  9589. \par
  9590. Aus einer Sache bin ich nicht ganz schlau geworden: Der 80251 kann
  9591. auch immediate-Operanden auf den Stack legen, und zwar sowohl einzelne
  9592. Bytes als auch ganze W"orter.  F"ur beide Varianten ist aber der gleiche
  9593. Befehl \tty{PUSH} vorgesehen -- und woher soll bitte ein Assembler bei
  9594. einer Anweisung wie
  9595. \begin{verbatim}
  9596.        push #10
  9597. \end{verbatim}
  9598. wissen, ob ein Byte oder ein Wort mit dem Wert 10 auf den Stack gelegt
  9599. werden soll?  Daher gilt im Augenblick die Regelung, da"s \tty{PUSH}
  9600. grunds"atzlich ein Byte ablegt; wer ein Wort ablegen will, schreibt
  9601. einfach \tty{PUSHW} anstelle \tty{PUSH}.
  9602. \par
  9603. Noch ein gut gemeinter Ratschlag: Wer den erweiterten Befehlssatz des
  9604. 80C251 nutzt, sollte den Prozessor auch tunlichst im Source-Modus
  9605. betreiben, sonst werden alle neuen Anweisungen ein Byte l"anger!  Um
  9606. die origin"aren 8051-Anweisungen, die daf"ur im Source-Modus l"anger
  9607. werden, ist es nicht besonders schade: Sie werden entweder von \asname{}
  9608. automatisch durch neue, leistungsf"ahigere ersetzt oder sind be-
  9609. treffen veraltete Adressierungsarten (indirekte Adressierung mit
  9610. 8-Bit-Registern).
  9611.  
  9612. %%---------------------------------------------------------------------------
  9613.  
  9614. \section{8080/8085}
  9615. \label{8080Spec}
  9616.  
  9617. Wie schon weiter vorne erw"ahnt, ist es m"oglich, durch ein
  9618. \begin{verbatim}
  9619.       Z80SYNTAX <OFF|ON|EXCLUSIVE>
  9620. \end{verbatim}
  9621. f"ur die allermeisten 8080/8085-Befehle m"oglich, sie auch wahlweise
  9622. oder ausschlie"slich im 'Z80-Stil' zu schreiben, d.h. mit weniger
  9623. Mnemonics, daf"ur aber mit deutlich aussagekr"aftigeren Operanden.
  9624. F"ur die folgenden Befehle ist die Z80-Syntax im nicht-exklusiven Modus
  9625. nicht m"oglich, da sie mit existierenden 8080-Mnemonics kollidieren:
  9626. \begin{itemize}
  9627. \item{\tty{CP} ist in der 'Intel-Syntax' der Befehl f"ur 'Call on
  9628.      Positive', in der Zilog-Syntax jedoch der Befehl f"ur
  9629.      'Compare'.  Verwendet man \tty{CP} mit einem absoluten
  9630.      Zahlenwert als Argument, so ist f"ur den Assembler nicht zu
  9631.      erkennen, ob das ein Sprung zu einer absoluten Adresse sein
  9632.      soll oder ein Vergleich mit einem immediate-Wert.  Der
  9633.      Assembler wird in so einem Fall einen Sprung kodieren, da
  9634.      die Intel-Syntax bei Mehrdeutigkeiten Vorrang hat.  M"ochte
  9635.      man den Vergleich haben, so kann man den Akkumulator als
  9636.      Zieloperanden explizit hinschreiben, also z.B. \tty{CP A,12h}
  9637.      anstatt \tty{CP 12h}.}
  9638. \item{\tty{JP} ist in der Intel-Syntax der Befehl f"ur 'Jump on
  9639.      Positive', in der Zilog-Syntax jedoch der allgemeine
  9640.      Sprung-Befehl.  F"ur bedingte Spr"unge in Zilog-Syntax (\tty{JP
  9641.      cond,addr}) ist die Sache wegen der zwei Argumente eindeutig,
  9642.      bei nur einem Argument wird der Assembler aber den bedingten
  9643.      Sprung kodieren.  Wer einen unbedingten Sprung zu einer
  9644.      absoluten Adresse haben m"ochte, mu"s weiterhin die
  9645.      Intel-Variante (\tty{JMP addr}) verwenden.}
  9646. \end{itemize}
  9647. Der 8085 unterst"utzt mit \tty{RIM} und \tty{SIM} zwei Befehle, die
  9648. im Z80-Befehlssatz nicht existieren.  Diese k"onnen ''Z80-artig'' als
  9649. \tty{LD A,IM} bzw. \tty{LD IM,A} geschrieben werden.
  9650. \par
  9651. Der beim Z80-Target definierte 'generische Sprungbefehl' {\tt J} ist
  9652. bei aktivierter Z80-Syntax ebenfalls verf"ugbar, da der 8080/8085
  9653. jedoch keine relativen Spr"unge unterst"utzt, wird {\tt J} immer
  9654. in {\tt JP} "ubersetzt.
  9655.  
  9656. %%---------------------------------------------------------------------------
  9657.  
  9658. \section{8085UNDOC}
  9659. \label{8085Spec}
  9660.  
  9661. "Ahnlich wie beim Z80 oder 6502, sind auch beim 8085 die undokumentierten
  9662. Befehle nicht n"aher von Intel spezifiziert worden, weshalb es nicht
  9663. undenkbar ist, da"s andere Assembler andere Mnemonics daf"ur verwenden.
  9664. Deshalb sollen auch diese Befehle und ihre Funktion hier kurz aufgelistet
  9665. werden.  Und auch hier wieder ist die Verwendung dieser Befehle auf
  9666. eigenes Risiko - schon der an sich zum 8085 aufw"artskompatible Z80
  9667. benutzt diese Opcodes f"ur v"ollig andere Funktionen...
  9668.  
  9669. \begin{tabbing}
  9670. Argumente         \= : \= \kill \\
  9671. Anweisung         \> : \> \tty{DSUB [reg]} \\
  9672. Z80-Syntax        \> : \> \tty{SUB HL,reg} \\
  9673. Funktion          \> : \> HL $\leftarrow$ HL - reg \\
  9674. Flags             \> : \> CY, S, X5, AC, Z, V, P \\
  9675. Argumente         \> : \> \tty{reg} = B f"ur BC (optional f"ur nicht-Z80-Syntax) \\
  9676. \end{tabbing}
  9677.  
  9678. \begin{tabbing}
  9679. Argumente         \= : \= \kill \\
  9680. Anweisung         \> : \> \tty{ARHL} \\
  9681. Z80-Syntax        \> : \> \tty{SRA HL} \\
  9682. Funktion          \> : \> HL,CY $\leftarrow$ HL $>>$ 1 (arithmetisch) \\
  9683. Flags             \> : \> CY \\
  9684. Argumente         \> : \> keine bzw. fix f"ur Z80-Syntax \\
  9685. \end{tabbing}
  9686.  
  9687. \begin{tabbing}
  9688. Argumente         \= : \= \kill \\
  9689. Anweisung         \> : \> \tty{RDEL} \\
  9690. Z80-Syntax        \> : \> \tty{RLC DE} \\
  9691. Funktion          \> : \> CY,DE $\leftarrow$ DE $<<$ 1 \\
  9692. Flags             \> : \> CY, V \\
  9693. Argumente         \> : \> keine bzw. fix f"ur Z80-Syntax \\
  9694. \end{tabbing}
  9695.  
  9696. \begin{tabbing}
  9697. Argumente         \= : \= \kill \\
  9698. Anweisung         \> : \> \tty{LDHI d8} \\
  9699. Z80-Syntax        \> : \> \tty{ADD DE,HL,d8} \\
  9700. Funktion          \> : \> DE $\leftarrow$ HL + {\tt d8} \\
  9701. Flags             \> : \> keine \\
  9702. Argumente         \> : \> {\tt d8} = 8-Bit-Konstante, Register fix f"ur Z80-Syntax \\
  9703. \end{tabbing}
  9704.  
  9705. \begin{tabbing}
  9706. Argumente         \= : \= \kill \\
  9707. Anweisung         \> : \> \tty{LDSI d8} \\
  9708. Z80-Syntax        \> : \> \tty{ADD DE,SP,d8} \\
  9709. Funktion          \> : \> DE $\leftarrow$ SP + {\tt d8} \\
  9710. Flags             \> : \> keine \\
  9711. Argumente         \> : \> {\tt d8} = 8-Bit-Konstante, Register fix f"ur Z80-Syntax \\
  9712. \end{tabbing}
  9713.  
  9714. \begin{tabbing}
  9715. Argumente         \= : \= \kill \\
  9716. Anweisung         \> : \> \tty{RSTflag} \\
  9717. Z80-Syntax        \> : \> \tty{RST flag} \\
  9718. Funktion          \> : \> Restart zu 40h wenn {\tt flag}=1 \\
  9719. Flags             \> : \> keine \\
  9720. Argumente         \> : \> {\tt flag} = V f"ur Overflow-Bit \\
  9721. \end{tabbing}
  9722.  
  9723. \begin{tabbing}
  9724. Argumente         \= : \= \kill \\
  9725. Anweisung         \> : \> \tty{SHLX [reg]} \\
  9726. Z80-Syntax        \> : \> \tty{LD (reg),HL} \\
  9727. Funktion          \> : \> [reg] $\leftarrow$ HL \\
  9728. Flags             \> : \> keine \\
  9729. Argumente         \> : \> \tty{reg} = D/DE f"ur DE (optional f"ur nicht-Z80-Syntax) \\
  9730. \end{tabbing}
  9731.  
  9732. \begin{tabbing}
  9733. Argumente         \= : \= \kill \\
  9734. Anweisung         \> : \> \tty{LHLX [reg]} \\
  9735. Z80-Syntax        \> : \> \tty{LD HL,(reg)} \\
  9736. Funktion          \> : \> HL $\leftarrow$[reg] \\
  9737. Flags             \> : \> keine \\
  9738. Argumente         \> : \> \tty{reg} = D/DE f"ur DE (optional f"ur nicht-Z80-Syntax) \\
  9739. \end{tabbing}
  9740.  
  9741. \begin{tabbing}
  9742. Argumente         \= : \= \kill \\
  9743. Anweisung         \> : \> \tty{JNX5 adr} \\
  9744. Z80-Syntax        \> : \> \tty{JP NX5, adr} \\
  9745. Funktion          \> : \> springe zu {\tt adr} wenn X5=0 \\
  9746. Flags             \> : \> keine \\
  9747. Argumente         \> : \> {\tt adr} = absolute 16-Bit-Adresse \\
  9748. \end{tabbing}
  9749.  
  9750. \begin{tabbing}
  9751. Argumente         \= : \= \kill \\
  9752. Anweisung         \> : \> \tty{JX5 adr} \\
  9753. Funktion          \> : \> springe zu {\tt adr} wenn X5=1 \\
  9754. Flags             \> : \> keine \\
  9755. Argumente         \> : \> {\tt adr} = absolute 16-Bit-Adresse \\
  9756. \end{tabbing}
  9757.  
  9758. Mit X5 ist dabei das ansonsten unbenutzte Bit 5 im PSW-Register gemeint.
  9759.  
  9760. %%---------------------------------------------------------------------------
  9761.  
  9762. \section{8086..V35}
  9763.  
  9764. Eigentlich hatte ich mir geschworen, die Segmentseuche der 8086er aus diesem
  9765. Assembler herauszuhalten.  Da aber nun eine Nachfrage kam und Studenten
  9766. flexiblere Menschen als die Entwickler dieses Prozessors sind, findet sich
  9767. ab sofort auch eine rudiment"are Unterst"utzung dieser Prozessoren in \asname{}.
  9768. Unter ,,rudiment"ar'' verstehe ich dabei nicht, da"s der Befehlssatz nicht
  9769. vollst"andig abgedeckt wird, sondern da"s ich nicht den ganzen Wust an
  9770. Pseudoanweisungen integriert habe, die sich bei MASM, TASM \& Co. finden.
  9771. \asname{} ist auch nicht in erster Linie geschrieben worden, um PC-Programme zu
  9772. entwickeln (Gott bewahre, das hie"se wirklich, das Rad neu zu erfinden),
  9773. sondern zur Programmentwicklung f"ur Einplatinenrechner, die eben unter
  9774. anderem auch mit 8086ern best"uckt sein k"onnen.
  9775. \par
  9776. F"ur Unentwegte, die mit \asname{} doch DOS-Programme schreiben wollen, eine kleine
  9777. Liste dessen, was zu beachten ist:
  9778. \begin{itemize}
  9779. \item{Es k"onnen nur COM-Programme erzeugt werden.}
  9780. \item{Verwenden Sie nur das \tty{CODE}-Segment, und legen Sie auch alle
  9781.      Variablen darin ab.}
  9782. \item{Alle Segmentregister werden von DOS auf das Codesegment
  9783.      vorinitialisiert.  Ein \tty{ASSUME DS:CODE, SS:CODE} am
  9784.      Programmanfang ist daher notwendig.}
  9785. \item{DOS l"adt den Code ab Adresse 100h.  Ein \tty{ORG} auf diese
  9786.      Adresse ist daher zwingend.}
  9787. \item{Die Umwandlung in eine Bin"ardatei erfolgt mit P2BIN (s.u.), wobei als
  9788.      als Adre"sbereich \tty{\$-\$} anzugeben ist.}
  9789. \end{itemize}
  9790. Allgemein unterst"utzt \asname{} f"ur diese Prozessoren nur ein Small-Programmiermodell, d.h.
  9791. \ii{ein} Codesegment mit maximal 64 KByte und ein ebenfalls h"ochstens 64
  9792. KByte gro"ses Datensegment mit (f"ur COM-Dateien uninitialisierten) Daten.
  9793. Zwischen diesen beiden Segmenten kann mit dem \tty{SEGMENT}-Befehl hin-und hergeschaltet werden.
  9794. Aus dieser Tatsache folgert, da"s Spr"unge immer intrasegment"ar sind,
  9795. sofern sie sich auf Adressen im Codesegment beziehen.  Falls weite Spr"unge
  9796. doch einmal erforderlich sein sollten, k"onnen sie mit \tty{CALLF} und
  9797. \tty{JMPF} und einer Speicheradresse oder einen Segment:Offset-Wert als
  9798. Argument erreicht werden.
  9799. \par
  9800. Ein weiteres gro"ses Problem dieser Prozessoren ist deren Assemblersyntax,
  9801. deren genaue Bedeutung nur aus dem Zusammenhang erkennbar ist.  So kann im
  9802. folgenden Beispiel je nach Symboltyp sowohl unmittelbare als auch absolute
  9803. Adressierung gemeint sein:
  9804. \begin{verbatim}
  9805.        mov     ax,wert
  9806. \end{verbatim}
  9807. Bei \asname{} ist immer unmittelbare Adressierung gemeint, wenn um den Operanden
  9808. keine eckigen Klammern stehen.  Soll z.B. die Adresse oder der Inhalt einer
  9809. Variablen geladen werden, so ergeben sich die in Tabelle \ref{TabMASM}
  9810. aufgelisteten Unterschiede.
  9811. \begin{table*}
  9812. \begin{center}\begin{tabular}{|l|l|l|}
  9813. \hline
  9814. Assembler  & Adresse                  & Inhalt                 \\
  9815. \hline
  9816. \hline
  9817. MASM       & \tty{mov ax,offset vari} & \tty{mov ax,vari}      \\
  9818.           & \tty{lea ax,vari}        & \tty{mov ax,[vari]}    \\
  9819.           & \tty{lea ax,[vari]}      &                        \\
  9820.           &                          &                        \\
  9821. \asname{}         & \tty{mov ax,vari}        & \tty{mov ax,[vari]}    \\
  9822.           & \tty{lea ax,[vari]}      &                        \\
  9823.           &                          &                        \\
  9824. \hline
  9825. \end{tabular}\end{center}
  9826. \caption{Unterschiede in der Adressierungssyntax \asname{}$\leftrightarrow$MASM\label{TabMASM}}
  9827. \normalsize
  9828. \end{table*}
  9829. \par
  9830. Der Assembler pr"uft bei Symbolen, ob sie im Datensegment liegen und
  9831. versucht, automatisch einen passenden Segmentpr"afix einzuf"ugen, z.B.
  9832. falls ohne CS-Pr"afix auf Symbole im Code zugegriffen wird.  Dieser
  9833. Mechanismus kann jedoch nur funktionieren, falls der \tty{ASSUME}-Befehl
  9834. (siehe dort) korrekt angewendet wurde.
  9835. \par
  9836. Die Intel-Syntax verlangt eine Abspeicherung, ob an einem Symbol Bytes oder
  9837. W"orter abgelegt wurden.  \asname{} nimmt diese Typisierung nur vor, falls in der
  9838. gleichen Zeile wie das Label ein \tty{DB} oder \tty{DW} steht.  F"ur alle anderen F"alle
  9839. mu"s mit den Operatoren \tty{WORD PTR, BYTE PTR} usw. explizit angegeben werden,
  9840. um was f"ur eine Operandengr"o"se es sich handelt.  Solange ein Register an der
  9841. Operation beteiligt ist, kann auf diese Kennzeichnung verzichtet werden, da
  9842. durch den Registernamen die Operandengr"o"se eindeutig bestimmt ist.
  9843. \par
  9844. Der Koprozessor in 8086-Systemen wird "ublicherweise durch den TEST-Eingang
  9845. des Prozessors synchronisiert, indem selbiger mit dem BUSY-Ausgang des
  9846. Koprozessors verbunden wird.  \asname{} unterst"utzt dieses Handshaking, indem
  9847. vor jedem 8087-Befehl automatisch ein \tty{WAIT}-Befehl eingef"ugt wird.  Ist
  9848. dies aus irgendwelchen Gr"unden unerw"unscht (z.B. w"ahrend der
  9849. Initialisierung), so mu"s im Opcode hinter dem \tty{F} ein \tty{N} eingef"ugt
  9850. werden; aus
  9851. \begin{verbatim}
  9852.        FINIT
  9853.        FSTSW   [vari]
  9854. \end{verbatim}
  9855. wird so z.B.
  9856. \begin{verbatim}
  9857.        FNINIT
  9858.        FNSTSW  [vari]
  9859. \end{verbatim}
  9860. Diese Variante ist bei \ii{allen} Koprozessorbefehlen erlaubt.
  9861.  
  9862. %%---------------------------------------------------------------------------
  9863.  
  9864. \section{8X30x}
  9865. \label{8X30xSpec}
  9866.  
  9867. Die Prozessoren dieser Reihe sind auf eine einfache Manipulation von
  9868. Bitgruppen auf Peripherieadressen optimiert worden.  Um mit solchen
  9869. Bitgruppen auch symbolisch umgehen zu k"onnen, existieren die Befehle
  9870. \tty{LIV} und \tty{RIV}, mit denen einer solchen Bitgruppe ein
  9871. symbolischer Name zugewiesen wird.  Diese Befehle arbeiten "ahnlich
  9872. wie \tty{EQU}, ben"otigen aber drei Parameter:
  9873. \begin{enumerate}
  9874. \item{die Adresse der peripheren Speicherzelle, in der sich die
  9875.      Bitgruppe befindet (0..255);}
  9876. \item{die Bitnummer des ersten Bits in der Gruppe (0..7);}
  9877. \item{die L"ange der Gruppe in Bits (1..8).}
  9878. \end{enumerate}
  9879. \bb{ACHTUNG!}  Der 8X30x unterst"utzt keine Bitgruppen, die "uber mehrere
  9880. Speicherstellen hinausreichen, so da"s je nach Startposition der
  9881. Wertebereich f"ur die L"ange eingeschr"ankt sein kann.  \asname{} nimmt hier
  9882. \bb{keine} Pr"ufung vor, man bekommt lediglich zur Laufzeit merkw"urdige
  9883. Ergebnisse!
  9884.  
  9885. Im Maschinencode dr"ucken sich L"ange und Position durch ein 3-Bit-Feld
  9886. im Instruktionswort sowie ein passende Registernummer (\tty{LIVx} bzw.
  9887. \tty{RIVx}) aus.  Bei der Verwendung eines symbolischen Objektes wird \asname{}
  9888. diese Felder automatisch richtig besetzen, es ist aber auch erlaubt,
  9889. die L"ange als dritten Operanden explizit anzugeben, wenn man nicht
  9890. mit symbolischen Busobjekten arbeitet.  Trifft \asname{} auf eine L"angenangabe
  9891. trotz eines symbolischen Operanden, so vergleicht er beide L"angen
  9892. und gibt eine Fehlermeldung bei Ungleichheit aus (das gleiche passiert
  9893. "ubrigens auch, wenn man bei einem \tty{MOVE}-Befehl zwei symbolische
  9894. Operanden mit unterschiedlicher L"ange benutzt - die Instruktion hat
  9895. einfach nur ein L"angenfeld...).
  9896.  
  9897. Neben den eigentlichen Maschinenbefehlen des 8X30x implementiert \asname{}
  9898. noch "ahnlich wie das ,,Vorbild'' MCCAP einige Pseudoinstruktionen, die
  9899. als eingebaute Makros ausgef"uhrt sind:
  9900. \begin{itemize}
  9901. \item{\tty{NOP} ist eine Kurzschreibweise f"ur \tty{MOVE AUX,AUX}}
  9902. \item{\tty{HALT} ist eine Kurzschreibweise f"ur {\tt JMP \verb!*!}}
  9903. \item{\tty{XML ii} ist eine Kurzschreibweise f"ur \tty{XMIT ii,R12} (nur
  9904.      8X305)}
  9905. \item{\tty{XMR ii} ist eine Kurzschreibweise f"ur \tty{XMIT ii,R13} (nur
  9906.      8X305)}
  9907. \item{\tty{SEL $<$busobj$>$} ist eine Kurzschreibweise f"ur
  9908.      \tty{XMIT $<$adr$>$,IVL/IVR}, f"uhrt also die notwendige Vorselektion
  9909.      durch, um \tty{$<$busobj$>$} ansprechen zu k"onnen.}
  9910. \end{itemize}
  9911. Die bei MCCAP ebenfalls noch vorhandenen \tty{CALL-} und
  9912. \tty{RTN-}Instruktionen sind mangels ausreichender Dokumentation momentan
  9913. nicht implementiert. Das gleiche gilt f"ur einen Satz an
  9914. Pseudoinstruktionen zur Datenablage. Kommt Zeit, kommt Rat...
  9915.  
  9916. %%---------------------------------------------------------------------------
  9917.  
  9918. \section{XA}
  9919.  
  9920. "Ahnlich wie sein Vorg"anger MCS/51, jedoch im Unterschied zu seinem
  9921. ,,Konkurrenten'' MCS/251 besitzt der Philips XA einen getrennten Bitadre"sraum,
  9922. d.h. alle mit Bitbefehlen manipulierbaren Bits haben eine
  9923. bestimmte, eindimensionale Adresse, die in den Maschinenbefehlen auch
  9924. so abgelegt wird.  Die naheliegende M"oglichkeit, diesen dritten
  9925. Adre"sraum (neben Code und Daten) auch so in \asname{} anzubieten, habe ich
  9926. nicht nutzen k"onnen, und zwar aus dem Grund, da"s ein Teil der Bitadressen
  9927. im Gegensatz zum MCS/51 nicht mehr eindeutig ist: Bits mit
  9928. den Adressen 256 bis 511 bezeichnen Bits der Speicherzellen 20h..3fh
  9929. aus dem aktuellen Datensegment.  Dies bedeutet aber, da"s diese Adressen
  9930. je nach Situation unterschiedliche Bits ansprechen k"onnen - ein definieren
  9931. von Bits mit Hilfe von \tty{DC}-Befehlen, was durch ein extra Segment
  9932. m"oglich geworden w"are, w"urde also nicht "uberm"a"sig viel Sinn ergeben.
  9933. Zur Definition einzelner, symbolisch ansprechbarer Bits steht aber
  9934. nach wie vor der \tty{BIT}-Befehl zur Verf"ugung, mit dem beliebige Bitadressen
  9935. (Register, RAM, SFR) definiert werden k"onnen.  F"ur Bitadressen im
  9936. internen RAM wird auch die 64K-Bank-Adresse gespeichert, so da"s \asname{}
  9937. Zugriffe "uberpr"ufen kann, sofern das DS-Register korrekt mit \tty{ASSUME}
  9938. vorbesetzt wurde.
  9939. \par
  9940. Nichts drehen kann man dagegen an den Bem"uhungen von \asname{}, potentielle
  9941. Sprungziele (also Zeilen im Code mit Label) auf gerade Adressen
  9942. auszurichten.  Dies macht \asname{} genauso wie andere XA-Assembler auch durch
  9943. Einf"ugen von \tty{NOP}s vor dem fraglichen Befehl.
  9944.  
  9945. %%---------------------------------------------------------------------------
  9946.  
  9947. \section{AVR}
  9948.  
  9949. Im Gegensatz zum AVR-Assembler verwendet \asname{} defaultm"a"sig das Intel-Format
  9950. zur Darstellung von Hexadezimalkonstanten und nicht die C-Syntax.  OK, nicht
  9951. vorher in den (freien) AVR-Assembler hineingeschaut, aber als ich mit dem
  9952. AVR-Teil anfing, gab es zum AVR noch nicht wesentlich mehr als ein
  9953. vorl"aufiges Datenbuch mit Prozessortypen, die dann doch nie kamen...mit
  9954. einem \tty{RELAXED ON} schafft man dieses Problem aus der Welt.
  9955.  
  9956. Optional kann \asname{} f"ur die AVRs (es geht auch f"ur andere CPU's, nur
  9957. macht es dort keinen Sinn...) sogenannte ,,Objekt-Dateien'' erzeugen.
  9958. Das sind Dateien, die sowohl Code als auch Quellzeileninformationen
  9959. enthalten und z.B. eine schrittweise Abarbeitung auf Quellcodeebene
  9960. mit dem von Atmel gelieferten Simulator WAVRSIM erlauben.  Leider
  9961. scheint dieser mit Quelldateispezifikationen, die l"anger als ca. 20
  9962. Zeichen sind, seine liebe Not zu haben: Namen werden abgeschnitten
  9963. oder um wirre Sonderzeichen erg"anzt, wenn die Maximall"ange "uberschritten
  9964. wird.  \asname{} speichert deshalb in den Objekt-Dateien Dateinamen ohne
  9965. Pfadangabe, so da"s es eventuell Probleme geben k"onnte, wenn
  9966. Dateien (z.B. Includes) nicht im Arbeitsverzeichnis liegen.
  9967.  
  9968. Eine kleine Besonderheit sind Befehle, die Atmel bereits in der
  9969. Architektur vorgesehen hat, aber noch in keinem Mitglied der Familie
  9970. implementiert wurden.  Dabei handelt es sich um die Befehle {\tt MUL, JMP}
  9971. und {\tt CALL}.  Besonders bei letzteren fragt man sich vielleicht, wie man
  9972. denn nun den 4 KWorte gro"sen Adre"sraum des AT90S8515 erreichen kann,
  9973. wenn die 'n"achstbesten' Befehle {\tt RJMP} und {\tt RCALL} doch nur 2
  9974. KWorte weit springen kann.  Der Kunstgriff lautet 'Abschneiden der oberen
  9975. Adre"sbits' und ist n"aher bei der {\tt WRAPMODE}-Anweisung beschrieben.
  9976.  
  9977. F"ur alle AVR-CPUs ist das CPU-Argument {\tt CODESEGSIZE} definiert.
  9978. Mit einem
  9979. \begin{verbatim}
  9980.   cpu atmega8:codesegsize=0
  9981. \end{verbatim}
  9982. weist man den Assembler an, das Code-Segment (also das interne Flash-ROM)
  9983. nicht als in 16-Bit-Worten, sondern in 8-Bit-Bytes organisiert zu betrachten.
  9984. Dies ist die Sichtweise, wie man sie beim {\tt LPM}-Befehl hat und wie sie
  9985. einige andere (nicht-Atmel) Assembler grunds"atzlich verfolgen.  Sie hat den
  9986. Vorteil, da"s man Adressen im {\tt CODE}-Segment f"ur Datenzugriffe nicht selber
  9987. mit zwei multiplizieren mu"s, andererseits mu"s aber darauf geachtet werden,
  9988. da"s Instruktionen niemals auf einer ungeraden Adresse liegen d"urfen - sie
  9989. w"urden dann ja quasi halb auf einem und halb auf dem n"achsten 16-Bit-Wort
  9990. im Flash-ROM liegen.  {\tt PADDING} ist deshalb im Default aktiviert, es bleibt
  9991. aber m"oglich, mit {\tt DB} oder {\tt DATA} Byte-Felder zu definieren, ohne
  9992. da"s zwischen den Anweisungen Padding-Bytes eingestreut werden.  Bei relativen
  9993. oder absoluten Spr"ungen werden die Adressen im ''Byte-Modus'' automatisch
  9994. durch zwei geteilt.  Default ist die vom Atmel-Assembler vorgegebene Organisation
  9995. in unteilbare 16-Bit-Worte.  Diese kann auch explizit mit dem Argument
  9996. \verb!codesegsize=1! gew"ahlt werden.
  9997.  
  9998. %%---------------------------------------------------------------------------
  9999.  
  10000. \section{Z80, Z380}
  10001.  
  10002. Der Z80 kennt zwei Arten von Spr"ungen: relativ ({\tt JR}) erlaubt Sprungdistanzen
  10003. von -128 bis +127 Byte, w"ahrend man mit absoluten Spr"ungen ({\tt JP}) den
  10004. kompletten Adre"sraum erreicht.  \asname{} unterst"utzt einen Pseudobefehl
  10005. {\tt J}, der anhand der Zieladresse und der Sprungbedingung automatisch die
  10006. k"urzestm"ogliche Variante w"ahlt (relative Spr"unge sind nicht f"ur alle
  10007. Bedingungen definiert).  Dies gilt auch f"ur alle vom Z80 abgeleiteten Targets,
  10008. wie Z80UNDOC, Z180, RABBIT2000 und LR35902.
  10009.  
  10010. F"ur den Z380 wird {\tt J} ebenfalls angeboten, da der Z380 jedoch gr"o"sere
  10011. Sprungdistanzen unterst"utzt, wird erst auf absolute Spr"unge ausgewichen,
  10012. wenn die g"o"stm"ogliche Sprungdistanz (+/- 8 MByte) nicht mehr ausreicht.
  10013.  
  10014. Generell sollte dieser Befehl mit Bedacht eingesetzt werden, da {\tt JR} und
  10015. {\tt JP} nicht g"anzlich funktionsgleich sind: Code, der ausschlie"slich
  10016. relative Spr"unge benutzt, kann positionsunabh"angig ausgef"uhrt werden,
  10017. w"ahrend absolute Spr"unge einer Relozierung bed"urfen.
  10018.  
  10019. %%---------------------------------------------------------------------------
  10020.  
  10021. \section{Z80UNDOC}
  10022.  
  10023. Da es von Zilog naturgem"a"s keine Syntaxvorgaben f"ur die undokumentierten
  10024. Befehle gibt und wohl auch nicht jeder den kompletten Satz kennt,
  10025. ist es vielleicht sinnvoll, diese Befehle hier kurz aufzuz"ahlen:
  10026. \par
  10027. Wie auch beim Z380 und eZ80 ist es m"oglich, die Byte-H"alften von IX und IY
  10028. einzeln anzusprechen.  Im einzelnen sind dies folgende Varianten:
  10029. \begin{verbatim}
  10030. INC Rx              LD R,Rx             LD  Rx,n
  10031. DEC Rx              LD Rx,R             LD  Rx,Ry
  10032. ADD/ADC/SUB/SBC/AND/XOR/OR/CP A,Rx
  10033. \end{verbatim}
  10034. Dabei stehen \tty{Rx} bzw. \tty{Ry} f"ur \tty{IXL, IXU, IYL} oder
  10035. \tty{IYU}.  Zu beachten ist jedoch, da"s in der \tty{LD Rx,Ry}-Variante
  10036. beide Register aus dem gleichen Indexregister stammen m"ussen.
  10037. \par
  10038. Die Kodierung von Schiebebefehlen besitzt noch eine undefinierte
  10039. Bitkombination, die als \tty{SL1}-, \tty{SLI}-, \tty{SLIA}- oder
  10040. \tty{SLS}-Befehl zug"anglich ist.  Er funktioniert wie \tty{SLA},
  10041. es wird jedoch eine Eins und nicht eine Null in Bit 0 eingeschoben.
  10042. \bb{ACHTUNG}: In Internet findet man f"ur diesen Befehl auch den
  10043. Namen \tty{SLL}, ich habe mich aber entschieden, dies nicht zu
  10044. implementieren.  \tty{SLL} steht f"ur ,,Shift Logically Left'' und
  10045. die von diesem Befehl ausgef"uhrte Operation ist kein logischer
  10046. Linksshift - wenn \tty{SLL} "uberhaupt definiert werden sollte, dann
  10047. als Alias zu \tty{SLA}.  Wer f"ur existierenden Code \tty{SLL} mit
  10048. der Funktion von \tty{SL1/SLI} braucht, definiere sich daf"ur ein
  10049. Makro.
  10050.  
  10051. Dieser undokumentierte Schiebebefehl kann, wie alle anderen
  10052. Schiebebefehle auch, noch in zwei weiteren Varianten benutzt
  10053. werden:
  10054. \begin{verbatim}
  10055.        SLIA    R,(XY+d)
  10056.        SLIA    (XY+d),R
  10057. \end{verbatim}
  10058. Dabei steht \tty{R} f"ur ein beliebiges 8-Bit-Register (aber nicht eine
  10059. Indexregisterh"alfte...), und \tty{(XY+d)} f"ur eine normale
  10060. indexregister-relative Adressierung.  Das Ergebnis dieser Operation
  10061. ist, da"s das Schiebeergebnis zus"atzlich ins Register geladen wird.
  10062. Dies funktioniert auch bei den \tty{RES-} und \tty{SET-}Befehlen:
  10063. \begin{verbatim}
  10064.        SET/RES R,n,(XY+d)
  10065.        SET/RES n,(XY+d),R
  10066. \end{verbatim}
  10067. Des weiteren gibt es noch zwei versteckte I/O-Befehle:
  10068. \begin{verbatim}
  10069.        IN      (C) bzw. TSTI
  10070.        OUT     (C),0
  10071. \end{verbatim}
  10072. Deren Funktionsweise sollte klar sein.  \bb{ACHTUNG!} Es gibt keine
  10073. Garantie daf"ur, da"s alle Z80-Masken alle diese Befehle beherrschen,
  10074. und die Z80-Nachfolger l"osen zuverl"assig Traps aus.  Anwendung
  10075. daher auf eigene Gefahr...
  10076.  
  10077. %%---------------------------------------------------------------------------
  10078.  
  10079. \section{GB\_Z80 bzw. LR35902}
  10080.  
  10081. Das im originalen Gameboy verbaute SoC namens LR35092 wurde von Sharp
  10082. entwickelt, und der darin verbaute Prozessorkern ist (vermutlich) der gleiche
  10083. wie in den SM83-Mikrokontrollern.  Dieser ist vom Befehlssatz auf dem
  10084. ,,halben Weg'' zwischen 8080 und Z80, allerdings auch mit seinen
  10085. eigenen Auslassungen und Erweiterungen.  F"ur die neuen Befehle hat
  10086. Sharp nat"urlich eine Assembler-Syntax definiert, in der
  10087. ,,Gameboy-Szene'' haben sich aber auch einige alternative
  10088. Schreibweisen eingeb"urgert.  Ich habe mich bem"uht, diese (so weit
  10089. bekannt) zu ber"ucksichtigen:
  10090.  
  10091. \begin{center}\begin{tabular}{|l|l|l|}
  10092. \hline
  10093. Sharp & alternativ & Funktion \\
  10094. \hline
  10095. \hline
  10096. LD A,(HLD)    & LD A,(HL-)  & A $\longleftarrow$ (HL), \\
  10097.              & LDD A,(HL)  & HL $\longleftarrow$ HL-1 \\
  10098. \hline
  10099. LD A,(HLI)    & LD A,(HL+)  & A $\longleftarrow$ (HL), \\
  10100.              & LDI A,(HL)  & HL $\longleftarrow$ HL+1 \\
  10101. \hline
  10102. LD (HLD),A    & LD (HL-),A  & (HL) $\longleftarrow$ A, \\
  10103.              & LDD (HL),A  & HL $\longleftarrow$ HL-1 \\
  10104. \hline
  10105. LD (HLI),A    & LD (HL+),A  & (HL) $\longleftarrow$ A, \\
  10106.              & LDI (HL),A  & HL $\longleftarrow$ HL+1 \\
  10107. \hline
  10108. LD A,(C)      & LD A,(FF00+C) & A $\longleftarrow$ (0ff00h+C) \\
  10109.              & LDH A,(C)     & \\
  10110. \hline
  10111. LD (C),A      & LD (FF00+C),A & (0ff00h+C) $\longleftarrow$ A \\
  10112.              & LDH (C),A     & \\
  10113. \hline
  10114. LD (FF00+n),A & LDH (n),A     & (0ff00h+n) $\longleftarrow$ A \\
  10115. \hline
  10116. LD A,(FF00+n) & LDH A,(n)     & A $\longleftarrow$ (0ff00h+n) \\
  10117. \hline
  10118. LDHL SP,d     & LD HL,SP+d    & HL $\longleftarrow$ SP + d \\
  10119. \hline
  10120. LDX A,(nn)    & LD A,(nn)     & A $\longleftarrow$ (nn) $^{1}$ \\
  10121. \hline
  10122. LDX (nn),A    & LD (nn),A     & (nn) $\longleftarrow$ A $^{1}$ \\
  10123. \hline
  10124. \multicolumn{3}{|l|}{$^{1}$ erzwingt 16-Bit-Adressierung. } \\
  10125. \hline
  10126. \end{tabular}\end{center}
  10127.  
  10128. %%---------------------------------------------------------------------------
  10129.  
  10130. \section{Z380}
  10131.  
  10132. Da dieser Prozessor als Enkel des wohl immer noch beliebtesten
  10133. 8-Bit-Prozessors konzipiert wurde, war es bei der Entwicklung
  10134. unabdingbar, da"s dieser bestehende Z80-Programme ohne "Anderung
  10135. ausf"uhren kann (nat"urlich geringf"ugig schneller, etwa um den
  10136. Faktor 10...).  Die erweiterten F"ahigkeiten k"onnen daher nach
  10137. einem Reset mit zwei Flags zugeschaltet werden, die XM (eXtended
  10138. Mode, d.h. 32- statt 16-Bit-Adre"sraum) und LW (long word mode,
  10139. d.h. 32- statt 16- Bit-Operanden) hei"sen.  Deren Stand mu"s man
  10140. \asname{} "uber die Befehle \tty{EXTMODE} und \tty{LWORDMODE} mitteilen, damit
  10141. Adressen und Konstantenwerte gegen die korrekten Obergrenzen
  10142. gepr"uft werden.  Die Umschaltung zwischen 32- und 16-Bit-Befehlen
  10143. bewirkt nat"urlich nur bei solchen Befehlen etwas, die auch in
  10144. einer 32-Bit-Version existieren; beim Z380 sind das momentan
  10145. leider nur Lade- und Speicherbefehle, die ganze Arithmetik kann
  10146. nur 16-bittig ausgef"uhrt werden.  Hier sollte Zilog wohl noch
  10147. einmal etwas nachbessern, sonst kann man den Z380 selbst beim
  10148. besten Willen nur als ,,16-Bit-Prozessor mit 32-Bit-Erweiterungen''
  10149. bezeichnen...
  10150.  
  10151. Kompliziert wird die Sache dadurch, da"s die mit LW eingestellte
  10152. Operandengr"o"se f"ur einzelne Befehle mit den Pr"afixen \tty{DDIR W}
  10153. und \tty{DDIR LW} "ubersteuert werden kann.  \asname{} merkt sich das
  10154. Auftreten solcher Befehle und schaltet dann f"ur den n"achsten
  10155. Prozessorbefehl automatisch mit um.  Andere \tty{DDIR}-Varianten
  10156. als \tty{W} und \tty{LW} sollte man "ubrigens nie explizit
  10157. verwenden, da \asname{} bei zu langen Operanden diese automatisch
  10158. einsetzt, und das k"onnte zu Verwirrungen f"uhren.  Die Automatik
  10159. geht "ubrigens so weit, da"s in der Befehlsfolge
  10160. \begin{verbatim}
  10161.        DDIR    LW
  10162.        LD      BC,12345678h
  10163. \end{verbatim}
  10164. automatisch der erforderliche \tty{IW}-Pr"afix mit in die
  10165. vorangehende Anweisung hineingezogen wird, effektiv wird also
  10166. der Code
  10167. \begin{verbatim}
  10168.        DDIR    LW,IW
  10169.        LD      BC,12345678h
  10170. \end{verbatim}
  10171. erzeugt.  Der im ersten Schritt erzeugte Code f"ur \tty{DDIR LW}
  10172. wird verworfen, was an einem \tty{R} im Listing zu erkennen
  10173. ist.
  10174.  
  10175. %%---------------------------------------------------------------------------
  10176.  
  10177. \section{Z8, Super8 und eZ8}
  10178. \label{Z8Spec}
  10179.  
  10180. Der Prozessorkern der Z8-Mikrokontroller beinhaltet keine eigenen
  10181. Register.  Stattdessen kann ein 16er-Block des internen Adre"sraums
  10182. aus RAM und I/O-Registern als 'Arbeitsregister' benutzt werden, die
  10183. mit 4-Bit-Adressen angesprochen werden k"onnen.  Welcher 16er-Block
  10184. als Arbeitsregister benutzt werden soll, wird mit den RP-Registern
  10185. festgelegt: Bits 4 bis 7 von RP definieren beim klassischen Z8 den
  10186. 'Offset', der auf die 4-Bit-Arbeitsregisteradresse addiert wird,
  10187. um eine 8-Bit-Adresse zu erhalten.  Beim Super8-Kern existieren
  10188. zwei RP-Register (RP0 und RP1), die es erlauben, obere und untere
  10189. H"alfte der Arbeitsregister an getrennte Stellen zu legen.
  10190.  
  10191. "Ublicherweise werden die Arbeitsregister in der Assemblersyntax als
  10192. Register R0...R15 angesprochen, man kann diese Arbeitsregister aber
  10193. auch als eine Methode zur effizienteren (k"urzeren) Adressierung eines
  10194. 16er-Bocks im internen RAM betrachten.
  10195.  
  10196. Mit dem \tty{ASSUME}-Befehl teilt man \asname{} den aktuellen Wert von RP mit.  \asname{}
  10197. ist dann in der Lage, bei einer Adresse aus dem internen RAM
  10198. automatisch zu entscheiden, ob dieser Operand mit einer 4-Bit Adresse
  10199. angesprochen werden kann oder eine 8-Bit-Adresse verwendet werden
  10200. mu"s.  Man kann diese Funktion auch dazu benutzen, Arbeitsregistern
  10201. symbolische Namen zu verpassen:
  10202. \begin{verbatim}
  10203. op1     equ     040h
  10204. op2     equ     041h
  10205.  
  10206.        srp     #040h
  10207.        assume  rp:040h
  10208.  
  10209.         ld      op1,op2         ; entspricht ld r0,r1
  10210. \end{verbatim}
  10211. Es ist auch auf dem Super8 m"oglich, RP als Argument von \tty{ASSUME}
  10212. anzugeben, obwohl dieser kein RP-Register hat (nur RP0 und RP1).  In
  10213. diesem Fall werden die angenommen Werte von RP0 und RP1 auf $wert$ bzw.
  10214. $wert+8$ gesetzt, analog zum \tty{SRP} Maschinenbefehl auf dem Super8-
  10215. Kern.
  10216.  
  10217. Im Gegensatz zum Original Zilog-Assembler ist es nicht erforderlich,
  10218. eine 'Arbeitsregisteradressierung' explizit durch ein vorangestelltes
  10219. Ausrufezeichen anzufordern, wobei \asname{} diese Syntax nichtsdestotrotz
  10220. versteht - ein vorangestelltes Ausrufezeichen erzwingt quasi
  10221. 4-Bit-Adressierung, auch wenn die Adresse eigentlich nicht im durch
  10222. RP festgelegten 16-Bit-Fenster liegt (dann wird eine Warnung
  10223. ausgegeben).  Umgekehrt ist es durch ein vorangestelltes $>$-Zeichen
  10224. m"oglich, eine Adressierung mit 8 Bit zu erzwingen, auch wenn die
  10225. Adresse eigentlich im aktuellen 16er-Fenster liegt.
  10226.  
  10227. Beim eZ8 wird das Spielchen quasi eine Stufe weiter getrieben: der
  10228. interne Daten-Adre"sbereich ist jetzt 12 statt 8 Bit gro"s.  Um
  10229. kompatibel zum alten Z8-Kern zu sein, hat Zilog die zus"atzlichen
  10230. Banking-Bits in den {\em unteren} vier Bits von RP untergebracht -
  10231. ein RP-Wert von 12h definiert also das 16er-Adre"sfenster von 210h
  10232. bis 21fh.
  10233.  
  10234. Die unteren vier Bits von RP definieren beim eZ8 gleichzeitig das
  10235. 256er-Fenster, das man mit 8-Bit-Adressen erreichen kann - hier gilt
  10236. ein analoger Mechanismus, der daf"ur sorgt, da"s \asname{} automatisch 12-
  10237. oder 8-Bit-Adressen verwendet.  'Lange' 12-Bit-Adressen kann man mit
  10238. zwei vorangestellten $>$-Zeichen erzwingen.
  10239.  
  10240. %%---------------------------------------------------------------------------
  10241.  
  10242. \section{Z8000}
  10243. \label{Z8000Spec}
  10244.  
  10245. Der Z8001/8003 kann in zwei verschiedenen Modi betrieben werden:
  10246. \begin{itemize}
  10247. \item{{\em Nicht segmentiert}: Der Speicheradre"sraum ist auf 64 KByte
  10248.      beschr"ankt, alle Adressen sind 'einfache' lineare 16-Bit-
  10249.      Adressen.  Adre"sregister sind einfache 16-Bit-Register (Rn),
  10250.      und absolute Adressen in Befehlen sind ein 16-Bit-Wort lang.}
  10251. \item{{\em Segmentiert}: Der Speicher ist in bis zu 128 Segmente von
  10252.      jeweils maximal 64 KByte aufgeteilt.  Adressen bestehen aus
  10253.      einem 7-bittigen Segment und einem 16-bittigen Offset.  Adre"sregister
  10254.      sind immer Registerpaare (RRn).  Absolute Adressen in Befehlen
  10255.      sind zwei 16-Bit-Worte lang, au"ser der Offset is kleiner 256.}
  10256. \end{itemize}
  10257.  
  10258. Die Betriebsart (segmentiert oder nicht segmentiert) hat also einen
  10259. Einflu"s auf den erzeugten Code und wird implizit "uber den verwendeten
  10260. Prozessortyp umgeschaltet.  Ist das Ziel also z.B. ein Z8001 im nicht
  10261. segmentierten Modus, so w"ahlt man einfach Z8002 als Ziel.
  10262.  
  10263. Eine 'echte' Unterst"utzung eines segmentierten Speichermodells bietet
  10264. \asname{} indes f"ur den Z8000 genauso wenig wie f"ur den 8086.  Im segmentierten
  10265. Modus wird die Segmentnummer einfach als die oberen sieben Adre"sbits
  10266. eines gedacht linearen 8MB-Adre"sraums behandelt.  Dies ist eigentlich
  10267. nicht im Sinne des Erfinders, aber es entspricht der Art und Weise, wie
  10268. der Z8001 in Systemen ohne MMU effektiv betrieben wurde.
  10269.  
  10270. Generell implementiert \asname{} die Assembler-Syntax der Z8000-Maschinenbefehle
  10271. so, wie es von Zilog in der Dokumentation vorgesehen ist.  Es existieren
  10272. jedoch Assembler, die Erweiterungen bzw. Variationen unterst"utzen.  \asname{}
  10273. implementiert davon folgendes:
  10274.  
  10275. \subsection{Bedingungen}
  10276.  
  10277. Zus"atzlich zu den von Zilog definierten Bedingungen sind folgende alternative
  10278. Namen definiert:
  10279.  
  10280. \begin{center}\begin{tabular}{|l|l|l|}
  10281. \hline
  10282. Alternativ & Zilog & Bedeutung \\
  10283. \hline
  10284. \hline
  10285. ZR         & Z     & Z = 1 \\
  10286. CY         & C     & C = 1 \\
  10287. LLE        & ULE   & (C OR Z) = 1 \\
  10288. LGE        & UGE   & C = 0 \\
  10289. LGT        & UGT   & ((C = 0) AND (Z = 0)) = 1 \\
  10290. LLT        & ULT   & C = 1 \\
  10291. \hline
  10292. \end{tabular}\end{center}
  10293.  
  10294. \subsection{Flags}
  10295.  
  10296. Als Argument f"ur die Befehle \tty{SETFLG}, \tty{COMFLG} und \tty{RESFLG} werden
  10297. auch die folgenden alternativen Namen akzeptiert:
  10298.  
  10299. \begin{center}\begin{tabular}{|l|l|l|}
  10300. \hline
  10301. Alternativ & Zilog & Bedeutung \\
  10302. \hline
  10303. \hline
  10304. ZR         & Z     & Zero-Flag \\
  10305. CY         & C     & Carry-Flag \\
  10306. \hline
  10307. \end{tabular}\end{center}
  10308.  
  10309. \subsection{Indirekte Adressierung}
  10310.  
  10311. Anstelle \verb!@Rn! darf auch \verb!Rn^! geschrieben werden, falls beim \tty{CPU}-
  10312. Statement die Option \tty{AMDSyntax=1} gesetzt wurde.  Wird eine I/O-Adresse
  10313. indirekt adressiert, so reicht es mit dieser Option auch aus, {\em nur} \verb!Rn!
  10314. zu schreiben.
  10315.  
  10316. \subsection{Direkte versus unmittelbare Adressierung}
  10317.  
  10318. Bei der von Zilog vorgegebenen Assembler-Syntax mu"s unmittelbare Adressierung
  10319. durch ein vorangestelltes Doppelkreuz kenntlich gemacht werden.  Wurde dem
  10320. \tty{CPU}-Statement jedoch die Option \tty{AMDSyntax=1} mitgegeben, wird anhand
  10321. des Arguments (Label oder Konstante) entschieden, ob direkte oder unmittelbare
  10322. Adressierung verwendet werden soll.  Unmittelbare Adressierung kann erzwungen
  10323. werden, indem dem Argument ein Circumflex vorangestellt wird, z.B. um die
  10324. Adresse eines Labels in ein Register zu laden.
  10325.  
  10326. %%---------------------------------------------------------------------------
  10327.  
  10328. \section{TLCS-900(L)}
  10329. \label{TLCS900Spec}
  10330.  
  10331. Diese Prozessoren k"onnen in zwei Betriebsarten laufen, einmal im
  10332. \ii{Minimum}-Modus, der weitgehende Z80- und TLCS-90-Quellcodekompatibilit"at
  10333. bietet, und zum anderen im \ii{Maximum}-Modus, in dem der Prozessor
  10334. erst seine wahren Qualit"aten entfaltet.  Die Hauptunterschiede zwischen
  10335. den beiden Betriebsarten sind:
  10336. \begin{itemize}
  10337. \item{Breite der Register WA,BC,DE und HL: 16 oder 32 Bit;}
  10338. \item{Anzahl der Registerbanks: 8 oder 4;}
  10339. \item{Programmadre"sraum: 64 Kbyte oder 16 Mbyte;}
  10340. \item{Breite von R"ucksprungadressen: 16 oder 32 Bit.}
  10341. \end{itemize}
  10342. Damit \asname{} gegen die richtigen Grenzen pr"ufen kann, mu"s man ihm zu Anfang
  10343. mit dem Befehl \tty{MAXMODE} (siehe dort) mitteilen, in welcher Betriebsart
  10344. der Code ausgef"uhrt werden wird; Voreinstellung ist der Minimum-Modus.
  10345. \par
  10346. Je nach Betriebsart m"ussen demzufolge auch die 16- oder 32-Bit-Versionen
  10347. der Bankregister zur Adressierung verwendet werden, d.h. WA, BC, DE und HL
  10348. im Minimum-Modus sowie XWA, XBC, XDE und XHL im Maximum-Modus.  Die Register
  10349. XIX..XIZ und XSP sind \bb{immer} 32 Bit breit und m"ussen zur Adressierung
  10350. auch immer in dieser Form verwendet werden; hier mu"s bestehender Z80-Code
  10351. also auf jeden Fall angepa"st werden (neben der Tatsache, da"s es gar keinen
  10352. I/O-Adre"sraum mehr gibt und alle I/O-Register memory-mapped sind...).
  10353. \par
  10354. Absolute Adressen sowie Displacements k"onnen in unterschiedlichen L"angen
  10355. kodiert werden.  \asname{} wird ohne explizite Angaben immer versuchen, die
  10356. k"urzestm"ogliche Schreibweise zu verwenden; dies schlie"st ein, da"s ein
  10357. Displacement von Null "uberhaupt nicht im Code erscheint und aus einen
  10358. \verb!(XIX+0)! einfach ein \verb!(XIX)! wird.  Ist eine bestimmte L"ange
  10359. erw"unscht, so kann sie durch Anh"angen eines passenden Suffixes (:8, :16,
  10360. :24) an das Displacement bzw. die Adresse erreicht werden.
  10361. \par
  10362. Die von Toshiba gew"ahlte Syntax f"ur Registernamen ist in der Hinsicht
  10363. etwas ungl"ucklich, als da"s zur Anwahl der vorherigen Registerbank ein
  10364. Hochkomma (') benutzt wird.
  10365. Dieses Zeichen wird von den prozessorunabh"angigen Teilen von \asname{} bereits zur
  10366. Kennzeichnung von Zeichenkonstanten benutzt.  Im Befehl
  10367. \begin{verbatim}
  10368.        ld      wa',wa
  10369. \end{verbatim}
  10370. erkennt \asname{} z.B. nicht das Komma zur Parametertrennung.
  10371. Dieses Problem kann man aber umgehen,
  10372. indem man ein umgekehrtes Hochkomma (`) verwendet, z.B.
  10373. \begin{verbatim}
  10374.        ld      wa`,wa
  10375. \end{verbatim}
  10376. Toshiba liefert f"ur die TLCS-900-Reihe selber einen Assembler (TAS900), der
  10377. sich in einigen Punkten von \asname{} unterscheidet:
  10378.  
  10379. \subsubsection{Symbolkonventionen}
  10380.  
  10381. \begin{itemize}
  10382. \item{TAS900 unterscheidet Symbolnamen nur auf den ersten 32 Zeichen.
  10383.      \asname{} dagegen speichert Symbolnamen immer in der vollen L"ange (bis
  10384.      255 Zeichen) und unterscheidet auch auf dieser L"ange.}
  10385. \item{Unter TAS900 k"onnen Integerkonstanten sowohl in C-Notation (mit
  10386.      vorangestellter 0 f"ur oktal bzw. 0x f"ur hexadezimal) als auch in
  10387.      normaler Intel-Notation geschrieben werden.  \asname{} unterst"utzt in der
  10388.      Default-Einstellung \bb{nur} die Intel-Notation.  Mit dem
  10389.      \tty{RELAXED}-Befehl bekommt man (unter anderem) auch die C-Notation.}
  10390. \item{\asname{} macht keinen Unterschied zwischen Gro"s- und Kleinschreibung,
  10391.      TAS900 hingegen unterscheidet Gro"s-und Kleinbuchstaben in
  10392.      Symbolnamen.  Dieses Verhalten erh"alt man bei \asname{} erst, wenn man
  10393.      die \tty{-u}-Kommandozeilenoption benutzt.}
  10394. \end{itemize}
  10395.  
  10396. \subsubsection{Syntax}
  10397.  
  10398. \asname{} ist bei vielen Befehlen in der Syntaxpr"ufung weniger streng als TAS900,
  10399. bei einigen weicht er (sehr) geringf"ugig ab.  Diese Erweiterungen bzw.
  10400. "Anderungen dienen teilweise der leichteren Portierung von bestehendem
  10401. Z80-Code, teilweise einer Schreiberleichterung und teilweise einer besseren
  10402. Orthogonalit"at der Assemblersyntax:
  10403. \begin{itemize}
  10404. \item{Bei den Befehlen \tty{LDA, JP} und \tty{CALL} verlangt TAS, da"s
  10405.      Adre"sausdr"ucke wie \tty{XIX+5} nicht geklammert sein d"urfen, wie
  10406.      es sonst "ublich ist.  \asname{} verlangt im Sinne der Orthogonalit"at f"ur
  10407.      \tty{LDA} dagegen immer eine Klammerung, bei \tty{JP} und \tty{CALL}
  10408.      ist sie dagegen f"ur einfache, absolute Adressen optional.}
  10409. \item{Bei den bedingten Befehlen \tty{JP, CALL, JR} und \tty{SCC} stellt
  10410.      \asname{} es dem Programmierer frei, die Default-Bedingung \tty{T} (= true) als
  10411.      ersten Parameter anzugeben oder nicht.  TAS900 hingegen erlaubt es
  10412.      nur, die Default-Bedingung implizit zu benutzen (also z.B.
  10413.      \tty{jp (xix+5)} anstelle von \tty{jp t,(xix+5)}).}
  10414. \item{\asname{} erlaubt beim \tty{EX}-Befehl auch Operandenkombinationen, die
  10415.      zwar nicht direkt im User's Manual\cite{Tosh900} genannt werden,
  10416.      aber durch Vertauschung auf eine genannte zur"uck gef"uhrt werden
  10417.      k"onnen.  Kombinationen wie \tty{EX f`,f} oder \tty{EX wa,(xhl)}
  10418.      werden damit m"oglich.  TAS900 hingegen l"a"st nur die ,,reine Lehre''
  10419.      zu.}
  10420. \item{\asname{} erlaubt, bei den Befehlen \tty{INC} und \tty{DEC} die Angabe
  10421.      des Inkrements oder Dekrements wegzulassen, wenn dies 1 ist.  Unter
  10422.      TAS900 dagegen mu"s auch eine 1 hingeschrieben werden.}
  10423. \item{"Ahnlich verh"alt es sich bei allen Schiebebefehlen: Ist der zu
  10424.      verschiebende Operand ein Register, so verlangt TAS900, da"s auch
  10425.      eine Schiebeamplitude von 1 ausgeschrieben werden mu"s; ist dagegen
  10426.      eine Speicherstelle der Operand, so ist die Schiebezahl
  10427.      (hardwarebedingt) immer 1 und darf auch nicht hingeschrieben werden.
  10428.      Unter \asname{} dagegen ist die Schiebezahl 1 immer optional und auch f"ur
  10429.      alle Operandentypen zul"assig.}
  10430. \end{itemize}
  10431.  
  10432. \subsubsection{Makroprozessor}
  10433.  
  10434. Der Makroprozessor wird TAS900 als externes Programm vorgeschaltet und
  10435. besteht aus zwei Komponenten: einem C-artigen Pr"aprozessor und einer
  10436. speziellen Makrosprache (MPL), die an h"ohere Programmiersprachen
  10437. erinnert.  Der Makroprozessor von \asname{} dagegen orientiert sich an
  10438. ,,klassischen'' Makroassemblern wie dem M80 oder MASM (beides Programme
  10439. von Microsoft).  Er ist fester Bestandteil des Programms.
  10440.  
  10441. \subsubsection{Ausgabeformat}
  10442.  
  10443. TAS900 erzeugt relokatiblen Code, so da"s sich mehrere, getrennt assemblierte
  10444. Teile zu einem Programm zusammenbinden lassen.  \asname{} hingegen erzeugt direkt
  10445. absoluten Maschinencode, der nicht linkbar ist.  An eine Erweiterung ist
  10446. (vorl"aufig) nicht gedacht.
  10447.  
  10448. \subsubsection{Pseudoanweisungen}
  10449.  
  10450. Bedingt durch den fehlenden Linker fehlen in \asname{} eine ganze Reihe von f"ur
  10451. relokatiblen Code erforderlichen Pseudoanweisungen, die TAS900 implementiert.
  10452. In gleicher Weise wie bei TAS900 sind folgende Anweisungen vorhanden:
  10453. \begin{quote}{\tt
  10454. EQU, DB, DW, ORG, ALIGN, END, TITLE, SAVE, RESTORE,
  10455. }\end{quote}
  10456. wobei die beiden letzteren einen erweiterten Funktionsumfang haben.
  10457. Einige weitere TAS900-Pseudobefehle lassen sich durch "aquivalente \asname{}-Befehle
  10458. ersetzen (siehe Tabelle \ref{TabTAS900}).
  10459. \par
  10460. Von Toshiba existieren zwei Versionen des Prozessorkerns, wobei die
  10461. L-Variante eine ,,Sparversion'' darstellt.  Zwischen TLCS-900 und TLCS-900L
  10462. macht \asname{} folgende Unterschiede:
  10463. \begin{itemize}
  10464. \item{Die Befehle \tty{MAX} und \tty{NORMAL} sind f"ur die L-Version
  10465.      nicht erlaubt, der \tty{MIN}-Befehl ist f"ur die Vollversion
  10466.      gesperrt.}
  10467. \item{Die L-Version kennt den Normal-Stapelzeiger \tty{XNSP/NSP} nicht,
  10468.      daf"ur das Steuerregister \tty{INTNEST}.}
  10469. \end{itemize}
  10470. Die Befehle \tty{SUPMODE} und \tty{MAXMODE} werden nicht beeinflu"st,
  10471. ebenso nicht deren ini\-tiale Einstellung OFF.  Die Tatsache, da"s die
  10472. L-Version im Maximum-Modus startet und keinen Normal-Modus kennt, mu"s
  10473. also vom Programmierer ber"ucksichtigt werden.  \asname{} zeigt sich jedoch
  10474. insofern kulant gegen"uber der L-Variante, als da"s Warnungen wegen
  10475. privilegierter Anweisungen im L-Modus unterdr"uckt werden.
  10476. \begin{table*}[htbp]
  10477. \begin{center}\begin{tabular}{|l|l|l|}
  10478. \hline
  10479. TAS900        &   \asname{}                & Bedeutung/Funktion \\
  10480. \hline
  10481. \hline
  10482. \tty{DL} $<Daten>$  & \tty{DD} $<Daten>$              & Speicher in Langworten belegen \\
  10483. \hline
  10484. \tty{DSB} $<Zahl>$  & \tty{DB} $<Zahl>$ \tty{DUP} (?) & Speicher byteweise reservieren \\
  10485. \hline
  10486. \tty{DSW} $<Zahl>$  & \tty{DW} $<Zahl>$ \tty{DUP} (?) & Speicher wortweise reservieren \\
  10487. \hline
  10488. \tty{DSD} $<Zahl>$  & \tty{DD} $<Zahl>$ \tty{DUP} (?) & Speicher langwortweise reservieren \\
  10489. \hline
  10490. \tty{\$MIN[IMUM]}   & \tty{MAXMODE OFF}         & folgender Code im Minimum-Modus \\
  10491. \hline
  10492. \tty{\$MAX[IMUM]}   & \tty{MAXMODE ON}          & folgender Code im Maximum-Modus \\
  10493. \hline
  10494. \tty{\$SYS[TEM]}    & \tty{SUPMODE ON}          & folgender Code im System-Modus \\
  10495. \hline
  10496. \tty{\$NOR[MAL]}    & \tty{SUPMODE OFF}         & folgender Code im User-Modus \\
  10497. \hline
  10498. \tty{\$NOLIST}      & \tty{LISTING OFF}         & Assemblerlisting ausschalten \\
  10499. \hline
  10500. \tty{\$LIST}        & \tty{LISTING ON}          & Assemblerlisting einschalten \\
  10501. \hline
  10502. \tty{\$EJECT}       & \tty{NEWPAGE}             & neue Seite im Listing beginnen \\
  10503. \hline
  10504. \end{tabular}\end{center}
  10505. \caption{"aquivalente Befehle TAS900$\leftrightarrow$\asname{}\label{TabTAS900}}
  10506. \end{table*}
  10507.  
  10508. %%---------------------------------------------------------------------------
  10509.  
  10510. \section{TLCS-90}
  10511.  
  10512. Vielleicht fragt sich der eine oder andere, ob bei mir die Reihenfolge
  10513. durcheinander gekommen ist, es gab ja von Toshiba zuerst den 90er als
  10514. ,,aufgebohrten Z80'' und danach den 900er als 16-Bit-Version.  Nun, ich
  10515. bin einfach "uber den 900er zum 90er gekommen (Danke, Oliver!).  Die
  10516. beiden Familien sind sich sehr artverwandt, nicht nur was ihre Syntax
  10517. angeht, sondern auch ihre Architektur.  Die Hinweise f"ur den 90er sind
  10518. daher eine Untermenge derer f"ur den 900er: Da Schieben, Inkrementieren
  10519. und Dekrementieren hier nur um eins m"oglich sind, braucht und darf diese
  10520. Eins auch nicht als erstes Argument hingeschrieben werden.  Bei den
  10521. Befehlen \tty{LDA, JP} und \tty{CALL} m"ochte Toshiba wieder die
  10522. Klammern um Speicheroperanden weglassen, bei \asname{} m"ussen sie aber aus
  10523. Gr"unden der Orthogonalit"at gesetzt werden (der tiefere Grund ist
  10524. nat"urlich, da"s ich mir damit eine Sonderabfrage im Parser gespart habe,
  10525. aber das sagt man nicht so laut).
  10526. \par
  10527. Die TLCS-90er besitzen bereits prinzipiell einen Adre"sraum von 1
  10528. Mbyte, dieser Raum erschlie"st sich aber nur bei Datenzugriffen "uber
  10529. die Indexregister.  \asname{} verzichtet daher auf eine Ber"ucksichtigung
  10530. der Bankregister und begrenzt den Adre"sraum f"ur Code auf 64 Kbyte.
  10531. Da der Bereich jenseits aber sowieso nur "uber indirekte Adressierung
  10532. erreichbar ist, sollte dies keine allzu gro"se Einschr"ankung darstellen.
  10533.  
  10534. %%---------------------------------------------------------------------------
  10535.  
  10536. \section{TLCS-870}
  10537.  
  10538. Schon wieder Toshiba...diese Firma ist im Augenblick wirklich sehr
  10539. produktiv!  Speziell dieser Spro"s der Familie (Toshibas Mikrokontroller
  10540. sind sich ja alle in Bin"arkodierung und Programmiermodell recht "ahnlich)
  10541. scheint auf den 8051-Markt abzuzielen: Die Methode, Bitstellen durch einen
  10542. Punkt getrennt an den Adre"sausdruck anzuh"angen, hatte ja beim 8051 ihren
  10543. Ursprung, f"uhrt jetzt aber auch genau zu den Problemen, die ich beim 8051
  10544. geahnt hatte: Der Punkt ist jetzt einerseits legales Zeichen in Symbolnamen,
  10545. andererseits aber auch Teil der Adre"ssyntax, d.h. \asname{} mu"s Adresse und
  10546. Bitstelle trennen und einzeln weiterverarbeiten.  Diesen Interessenkonflikt
  10547. habe ich vorerst so gel"ost, da"s der Ausdruck von \bb{hinten} an nach
  10548. Punkten durchsucht wird und so der letzte Punkt als Trenner gilt, eventuelle
  10549. weitere Punkte werden dem Symbolnamen zugerechnet.  Es gilt weiterhin die
  10550. flehentliche Bitte, im eigenen Interesse auf Punkte in Symbolnamen zu
  10551. verzichten, sie f"uhren nur zu Verwirrungen:
  10552. \begin{verbatim}
  10553.        LD      CF,A.7  ; Akku Bit 7 nach Carry
  10554.        LD      C,A.7   ; Konstante A.7 nach Register C
  10555. \end{verbatim}
  10556.  
  10557. %%---------------------------------------------------------------------------
  10558.  
  10559. \section{TLCS-47}
  10560.  
  10561. Mit dieser 4-Bit-Prozessorfamilie d"urfte wohl das unter Ende dessen
  10562. erreicht sein, was \asname{} unterst"utzen kann.  Neben dem \tty{ASSUME}-Befehl
  10563. f"ur das Datenbankregister (siehe dort) ist eigentlich nur ein Detail
  10564. erw"ahnenswert: im Daten- und I/O-Segment werden keine Bytes, sondern
  10565. Nibbles reserviert (eben 4-Bitter...).  Die Sache funktioniert "ahnlich
  10566. wie das Bitdatensegment beim 8051, wo ein \tty{DB} ja nur einzelne Bit
  10567. reserviert, nur da"s es hier eben Nibbles sind.
  10568. \par
  10569. Toshiba hat f"ur diese Prozessorfamilie einen ,,erweiterten Befehlssatz''
  10570. in Makroform definiert, um das Arbeiten mit diesem doch recht
  10571. beschr"ankten Befehlssatz zu erleichtern.  Im Fall von \asname{} ist er in der
  10572. Datei STDDEF47.INC definiert.  Einige Befehle, deren makrom"a"sige
  10573. Realisierung nicht m"oglich war, sind allerdings ,,eingebaut'' und stehen
  10574. daher auch ohne die Include-Datei zur Verf"ugung:
  10575. \begin{itemize}
  10576. \item{der \tty{B}-Befehl, der die jeweils optimale Version des
  10577.      Sprungbefehls (\tty{BSS, BS oder BSL}) automatisch w"ahlt;}
  10578. \item{\tty{LD} in der Variante HL mit immediate;}
  10579. \item{\tty{ROLC} und \tty{RORC} mit einer Schiebeamplitude $>$1.}
  10580. \end{itemize}
  10581.  
  10582. %%---------------------------------------------------------------------------
  10583.  
  10584. \section{TLCS-9000}
  10585.  
  10586. Hier ist es zum ersten Mal passiert, da"s ich einen Prozessor in \asname{}
  10587. implementiert habe, der zu diesem Zeitpunkt noch gar nicht auf dem
  10588. Markt war.  Toshiba hatte sich nach meinen Informationen leider
  10589. zwischenzeitlich auch dazu entschieden, diesen Prozessor ,,auf Eis''
  10590. zu legen, also auch kein Silizium geben.  Das hatte nat"urlich zur Folge,
  10591. da"s dieser Teil
  10592. \begin{description}
  10593. \item[1.]{ein ,,Paper-Design'' ist, d.h. noch nicht praktisch getestet
  10594.          wurde und}
  10595. \item[2.]{Die Unterlagen, die ich zum 9000er hatte \cite{Tosh9000},
  10596.          noch vorl"aufig waren, also noch nicht bis ins letzte Klarheit
  10597.          lieferten.}
  10598. \end{description}
  10599. und dieses Target foratn in einen Dornr"oschenschlaf fiel...
  10600.  
  10601. ...Schnitt, 20 Jahre sp"ater: auf einmal melden sich Leute bei
  10602. mir, da"s Toshiba wohl doch TLCS-9000-Chips an Kunden verkauft
  10603. hat, und fragen nach den Unterlagen, weil sie Reverse-Engineering
  10604. betreiben.  Vielleicht bekommen wir ja auf diesem Wege noch das
  10605. eine oder andere unklare Detail best"atigt oder gekl"art.  Fehler in
  10606. diesem Teil sind also weiterhin noch m"oglich und werden nat"urlich
  10607. bereinigt.  Zumindest die Handvoll Beispiele in \cite{Tosh9000} werden
  10608. aber richtig "ubersetzt.
  10609.  
  10610. Displacements im Maschinenbefehl selber k"onnen nur eine bestimmte
  10611. maximale L"ange (z.B. 13 oder 9 Bit) haben.  Ist das Displacement
  10612. l"anger, mu"s dem Befehl ein Pr"afix mit den ''oberen Bits''
  10613. vorangestellt werden.  \asname{} wird solche Pr"afixe automatisch nach
  10614. Bedarf einsetzen, man kann jedoch auch mit einem dem Displacement
  10615. vorangestellten \verb!'>'! das Setzen eines Pr"afix erzwingen,
  10616. z.B. so:
  10617.  
  10618. \begin{verbatim}
  10619.  ld:g.b  (0h),0       ; kein Praefix
  10620.  ld:g.b  (400000h),0  ; Praefix automatisch erzeugt
  10621.  ld:g.b  (>0h),0      ; Praefix erzwungen
  10622. \end{verbatim}
  10623.  
  10624. %%---------------------------------------------------------------------------
  10625.  
  10626. \section{TC9331}
  10627.  
  10628. Toshiba hat seinerzeit f"ur diesen Prozessor einen (DOS-basierten)
  10629. Assembler namens ASM31T geliefert.  Dieser Assembler unterst"utzt
  10630. eine Reihe von Syntax-Elementen, die sich auf \asname{} nicht ohne
  10631. "Anderungen abbilden lie"sen, die die Kompatibilit"at
  10632. zu existierenden Quelldateien f"ur andere Targets gef"ahrdert
  10633. h"atten.  An folgenden Stellen werden m"oglicherweise "Anderungen
  10634. erforderlich sein, um f"ur den ASM31T geschriebene Programme mit
  10635. \asname{} "ubersetzen zu k"onnen:
  10636.  
  10637. \begin{itemize}
  10638. \item{ASM31T unterst"utzt C-artige Kommentare (\verb!/* ... */!),
  10639.      die auch "uber mehrere Zeilen gehen d"urfen.  Diese werden
  10640.      von \asname{} nicht unterst"utzt und m"ussen in mit einem
  10641.      Semikolon eingeleitete Kommentare umgesetzt werden.}
  10642. \item{Wie ASM31T unterst"utzt \asname{} f"ur den TC9331 Kommentare in
  10643.      runden Klammern (\verb!( ... )!), aber nur innerhalb
  10644.      eines Befehlsarguments.  Enth"alt ein solcher Kommentar ein
  10645.      Komma, wird dieses Komma als Argument-Trenner behandelt und
  10646.      der Kommentar nicht beim Parsing der Argumente
  10647.      "ubersprungen.}
  10648. \item{ASM31T erlaubt Symbol- und Label-Namen, die einen
  10649.      Bindestrich enthalten.  Das ist bei \asname{} nicht zugelassen,
  10650.      der Bindestrich ist hier der Subtraktionsoperator und in
  10651.      einem Ausdruck wie \verb!end-start! w"are sonst nicht klar,
  10652.      ob ein einzelnes Symbol oder die Differenz von zwei
  10653.      Symbolen gemeint ist.}
  10654. \item{ASM31T verlangt zwingend ein \tty{END}-Statement am Ende
  10655.      des Programms; bei \asname{} ist dies optional.}
  10656. \end{itemize}
  10657.  
  10658. Des weiteren fehlen \asname{} im Moment die F"ahigkeiten, auf
  10659. miteinander kollidierende Nutzungen von Funktionseinheiten in
  10660. einem Befehl hinzuweisen.  Die Dokumentation von Toshiba ist an
  10661. diesem Punkt leider etwas schwer verst"andlich.
  10662.  
  10663. %%---------------------------------------------------------------------------
  10664.  
  10665. \section{29xxx}
  10666.  
  10667. Wie schon beim \tty{ASSUME}-Befehl beschrieben, kann \asname{} mit der Kenntnis
  10668. "uber den Inhalt des RBP-Registers feststellen, ob im User-Modus
  10669. auf gesperrte Register zugegriffen wird.  Diese F"ahigkeit
  10670. beschr"ankt sich nat"urlich auf direkte Zugriffe (also nicht, wenn
  10671. die Register IPA...IPC benutzt werden), und sie hat noch einen
  10672. weiteren Haken: da lokale Register (also solche mit Nummern$>$127)
  10673. relativ zum Stackpointer adressiert werden, die Bits in RBP sich
  10674. aber immer auf absolute Nummern beziehen, wird die Pr"ufung f"ur
  10675. lokale Register NICHT durchgef"uhrt.  Eine Erweiterung auf lokale
  10676. Register w"urde bedingen, da"s \asname{} zu jedem Zeitpunkt den absoluten
  10677. Wert von SP kennt, und das w"urde sp"atestens bei rekursiven
  10678. Unterprogrammen scheitern...
  10679.  
  10680. %%---------------------------------------------------------------------------
  10681.  
  10682. \section{80C16x}
  10683.  
  10684. Wie in der Erkl"arung des \tty{ASSUME}-Befehls schon erl"autert, versucht
  10685. \asname{}, dem Programmierer die Tatsache, da"s der Prozessor mehr physikalischen
  10686. als logischen Speicher hat, soweit als m"oglich zu verbergen.  Beachten
  10687. Sie aber, da"s die DPP-Register \bb{nur} Datenzugriffe betreffen und auch dort
  10688. nur absolute Adressierung, also weder indirekte noch indizierte Zugriffe,
  10689. da \asname{} ja nicht wissen kann, wie die berechnete Adresse zur Laufzeit
  10690. aussehen wird...Bei Codezugriffen arbeitet die Paging-Einheit leider nicht,
  10691. man mu"s also explizit mit langen oder kurzen \tty{CALL}s, \tty{JMP}s oder
  10692. \tty{RET}s arbeiten.  Zumindest bei den ,,universellen'' Befehlen \tty{CALL}
  10693. und \tty{JMP} w"ahlt \asname{} automatisch die k"urzeste Form, aber sp"atestens
  10694. beim \tty{RET} sollte man wissen, woher der Aufruf kam.  Prinzipiell
  10695. verlangen \tty{JMPS} und \tty{CALLS} dabei, da"s man Segment und Adresse
  10696. getrennt angibt, \asname{} ist jedoch so geschrieben, da"s er eine Adresse selber
  10697. zerlegen kann, z.B.
  10698. \begin{verbatim}
  10699.        jmps    12345h
  10700. \end{verbatim}
  10701. anstelle von
  10702. \begin{verbatim}
  10703.        jmps    1,2345h
  10704. \end{verbatim}
  10705. Leider sind nicht alle Effekte der chipinternen Instruktions-Pipeline
  10706. versteckt: Werden CP (Registerbankadresse), SP (Stack) oder eines der
  10707. Paging-Register ver"andert, so steht der neue Wert noch nicht f"ur den
  10708. n"achsten Befehl zur Verf"ugung.  \asname{} versucht, solche Situationen zu
  10709. erkennen und gibt im Falle eines Falles eine Warnung aus.  Aber auch
  10710. diese Mimik greift nur bei direkten Zugriffen.
  10711. \par
  10712. Mit \tty{BIT} definierte Bits werden intern in einem 13-Bit-Wort abgelegt,
  10713. wobei die Bitadresse in Bit 4..11 liegt und die Bitnummer in den unteren
  10714. vier Bits.  Diese Anordnung erlaubt es, das n"achsth"ohere bzw.
  10715. n"achstniedrigere Bit durch Inkrementieren bzw. Dekrementieren anzusprechen.
  10716. Bei expliziten Bitangaben mit Punkt funktioniert das aber nicht "uber
  10717. Wortgrenzen hinaus.  So erzeugt folgender Ausdruck eine
  10718. Wertebereichs"uberschreitung:
  10719. \begin{verbatim}
  10720.        bclr    r5.15+1
  10721. \end{verbatim}
  10722. Hier mu"s ein \tty{BIT} her:
  10723. \begin{verbatim}
  10724. msb     bit     r5.15
  10725.        .
  10726.        .
  10727.        .
  10728.        bclr    msb+1
  10729. \end{verbatim}
  10730. F"ur den 80C167/165/163 ist der SFR-Bereich verdoppelt worden; da"s ein Bit im
  10731. zweiten Teil liegt, wird durch ein gesetztes Bit 12 vermerkt.  Leider
  10732. hatte Siemens bei der Definition des 80C166 nicht vorausgesehen, da"s
  10733. 256 SFRs (davon 128 bitadressierbar) f"ur Nachfolgechips nicht reichen
  10734. w"urden. So w"are es unm"oglich, den zweiten SFR-Bereich von F000H..F1DFH
  10735. mit kurzen Adressen oder Bitbefehlen zu erreichen, h"atten die Entwickler
  10736. nicht einen Umschaltbefehl eingebaut:
  10737. \begin{verbatim}
  10738.        EXTR    #n
  10739. \end{verbatim}
  10740. Dieser Befehl bewirkt, da"s f"ur die n"achsten \tty{n} Befehle (0$<$\tty{n}$<$5)
  10741. anstelle des normalen der erweiterte SFR-Bereich angesprochen werden kann.
  10742. \asname{} erzeugt bei diesm Befehl nicht nur den passenden Code, sondern setzt
  10743. intern ein Flag, da"s f"ur die n"achsten \tty{n} Befehle nur Zugriffe auf den
  10744. erweiterten SFR-Bereich zul"a"st.  Da d"urfen nat"urlich keine Spr"unge
  10745. dabei sein... Bits aus beiden Bereichen lassen sich nat"urlich jederzeit
  10746. definieren, ebenso sind komplette Register aus beiden SFR-Bereichen
  10747. jederzeit mit absoluter Adressierung erreichbar.  Nur die kurze bzw.
  10748. Bitadressierung geht immer nur abwechselnd, Zuwiderhandlungen werden
  10749. mit einer Fehlermeldung geahndet.
  10750. \par
  10751. "Ahnlich sieht es mit den Pr"afixen f"ur absolute bzw. indirekte
  10752. Adressierung aus: Da aber sowohl Argument des Pr"afixes als auch der
  10753. Adre"sausdruck nicht immer zur "Ubersetzungszeit bestimmbar sind, sind
  10754. die Pr"ufungsm"oglichkeiten durch \asname{} sehr eingeschr"ankt, weshalb er es
  10755. auch bei Warnungen bel"a"st...im einzelnen sieht das folgenderma"sen aus:
  10756. \begin{itemize}
  10757. \item{feste Vorgabe einer 64K-Bank mittels \tty{EXTS} oder \tty{EXTSR}:
  10758.      Im Adre"sausdruck werden direkt die unteren 16 Bit der Zieladresse
  10759.      eingesetzt.  Haben sowohl Pr"afix als auch Befehl einen konstanten
  10760.      Operanden, so wird "uberpr"uft, ob Pr"afixargument und Bit 16..23 der
  10761.      Zieladresse identisch sind.}
  10762. \item{feste Vorgabe einer 16K-Seite mittels \tty{EXTP} oder \tty{EXTPR}:
  10763.      Im Adre"sausdruck werden direkt die unteren 14 Bit der Zieladresse
  10764.      eingesetzt.  Bit 14 und 15 bleiben konstant 0, da sie in diesem Modus
  10765.      nicht vom Prozessor ausgewertet werden.  Haben sowohl Pr"afix als
  10766.      auch Befehl einen konstanten Operanden, so wird "uberpr"uft, ob
  10767.      Pr"afixargument und Bit 14..23 der Zieladresse identisch sind.}
  10768. \end{itemize}
  10769. Damit das etwas klarer wird, ein Beispiel (die DPP-Register haben
  10770. die Reset-Vorbelegung) :
  10771. \begin{verbatim}
  10772.       extp     #7,#1           ; Bereich von 112K..128K
  10773.       mov      r0,1cdefh       ; ergibt Adresse 0defh im Code
  10774.       mov      r0,1cdefh       ; -->Warnung
  10775.       exts     #1,#1           ; Bereich von 64K..128K
  10776.       mov      r0,1cdefh       ; ergibt Adresse 0cdefh im Code
  10777.       mov      r0,1cdefh       ; -->Warnung
  10778. \end{verbatim}
  10779.  
  10780. %%---------------------------------------------------------------------------
  10781.  
  10782. \section{PIC16C5x/16C8x}
  10783.  
  10784. "Ahnlich wie die MCS-48-Familie teilen auch die PICs ihren
  10785. Programmspeicher in mehrere B"anke auf, da im Opcode nicht gen"ugend Platz
  10786. f"ur die vollst"andige Adresse war.  \asname{} verwendet f"ur die Befehle \tty{CALL}
  10787. und \tty{GOTO} die gleiche Automatik, d.h. setzt die PA-Bits im
  10788. Statuswort entsprechend Start- und Zieladresse.  Im Gegensatz zu den 48ern
  10789. ist dieses Verfahren hier aber noch deutlich problematischer:
  10790. \begin{enumerate}
  10791. \item{Die Befehle sind nicht mehr nur ein Wort, sondern bis zu drei Worten
  10792.      lang, k"onnen also nicht mehr in jedem Fall mit einem bedingten Sprung
  10793.      "ubergangen werden.}
  10794. \item{Es ist m"oglich, da"s der Programmz"ahler beim normalen
  10795.      Programmfortgang eine Seitengrenze "uberschreitet.  Die vom Assembler
  10796.      angenommene Belegung der PA-Bits stimmt dann nicht mehr mit der
  10797.      Realit"at "uberein.}
  10798. \end{enumerate}
  10799. Bei den Befehlen, die das Register W mit einem anderen Register
  10800. verkn"upfen, mu"s normalerweise als zweiter Parameter angegeben werden, ob
  10801. das Ergebnis in W oder im Register abgelegt werden soll.  Bei diesem
  10802. Assembler ist es erlaubt, den zweiten Parameter wegzulassen.  Welches Ziel
  10803. dann angenommen werden soll, h"angt vom Typ des Befehls ab: bei un"aren
  10804. Operationen wird defaultm"a"sig das Ergebnis zur"uck ins Register gelegt.
  10805. Diese Befehle sind:
  10806. \begin{quote}
  10807. {\tt COMF, DECF, DECFSZ, INCF, INCFSZ, RLF, RRF} und {\tt SWAPF}
  10808. \end{quote}
  10809. Die anderen Befehle betrachten W defaultm"a"sig als Akkumulator, zu dem ein
  10810. Register verkn"upft wird:
  10811. \begin{quote}
  10812. {\tt ADDWF, ANDWF, IORWF, MOVF, SUBWF} und {\tt XORWF}
  10813. \end{quote}
  10814. \par
  10815. Die von Microchip vorgegebene Schreibweise f"ur Literale ist ziemlich
  10816. abstrus und erinnert an die auf IBM 360/370-Systemen "ubliche Schreibweise
  10817. (Gr"u"se aus Neandertal...).  Um nicht noch einen Zweig in den Parser
  10818. einf"ugen zu m"ussen, sind bei \asname{} Konstanten in
  10819. Motorola-Syntax zu schreiben (wahlweise auch Intel oder C im \tty{RELAXED}-Modus).
  10820. \par
  10821. Dem Assembler liegt die Include-Datei STDDEF16.INC bei, in der die Adressen
  10822. der Hardware-Register und Statusbits verewigt sind.  Daneben enth"alt sie
  10823. eine Liste von ,,Befehlen'', die der Microchip-Assembler als Makro
  10824. implementiert.  Bei der Benutzung dieser Befehlsmakros ist gro"se Vorsicht
  10825. angebracht, da sie mehrere Worte lang sind und sich somit nicht "uberspringen
  10826. lassen!!
  10827.  
  10828. %%---------------------------------------------------------------------------
  10829.  
  10830. \section{PIC17C4x}
  10831.  
  10832. F"ur diese Prozessoren gelten im wesentlichen die gleichen Hinweise wie
  10833. f"ur ihre kleinen Br"uder, mit zwei Ausnahmen: Die zugeh"orige Include-Datei
  10834. enth"alt nur Registerdefinitionen, und die Probleme bei Sprungbefehlen
  10835. sind deutlich kleiner.  Aus der Reihe f"allt nur \tty{LCALL}, der einen
  10836. 16-Bit-Sprung erlaubt.  Dieser wird mit folgendem ,,Makro'' "ubersetzt:
  10837. \begin{verbatim}
  10838.        MOVLW   <Adr15..8>
  10839.        MOWF    3
  10840.        LCALL   <Adr0..7>
  10841. \end{verbatim}
  10842.  
  10843. %%---------------------------------------------------------------------------
  10844.  
  10845. \section{SX20/28}
  10846.  
  10847. Durch die beschr"ankte L"ange des Instruktionswortes ist es nicht
  10848. m"oglich, darin eine vollst"andige Programmspeicher-Adresse (11 Bit)
  10849. oder Datenspeicher-Adresse (8 Bit) unterzubringen.  Der Prozessor
  10850. erg"anzt die gek"urzten Adressen um die PA-Bits aus dem
  10851. STATUS-Register bzw. oberen Bits aus dem FSR-Register.  "Uber
  10852. \tty{ASSUME}-Befehle teilt man dem Assembler deren aktuellen Inhalt
  10853. mit.  Falls auf Adressen zugegriffen wird, die mit den vermerkten
  10854. Werten nicht zugreifbar sind, erfolgt eine Warnung.
  10855.  
  10856. %%---------------------------------------------------------------------------
  10857.  
  10858. \section{ST6}
  10859.  
  10860. Diese Prozessoren k"onnen das Code-ROM seitenweise in den Datenbereich
  10861. einblenden.  Weil ich nicht die ganze Mimik des \tty{ASSUME}-Befehles
  10862. hier wiederk"auen m"ochte, verweise ich auf das entsprechende Kapitel
  10863. (\ref{ST6Assume}), in dem steht, wie man mit diesem Befehl einigerma"sen
  10864. unfallfrei Konstanten aus dem ROM lesen kann.
  10865. \par
  10866. Bei n"aherer Betrachtung des Befehlssatzes fallen einige eingebaute
  10867. ,,Makros'' auf.  Die Befehle, die mir aufgefallen sind (es gibt aber
  10868. vielleicht noch mehr...), sind in Tabelle \ref{TabHid62} aufgelistet.
  10869. \par
  10870. \begin{table*}[htbp]
  10871. \begin{center}\begin{tabular}{|l|l|}
  10872. \hline
  10873. Befehl   & in Wirklichkeit \\
  10874. \hline
  10875. \hline
  10876. \tty{CLR A}    & \tty{SUB A,A} \\
  10877. \tty{SLA A}    & \tty{ADD A,A} \\
  10878. \tty{CLR adr}  & \tty{LDI adr,0} \\
  10879. \tty{NOP}      & \tty{JRZ PC+1} \\
  10880. \hline
  10881. \end{tabular}\end{center}
  10882. \caption{versteckte Makros im ST6225-Befehlssatz\label{TabHid62}}
  10883. \end{table*}
  10884. Insbesondere der letztere Fall verbl"ufft doch etwas...
  10885. Leider fehlen aber einige Anweisungen wirklich.  So gibt es z.B. zwar einen
  10886. \tty{AND}-Befehl, aber kein \tty{OR}...von \tty{XOR} gar nicht zu
  10887. reden.  In der Datei  STDDEF62.INC finden sich deshalb neben den Adressen
  10888. der SFRs noch einige Makros zur Abhilfe.
  10889. \par
  10890. Der Original-Assembler AST6 von SGS-Thomson verwendet teilweise andere
  10891. Pseudobefehle als \asname{}.  Au"ser der Tatsache, da"s \asname{} Pseudobefehle nicht
  10892. mit einem vorangestellten Punkt kennzeichnet, sind folgende Befehle
  10893. identisch:
  10894. \begin{verbatim}
  10895.  ASCII, ASCIZ, BLOCK, BYTE, END, ENDM, EQU, ERROR, MACRO,
  10896.  ORG, TITLE, WARNING
  10897. \end{verbatim}
  10898. Tabelle \ref{TabAST6} zeigt die AST6-Befehle, zu denen analoge in \asname{}
  10899. existieren.
  10900. \par
  10901. \begin{table*}[htbp]
  10902. \begin{center}\begin{tabular}{|l|l|l|}
  10903. \hline
  10904. AST6           &   \asname{}                & Bedeutung/Funktion \\
  10905. \hline
  10906. \hline
  10907. \tty{.DISPLAY} &  \tty{MESSAGE}               & Meldung ausgeben \\
  10908. \hline
  10909. \tty{.EJECT}   &  \tty{NEWPAGE}               & neue Seite im Listing \\
  10910. \hline
  10911. \tty{.ELSE}    &  \tty{ELSEIF}                & bed. Assemblierung \\
  10912. \hline
  10913. \tty{.ENDC}    &  \tty{ENDIF}                 & bed. Assemblierung \\
  10914. \hline
  10915. \tty{.IFC}     &  \tty{IF...}                 & bed. Assemblierung \\
  10916. \hline
  10917. \tty{.INPUT}   &  \tty{INCLUDE}               & Include-Datei einbinden \\
  10918. \hline
  10919. \tty{.LIST}    &  \tty{LISTING}, \tty{MACEXP\_DFT} & Listing-Einstellung \\
  10920. \hline
  10921. \tty{.PL}      &  \tty{PAGE}                  & Seitenl"ange Listing \\
  10922. \hline
  10923. \tty{.ROMSIZE} &  \tty{CPU}                   & Zielprozessor einstellen \\
  10924. \hline
  10925. \tty{.VERS}    &  \tty{VERSION} (Symbol)      & Version abfragen \\
  10926. \hline
  10927. \tty{.SET}     &  \tty{EVAL}                  & Variablen neu setzen \\
  10928. \hline
  10929. \end{tabular}\end{center}
  10930. \caption{"aquivalente Befehle AST6$\leftrightarrow$\asname{}\label{TabAST6}}
  10931. \end{table*}
  10932.  
  10933. %%---------------------------------------------------------------------------
  10934.  
  10935. \section{ST7}
  10936.  
  10937. In \cite{ST7Man} ist der '.w'-Postfix f"ur 16-Bit-Adressen nur f"ur
  10938. speicherindirekte Operanden definiert, um zu vermerken, da"s auf einer
  10939. Zeropageadresse eine 16-bittige Adresse liegt; \asname{} unterst"utzt ihn jedoch
  10940. zus"atzlich auch f"ur absolute Adressen oder Displacements in indizierter
  10941. Adressierung, um trotz eines nur 8 Bit langen Wertes (0..255) ein
  10942. 16-bittiges Displacement zu erzeugen.
  10943.  
  10944. %%---------------------------------------------------------------------------
  10945.  
  10946. \section{ST9}
  10947.  
  10948. Die Bitadressierungsm"oglichkeiten des ST9 sind relativ eingeschr"ankt:
  10949. Mit Ausnahme des \tty{BTSET}-Befehls ist es nur m"oglich, auf Bits innerhalb
  10950. des aktuellen Arbeitsregistersatzes zuzugreifen.  Eine Bit-Adresse
  10951. sieht also folgenderma"sen aus:
  10952. \begin{verbatim}
  10953.  rn.[!]b
  10954. \end{verbatim}
  10955. wobei \verb?!? eine optionale Invertierung eines Quelloperanden bedeutet.
  10956. Wird ein Bit symbolisch mittels des \tty{BIT}-Befehles definiert, so wird
  10957. die Registernummer im Symbolwert in Bit 7..4, die Bitnummer in Bit
  10958. 3..1 und eine optionale Invertierung in Bit 0 vermerkt.  \asname{} unterscheidet
  10959. direkte und symbolische Bitangaben am Fehlen eines Punktes,
  10960. der Name eines Bitsymboles darf also keinen Punkt enthalten, obwohl
  10961. sie an sich zul"assig w"aren.  Es ist auch zul"assig, bei der Referenzierung
  10962. von Bitsymbolen diese zu nachtr"aglich zu invertieren:
  10963. \begin{verbatim}
  10964. bit2    bit     r5.3
  10965.        .
  10966.        .
  10967.         bld     r0.0,!bit2
  10968. \end{verbatim}
  10969. Auf diese Weise ist es auch m"oglich, eine inverse Definition nachtr"aglich
  10970. wieder aufzuheben.
  10971. \par
  10972. Bitdefinitionen finden sich in gro"ser Zahl in der Include-Datei
  10973. REGST9.INC, in der die Register- und Bitnamen aller On-Chip-Peripherie
  10974. beschrieben sind.  Beachten Sie jedoch, da"s deren Nutzung
  10975. nur m"oglich ist, wenn die Arbeitsregisterbank vorher auch auf diese
  10976. Register ausgerichtet wurde!
  10977. \par
  10978. Im Gegensatz zu der zum AST9 von SGS-Thomson geh"orenden Definitionsdatei
  10979. sind f"ur \asname{} die Namen der Peripherieregister nur als allgemeine
  10980. Registernamen definiert (\tty{R...}), nicht auch noch als Arbeitsregister
  10981. (\tty{r...}).  Dies ist so, weil \asname{} Geschwindigkeitsgr"unden keine
  10982. Aliasnamen f"ur Register definieren kann.
  10983.  
  10984. %%---------------------------------------------------------------------------
  10985.  
  10986. \section{6804}
  10987.  
  10988. Eigentlich habe ich diesen Prozessor ja nur eingebaut, um mich "uber
  10989. das seltsame Gebaren von SGS-Thomson zu beklagen: Als ich das
  10990. 6804-Datenbuch zum ersten Mal in die Hand bekam, f"uhlte ich mich ob des
  10991. etwas ,,unvollst"andigen'' Befehlssatzes und der eingebauten Makros
  10992. spontan an die ST62-Serie vom gleichen Hersteller erinnert.  Ein
  10993. genauerer Vergleich der Opcodes f"orderte erstaunliches zu Tage:
  10994. Ein 6804-Opcode ergibt sich durch Spiegelung aller Bits im entsprechenden
  10995. ST62-OpCode!  Thomson hat hier also offensichtlich etwas
  10996. Prozessorkern-Recycling betrieben...wogegen ja auch nichts einzuwenden
  10997. w"are, wenn nicht so eine Verschleierungstaktik betrieben werden w"urde:
  10998. andere Peripherie, Motorola- anstelle Zilog-Syntax sowie das h"a"sliche
  10999. Detail, in Opcodes enthaltene Argumente (z.B. Bitfelder mit Displacements)
  11000. \bb{nicht} zu drehen. Letzterer Punkt hat mich auch nach l"angerem "Uberlegen
  11001. dazu bewogen, den 6804 doch in \asname{} aufzunehmen.  Ich wage "ubrigens keine
  11002. Spekulationen, welche Abteilung bei Thomson von welcher abgekupfert hat...
  11003. \par
  11004. Im Gegensatz zur ST62-Version enth"alt die Include-Datei f"ur den
  11005. 6804 keine Makros, die die L"ucken im Befehlssatz etwas ,,auspolstern''
  11006. sollen.  Dies "uberlasse ich dem geneigten Leser als Finger"ubung!
  11007.  
  11008. %%---------------------------------------------------------------------------
  11009.  
  11010. \section{TMS3201x}
  11011.  
  11012. Offensichtlich ist es Ehrgeiz jedes Prozessorherstellers, seine eigene
  11013. Notation f"ur Hexadezimalkonstanten zu erfinden.  Texas Instruments
  11014. war bei diesen Prozessoren besonders originell: ein vorangestelltes
  11015. $>$-Zeichen!  Die "Ubernahme dieses Formates in \asname{} h"atte zu schweren
  11016. Konflikten mit den Vergleichs-und Schiebeoperatoren von \asname{} im Formelparser
  11017. gef"uhrt.  Ich habe mich deshalb f"ur die Intel-Notation entschieden, zu
  11018. der sich TI bei der 340x0-Serie und den 3201x-Nachfolgern ja dann auch
  11019. durchgerungen hat...
  11020. \par
  11021. Leider hat das Instruktionswort dieser Prozessoren nicht gen"ugend Bits,
  11022. um bei direkter Adressierung alle 8 Bits zu enthalten, weshalb der
  11023. Datenadre"sraum logisch in 2 B"anke zu 128 W"ortern gespalten ist.  \asname{}
  11024. verwaltet diesen als ein durchgehendes Segment von 256 W"ortern und
  11025. l"oscht bei direkten Zugriffen automatisch das Bit 7 (Ausnahme: Befehl
  11026. \tty{SST}, der nur in die obere Bank schreiben kann). Der Programmierer
  11027. ist daf"ur erforderlich, da"s das Bank-Bit stets den richtigen Wert hat!
  11028. \par
  11029. Ein weiterer, nur sehr versteckt im Datenbuch stehender Hinweis: Die
  11030. \tty{SUBC}-Anweisung ben"otigt zur Ausf"uhrung intern mehr als einen
  11031. Takt, das Steuerwerk arbeitet jedoch schon an dem n"achsten Befehl weiter.
  11032. Im auf ein \tty{SUBC} folgenden Befehl darf deshalb nicht auf den
  11033. Akkumulator zugegriffen werden.  \asname{} nimmt hier \bb{keine} Pr"ufung vor!
  11034.  
  11035. %%---------------------------------------------------------------------------
  11036.  
  11037. \section{TMS320C2x}
  11038.  
  11039. Da ich nicht selber diesen Codegenerator geschrieben habe (was nichts an
  11040. seiner Qualit"at mindert), kann ich nur kurz hier umrei"sen, wieso es
  11041. Befehle gibt, bei denen ein vorangestelltes Label als untypisiert, d.h.
  11042. keinem Adre"sraum zugeordnet, gespeichert wird:  Der 20er der TMS-Reihe
  11043. kennt sowohl ein 64 Kbyte gro"ses Code- als auch Datensegment.  Je nach
  11044. externer Beschaltung kann man dabei Code- und Datenbereiche "uberlappen,
  11045. um z.B. Konstanten im Codebereich zu abzulegen und auf diese als Daten
  11046. zuzugreifen (Ablage im Code ist notwendig, weil "altere \asname{}-Versionen davon
  11047. ausgehen, da"s ein Datensegment aus RAM besteht, das in einem
  11048. Standalone-System nach dem Einschalten keinen definierten Inhalt hat und
  11049. verweigern in Segmenten au"ser Code deshalb die Ablage von Daten).  Ohne
  11050. dieses Feature w"urde \asname{} nun jeden Zugriff auf die abgelegten Daten mit
  11051. einer Warnung (,,Symbol aus falschem Segment'') quittieren.  Im einzelnen
  11052. erzeugen folgende Pseudobefehle untypisierte Labels:
  11053. \begin{quote}
  11054.  {\tt BSS, STRING, RSTRING, BYTE, WORD , LONG, FLOAT \\
  11055.  DOUBLE, EFLOAT, BFLOAT} und {\tt TFLOAT}
  11056. \end{quote}
  11057. Sollten doch einmal typisierte Labels gew"unscht sein, so kann man sich
  11058. behelfen, indem man das Label in eine getrennte Zeile vor dem Pseudobefehl
  11059. schreibt.  Umgekehrt kann man einen der anderen Pseudobefehle mit einem
  11060. typenlosen Label versehen, indem man vor dem Befehl das Label mit
  11061. \begin{verbatim}
  11062. <Name>  EQU     $
  11063. \end{verbatim}
  11064. definiert.
  11065.  
  11066. %%---------------------------------------------------------------------------
  11067.  
  11068. \section{TMS320C3x/C4x}
  11069.  
  11070. Die gr"o"sten Magenschmerzen bei diesem Prozessor hat mir die Syntax
  11071. paralleler Befehle bereitet, die auf zwei Zeilen verteilt werden,
  11072. wobei beide Befehle an sich auch sequentiell ausgef"uhrt werden k"onnen.
  11073. Deshalb erzeugt \asname{} zuerst den Code f"ur die einzelne erste Operation,
  11074. wenn er dann in der zweiten Zeile erkennt, da"s eine parallele Anweisung
  11075. vorliegt, wird der zuerst erzeugte Code durch den neuen ersetzt.
  11076. Im Listing kann man dies daran erkennen, da"s der Programmz"ahler
  11077. nicht weiterl"auft und in der zweiten Zeile anstelle eines Doppelpunktes
  11078. ein \tty{R} vor dem erzeugten Code steht.
  11079. \par
  11080. Bez"uglich der doppelten senkrechten Striche und ihrer Position in der
  11081. Zeile ist man nicht ganz so flexibel wie beim TI-Assembler: Entweder
  11082. man schreibt sie anstelle eines Labels (d.h. in der ersten Spalte oder
  11083. mit einem angeh"angten Doppelpunkt, das ist aber nicht mehr
  11084. TI-kompatibel...) oder direkt vor den zweiten Befehl ohne Leerzeichen,
  11085. sonst bekommt der Zeilenparser von \asname{} Probleme und h"alt die Striche
  11086. f"ur das Mnemonic.
  11087.  
  11088. %%---------------------------------------------------------------------------
  11089.  
  11090. \section{TMS9900}
  11091.  
  11092. Wie bei den meisten "alteren Prozessorfamilien auch, hatte TI seinerzeit
  11093. ein eigenes Format zur Schreibweise von Hexadezimal- und Bin"arkonstanten
  11094. verwendet, anstelle deren \asname{} die normale, heute auch bei TI
  11095. gebr"auchliche Intel-Notation verwendet.
  11096.  
  11097. Die TI-Syntax f"ur Register erlaubt es, da"s anstelle eines echten Namens
  11098. (entweder \tty{Rx} oder \tty{WRx}) auch eine einfache Integer-Zahl
  11099. zwischen 0 und 15 benutzt werden kann.  Dies hat zwei Folgen:
  11100. \begin{itemize}
  11101. \item{\tty{R0...R15} bzw. \tty{WR0..WR15} sind einfache, vordefinierte
  11102.      Integersymbole mit den Werten 0..15, und die Definition von
  11103.      Registeraliasen funktioniert "uber schlichte \tty{EQUs}.}
  11104. \item{Im Gegensatz zu einigen anderen Prozessoren kann ich nicht das
  11105.      zus"atzliche \asname{}-Feature anbieten, da"s das Kennzeichen f"ur
  11106.      absolute Adressierung (hier ein Klammeraffe) weggelassen werden
  11107.      darf.  Da ein fehlendes Kennzeichen hier aber Registernummern (im
  11108.      Bereich 0 bis 15) bedeuten w"urde, war das hier nicht m"oglich.}
  11109. \end{itemize}
  11110. Weiterhin wechselt TI mit der Registerbezeichnung zwischen \tty{Rx} und
  11111. \tty{WRx}...vorerst ist beides zugelassen.
  11112.  
  11113. %%---------------------------------------------------------------------------
  11114.  
  11115. \section{TMS70Cxx}
  11116.  
  11117. Diese Prozessorreihe geh"ort noch zu den "alteren, von TI entwickelten
  11118. Reihen, und deswegen benutzt TI in ihren eigenen Assemblern noch die
  11119. herstellereigene Syntax f"ur hexadezimale und bin"are Konstanten
  11120. (vorangestelltes $<$ bzw. ?).  Da das in \asname{} aber so nicht machbar ist, wird
  11121. defaultm"a"sig die Intel-Syntax verwendet.  Auf diese ist Texas bei den
  11122. Nachfolgern dieser Familie, n"amlich den 370ern auch umgestiegen.  Beim
  11123. genaueren Betrachten des Maschinenbefehlssatzes stellt man fest, da"s
  11124. ca. 80\% der 7000er-Befehle bin"ar aufw"artskompatibel sind, und auch die
  11125. Assemblersyntax ist fast gleich - aber eben nur fast.  Bei der Erweiterung
  11126. des 7000er-Befehlssatzes hat TI n"amlich auch gleich die Chance genutzt,
  11127. die Syntax etwas zu vereinheitlichen und zu vereinfachen.  Ich habe mich
  11128. bem"uht, einen Teil dieser "Anderungen auch in die 7000er Syntax
  11129. einflie"sen zu lassen:
  11130. \begin{itemize}
  11131. \item{Anstelle eines Prozentzeichens zur Kennzeichnung von
  11132.      unmittelbarer Adressierung darf auch das allgemein bekanntere Doppelkreuz
  11133.      verwendet werden.}
  11134. \item{Wenn bei den Befehlen \tty{AND, BTJO, BTJZ, MOV, OR} und
  11135.      \tty{XOR} eine Port-Adresse (\tty{P...}) als Quelle oder Ziel
  11136.      benutzt wird, ist es nicht notwendig, die Mnemonic-Form mit explizit
  11137.      angeh"angtem \tty{P} zu benutzen - die allgemeine Form reicht genauso
  11138.      aus.}
  11139. \item{Der vorangestelle Klammeraffe f"ur absolute oder B-indizierte
  11140.      Adressierung darf weggelassen werden.}
  11141. \item{Anstelle des \tty{CMPA}-Befehls darf auch einfach
  11142.      \tty{CMP} mit \tty{A} als Ziel benutzt werden.}
  11143. \item{Anstelle \tty{LDA} oder \tty{STA} darf auch einfach der \tty{MOV}-Befehl
  11144.      mit \tty{A} als Ziel bzw. Quelle benutzt werden.}
  11145. \item{Anstelle des \tty{MOVD}-Befehls darf auch \tty{MOVW} benutzt werden.}
  11146. \item{Anstelle von \tty{RETS} oder \tty{RETI} darf auch verk"urzt
  11147.      \tty{RTS} bzw. \tty{RTI} geschrieben werden.}
  11148. \item{\tty{TSTA} bzw. \tty{TSTB} d"urfen auch als \tty{TST A} bzw. \tt{TST
  11149.      B} geschrieben werden.}
  11150. \item{\tty{XCHB B} ist als Alias f"ur \tty{TSTB} zugelassen.}
  11151. \end{itemize}
  11152. Wichtig - diese Varianten sind nur beim TMS70Cxx zugelassen - entsprechende
  11153. 7000er-Varianten sind bei den 370ern {\em nicht} erlaubt!
  11154.  
  11155. %%---------------------------------------------------------------------------
  11156.  
  11157. \section{TMS370xxx}
  11158.  
  11159. Obwohl diese Prozessoren keine speziellen Befehle zur Bitmanipulation
  11160. besitzen, wird mit Hilfe des Assemblers und des \tty{DBIT}-Befehles
  11161. (siehe dort) die Illusion erzeugt, als ob man einzelne Bits manipulieren
  11162. w"urde.  Dazu wird beim \tty{DBIT}-Befehl eine Adresse mit einer
  11163. Bitposition zusammengefa"st und in einem Symbol abgelegt, das man dann
  11164. als Argument f"ur die Pseudobefehle \tty{SBIT0, SBIT1, CMPBIT, JBIT0}
  11165. und \tty{JBIT1} verwenden kann.  Diese werden in die Befehle
  11166. \tty{OR, AND, XOR, BTJZ} und \tty{BTJO} mit einer passenden Bitmaske
  11167. "ubersetzt.
  11168. \par
  11169. An diesen Bit-Symbolen ist "uberhaupt nichts geheimnisvolles, es handelt
  11170. sich um schlichte Integerwerte, in deren unterer H"alfte die
  11171. Speicheradresse und in deren oberer H"alfte die Bitstelle gespeichert
  11172. wird.  Man k"onnte sich seine Symbole also auch ohne weiteres selber
  11173. basteln:
  11174. \begin{verbatim}
  11175. defbit  macro   name,bit,adr
  11176. name    equ     adr+(bit<<16)
  11177.        endm
  11178. \end{verbatim}
  11179. aber mit dieser Schreibweise erreicht man nicht den \tty{EQU}-artigen Stil,
  11180. den Texas vorgegeben hat (d.h. das zu definierende Symbol steht anstelle
  11181. eines Labels).  ACHTUNG!  Obwohl \tty{DBIT} eine beliebige Adresse
  11182. zul"a"st, k"onnen f"ur die Pseudobefehle nur die Adressen 0..255 und
  11183. 1000h..10ffh verwendet werden, eine absolute Adressierungsart kennt
  11184. der Prozessor an dieser Stelle nicht...
  11185.  
  11186. %%---------------------------------------------------------------------------
  11187.  
  11188. \section{MSP430(X)}
  11189. \label{MSPSpec}
  11190.  
  11191. Der MSP430 wurde als RISC-Prozessor mit minimalem Stromverbrauch
  11192. konzipiert.  Aus diesem Grund ist der Satz von Befehlen, die der
  11193. Prozessor in Hardware versteht, auf das absolut notwendige reduziert
  11194. worden (da RISC-Prozessoren keinen Mikrocode besitzen, mu"s jeder
  11195. Befehl mit zus"atzlichem Silizium implementiert werden und erh"oht so
  11196. den Stromverbrauch).  Eine Reihe von Befehlen, die bei anderen
  11197. Prozessoren in Hardware gegossen wurden, werden beim MSP durch eine
  11198. Emulation mit anderen Befehlen realisiert.  Fr"uhere Versionen
  11199. von \asname{} implementierten diese Befehle "uber Makros in der Datei
  11200. \tty{REGMSP.INC}.  Wer diese Datei nicht einband, erhielt bei "uber
  11201. der H"alfte der insgesamt von TI definierten Befehle
  11202. Fehlermeldungen.  Dies ist aktuell nicht mehr so, zusammen mit
  11203. der Erweiterung auf den CPU430X-Befehlssatz werden die
  11204. Instruktionen vom Assembler direkt implementiert.
  11205. \tty{REGMSP.INC} enth"alt nur noch die Adressen von I/O-Registern.
  11206. Wer aus irgendwelchen Gr"unden die alten Makros braucht, findet
  11207. sie jetzt in der Datei \tty{EMULMSP.INC}.
  11208.  
  11209. Die emulierten Instruktionen decken auch einige Sonderf"alle ab,
  11210. die der TI-Assembler nicht beherrscht.  So wird zum Beispiel
  11211. \begin{verbatim}
  11212.    rlc  @r6+
  11213. \end{verbatim}
  11214. automatisch in
  11215. \begin{verbatim}
  11216.    addc @r6+,-2(r6)
  11217. \end{verbatim}
  11218. umgesetzt.
  11219.  
  11220. %%---------------------------------------------------------------------------
  11221.  
  11222. \section{TMS1000}
  11223.  
  11224. Der erste Mikrocontroller der Welt nun endlich auch in \asname{} - lange hat es
  11225. gedauert, nun ist die L"ucke geschlossen.  Dieses Target hat aber einige
  11226. T"ucken, die in diesem Abschnitt kurz angesprochen werden sollen.
  11227.  
  11228. Zum einen ist der Befehlssatz dieser Controller teilweise "uber die ROM-Maske
  11229. ver"anderbar, d.h. man kann die Funktion einiger Opcodes in Grenzen frei
  11230. definieren.  \asname{} kennt nur die Befehle und deren Kodierungen, die in
  11231. \cite{TMS1000PGMRef} als Default-Kodierungen beschrieben sind.  Wer f"ur eine
  11232. spezielle Anwendung andere Befehle bzw. gleiche Befehle mit anderem Opcode
  11233. hat, kann diese "uber Makros mit passende \tty{DB}-Befehlen "andern.
  11234.  
  11235. Des weiteren ist zu beachten, da"s Spr"unge und Unterprogrammaufrufe nur die
  11236. unteren 6 Bit der Zieladresse im Befehl selber beinhalten.  Die oberen 4 bzw.
  11237. 5 Bits kommen aus Page- bzw. Chapter-Registern, die vorher passend zu setzen
  11238. sind.  \asname{} selber kann hier nicht "uberpr"ufen, ob die Register vom Programmierer
  11239. korrekt gesetzt werden!.  Zumindest f"ur den Fall, da"s man im gleichen Chapter
  11240. bleibt, gibt es die Assembler-Pseudobefehle \tty{CALLL} bzw.
  11241. \tty{BL}, die einen \tty{LDP}- und einen \tty{CALL/BR}-Befehl zusammenfassen
  11242. (was angesichts des kanppen Programmspeichers eine bequeme, aber nicht immer
  11243. effiziente Variante ist).
  11244.  
  11245. %%---------------------------------------------------------------------------
  11246.  
  11247. \section{COP8}
  11248. \label{COP8Spec}
  11249.  
  11250. Leider Gottes hat sich auch National dazu entschieden, als
  11251. Schreibweise f"ur nichtdezimale Integer-Konstanten die von
  11252. IBM-Gro"srechnern bekannte (und von mir nicht geliebte) Variante
  11253. \verb!X'...! zu benutzen.  Das geht nat"urlich (wie immer) nicht.
  11254. Zum Gl"uck scheint der ASMCOP aber auch die C-Variante zuzulassen,
  11255. und diese wurde deshalb der Default f"ur die COPs...
  11256.  
  11257. %%---------------------------------------------------------------------------
  11258.  
  11259. \section{SC/MP}
  11260.  
  11261. Benutzt man beim SC/MP indirekte Adressierung mit Displacement, und
  11262. ist das benutzte Basis- bzw. Pointer-Register nicht P0 bzw. PC, dann
  11263. hat ein Displacement von -128 (80 hex) eine Sonderbedeutung: Anstelle
  11264. eben dieses Werts wird der Inhalt des E-Registers als Displacement
  11265. verwendet. Im 'klassischen' NS-Assembler mu"s der Programmierer um
  11266. diesen Umstand wissen bzw. ihn explizit benutzen, z.B. so:
  11267. \begin{verbatim}
  11268. ereg   equ -128
  11269.       ld  ereg(p1)
  11270. \end{verbatim}
  11271. Dies birgt aber das Risiko, da"s sich der Wert -128 auch einmal
  11272. 'versehentlich' als Teil einer Berechnung ergeben kann, und man
  11273. sucht erst einmal, warum das Programm nicht tut, was erwartet
  11274. wurde.  Ich habe mich deshalb entschlossen, diesen Sonderwert
  11275. etwas expliziter zu machen:
  11276.  
  11277. Wird ein Displacement von -128 verwendet, so erfolgt eine Warnung.
  11278. Diese Warnung kann man ignorieren; will man sie los werden, so
  11279. verwende man das eingebaute Literal \verb!E!, das eben dieses Register
  11280. referenziert:
  11281. \begin{verbatim}
  11282.       ld e(p1)
  11283. \end{verbatim}
  11284. Da das SC/MP-Target Registersymbole unterst"utzt, ist es auch m"oglich,
  11285. das 'eigene Symbol' passend zu definieren:
  11286. \begin{verbatim}
  11287. ereg   reg e
  11288.       ld  ereg(p1)
  11289. \end{verbatim}
  11290. Dies sollte die Anzahl notwendiger Anpassungen in existierendem
  11291. Code auf ein Minimum reduzieren.
  11292.  
  11293. %%---------------------------------------------------------------------------
  11294.  
  11295. \section{SC144xxx}
  11296. \label{SC144xxspec}
  11297.  
  11298. Original gab es f"ur diese Reihe von DECT-Controllern mit relativ
  11299. einfachem Befehlssatz nur einen sehr schlichten Assembler von National
  11300. selber.  Ein Assembler von IAR Systems ist angek"undigt, aber noch nicht
  11301. erh"altlich.  Da die Entwicklungstools von IAR allerdings auch nach
  11302. M"oglichkeit CPU-unabh"angig angelegt sind, kann man anhand erh"altlicher
  11303. Zielplattformen in ungef"ahr absch"atzen, wie dessen Pseudobefehle
  11304. aussehen werden, und damit im Blick sind die (wenigen) SC144xx-spezifisch
  11305. realisierten Befehle {\tt DC, DC8, DW16, DS, DS8, DS16, DW} angelegt. Bei
  11306. Befehlen, die bereits im \asname{}-Kern angelegt sind, wollte ich nat"urlich
  11307. nicht das Rad neu erfinden, deshalb hier eine Tabelle mit "Aquivalenzen:
  11308.  
  11309. Die Befehle \tty{ALIGN, END, ENDM, EXITM, MACRO, ORG, RADIX, SET} und
  11310. \tty{REPT} exisieren sowohl bei IAR als auch \asname{} und haben gleiche
  11311. Bedeutung.  Bei folgenden Befehlen mu"s man umstellen:
  11312.  
  11313. \begin{table*}[htb]
  11314. \begin{center}\begin{tabular}{|l|l|l|}
  11315. \hline
  11316. IAR & \asname{} & Funktion\\
  11317. \hline
  11318. \hline
  11319. \tty{\#include} & \tty{include} & Include-Datei einbinden \\
  11320. \tty{\#define} & \tty{SET, EQU} & Symbole definieren \\
  11321. \tty{\#elif, ELIF, ELSEIF} & \tty{ELSEIF} & Weiterer Zweig einer IF-Kette \\
  11322. \tty{\#else, ELSE} & \tty{ELSE} & Letzter Zweig einer IF-Kette \\
  11323. \tty{\#endif, ENDIF} & \tty{ENDIF} & Beendet eine IF-Kette \\
  11324. \tty{\#error} & \tty{ERROR, FATAL} & Fehlermeldung erzeugen \\
  11325. \tty{\#if, IF} & \tty{IF} & Beginn einer IF-Kette\\
  11326. \tty{\#ifdef} & \tty{IFDEF} & Symbol definiert ? \\
  11327. \tty{\#ifndef} & \tty{IFNDEF} & Symbol nicht definiert ? \\
  11328. \tty{\#message} & \tty{MESSAGE} & Nachricht ausgeben \\
  11329. \tty{=, DEFINE, EQU} & \tty{=, EQU} & Feste Wertzuweisung \\
  11330. \tty{EVEN} & \tty{ALIGN 2} & Programmz"ahler gerade machen \\
  11331. \tty{COL, PAGSIZ} & \tty{PAGE} & Seitengr"o"se f"ur Listing setzen \\
  11332. \tty{ENDR} & \tty{ENDM} & Ende einer REPT-Struktur \\
  11333. \tty{LSTCND, LSTOUT} & \tty{LISTING} & Umfang des Listings steuern \\
  11334. \tty{LSTEXP, LSTREP} & \tty{MACEXP} & Expandierte Makros anzeigen? \\
  11335. \tty{LSTXRF} & \verb!<Kommandozeile>! & Querverweisliste erzeugen \\
  11336. \tty{PAGE} & \tty{NEWPAGE} & Neue Seite im Listing \\
  11337. \tty{REPTC} & \tty{IRPC} & Repetition mit Zeichenersetzung \\
  11338. \hline
  11339. \end{tabular}\end{center}
  11340. \end{table*}
  11341.  
  11342. Keine direkte Entsprechung gibt es f"ur die Befehle {\tt CASEON, CASEOFF,
  11343. LOCAL, LSTPAG, \#undef} und {\tt REPTI}.
  11344.  
  11345. Ein direktes "Aquivalent der Pr"aprozessorbefehle ist nat"urlich nicht
  11346. m"oglich, solange \asname{} keinen C-artigen Pr"aprozessor besitzt.  C-artige
  11347. Kommentare sind im Moment leider auch nicht m"oglich.  Achtung: Wer
  11348. IAR-Codes f"ur \asname{} umsetzt, mu"s die Pr"aprozessorstatements nicht nur
  11349. umwandeln, sondern auch aus Spalte 1 herausbewegen, da bei \asname{} in Spalte 1
  11350. nur Labels stehen d"urfen!
  11351.  
  11352. %%---------------------------------------------------------------------------
  11353.  
  11354. \section{NS32xxx}
  11355.  
  11356. Wie es sich f"ur CISC-Prozessoren geh"ort, verf"ugt diese Serie "uber ausgefeilte
  11357. und komplexe Adressierungsarten.  National definiert in ihren Manuals f"ur
  11358. jede davon die Assembler-Syntax, und \asname{} setzt auch genau diese um.  Wie bei
  11359. fast jeder Architektur, f"ur die Werkzeuge von Drittherstellern erstellt wurden,
  11360. gibt es jedoch auch Abweichungen und Erweiterungen, und ein paar davon habe
  11361. ich auch ,,mitgenommen'':
  11362.  
  11363. Die von National vorgesehene Methode, PC-relativ zu adressieren, ist folgende:
  11364. \begin{verbatim}
  11365. movb r0,*+disp
  11366. \end{verbatim}
  11367. Das dr"uckt nat"urlich sehr klar aus, was in diesem Fall passiert, will man aber
  11368. einfach eine bestimmte Speicherstelle PC-relativ adressieren, dann mu"s man die
  11369. Distanz selber berechnen:
  11370. \begin{verbatim}
  11371. movb r0,*+(addr-*)
  11372. \end{verbatim}
  11373. Die erste Vereinfachung ist, da"s es unter bestimmten Umst"anden auch ausreicht,
  11374. einfach nur
  11375. \begin{verbatim}
  11376. movb r0,addr
  11377. \end{verbatim}
  11378. zu schreiben - absolute Adressierung wird ja durch ein vorangestelltes \@-Zeichen
  11379. kenntlich gemacht.  Diese vereinfachte Schreibweise ist unter folgenden Bedingungen
  11380. erlaubt:
  11381. \begin{itemize}
  11382. \item{Immediate-Adressierung ist nicht erlaubt, z.B. weil es sich um einen
  11383.      Zieloperanden handelt, so da"s keine Verwechslung damit m"oglich ist.}
  11384. \item{Es wird mit einer Index-Erweiterung gearbeitet (in eckigen Klammern angeh"angt),
  11385.      die nicht mit Immediate-Adressierung kombinierbar ist.}
  11386. \end{itemize}
  11387. Alternativ unterst"utzt \asname{} f"ur PC-relative Addressierung immer die Schreibweise
  11388. \begin{verbatim}
  11389. movb r0,addr(pc)
  11390. \end{verbatim}
  11391. Hier wird - analog zum 68000 - die Distanz ebenfalls automatisch berechnet.
  11392.  
  11393. F"ur den External-Mode, der in der National-Syntax folgenderma"sen geschrieben
  11394. wird:
  11395. \begin{verbatim}
  11396. movb r0,ext(disp1)+disp2
  11397. \end{verbatim}
  11398. wird auch die Variante
  11399. \begin{verbatim}
  11400. movb r0,disp2(disp1(ext))
  11401. \end{verbatim}
  11402. unterst"utzt, die wohl im UNIX-Umfeld g"angig war.
  11403.  
  11404. %%---------------------------------------------------------------------------
  11405.  
  11406. \section{uPD78(C)1x}
  11407. \label{78C1xSpec}
  11408.  
  11409. F"ur relative, unbedingte Spr"unge gibt es den \tty{JR}-Befehl (Sprungdistanz
  11410. -32...+31, 1 Byte) sowie den \tty{JRE}-Befehl (Sprungdistanz -256...+255, 2
  11411. Bytes).  \asname{} kennt weiterhin den Pseudobefehl \tty{J}, der automatisch den
  11412. k"urzestm"oglichen Befehl benutzt.
  11413.  
  11414. Architektur und Befehlssatz dieser Prozessoren sind grob an den
  11415. Intel 8080/8085 angelehnt - das gilt auch f"ur die Mnemonics.  Die
  11416. Adressierungsart (direkt, indirekt, immediate) ist mit in das
  11417. Mnemonic verpackt, und 16-Bit-Register (BC, DE, HL) werden wie
  11418. beim 8080 mit einem Buchstaben abgek"urzt.  Da NEC in der
  11419. Erkl"arung der einzelnen Adressierungsarten aber immer mal
  11420. wieder die ausgeschriebenen Registernamen benutzt, und auch mal
  11421. und mal nicht Klammern benutzt, um indirekte Adressierung anzudeuten,
  11422. habe ich mich entschlossen, neben den 'offiziellen'
  11423. Notationen aus dem NEC-Manual auch einige alternative Notationen
  11424. zuzulassen.  Einige nicht-NEC-Tools wie z.B. Disassembler
  11425. scheinen solche Notationen ebenfalls zu benutzen:
  11426.  
  11427. \begin{itemize}
  11428. \item{Anstelle \tty{B} darf auch \tty{BC}, \tty{(B)} oder
  11429.      \tty{(BC)} geschrieben werden.}
  11430. \item{Anstelle \tty{D} darf auch \tty{DE}, \tty{(D)} oder
  11431.      \tty{(DE)} geschrieben werden.}
  11432. \item{Anstelle \tty{H} darf auch \tty{HL}, \tty{(H)} oder
  11433.      \tty{(HL)} geschrieben werden.}
  11434. \item{Anstelle \tty{D+} darf auch \tty{DE+}, \tty{(D+)},
  11435.      \tty{(DE+)} oder \tty{(DE)+} geschrieben werden.}
  11436. \item{Anstelle \tty{H+} darf auch \tty{HL+}, \tty{(H+)},
  11437.      \tty{(HL+)} oder \tty{(HL)+} geschrieben werden.}
  11438. \item{Anstelle \tty{D-} darf auch \tty{DE-}, \tty{(D-)},
  11439.      \tty{(DE-)} oder \tty{(DE)-} geschrieben werden.}
  11440. \item{Anstelle \tty{H-} darf auch \tty{HL-}, \tty{(H-)},
  11441.      \tty{(HL-)} oder \tty{(HL)-} geschrieben werden.}
  11442. \item{Anstelle \tty{D++} darf auch \tty{DE++}, \tty{(D++)},
  11443.      \tty{(DE++)} oder \tty{(DE)++} geschrieben werden.}
  11444. \item{Anstelle \tty{H++} darf auch \tty{HL++}, \tty{(H++)},
  11445.      \tty{(HL++)} oder \tty{(HL)++} geschrieben werden.}
  11446. \item{Anstelle \tty{D--} darf auch \tty{DE--}, \tty{(D--)},
  11447.      \tty{(DE--)} oder \tty{(DE)--} geschrieben werden.}
  11448. \item{Anstelle \tty{H--} darf auch \tty{HL--}, \tty{(H--)},
  11449.      \tty{(HL--)} oder \tty{(HL)--} geschrieben werden.}
  11450. \item{Anstelle \tty{H+A} darf auch \tty{HL+A}, \tty{A+H},
  11451.      \tty{A+HL}, \tty{(H+A)}, \tty{(HL+A)}, \tty{(A+H)}
  11452.      oder \tty{(A+HL)} geschrieben werden.}
  11453. \item{Anstelle \tty{H+B} darf auch \tty{HL+B}, \tty{B+H},
  11454.      \tty{B+HL}, \tty{(H+B)}, \tty{(HL+B)}, \tty{(B+H)}
  11455.      oder \tty{(B+HL)} geschrieben werden.}
  11456. \item{Anstelle \tty{H+EA} darf auch \tty{HL+EA}, \tty{EA+H},
  11457.      \tty{EA+HL}, \tty{(H+EA)}, \tty{(HL+EA)}, \tty{(EA+H)}
  11458.      oder \tty{(EA+HL)} geschrieben werden.}
  11459. \end{itemize}
  11460.  
  11461. Da Architektur und Befehlssatz so ,,8080-artig''
  11462. sind, lag es auch nahe, den Schalter {\tt Z80SYNTAX} zu
  11463. unterst"utzen, so da"s sich viele Befehle in einer eing"angigeren
  11464. und vertrauteren Art und Weise schreiben lassen.  Da die
  11465. Architektur und der Original-Befehlssatz der uCOM87-Familie
  11466. sich jedoch in einigen Punkten von 8080 unterscheiden, ist hier
  11467. keine eins-zu-eins Abbildung m"oglich: Nicht alle Originalbefehle
  11468. haben ein ,,Z80-"Aquivalent'', und einge vom 8080/Z80 bekannten
  11469. Befehle haben kein Pendant beim uCOM87.  Deshalb ergibt ein
  11470. {\tt Z80SYNTAX EXCLUSIVE} hier auch keinen Sinn.
  11471.  
  11472. Die folgende Tabelle listet alle im {\tt Z80SYNTAX}-Modus
  11473. definierten Befehle und ihre "Aquivalente in der Original-Syntax:
  11474.  
  11475. \begin{longtable}{|l|l|l|l|}
  11476. \hline
  11477. {\tt Z80SYNTAX} & Original & Operation & CPUs \\
  11478. \hline
  11479. \hline
  11480. \endhead
  11481. \input{../doc_COM/78z80inst.tex}
  11482. \\ \hline
  11483. \multicolumn{4}{|l|}{CPU-Gruppe 1: 78C05, 78C06} \\
  11484. \multicolumn{4}{|l|}{CPU-Gruppe 2: 7800, 7801, 7802} \\
  11485. \multicolumn{4}{|l|}{CPU-Gruppe 3: 7807, 7808, 7809, 7810} \\
  11486. \multicolumn{4}{|l|}{CPU-Gruppe 4: 7810, 78C1x} \\
  11487. \hline
  11488. \caption{Befehlsvarianten im {\tt Z80SYNTAX}-Modus}
  11489. \end{longtable}
  11490.  
  11491. %%---------------------------------------------------------------------------
  11492.  
  11493. \section{75K0}
  11494. \label{75K0Spec}
  11495.  
  11496. Wie bei einigen anderen Prozessoren auch, kennt die Assemblersprache
  11497. der 75er von NEC Pseudo-Bitoperanden, d.h. man kann einem Symbol
  11498. eine Kombination aus Adresse und Bitnummer zuweisen, die dann bei
  11499. bitorientierten Befehlen anstelle direkter Ausdr"ucke verwendet werden
  11500. kann.  Die drei folgenden Befehle erzeugen daher z.B. identischen
  11501. Code:
  11502. \begin{verbatim}
  11503. ADM     sfr     0fd8h
  11504. SOC     bit     ADM.3
  11505.  
  11506.        skt     0fd8h.3
  11507.        skt     ADM.3
  11508.        skt     SOC
  11509. \end{verbatim}
  11510. \asname{} unterscheidet direkte und symbolische Bitzugriffe an einem
  11511. bei Symbolen fehlenden Punkt; Punkte in Symbolnamen darf man daher
  11512. nicht verwenden, da es sonst zu Mi"sverst"andnissen bei der Aufl"osung
  11513. kommt.
  11514. \par
  11515. Die Ablage von Bitsymbolen orientiert sich dabei weitgehend an der
  11516. bin"aren Kodierung, die die Prozessorhardware selber verwendet:  Es
  11517. werden 16 Bit belegt, und es existieren ein ,,kurzes'' und ein ,,langes''
  11518. Format.  Das kurze Format kann folgende Varianten aufnehmen:
  11519. \begin{itemize}
  11520. \item{direkte Zugriffe auf die Bereiche 0FBxH und 0FFxH}
  11521. \item{indirekte Zugriffe der Form Adr.@L (0FC0H $\leq$ \tty{Adr} $\leq$ 0FFFH)}
  11522. \item{indirekte Zugriffe der Form @H+d4.bit}
  11523. \end{itemize}
  11524. Das obere Byte ist auf 0 gesetzt, das untere Byte enth"alt den gem"a"s
  11525. \cite{NEC75} kodierten Bitausdruck.  Das lange Format kennt im Gegensatz
  11526. dazu nur direkte Adressierung, kann daf"ur aber (korrekte Einstellungen
  11527. von \tty{MBS} und \tty{MBE} vorausgesetzt) den ganzen Adre"sraum abdecken.
  11528. Bei langen Ausdr"ucken stehen im unteren Byte Bit 7..0 der Adresse, in
  11529. Bit 8 und 9 die Bitstelle sowie in Bit 10 und 11 konstant 01.  Letztere
  11530. erm"oglichen es, langes und kurzes Format einfach durch einen Vergleich
  11531. des oberen Bytes gegen Null zu unterscheiden.  Die Bits 12..15 enthalten
  11532. Bit 8..11 der Adresse; sie werden zwar nicht zur Generierung des Kodes
  11533. ben"otigt, m"ussen jedoch gespeichert werden, da eine Pr"ufung auf ein
  11534. korrektes Banking erst bei der Verwendung des Symboles erfolgen kann.
  11535.  
  11536. %%---------------------------------------------------------------------------
  11537.  
  11538. \section{78K0}
  11539. \label{78K0Spec}
  11540.  
  11541. NEC benutzt in seinen Datenb"uchern zur Kennzeichnung der Zugriffsweise
  11542. auf absolute Adressen verschiedene Schreibweisen:
  11543. \begin{itemize}
  11544. \item{absolut kurz: kein Pr"afix}
  11545. \item{absolut lang: vorangestelltes \verb"!"}
  11546. \item{PC-relativ: vorangestelltes \verb"$"}
  11547. \end{itemize}
  11548. Bei \asname{} sind diese Pr"afixe nur notwendig, falls man eine bestimmte
  11549. Adressierung erzwingen will und der Befehl verschiedene Varianten
  11550. zul"a"st.  Setzt man keinen Pr"afix, so w"ahlt \asname{} automatisch die
  11551. k"urzeste Variante.  Es d"urfte daher in der Praxis sehr selten
  11552. notwendig sein, einen Pr"afix zu verwenden.
  11553.  
  11554. %%---------------------------------------------------------------------------
  11555.  
  11556. \section{78K2/78K3/78K4}
  11557. \label{78K234Spec}
  11558.  
  11559. Analog wie beim 78K0 benutzt NEC auch hier wieder Dollar- und
  11560. Ausrufezeichen f"ur verschiedene L"angen von Adre"sausdr"ucken.
  11561. Zwischen langen und kurzen Adressen (sowohl im RAM- als auch
  11562. SFR-Bereich) wird wieder automatisch entschieden, nur relative
  11563. Adressierung mu"s man manuell anw"ahlen, wenn ein Befehl beides
  11564. unterst"utzt (z.B. {\tt BR}).
  11565.  
  11566. Noch eine Anmerkung (die im "ubrigens auch f"ur den 78K0 gilt): Wer
  11567. mittels {\tt RELAXED} mit Motorola-Syntax arbeitet, mu"s
  11568. Hexadezimalkonstanten klammern, weil das f"uhrende Dollarzeichen u.U. als
  11569. relative Adressierung mi"sverstanden wird...
  11570.  
  11571. %%---------------------------------------------------------------------------
  11572.  
  11573. \section{uPD772x}
  11574.  
  11575. Sowohl 7720 als auch 7725 werden von dem gleichen Codegenerator behandelt
  11576. und sind sich in ihren Befehlssatz extrem "ahnlich.  Trotzdem sollte man
  11577. sich nicht zu der Annahme verleiten lassen, sie seien bin"ar kompatibel:
  11578. Um die l"angeren Adre"sfelder und zus"atzlichen Befehle unterbringen zu
  11579. k"onnen, haben sich die Bitpositionen einiger Felder im Instruktionswort
  11580. verschoben, die Instruktionsl"ange hat sich auch insgesamt von 23 auf 24
  11581. Bit ge"andert.  Im Code-Format sind deshalb auch unterschiedliche
  11582. Header-Ids f"ur beide reserviert.
  11583.  
  11584. Gemeinsam ist beiden, da"s sie neben Code- und Datensegment auch noch ein
  11585. ROM zur Ablage von Konstanten besitzen.  Dieses ist bei \asname{} auf das
  11586. \tty{ROMDATA}-Segment abgebildet!
  11587.  
  11588. %%---------------------------------------------------------------------------
  11589.  
  11590. \section{uCOM-43}
  11591.  
  11592. Der uCOM-43-Befehlssatz enth"alt einen Befehl {\tt CZP}, der es erlaubt, einen
  11593. Unterprogrammaufruf auf eine der Adressen 0, 4, 8, 12...60 mit einem einzigen
  11594. Instruktions-Byte zu machen.  Leider ist die vorhandene Dokumentation dar"uber
  11595. unklar, ob der Befehl im Quelltext die Zieladresse (also einen durch vier
  11596. teilbaren Wert) oder den im Befehl enthaltenen Vektor (also eine Zahl von 0 bis
  11597. 15) erwartet.  Im Moment betreibt der Assembler ein wenig 'Kaffeesatzleserei':
  11598. \begin{itemize}
  11599. \item{Falls das Argument gr"o"ser als 15 ist, mu"s es sich um eine Adresse
  11600.      handeln, ansonsten:}
  11601. \item{Falls das Argument kein mehrfaches von vier ist, mu"s es sich um einen
  11602.      Vektor handeln, ansonsten:}
  11603. \item{Falls das Argument Null ist, ist keine Unterscheidung notwendig, ansonsten:}
  11604. \item{Falls das Argument ein Symbol aus dem {\tt CODE}-Segment ist, z.B. ein Label,
  11605.      mu"s es sich um eine Adresse handlen, ansonsten:}
  11606. \item{ist es ein Vektor.}
  11607. \end{itemize}
  11608. Die letzten beiden F"alle treffen nur auf die Werte 4, 8 oder 12 zu, und weil die
  11609. Entscheidung nicht intuitiv ist, wird bei der Entscheidung f"ur einen Vektor
  11610. eine Warnung ausgegeben.  F"ur den Fall, da"s wirklich die Adresse 4, 8 oder 12
  11611. gemeint ist, definiere man den Wert als Symbol im Code-Segment:
  11612. \begin{verbatim}
  11613. dest   label  4
  11614.       .
  11615.       .
  11616.       .
  11617.       czp dest
  11618. \end{verbatim}
  11619. F"ur den Fall, da"s ein Vektor gemeint ist, und die Warnung st"ort, kann man die
  11620. Warnung folgender ma"sen unterdr"ucken:
  11621. \begin{verbatim}
  11622. vector equ    4
  11623.       .
  11624.       .
  11625.       .
  11626.       expect 480
  11627.       czp    vector
  11628.       endexpect
  11629. \end{verbatim}
  11630. Ich gestehe ein, da"s diese Situation nicht 100\% befriedigend ist.  Falls
  11631. jemand Informationen "uber das Verhalten des Original-NEC-Assemblers hat,
  11632. w"are ich f"ur eine Nachricht dankbar.
  11633.  
  11634. %%---------------------------------------------------------------------------
  11635.  
  11636. \section{F2MC16L}
  11637.  
  11638. Darauf, da"s man bei Anwendungen mit mehr als 64K ROM oder 64K RAM darauf
  11639. achten sollte, \asname{} die korrekte momentane Belegung der Bank-Register
  11640. mitzuteilen, wurde bereits in Zusammenhang mit dem {\tt ASSUME}-Befehl
  11641. erw"ahnt.  \asname{} "uberpr"uft bei jedem absoluten Zugriff anhand dieser
  11642. Annahmen, ob evtl. ein Zugriff auf eine Speicherstelle erfolgt, die
  11643. momentan "uberhaupt nicht greifbar ist.  Standardm"a"sig sind daf"ur
  11644. nat"urlich nur DTB und DPR wichtig, denn ADB bzw. SSB/USB werden nur bei
  11645. indirekten Zugriffen "uber RW2/RW6 bzw. RW3/RW7 benutzt, und bei
  11646. indirekten Zugriffen greift diese Pr"ufmimik ohnehin nicht.  Nun ist es
  11647. aber so, da"s man - "ahnlich wie beim 8086 - einem Befehl eine
  11648. Segmentpr"afix voranstellen kann, mit dem DTB f"ur den folgenden Befehl
  11649. durch ein beliebiges anderes Register ersetzt werden kann.  \asname{} f"uhrt
  11650. deswegen "uber die verwendeten Pr"afixbefehle Buch und schaltet bei der
  11651. Pr"ufung f"ur den n"achsten {\em Prozessorbefehl} um - eine zwischen dem
  11652. Segmentpr"afix und Prozessorbefehl eingestreute Pseudoanweisung l"oscht
  11653. den Merker also {\em nicht}.  Dies gilt auch f"ur Pseudobefehle zur
  11654. Datenablage oder Ver"anderung des Programmz"ahlers - aber wer macht so
  11655. etwas schon ;-)
  11656.  
  11657. %%---------------------------------------------------------------------------
  11658.  
  11659. \section{MN161x}
  11660.  
  11661. F"ur dieses Target gilt die Besonderheit, da"s man zwischen zwei
  11662. Code-Generatoren w"ahlen kann: Einer wurde freundlicherweise von Haruo Asano
  11663. geschrieben und ist "uber die CPU-Namen \tty{MN1610} bzw. \tty{MN1613}
  11664. erreichbar; der andere wurde von mir erstellt und ist "uber die Namen
  11665. \tty{MN1610ALT} bzw. \tty{MN1613ALT} aktivierbar.  Wer den erweiterten
  11666. Adre"sraum von 256 KWorten des MN1613 verwenden will, oder mit dem
  11667. Gleitkommaformat des MN1613 experimentieren will, mu"s das \tty{ALT}-
  11668. Target verwenden.
  11669.  
  11670. %%---------------------------------------------------------------------------
  11671.  
  11672. \section{CDP180x}
  11673.  
  11674. Prozessoren dieser Reihe kennen sowohl kurze als auch lange Sprungbefehle:
  11675. W"ahrend ein kurzer Sprung nur innerhalb der gleichen Speicherseite von 256 Byte
  11676. m"oglich ist, kann man mit einem langen Sprung jedes beliebige Ziel im
  11677. Adre"sraum von 64 KByte erreichen.  Die Assembler-Syntax sieht f"ur beide
  11678. Varianten unterschiedliche Mnemonics vor (die lange Variante mit vorangestelltem
  11679. 'L'), aber keine, die dem Assembler gestatten w"urde, automatisch einen langen
  11680. oder kurzen Befehl einzusetzen.  \asname{} kennt solche 'Pseudobehle' als Erweiterung:
  11681. \begin{itemize}
  11682. \item{\tty{JMP} wird zu \tty{BR} oder \tty{LBR}.}
  11683. \item{\tty{JZ} wird zu \tty{BZ} oder \tty{LBZ}.}
  11684. \item{\tty{JNZ} wird zu \tty{BNZ} oder \tty{LBNZ}.}
  11685. \item{\tty{JDF} wird zu \tty{BDF} oder \tty{LBDF}.}
  11686. \item{\tty{JPZ} wird zu \tty{BPZ} oder \tty{LBPZ}.}
  11687. \item{\tty{JGE} wird zu \tty{BGE} oder \tty{LBGE}.}
  11688. \item{\tty{JNF} wird zu \tty{BNF} oder \tty{LBNF}.}
  11689. \item{\tty{JM} wird zu \tty{BM} oder \tty{LBM}.}
  11690. \item{\tty{JL} wird zu \tty{BL} oder \tty{LBL}.}
  11691. \item{\tty{JQ} wird zu \tty{BQ} oder \tty{LBQ}.}
  11692. \item{\tty{JNQ} wird zu \tty{BNQ} oder \tty{LBNQ}.}
  11693. \end{itemize}
  11694.  
  11695. %%---------------------------------------------------------------------------
  11696.  
  11697. \section{KENBAK}
  11698.  
  11699. Der KENBAK-1 wurde 1970 entwickelt, zu einer Zeit, als der erste
  11700. Mikroprozessor noch drei Jahre entfernt war.  Man kann davon ausgehen, da"s
  11701. er f"ur die Hobbyisten, die sich den Bausatz seinerzeit leisten konnten, ihr
  11702. erster und einziger Computer war.  Demzufolge hatten sie auch nichts, auf
  11703. dem sie einen Assembler f"ur diesen Computer h"atten laufen lassen k"onnen -
  11704. der KENBAK-1 mit seinem Speicher von 256 Byte war daf"ur viel zu klein.  Die
  11705. pr"aferierte Methode waren vorgedruckte Tabellen, in die man die Befehle und
  11706. ihren Maschinencode eintrug.  War man mit dieser ,,Programmierung'' fertig,
  11707. konnte man den Code "uber die Schalterleiste per Hand in den Computer laden.
  11708.  
  11709. Daraus resultiert leider, da"s die Assembler-Sprache des KENBAK zwar im
  11710. Programming Manual beschrieben, aber nicht wirklich formal definiert ist.  Als
  11711. Grant Stockly vor ein paar Jahren neue KENBAK-Kits herausbrachte, hat er
  11712. eine erste KENBAK-Portierung f"ur meinen Assembler gemacht, die hat ihren
  11713. Weg jedoch leider nie wieder ''upstream'' gefunden.  In meiner Implementierung
  11714. habe ich versucht, seine Ideen aufzugreifen, jedoch andererseits auch eine
  11715. Syntax anzubieten, wie sie Programmierern eines 6502, Z80 oder "ahnlichem
  11716. eher vertraut sein d"urfte.  In der folgenden Tabelle sind die Syntax-Unterschiede
  11717. gegen"uber gestellt:
  11718.  
  11719. \hfuzz=5pt
  11720. \begin{center}\begin{longtable}{|l|l|l|}
  11721. \hline
  11722. Stockly & Alternativ & Bemerkung \\
  11723. \hline
  11724. \hline
  11725. \endhead
  11726. \multicolumn{3}{|l|}{\bf Arithmetisch/Logisch (ADD/SUB/LOAD/STORE/AND/OR/LNEG)} \\
  11727. \hline
  11728. {\it instr} {\tt Constant}, {\it Reg}, {\it Wert}, & {\it instr} {\it Reg}, {\it \#Wert} & immediate \\
  11729. {\it instr} {\tt Memory}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it Addr} & direkt \\
  11730. {\it instr} {\tt Indirect}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it (Addr)} & direkt \\
  11731. {\it instr} {\tt Indexed}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it Addr},X & indiziert \\
  11732. {\it instr} {\tt Indirect-Indexed}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it (Addr)},X & indirekt-indiziert \\
  11733. \hline
  11734. \multicolumn{3}{|l|}{\bf Spr"unge} \\
  11735. \hline
  11736. {\tt JPD} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JP} {\it Reg}, {\it Cond}, {\it Addr} & bedingt-direkt \\
  11737. {\tt JPI} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JP} {\it Reg}, {\it Cond}, {\it (Addr)} & bedingt-indirekt \\
  11738. {\tt JMD} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JM} {\it Reg}, {\it Cond}, {\it Addr} & bedingt-direkt \\
  11739. {\tt JMI} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JM} {\it Reg}, {\it Cond}, {\it (Addr)} & bedingt-indirekt \\
  11740. {\tt JPD} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JP} {\it Addr} & unbedingt-direkt \\
  11741. {\tt JPI} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JP} {\it (Addr)} & unbedingt-indirekt \\
  11742. {\tt JMD} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JM} {\it Addr} & unbedingt-direkt \\
  11743. {\tt JMI} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JM} {\it (Addr)} & unbedingt-indirekt \\
  11744. \hline
  11745. \multicolumn{3}{|l|}{\bf Sprungbedingungen} \\
  11746. \hline
  11747. {\tt Non-zero} & {\tt NZ} & $\neq 0$ \\
  11748. {\tt Zero} & {\tt Z} & $= 0$ \\
  11749. {\tt Negative} & {\tt N} & $< 0$ \\
  11750. {\tt Positive} & {\tt P} & $\geq 0$ \\
  11751. {\tt Positve-Non-zero} & {\tt PNZ} & $ > 0$ \\
  11752. \hline
  11753. \multicolumn{3}{|l|}{\bf Skips} \\
  11754. \hline
  11755. {\tt SKP 0}, {\it bit}, {\it Addr} & {\tt SKP0} {\it bit}, {\it Addr} {\it [,Dest]} & \\
  11756. {\tt SKP 1}, {\it bit}, {\it Addr} & {\tt SKP1} {\it bit}, {\it Addr} {\it [,Dest]} & \\
  11757. \hline
  11758. \multicolumn{3}{|l|}{\bf Bitmanipulation} \\
  11759. \hline
  11760. {\tt SET 0}, {\it bit}, {\it Addr} & {\tt SET0} {\it bit}, {\it Addr} & \\
  11761. {\tt SET 1}, {\it bit}, {\it Addr} & {\tt SET1} {\it bit}, {\it Addr} & \\
  11762. \hline
  11763. \multicolumn{3}{|l|}{\bf Schiebe/Rotierbefehle} \\
  11764. \hline
  11765. {\tt SHIFT LEFT}, {\it cnt}, {\it Reg} & {\tt SFTL} {\it [cnt,]} {\it Reg} & \\
  11766. {\tt SHIFT RIGHT}, {\it cnt}, {\it Reg} & {\tt SFTR} {\it [cnt,]} {\it Reg} & arithm. Shift \\
  11767. {\tt ROTATE LEFT}, {\it cnt}, {\it Reg} & {\tt ROTL} {\it [cnt,]} {\it Reg} & \\
  11768. {\tt ROTATE RIGHT}, {\it cnt}, {\it Reg} & {\tt ROTR} {\it [cnt,]} {\it Reg} & \\
  11769. \hline
  11770. \caption{KENBAK-Befehlssyntax \label{TabKENBAKSyntax}}
  11771. \end{longtable}\end{center}
  11772. \hfuzz=0pt
  11773.  
  11774. Es gibt keinen Pseudobefehl, um zwischen diesen beiden Syntax-Varianten umzuschalten.
  11775. Beide d"urfen jederzeit und auch in beliebiger Mischung genutzt werden.
  11776.  
  11777. Die Zieladresse {\it [Dest]}, die man optional bei den Skip-Befehlen angeben
  11778. kann, geht nicht in den erzeugten Code ein.  Der Assembler "uberpr"uft lediglich,
  11779. ob der Prozessor zur Laufzeit wirklich zur angegebene Adresse springen w"urde.
  11780. Dadurch kann z.B. gepr"uft werden, ob man nicht versehentlich versucht, einen
  11781. einzelnen Ein-Byte-Befehl zu "uberspringen.  Ein weggelassenes Schiebeargument
  11782. {\it [cnt]} bedeutet, da"s um eine Stelle geschoben werden soll.
  11783.  
  11784. %%---------------------------------------------------------------------------
  11785.  
  11786. \section{HP Nanoprocessor}
  11787.  
  11788. Der HP Nanoprocessor verf"ugt "uber keinerlei Befehle, Daten aus dem ROM-
  11789. Adre"sraum zu lesen und in ein Register zu transferieren.  Die diesbez"uglichen
  11790. Befehle {\tt LDR} und {\tt STR} sind eher das, was man bei anderen Prozessoren
  11791. als ,,immediate-Adressierung'' bezeichnen w"urde.  Aus diesen Grund sind f"ur
  11792. den HP Nanoprocessor keinerlei Pseudobefehen definiert, mit denen sich Konstanten
  11793. im ROM ablegen oder Platz reservieren l"a"st.
  11794.  
  11795. %%---------------------------------------------------------------------------
  11796.  
  11797. \section{IM61x0}
  11798.  
  11799. Dieser Mikroprozessor ist quasi eine Single-Chip-Implementierung einer PDP/8E,
  11800. weshalb als ,,Assembler-Referenz'' in Quellcode-Beispielen "ublicherweise der
  11801. PAL-III von Digital Equipment benutzt wird.  Die \asname{}-Implementierung weicht in
  11802. einigen Punkten von der PAL-III-Syntax ab, unter anderem auch, weil sich manche
  11803. Dinge nur mit gro"sem Aufwand h"atten bereit stellen lassen.  Hier einige Hinweise,
  11804. wie sich bestehender Code anpassen l"a"st:
  11805.  
  11806. \begin{itemize}
  11807. \item{Bei PAL-III werden Label durch ein angeh"angtes Komma gekennzeichnet.
  11808.      Bei \asname{} ist diese ein Doppelpunkt, bzw. gar nichts, wenn das Label in der
  11809.      ersten Spalte beginnt.}
  11810. \item{Die Ablage von Daten im Speicher erfolgt bei PAL-III einfach dadurch,
  11811.      da"s man die Konstante in das Feld des Mnemonics schreibt.  \asname{} verwendet
  11812.      zur Datenablage die \tty{DC}-Anweisung, die daf"ur auch mehrere Worte
  11813.      auf einmal als Argument akzeptiert.  Unter Umst"anden kann man sich
  11814.      die Ablage von Konstanten durch den \tty{LTORG}-Mechanismus aber auch
  11815.      teilweise ersparen.}
  11816. \item{Den Programmz"ahler setzt man mit \tty{ORG address} anstelle {*address}.}
  11817. \end{itemize}
  11818.  
  11819. %%===========================================================================
  11820.  
  11821. \cleardoublepage
  11822. \chapter{Dateiformate}
  11823.  
  11824. In diesem Kapitel sollen die Formate von von \asname{} erzeugten Dateien
  11825. beschrieben werden, deren Format sich nicht direkt erschlie"st.
  11826.  
  11827. \section{Code-Dateien}
  11828. \label{SectCodeFormat}
  11829.  
  11830. Das vom Assembler ausgegebene Codedatenformat mu"s in der Lage sein,
  11831. die Codeteile f"ur unterschiedliche Prozessoren voneinander zu trennen,
  11832. und sieht daher etwas anders aus als g"angige Formate.  Obwohl dem
  11833. Assembler Tools zur Bearbeitung der Codedateien beiliegen, halte ich es
  11834. f"ur guten Stil, das Format hier kurz offenzulegen:
  11835. \par
  11836. Sofern in der Datei Mehrbyte-Integers gespeichert sind, werden sie
  11837. im Intelformat abgelegt, d.h. mit dem LSB zuerst.  Diese Regel gilt
  11838. bereits f"ur das 16-Bit-Kennungswort mit dem Wert \$1489, d.h. jede
  11839. Codedatei beginnt mit den Bytes \$89/\$14.
  11840. \par
  11841. Danach folgt eine Reihe beliebig vieler ,,Records'', wobei ein Record
  11842. entweder ein zusammenh"angendes Teilfeld des Codes darstellt oder bestimmte
  11843. Zusatzinformationen enth"alt.  Eine Datei
  11844. kann auch ohne Umschaltung des Prozessortyps mehrere Records enthalten,
  11845. wenn Code- oder Konstantenbereiche durch reservierte (und nicht zu
  11846. initialisierende) Speicherbereiche unterbrochen werden.  Der Assembler
  11847. versucht auf diese Weise, die Datei nicht l"anger als n"otig werden
  11848. zu lassen.
  11849. \par
  11850. Allen Records ist gemein ist ein Header-Byte, das den Typ des Records
  11851. und die damit folgenden Datenstrukturen festlegt.  In einer Pascal-artigen
  11852. Form l"a"st sich die Record-Struktur folgenderma"sen beschreiben:
  11853. \begin{verbatim}
  11854. FileRecord = RECORD CASE Header:Byte OF
  11855.              $00:(Creator:ARRAY[] OF Char);
  11856.              $01..
  11857.              $7f:(StartAdr : LongInt;
  11858.                   Length   : Word;
  11859.                   Data     : ARRAY[0..Length-1] OF Byte);
  11860.              $80:(EntryPoint:LongInt);
  11861.              $81:(Header   : Byte;
  11862.                   Segment  : Byte;
  11863.                   Gran     : Byte;
  11864.                   StartAdr : LongInt;
  11865.                   Length   : Word;
  11866.                   Data     : ARRAY[0..Length-1] OF Byte);
  11867.             END
  11868. \end{verbatim}
  11869. Was in dieser Schreibweise nicht ganz zum Ausdruck kommt, ist, da"s
  11870. die L"ange von Datenfeldern variabel ist und von {\tt Length} abh"angt.
  11871. \par
  11872. Ein Record mit einem Header-Byte von \verb!$81! ist ein Record, der Code
  11873. oder Daten aus beliebigen Segmenten beinhalten kann.  Das erste
  11874. Byte (Header) gibt an, f"ur welche Prozessorfamilie die folgenden
  11875. Daten bzw. der folgende  Code bestimmt ist (siehe Tabelle \ref{TabHeader}).
  11876. \newcounter{headidcounter}
  11877. \setcounter{headidcounter}{1}
  11878. \newcommand{\headid}[2]{#1 & #2
  11879.  \ifnum\value{headidcounter}>1 \\ \fi
  11880.  \ifnum\value{headidcounter}<2 & \fi
  11881.  \stepcounter{headidcounter}
  11882.  \ifnum\value{headidcounter}>2
  11883.   \setcounter{headidcounter}{1}
  11884.  \fi
  11885. }
  11886. \begin{center}\begin{longtable}{|c|l||c|l|}
  11887. \hline
  11888. Header & Familie & Header & Familie \\
  11889. \hline
  11890. \hline
  11891. \endhead
  11892. \input{../doc_COM/tabids.tex}
  11893. \\ \hline
  11894. \caption{Headerbytes f"ur die verschiedenen Prozessorfamilien}
  11895. \label{TabHeader}
  11896. \end{longtable}\end{center}
  11897. Das Segment-Feld gibt an, in welchen Adre"sraum des Prozessors der
  11898. folgende Code geh"ort.  Dabei gilt die in Tabelle \ref{TabSegments}
  11899. angegeben Zuordnung.
  11900. \begin{table*}[htbp]
  11901. \begin{center}\begin{tabular}{|c|l||c|l|}
  11902. \hline
  11903. Nummer & Segment & Nummer & Segment \\
  11904. \hline
  11905. \hline
  11906. \$00 &    $<$undefiniert$>$    & \$01 &    CODE \\
  11907. \$02 &    DATA                 & \$03 &    IDATA \\
  11908. \$04 &    XDATA                & \$05 &    YDATA \\
  11909. \$06 &    BDATA                & \$07 &    IO \\
  11910. \$08 &    REG                  & \$09 &    ROMDATA \\
  11911. \hline
  11912. \end{tabular}\end{center}
  11913. \caption{Kodierungen des {\tt Segment}-Feldes\label{TabSegments}
  11914.         \label{TabSegmentNums}}
  11915. \end{table*}
  11916. Das Gran-Feld gibt die ,,Granularit"at'' des Codes an, d.h. die Gr"o"se
  11917. der kleinsten, adressierbaren Einheit im folgenden Datensatz.  Dieser
  11918. Wert ist eine Funktion von Prozessortyp und Segment und ein wichtiges
  11919. Detail f"ur die Interpretation der beiden folgenden Felder, die
  11920. Startadresse und L"ange angeben: W"ahrend die Startadresse sich auf die
  11921. Granularit"at bezieht, erfolgt die L"angenangabe immer in Bytes!  W"are
  11922. die Startadresse z.B. \$300 und die L"ange 12, so w"are die sich
  11923. ergebende Endadresse bei einer Granularit"at von 1 \$30b, bei einer
  11924. Granularit"at von z.B. 4 jedoch \$303!  Andere Granularit"aten als eins
  11925. sind selten und treten in erster Linie bei Signalprozessoren auf, die
  11926. nicht  auf Einzelbyteverarbeitung ausgelegt sind deren Datenspeicher z.B.
  11927. aus 64kWorten zu 16 Bit besteht (DSP56K).  Der sich ergebende Speicherplatz
  11928. betr"agt dann zwar 128 KByte, er ist aber in $2^{16}$ Worten organisiert,
  11929. die mit Adressen von 0,1,2,...65535 adressiert werden!
  11930. \par
  11931. Die Startadresse ist 32-bittig, unabh"angig von der Adre"sbreite der
  11932. jeweiligen Prozessorfamilie.  Im Gegensatz dazu ist die L"angenangabe
  11933. nur 16 Bit lang, ein Record kann also maximal (4+4+2+(64K-1)) = 65545
  11934. Byte lang werden.
  11935. \par
  11936. Daten-Records mit den Header-Bytes \verb!$01..$7f! stellen eine
  11937. Kurzschreibweise dar und stellen die Abw"artskompatibilit"at mit fr"uheren
  11938. Definitionen des Dateiformats her: Das Header-Byte gibt direkt den
  11939. Prozessortyp gem"a"s der ersten Tabelle an, das Zielsegment ist auf \tty{CODE}
  11940. festgelegt und die Granularit"at ergibt sich aus dem Prozessortyp,
  11941. aufgerundet auf eine Zweierpotenz von Bytes.  \asname{} bevorzugt diese Records,
  11942. wenn Daten bzw. Code f"ur das \tty{CODE}-Segment anstehen.
  11943. \par
  11944. Der Record mit dem Typ-Byte \verb!$80! legt den Einsprungpunkt fest, d.h.
  11945. die Adresse, an der mit der Ausf"uhrung des Programms begonnen werden
  11946. soll.  Ein solcher Record ist das Ergebnis einer \tty{END}-Anweisung mit
  11947. einer entsprechenden Adresse als Argument.
  11948. \par
  11949. Der letzte Record in der Datei tr"agt das Header-Byte \verb!$00! und besitzt
  11950. als einziges Datenfeld einen String, dessen Ende durch das Dateiende
  11951. definiert ist.  Dieser String spezifiziert, von welchem Programm diese
  11952. Datei erzeugt wurde und hat keine weitere Bedeutung.
  11953.  
  11954.  
  11955. \section{Debug-Dateien}\label{SectDebugFormat}
  11956.  
  11957. Debug-Dateien k"onnen optional von \asname{} erzeugt werden und liefern
  11958. nachgeschalteten Werkzeugen wie Disassemblern oder Debuggern f"ur diese
  11959. wichtige Informationen.  \asname{} kann Debug-Informationen in drei Formaten
  11960. ausgeben: Zum einen im Objekt-Format der AVR-Tools von Atmel sowie eine zu
  11961. NoICE kompatible Kommandodatei und zum anderen in einem eigenen Format.
  11962. Die ersten beiden werden in \cite{AVRObj} bzw. der Dokumentation zu
  11963. NoICE ausf"uhrlich beschrieben, deshalb beschr"ankt sich die folgende
  11964. Beschreibung auf das \asname{}-eigene MAP-Format:
  11965.  
  11966. Diese Informationen in einer MAP-Datei teilen sich in drei Gruppen:
  11967. \begin{itemize}
  11968. \item{Symboltabelle}
  11969. \item{Speicherberlegung, auf Sektionen verteilt}
  11970. \item{Maschinenadressen von Quellzeilen}
  11971. \end{itemize}
  11972. Letzterer Teil findet sich zuerst in der Datei.  Ein einzelner
  11973. Eintrag in dieser Liste besteht aus zwei, von einem Doppelpunkt
  11974. getrennten Zahlen:
  11975. \begin{verbatim}
  11976. <Zeilennummer>:<Adresse>
  11977. \end{verbatim}
  11978. Ein solcher Eintrag besagt, da"s der aus einer bestimmten
  11979. Quellcodezeile erzeugte Maschinencode auf der angegebenen Adresse
  11980. (hexadezimal) zu liegen kam.  Mit einer solchen Information kann ein
  11981. Debugger beim Durchsteppen des Programms die entsprechenden
  11982. Quellcodezeilen anzeigen.  Da ein Programm aber auch aus mehreren
  11983. Include-Dateien bestehen kann, und viele Prozessoren mehr als nur
  11984. einen Adre"sraum besitzen (von dem zugegebenerma"sen nur in einem Code
  11985. liegt), m"ussen die oben beschriebenen Eintr"age sortiert werden.  \asname{}
  11986. tut dies in zwei Stufen: Das prim"are Sortierkriterium ist das
  11987. Zielsegment, innerhalb dieser Segmente wird noch einmal nach Dateien
  11988. sortiert.  Einzelne Abschnitte werden dabei durch durch spezielle
  11989. Zeilen der Form
  11990. \begin{verbatim}
  11991. Segment <Segmentname>
  11992. \end{verbatim}
  11993. bzw.
  11994. \begin{verbatim}
  11995. File <Dateiname>
  11996. \end{verbatim}
  11997. getrennt.
  11998.  
  11999. Die Symboltabelle folgt der Quellzeileninformation und ist wieder
  12000. prim"ar nach den Segmenten geordnet, aus denen die Symbole stammen.
  12001. Im Gegensatz zur Zeileninformation kommt hier allerdings auch der
  12002. Abschnitt \tty{NOTHING} hinzu, der die Symbole beinhaltet, die keinem
  12003. speziellen Adre"sraum zugeordnet sind (z.B. Symbole, die einfach mit
  12004. \tty{EQU} definiert wurden).  Die Einleitung eines Abschnittes in der
  12005. Symboltabelle erfolgt mit einer Zeile der Form
  12006. \begin{verbatim}
  12007. Symbols in Segment <Segmentname>   .
  12008. \end{verbatim}
  12009. Innerhalb eines Abschnittes sind die Symbole nach Namen sortiert, und
  12010. ein Symboleintrag belegt genau eine Zeile.  Eine solche Zeile besteht
  12011. wiederum aus sechs Feldern, die durch jeweils mindestens ein Leerzeichen
  12012. getrennt sind:
  12013.  
  12014. Das erste Feld ist der Name des Symbols selber, eventuell erweitert
  12015. um eine in eckigen Klammern eingeschlossene Sektionsnummer, die den
  12016. G"ultigkeitsbereich des Symbols einschr"ankt.  Die zweite Spalte
  12017. bezeichnet den Typ des Symbols: \tty{Int} f"ur Integerzahlen, \tty{Float} f"ur
  12018. Gleitkommazahlen und \tty{String} f"ur Zeichenketten.  Die dritte Zeile
  12019. schlie"slich beinhaltet den eigentliche Wert des Symbols.  Falls das
  12020. Symbol eine Zeichenkette beinhaltet, ist es notwendig, Steuer- und
  12021. Leerzeichen mit einer gesonderten Notation zu kennzeichnen, damit ein
  12022. im String enthaltenes Leerzeichen nicht eventuell als Trennzeichen
  12023. zur n"achsten Spalte interpretiert werden kann.  \asname{} bedient sich dazu
  12024. der bereits der in Assemblerquellen "ublichen Schreibweise, den
  12025. ASCII-Zahlenwert mit einem f"uhrenden Backslash (\verb!\!) einzusetzen.  Aus
  12026. dem String
  12027. \begin{verbatim}
  12028. Dies ist ein Test
  12029. \end{verbatim}
  12030. wird also z.B.
  12031. \begin{verbatim}
  12032. Dies\032ist\032ein\032Test
  12033. \end{verbatim}
  12034. Die Zahlenangabe ist immer dezimal und dreistellig, und der Backslash
  12035. selber wird ebenfalls in dieser Schreibweise kodiert.
  12036.  
  12037. Das vierte Feld gibt - falls vorhanden - die Gr"o"se der Datenstruktur
  12038. an, die an der durch das Symbol gekennzeichneten Adresse abgelegt
  12039. ist.  Ein Debugger kann eine solche Information z.B. nutzen, um
  12040. symbolisch angesprochene Variablen direkt in der korrekten L"ange
  12041. aufzulisten.  Hat \asname{} keine Informationen "uber die Symbolgr"o"se, so
  12042. steht in diesem Feld eine schlichte -1.
  12043.  
  12044. Das f"unfte und letzte Feld gibt an, ob das Symbol w"ahrend der
  12045. Assemblierung jemals referenziert wurde. Ein Programm, da"s die
  12046. Symboltabelle liest, kann auf diese Weise z.B. nicht benutzte Symbole
  12047. automatisch verwerfen, da sie beim folgenden Debugging oder der
  12048. Disassemblierung mit hoher Wahrscheinlichkeit auch nicht ben"otigt werden.
  12049.  
  12050. das sechste und letzte Feld gibt schlu"sendlich durch eine 0 oder 1 an,
  12051. ob es sich bei dem Symbol um eine Konstante (0) oder Variable (1) handelt.
  12052. Konstanten bekommen einmalig einen Wert zugewiesen (z.B. "uber die
  12053. \tty{EQU}-Anweisung oder ein Label), Variablen k"onnen ihren Wert beliebig
  12054. oft "andern.  In der MAP-Datei wird der letztg"ultige Wert aufgef"uhrt.
  12055.  
  12056. Der dritte Abschnitt in einer Debug-Datei beschreibt die im Programm
  12057. benutzten Sektionen n"aher.  Eine solche Beschreibung ist erforderlich,
  12058. da Sektionen den G"ultigkeitsbereich von Symbolen einschr"anken
  12059. k"onnen.  Je nach momentanem Stand des Programmz"ahlers kann z.B. ein
  12060. symbolischer Debugger einzelne Symboldefinitionen f"ur eine R"uck"ubersetzung
  12061. nicht nutzen oder mu"s Priorit"aten bei der Symbolnutzung beachten.
  12062. Die Definition einer Sektion beginnt mit einer Zeile der Form
  12063. \begin{verbatim}
  12064. Info for Section nn ssss pp     ,
  12065. \end{verbatim}
  12066. wobei \tty{nn} die Nummer der Sektion angibt (die Nummer, die als Postfix
  12067. f"ur Symbolnamen in der Symboltabelle genutzt wird), \tty{ssss} der Name der
  12068. Sektion ist und \tty{pp} die Nummer der Vatersektion darstellt.  Letztere
  12069. Information ben"otigt ein R"uck"ubersetzer, um sich bei der Auffindung
  12070. eines Symbols f"ur einen Zahlenwert ausgehend von der aktuellen Sektion
  12071. im Baum bis zur Wurzel ,,durchhangeln'' kann, bis ein passendes
  12072. Symbol gefunden wird.  Auf diese Zeile folgt eine Reihe weiterer
  12073. Zeilen, die den von dieser Sektion belegten Code-Bereich beschreiben.
  12074. Jeder einzelne Eintrag (genau einer pro Zeile) beschreibt entweder
  12075. eine einzelne Adresse oder einen durch zwei Grenzwerte beschriebenen
  12076. Bereich (Trennung von Anfangs-und Endwert durch ein Minuszeichen).
  12077. Die Grenzen sind dabei ,,inklusive'', d.h. die Grenzen geh"oren auch zu
  12078. dem Bereich.  Wichtig ist, da"s ein einer Sektion zugeh"origer Bereich
  12079. nicht nochmals f"ur ihre Vatersektionen aufgef"uhrt wird (eine Ausnahme
  12080. ist nat"urlich, wenn Bereiche absichtlich mehrfach belegt werden, aber
  12081. so etwas macht man ja auch nicht, gelle?).  Dies dient einer Optimierung
  12082. der Bereichsspeicherung w"ahrend der Assemblierung und sollte auch
  12083. f"ur eine Symbolr"uck"ubersetzung keine Probleme darstellen, da durch
  12084. die einfache Kennzeichnung bereits der Einstiegspunkt und damit der
  12085. Suchpfad im Sektionsbaum gegeben ist.  Die Beschreibung einer Sektion
  12086. wird durch eine Leerzeile oder das Dateiende gekennzeichnet.
  12087.  
  12088. Programmteile, die au"serhalb aller Sektionen liegen, werden nicht
  12089. gesondert ausgewiesen.  Diese ,,implizite Wurzelsektion'' tr"agt die
  12090. Nummer -1 und wird auch als Vatersektion f"ur Sektionen benutzt, die
  12091. keine eigentliche Vatersektion besitzen.
  12092.  
  12093. Es ist m"oglich, da"s die Datei Leerzeilen oder Kommentarzeilen
  12094. (Semikolon am Zeilenanfang) beinhaltet.  Diese sind von einem
  12095. Leseprogramm zu ignorieren.
  12096.  
  12097. %%===========================================================================
  12098.  
  12099. \cleardoublepage
  12100. \chapter{Hilfsprogramme}
  12101. \label{ChapTools}
  12102.  
  12103. Um die Arbeit mit dem Codeformat des Assemblers etwas zu erleichtern,
  12104. lege ich einige Progamme zu deren Bearbeitung bei.  F"ur diese Programme
  12105. gilt sinngem"a"s das gleiche wie in \ref{SectLicense}!
  12106.  
  12107. Allen Programmen gemeinsam sind die Returncodes, die sie liefern (Tabelle
  12108. \ref{TabToolReturns}).
  12109. \par
  12110. \begin{table*}[ht]
  12111. \begin{center}\begin{tabular}{|c|l|}
  12112. \hline
  12113. Returncode &  tritt auf bei... \\
  12114. \hline
  12115. \hline
  12116. 0          &  kein Fehler \\
  12117. 1          &  Kommandozeilenparameterfehler \\
  12118. 2          &  I/O-Fehler \\
  12119. 3          &  Dateiformatfehler \\
  12120. \hline
  12121. \end{tabular}\end{center}
  12122. \caption{Returncodes der Dienstprogramme\label{TabToolReturns}}
  12123. \end{table*}
  12124. Ebenso eintr"achtig wie \asname{} lesen sie ihre Eingaben von STDIN und schreiben
  12125. Meldungen auf STDOUT (bzw. Fehlermeldungen auf STDERR).  Ein-und
  12126. Ausgaben sollten sich daher problemlos umleiten lassen.
  12127. \par
  12128. Sofern Programme im folgenden Zahlen-oder Adre"sangaben von der
  12129. Kommandozeile lesen, d"urfen diese auch hexadezimal geschrieben werden,
  12130. indem man sie mit einem hintangestellten \tty{h}, einem voranstehenden
  12131. Dollarzeichen oder \tty{0x} wie in C versieht (z.B. \verb!$10!,
  12132. \verb!10h! oder \verb!0x10! anstelle von 16).
  12133. \par
  12134. Unix-Shells \marginpar{{\em UNIX}} ordnen dem Dollarzeichen allerdings
  12135. eine spezielle Bedeutung zu (Parameterexpansion), weshalb es n"otig ist,
  12136. einem Dollarzeichen direkt einen Backslash voranzustellen.  Die
  12137. \tty{0x}-Variante ist hier sicherlich angenehmer.
  12138. \par
  12139. Ansonsten folgen die Aufrufkonventionen und -variationen (bis auf PLIST
  12140. und AS2MSG) denen von \asname{}, d.h. man kann dauernd gebrauchte Schalter in
  12141. einer Environmentvariablen ablegen (deren Name sich aus dem Anh"angen von
  12142. CMD an den Programmnamen ergibt, z.B. BINDCMD f"ur BIND), Optionen
  12143. negieren und Gro"s-bzw. Kleinschreibung erzwingen (n"aheres zu dem Wie in
  12144. Abschnitt \ref{SectCallConvention}).
  12145. \par
  12146. Sofern Adre"sangaben benutzt werden, beziehen sie sich immer auf die
  12147. Granularit"at des Adre"sraumes des jeweiligen Prozessors; beim PIC bedeutet
  12148. z.B. eine Adre"sdifferenz von 1 nicht ein Byte, sondern ein Wort.
  12149.  
  12150. %%---------------------------------------------------------------------------
  12151.  
  12152. \section{PLIST}
  12153.  
  12154. PLIST ist das einfachste Programm der vier mitgelieferten; es dient
  12155. einfach nur dazu, die in einer Codedatei gespeicherten Records aufzulisten.
  12156. Da das Programm nicht allzuviel bewirkt, ist der Aufruf ziemlich simpel:
  12157. \begin{verbatim}
  12158.    PLIST $<$Dateiname$>$
  12159. \end{verbatim}
  12160. Der Dateiname wird automatisch um die Endung P erweitert, falls keine
  12161. Endung vorhanden ist.
  12162. \par
  12163. \bb{ACHTUNG!}  An dieser Stelle sind keine Jokerzeichen erlaubt! Falls mit
  12164. einem Befehl trotzdem mehrere Programmdateien gelistet werden sollen,
  12165. kann man sich mit folgendem ''Minibatch'' behelfen:
  12166. \begin{verbatim}
  12167.     for %n in (*.p) do plist %n
  12168. \end{verbatim}
  12169. PLIST gibt den Inhalt der Codedatei in Tabellenform aus, wobei f"ur
  12170. jeden Record genau eine Zeile ausgegeben wird.  Die Spalten haben
  12171. dabei folgende Bedeutung:
  12172. \begin{itemize}
  12173. \item{Codetyp: die Prozessorfamilie, f"ur die der Code erzeugt wurde.}
  12174. \item{Startadresse: absolute Speicheradresse, an die der Code zu laden ist.}
  12175. \item{L"ange: L"ange des Codest"ucks in Byte.}
  12176. \item{Endadresse: letzte absolute Adresse des Codest"ucks.  Diese berechnet
  12177.      sich als Startadresse+L"ange-1.}
  12178. \end{itemize}
  12179. Alle Angaben sind als hexadezimal zu verstehen.
  12180. \par
  12181. Zuletzt gibt PLIST noch einen Copyrightvermerk aus, sofern er einen
  12182. solchen in der Datei findet, und die Summe aller Codel"angen.
  12183. \par
  12184. PLIST ist praktisch ein DIR f"ur Codedateien.  Man kann es benutzen,
  12185. um sich den Inhalt einer Datei auflisten zu lassen, bevor man sie
  12186. weiterbearbeitet.
  12187.  
  12188. %%---------------------------------------------------------------------------
  12189.  
  12190. \section{BIND}
  12191.  
  12192. BIND ist ein Programm, mit dem man die Records mehrerer Codedateien
  12193. in eine Datei zusammenkopieren kann.  Die dabei vorhandene Filterfunktion
  12194. erlaubt es aber auch, nur Records eines bestimmten Typs zu "ubernehmen.
  12195. Auf diese Weise kann BIND auch dazu verwendet werden, um eine Codedatei
  12196. in mehrere aufzuspalten.
  12197. \par
  12198. Die allgemeine Syntax von BIND lautet
  12199. \begin{verbatim}
  12200.   BIND <Quelldatei(en)> <Zieldatei> [Optionen]
  12201. \end{verbatim}
  12202. Wie auch \asname{} betrachtet BIND alle nicht mit einem +, - oder / eingeleiteten
  12203. Parameter als Dateiangaben, von denen die letzte die Zieldatei angeben
  12204. mu"s.  Alle anderen Dateiangaben bezeichnen Quellen, diese Angaben d"urfen
  12205. auch wieder Jokerzeichen enthalten.
  12206. \par
  12207. An Optionen definiert BIND momentan nur eine:
  12208. \begin{itemize}
  12209. \item{\tty{f $<$Header[,Header...]$>$}: gibt eine Liste von Header-IDs
  12210.      an, die kopiert werden sollen.  Alle anderen Records werden
  12211.      nicht kopiert.  Ohne diese Angabe werden alle Records kopiert.
  12212.      Die in der Liste angegebenen entsprechen dem Header-Feld in der
  12213.      Recordstruktur, wie es in Abschnitt \ref{SectCodeFormat} beschrieben wurden. Die
  12214.      einzelnen Header-Nummern in der Liste werden durch Kommas getrennt.}
  12215. \end{itemize}
  12216. Um z.B. alle MCS-51-Codeteile aus einer Programmdatei auszusieben,
  12217. benutzt man BIND folgenderma"sen:
  12218. \begin{verbatim}
  12219.   BIND <Quellname> <Zielname> -f $31
  12220. \end{verbatim}
  12221. Fehlt bei einer Dateiangabe eine Endung, so wird automatisch die Endung
  12222. P angef"ugt.
  12223.  
  12224. %%---------------------------------------------------------------------------
  12225.  
  12226. \section{P2HEX}
  12227.  
  12228. P2HEX ist eine Erweiterung von BIND.  Es besitzt alle
  12229. Kommandozeilenoptionen von BIND und hat die gleichen Konventionen
  12230. bzgl. Dateinamen.  Im Gegensatz zu BIND wird die Zieldatei aber als
  12231. Hexfile ausgegeben, d.h. als eine Folge von Zeilen, die den Code als
  12232. ASCII-Hexzahlen enthalten.
  12233. \par
  12234. P2HEX kennt neun verschiedene Zielformate, die "uber den
  12235. Kommandozeilenparameter \bb{F} ausgew"ahlt werden k"onnen:
  12236. \begin{itemize}
  12237. \item{Motorola S-Record (\tty{-F Moto})}
  12238. \item{MOS Hex (\tty{-F MOS})}
  12239. \item{Intel-Hex (Intellec-8, \tty{-F Intel})}
  12240. \item{16-Bit Intel-Hex (MCS-86, \tty{-F Intel16})}
  12241. \item{32-Bit Intel-Hex (\tty{-F Intel32})}
  12242. \item{Tektronix Hex (\tty{-F Tek})}
  12243. \item{Texas Instruments DSK (\tty{-F DSK})}
  12244. \item{Atmel AVR Generic (\tty{-F Atmel}, siehe \cite{AVRObj})}
  12245. \item{Lattice Mico8 prom\_init (\tty{-F Mico8})}
  12246. \item{C-Arrays, zum Inkludieren in C(++)-Quelldateien (\tty{-F C})}
  12247. \end{itemize}
  12248. Wird kein Zielformat explizit angegeben, so w"ahlt P2HEX anhand des
  12249. Prozessortyps automatisch eines aus, und zwar S-Records f"ur Motorola-
  12250. Prozessoren, Hitachi und TLCS-900(0), MOS f"ur 65xx/MELPS, DSK f"ur die
  12251. 16-Bit-Texas-Signalprozessoren, Atmel Generic f"ur die AVRs und Intel-Hex
  12252. f"ur den Rest. Je nach Breite der Startadresse kommen bei S-Record Records
  12253. der Typen 1,2 oder 3 zum Einsatz, jedoch nie in einer Gruppe gemischt.
  12254. Diese Automatik l"a"st sich mit der Kommandozeilenoption
  12255. \begin{verbatim}
  12256.  -M <1|2|3>
  12257. \end{verbatim}
  12258. teilweise unterdr"ucken: Ein Wert von 2 bzw. 3 sorgt daf"ur, da"s
  12259. S-Records mit einem Mindesttyp von 2 bzw. 3 benutzt werden, w"ahrend ein
  12260. Wert von 0 der vollen Automatik entspricht.
  12261.  
  12262. Normalerweise benutzt das AVR-Format immer eine Adre"sl"ange von 3 Bytes.
  12263. Manche Programme m"ogen das leider nicht...deshalb kann man mit dem
  12264. Schalter
  12265. \begin{verbatim}
  12266.  -avrlen <2|3>
  12267. \end{verbatim}
  12268. die L"ange zur Not auf 2 Bytes reduzieren.
  12269.  
  12270. Das Mico8-Format unterscheidet sich insofern aus den anderen
  12271. Formaten, als da"s es keine Adre"sfelder besitzt - es ist eine
  12272. schlichte Auflistung der Instruktionsw"orter im Programmspeicher.
  12273. Bei der Benutzung mu"s darauf geachtet werden, da"s der
  12274. belegte Adre"sbereich (der sich z.B. mit PLIST anzeigen l"a"st)
  12275. bei Null beginnt und fortlaufend ist.
  12276.  
  12277. Die Intel-, Tektronix- und MOS-Formate sind auf 16 Bit-Adressen
  12278. beschr"ankt, das 16-Bit Intel-Format reicht 4 Bit weiter.  L"angere
  12279. Adressen werden von P2HEX mit einer Warnung gemeldet und abgeschnitten(!).
  12280. F"ur die PICs k"onnen die drei von Microchip spezifizierten Varianten des
  12281. Intel-Hex-Formates erzeugt werden, und zwar mit dem Schalter
  12282. \begin{verbatim}
  12283.  -m <0..3>
  12284. \end{verbatim}
  12285. Das Format 0 ist INHX8M, in dem alle Bytes in Lo-Hi-Ordnung enthalten
  12286. sind.  Die Adre"sangaben verdoppeln sich, weil bei den PICs die Adresse
  12287. sich nur um 1 pro Wort erh"oht.  Dieses Format ist gleichzeitig die Vorgabe.
  12288. Im Format 1 (INHX16M) werden alle Worte in ihrer nat"urlichen Ordnung
  12289. abgelegt.  Dieses Format verwendet Microchip f"ur seine eigenen
  12290. Programmierger"ate.  Format 2 (INHX8L) und 3 (INHX8H) trennen die Worte
  12291. in ihre oberen und unteren Bytes auf.  Um die komplette Information zu
  12292. erhalten, mu"s P2HEX zweimal aufgerufen werden, z.B. so:
  12293. \begin{verbatim}
  12294.  p2hex test -m 2
  12295.  rename test.hex test.obl
  12296.  p2hex test -m 3
  12297.  rename test.hex test.obh
  12298. \end{verbatim}
  12299. F"ur das Motorola-Format verwendet P2HEX zus"atzlich einen in \cite{CPM68K}
  12300. genannten Recordtyp mit der Nummer 5, der die Zahl der folgenden
  12301. Daten-Records (S1/S2/S3) bezeichnet.  Da dieser Typ vielleicht nicht jedem
  12302. Programm bekannt ist, kann man ihn mit der Option
  12303. \begin{verbatim}
  12304. +5
  12305. \end{verbatim}
  12306. unterdr"ucken.
  12307. \par
  12308. Das C-Format f"allt insofern aus dem Rahmen, als da"s es immer explizit
  12309. ausgew"ahlt werden mu"s.  Die Ausgabedatei stellt im Prinzip ein vollst"andiges
  12310. St"uck C- oder C++-Code dar, das die Daten als eine Liste von C-Arrays
  12311. enth"alt.  Neben den eigentlichen Daten wird noch eine Liste von Deskriptoren
  12312. geschrieben, die Start, L"ange und Ende der Datenbl"ocke
  12313. beschreiben.  Was diese Deskriptoren enthalten, kann mit der Option
  12314. \begin{verbatim}
  12315. -cformat <Format>
  12316. \end{verbatim}
  12317. bestimmt werden.  Jeder Buchstabe in \verb!Format! legt ein Element des
  12318. Deskriptors fest:
  12319. \begin{itemize}
  12320. \item{Ein \verb!d! oder \verb!D! definiert einen Zeiger auf die Daten.
  12321.      "Uber den Gro"s- oder Kleinbuchstaben wird festgelegt, ob die Hex-
  12322.      Konstanten Gro"s- oder Kleinbuchstaben verwenden sollen.}
  12323. \item{Ein \verb!s! oder \verb!S! definiert die Startadresse der Daten,
  12324.      wahlweise vom Typ {\em unsigned} oder {\em unsigned long}.}
  12325. \item{Ein \verb!l! oder \verb!L! definiert die L"ange der Daten,
  12326.      wahlweise vom Typ {\em unsigned} oder {\em unsigned long}.}
  12327. \item{Ein \verb!e! oder \verb!E! definiert die Endadresse der Daten,
  12328.      d.h. die letzte von den Daten benutzte Adresse,
  12329.      wahlweise vom Typ {\em unsigned} oder {\em unsigned long}.}
  12330. \end{itemize}
  12331. \par
  12332. Finden sich Code-Records verschiedener Prozessoren in einer Quelldatei,
  12333. so erscheinen die verschiedenen Hexformate auch gemischt in der Zieldatei
  12334. --- es empfiehlt sich also dringend, von der Filterfunktion Gebrauch zu
  12335. machen, oder ein fixes Format "uber die \verb!-F!-Option festzulegen.
  12336. \par
  12337. Neben dem Codetypenfilter kennt P2HEX noch ein Adre"sfilter, das n"utzlich
  12338. ist, falls der Code auf mehrere EPROMs verteilt werden mu"s:
  12339. \begin{verbatim}
  12340.  -r <Startadresse>-<Endadresse>
  12341. \end{verbatim}
  12342. Die Startadresse ist dabei die erste Speicherzelle, die im Fenster liegen
  12343. soll, die Endadresse die der letzten Speicherzelle im Fenster, \ii{nicht}
  12344. die der ersten au"serhalb.  Um z.B. ein 8051-Programm in 4 2764-EPROMs
  12345. aufzuteilen, geht man folgenderma"sen vor:
  12346. \begin{verbatim}
  12347. p2hex <Quelldatei> eprom1 -f $31 -r $0000-$1fff
  12348. p2hex <Quelldatei> eprom2 -f $31 -r $2000-$3fff
  12349. p2hex <Quelldatei> eprom3 -f $31 -r $4000-$5fff
  12350. p2hex <Quelldatei> eprom4 -f $31 -r $6000-$7fff
  12351. \end{verbatim}
  12352. Anstelle einer festen Adresse kann man als Anfang bzw. Ende auch ein
  12353. einfaches Dollarzeichen oder ein '0x' angeben.  Dies bedeutet, da"s die
  12354. niedrigste bzw. h"ochste in der Quelldatei gefundene Adresse als Anfang
  12355. bzw. Ende genommen wird.  Der Default f"ur den Bereich ist '0x-0x', d.h.
  12356. es werden alle Daten aus der Quelldatei "ubernommen.
  12357. \par
  12358. \bb{ACHTUNG!} Die Splittung "andert nichts an den absoluten Adressen, die
  12359. in den Hexfiles stehen!  Sollen die Adressen im Hexfile bei 0 beginnen,
  12360. so kann man dies durch den zus"atzlichen Schalter
  12361. \begin{verbatim}
  12362. -a
  12363. \end{verbatim}
  12364. erreichen.  Um im Gegenteil die Adre"slage auf einen bestimmten Wert zu
  12365. verschieben, kann man den Schalter
  12366. \begin{verbatim}
  12367. -R <Wert>
  12368. \end{verbatim}
  12369. verwenden.  Der dabei angegebene Wert ist ein {\em Offset}, d.h. er wird
  12370. auf die in der Code-Datei angegebenen Adressen aufaddiert.
  12371. \par
  12372. Den Inhalt einer Datei kann man mit einem Offset auf eine beliebige
  12373. Position verschieben; diesen Offset h"angt man einfach in Klammern an
  12374. den Dateinamen an.  Ist der Code in einer Datei z.B. auf Adresse 0 in
  12375. der P-Datei abgelegt, man m"ochte ihn jedoch auf Adresse 1000h
  12376. verschieben, so h"angt man an \tty{(\$1000)} an den Dateinamen (ohne
  12377. Leerzeichen!) an.
  12378. \par
  12379. Sofern die P-Datei nicht nur Daten aus dem Code-Segment enth"alt, kann
  12380. man mit dem Schalter
  12381. \begin{verbatim}
  12382. -segment <name>
  12383. \end{verbatim}
  12384. ausw"ahlen, aus welchen Segment Daten extrahiert und ins HEX-Format
  12385. gewandelt werden sollen.  Die als Argument anzugebenden Segmentnamen sind
  12386. die gleichen wie f"ur den \tty{SEGMENT}-Befehl (\ref{SEGMENT}). Ein
  12387. Sonderfall ist das TI-DSK-Format, das als einziges Format vermerken kann,
  12388. ob Daten ins Code- oder Datensegment geh"oren.  In diesem Fall extrahiert
  12389. P2HEX automatisch beide Segmente, solange kein Segment explizit angegeben
  12390. ist.
  12391. \par
  12392. Analog zur \verb!-r! Option kann man mit der Option
  12393. \begin{verbatim}
  12394. -d <Start>-<Ende>
  12395. \end{verbatim}
  12396. ein Filter f"ur das Datensegment angeben.
  12397. \par
  12398. F"ur das DSK-, Intel- und Motorola-Format relevant ist die Option
  12399. \begin{verbatim}
  12400. -e <Adresse> ,
  12401. \end{verbatim}
  12402. mit der man die in die Hex-Datei einzutragende Startadresse festlegen
  12403. kann.  Fehlt diese Angabe, so wird nach einen entsprechenden Eintrag
  12404. in der Code-Datei gesucht.  Ist auch dort kein Hinweis auf einen
  12405. Einsprungpunkt zu finden, so wird kein Eintrag in die HEX-Datei
  12406. geschrieben (DSK/Intel) bzw. das entsprechende Feld wird auf 0 gesetzt
  12407. (Motorola).
  12408. \par
  12409. Leider ist sich die Literatur nicht ganz "uber die Endezeile f"ur
  12410. Intel-Hexfiles einig.  P2HEX kennt daher 3 Varianten, einstellbar "uber
  12411. den Parameter \bb{i} mit einer nachfolgenden Ziffer:
  12412. \begin{description}
  12413. \item[0]{ :00000001FF}
  12414. \item[1]{ :00000001}
  12415. \item[2]{ :0000000000}
  12416. \end{description}
  12417. \par
  12418. Defaultm"a"sig wird die Variante 0 benutzt, die die gebr"auchlichste zu
  12419. sein scheint.
  12420. \par
  12421. Fehlt der Zieldateiangabe eine Endung, so wird \tty{HEX} als Endung angenommen.
  12422. \par
  12423. Defaultm"a"sig gibt P2HEX pro Zeile maximal 16 Datenbytes aus, wie es
  12424. auch die meisten anderen Tools tun, die Hex-Files erzeugen.  Wollen
  12425. Sie dies "andern, so k"onnen Sie dies mit dem Schalter
  12426. \begin{verbatim}
  12427. -l <Anzahl>
  12428. \end{verbatim}
  12429. tun.  Der erlaubte Wertebereich liegt dabei zwischen 2 und 254 Datenbytes;
  12430. ungerade Werte werden implizit auf gerade Anzahlen aufgerundet.
  12431. \par
  12432. Meist werden die tempor"aren, von \asname{} erzeugten Code-Dateien nach einer
  12433. Umwandlung nicht mehr unbedingt gebraucht.  Mit der Kommandozeilen-
  12434. option
  12435. \begin{verbatim}
  12436. -k
  12437. \end{verbatim}
  12438. kann man P2HEX anweisen, diese automatisch nach der Konversion zu l"oschen.
  12439. \par
  12440. Anders als BIND erzeugt P2HEX keine Leerdatei, wenn nur ein Dateiname
  12441. (=Zieldatei) angegeben wurde, sondern bearbeitet die dazugeh"orige
  12442. Codedatei.  Es ist also ein Minimalaufruf \`a la
  12443. \begin{verbatim}
  12444. P2HEX <Name>
  12445. \end{verbatim}
  12446. m"oglich, um $<$Name:  $>$.HEX aus $<$Name:  $>$.P zu erzeugen.
  12447.  
  12448. %%---------------------------------------------------------------------------
  12449.  
  12450. \section{P2BIN}
  12451.  
  12452. P2BIN funktioniert wie P2HEX und bietet die gleichen Optionen (bis
  12453. auf die a- und i- Optionen, die bei Bin"ardateien keinen Sinn ergeben), nur
  12454. wird das Ergebnis nicht als Hexdatei, sondern als einfache Bin"ardatei
  12455. abgelegt.  Dies kann dann z.B. direkt in ein EPROM gebrannt werden.
  12456. \par
  12457. Zur Beeinflussung der Bin"ardatei kennt P2BIN gegen"uber P2HEX noch
  12458. drei weitere Optionen:
  12459. \begin{itemize}
  12460. \item{\tty{l $<8-Bit-Zahl>$}: gibt den Wert an, mit dem unbenutzte
  12461.      Speicherstellen in der Datei gef"ullt werden sollen.
  12462.      Defaultm"a"sig ist der Wert \$ff, so da"s ein halbwegs
  12463.      intelligenter EPROM-Brenner sie "uberspringt.  Man kann aber
  12464.      hiermit auch andere Werte einstellen, z.B. enthalten die gel"oschten
  12465.      Speicherzellen der MCS-48-EPROM-Versionen Nullen.  In einem solchen
  12466.      Falle w"are 0 der richtige Wert.}
  12467. \item{\tty{s}: weist das Programm an, eine Pr"ufsumme "uber die Bin"ardatei zu
  12468.      berechnen.  Die Pr"ufsumme wird einmal als 32-Bit-Wert ausgegeben,
  12469.      zum anderen wird das Zweierkomplement der Bits 0..7 in der letzten
  12470.      Speicherstelle abgelegt, so da"s die Modulo-256-Summe zu 0 wird.}
  12471. \item{\tty{m}:  f"ur den Fall, da"s ein Prozessor mit 16- oder 32-Bit-Datenbus
  12472.      eingesetzt wird und die Bin"ardatei f"ur mehrere EPROMs aufgesplittet
  12473.      werden mu"s.  Das Argument kann folgende Werte annehmen:
  12474.      \begin{itemize}
  12475.      \item{\tty{ALL}: alles kopieren}
  12476.      \item{\tty{ODD}: alle Bytes mit ungerader Adresse kopieren}
  12477.      \item{\tty{EVEN}: alle Bytes mit gerader Adresse kopieren}
  12478.      \item{\tty{BYTE0}..\tty{BYTE3}: nur alle Bytes kopieren, deren Adresse die Form
  12479.            $4n+0$...$4n+3$ hat.}
  12480.      \item{\tty{WORD0},\tty{WORD1}: nur das untere bzw. obere 16-Bit-Wort der
  12481.            32-Bit-Worte kopieren.}
  12482.      \end{itemize}}
  12483. \end{itemize}
  12484.  
  12485. Nicht wundern: Bei letzteren Optionen ist die Bin"ardatei um den Faktor 2
  12486. oder 4 kleiner als bei \tty{ALL}.  Dies ist bei konstantem Adre"sfenster logisch!
  12487.  
  12488. Falls die Code-Datei keine Startadresse enth"alt, kann man diese
  12489. analog zu P2HEX "uber die \tty{-e}-Kommandozeilenoption vorgeben.  Auf
  12490. Anforderung teilt P2BIN ihren Wert der Ergebnisdatei voran.  Mit der
  12491. Kommandozeilenoption
  12492. \begin{verbatim}
  12493. -S
  12494. \end{verbatim}
  12495. wird diese Funktion aktiviert.  Sie erwartet als Argument eine
  12496. Zahlenangabe zwischen 1 und 4,  die die L"ange des Adressfeldes in
  12497. Bytes bestimmt.  Optional kann dieser Angabe auch noch der Buchstabe
  12498. L oder B vorangestellt werden, um die Byte-Order dieser Adresse
  12499. festzulegen.  So erzeugt z.B. die Angabe \tty{B4} eine 4-Byte-Adresse in
  12500. Big-Endian-Anordnung, \tty{L2} oder nur '2' eine 2-Byte-Adresse in
  12501. Little-Endian-Anordnung.
  12502.  
  12503. %%---------------------------------------------------------------------------
  12504.  
  12505. \section{AS2MSG}
  12506.  
  12507. Bei AS2MSG handelt es sich eigentlich um kein Hilfsprogramm, sondern um ein
  12508. Filter, das (gl"ucklichen) Besitzern von Borland-Pascal 7.0 das Arbeiten
  12509. mit dem Assembler erleichtern soll.  In den DOS-Arbeitsumgebungen existiert
  12510. ein ,,Tools''-Men"u, das man um eigene Programme, z.B. \asname{} erweitern kann.
  12511. Das Filter erlaubt, die von \asname{} gelieferten Fehlermeldungen mit Zeilenangabe
  12512. direkt im Editorfenster anzuzeigen.  Dazu mu"s im Tools-Men"u ein neuer
  12513. Eintrag angelegt werden (\tty{Options/Tools/New}).  Tragen Sie in die
  12514. einzelnen Felder folgende Werte ein :
  12515. \begin{itemize}
  12516. \item{Title: {\tt \verb!~!M\verb!~!akroassembler}}
  12517. \item{Program path: \tty{\asname{}}}
  12518. \item{Command line: \tty{-E !1 \$EDNAME \$CAP MSG(AS2MSG) \$NOSWAP \$SAVE
  12519. ALL}}
  12520. \item{bei Bedarf einen Hotkey zuordnen (z.B. Shift-F7)}
  12521. \end{itemize}
  12522. Die Option \tty{-E} sorgt daf"ur, da"s Turbo-Pascal nicht mit STDOUT und
  12523. STDERR durcheinander kommt.
  12524. \par
  12525. Ich setze dabei voraus, da"s sowohl \asname{} als auch AS2MSG sich in einem
  12526. Verzeichnis befinden, welches in der Pfadliste aufgef"uhrt ist.  Nach einem
  12527. Druck auf dem passenden Hotkey (oder Auswahl aus dem Tools-Men"u) wird \asname{} mit
  12528. dem Namen der Textdatei im aktiven Editorfenster aufgerufen.  Die dabei
  12529. aufgetretenen Fehler werden in ein separates Fenster geleitet, durch das man
  12530. nun ,,browsen'' kann.  Mit \bb{Ctrl-Enter} springt man eine fehlerhafte
  12531. Zeile an.  Zus"atzlich enth"alt das Fenster die Statistik, die \asname{} am Ende
  12532. der Assemblierung ausgibt.  Diese erhalten als Dummy-Zeilennummer 1.
  12533. \par
  12534. F"ur diese Arbeitsweise sind sowohl TURBO.EXE (Real Mode) als auch BP.EXE
  12535. (Protected Mode) geeignet.  Ich empfehle BP, da in dieser Variante beim
  12536. Aufruf nicht erst der halbe DOS-Speicher ,,freigeswappt'' werden mu"s.
  12537.  
  12538. \cleardoublepage
  12539.  
  12540. \appendix
  12541.  
  12542. %%===========================================================================
  12543.  
  12544. \cleardoublepage
  12545. \chapter{Fehlermeldungen von \asname{}}
  12546. \label{ChapErrMess}
  12547.  
  12548. Im folgenden findet sich eine halb-tabellarische Auflistung der in \asname{}
  12549. definierten Fehlermeldungen.  Zu jeder Fehlermeldung finden sich folgende
  12550. Angaben:
  12551. \begin{itemize}
  12552. \item{interne Fehlernummer (f"ur den Anwender nur mit der \tty{n}-Option sichtbar);}
  12553. \item{Fehlermeldung im Klartext;}
  12554. \item{Typ:
  12555.      \begin{itemize}
  12556.      \item{Warnung: zeigt m"ogliche Fehler oder ineffizienten Code an.
  12557.            Assemblierung geht weiter.}
  12558.      \item{Fehler: echte Fehler.  Assemblierung geht weiter, aber keine
  12559.            Code-Datei wird geschrieben.}
  12560.      \item{Fatal: schwerwiegende Fehler.  Assemblierung wird abgebrochen.}
  12561.      \end{itemize}}
  12562. \item{Ursache: die Situation(en), in denen der Fehler ausgegeben
  12563.      wird;}
  12564. \item{Argument: Die Ausgabe, die auf Wunsch als erweiterte Fehlermeldung
  12565.      erfolgt.}
  12566. \end{itemize}
  12567.  
  12568. \par
  12569.  
  12570. \newcommand{\errentry}[5]
  12571.           {\item[#1]{#2
  12572.                      \begin{description}
  12573.                      \item[Typ:]{\ \\#3}
  12574.                      \item[Ursache:]{\ \\#4}
  12575.                      \item[Argument:]{\ \\#5}
  12576.                      \end{description}}
  12577.           }
  12578.  
  12579. \begin{description}
  12580. \errentry{   5}{Displacement=0, "uberfl"ussig}
  12581.               {Warnung}
  12582.               {bei 680x0-,6809- und COP8-Prozessoren: Das Displacement
  12583.                in einem Adre"sausdruck hat den Wert 0 ergeben.  Es wird
  12584.                ein  Adre"sausdruck  ohne Displacement erzeugt.  Um keine
  12585.                Phasenfehler zu erzeugen, werden NOP-Befehle eingef"ugt.}
  12586.               {keines}
  12587. \errentry{  10}{Kurzadressierung m"oglich}
  12588.               {Warnung}
  12589.               {bei 680x0-, 6502- und 68xx-Prozessoren k"onnen
  12590.                bestimmte Speicherbereiche mit kurzen Adressen erreicht
  12591.                werden.  Um keine Phasenfehler zu erzeugen, wird zwar der
  12592.                k"urzere Ausdruck erzeugt, der freie Platz wird aber mit
  12593.                NOPs aufgef"ullt.}
  12594.               {keines}
  12595. \errentry{  20}{kurzer Sprung m"oglich}
  12596.               {Warnung}
  12597.               {Bei 680x0 und 8086-Prozessoren kann der Sprung
  12598.                sowohl mit langem als auch kurzem Displacement ausgef"uhrt
  12599.                werden.  Da kein kurzer Sprung angefordert wurde, wurde im
  12600.                ersten Pass Platz f"ur den langen Sprung freigehalten.
  12601.                Es wird ein kurzer Sprung erzeugt, der freie Platz wird
  12602.                mit NOPs aufgef"ullt, um Phasenfehler zu vermeiden.}
  12603.               {keines}
  12604. \errentry{  25}{relativer Sprung m"oglich}
  12605.               {Warnung}
  12606.               {Spr"unge k"onnen beim Z80 sowohl absolut als auch relativ
  12607.                ausgef"uhrt werden.  In diesem Fall wurde ein absoluter
  12608.                Sprung angefordert, ein(k"urzerer) relativer w"are aber
  12609.                m"oglich.}
  12610.               {das Sprungargument}
  12611. \errentry{  30}{kein Sharefile angelegt, SHARED ignoriert}
  12612.               {Warnung}
  12613.               {Es wurde eine \tty{SHARED}-Anweisung gefunden, es
  12614.                wurde aber keine Kommandozeilenoption angegeben, um eine
  12615.                Shared-Datei zu erzeugen.}
  12616.               {keines}
  12617. \errentry{  40}{FPU liest Wert evtl. nicht korrekt ein ($>$=1E1000)}
  12618.               {Warnung}
  12619.               {Das BCD-Gleitkommaformat der 680x0-Koprozessoren
  12620.                erlaubt zwar vierstellige Exponenten, lt. Datenbuch
  12621.                k"onnen solche Werte aber nicht korrekt eingelesen werden.
  12622.                Der vierstellige Wert wird zwar erzeugt, eine Funktion ist
  12623.                aber nicht gew"ahleistet.}
  12624.               {keines}
  12625. \errentry{  50}{Privilegierte Anweisung}
  12626.               {Warnung}
  12627.               {Es wurde eine Anweisung benutzt, die nur im
  12628.                Supervisor-Mode zul"assig ist, obwohl dieser nicht mittels
  12629.                \tty{SUPMODE ON} vorher explizit angezeigt wurde.}
  12630.               {keines}
  12631. \errentry{  60}{Distanz 0 nicht bei Kurzsprung erlaubt (NOP erzeugt)}
  12632.               {Warnung}
  12633.               {Ein kurzer Sprung mit der Distanz 0 ist bei
  12634.                680x0- bzw. COP8-Prozessoren nicht erlaubt, da dieser Sonderwert f"ur
  12635.                lange Spr"unge ben"otigt wird.  Stattdessen wurde ein
  12636.                NOP-Befehl eingef"ugt.}
  12637.               {keines}
  12638. \errentry{  70}{Symbol aus falschem Segment}
  12639.               {Warnung}
  12640.               {Das in dem Operanden benutzte Symbol
  12641.                ist aus einem Adre"sraum, der nicht mit dem benutzten
  12642.                Befehl bearbeitet werden kann.}
  12643.               {keines}
  12644. \errentry{  75}{Segment nicht adressierbar}
  12645.               {Warnung}
  12646.               {Das in dem Operanden benutzte Symbol
  12647.                ist aus einem Adre"sraum, der mit keinem der Segmentregister
  12648.                des 8086 adressiert werden kann.}
  12649.               {Name des nicht adressierbaren Segments}
  12650. \errentry{  80}{"Anderung des Symbolwertes erzwingt zus"atzlichen Pass}
  12651.               {Warnung}
  12652.               {Ein Symbol hat einen anderen Wert zugewiesen
  12653.                bekommen als im vorhergehenden Pass.  Diese Warnung wird
  12654.                nur ausgegeben, falls die \tty{r}-Option angegeben wurde.}
  12655.               {Der Name des fraglichen Symbols}
  12656. \errentry{  90}{"Uberlappende Speicherbelegung}
  12657.               {Warnung}
  12658.               {Bei der Bildung der Belegungsliste wurde
  12659.                festgestellt, da"s ein Speicherbereich im Codesegment
  12660.                mehrfach benutzt wurde.  Ursache k"onnen un"uberlegte
  12661.                \tty{ORG}-Anweisungen sein.}
  12662.               {keines}
  12663. \errentry{  95}{"Uberlappende Registernutzung}
  12664.               {Warnung}
  12665.               {In der Anweisung wurden Register ganz oder teilweise
  12666.                mehrfach in nicht zul"assiger Weise verwendet.}
  12667.               {Das den Konflikt ausl"osende Argument}
  12668. \errentry{ 100}{keine CASE-Bedingung zugetroffen}
  12669.               {Warnung}
  12670.               {bei einem \tty{SWITCH}..\tty{CASE}-Konstrukt ohne
  12671.                \tty{ELSECASE}-Zweig traf keiner der \tty{CASE}-Zweige zu.}
  12672.               {keines}
  12673. \errentry{ 110}{Seite m"oglicherweise nicht adressierbar}
  12674.               {Warnung}
  12675.               {Das in dem Operanden benutzte Symbol
  12676.                liegt nicht in der momentan mit \tty{ASSUME} eingestellten
  12677.                Fenster (ST6,78(C)10).}
  12678.               {keines}
  12679. \errentry{ 120}{Registernummer mu"s gerade sein}
  12680.               {Warnung}
  12681.               {Die Hardware erlaubt nur ein Registerpaar
  12682.                zu verketten, dessen Startadresse gerade ist (RR0, RR2...,
  12683.                nur Z8).}
  12684.               {keines}
  12685. \errentry{ 130}{veralteter Befehl}
  12686.               {Warnung}
  12687.               {Der verwendete Befehl ist zwar noch
  12688.                definiert, ist in seiner Funktion aber durch andere,
  12689.                neue Befehle ersetzbar und daher in zuk"unftigen
  12690.                Prozessorversionen eventuell nicht mehr vorhanden.}
  12691.               {keines}
  12692. \errentry{ 140}{Nicht vorhersagbare Ausf"uhrung dieser Anweisung}
  12693.               {Warnung}
  12694.               {Die verwendete Adressierungsart ist bei
  12695.                diesem Befehl zwar prinzipiell erlaubt, ein Register
  12696.                wird jedoch in einer Weise doppelt verwendet, da"s je
  12697.                nach Aus"uhrungsreihenfolge sich unterschiedliche
  12698.                Ergebnisse einstellen k"onnen.}
  12699.               {keines}
  12700. \errentry{ 150}{Lokaloperator au"serhalb einer Sektion "uberfl"ussig}
  12701.               {Warnung}
  12702.               {Ein vorangestellter Klammeraffe dient
  12703.                dazu, sich explizit auf zu der Sektion lokale Symbole
  12704.                zu beziehen.  Wenn man sich au"serhalb einer Sektion
  12705.                befindet, gibt es keine lokalen Symbole, weshalb dieser
  12706.                Operator "uberfl"ussig ist.}
  12707.               {keines}
  12708. \errentry{ 160}{sinnlose Operation}
  12709.               {Warnung}
  12710.               {Die Anweisung ergibt entweder "uberhaupt
  12711.                keinen Sinn oder kann auf andere Weise schneller und k"urzer
  12712.                ausgef"uhrt werden.}
  12713.               {keines}
  12714. \errentry{ 170}{unbekannter Symbolwert erzwingt zus"atzlichen Pass}
  12715.               {Warnung}
  12716.               {\asname{} vermutet eine Vorw"artsreferenz eines
  12717.                Symbols, d.h. das Symbol wird benutzt, bevor es definiert
  12718.                wurde, und h"alt einen weiteren Pass f"ur unumg"anglich.
  12719.                Diese Warnung wird nur ausgegeben, falls die \tty{r}-Option
  12720.                angegeben wurde.}
  12721.               {Der Name des fraglichen Symbols}
  12722. \errentry{ 180}{Adresse nicht ausgerichtet}
  12723.               {Warnung}
  12724.               {Eine Adresse ist nicht ein mehrfaches der
  12725.                Operandengr"o"se.  Das Datenbuch verbietet zwar solche Zugriffe,
  12726.                im Instruktionswort ist aber Platz f"ur diese Adresse, so da"s
  12727.                \asname{} es bei einer Warnung belassen hat.}
  12728.               {keines}
  12729. \errentry{ 190}{I/O-Adresse darf nicht verwendet werden}
  12730.               {Warnung}
  12731.               {Der verwendete Adressierungsmodus oder die
  12732.                angesprochene Adresse sind zwar prinzipiell erlaubt, die
  12733.                Adresse liegt aber im Bereich der Peripherieregister, die in
  12734.                diesem Zusammenhang nicht verwendet werden d"urfen.}
  12735.               {keines}
  12736. \errentry{ 200}{m"ogliche Pipeline-Effekte}
  12737.               {Warnung}
  12738.               {Ein Register wird in einer Befehlsfolge so
  12739.                verwendet, da"s die Befehlsausf"uhrung m"oglicherweise nicht
  12740.                in der hingeschriebenen Form ablaufen wird.  "Ublicherweise
  12741.                wird ein Register benutzt, bevor der neue Wert zur Verf"ugung
  12742.                steht.}
  12743.               {das die Verklemmung verursachende Register}
  12744. \errentry{ 210}{mehrfache Adre"sregisterbenutzung in einer Anweisung}
  12745.               {Warnung}
  12746.               {Ein Adre"sregister wird in mehreren
  12747.                Adre"sausdr"ucken eines Befehls benutzt.  Sofern einer der
  12748.                beiden Ausdr"ucke das Register modifiziert, sind die
  12749.                Ergebnisadressen nicht eindeutig festgelegt.}
  12750.               {das mehrfach verwendete Register}
  12751. \errentry{ 220}{Speicherstelle ist nicht bitadressierbar}
  12752.               {Warnung}
  12753.               {Mit einer \tty{SFRB}-Anweisung wurde
  12754.                versucht, eine Speicherstelle als bitadressierbar zu
  12755.                deklarieren, die aufgrund der Architektur des 8051 nicht
  12756.                bitadressierbar ist.}
  12757.               {keines}
  12758. \errentry{ 230}{Stack ist nicht leer}
  12759.               {Warnung}
  12760.               {Am Ende eines Durchlaufes ist ein vom
  12761.                Programm definierter Stack nicht leer.}
  12762.               {der Name des Stacks sowie seine Resttiefe}
  12763. \errentry{ 240}{NUL-Zeichen in Strings, Ergebnis undefiniert}
  12764.                {Warnung}
  12765.                {Eine String-Konstante enth"alt ein
  12766.                NUL-Zeichen. Dies funktioniert zwar mit der Pascal-Version,
  12767.                in Hinblick auf die C-Version von \asname{} ist dies aber ein Problem,
  12768.                da C Strings mit einem NUL-Zeichen terminiert, d.h. der String
  12769.                w"are f"ur C an dieser Stelle zu Ende...}
  12770.                {keines}
  12771. \errentry{ 250}{Befehl "uberschreitet Seitengrenze}
  12772.                {Warnung}
  12773.                {Ein Befehl steht zu Teilen auf
  12774.                verschiedenen Seiten.  Da der Programmz"ahler des Prozessors
  12775.                aber nicht "uber Seitengrenzen hinweg inkrementiert wird,
  12776.                w"urde zur Laufzeit anstelle des Instruktionsbytes von der
  12777.                Folgeseite wieder das erste Byte der alten Seite geholt; das
  12778.                Programm w"urde fehlerhaft ablaufen.}
  12779.                {keines}
  12780. \errentry{ 255}{Bereichsunterschreitung}
  12781.               {Warnung}
  12782.               {Ein Zahlenwert lag unterhalb des erlaubten Bereichs.  \asname{}
  12783.                hat den Wert durch ein Abschneiden der oberen Bitstellen
  12784.                in den erlaubten Bereich gebracht, es ist jedoch nicht
  12785.                garantiert, da"s sich durch diese Operation sinnvoller und
  12786.                korrekter Code ergibt.}
  12787.               {keines}
  12788. \errentry{ 260}{Bereichs"uberschreitung}
  12789.               {Warnung}
  12790.               {Ein Zahlenwert lag oberhalb des erlaubten Bereichs.  \asname{}
  12791.                hat den Wert durch ein Abschneiden der oberen Bitstellen
  12792.                in den erlaubten Bereich gebracht, es ist jedoch nicht
  12793.                garantiert, da"s sich durch diese Operation sinnvoller und
  12794.                korrekter Code ergibt.}
  12795.               {keines}
  12796. \errentry{ 270}{negatives Argument f"ur DUP}
  12797.               {Warnung}
  12798.               {Das Wiederholungsargument einer \tty{DUP}-Direktive war
  12799.                kleiner als 0.  Es werden (analog zu einem Argument von
  12800.                genau 0) keine Daten abgelegt.}
  12801.               {keines}
  12802. \errentry{ 280}{einzelner X-Operand wird als indizierte und nicht als
  12803.                implizite Adressierung interpretiert}
  12804.               {Warnung}
  12805.               {Ein einzelner X-Operand kann sowohl als Register X als
  12806.                auch X-indizierte Adressierung mit Null-Displacement
  12807.                interpretiert werden, da sich Motorola hier nicht festlegt.
  12808.                \asname{} w"ahlt die letztere Variante, was m"oglicherweise nicht
  12809.                das erwartete ist.}
  12810.               {keines}
  12811. \errentry{ 300}{Bit-Nummer wird abgeschnitten werden}
  12812.               {Warnung}
  12813.               {Die Instruktion arbeitet nur auf Byte- bzw.
  12814.                Langwort-Operanden, Bitnummern jenseits 7 bzw. 31 werden
  12815.                von der CPU modulo-8 bzw. modulo-32 behandelt werden.}
  12816.               {keines}
  12817. \errentry{ 310}{Ung"ultiger Wert f"ur Registerzeiger}
  12818.               {Warnung}
  12819.               {G"ultige bzw. sinnvolle Werte f"ur den Registerzeiger sind
  12820.                nur Werte von 0x00...0x70 bzw. 0xf0, weil die anderen
  12821.                Registerbereiche unbelegt sind.}
  12822.               {keines}
  12823. \errentry{ 320}{Makro-Argument umdefiniert}
  12824.               {Warnung}
  12825.               {Einem Makroparameter wurden zwei oder mehr
  12826.                verschiedene Werte zugewiesen.  Dies kann bei der
  12827.                Verwendung von Schl"usselwortparametern auftreten.
  12828.                Das zuletzt angegebene Argument wird benutzt.}
  12829.               {Name des Makroparameters}
  12830. \errentry{ 330}{veraltete Anweisung}
  12831.               {Warnung}
  12832.               {Dies Anweisung ist veraltet und sollte nicht mehr
  12833.                in neuen Programmen verwendet werden.}
  12834.               {Die Anweisung, die stattdessen verwendet werden sollte.}
  12835. \errentry{ 340}{Quelloperand l"anger oder gleich Zieloperand}
  12836.               {Warnung}
  12837.               {Der Quelloperand ist l"anger oder gleich gro"s wie der
  12838.                Zieloperand, gemessen in Bits.  Eine Null- oder Vorzeichenerweiterung
  12839.                ergibt keinen Sinn mit diesen Argumenten.  Schlagen Sie im
  12840.                Referenzhandbuch der CPU das Verhalten in diesem Fall nach.}
  12841.               {keines}
  12842. \errentry{ 350}{TRAP-Nummer ist g"ultige Instruktion}
  12843.               {Warnung}
  12844.               {Ein TRAP mit dieser Nummer benutzt den gleichen Maschinencode
  12845.                wie ein von der CPU unterst"utzter Maschinenbefehl.}
  12846.               {keines}
  12847. \errentry{ 360}{Padding hinzugef"ugt}
  12848.               {Warnung}
  12849.               {Die Menge abgelegter Bytes ist ungerade; eine H"alfte des letzten
  12850.                16-Bit-Wortes bleibt ungenutzt.}
  12851.               {keines}
  12852. \errentry{ 370}{Registernummer-Umlauf}
  12853.               {Warnung}
  12854.               {Die Startregisternummer plus die Anzahl der Register ergibt ein
  12855.                letztes Register jenseits des Endes der Registerbank.}
  12856.               {das Argument mit der Registeranzahl}
  12857. \errentry{ 380}{verwende indizierte anstelle indirekter Adressierung}
  12858.               {Warnung}
  12859.               {Indirekte Adressierung ist an dieser Stelle nicht erlaubt.
  12860.                Es wird stattdessen indizierte Adressierung mit einem
  12861.                (Dummy-)Displacement von Null verwendet.}
  12862.               {das Argument mit dem Adressierungsausdruck}
  12863. \errentry{ 390}{nicht im Normal-Modus erlaubt}
  12864.               {Warnung}
  12865.               {Dieser Maschinenbefehl ist nur im Panel-Modus und nicht
  12866.                im ,,Normalbetrieb'' erlaubt.}
  12867.               {die fragliche Instruktion}
  12868. \errentry{ 400}{nicht im Panel-Modus erlaubt}
  12869.               {Warnung}
  12870.               {Dieser Maschinenbefehl ist nur im ,,Nornalbetrieb''
  12871.                und nicht im Panel-Modus erlaubt.}
  12872.               {die fragliche Instruktion}
  12873. \errentry{ 410}{Argument ausserhalb erlauben Bereichs}
  12874.               {Warnung}
  12875.               {Das Argument oder die Summe zweier Argumente
  12876.                liegt au"serhalb des f"ur diesen Befehls erlaubten
  12877.                Bereichs, obwohl in der Instruktion prinzipiell
  12878.                Raum f"ur gr"o"sere Werte ist.}
  12879.               {das fragliche Argument}
  12880. \errentry{ 420}{Versuch, eine Mehrwort-Instruktion zu "uberspringen}
  12881.               {Warnung}
  12882.               {Die vorherige Anweisung war eine Skip-Anweisung, die
  12883.                nur ein Maschinenwort im Code "uberspringen kann. Da
  12884.                die aktuelle Anweisung l"anger als ein Maschinenwort
  12885.                ist, w"urde der Skip mitten in die Anweisung springen.}
  12886.               {die fragliche Anweisung}
  12887. \errentry{ 430}{implizite Vorzeichenerweiterung}
  12888.               {Warnung}
  12889.               {Der Prozessor f"uhrt bei diesem Befehl eine Vorzeichenerweiterung
  12890.                auf die volle Registerbreite aus.  Das bedeutet, dass
  12891.                die oberen Bits f"ur das gegebene Argument mit 1 und
  12892.                nicht mit 0 gef"ullt werden.  Je nach folgender Nutzung
  12893.                kann dies irrelevant sein, mu"s aber nicht.}
  12894.               {der fragliche Wert}
  12895. \errentry{ 440}{numerischer Wert -128 bedeutet Nutzung des E-Registers (Literal 'E' verwenden, um diese Warnung zu vermeiden)}
  12896.               {Warnung}
  12897.               {Ein Displacement von -128 bedeutet beim SC/MP in diesem Fall, dass
  12898.                das Displacement aus dem E-Register genommen wird.  Der Assembler
  12899.                kann in diesem Fall nicht sicher entscheiden, ob das gewollt ist
  12900.                oder der Wert -128 sich unbeabsichtigt aus einer Berechnung ergeben
  12901.                hat.  Verwenden Sie stattdessen das Literal 'E' oder ein auf 'E'
  12902.                definiertes Registersymbol, um die Absicht klar zu machen und die
  12903.                Warnung zu vermeiden.}
  12904.               {das fragliche Displacement-Argument}
  12905. \errentry{ 450}{I/O-Adresse mu"s mit INS/OUTS angesprochen werden}
  12906.               {Warnung}
  12907.               {I/O-Adressen im Bereich des Prozessormoduls (0..3) k"onnen nur
  12908.                "uber die Befehle {\tt INS} und {\tt OUTS} erreicht werden,
  12909.                nicht "uber {\tt IN} und {\tt OUT}.}
  12910.               {das fragliche Adress-Argument}
  12911. \errentry{ 460}{CASE-Limit passt nicht zur Anzahl der Sprungadressen}
  12912.               {Warnung}
  12913.               {Die CASE-Anweisung erwartet eine Sprungtabelle mit so vielen
  12914.                Eintr"agen, wie das Limit-Argument plus eins angibt.  Limit-Wert
  12915.                und Anzahl der Sprungadressen passen nicht zueinander.}
  12916.               {das Limit-Argument}
  12917. \errentry{ 470}{Befehl als NOP assembliert}
  12918.               {Warnung}
  12919.               {Der dieser Anweisung eigentlich zugewiesene Opcode wird anderweitig
  12920.                verwendet.  Da die Anweisung ohnehin nichts bewirkt, wird sie stattdessen
  12921.                als NOP assembliert.}
  12922.               {keines}
  12923. \errentry{ 480}{Argument wird als Vektor behandelt}
  12924.               {Warnung}
  12925.               {Anhand des Arguments kann nicht zweifelsfrei entschieden werden, ob
  12926.                es sich um eine Adresse oder einen Vektor handelt.  Da das Argument eine
  12927.                reine Zahl und keinem Segment zugeordnet ist, wird es als Vektor behandelt.}
  12928.               {das fragliche Argument}
  12929. \errentry{ 490}{Zu grosse Integer-Konstante wird als Gleitkomma interpretiert}
  12930.               {Warnung}
  12931.               {Das Argument ist zwar eine syntaktisch korrekte Ganzzahl-Konstante, ihr
  12932.                Wert ist aber au"serhalb dessen, was intern als Ganzzahl dargestellt
  12933.                werden kann.  Die Zahl wird deswegen als Gleitkomma-Zahl gespeichert.}
  12934.               {das fragliche Argument}
  12935. \errentry{1000}{Symbol doppelt definiert}
  12936.               {Fehler}
  12937.               {Einem Symbol wurde durch ein Label oder
  12938.                 \tty{EQU}, \tty{PORT}, \tty{SFR}, \tty{LABEL},
  12939.                 \tty{SFRB} oder \tty{BIT} ein neuer  Wert zugewiesen, dies
  12940.                ist aber nur bei \tty{SET/EVAL} erlaubt.}
  12941.               {Name des fraglichen Symbols, bei eingeschalteter
  12942.                 Querverweisliste zus"atzlich die Zeile der ersten Definition}
  12943. \errentry{1010}{Symbol nicht definiert}
  12944.               {Fehler}
  12945.               {Ein benutztes Symbol ist auch im 2.Pass noch
  12946.                nicht in der Symboltabelle enthalten.}
  12947.               {Name des nicht gefundenen Symbols}
  12948. \errentry{1020}{ung"ultiger Symbolname}
  12949.               {Fehler}
  12950.               {Ein Symbolname entspricht nicht den Bedingungen
  12951.                f"ur einen g"ultigen Symbolnamen.  Beachten Sie, da"s f"ur
  12952.                Makro-und Funktionsparameter strengere Regeln gelten!}
  12953.               {der fehlerhafte Symbolname}
  12954. \errentry{1030}{reservierter Symbolname}
  12955.               {Fehler}
  12956.               {Der Symbolname ist zwar an sich g"ultig, dieser spezielle
  12957.                Name ist aber f"ur andere Zwecke reserviert, und kann nicht
  12958.                f"ur selbst definierte Symbole verwendet werden.}
  12959.               {der reservierte Symbolname}
  12960. \errentry{1090}{Ung"ultiges Format}
  12961.               {Fehler}
  12962.               {Das benutzte Befehlsformat existiert bei diesem
  12963.                Befehl nicht.}
  12964.               {Der Kennbuchstabe des verwendeten Formates}
  12965. \errentry{1100}{"Uberfl"ussiges Attribut}
  12966.               {Fehler}
  12967.               {Der benutzte Befehl (Prozessor oder Pseudo) darf
  12968.                kein mit einem Punkt angeh"angtes Attribut haben.}
  12969.               {keines}
  12970. \errentry{1105}{Attribut darf nur 1 Zeichen lang sein}
  12971.               {Fehler}
  12972.               {Das mit einem Punkt an einen Befehl angeh"angte
  12973.                Attribut mu"s genau ein Zeichen lang sein; weder mehr noch
  12974.                weniger ist erlaubt.}
  12975.               {keines}
  12976. \errentry{1107}{undefiniertes Attribut}
  12977.               {Fehler}
  12978.               {Das an einem Befehl angef"ugte Attribut ist ung"ultig.}
  12979.               {keines}
  12980. \errentry{1110}{Unpassende Operandenzahl}
  12981.               {Fehler}
  12982.               {Die bei einem Befehl (Prozessor oder Pseudo)
  12983.                angegebene Operandenzahl liegt nicht in dem f"ur diesen
  12984.                Befehl erlaubten Bereich.}
  12985.               {Die erwartete Anzahl Argumente bzw. Operanden}
  12986. \errentry{1112}{Kann Argument nicht in Teile aufspaltenl}
  12987.               {Fehler}
  12988.               {Bei bestimmten Prozessoren (z.B. DSP56000)
  12989.                m"ussen die kommaseparierten Argumente weiter in
  12990.                Einzeloperanden aufgespalten werden, diese ist
  12991.                fehlgeschlagen.}
  12992.               {keines}
  12993. \errentry{1115}{Unpassende Optionenzahl}
  12994.               {Fehler}
  12995.               {Die bei diesem Befehl angegebene Zahl
  12996.                 von Optionen liegt nicht in dem f"ur diesen
  12997.                Befehl erlaubten Bereich.}
  12998.               {keines}
  12999. \errentry{1120}{nur immediate-Adressierung erlaubt}
  13000.               {Fehler}
  13001.               {Der benutzte Befehl l"a"st nur
  13002.                immediate-Operanden (mit vorangestelltem \#) zu.}
  13003.               {keines}
  13004. \errentry{1130}{Unpassende Operandengr"o"se}
  13005.               {Fehler}
  13006.               {Der Operand hat zwar einen f"ur den Befehl
  13007.                zugelassenen Typ, jedoch nicht die richtige L"ange (in
  13008.                Bits).}
  13009.               {keines}
  13010. \errentry{1131}{Widersprechende Operandengr"o"sen}
  13011.               {Fehler}
  13012.               {Die angegebenen Operanden haben unterschiedliche
  13013.                L"angen (in Bit).}
  13014.               {keines}
  13015. \errentry{1132}{Undefinierte Operandengr"o"se}
  13016.               {Fehler}
  13017.               {Aus Opcode und Operanden l"a"st sich die
  13018.                Operandengr"o"se nicht eindeutig bestimmen (ein Problem
  13019.                des 8086-Assemblers).  Sie m"ussen die Operandengr"o"se
  13020.                durch einen \tty{BYTE}, \tty{WORD}, usw. \tty{PTR}-Pr"afix
  13021.                 festlegen.}
  13022.               {keines}
  13023. \errentry{1133}{Ganzzahl oder String erwartet, aber Gleitkommazahl erhalten}
  13024.               {Fehler}
  13025.               {An dieser Stelle kann keine Gleitkommazahl als Argument
  13026.                verwendet werden.}
  13027.               {das fehlerhafte Argument}
  13028. \errentry{1134}{Ganzzahl erwartet, aber Gleitkommazahl erhalten}
  13029.               {Fehler}
  13030.               {An dieser Stelle kann keine Gleitkommazahl als Argument
  13031.                verwendet werden.}
  13032.               {das fehlerhafte Argument}
  13033. \errentry{1136}{Gleitkommazahl erwartet, aber String erhalten}
  13034.               {Fehler}
  13035.               {An dieser Stelle kann kein String als Argument
  13036.                verwendet werden.}
  13037.               {das fehlerhafte Argument}
  13038. \errentry{1137}{Operandentyp-Diskrepanz}
  13039.               {Fehler}
  13040.               {Die beiden Argumente eines Operanden haben nicht
  13041.                den gleichen Datentyp (Integer/Gleitkomma/String).}
  13042.               {keines}
  13043. \errentry{1138}{String erwartet, aber Ganzzahl erhalten}
  13044.               {Fehler}
  13045.               {An dieser Stelle kann keine Ganzzahl als Argument
  13046.                verwendet werden.}
  13047.               {das fehlerhafte Argument}
  13048. \errentry{1139}{String erwartet, aber Gleitkommazahl erhalten}
  13049.               {Fehler}
  13050.               {An dieser Stelle kann keine Gleitkommazahl als Argument
  13051.                verwendet werden.}
  13052.               {das fehlerhafte Argument}
  13053. \errentry{1140}{zu viele Argumente}
  13054.               {Fehler}
  13055.               {Einem Befehl wurden mehr als die unter \asname{}
  13056.                zul"assigen 20 Parameter "ubergeben.}
  13057.               {keines}
  13058. \errentry{1141}{Ganzzahl erwartet, aber String erhalten}
  13059.               {Fehler}
  13060.               {An dieser Stelle kann kein String als Argument
  13061.                verwendet werden.}
  13062.               {das fehlerhafte Argument}
  13063. \errentry{1142}{Ganz- oder Gleitkommazahl erwartet, aber String erhalten}
  13064.               {Fehler}
  13065.               {An dieser Stelle kann kein String als Argument
  13066.                verwendet werden.}
  13067.               {das fehlerhafte Argument}
  13068. \errentry{1143}{String erwartet}
  13069.               {Fehler}
  13070.               {An dieser Stelle kann nur ein (in einfachen Hochkommas
  13071.                eingeschlossener) String als Argument verwendet werden.}
  13072.               {das fehlerhafte Argument}
  13073. \errentry{1144}{Ganzzahl erwartet}
  13074.               {Fehler}
  13075.               {An dieser Stelle kann nur eine ganze Zahl als Argument
  13076.                verwendet werden.}
  13077.               {das fehlerhafte Argument}
  13078. \errentry{1145}{Ganz-, Gleitkommazahl oder String erwartet, aber Register bekommen}
  13079.               {Fehler}
  13080.               {An dieser Stelle kann kein Registersymbol als Argument verwendet werden.}
  13081.               {das fehlerhafte Argument}
  13082. \errentry{1146}{Ganzzahl oder String erwartet}
  13083.               {Fehler}
  13084.               {An dieser Stelle kann keine Gleitkommazahl oder Registersymbol als Argument verwendet werden.}
  13085.               {das fehlerhafte Argument}
  13086. \errentry{1147}{Register erwartet}
  13087.               {Fehler}
  13088.               {An dieser Stelle kann nur ein Register als Argument verwendet werden.}
  13089.               {das fehlerhafte Argument}
  13090. \errentry{1148}{Registersymbol f"ur anderes Ziel}
  13091.               {Fehler}
  13092.               {Das angesprochene Registersymbol wurde f"ur einen anderen Zielprozessor
  13093.                als den aktuell verwendeten definiert und ist nicht kompatibel.}
  13094.               {das fehlerhafte Argument}
  13095. \errentry{1149}{Gleitkomma-Argument erwartet, aber Ganzzahl bekommen}
  13096.               {Fehler}
  13097.               {An dieser Stelle kann kein Ganzzahl-, sondern nur ein Gleitkomma-
  13098.                Argument verwendet werden.}
  13099.               {das fehlerhafte Argument}
  13100. \errentry{1151}{Ganz- oder Gleitkommazahl erwartet, aber Register bekommen}
  13101.               {Fehler}
  13102.               {An dieser Stelle kann kein Register, sondern nur eine Ganz-
  13103.                oder Gleitkommazahl als Argument verwendet werden.}
  13104.               {das fehlerhafte Argument}
  13105. \errentry{1152}{Ganzzahl oder String erwartet, aber Register bekommen}
  13106.               {Fehler}
  13107.               {An dieser Stelle kann kein Register, sondern nur eine Ganzzahl
  13108.                 oder ein String als Argument verwendet werden.}
  13109.               {das fehlerhafte Argument}
  13110. \errentry{1153}{Ganzzahl erwartet, aber Register bekommen}
  13111.               {Fehler}
  13112.               {An dieser Stelle kann kein Register, sondern nur eine Ganzzahl
  13113.                als Argument verwendet werden.}
  13114.               {das fehlerhafte Argument}
  13115. \errentry{1154}{String zu lang}
  13116.               {Fehler}
  13117.               {Dieser String ist zu lang, als da"s er mit vorangestelltem
  13118.                L"angen-Byte dargestellt werden k"onnte.}
  13119.               {das fehlerhafte Argument}
  13120. \errentry{1200}{Unbekannter Befehl}
  13121.               {Fehler}
  13122.               {Der benutzte Befehl ist weder ein Pseudobefehl
  13123.                von \asname{} noch ein Befehl des momentan eingestellten
  13124.                Prozessors.}
  13125.               {keines}
  13126. \errentry{1300}{Klammerfehler}
  13127.               {Fehler}
  13128.               {Der Formelparser ist auf einen (Teil-)Ausdruck
  13129.                gesto"sen, in dem die Summe "offnender und schlie"sender
  13130.                Klammern nicht "ubereinstimmt.}
  13131.               {der beanstandete (Teil-)Ausdruck}
  13132. \errentry{1310}{Division durch 0}
  13133.               {Fehler}
  13134.               {Bei einer Division oder Modulooperation ergab
  13135.                die Auswertung des rechten Teilausdruckes 0.}
  13136.               {keines}
  13137. \errentry{1315}{Bereichsunterschreitung}
  13138.               {Fehler}
  13139.               {Der angegebene Integer-Wert unterschreitet
  13140.                den zul"assigen Bereich.}
  13141.               {aktueller Wert und zul"assiges Minimum
  13142.                 (manchmal, ich stelle das seit Jahren um...)}
  13143. \errentry{1320}{Bereichs"uberschreitung}
  13144.               {Fehler}
  13145.               {Der angegebene Integer-Wert "uberschreitet
  13146.                den zul"assigen Bereich.}
  13147.               {aktueller Wert und zul"assiges Maximum
  13148.                 (manchmal, ich stelle das seit Jahren um...)}
  13149. \errentry{1322}{keine Zweierpotenz}
  13150.               {Fehler}
  13151.               {Hier sind nur Zweierpotenzen (1,2,4,8...)
  13152.                als Wert erlaubt}
  13153.               {der fragliche Wert}
  13154. \errentry{1323}{ung"ultige Dezimalstelle}
  13155.               {Fehler}
  13156.               {Ein String als Argument zu {\tt PACKED} darf nur
  13157.                die Ziffern 0 bis 9 enthalten, sowie ein Plus- oder
  13158.                Minuszeiche nzu Anfang.}
  13159.               {das fragliche Argument}
  13160. \errentry{1324}{Dezimalstring zu lang}
  13161.               {Fehler}
  13162.               {Eine gepackte Dezimalzahl darf maximal 31 Stellen
  13163.                lang sein.}
  13164.               {das fragliche Argument}
  13165. \errentry{1325}{Adresse nicht ausgerichtet}
  13166.               {Fehler}
  13167.               {Die angegebene direkte Speicheradresse
  13168.                entspricht nicht den Anspr"uchen des Datentransfers, d.h.
  13169.                ist nicht ein mehrfaches der Operandengr"o"se.  Nicht alle
  13170.                Prozessoren erlauben unausgerichtete Datenzugriffe.}
  13171.               {keines}
  13172. \errentry{1330}{Distanz zu gro"s}
  13173.               {Fehler}
  13174.               {Der in einem Adre"sausdruck enthaltene
  13175.                Displacement-Wert ist zu gro"s.}
  13176.               {keines}
  13177. \errentry{1331}{Ziel nicht auf gleicher Seite}
  13178.               {Fehler}
  13179.               {Befehl und Operandenadresse m"ussen
  13180.                auf der gleichen Seite liegen.}
  13181.               {das fragliche Adre"s-Argument}
  13182. \errentry{1340}{Kurzadressierung nicht m"oglich}
  13183.               {Fehler}
  13184.               {Die Adresse des Operanden liegt au"serhalb des
  13185.                Speicherbereiches, in dem Kurzadressierung m"oglich ist.}
  13186.               {keines}
  13187. \errentry{1350}{Unerlaubter Adressierungsmodus}
  13188.               {Fehler}
  13189.               {Der benutzte Adressierungsmodus existiert
  13190.                generell zwar, ist an dieser Stelle aber nicht erlaubt.}
  13191.               {keines}
  13192. \errentry{1351}{Adresse mu"s gerade sein}
  13193.               {Fehler}
  13194.               {An dieser Stelle sind nur gerade Adressen erlaubt,
  13195.                da das unterste Bit f"ur andere Zwecke verwendet wird
  13196.                oder reserviert ist.}
  13197.               {das fragliche Argument}
  13198. \errentry{1352}{Adresse mu"s ausgerichtet sein}
  13199.               {Fehler}
  13200.               {An dieser Stelle sind nur ausgerichtete
  13201.                (d.h glatt durch 2, 4, 8... teilbare) Adressen erlaubt,
  13202.                da die untersten Bits f"ur andere Zwecke verwendet werden
  13203.                oder reserviert sind.}
  13204.               {das fragliche Argument}
  13205. \errentry{1355}{Adressierungsmodus im Parallelbetrieb nicht erlaubt}
  13206.               {Fehler}
  13207.               {Die verwendeten Adressierungsmodi
  13208.                sind zwar im sequentiellen Modus zul"assig, jedoch nicht
  13209.                bei parallelen Instruktionen.}
  13210.               {keines}
  13211. \errentry{1360}{undefinierte Bedingung}
  13212.               {Fehler}
  13213.               {Die benutzte Bedingung f"ur bedingte Spr"unge
  13214.                existiert nicht.}
  13215.               {keines}
  13216. \errentry{1365}{inkompatible Bedingungen}
  13217.               {Fehler}
  13218.               {Die benutzte Kombination von Bedingungen kann nicht
  13219.                in einem Befehl verwendet werden.}
  13220.               {die Bedingung, bei der die Unvertr"aglichkeit
  13221.                entdeckt wurde.}
  13222. \errentry{1366}{unbekanntes Flag}
  13223.               {Fehler}
  13224.               {Das angegebene Flag existiert nicht.}
  13225.               {Das Argument mit dem fraglichen Flag}
  13226. \errentry{1367}{doppeltes Flag}
  13227.               {Fehler}
  13228.               {Das angegebene Flag wurde mehrfach in der Liste verwendet.}
  13229.               {Das Argument mit dem doppelten Flag}
  13230. \errentry{1368}{unbekannter Interrupt}
  13231.               {Fehler}
  13232.               {Der angegebene Interrupt existiert nicht.}
  13233.               {Das Argument mit dem fraglichen Interrupt}
  13234. \errentry{1369}{doppelter Interrupt}
  13235.               {Fehler}
  13236.               {Der angegebene Interrupt wurde mehrfach in der Liste verwendet.}
  13237.               {Das Argument mit dem doppelten Interrupt}
  13238. \errentry{1370}{Sprungdistanz zu gro"s}
  13239.               {Fehler}
  13240.               {Sprungbefehl und Sprungziel liegen zu weit
  13241.                auseinander, um mit einem Sprung der benutzten L"ange
  13242.                "uberbr"uckt werden zu k"onnen.}
  13243.               {keines}
  13244. \errentry{1371}{Sprungdistanz ist Null}
  13245.               {Fehler}
  13246.               {Sprungbefehl und Sprungziel liegen direkt hintereinander,
  13247.                und eine Sprungdistanz von null kann nicht kodiert werden.}
  13248.               {Die Zieladresse im Quellcode}
  13249. \errentry{1375}{Sprungdistanz ist ungerade}
  13250.               {Fehler}
  13251.               {Da Befehle nur auf geraden Adressen liegen
  13252.                d"urfen, mu"s eine Sprungdistanz zwischen zwei Befehlen
  13253.                auch immer gerade sein, das Bit 0 der Distanz wird
  13254.                anderweitig verwendet.  Diese Bedingung ist verletzt
  13255.                worden.  Grund ist "ublicherweise die Ablage einer
  13256.                ungeraden Anzahl von Daten in Bytes oder ein falsches \tty{ORG}.}
  13257.               {keines}
  13258. \errentry{1376}{Skip-Ziel passt nicht}
  13259.               {Fehler}
  13260.               {Das angegebene Sprungziel ist nicht die Adresse, die der
  13261.                Prozessor bei Ausf"uhrung der Skip-Anweisung anspringen w"urde.}
  13262.               {die angegebene (beabsichtigte) Sprungadresse}
  13263. \errentry{1380}{ung"ultiges Schiebeargument}
  13264.               {Fehler}
  13265.               {als Argument f"ur die Schiebeamplitude darf nur
  13266.                eine Konstante oder ein Datenregister verwendet werden.
  13267.                (nur 680x0)}
  13268.               {keines}
  13269. \errentry{1390}{Nur Bereich 1..8 erlaubt}
  13270.               {Fehler}
  13271.               {Konstanten f"ur Schiebeamplituden oder
  13272.                \tty{ADDQ}-Argumente d"urfen nur im Bereich 1..8 liegen. (nur
  13273.                680x0)}
  13274.               {keines}
  13275. \errentry{1400}{Schiebezahl zu gro"s}
  13276.               {Fehler}
  13277.               {(nicht mehr verwendet)}
  13278.               {keines}
  13279. \errentry{1410}{Ung"ultige Registerliste}
  13280.               {Fehler}
  13281.               {Das Registerlisten-Argument von \tty{MOVEM}
  13282.                 oder \tty{FMOVEM} hat ein falsches Format. (nur 680x0)}
  13283.               {keines}
  13284. \errentry{1420}{Ung"ultiger Modus mit CMP}
  13285.               {Fehler}
  13286.               {Die verwendete Operandenkombination von \tty{CMP}
  13287.                 ist nicht erlaubt. (nur 680x0)}
  13288.               {keines}
  13289. \errentry{1430}{Ung"ultiger Prozessortyp}
  13290.               {Fehler}
  13291.               {Den mit \tty{CPU} angeforderten Zielprozessor kennt \asname{}
  13292.                nicht.}
  13293.               {der unbekannte Prozessortyp}
  13294. \errentry{1431}{Ung"ultiger FPU-Typ}
  13295.               {Fehler}
  13296.               {Den mit \tty{FPU} angeforderten numerischen Koprozessor kennt \asname{}
  13297.                nicht.}
  13298.               {der unbekannte FPU-Typ}
  13299. \errentry{1432}{Ung"ultiger PMMU-Typ}
  13300.               {Fehler}
  13301.               {Die mit \tty{PMMU} angeforderte MMU kennt \asname{} nicht.}
  13302.               {der unbekannte PMMU-Typ}
  13303. \errentry{1440}{Ung"ultiges Kontrollregister}
  13304.               {Fehler}
  13305.               {Das bei z.B. \tty{MOVEC} benutzte
  13306.                 Kontrollregister  kennt der mit CPU gesetzte Prozessor
  13307.                 (noch) nicht.}
  13308.               {keines}
  13309. \errentry{1445}{Ung"ultiges Register}
  13310.               {Fehler}
  13311.               {Das benutzte Register ist zwar prinzipiell
  13312.                vorhanden, hier aber nicht erlaubt.}
  13313.               {keines}
  13314. \errentry{1446}{Register mehr als einmal gelistet}
  13315.               {Fehler}
  13316.               {Ein Register taucht in der Liste der zu sichernden bzw.
  13317.                wiederherzustellenden Register mehrfach auf.}
  13318.               {keines}
  13319. \errentry{1447}{Register-Bank-Diskrepanz}
  13320.               {Fehler}
  13321.               {In einem Adre"sausdruck werden Register aus unterschiedlichen
  13322.                B"anken verwendet.}
  13323.               {das fragliche Register}
  13324. \errentry{1448}{Registerl"ange undefiniert}
  13325.               {Fehler}
  13326.               {An dieser Stelle k"onnen Register verschiedener L"ange verwendet werden,
  13327.                und die Registerl"ange ist nicht alleine aus der Adresse ableitbar.}
  13328.               {das fragliche Argument}
  13329. \errentry{1449}{ung"ultige Operation auf Register}
  13330.               {Fehler}
  13331.               {Diese Operation kann auf dieses Register nicht angewendet werden, z.B.
  13332.                weil das Register nur gelesen oder nur geschrieben werden darf.}
  13333.               {das fragliche Register}
  13334. \errentry{1450}{RESTORE ohne SAVE}
  13335.               {Fehler}
  13336.               {Es wurde ein \tty{RESTORE}-Befehl gefunden, obwohl
  13337.                kein mit \tty{SAVE} gespeicherter Zustand (mehr) auf dem Stapel
  13338.                vorhanden ist.}
  13339.               {keines}
  13340. \errentry{1460}{fehlendes RESTORE}
  13341.               {Fehler}
  13342.               {Nach der Assemblierung sind nicht alle
  13343.                \tty{SAVE}-Befehle wieder aufgel"ost worden.}
  13344.               {keines}
  13345. \errentry{1465}{unbekannte Makro-Steueranweisung}
  13346.               {Fehler}
  13347.               {Eine beim \tty{MACRO}-Befehl zus"atzlich angegebene
  13348.                Steueranweisung ist \asname{} unbekannt.}
  13349.               {die fragliche Anweisung}
  13350. \errentry{1470}{fehlendes ENDIF/ENDCASE}
  13351.               {Fehler}
  13352.               {Nach der Assemblierung sind nicht alle
  13353.                Konstrukte zur bedingten Assemblierung aufgel"ost
  13354.                worden.}
  13355.               {keines}
  13356. \errentry{1480}{ung"ultiges IF-Konstrukt}
  13357.               {Fehler}
  13358.               {Die Reihenfolge der Befehle in einem \tty{IF}-
  13359.                 oder \tty{SWITCH}-Konstrukt stimmt nicht.}
  13360.               {keines}
  13361. \errentry{1483}{doppelter Sektionsname}
  13362.               {Fehler}
  13363.               {Es existiert bereits eine Sektion gleichen
  13364.                Namens auf dieser Ebene.}
  13365.               {der doppelte Name}
  13366. \errentry{1484}{unbekannte Sektion}
  13367.               {Fehler}
  13368.               {Im momentanen Sichtbarkeitsbereich existiert
  13369.                keine Sektion dieses Namens.}
  13370.               {der unbekannte Name}
  13371. \errentry{1485}{fehlendes ENDSECTION}
  13372.               {Fehler}
  13373.               {Nach Ende eines Durchganges sind nicht alle
  13374.                Sektionen wieder geschlossen worden.}
  13375.               {keines}
  13376. \errentry{1486}{falsches ENDSECTION}
  13377.               {Fehler}
  13378.               {die bei \tty{ENDSECTION} angegebene Sektion
  13379.                 ist nicht die innerste offene.}
  13380.               {keines}
  13381. \errentry{1487}{ENDSECTION ohne SECTION}
  13382.               {Fehler}
  13383.               {Es wurde ein \tty{ENDSECTION}-Befehl gegeben, obwohl
  13384.                gar keine Sektion offen war.}
  13385.               {keines}
  13386. \errentry{1488}{nicht aufgel"oste Vorw"artsdeklaration}
  13387.               {Fehler}
  13388.               {ein mit \tty{FORWARD} oder \tty{PUBLIC}
  13389.                 angek"undigtes Symbol wurde nicht in der Sektion definiert.}
  13390.               {der Name des fraglichen Symbols, plus die
  13391.                Position der Vorw"arts-Deklaration im Quelltext}
  13392. \errentry{1489}{widersprechende FORWARD $\leftrightarrow$PUBLIC-Deklaration}
  13393.               {Fehler}
  13394.               {Ein Symbol wurde sowohl als privat als auch
  13395.                global definiert.}
  13396.               {der Name des Symbols}
  13397. \errentry{1490}{falsche Argumentzahl f"ur Funktion}
  13398.               {Fehler}
  13399.               {Die Anzahl der Argumente f"ur eine
  13400.                selbst definierte Funktion stimmt nicht mit der geforderten
  13401.                Anzahl "uberein.}
  13402.               {keines}
  13403. \errentry{1491}{doppelter Funktions-Argumentenname}
  13404.               {Fehler}
  13405.               {Zwei oder mehrere Argumente einer Funktion haben den gleichen
  13406.                Namen}
  13407.               {das Argument mit dem doppelten Namen}
  13408. \errentry{1495}{unaufgel"oste Literale (LTORG fehlt)}
  13409.               {Fehler}
  13410.               {Am Programmende oder beim Umachalten
  13411.                zu einem anderen Zielprozessor blieben noch nicht
  13412.                abgelegte Literale "ubrig.}
  13413.               {keines}
  13414. \errentry{1500}{Befehl auf dem ... nicht vorhanden}
  13415.               {Fehler}
  13416.               {Der benutzte Befehl existiert zwar
  13417.                grunds"atzlich, das eingestellte Mitglied der
  13418.                Prozessorfamilie beherrscht ihn aber noch nicht.}
  13419.               {Die Prozessorvarianten, die diesen Befehl
  13420.                unterst"utzen w"urden.}
  13421. \errentry{1501}{FPU-Befehle nicht freigeschaltet}
  13422.               {Fehler}
  13423.               {Die FPU-Befehlssatzerweiterungen m"ussen erlaubt
  13424.                werden, um diesen Befehl zu benutzen}
  13425.               {keines}
  13426. \errentry{1502}{PMMU-Befehle nicht freigeschaltet}
  13427.               {Fehler}
  13428.               {Die PMMU-Befehlssatzerweiterungen m"ussen erlaubt
  13429.                werden, um diesen Befehl zu benutzen}
  13430.               {keines}
  13431. \errentry{1503}{voller PMMU-Befehlssatz nicht freigeschaltet}
  13432.               {Fehler}
  13433.               {Dieser Befehl ist nur im Befehlssatz der
  13434.                68851-PMMU enthalten, nicht im reduzierten
  13435.                Befehlssatz der integrierten PMMU.}
  13436.               {keines}
  13437. \errentry{1504}{Z80-Syntax nicht erlaubt}
  13438.               {Fehler}
  13439.               {Dieser Befehl ist nur erlaubt, wenn die
  13440.                Z80-Syntax f"ur 8080/8085-Befehle freigeschaltet
  13441.                wurde.}
  13442.               {keines}
  13443. \errentry{1505}{Adressierungsart auf dem ... nicht vorhanden}
  13444.               {Fehler}
  13445.               {Der benutzte Adressierungsmodus existiert
  13446.                zwar grunds"atzlich, das eingestellte Mitglied der
  13447.                Prozessorfamilie beherrscht ihn aber noch nicht.}
  13448.               {Die Prozessorvarianten, die diesen
  13449.                Adressierungsmodus unterst"utzen w"urden.}
  13450. \errentry{1506}{nicht im Z80-Syntax Exklusiv-Modus erlaubt}
  13451.               {Fehler}
  13452.               {Dieser Befehl ist nicht (mehr) erlaubt, wenn nur
  13453.                noch Z80-Syntax f"ur 8080/8085-Befehle erlaubt
  13454.                wurde.}
  13455.               {keines}
  13456. \errentry{1507}{FPU-Befehl auf dem ... nicht unterst"utzt}
  13457.               {Fehler}
  13458.               {Der benutzte FPU-Befehl existiert zwar
  13459.                grunds"atzlich, der eingestellte FPU-Typ
  13460.                beherrscht ihn aber noch nicht.}
  13461.               {Der fragliche Befehl}
  13462. \errentry{1508}{Custom-Befehle nicht freigeschaltet}
  13463.               {Fehler}
  13464.               {Die benutzerdefinierten Befehlssatzerweiterungen
  13465.                m"ussen erlaubt werden, um diesen Befehl zu benutzen.}
  13466.               {Der fragliche Befehl}
  13467. \errentry{1509}{Befehls-Erweiterung nicht freigeschaltet}
  13468.               {Fehler}
  13469.               {Dieser Befehl ist Teil einer Befehlssatz-Erweiterung,
  13470.                deren Benutzung nicht erlaubt wurde.}
  13471.               {Der Name der Erweiterung}
  13472. \errentry{1510}{Ung"ultige Bitstelle}
  13473.               {Fehler}
  13474.               {Die angegebene Bitnummer ist nicht erlaubt
  13475.                 oder eine Angabe fehlt komplett.}
  13476.               {keines}
  13477. \errentry{1520}{nur ON/OFF erlaubt}
  13478.               {Fehler}
  13479.               {Dieser Pseudobefehl darf als Argument nur \tty{ON}
  13480.                oder \tty{OFF} haben.}
  13481.               {keines}
  13482. \errentry{1530}{Stack ist leer oder nicht definiert}
  13483.               {Fehler}
  13484.               {Es wurde bei einem \tty{POPV}
  13485.                einen Stack anzusprechen, der entweder nie definiert oder
  13486.                bereits leerger"aumt wurde.}
  13487.               {der Name des fraglichen Stacks}
  13488. \errentry{1540}{Nicht genau ein Bit gesetzt}
  13489.                {Fehler}
  13490.               {In einer Bitmaske, die der \tty{BITPOS}-
  13491.                Funktion "ubergeben wurde, war nicht genau ein Bit
  13492.                gesetzt.}
  13493.               {keines}
  13494. \errentry{1550}{ENDSTRUCT ohne STRUCT}
  13495.               {Fehler}
  13496.               {Eine \tty{ENDSTRUCT}-Anweisung wurde gegeben, obwohl
  13497.                momentan keine Strukturdefinition in Gange war.}
  13498.               {keines}
  13499. \errentry{1551}{offene Strukturdefinition}
  13500.               {Fehler}
  13501.               {Nach Ende der Assemblierung waren noch nicht alle
  13502.                \tty{STRUCT}-Anweisungen durch passende \tty{ENDSTRUCT}s
  13503.                abgeschlossen.}
  13504.               {die innerste, noch nicht abgeschlossene
  13505.                Strukturdefinition}
  13506. \errentry{1552}{falsches ENDSTRUCT}
  13507.               {Fehler}
  13508.               {Der Namensparameter einer \tty{ENDSTRUCT}-Anweisung
  13509.                entspricht nicht der innersten, offenen
  13510.                Strukturdefinition.}
  13511.               {keines}
  13512. \errentry{1553}{Phasendefinition nicht in Strukturen erlaubt}
  13513.               {Fehler}
  13514.               {Was gibt es dazu zu sagen?  \tty{PHASE} in einem Record
  13515.                ergibt einfach keinen Sinn und nur Verwirrung...}
  13516.               {keines}
  13517. \errentry{1554}{ung"ultige \tty{STRUCT}-Direktive}
  13518.               {Fehler}
  13519.               {Als Direktive f"ur \tty{STRUCT} ist nur
  13520.                \tty{EXTNAMES}, \tty{NOEXTNAMES}, \tty{DOTS} und
  13521.                \tty{NODOTS} zugelassen.}
  13522.               {die unbekannte Direktive}
  13523. \errentry{1555}{Struktur redefiniert}
  13524.               {Fehler}
  13525.               {Eine Struktur dieses Namens wurde bereits definiert.}
  13526.               {der Name der Struktur}
  13527. \errentry{1556}{nicht aufl"osbare Strukturelement-Referenz}
  13528.               {Fehler}
  13529.               {Ein Element bezieht sich auf ein anderes Element in
  13530.                einer Strukturdefintions, dieses ist aber nicht
  13531.                definiert oder dessen Referenz selber is nicht
  13532.                aufl"osbar.}
  13533.               {Name des Elements und seine Referenz}
  13534. \errentry{1557}{Strukturelement doppelt}
  13535.               {Fehler}
  13536.               {Ein Element dieses Namens ist bereits in der Struktur
  13537.                enthalten.}
  13538.               {Name des Elements}
  13539. \errentry{1560}{Anweisung nicht wiederholbar}
  13540.               {Fehler}
  13541.               {Diese Maschinenanweisung kann nicht mit Hilfe eines
  13542.                {\tt RPT}-Konstruktes wiederholt werden.}
  13543.               {keines}
  13544. \errentry{1600}{vorzeitiges Dateiende}
  13545.               {Fehler}
  13546.               {Es wurde mit einem \tty{BINCLUDE}-Befehl versucht,
  13547.                "uber das Ende einer Datei hinauszulesen.}
  13548.               {keines}
  13549. \errentry{1700}{ROM-Offset geht nur von 0..63}
  13550.               {Fehler}
  13551.               {Das Konstanten-ROM der 680x0-Koprozessoren hat
  13552.                nur max. 63 Eintr"age.}
  13553.               {keines}
  13554. \errentry{1710}{Ung"ultiger Funktionscode}
  13555.               {Fehler}
  13556.               {Als Funktionscodeargument darf nur SFC, DFC, ein
  13557.                Datenregister oder eine Konstante von 0..15 verwendet
  13558.                werden. (nur 680x0-MMU)}
  13559.               {keines}
  13560. \errentry{1720}{Ung"ultige Funktionscodemaske}
  13561.               {Fehler}
  13562.               {Als Funktionscodemaske darf nur ein Wert von
  13563.                0..15 verwendet werden. (nur 680x0-MMU)}
  13564.               {keines}
  13565. \errentry{1730}{Ung"ultiges MMU-Register}
  13566.               {Fehler}
  13567.               {Die MMU hat kein Register mit dem angegebenen
  13568.                Namen. (nur 680x0-MMU)}
  13569.               {keines}
  13570. \errentry{1740}{Level nur von 0..7}
  13571.               {Fehler}
  13572.               {Die Ebene f"ur \tty{PTESTW} und \tty{PTESTR} mu"s eine
  13573.                Konstante von 0..7 sein. (nur 680x0-MMU)}
  13574.               {keines}
  13575. \errentry{1750}{ung"ultige Bitmaske}
  13576.               {Fehler}
  13577.               {Die bei den Bit-Feld-Befehlen angegebene
  13578.                Bitmaske hat ein falsches Format. (nur 680x0)}
  13579.               {keines}
  13580. \errentry{1760}{ung"ultiges Registerpaar}
  13581.               {Fehler}
  13582.               {Das angegebene Registerpaar ist hier nicht
  13583.                verwendbar oder syntaktisch falsch. (nur 680x0)}
  13584.               {keines}
  13585. \errentry{1800}{offene Makrodefinition}
  13586.               {Fehler}
  13587.               {Eine Makrodefinition war am Dateiende nicht
  13588.                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
  13589.               {keines}
  13590. \errentry{1801}{IRP ohne ENDM}
  13591.               {Fehler}
  13592.               {Ein IRP-Block war am Dateiende nicht
  13593.                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
  13594.               {keines}
  13595. \errentry{1802}{IRPC ohne ENDM}
  13596.               {Fehler}
  13597.               {Ein IRPC-Block war am Dateiende nicht
  13598.                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
  13599.               {keines}
  13600. \errentry{1803}{REPT ohne ENDM}
  13601.               {Fehler}
  13602.               {Ein REPT-Block war am Dateiende nicht
  13603.                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
  13604.               {keines}
  13605. \errentry{1804}{WHILE ohne ENDM}
  13606.               {Fehler}
  13607.               {Ein WHILE-Block war am Dateiende nicht
  13608.                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
  13609.               {keines}
  13610. \errentry{1805}{EXITM au"serhalb eines Makrorumpfes}
  13611.               {Fehler}
  13612.               {\tty{EXITM} bricht die Expansion von
  13613.                Makro-Konstrukten ab.  Dieser Befehl macht nur innerhalb
  13614.                von Makros Sinn und es wurde versucht, ihn au"serhalb
  13615.                aufzurufen.}
  13616.               {keines}
  13617. \errentry{1810}{mehr als 10 Makroparameter}
  13618.               {Fehler}
  13619.               {Ein Makro darf h"ochstens 10 Parameter haben.}
  13620.               {keines}
  13621. \errentry{1811}{Schl"usselwortargument nicht in Makro definiert}
  13622.               {Fehler}
  13623.               {Ein Schl"usselwortargument bezog sich auf einen
  13624.                Parameter, den das aufgerufene Makro gar nicht
  13625.                besitzt.}
  13626.               {verwendetes Schl"usselwort bzw. Makroparameter}
  13627. \errentry{1812}{Positionsargument nach Schl"usselwortargumenten nicht mehr erlaubt}
  13628.               {Fehler}
  13629.               {Positions- und Schl"usselwortargumente d"urfen in
  13630.                einem Makroaufruf gemischt werden, aber nach dem
  13631.                ersten Schl"usselwortargument sind nur noch
  13632.                solche zugelassen.}
  13633.               {keines}
  13634. \errentry{1815}{doppelte Makrodefinition}
  13635.               {Fehler}
  13636.               {Ein Makronamne wurde in einer Sektion doppelt
  13637.                vergeben.}
  13638.               {der doppelt verwendete Name}
  13639. \errentry{1820}{Ausdruck mu"s im ersten Pass berechenbar sein}
  13640.               {Fehler}
  13641.               {Der benutzte Befehl beeinflu"st die Codel"ange,
  13642.                daher sind Vorw"artsreferenzen hier nicht erlaubt.}
  13643.               {keines}
  13644. \errentry{1830}{zu viele verschachtelte IFs}
  13645.               {Fehler}
  13646.               {(nicht mehr verwendet)}
  13647.               {keines}
  13648. \errentry{1840}{ELSEIF/ENDIF ohne ENDIF}
  13649.               {Fehler}
  13650.               {es wurde ein \tty{ELSEIF}- oder \tty{ENDIF}-Befehl gefunden,
  13651.                obwohl kein offener \tty{IF}-Befehl vorhanden ist.}
  13652.               {keines}
  13653. \errentry{1850}{verschachtelter/rekursiver Makroaufruf}
  13654.               {Fehler}
  13655.               {(nicht mehr verwendet)}
  13656.               {keines}
  13657. \errentry{1860}{unbekannte Funktion}
  13658.               {Fehler}
  13659.               {Die angesprochene Funktion ist weder eingebaut
  13660.                noch nachtr"aglich definiert worden.}
  13661.               {der Funktionsname}
  13662. \errentry{1870}{Funktionsargument au"serhalb Definitionsbereich}
  13663.               {Fehler}
  13664.               {Das Argument liegt nicht im Bereich der
  13665.                angesprochenen transzendenten Funktion.}
  13666.               {keines}
  13667. \errentry{1880}{Gleitkomma"uberlauf}
  13668.               {Fehler}
  13669.               {Das Argument liegt zwar im Bereich der
  13670.                angesprochenen transzendenten Funktion, das Ergebnis
  13671.                w"are aber nicht mehr darstellbar.}
  13672.               {keines}
  13673. \errentry{1890}{ung"ultiges Wertepaar}
  13674.               {Fehler}
  13675.               {Das benutzte P"archen aus Basis und Exponent
  13676.                kann nicht berechnet werden.}
  13677.               {keines}
  13678. \errentry{1900}{Befehl darf nicht auf dieser Adresse liegen}
  13679.               {Fehler}
  13680.               {Die Prozessorhardware erlaubt keine
  13681.                Spr"unge von dieser Adresse.}
  13682.               {keines}
  13683. \errentry{1905}{ung"ultiges Sprungziel}
  13684.               {Fehler}
  13685.               {Die Prozessorhardware erlaubt keine
  13686.                Spr"unge zu dieser Adresse.}
  13687.               {keines}
  13688. \errentry{1910}{Sprungziel nicht auf gleicher Seite}
  13689.               {Fehler}
  13690.               {Sprungbefehl und Sprungziel m"ussen bei diesem
  13691.                Befehl auf der gleichen Seite liegen.}
  13692.               {keines}
  13693. \errentry{1911}{Sprungziel nicht in gleicher Sektion}
  13694.               {Fehler}
  13695.               {Sprungbefehl und Sprungziel m"ussen bei diesem
  13696.                Befehl in der gleichen (64K-)Sektion liegen.}
  13697.               {keines}
  13698. \errentry{1920}{Code"uberlauf}
  13699.               {Fehler}
  13700.               {Es wurde versucht, mehr als 1024 Bytes Code oder
  13701.                Daten in einer Zeile zu erzeugen.}
  13702.               {keines}
  13703. \errentry{1925}{Adre"s"uberlauf}
  13704.               {Fehler}
  13705.               {Der Adre"sraum dieses Prozessors wurde
  13706.                "uberschritten.}
  13707.               {keines}
  13708. \errentry{1930}{Konstanten und Platzhalter nicht mischbar}
  13709.               {Fehler}
  13710.               {Anweisungen, die Speicher reservieren und solche,
  13711.                die ihn mit Konstanten belegen, d"urfen nicht in einer
  13712.                Pseudoanweisung gemischt werden.}
  13713.               {keines}
  13714. \errentry{1940}{Codeerzeugung in Strukturdefinition nicht zul"assig}
  13715.               {Fehler}
  13716.               {Ein \tty{STRUCT}-Konstrukt dient nur der Beschreibung
  13717.                einer Datenstruktur und nicht dem Anlegen einer solchen,
  13718.                es sind daher keine Befehle zugelassen, die Code erzeugen.}
  13719.               {keines}
  13720. \errentry{1950}{Paralleles Konstrukt nicht m"oglich}
  13721.               {Fehler}
  13722.               {Entweder sind die beiden Instruktionen
  13723.                prinzipiell nicht parallel ausf"uhrbar, oder sie stehen nicht
  13724.                unmittelbar untereinander.}
  13725.               {keines}
  13726. \errentry{1960}{ung"ultiges Segment}
  13727.               {Fehler}
  13728.               {Das angegebene Segment ist an dieser Stelle
  13729.                nicht anwendbar.}
  13730.               {der benutzte Segmentname}
  13731. \errentry{1961}{unbekanntes Segment}
  13732.               {Fehler}
  13733.               {Das angegebene Segment existiert bei
  13734.                diesem Prozessor nicht.}
  13735.               {der benutzte Segmentname}
  13736. \errentry{1962}{unbekanntes Segmentregister}
  13737.               {Fehler}
  13738.               {Das angegebene Segmentregister existiert
  13739.                nicht (nur 8086).}
  13740.               {keines}
  13741. \errentry{1970}{ung"ultiger String}
  13742.               {Fehler}
  13743.               {Der angegebene String hat ein ung"ultiges
  13744.                Format.}
  13745.               {keines}
  13746. \errentry{1980}{ung"ultiger Registername}
  13747.               {Fehler}
  13748.               {Das angegebene Register existiert nicht oder
  13749.                darf hier nicht verwendet werden.}
  13750.               {keines}
  13751. \errentry{1985}{ung"ultiges Argument}
  13752.               {Fehler}
  13753.               {Der angegebene Befehl darf nicht mit einem
  13754.                \tty{REP}-Pr"afix versehen werden.}
  13755.               {keines}
  13756. \errentry{1990}{keine Indirektion erlaubt}
  13757.               {Fehler}
  13758.               {in dieser Kombination ist keine indirekte
  13759.                Adressierung erlaubt.}
  13760.               {keines}
  13761. \errentry{1995}{nicht im aktuellen Segment erlaubt}
  13762.               {Fehler}
  13763.               {(nicht mehr verwendet)}
  13764.               {keines}
  13765. \errentry{1996}{nicht im Maximum-Modus zul"assig}
  13766.               {Fehler}
  13767.               {Dieses Register ist nur im Minimum-Modus
  13768.                definiert.}
  13769.               {keines}
  13770. \errentry{1997}{nicht im Minimum-Modus zul"assig}
  13771.               {Fehler}
  13772.               {Dieses Register ist nur im Maximum-Modus
  13773.                definiert.}
  13774.               {keines}
  13775. \errentry{2000}{Anweisungspaket "uberschreitet Adre"sgrenze}
  13776.               {Fehler}
  13777.               {Ein Anweisungspaket darf nicht "uber eine
  13778.                32-Byte-Adre"sgrenze reichen.}
  13779.               {keines}
  13780. \errentry{2001}{Ausf"uhrungseinheit mehrfach benutzt}
  13781.               {Fehler}
  13782.               {Eine der Ausf"uhrungseinheiten des Prozessors wurde in
  13783.                einem Anweisungspaket mehrfach benutzt.}
  13784.               {der Name der Funktionseinheit}
  13785. \errentry{2002}{mehrfache Lang-Leseoperation}
  13786.               {Fehler}
  13787.               {Ein Ausf"uhrungspaket enth"alt mehr als eine
  13788.                Lang-Leseoperation, was nicht erlaubt ist.}
  13789.               {eine der Funktionseinheiten, auf denen eine
  13790.                Lang-Leseoperation ausgef"uhrt wird}
  13791. \errentry{2003}{mehrfache Lang-Schreiboperation}
  13792.               {Fehler}
  13793.               {Ein Ausf"uhrungspaket enth"alt mehr als eine
  13794.                Lang-Schreiboperation, was nicht erlaubt ist.}
  13795.               {eine der Funktionseinheiten, auf denen eine
  13796.                Lang-Schreiboperation ausgef"uhrt wird}
  13797. \errentry{2004}{Lang-Lese- mit Schreiboperation}
  13798.               {Fehler}
  13799.               {Ein Ausf"uhrungspaket enth"alt sowohl eine
  13800.                Lang-Leseoperation als auch eine Schreiboperation,
  13801.                was nicht erlaubt ist.}
  13802.               {eine der Funktionseinheiten, deren Operationen im
  13803.                Konflikt stehen.}
  13804. \errentry{2005}{zu viele Lesezugriffe auf ein Register}
  13805.               {Fehler}
  13806.               {Auf das gleiche Register wurde mehr als viermal im
  13807.                gleichen Anweisungspaket Bezug genommen.}
  13808.               {der Name des Registers, das zu oft referenziert wurde}
  13809. \errentry{2006}{"uberlappende Ziele}
  13810.               {Fehler}
  13811.               {Auf das gleiche Register wurde mehrfach im gleichen
  13812.                Ausf"uhrungspaket geschrieben, was nicht erlaubt ist.}
  13813.               {der Name der fraglichen Registers}
  13814. \errentry{2008}{zu viele absolute Spr"unge in einem Anweisungspaket}
  13815.               {Fehler}
  13816.               {Ein Anweisungspaket beinhaltet mehr als einen direkten
  13817.                Sprung, was nicht erlaubt ist.}
  13818.               {keines}
  13819. \errentry{2009}{Anweisung nicht auf diese Funktionseinheit ausf"uhrbar}
  13820.               {Fehler}
  13821.               {Diese Anweisung kann nicht auf dieser Funktionseinheit
  13822.                ausgef"uhrt werden.}
  13823.               {keines}
  13824. \errentry{2010}{Ung"ultige Escape-Sequenz}
  13825.               {Fehler}
  13826.               {Das mit einem Backslash eingeleitete
  13827.                 Sonderzeichen ist nicht definiert.}
  13828.               {keines}
  13829. \errentry{2020}{ung"ultige Pr"afix-Kombination}
  13830.               {Fehler}
  13831.               {Die angegebene Kombination von Pr"afixen
  13832.                 ist nicht zul"assig oder nicht im
  13833.                 Maschinenkode darstellbar.}
  13834.               {keines}
  13835. \errentry{2030}{Konstante kann nicht als Variable redefiniert werden}
  13836.               {Fehler}
  13837.               {Ein einmal mit {\tt EQU} als Konstante\\
  13838.                definiertes Symbol kann nicht nachtr"aglich mit\\
  13839.                {\tt SET} ver"andert werden.}
  13840.               {der Name des fraglichen Symbols}
  13841. \errentry{2035}{Variable kann nicht als Konstante redefiniert werden}
  13842.               {Fehler}
  13843.               {Ein einmal mit {\tt SET} als Variable\\
  13844.                definiertes Symbol kann nicht nachtr"aglich als\\
  13845.                Konstante deklariert werden (z.B. mit {\tt EQU}.}
  13846.               {der Name des fraglichen Symbols}
  13847. \errentry{2040}{Strukturname fehlt}
  13848.               {Fehler}
  13849.               {Bei einer Strukturdefinition fehlt der zugeh"orende
  13850.                Name f"ur die Struktur.}
  13851.               {keines}
  13852. \errentry{2050}{leeres Argument}
  13853.               {Fehler}
  13854.               {In der Argumentenliste dieser Anweisung d"urfen keine
  13855.                Leerstrings benutzt werden.}
  13856.               {keines}
  13857. \errentry{2060}{nicht implementierte Anweisung}
  13858.               {Fehler}
  13859.               {Der benutzte Maschinenbefehl ist dem Assembler
  13860.                zwar bekannt, ist aber aufgrund fehlender
  13861.                Dokumentation seitens des Prozessorherstellers
  13862.                momentan nicht implementiert.}
  13863.               {Der benutzte Befehl}
  13864. \errentry{2070}{namenlose Struktur nicht Teil einer anderen Struktur}
  13865.               {Fehler}
  13866.               {Eine Struktur oder Union, die keinen Namen hat, mu"s
  13867.                immer Teil einer anderen, benamten Struktur oder Union
  13868.                sein.}
  13869.               {keines}
  13870. \errentry{2080}{STRUCT durch ENDUNION beendet}
  13871.               {Fehler}
  13872.               {ENDUNION darf nur zum Beenden der Definition einer
  13873.                Union benutzt werden, nicht einer Struktur.}
  13874.               {Name der Struktur (falls vorhanden)}
  13875. \errentry{2090}{Speicheradresse nicht auf aktiver Seite}
  13876.               {Fehler}
  13877.               {Die Zieladresse befindet sich nicht in der durch
  13878.                das Seitenregister aktuell adressierbaren
  13879.                Speicherseite.}
  13880.               {keines}
  13881. \errentry{2100}{unbekanntes Makro-Expansions-Argument}
  13882.               {Fehler}
  13883.               {Ein \tty{MACEXP\_DFT/OVR} gegebenes Argument konnte nicht
  13884.                interpretiert werden.}
  13885.               {das unbekannte Argument}
  13886. \errentry{2105}{zu viele Makro-Expansions-Argumente}
  13887.               {Fehler}
  13888.               {Die Anzahl der Argument zur Makro-Expansion hat ihre Maximalzahl "uberschritten}
  13889.               {das Argument, das zu viel ist}
  13890. \errentry{2110}{widerspr"uchliche Angaben zur Makro-Expansion}
  13891.               {Fehler}
  13892.               {Eine Angabe zur Makroexpansion und ihr genaues
  13893.                Gegenteil d"urfen nicht gleichzeitig als Argument
  13894.                von \tty{MACEXP\_DFT/OVR} verwendet werden.}
  13895.               {keines}
  13896. \errentry{2130}{erwarteter Fehler nicht eingetreten}
  13897.               {Fehler}
  13898.               {Ein per {\tt EXPECT} angek"undigter Fehler oder Warnung ist
  13899.                in dem durch {\tt ENDEXPECT} abgeschlossenen Block nicht aufgetreten.}
  13900.               {Der erwartete Fehler}
  13901. \errentry{2140}{Verschachtelung von EXPECT/ENDEXPECT nicht erlaubt}
  13902.               {Fehler}
  13903.               {Durch {\tt EXPECT/ENDEXPECT} eingerahmte Bl"ocke d"urfen keine
  13904.                geschachtelten {\tt EXPECT/ENDEXPECT}-Bl"ocke enthalten.}
  13905.               {keines}
  13906. \errentry{2150}{fehlendes ENDEXPECT}
  13907.               {Fehler}
  13908.               {Ein per {\tt EXPECT} ge"offneter Block wurde nicht per
  13909.                {\tt ENDEXPECT} abgeschlossen.}
  13910.               {keines}
  13911. \errentry{2160}{ENDEXPECT ohne EXPECT}
  13912.               {Fehler}
  13913.               {Zu einem {\tt ENDEXPECT} gibt es kein vorhergehendes {\tt EXPECT}.}
  13914.               {keines}
  13915. \errentry{2170}{kein Default-Checkpoint-Register definiert}
  13916.               {Fehler}
  13917.               {Bei einer Typ-12-Instruktion wurde kein Checkpoint-Register angegeben
  13918.                und es wurde auch keines "uber die {\tt CKPT}-Anweisung vorher definiert.}
  13919.               {keines}
  13920. \errentry{2180}{ung"ultiges Bitfeld}
  13921.               {Fehler}
  13922.               {Das Bitfeld entspricht nicht der erwarteten {\tt (start,count)}-Syntax.}
  13923.               {das fragliche Argument}
  13924. \errentry{2190}{Argument-Wert fehlt}
  13925.               {Fehler}
  13926.               {Argumente m"ussen die Form 'variable=wert' haben.}
  13927.               {das fragliche Argument}
  13928. \errentry{2200}{unbekanntes Argument}
  13929.               {Fehler}
  13930.               {Dieses Variable wird von der gew"ahlten Zielplattform nicht unterst"utzt.}
  13931.               {das fragliche Argument}
  13932. \errentry{2210}{Indexregister muss 16 Bit sein}
  13933.               {Fehler}
  13934.               {Indexregister beim Z8000 m"ussen eine L"ange von 16 Bit (Rn) haben.}
  13935.               {das fragliche Argument}
  13936. \errentry{2211}{I/O Adressregister muss 16 Bit sein}
  13937.               {Fehler}
  13938.               {Z8000-Register, um I/O-Adressen zu adressieren, m"ussen eine L"ange von 16 Bit (Rn) haben.}
  13939.               {das fragliche Argument}
  13940. \errentry{2212}{Adressregister im segmentierten Modus muss 32 Bit sein}
  13941.               {Fehler}
  13942.               {Z8000-Register, um Speicheradressen im segmentierten Modus zu adressieren, m"ussen
  13943.                eine L"ange von 32 Bit (RRn) haben.}
  13944.               {das fragliche Argument}
  13945. \errentry{2213}{Adressregister im nicht-segmentierten Modus muss 16 Bit sein}
  13946.               {Fehler}
  13947.               {Z8000-Register, um Speicheradressen im nicht-segmentierten Modus zu adressieren, m"ussen
  13948.                eine L"ange von 16 Bit (Rn) haben.}
  13949.               {das fragliche Argument}
  13950. \errentry{2220}{ung"ultiges Strukturargument}
  13951.               {Fehler}
  13952.               {Das Argument entspricht keinem der Argumente, die bei der Expansion einer
  13953.                Struktur erlaubt sind.}
  13954.               {das fragliche Argument}
  13955. \errentry{2221}{zu viele Array-Dimensionen}
  13956.               {Fehler}
  13957.               {Arrays von Strukturen d"urfen maximal drei Dimensionen haben.}
  13958.               {die Dimension, die zu viel ist}
  13959. \errentry{2230}{unbekannte Integer-Notation}
  13960.               {Fehler}
  13961.               {Die angegebene Integer-Notation existiert nicht, oder es fehlt das
  13962.                f"uhrende Plus/Minuszeichen.}
  13963.               {das fehlerhafte Argument}
  13964. \errentry{2231}{ung"ultige Liste an Integer-Schreibweisen}
  13965.               {Fehler}
  13966.               {Die geforderte "Anderung der Liste von benutzbaren Integer-Schreibweisen
  13967.                kann nicht vorgenommen werden, weil sie zu einem Widerspruch f"uhren
  13968.                w"urde.  Aktuell betrifft dies lediglich 0hex und 0oct, die nicht
  13969.                gleichzeitig verwendet werden d"urfen.}
  13970.               {keines}
  13971. \errentry{2240}{ung"ultige Skalierung}
  13972.               {Fehler}
  13973.               {Das angegebene Argument kann nicht als Skalierungsfaktor benutzt werden.}
  13974.               {das fragliche Argument}
  13975. \errentry{2250}{widerspr"uchliche String-Optionen}
  13976.               {Fehler}
  13977.               {Das angegebene String-Option steht im Widerspruch zu einer vorherigen in der Liste.}
  13978.               {die fragliche Option}
  13979. \errentry{2251}{unbekannte String-Option}
  13980.               {Fehler}
  13981.               {Das angegebene String-Option gibt es nicht.}
  13982.               {die fragliche Option}
  13983. \errentry{2252}{ung"ultiger Cache-Invalidierungs-Modus}
  13984.               {Fehler}
  13985.               {Es k"onnen nur Daten-, Instruktions- oder beide Caches invalidiert werden.}
  13986.               {das fragliche Argument}
  13987. \errentry{2253}{ung"ultige Config-Liste}
  13988.               {Fehler}
  13989.               {Die Konfigurationsliste ist entweder insgesamt syntaktisch falsch oder
  13990.                enth"alt ung"ultige Elemente.}
  13991.               {Die fragliche Liste oder ein Element daraus.}
  13992. \errentry{2254}{widerspr"uchliche Konfig-Optionen}
  13993.               {Fehler}
  13994.               {Das angegebene Option steht im Widerspruch zu einer vorherigen in der Liste oder ist dazu identisch.}
  13995.               {die fragliche Option}
  13996. \errentry{2255}{unbekannte Konfig-Option}
  13997.               {Fehler}
  13998.               {Das angegebene Option gibt es nicht.}
  13999.               {die fragliche Option}
  14000. \errentry{2260}{ung"ultiger Wert f"ur CBAR}
  14001.               {Fehler}
  14002.               {Dieser CBAR-Wert ist nicht erlaubt (CA mu"s gr"o"ser als BA sein).}
  14003.               {keines}
  14004. \errentry{2270}{Seite nicht zugreifbar}
  14005.               {Fehler}
  14006.               {Die Zieladresse liegt auf einer Speicherseite, die aktuell nicht
  14007.                zugreifbar ist.}
  14008.               {keines}
  14009. \errentry{2280}{Feld nicht zugreifbar}
  14010.               {Fehler}
  14011.               {Die Zieladresse liegt in einem Speicherfeld, das aktuell nicht
  14012.                zugreifbar ist.}
  14013.               {keines}
  14014. \errentry{2281}{Ziel nicht in gleichem Feld}
  14015.               {Fehler}
  14016.               {Befehl und Operandenadresse m"ussen
  14017.                im gleichen Speicherfeld liegen.}
  14018.               {keines}
  14019. \errentry{2290}{Ung"ultige Instruktions-Kombination}
  14020.               {Fehler}
  14021.               {Diese Befehle k"onnen nicht miteinander kombiniert werden.}
  14022.               {keines}
  14023. \errentry{2300}{nicht-gemapptes Zeichen}
  14024.               {Fehler}
  14025.               {Die Zeichenkette enth"alt einen nicht abbildbares Zeichen.}
  14026.               {die fragliche Zeichenkette}
  14027.               {keines}
  14028. \errentry{2310}{Multi-Zeichenkonstante mit ung"ultiger L"ange}
  14029.               {Fehler}
  14030.               {Multi-Zeichenkonstanten m"ussen zwischen ein und vier Zeichen lang sein.}
  14031.               {keines}
  14032. \errentry{2320}{kein Target gesetzt ('CPU ...' oder '-cpu ...', um eines zu setzen)}
  14033.               {fatal}
  14034.               {Es wurde noch kein Target gesetzt, der Assembler wei"s daher
  14035.                nicht, f"ur welche CPU Code erzeugt werden soll.}
  14036.               {keines}
  14037. \errentry{2330}{Ung"ultige Displacement-L"ange}
  14038.               {Fehler}
  14039.               {Bei diesem Adressierungsmodus kann das Displacement diese
  14040.                L"ange nicht haben.}
  14041.               {keines}
  14042. \errentry{10001}{Fehler bein "Offnen der Datei}
  14043.               {fatal}
  14044.               {Beim Versuch, eine Datei zu "offnen, ist ein
  14045.                Fehler aufgetreten.}
  14046.               {Beschreibung des E/A-Fehlers}
  14047. \errentry{10002}{Listingschreibfehler}
  14048.               {fatal}
  14049.               {Beim Schreiben des Assemblerlistings ist ein
  14050.                Fehler aufgetreten.}
  14051.               {Beschreibung des E/A-Fehlers}
  14052. \errentry{10003}{Dateilesefehler}
  14053.               {fatal}
  14054.               {Beim Lesen aus einer Quelldatei ist ein
  14055.                Fehler aufgetreten.}
  14056.               {Beschreibung des E/A-Fehlers}
  14057. \errentry{10004}{Dateischreibfehler}
  14058.               {fatal}
  14059.               {Beim Schreiben von Code- oder Share-Datei
  14060.                ist ein Fehler aufgetreten.}
  14061.               {Beschreibung des E/A-Fehlers}
  14062. \errentry{10006}{Speicher"uberlauf}
  14063.               {fatal}
  14064.               {Der verf"ugbare Speicher reicht nicht mehr,
  14065.                 alle Datenstrukturen aufzunehmen.  Weichen Sie auf die
  14066.                 DPMI- oder OS/2-Version von \asname{} aus.}
  14067.               {keines}
  14068. \errentry{10007}{Stapel"uberlauf}
  14069.               {fatal}
  14070.               {Der Programmstapel ist wegen zu komplizierter
  14071.                 Formelausdr"ucke oder einer ung"unstigen Anlage der Symbol-
  14072.                 oder Makrotabelle "ubergelaufen.  Versuchen Sie es noch
  14073.                 einmal mit der \tty{-A}-Option.}
  14074.               {keines}
  14075. \errentry{10008}{INCLUDE zu tief verschachtelt}
  14076.               {fatal}
  14077.               {Die Include-Verschachtelungstiefe hat das gegebene Limit
  14078.                (im Default 200) "uberschritten.  Dieses Limit kann "uber
  14079.                den {\tt -maxinclevel}-Schalter herauf gesetzt werden, eine
  14080.                fehlerhafte (rekusive) Verschachtelung ist aber die
  14081.                wahrscheinlichere Ursache.}
  14082.               {Die INCLUDE-Anweisung, mit der das Limit "uberschritten wurde.}
  14083. \errentry{10010}{ung"ultiger Platzhalter in Listing Pro-Zeile-Pr"afix Format}
  14084.               {fatal}
  14085.               {Als Platzhalter sind nur \%i, \%n oder \%a zul"assig.}
  14086.               {das ung"ultige Format}
  14087. \errentry{10011}{zu oft verwendeter Platzhalter in Listing Pro-Zeile-Pr"afix Format}
  14088.               {fatal}
  14089.               {Die Platzhalter \%i und \%n d"urfen jeweils nur maximal dreimal
  14090.                im Formatstring enthalten sein.  Gen"ugt das nicht?}
  14091.               {das mehrfach verwendete Format}
  14092. \end{description}
  14093.  
  14094. %%===========================================================================
  14095.  
  14096. \cleardoublepage
  14097. \chapter{E/A-Fehlermeldungen}
  14098.  
  14099. Die hier aufgelisteten Fehlermeldungen werden nicht nur von \asname{} bei E/A-
  14100. Fehlern ausgegeben, sondern auch von den Hilfsprogrammen PLIST, BIND,
  14101. P2HEX und P2BIN.  Es sind nur die Fehler n"aher erkl"art, die m.E. bei
  14102. der Arbeit auftreten k"onnen.  Sollte doch einmal ein nicht erl"auterter
  14103. E/A-Fehler auftreten, so d"urfte der Grund in einem Programmfehler
  14104. liegen.  Melden Sie dies unbedingt!!
  14105.  
  14106. \begin{description}
  14107. \item[2]{Datei nicht gefunden\\
  14108.         Die angegebene Datei existiert nicht oder liegt auf einem
  14109.         anderen Laufwerk.}
  14110.  
  14111. \item[3]{Pfad nicht gefunden\\
  14112.         Der Pfad eines Dateinamens existiert nicht oder liegt auf
  14113.         einem anderen Laufwerk.}
  14114.  
  14115. \item[4]{zu viele offene Dateien\\
  14116.         DOS sind die Dateihandles ausgegangen.  Erh"ohen Sie die
  14117.         \tty{FILES=}-Angabe in der CONFIG.SYS.}
  14118.  
  14119. \item[5]{Dateizugriff verweigert\\
  14120.         Entweder reichen die Netzwerkrechte f"ur einen Dateizugriff
  14121.         nicht, oder es wur\-de ver\-sucht, ei\-ne schreib\-ge\-sch"utz\-te Da\-tei
  14122.         zu "uber\-schrei\-ben oder zu ver\-"an\-dern.  Bei Benutzung in
  14123.         DOS- Fenstern von Multitasking- Systemen ist es "uberdies m"oglich,
  14124.         da"s ein andere Proze"s die Datei in exklusivem Zugriff hat.}
  14125.  
  14126. \item[6]{ung"ultiger Dateihandle}
  14127.  
  14128. \item[12]{ung"ultiger Zugriffsmodus}
  14129.  
  14130. \item[15]{ung"ultiger Laufwerksbuchstabe\\
  14131.          Das angesprochene Laufwerk existiert nicht.}
  14132.  
  14133.  
  14134. \item[16]{aktuelles Verzeichnis kann nicht gel"oscht werden}
  14135.  
  14136. \item[17]{RENAME geht nicht "uber Laufwerke}
  14137.  
  14138. \item[100]{vorzeitiges Dateiende\\
  14139.           Eine Datei war zuende, obwohl sie es aufgrund ihrer Struktur
  14140.           noch nicht sein d"urfte.  Vermutlich ist sie besch"adigt.}
  14141.  
  14142. \item[101]{Diskette/Platte voll\\
  14143.           Das spricht wohl f"ur sich!  Aufr"aumen!!}
  14144.  
  14145. \item[102]{ASSIGN fehlt}
  14146.  
  14147. \item[103]{Datei nicht offen}
  14148.  
  14149. \item[104]{Datei nicht f"ur Einlesen offen}
  14150.  
  14151. \item[105]{Datei nicht f"ur Ausgaben offen}
  14152.  
  14153. \item[106]{Ung"ultiges numerisches Format}
  14154.  
  14155. \item[150]{Diskette ist schreibgesch"utzt\\
  14156.           Wenn Sie schon keine Festplatte als Arbeitsmedium verwenden,
  14157.           so sollten Sie wenigstens den Schreibschutz entfernen!}
  14158.  
  14159. \item[151]{Unbekanntes Ger"at\\
  14160.           Sie haben versucht, ein Peripherieger"at anzusprechen, welches
  14161.           DOS unbekannt ist.  Dies sollte normalerweise nicht auftreten,
  14162.           da der Name dann automatisch als Datei interpretiert wird.}
  14163.  
  14164. \item[152]{Laufwerk nicht bereit\\
  14165.           Schlie"sen Sie die Klappe des Diskettenlaufwerks.}
  14166.  
  14167. \item[153]{unbekannte DOS-Funktion}
  14168.  
  14169. \item[154]{Pr"ufsummenfehler auf Diskette/Platte\\
  14170.           Ein harter Lesefehler auf der Diskette.  Nochmal versuchen; wenn
  14171.           immer noch vorhanden, Diskette neu formatieren bzw. ernste Sorgen
  14172.           um Festplatte machen!}
  14173.  
  14174. \item[155]{ung"ultiger DPB}
  14175.  
  14176. \item[156]{Positionierfehler\\
  14177.           Der Platten/Disketten-Controller hat eine bestimmte Spur nicht
  14178.           gefunden.  Siehe Nr. 154!}
  14179.  
  14180. \item[157]{unbekanntes Sektorformat\\
  14181.           DOS kann mit dem Format der Diskette nichts anfangen.}
  14182.  
  14183. \item[158]{Sektor nicht gefunden\\
  14184.           Analog zu Nr. 158, nur da"s hier der angeforderte Sektor auf
  14185.           der Spur nicht gefunden werden konnte.}
  14186.  
  14187. \item[159]{Papierende\\
  14188.           Offensichtlich haben Sie die Ausgaben von \asname{} direkt auf einen
  14189.           Drucker umgeleitet.  Assemblerlistings k"onnen seeehr lang
  14190.           sein...}
  14191.  
  14192. \item[160]{Ger"atelesefehler\\
  14193.           Nicht n"aher vom Ger"atetreiber klassifizierter Lesefehler.}
  14194.  
  14195. \item[161]{Ger"ateschreibfehler\\
  14196.           Nicht n"aher vom Ger"atetreiber klassifizierter Schreibfehler.}
  14197.  
  14198. \item[162]{allgemeiner Ger"atefehler\\
  14199.           Hier ist der Ger"atetreiber v"ollig ratlos, was passiert
  14200.           sein k"onnte.}
  14201. \end{description}
  14202.  
  14203. %%===========================================================================
  14204.  
  14205. \cleardoublepage
  14206. \chapter{Programmierbeispiele}
  14207.  
  14208. Manche Fragen, wie man dieses oder jenes realisiert, werden h"aufiger gestellt,
  14209. und es ist vielleicht wert, sie in einer 'Tipps und Tricks' Ecke zu
  14210. dokumentieren.  Hier in diesem Kapitel werde ich sie sammeln und vorstellen:
  14211.  
  14212. \section{16-Bit-Befehle per Makro}
  14213.  
  14214. Viele 8-Bit-Prozessoren k"onnen - wie der Name schon sagt - immer nur acht Bit
  14215. auf einmal verarbeiten.  Oft sind jedoch genug Register vorhanden, um zwei
  14216. davon zu einem virtuellen '16 Bit Akkumulator' zusammenzufassen.  Nun soll dieser
  14217. per Makro definierte Befehlssatz m"oglichst die gleichen Adressierungsarten
  14218. wie die Hardware-Befehle unterst"utzen.  Dazu m"u"ste man die Makro-Argumente
  14219. irgendwie parsen - aber wie?
  14220.  
  14221. Der Motorola 6800 hat zum Beispiel zwei Akkumulatoren A und B, und es liegt
  14222. nahe, diese als einem 16-Bit-Akku zu behandeln.  Die Adressierungsarten
  14223. sollten die gleichen sein wie bei 8-Bit-Operationen:
  14224. \begin{itemize}
  14225. \item{immediate}
  14226. \item{direkt (Adresse innerhalb der ersten 256 Byte)}
  14227. \item{erweitert (beliebige Adresse)}
  14228. \item{indiziert}
  14229. \end{itemize}
  14230. Ein Makro, das so einen virtuellen 16-Bit-Befehl implementiert, mu"s die ein oder
  14231. zwei Argumente also analysieren:
  14232. \begin{enumerate}
  14233. \item{Indizierte Adressierung hat als einzige zwei Argumente.}
  14234. \item{Immediate-Adressierung ist am f"uhrenden Hash-Zeichen zu erkennen.}
  14235. \item{Ob eine Adresse in den ersten 256 Byte liegt oder nicht, kann man
  14236.      wieder dem Assembler "uberlassen.}
  14237. \end{enumerate}
  14238. Um Punkt 2 auszuf"uhren, mu"s ein Argument in einen String "uberf"uhrt werden.  Von
  14239. diesem kann das f"uhrende Hash-Zeichen dann auch entfernt werden, um den eigentlichen
  14240. Wert zu evaluieren.  Komplett ausgeschrieben sieht das Makro dann so aus:
  14241. \begin{verbatim}
  14242. subd    macro   ARG1,ARG2
  14243.  if      "ARG2" != ""            ; indexed?
  14244.   suba    (ARG1)+1,ARG2
  14245.   sbcb    ARG1,ARG2
  14246.  elseif                          ; not indexed?
  14247. _SARG1   set     "ARG1"           ; convert to string
  14248.  if      substr(_SARG1,0,1)='#' ; immediate?
  14249. _SARG1    set     substr(_SARG1,1,strlen(_SARG1)-1) ; yes->remove #
  14250.   suba    #lo(VAL(_SARG1))      ; ...and subtract lo/hi bytes
  14251.   sbcb    #hi(VAL(_SARG1))
  14252.  elseif                         ; no immediate->ext. or direct
  14253.   suba    (ARG1)+1              ; and subtract lo/hi bytes
  14254.   sbcb    ARG1
  14255.  endif
  14256.  endif
  14257.  endm
  14258. \end{verbatim}
  14259. Makroargumente wurden bewusst in Gro"sbuchstaben geschrieben, so dass das Makro
  14260. unabh"angig davon funktioniert, ob der case-sensitve Modus eingeschaltet ist
  14261. oder nicht.  Verwendet werden kann das Makro z.B. so:
  14262. \begin{verbatim}
  14263.        subd    $0007                   ; direct
  14264.        subd    $1234                   ; absolute
  14265.        subd    #$55aa                  ; immediate
  14266.        subd    $12,x                   ; indexed
  14267. \end{verbatim}
  14268. Jetzt ist es aber so, dass man nicht nur 16-bittig subtrahieren m"ochte.  Man
  14269. k"onnte f"ur jede Operation eine eigene Version des Makros hinschreiben, es
  14270. geht aber auch eleganter.  Ein Makro kann selber wieder eine Makro-Definition
  14271. enthalten.  Man kann also ein 'Meta-Makro' definieren, das die Befehlsnamen
  14272. als Argumente erh"alt:
  14273. \begin{verbatim}
  14274. def16   macro   NEWINST,LOINST,HIINST
  14275. NEWINST macro   ARG1,ARG2
  14276.  if      "ARG2" != ""            ; indexed?
  14277.   LOINST  (ARG1)+1,ARG2
  14278.   HIINST  ARG1,ARG2
  14279.  elseif                          ; not indexed?
  14280. _SARG1   set     "ARG1"                 ; convert to string
  14281.  if      substr(_SARG1,0,1)='#' ; immediate?
  14282. _SARG1    set     substr(_SARG1,1,strlen(_SARG1)-1) ; yes->remove #
  14283.   LOINST  #lo(VAL(_SARG1))      ; ...and subtract lo/hi bytes
  14284.   HIINST  #hi(VAL(_SARG1))
  14285.  elseif                         ; no immediate->ext. or direct
  14286.   LOINST  (ARG1)+1              ; ...and subtract lo/hi bytes
  14287.   HIINST  ARG1
  14288.  endif
  14289.  endif
  14290.  endm
  14291.  endm
  14292. \end{verbatim}
  14293. Dann sind die restlichen Definitionen Einzeiler:
  14294. \begin{verbatim}
  14295.        def16   addd,adda,adcb
  14296.        def16   subd,suba,sbcb
  14297.        def16   andd,anda,andb
  14298.        def16   ord,ora,orb
  14299.        def16   eord,eora,eorb
  14300. \end{verbatim}
  14301.  
  14302. %%===========================================================================
  14303.  
  14304. \cleardoublepage
  14305. \chapter{H"aufig gestellte Fragen}
  14306.  
  14307. In diesem Kapitel habe ich versucht, einige besonders h"aufig gestellte
  14308. Fragen mit den passenden Antworten zu sammeln.  Die Antworten auf
  14309. die hier auftauchenden Probleme finden sich zwar auch an anderer
  14310. Stelle in der Anleitung, jedoch findet man sie vielleicht nicht auf
  14311. den ersten Blick...
  14312.  
  14313. \begin{description}
  14314. \item[F:]{Ich bin DOS leid.  F"ur welche Plattformen gibt es \asname{} sonst ?}
  14315. \item[A:]{Neben der Protected-Mode-Version, die \asname{} unter DOS mehr Speicher
  14316.         zur Verf"ugung stellt, existieren Portierungen f"ur OS/2 und
  14317.         Unix-Systeme wie z.B. Linux (im Teststadium).  An Versionen,
  14318.         die Softwareherstellern in Redmond beim Geldscheffeln zuarbeiten
  14319.         w"urden, ist momentan nicht gedacht.  Sofern jemand anders in
  14320.         dieser Hinsicht aktiv werden will, stelle ich ihm aber gerne
  14321.         die \asname{}-Quellen zur Verf"ugung, von denen sich die C-Variante
  14322.         insbesondere eignen d"urfte.  "Uber Fragen zu diesen Quellen
  14323.         hinaus sollte er sich aber nicht viel von mir erwarten...}
  14324. \vspace{0.3cm}
  14325. \item[F:]{Ist eine Unterst"utzung des XYZ-Prozessors f"ur \asname{} geplant?}
  14326. \item[A:]{Es kommen immer neue Prozessoren heraus, und ich bem"uhe
  14327.         mich, bei Erweiterung von \asname{} Schritt zu halten.  Der Stapel
  14328.         mit der Aufschrift ,,Unerledigt'' auf meinem Schreibtisch
  14329.         unterschreitet aber selten die 10cm-Grenze... Bei der Planung,
  14330.         welche Kandidaten zuerst abgearbeitet werden, spielen W"unsche
  14331.         von Anwendern nat"urlich eine gro"se Rolle.  Das Internet und
  14332.         die steigende Zahl elektronisch publizierter Dokumentation
  14333.         erleichtern die Beschaffung von Unterlagen, speziell bei
  14334.         ausgefallenen oder "alteren Architekturen wird es aber immer
  14335.         wieder schwierig.  Wenn sich die fragliche Prozessorfamilie
  14336.         nicht in der Liste in Planung befindlicher Prozessoren
  14337.         befindet (siehe Kapitel 1), macht es sich sehr gut, der
  14338.         Anfrage auch gleich ein passendes Datenbuch hinzuzupacken
  14339.         (zur Not auch leihweise!).}
  14340. \vspace{0.3cm}
  14341. \item[F:]{Ein freier Assembler ist ja eine feine Sache, aber eigentlich
  14342.         br"auchte ich jetzt auch noch einen Disassembler...und einen
  14343.         Debugger...ein Simulator w"are auch ganz nett..}
  14344. \item[A:]{\asname{} ist ein Freizeitprojekt von mir, d.h. etwas, was ich in der
  14345.         Zeit tue, wenn ich mich nicht gerade um den Broterwerb k"ummere.
  14346.         Von dieser Zeit nimmt \asname{} schon einen ganz erheblichen Teil ein,
  14347.         und ab und zu genehmige ich mir auch mal eine Auszeit, um den
  14348.         L"otkolben zu schwingen, mal wieder eine Tangerine Dream-Platte
  14349.         bewu"st zu h"oren, mich vor den Fernseher zu hocken oder einfach
  14350.         nur dringenden menschlichen Bed"urfnissen nachzugehen.  Ich habe
  14351.         einmal angefangen, einen Disassembler zu konzipieren, der wieder
  14352.         voll reassemblierbaren Code erzeugt und automatisch Daten- und
  14353.         Code-Bereiche trennt, habe das Projekt aber relativ schnell wieder
  14354.         eingestellt, weil die restliche Zeit f"ur so etwas einfach nicht
  14355.         mehr reicht.  Ich mache lieber eine Sache gut als ein halbes
  14356.         Dutzend m"a"sig.  Von daher mu"s die Antwort also wohl ,,nein''
  14357.         hei"sen...}
  14358. \vspace{0.3cm}
  14359. \item[F:]{In den Bildschirmausgaben von \asname{} tauchen seltsame Zeichen auf,
  14360.          z.B. Pfeile und eckige Klammern.  Warum?}
  14361. \item[A:]{\asname{} verwendet zur Bildschirmsteuerung defaultm"a"sig einige
  14362.          ANSI-Terminal-Steuersequenzen.  Haben Sie keinen ANSI-Treiber
  14363.           installiert, so kommen diese Steuerzeichen ungefiltert auf
  14364.           Ihrem Bildschirm heraus.  Installieren Sie entweder einen
  14365.           ANSI-Treiber oder schalten Sie die Steuersequenzen mit dem
  14366.           DOS-Befehl \tty{SET USEANSI=N} ab.}
  14367. \vspace{0.3cm}
  14368. \item[F:]{W"ahrend der Assemblierung bricht \asname{} pl"otzlich mit der
  14369.          Meldung eines Stapel"uberlaufes ab.  Ist mein Programm zu
  14370.           kompliziert?}
  14371. \item[A:]{Ja und Nein.  Die Symboltabelle f"ur Ihr Programm ist nur
  14372.          etwas unregelm"a"sig gewachsen, was zu zu hohen Rekursionstiefen
  14373.           im Zugriff auf die Tabelle gef"uhrt hat.  Diese Fehler treten
  14374.           insbesondere bei der 16-Bit-OS/2-Version von \asname{} auf, die nur
  14375.           "uber einen relativ kleinen Stack verf"ugt.  Starten Sie \asname{} noch
  14376.           einmal mit dem \tty{-A}-Kommandozeilenschalter.  Hilft dies auch
  14377.          nicht, so kommen als m"ogliche Problemstellen noch zu komplizierte
  14378.          Formelausdr"ucke in Frage.  Versuchen Sie in einem solchen Fall,
  14379.          die Formel in Zwischenschritte aufzuspalten.}
  14380. \vspace{0.3cm}
  14381. \item[F:]{\asname{} scheint mein Programm nicht bis zum Ende zu assemblieren.
  14382.          Mit einer "alteren Version von \asname{} (1.39) hat es dagegen
  14383.           funktioniert.}
  14384. \item[A:]{Neuere Versionen von \asname{} ignorieren das \tty{END}-Statement nicht
  14385.          mehr, sondern beenden danach wirklich die Assemblierung.
  14386.           Insbesondere bei Include-Dateien ist es fr"uher vorgekommen, da"s
  14387.           Anwender jede Datei mit einem \tty{END}-Statement beendet haben.
  14388.           Entfernen Sie die "uberfl"ussigen \tty{END}s.}
  14389. \vspace{0.3cm}
  14390. \item[F:]{Weil ich noch ein paar kompliziertere Assemblierfehler im Programm
  14391.          hatte, habe ich mir ein Listing gemacht und es einmal genauer
  14392.          angeschaut.  Dabei ist mir aufgefallen, da"s einige Spr"unge nicht
  14393.          auf das gew"unschte Ziel, sondern auf sich selbst zeigen!}
  14394. \item[A:]{Dieser Effekt tritt bei Vorw"artsspr"ungen auf, bei denen der
  14395.          Formelparser von \asname{} im ersten Pass die Zieladresse noch nicht kennen
  14396.          kann.  Da der Formelparser ein unabh"angiges Modul ist, mu"s er sich
  14397.          in einem solchen Fall einen Wert ausdenken, der auch relativen
  14398.          Spr"ungen mit kurzer Reichweite nicht wehtut, und dies ist nun
  14399.          einmal die aktuelle Programmz"ahleradresse selber...im zweiten Pass
  14400.          w"aren die korrekten Werte erschienen, aber zu diesem ist es nicht
  14401.          gekommen, da schon im ersten Pass Fehler auftraten.  Korrigieren
  14402.          Sie die anderen Fehler zuerst, so da"s \asname{} zum zweiten Pass kommt,
  14403.          und das Listing sollte wieder vern"unftiger aussehen.}
  14404. \vspace{0.3cm}
  14405. \item[F:]{Mein Programm wird zwar korrekt assembliert, bei der Umwandlung
  14406.          mit P2BIN oder P2HEX erhalte ich aber nur eine leere Datei.}
  14407. \item[A:]{Dann haben Sie wahrscheinlich das Adre"s\-fil\-ter nicht korrekt
  14408.          eingestellt.  De\-faul\-tm"a"sig ist der Filter abgeschaltet, d.h.
  14409.          alle Daten werden "ubernommen, wenn ein manuell eingestellter
  14410.          Bereichsfilter nicht zu den benutzten Adressen pa"st, kann man
  14411.          mit der '-r' Option aber (versehentlich) auch leere Dateien
  14412.          erzeugen.}
  14413. \vspace{0.3cm}
  14414. \item[F:]{Ich bekomme unter Unix bei der Benutzung von P2BIN oder P2HEX
  14415.          das Dollarzeichen nicht eingegeben.  Die automatische
  14416.          Bereichsfestlegung funktioniert nicht, stattdessen gibt es
  14417.          eigenartige Fehlermeldungen.}
  14418. \item[A:]{Unix-Shells benutzen das Dollarzeichen zur Expansion von
  14419.          Shell-Variablen.  Wollen Sie ein Dollarzeichen an eine Anwendung
  14420.          durchreichen, stellen Sie einen Backslash (\verb!\!) voran.
  14421.          Im Falle der Adre"sangabe bei P2BIN und P2HEX darf aber auch
  14422.          \tty{0x} anstelle des Dollarzeichens benutzt werden, was dieses
  14423.          Problem von vornherein vermeidet.}
  14424. \vspace{0.3cm}
  14425. \item[F:]{Ich nutze \asname{} auf einem Linux-System, das Ladeprogramm f"ur
  14426.          mein Zielsystem l"auft aber auf einem Windows-Rechner.  Um das
  14427.          zu vereinfachen, greifen beide System auf das gleiche
  14428.          Netzwerklaufwerk zu.  Leider will die Windows-Seite aber die
  14429.          von der Linux-Seite erzeugten Hex-Dateien nicht lesen :-(}
  14430. \item[A:]{Windows- und Linux-Systeme benutzen ein etwas abweichendes
  14431.          Format f"ur Textdateien, unter die auch Hex-Dateien fallen.
  14432.          W"ahrend Windows jede Zeile mit den Zeichen CR (Carriage Return)
  14433.          und LF (Linefeed) abschlie"st, verwendet Linux nur ein Linefeed.
  14434.          Es h"angt nun von der ''Gutm"utigkeit'' eines Windows-Programms
  14435.          ab, ob es die Dateien im Linux-Format akzeptiert.  Falls nicht,
  14436.          kann man die Dateien anstelle "uber ein Netzwerklaufwerk "uber
  14437.          FTP im ASCII-Modus "ubertragen, oder man konvertiert die Dateien
  14438.          unter ins Windows-Format.  Das Programm {\em unix2dos} kann dazu
  14439.          z.B. verwendet werden, oder unter Linux ein kleines Script:
  14440.          \begin{verbatim}
  14441.          awk '{print $0"\r"}' test.hex >test_cr.hex
  14442.          \end{verbatim}}
  14443. \vspace{0.3cm}
  14444. \item[F:]{Ich habe in meinem Programm eine 16-bittige Adresse und mu"s
  14445.          die obere und untere H"alfte in getrennte CPU-Register laden.
  14446.          Wie extrahiere ich diese H"alften?  Bei anderen Assemblern
  14447.          gibt es daf"ur eingebaute Funktionen.}
  14448. \item[A:]{Das geht zum einen ,,zu Fu"s'' mit den logischen und
  14449.          Schiebeoperatoren, zum anderen bekommt man die Funktionen
  14450.          {\tt lo()} und {\tt hi()}, indem man die mitgelieferte Datei
  14451.          {\tt bitfuncs.inc} in das Programm inkludiert.}          
  14452. \end{description}
  14453.  
  14454. %%===========================================================================
  14455.  
  14456. \cleardoublepage
  14457. \chapter{Pseudobefehle und Integer-Syntax, gesammelt}
  14458. \label{SectPseudoInst}
  14459.  
  14460. In diesem Anhang finden sich noch einmal als schnelle Referenz alle
  14461. von \asname{} zur Verf"ugung gestellten Pseudobefehle.  Die Liste ist in zwei
  14462. Teile gegliedert: Im ersten Teil finden sich Befehle, die unabh"angig
  14463. vom eingestellten Zielprozessor vorhanden sind, danach folgen f"ur
  14464. jede Prozessorfamilie die zus"atzlich vorhandenen Befehle:
  14465.  
  14466. \subsubsection{Immer vorhandene Befehle}
  14467. \input{../doc_COM/pscomm.tex}
  14468. Zus"atzlich existieren:
  14469. \begin{itemize}
  14470. \item{\tty{SET} als Alias zu \tty{EVAL}, falls \tty{SET} nicht bereits ein
  14471.      Prozessorbefehl ist.}
  14472. \item{\tty{SHIFT} bzw. \tty{SHFT}, falls \tty{SHIFT} bereits ein Prozessorbefehl
  14473.      ist.}
  14474. \item{\tty{RESTORE} als Alias zu \tty{RESTOREENV}, falls \tty{RESTORE} nicht bereits ein
  14475.      Prozessorbefehl ist.}
  14476. \item{\tty{SAVE} als Alias zu \tty{SAVEENV}, falls \tty{SAVE} nicht bereits ein
  14477.      Prozessorbefehl ist.}
  14478. \item{\tty{PAGE} bzw. \tty{PAGESIZE}, falls \tty{PAGE} bereits ein Prozessorbefehl
  14479.      ist.}
  14480. \item{\tty{SWITCH} bzw. \tty{SELECT}, falls \tty{SWITCH} bereits ein Prozessorbefehl
  14481.      ist.}
  14482. \end{itemize}
  14483.  
  14484. \input{../doc_COM/pscpu.tex}
  14485.  
  14486. %%===========================================================================
  14487.  
  14488. \cleardoublepage
  14489. \chapter{Vordefinierte Symbole}\label{AppInternSyms}
  14490.  
  14491. \begin{center}\begin{longtable}{|l|l|l|l|}
  14492. \hline
  14493. Name             &  Datentyp   & Definition & Bedeutung \\
  14494. \hline\hline
  14495. \endhead
  14496. \tty{ARCHITECTURE} & String    & vordef.    & Zielplattform, f"ur die \asname{} \\
  14497.                 &             &            & "ubersetzt wurde, in der Form \\
  14498.                 &             &            & Prozesor-Hersteller-Betriebs- \\
  14499.                 &             &            & system \\
  14500. \hline
  14501. \tty{BIGENDIAN}  &  Boolean    & normal     & Konstantenablage mit MSB \\
  14502.                 &             &            & first ? \\
  14503. \hline
  14504. \tty{CASESENSITIVE} & Boolean  & normal     & Unterscheidung von Gro"s- \\
  14505.                 &             &            & und Kleinbuchstaben in \\
  14506.                 &             &            & Symbolnamen ? \\
  14507. \hline
  14508. \tty{CONSTPI}    &  Gleitkomma & normal     & Kreiszahl Pi (3.1415.....) \\
  14509. \hline
  14510. \tty{DATE}       &  String     & vordef.    & Datum des Beginns der  \\
  14511.                 &             &            & Assemblierung (1.Pass) \\
  14512. \hline
  14513. \tty{FALSE}      &  Boolean    & vordef.    & 0 = logisch ,,falsch'' \\
  14514. \hline
  14515. \tty{HASFPU}     &  Boolean    & dynam.(0)  & Koprozessor-Befehle \\
  14516.                 &             &            & freigeschaltet ? \\
  14517. \hline
  14518. \tty{HASPMMU}    &  Boolean    & dynam.(0)  & MMU-Befehle frei- \\
  14519.                 &             &            & geschaltet ? \\
  14520. \hline
  14521. \tty{INEXTMODE}  &  Boolean    & dynam.(0)  & XM-Flag f"ur 4 Gbyte \\
  14522.                 &             &            & Adre"sraum gesetzt ? \\
  14523. \hline
  14524. \tty{INLWORDMODE} & Boolean    & dynam.(0)  & LW-Flag f"ur 32-Bit-Befehle \\
  14525.                 &             &            & gesetzt ? \\
  14526. \hline
  14527. \tty{INMAXMODE}  &  Boolean    & dynam.(0)  & Prozessor im Maximum- \\
  14528.                 &             &            & Modus ? \\
  14529. \hline
  14530. \tty{INSUPMODE}  &  Boolean    & dynam.(0)  & Prozessor im Supervisor- \\
  14531.                 &             &            & Modus ? \\
  14532. \hline
  14533. \tty{INSRCMODE}  &  Boolean    & dynam.(0)  & Prozessor im Quellmodus ? \\
  14534. \hline
  14535. \tty{FULLPMMU}   &  Boolean    & dynam.(0/1) & voller PMMU-Befehlssatz ? \\
  14536. \hline
  14537. \tty{LISTON}     &  Boolean    & dynam.(1)  & Listing freigeschaltet ? \\
  14538. \hline
  14539. \tty{MACEXP}     &  Boolean    & dynam.(1)  & Expansion von Makrokon- \\
  14540.                 &             &            & strukten im Listing \\
  14541.                 &             &            & freigeschaltet ? \\
  14542. \hline
  14543. \tty{MOMCPU}     &  Integer    & dynam.     & Nummer der momentan \\
  14544.                 &             & (68008)    & gesetzten Ziel-CPU \\
  14545. \hline
  14546. \tty{MOMCPUNAME} &  String     & dynam.     & Name der momentan \\
  14547.                 &             & (68008)    & gesetzten Ziel-CPU \\
  14548. \hline
  14549. \tty{MOMFILE}    &  String     & Spezial    & augenblickliche Quelldatei \\
  14550.                 &             &            & (schlie"st Includes ein) \\
  14551. \hline
  14552. \tty{MOMLINE}    &  Integer    & Spezial    & aktuelle Zeilennummer in \\
  14553.                 &             &            & der Quelldatei \\
  14554. \hline
  14555. \tty{MOMPASS}    &  Integer    & Spezial    & Nummer des laufenden \\
  14556.                 &             &            & Durchgangs \\
  14557. \hline
  14558. \tty{MOMSECTION} &  String     & Spezial    & Name der aktuellen Sektion \\
  14559.                 &             &            & oder Leerstring, fall au"ser- \\
  14560.                 &             &            & halb aller Sektionen \\
  14561. \hline
  14562. \tty{MOMSEGMENT} &  String     & Spezial    & Name des mit \tty{SEGMENT} ein- \\
  14563.                 &             &            & gestellten Adre"sraumes \\
  14564. \hline
  14565. \tty{NESTMAX}    &  Integer    & dynam.(256)& maximale Verschachtelungs- \\
  14566.                 &             &            & tiefe f"ur Makros \\
  14567. \hline
  14568. \tty{PADDING}    &  Boolean    & dynam.(1)  & Auff"ullen von Bytefeldern \\
  14569.                 &             &            & auf ganze Anzahl ? \\
  14570. \hline
  14571. \tty{RELAXED}    &  Boolean    & dynam.(0)  & Schreibweise von Integer-Kon- \\
  14572.                 &             &            & stanten in beliebiger Syntax \\
  14573.                 &             &            & erlaubt ? \\
  14574. \hline
  14575. \tty{PC}         &  Integer    & Spezial    & mom. Programmz"ahler \\
  14576.                 &             &            & (Thomson) \\
  14577. \hline
  14578. \tty{TIME}       &  String     & vordef.    & Zeit des Beginns der Assem- \\
  14579.                 &             &            & blierung (1. Pass) \\
  14580. \hline
  14581. \tty{TRUE}       &  Integer    & vordef.    & 1 = logisch ,,wahr'' \\
  14582. \hline
  14583. \tty{VERSION}    &  Integer    & vordef.    & Version von \asname{} in BCD-Kodie- \\
  14584.                 &             &            & rung, z.B. 1331 hex f"ur \\
  14585.                 &             &            & Version 1.33p1 \\
  14586. \hline
  14587. \tty{WRAPMODE}   &  Integer    & vordef.    & verk"urzter Programmz"ahler \\
  14588.                 &             &            & angenommen? \\
  14589. \hline
  14590. \verb!*!         &  Integer    & Spezial    & mom. Programmz"ahler \\
  14591.                 &             &            & (Motorola, Rockwell, \\
  14592.                 &             &            & Microchip, Hitachi) \\
  14593. \hline
  14594. .                &  Integer    & Spezial    & mom. Programmz"ahler \\
  14595.                 &             &            & (IM61x0) \\
  14596. \hline
  14597. \tty{\$}         &  Integer    & Spezial    & mom. Programmz"ahler (Intel, \\
  14598.                 &             &            & Zilog, Texas, Toshiba, NEC, \\
  14599.                 &             &            & Siemens, AMD) \\
  14600. \hline
  14601. \end{longtable}\end{center}
  14602.  
  14603. Boolean-Symbole sind eigentlich normale normale Integer-Symbole, mit
  14604. dem Unterschied, da"s ihnen von \asname{} nur zwei verschiedene Werte (0 oder
  14605. 1, entsprechend FALSE oder TRUE) zugewiesen werden.  Spezialsymbole
  14606. werden von \asname{} nicht in der Symboltabelle abgelegt, sondern aus
  14607. Geschwindigkeitsgr"unden direkt im Parser abgefragt.  Sie tauchen daher
  14608. auch nicht in der Symboltabelle des Listings auf.  W"ahrend vordefinierte
  14609. Symbole nur einmal am Anfang eines Passes besetzt werden, k"onnen sich
  14610. die Werte dynamischer Symbole w"ahrend der Assemblierung mehrfach "andern,
  14611. da sie mit anderen Befehlen vorgenommene Einstellungen widerspiegeln.
  14612. \par
  14613. Die hier aufgelistete Schreibweise ist diejenige, mit der man die
  14614. Symbole auch im case-sensitiven Modus erreicht.
  14615. \par
  14616. Die hier aufgef"uhrten Namen sollte man f"ur eigene Symbole meiden;
  14617. entweder kann man sie zwar definieren, aber nicht darauf zugreifen
  14618. (bei Spezialsymbolen), oder man erh"alt eine Fehlermeldung wegen eines
  14619. doppelt definierten Symboles.  Im gemeinsten Fall f"uhrt die Neubelegung
  14620. durch \asname{} zu Beginn eines Passes zu einem Phasenfehler und einer
  14621. Endlosschleife...
  14622.  
  14623.  
  14624. %%===========================================================================
  14625.  
  14626. \cleardoublepage
  14627. \chapter{Mitgelieferte Includes}
  14628.  
  14629. Der Distribution von \asname{} liegen eine Reihe von Include-Dateien bei.  Neben
  14630. Includes, die sich nur auf eine Prozessorfamilie beziehen (und deren
  14631. Funktion sich demjenigen unmittelbar erschlie"st, der mit dieser Familie
  14632. arbeitet), existieren aber auch ein paar Dateien, die prozessorunabh"angig
  14633. sind und die eine Reihe n"utzlicher Funktionen implementieren.  Die
  14634. definierten Funktionen sollen hier kurz beschrieben werden:
  14635.  
  14636. \section{BITFUNCS.INC}
  14637.  
  14638. Diese Datei definiert eine Reihe bitorientierter Operationen, wie man sie
  14639. bei anderen Assemblern vielleicht fest eingebaut sind.  Bei \asname{} werden sie
  14640. jedoch mit Hilfe benutzerdefinierter Funktionen implementiert:
  14641.  
  14642. \begin{itemize}
  14643. \item{{\em mask(start,bits)} liefert einen Integer, in dem ab Stelle {\em
  14644.      start} {\em bits} Bits gesetzt sind;}
  14645. \item{{\em invmask(start,bits)} liefert das Einerkomplement zu {\em mask()};}
  14646. \item{{\em cutout(x,start,bits)} liefert ausmaskierte {\em bits} Bits ab
  14647.      Stelle {\em start} aus {\em x}, ohne sie auf Stelle 0 zu
  14648.      verschieben;}
  14649. \item{{\em hi(x)} liefert das zweitniedrigste Byte (Bit 8..15) aus {\em
  14650.      x};}
  14651. \item{{\em lo(x)} liefert das niederwertigste Byte (Bit 0..7) aus {\em
  14652.      x};}
  14653. \item{{\em hiword(x)} liefert das zweitniedrigste Wort (Bit 16..31) aus
  14654.      {\em x};}
  14655. \item{{\em loword(x)} liefert das niederwertigste Wort (Bit 0..15) aus
  14656.      {\em x};}
  14657. \item{{\em odd(x)} liefert TRUE, falls {\em x} ungerade ist;}
  14658. \item{{\em even(x)} liefert TRUE, falls {\em x} gerade ist;}
  14659. \item{{\em getbit(x,n)} extrahiert das Bit {\em n} aus {\em x} und liefert
  14660.      es als 0 oder 1;}
  14661. \item{{\em shln(x,size,n)} schiebt ein Wort {\em x} der L"ange {\em size}
  14662.      Bits um {\em n} Stellen nach links;}
  14663. \item{{\em shrn(x,size,n)} schiebt ein Wort {\em x} der L"ange {\em size}
  14664.      Bits um {\em n} Stellen nach rechts;}
  14665. \item{{\em rotln(x,size,n)} rotiert die untersten {\em size} Bits eines
  14666.      Integers {\em x} um {\em n} Stellen nach links;}
  14667. \item{{\em rotrn(x,size,n)} rotiert die untersten {\em size} Bits eines
  14668.      Integers {\em x} um {\em n} Stellen nach rechts;}
  14669. \end{itemize}
  14670.  
  14671. \section{CTYPE.INC}
  14672.  
  14673. Dieser Include ist das Pendant zu dem bei C vorhandenen Header {\tt
  14674. ctype.h}, der Makros zur Klassifizierung von Zeichen anbietet.  Alle
  14675. Funktionen liefern entweder TRUE oder FALSE:
  14676.  
  14677. \begin{itemize}
  14678. \item{{\em isdigit(ch)} ist TRUE, falls {\em ch} eine Ziffer (0..9)
  14679.      ist;}
  14680. \item{{\em isxdigit(ch)} ist TRUE, falls {\em ch} eine g"ultige
  14681.      Hexadezimal-Ziffer (0..9, A..F, a..f) ist;}
  14682. \item{{\em isascii(ch)} ist TRUE, falls {\em ch} sich im Bereich
  14683.      normaler ASCII-Zeichen ohne gesetztes Bit 7 bewegt;}
  14684. \item{{\em isupper(ch)} ist TRUE, falls {\em ch} ein Gro"sbuchstabe
  14685.      ist (Sonderzeichen ausgenommen);}
  14686. \item{{\em islower(ch)} ist TRUE, falls {\em ch} ein Kleinbuchstabe
  14687.      ist (Sonderzeichen ausgenommen);}
  14688. \item{{\em isalpha(ch)} ist TRUE, falls {\em ch} ein Buchstabe ist
  14689.      (Sonderzeichen ausgenommen);}
  14690. \item{{\em isalnum(ch)} ist TRUE, falls {\em ch} ein Buchstabe oder
  14691.      eine Ziffer ist);}
  14692. \item{{\em isspace(ch)} ist TRUE, falls {\em ch} ein 'Leerzeichen'
  14693.      (Space, Formfeed, Zeilenvorschub, Wagenr"ucklauf, Tabulator)
  14694.      ist);}
  14695. \item{{\em isprint(ch)} ist TRUE, falls {\em ch} ein druckbares
  14696.      Zeichen ist (also kein Steuerzeichen bis Code 31);}
  14697. \item{{\em iscntrl(ch)} ist das Gegenteil zu {\em isprint()};}
  14698. \item{{\em isgraph(ch)} ist TRUE, falls {\em ch} ein druckbares
  14699.      und {\it sichtbares} Zeichen ist;}
  14700. \item{{\em ispunct(ch)} ist TRUE, falls {\em ch} ein druckbares
  14701.      Sonderzeichen ist (d.h. weder Space, Buchstabe noch Ziffer);}
  14702. \end{itemize}
  14703.  
  14704. %%===========================================================================
  14705.  
  14706. \cleardoublepage
  14707. \chapter{Danksagungen}
  14708.  
  14709. \begin{quote}{\it
  14710. ''If I have seen farther than other men, \\
  14711. it is because I stood on the shoulders of giants.'' \\
  14712. \hspace{2cm} --Sir Isaac Newton}
  14713. \end{quote}
  14714. \begin{quote}{\it
  14715. ''If I haven't seen farther than other men, \\
  14716. it is because I stood in the footsteps of giants.'' \\
  14717. \hspace{2cm} --unknown}
  14718. \end{quote}
  14719. \par
  14720. Es hei"st ja bisweilen, die Programme, die man schreibe, w"aren so
  14721. etwas wie eigene Kinder, die man in die Welt setzt.  Ich arbeite an
  14722. diesem Assembler seit "uber 30 Jahren, und bin mittlerweile der
  14723. Ansicht, so ein Projekt ist viel mehr eine Reise, auf die man sich
  14724. begibt: Die Begegnungen mit Menschen, die man auf den Stationen
  14725. dieses Weges trifft, sind mindestens eben so wichtig wie das
  14726. vermeintliche Ziel selber.  Man lernt Neues kennen, und versteht im
  14727. besten Falle, da"s man Dinge auch aus einer ganz anderen Warte sehen
  14728. kann.  Wenn es gut l"auft, bringt das dann beide Seiten weiter.
  14729. \par
  14730. Einige Menschen sind mir auf diesem Weg besonders in Erinnerung
  14731. geblieben, weil sie auf ihre Weise dazu beigetragen haben, dieses
  14732. Projekt dorthin zu bringen, wo es jetzt ist.  Die folgende Aufz"ahlung
  14733. ist notwendigerweise unvollst"andig, einfach weil ich mich nach den
  14734. Jahren nicht mehr an jede Begebenheit erinnere.  Der zuvorderste Dank
  14735. gent daher an all die Personen, deren Namen ich in diesem Kapitel
  14736. unabsichtlich unterschlagen habe.  Die Reise geht immer noch weiter,
  14737. und vielleicht kreuzen sich die Wege wieder!
  14738. \par
  14739. \asname{} als Universalassembler, wie er jetzt besteht, ist auf Anregung von
  14740. Bernhard (C.) Zschocke entstanden, der einen ,,studentenfreundlichen'',
  14741. d.h. kostenlosen 8051-Assembler f"ur sein Mikroprozessorpraktikum
  14742. brauchte und mich dazu bewegt hat, einen bereits bestehenden
  14743. 68000-Assembler zu erweitern.  Von dortan nahm die Sache ihren Lauf...
  14744. Das Mikroprozessorpraktikum an der RWTH Aachen hat auch immer die
  14745. eifrigsten Nutzer der neuesten \asname{}-Features (und damit Bug-Sucher)
  14746. gestellt und damit einiges zur jetzigen Qualit"at von \asname{} beigetragen.
  14747. \par
  14748. Das Internet und FTP haben sich als gro"se Hilfe bei der Meldung von
  14749. Bugs und der Verbreitung von \asname{} erwiesen.  Ein Dank geht daher an
  14750. die FTP-Administratoren (Bernd Casimir in Stuttgart, Norbert Breidohr
  14751. in Aachen und J"urgen Mei"sburger in J"ulich).  Insbesondere letzterer
  14752. hat sich sehr engagiert, um eine praxisnahe L"osung im ZAM zu
  14753. finden.
  14754. \par
  14755. Ach ja, wo wir schon im ZAM sind: Wolfgang E. Nagel hat zwar nichts
  14756. direkt mit \asname{} zu tun, immerhin war er aber mein Betreuer und
  14757. Vorgesetzter und warf
  14758. st"andig vier Augen auf das, was ich tue.  Bei \asname{} scheint zumindest
  14759. ein lachendes dabei zu sein...
  14760. \par
  14761. Ein Projekt wie \asname{} ist ohne Input und Informationen nicht zu
  14762. leisten, sei es zu den unterst"utzten Prozessoren selber, zu
  14763. Programmiertechniken oder wie Dinge implementiert werden sollten.
  14764. Ich habe von einer enormen Anzahl von Menschen R"uckmeldungen
  14765. bekommen, die von einem kleinen Tip bis zu ganzen Datenb"uchern
  14766. reichen.  Hier eine Aufz"ahlung (wie wie oben gesagt, mit Sicherheit
  14767. unvollst"andig ist!):
  14768. \par
  14769. Ernst Ahlers, Charles Altmann, Marco Awater, Len Bayles, Andreas
  14770. Bolsch, Rolf Buchholz, Bernd Casimir, Nils Eilers, Gunther Ewald,
  14771. Michael Haardt, Stephan Hruschka, Fred van Kempen, Peter
  14772. Kliegelh"ofer, Ulf Meinke, Udo M"oller, Matthias Paul, Norbert Rosch,
  14773. Curt J.  Sampson, Steffen Schmid, Leonhard Schneider, Ernst Schwab,
  14774. Michael Schwingen, Oliver Sellke, Christian Stelter, Patrik
  14775. Str"omdahl, Tadashi G.  Takaoka, Oliver Thamm, Thorsten Thiele,
  14776. Leszek Ulman, Rob Warmelink, Andreas Wassatsch, John Weinrich.
  14777. \par
  14778. ...und ein leicht ironischer Dank geht an Rolf-Dieter-Klein und Tobias Thiel, die
  14779. mich mit ihren ASM68K dazu angeregt haben, "uberhaupt einen eigenen
  14780. Assembler zu schreiben.  einige Dinge darin funktionierten nicht so,
  14781. wie ich es mir vorgestellt hatte, und das war der Anlass, es besser
  14782. oder zumindest anders zu machen.
  14783. \par
  14784. So ganz allein habe ich \asname{} auch nicht geschrieben.  Die DOS-Version
  14785. von \asname{} enthielt die OverXMS-Routinen von Wilbert van Leijen,
  14786. um die Overlay-Module ins Extended Memory verlagern zu k"onnen.  Eine
  14787. wirklich feine Sache, einfach und problemlos anzuwenden!
  14788. \par
  14789. Die TMS320C2x/5x-Codegeneratoren sowie die Datei \tty{STDDEF2x.INC}
  14790. stammen von Thomas Sailer, ETH Z"urich.  Erstaunlich, an einem Wochenende
  14791. hat er es geschafft, durch meinen Code durchzusteigen und den neuen
  14792. Generator zu implementieren.  Entweder waren das reichliche Nachtschichten
  14793. oder ich werde langsam alt...gleiches Lob geb"uhrt Haruo Asano f"ur
  14794. die Targets MN1610/MN1613, IM6100, CP1600, Renesas RX und HP
  14795. NanoProcessor.
  14796.  
  14797. %%===========================================================================
  14798.  
  14799. \cleardoublepage
  14800. \chapter{"Anderungen seit Version 1.3}
  14801.  
  14802. \begin{itemize}
  14803. \item{Version 1.31:
  14804.      \begin{itemize}
  14805.      \item{zus"atzlicher MCS-51-Prozessortyp 80515.  Die Nummer wird
  14806.            wiederum nur vom Assembler verwaltet.  Die Datei STDDEF51.INC
  14807.            wurde um die dazugeh"origen SFRs erweitert. \bb{ACHTUNG!}
  14808.            Einige 80515-SFRs haben sich adre"sm"a"sig verschoben!}
  14809.      \item{zus"atzlich Prozessor Z80 unterst"utzt;}
  14810.      \item{schnellerer 680x0-Codegenerator.}
  14811.      \end{itemize}}
  14812. \item{Version 1.32:
  14813.      \begin{itemize}
  14814.      \item{Schreibweise von Zeropageadressen f"ur 65xx nicht mehr als
  14815.            Adr.z, sondern wie beim 68xx als $<$Adr;}
  14816.      \item{unterst"utzt die Prozessoren 6800, 6805, 6301 und 6811;}
  14817.      \item{der 8051-Teil versteht jetzt auch \tty{DJNZ}, \tty{PUSH} und
  14818.            \tty{POP} (sorry);}
  14819.      \item{im Listing werden neben den Symbolen jetzt auch die definierten
  14820.            Makros aufgelistet;}
  14821.      \item{Befehle \tty{IFDEF}/\tty{IFNDEF} f"ur bedingte Assemblierung,
  14822.            mit denen sich die Existenz eines Symboles abfragen l"a"st;}
  14823.      \item{Befehle \tty{PHASE}/\tty{DEPHASE} zur Unterst"utzung von Code, der zur
  14824.            Laufzeit auf eine andere Adresse verschoben werden soll;}
  14825.      \item{Befehle \tty{WARNING}/\tty{ERROR}/\tty{FATAL}, um anwenderspezifische
  14826.            Fehlermeldungen ausgeben zu k"onnen;}
  14827.      \item{Die Datei STDDEF51.INC enth"alt zus"atzlich das Makro \tty{USING}
  14828.            zur einfacheren Handhabung der Registerb"anke der MCS-51er;}
  14829.      \item{Kommandozeilenoption \tty{u}, um Segmentbelegung anzuzeigen.}
  14830.      \end{itemize}}
  14831. \item{Version 1.33:
  14832.      \begin{itemize}
  14833.      \item{unterst"utzt den 6809;}
  14834.      \item{zus"atzlich Stringvariablen;}
  14835.      \item{Die Befehle \tty{TITLE}, \tty{PRTINIT}, \tty{PRTEXIT},
  14836.            \tty{ERROR}, \tty{WARNING} und \tty{FATAL} erwarten jetzt
  14837.             einen Stringausdruck als Parameter, Konstanten
  14838.            m"ussen demzufolge nicht mehr in Hochkommas, sondern in
  14839.            G"ansef"u"schen eingeschlossen werden. Analoges gilt f"ur \tty{DB},
  14840.            \tty{DC.B} und \tty{BYT};}
  14841.      \item{Befehl \tty{ALIGN} zur Ausrichtung des Programmz"ahlers bei Intel-
  14842.            Prozessoren;}
  14843.      \item{Befehl \tty{LISTING}, um die Erzeugung eines Listings ein- und
  14844.            ausschalten zu k"onnen;}
  14845.      \item{Befehl \tty{CHARSET} zur Definition eigener Zeichens"atze.}
  14846.      \end{itemize}}
  14847. \item{Version 1.34:
  14848.      \begin{itemize}
  14849.      \item{Wenn im ersten Pass Fehler auftreten, wird gar kein zweiter
  14850.            Pass mehr durchgef"uhrt;}
  14851.      \item{neues vordefiniertes Symbol \tty{VERSION}, welches die Version von
  14852.            \asname{} enth"alt;}
  14853.      \item{Befehl \tty{MESSAGE}, um Durchsagen und Meldungen programmgesteuert
  14854.            zu erzeugen;}
  14855.      \item{Formelparser "uber Stringkonstanten zug"anglich;}
  14856.      \item{Bei Fehler in Makroexpansionen wird zus"atzlich die laufende
  14857.            Zeile im Makro angezeigt;}
  14858.      \item{Funktion \tty{UPSTRING}, um einen String in Gro"sbuchstaben zu
  14859.            wandeln.}
  14860.      \end{itemize}}
  14861. \item{Version 1.35:
  14862.      \begin{itemize}
  14863.      \item{Funktion \tty{TOUPPER}, um ein einzelnes Zeichen in Gro"sbuchstaben
  14864.            zu wandeln;}
  14865.      \item{Befehl \tty{FUNCTION}, um eigene Funktionen definieren zu k"onnen;}
  14866.      \item{Kommandozeilenoption \tty{D}, um Symbole von au"sen definieren zu
  14867.            k"onnen;}
  14868.      \item{Fragt die Environment-Variable \tty{ASCMD} f"ur h"aufig gebrauchte
  14869.            Optionen ab;}
  14870.      \item{bei gesetzter \tty{u}-Option wird das Programm zus"atzlich auf doppelt
  14871.            belegte Speicherbereiche abgepr"uft;}
  14872.      \item{Kommandozeilenoption \tty{C}, um eine Querverweisliste zu erzeugen.}
  14873.      \end{itemize}}
  14874. \item{Version 1.36:
  14875.      \begin{itemize}
  14876.      \item{unterst"utzt zus"atzlich die Familien PIC 16C5x und
  14877.            PIC17C4x;}
  14878.      \item{im Listing wird zus"atzlich die Verschachtelungsebene bei
  14879.            Include-Dateien angezeigt;}
  14880.      \item{in der Querverweisliste wird zus"atzlich die Stelle angezeigt,
  14881.            an der ein Symbol definiert wurde;}
  14882.      \item{Kommandozeilenoption \tty{A}, um eine kompaktere Ablage der
  14883.            Symboltabelle zu erzwingen.}
  14884.      \end{itemize}}
  14885. \item{Version 1.37:
  14886.      \begin{itemize}
  14887.      \item{unterst"utzt zus"atzlich die Prozessoren 8086, 80186, V30,
  14888.            V35, 8087 und Z180;}
  14889.      \item{Befehle \tty{SAVE} und \tty{RESTORE} zur besseren Umschaltung
  14890.            von Flags;}
  14891.      \item{Operatoren zur logischen Verschiebung und Bitspiegelung;}
  14892.      \item{Kommandozeilenoptionen k"onnen mit einem Pluszeichen negiert
  14893.            werden;}
  14894.      \item{Filter \tty{AS2MSG} zur bequemen Arbeit mit \asname{} unter Turbo-Pascal 7.0;}
  14895.      \item{\tty{ELSEIF} darf ein Argument zur Bildung von
  14896.            \tty{IF-THEN-ELSE}-Leitern haben;}
  14897.      \item{Zur bequemeren bedingten Assemblierung zus"atzlich ein
  14898.            \tty{CASE}-Konstrukt;}
  14899.      \item{Selbst definierte Funktionen d"urfen mehr als ein Argument haben;}
  14900.      \item{P2HEX kann nun auch Hexfiles f"ur 65er-Prozessoren erzeugen;}
  14901.      \item{BIND, P2HEX und P2BIN haben jetzt die gleichen
  14902.            Variationsm"oglichkeiten in der Kommandozeile wie \asname{};}
  14903.      \item{Schalter \tty{i} bei P2HEX, um 3 Varianten f"ur den Ende-Record
  14904.            einzustellen;}
  14905.      \item{Neue Funktionen \tty{ABS} und \tty{SGN};}
  14906.      \item{Neue Pseudovariablen \tty{MOMFILE} und \tty{MOMLINE};}
  14907.      \item{Ausgabem"oglichkeit erweiterter Fehlermeldungen;}
  14908.      \item{Befehle \tty{IFUSED} und \tty{IFNUSED}, um abzufragen, ob ein
  14909.            Symbol bisher benutzt wurde;}
  14910.      \item{Die Environment-Variablen \tty{ASCMD}, \tty{BINDCMD} usw. k"onnen auch
  14911.            einen Dateinamen enthalten, in dem f"ur die Optionen mehr
  14912.            Platz ist;}
  14913.      \item{P2HEX erzeugt nun die von Microchip vorgegebenen Hex-Formate
  14914.            (p4);}
  14915.      \item{mit der Seitenl"angenangabe 0 k"onnen automatische
  14916.            Seitenvorsch"ube im Listing vollst"andig unterdr"uckt werden
  14917.            (p4);}
  14918.      \item{neue Kommandozeilenoption \tty{P}, um die Ausgabe des Makroprozessors
  14919.            in eine Datei zu schreiben (p4);}
  14920.      \item{in der Kommandozeile definierte Symbole d"urfen nun auch mit
  14921.            einem frei w"ahlbaren Wert belegt werden (p5).}
  14922.      \end{itemize}}
  14923. \item{Version 1.38:
  14924.      \begin{itemize}
  14925.      \item{Umstellung auf Mehrpass-Betrieb.  Damit kann \asname{} auch bei
  14926.            Vorw"artsreferenzen immer den optimalen Code erzeugen;}
  14927.      \item{Der 8051-Teil kennt nun auch die Befehle \tty{JMP} und \tty{CALL};}
  14928.      \item{unterst"utzt zus"atzlich die Toshiba TLCS-900-Reihe (p1);}
  14929.      \item{Befehl \tty{ASSUME}, um dem Assembler die Belegung der
  14930.            Segmentregister des 8086 mitzuteilen (p2);}
  14931.      \item{unterst"utzt zus"atzlich die ST6-Reihe von SGS-Thomson (p2);}
  14932.      \item{..sowie die 3201x-Signalprozessoren von Texas Instruments (p2);}
  14933.      \item{Option \tty{F} bei P2HEX, um die automatische Formatwahl "ubersteuern
  14934.            zu k"onnen (p2);}
  14935.      \item{P2BIN kann nun auch durch Angabe von Dollarzeichen Anfang und
  14936.            Ende des Adre"sfensters selbstst"andig festlegen (p2);}
  14937.      \item{Der 8048-Codegenerator kennt nun auch die 8041/42-
  14938.            Befehlserweiterungen(p2);}
  14939.      \item{unterst"utzt zus"atzlich die Zilog Z8-Mikrokontroller(p3).}
  14940.      \end{itemize}}
  14941. \item{Version 1.39:
  14942.      \begin{itemize}
  14943.      \item{Definitionsm"oglichkeit von Sektionen und lokalen Labels;}
  14944.      \item{Kommandozeilenschalter \tty{h}, um Hexadezimalzahlenausgabe mit
  14945.            Kleinbuchstaben zu erzwingen;}
  14946.      \item{Variable \tty{MOMPASS}, um die Nummer des augenblicklichen Durchganges
  14947.            abfragen zu k"onnen;}
  14948.      \item{Kommandozeilenschalter \tty{t}, um einzelne Teile des Assemblerlistings
  14949.            ausblenden zu k"onnen;}
  14950.      \item{kennt zus"atzlich die L-Variante der TLCS-900-Reihe von Toshiba
  14951.            und die MELPS-7700-Reihe von Mitsubishi (p1);}
  14952.      \item{P2HEX akzeptiert nun auch Dollarzeichen f"ur Start-und Endadresse
  14953.            (p2);}
  14954.      \item{unterst"utzt zus"atzlich die TLCS90-Familie von Toshiba (p2);}
  14955.      \item{P2HEX kann Daten zus"atzlich im Tektronix- und 16-Bit
  14956.            Intel-Hex-Format ausgeben (p2);}
  14957.      \item{bei Adre"s"uberschreitungen gibt P2HEX Warnungen aus (p2);}
  14958.      \item{Include-Datei STDDEF96.INC mit Adre"sdefinitionen f"ur die
  14959.            TLCS-900-Reihe (p3);}
  14960.      \item{Befehl \tty{READ}, um Werte w"ahrend der Assemblierung interaktiv
  14961.            einlesen zu k"onnen (p3);}
  14962.      \item{Fehlermeldungen werden nicht mehr einfach auf die
  14963.            Standardausgabe, sondern auf den von DOS daf"ur vorgesehenen
  14964.            Kanal (STDERR) geschrieben (p3);}
  14965.      \item{Der beim 6811-Teil fehlende \tty{STOP}-Befehl ist nun da (scusi,p3);}
  14966.      \item{unterst"utzt zus"atzlich die $\mu$PD78(C)1x-Familie von NEC (p3);}
  14967.      \item{unterst"utzt zus"atzlich den PIC16C84 von Microchip (p3);}
  14968.      \item{Kommandozeilenschalter \tty{E}, um die Fehlermeldungen in eine Datei
  14969.            umleiten zu k"onnen (p3);}
  14970.      \item{Die Unklarheiten im 78(C)1x-Teil sind beseitigt (p4);}
  14971.      \item{neben dem MELPS-7700 ist nun auch das ,,Vorbild'' 65816
  14972.            vorhanden (p4);}
  14973.      \item{Die ST6-Pseudoanweisung \tty{ROMWIN} wurde entfernt und
  14974.            mit in den \tty{ASSUME}-Befehl eingegliedert (p4);}
  14975.      \item{unterst"utzt zus"atzlich den 6804 von SGS-Thomson (p4);}
  14976.      \item{durch die \tty{NOEXPORT}-Option in der Makrodefinition
  14977.            kann nun f"ur jedes Makro einzeln festgelegt werden, ob es
  14978.            in der MAC-Datei erscheinen soll oder nicht (p4);}
  14979.      \item{Die Bedeutung von \tty{MACEXP} f"ur Expansionen von Makros hat
  14980.            sich wegen der zus"atzlichen \tty{NOEXPAND}-Option in der
  14981.            Makrodefinition leicht ge"andert (p4);}
  14982.      \item{Durch die \tty{GLOBAL}-Option in der Makrodefinition k"onnen nun
  14983.            zus"atzlich Makros definiert werden, die durch ihren
  14984.            Sektionsnamen eindeutig gekennzeichnet sind (p4).}
  14985.      \end{itemize}}
  14986. \item{Version 1.40:
  14987.      \begin{itemize}
  14988.      \item{unterst"utzt zus"atzlich den DSP56000 von Motorola;}
  14989.      \item{P2BIN kann nun auch das untere bzw. obere Wort aus
  14990.            32-Bit-W"ortern abtrennen;}
  14991.      \item{unterst"utzt zus"atzlich die TLCS-870- und TLCS-47-Familie
  14992.            von Toshiba(p1);}
  14993.      \item{mit einem vorangestelltem ! kann man durch Makros
  14994.            ,,verdeckte'' Maschinenbefehle wieder erreichen(p1);}
  14995.      \item{mit der \tty{GLOBAL}-Anweisung lassen sich Symbolnamen
  14996.            nun auch qualifiziert exportieren(p1);}
  14997.      \item{mit der \tty{r}-Option kann man sich nun eine Liste der
  14998.            Stellen erzeugen lassen, die zus"atzliche Durchl"aufe
  14999.            erzwangen(p1);}
  15000.      \item{bei der \tty{E}-Option kann nun die Dateiangabe weggelassen werden,
  15001.            so da"s ein passender Default gew"ahlt wird(p1);}
  15002.      \item{mit der \tty{t}-Option kann nun die Zeilennumerierung im Listing
  15003.            abgeschaltet werden(p1);}
  15004.      \item{Escapesequenzen sind nun auch in in ASCII geschriebenen
  15005.            Integerkonstanten zul"assig(p1);}
  15006.      \item{Mit dem Pseudobefehl \tty{PADDING} kann das Einf"ugen
  15007.            von F"ullbytes im 680x0-Modus ein- und ausgeschaltet
  15008.            werden (p2);}
  15009.      \item{\tty{ALIGN} ist nun f"ur alle Zielplattformen erlaubt (p2);}
  15010.      \item{kennt zus"atzlich die PIC16C64-SFRs (p2);}
  15011.      \item{unterst"utzt zus"atzlich den 8096 von Intel (p2);}
  15012.      \item{Bei \tty{DC} kann zus"atzlich ein Wiederholungsfaktor angegeben
  15013.            werden (r3);}
  15014.      \item{unterst"utzt zus"atzlich die TMS320C2x-Familie von Texas
  15015.            Instruments (Implementierung von Thomas Sailer, ETH Z"urich,
  15016.            r3); P2HEX ist auch entsprechend erweitert;}
  15017.      \item{statt \tty{EQU} darf nun auch einfach ein Gleichheitszeichen
  15018.            benutzt werden (r3);}
  15019.      \item{zur Definition von Aufz"ahlungen zus"atzlich ein
  15020.            \tty{ENUM}-Befehl (r3);}
  15021.      \item{\tty{END} hat jetzt auch eine Wirkung (r3);}
  15022.      \item{zus"atzliche Kommandozeilenoption \tty{n}, um zu Fehlermeldungen
  15023.            zus"atzlich die internen Fehlernummern zu erhalten (r3);}
  15024.      \item{unterst"utzt zus"atzlich die TLCS-9000er von Toshiba (r4)};
  15025.      \item{unterst"utzt zus"atzlich die TMS370xxx-Reihe von Texas
  15026.            Instuments, wobei als neuer Pseudobefehl \tty{DBIT}
  15027.            hinzukam (r5);}
  15028.      \item{kennt zus"atzlich die DS80C320-SFRs (r5);}
  15029.      \item{der Makroprozessor kann nun auch Includes aus Makros
  15030.            heraus einbinden, wozu das Format von Fehlermeldungen
  15031.            aber leicht ge"andert werden mu"ste.  Falls Sie AS2MSG
  15032.            verwenden, ersetzen Sie es unbedingt durch die neue
  15033.            Version! (r5)}
  15034.      \item{unterst"utzt zus"atzlich den 80C166 von Siemens (r5);}
  15035.      \item{zus"atzlich eine \tty{VAL}-Funktion, um Stringausdr"ucke auswerten
  15036.            zu k"onnen (r5);}
  15037.      \item{Mithilfe von in geschweiften Klammern eingeschlossenen
  15038.            Stringvariablen lassen sich nun selber Symbole definieren
  15039.            (r5);}
  15040.      \item{kennt zus"atzlich die Eigenheiten des 80C167 von Siemens (r6);}
  15041.      \item{jetzt gibt es f"ur die MELPS740-Reihe auch die
  15042.            special-page-Adressierung (r6);}
  15043.      \item{mit eckigen Klammern kann man explizit Symbole aus einer
  15044.            bestimmten Sektion ansprechen.  Die Hilfskonstruktion mit dem
  15045.            Klammeraffen gibt es nicht mehr (r6)!}
  15046.      \item{kennt zus"atzlich die MELPS-4500-Reihe von Mitsubishi (r7);}
  15047.      \item{kennt zus"atzlich die H8/300 und H8/300H-Prozessoren von
  15048.            Hitachi (r7);}
  15049.      \item{die mit \tty{LISTING} und \tty{MACEXP} gemachten Einstellungen
  15050.            lassen sich nun auch wieder aus gleichnamigen Symbolen auslesen
  15051.            (r7);}
  15052.      \item{kennt zus"atzlich den TMS320C3x von Texas Instruments (r8);}
  15053.      \item{kennt zus"atzlich den SH7000 von Hitachi (r8);}
  15054.      \item{der Z80-Teil wurde um die Unterst"utzung des Z380 erweitert (r9);}
  15055.      \item{der 68K-Teil wurde um die feinen Unterschiede der
  15056.            683xx-Mikrokontroller erweitert (r9);}
  15057.      \item{ein Label mu"s nun nicht mehr in der ersten Spalte beginnen,
  15058.            wenn man es mit einem Doppelpunkt versieht (r9);}
  15059.      \item{kennt zus"atzlich die 75K0-Reihe von NEC (r9);}
  15060.      \item{mit dem neuen Kommandozeilenschalter o kann der Name
  15061.            der Code-Datei neu festgelegt werden (r9);}
  15062.      \item{der \verb!~~!-Operator ist in der Rangfolge auf einen
  15063.            sinnvolleren Platz gerutscht (r9);}
  15064.      \item{\tty{ASSUME} ber"ucksichtigt f"ur den 6809 jetzt auch das
  15065.            DPR-Register und seine Auswirkungen (pardon, r9);}
  15066.      \item{Der 6809-Teil kennt nun auch die versteckten
  15067.            Erweiterungen des 6309 (r9);}
  15068.      \item{Bin"arkonstanten k"onnen jetzt auch in C-artiger
  15069.            Notation geschrieben werden (r9).}
  15070.      \end{itemize}}
  15071. \item{Version 1.41:
  15072.      \begin{itemize}
  15073.      \item{"uber das Symbol \tty{MOMSEGMENT} kann der momentan
  15074.            gesetzte Adre"sraum abgefragt werden;}
  15075.      \item{anstelle von \tty{SET} bzw. \tty{EVAL} kann jetzt auch
  15076.            einfach \tty{:=} geschrieben werden;}
  15077.      \item{mit der neuen Kommandozeilenoption \tty{q} kann ein ,,stiller''
  15078.            Assemblerlauf erzwungen werden;}
  15079.      \item{das Schl"usselwort \tty{PARENT} zum Ansprechen der
  15080.            Vatersektion wurde um \tty{PARENT0...PARENT9} erweitert;}
  15081.      \item{der PowerPC-Teil wurde um die Mikrokontroller-Versionen
  15082.            MPC505 und PPC403 erweitert;}
  15083.      \item{mit \tty{SET} oder \tty{EQU} definierte Symbole k"onnen
  15084.            nun einem bestimmten Adre"sraum zugeordnet werden;}
  15085.      \item{mit \tty{SET} oder \tty{EQU} definierte Symbole k"onnen
  15086.            nun einem bestimmten Adre"sraum zugeordnet werden;}
  15087.      \item{durch das Setzen der Environment-Variablen \tty{USEANSI}
  15088.            kann die Verwendung von ANSI-Bildschirmsteuersequenzen
  15089.            an-und ausgeschaltet werden (r1);}
  15090.      \item{der SH7000-Teil kennt jetzt auch die SH7600-Befehlserweiterungen
  15091.            (und sollte jetzt korrekte Displacements berechnen...) (r1).}
  15092.      \item{im 65XX-Teil wird jetzt zwischen 65C02 und 65SC02 unterschieden
  15093.            (r1);}
  15094.      \item{neben der Variablen \tty{MOMCPU} gibt es jetzt auch den String
  15095.            \tty{MOMCPUNAME}, der den Prozessornamen im Volltext enth"alt (r1).}
  15096.      \item{P2HEX kennt jetzt auch die 32-Bit-Variante des
  15097.            Intel-Hex-Formates (r1);}
  15098.      \item{kennt jetzt auch die Einschr"ankungen des 87C750 (r2);}
  15099.      \item{die Nummern f"ur fatale Fehlermeldungen wurden auf den Bereich
  15100.            ab 10000 verschoben, um Platz f"ur normale Fehlermeldungen zu
  15101.             schaffen (r2);}
  15102.      \item{unbenutzte Symbole werden in der Symboltabelle jetzt mit einem
  15103.            Stern gekennzeichnet (r2);}
  15104.      \item{unterst"utzt zus"atzlich die 29K-Familie von AMD (r2);}
  15105.      \item{unterst"utzt zus"atzlich die M16-Familie von Mitsubishi (r2);}
  15106.      \item{unterst"utzt zus"atzlich die H8/500-Familie von Hitachi (r3);}
  15107.      \item{die Anzahl von Datenbytes, die P2HEX pro Zeile ausgibt, ist
  15108.            jetzt variierbar (r3);}
  15109.      \item{der Pass, ab dem durch die \tty{-r}-Option erzeugte Warnungen
  15110.            ausgegeben werden, ist einstellbar (r3);}
  15111.      \item{der Makroprozessor kennt jetzt ein \tty{WHILE}-Statement,
  15112.            mit dem ein Code-St"uck eine variable Anzahl wiederholt werden
  15113.             kann (r3);}
  15114.      \item{der \tty{PAGE}-Befehl erlaubt es nun auch, die Breite des
  15115.            Ausgabemediums f"urs Listing anzugeben (r3);}
  15116.      \item{Um neue Pseudo-Prozessortypen einf"uhren zu k"onnen, lassen
  15117.            sich jetzt CPU-Aliasse definieren (r3);}
  15118.      \item{unterst"utzt zus"atzlich die MCS/251-Familie von Intel (r3);}
  15119.      \item{bei eingeschalteter Querverweisliste wird bei doppelt
  15120.            definierten Symbolen die Stelle der ersten Definition
  15121.             angezeigt (r3);}
  15122.      \item{unterst"utzt zus"atzlich die TMS320C5x-Familie von Texas
  15123.            Instruments (Implementierung von Thomas Sailer, ETH Z"urich,
  15124.            r3);}
  15125.      \item{die OS/2-Version sollte jetzt auch mit langen Dateinamen
  15126.            klarkommen.  Wenn man nicht jeden Mist selber kontrolliert...
  15127.             (r3)}
  15128.      \item{"uber den Befehl \tty{BIGENDIAN} kann im MCS-51/251-Modus
  15129.            jetzt gew"ahlt werden, ob die Ablage von Konstanten im Big-
  15130.            oder Little-Endian-Format erfolgen soll (r3);}
  15131.      \item{es wird beim 680x0 jetzt zwischen dem vollen und eingeschr"ankten
  15132.            MMU-Befehlssatz unterschieden; eine manuelle Umschaltung ist mit dem
  15133.            \tty{FULLPMMU}-Befehl m"oglich (r3);}
  15134.      \item{"uber die neue Kommandozeilenoption \tty{I} kann eine Liste
  15135.            aller eingezogenen Include-Files mit ihrer Verschachtelung
  15136.            ausgegeben werden (r3);}
  15137.      \item{Beim \tty{END}-Statement kann jetzt zus"atzlich ein
  15138.            Einsprungpunkt f"ur das Programm angegeben werden (r3).}
  15139.      \item{unterst"utzt zus"atzlich die 68HC16-Familie von Motorola (r3);}
  15140.      \item{P2HEX und P2BIN erlauben es jetzt, den Inhalt einer Code-Datei
  15141.            adre"sm"a"sig zu verschieben (r4);}
  15142.      \item{einem \tty{SHARED}-Befehl anh"angende Kommentare werden jetzt
  15143.            in die Share-Datei mit "ubertragen (r4);}
  15144.      \item{unterst"utzt zus"atzlich die 68HC12-Familie von Motorola (r4);}
  15145.      \item{unterst"utzt zus"atzlich die XA-Familie von Philips (r4);}
  15146.      \item{unterst"utzt zus"atzlich die 68HC08-Familie von Motorola (r4);}
  15147.      \item{unterst"utzt zus"atzlich die AVR-Familie von Atmel (r4);}
  15148.      \item{aus Kompatibilit"at zum AS11 von Motorola existieren zus"atzlich
  15149.            die Befehle \tty{FCB}, \tty{FDB}, \tty{FCC} und \tty{RMB} (r5);}
  15150.      \item{unterst"utzt zus"atzlich den M16C von Mitsubishi (r5);}
  15151.      \item{unterst"utzt zus"atzlich den COP8 von National Semiconductor
  15152.            (r5);}
  15153.      \item{zwei neue Befehle zur bedingten Assemblierung: \tty{IFB} und
  15154.            \tty{IFNB} (r5);}
  15155.      \item{Mit dem \tty{EXITM}-Befehl ist es nun m"oglich, eine
  15156.            Makroexpansion vorzeitig abzubrechen (r5);}
  15157.      \item{unterst"utzt zus"atzlich den MSP430 von Texas Instruments
  15158.            (r5);}
  15159.      \item{\tty{LISTING} kennt zus"atzlich die Varianten
  15160.            \tty{NOSKIPPED} und \tty{PURECODE}, um nicht assemblierten
  15161.            Code aus dem Listing auszublenden (r5);}
  15162.      \item{unterst"utzt zus"atzlich die 78K0-Familie von NEC (r5);}
  15163.      \item{BIGENDIAN ist jetzt auch im PowerPC-Modus verf"ugbar (r5);}
  15164.      \item{zus"atzlich ein \tty{BINCLUDE}-Befehl, um Bin"ardaten
  15165.            einbinden zu k"onnen (r5);}
  15166.      \item{zus"atzliche TOLOWER- und LOWSTRING-Funktionen, um
  15167.                 Gro"s- in Kleinbuchstaben umzuwandeln (r5);}
  15168.      \item{es ist jetzt m"oglich, auch in anderen Segmenten als
  15169.            CODE Daten abzulegen.  Das Dateiformat wurde entsprechend
  15170.            erweitert (r5);}
  15171.      \item{der \tty{DS}-Befehl, mit dem man Speicherbereiche reservieren
  15172.            kann, ist jetzt auch im Intel-Modus zul"assig (r5);}
  15173.      \item{Mit der Kommandozeilenoption \tty{U} ist es jetzt
  15174.            m"oglich, \asname{} in einen case-sensitiven Modus umzuschalten,
  15175.            in dem Namen von Symbolen, selbst definierten Funktionen,
  15176.            Makros, Makroparametern sowie Sektionen nach Gro"s-
  15177.            und Kleinschreibung unterschieden werden (r5);}
  15178.      \item{\tty{SFRB} ber"ucksichtigt jetzt auch die Bildungsregeln
  15179.            f"ur Bitadressen im RAM-Bereich; werden nicht bitadressierbare
  15180.            Speicherstellen angesprochen, erfolgt eine Warnung (r5);}
  15181.      \item{zus"atzliche Pseudobefehle \tty{PUSHV} und \tty{POPV}, um
  15182.            Symbolwerte tempor"ar zu sichern (r5);}
  15183.      \item{zus"atzliche Funktionen \tty{BITCNT, FIRSTBIT, LASTBIT} und
  15184.                 \tty{BITPOS} zur Bitverarbeitung (r5);}
  15185.      \item{bei den CPU32-Prozessoren ist jetzt auch der 68360
  15186.            ber"ucksichtigt (r5);}
  15187.      \item{unterst"utzt zus"atzlich die ST9-Familie von SGS-Thomson (r6);}
  15188.      \item{unterst"utzt zus"atzlich den SC/MP von National Semiconductor
  15189.            (r6);}
  15190.      \item{unterst"utzt zus"atzlich die TMS70Cxx-Familie von Texas
  15191.            Instruments (r6);}
  15192.      \item{unterst"utzt zus"atzlich die TMS9900-Familie von Texas
  15193.            Instruments (r6);}
  15194.      \item{unterst"utzt zus"atzlich die Befehlssatzerweiterungen
  15195.            des 80296 (r6);}
  15196.      \item{die unterst"utzten Z8-Derivate wurden erweitert
  15197.            (r6);}
  15198.      \item{ber"ucksichtigt zus"atzlich die Maskenfehler des 80C504
  15199.            von Siemens (r6);}
  15200.      \item{zus"atzliche Registerdefinitionsdatei f"ur die C50x-Prozessoren
  15201.            von Siemens (r6);}
  15202.      \item{unterst"utzt zus"atzlich die ST7-Familie von SGS-Thomson (r6);}
  15203.      \item{die Intel-Pseudobefehle zur Datenablage sind jetzt
  15204.            auch f"ur 65816 bzw. MELPS-7700 zul"assig (r6);}
  15205.      \item{f"ur 65816/MELPS-7700 kann die Adre"sl"ange jetzt durch
  15206.            Pr"afixe explizit festgelegt werden (r6);}
  15207.      \item{unterst"utzt zus"atzlich die 8X30x-Familie von Signetics
  15208.            (r6);}
  15209.      \item{\tty{PADDING} ist nur noch f"ur die 680x0-Familie defaultm"a"sig
  15210.            eingeschaltet (r7);}
  15211.      \item{"uber das neu eingef"uhrte, vordefinierte Symbol
  15212.            \tty{ARCHITECTURE} kann ausgelesen werden, f"ur welche
  15213.            Plattform \asname{} "ubersetzt wurde (r7);}
  15214.      \item{Zus"atzliche Anweisungen \tty{STRUCT} und \tty{ENDSTRUCT} zur
  15215.            Definition von Datenstrukturen (r7);}
  15216.      \item{Hex- und Objekt-Dateien f"ur die AVR-Tools k"onnen jetzt
  15217.            direkt erzeugt werden (r7);}
  15218.      \item{\tty{MOVEC} kennt jetzt auch die 68040-Steuerregister (r7);}
  15219.      \item{zus"atzliche \tty{STRLEN}-Funktion, um die L"ange eines
  15220.            Strings zu ermitteln (r7);}
  15221.      \item{M"oglichkeit zur Definition von Registersymbolen (r7, momentan
  15222.            nur Atmel AVR);}
  15223.      \item{kennt zus"atzlich die undokumentierten 6502-Befehle (r7);}
  15224.      \item{P2HEX und P2BIN k"onnen jetzt optional die Eingabedateien
  15225.            automatisch l"oschen (r7);}
  15226.      \item{P2BIN kann der Ergebnisdatei optional zus"atzlich die
  15227.            Startadresse voranstellen (r7);}
  15228.      \item{unterst"utzt zus"atzlich die ColdFire-Familie von Motorola als
  15229.            Variation des 680x0-Kerns (r7);}
  15230.      \item{\tty{BYT/FCB, ADR/FDB} und \tty{FCC} erlauben jetzt auch den
  15231.            von \tty{DC} her bekannten Wiederholungsfaktor (r7);}
  15232.      \item{unterst"utzt zus"atzlich den M*Core von Motorola (r7);}
  15233.      \item{der SH7000-Teil kennt jetzt auch die SH7700-Befehlserweiterungen
  15234.            (r7);}
  15235.      \item{der 680x0-Teil kennt jetzt auch die zus"atzlichen Befehle des
  15236.            68040 (r7);}
  15237.      \item{der 56K-Teil kennt jetzt auch die Befehlserweiterungen bis zum
  15238.            56300 (r7).}
  15239.      \item{Mit der neuen \tty{CODEPAGE}-Anweisung k"onnen jetzt auch
  15240.            mehrere Zeichentabellen gleichzeitig verwaltet werden (r8);}
  15241.      \item{Die Argumentvarianten f"ur \tty{CHARSET} wurden erweitert
  15242.            (r8);}
  15243.      \item{Neue String-Funktionen \tty{SUBSTR} und \tty{STRSTR} (r8);}
  15244.      \item{zus"atzliches \tty{IRPC}-Statement im Makroprozessor (r8);}
  15245.      \item{zus"atzlicher {\tt RADIX}-Befehl, um das Default-Zahlensystem
  15246.            f"ur Integer-Konstanten festzulegen (r8);}
  15247.      \item{statt {\tt ELSEIF} darf auch einfach {\tt ELSE} geschrieben
  15248.            werden (r8);}
  15249.      \item{statt $=$ darf als Gleichheitsoperator auch $==$ geschrieben
  15250.            werden (r8);}
  15251.      \item{\tty{BRANCHEXT} erlaubt es beim Philips XA jetzt, die
  15252.            Sprungweite von kurzen Spr"ungen automatisch zu erweitern
  15253.            (r8);}
  15254.      \item{Debug-Ausgaben sind jetzt auch im NoICE-Format m"oglich (r8);}
  15255.      \item{unterst"utzt zus"atzlich die i960-Familie von Intel (r8);}
  15256.      \item{unterst"utzt zus"atzlich die $\mu$PD7720/7725-Signalprozssoren
  15257.            von NEC (r8);}
  15258.      \item{unterst"utzt zus"atzlich den $\mu$PD77230-Signalprozssor von
  15259.            NEC (r8);}
  15260.      \item{unterst"utzt zus"atzlich die SYM53C8xx-SCSI-Prozessoren von
  15261.            Symbios Logic (r8);}
  15262.      \item{unterst"utzt zus"atzlich den 4004 von Intel (r8);}
  15263.      \item{unterst"utzt zus"atzlich die SC14xxx-Serie von National (r8);}
  15264.      \item{unterst"utzt zus"atzlich die Befehlserweiterungen des PPC403GC
  15265.            (r8);}
  15266.      \item{zus"atzliche Kommandozeilenoption {\tt cpu}, um den
  15267.            Zielprozessor-Default zu setzen (r8);}
  15268.      \item{Key-Files k"onnen jetzt auch von der Kommandozeile aus
  15269.            referenziert werden (r8);}
  15270.      \item{zus"atzliche Kommandozeilenoption {\tt shareout}, um die
  15271.            Ausgabedatei f"ur SHARED-Definitionen zu setzen (r8);}
  15272.      \item{neuer Pseudobefehl {\tt WRAPMODE}, um AVR-Prozessoren mit
  15273.            verk"urztem Programmz"ahler zu unterst"utzen (r8);}
  15274.      \item{unterst"utzt zus"atzlich die C20x-Befehlsuntermenge im
  15275.            C5x-Teil (r8);}
  15276.      \item{hexadezimale Adre"sangaben der Hilfsprogamme k"onnen jetzt
  15277.            auch in C-Notation gemacht werden (r8);}
  15278.      \item{Das Zahlensystem f"ur Integerergebnisse in \verb!\{...}!-
  15279.            Ausdr"ucken ist jetzt per \tty{OUTRADIX} setzbar (r8);}
  15280.      \item{Die Registersyntax f"ur 4004-Registerpaare wurde korrigiert
  15281.            (r8);}
  15282.      \item{unterst"utzt zus"atzlich die F$^{2}$MC8L-Familie von Fujitsu
  15283.            (r8);}
  15284.      \item{f"ur P2HEX kann jetzt die Minimall"ange f"ur S-Record-Adressen
  15285.            angegeben werden (r8);}
  15286.      \item{unterst"utzt zus"atzlich die ACE-Familie von Fairchild (r8);}
  15287.      \item{{\tt REG} ist jetzt auch f"ur PowerPCs erlaubt (r8);}
  15288.      \item{zus"atzlicher Schalter in P2HEX, um alle Adressen zu
  15289.            verschieben (r8);}
  15290.      \item{Mit dem Schalter \tty{x} kann man jetzt zus"atzlich in einer
  15291.            zweiten Stufe bie betroffene Quellzeile ausgeben (r8).}
  15292.      \end{itemize}}
  15293. \item{Version 1.42:
  15294.      \begin{itemize}
  15295.      \item{Die Default-Zahlensyntax f"ur Atmel AVR ist jetzt C-Syntax;}
  15296.      \item{zus"atzliche Kommandozeilenoption {\tt olist}, um die
  15297.            Listing-Ausgabedatei zu setzen;}
  15298.      \item{unterst"utzt zus"atzlich die F$^{2}$MC16L-Familie von Fujitsu;}
  15299.      \item{zus"atzlicher Befehl {\tt PACKING} f"ur die AVR-Familie;}
  15300.      \item{zus"atzliche implizite Makroparameter {\tt ALLARGS} und
  15301.            {\tt ARGCOUNT};}
  15302.      \item{zus"atzlicher Befehl {\tt SHIFT} zum Abarbeiten variabler
  15303.            Argumentlisten von Makros;}
  15304.      \item{unterst"utzt tempor"are Symbole;}
  15305.      \item{zus"atzlicher Befehl {\tt MAXNEST} zum Einstellen der
  15306.            maximalen Verschachtelungstiefe von Makroexpansionen;}
  15307.      \item{zus"atzliche Kommandozeilenoption {\tt noicemask}, um
  15308.            die Menge der in einem NoICE-Debuginfofile gelisteten Segmente
  15309.            zu steuern;}
  15310.      \item{unterst"utzt zus"atzlich die 180x-Familie von Intersil;}
  15311.      \item{unterst"utzt zus"atzlich das address windowing des 68HC11K4;}
  15312.      \item{P2HEX kann jetzt die Adre"sfeldl"ange von AVR-Hex-Dateien
  15313.            variieren;}
  15314.      \item{mit der neuen Kommandozeilenoption {\tt -gnuerrors} k"onnen
  15315.            Fehlermeldungen in einem GNU-C-artigen Format ausgegeben
  15316.            werden;}
  15317.      \item{unterst"utzt zus"atzlich die TMS320C54x-Familie von Texas
  15318.            Instruments;}
  15319.      \item{Neue Makro-Option {\tt INTLABEL};}
  15320.      \item{die neuen Instruktionen und Register der MEGA-AVRs 8/16
  15321.            wurden hinzugef"ugt;}
  15322.      \item{{\tt ENDIF/ENDCASE} zeigen im Listing die Zeilennummer des
  15323.            zugeh"origen "offnenden Befehls an;}
  15324.      \item{der 8051-Teil unterst"utzt jetzt auch den erweiterten
  15325.            Adre"sraum des Dallas DS80C390;}
  15326.      \item{namenlose tempor"are Symbole hinzugef"ugt;}
  15327.      \item{unterst"utzt zus"atzlich die undokumentierten 8085-Befehle;}
  15328.      \item{verbesserte Behandlung von Strukturen;}
  15329.      \item{Funktion EXPRTYPE() hinzugef"ugt;}
  15330.      \item{Zeilenfortsetzungszeichen zulassen;}
  15331.      \item{Unterst"utzung f"ur KCPSM/PicoBlaze von Andreass Wassatsch
  15332.            integriert;}
  15333.      \item{unterst"utzt zus"atzlich die 807x-Familie von National
  15334.            Semiconductor;}
  15335.      \item{unterst"utzt zus"atzlich den 4040 von Intel;}
  15336.      \item{unterst"utzt zus"atzlich den eZ8 von Zilog;}
  15337.      \item{unterst"utzt zus"atzlich die 78K2-Familie von NEC;}
  15338.      \item{unterst"utzt zus"atzlich die KCPSM3-Variante von Xilinx;}
  15339.      \item{unterst"utzt zus"atzlich den LatticeMico8;}
  15340.      \item{unterst"utzt zus"atzlich die 12X-Befehlserweiterungen
  15341.            und den XGATE-Kern der 68HC12-Familie;}
  15342.      \item{unterst"utzt zus"atzlich den Signetics 2650;}
  15343.      \item{unterst"utzt zus"atzlich die COP4-Familie von National
  15344.            Semiconductor;}
  15345.      \item{unterst"utzt zus"atzlich die HCS08-Erweiterungen von Freescale;}
  15346.      \item{unterst"utzt zus"atzlich die RS08-Familie von Freescale;}
  15347.      \item{unterst"utzt zus"atzlich den 8008 von Intel;}
  15348.      \item{weitere Syntax f"ur Integer-Konstanten;}
  15349.      \item{Funktion \tty{CHARFROMSTR} hinzugef"ugt;}
  15350.      \item{Q f"ur Oktalkonstanten im Intel-Modus hinzugef"ugt;}
  15351.      \item{weitere Variante f"ur tempor"are Symbole hinzugef"ugt;}
  15352.      \item{der PowerPC-Teil wurde um Unterst"utzung f"ur den MPC821 erweitert
  15353.            (Beitrag von Marcin Cieslak);}
  15354.      \item{implizite Makro-Parameter sind immer case-insensitiv;}
  15355.      \item{das \tty{REG}-Statement ist jetzt auch f"ur den MSP430
  15356.            erlaubt;}
  15357.      \item{unterst"utzt zus"atzlich den XS1 von XMOS;}
  15358.      \item{zus"atzliche Parameter \tty{GLOBALSYMBOLS} und
  15359.            \tty{NOGLOBALSYMBOLS} um zu steuern, ob Labels
  15360.            in Makros lokal sind oder nicht;}
  15361.      \item{kennt zus"atzlich die 75xx-Reihe von NEC;}
  15362.      \item{kennt zus"atzlich die TMS1000-Controller von TI;}
  15363.      \item{unterst"utzt zus"atzlich die 78K2-Familie von NEC;}
  15364.      \item{alle neueren Anderungen werden nur noch in der
  15365.            separaten changelog-Datei dokumentiert.}
  15366.      \end{itemize}}
  15367. \end{itemize}
  15368.  
  15369. %%===========================================================================
  15370.  
  15371. \cleardoublepage
  15372. \chapter{Hinweise zum Quellcode von \asname{}}
  15373. \label{ChapSource}
  15374.  
  15375. Wie in der Einleitung erw"ahnt, gebe ich nach R"ucksprache den Quellcode
  15376. von \asname{} heraus.  Im folgenden sollen einige Hinweise zu dessen Handhabung
  15377. gegeben werden.
  15378.  
  15379. %%---------------------------------------------------------------------------
  15380.  
  15381. \section{Verwendete Sprache}
  15382.  
  15383. Urspr"unglich war \asname{} ein in Turbo-Pascal geschriebenes Programm.  F"ur
  15384. diese Entscheidung gab es Ende der 80er Jahre eine Reihe von Gr"unden:
  15385. Zum einen war ich damit wesentlich vertrauter als mit jedem C-Compiler,
  15386. zum anderen waren alle C-Compiler unter DOS verglichen mit der IDE von
  15387. Turbo-Pascal ziemliche Schnecken.  Anfang 1997 zeichnete sich jedoch ab,
  15388. da"s sich das Blatt gewendet hatte: Zum einen hatte Borland beschlossen,
  15389. die DOS-Entwickler im Stich zu lassen (nochmals ausdr"ucklich keinen
  15390. sch"onen Dank, Ihr Pappnasen von Borland!), und Version 7.0 etwas namens
  15391. 'Delphi' nachfolgen lie"sen, was zwar wohl wunderbar f"ur
  15392. Windows-Programme geeignet ist, die zu 90\% aus Oberfl"ache und zuf"allig
  15393. auch ein bi"schen Funktion bestehen, f"ur kommandozeilenorientierte
  15394. Progamme wie \asname{} aber reichlich unbrauchbar ist.  Zum anderen hatte sich
  15395. bereits vor diesem Zeitpunkt mein betriebssystemm"a"siger Schwerpunkt
  15396. deutlich in Richtung Unix verschoben, und auf ein Borland-Pascal f"ur
  15397. Linux h"atte ich wohl beliebig lange warten k"onnen (an alle die, die
  15398. jetzt sagen, Borland w"urde ja an soetwas neuerdings basteln: Leute, das
  15399. ist {\em Vapourware}, und glaubt den Firmen nichts, solange Ihr nicht
  15400. wirklich in den Laden gehen und es kaufen k"onnt!).  Von daher war also
  15401. klar, da"s der Weg in Richtung C gehen mu"ste.
  15402.  
  15403. Nach der Erfahrung, wohin die Verwendung von Inselsystemen f"uhrt, habe
  15404. ich bei der Umsetzung auf C Wert auf eine m"oglichst gro"se Portabilit"at
  15405. gelegt; da \asname{} jedoch z.B. Bin"ardateien in einem bestimmten Format
  15406. erzeugen mu"s und an einigen Stellen betriebssystemspezifische Funktionen
  15407. nutzt, gibt es einige Stellen, an denen man anpassen mu"s, wenn man \asname{} zum
  15408. ersten Mal auf einer neuen Plattform "ubersetzt.
  15409.  
  15410. \asname{} ist auf einen C-Compiler ausgelegt, der dem ANSI-Standard entspricht;
  15411. C++ ist ausdr"ucklich nicht erforderlich.  Wenn Sie nur einen Compiler
  15412. nach dem veralteten Kernighan\&Ritchie-Standard besitzen, sollten Sie sich
  15413. nach einem neuen Compiler umsehen; der ANSI-Standard ist seit 1989
  15414. verabschiedet und f"ur jede aktuelle Plattform sollte ein ANSI-Compiler
  15415. verf"ugbar sein, zur Not, indem man mit dem alten Compiler GNU-C baut.  Im
  15416. Quellcode sind zwar einige Schalter vorhanden, um den Code K\&R-n"aher zu
  15417. machen, aber dies ist ein nicht offiziell unterst"utztes Feature, das ich
  15418. nur intern f"ur ein ziemlich antikes Unix benutze.  Alles weitere zum
  15419. 'Thema K\&R' steht in der Datei {\tt README.KR}.
  15420.  
  15421. Der Sourcenbaum ist durch einige in der Pascal-Version nicht vorhandene
  15422. Features (z.B. dynamisch ladbare Nachrichtendateien, Testsuite,
  15423. automatische Generierung der Dokumentation aus {\em einem} Quellformat)
  15424. deutlich komplizierter geworden.  Ich werde versuchen, die Sache Schritt
  15425. f"ur Schritt aufzudr"oseln:
  15426.  
  15427. %%---------------------------------------------------------------------------
  15428.  
  15429. \section{Abfangen von Systemabh"angigkeiten}
  15430.  
  15431. Wie ich schon andeutete, ist \asname{} (glaube ich jedenfalls...) auf
  15432. Plattformunabh"angigkeit und leichte Portierbarkeit getrimmt.  Dies
  15433. bedeutet, da"s man die Platt\-form\-un\-ab\-h"an\-gig\-kei\-ten in
  15434. m"oglichst wenige Dateien zusammenzieht.  Auf diese Dateien werde ich im
  15435. folgenden eingehen, und dieser Abschnitt steht ganz vorne, weil es sicher
  15436. eines der wichtigsten ist:
  15437.  
  15438. Die Generierung aller Komponenten von \asname{} erfolgt "uber ein zentrales {\tt
  15439. Makefile}.  Damit dies funktioniert, mu"s man ihm ein passendes {\tt
  15440. Makefile.def} anbieten, das die plattformabh"angigen Einstellungen wie
  15441. z.B. Compilerflags vorgibt.  Im Unterverzeichnis {\tt
  15442. Makefile.def-samples} finden sich eine Reihe von Includes, die f"ur
  15443. g"angige Plattformen funktionieren (aber nicht zwangsweise optimal sein
  15444. m"ussen...).  Wenn die von Ihnen benutzte Plattform nicht dabei ist,
  15445. k"onnen Sie die Beispieldatei {\tt Makefile.def.tmpl} als Ausgangspunkt
  15446. verwenden (und das Ergebnis mir zukommen lassen!).
  15447.  
  15448. Ein weiterer Anlaufpunkt zum Abfangen von Systemabh"angigkeiten ist die
  15449. Datei {\tt sysdefs.h}.  Praktisch alle Compiler definieren eine Reihe von
  15450. Pr"aprozessorsymbolen vor, die den benutzten Zielprozessor sowie das
  15451. benutzte Betriebsystem beschreiben.  Auf einer Sun Sparc unter Solaris
  15452. mit den GNU-Compiler sind dies z.B. die Symbole \verb!__sparc! und
  15453. \verb!__SVR4!.  In {\tt sysdefs.h} werden diese Symbole genutzt, um f"ur
  15454. die restlichen, systemunabh"angigen Dateien eine einheitliche Umgebung
  15455. bereitzustellen.  Insbesondere betrifft dies Integer-Datentypen einer
  15456. bekannten L"ange, es kann aber auch die Nach- oder Redefinition von
  15457. C-Funktionen betreffen, die auf einer bestimmten Plattform nicht oder
  15458. nicht standardgem"a"s vorhanden sind.  Was da so an Sachen anf"allt, liest
  15459. man am besten selber nach.  Generell sind die \verb!#ifdef!-Statements in
  15460. zwei Ebenen gegliedert: Zuerst wird eine bestimmte Prozessorplattform
  15461. ausgew"ahlt, dann werden in diesem Abschnitt die Betriebssysteme
  15462. auseinandersortiert.
  15463.  
  15464. Wenn Sie \asname{} auf eine neue Plattform portieren, m"ussen Sie zwei f"ur diese
  15465. Plattform typische Symbole finden und {\tt sysdefs.h} passend erweitern
  15466. (und wieder bin ich an dem Ergebnis interessiert...).
  15467.  
  15468. %%---------------------------------------------------------------------------
  15469.  
  15470. \section{Systemunabh"angige Dateien}
  15471.  
  15472. ...stellen den g"o"sten Teil aller Module dar.  Alle Funktionen im Detail
  15473. zu beschreiben, w"urde den Rahmen dieser Beschreibung sprengen (wer hier
  15474. mehr wissen will, steigt am besten selbst in das Studium der Quellen ein,
  15475. so katastrophal ist mein Programmierstil nun auch wieder nicht...),
  15476. deshalb hier nur eine kurze Auflistung, welche Module vorhanden sind und
  15477. was f"ur Funktionen sie beinhalten:
  15478.  
  15479. \subsection{Von \asname{} genutzte Module}
  15480.  
  15481. \subsubsection{as.c}
  15482.  
  15483. Diese Datei ist die Wurzel von \asname{}: Sie enth"alt die {\em main()}-Funktion
  15484. von \asname{}, die Verarbeitung aller Kommandozeilenoptionen, die "ubergeordnete
  15485. Steuerung aller Durchl"aufe durch die Quelldateien sowie Teile des
  15486. Makroprozessors.
  15487.  
  15488. \subsubsection{asmallg.c}
  15489.  
  15490. In diesem Modul werden all die Befehle bearbeitet, die f"ur alle Prozessoren
  15491. definiert sind, z.B. \tty{EQU} und \tty{ORG}.  Hier findet sich auch der
  15492. \tty{CPU}-Befehl, mit dem zwischen den einzelnen Prozessoren hin- und
  15493. hergeschaltet wird.
  15494.  
  15495. \subsubsection{asmcode.c}
  15496.  
  15497. In diesem Modul befindet sich die Verwaltung der Code-Ausgabedatei.
  15498. Exportiert wird ein Interface, mit dem sich eine Code-Datei "offnen
  15499. und schlie"sen l"a"st, und das Routinen zum Einschreiben (und
  15500. Zur"ucknehmen) von Code anbietet.  Eine wichtige Aufgabe dieses Moduls
  15501. ist die Pufferung des Schreibvorgangs, die die Ausgabegeschwindigkeit
  15502. erh"oht, indem der erzeugte Code in gr"o"seren Bl"ocken geschrieben wird.
  15503.  
  15504. \subsubsection{asmdebug.c}
  15505.  
  15506. Optional kann \asname{} Debug-Informationen f"ur andere Tools wie Simulatoren
  15507. oder Debugger erzeugen, die einen R"uckbezug auf den Quellcode erlauben,
  15508. in diesem Modul gesammelt und nach Ende der Assemblierung in einem von
  15509. mehreren Formaten ausgegeben werden k"onnen.
  15510.  
  15511. \subsubsection{asmdef.c}
  15512.  
  15513. Dieses Modul enth"alt lediglich Deklarationen von "uberall ben"otigten
  15514. Konstanten und gemeinsam benutzten Variablen.
  15515.  
  15516. \subsubsection{asmfnums.c}
  15517.  
  15518. Intern vergibt \asname{} f"ur jede benutzte Quelldatei eine fortlaufende Nummer,
  15519. die zur schnellen Referenzierung benutzt wird.  Die Vergabe dieser Nummern
  15520. und die Umwandlung zwischen Nummer und Dateinamen passiert hier.
  15521.  
  15522. \subsubsection{asmif.c}
  15523.  
  15524. Hier befinden sich alle Routinen, die die bedingte Assemblierung steuern.
  15525. Exportiert wird als wichtigste Variable das Flag \tty{IfAsm}, welches
  15526. anzeigt, ob Codeerzeugung momentan ein- oder ausgeschaltet ist.
  15527.  
  15528. \subsubsection{asminclist.c}
  15529.  
  15530. In diesem Modul ist die Listenstruktur definiert, "uber die \asname{} die
  15531. Verschachtelung von Include-Dateien im Listing ausgeben kann.
  15532.  
  15533. \subsubsection{asmitree.c}
  15534.  
  15535. Wenn man in einer Code-Zeile das benutzende Mnemonic ermitteln will, ist
  15536. das einfache Durchvergleichen mit allen vorhandenen Befehlen (wie es noch
  15537. in vielen Codegeneratoren aus Einfachheit und Faulheit passiert) nicht
  15538. unbedingt die effizienteste Variante.  In diesem Modul sind zwei
  15539. verbesserte Strukturen (Bin"arbaum und Hash-Tabelle) definiert, die eine
  15540. effizientere Suche erm"oglichen und die einfache lineare Suche nach und
  15541. nach abl"osen sollen...Priorit"at nach Bedarf...
  15542.  
  15543. \subsubsection{asmmac.c}
  15544.  
  15545. In diesem Modul finden sich die Routinen zur Speicherung und Abfrage von
  15546. Makros.  Der eigentliche Makroprozessor befindet sich (wie bereits
  15547. erw"ahnt) in {\tt as.c}.
  15548.  
  15549. \subsubsection{asmpars.c}
  15550.  
  15551. Hier geht es ins Eingemachte: In diesem Modul werden die Symboltabellen
  15552. (global und lokal) in zwei Bin"arb"aumen verwaltet.  Au"serdem findet sich
  15553. hier eine ziemlich gro"se Prozedur \tty{EvalExpression}, welche einen
  15554. (Formel-)ausdruck analysiert und auswertet.  Die Prozedur liefert das
  15555. Ergebnis (Integer, Gleitkomma oder String) in einem varianten Record zur"uck.
  15556. Zur Auswertung von Ausdr"ucken bei der Codeerzeugung sollten allerdings eher
  15557. die Funktionen \tty{EvalIntExpression, EvalFloatExpression} und
  15558. \tty{EvalStringExpression} verwendet werden.  "Anderungen zum Einf"ugen neuer
  15559. Prozessoren sind hier nicht erforderlich und sollten auch nur mit "au"serster
  15560. "Uberlegung erfolgen, da man hier sozusagen an ,,die Wurzel'' von \asname{} greift.
  15561.  
  15562. \subsubsection{asmsub.c}
  15563.  
  15564. Hier finden sich gesammelt einige h"aufig gebrauchte Unterroutinen, welche
  15565. in erster Linie die Bereiche Fehlerbehandlung und 'gehobene'
  15566. Stringverarbeitung abdecken.
  15567.  
  15568. \subsubsection{bpemu.c}
  15569.  
  15570. Wie am Anfang erw"ahnt, war \asname{} urspr"unglich ein in Borland-Pascal
  15571. geschriebenes Programm.  Bei einigen intrinsischen Funktionen des
  15572. Compilers war es einfacher, diese zu emulieren, anstatt alle betroffenen
  15573. Stelle im Quellcode zu "andern. Na ja...
  15574.  
  15575. \subsubsection{chunks.c}
  15576.  
  15577. Dieses Modul definiert einen Datentyp, mit dem eine Liste von
  15578. Adre"sbereichen verwaltet werden kann.  Diese Funktion wird von \asname{}
  15579. f"ur die Belegungslisten ben"otigt, au"serdem benutzten P2BIN und
  15580. P2HEX diese Listen, um vor "Uberlappungen zu warnen.
  15581.  
  15582. \subsubsection{cmdarg.c}
  15583.  
  15584. Dieses Modul implementiert den Mechanismus der Kommdozeilenparameter.  Es
  15585. ben"otigt eine Spezifikation der erlaubten Parameter, zerlegt die
  15586. Kommadozeile und ruft die entsprechenden Callbacks auf.  Der Mechanismus
  15587. leistet im einzelnen folgendes:
  15588. \begin{itemize}
  15589. \item{Mitbearbeitung von Optionen in einer Environment-Variablen oder
  15590.      entsprechenden Datei;}
  15591. \item{R"uckgabe einer Menge, welche die noch nicht bearbeiteten
  15592.      Kommandozeilenparameter beschreibt;}
  15593. \item{Trenunng von positiven und negativen Schaltern;}
  15594. \item{Eine Hintert"ur, falls die dar"uberliegende Entwicklungsumgebung die
  15595.      Kommandozeile nur in Gro"s- oder Kleinschreibung "ubergibt.}
  15596. \end{itemize}
  15597. Dieses Modul wird nicht nur von \asname{}, sondern auch von den Hilfsprogrammen
  15598. \tty{BIND, P2HEX und P2BIN} verwendet.
  15599.  
  15600. \subsubsection{codepseudo.c}
  15601.  
  15602. Hier finden sich Pseudobefehle, die von mehreren Codegeneratoren verwendet
  15603. werden.  Dies ist einmal die Intel-Gruppe mit der \tty{DB..DO}-Gruppe,
  15604. zum anderen die Pendants f"ur die 8/16-Bitter von Motorola oder Rockwell.
  15605. Wer in diesem Bereich um einen Prozessor erweitern will, kann mit einem
  15606. Aufruf den gr"o"sten Teil der Pseudobefehle erschlagen.
  15607.  
  15608. \subsubsection{codevars.c}
  15609.  
  15610. Aus Speicherersparnisgr"unden sind hier einige von diversen
  15611. Codegeneratoren benutzen Variablen gesammelt.
  15612.  
  15613. \subsubsection{endian.c}
  15614.  
  15615. Doch noch ein bi"schen Maschinenabh"angigkeit, jedoch ein Teil, um den man
  15616. sich nicht zu k"ummern braucht: Ob eine Maschine Little- oder
  15617. Big-Endianess benutzt, wird in diesem Modul beim Programmstart automatisch
  15618. bestimmt.  Weiterhin wird gepr"uft, ob die in {\tt sysdefs.h} gemachten
  15619. Typfestlegungen f"ur Integervariablen auch wirklich die korrekten L"angen
  15620. ergeben.
  15621.  
  15622. \subsubsection{headids.c}
  15623.  
  15624. Gesammelt sind hier alle von \asname{} unterst"utzten Zielprozessorfamilien, die
  15625. daf"ur in Code-Dateien verwendeten Kennzahlen (siehe Kapitel
  15626. \ref{SectCodeFormat}) sowie das von P2HEX defaultm"a"sig zu verwendende
  15627. Ausgabeformat.  Ziel dieser Tabelle ist es, Das Hinzuf"ugen eines neuen
  15628. Prozessors m"oglichst zu zentralisieren, d.h. es sind im Gegensatz zu
  15629. fr"uher keine weiteren Modifikationen an den Quellen der Hilfsprogramme
  15630. mehr erforderlich.
  15631.  
  15632. \subsubsection{ioerrs.c}
  15633.  
  15634. Hier ist die Umwandlung von Fehlernummern in Klartextmeldungen abgelegt.
  15635. Hoffentlich treffe ich nie auf ein System, auf dem die Nummern nicht als
  15636. Makros definiert sind, dann kann ich n"amlich dieses Modul komplett
  15637. umschreiben...
  15638.  
  15639. \subsubsection{nlmessages.c}
  15640.  
  15641. Die C-Version von \asname{} liest alle Meldungen zur Laufzeit aus Dateien, nachdem
  15642. die zu benutzende Sprache ermittelt wurde.  Das Format der
  15643. Nachrichtendateien ist kein einfaches, sondern ein spezielles, kompaktes,
  15644. vorindiziertes Format, das zur "Ubersetzungszeit von einem Programm namens
  15645. 'rescomp' (dazu kommen wir noch) erzeugt wird.  Dieses Modul ist das
  15646. Gegenst"uck zu rescomp, die den korrekten Sprachenanteil einer Datei in ein
  15647. Zeichenfeld einliest und Zugriffsfunktionen anbietet.
  15648.  
  15649. \subsubsection{nls.c}
  15650.  
  15651. In diesem Modul wird ermittelt, welche nationalen Einstellungen (Datums-
  15652. und Zeitformat, L"andercode) zur Laufzeit vorliegen.  Das ist leider eine
  15653. hochgradig systemspezifische Sache, und momentan sind nur drei Methoden
  15654. definiert: Die von MS-DOS, die von OS/2 und die typische Unix-Methode
  15655. "uber die {\em locale}-Funktionen.  F"ur alle anderen Systeme ist leider
  15656. \verb!NO_NLS! angesagt...
  15657.  
  15658. \subsubsection{stdhandl.c}
  15659.  
  15660. Zum einen ist hier eine spezielle open-Funktion gelandet, die die
  15661. Sonderstrings {\tt !0...!2} als Dateinamen kennt und daf"ur Duplikate der
  15662. Standard-Dateihandles {\em stdin, stdout} und {\em stderr} erzeugt, zum
  15663. anderen wird hier festgestellt, ob die Standardausgabe auf ein Ger"at oder
  15664. eine Datei umgeleitet wurde.  Das bedingt auf nicht-Unix-Systemen leider
  15665. auch einige Speziall"osungen.
  15666.  
  15667. \subsubsection{stringlists.c}
  15668.  
  15669. Dies ist nur ein kleiner ,,Hack'', der Routinen zur Verwaltung von linearen
  15670. Listen mit Strings als Inhalt definiert, welche z.B. im Makroprozessor von
  15671. \asname{} gebraucht werden.
  15672.  
  15673. \subsubsection{strutil.c}
  15674.  
  15675. Hier sind einige h"aufig genutzte String-Operationen gelandet.
  15676.  
  15677. \subsubsection{version.c}
  15678.  
  15679. Die momentan g"ultige Version ist f"ur \asname{} und alle anderen Hilfsprogramme
  15680. hier zentral gespeichert.
  15681.  
  15682. \subsubsection{code????.c}
  15683.  
  15684. Dies Module bilden den Hauptteil der \asname{}-Quellen: jedes Modul beinhaltet
  15685. den Codegenerator f"ur eine bestimmte Prozessorfamilie.
  15686.  
  15687. \subsection{Zus"atzliche Module f"ur die Hilfsprogramme}
  15688.  
  15689. \subsubsection{hex.c}
  15690.  
  15691. Ein kleines Modul zur Umwandlung von Integerzahlen in
  15692. Hexadezimaldarstellung.  In C nicht mehr unbedingt erforderlich (au"ser
  15693. zur Wandlung von {\em long long}-Variablen, was leider nicht alle {\tt
  15694. printf()}'s unterst"utzen), aber es ist im Rahmen der Portierung eben auch
  15695. stehengeblieben.
  15696.  
  15697. \subsubsection{p2bin.c}
  15698.  
  15699. Die Quellen von P2BIN.
  15700.  
  15701. \subsubsection{p2hex.c}
  15702.  
  15703. Die Quellen von P2HEX.
  15704.  
  15705. \subsubsection{pbind.c}
  15706.  
  15707. Die Quellen von BIND.
  15708.  
  15709. \subsubsection{plist.c}
  15710.  
  15711. Die Quellen von PLIST.
  15712.  
  15713. \subsubsection{toolutils.c}
  15714.  
  15715. Hier sind gesammelt die Unterroutinen, die von allen Hilfsprogrammen
  15716. ben"otigt werden, z.B. f"ur das Lesen von Code-Dateien.
  15717.  
  15718. \section{W"ahrend der Erzeugung von \asname{} gebrauchte Module}
  15719.  
  15720. \subsubsection{a2k.c}
  15721.  
  15722. Dies ist ein Minimalfilter, das ANSI-C-Files in Kernighan-Ritchie
  15723. umwandelt.  Um es genau zu sagen: es werden nur die Funktionsk"opfe
  15724. umgewandelt, und auch nur dann, wenn sie ungef"ahr so formatiert sind, wie
  15725. es mein Schreibstil eben ist.  Es komme also keiner auf die Idee, das
  15726. w"are ein universeller C-Parser!
  15727.  
  15728. \subsubsection{addcr.c}
  15729.  
  15730. Ein kleiner Filter, der bei der Installation auf DOS- oder OS/2-Systemen
  15731. gebraucht wird.  Da DOS und OS/2 den Zeilenvorschub mit CR/LF vornehmen,
  15732. Unix-Systeme jedoch nur mit LF, werden s"amtliche mitgelieferten
  15733. Assembler-Includes bei der Installation durch diesen Filter geschickt.
  15734.  
  15735. \subsubsection{bincmp.c}
  15736.  
  15737. F"ur DOS und OS/2 "ubernimmt dieses Modul die Funktion die Funktion des
  15738. {\em cmp}-Befehls, d.h. den bin"aren Vergleich von Dateien w"ahrend des
  15739. Testlaufes.  W"ahrend dies prinzipiell auch mit dem mitgelieferten {\em
  15740. comp} m"oglich w"are, hat {\em bincmp} keine l"astigen interaktiven
  15741. Abfragen (bei denen man erst einmal herausfinden mu"s, wie man sie auf
  15742. allen Betriebssystemversionen abstellt...)
  15743.  
  15744. \subsubsection{findhyphen.c}
  15745.  
  15746. Dies ist das Untermodul in {\em tex2doc}, da"s f"ur die Silbentrennung von
  15747. Worten sorgt.  Der verwendete Algorithmus is schamlos von TeX
  15748. abgekupfert.
  15749.  
  15750. \subsubsection{grhyph.c}
  15751.  
  15752. Die Definition der Silbentrennungsregeln f"ur die deutsche Sprache.
  15753.  
  15754. \subsubsection{rescomp.c}
  15755.  
  15756. Dies ist der 'Resourcencompiler' von \asname{}, d.h. das Werkzeug, das die
  15757. lesbaren Dateien mit Stringresourcen in ein schnelles, indiziertes Format
  15758. umsetzt.
  15759.  
  15760. \subsubsection{tex2doc.c}
  15761.  
  15762. Ein Werkzeug, da"s die LaTeX-Dokumentation von \asname{} in ein ASCII-Format
  15763. umsetzt.
  15764.  
  15765. \subsubsection{tex2html.c}
  15766.  
  15767. Ein Werkzeug, da"s die LaTeX-Dokumentation von \asname{} in ein HTML-Dokument
  15768. umsetzt.
  15769.  
  15770. \subsubsection{umlaut.c und unumlaut.c}
  15771.  
  15772. Diese Progr"ammchen besorgen die Wandlung zwischen Sonderzeichenkodierung
  15773. im ISO-Format (alle \asname{}-Dateien verwenden im Auslieferungszustand die
  15774. ISO8859-1-Kodierung f"ur Sonderzeichen) und Sonderzeichenkodierung im
  15775. systemspezifischen Format.  Neben einer Plain-ASCII7-Variante sind dies im
  15776. Augenblick die IBM-Zeichens"atze 437 und 850.
  15777.  
  15778. \subsubsection{ushyph.c}
  15779.  
  15780. Die Definition der Silbentrennungsregeln f"ur die englische Sprache.
  15781.  
  15782. %%---------------------------------------------------------------------------
  15783.  
  15784. \section{Generierung der Nachrichtendateien}
  15785.  
  15786. Wie bereits erw"ahnt, verwendet der C-Quellenbaum von \asname{} ein dynamisches
  15787. Ladeverfahren f"ur alle (Fehler-)Meldungen.  Gegen"uber den
  15788. Pascal-Quellen, in denen alle Meldungen in einem Include-File geb"undelt
  15789. waren und so in die Programme hinein"ubersetzt wurden, macht es dieses
  15790. Verfahren "uberfl"ussig, mehrere sprachliche Varianten von \asname{} zur
  15791. Verf"ugung zu stellen: es gibt nur noch eine Version, die beim
  15792. Programmstart die zu benutzende Variante ermittelt und aus den
  15793. Nachrichtendateien die entsprechende Komponente l"adt.  Kurz zur
  15794. Erinnerung: Unter DOS und OS/2 wird dazu die gew"ahlte {\tt
  15795. COUNTRY}-Einstellung zu Rate gezogen, unter Unix werden die
  15796. Environment-Variablen {\tt LC\_MESSAGES, LC\_ALL} und {\tt LANG} befragt.
  15797.  
  15798. \subsection{Format der Quelldateien}
  15799.  
  15800. Eine Quelldatei f"ur den Message-Compiler {\em rescomp} hat "ublicherweise
  15801. die Endung {\tt .res}.  Der Message-Compiler erzeugt aus dieser Datei ein
  15802. oder zwei Dateien:
  15803. \begin{itemize}
  15804. \item{eine bin"are Datei, die zur Laufzeit von \asname{} bzw. den Hilfsprogrammen
  15805.      gelesen wird;}
  15806. \item{optional eine weitere C-Header-Datei, die allen vorhandenen
  15807.      Nachrichten eine Indexnummer zuweist.  "Uber diese Indexnummern und
  15808.      eine Indextabelle in der bin"aren Datei kann zur Laufzeit schnell
  15809.      auf einzelne Meldungen zugegriffen werden.}
  15810. \end{itemize}
  15811.  
  15812. Die Quelldatei f"ur den Message-Compiler ist eine reine ASCII-Datei, also
  15813. mit jedem beliebigen Editor bearbeitbar, und besteht aus einer Reihe von
  15814. Steueranweisungen mit Parametern.  Leerzeilen sowie Zeilen, die mit einem
  15815. Semikolon beginnen, werden ignoriert.  Das Inkludieren anderer Dateien ist
  15816. "uber das {\tt Include}-Statement m"oglich:
  15817. \begin{verbatim}
  15818. Include <Datei>
  15819. \end{verbatim}
  15820.  
  15821. Am Anfang jeder Quelldatei m"ussen zwei Statements stehen, die die im
  15822. folgenden definierten Sprachen beschreiben.  Das wichtigere der beiden
  15823. Statements ist {\tt Langs}, z.B.:
  15824. \begin{verbatim}
  15825. Langs DE(049) EN(001,061)
  15826. \end{verbatim}
  15827. beschreibt, da"s zwei Sprachen im folgenden definiert werden.  Der erste
  15828. Nachrichtensatz soll benutzt werden, wenn unter Unix die Sprache per
  15829. Environment-Variablen auf {\tt DE} gestellt wurde bzw. unter DOS bzw. OS/2
  15830. der Landescode 049 eingestellt wurde.  Der zweite Satz kommt
  15831. dementsprechend bei den Einstellungen {\tt EN} bzw. 061 oder 001 zum
  15832. Einsatz.  W"ahrend bei den 'Telefonnummern' mehrere Codes auf einen
  15833. Nachrichtensatz verweisen k"onnen, ist die Zuordnung zu den
  15834. Unix-Landescodes eineindeutig.  Dies ist in der Praxis aber kein
  15835. Beinbruch, weil die {\tt LANG}-Variablen unter Unix Unterversionen einer
  15836. Sprache als Anh"angsel beschreiben, z.B. so:
  15837. \begin{verbatim}
  15838. de.de
  15839. de.ch
  15840. en.us
  15841. \end{verbatim}
  15842. \asname{} vergleicht nur den Anfang der Strings und kommt so trotzdem zur
  15843. richtigen Entscheidung.
  15844. Das {\tt Default}-Statement gibt vor, welcher Sprachensatz verwendet
  15845. werden soll, wenn entweder "uberhaupt keine Sprache gesetzt wurde oder
  15846. eine Kennung verwendet wird, die nicht in der Liste von {\tt Langs}
  15847. vorhanden ist.  Typischerweise ist dies Englisch:
  15848. \begin{verbatim}
  15849. Default EN
  15850. \end{verbatim}
  15851. Nach diesen beiden Definitionen folgt eine beliebige Menge von {\tt
  15852. Message}-Statements, d.h. Definitionen von Meldungen:
  15853. \begin{verbatim}
  15854. Message ErrName
  15855. ": Fehler "
  15856. ": error "
  15857. \end{verbatim}
  15858. Wurden {\em n} Sprachen im {\tt Langs}-Statement angek"undigt, so nimmt
  15859. der Message-Compiler {\bf genau} die folgenden {\em n} Zeilen als die zu
  15860. speichernden Strings.  Es ist also nicht m"oglich, bei einzelnen
  15861. Nachrichten bestimmte Sprachen fortzulassen, und eine auf die Strings
  15862. folgende Leerzeile ist keinesfalls als Endemarkierung f"ur die Liste
  15863. mi"szuverstehen; eingef"ugte Leerzeilen dienen einzig und allein der
  15864. besseren Lesbarkeit.  Was allerdings erlaubt ist, ist, einzelne Meldungen
  15865. "uber mehrere Zeilen in der Quelldatei zu verteilen; alle Zeilen bis auf
  15866. die letzte m"ussen dann mit einem Backslash als Fortsetzungszeichen enden:
  15867. \begin{verbatim}
  15868. Message TestMessage2
  15869. "Dies ist eine" \
  15870. "zweizeilige Nachricht"
  15871. "This is a" \
  15872. "two-line message"
  15873. \end{verbatim}
  15874. Wie bereits erw"ahnt, handelt es sich bei den Quelldateien um reine
  15875. ASCII-Dateien; Sonderzeichen k"onnen in den Meldungstexten zwar
  15876. eingetragen werden (und der Compiler wird sie auch so durchreichen), der
  15877. gravierende Nachteil ist aber, da"s eine solche Datei nicht mehr voll
  15878. portabel ist: Wird sie auf ein anderes System gebracht, das z.B. eine
  15879. andere Kodierung f"ur Umlaute verwendet, bekommt der Anwender zur Laufzeit
  15880. nur merkw"urdige Zeichen zu sehen...Sonderzeichern sollten daher immer mit
  15881. Hilfe von speziellen Sequenzen geschrieben werden, die von HTML bzw. SGML
  15882. entlehnt wurden (siehe Tabelle \ref{TabSpecChars}).  Zeilenvorsch"ube
  15883. k"onnen in eine Zeile wie von C her gewohnt mit \verb!\n! eingebracht
  15884. werden.
  15885. \begin{table*}[htb]
  15886. \begin{center}\begin{tabular}{|l|l|}
  15887. \hline
  15888. Sequenz... & ergibt... \\
  15889. \hline
  15890. \hline
  15891. \verb!&auml; &ouml; &uuml;! & "a "o "u (Umlaute)\\
  15892. \verb!&Auml; &Ouml; &Uuml;! & "A "O "U \\
  15893. \verb!&szlig;!              & "s (scharfes s) \\
  15894. \verb!&agrave; &egrave; &igrave; &ograve; &ugrave;! & \'a \'e \'i \'o \'u (Accent \\
  15895. \verb!&Agrave; &Egrave; &Igrave; &Ograve; &Ugrave;! & \'A \'E \'I \'O \'U grave) \\
  15896. \verb!&aacute; &eacute; &iacute; &oacute; &uacute;! & \`a \`e \`i \`o \`u (Accent \\
  15897. \verb!&Aacute; &Eacute; &Iacute; &Oacute; &Uacute;! & \`A \`E \`I \`O \`U agiu) \\
  15898. \verb!&acirc; &ecirc; &icirc; &ocirc; &ucirc;! & \^a \^e \^i \^o \^u (Accent \\
  15899. \verb!&Acirc; &Ecirc; &Icirc; &Ocirc; &Ucirc;! & \^A \^E \^I \^O \^U circonflex) \\
  15900. \verb!&ccedil; &Ccedil;! & \c{c} \c{C}(Cedilla) \\
  15901. \verb!&ntilde; &Ntilde;! & \~n \~N \\
  15902. \verb!&aring; &Aring;! & \aa  \AA \\
  15903. \verb!&aelig; &Aelig;! & \ae  \AE \\
  15904. \verb!&iquest; &iexcl;! & umgedrehtes ! oder ? \\
  15905. \hline
  15906. \end{tabular}\end{center}
  15907. \caption{Sonderzeichenschreibweise des {\em rescomp}\label{TabSpecChars}}
  15908. \end{table*}
  15909.  
  15910. %%---------------------------------------------------------------------------
  15911.  
  15912. \section{Dokumentationserzeugung}
  15913.  
  15914. In einer Quellcodedistribution von \asname{} ist diese Dokumentation nur als
  15915. LaTeX-Dokument enthalten.  Andere Formate werden aus dieser mit Hilfe von
  15916. mitgelieferten Werkzeugen automatisch erzeugt.  Zum einen reduziert dies
  15917. den Umfang einer Quellcodedistribution, zum anderen m"ussen "Anderungen
  15918. nicht an allen Formatversionen eines Dokumentes parallel vorgenommen
  15919. werden, mit all den Gefahren von Inkonsistenzen.
  15920.  
  15921. Als Quellformat wurde LaTeX verwendet, weil...weil...weil es eben schon
  15922. immer vorhanden war.  Zudem ist TeX fast beliebig portierbar und pa"st
  15923. damit recht gut zum Anspruch von \asname{}.  Eine Standard-Distribution erlaubt
  15924. damit eine 'ordentliche' Ausgabe auf so ziemlich jedem Drucker; f"ur eine
  15925. Konvertierung in die fr"uher immer vorhandene ASCII-Version liegt der
  15926. Konverter {\em tex2doc} bei; zus"atzlich einen Konverter {\em tex2html},
  15927. so da"s man die Anleitung direkt ins Internet stellen kann.
  15928.  
  15929. Die Erzeugung der Dokumentation wird mit einem schlichten
  15930. \begin{verbatim}
  15931. make docs
  15932. \end{verbatim}
  15933. angesto"sen; daraufhin werden die beiden erw"ahnten Hilfstools erzeugt,
  15934. auf die TeX-Dokumentation angewandt und schlu"sendlich wird noch LaTeX
  15935. selber aufgerufen.  Dies nat"urlich f"ur alle Sprachen nacheinander...
  15936.  
  15937. %%---------------------------------------------------------------------------
  15938.  
  15939. \section{Testsuite}
  15940.  
  15941. Da \asname{} mit bin"aren Daten von genau vorgegebener Struktur umgeht, ist er
  15942. naturgem"a"s etwas empfindlich f"ur System- und Compilerabh"angigkeiten.
  15943. Um wenigstens eine gewisse Sicherheit zu geben, da"s alles korrekt
  15944. durchgelaufen ist, liegt dem Assembler im Unterverzeichnis {\tt tests}
  15945. eine Menge von Test-Assemblerquellen bei, mit denen man den frisch
  15946. gebauten Assembler testen kann.  Diese Testprogramme sind in erster Linie
  15947. darauf getrimmt, Fehler in der Umsetzung des Maschinenbefehlssatzes zu
  15948. finden, die besonders gern bei variierenden Wortl"angen auftreten.
  15949. Maschinenunabh"angige Features wie der Makroprozessor oder bedingte
  15950. Assemblierung werden eher beil"aufig getestet, weil ich davon ausgehe,
  15951. da"s sie "uberall funktionieren, wenn sie bei mir funktionieren...
  15952.  
  15953. Der Testlauf wird mit einem einfachen {\em make test} angesto"sen.  Jedes
  15954. Testprogramm wird assembliert, in eine Bin"ardatei gewandelt und mit einem
  15955. Referenz-Image verglichen.  Ein Test gilt als bestanden, wenn Referenz und
  15956. die neu erzeugte Datei Bit f"ur Bit identisch sind.  Am Ende wird
  15957. summarisch die Assemblierungszeit f"ur jeden Test ausgegeben (wer will,
  15958. kann mit diesen Ergebnissen die Datei {\tt BENCHES} erg"anzen), zusammen
  15959. mit dem Erfolg oder Mi"serfolg.  Jedem Fehler ist auf den Grund zu gehen,
  15960. selbst wenn er bei einem Zielprozessor auftritt, den Sie nie nutzen
  15961. werden!  Es ist immer m"oglich, da"s dies auf einen Fehler hinweist, der
  15962. auch bei anderen Zielprozessoren auftritt, nur zuf"allig nicht in den
  15963. Testf"allen.
  15964.  
  15965. %%---------------------------------------------------------------------------
  15966.  
  15967. \section{Einh"angen eines neuen Zielprozessors}
  15968.  
  15969. Der mit Abstand h"aufigste Grund, im Quellcode von \asname{} etwas zu ver"andern,
  15970. d"urfte wohl die Erweiterung um einen neuen Zielprozessor sein.  Neben der
  15971. Erg"anzung der Makefiles um das neue Modul ist lediglich eine Modifikation
  15972. der Quellen an wenigen Stellen erforderlich, den Rest erledigt das neue
  15973. Modul, indem es sich in der Liste der Codegeneratoren registriert.  Im
  15974. folgenden will ich kochbuchartig die zum Einh"angen erforderlichen
  15975. Schritte beschreiben:
  15976.  
  15977. \subsubsection{Festlegung des Prozessornamens}
  15978.  
  15979. Der f"ur den Prozessor zu w"ahlende Name mu"s zwei Kriterien erf"ullen:
  15980. \begin{enumerate}
  15981. \item{Der Name darf noch nicht von einem anderen Prozessor belegt sein.
  15982.      Beim Aufruf von \asname{} ohne Parameter erh"alt man eine Liste der bereits
  15983.      vorhandenen Namen.}
  15984. \item{Soll der Prozessorname vollst"andig in der Variablen \tty{MOMCPU}
  15985.      auftauchen, so darf er au"ser am Anfang keine Buchstaben au"serhalb
  15986.      des Bereiches von A..F enthalten.  In der Variablen \tty{MOMCPUNAME}
  15987.      liegt aber zur Assemblierzeit immer der volle Name vor.
  15988.      Sonderzeichen sind generell nicht erlaubt, Kleinbuchstaben
  15989.      werden vom CPU-Befehl bei der Eingabe in Gro"sbuchstaben umgewandelt
  15990.      und sind daher auch nicht im Prozessornamen sinnvoll.}
  15991. \end{enumerate}
  15992.  
  15993. Der erste Schritt der Registrierung ist die Eintragung des Prozessors oder
  15994. der Prozessorfamilie in der Datei {\tt headids.c}.  Wie bereits erw"ahnt,
  15995. wird diese Datei von den Hilfsprogrammen mitbenutzt und spezifiziert die
  15996. einer Prozessorfamilie zugeordnete Kenn-ID in Codedateien sowie das zu
  15997. verwendende Hex-Format.  Bei der Wahl der Kenn-ID w"urde ich mir etwas
  15998. Absprache w"unschen...
  15999.  
  16000. \subsubsection{Definition des Codegeneratormoduls}
  16001.  
  16002. Das Modul, das f"ur den neuen Prozessor zust"andig sein soll, sollte einer
  16003. gewissen Einheitlichkeit wegen den Namen \tty{code....} tragen, wobei
  16004. \tty{.....} etwas mit dem Prozessornamen zu tun haben sollte.  Den Kopf
  16005. mit den Includes "ubernimmt man am besten direkt aus einem bereits
  16006. vorhandenen Codegenerator.
  16007.  
  16008. Mit Ausnahme einer Initialisierungsfunktion, die zu Anfang der {\tt
  16009. main()}-Funktion im Modul {\tt as.c} aufgerufen werden mu"s, braucht das
  16010. neue Modul keinerlei Funktionen oder Variablen zu exportieren, da die
  16011. ganze Kommunikation zur Laufzeit "uber indirekte Spr"unge abgewickelt
  16012. wird.  Die dazu erforderlichen Registrierungen m"ussen in der
  16013. Initialisierungsfunktion des Moduls vorgenommen werden, indem f"ur jeden
  16014. von der Unit zu behandelnden Prozessortyp
  16015. ein Aufruf der Funktion \tty{AddCPU} erfolgt:
  16016. \begin{verbatim}
  16017.   CPUxxxx = AddCPU("XXXX", SwitchTo_xxxx);
  16018. \end{verbatim}
  16019. \tty{'XXXX'} ist dabei der f"ur den Prozessor festgelegte Name, der sp"ater
  16020. im Assemblerprogramm verwendet werden mu"s, um \asname{} auf diesen Zielprozessor
  16021. umzuschalten.  \tty{SwitchTo\_xxxx} (im folgenden kurz als ,,Umschalter''
  16022. bezeichnet) ist eine parameterlose Prozedur, die von \asname{} aufgerufen wird,
  16023. sobald auf diesen Prozessor umgeschaltet werden soll.  Als Ergebnis liefert
  16024. \tty{AddCPU} eine Zahlenwert, der als interne ,,Kennung'' f"ur diesen Prozessor
  16025. fungiert.  In der globalen Variablen \tty{MomCPU} wird st"andig die Kennung
  16026. des momentan gesetzten Zielprozessors mitgef"uhrt.  Der von \tty{AddCPU}
  16027. gelieferte Wert sollte in einer privaten Variable des Typs \tty{CPUVar} (hier
  16028. \tty{CPUxxxx} genannt) abgelegt werden.  Falls ein Codegeneratormodul
  16029. verschiedene Prozessoren (z.B. einer Familie) verwaltet, kann es so
  16030. durch Vergleich von \tty{MomCPU} gegen diese Werte feststellen, welche
  16031. Befehlsuntermenge momentan zugelassen ist.
  16032. \par
  16033. Dem Umschalter obliegt es, \asname{} auf den neuen Zielprozessor ,,umzupolen''.
  16034. Dazu m"ussen im Umschalter einige globale Variablen besetzt werden:
  16035. \begin{itemize}
  16036. \item{\tty{ValidSegs} : Nicht alle Prozessoren definieren alle von \asname{}
  16037.      unterst"utzten Adre"sr"aume.  Mit dieser Menge legt man fest,
  16038.      welche Untermenge f"ur den jeweiligen Prozessor von \tty{SEGMENT}-Befehl
  16039.      zugelassen wird.  Im mindesten mu"s das Code-Segment freigeschaltet
  16040.      werden.  Die Gesamtmenge aller vorhandenen Segmenttypen kann in der
  16041.      Datei \tty{fileformat.h} nachgelesen werden (\tty{Seg}.....-Konstanten).}
  16042. \item{\tty{SegInits} : Dieses Feld speichert die initialen (ohne \tty{ORG}-Befehl)
  16043.      Startadressen in den einzelnen Segmenten.  Nur in Ausnahmef"allen
  16044.      (physikalisch "uberlappende, aber logisch getrennte Adre"sr"aume)
  16045.      sind hier andere Werte als 0 sinnvoll.}
  16046. \item{\tty{Grans} : Hiermit kann f"ur jedes Segment die Gr"o"se des kleinsten
  16047.      adressierbaren Elements in Bytes festgelegt werden, d.h. die
  16048.      Gr"o"se des Elements, f"ur das eine Adresse um eins erh"oht wird.
  16049.      Bei den allermeisten Prozessoren (auch 16 oder 32 Bit) ist dies
  16050.      ein Byte, nur z.B. Signalprozessoren und die PICs fallen aus dem
  16051.      Rahmen.}
  16052. \item{\tty{ListGrans} : Hiermit kann wieder f"ur alle Segmente getrennt
  16053.      festgelegt werden, in was f"ur Gruppen die Bytes im Assemblerlisting
  16054.      dargestellt werden sollen.  Beim 68000 sind z.B. Befehle immer
  16055.      ein mehrfaches von 2 Bytes lang, weshalb die entsprechende Variable
  16056.      auf 2 gesetzt ist.}
  16057. \item{\tty{SegLimits} : Dieses Feld legt die h"ochste Adresse f"ur jedes
  16058.      Segment fest, z.B. 65535 f"ur einen 16-Bit-Adre"sraum.  Dieses Feld
  16059.      braucht nicht ausgef"ullt zu werden, wenn der Codegenerator die {\tt
  16060.      ChkPC}-Methode selber "ubernimmt.}
  16061. \item{\tty{ConstMode} : Diese Variable kann die Werte \tty{ConstModeIntel},
  16062.      \tty{ConstModeMoto} oder \tty{ConstModeC} haben und bestimmt, in
  16063.      welcher Form Zahlensysteme bei Integerkonstanten spezifiziert werden
  16064.      sollen (sofern das Programm nicht vom Relaxed-Modus Gebrauch macht).}
  16065. \item{\tty{PCSymbol} : Diese Variable enth"alt den String, mit dem aus dem
  16066.      Assembler-Programm heraus der momentane Stand des Programmz"ahlers
  16067.      abgefragt werden kann.  F"ur Intel-Prozessoren ist dies z.B. ein
  16068.      Dollarzeichen.}
  16069. \item{\tty{TurnWords} : Falls der Prozessor ein Big-Endian-Prozessor sein
  16070.      sollte und eines der Elemente von \tty{ListGrans} ungleich eins ist,
  16071.      sollte dieses Flag auf True gesetzt werden, um korrekte Code-Dateien
  16072.      zu erhalten.}
  16073. \item{\tty{SetIsOccupiedFnc} : Einige Prozessoren verwenden \tty{SET} als
  16074.      Maschinenbefehl.  Ist dieser Callback gesetzt, so kann der Codegenerator
  16075.      dar"uber melden, da"s \tty{SET} nicht als Pseudo-Befehl interpretiert
  16076.      werden soll.  Der R"uckgabewert kann konstant \tty{True} sein, die
  16077.      Entscheidung kann aber auch z.B. anhand der Anzahl der Argumente fallen.}
  16078. \item{\tty{HeaderID} : Dieses Byte enth"alt die Kennung, mit der in der Codedatei
  16079.      die Prozessorfamilie gekennzeichnet wird (siehe Abschnitt
  16080.      \ref{SectCodeFormat}).  Um Zweideutigkeiten zu vermeiden,
  16081.      bitte ich, den Wert mit mir abzusprechen.  Bis auf weiteres sollten
  16082.      keine Werte au"serhalb des Bereiches \$01..\$7f benutzt werden,
  16083.      diese sind f"ur Sonderzwecke (wie z.B. eine zuk"unftige Erweiterung
  16084.      um einen Linker) reserviert.  Auch wenn dieser Wert in den meisten
  16085.      "alteren Codegeneratoren hart gesetzt wird, ist es die heute
  16086.      bevorzugte Methode, den Wert aus {\tt headids.h} per {\tt
  16087.      FindFamilyByName} zu holen.}
  16088. \item{\tty{NOPCode} : In bestimmten Situationen kann es sein, da"s \asname{} unbenutzte
  16089.      Bereiche im Code mit NOPs auff"ullen mu"s.  Diese Variable beinhaltet
  16090.      den dazu erforderlichen Code.}
  16091. \item{\tty{DivideChars} : Dieser String enth"alt all jene Zeichen, die als
  16092.      Trennzeichen f"ur die Parameter eines Assemblerbefehls zugelassen
  16093.      sind.  Nur f"ur extreme Ausrei"ser (wie den DSP56) sollte sich in
  16094.      diesem String etwas anderes finden als ein Komma.}
  16095. \item{\tty{HasAttrs} : Einige Prozessoren wie die 68k-Reihe teilen einen
  16096.      Maschinenbefehl durch einen Punkt noch weiter in Mnemonic und
  16097.      Attribut auf.  Ist dies beim neuen Prozessor auch der Fall, so
  16098.      ist dieses Flag auf True zu setzen.  \asname{} liefert dann die Einzelteile
  16099.      in den Variablen \tty{OpPart} und \tty{AttrPart}.  Setzt man es
  16100.      dagegen auf False, so bleibt der Befehl in \tty{OpPart} zusammen,
  16101.      und \tty{AttrPart} ist immer leer.  Sofern der Prozessor keine
  16102.      Attribute verwendet, sollte man \tty{HasAttrs} auf jeden Fall auf False
  16103.      setzen, da man sich sonst die M"oglichkeit nimmt, Makros mit einem
  16104.      Punkt im Namen (z.B. zur Emulation anderer Assembler) zu definieren.}
  16105. \item{\tty{AttrChars} : Falls \tty{HasAttrs} gesetzt wurde, m"ussen in diesem
  16106.      String alle Zeichen eingetragen werden, die das Attribut vom Befehl
  16107.      trennen k"onnen.  Meist ist dies nur der Punkt.}
  16108. \end{itemize}
  16109. Gehen Sie nicht davon aus, da"s eine dieser Variablen einen vordefinierten
  16110. Wert hat, sondern besetzen Sie \bb{ALLE} Felder neu!!
  16111.  
  16112. Neben diesen Variablen m"ussen noch einige Funktionszeiger besetzt wird,
  16113. mit denen der Codegenerator sich in \asname{} einbindet:
  16114. \begin{itemize}
  16115. \item{\tty{MakeCode} : Diese Routine wird nach der Zerlegung einer Zeile
  16116.      in Mnemonic und Parameter aufgerufen.  Das Mnemonic liegt in der
  16117.      Variablen \tty{OpPart}, die Parameter in dem Feld \tty{ArgStr}.
  16118.      Die Zahl der Parameter kann aus der Variablen \tty{ArgCnt} ausgelesen
  16119.      werden.  Das bin"are Ergebnis mu"s in dem Byte-Feld \tty{BAsmCode}
  16120.      abgelegt werden, dessen L"ange in der Variablen \tty{CodeLen}.  Falls
  16121.      der Prozessor wortorientiert wie der 68000 oder viele Signalprozessoren
  16122.      ist, kann Feld auch wortweise als \tty{WAsmCode} adressiert werden.
  16123.      F"ur ganz extreme F"alle gibt es auch noch \tty{DAsmCode}... Die
  16124.      Codel"ange wird ebenfalls in solchen Einheiten angegeben.}
  16125. \item{\tty{SwitchFrom}: Diese parameterlose Prozedur erlaubt dem
  16126.      Codegeneratormodul, noch ,,Aufr"aumarbeiten'' durchzuf"uhren,
  16127.      wenn auf einen anderen Zielprozessor umgeschaltet wird.  So
  16128.      kann man an dieser Stelle z.B. Speicher freigeben, der im
  16129.      Umschalter belegt wurde und nur ben"otigt wird, w"ahrend dieses
  16130.      Codegeneratormodul aktiv ist.  Im einfachsten Fall zeigt diese
  16131.      Prozedurvariable auf eine leere Prozedur.  Ein Beispiel f"ur die
  16132.      Anwendung dieser Prozedur finden Sie im Modul \tty{CODE370}, das
  16133.      seine Codetabellen dynamisch erzeugt und wieder freigibt.}
  16134. \item{\tty{IsDef} : Bestimmte Prozessoren kennen neben \tty{EQU} noch weitere
  16135.      Pseudobefehle, bei denen ein in der ersten Spalte stehender
  16136.      Symbolname kein Label darstellt, z.B. \tty{BIT} beim 8051.  Diese
  16137.      Funktion mu"s TRUE zur"uckliefern, falls ein solcher, zus"atzlicher
  16138.      Befehl vorliegt.  Im einfachsten Fall braucht nur FALSE
  16139.      zur"uck geliefert zu werden.}
  16140. \end{itemize}
  16141.  
  16142. Optional kann ein Codegenerator auch noch folgende weitere Funktionszeiger
  16143. besetzen:
  16144. \begin{itemize}
  16145. \item{\tty{ChkPC} : Obwohl \asname{} die Programmz"ahler intern durchg"angig mit
  16146.      32 oder 64 Bit verwaltet, benutzen die meisten Prozessoren nur einen
  16147.      kleineren Adre"sraum.  Diese Funktion liefert \asname{} Informationen, ob
  16148.      der momentane Programmz"ahler den erlaubten Bereich "uberschritten
  16149.      hat.  Bei Prozessoren mit mehreren Adre"sr"aumen kann diese Routine
  16150.      nat"urlich deutlich komplizierter ausfallen.  Ein Beispiel daf"ur
  16151.      findet sich z.B. im Modul \tty{code16c8x.c}.  Falls alles in Ordnung ist,
  16152.      mu"s die Funktion TRUE zur"uckliefern, ansonsten FALSE.
  16153.      Diese Funktion mu"s ein Codegenerator nur implementieren, wenn er
  16154.      das Feld {\tt SegLimits} nicht belegt.  Das kann z.B. notwendig
  16155.      werden, wenn der g"ultige Adre"sbereich eines Segments nicht
  16156.      zusammenh"angend ist.}
  16157. \item{\tty{InternSymbol} : Manche Prozessoren, z.B. solche mit einer
  16158.      Registerbank im internen RAM, defineren diese 'Register' als Symbole
  16159.      vor, und es w"urde wenig Sinn machen, diese in einer separaten
  16160.      Include-Datei mit 256 oder m"oglicherweise noch mehr {\tt EQU}s
  16161.      zu definieren.  Mit dieser Funktion erh"alt man Zugang zum Formel-
  16162.      Parser von \asname{}: Sie erh"alt den Ausdruck als ASCII-String, und wenn
  16163.      sie eines der 'eingebauten Symbole' erkennt, besetzt sie die
  16164.      "ubergebene Struktur des Typs {\em TempResult} entsprechend.  Falls
  16165.      die "Uberpr"ufung nicht erfolgreich war, mu"s deren Element {\tt
  16166.      Typ} auf {\tt TempNone} gesetzt werden.  Die Routine sollte im
  16167.      Falle eines Mi"serfolges {\em keine} Fehlermeldungen ausgeben, weil
  16168.      dies immer noch anderweitig g"ultige Symbole sein k"onnen.  Seien
  16169.      Sie extrem vorsichtig mit dieser Routine, da sie einen Eingriff in
  16170.      den Parser darstellt!}
  16171. \item{\tty{DissectBit} : Falls die Zielplattform Bit-Objekte unterst"utzt,
  16172.      d.h. Objekte, die sowohl eine Register/Speicheradresse als auch eine
  16173.      Bitposition in einer einzelnen Integer-Zahl gepackt abspeichern, ist
  16174.      dies der Callback, "uber den solche gepackten Objekte f"urs Listing
  16175.      wieder in eine Quellcode-artige Form r"uck"ubersetzt werden.}
  16176. \item{\tty{DissectReg} : Falls die Zielplattform Registersymbole unterst"utzt,
  16177.      ist dies der Callback, "uber den Registernummer und -l"ange f"urs Listing
  16178.      wieder in eine Quellcode-artige Form r"uck"ubersetzt werden.
  16179.      Falls Registersymbole unterst"utzt werden, ist "ublicherweise auch
  16180.      der \tty{InternSymbol}-Callback auszuf"ullen.}
  16181. \item{\tty{QualifyQuote} : "Uber diesen optionalen Callback kann f"ur
  16182.      eine bestimmte Zielplattform von Fall zu Fall festgelegt werden, da"s
  16183.      ein einzelnes Hochkomma {\em keine} Zeichenkette einleitet.  Ein
  16184.      Beispiel daf"ur ist die als \tty{AF'} geschriebene alternative
  16185.      Registerbank beim Z80, oder die Hexadezimal-Syntax \tty{H'...} bei
  16186.      manchen Hitachi-Prozessoren.}
  16187. \end{itemize}
  16188.  
  16189. Wer will, kann sich "ubrigens auch mit einem Copyright-Eintrag verewigen,
  16190. indem er in der Initialisierung des Moduls (bei den \tty{AddCPU}-Befehlen)
  16191. einen Aufruf der Prozedur \tty{AddCopyright} einf"ugt, in der folgenden
  16192. Art:
  16193. \begin{verbatim}
  16194.    AddCopyright("Intel 80986-Codegenerator (C) 2010 Hubert Simpel");
  16195. \end{verbatim}
  16196. Der "ubergebene String wird dann nach dem Programmstart zus"atzlich zu
  16197. der Standardmeldung ausgegeben.
  16198.  
  16199. Bei Bedarf kann sich das Modul im Initialisierungsteil noch in die
  16200. Kette aller Funktionen eintragen, die vor Beginn eines Durchlaufes
  16201. durch den Quelltext ausgef"uhrt werden.  Dies ist z.B. immer dann der
  16202. Fall, wenn die Code-Erzeugung im Modul abh"angig vom Stand bestimmter,
  16203. durch Pseudobefehle beeinflu"sbarer Flags ist.  Ein h"aufig auftretender
  16204. Fall ist z.B., da"s ein Prozessor im User- oder Supervisor-Modus
  16205. arbeiten kann, wobei im User-Modus bestimmte Befehle gesperrt
  16206. sind.  Im Assembler-Quelltext k"onnte dieses Flag, das angibt, in welchem
  16207. Modus der folgende Code ausgef"uhrt wird, durch einen Pseudobefehl
  16208. umgeschaltet werden.  Es ist aber dann immer noch eine Initialisierung
  16209. erforderlich, die sicherstellt, da"s in allen Durchl"aufen ein identischer
  16210. Ausgangszustand vorliegt.  Der "uber die Funktion \tty{AddInitPassProc}
  16211. angebotene Haken bietet die M"oglichkeit, derartige Initialisierungen
  16212. vorzunehmen.  Die "ubergebene Callback-Funktion wird vor Beginn
  16213. eines Durchgangs aufgerufen.
  16214.  
  16215. Analog zu \tty{AddInitPassProc} funktioniert die "uber \tty{AddCleanUpProc}
  16216. aufgebaute Funktionsliste, die es den Codegeneratoren erlaubt, nach dem
  16217. Abschlu"s der Assemblierung noch Aufr"aumarbeiten (z.B. das Freigeben von
  16218. Literaltabellen o."a.) durchzuf"uhren.  Dies ist sinnvoll, wenn mehrere
  16219. Dateien mit einem Aufruf assembliert werden, sonst h"atte man noch
  16220. ,,M"ull'' aus einem vorigen Lauf in den Tabellen.  Momentan nutzt kein
  16221. Modul diese M"oglichkeit.
  16222.  
  16223. \subsubsection{Schreiben des Codegenerators selber}
  16224.  
  16225. Nach diesen Pr"aliminarien ist nun endlich eigene Kreativit"at gefragt:
  16226. Wie Sie es schaffen, aus dem Mnemonic und den Argumenten die Code-Bytes zu
  16227. erzeugen, ist weitgehend Ihnen "uberlassen.  Zur Verf"ugung stehen daf"ur
  16228. nat"urlich "uber den Formelparser die Symboltabellen sowie die Routinen
  16229. aus
  16230. \tty{asmsub.c} und \tty{asmpars.c}.  Ich kann hier nur einige generelle
  16231. Hinweise geben:
  16232. \begin{itemize}
  16233. \item{Versuchen Sie, die Prozessorbefehle in Gruppen aufzusplitten, die
  16234.      gleiche Operanden erwarten und sich nur in einigen Kennbits
  16235.      unterscheiden.  Alle argumentlosen Befehle kann man z.B. so in einer
  16236.      Tabelle abhandeln.}
  16237. \item{Die meisten Prozessoren haben ein festes Repertoire von
  16238.      Adressierungsarten.  Verlagern Sie das Parsing eines Adre"sausdrucks
  16239.      in eine getrennte Unterroutine.}
  16240. \item{Die Routine \tty{WrError} definiert eine Vielzahl von m"oglichen
  16241.      Fehlermeldungen und ist bei Bedarf leicht erweiterbar.  Nutzen Sie
  16242.      das!  Bei allen Fehler nur lapidar einen ,,Syntaxfehler'' zu melden,
  16243.      n"utzt niemandem!}
  16244. \end{itemize}
  16245. Mit Sicherheit wird auch das Studium der vorhandenen Module weiterhelfen.
  16246.  
  16247. \subsubsection{"Anderungen f"ur die Dienstprogramme}
  16248.  
  16249. Eine winzige "Anderung ist auch noch an den Quellen der Dienstprogramme
  16250. n"otig, und zwar in der Routine {\tt Granularity()} in {\tt toolutils.c}:
  16251. Falls eines der Adre"sr"aume dieses Prozessors eine andere Granularit"at
  16252. als 1 hat, mu"s dort die Abfrage passend erg"anzt werden, sonst verz"ahlen
  16253. sich PLIST, P2BIN und P2HEX...
  16254.  
  16255. %%---------------------------------------------------------------------------
  16256.  
  16257. \section{Lokalisierung auf eine neue Sprache}
  16258.  
  16259. Sie haben Interesse an diesem Thema?  Wunderbar!  Das ist eine Sache, die
  16260. von Programmierern gerne au"sen vor gelassen wird, insbesondere, wenn sie
  16261. aus dem Land der unbegrenzten M"oglichkeiten kommen...
  16262.  
  16263. Die Lokalisierung auf eine neue Sprache gliedert sich in zwei Teile: Die
  16264. Anpassung der Programmmeldungen sowie die "Ubersetzung der Anleitung.
  16265. Letzteres ist sicherlich eine Aufgabe herkulischen Ausma"ses, aber die
  16266. Anpassung der Programmeldungen sollte in ein bis zwei Nachmittagen "uber
  16267. die B"uhne zu bekommen sein, wenn man sowohl die neue als auch eine der
  16268. bisher vorhandenen Sprachen gut kennt.  Leider ist die "Ubersetzung auch
  16269. nichts, was man St"uck f"ur St"uck machen kann, denn der
  16270. Ressourcencompiler kann im Moment nicht mit einer variablen Zahl von
  16271. Sprachen in den verschiedenen Meldungen umgehen, es hei"st also 'alles
  16272. oder nichts'.
  16273.  
  16274. Als erstes erg"anzt man in {\tt header.res} die neue Sprache.  Die f"ur
  16275. die Sprache passende zweibuchstabige Abk"urzung holt man sich vom
  16276. n"achsten Unix-System (wenn man nicht ohnehin darauf arbeitet...), die
  16277. internationale Vorwahl aus dem n"achsten DOS-Handbuch.
  16278.  
  16279. Im zweiten Schritt geht man jetzt durch alle anderen {\tt .res}-Dateien
  16280. und erg"anzt die {\tt Message}-Statements.  Nocheinmal sei darauf
  16281. hingewiesen, Sonderzeichen in der HTML-artigen Schreibweise und nicht
  16282. direkt einzusetzen!
  16283.  
  16284. Wenn dies geschafft ist, kann man mit einem {\em make} alle betroffenen
  16285. Teile neu bauen und erh"alt danach einen Assembler, der eine Sprache mehr
  16286. schickt.  Bitte nicht vergessen, die Ergebnisse an mich weiterzuleiten,
  16287. damit mit der n"achsten Release alle etwas davon haben :-)
  16288.  
  16289. %%===========================================================================
  16290.  
  16291. \cleardoublepage
  16292.  
  16293. \begin{thebibliography}{99}
  16294.  
  16295. \input{../doc_COM/biblio.tex}
  16296.  
  16297. \end{thebibliography}
  16298.  
  16299. \cleardoublepage
  16300.  
  16301. \begin{quote}{\it
  16302. ''Ich schlage vor, dem Parlament ein Gesetz vorzulegen, \\
  16303. das einem Autor, der ein Buch ohne Index publiziert, \\
  16304. das Copyright entzieht und ihn au"serdem f"ur sein Vergehen \\
  16305. mit einer Geldstrafe belegt.''\\
  16306. \hspace{2cm} --Lord John Campbell}\end{quote}
  16307.  
  16308. \printindex
  16309.  
  16310. \end{document}
  16311.  
  16312.