Subversion Repositories pentevo

Rev

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

  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 M"arz 2024}
  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 UNIX} ist ein eingetragenes Warenzeichen der Open Group.
  74.  
  75. {\em Linux} ist ein eingetragenes Warenzeichen von Linus Thorvalds.
  76.  
  77. {\em Microsoft, Windows} und {\em MS-DOS} sind eingetragene Warenzeichen
  78. der Microsoft Corporation.
  79.  
  80. Alle anderen Warenzeichen, die nicht ausdr"ucklich in diesem Abschnitt
  81. genannt wurden und in diesem Handbuch verwendet werden, sind Eigentum
  82. der entsprechenden Eigent"umer.
  83.  
  84. \vspace{6cm}
  85.  
  86. Dieses Dokument wurde mit dem LaTeX-Satzsystem unter dem Betriebssystem
  87. Linux angefertigt und formatiert.
  88.  
  89. \clearpage
  90.  
  91. %%===========================================================================
  92.  
  93. \ifelektor
  94. \thispagestyle{empty} \
  95. \clearpage
  96. \thispagestyle{empty} \
  97. \clearpage
  98. \fi
  99.  
  100. %%===========================================================================
  101.  
  102. {\parskip 0cm plus0.1cm \tableofcontents}
  103.  
  104. %%===========================================================================
  105.  
  106. \cleardoublepage
  107. \chapter{Allgemeines}
  108.  
  109. Diese Anleitung wendet sich an Programmierer, die bereits mit der Programmierung in Assembler
  110. vertraut sind und sich dar"uber informieren m"ochten, wie man mit \asname{} umgeht.  Sie
  111. hat eher die Form eines Referenz- und nicht Benutzerhandbuches.  Als solches
  112. macht sie weder den Versuch, die Sprache Assembler an sich zu erkl"aren, noch
  113. erl"autert sie die Architektur bestimmter Prozessoren.  Im Literaturverzeichnis
  114. habe ich weiterf"uhrende Literatur aufgelistet, die bei der Implementation der
  115. einzelnen Codegeneratoren ma"sgebend war.  Um Assembler von Grund auf zu
  116. lernen, kenne ich kein Buch; ich habe es im wesentlichen im ,,Trial and
  117. error''-Verfahren gelernt.
  118.  
  119. %%Nach einer kleineren Diskussion auf der Mailing-Liste und einigen Vorschl"agen
  120. %%habe ich beschlossen, mit ,,ACASM'' einen eigenen Vorschlag f"ur einen besseren
  121. %%Namen zu machen.  Es ist in der OpenSource-Szene ja gute Tradition, da"s die
  122. %%Abk"urzungen mehrere Deutungen gestatten.  Ein paar Vorschl"age:
  123. %%\begin{itemize}
  124. %%\item{,,AC'' k"onnte einfach f"ur meine Heimatstadt Aachen stehen, denn dies
  125. %%      ist Aachens KFZ-Kennzeichen;}
  126. %%\item{,,Another CPU'', wenn (mal wieder) ein neues Target dazugekommen ist;}
  127. %%\item{,,All Crap'', wenn man sich dar"uber ge"argert hat...}
  128. %%\item{...oder ,,Alfreds Cute Assembler'', wenn man unbedingt meinen Namen
  129. %%      damit in Verbindung bringen will...}
  130. %%\end{itemize}
  131.  
  132. %%---------------------------------------------------------------------------
  133.  
  134. \section{Lizenzbedingungen}
  135. \label{SectLicense}
  136.  
  137. Bevor es in medias res geht, erst einmal der unvermeidliche Prolog:
  138. \par
  139. \asname{} in der vorliegenden Version untersteht der GNU General Public License
  140. (GPL); die Details dieser Lizenz k"onnen Sie in der beiliegenden Datei
  141. COPYING nachlesen.  Falls Sie diese nicht mit \asname{} erhalten haben,
  142. beschweren Sie sich bei demjenigen, von dem Sie \asname{} erhalten haben!
  143. \par
  144. Kurz gesagt, beinhaltet die GPL folgende Punkte:
  145. \begin{itemize}
  146. \item{Auf \asname{} aufbauende Programme m"ussen ebenfalls der GPL unterstehen;}
  147. \item{Weiterverbreitung ausdr"ucklich erlaubt;}
  148. \item{expliziter Haftungsausschlu"s f"ur durch die Anwendung dieses
  149.      Programms entstehende Sch"aden.}
  150. \end{itemize}
  151. ...aber f"ur die Details bitte ich wirklich, in den Originaltext der GPL
  152. zu schauen!
  153. \par
  154. Um eine m"oglichst schnelle Fehlerdiagnose und -korrektur zu erm"oglichen,
  155. bitte ich, Fehlerberichten folgende Angaben beizuf"ugen:
  156. \begin{itemize}
  157. \item{Betriebssystem (DOS, Windows, Linux...) mit Version}
  158. \item{benutzte Version von \asname{} bzw. Datum des EXE-Files}
  159. \item{bei selbst kompilierten Versionen: verwendeter Compiler und Version}
  160. \item{m"oglichst die Quelldatei, bei der der Fehler auftritt}
  161. \end{itemize}
  162. Zu erreichen bin ich folgenderma"sen:
  163. \begin{itemize}
  164. \item{per Post: \begin{description}
  165.                \item{Alfred Arnold}
  166.                \item{Hirschgraben 29}
  167.                \item{52062 Aachen}
  168.                \end{description}}
  169. \item{per E-Mail: \tty{alfred@ccac.rwth-aachen.de}}
  170. \end{itemize}
  171. Wer mir pers"onlich Fragen stellen will (und in der N"ahe von Aachen
  172. wohnt), kann dies mit hoher Wahrscheinlichkeit donnerstags von 20.00
  173. bis 21.00 Uhr im Computerclub an der RWTH Aachen (Elisabethstra"se 16,
  174. erster Stock, rechter Flur).
  175. \par
  176. Von Telefonanrufen bitte ich abzusehen.  Erstens, weil sich die
  177. komplizierten Zusammenh"ange am Telefon nur "au"serst schwer er"ortern
  178. lassen, und zweitens ist die Telekom schon reich genug...
  179. \par
  180. Die neueste Version von \asname{} (DPMI, Win32, C) findet sich auf folgendem
  181. Server:
  182. \begin{verbatim}
  183. http://john.ccac.rwth-aachen.de:8000/as
  184. \end{verbatim}
  185. oder auch kurz
  186. \begin{verbatim}
  187. http://www.alfsembler.de
  188. \end{verbatim}
  189. \par
  190. Wer "uber keinen FTP-Zugang verf"ugt, kann den Assembler auch von mir
  191. anfordern.  Ich werde aber nur Anfragen beantworten, die einen CD-Rohling
  192. und einen passenden, frankierten R"uckumschlag enthalten.  \bb{KEIN} Geld
  193. schicken!!!
  194. \par
  195. So. Nach diesem unvermeidlichen Vorwort k"onnen wir wohl beruhigt
  196. zur eigentlichen Anleitung schreiten:
  197.  
  198. %%---------------------------------------------------------------------------
  199.  
  200. \section{allgemeine F"ahigkeiten des Assemblers}
  201.  
  202. \asname{} bietet im Gegensatz zu normalen Assemblern die M"oglichkeit, Code
  203. f"ur v"ollig verschiedene Prozessoren zu erzeugen.  Momentan sind
  204. folgende Prozessorfamilien implementiert:
  205. \begin{itemize}
  206. \item{Motorola 68000..68040, 683xx, Coldfire inkl. Koprozessor und MMU}
  207. \item{Motorola ColdFire}
  208. \item{Motorola DSP5600x,DSP56300}
  209. \item{Motorola/IBM MPC601/MPC505/PPC403/MPC821}
  210. \item{IBM PALM}
  211. \item{Motorola M-Core}
  212. \item{Motorola 6800, 6801, 68(HC)11(K4) sowie Hitachi 6301}
  213. \item{Motorola/Freescale 6805, 68HC(S)08}
  214. \item{Motorola 6809 / Hitachi 6309}
  215. \item{Motorola/Freescale 68HC12(X) inklusive XGATE}
  216. \item{Freescale/NXP S12Z (''MagniV'')}
  217. \item{Freescale 68RS08}
  218. \item{Motorola 68HC16}
  219. \item{Konami 052001}
  220. \item{Hitachi H8/300(H)}
  221. \item{Hitachi H8/500}
  222. \item{Hitachi SH7000/7600/7700}
  223. \item{Hitachi HMCS400}
  224. \item{Hitachi H16}
  225. \item{Rockwell 6502, 65(S)C02, Commodore 65CE02, WDC W65C02S, Rockwell 65C19 und
  226.      Hudson HuC6280}
  227. \item{Rockwell PPS-4}
  228. \item{CMD 65816}
  229. \item{Mitsubishi MELPS-740}
  230. \item{Mitsubishi MELPS-7700}
  231. \item{Mitsubishi MELPS-4500}
  232. \item{Mitsubishi M16}
  233. \item{Mitsubishi M16C}
  234. \item{DEC PDP-11}
  235. \item{Western Digital WD16}
  236. \item{Intel 4004/4040}
  237. \item{Intel MCS-48/41, einschlie"slich Siemens SAB80C382 und der
  238.      OKI-Varianten}
  239. \item{Intel MCS-51/251, Dallas DS80C390}
  240. \item{Intel MCS-96/196(Nx)/296}
  241. \item{Intel 8080/8085}
  242. \item{Intel i960}
  243. \item{Signetics 8X30x}
  244. \item{Signetics 2650}
  245. \item{Philips XA}
  246. \item{Atmel (Mega-)AVR}
  247. \item{AMD 29K}
  248. \item{Siemens 80C166/167}
  249. \item{Zilog Z80 (einschlie"slich undokumentierter Befehle), Z180, Z380}
  250. \item{Sharp LR35902 (,,Gameboy-Z80'')}
  251. \item{Sharp SC61860}
  252. \item{Sharp SC62015}
  253. \item{Zilog Z8, Super8, Z8 Encore}
  254. \item{Zilog Z8000}
  255. \item{Xilinx KCPSM/KCPSM3 ('PicoBlaze')}
  256. \item{LatticeMico8}
  257. \item{Toshiba TLCS-900(L)}
  258. \item{Toshiba TLCS-90}
  259. \item{Toshiba TLCS-870(/C)}
  260. \item{Toshiba TLCS-47}
  261. \item{Toshiba TLCS-9000}
  262. \item{Toshiba TC9331}
  263. \item{Microchip PIC16C54..16C57}
  264. \item{Microchip PIC16C84/PIC16C64}
  265. \item{Microchip PIC17C42}
  266. \item{Parallax SX20/SX28}
  267. \item{SGS M380/GI LP8000}
  268. \item{SGS-Thomson ST6}
  269. \item{SGS-Thomson ST7/STM8}
  270. \item{SGS-Thomson ST9}
  271. \item{SGS-Thomson 6804}
  272. \item{Texas Instruments TMS32010/32015}
  273. \item{Texas Instruments TMS3202x}
  274. \item{Texas Instruments TMS320C3x/TMS320C4x}
  275. \item{Texas Instruments TMS320C20x/TMS320C5x}
  276. \item{Texas Instruments TMS320C54x}
  277. \item{Texas Instruments TMS320C6x}
  278. \item{Texas Instruments TMS99xx/TMS99xxx}
  279. \item{Texas Instruments TMS7000}
  280. \item{Texas Instruments TMS1000}
  281. \item{Texas Instruments TMS370xxx}
  282. \item{Texas Instruments MSP430(X)}
  283. \item{National Semiconductor IMP-16}
  284. \item{National Semiconductor IPC-16 ('PACE'), INS8900}
  285. \item{National Semiconductor SC/MP}
  286. \item{National Semiconductor INS807x}
  287. \item{National Semiconductor COP4}
  288. \item{National Semiconductor COP8}
  289. \item{National Semiconductor SC144xx}
  290. \item{National Semiconductor NS32xxx}
  291. \item{Olympia CP-3F (bzw. SGS M380, GI LP8000)}
  292. \item{Fairchild ACE}
  293. \item{Fairchild F8}
  294. \item{NEC $\mu$PD78(C)0x/$\mu$PD78(C)1x}
  295. \item{NEC $\mu$PD75xx}
  296. \item{NEC $\mu$PD75xxx (alias 75K0)}
  297. \item{NEC 78K0}
  298. \item{NEC 78K2}
  299. \item{NEC 78K3}
  300. \item{NEC 78K4}
  301. \item{NEC $\mu$PD7720/7725}
  302. \item{NEC $\mu$PD77230}
  303. \item{NEC V60}
  304. \item{Fujitsu F$^2$MC8L}
  305. \item{Fujitsu F$^2$MC16L}
  306. \item{OKI OLMS-40}
  307. \item{OKI OLMS-50}
  308. \item{Panafacom MN1610/MN1613}
  309. \item{Renesas RX}
  310. \item{Padauk PMS/PMC/PFSxxx}
  311. \item{Symbios Logic SYM53C8xx (ja, die kann man programmieren!)}
  312. \item{Intersil CDP1802/1804/1805(A)}
  313. \item{Intersil IM6100/6120}
  314. \item{XMOS XS1}
  315. \item{MIL STD 1750}
  316. \item{KENBAK-1}
  317. \item{GI CP-1600}
  318. \item{HP Nano Processor}
  319. \end{itemize}
  320. in Arbeit / Planung / "Uberlegung :
  321. \begin{itemize}
  322. \item{ARM}
  323. \item{Analog Devices ADSP21xx}
  324. \item{SGS-Thomson ST20}
  325. \item{Texas Instruments TMS320C8x}
  326. \end{itemize}
  327. ungeliebt, aber {\it doch} vorhanden :
  328. \begin{itemize}
  329. \item{Intel 8086, 80186, NEC V30..V55 inkl. Koprozessor 8087}
  330. \end{itemize}
  331. Die Umschaltung des Codegenerators darf dabei auch mitten in der Datei
  332. erfolgen, und das beliebig oft!
  333. \par
  334. Der Grund f"ur diese Flexibilit"at ist, da"s \asname{} eine Vorgeschichte hat,
  335. die auch in der Versionsnummer deutlich wird: \asname{} ist als Erweiterung eines
  336. Makroassemblers f"ur die 68000er-Familie entstanden.  Auf besonderen
  337. Wunsch habe ich den urspr"unglichen Assembler um die F"ahigkeit zur
  338. "Ubersetzung von 8051-Mnemonics erweitert, und auf dem Weg (Abstieg?!) vom
  339. 68000 zum 8051 sind eine Reihe anderer fast nebenbei abgefallen...die
  340. restlichen Prozessoren wurden allesamt auf Benutzeranfrage hin integriert.
  341. Zumindest beim prozessorunabh"angigen Kern kann man also getrost davon
  342. ausgehen, da"s er gut ausgetestet und von offensichtlichen Bugs frei ist.
  343. Leider habe ich aber h"aufig mangels passender Hardware nicht die
  344. M"oglichkeit, einen neuen Codegenerator praktisch zu testen, so da"s bei
  345. Neuerungen "Uberraschungen nie ganz auszuschlie"sen sind.  Das in
  346. Abschnitt \ref{SectLicense} gesagte hat also schon seinen Grund...
  347. \par
  348. Diese Flexibilit"at bedingt ein etwas exotisches Code-Format, f"ur dessen
  349. Bearbeitung ich einige Tools beigelegt habe.  Deren Beschreibung findet
  350. sich in Abschnitt \ref{ChapTools}.
  351. \par
  352. \asname{} ist ein Makroassembler, d.h. dem Programmierer ist die M"oglichkeit
  353. gegeben, sich mittels Makros neue ,,Befehle'' zu definieren.  Zus"atzlich
  354. beherrscht er die bedingte Assemblierung.  Labels in Makror"umpfen werden
  355. automatisch als lokal betrachtet.
  356. \par
  357. Symbole k"onnen f"ur den Assembler sowohl Integer-, String- als auch
  358. Gleitkommawerte haben.  Diese werden --- wie Zwischenergebnisse bei Formeln
  359. --- mit einer Breite von 32 Bit f"ur Integerwerte, 80/64 Bit f"ur
  360. Gleitkommawerte und 255 Zeichen f"ur Strings gespeichert.  F"ur eine Reihe
  361. von Mikrokontrollern besteht die M"oglichkeit, durch Segmentbildung die
  362. Symbole bestimmten Klassen zuzuordnen.  Dem Assembler kann man auf diese
  363. Weise die --- begrenzte --- M"oglichkeit geben, Zugriffe in falsche
  364. Adre"sr"aume zu erkennen.
  365. \par
  366. Der Assembler kennt keine expliziten Beschr"ankungen bzgl.
  367. Verschachtelungstiefe von Include-Dateien oder Makros, eine Grenze bildet
  368. lediglich die durch den Hauptspeicher beschr"ankte Rekursionstiefe.
  369. Ebenso gibt es keine Grenze f"ur die Symboll"ange, diese wird nur durch
  370. die maximale Zeilenl"ange begrenzt.
  371. \par
  372. Ab Version 1.38 ist \asname{} ein Mehrpass-Assembler.  Dieser hochtrabende Begriff
  373. bedeutet nicht mehr, als das die Anzahl der Durchg"ange durch die Quelltexte
  374. nicht mehr zwei sein mu"s.  Sind keine Vorw"artsreferenzen im Quellcode
  375. enthalten, so kommt \asname{} mit einem Durchgang aus.  Stellt sich dagegen im zweiten
  376. Durchgang heraus, da"s ein Befehl mit einer k"urzeren oder l"angeren Kodierung
  377. benutzt werden mu"s, so wird ein dritter (vierter, f"unfter...) Durchgang
  378. eingelegt, um alle Symbolreferenzen richtig zu stellen.  Mehr steckt hinter dem
  379. Begriff ,,Multipass'' nicht...er wird im weiteren Verlauf dieser Anleitung
  380. deswegen auch nicht mehr auftauchen.
  381. \par
  382. Nach soviel Lobhudelei ein dicker Wermutstropfen: \asname{} erzeugt keinen
  383. linkf"ahigen Code.  Eine Erweiterung um einen Linker w"are mit erheblichem
  384. Aufwand verbunden und ist momentan nicht in Planung.
  385. \par
  386. Wer einen Blick in die Quellen von \asname{} werfen will, besorge sich einfach
  387. die Unix-Version von \asname{}, die als Quelltext zum Selber "ubersetzen kommt.
  388. Die Quellen sind mit Sicherheit nicht in einem Format, da"s das
  389. Verst"andnis m"oglichst leicht macht - an vielen Stellen schaut noch
  390. der originale Pascal-Quellcode heraus, und ich teile einige h"aufig
  391. vertretene Ansichten "uber 'guten' C-Stil nicht...
  392.  
  393. %%----------------------------------------------------------------------
  394.  
  395. \section{Unterst"utzte Plattformen}
  396.  
  397. Obwohl \asname{} als ein reines DOS-Programm \marginpar{{\em DOS}} angefangen
  398. hat, stehen auch eine Reihe von Versionen zur Verf"ugung, die etwas mehr
  399. als den Real-Mode eines Intel-Prozessors ausnutzen k"onnen.  Diese sind in
  400. ihrer Benutzung soweit als m"oglich kompatibel gehalten zur DOS-Version,
  401. es ergeben sich nat"urlich bisweilen Unterschiede in der Installation und
  402. der Einbindung in die jeweilige Betriebssystemumgebung.  Abschnitte in
  403. dieser Anleitung, die nur f"ur eine bestimmte Version von \asname{} gelten, sind
  404. mit einer entsprechenden Randbemerkung (an diesem Absatz f"ur die
  405. DOS-Version) gekennzeichnet.  Im einzelnen existieren die folgenden,
  406. weiteren Versionen (die als getrennte Pakete distributiert werden):
  407.  
  408. F"ur den Fall, da"s \marginpar{{\em DPMI}} man bei der "Ubersetzung
  409. gro"ser, komplexer Programme unter DOS Speicherplatzprobleme bekommt,
  410. existiert eine DOS-Version, die mittels eines DOS-Extenders im Protected
  411. Mode abl"auft und so das komplette Extended Memory eines ATs nutzen kann.
  412. Die "Ubersetzung wird durch den Extender merklich langsamer, aber immerhin
  413. l"auft es dann noch...
  414.  
  415. F"ur Freunde von IBM's Betriebssystem OS/2 \marginpar{{\em OS/2}} gibt es
  416. eine native OS/2-Version von \asname{}.  Seit 1.41r8 ist diese nur eine volle
  417. 32-bittige OS/2-Anwendung, was nat"urlich zur Folge hat, da"s OS/2 2.x
  418. und ein 80386-Prozessor jetzt zwingend erforderlich sind.
  419.  
  420. Den reinen PC-Bereich verl"a"st man mit der \marginpar{{\em UNIX}}
  421. C-Version von \asname{}, die so gehalten wurde, da"s sie auf einer m"oglichst
  422. gro"sen Zahl von UNIX-artigen Systemen (dazu z"ahlt aber auch OS/2 mit dem
  423. emx-Compiler) ohne gro"sartige Verrenkungen "ubersetzbar ist.  Im
  424. Gegensatz zu den vorherigen Versionen (die auf den auf Anfrage
  425. erh"altlichen Pascal-Sourcen basieren) wird die C-Version im Quellcode
  426. ausgeliefert, d.h. man mu"s sich mittels eines Compilers selbst die
  427. Binaries erzeugen.  Dies ist aber (f"ur mich) der eindeutig einfachere
  428. Weg, als ein Dutzend Binaries f"ur Maschinen vorzukompilieren, auf die ich
  429. auch nicht immer Zugriff habe...
  430.  
  431. %%===========================================================================
  432.  
  433. \cleardoublepage
  434. \chapter{Benutzung des Assemblers}
  435.  
  436. \begin{quote}\begin{raggedright}{\it
  437. Scotty: Captain, we din\verb!'! can reference it! \\
  438. Kirk:   Analysis, Mr. Spock? \\
  439. Spock:  Captain, it doesn\verb!'!t appear in the symbol table. \\
  440. Kirk:   Then it\verb!'!s of external origin? \\
  441. Spock:  Affirmative. \\
  442. Kirk:   Mr. Sulu, go to pass two. \\
  443. Sulu:   Aye aye, sir, going to pass two. \\
  444. }\end{raggedright}\end{quote}
  445.  
  446. %%---------------------------------------------------------------------------
  447.  
  448. \section{Hardware-Anforderungen}
  449.  
  450. Je nach Version von \asname{} variieren die Hardware-Anforderungen deutlich:
  451.  
  452. Die DOS-Version \marginpar{{\em DOS}} l"auft prinzipiell auf allen
  453. IBM-kompatiblen PCs, angefangen vom PC/XT mit vierkommawenig Megaherz bis
  454. hin zum Pentium.  Wie bei vielen anderen Programmen aber auch, steigt der
  455. Lustgewinn mit der Hardware-Ausstattung.  So d"urfte ein XT-Benutzer ohne
  456. Festplatte erhebliche Probleme haben, die "uber 500 Kbyte gro"se
  457. Overlay-Datei von \asname{} auf einer Diskette unterzubringen...eine Festplatte
  458. sollte der PC also schon haben, allein um vern"unftige Ladezeiten zu
  459. erreichen.  Im Hauptspeicherbedarf ist \asname{} recht gen"ugsam: Das Programm
  460. selber belegt knapp 300 Kbyte Hauptspeicher, \asname{} sollte also ab einer
  461. Hauptspeichergr"o"se von 512 Kbyte ausf"uhrbar sein.
  462.  
  463. Die Version von \asname{} f"ur das \marginpar{{\em DPMI}}
  464. DOS-Protected-Mode-Interface (DPMI) ben"otigt zum Ablaufen mindestens
  465. einen 80286-Prozessor und 1 Mbyte freies Extended Memory.  Daher stellen 2
  466. Mbyte Hauptspeicher das absolute Minimum dar, wenn man im XMS sonst keine
  467. anderen Spielereien (Platten-Cache, RAM-Disk, hochgeladenes DOS)
  468. installiert hat, sonst entsprechend mehr.  Falls man die DPMI-Version in
  469. einer DOS-Box von OS/2 laufen l"a"st, so sollte DPMI auch in den
  470. DOS-Einstellungen der Box erlaubt sein (Einstellung \tty{An} oder
  471. \tty{Auto}) und der Box eine entsprechende Menge von XMS-Speicher
  472. zugeordnet sein.  Die virtuelle Speicherverwaltung von OS/2 sorgt hier
  473. "ubrigens daf"ur, da"s man sich keine Gedanken machen mu"s, ob der
  474. eingestellte Speicher auch real verf"ugbar ist.
  475.  
  476. Die C-Version \marginpar{{\em UNIX}} von \asname{} wird im Quellcode ausgeliefert
  477. und erfordert damit ein Unix- oder OS/2-System mit einem C-Compiler.
  478. Der Compiler mu"s dem ANSI-Standard gen"ugen (GNU-C erf"ullt diese
  479. Bedingung zum Beispiel).  Ob Ihr UNIX-System bereits getestet und die
  480. n"otigen Definitionen vorgenommen wurden, k"onnen Sie der \tty{README}-Datei
  481. entnehmen.  Als zur Kompilation ben"otigten Plattenplatz sollten Sie
  482. ca. 15 Mbyte veranschlagen; dieser Wert (und der nach der "Ubersetzung
  483. noch ben"otigte Platz f"ur die "ubersetzten Programme) variiert
  484. allerdings stark von System zu System, so da"s man diesen Wert nur als
  485. Richtschnur betrachten sollte.
  486.  
  487. %%---------------------------------------------------------------------------
  488.  
  489. \section{Lieferumfang}
  490.  
  491. Prinzipiell erh"alt man \asname{} in einer von zwei Formen: Als {\em
  492. Bin"ardistribution} oder {\em Quellcodedistribution}.  Im Falle einer
  493. Bin"ardistribution bekommt man \asname{} mit den zugeh"origen Dienstprogrammen
  494. und Hilfsdateien fertig "ubersetzt, so da"s man nach dem Auspacken des
  495. Archivs an die gew"unschte Stelle direkt loslegen kann.
  496. Bin"ardistributionen werden f"ur verbreitete Plattformen gemacht, bei
  497. denen die Mehrzahl der Benutzer keinen Compiler hat oder die "Ubersetzung
  498. trickreich ist (im Moment sind dies DOS und OS/2).  Eine
  499. Quellcodedistribution enth"alt im Gegensatz den kompletten Satz an
  500. C-Quellen, um \asname{} zu generieren; es ist letzten Endes ein Schnappschu"s
  501. des Quellenbaumes, an dem ich \asname{} weiterentwickele.  Die Generierung von \asname{}
  502. aus dem Quellcode und dessen Struktur ist n"aher in Anhang
  503. \ref{ChapSource} beschrieben, weshalb an dieser Stelle nur auf den
  504. Umfang und die Installation einer Bin"ardistribution beschrieben wird:
  505.  
  506. Das Archiv des Lieferumfangs gliedert sich in einige Unterverzeichnisse,
  507. so da"s man nach dem Auspacken sofort einen Verzeichnisbaum erh"alt.  Die
  508. Verzeichnisse enthalten im einzelnen:
  509. \begin{itemize}
  510. \item{{\tt BIN}: ausf"uhrbare Programme, Text-Resourcen;}
  511. \item{{\tt INCLUDE}: Include-Dateien f"ur Assemblerprogramme, z.B.
  512.      Registerdefinitionen oder Standardmakros;}
  513. \item{{\tt MAN}: Kurzreferenzen f"ur die Programme im Unix-Man-Format;}
  514. \item{{\tt DOC}: diese Dokumentation in verschiedenen Formaten;}
  515. \item{{\tt LIB}: vorgesehen f"ur Initialisierungsdateien.}
  516. \end{itemize}
  517. Eine Auflistung der Dateien, die in jeder Bin"ardistribution enthalten
  518. sind, findet sich in Tabelle \ref{TabCommonPackageList}.  Falls eine der
  519. in diesen (oder den folgenden) Tabellen aufgef"uhrten Dateien fehlt, hat
  520. jemand (im Zweifelsfalle ich) beim Kopieren geschlafen...
  521.  
  522. \begin{center}\begin{longtable}{|l|l|}
  523. \hline
  524. Datei             & Funktion \\
  525. \hline
  526. \hline
  527. \endhead
  528. {\bf Verzeichnis BIN} & \\
  529. \hline
  530. AS.EXE            & Programmdatei Assembler \\
  531. PLIST.EXE         & listet Inhalt von Codedateien auf \\
  532. PBIND.EXE         & kopiert Codedateien zusammen \\
  533. P2HEX.EXE         & wandelt Code- in Hexdateien um \\
  534. P2BIN.EXE         & wandelt Code- in Bin"ardateien um \\
  535. AS.MSG            & Textresourcen zu \asname{} *) \\
  536. PLIST.MSG         & Textresourcen zu PLIST *) \\
  537. PBIND.MSG         & Textresourcen zu PBIND *) \\
  538. P2HEX.MSG         & Textresourcen zu P2HEX *) \\
  539. P2BIN.MSG         & Textresourcen zu P2BIN *) \\
  540. TOOLS.MSG         & gemeinsame Textresourcen zu den Tools *) \\
  541. CMDARG.MSG        & gemeinsame Textresourcen zu allen Programmen *) \\
  542. IOERRS.MSG        & \\
  543. \hline
  544. \multicolumn{2}{|l|}{*) nur DOS} \\
  545. \hline
  546. {\bf Verzeichnis DOC} & \\
  547. \hline
  548. AS\_DE.DOC        & deutsche Dokumentation, ASCII-Format \\
  549. AS\_DE.HTML       & deutsche Dokumentation, HTML-Format \\
  550. AS\_DE.TEX        & deutsche Dokumentation, LaTeX-Format \\
  551. AS\_EN.DOC        & englische Dokumentation, ASCII-Format \\
  552. AS\_EN.HTML       & englische Dokumentation, HTML-Format \\
  553. AS\_EN.TEX        & englische Dokumentation, LaTeX-Format \\
  554. \hline
  555. {\bf Verzeichnis INCLUDE} & \\
  556. \hline
  557. BCDIC.INC         & Definition BCDIC/Codepage 359 \\
  558. BITFUNCS.INC      & Funktionen zur Bitmanipulation \\
  559. CTYPE.INC         & Funktionen zur Klassifizierung von \\
  560.                  & Zeichen \\
  561. EBCDIC.INC        & Inkludiert alle EBCDIC-Varianten \\
  562. CP037.INC         & Definition EBCDIC (Codepage 037) \\
  563. CP5100.INC        & Definition Zeichensatz IBM 5100 \\
  564. CP5110.INC        & Definition EBCDIC (IBM 5110) \\
  565. 80C50X.INC        & Registeradressen SAB C50x \\
  566. 80C552.INC        & Registeradressen 80C552 \\
  567. H8\_3048.INC      & Registeradressen H8/3048 \\
  568. KENBAK.INC        & Registeradressen Kenbak-1 \\
  569. RADIX50.INC       & Definition RADIX 50 Zeichensatz \\
  570. REG166.INC        & Adressen \& Befehlsmakros 80C166/167 \\
  571. REG251.INC        & Adressen \& Bits 80C251 \\
  572. REG29K.INC        & Peripherieadressen AMD 2924x \\
  573. REG53X.INC        & Registeradressen H8/53x \\
  574. REG6303.INC       & Registeradressen 6303 \\
  575. REG683XX.INC      & Registeradressen 68332/68340/68360 \\
  576. REG7000.INC       & Registeradressen TMS70Cxx \\
  577. REG78310.INC      & Registeradressen \& Vektoren 78K3 \\
  578. REG78K0.INC       & Registeradressen 78K0 \\
  579. REG96.INC         & Registeradressen MCS-96 \\
  580. REGACE.INC        & Registeradressen ACE \\
  581. REGAVROLD.INC     & Register- \& Bitadressen AVR-Familie (veraltet)\\
  582. REGAVR.INC        & Register- \& Bitadressen AVR-Familie (aktuell)\\
  583. REGCOLD.INC       & Registeradressen ColdFire \\
  584. REGCOP8.INC       & Registeradressen COP8 \\
  585. REGF8.INC         & Register- \& Speicheradressen F8 \\
  586. REGGP32.INC       & Registeradressen 68HC908GP32 \\
  587. REGH16.INC        & Registeradressen H16 \\
  588. REGHC12.INC       & Registeradressen 68HC12 \\
  589. REGM16C.INC       & Registeradressen Mitsubishi M16C \\
  590. REGMSP.INC        & Registeradressen TI MSP430 \\
  591. REGPDK.INC        & Register- \& Bitadressen PMC/PMS/PFSxxx \\
  592. REGS12Z.INC       & Register- \& Bitadressen S12Z-Familie \\
  593. REGST6.INC        & Register- \& Makrodefinitionen ST6 (aktuell)\\
  594. REGST7.INC        & Register- \& Makrodefinitionen ST7 \\
  595. REGSTM8.INC       & Register- \& Makrodefinitionen STM8 \\
  596. REGST9.INC        & Register- \& Makrodefinitionen ST9 \\
  597. REGZ380.INC       & Registeradressen Z380 \\
  598. STDDEF04.INC      & Registeradressen 6804 \\
  599. STDDEF16.INC      & Befehlsmakros und Registeradressen \\
  600.                  & PIC16C5x \\
  601. STDDEF17.INC      & Registeradressen PIC17C4x \\
  602. STDDEF18.INC      & Registeradressen PIC16C8x \\
  603. STDDEF2X.INC      & Registeradressen TMS3202x \\
  604. STDDEF37.INC      & Register- \& Bitadressen TMS370xxx \\
  605. STDDEF3X.INC      & Peripherieadressen TMS320C3x \\
  606. STDDEF4X.INC      & Peripherieadressen TMS320C4x \\
  607. STDDEF47.INC      & Befehlsmakros TLCS-47 \\
  608. STDDEF51.INC      & Definition von SFRs und Bits f"ur \\
  609.                  & 8051/8052/80515 \\
  610. STDDEF56K.INC     & Registeradressen DSP56000 \\
  611. STDDEF5X.INC      & Peripherieadressen TMS320C5x \\
  612. STDDEF60.INC      & Befehlsmakros \& Registeradressen \\
  613.                  & PowerPC \\
  614. STDDEF62.INC      & Registeradressen \& Makros ST6 (veraltet)\\
  615. STDDEF75.INC      & Registeradressen 75K0 \\
  616. STDDEF87.INC      & Register- \& Speicheradressen TLCS-870 \\
  617. STDDEF90.INC      & Register- \& Speicheradressen TLCS-90 \\
  618. STDDEF96.INC      & Register- \& Speicheradressen TLCS-900 \\
  619. STDDEFXA.INC      & SFR-\& Bitadressen Philips XA \\
  620. STDDEFZ8.INC      & Registeradressen Z8-Familie (alt)\\
  621. REGV60.INC        & Registeradressen NEC V60 \\
  622. REGZ8.INC         & Registeradressen Z8-Familie (neu)\\
  623. REGSX20.INC       & Register- \& Bitadressen Parallax SX20/28 \\
  624. AVR/\*.INC        & Register- \& Bitadressen AVR-Familie \\
  625.                  & (nicht direkt benutzen, REGAVR.INC \\
  626.                  & inkludieren) \\
  627. COLDFIRE\/*.INC   & Register- \& Bitadressen ColdFire-Familie \\
  628.                  & (nicht direkt benutzen, REGCOLD.INC \\
  629.                  & inkludieren) \\
  630. PDK\/*.INC        & Register- \& Bitadressen PMC/PMS/PFSxxx \\
  631.                  & (nicht direkt benutzen, REGPDK.INC \\
  632.                  & inkludieren) \\
  633. S12Z\/*.INC       & Register- \& Bitadressen S12Z-Familie \\
  634.                  & (nicht direkt benutzen, REGS12Z.INC \\
  635.                  & inkludieren) \\
  636. ST6\/*.INC        & Register- \& Bitadressen ST6-Familie \\
  637.                  & (nicht direkt benutzen, REGST6.INC \\
  638.                  & inkludieren) \\
  639. ST7\/*.INC        & Register- \& Bitadressen ST7-Familie \\
  640.                  & (nicht direkt benutzen, REGST7.INC \\
  641.                  & inkludieren) \\
  642. STM8\/*.INC       & Register- \& Bitadressen STM8-Familie \\
  643.                  & (nicht direkt benutzen, REGSTM8.INC \\
  644.                  & inkludieren) \\
  645. Z8\/*.INC         & Register- \& Bitadressen Z8-Familie \\
  646.                  & (nicht direkt benutzen, REGZ8.INC \\
  647.                  & inkludieren) \\
  648. \hline
  649. {\bf Verzeichnis LIB} & \\
  650. \hline
  651. {\bf Verzeichnis MAN} & \\
  652. \hline
  653. ASL.1             & Kurzanleitung zu AS \\
  654. PLIST.1           & Kurzanleitung zu PLIST \\
  655. PBIND.1           & Kurzanleitung zu PBIND \\
  656. P2HEX.1           & Kurzanleitung zu P2HEX \\
  657. P2BIN.1           & Kurzanleitung zu P2BIN \\
  658. \hline
  659. \caption{Standardumfang einer Bin"ardistribution
  660. \label{TabCommonPackageList}}
  661. \end{longtable}\end{center}
  662.  
  663. Je nach Plattform kann eine Bin"ardistribution aber noch weitere Dateien
  664. enthalten, um einen Betrieb zu erm"oglichen, wie es z.B. bei DOS-Extendern
  665. der Fall ist.  F"ur die DOS-DPMI-Version \marginpar{{\em DPMI}} ergeben
  666. sich die in Tabelle \ref{TabDPMIPackageList} gelisteten Erg"anzungen.  Es
  667. spricht "ubrigens nichts dagegen, als Hilfsprogramme die Versionen aus
  668. einer DOS-Distribution zu verwenden, da diese einerseits ohne den
  669. Extender-Overhead deutlich schneller ablaufen und andererseits den
  670. vom Extender bereitgestellten erweiterten Speicher nicht ben"otigen.
  671.  
  672. \begin{table*}[htp]
  673. \begin{center}\begin{tabular}{|l|l|}
  674. \hline
  675. Datei             & Funktion \\
  676. \hline
  677. \hline
  678. {\bf Verzeichnis BIN} & \\
  679. \hline
  680. DPMI16BI.OVL   & DPMI-Server f"ur den Assembler \\
  681. RTM.EXE        & Laufzeit-Modul des Extenders \\
  682. \hline
  683. \end{tabular}\end{center}
  684. \caption{Zus"atzliche Dateien in einer DPMI-Bin"ardistribution
  685.         \label{TabDPMIPackageList}}
  686. \end{table*}
  687.  
  688. Eine OS/2-Bin"ardistribution \marginpar{{\em OS/2}} enth"alt neben den
  689. Basisdateien eine Reihe von DLLs, die zur Laufzeitumgebung des verwendeten
  690. emx-Compilers geh"oren (Tabelle \ref{TabOS2PackageList}).  Falls man diese
  691. DLLs (oder neuere Versionen davon) bereits besitzt, kann man diese auch
  692. wieder l"oschen und seine eigenen benutzen.
  693.  
  694. \begin{table*}[htp]
  695. \begin{center}\begin{tabular}{|l|l|}
  696. \hline
  697. Datei             & Funktion \\
  698. \hline
  699. \hline
  700. {\bf Verzeichnis BIN} & \\
  701. \hline
  702. EMX.DLL           & Laufzeitbibliotheken f"ur \asname{} und \\
  703. EMXIO.DLL         & die Dienstprogramme \\
  704. EMXLIBC.DLL       & \\
  705. EMXWRAP.DLL       & \\
  706. \hline
  707. \end{tabular}\end{center}
  708. \caption{Zus"atzliche Dateien in einer OS/2-Bin"ardistribution
  709.         \label{TabOS2PackageList}}
  710. \end{table*}
  711.  
  712. %%---------------------------------------------------------------------------
  713.  
  714. \section{Installation}
  715.  
  716. Eine besondere \marginpar{{\em DOS}} Installation ist f"ur die Nutzung
  717. einer Bin"ardistribution nicht notwendig, es gen"ugt, das Archiv an
  718. passender Stelle auszupacken und dann noch einige Kleinigkeiten zu
  719. erg"anzen.  Als Beispiel hier eine Installation, wie sie vielleicht
  720. ein UNIX-Anh"anger vornehmen w"urde:
  721.  
  722. Legen Sie ein Verzeichnis \verb!c:\as! an (im folgenden nehme ich an,
  723. da"s Sie \asname{} auf Laufwerk C installieren wollen), wechseln Sie in dieses
  724. und entpacken Sie das Archiv unter Erhalt der Verzeichnisnamen (bei
  725. Verwendung von PKUNZIP ist dazu die Kommandozeilenoption \verb!-d!
  726. erforderlich).  Sie sollten jetzt folgenden Verzeichnisbaum haben:
  727. \begin{verbatim}
  728. c:\as
  729. c:\as\bin
  730. c:\as\include
  731. c:\as\lib
  732. c:\as\man
  733. c:\as\doc
  734. \end{verbatim}
  735. Erg"anzen Sie jetzt die \tty{PATH}-Anweisung in Ihrer \tty{AUTOEXEC.BAT}
  736. um das Verzeichnis \verb!c:\as\bin!, so da"s \asname{} und seine Hilfsprogramme
  737. vom System gefunden werden.  In dem \tty{lib}-Verzeichnis erzeugen Sie
  738. mit einem beliebigen Texteditor eine Datei \tty{AS.RC} mit folgendem
  739. Inhalt:
  740. \begin{verbatim}
  741. -i c:\as\include
  742. \end{verbatim}
  743. Diese sogenannte {\em Key-Datei} zeigt \asname{}, in welchem Verzeichnis er seine
  744. Include-Dateien suchen soll.  Damit \asname{} diese Key-Datei bei Start
  745. auch beachtet, mu"s noch folgende Anweisung in die \tty{AUTOEXEC.BAT}:
  746. \begin{verbatim}
  747. set ASCMD=@c:\as\lib\as.rc
  748. \end{verbatim}
  749. Was Sie alles noch in der Key-Datei voreinstellen k"onnen, steht im
  750. folgenden Abschnitt.
  751.  
  752. Die Installation der DPMI-Version \marginpar{{\em DPMI}} sollte im Prinzip
  753. genauso verlaufen wie der reinen DOS-Version; wenn der Pfad das {\tt
  754. bin}-Verzeichnis enth"alt, werden die Dateien des DOS-Extenders
  755. automatisch gefunden und man sollte von dieser Mimik (mit Ausnahme der
  756. l"angeren Anlaufzeit...) nichts mitbekommen.  Theoretisch ist es m"oglich,
  757. da"s Sie auf 80286-Rechnern beim ersten Start mit einer Meldung der
  758. folgenden Form konfrontiert werden:
  759. \begin{verbatim}
  760.  machine not in database (run DPMIINST)
  761. \end{verbatim}
  762. Da das Tool DPMIINST bei neueren Versionen des DOS-Extenders von Borland
  763. aber nicht mehr dabei ist, nehme ich einmal an, da"s diese Sache sich
  764. erledigt hat...falls doch nicht, bitte ich um R"uckmeldung!
  765.  
  766. Die Installation der OS/2-Version \marginpar{{\em OS/2}} kann in weiten
  767. Z"ugen genauso ablaufen wie f"ur die DOS-Version, nur da"s dem System noch
  768. die DLLs bekannt gemacht werden m"ussen.  Wenn Sie den {\tt
  769. LIBPATH}-Eintrag in Ihrer {\tt CONFIG.SYS} nicht erweitern wollen, ist es
  770. nat"urlich auch m"oglich, die DLLs in ein Verzeichnis zu verschieben, das
  771. bereits dort aufgef"uhrt ist.
  772.  
  773. Wie bereits erw"ahnt, beschr"ankt sich die Installationsbeschreibung hier
  774. nur auf Bin"ardistributionen.  Da eine Installation unter Unix
  775. \marginpar{{\em UNIX}} im Augenblick immer eine Quellcodedistribution ist,
  776. geht der Verweis hier unisono in Anhang \ref{ChapSource}.
  777.  
  778. %%---------------------------------------------------------------------------
  779.  
  780. \section{Aufruf, Parameter}\label{SectCallConvention}
  781.  
  782. \asname{} ist ein Kommandozeilen-gesteuertes Programm, d.h. alle Parameter
  783. und Dateiangaben sind in der Kommandozeile anzugeben.
  784.  
  785. Zu \asname{} geh"ort eine Reihe Reihe von Nachrichtendateien (erkennbar an der
  786. Endung {\tt MSG}, aus denen \asname{} zur Laufzeit die f"ur die jeweilige
  787. Landessprache dynamisch nachl"adt.  \asname{} sucht nach diesen Dateien in den
  788. folgenden Verzeichnissen:
  789. \begin{itemize}
  790. \item{im aktuellen Verzeichnis;}
  791. \item{im Verzeichnis der EXE-Datei;}
  792. \item{in dem in der Environment-Variablen {\tt AS\_MSGPATH} angegebenen
  793.      Verzeichnis, oder alternativ in den in der {\tt PATH}-Variablen
  794.      gelisteten Verzeichnissen;}
  795. \item{In dem Verzeichnis, das \asname{} zur Kompilationszeit durch das
  796.      Makro {\tt LIBDIR} mitgegeben wurde.}
  797. \end{itemize}
  798. Diese Dateien werden von \asname{} {\em zwingend} zum Betrieb ben"otigt, d.h.
  799. findet \asname{} diese Dateien nicht, bricht er an dieser Stelle sofort ab.
  800.  
  801. Die Auswahl der Sprache (momentan Deutsch oder Englisch) orientiert sich
  802. unter DOS und OS/2 an der {\tt COUNTRY}-Einstellung in der {\tt
  803. CONFIG.SYS}, unter Unix an der {\tt LANG}-Environment-Variablen.
  804.  
  805. Um den \marginpar{{\em DOS}} Speicherbedarf von \asname{} unter DOS "uberhaupt
  806. befriedigen zu k"onnen, wurden die verschiedenen Codegeneratormodule in
  807. der DOS-Version in einen Overlay verlegt, der Teil des EXE-Files ist.
  808. Eine getrennte OVR-Datei wie bei fr"uheren Versionen von \asname{} existiert also
  809. nicht mehr, \asname{} versucht aber wie bisher auch weiterhin, die durch das
  810. Overlaying entstehenden Verz"ogerungen durch Nutzung von eventuellem EMS-
  811. oder XMS-Speicher zu reduzieren.  Sollte diese Verwendung zu Problemen
  812. f"uhren, so k"onnen Sie die Verwendung von EMS bzw. XMS unterbinden, indem
  813. Sie einer Environment-Variablen \tty{USEXMS} bzw. \tty{USEEMS} den Wert
  814. \tty{n} zuweisen.  So kann man z.B. mit dem Befehl
  815. \begin{verbatim}
  816.   SET USEXMS=n
  817. \end{verbatim}
  818. die Verwendung von Extended Memory verhindern.
  819. \par
  820. Da \asname{} alle Ein-und Ausgaben "uber das Betriebssystem abwickelt (und daher
  821. unter DOS auch auf nicht ganz so kompatiblen PCs laufen sollte) und eine
  822. rudiment"are Bildschirmsteuerung ben"otigt, gibt er w"ahrend der
  823. Assemblierung ANSI-Steuersequenzen aus.
  824. Falls Sie in den Ausgaben von \asname{} \marginpar{{\em DOS/}} also seltsame
  825. Zeichen sehen sollten, fehlt offensichtlich in Ihrer CONFIG.SYS die
  826. Einbindung des ANSI-Trei\-bers (\tty{device=\-ansi.sys}), die weitere Funktion
  827. von \asname{} \marginpar{{\em DPMI}} wird dadurch aber nicht beeinflu"st. Alternativ
  828. k"onnen Sie aber auch die Ausgabe von ANSI-Sequenzen durch das Setzen der
  829. Environment-Variablen \tty{USEANSI} auf \tty{n} ganz unterdr"ucken.
  830.  
  831. Der DOS-Extender der DPMI-Version \marginpar{{\em DPMI}} l"a"st sich in
  832. seiner Speicherbelegung durch diverse Kommandozeilenoptionen beeinflussen.
  833. Diese k"onnen Sie bei Bedarf der Datei DPMIUSER.DOC entnehmen.
  834. Zus"atzlich ist sie in der Lage, bei Bedarf den vorhandenen Speicher
  835. durch eine Swap-Datei zu ,,erweitern''.  Dazu belegt man eine
  836. Environment-Variable \tty{ASXSWAP} folgenderma"sen:
  837. \begin{quote}{\tt
  838.  SET ASXSWAP=$<$Gr"o"se$>$[,Dateiname]
  839. }\end{quote}
  840. Die Gr"o"senangabe erfolgt in Megabytes und \bb{mu"s} gemacht werden.  Der
  841. Name der Datei ist dagegen optional; fehlt er, so wird die Swap-Datei im
  842. aktuellen Verzeichnis unter dem Namen \tty{ASX.TMP} angelegt.  In jedem
  843. Falle wird die Swap-Datei nach Programmende wieder gel"oscht.
  844.  
  845. Die Kommandozeilenparameter k"onnen grob in drei Klassen eingeteilt
  846. werden: Schalter, Key-File-Referenzen (s.u.) und Dateispezifikationen.
  847. Parameter dieser beiden Klassen k"onnen beliebig gemischt in der
  848. Kommandozeile auftreten, \asname{} wertet zuerst alle Parameter aus und
  849. assembliert dann die angegebenen Dateien. Daraus folgen zwei Dinge:
  850. \begin{itemize}
  851. \item{Die angegebenen Schalter wirken auf alle angegebenen Quelldateien.
  852.      Sollen mehrere Quelldateien mit unterschiedlich gesetzten Schaltern
  853.      assembliert werden, so mu"s dies in getrennten L"aufen erfolgen.}
  854. \item{Es k"onnen in einem Durchgang mehrere Dateien assembliert werden.
  855.      Um der Sache die Krone aufzusetzen, d"urfen die Dateiangaben
  856.      Jokerzeichen enthalten.}
  857. \end{itemize}
  858. Schalterparameter erkennt \asname{} daran, da"s sie durch einen
  859. Schr"agstrich (/) oder Bindestrich (-) eingeleitet werden.  Es gibt dabei
  860. sowohl Schalter, die nur aus einem Buchstaben bestehen, als auch Schalter,
  861. die aus einem ganzen Wort bestehen.  Immer wenn \asname{} einen Schalter nicht
  862. als ,,Wort-Schalter'' verstehen kann, so versucht er, die Buchstaben des
  863. Wortes als einzelne Schalter zu interpretieren.  Wenn man also z.B.
  864. \begin{verbatim}
  865. -queit
  866. \end{verbatim}
  867. anstelle von
  868. \begin{verbatim}
  869. -quiet
  870. \end{verbatim}
  871. geschrieben h"atte, w"urde \asname{} die Buchstaben \tty{q, u, e, i} und \tty{t}
  872. als einzelne Schalter auffassen.  Mehrbuchstabige Schalter unterscheiden
  873. sich weiterhin von einbuchstabigen dadurch, da"s \asname{} bei ihnen beliebige
  874. Gro"s-und Kleinschreibungen akzeptiert, w"ahrend einbuchstabige Schalter
  875. je nach Gro"s- oder Kleinschreibung unterschiedliche Bedeutung haben.
  876. \par
  877. Momentan sind folgende Schalter definiert:
  878. \ttindex{SHARED}
  879. \begin{itemize}
  880. \item{\tty{l}: Assemblerlisting auf Konsole ausgeben.  Falls mehrere
  881.      Passes ausgef"uhrt werden m"ussen, landen im Gegensatz zur
  882.      n"achsten Option die Listings aller Durchg"ange auf der Ausgabe!}
  883. \item{\tty{L}: Assemblerlisting auf Datei schreiben.  Die Listdatei erh"alt
  884.      dabei den gleichen Namen wie die Quelldatei, lediglich die Endung
  885.      wird durch \tty{LST} ersetzt, es sei denn...}
  886. \item{\tty{OLIST}: mit einem zus"atzlichen Argument legt einen anderen
  887.      Pfad bzw. Namen f"ur die Listdatei fest.  Falls mehrere Dateien
  888.      assembliert werden, kann diese Option auch mehrfach gegeben werden.}
  889. \item{\label{listradix}\tty{LISTRADIX}: Defaultm"a"sig erfolgen alle Zahlenausgaben im Listing
  890.      (Adressen, erzeugter Code, Symboltabelle) im Hexadezimalsystem.  Mit
  891.      diesem Schalter kann ein beliebiges anderes Zahlensystem im Bereich
  892.      2 bis 36 angegeben werden, z.B. '-listradix 8' f"ur oktale Ausgaben.
  893.      Wird der Zahlenwert mit f"uhrender Null geschrieben (also z.B. 08
  894.      anstelle 8), wird der Programmz"ahler im Listing mit f"uhrenden
  895.      Nullen geschrieben.}
  896. \item{\tty{SPLITBYTE [Zeichen]}: Zahlen im Listing werden Byte-weise
  897.      dargestellt, mit dem angegebenen Zeichen als Trenner.  Ein Punkt wird
  898.      als Trenner verwendet, wenn kein Zeichen angegeben wurde.  Diese Option
  899.      wird "ublicherweise zusammen mit der \tty{LISTRADIX}-Option verwendet;
  900.      Listradix 8 zusammen mit einem Punkt als Trenner ergibt die sogenannte
  901.      ''Split-Octal''-Darstellung.}
  902. \item{\tty{o}:Bestimmt einen neuen Namen f"ur die von \asname{} zu erzeugende
  903.      Code-Datei.  Wird diese Option mehrfach verwendet, so werden
  904.      die angegebenen Namen nacheinander den zu assemblierenden
  905.      Quelldateien zugeordnet; Negation (s.u.) dieser Option in
  906.      Verbindung mit einem Namen l"oscht den Namen aus der Liste;
  907.      Negation ohne Namensangabe l"oscht die komplette Liste.}
  908. \item{\tty{SHAREOUT}:dito, nur f"ur eine eventuell zu erzeugende
  909.      SHARE-Datei}
  910. \item{\tty{c}: SHARED-Variablen werden in einem Format abgelegt, das die
  911.      Einbindung in eine C-Quelldatei erlaubt.  Die Endung der Datei
  912.      ist \tty{H}.}
  913. \item{\tty{p}: SHARED-Variablen werden in einem Format abgelegt, das die
  914.      Einbindung in den \tty{CONST}-Block eines Pascal- oder Modula-Programms
  915.      erlaubt.  Die Endung der Datei ist \tty{INC}.}
  916. \item{\tty{a}: SHARED-Variablen werden in einem Format abgelegt, das die
  917.      Einbindung in eine Assembler-Quelldatei erlaubt.  Die Endung
  918.      der Datei ist \tty{INC}.}
  919. \end{itemize}
  920. Zu Sinn und Funktion der SHARED-Symbole siehe Kapitel \ref{ChapShareMain}
  921. bzw. \ref{ChapShareOrder}.
  922. \begin{itemize}
  923. \item{\tty{g [Format]}: Mit diesem Schalter erzeugt \asname{} zus"atzlich eine
  924.      Datei, die Debug-Informationen f"ur dieses Programm enth"alt.
  925.      Als Format ist dabei entweder ein \asname{}-eigenes Format ({\tt
  926.      Format=MAP}), eine NoICE-kompatible Kommandodatei ({\tt
  927.      Format=NOICE}) oder das Format der AVR-Tools ({\tt Format=ATMEL})
  928.      erlaubt.  Zu den im MAP-Format gespeicherten
  929.      Informationen geh"ort zum einen die Symboltabelle, zum anderen eine
  930.      Zuordnung von Quellzeilen zu Maschinenadressen.  Eine genauere
  931.      Beschreibung des benutzten MAP-Dateiformates findet sich in
  932.      Abschnitt \ref{SectDebugFormat}.  Die Endung der Datei ist
  933.      \tty{MAP}, \tty{NOI} bzw. \tty{OBJ}, je nach gew"ahltem Format.
  934.      Wird keine explizite Formatangabe gemacht, wird das MAP-Format
  935.      gew"ahlt.}
  936. \item{\tty{noicemask [Wert]}: Normalerweise listet \asname{} in NoICE-Debuginfos
  937.      nur Symbole aus dem CODE-Segment.  Mit dieser Option und einem als
  938.      Bitmaske zu verstehenden Wert lassen sich andere Symbole aus
  939.      anderen Segmenten zuschalten.  Die Zuordnung von Bits zu Segmenten
  940.      kann Tabelle \ref{TabSegmentNums} entnommen werden.}
  941. \item{\tty{w}: Ausgabe von Warnungen unterdr"ucken;}
  942. \item{\tty{E [Datei]}: Die von \asname{} erzeugten Fehlermeldungen und Warnungen
  943.      in eine Datei umleiten.  Anstatt einer Datei k"onnen auch die 5
  944.      Standardhandles (STDIN..STDPRN) als !0 bis !4 angegeben werden.
  945.      Default ist !2, also STDERR. Wird die Dateiangabe weggelassen,
  946.      so ist der Name der Fehlerdatei gleich dem der Quelldatei, nur
  947.      mit der Endung \tty{LOG}.}
  948. \item{\tty{q}: Dieser Schalter unterdr"uckt alle Meldungen von \asname{} mit
  949.      Ausnahme von Fehlermeldungen und vom Programm selber erzeugten
  950.      Ausgaben.  Die Assemblierzeit kann dadurch geringf"ugig reduziert
  951.      werden, und beim Aufruf aus einer Shell heraus kann man sich eine
  952.      Umleitung ersparen.  Der Nachteil ist, da"s man u.U. einige Minuten
  953.      ,,im Dunklen'' steht...  Anstelle von 'q' darf auch 'quiet' geschrieben
  954.      werden.}
  955. \item{\tty{v}: Dies fordert auf"uhrliche Angaben an, also das Gegenteil
  956.      zum Quiet-Modus.  Die einzige Angabe, die momentat zus"atzlich ausgegeben
  957.      wird, ist die Versionsinformation.}
  958. \item{\tty{version}: Gibt Versionsinformationen aus und beendet sich.}
  959. \item{\tty{h}: Hexadezimalzahlen mit Klein- anstelle von Gro"sbuchstaben ausgeben.
  960.      Diese Option ist in erster Linie eine Frage des pers"onlichen
  961.      Geschmacks.}
  962. \item{\tty{i $<$Pfadliste$>$}: gibt eine Liste von Verzeichnissen an, in denen
  963.      der Assembler automatisch nach Include-Dateien suchen soll, falls
  964.      er diese nicht im aktuellen Verzeichnis findet. Die einzelnen
  965.      Verzeichnisse m"ussen durch Semikolons getrennt werden.}
  966. \item{\tty{u}: eine Liste der in den Segmenten belegten Bereiche berechnen.
  967.      Sie ist nur sinnvoll, falls ein Listing erzeugt
  968.      wird.  Diese Option ben"otigt erhebliche zus"atzliche Speicher-
  969.      und Rechenleistung, im Normalbetrieb sollte sie daher abgeschaltet
  970.      sein.  Da \asname{} aber unabh"angig vom eingeschalteten Listing mit dieser
  971.      Option auf "uberlappende Speicherbelegung pr"uft, hat sie auch
  972.      unabh"angig vom Listing einen gewissen Sinn...}
  973. \item{\tty{C}: erzeugt eine Liste mit Querverweisen.  Aufgelistet wird,
  974.      welche (globalen) Symbole in welchen Dateien in welchen Zeilen
  975.      benutzt werden.  Auch diese Liste wird nur generiert, falls
  976.      ein Listing erzeugt wird und belegt w"ahrend der
  977.      Assemblierung zus"atzlichen Speicherplatz.}
  978. \item{\tty{s}: eine Liste aller Sektionen (s. Abschnitt \ref{ChapLocSyms})
  979.      ausgeben.  Die Verschachtelung wird dabei durch Einr"uckungen
  980.      angedeutet.}
  981. \item{\tty{I}: Analog zur Sektionsliste eine Liste aller bearbeiteten
  982.      Include-Dateien ausgeben.}
  983. \item{\tty{t $<$Maske$>$}: Mit diesem Schalter lassen sich einzelne Komponenten
  984.      des standardm"a"sig ausgegebenen Assembler-Listings ein-und ausblenden.
  985.      Welcher Teil dabei welchem Bit zugeordnet ist, ist im "ubern"achsten
  986.      Abschnitt, der genauer auf das Format des Assembler Listings eingeht,
  987.      nachgelesen werden.}
  988. \item{\tty{D $<$Symbolliste$>$}: Symbole definieren. Die hinter dieser Option
  989.      angegebenen, durch Kommas getrennten Symbole werden in der
  990.      globalen Symboltabelle vor Beginn der Assemblierung abgelegt.
  991.      Defaultm"a"sig werden diese Symbole als ganze Zahlen mit dem
  992.      Wert TRUE abgelegt, mit einem nachgestellten Gleichheitszeichen
  993.      kann aber auch eine andere Belegung gew"ahlt werden.  Der dem
  994.      Gleichheitszeichen folgende Ausdruck darf dabei auch Operatoren
  995.      oder interne Funktionen beinhalten, jedoch \bb{KEINE} anderen
  996.      Symbole, selbst wenn diese schon davor in der Liste definiert
  997.      sein sollten!  Zusammen mit den Befehlen zur bedingten
  998.      Assemblierung (siehe dort) k"onnen so per Kommandozeile aus einer
  999.      Quelldatei unterschiedliche Programmversionen erzeugt werden.
  1000.      {\bf ACHTUNG!} Wenn case-sensitiv gearbeitet werden soll, mu"s dies
  1001.      in der Kommandozeile {\em vor} Symboldefinitionen angegeben werden,
  1002.      sonst werden Symbolnamen schon an dieser Stelle in Gro"sbuchstaben
  1003.      umgewandelt!}
  1004. \item{\tty{A}: Die Liste globaler Symbole in einer anderen, kompakteren Form
  1005.      ablegen.  Verwenden Sie diese Option, wenn der Assembler bei
  1006.      langen Symboltabellen mit einem Stapel"uberlauf abst"urzt.
  1007.      Eventuell kann diese Option die Arbeitsgeschwindigkeit des
  1008.      Assemblers erh"ohen, dies h"angt jedoch von den Quellen ab.}
  1009. \item{\tty{x}: Legt die Ausf"uhrlichkeitsstufe von Fehlermeldungen fest.
  1010.      Jedes Mal, wenn diese Option angegeben wird, wird die Stufe
  1011.      um eins erh"oht oder gesenkt.  W"ahrend auf Stufe 0 (Vorgabe) nur
  1012.      der Fehler selber ausgegeben wird, wird ab Stufe 1 noch eine
  1013.      erweiterte Meldung ausgegeben, anhand der die Identifizierung des
  1014.      Fehlers erleichtert werden soll.  Welche Fehlermeldungen welche
  1015.      Zusatzinformationen tragen k"onnen, steht in Anhang \ref{ChapErrMess}
  1016.      mit der Liste aller Fehlermeldungen.  Auf Stufe 2 (Maximum) wird
  1017.      zus"atzlich noch die betroffene Quellzeile mit ausgegeben.}
  1018. \item{\tty{n}: Wird diese Option angegeben, so werden Fehlermeldungen nicht nur
  1019.      mit ihrem Klartext, sondern auch mit ihren im Anhang
  1020.      \ref{ChapErrMess} genannten internen Nummern ausgegeben.  Diese
  1021.      Option ist prim"ar f"ur Shells und Entwicklungsumgebungen gedacht,
  1022.      denen mit diesen Nummern die Identifizierung von Fehlern erleichtert
  1023.      werden soll.}
  1024. \item{\tty{U}: Mit dieser Option schaltet man \asname{} in den case-sensitiven
  1025.      Modus um, d.h. in Namen von Symbolen, Sektionen, Makros,
  1026.      Zeichentabellen und selbst definierte Funktionen werden Klein-
  1027.      und Gro"sbuchstaben unterschieden, was normalerweise nicht der
  1028.      Fall ist.}
  1029. \item{\tty{P}: weist \asname{} an, den von Makroprozessor und bedingter Assemblierung
  1030.      bearbeiteten Quelltext in einer Datei abzulegen.  Dieser Datei
  1031.      fehlen zus"atzlich Leer- und reine Kommentarzeilen.  Die Endung
  1032.      der Datei ist \tty{I}.}
  1033. \item{\tty{M}: mit diesem Schalter erzeugt \asname{} eine Datei, in der die Definitionen
  1034.      der Makros aus der Quelldatei abgespeichert werden, die die
  1035.      \tty{EXPORT}-Option verwenden.  Diese neue Datei hat den gleichen
  1036.      Namen wie die Quelldatei, lediglich die Endung wird in \tty{MAC} ge"andert.}
  1037. \item{\tty{G}: Dieser Schalter bestimmt, ob \asname{} Code erzeugen soll oder nicht.
  1038.      Ist er ausgeschaltet, wird die Datei zwar assembliert,
  1039.      aber keine Code-Datei geschrieben. Dieser Schalter ist defaultm"a"sig aktiviert
  1040.      (logisch, sonst bek"ame man ja auch gar kein Code-File).}
  1041. \item{\tty{r [n]}: Warnungen ausgeben, falls Situationen eintreten, die
  1042.      einen weiteren Pass erfordern.  Diese Information kann genutzt
  1043.      werden, um die Anzahl der Durchl"aufe zu verringern.  Optional kann
  1044.      man die Nummer des Passes angeben, ab dem diese Warnungen erzeugt
  1045.      werden; ohne Angabe kommen die Warnungen ab dem ersten Pass.  Machen
  1046.      Sie sich aber so oder so auf einen ziemlichen Haufen an Meldungen
  1047.      gefa"st!!}
  1048. \item{\tty{bigendian}: Mit diesem Schalter schaltet man vom Beginn des
  1049.      Programms die Ablage von Werten im Speicher im Big Endian Modus ein,
  1050.      sofern die Zielarchitektur den gleichnamigen Pseudobefehl unterst"utzt
  1051.      (siehe Abschnitt \ref{SectBIGENDIAN}).}
  1052. \item{\tty{plainbase}: Mit diesem Schalter erlaubt man vom Beginn des
  1053.      Programms an das Fortlassen eines leeren Indexarguments (siehe Abschnitt
  1054.      \ref{SectPLAINBASE}).}
  1055. \item{\tty{underscore-macroargs}: Erlaubt die Verwendung von Unterstrichen in
  1056.      Namen von Makro-Argumenten (siehe \ref{SectMacros}).}
  1057. \item{\tty{relaxed}: Mit diesem Schalter aktiviert man den RELAXED-Modus
  1058.      vom Beginn des Programms an, der ansonsten erst durch die gleichnamige
  1059.      Pseudoanweisung (siehe Abschnitt \ref{SectRELAXED}) eingeschaltet
  1060.      werden mu"s.}
  1061. \item{\tty{supmode}: Mit diesem Schalter erlaubt man vom Beginn des Programms
  1062.      an die Verwendung von Maschinenbefehlen, die nur im Supervisor-Modus
  1063.      des Prozessors verwendet werden d"urfen (siehe Abschnitt \ref{SectSUPMODE}).}
  1064. \item{\tty{Y}: Mit diesem Schalter weist man \asname{} an, alle Fehlermeldungen
  1065.      wegen zu langer Sprungdistanzen zu verwerfen, sobald die Notwendigkeit
  1066.      eines neuen Durchlaufs feststeht.  In welchen (seltenen) Situationen
  1067.      dieser Schalter notwendig ist, kann man in Abschnitt \ref{ForwRefs}
  1068.      nachlesen.}
  1069. \item{\tty{cpu $<$Name$>$}: Hiermit kann man man den Zielprozessor
  1070.      vorgeben, f"ur den \asname{} Code erzeugen soll, wenn die Quelldatei keinen
  1071.      {\tt CPU}-Befehl enth"alt.
  1072.      Falls das gew"ahlte Ziel CPU-Argumente unterst"utzt (siehe Abschnitt
  1073.      \ref{SectCPU}), k"onnen diese auch hier angegeben werden.  Ein Aufruf
  1074.      mit \verb!?! oder {\tt list} als Argument listet alle implementierten
  1075.      Zielprozessoren auf.}
  1076. \item{\tty{alias $<$neu$>$=$<$alt$>$}:\\
  1077.      definiert den Prozessortyp \tty{$<$neu$>$} als einen Alias f"ur den
  1078.      Typen \tty{$<$alt$>$}.  Zu den Sinn und Zweck von Aliasen siehe
  1079.      Abschnitt \ref{SectAlias}}
  1080. \item{{\tt gnuerrors}: Meldungen "uber Fehler bzw. Warnungen und deren
  1081.      Position nicht im Standardformat von \asname{}, sondern in einem dem GNU
  1082.      C-Compiler entlehnten Format anzeigen.  Dies erleichtert die
  1083.      Integration von \asname{} in f"ur dieses Format ausgelegte Umgebungen,
  1084.      unterdr"uckt aber gleichzeitig die Anzeige der pr"azisen
  1085.      Fehlerposition innerhalb Makror"umpfen!}
  1086. \item{{\tt maxerrors [n]}: Weist den Assembler an, nach der gegebenen
  1087.      Anzahl von Fehlern die Assemblierung abzubrechen.}
  1088. \item{{\tt maxinclevel [n]}: Weist den Assembler an, nach der gegebenen
  1089.      Include-Verschachtelungstiefe abzubrechen (Default ist 200).}
  1090. \item{{\tt Werror}: Weist den Assembler an, Warnungen als Fehler zu
  1091.      behandeln.}
  1092. \item{\tty{compmode}: Dieser Schalter weist den Assembler an, im Default
  1093.      im Kompatibilit"atsmodus zu arbeiten.  Genauere Informationen zu
  1094.      diesem Modus finden sich im Abschnitt \ref{SectCompMode}.}
  1095. \item{\tty{packing}: Dieser Schalter "ubersteuert den Architektur-
  1096.      abh"angigen Default f"ur die {\tt PACKING}-Option (siehe
  1097.      Abschnitt \ref{SectPACKING}).}
  1098. \end{itemize}
  1099. Sofern Schalter keine Argumente ben"otigen und ihre Zusammenziehung
  1100. keinen mehrbuchstabigen Schalter ergibt, k"onnen mehrere Schalter
  1101. auch auf einen Rutsch angegeben werden, wie z.B im folgenden Beispiel:
  1102. \begin{verbatim}
  1103. as test*.asm firstprog -cl /i c:\as\8051\include
  1104. \end{verbatim}
  1105. Es werden alle Dateien TEST*.ASM sowie die Datei FIRSTPROG.ASM
  1106. assembliert, wobei f"ur alle Dateien Listings auf der Konsole
  1107. ausgegeben und Sharefiles im C-Format erzeugt werden.  Nach Includes
  1108. soll der Assembler zus"atzlich im Verzeichnis \verb! C:\AS\8051\INCLUDE !
  1109. suchen.
  1110. \par
  1111. Dieses Beispiel zeigt nebenbei, da"s \asname{} als Defaultendung f"ur Quelldateien
  1112. \tty{ASM} annimmt.
  1113. \par
  1114. Etwas Vorsicht ist bei Schaltern angebracht, die ein optionales Argument
  1115. haben: Folgt auf einen solchen Schalter ohne Argument ein Dateiname, so
  1116. versucht \asname{}, diesen als Argument zu verwerten, was naturgem"a"s schief
  1117. geht:
  1118. \begin{verbatim}
  1119. as -g test.asm
  1120. \end{verbatim}
  1121. Die L"osung w"are in diesem Fall, die \tty{-g}-Option ans Ende der
  1122. Kommandozeile zu setzen oder ein explizites \tty{MAP}-Argument zu
  1123. spezifizieren.
  1124. \par
  1125. Neben der Angabe in der Kommandozeile k"onnen dauernd ben"otigte
  1126. Optionen in der Environment-Variablen ASCMD abgelegt werden. Wer z.B.
  1127. immer Listdateien haben m"ochte und ein festes Include-Verzeichnis hat,
  1128. kann sich mit dem Befehl
  1129. \begin{verbatim}
  1130. set ASCMD=-L -i c:\as\8051\include
  1131. \end{verbatim}
  1132. eine Menge Tipparbeit ersparen.  Da die Environment-Optionen vor der
  1133. Kommandozeile abgearbeitet werden, k"onnen Optionen in der
  1134. Kommandozeile widersprechende im Environment "ubersteuern.
  1135. \par
  1136. Bei sehr langen Pfaden kann es jedoch auch in der ASCMD-Variablen eng
  1137. werden.  F"ur solche F"alle kann auf eine sogenannte \ii{Key}-Datei
  1138. ausgewichen werden, in der die Optionen genauso wie in der Kommandozeile
  1139. oder ASCMD-Variablen abgelegt werden k"onnen, nur da"s diese Datei
  1140. mehrere Zeilen mit jeweils maximal 255 Zeichen enthalten darf.  Wichtig
  1141. ist dabei, da"s bei Optionen, die ein Argument ben"otigen, sowohl Schalter
  1142. als auch Argument in \bb{einer} Zeile stehen m"ussen.  Der Name der
  1143. Datei wird \asname{} dadurch mitgeteilt, da"s er mit einem vorangestellten
  1144. Klammeraffen in der ASCMD-Variablen abgelegt wird, z.B.
  1145. \begin{verbatim}
  1146. set ASCMD=@c:\as\as.key
  1147. \end{verbatim}
  1148. Um Optionen in der ASCMD-Variablen (oder der Key-Datei) wieder aufzuheben,
  1149. kann die Option mit einem vorangestellten Pluszeichen wieder aufgehoben
  1150. werden.  Soll in einem Einzelfall z.B. doch kein Listing erzeugt werden,
  1151. so kann es mit
  1152. \begin{verbatim}
  1153. as +L <Datei>
  1154. \end{verbatim}
  1155. wieder aufgehoben werden.  Nat"urlich ist es nicht ganz logisch, eine
  1156. Option mit einem Pluszeichen zu negieren...UNIX soit qui mal y pense.
  1157. \par
  1158. Referenzen auf eine Key-Datei k"onnen nicht nur von der {\tt
  1159. ASCMD}-Variablen aus erfolgen, sondern auch direkt von der Kommandozeile
  1160. aus, indem man analog zur {\tt ASCMD}-Variablen dem Dateinamen einen
  1161. Klammeraffen voranstellt:
  1162. \begin{verbatim}
  1163. as @<Datei> ....
  1164. \end{verbatim}
  1165. Die in einem solchen Fall aus dem Key-File gelesenen Optionen werden so
  1166. eingearbeitet, als h"atten sie anstelle dieser Referenz in der
  1167. Kommandozeile gestanden - es ist also {\em nicht} wie bei der {\tt
  1168. ASCMD}-Variablen so, da"s sie vor allen anderen Kommandozeilenoptionen
  1169. abgearbeitet werden w"urden.
  1170. \par
  1171. Das Referenzieren eines Key-Files von einem Key-File selber ist nicht
  1172. erlaubt und wird von \asname{} mit einer Fehlermeldung quittiert.
  1173. \par
  1174. F"ur den Fall, da"s Sie \asname{} von einem anderen Programm oder einer Shell
  1175. aufrufen wollen und diese Shell nur Klein- oder Gro"sbuchstaben in der
  1176. Kommandozeile "ubergeben will, existiert folgendes Workaround: Wird vor
  1177. den Buchstaben der Option eine Tilde gesetzt, so werden die folgenden
  1178. Buchstaben immer als Kleinbuchstaben interpretiert.  Analog erzwingt
  1179. ein Lattenzaun die Interpretation als Gro"sbuchstaben.  Es ergeben
  1180. sich z.B. folgende Transformationen:
  1181. \begin{quote}{\tt
  1182. /\verb!~!I $\longrightarrow$ /i \\
  1183. -\verb!#!u $\longrightarrow$ -U}
  1184. \end{quote}
  1185. \par
  1186. Abh"angig vom Ablauf der Assemblierung endet der Assembler mit
  1187. folgenden Returncodes:
  1188. \begin{description}
  1189. \item[0]{fehlerfreier Ablauf, h"ochstens Warnungen aufgetreten}
  1190. \item[1]{Der Assembler hat nur die Aufrufparameter ausgegeben und
  1191.         endete danach sofort.}
  1192. \item[2]{Es sind Fehler bei der Assemblierung aufgetreten, es wurde
  1193.         keine Code-Datei erzeugt.}
  1194. \item[3]{Es trat ein fataler Fehler w"ahrend des Ablaufes auf, der
  1195.         zum sofortigen Abbruch gef"uhrt hat.}
  1196. \item[4]{Bereits w"ahrend des Starts des Assemblers ist ein Fehler
  1197.         aufgetreten.  Dies kann ein Parameterfehler oder eine fehlerhafte
  1198.         Overlay-Datei sein.}
  1199. \item[255]{Bei der Initialisierung ist irgendein interner Fehler
  1200.         aufgetreten, der auf keinen Fall auftreten sollte...neu booten,
  1201.         noch einmal probieren, und bei Reproduzierbarkeit mit mir
  1202.         Verbindung aufnehmen!}
  1203. \end{description}
  1204.  
  1205. Zus"atzlich endet jede Assemblierung einer Datei mit einer kleinen
  1206. Statistik, die Fehlerzahlen, Laufzeit, Anzahl der Durchl"aufe und freien
  1207. Speicher ausgibt.  Bei eingeschaltetem Assembler-Listing wird diese
  1208. Statistik zus"atzlich auch in das Listing geschrieben.
  1209.  
  1210. OS/2 \marginpar{{\em OS/2}} erweitert wie Unix das Datensegment einer
  1211. Anwendung erst dann, wenn sie wirklich mehr Speicher anfordert.  Eine
  1212. Angabe wie
  1213. \begin{quote}{\tt
  1214. 511 KByte verf"ugbarer Restspeicher
  1215. }\end{quote}
  1216. bedeutet also nicht einen nahenden Systemabsturz wegen Speichermangel,
  1217. sondern stellt nur den Abstand zu der Grenze dar, bei der OS/2 einfach
  1218. ein paar mehr Kohlen in den Ofen schaufelt...
  1219.  
  1220. Da es unter C \marginpar{{\em UNIX}}  auf verschiedenen Betriebssystemen
  1221. keine kompatible M"oglichkeit gibt, den noch verf"ugbaren Speicher bzw.
  1222. Stack zu ermitteln, fehlen bei der C-Version diese beiden Angaben ganz.
  1223.  
  1224. %%---------------------------------------------------------------------------
  1225.  
  1226. \section{Format der Eingabedateien}
  1227. \label{AttrTypes}
  1228.  
  1229. Wie die meisten Assembler auch erwartet \asname{} genau einen Befehl pro Zeile
  1230. (Leerzeilen sind nat"urlich auch zugelassen).  Die Zeilen d"urfen nicht
  1231. l"anger als 255 Zeichen werden, dar"uber hinaus gehende Zeichen werden
  1232. abgeschnitten.
  1233. \par
  1234. Eine einzelne Zeile hat folgendes Format:
  1235. \begin{verbatim}
  1236. [Label[:]]<Befehl>[.Attribut] [Parameter[,Parameter..]] [;Kommentar]
  1237. \end{verbatim}
  1238. Eine Zeile darf dabei auch "uber mehrere Zeilen in der Quelldatei
  1239. verteilt sein, Folgezeichen (\verb!\!) verketten diese Teile dann zu
  1240. einer einzigen Zeile.  Zu beachten ist allerdings, da"s aufgrund der
  1241. internen Pufferstruktur die Gesamtzeile nicht 256 Zeichen "uberschreiten
  1242. darf.  Zeilenangaben in Fehlermeldungen beziehen sich immer auf die
  1243. letzte Zeile einer solchen zusammengesetzten Zeile.
  1244. \par
  1245. Der Doppelpunkt nach dem Label ist optional, falls das Label in der
  1246. ersten Spalte beginnt (woraus folgt, da"s ein Befehl, sei es ein
  1247. Maschinen- oder Pseudobefehl niemals in Spalte 1 beginnen darf).
  1248. Man mu"s ihn aber setzen, falls das Label nicht in der ersten Spalte
  1249. beginnt, damit \asname{} es von einem Befehl unterscheiden kann.  In letzterem
  1250. Fall mu"s "ubrigens zwischen Doppelpunkt und dem Befehl mindestens ein
  1251. Leerzeichen stehen, falls der eingestellte Zielprozessor zu denjenigen
  1252. geh"ort, bei denen das Attribut auch eine mit einem Doppelpunkt
  1253. abgetrennte Formatangabe sein darf.  Diese Einschr"ankung ist aus
  1254. Eindeutigkeits-Gr"unden n"otig, da sonst keine Unterscheidung zwischen
  1255. Befehl mit Format und Label mit Befehl m"oglich w"are.
  1256. \par
  1257. Einige Signalprozessorreihen von Texas Instruments verwenden den f"ur das
  1258. Label vorgesehenen Platz wahlweise auch f"ur einen Doppelstrich
  1259. (\verb!||!), der die parallele Ausf"uhrung mit der vorangehenden
  1260. Instruktion anzeigt.  Wenn diese beiden Instruktionen auf Maschinenebene
  1261. in einem einzigen Wort vereinigt werden (C3x/C4x), macht ein zus"atzliches
  1262. Label vor der zweiten Anweisung nat"urlich keinen Sinn und ist auch nicht
  1263. vorgesehen.  Anders sieht es beim C6x mit seinen Instruktionspaketen
  1264. variabler L"ange aus: Wer dort (unsch"onerweise...) mitten in ein Paket
  1265. hinein springen will, mu"s das Label daf"ur in eine Extrazeile davor setzen
  1266. (das gleiche gilt "ubrigens auch f"ur Bedingungen, die aber zusammen mit
  1267. dem Doppelstrich in einer Zeile stehen d"urfen).
  1268. \par
  1269. Das Attribut wird von einer Reihe von Prozessoren benutzt, um
  1270. Spezialisierungen oder Kodierungsvarianten eines bestimmten Befehls zu
  1271. spezifizieren.  Die bekannteste Nutzung des Attributs ist die Angabe der
  1272. Operandengr"o"se, wie z. B. bei der 680x0-Familie (Tabelle
  1273. \ref{TabAttrs}).
  1274. \begin{table*}[htb]
  1275. \begin{center}\begin{tabular}{|l|l|l|}
  1276. \hline
  1277. Attribut & arithmetisch-logischer Befehl & Sprungbefehl \\
  1278. \hline
  1279. \hline
  1280. B     & Byte (8 Bit)                   & 8-bit-displacement \\
  1281. W     & Wort (16 Bit)                  & 16-Bit-Displacement \\
  1282. L     & Langwort (32 Bit)              & 16-Bit-Displacement \\
  1283. Q     & Vierfachwort (64 Bit)          & --------- \\
  1284. C     & Half Precision (16 Bit)        & --------- \\
  1285. S     & Single Precision (32 Bit)      & 8-Bit-Displacement \\
  1286. D     & Double Precision (64 Bit)      & --------- \\
  1287. X     & Extended Precision (80/96 Bit) & 32-Bit-Displacement \\
  1288. P     & Dezimalgleitkomma (80/96 Bit)  & --------- \\
  1289. \hline
  1290. \end{tabular}\end{center}
  1291. \caption{Erlaubte Attribute (Beispiel 680x0) \label{TabAttrs}}
  1292. \end{table*}
  1293. \par
  1294. Da sich diese Anleitung nicht gleichzeitig als Handbuch f"ur die von \asname{}
  1295. unterst"utzten Prozessorfamilien versteht, ist dies leider auch nicht der
  1296. richtige Platz, um hier alle m"oglichen Attribute f"ur alle unterst"utzten
  1297. Familien aufzuz"ahlen.  Es sei aber angemerkt, da"s i.a. nicht alle Befehle
  1298. alle Attribute zulassen, andererseits das Fortlassen eines Attributs meist
  1299. zur Verwendung der f"ur diese Familie ,,nat"urlichen'' Operandengr"o"se
  1300. f"uhrt.  Zum genaueren Studium greife man auf ein Programmierhandbuch f"ur
  1301. die jeweilige Familie zur"uck, z.B. in \cite{Williams} f"ur die 68000er.
  1302. \par
  1303. Bei TLCS-9000, H8/500 und M16(C) dient das Attribut sowohl der Angabe der
  1304. Operandengr"o"se, falls diese nicht durch die Operanden klar sein sollte,
  1305. als auch der des zu verwendenden Befehlsformates.
  1306. Dieses mu"s durch einen Doppelpunkt von der Operandengr"o"se getrennt werden,
  1307. z.B. so:
  1308. \begin{verbatim}
  1309.    add.w:g   rw10,rw8
  1310. \end{verbatim}
  1311. Was dieses Beispiel nicht zeigt, ist, da"s die Formatangabe auch ohne
  1312. Operandengr"o"se geschrieben werden darf.  Steht demgegen"uber eine
  1313. Operandengr"o"se ohne Formatangabe, verwendet \asname{} automatisch das
  1314. k"urzeste Format.  Die erlaubten Befehlsformate und Operandengr"o"sen
  1315. sind vom Maschinenbefehl abh"angig und k"onnen z.B. \cite{Tosh9000},
  1316. \cite{HitH8_5}, \cite{MitM16} bzw. \cite{MitM16C} entnommen werden.
  1317. \par
  1318. Die Zahl der Befehlsparameter ist abh"angig vom Befehl und kann
  1319. prinzipiell zwischen 0 und 20 liegen.  Die Trennung der Parameter
  1320. voneinander erfolgt ausschlie"slich durch Kommas (Ausnahme: DSP56xxx,
  1321. dessen parallele Datentransfers durch Leerzeichen getrennt werden),
  1322. wobei in Klammern oder Hochkommas eingeschlossene Kommas nat"urlich
  1323. nicht beachtet werden.
  1324. \par
  1325. Anstelle eines Kommentars am Ende kann die Zeile auch nur aus einem
  1326. Kommentar bestehen, wenn er in der ersten Spalte beginnt.
  1327. \par
  1328. Bei den Leerzeichen zur Trennung einzelnen Komponenten darf es sich
  1329. genauso gut um Tabulatoren handeln.
  1330.  
  1331. %%---------------------------------------------------------------------------
  1332.  
  1333. \section{Format des Listings}
  1334.  
  1335. Das von \asname{} bei Angabe der Kommandozeilenoptionen \tty{l} oder \tty{L}
  1336. erzeugte Listing l"a"st sich grob in folgende Teile gliedern:
  1337. \begin{enumerate}
  1338. \item{Wiedergabe des assemblierten Quellcodes;}
  1339. \item{Symbolliste;}
  1340. \item{Makroliste;}
  1341. \item{Funktionsliste;}
  1342. \item{Belegungsliste;}
  1343. \item{Querverweisliste.}
  1344. \end{enumerate}
  1345. Letztere beide werden nur erzeugt, wenn sie durch zus"atzliche
  1346. Kommandozeilenoptionen angefordert wurden.
  1347. \par
  1348. Im ersten Teil listet \asname{} den kompletten Inhalt aller Quelldateien inklusive
  1349. des erzeugten Codes auf.  Eine Zeile in diesem Listing hat dabei folgende Form:
  1350. \begin{verbatim}
  1351. [<n>] <Zeile>/<Adresse> <Code> <Quelle>
  1352. \end{verbatim}
  1353. Im Feld $n$ zeigt \asname{} die Include-Verschachtelungstiefe an.  Die
  1354. Hauptdatei (die Datei, mit der die Assemblierung begann), hat dabei die
  1355. Tiefe 0, von dort aus eingebundene Dateien haben Tiefe 1 usw.  Die Tiefe
  1356. 0 wird dabei nicht angezeigt: F"ur Zeilen der Hauptdatei wird dieses Feld
  1357. durch eine passende Zahl von Leerzeichen ersetzt, oder g"anzlich fortgelassen,
  1358. falls es bisher gar keine Include-Anweisungen gegeben hat.  Das 'Ged"achtnis',
  1359. ob es Include-Anweisungen gegeben hat, und bis zu welcher Tiefe, reicht
  1360. "uber den einzelnen Pass hinaus.  Auf diese Weise 'lernt' der Assembler im
  1361. ersten Pass die maximale Tiefe und kann in folgenden Durchl"aufen dieses
  1362. Feld mit durchgehend gleicher Breite ausgeben.
  1363. \par
  1364. Im Feld \tty{Zeile} wird die Zeilennummer bezogen auf die jeweilige Datei
  1365. ausgegeben.  Die erste Zeile einer Datei hat dabei Nummer 1.  Die Adresse,
  1366. an der der f"ur diese Zeile erzeugte Code abgelegt wurde, folgt hinter dem
  1367. Schr"agstrich im Feld \tty{Adresse}.  Das daf"ur verwendete Zahlensystem
  1368. wird durch den {\tt listradix}-Schalter festgelegt (\ref{listradix}), ebenso
  1369. ob der Wert mit f"uhrenden Nullen angezeigt werden soll oder nicht.  Das
  1370. gerade aktuell verwendete Target mit der Gr"o"se seines Adre"sraumes bestimmt
  1371. die Breite des Feldes: F"ur einen Prozessor mit 64 KByte Adre"sraum sind
  1372. nur 4 Hex-Stellen erforderlich, bei 4 GByte dagegen acht.
  1373. \par
  1374. Der erzeugte Code selber steht dahinter im Feld \tty{Code} in
  1375. hexadezimaler Schreibweise.  Je nach Prozessortyp und aktuellem Segment
  1376. k"onnen die Werte entweder als Bytes oder 16/32-Bit-Worte formatiert sein.
  1377. Sollte mehr Code erzeugt worden sein, als in das Feld hineinpa"st, so
  1378. werden im Anschlu"s an die Zeile weitere Zeilen erzeugt, in denen nur
  1379. dieses Feld belegt ist.
  1380. \par
  1381. Im Feld \tty{Quelle} schlu"sendlich wird die Zeile aus der Quelldatei in
  1382. ihrer Originalform ausgegeben.
  1383. \par
  1384. Die Symboltabelle ist so ausgelegt, da"s sie nach M"oglichkeit immer in 80
  1385. Spalten dargestellt werden kann.  F"ur Symbole ,,normaler L"ange'' wird
  1386. eine zweispaltige Ausgabe gew"ahlt.  Sollten einzelne Symbole mit ihrem
  1387. Wert die Grenze von 40 Spalten "uberschreiten, werden sie in einer
  1388. einzelnen Zeile ausgegeben.  Die Ausgabe erfolgt in alphabetischer
  1389. Reihenfolge.  Symbole, die zwar definiert, aber nie benutzt wurden,
  1390. werden mit einem vorangestellten Stern (\verb!*!) gekennzeichnet.
  1391. \par
  1392. Die bisher genannten Teile sowie die Auflistung aller definierten
  1393. Makros / Funktionen lassen sich selektiv aus dem Gesamtlisting ein-und
  1394. ausblenden, und zwar mit dem bereits erw"ahnten \tty{t}-Kommandozeilenschalter.
  1395. Intern existiert in \asname{} ein Byte, dessen Bits repr"asentieren, welche Teile
  1396. ausgegeben werden sollen.  Die Zuordnung von Bits zu den Teilen ist in
  1397. Tabelle \ref{TabTBits} aufgelistet.
  1398. \par
  1399. \begin{table*}[p]
  1400. \begin{center}\begin{tabular}{|l|l|}
  1401. \hline
  1402. Bit & Teil \\
  1403. \hline
  1404. \hline
  1405. 0   & Quelldatei(en)+erzeugter Code \\
  1406. 1   & Symboltabelle \\
  1407. 2   & Makroliste \\
  1408. 3   & Funktionsliste \\
  1409. 4   & Zeilennumerierung \\
  1410. 5   & Registersymboltabelle \\
  1411. 7   & Zeichentabellenliste \\
  1412. \hline
  1413. \end{tabular}\end{center}
  1414. \caption{Zuordnung der Bits zu den Listingkomponenten\label{TabTBits}}
  1415. \end{table*}
  1416. Defaultm"a"sig sind alle Bits auf 1 gesetzt, bei Verwendung des Schalters
  1417. \begin{verbatim}
  1418. -t <Maske>
  1419. \end{verbatim}
  1420. werden die in \verb!<Maske>! gesetzten Bits gel"oscht, so da"s die entsprechenden
  1421. Listing-Teile unterdr"uckt werden.  Analog lassen sich mit einem Pluszeichen
  1422. einzelne Teile wieder einschalten, falls man es in der \tty{ASCMD}-Variablen
  1423. "ubertrieben hat...will man z.B. nur die Symboltabelle haben, so reicht
  1424. \begin{verbatim}
  1425. -t 2  .
  1426. \end{verbatim}
  1427. In der Belegungsliste werden f"ur jedes Segment einzeln die belegten Bereiche
  1428. hexadezimal ausgegeben.  Handelt es sich bei einem Bereich um eine einzige
  1429. Adresse, wird nur diese ausgegeben, ansonsten erste und letzte Adresse.
  1430. \par
  1431. In der Querverweisliste wird f"ur jedes definierte Symbol in alphabetischer
  1432. Reihenfolge eine Ausgabe folgender Form erzeugt:
  1433. \begin{verbatim}
  1434. Symbol <Symbolname> (=<Wert>,<Datei>/<Zeile>):
  1435. Datei <Datei 1>:
  1436. <n1>[(m1)]  ..... <nk>[(mk)]
  1437. .
  1438. .
  1439. Datei <Datei l>:
  1440. <n1>[(m1)]  ..... <nk>[(mk)]
  1441. \end{verbatim}
  1442. F"ur jedes Symbol wird aufgelistet, in welchen Dateien es in welchen Zeilen
  1443. angesprochen wurde.  Sollte ein Symbol mehrmals in der gleichen Zeile
  1444. benutzt worden sein, so wird dies durch eine in Klammern gesetzte Anzahl
  1445. hinter der Zeilennummer angedeutet.  Sollte ein Symbol niemals benutzt
  1446. worden sein, erscheint es auch nicht in der Liste; entsprechend erscheint
  1447. eine Datei auch "uberhaupt nicht in der Liste eines Symbols, falls es in
  1448. der entsprechenden Datei nicht referenziert wurde.
  1449. \par
  1450. \bb{ACHTUNG!} \asname{} kann dieses Listing nur dann korrekt aufs Papier bringen,
  1451. wenn man ihm vorher die L"ange und Breite des Ausgabemediums mit Hilfe des
  1452. \tty{PAGE}-Befehls (siehe \ref{SectPAGE}) mitgeteilt hat!  Der voreingestellte
  1453. Default sind 60 Zeilen und eine unbegrenzte Zeilenbreite.
  1454.  
  1455. %%---------------------------------------------------------------------------
  1456.  
  1457. \section{Symbolkonventionen}
  1458. \label{SectSymConv}
  1459.  
  1460. Symbole d"urfen zwar (wie in der Einleitung bereits angedeutet) bis zu
  1461. 255 Zeichen lang werden und werden auch auf der ganzen L"ange
  1462. unterschieden, die Symbolnamen m"ussen aber einigen Konventionen
  1463. gen"ugen:
  1464. \par
  1465. Symbolnamen d"urfen aus einer beliebigen Kombination von Buchstaben,
  1466. Ziffern, Unterstrichen und Punkten bestehen, wobei das erste Zeichen
  1467. keine Ziffer sein darf.  Der Punkt wurde nur zugelassen, um der
  1468. MCS-51-Notation von Registerbits zu gen"ugen, und sollte m"oglichst nicht in
  1469. eigenen Symbolnamen verwendet werden.  Zur Segmentierung von Symbolnamen
  1470. sollte auf jeden Fall der Unterstrich und nicht der Punkt verwendet werden.
  1471. \par
  1472. Defaultm"a"sig ist \asname{} nicht case-sensitiv, es ist also egal, ob man
  1473. Gro"s-oder Kleinbuchstaben verwendet.  Mittels des Kommandozeilenschalters
  1474. \tty{U} l"a"st sich \asname{} jedoch in einen Modus umschalten, in dem Gro"s- und
  1475. Kleinschreibung unterschieden wird. Ob \asname{} umgeschaltet wurde, kann mit dem
  1476. vordefinierten Symbol \tty{CASESENSITIVE} ermittelt werden: TRUE bedeutet
  1477. Unterscheidung, FALSE keine.
  1478. \par
  1479. Tabelle \ref{TabPredefined} zeigt die wichtigsten, von \asname{} vordefinierten
  1480. Symbole.
  1481. \begin{table*}[p]
  1482. \begin{center}\begin{tabular}{|l|l|}
  1483. \hline
  1484. Name             & Bedeutung \\
  1485. \hline
  1486. \hline
  1487. \tty{TRUE}             & logisch ,,wahr'' \\
  1488. \tty{FALSE}            & logisch ,,falsch'' \\
  1489. \tty{CONSTPI}          & Kreiszahl Pi (3.1415.....) \\
  1490. \tty{VERSION}          & Version von \asname{} in BCD-Kodierung, \\
  1491.                       & z.B. 1331 hex f"ur Version 1.33p1 \\
  1492. \tty{ARCHITECTURE}     & Zielplattform, f"ur die \asname{} "ubersetzt wurde, \\
  1493.                       & in der Form Prozesor-Hersteller-Betriebssystem \\
  1494. \tty{DATE}             & Datum und \\
  1495. \tty{TIME}             & Zeitpunkt der Assemblierung (Beginn) \\
  1496. \tty{MOMCPU}           & momentan gesetzte Ziel-CPU \\
  1497. \tty{MOMCPUNAME}       & dito, nur als voll ausgeschriebener String \\
  1498. \tty{MOMFILE}          & augenblickliche Quelldatei \\
  1499. \tty{MOMLINE}          & Zeilennummer in Quelldatei \\
  1500. \tty{MOMPASS}          & Nummer das laufenden Durchgangs \\
  1501. \tty{MOMSECTION}       & Name der aktuellen Sektion oder \\
  1502.                       & Leerstring \\
  1503. \tty{MOMSEGMENT}       & Name des mit \tty{SEGMENT} gew"ahlten \\
  1504.                       & Adre"sraumes \\
  1505. \verb!*!, \$, . bzw. \tty{PC} & mom. Programmz"ahler \\
  1506. \hline
  1507. \end{tabular}\end{center}
  1508. \caption{Vordefinierte Symbole\label{TabPredefined}}
  1509. \end{table*}
  1510. \bb{VORSICHT!}  W"ahrend es im case-insensitiven Modus egal ist,
  1511. mit welcher Kombination von Gro"s- und Kleinbuchstaben man
  1512. vordefinierte Symbole anspricht, mu"s man sich im case-sensitiven
  1513. Modus exakt an die oben angegebene Schreibweise (nur Gro"sbuchstaben)
  1514. halten!
  1515. \par
  1516. Zus"atzlich definieren einige Pseudobefehle noch Symbole, die eine
  1517. Abfrage des damit momentan eingestellten Wertes erm"oglichen.  Deren
  1518. Beschreibung findet sich bei den zugeh"origen Befehlen.
  1519. \par
  1520. Ein etwas verstecktes (und mit Vorsicht zu nutzendes) Feature ist,
  1521. Symbolnamen aus String-Variablen zusammenzubauen, indem man den
  1522. Namen des Strings mit geschweiften Klammern in den Symbolnamen
  1523. einbaut.  So kann man z.B. den Namen eines Symbols anhand des
  1524. Wertes eines anderen Symbols festlegen:
  1525. \begin{verbatim}
  1526. cnt             set     cnt+1
  1527. temp            equ     "\{CNT}"
  1528.                 jnz     skip{temp}
  1529.                 .
  1530.                 .
  1531. skip{temp}:     nop
  1532. \end{verbatim}
  1533. \bb{ACHTUNG!}  Der Programmierer ist selber daf"ur verantwortlich,
  1534. da"s sich dabei g"ultige Symbolnamen ergeben!
  1535. \par
  1536. Eine vollst"andige Auflistung aller von \asname{} verwendeten Symbolnamen
  1537. findet sich in Anhang \ref{AppInternSyms}.
  1538. \par
  1539. Neben seinem Wert besitzt auch jedes Symbol eine Markierung, zu welchen
  1540. {\em Segment} es geh"ort.  In erster Linie wird eine solche Unterscheidung
  1541. bei Prozessoren ben"otigt, die mehrere Adre"sr"aume besitzen.  \asname{} kann mit
  1542. dieser Zusatzinformation bei Zugriffen "uber ein Symbol warnen, wenn ein
  1543. f"ur diesen Adre"sraum ungeeigneter Befehl verwendet wird.  Ein
  1544. Segmentattribut wird einem Symbol automatisch angeh"angt, wenn es als Label
  1545. oder mit einem Spezialbefehl (z.B. \tty{BIT}) definiert wird; ein mit
  1546. dem ,,Universalbefehl'' \tty{SET} oder \tty{EQU} definiertes Symbol ist
  1547. jedoch ,,typenlos'', d.h. seine Verwendung wird niemals Warnungen
  1548. ausl"osen.  Das Segmentattribut eines Symbols kann mit der eingebauten
  1549. Funktion \tty{SYMTYPE} abgefragt werden, etwa so:
  1550. \begin{verbatim}
  1551. Label:
  1552.        .
  1553.        .
  1554. Attr    equ     symtype(Label)  ; ergibt 1
  1555. \end{verbatim}
  1556. Den einzelnen Segmenttypen sind die in Tabelle \ref{TabSegNums}
  1557. aufgelisteten Nummern zugeordnet.  Die aus der Ordnung normaler Symbole
  1558. etwas herausfallenden Registersymbole sind n"aher in Abschnitt
  1559. \ref{SectRegSyms} erl"autert.  Mit einem undefinierten Symbol als Argument
  1560. liefert die \tty{SYMTYPE}-Funktion -1 als Ergebnis.  Ob ein Symbol "uberhaupt
  1561. definiert ist, l"a"st sich auch einfach mit der \tty{DEFINED}-Funktion abfragen.
  1562. \begin{table}[htb]
  1563. \begin{center}
  1564. \begin{tabular}{|l|c|}
  1565. \hline
  1566. Segment & R"uckgabewert \\
  1567. \hline
  1568. $<$keines$>$ & 0 \\
  1569. CODE & 1 \\
  1570. DATA & 2 \\
  1571. IDATA & 3 \\
  1572. XDATA & 4 \\
  1573. YDATA & 5 \\
  1574. BITDATA & 6 \\
  1575. IO & 7 \\
  1576. REG & 8 \\
  1577. ROMDATA & 9 \\
  1578. EEDATA & 10 \\
  1579. $<$Registersymbol$>$ & 128 \\
  1580. \hline
  1581. \end{tabular}
  1582. \end{center}
  1583. \caption{R"uckgabewerte der \tty{SYMTYPE}-Funktion\label{TabSegNums}}
  1584. \end{table}
  1585.  
  1586. %%---------------------------------------------------------------------------
  1587.  
  1588. \section{Tempor"are Symbole}
  1589.  
  1590. Besonders bei Programmen mit vielen aufeinanderfolgenden Schleifen oder
  1591. IF-artigen Strukturen steht man immer wieder vor dem Problem, sich
  1592. st"andig neue Namen f"ur Labels ausdenken zu m"ussen.  Dabei wei"s man an
  1593. sich genau, da"s man dieses Label nie wieder brauchen wird und am liebsten
  1594. in irgendeiner Weise 'verwerfen' m"ochte.  Eine einfache L"osung, wenn man
  1595. nicht gleich den gro"sen Hammer des Sektionskonzeptes (siehe Kapitel
  1596. \ref{ChapLocSyms}) schwingen m"ochte, sind {\em tempor"are} Symbole, die
  1597. solange ihre G"ultigkeit behalten, bis ein neues, nicht-tempor"ares Symbol
  1598. definiert wird.  Andere Assembler bieten einen "ahnlichen Mechanismus an,
  1599. der dort unter dem Stichwort 'lokale Symbole' l"auft, zur besseren
  1600. Abgrenzung gegen das Sektionskonzept m"ochte ich aber beim Begriff
  1601. 'tempor"are Symbole' bleiben.  \asname{} kennt drei unterschiedliche Typen von
  1602. tempor"aren Symbolen, um jedem 'Umsteiger' ein Konzept anzubieten, das den
  1603. Umstieg so einfach wie m"oglich macht.  Leider kocht quasi jeder Assembler
  1604. bei diesem Thema sein eigenes S"uppchen, so da"s es nur in Ausnahmef"allen
  1605. eine 1:1-L"osung f"ur existierenden Code geben wird:
  1606.  
  1607. \subsection{Tempor"are Symbole mit Namen}
  1608.  
  1609. Ein Symbol, dessen Name mit zwei Dollarzeichen beginnt (dies ist weder
  1610. f"ur normale Symbole noch Konstanten zul"assig), ist ein tempor"ares
  1611. Symbol mit Namen.  \asname{} f"uhrt intern einen Z"ahler mit, der zu Beginn der
  1612. Assemblierung auf Null gesetzt wird und bei jeder Definition eines
  1613. nicht-tempor"aren Symbols inkrementiert wird.  Wird ein tempor"ares Symbol
  1614. definiert oder referenziert, so werden die beiden f"uhrenden Dollarzeichen
  1615. gestrichen und der momentane Stand des Z"ahlers wird angeh"angt.  Auf
  1616. diese Weise erh"alt man mit jedem nicht-tempor"aren Symbol sozusagen die
  1617. Symbolnamen zur"uck - man kommt an die Symbole vor dieser Definition aber
  1618. auch nicht mehr heran!  Tempor"are Symbole bieten sich daher besonders
  1619. f"ur den Einsatz in kleinen Anweisungsbl"ocken an, typischerweise etwa ein
  1620. Dutzend Befehle, auf keinen Fall mehr als eine Bildschirmseite, sonst
  1621. kommt man leicht durcheinander...
  1622.  
  1623. Hier ein kleines Beispiel:
  1624. \begin{verbatim}
  1625. $$loop: nop
  1626.        dbra    d0,$$loop
  1627. split:
  1628. $$loop: nop
  1629.        dbra    d0,$$loop
  1630. \end{verbatim}
  1631. W"are das zwischen den Schleifen liegende nicht-tempor"are Label nicht
  1632. vorhanden, g"abe es nat"urlich eine Fehlermeldung wegen eines doppelt
  1633. definierten Symbols.
  1634.  
  1635. {\em Namenlose Tempor"are Symbole}
  1636.  
  1637. F"ur all jene, denen tempor"are Symbole mit Namen noch immer zu
  1638. kompliziert sind, gibt es eine noch einfachere Variante: Setzt man als
  1639. Label ein einfaches Plus- oder Minuszeichen, so werden diese in die Namen
  1640. {\tt \_\_forwnn} bzw. {\tt \_\_backmm} umgesetzt, wobei {\tt nn} bzw. {\tt mm}
  1641. von Null an laufende Z"ahler sind.  Referenziert werden diese Symbole
  1642. "uber die Sonderwerte {\tt - -- ---} bzw. {\tt + ++ +++}, womit sich die
  1643. drei letzten 'Minussymbole' bzw die drei n"achsten 'Plussymbole'
  1644. referenzieren lassen.  Welche Variante man benutzt, h"angt also davon ab,
  1645. ob man ein Symbol vorw"arts oder r"uckw"arts referenzieren will.
  1646.  
  1647. Bei der {\em Definition} namenloser tempor"arer Symbole gibt es neben dem
  1648. Plus- und Minuszeichen noch eine dritte Variante, n"amlich einen
  1649. Schr"agstrich (/).  Ein so definiertes tempor"ares Symbol kann
  1650. gleicherma"sen vorw"arts wie r"uckw"arts referenziert werden; d. h. je
  1651. nach Referenzierung wird es wie ein Minus oder Plus behandelt.
  1652.  
  1653. Namenlose tempor"are Symbole finden ihre Anwendung "ublicherweise in
  1654. Konstruktionen, die auf eine Bildschirmseite passen, wie das bedingte
  1655. "Uberspringen von ein paar Maschinenbefehlen oder kleinen Schleifen -
  1656. ansonsten w"urde die Sache zu un"ubersichtlich werden (das ist aber nur
  1657. ein gut gemeinter Rat...).  Ein Beispiel daf"ur ist das folgende St"uck
  1658. Code, zur Abwechslung mal als 65xx-Code:
  1659. \begin{verbatim}
  1660.        cpu     6502
  1661.  
  1662. -       ldx     #00
  1663. -       dex
  1664.        bne     -            ; springe zu 'dex'
  1665.        lda     RealSymbol
  1666.        beq     +            ; springe zu 'bne --'
  1667.        jsr     SomeRtn
  1668.        iny
  1669. +       bne     --           ; springe zu 'ldx #00'
  1670.  
  1671. SomeRtn:
  1672.        rts
  1673.  
  1674. RealSymbol:
  1675.        dfs     1
  1676.  
  1677.         inc     ptr
  1678.         bne     +           ; springe zu 'tax'
  1679.         inc     ptr+1
  1680. +       tax
  1681.  
  1682.         bpl     ++          ; springe zu 'dex'
  1683.         beq     +           ; springe vorwaerts zu 'rts'
  1684.         lda     #0
  1685. /       rts                 ; Schraegstrich = Wildcard
  1686. +       dex
  1687.         beq     -           ; springe rueckwaerts zu 'rts'
  1688.  
  1689. ptr:    dfs     2
  1690. \end{verbatim}
  1691.  
  1692. \subsection{Zusammengesetzte tempor"are Symbole}
  1693.  
  1694. Dies ist vielleicht der Typ von tempor"aren Symbolen, der dem Konzept von
  1695. lokalen Symbolen und Sektionen am n"achsten kommt.  Wann immer der Name
  1696. eines Symboles mit einem Punkt (.) anf"angt, wird das Symbol nicht mit
  1697. diesem Namen in der Symboltabelle abgelegt.  Stattdessen wird der Name des
  1698. zuletzt definierten Symbols ohne vorangestellten Punkt davor geh"angt.  Auf
  1699. diese Weise nehmen Symbole, deren Name nicht mit einem Punkt anf"angt, quasi
  1700. die Rolle von 'Bereichsgrenzen' ein und Symbole, deren Name mit einem
  1701. Punkt anf"angt, k"onnen in jedem Bereich neu verwendet werden.  Sehen wir
  1702. uns das folgende kurze Beispiel an:
  1703. \begin{verbatim}
  1704. proc1:                    ; nicht-temporaeres Symbol 'proc1'
  1705.  
  1706. .loop   moveq   #20,d0    ; definiert in Wirklichkeit 'proc1.loop'
  1707.        dbra    d0,.loop
  1708.        rts
  1709.  
  1710. proc2:                    ; nicht-temporaeres Symbol 'proc2'
  1711.  
  1712. .loop   moveq   #10,d1    ; definiert in Wirklichkeit 'proc2.loop'
  1713.        jsr     proc1
  1714.        dbra    d1,.loop
  1715.        rts
  1716. \end{verbatim}
  1717. Man beachte, da"s es weiterhin m"oglich ist, auf alle tempor"aren Symbole
  1718. zuzugreifen, auch wenn man sich nicht im gleichen 'Bereich' befindet,
  1719. indem man einfach den zusammengesetzten Namen benutzt (wie z.B.
  1720. 'proc2.loop' im voranstehenden Beispiel).
  1721.  
  1722. Zusammengesetzte Symbole lassen sich prinzipiell mit Sektionen kombinieren
  1723. und k"onnen so auch zu lokalen Symbolen werden.  Man beachte allerdings,
  1724. da"s das zuletzt definierte, nicht tempor"are Symbol nicht pro Sektion
  1725. gespeichert wird, sondern lediglich global.  Das kann sich
  1726. aber auch irgendwann einmal "andern, man sollte sich also nicht auf das
  1727. augenblickliche Verhalten verlassen.
  1728.  
  1729. %%---------------------------------------------------------------------------
  1730.  
  1731. \section{Formelausdr"ucke}
  1732.  
  1733. An den meisten Stellen, an denen der Assembler Zahlenangaben erwartet,
  1734. k"onnen nicht nur einfache Symbole oder Konstanten angegeben werden,
  1735. sondern ganze Formelausdr"ucke.  Bei den Komponenten der Formelausdr"ucke
  1736. kann es sich sowohl um ein einzelnes Symbol als auch um eine Konstante
  1737. handeln.  Konstanten d"urfen entweder Integer-, Gleitkomma-, oder
  1738. Stringkonstanten sein.
  1739.  
  1740. \subsection{Integerkonstanten}
  1741. \label{SectIntConsts}
  1742.  
  1743. Integerkonstanten bezeichnen ganze Zahlen.  Sie werden als eine
  1744. Folge von Ziffern geschrieben.  Dies kann in verschiedenen
  1745. Zahlensystemen erfolgen, deren Notation von verwendeten
  1746. Zielprozessor abh"angt (Tabelle
  1747. \ref{TabSystems}).
  1748. \par
  1749. \begin{table*}[htbp]
  1750. \begin{center}\begin{tabular}{|l|c|c|c|c|}
  1751. \hline
  1752.            & Intel-Modus     & Motorola-Modus & C-Modus  & IBM-Modus  \\
  1753. \hline
  1754. \hline
  1755. dezimal     & direkt          & direkt      & direkt      & direkt \\
  1756. hexadezimal & Suffix H        & Pr"afix \$  & Pr"afix 0x  & X'..' oder H'..' \\
  1757. \ii{Kennung}& \tty{hexh}      & \tty{\$hex} & \tty{0xhex} & \tty{x'hex'} \\
  1758.            &                 &             &             & \tty{h'hex'} \\
  1759. bin"ar      & Suffix B        & Pr"afix \%  & Pr"afix 0b  & B'..' \\
  1760. \ii{Kennung}& \tty{binb}      & \tty{\%bin} & \tty{0bbin} & \tty{b'bin'} \\
  1761. oktal       & Suffix O oder Q & Pr"afix @   & Pr"afix 0   & O'..' \\
  1762. \ii{Kennung}& \tty{octo}      & \tty{@oct}  & \tty{0oct}  & \tty{o'oct'} \\  
  1763.            & \tty{octq}      &             &             & \\
  1764. ASCII       &                 &             &             & A'..' \\
  1765. \ii{Kennung}&                 &             &             & \tty{a'asc'} \\
  1766. \hline
  1767. \end{tabular}\end{center}
  1768. \caption{definierte Zahlensysteme und Schreibweisen\label{TabSystems}}
  1769. \end{table*}
  1770. Falls das Zahlensystem nicht explizit durch vor-oder nachgestellte Zeichen
  1771. vorgegeben wird, nimmt \asname{} die Basis an, die mit dem {\tt RADIX}-Befehl
  1772. vorgegeben wurde (deren Default ist wiederum 10).  Mit diesem Befehl lassen
  1773. sich auch ,,ungew"ohnliche'' Zahlensysteme, d.h. andere als 2, 8, 10 oder 16
  1774. einstellen.
  1775.  
  1776. G"ultige Ziffern sind die Zahlen 0 bis 9 sowie die Buchstaben A bis Z
  1777. (Wert 10 bis 35) bis zur Basis des Zahlensystems minus eins.  Die ASCII-
  1778. Darstellung f"allt etwas aus diesem System heraus: hier beschreibt der
  1779. ASCII-Wert (bzw. der Code im aktuell eingestellten Zeichensatz, siehe
  1780. Abschnitt \ref{SectCHARSET}) ein ganzes Byte.  Solcherart geschriebene
  1781. Integer-Konstanten sind also letzten Endes identisch zu Multi-Character-Konstanten.
  1782. Die beiden Schreibweisen:
  1783. \begin{verbatim}
  1784. 'ABCD'
  1785. A'ABCD'
  1786. \end{verbatim}
  1787. sind also identisch, das vorangestellte 'A' ist eigentlich redundant.  Man
  1788. kann diese Schreibweise aber f"ur existierenden Code erlauben, weil einige "altere
  1789. Original-Assembler (z.B. Signetics 2650) diese Schreibweise unterst"utzen.
  1790.  
  1791. Multi-Character-Konstanten sind bei \asname{} grunds"atzlich immer Big-Endian,
  1792. d.h. 'ABCD' ergibt den Zahlenwert 0x41424344.  Warum das so ist? Naja,
  1793. das erste \asname{}-Target war der Motorola 68000, und es hat sich nie jemand
  1794. dar"uber beklagt...die einzige Ausnahme von
  1795. dieser Regel ist die PDP-11 (und der einen LSI-11 nutzende WD16):  zwecks
  1796. besserer Kompatibilit"at zum MACRO-11 von DEC sind solche Konstanten
  1797. ausnahmsweise Little-Endian, 'AB' ergibt also den Zahlenwert 0x4241.
  1798.  
  1799. Die Verwendung von Buchstaben in Integerkonstanten bringt allerdings auch
  1800. einige Mehrdeutigkeiten mit sich, da Symbolnamen ja auch Ketten aus Zahlen
  1801. und Buchstaben sind: Ein Symbolname darf nicht mit einem Zeichen von 0 bis
  1802. 9 beginnen, was bedeutet, da"s eine Integerkonstante, die nicht durch ein
  1803. anderes Sonderzeichen eindeutig als solche erkennbar ist, niemals mit
  1804. einem Buchstaben beginnen darf; notfalls mu"s man eine eigentlich
  1805. "uberfl"ussige Null voranstellen.  Der bekannteste Fall ist das Schreiben
  1806. von Hexadezimalkonstanten im Intel-Modus: Ist die vorderste Stelle
  1807. zwischen A und F, so hilft das hintangestellte H "uberhaupt nichts, es
  1808. mu"s noch eine Null davor (statt F0H also 0F0H).  Die Motorola-oder
  1809. C-Syntax, die beide das Zahlensystem am Anfang einer Integerkonstante
  1810. kennzeichnen, kennen dieses Problem nicht.
  1811.  
  1812. Reichlich heimt"uckisch ist auch, da"s bei immer h"oheren, mit {\tt RADIX}
  1813. eingestellten Zahlensystemen, die bei Intel- und C-Syntax benutzten
  1814. Buchstaben zur Zahlensystemkennung immer weiter ,,aufgefressen'' werden; so
  1815. kann man z.B. nach {\tt RADIX 16} keine bin"aren Konstanten mehr
  1816. schreiben, und ab {\tt RADIX 18} in Intel-Syntax auch keine hexadezimalen
  1817. Konstanten mehr.  Also {\bf VORSICHT!}
  1818.  
  1819. Welche Syntax f"ur welchen Zielprozessor im Default verwendet wird, ist
  1820. im Anhang \ref{SectPseudoInst} gesammelt.  Unabh"angig von diesem Default
  1821. ist es m"oglich, einzelne Schreibweisen mit dem \tty{INTSYNTAX}-Befehl
  1822. (siehe Abschnitt \ref{SectINTSYNTAX}) weg- oder dazuzuschalten.  Die unter
  1823. \ii{Ident} aufgef"uhrten Namen, mit einem vorangestellten Plus- oder
  1824. Minuszeichen, dienen bei diesem Befehl als Argumente.
  1825.  
  1826. Eine Art ''Generalschalter' f"ur Integer-Schreibweisen ist der
  1827. \tty{RELAXED}-Befehl (siehe Abschnitt \ref{SectRELAXED}): Unabh"angig
  1828. vom Zielprozessor k"onnen beliebige Schreibweisen verwendet werden
  1829. kann (auf Kosten der Kompatibilit"at zu Standard-Assemblern).
  1830.  
  1831. Mit \tty{INTSYNTAX} bzw. \tty{RELAXED} er"offnet sich insbesondere die
  1832. 'IBM-Schreibweise', wie man sie bei manchen Fremdassemblern antrifft,
  1833. f"ur alle Ziele:
  1834.  
  1835. Bei dieser Schreibweise wird der eigentliche Wert in Hochkommas geschrieben
  1836. und das Zahlensystem ('x' oder 'h' f"ur hexadezimal, 'o' f"ur oktal und 'b'
  1837. f"ur bin"ar) direkt davor.  Die Integer-Konstante 305419896 kann damit
  1838. also folgenderma"sen geschrieben werden:
  1839. \begin{verbatim}
  1840. x'12345678'
  1841. h'12345678'
  1842. o'2215053170'
  1843. b'00010010001101000101011001111000'
  1844. \end{verbatim}
  1845. Als weitere Variante dieser Schreibweise erlauben einige wenige Targets
  1846. das Fortlassen des schlie"senden Hochkommas, zwecks Kompatibilt"at zu
  1847. Code, der f"ur andere Assembler geschrieben wurde.  F"ur eigenen, neu
  1848. erstellten Code wird von der Verwendung abgeraten.
  1849.  
  1850. \subsection{Gleitkommakonstanten}
  1851.  
  1852. Gleitkommazahlen werden in der "ublichen halblogarithmischen
  1853. Schreibweise geschrieben, die in der allgemeinsten Form
  1854. \begin{verbatim}
  1855. [-]<Vorkommastellen>[.Nachkommastellen][E[-]Exponent]
  1856. \end{verbatim}
  1857. lautet. \bb{ACHTUNG!} Der Assembler versucht eine Konstante zuerst als
  1858. Integerkonstante zu verstehen und macht erst dann einen Versuch mit
  1859. Gleitkomma, falls dies gescheitert ist.  Will man aus irgendwelchen
  1860. Gr"unden die Auswertung als Gleitkommazahl erzwingen, so kann man
  1861. dies durch Dummy-Nachkommastellen erreichen, z.B. \tty{2.0} anstelle
  1862. \tty{2}.
  1863.  
  1864. \subsection{Stringkonstanten}
  1865. \label{SectStringConsts}
  1866.  
  1867. Stringkonstanten m"ussen in einfache oder doppelte Hochkommas
  1868. eingeschlossen werden.  Um diese selber und andere Sonderzeichen ohne
  1869. Verrenkungen in String-Konstanten einbauen zu k"onnen, wurde ein
  1870. ,,Escape-Mechanismus'' eingebaut, der C-Programmierer*innen bekannt
  1871. vorkommen d"urfte:
  1872.  
  1873. Schreibt man einen Backslash mit einer maximal dreiziffrigen Zahl im
  1874. String, so versteht der Assembler dies als Zeichen mit dem entsprechenden
  1875. dezimalen ASCII-Wert.  Alternativ kann der Zahlenwert auch hexadezimal
  1876. oder oktal mit einem vorangestellten x oder einer vorangestellten 0
  1877. geschrieben werden.  F"ur die hexadezimale Schreibweise reduziert sich die
  1878. Maximalanzahl von Stellen auf 2.  So kann man z.B. mit {\tt\verb!\3!} ein
  1879. ETX-Zeichen definieren.  Vorsicht allerdings mit der Definition von
  1880. NUL-Zeichen!  Da die C-Version \marginpar{{\em UNIX}} von \asname{} momentan
  1881. intern zur Speicherung von String-Symbolen C-Strings benutzt (die durch
  1882. NUL-Zeichen terminiert werden), sind NUL-Zeichen in Strings momentan nicht
  1883. portabel!
  1884.  
  1885. Einige besonders h"aufig gebrauchte Steuerzeichen kann man auch mit
  1886. folgenden Abk"urzungen erreichen:
  1887. \begin{quote}\begin{tabbing}
  1888. \hspace{4cm} \= \hspace{4cm} \= \kill
  1889. \verb!\b! : Backspace \> \verb!\a! : Klingel        \> \verb!\e! : Escape \\
  1890. \verb!\t! : Tabulator \> \verb!\n! : Zeilenvorschub \> \verb!\r! : Wagenr"ucklauf \\
  1891. \verb!\\! : Backslash \> \verb!\'! oder \verb!\h! : Hochkomma \\
  1892. \verb!\"! oder \verb!\i! : G"ansef"u"schen \\
  1893. \end{tabbing}\end{quote}
  1894. Die Kennbuchstaben d"urfen sowohl gro"s als auch klein geschrieben
  1895. werden.
  1896. \par
  1897. "Uber dieses Escape-Zeichen k"onnen sogar Formelausdr"ucke in den
  1898. String eingebaut werden, wenn sie in geschweifte Klammern eingefa"st
  1899. werden: z.B. ergibt
  1900. \begin{verbatim}
  1901.    message "Wurzel aus 81 : \{sqrt(81)}"
  1902. \end{verbatim}
  1903. die Ausgabe
  1904. \begin{verbatim}
  1905.    Wurzel aus 81 : 9
  1906. \end{verbatim}
  1907. Der Assembler w"ahlt anhand des Formelergebnistyps die richtige
  1908. Ausgabeform, zu vermeiden sind lediglich weitere Stringkonstanten
  1909. im Ausdruck, da der Assembler bei der Gro"s-zu-Kleinbuchstabenumwandlung
  1910. sonst durcheinander kommt.  Integer-Ausdr"ucke werden defaultm"a"sig
  1911. hexadezimal ausgegeben, dies l"a"st sich jedoch mit dem
  1912. \tty{OUTRADIX}-Befehl "andern.
  1913. \par
  1914. Bis auf den Einbau von Formelausdr"ucken ist dieser Escape-Mechanismus
  1915. auch in als ASCII definierten Integerkonstanten zul"assig, z.B. so:
  1916. \begin{verbatim}
  1917.   move.b   #'\n',d0
  1918. \end{verbatim}
  1919. Jedoch hat alles seine Grenzen, weil der dar"uber liegende Splitter, der
  1920. die Zeile in Opcode und Parameter zerlegt, nicht wei"s, womit er da
  1921. eigentlich arbeitet, z.B. hier:
  1922. \begin{verbatim}
  1923.   move.l   #'\'abc',d0
  1924. \end{verbatim}
  1925. Nach dem dritten Hochkomma findet er das Komma nicht mehr, weil er
  1926. vermutet, da"s eine weitere Zeichenkonstante beginnt, und eine
  1927. Fehlermeldung "uber eine falsche Parameterzahl ist die Folge.  Abhilfe
  1928. w"are z.B., \verb!\h! anstelle \verb!\'! zu schreiben.
  1929.  
  1930. \subsection{String- zu Integerwandlung und Zeichenkonstanten}
  1931.  
  1932. Fr"uhere Versionen von \asname{} verfolgten eine strikte Trennung von Strings
  1933. und sogenannten ''Zeichenkonstanten'': Eine Zeichenkonstante sieht
  1934. auf den ersten Blick aus wie ein String, nur sind die Zeichen in
  1935. einfache Hochkommas statt doppelte eingeschlossen.  Ein solches
  1936. Objekt hatte den Datentyp 'Integer', war also eine Zahl, deren Wert
  1937. durch den (ASCII-)Wert des jeweiligen Zeichens definiert war, und wurde
  1938. strikt von einer String-Konstante unterschieden:
  1939.  
  1940. \begin{verbatim}
  1941.   move.b   #65,d0
  1942.   move.b   #'A',d0      ; gleichwertig
  1943.   move.b   #"A",d0      ; nicht erlaubt in aelteren Versionen!
  1944. \end{verbatim}
  1945.  
  1946. Diese Unterscheidung existiert {\em nicht mehr}, es ist also egal, ob
  1947. man einfache oder doppelte Hochkommas verwendet.  Wird an einer Stelle eine
  1948. Zahl als Argument erwartet, und ein String verwendet, so erfolgt die
  1949. Umwandlung anhand der (ASCII-)Werte ''on-the-fly'' an dieser Stelle.  Im
  1950. obigen Beispiel w"urden alle drei Anweisungen den gleichen Maschinencode
  1951. erzeugen.
  1952.  
  1953. Eine solche implizite Wandlung findet auch f"ur aus mehreren Zeichen
  1954. bestehende Strings statt, die dann bisweilen als ''Mehrzeichenkonstanten''
  1955. bezeichnet werden:
  1956. \begin{verbatim}
  1957. 'A'    == $41
  1958. "AB"   == $4142
  1959. 'ABCD' == $41424344
  1960. \end{verbatim}
  1961. Mehrzeichenkonstanten sind der einzige Fall, in denen die Verwendung von
  1962. einfachen oder doppelten Hochkommas noch einen Unterschied macht.  F"ur
  1963. viele Zielprozessoren sind Pseudobefehle zur Ablage von Konstanten definiert,
  1964. die als Argument verschiedene Datentypen akzeptieren.  Will man wirklich
  1965. eine Zeichenkette haben, so mu"s man in diesem Fall weiterhin doppelte
  1966. Hochkommas verwenden:
  1967. \begin{verbatim}
  1968.    dc.w    "ab"  ; legt zwei Worte (0x0041,0x0042) ab
  1969.    dc.w    'ab'  ; legt ein Wort (0x4142) ab
  1970. \end{verbatim}
  1971. Wichtig: dies ist nicht erforderlich, wenn die Zeichenkette l"anger als die
  1972. verwendete Operandegr"o"se ist, in diesem Beispiel also l"anger als zwei
  1973. Zeichen bzw. 16 Bit.
  1974. \subsection{Evaluierung}
  1975. Die Berechnung von im Formelausdruck entstehenden Zwischenergebnissen
  1976. erfolgt immer mit der h"ochsten verf"ugbaren Wortbreite, d.h. 32 oder 64 Bit
  1977. f"ur Ganzzahlen, 80 Bit f"ur Gleitkommazahlen und 255 Zeichen f"ur Strings.
  1978. Eine eventuelle Pr"ufung auf Wertebereichs"uberschreitung findet erst am
  1979. Endergebnis statt.
  1980. \par
  1981. Die portable C-Version \marginpar{{\em UNIX}} kann nur mit
  1982. 64-Bit-Gleitkommazahlen umgehen, ist daher auf einen Maximalwert von ca.
  1983. $10^{308}$ beschr"ankt.  Als Ausgleich werden auf einigen Plattformen
  1984. Integers mit 64 Bit Breite behandelt.
  1985. \subsection{Operatoren}
  1986. Der Assembler stellt zur Verkn"upfung die in Tabelle \ref{TabOps} genannten
  1987. Operanden zur Verf"ugung.
  1988. \begin{table*}[htbp]
  1989. \begin{center}\begin{tabular}{|c|l|c|c|c|c|c|c|}
  1990. \hline
  1991. Op. & Funktion & \#Ops. & Int & Float & String & Register & Rang \\
  1992. \hline
  1993. \hline
  1994. $<>$        & Ungleichheit         & 2 & ja   & ja   & ja   & ja   & 14 \\
  1995. $!=$        & Alias f"ur $<>$      &   &      &      &      &      &    \\
  1996. $>=$        & gr"o"ser o. gleich   & 2 & ja   & ja   & ja   & ja   & 14 \\
  1997. $<=$        & kleiner o. gleich    & 2 & ja   & ja   & ja   & ja   & 14 \\
  1998. $<$         & echt kleiner         & 2 & ja   & ja   & ja   & ja   & 14 \\
  1999. $>$         & echt gr"o"ser        & 2 & ja   & ja   & ja   & ja   & 14 \\
  2000. $=$         & Gleichheit           & 2 & ja   & ja   & ja   & ja   & 14 \\
  2001. $==$        & Alias f"ur $=$       &   &      &      &      &      &    \\
  2002.            & & & & & &  \\
  2003. $!!$        & log. XOR             & 2 & ja   & nein & nein & nein & 13 \\
  2004. $||$        & log. OR              & 2 & ja   & nein & nein & nein & 12 \\
  2005. \&\&        & log. AND             & 2 & ja   & nein & nein & nein & 11 \\
  2006. \verb! ~~ ! & log. NOT             & 1 & ja   & nein & nein & nein & 2 \\
  2007.            & & & & & &  \\
  2008. -           & Differenz            & 2 & ja   & ja   & nein & nein & 10 \\
  2009. +           & Summe                & 2 & ja   & ja   & ja   & nein & 10 \\
  2010. \#          & Modulodivision       & 2 & ja   & nein & nein & nein & 9 \\
  2011. /           & Quotient             & 2 & ja*) & ja   & nein & nein & 9 \\
  2012. \verb! * !  & Produkt              & 2 & ja   & ja   & nein & nein & 9 \\
  2013. \verb! ^ !  & Potenz               & 2 & ja   & ja   & nein & nein & 8 \\
  2014.            & & & & & &  \\
  2015. $!$         & bin"ares XOR         & 2 & ja   & nein & nein & nein & 7 \\
  2016. $|$         & bin"ares OR          & 2 & ja   & nein & nein & nein & 6 \\
  2017. \&          & bin"ares AND         & 2 & ja   & nein & nein & nein & 5 \\
  2018. $><$        & Bitspiegelung        & 2 & ja   & nein & nein & nein & 4 \\
  2019. $>>$        & log. Rechtsschieben  & 2 & ja   & nein & nein & nein & 3 \\
  2020. $<<$        & log. Linksschieben   & 2 & ja   & nein & nein & nein & 3 \\
  2021. \verb! ~ !  & bin"ares NOT         & 1 & ja   & nein & nein & nein & 1 \\
  2022. \hline
  2023. \multicolumn{8}{|l|}{*) Rest wird verworfen} \\
  2024. \hline
  2025. \end{tabular}\end{center}
  2026. \caption{in \asname{} definierte Operatoren\label{TabOps}}
  2027. \end{table*}
  2028. Unter ,,Rang'' ist dabei die Priorit"at zu verstehen, die dieser Operator bei
  2029. der Teilung eines Ausdruckes in Unterausdr"ucke hat, der rangh"ochste
  2030. Operator wird also \ii{zuletzt} ausgewertet.  Die Reihenfolge der
  2031. Evaluierung l"a"st sich durch Klammerung neu festlegen.
  2032. \par
  2033. Die Vergleichsoperatoren liefern TRUE, falls die Bedingung zutrifft,
  2034. und FALSE falls nicht.  Vergleiche betrachten Integerzahlen dabei als
  2035. 32 oder 64 Bit breit (je nach Host-System) und vorzeichenbehaftet. F"ur
  2036. die logischen Operatoren ist ein Ausdruck TRUE, falls er ungleich 0 ist,
  2037. ansonsten FALSE.
  2038. \par
  2039. Bei Vergleichen von Register-Symbolen sind zwei Details zu beachten.
  2040. Zum einen sind zwei Register-Symbole dann gleich, wenn sie auf das
  2041. gleiche Register verweisen.  Da Register bei einigen Prozessoren
  2042. Alias-Namen haben, werden diese Aliase als gleich betrachtet.  Zum
  2043. Beispiel ist das Register {\tt A7} auf einem 68000 auch als {\tt SP}
  2044. ansprechbar, und diese beiden Registersymbole sind gleich.  Zum anderen
  2045. haben manche Prozessoren mehrere S"atze von Registern, auf einem 68040
  2046. zum Beispiel die normalen (Integer-)Register und die FPU-Register.
  2047. Zwischen zwei Registern aus unterschiedlichen Gruppen l"a"st sich
  2048. keine kleiner/gr"o"ser-Beziehung angeben, die entsprechenden Operatoren
  2049. liefern immer ein FALSE zur"uck.  Lediglich ein Test auf Gleichheit oder
  2050. Ungleichheit ergibt einen Sinn.
  2051. \par
  2052. Die Bitspiegelung ist wohl etwas erkl"arungsbed"urftig: Der Operator
  2053. spiegelt die untersten Bits im ersten Operanden, l"a"st die
  2054. dar"uberliegenden Bits aber unver"andert.  Die Zahl der zu spiegelnden
  2055. Bits ist der rechte Operand und darf zwischen 1 und 32 liegen.
  2056. \par
  2057. Eine keine Fu"sangel beim bin"aren Komplement: Da die Berechnung
  2058. grunds"atzlich auf 32- oder 64-Bit-Ebene erfolgt, ergibt seine Anwendung
  2059. auf z.B. 8-Bit-Masken "ublicherweise Werte, die durch voranstehende
  2060. Einsen nicht mehr im entferntesten in 8-Bit-Zahlen hineinpassen.  Eine
  2061. bin"are UND-Verkn"upfung mit einer passenden Maske ist daher unvermeidlich!
  2062. \subsection{Funktionen}
  2063. Zus"atzlich zu den Operatoren definiert der Assembler noch eine Reihe
  2064. in erster Linie transzendenter Funktionen mit Gleitkomma-Argument, die
  2065. Tabellen \ref{TabFuncs1} und \ref{TabFuncs2} auflisten.
  2066. \begin{table*}[htbp]
  2067. \begin{center}\begin{tabular}{|l|l|l|l|}
  2068. \hline
  2069. Name     & Funktion             & Argument & Ergebnis \\
  2070. \hline
  2071. \hline
  2072. SQRT     & Quadratwurzel        & $arg \geq 0$ & Gleitkomma \\
  2073.         &                      & & \\
  2074. SIN      & Sinus                & $arg \in \rz$ & Gleitkomma \\
  2075. COS      & Kosinus              & $arg \in \rz$ & Gleitkomma \\
  2076. TAN      & Tangens              & $arg \neq (2*n+1)*\frac{\pi}{2}$ & Gleitkomma \\
  2077. COT      & Kotangens            & $arg \neq n*\pi$ & Gleitkomma \\
  2078.         &                      & & \\
  2079. ASIN     & inverser Sinus       & $\mid arg \mid \leq 1$ & Gleitkomma \\
  2080. ACOS     & inverser Kosinus     & $\mid arg \mid \leq 1$ & Gleitkomma \\
  2081. ATAN     & inverser Tangens     & $arg \in \rz$ & Gleitkomma \\
  2082. ACOT     & inverser Kotangens   & $arg \in \rz$ & Gleitkomma \\
  2083.         &                      & & \\
  2084. EXP      & Exponentialfunktion  & $arg \in \rz$ & Gleitkomma \\
  2085. ALOG     & 10 hoch Argument     & $arg \in \rz$ & Gleitkomma \\
  2086. ALD      & 2 hoch Argument      & $arg \in \rz$ & Gleitkomma \\
  2087. SINH     & hyp. Sinus           & $arg \in \rz$ & Gleitkomma \\
  2088. COSH     & hyp. Kosinus         & $arg \in \rz$ & Gleitkomma \\
  2089. TANH     & hyp. Tangens         & $arg \in \rz$ & Gleitkomma \\
  2090. COTH     & hyp. Kotangens       & $arg \neq 0$ & Gleitkomma \\
  2091.         &                      & & \\
  2092. LN       & nat. Logarithmus     & $arg > 0$ & Gleitkomma \\
  2093. LOG      & dek. Logarithmus     & $arg > 0$ & Gleitkomma \\
  2094. LD       & 2er Logarithmus      & $arg > 0$ & Gleitkomma \\
  2095. ASINH    & inv. hyp. Sinus      & $arg \in \rz$ & Gleitkomma \\
  2096. ACOSH    & inv. hyp. Kosinus    & $arg \geq 1$ & Gleitkomma \\
  2097. ATANH    & inv. hyp. Tangens    & $\mid arg \mid < 1$ & Gleitkomma \\
  2098. ACOTH    & inv. hyp. Kotangens  & $\mid arg \mid > 1$ & Gleitkomma \\
  2099.         &                      & & \\
  2100. INT      & ganzzahliger Anteil  & $arg \in \rz$ & Integer \\
  2101.         &                      & & \\
  2102. BITCNT   & bin"are Quersumme    & Integer      & Integer \\
  2103. FIRSTBIT & niedrigstes 1-Bit    & Integer      & Integer \\
  2104. LASTBIT  & h"ochstes 1-Bit      & Integer      & Integer \\
  2105. BITPOS   & einziges 1-Bit       & Integer      & Integer \\
  2106. \hline
  2107. \end{tabular}\end{center}
  2108. \caption{vordefinierte Funktionen in \asname{} - Teil 1 (Integer- und
  2109.         Gleitkomma-Funktionen)\label{TabFuncs1}}
  2110. \end{table*}
  2111. \begin{table*}[htb]
  2112. \begin{center}\begin{tabular}{|l|l|l|l|}
  2113. \hline
  2114. Name     & Funktion             & Argument & Ergebnis \\
  2115. \hline
  2116. \hline
  2117. SGN         & Vorzeichen (0/1/-1)   & Integer oder & Integer \\
  2118.            &                       & Gleitkomma   & \\
  2119. ABS         & Betrag                & Integer oder & Integer oder \\
  2120.            &                       & Gleitkomma   & Gleitkomma \\
  2121. TOUPPER     & pass. Gro"sbuchstabe  & Integer      & Integer \\
  2122. TOLOWER     & pass. Kleinbuchstabe  & Integer      & Integer \\
  2123. UPSTRING    & wandelt alle Zeichen  & String       & String \\
  2124.            & in Gro"sbuchstaben    &              & \\
  2125. LOWSTRING   & wandelt alle Zeichen  & String       & String \\
  2126.            & in Kleinbuchstaben    &              & \\
  2127. STRLEN      & liefert L"ange eines  & String       & Integer \\
  2128.            & Strings               &              & \\
  2129. SUBSTR      & extrahiert Teil eines & String,      & String \\
  2130.            & Strings               & Integer,     & \\
  2131.            &                       & Integer      & \\
  2132. CHARFROMSTR & extrahiert ein        & String,      & Integer \\
  2133.            & Zeichen aus einem     & Integer      & \\
  2134.            & String                &              & \\
  2135. STRSTR      & sucht Teilstring in   & String,      & Integer \\
  2136.            & einem String          & String       & \\
  2137. VAL         & evaluiert Stringin-   & String       & abh. von \\
  2138.            & halt als Ausdruck     &              & Argument \\
  2139. EXPRTYPE    & liefert Typ des       & Integer,     & 0 \\
  2140.            & Arguments             & Gleitkomma,  & 1 \\
  2141.            &                       & String       & 2 \\
  2142. \hline
  2143. \end{tabular}\end{center}
  2144. \caption{vordefinierte Funktionen in \asname{} - Teil 2
  2145.         (Integer- und String-Funk\-tio\-nen)\label{TabFuncs2}}
  2146. \end{table*}
  2147. Die Funktionen \tty{FIRSTBIT}, \tty{LASTBIT} und \tty{BITPOS} liefern
  2148. als Ergebnis -1, falls "uberhaupt kein bzw. nicht genau ein Bit gesetzt
  2149. ist. Zus"atzlich gibt \tty{BITPOS} in einem solchen Fall eine
  2150. Fehlermeldung aus.
  2151. \par
  2152. Die String-Funktion \tty{SUBSTR} erwartet als ersten Parameter den
  2153. Quellstring, als zweiten die Startposition und als dritten die Anzahl zu
  2154. extrahierender Zeichen (eine 0 bedeutet, alle Zeichen bis zum Ende zu
  2155. extrahieren).  Analog erwartet \tty{CHARFROMSTR} den Quellstring als
  2156. erstes Argument und die Zeichenposition als zweites Argument.  Falls die
  2157. angegebene Position gr"o"ser oder gleich der L"ange des Quellstrings ist,
  2158. liefert \tty{SUBSTR} einen Leerstring, w"ahrend \tty{CHARFROMSTR} eine -1
  2159. ergibt.  Eine Position kleiner Null wird von \tty{SUBSTR} als Null
  2160. behandelt, w"ahrend \tty{CHARFROMSTR} in diesem Fall ebenfalls eine -1
  2161. liefert.
  2162. Hier ein Beispiel, wie man die beiden Funktionen einsetzt, um einen
  2163. String im Speicher abzulegen, wobei das String-Ende durch ein gesetztes
  2164. MSB gekennzeichnet ist:
  2165. \begin{verbatim}
  2166. dbstr   macro   arg
  2167.        if      strlen(arg) > 1
  2168.         db     substr(arg, 0, strlen(arg) - 1)
  2169.        endif
  2170.        if      strlen(arg) > 0
  2171.         db     charfromstr(arg, strlen(arg) - 1) | 80h
  2172.        endif
  2173.        endm
  2174. \end{verbatim}
  2175. \tty{STRSTR} liefert das erste Auftreten des zweiten Strings
  2176. im ersten bzw. -1, falls das Suchmuster nicht gefunden wurde.
  2177. Analog zu \tty{SUBSTR} und \tty{CHARFROMSTR} hat das erste
  2178. Zeichen den Positionswert 0.
  2179. Wenn eine Funktion auch Gleitkommaargumente erwartet, so soll
  2180. dies nicht bedeuten, da"s man nicht z.B.
  2181. \begin{verbatim}
  2182. wur2   equ      sqrt(2)
  2183. \end{verbatim}
  2184. schreiben d"urfte --- in solchen F"allen findet automatisch eine
  2185. Typkonvertierung statt.  Umgekehrt mu"s allerdings die \tty{INT}-Funktion
  2186. angewandt werden, um eine Gleitkommazahl ganz zu bekommen.  Bei der
  2187. Benutzung dieser Funktion ist zu beachten, da"s sie als Ergebnis
  2188. immer einen vorzeichenbehafteten Integer liefert, sie hat also
  2189. einen Wertebereich von ca. +/-2.0E9.
  2190. \par
  2191. Schaltet man \asname{} in den case-sensitiven Modus, so k"onnen im
  2192. Gegensatz zu vordefinierten Symbolen die vordefinierten Funktionen
  2193. weiterhin in beliebiger Schreibweise angesprochen werden.  Bei
  2194. selbst definierten Funktionen (siehe Abschnitt \ref{SectFUNCTION}
  2195. wird allerdings unterschieden.  Dies  hat zur Folge, da"s z.B. bei
  2196. der Definition einer Funktion \tty{Sin} man mit \tty{Sin} diese
  2197. Funktion auch erreicht, mit allen anderen Schreibweisen jedoch die
  2198. eingebaute Funktion.
  2199. \par
  2200. F"ur die korrekte Umwandlung \marginpar{{\em DOS/}} von Klein-zu
  2201. Gro"sbuchstaben ist eine DOS-Version $\geq$ 3.30
  2202. erforderlich.
  2203.  
  2204. \vspace{2mm}
  2205. \marginpar{{\em DPMI}}
  2206.  
  2207. %%---------------------------------------------------------------------------
  2208.  
  2209. \section{Vorw"artsreferenzen und andere Desaster}
  2210. \label{ForwRefs}
  2211.  
  2212. Dieser Abschnitt ist das Produkt eines gewissen Grolls auf die (durchaus
  2213. legale) Art und Weise, wie einige Leute programmieren, die in Zusammenhang
  2214. mit \asname{} bisweilen das eine oder andere Problem verursachen kann.  Die Rede
  2215. ist hier von sogenannten ,,Vorw"artsreferenzen''.  Was unterscheidet eine
  2216. Vorw"artsreferenz von einer normalen Referenz?  Dazu sehe man sich folgendes
  2217. Programmbeispiel an (man sehe mir bitte meine -- auch im Rest dieser Anleitung
  2218. anzutreffende -- 68000-Lastigkeit nach):
  2219. \begin{verbatim}
  2220.        move.l  #10,d0
  2221. loop:   move.l  (a1),d1
  2222.        beq     skip
  2223.        neg.l   d1
  2224. skip:   move.l  d1,(a1+)
  2225.        dbra    d0,loop
  2226. \end{verbatim}
  2227. Denkt man sich den Scheifenrumpf mit dem Sprung weg, so bleibt ein
  2228. "au"serst angenehm zu assemblierendes Programm "ubrig: die einzige
  2229. Referenz ist der R"ucksprung zum Anfang des Rumpfes, und da ein
  2230. Assembler ein Programm von vorne nach hinten durcharbeitet, hat er
  2231. den Symbolwert bereits ermittelt, bevor er ihn zum erstem Mal ben"otigt.
  2232. Sofern man ein Programm hat, das nur solche R"uckw"artsreferenzen besitzt,
  2233. ist man in der angenehmen Lage, nur einmal durch den Quellcode gehen zu
  2234. m"ussen, um den korrekten und optimalen Maschinencode zu finden.  Einige
  2235. Hochsprachen wie Pascal mit ihrer strikten Regel, da"s alles vor der ersten
  2236. Benutzung definiert sein mu"s, nutzen genau diese Eigenschaft aus, um den
  2237. "Ubersetzungsvorgang zu beschleunigen.
  2238.  
  2239. Leider ist die Sache im Falle von Assembler nicht so einfach, denn man
  2240. will ja bisweilen auch vorw"arts im Code springen oder mu"s aus bestimmten
  2241. Gr"unden Variablen Definitionen hinter den Code verlegen.  Dies ist
  2242. im Beispiel der Fall f"ur den bedingten Sprung, mit dem ein anderer
  2243. Befehl "ubersprungen wird.  Wenn der Assembler im ersten Durchlauf auf
  2244. den Sprungbefehl trifft, so sieht er sich mit der Situation konfrontiert,
  2245. entweder die Teilfelder der Instruktion, die die Sprungadresse beinhalten,
  2246. leer zulassen, oder seitens des Formelparsers (der das Adre"sargument ja
  2247. auswerten mu"s) anstelle des korrekten, aber unbekannten Wertes einen Wert
  2248. anzubieten, der ,,niemandem wehtut''.  Bei einem einfachen Assembler, der
  2249. nur eine Zielarchitektur kennt und bei dem sich die betroffenen Befehle
  2250. an einer Hand abz"ahlen lassen, wird man sicher die erste Variante w"ahlen,
  2251. bei \asname{} mit seinen vielen Dutzend Zielen w"are die Zahl der Sonderabfragen
  2252. aber extrem hoch geworden, so da"s nur der zweite Weg in Frage kam: Falls
  2253. im ersten Pass ein unbekanntes Symbol auftaucht, so liefert der Formelparser
  2254. den momentanen Stand des Programmz"ahlers als Ergebnis zur"uck!  Nur dieser
  2255. Wert ist geeignet, relativen Spr"ungen mit Sprungdistanzen unbekannter
  2256. L"ange eine Adresse anzubieten, die nicht zu Fehlern f"uhrt.  Dies beantwortet
  2257. auch die bisweilen gestellte Frage, warum in einem Listing des ersten
  2258. Passes (dies bleibt z.B. stehen, wenn \asname{} aufgrund anderer Fehler den
  2259. zweiten Pass erst gar nicht beginnt), z.T. falsche Adressen im erzeugten
  2260. Bin"arcode gezeigt werden - dies sind noch nicht aufgel"oste
  2261. Vorw"artsreferenzen.
  2262.  
  2263. Das obige Beispiel offenbart allerdings noch eine weitere Schwierigkeit
  2264. von Vorw"artsreferenzen: Je nach Abstand von Quelle und Ziel im Code kann
  2265. der Sprungbefehl entweder lang oder kurz sein.  Diese Entscheidung "uber
  2266. die Code-L"ange - und damit auch die Adressen folgender Labels - kann
  2267. jedoch mangels genauer Kenntnis der Zieladresse im ersten Pass nicht
  2268. erfolgen.  Sofern der Programmierer nicht explizit kenntlich gemacht hat,
  2269. ob der Sprung lang oder kurz sein soll, behelfen sich reine 2-Pass-Assembler
  2270. wie "altere MASM-Versionen von Microsoft damit, im ersten Pass (nach diesem
  2271. m"ussen alle Adressen festliegen) Platz f"ur die l"angste Version zu
  2272. reservieren und im zweiten Pass den "ubersch"ussigen Platz mit \tty{NOP}s
  2273. aufzuf"ullen.  \asname{}-Versionen bis 1.37 taten dieses ebenfalls, danach bin
  2274. ich auf das Multipass-Verfahren "ubergegangen, das die strenge Einteilung
  2275. in zwei Passes aufhebt und beliebig viele Durchg"ange erlaubt.  Dazu wird
  2276. im ersten Pass der optimale Code mit den angenommenen Symbolwerten erzeugt.
  2277. Stellt \asname{} fest, da"s im zweiten Pass durch Codel"angenver"anderungen sich
  2278. Werte von Symbolen ge"andert haben, so wird einfach noch ein dritter Pass
  2279. eingelegt, und da durch die neuen Symbolwerte des zweiten Passes auch
  2280. im dritten Pass sich der Code wieder verk"urzen oder verl"angern kann,
  2281. ist ein weiterer Pass nicht unm"oglich.  Ich habe schon 8086-Programme
  2282. erlebt, bei denen erst nach 12 Durchg"angen alles stimmte.  Leider
  2283. erlaubt dieser Mechanismus nicht die Vorgabe einer Maximalzahl von
  2284. Durchl"aufen, ich kann als Regel nur sagen, da"s die Anzahl von Durchl"aufen
  2285. sinkt, je mehr man davon Gebrauch macht, Sprung- oder Adre"sl"angen explizit
  2286. vorzugeben.
  2287.  
  2288. Speziell bei gro"sen Programmen kann es zu einer interessanten Situation
  2289. kommen: Die Lage eines vorw"arts gerichteten Sprunges hat sich
  2290. im zweiten Pass so weit gegen"uber dem ersten verschoben, da"s der
  2291. jetzt noch benutzte Label-Wert aus dem ersten Pass au"serhalb der
  2292. erlaubten Sprungdistanz liegt.  \asname{} ber"ucksichtigt solche Situationen,
  2293. indem er jegliche Fehlermeldungen "uber zu weite Sprungdistanzen unterdr"uckt,
  2294. sobald er erkannt hat, da"s er wegen sich "andernder Symbolwerte ohnehin
  2295. einen weiteren Durchlauf machen mu"s.  Dies funktioniert zwar in 99\%
  2296. aller F"alle, es gibt jedoch auch Konstrukte, in denen der erste, derartig
  2297. kritische Befehl bereits auftaucht, bevor \asname{} eine Chance hat, zu erkennen,
  2298. da"s ein neuer Pass erforderlich ist.  Das folgende Beispiel konstruiert
  2299. eine solche Situation mit Hilfe einer Vorw"artsreferenz (und war der
  2300. Anla"s f"ur die "Uberschrift dieses Abschnitts...):
  2301. \begin{verbatim}
  2302.        cpu   6811
  2303.  
  2304.        org     $8000
  2305.        beq     skip
  2306.        rept    60
  2307.         ldd    Var
  2308.        endm
  2309. skip:   nop
  2310. Var     equ     $10
  2311. \end{verbatim}
  2312. Aufgrund der Adre"slage nimmt \asname{} im ersten Pass lange Adressen f"ur die
  2313. \tty{LDD}-Befehle an, was eine Code-L"ange von 180 Bytes ergibt und im
  2314. zweiten Pass (zum Zeitpunkt des \tty{BEQ}-Befehls ist noch der ,,falsche''
  2315. Wert von \tty{skip} aktuell, d.h. \asname{} wei"s zu diesem Zeitpunkt noch nicht,
  2316. da"s der Code in Wirklichkeit nur 120 Bytes lang ist) gibt es eine
  2317. Fehlermeldung wegen einer "uberschrittenen Sprungdistanz.  Dieser Fehler
  2318. l"a"st sich auf drei Arten vermeiden:
  2319. \begin{enumerate}
  2320. \item{Weisen Sie \asname{} explizit darauf hin, da"s er f"ur die \tty{LDD}-Befehle
  2321.      kurze Adressen verwenden darf (\tty{ldd <Var})}
  2322. \item{Entfernen Sie diese vermaledeite, verfluchte Vorw"artsreferenz und
  2323.      setzen Sie die \tty{EQU}-Anweisung nach vorne, wo sie hingeh"ort
  2324.      (OK, ich beruhige mich ja schon wieder...)}
  2325. \item{F"ur ganz Unentwegte: Benutzten Sie die \tty{-Y}-Option, so da"s \asname{} die
  2326.      Fehlermeldung beim Erkennen der Adre"sverschiebung nachtr"aglich
  2327.      verwirft.  Nicht sch"on, aber...}
  2328. \end{enumerate}
  2329. Noch ein Hinweis zum \tty{EQU}-Befehl:  Da \asname{} nicht wissen kann, in welchem
  2330. Zusammenhang ein mit \tty{EQU} definiertes Symbol sp"ater verwendet wird,
  2331. wird ein \tty{EQU} mit Vorw"artsreferenzen im ersten Pass "uberhaupt nicht
  2332. durchgef"uhrt.  Wird das mit \tty{EQU} definierte Symbol also im zweiten
  2333. Pass vorw"arts referenziert:
  2334. \begin{verbatim}
  2335.        move.l  #sym2,d0
  2336. sym2    equ     sym1+5
  2337. sym1    equ     0
  2338. \end{verbatim}
  2339. so handelt man sich im zweiten Pass eine Fehlermeldung wegen eines
  2340. undefinierten Symbols ein...aber warum machen Leute eigentlich solche
  2341. Dinge ???
  2342.  
  2343. Zugegeben, das war ein ziemlich l"anglicher Ausflug, aber es mu"ste einfach
  2344. einmal sein.  Was sollte man als Erkenntnis aus diesem Abschnitt mitnehmen?
  2345. \begin{enumerate}
  2346. \item{\asname{} versucht immer, den k"urzest m"oglichen Code zu erzeugen.  Dazu
  2347.      ben"otigt er eine endliche Zahl von Durchl"aufen.  Wenn man ihn
  2348.      nicht gerade knebelt, kennt \asname{} keine R"ucksichten...}
  2349. \item{Wenn sinnvoll und m"oglich, Sprung- und Adre"sl"angen explizit
  2350.      vorgeben.  Man kann damit u.U. die Anzahl der Durchl"aufe deutlich
  2351.      reduzieren.}
  2352. \item{Vorw"artsreferenzen auf das allern"otigste beschr"anken.  Man
  2353.      erleichtert sich und \asname{} das Leben damit erheblich!}
  2354. \end{enumerate}
  2355.  
  2356. %%---------------------------------------------------------------------------
  2357.  
  2358. \section{Registersymbole}
  2359. \label{SectRegSyms} \ttindex{Registersymbole}
  2360.  
  2361. {\em G"ultigkeit: PowerPC, M-Core, XGate, 4004/4040, MCS-48/(2)51, 80C16x,
  2362.     AVR, XS1, Z8, KCPSM, Mico8, MSP430(X), ST9, M16, M16C, H8/300,
  2363.     H8/500, SH7x00, H16, i960, XA, 29K, TLCS-9000, KENBAK, SC/MP}
  2364.  
  2365. Manchmal ist es erw"unscht, nicht nur einer Speicheradresse oder einer
  2366. Konstanten, sondern auch einem Register einen symbolischen Namen zuzuweisen,
  2367. um seine Funktion in einem bestimmten Programmabschnitt zu verdeutlichen.
  2368. Dies ist bei Prozessoren, die die Register schlicht als einen weiteren
  2369. Adre"sraum behandeln, recht problemlos, da als Register damit auch
  2370. Zahlenausdr"ucke erlaubt sind und man solche Symbole mit schlichten
  2371. \tty{EQU}s definieren kann (z.B. bei MCS-96 oder TMS7000).  Bei den
  2372. allermeisten Prozessoren jedoch sind Registernamen festgelegte Literale, und
  2373. \asname{} behandelt sie beim Parsing aus Geschwindigkeitsgr"unden gesondert, so da"s auch
  2374. ein getrennter Typ von Symbolen f"ur solche Registersymbole oder -aliase existiert.
  2375. Registersymbole k"onnen wie gew"ohnliche Symbole mit \tty{EQU} oder \tty{SET}
  2376. definiert und umdefiniert werden, zudem existiert eine spezielle \tty{REG}-Anweisung,
  2377. die explizit nur Symbole bzw. Ausdr"ucke dieses Typs akzeptiert.
  2378.  
  2379. Registersymbole unterliegen einer Reihe von Einschr"ankungen: zum einen ist die
  2380. Menge der Literale beschr"ankt und durch den jeweiligen Zielprozessor vorgegeben,
  2381. zum anderen kann man mit Registersymbolen nicht rechnen.  Etwas in dieser Form:
  2382. \begin{verbatim}
  2383. myreg   reg     r17         ; Definition Registersymbol
  2384.        addi    myreg+1,3   ; geht nicht!
  2385. \end{verbatim}
  2386. ist also {\em nicht} zul"assig.  Einfache Zuweisungen sind dagegen auch "uber mehrere
  2387. Stufen hinweg erlaubt:
  2388. \begin{verbatim}
  2389. myreg   reg     r17         ; Definition Registersymbol
  2390. myreg2  reg     myreg       ; myreg2 -> r17
  2391. \end{verbatim}
  2392. Des weiteren sind Vorw"artsreferenzen bei Registersymbolen noch kritischer als
  2393. bei anderen Typen von Symbolen.  Ist ein Symbol nicht definiert, so kann \asname{} nur
  2394. mutma"sen, was f"ur ein Typ von Symbol es sein wird, und entscheidet sich in
  2395. Zweifelsfall f"ur eine einfache Zahl, was bei den meisten Prozessoren einem Zugriff
  2396. auf eine absolute Adresse im Speicher gleichkommt.  Nun sind bei den meisten
  2397. Prozessoren die Nutzungsm"oglichkeiten f"ur Speicheradressen als Operand deutlich
  2398. eingeschr"ankter als f"ur Register.  Je nach Situation erh"alt man so eine
  2399. Fehlermeldung "uber einen nicht erlaubten Adressierungsmodus, und es kommt zu keinem
  2400. zweiten Pass...
  2401.  
  2402. Registersymbole sind analog zu normalen Symbolen lokal zu Sektionen,
  2403. und es ist auch durch Anh"angen eines in eckige Klammern gesetzten Sektionsnamens
  2404. m"oglich, auf ein Registersymbol aus einer bestimmten Sektion zuzugreifen.
  2405.  
  2406. %%---------------------------------------------------------------------------
  2407.  
  2408. \section{Sharefile}
  2409. \label{ChapShareMain} \ttindex{SHARED}
  2410.  
  2411. Diese Funktion ist ein Abfallprodukt aus den reinen 68000er-Vorg"angern
  2412. von \asname{}, da sie vielleicht doch der (die?!) eine oder andere gebrauchen
  2413. k"onnte, habe ich sie drin gelassen.  Grundproblem ist es, an bestimmte
  2414. beim Assemblieren entstehende Symbole heranzukommen, weil man evtl. mit
  2415. diesen Adre"sinformationen auf den Speicher des Zielsystems zugreifen
  2416. m"ochte.  Der Assembler erlaubt es, mit Hilfe des \tty{SHARED}-Pseudobefehles
  2417. (siehe dort) Symbolwerte extern zur Verf"ugung zu stellen.  Zu diesem
  2418. Zweck erstellt der Assembler im zweiten Pass eine Textdatei mit den
  2419. gew"unschten Symbolen und ihren Werten, die mittels Include in ein
  2420. Hochsprachen-oder weiteres Assemblerprogramm eingebunden werden k"onnen.
  2421. Das Format der Textdatei (C, Pascal oder Assembler) wird durch die
  2422. Kommandozeilenschalter \tty{p}, \tty{c} oder \tty{a} festgelegt.
  2423. \par
  2424. \bb{ACHTUNG!} Ist keiner dieser Schalter angegeben, so wird auch keine
  2425. Datei erzeugt, egal ob sich \tty{SHARED}-Befehle im Quelltext finden oder
  2426. nicht!
  2427. \par
  2428. \asname{} pr"uft beim Anlegen der Share-Datei nicht, ob bereits eine Datei gleichen
  2429. Namens existiert, eine solche wird ggfs. einfach "uberschrieben.  Eine
  2430. Abfrage halte ich nicht f"ur sinnvoll, da \asname{} dann bei jedem Lauf fragen
  2431. w"urde, ob er die alte Version der Share-Datei "uberschreiben darf, und das
  2432. w"are doch sehr l"astig...
  2433.  
  2434. %%---------------------------------------------------------------------------
  2435.  
  2436. \section{Prozessor-Aliase}
  2437. \label{SectAlias}
  2438.  
  2439. Mit Varianten g"angiger Mikrocontroller-Familien ist es wie mit
  2440. Kaninchen: Sie vermehren sich schneller, als man mit der Versorgung
  2441. hinterher kommen kann.  Im Zuge der Entwicklung von Prozessorkernen als
  2442. Bausteine f"ur ASICs und von Controller-Familien mit vom Kunden w"ahlbarer
  2443. Peripherie wird die Zahl von Controller-Varianten, die sich von einem
  2444. bekannten Typ nur in einigen Peripherie-Details unterscheiden, immer
  2445. gr"o"ser.  Die Unterscheidung der einzelnen Typen ist aber trotz meist
  2446. identischer Prozessorkerns wichtig, um z.B. in den Include-Dateien den
  2447. korrekten Satz von Peripherieregistern einzublenden.  Bisher habe ich
  2448. mich zwar immer bem"uht, die wichtigsten Vertreter einer Familie in \asname{}
  2449. einzubauen (und werde das auch weiter tun), aber manchmal l"auft mir
  2450. die Entwicklung einfach auf und davon...es mu"ste also ein Mechanismus
  2451. her, mit dem man die Liste der unterscheidbaren Prozessortypen selbst
  2452. erweitern kann.
  2453. \par
  2454. Das Ergebnis davon sind Prozessor-Aliasse: Mit der Kommandozeilenoption \tty{alias}
  2455. kann man einen neuen Prozessortyp definieren, der im Befehlssatz einem
  2456. anderen, in \asname{} fest eingebauten Typ entspricht.  Bei Benutzung dieses
  2457. Typs im \tty{CPU}-Befehl wird sich \asname{} also wie beim ,,Original'' verhalten,
  2458. mit einem Unterschied: Die Variablen \tty{MOMCPU} bzw. \tty{MOMCPUNAME}
  2459. werden auf den Namen des Alias gesetzt, wodurch der neue Name zur
  2460. Unterscheidung z.B. in Include-Dateien dienen kann.
  2461. \par
  2462. Die Definition dieser Aliasse wurde aus zwei Gr"unden mit
  2463. Kommandozeilenoptionen anstatt Pseudobefehlen vorgenommen: zum einen
  2464. w"are es ohnehin nicht m"oglich gewesen, die Definition der Aliasse
  2465. zusammen mit den Registerdefinitionen in eine Include-Datei zu legen, denn
  2466. in einem Programm, das so eine Datei benutzen wollte, m"u"ste sie ja sowohl
  2467. vor als auch nach dem \tty{CPU}-Befehl in der Hauptdatei eingebunden
  2468. werden - eine Vorstellung, die irgendwo zwischen unelegant und unm"oglich
  2469. liegt.  Zum zweiten erm"oglicht diese Implementierung, die Definition der
  2470. neuen Typen in eine Datei zu legen, die "uber die \tty{ASCMD}-Variable beim
  2471. Start automatisch ausgef"uhrt wird, ohne das sich das Programm darum
  2472. k"ummern m"u"ste.
  2473.  
  2474. %%===========================================================================
  2475.  
  2476. \cleardoublepage
  2477. \chapter{Pseudobefehle}
  2478.  
  2479. Nicht f"ur alle Prozessoren sind alle Pseudobefehle definiert.  Vor
  2480. der Beschreibung eines Befehls ist deshalb jeweils vermerkt, f"ur
  2481. welche Prozessortypen dieser Befehl erlaubt ist.
  2482.  
  2483. %%---------------------------------------------------------------------------
  2484.  
  2485. \section{Definitionen}
  2486.  
  2487. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2488.  
  2489. \subsection{SET, EQU und CONSTANT}
  2490. \ttindex{SET}\ttindex{EQU}
  2491. \ttindex{.SET}\ttindex{.EQU}
  2492. \ttindex{CONSTANT}
  2493.  
  2494. {\em G"ultigkeit: alle Prozessoren, {\tt CONSTANT} nur KCPSM(3)}
  2495.  
  2496. \tty{SET} und \tty{EQU} erlauben die Definition typenloser Konstanten, d.h. sie
  2497. werden keinem Segment zugeordnet und ihre Verwendung erzeugt in keinem
  2498. Fall eine Warnung wegen Segment-Vermischung.  W"ahrend \tty{EQU} Konstanten
  2499. definiert, die nicht wieder (mit \tty{EQU}) ge"andert werden k"onnen, erlaubt
  2500. \tty{SET} die Definition von Variablen, die sich w"ahrend des Assemblerlaufes
  2501. ver"andern lassen.  Dies ist n"utzlich z.B. bei der Allokation von
  2502. Resourcen \`a la Interrupt-Vektoren, wie im folgenden Beispiel:
  2503. \begin{verbatim}
  2504. VecCnt  SET     0         ; irgendwo am Anfang
  2505.        ...
  2506. DefVec  MACRO   Name      ; einen neuen Vektor belegen
  2507. Name    EQU     VecCnt
  2508. VecCnt  SET     VecCnt+4
  2509.        ENDM
  2510.        ...
  2511.        DefVec  Vec1      ; ergibt Vec1=0
  2512.        DefVec  Vec2      ; ergibt Vec2=4
  2513. \end{verbatim}
  2514. Intern werden Konstanten und Variablen identisch gespeichert, der
  2515. einzige Unterschied ist, da"s sie als unver"anderbar markiert werden, wenn
  2516. sie mit \tty{EQU} definiert werden.  Der Versuch, eine Konstante mit
  2517. \tty{SET} zu ver"andern, gibt eine Fehlermeldung.
  2518. \par
  2519. Mit \tty{EQU/SET} lassen sich Konstanten aller Typen definieren, z.B.
  2520. \begin{verbatim}
  2521. IntZwei   EQU   2
  2522. FloatZwei EQU   2.0
  2523. \end{verbatim}
  2524. Einige Prozessoren besitzen leider bereits selber einen \tty{SET}-Befehl.
  2525. Bei diesen mu"s \tty{EVAL} anstelle von \tty{SET} verwendet werden, falls
  2526. sich der Maschinenbefehl nicht durch die andere Anzahl der Argumente
  2527. erkennen l"a"st.  Alternativ ist es auch immer m"oglich, durch einen
  2528. vorangestellten Punkt (\tty{.SET} anstelle \tty{SET}) explizit den
  2529. Pseudobefehl aufzurufen.
  2530. \par
  2531. Anstelle von \tty{EQU} darf auch \tty{.EQU} oder einfach ein
  2532. Gleichheitszeichen geschrieben werden, analog kann man anstelle
  2533. von \tty{SET} bzw. \tty{EVAL} einfach \tty{:=} schreiben.  Des weiteren
  2534. existiert eine 'alternative' Syntax, bei der der Synbolname nicht aus dem
  2535. Feld f"ur das Label genommen wird, sondern das erste Argument ist.
  2536. Wahlweise darf man also auch schreiben:
  2537. \begin{verbatim}
  2538.          EQU   IntZwei,2
  2539.          EQU   FloatZwei,2.0
  2540. \end{verbatim}
  2541. Das Feld f"ur das Label mu"s in diesem Fall leer bleiben.
  2542. \par
  2543. Aus Kompatibilit"atsgr"unden zum Originalassembler gibt es f"ur das
  2544. KCPSM-Target auch den {\tt CONSTANT}-Befehl, der im Gegensatz zu {\tt EQU}
  2545. Namen und Wert immer als Argumente erwartet, also z.B. so:
  2546. \begin{verbatim}
  2547.      CONSTANT  const1, 2
  2548. \end{verbatim}
  2549. {\tt CONSTANT} ist allerdings auf Integer-Konstanten beschr"ankt.
  2550. \par
  2551. Defaultm"a"sig sind mit \tty{SET} oder \tty{EQU} definierte Symbole
  2552. typenlos, optional kann jedoch als zweites bzw. drittes Argument ein
  2553. Segmentname (\tty{CODE, DATA, IDATA, XDATA, YDATA, BITDATA, IO oder REG})
  2554. oder \tty{MOMSEGMENT} f"ur das aktuell gesetzte Segment angegeben werden,
  2555. um das Symbol einem bestimmten Adre"sraum zuordnen.  \asname{} ber"ucksichtigt
  2556. dabei nicht, ob der benutzte Adre"sraum bei dem aktuell gesetzten
  2557. Zielprozessor auch vorhanden ist!
  2558.  
  2559. Als kleines verstecktes Extra ist es m"oglich, "uber \tty{SET} oder \tty{EQU}
  2560. den Programmz"ahler zu setzen, also das zu machen, wozu man ansonsten \tty{ORG}
  2561. verwenden w"urde.  Dazu gibt man als Symbolnamen den Sonderwert an, mit dem
  2562. sich auch der aktuelle Programmz"ahler abfragen l"a"st, also je nach
  2563. gew"ahlter Zielarchitektur ein Stern, ein Dollarzeichen, ein Punkt oder \tty{PC}.
  2564.  
  2565. Falls die gew"ahlte Zielarchitektur ein Attribut an den Befehlen zur Angabe
  2566. der Operandengr"o"se unterst"utzt (z.B. 680x0), so ist dieses ebenfalls
  2567. bei \tty{SET} und \tty{EQU} erlaubt.  Das definierte Symbol wird dann mit
  2568. dieser Operandengr"o"se in der Symboltabelle abgelegt.  Deren Verwendung
  2569. bei Benutzung des Symbols ist architekturab"angig.
  2570.  
  2571. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2572.  
  2573. \subsection{SFR und SFRB}
  2574. \ttindex{SFR}\ttindex{SFRB}
  2575.  
  2576. {\em G"ultigkeit: diverse, SFRB nur MCS-51}
  2577.  
  2578. Diese Befehle funktionieren wie \tty{EQU}, nur sind die damit definierten
  2579. Symbole dem direkt adressierbaren Datensegment zugeordnet, d.h. sie
  2580. dienen bevorzugt zur Definition von (wie der Name ahnen l"a"st) im Daten- bzw.
  2581. I/O-Bereich eingeblendeten Hardwareregistern.  Der dabei zugelassene
  2582. Wertebereich ist identisch mit dem bei \tty{ORG} f"ur das \tty{DATA} bzw.
  2583. \tty{IO}-Segment zugelassenen (s. Abschnitt \ref{SectORG}).
  2584. \tty{SFR} und \tty{SFRB} unterscheiden sich darin,  da"s \tty{SFRB}
  2585. das Register als bitadressierbar kennzeichnet, weshalb \asname{} zus"atzlich 8
  2586. Symbole erzeugt, die dem Bitsegment zugeordnet werden und die Namen
  2587. \tty{xx.0} bis \tty{xx.7} tragen, z.B.
  2588. \begin{verbatim}
  2589. PSW     SFR     0d0h   ; ergibt PSW = D0H (Datensegment)
  2590.  
  2591. PSW     SFRB    0d0h   ; zusaetzlich PSW.0 = D0H (Bit)
  2592.                       ; bis PSW.7 = D7H (Bit)
  2593. \end{verbatim}
  2594. Da beim 80C251 grunds"atzlich alle SFRs ohne zus"atzliche Bit-Symbole
  2595. bitadressierbar sind, ist der \tty{SFRB}-Befehl f"ur ihn auch nicht mehr
  2596. definiert; die Bits \tty{PSW.0} bis \tty{PSW.7} sind automatisch vorhanden.
  2597. \par
  2598. \asname{} "uberpr"uft bei der Definition eines bitadressierbaren Registers mit
  2599. \tty{SFRB}, ob die Speicherstelle "uberhaupt bitadressierbar ist (Bereich
  2600. 20h..3fh bzw. 80h, 88h, 90h, 98h...0f8h).  Ist sie es nicht, so wird eine
  2601. Warnung ausgegeben; die dann erzeugten Bit-Symbole sind undefiniert.
  2602.  
  2603.  
  2604. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2605.  
  2606. \subsection{XSFR und YSFR}
  2607. \ttindex{XSFR}\ttindex{YSFR}
  2608.  
  2609. {\em G"ultigkeit: DSP56xxx}
  2610.  
  2611. Auch der DSP56000 hat einige Peripherieregister memory-mapped im
  2612. Speicher liegen, die Sache wird jedoch dadurch komplizierter, da"s
  2613. es zwei Datenbereiche gibt, den X-und Y-Bereich.  Diese Architektur
  2614. erlaubt einerseits zwar einen h"oheren Parallelit"atsgrad, zwingt
  2615. jedoch andererseits dazu, den normalen \tty{SFR}-Befehl in die beiden
  2616. oben genannten Varianten aufzuspalten.  Sie verhalten sich identisch zu
  2617. \tty{SFR}, nur da"s \tty{XSFR} ein Symbol im X-Adre"sraum definiert
  2618. und \tty{YSFR} entsprechend eines im Y-Adre"sraum.  Der erlaubte
  2619. Wertebereich ist 0..\$ffff.
  2620.  
  2621. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2622.  
  2623. \subsection{LABEL}
  2624. \ttindex{LABEL}
  2625.  
  2626. {\em G"ultigkeit: alle Prozessoren}
  2627.  
  2628. Die Funktion des \tty{LABEL}-Befehls ist identisch zu \tty{EQU}, nur
  2629. wird das Symbol nicht typenlos, sondern erh"alt das Attribut ,,Code''.
  2630. \tty{LABEL} wird genau f"ur einen Zweck ben"otigt: Labels in Makros
  2631. sind normalerweise lokal, also nicht au"serhalb des Makros zugreifbar.
  2632. Mit einem \tty{EQU}-Befehl kann man sich zwar aus der Aff"are ziehen,
  2633. die Formulierung
  2634. \begin{verbatim}
  2635. <Name>   label    $
  2636. \end{verbatim}
  2637. erzeugt aber ein Symbol mit korrekten Attributen.
  2638.  
  2639. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2640.  
  2641. \subsection{BIT}
  2642. \ttindex{BIT}
  2643.  
  2644. {\em G"ultigkeit: MCS-(2)51, XA, 80C166, 75K0, STM8, ST9, AVR, S12Z,
  2645.                  SX20/28, H16, H8/300, H8/500, KENBAK, Padauk}
  2646.  
  2647. \tty{BIT} dient dazu, ein einzelnes Bit einer Speicherstelle mit einem
  2648. symbolischen Namen gleichzusetzen.  Da die Art und Weise, wie
  2649. verschiedene Prozessoren Bitverarbeitung und -adressierung betreiben,
  2650. stark variiert, verh"alt sich auch dieser Befehl je nach Zielplattform
  2651. anders:
  2652. \par
  2653. F"ur die MCS/51-Familie, die einen eigenen Adre"sraum f"ur Bitoperanden
  2654. besitzt, ist die Funktion von \tty{BIT} ganz analog zu \tty{SFR}, d.h.
  2655. es wird einfach ein Integer-Symbol mit dem angegebenen Wert und dem
  2656. Segment BDATA erzeugt.  F"ur alle anderen Prozessoren wird die
  2657. Bitadressierung dagegen zweidimensional mit Adresse und Bitstelle
  2658. vorgenommen.  In diesem Fall verpackt \asname{} beide Teile in einer vom
  2659. jeweiligen Prozessor abh"angigen Weise in ein Integer-Symbol und dr"oselt
  2660. dieses bei der Benutzung wieder in die beiden Teile auseinander.
  2661. Letzterer Fall trifft auch schon f"ur den 80C251 zu:  W"ahrend zum Beispiel
  2662. der Befehl
  2663. \begin{verbatim}
  2664. Mein_Carry      bit     PSW.7
  2665. \end{verbatim}
  2666. auf einem 8051 noch dem Symbol \tty{Mein\_Carry} den Wert 0d7h zuweisen
  2667. w"urde, w"urde auf einem 80C251 dagegen ein Wert von 070000d0h generiert
  2668. werden, d.h. die Adresse steht in Bit  0..7 sowie die Bitstelle in Bit
  2669. 24..26.  Dieses Verfahren entspricht dem, das auch beim DBIT-
  2670. Befehl des TMS370 angewendet wird und funktioniert sinngem"a"s so auch
  2671. beim 80C166, nur da"s dort Bitstellen von 0 bis 15 reichen d"urfen:
  2672. \begin{verbatim}
  2673. MSB     BIT     r5.15
  2674. \end{verbatim}
  2675. Beim Philips XA findet sich in Bit 0..9 die Bitadresse, wie sie auch
  2676. in die Maschinenbefehle eingesetzt wird, f"ur Bits aus den RAM-Speicher
  2677. wird in Bit 16..23 die 64K-Bank eingesetzt.
  2678. \par
  2679. Noch etwas weiter geht der \tty{BIT}-Befehl bei der 75K0-Familie: Da
  2680. dort Bitadressierungen nicht nur absolute Basisadressen verwenden
  2681. d"urfen, sind sogar Ausdr"ucke wie
  2682. \begin{verbatim}
  2683. bit1    BIT     @h+5.2
  2684. \end{verbatim}
  2685. erlaubt.
  2686. \par
  2687. Beim ST9 ist es hingegen m"oglich, Bits auch invertiert anzusprechen,
  2688. was beim \tty{BIT}-Befehl auch ber"ucksichtigt wird:
  2689. \begin{verbatim}
  2690. invbit  BIT     r6.!3
  2691. \end{verbatim}
  2692. N"aheres zum \tty{BIT}-Befehl beim ST9 findet sich bei den
  2693. prozessorspezifischen Hinweisen.
  2694.  
  2695. Im Falle des H16 sind die Argumente f"ur Speicheradresse und Bitposition
  2696. vertauscht.  Dies wurde getan, um die Syntax zur Definition von Bit identisch
  2697. zu den Maschinenbefehlen zu machen, die einzelne Bits manipulieren.
  2698.  
  2699. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2700.  
  2701. \subsection{DBIT}
  2702. \ttindex{DBIT}
  2703.  
  2704. {\em G"ultigkeit: TMS 370xxx}
  2705.  
  2706. Die TMS370-Reihe hat zwar kein explizites Bit-Segment, jedoch k"onnen
  2707. einzelne Bits als Symbol durch diesen Befehl simuliert werden.  \tty{DBIT}
  2708. ben"otigt zwei Operanden, n"amlich einmal die Adresse der Speicherstelle,
  2709. in der das Bit liegt, sowie die genaue Position des Bits im Byte.
  2710. So definiert man z.B. mit
  2711. \begin{verbatim}
  2712. INT3            EQU     P019
  2713. INT3_ENABLE     DBIT    0,INT3
  2714. \end{verbatim}
  2715. das Bit, welches Interrupts von Anschlu"s INT3 freigibt.  So definierte
  2716. Bits k"onnen dann von den Befehlen \tty{SBIT0, SBIT1, CMPBIT, JBIT0}
  2717. und \tty{JBIT} genutzt werden.
  2718.  
  2719. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2720.  
  2721. \subsection{DEFBIT und DEFBITB}
  2722. \ttindex{DEFBIT}
  2723. \ttindex{DEFBITB}
  2724.  
  2725. \subsubsection{S12Z}
  2726.  
  2727. Der Prozessorkern der S12Z-Familie verf"ugt "uber Befehle, mit denen
  2728. sich einzelne Bits in Register oder Speicherzellen manipulieren
  2729. lassen.  Um Bits im I/O-Bereich des Prozessors (erste 4 KByte des
  2730. Adre"sraumes) bequem ansprechen zu k"onnen, kann man einem einzelnen
  2731. Bit, definiert durch Speicheradresse und Bitposition, einen
  2732. symbolischen Namen geben:
  2733. \begin{verbatim}
  2734. <Name>         defbit[.Size]   <Adresse>,<Position>
  2735. \end{verbatim}
  2736. Die \tty{Adresse} mu"s in den ersten 4 KByte liegen, als Operandengr"o"se
  2737. sind 8, 16 oder 32 Bit (\tty{Size}=b/w/l) zugelassen.
  2738. Dementsprechend darf \tty{Position} maximal 7, 15 oder 31 sein.
  2739. Falls keine Opoerandengr"o"se angegeben wird, werden 8 Bit (.b)
  2740. angenommen.  Ein solcherma"sen definiertes Bit kann als Argument f"ur
  2741. die Befehle {\tt BCLR, BSET, BTGL, BRSET} und {\tt BRCLR} verwendet
  2742. werden:
  2743. \begin{verbatim}
  2744. mybit   defbit.b  $200,4
  2745.        bclr.b    $200,#4
  2746.        bclr      mybit
  2747. \end{verbatim}
  2748. Die beiden Aufrufe von {\tt bclr} in diesem Beispiel erzeugen
  2749. identischen Code.  Da ein solcherma"sen definiertes Bit seine
  2750. Operandengr"o"se ''kennt'', kann diese bei der Benutzung fortgelassen
  2751. werden.
  2752.  
  2753. Bit-Definitionen innerhalb einer Struktur, die sich auf ein Element
  2754. einer Struktur beziehen, sind ebenfalls m"oglich:
  2755. \begin{verbatim}
  2756. mystruct struct    dots
  2757. reg      ds.w      1
  2758. flag     defbit    reg,4
  2759.         ends
  2760.  
  2761.         org       $100
  2762. data     mystruct
  2763.         bset      data.flag  ; entspricht bset.w $100,#4
  2764. \end{verbatim}
  2765.  
  2766. \subsubsection{Super8}
  2767.  
  2768. Im Gegensatz zum ''klassischen'' Z8 verf"ugt der Super8-Kern "uber
  2769. Befehle, mit denen sich Bits in allgemeinen oder Arbeitsregistern
  2770. bearbeiten lassen.  Dabei ist jedoch zu beachten, da"s einige davon
  2771. nur auf Bits arbeiten, die Teil eines der 16 Arbeitsregister sind.
  2772. Mit der \tty{DEFBIT}-Anweisung lassen sich Bits beider Sorten
  2773. definieren:
  2774. \begin{verbatim}
  2775. workbit defbit  r3,#4
  2776. slow    defbit  emt,#6
  2777. \end{verbatim}
  2778. Derart definierte Bits lassen sich dann bei den Befehlen wie ein
  2779. P"archen aus Register und Bitposition einsetzen:
  2780. \begin{verbatim}
  2781.         ldb     r3,emt,#6
  2782.         ldb     r3,slo          ; gleich bedeutend
  2783.  
  2784.         bitc    r3,#4
  2785.         bitc    workbit         ; gleich bedeutend
  2786. \end{verbatim}
  2787.  
  2788. \subsubsection{Z8000}
  2789.  
  2790. Der Z8000 verf"ugt zwar "uber Befehle zum Setzen und R"ucksetzen
  2791. von Bits, diese k"onnen jedoch nur auf Adressen im Speicher- und nicht
  2792. im I/O-Adre"sraum wirken.  Aus diesem Grund lassen sich mit {\tt DEFBIT}
  2793. bzw. {\tt DEFBITB} auch nur Bit-Objekte im Speicher-Adre"sraum definieren.
  2794. Die Unterscheidung der Operandengr"o"se ist wichtig, weil der Z8000 ein
  2795. Big-Endian-Prozessor ist: Bit {\em n} eines 16-Bit-Worts bei Adresse {\em m}
  2796. entspr"ache Bit {\em n} eines 8-Bit-Byte bei Adresse {\em m+1}.
  2797.  
  2798. \subsubsection{$\mu$PD7807...$\mu$PD7809}
  2799.  
  2800. Die ersten 16 Byte der Working Area und Sonderregister mit einer Adresse
  2801. kleiner 16 sind bitadressierbar.
  2802.  
  2803. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2804.  
  2805. \subsection{DEFBITFIELD}
  2806. \ttindex{DEFBITFIELD}
  2807.  
  2808. {\em G"ultigkeit: S12Z}
  2809.  
  2810. Der Prozessorkern der S12Z-Familie kann nicht nur mit einzelnen Bits
  2811. umgehen, sondern auch zusammenh"angende Felder von Bits in einem
  2812. 8/16/24/32-Bit-Wert extrahieren oder schreiben.  Analog zu
  2813. \tty{DEFBIT} l"a"st sich auch ein Bitfeld symbolisch definieren:
  2814. \begin{verbatim}
  2815. <Name>         defbitfield[.Size]   <Adresse>,<Breite>:<Position>
  2816. \end{verbatim}
  2817. Im Gegensatz zu einzelnen Bits sind hier auch 24 Bits (.p) als
  2818. Operandengr"o"se zugelassen, der Wertebereich von \tty{Position} und
  2819. \tty{Breite} ist dementsprechend von 0 bis 23 bzw. 1 bis 24.  Auch
  2820. hier ist es wieder zul"assig, Bitfelder als Teil von Strukturen zu
  2821. definieren:
  2822. \begin{verbatim}
  2823. mystruct struct      dots
  2824. reg      ds.w        1
  2825. clksel   defbitfield reg,4:8
  2826.         ends
  2827.  
  2828.         org       $100
  2829. data     mystruct
  2830.         bfext     d2,data.clksel ; fetch $100.w bits 4..11
  2831.                                  ; to D2 bits 0..7
  2832.         bfins     data.clksel,d2 ; insert D2 bits 0..7 into
  2833.                                  ; $100.w bits 4..11
  2834. \end{verbatim}
  2835. Die interne Darstellung von Bits, die mit \tty{DEFBIT} definiert
  2836. wurden, ist gleich der von Bitfeldern der Breite eins.  Ein
  2837. symbolisch definiertes einzelnes Bit kann also auch als Argument
  2838. f"ur \tty{BFINS} und \tty{BFEXT} verwendet werden.
  2839.  
  2840. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2841.  
  2842. \subsection{PORT}
  2843. \ttindex{PORT}
  2844.  
  2845. {\em G"ultigkeit: PALM, 8008/8080/8085/8086, XA, Z80, Z8000, 320C2x/5x, TLCS-47, AVR,
  2846.     F8, IMP-16}
  2847.  
  2848. \tty{PORT} arbeitet analog zu \tty{SFR}, nur wird das Symbol dem I/O-Adre"sbereich
  2849. zugeordnet.  Erlaubte Werte sind 0..7 beim 3201x und 8008, 0..15 beim 320C2x und PALM,
  2850. 0..65535 beim 8086, Z8000 und 320C5x, 0..63 beim AVR und 0..255 beim Rest.
  2851. \par
  2852. Beispiel: eine PIO 8255 liege auf Adresse 20H:
  2853. \begin{verbatim}
  2854. PIO_Port_A PORT 20h
  2855. PIO_Port_B PORT PIO_Port_A+1
  2856. PIO_Port_C PORT PIO_Port_A+2
  2857. PIO_Ctrl   PORT PIO_Port_A+3
  2858. \end{verbatim}
  2859.  
  2860. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2861.  
  2862. \subsection{REG und NAMEREG}
  2863. \ttindex{REG}\ttindex{NAMEREG}
  2864.  
  2865. {\em G"ultigkeit: 680x0, AVR, M*Core, ST9, 80C16x, Z8000, KCPSM, \\
  2866.     PDP-11, WD16 \\
  2867.     (\tty{NAMEREG} nur f"ur KCPSM(3)), LatticeMico8, MSP430(X)}
  2868.  
  2869. Obwohl immer mit gleicher Syntax, hat diese Anweisung von Prozessor
  2870. zu Prozessor eine leicht abweichende Bedeutung: Falls der Zielprozessor
  2871. f"ur Register einen eigenen Adre"sraum verwendet, so hat \tty{REG}
  2872. die Wirkung eines simplen \tty{EQU}s f"ur eben diesen Adre"sraum (z.B. beim
  2873. ST9).  F"ur alle anderen Prozessoren definiert \tty{REG} Registersymbole,
  2874. deren Funktion in Abschnitt \ref{SectRegSyms} beschrieben sind.
  2875.  
  2876. {\tt NAMEREG} existiert aus Kompatibilit"atsgr"unden zum Originalassembler
  2877. f"ur den KCPSM.  Es hat die gleiche Funktion, lediglich werden sowohl
  2878. Register- als auch symbolischer Name als Argumente angegeben, z.B. so:
  2879. \begin{verbatim}
  2880.     NAMEREG  s08, treg
  2881. \end{verbatim}
  2882.  
  2883. Auf der PDP-11 darf \tty{REG} zus"atzlich ohne Namen im Label-Feld benutzt
  2884. werden.  Es wird dann als einziges Argument entweder \tty{ON} oder \tty{OFF}
  2885. erwartet, und damit werden die eingebauten Register-Aliase (\tty{Rn} = \tty{\%n},
  2886. \tty{SP} = \tty{R6}, \tty{PC} = \tty{R7}) ein- und ausgeschaltet.  Sie
  2887. sind im Default verf"ugbar, und sollten nur abgeschaltet werden, wenn
  2888. sie mit eigenen Symbolnamen in einem Programm kollidieren.  Die augenblickliche
  2889. Einstellung l"a"st sich aus dem Symbol \tty{DEFAULT\_REGSYMS} lesen.
  2890.  
  2891. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2892.  
  2893. \subsection{LIV und RIV}
  2894. \ttindex{LIV}\ttindex{RIV}
  2895.  
  2896. {\em G"ultigkeit: 8X30x}
  2897.  
  2898. \tty{LIV} und \tty{RIV} dienen dazu, sogenannte IV-Bus-Objekte zu definieren.
  2899. Bei diesen handelt es sich um Bitgruppen in peripheren Speicherzellen
  2900. mit einer L"ange von 1..8 Bit, die fortan symbolisch angesprochen
  2901. werden k"onnen, so da"s man bei den entsprechenden Befehlen nicht mehr
  2902. Adresse, L"ange und Position separat angeben mu"s.  Da die
  2903. 8X30x-Prozessoren zwei periphere Adre"sr"aume besitzen (einen ,,linken''
  2904. und einen ,,rechten'', sind auch zwei separate Befehle definiert.  Die
  2905. Parameter dieser Befehle sind allerdings identisch: es m"ussen drei
  2906. Parameter sein, die Adresse, Startposition und L"ange angeben.
  2907. Weitere Hinweise zur Benutzung von Busobjekten finden sich in
  2908. Abschnitt \ref{8X30xSpec}.
  2909.  
  2910. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2911.  
  2912. \subsection{CHARSET}
  2913. \label{SectCHARSET}
  2914. \ttindex{CHARSET}\ttindex{CODEPAGE\_VAL}
  2915.  
  2916. {\em G"ultigkeit: alle Prozessoren}
  2917.  
  2918. Einplatinen-Systeme, zumal wenn sie LCDs ansteuern, benutzen h"aufig
  2919. einen anderen Zeichensatz als ASCII, und da"s die Umlautkodierung mit
  2920. der im PC "ubereinstimmt, d"urfte wohl reiner Zufall sein.  Und dann
  2921. gibt es auch (historische) Systeme, die z.B. eine EBCDIC-Variante
  2922. verwenden...um nun aber keine fehlertr"achtigen Umkodierungen im Code
  2923. per Hand vornehmen zu m"ussen, enth"alt der Assembler eine Umsetzungstabelle
  2924. f"ur Zeichen, die jedem (ASCII-)zeichen im Quellcode ein Zielzeichen zuordnet.
  2925. Zur Modifikation dieser Tabelle (die initial 1:1 "ubersetzt), dient der
  2926. Befehl \tty{CHARSET}.  \tty{CHARSET} kann mit verschiedenen Parameterzahlen
  2927. und -typen aufgerufen werden:
  2928.  
  2929. Ein
  2930. \begin{quote}{\tt
  2931.        CHARSET
  2932. }\end{quote}
  2933. ohne jegliche Argumente setzt die "Ubersetzungstabelle auf den 1:1-Default
  2934. wieder zur"uck.
  2935.  
  2936. Wird nur ein Argument gegeben, mu"s es sich dabei um einen String-Ausdruck
  2937. handeln, der von \asname{} als Dateiname interpretiert wird:
  2938. \begin{verbatim}
  2939.        CHARSET  "mapping.bin"
  2940. \end{verbatim}
  2941. Aus dieser Datei liest \asname{} dann die ersten 256 Bytes aus und kopiert sie in die
  2942. "Ubersetzungstabelle.  Hiermit lassen sich also komplexere, extern
  2943. erzeugte Tabellen mit einer Anweisung laden.
  2944.  
  2945. In allen anderen Varianten wird ein einzelner Eintrag oder ein ganzer
  2946. Bereich von Eintr"agen in der Tabelle modifiziert.  Mit zwei (Integer-)Argumenten
  2947. kann ein einzelner Eintrag neu gesetzt werden.  Ein
  2948. \begin{quote}{\tt
  2949.        CHARSET '"a',128
  2950. }\end{quote}
  2951. bedeutet zum Beispiel, da"s das Zielsystem das "a mit der Zahl 128 kodiert.
  2952. Es ist auch m"oglich zu definieren, da"s ein bestimmtes Zeichen "uberhaupt
  2953. nicht dargestellt werden kann.  Daf"ur l"a"st man das zweite Argument leer:
  2954. \begin{quote}{\tt
  2955.        CHARSET '[',
  2956. }\end{quote}
  2957. Soll fortan das ,,gel"oschte'' Zeichen irgendwo in einem String im Speicher
  2958. abgelegt werden, f"uhrt dies zu einer Fehlermeldung.
  2959.  
  2960. Anstelle eines einzelnen Zeichens kann auch ein ganzer Bereich umgemappt
  2961. werden.  Das erste und zweite Argument geben den Bereich der Zeichen an, das
  2962. dritte das Mapping des ersten Zeichens.  Falls z.B. das Zielsystem keine
  2963. Kleinbuchstaben unterst"utzt, k"onnen mit
  2964. \begin{verbatim}
  2965.        CHARSET 'a','z','A'
  2966. \end{verbatim}
  2967. alle Kleinbuchstaben auf die passenden Gro"sbuchstaben automatisch
  2968. umgesetzt werden.  Und auch ein Bereich von Zeichen kann als
  2969. ,,nicht verf"ugbar'' markiert werden:
  2970. \begin{verbatim}
  2971.        CHARSET 'a','z',
  2972. \end{verbatim}
  2973. verbietet die Verwendung von Kleinbuchstabem.
  2974.  
  2975. In der letzten Variante (wieder mit nur zwei Argumenten) folgt nach dem
  2976. Startindex ein String, der das Mapping ab dem Start-Zeichen auflistet.
  2977. Das Umlegen von Klein- auf Gro"sbuchstaben k"onnte man also auch so
  2978. formulieren:
  2979. \begin{verbatim}
  2980.        CHARSET 'a',"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  2981. \end{verbatim}
  2982.  
  2983. \bb{ACHTUNG!} Das durch \tty{CHARSET} definierte Mapping greift nicht nur
  2984. beim Ablegen von Strings im Speicher, es greift auch bei Multi-Character-Konstanten,
  2985. also als ,,ASCII'' formulierten Integer-Konstanten.  Dies bedeutet, da"s
  2986. eine bereits modifizierte Umsetzungstabelle in den obigen Beispielen zu
  2987. anderen Ergebnissen f"uhren kann!
  2988.  
  2989. Mit der eingebauten Funktion \tty{CODEPAGE\_VAL} kann die "Ubersetzung
  2990. eines einzelnen Zeichens abgefragt werden.  F"ur nicht gemappte Zeichen
  2991. liefert die Funktion eine -1 zur"uck.
  2992.  
  2993. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2994.  
  2995. \subsection{CODEPAGE}
  2996. \ttindex{CODEPAGE}
  2997.  
  2998. {\em G"ultigkeit: alle Prozessoren}
  2999.  
  3000. Mit der \tty{CHARSET}-Anweisung hat man zwar beliebige Freiheiten in der
  3001. Zeichenzuordnung zwischen Entwicklungs- und Zielplattform, wenn auf der
  3002. Zielplattform jedoch verschiedene Zeichens"atze existieren, kann das
  3003. Umschalten zwischen diesen jedoch zu einer umst"andlichen Orgie von
  3004. \tty{CHARSET}-Kommandos werden.  Mit der \tty{CODEPAGE}-Anweisung kann
  3005. man jedoch mehrere Zeichentabellen vorhalten und zwischen diesen mit einem
  3006. Befehl umschalten.  Als Parameter erwartet \tty{CODEPAGE} ein oder zwei
  3007. Namen: zum einen den Namen der fortan zu benutzenden Tabelle, zum anderen
  3008. optional den Namen der Tabelle, die die initiale Belegung der Tabelle
  3009. vorgibt (dieser Parameter hat somit auch nur eine Bedeutung beim ersten
  3010. Umschalten auf eine Tabelle, bei der \asname{} sie automatisch anlegt).  Fehlt
  3011. der zweite Parameter, so ist die initiale Belegung der neuen Tabelle
  3012. gleich der vorher aktiven Tabelle.  Alle folgenden
  3013. \tty{CHARSET}-Anweisungen ver"andern {\em nur} die momentan aktive Tabelle.
  3014.  
  3015. Zu Beginn eines Durchlaufes wird von \asname{} automatisch eine einzelne
  3016. Zeichentabelle mit dem Namen \tty{STANDARD} erzeugt und 1:1 vorbelegt.
  3017. Verwendet man keine \tty{CODEPAGE}-Anweisungen, so beziehen sich alle mit
  3018. \tty{CHARSET} gemachten Einstellungen auf diese Tabelle.
  3019.  
  3020. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3021.  
  3022. \subsection{ENUM, NEXTENUM und ENUMCONF}
  3023. \ttindex{ENUM}
  3024. \ttindex{NEXTENUM}
  3025. \ttindex{ENUMCONF}
  3026.  
  3027. {\em G"ultigkeit: alle Prozessoren}
  3028.  
  3029. \tty{ENUM} dient analog zu dem entsprechenden Befehl in C dazu,
  3030. Aufz"ahlungstypen zu definieren, d.h. eine Reihe von Integer-Konstanten,
  3031. denen fortlaufende Werte (von 0 an beginnend) zugewiesen
  3032. werden. Als Parameter werden dabei die Namen der zu definierenden
  3033. Symbole angegeben, wie in dem folgenden Beispiel:
  3034. \begin{quote}{\tt
  3035.        ENUM    SymA,SymB,SymC}
  3036. \end{quote}
  3037. Dieser Befehl weist den Symbolen \tty{SymA}, \tty{SymB} und \tty{SymC}
  3038. die Werte 0, 1 und 2 zu.
  3039. \par
  3040. M"ochte man eine Aufz"ahlung "uber mehrere Zeilen verteilen, so
  3041. verwendet man ab der zweiten Zeile den Befehle \tty{NEXTENUM}
  3042. anstelle von \tty{ENUM}.  Der interne Z"ahler, der den Symbolen
  3043. der Aufz"ahlung fortlaufende Werte zuweist, wird dann nicht
  3044. wieder auf Null zur"uck gesetzt, wie in dem folgenden Fall:
  3045. \begin{verbatim}
  3046.        ENUM     Januar=1,Februar,Maerz,April,Mai,Juni
  3047.        NEXTENUM Juli,August,September,Oktober
  3048.        NEXTENUM November,Dezember
  3049. \end{verbatim}
  3050. An diesem Beispiel sieht man auch, da"s man einzelnen Symbolen
  3051. explizit Werte anstelle des aktuellen Z"ahlerstandes zuweisen
  3052. kann.  Der interne Z"ahler wird anhand dieses Wertes auch
  3053. aktualisiert.
  3054.  
  3055. Die Definition von Symbolen mit \tty{ENUM} gleicht einer Definition
  3056. mit \tty{EQU}, d.h. es ist nicht m"oglich, einem Symbol einen neuen
  3057. Wert zuzuweisen.
  3058.  
  3059. Die \tty{ENUMCONF}-Anweisung erlaubt das Verhalten von \tty{ENUM}
  3060. zu beeinflussen.  \tty{ENUMCONF} akzeptiert ein oder zwei
  3061. Argumente, wobei das erste Argument immer der Wert ist, um den
  3062. der interne Z"ahler pro Symbol in einer Aufz"ahlung hochgez"ahlt
  3063. wird.  Mit einem
  3064. \begin{verbatim}
  3065.      ENUMCONF 2
  3066. \end{verbatim}
  3067. werden den Symbolen also zum Beispiel die Werte 0,2,4,6...
  3068. anstelle 0,1,2,3... zugewiesen.
  3069.  
  3070. Das zweite (optionale) Argument von \tty{ENUMCONF} bestimmt,
  3071. welchen Adre"sraum die Symbole zugeordnet werden.  Per Default
  3072. sind mit \tty{ENUM} definierte Symbole typenlos, man kann aber
  3073. zum Beispiel mit einem
  3074. \begin{verbatim}
  3075.      ENUMCONF 1,CODE
  3076. \end{verbatim}  
  3077. bestimmen, da"s sie im Instruktions-Adre"sraum liegen sollen.  Die
  3078. Namen der Adre"sr"aume sind die gleichen wie beim
  3079. \tty{SEGMENT}-Befehl (\ref{SEGMENT}), zus"atzlich ist als
  3080. Argument ein \tty{NOTHING} erlaubt, um wieder typenlose Symbole
  3081. zu erzeugen.
  3082.  
  3083. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3084.  
  3085. \subsection{PUSHV und POPV}
  3086. \ttindex{PUSHV}\ttindex{POPV}
  3087.  
  3088. {\em G"ultigkeit: alle Prozessoren}
  3089.  
  3090. Mit \tty{PUSHV} und \tty{POPV} ist es m"oglich, den Wert von (nicht
  3091. Makro-lokalen) Symbolen tempor"ar zu speichern und zu einem sp"ateren
  3092. Zeitpunkt wiederherzustellen.  Die Speicherung erfolgt auf {\em Stacks},
  3093. d.h. Last-In-First-Out-Speichern.  Ein Stack hat einen Namen, der den
  3094. allgemeinen Symbolkonventionen gen"ugen mu"s, und existiert so lange,
  3095. wie er mindestens ein Element enth"alt: Ein bisher nicht existierender
  3096. Stack wird bei \tty{PUSHV} automatisch angelegt, ein durch \tty{POPV} leer
  3097. werdender Stack wird automatisch wieder aufgel"ost.  Der Name des Stacks,
  3098. auf den Symbole abgelegt und von dem sie wieder abgeholt werden sollen,
  3099. ist der erste Parameter von \tty{PUSHV} bzw. \tty{POPV}, danach folgt
  3100. eine beliebige Menge von Symbolen als weitere Parameter.  Alle in der
  3101. Liste aufgef"uhrten Symbole m"ussen bereits existieren, es ist also
  3102. {\em nicht} m"oglich, mit einem \tty{POPV}-Befehl implizit neue Symbole
  3103. zu definieren.
  3104. \par
  3105. Stacks stellen eine globale Ressource dar, d.h. ihre Namen sind
  3106. nicht lokal zu Sektionen.
  3107. \par
  3108. Wichtig ist, da"s die Variablenliste {\em immer} von links nach rechts
  3109. abgearbeitet wird.  Wer also mehrere Variablen mit \tty{POPV} von einem
  3110. Stack herunter holen will, mu"s diese in genau umgekehrter Reihenfolge
  3111. zum entsprechenden \tty{PUSHV} angeben!
  3112. \par
  3113. Der Name des Stacks kann auch weggelassen werden, etwa so:
  3114. \begin{verbatim}
  3115.        pushv   ,var1,var2,var3
  3116.        .
  3117.        .
  3118.        popv    ,var3,var2,var1
  3119. \end{verbatim}
  3120. \asname{} verwendet dann einen internen, vordefinierten Default-Stack.
  3121. \par
  3122. Nach Ende eines Durchlaufes "uberpr"uft \asname{}, ob noch Stacks existieren,
  3123. die nicht leer sind, und gibt deren Namen sowie ,,F"ullstand'' aus.  Mit
  3124. diesen Warnungen kann man herausfinden, ob an irgendeiner Stelle die
  3125. \tty{PUSHV}'s und \tty{POPV}'s nicht paarig sind.  Es ist jedoch in
  3126. keinem Fall m"oglich, Symbolwerte in einem Stack "uber mehrere Durchl"aufe
  3127. hinwegzuretten: Zu Beginn eines Durchlaufes werden alle Stacks geleert!
  3128.  
  3129. %%---------------------------------------------------------------------------
  3130.  
  3131. \section{Codebeeinflussung}
  3132.  
  3133. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3134.  
  3135. \subsection{ORG}
  3136. \label{SectORG}\ttindex{ORG}
  3137.  
  3138. {\em G"ultigkeit: alle Prozessoren}
  3139.  
  3140. \tty{ORG} erlaubt es, den Assembler-internen Adre"sz"ahler mit einem neuen
  3141. Wert zu besetzen.  Der Wertebereich ist vom momentan gew"ahlten Segment
  3142. und vom Prozessortyp abh"angig (Tabelle \ref{TabORG}).
  3143. Die untere Grenze ist dabei immer 0; die obere Grenze der angegebene Wert
  3144. minus eins.
  3145. \par
  3146. Falls in einer Familie verschiedene Varianten unterschiedlich
  3147. gro"se Adre"sr"aume haben, ist jeweils der maximale Raum aufgef"uhrt.
  3148. \par
  3149. ORG wird in erster Linie ben"otigt, um dem Code eine neue Startadresse
  3150. zu geben und damit verschiedene, nicht zusammenh"angende Codest"ucke in
  3151. einer Quelldatei unterzubringen.  Sofern nicht in einem Feld explizit anders
  3152. angegeben, ist die vorgegebene Startadresse in einem Segment (d.h. die ohne
  3153. {\tt ORG} angenommene) immer 0.
  3154. \par
  3155. {\bf WICHTIG:} Falls auch mit dem \tty{PHASE}-Befehl gearbeitet
  3156. wird, mu"s ber"ucksichtigt werden, da"s das Argument von \tty{ORG}
  3157. immer die {\em Ladeadresse} des Codes ist, nicht die {\em
  3158. Ausf"uhrungsadresse}.  Ausdr"ucke, die sich mit dem \$- oder
  3159. \*-Symbol auf den aktuellen Programmz"ahler beziehen, liefern
  3160. aber die {\em Ausf"uhrungsadresse} des Codes und f"uhren als
  3161. Argument von \tty{ORG} nicht zum gew"unschten Ergebnis.  In
  3162. solchen F"allen ist die \tty{RORG}-Anweisung (\ref{SectRORG}) das
  3163. Mittel der Wahl.
  3164. \hfuzz=60pt
  3165. \begin{longtable}{|l|c|c|c|c|c|c|c|c|c|c|}
  3166. \hline
  3167. \tin{Ziel} & \tin{CODE} & \tin{DATA} & \tin{I-}   & \tin{X-}   & \tin{Y-}   & \tin{BIT-} & \tin{IO} & \tin{REG} & \tin{ROM-} & \tin{EE-} \\
  3168.           &            &            & \tin{DATA} & \tin{DATA} & \tin{DATA} & \tin{DATA} &          &           & \tin{DATA} & \tin{DATA} \\
  3169. \hline
  3170. \hline
  3171. \endhead
  3172. \input{../doc_COM/taborg.tex}
  3173. \\ \hline
  3174. \multicolumn{11}{|l|}{$^{1}$ Initialwert 80h. } \\
  3175. \multicolumn{11}{|l|}{  Da der 8051 kein RAM jenseits 80h hat, mu"s der Initialwert f"ur den 8051} \\
  3176. \multicolumn{11}{|l|}{  als Zielprozessor auf jeden Fall mit \tty{ORG} angepa"st werden!} \\
  3177. \hline
  3178. \multicolumn{11}{|l|}{$^{2}$ Da der Z180 weiterhin logisch nur 64K ansprechen kann, ist der} \\
  3179. \multicolumn{11}{|l|}{ganze Adre"sraum nur mittels \tty{PHASE}-Anweisungen erreichbar!} \\
  3180. \hline
  3181. \multicolumn{11}{|l|}{$^{3}$ Initialwert 400h.} \\
  3182. \hline
  3183. \multicolumn{11}{|l|}{$^{4}$ Initialwert 800h bzw. 0C00h} \\
  3184. \hline
  3185. \multicolumn{11}{|l|}{$^{5}$ Bereich f"ur Programmcode auf 1 MByte begrenzt} \\
  3186. \hline
  3187. \multicolumn{11}{|l|}{$^{6}$ Gr"o"se ist vom Zielprozessor abh"angig} \\
  3188. \hline
  3189. \multicolumn{11}{|l|}{$^{7}$ Gr"o"se und Verf"ugbarkeit sind vom Zielprozessor abh"angig} \\
  3190. \hline
  3191. \multicolumn{11}{|l|}{$^{8}$ Nur auf Varianten mit \tty{MOVX}-Anweisung} \\
  3192. \hline
  3193. \multicolumn{11}{|l|}{$^{9}$ typabh"angig} \\
  3194. \hline
  3195. \multicolumn{11}{|l|}{$^{10}$ modellabh"angig} \\
  3196. \hline
  3197. \caption{Adre"sbereiche f"ur \tty{ORG}}
  3198. \label{TabORG}
  3199. \end{longtable}
  3200. \hfuzz=0pt
  3201.  
  3202. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3203.  
  3204. \subsection{RORG}
  3205. \label{SectRORG}
  3206. \ttindex{RORG}
  3207.  
  3208. {\em G"ultigkeit: alle Prozessoren}
  3209.  
  3210. \tty{RORG} setzt wie \tty{ORG} den Programmz"ahler neu, erwartet
  3211. als Argument allerdings keine absolute Adresse, sondern einen
  3212. relativen Wert (positiv oder negativ), der zum Programmz"ahler
  3213. addiert wird.  Eine Anwendungsm"oglichkeit ist das Freilassen
  3214. einer bestimmten Menge von Adre"sraum, oder die Anwendung in
  3215. Code-Teilen, die an mehreren Stellen (z.B. via Makros oder
  3216. Includes) eingebunden werden und lageunabh"angig arbeiten sollen.
  3217. Eine weitere Anwendungsm"oglichkeit ergibt sich in Code, der eine
  3218. Ausf"uhrungsadresse unterschiedlich zur Ladeadresse hat (d.h. es
  3219. wird mit der \tty{PHASE}-Anweisung gearbeitet).  Es gibt kein
  3220. Symbol, "uber das man in so einer Situation auf die aktuelle
  3221. {\em Ladeadresse} zugreifen kann, aber mittels \tty{RORG} kann man
  3222. sich indirekt darauf beziehen.
  3223.  
  3224. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3225.  
  3226. \subsection{CPU}
  3227. \label{SectCPU}
  3228. \ttindex{CPU}
  3229.  
  3230. {\em G"ultigkeit: alle Prozessoren}
  3231.  
  3232. Mit diesem Befehl wird festgelegt, f"ur welchen Prozessor im weiteren
  3233. Code erzeugt werden soll.  Die Befehle der anderen Prozessorfamilien
  3234. sind dann nicht greifbar und erzeugen eine Fehlermeldung!
  3235. \par
  3236. Die Prozessoren k"onnen grob in Familien unterschieden werden, in den
  3237. Familien dienen unterschiedliche Typen noch einmal zur Feinunterscheidung:
  3238. %%-----------
  3239. \begin{quote}
  3240. \begin{tabbing}
  3241. \hspace{0.7cm} \= \kill
  3242. a) \> 68008 $\rightarrow$ 68000 $\rightarrow$ 68010 $\rightarrow$ 68012 $\rightarrow$ \\
  3243.   \> MCF5202 $\rightarrow$ MCF5204 $\rightarrow$ MCF5206 $\rightarrow$ MCF5208$\rightarrow$ \\
  3244.   \> MCF52274 $\rightarrow$ MCF52277 $\rightarrow$ MCF5307 $\rightarrow$ MCF5329 $\rightarrow$ MCF5373 $\rightarrow$ \\
  3245.   \> MCF5407 $\rightarrow$ MCF5470 $\rightarrow$ MCF5471 $\rightarrow$ MCF5472 $\rightarrow$ MCF5473 $\rightarrow$ \\
  3246.   \> MCF5474 $\rightarrow$ MCF5475 $\rightarrow$ MCF51QM $\rightarrow$ \\
  3247.   \> 68332 $\rightarrow$ 68340 $\rightarrow$ 68360 $\rightarrow$ \\
  3248.   \> 68020 $\rightarrow$ 68030 $\rightarrow$ 68040
  3249. \end{tabbing}
  3250. \end{quote}
  3251. In dieser Familie liegen die Unterschiede in hinzukommenden Befehlen
  3252. und Adressierungsarten (ab 68020).  Eine kleine Ausnahme stellt der
  3253. Schritt zum 68030 dar, dem 2 Befehle fehlen: \tty{CALLM} und \tty{RTM}.
  3254. Die drei Vertreter der 683xx-Familie haben den gleichen Prozessorkern (eine
  3255. leicht abgemagerte 68020-CPU), jedoch v"ollig unterschiedliche Peripherie.
  3256. MCF5xxx repr"asentiert verschiedene ColdFire-Varianten von Motorola/Freescale/NXP,
  3257. zum 680x0 bin"ar abw"artskompatible RISC-Prozesoren. Beim 68040 kommen die zus"atzlichen
  3258. Steuerregister (via \tty{MOVEC} erreichbar) f"ur On-Chip-MMU und Caches
  3259. sowie einige Systembefehle f"ur selbige hinzu.
  3260. %%-----------
  3261. \begin{quote}
  3262. b) 56000 $\longrightarrow$ 56002 $\longrightarrow$ 56300
  3263. \end{quote}
  3264. W"ahrend der 56002 nur Befehle zum Inkrementieren und Dekrementieren der
  3265. Akkus erg"anzt, ist der 56300-Kern schon fast ein neuer Prozessor: Er
  3266. vergr"o"sert alle Adre"sr"aume von 64K-W"ortern auf 16M und verdoppelt fast
  3267. die Anzahl der Befehle.
  3268. %%-----------
  3269. \begin{quote}
  3270. c) PPC403 $\rightarrow$ PPC403GC $\rightarrow$ MPC505 $\rightarrow$ MPC601 $\rightarrow$ MPC821 $\rightarrow$ RS6000
  3271. \end{quote}
  3272. Der PCC403 ist eine abgespeckte Version der PowerPC-Linie ohne
  3273. Gleitkommaeinheit, demzufolge sind s"amtliche Gleitkommabefehle
  3274. bei ihm gesperrt; daf"ur sind einige Mikrocontroller-spezifische
  3275. Befehle enthalten, die er als einziges Mitglied in dieser Familie
  3276. kennt.  Die GC-Variante des PPC403 hat zus"atzlich eine MMU und deshalb
  3277. einige Befehle zu deren Steuerung mehr.  Der MPC505 (eine Mikrokontroller-Variante mit FPU)
  3278. unterscheidet sich solange vom 601er nur in den Peripherieregistern,
  3279. wie ich es nicht besser wei"s - \cite{Mot505} h"alt sich da noch etwas bedeckt...
  3280. Die RS6000-Reihe kennt noch einige Befehle mehr (die auf vielen
  3281. 601er-Systemen emuliert werden, um vollst"andige Kompatibilit"at
  3282. herzustellen), au"serdem verwendet IBM z.T. andere Mnemonics f"ur
  3283. diese reinen Workstation-Prozessoren, als Remineszenz an die
  3284. 370er-Gro"srechner...
  3285. %%-----------
  3286. \begin{quote}
  3287. d) IBM5100, IBM5110, IBM5120
  3288. \end{quote}
  3289. Diese drei Typen referenzieren aktuell alle auf den gleichen (PALM-)
  3290. Prozessorkern.
  3291. %%-----------
  3292. \begin{quote}
  3293. e) MCORE
  3294. \end{quote}
  3295. %%-----------
  3296. \begin{quote}
  3297. f) XGATE
  3298. \end{quote}
  3299. %%-----------
  3300. \begin{quote}
  3301. g) 6800 $\rightarrow$ 6801 $\rightarrow$ 6301 $\rightarrow$ 6811
  3302. \end{quote}
  3303. W"ahrend der 6301 nur einige neue Befehle definiert (und der 6301
  3304. noch ein paar mehr), bietet der 6811 neben weiteren Befehlen ein
  3305. zweites Indexregister Y zur Adressierung.
  3306. %%-----------
  3307. \begin{quote}
  3308. h) 6809/6309 und 6805/68HC08/68HCS08
  3309. \end{quote}
  3310. Diese Prozessoren sind zwar teilweise Quellcode-kompatibel zu den
  3311. anderen 68xx-ern, haben aber ein anderes Bin"arcode-Format und einen
  3312. deutlich eingeschr"ankteren (6805) bzw. erweiterten (6809) Befehlssatz.
  3313. Der 6309 ist eine CMOS-Version des 6809, die zwar offiziell
  3314. nur kompatibel zum 6809 ist, inoffiziell aber mehr Register und
  3315. deutlich mehr Befehle besitzt (siehe \cite{Kaku}).
  3316. %%-----------
  3317. \begin{quote}
  3318. i) 68HC12 $\longrightarrow$ 68HC12X
  3319. \end{quote}
  3320. Der 12X-Kern bietet eine Reihe neuer Befehle, bzw. bestehende Befehle
  3321. wurden um neue Adressierungsarten erg"anzt.
  3322. %%-----------
  3323. \begin{quote}
  3324. j) S912ZVC19F0MKH, S912ZVC19F0MLF,\\
  3325.   S912ZVCA19F0MKH, S912ZVCA19F0MLF,\\
  3326.   S912ZVCA19F0WKH, S912ZVH128F2CLQ,\\
  3327.   S912ZVH128F2CLL, S912ZVH64F2CLQ,\\
  3328.   S912ZVHY64F1CLQ, S912ZVHY32F1CLQ,\\
  3329.   S912ZVHY64F1CLL, S912ZVHY32F1CLL,\\
  3330.   S912ZVHL64F1CLQ, S912ZVHL32F1CLQ,\\
  3331.   S912ZVHL64F1CLL, S912ZVHL32F1CLL,\\
  3332.   S912ZVFP64F1CLQ, S912ZVFP64F1CLL,\\
  3333.   S912ZVH128F2VLQ, S912ZVH128F2VLL,\\
  3334.   S912ZVH64F2VLQ, S912ZVHY64F1VLQ,\\
  3335.   S912ZVHY32F1VLQ, S912ZVHY64F1VL,\\
  3336.   S912ZVHY32F1VLL, S912ZVHL64F1VLQ
  3337. \end{quote}
  3338. Alle Derivate beinhalten den gleichen Prozessorkern und den
  3339. gleichen Befehlssatz, lediglich die on-Chip-Peripherie und
  3340. die Menge eingebauten Speichers (RAM, Flash-ROM, EEPROM)
  3341. variieren.
  3342. %%-----------
  3343. \begin{quote}
  3344. k) 68HC16
  3345. \end{quote}
  3346. %%-----------
  3347. \begin{quote}
  3348. l) 052001
  3349. \end{quote}
  3350. Dieser Baustein ist eine Eigenentwicklung von Konami und in
  3351. Architektur und Befehlssatz an den Motorola 6809 angelehnt.
  3352. Er ist jedoch nicht bin"arkompatibel und stellt auch nicht
  3353. alle Befehle und Adressierungsarten des Vorbilds zur Verf"ugung.
  3354. %%-----------
  3355. \begin{quote}
  3356. m) HD6413308 $\longrightarrow$ HD6413309
  3357. \end{quote}
  3358. Diese beiden Namen repr"asentieren die 300er und 300H-Varianten der
  3359. H8-Familie; die H-Version besitzt dabei einen gr"o"seren Adre"sraum
  3360. (16 Mbyte statt 64Kbyte), doppelt so breite Register (32 Bit) und
  3361. kennt einige zus"atzliche Befehle und Adressierungsarten.  Trotzdem
  3362. ist sie bin"ar aufw"artskompatibel.
  3363. %%-----------
  3364. \begin{quote}
  3365. n) HD6475328 $\longrightarrow$ HD6475348 $\longrightarrow$
  3366.   HD6475368 $\longrightarrow$ HD6475388
  3367. \end{quote}
  3368. Diese Prozessoren besitzen alle den gleichen CPU-Kern; Die unterschiedlichen
  3369. Typen dienen lediglich der Einbindung des korrekten Registersatzes
  3370. in der Datei \tty{REG53X.INC}.
  3371. %%-----------
  3372. \begin{quote}
  3373. o) SH7000 $\longrightarrow$ SH7600 $\longrightarrow$ SH7700
  3374. \end{quote}
  3375. Der Prozessorkern des 7600ers bietet eine Handvoll Befehle mehr, die
  3376. L"ucken im Befehlssatz des 7000ers schlie"sen (verz"ogerte, bedingte
  3377. sowie relative und indirekte Spr"unge, Multiplikationen mit 32-Bit-Operanden
  3378. sowie Multiplizier/Addier-Befehle).  Die 7700er-Reihe (auch als SH3
  3379. gel"aufig) bietet weiterhin eine zweite Registerbank, bessere
  3380. Schiebebefehle sowie Befehle zur Cache-Steuerung.
  3381. %%-----------
  3382. \begin{quote}
  3383. p)HD614023 $\longrightarrow$ HD614043 $\longrightarrow$ HD614081
  3384. \end{quote}
  3385. Diese drei Varianten der HMCS400-Serie unterscheiden sich in der
  3386. Gr"o"se des internen ROM- und RAM-Speichers.
  3387. %%-----------
  3388. \begin{quote}
  3389. q) HD641016
  3390. \end{quote}
  3391. Dies ist aktuell das einzige Target mit H16-Kern.
  3392. %%-----------
  3393. \begin{quote}
  3394. r) 6502 $\rightarrow$ 65(S)C02 $\rightarrow$ 65CE02 / W65C02S /
  3395.   65C19 / MELPS740 / HUC6280 / 6502UNDOC
  3396. \end{quote}
  3397. Die CMOS-Version definiert einige zus"atzliche Befehle, au"serdem sind
  3398. bei einigen Befehlen Adressierungsarten hinzugekommen, die beim 6502
  3399. nicht m"oglich waren.  Der W65SC02 erg"anzt den
  3400. 65C02-Befehlssatz um zwei Befehle, mit denen die Low-Power-Modi
  3401. der CPU feiner eingestellt werden k"onnen.  Dem 65SC02 fehlen die
  3402. Bitmanipulationsbefehle des 65C02.  Der 65CE02 erg"anzt Sprungbefehle
  3403. mit 16-Bit-Displacement, ein Z-Register, einen 16-bittigen Stack-Pointer,
  3404. eine Reihe neuer Befehle und eine programmierbare Base-Page.
  3405.  
  3406. Der 65C19 ist {\em nicht} bin"ar aufw"artskompatibel zum
  3407. originalen 6502!  Einige Adressierungsarten wurden durch andere
  3408. ersetzt.  Des weiteren enth"alt dieser Prozessor
  3409. Befehlssatz-Erweiterungen, die die Implementierung digitaler
  3410. Signalverarbeitung erleichtern.
  3411.  
  3412. Die Mitsubishi-Mikrokontroller dagegen erweitern den
  3413. 6502-Befehlssatz in erster Linie um Bitoperationen und
  3414. Multiplikations-/Divisionsbefehle.  Bis auf den unbedingten Sprung und
  3415. Befehle zur Inkrementierung/Dekremetierung des Akkumulators sind die
  3416. Erweiterungen disjunkt.
  3417.  
  3418. Das herausstechendste Merkmal des HuC 6280 ist der gr"o"sere
  3419. Adre"sraum von 2 MByte anstelle 64 KByte, der durch eingebaute
  3420. Bankregister erreicht wird.   Des weiteren existieren einige
  3421. Sonderbefehle zur Kommunikation mit dem Videoprozessor (dieser
  3422. Chip wurde in Videospielen eingesetzt) und zum Kopieren von
  3423. Speicherbereichen.
  3424.  
  3425. Mit dem Prozessortyp 6502UNDOC sind die ,,undokumentierten''
  3426. 6502-Befehle erreichbar, d.h. die Operationen, die sich bei der Verwendung
  3427. nicht als Befehle definierter Bitkombinationen im Opcode ergeben.  Die von
  3428. \asname{} unterst"utzten Varianten sind im Kapitel mit den prozessorspezifischen
  3429. Hinweisen beschrieben.
  3430. %%-----------
  3431. \begin{quote}
  3432. s) MELPS7700, 65816
  3433. \end{quote}
  3434. Neben einer ,,16-Bit-Version'' des 6502-Befehlssatzes bieten diese
  3435. Prozessoren einige Befehlserweiterungen.  Diese sind aber gr"o"serenteils
  3436. disjunkt, da sie sich an ihren jeweiligen 8-bittigen Vorbildern (65C02
  3437. bzw. MELPS-740) orientieren.  Z.T.~werden auch andere Mnemonics f"ur
  3438. gleiche Befehle verwendet.
  3439. %%-----------
  3440. \begin{quote}
  3441. t) PPS-4
  3442. \end{quote}
  3443. %%-----------
  3444. \begin{quote}
  3445. u) MELPS4500
  3446. \end{quote}
  3447. %%-----------
  3448. \begin{quote}
  3449. v) M16
  3450. \end{quote}
  3451. %%-----------
  3452. \begin{quote}
  3453. w) M16C
  3454. \end{quote}
  3455. %%-----------
  3456. \begin{quote}
  3457. x) PDP-11/03, PDP-11/04, PDP-11/05, PDP-11/10, \\
  3458.   PDP-11/15, PDP-11/20, PDP-11/23, PDP-11/24, \\
  3459.   PDP-11/34, PDP-11/35, PDP-11/40, PDP-11/44, \\
  3460.   PDP-11/45, PDP-11/50, MicroPDP-11/53, \\
  3461.   PDP-11/55, PDP-11/60, PDP-11/70, \\
  3462.   MicroPDP-11/73, MicroPDP-11/83, PDP-11/84, \\
  3463.   MicroPDP-11/93, PDP-11/94, T-11
  3464. \end{quote}
  3465. Die Modelle der PDP-11-Serien unterscheiden sich im
  3466. Befehlssatz (sowohl dem eingebauten als auch den verf"ugbaren
  3467. Erweiterungen) als auch im verf"ugbaren Adre"sraum (64, 256
  3468. oder 4096 KByte).
  3469. %%-----------
  3470. \begin{quote}
  3471. y) WD16
  3472. \end{quote}
  3473. Der WD16 benutzt den gleichen Prozessor wie der LSI-11,
  3474. lediglich mit anderem Mikrocode.  Demensprechend sind
  3475. Registersatz und Adressierungsarten zur PDP-11 identisch,
  3476. der Befehlsumfang ist aber leicht unterschiedlich und
  3477. auf der PDP-11 in gleicher Form vorhandene Maschinenbefehle
  3478. haben durchg"angig andere Kodierungen.
  3479. %%-----------
  3480. \begin{quote}
  3481. z) CP-3F, LP8000, M380
  3482. \end{quote}
  3483. Das Prozessorelement des Chipsatzes ist von AEG/Olympia, GI
  3484. und SGS-Ates unter den jeweiligen Namen vertrieben worden.
  3485. Im Befehlssatz und den Adre"sr"aumen bestehen keine Unterschiede.
  3486. %%-----------
  3487. \begin{quote}
  3488. aa) 4004 $\rightarrow$ 4040
  3489. \end{quote}
  3490. Der 4040 besitzt gegen"uber seinem Vorg"anger ein gutes Dutzend
  3491. zus"atzlicher Maschineninstruktionen.
  3492. %%-----------
  3493. \begin{quote}
  3494. ab) 8008 $\rightarrow$ 8008NEW
  3495. \end{quote}
  3496. Intel hat 1975 die Mnemonics des umdefiniert, die zweite Variante spiegelt
  3497. diesen neuen Befehlssatz wieder.  Eine gleichzeitige Unterst"utzung beider
  3498. Varianten war nicht m"oglich, da teilweise "Uberschneidungen vorliegen.
  3499. %%-----------
  3500. \begin{quote}
  3501. ac) 8021, 8022, \\
  3502.    8401, 8411, 8421, 8461, \\
  3503.    8039, (MSM)80C39, 8048, (MSM)80C48, 8041, 8042, \\
  3504.    80C382
  3505. \end{quote}
  3506. Bei den ROM-losen Versionen 8039 und 80C39 sind die Befehle verboten,
  3507. die den BUS (Port 0) ansprechen.  Der 8021 und 8022 sind Sonderversionen
  3508. mit stark abgemagertem Befehlssatz, wof"ur der 8022 zwei A/D-Wandler
  3509. und die dazugeh"origen Steuerbefehle enth"alt.  MAB8401 bis 8461 sind von
  3510. Philips entwickelte Derivate, die in ihrem Befehssatz irgendwo zwischen
  3511. dem 8021/8022 und einem 'vollst"andigen'' 8048 stehen.  Daf"ur verf"ugen
  3512. sie "uber serielle Ports und je nach Variante bis zu 8 KByte Programmspeicher.
  3513.  
  3514. Die CMOS-Versionen lassen
  3515. sich mit dem \tty{IDL}- bzw. \tty{HALT}-Befehl in einen Ruhezustand niedriger
  3516. Stromaufnahme "uberf"uhren.  Der 8041 und 8042 haben einige Zusatzbefehle zur
  3517. Steuerung der Busschnittstelle, daf"ur fehlen aber einige andere Befehle.
  3518. Beim 8041, 8042, 84x1, 8021 und 8022 ist der Programmadre"sraum nicht
  3519. extern erweiterbar, weshalb \asname{} das Codesegment bei diesen Prozessoren
  3520. auf die Gr"o"se des internen ROM beschr"ankt.  Der (SAB)80C382 ist eine von
  3521. Siemens speziell f"ur Telefone entwickelte Variante, die ebenfalls
  3522. einen \tty{HALT}-Befehl kennt sowie \tty{DJNZ} und \tty{DEC} auch
  3523. mit indirekter Adressierung erlaubt.  Im Gegenzug wurden einige
  3524. Befehle des 'normalen' 8048 entfernt. Die OKI-Varienaten (MSM...)
  3525. unterst"utzen ebenfalls \tty{DJNZ} und \tty{DEC} mit indirekter
  3526. Adressierung, sowie eine erweiterte Steuerung der
  3527. Power-Down-Modi, ohne den Basis-MCS-48-Befehlssatz zu
  3528. beschneiden.
  3529. %%-----------
  3530. \begin{quote}
  3531. \begin{tabbing}
  3532. \hspace{0.7cm} \= \kill
  3533. ad) \> 87C750 $\rightarrow$ 8051, 8052, 80C320, 80C501, 80C502, \\
  3534.    \> 80C504, 80515, und 80517 \\
  3535.    \> $\rightarrow$ 80C390 \\
  3536.    \> $\rightarrow$ 80C251
  3537. \end{tabbing}
  3538. \end{quote}
  3539. Der 87C750 kann nur max. 2 Kbyte Programmspeicher adressieren, weshalb
  3540. die \tty{LCALL}- und \tty{LJMP}-Befehle bei ihm fehlen.  Zwischen den
  3541. acht mittleren Prozessoren nimmt \asname{} selber "uberhaupt keine Unterscheidung
  3542. vor, sondern verwaltet den Unterschied lediglich in der Variablen
  3543. \tty{MOMCPU} (s.u.), die man mit \tty{IF}-Befehlen abfragen kann.  Eine
  3544. Ausnahme stellt lediglich der 80C504, der in seiner momentanen Form noch einen
  3545. Maskenfehler zeigt, wenn eine \tty{AJMP}- oder \tty{ACALL}-Anweisung auf der
  3546. vorletzten Adresse einer 2K-Seite steht.  \asname{} benutzt in einem solchen
  3547. Fall automatisch lange Sprungbefehle bzw. gibt eine Fehlermeldung aus.  Der
  3548. 80C251 hingegen stellt einen drastischen Fortschritt in Richtung 16/32 Bit,
  3549. gr"o"serer Adre"sr"aume und orthogonalerem Befehlssatz dar.  Den 80C390
  3550. k"onnte man vielleicht als die 'kleine L"osung' bezeichnen:  Dallas
  3551. Semiconductor hat den Befehlssatz und die Architektur nur so weit
  3552. ver"andert, wie es f"ur die 16 MByte gro"sen Adre"sr"aume notwendig war.
  3553. %%-----------
  3554. \begin{quote}
  3555. ae) 8096 $\rightarrow$ 80196 $\rightarrow$ 80196N $\rightarrow$ 80296
  3556. \end{quote}
  3557. Neben einem anderen Satz von SFRs (die "ubrigens von Unterversion zu
  3558. Unterversion stark differieren) kennt der 80196 eine Reihe von
  3559. zus"atzlichen Befehlen und kennt einen ,,Windowing''-Mechanismus, um
  3560. das gr"o"sere interne RAM anzusprechen.  Die 80196N-Familie wiederum
  3561. erweitert den Adre"sraum auf 16 Mbyte und f"uhrt eine Reihe von
  3562. Befehlen ein, mit denen man auf Adressen jenseits 64 Kbyte zugreifen
  3563. kann.  Der 80296 erweitert den CPU-Kern um Befehle zur Signalverarbeitung
  3564. und ein zweites Windowing-Register, verzichtet jedoch auf den {\em
  3565. Peripheral Transaction Server} (PTS) und verliert damit wieder zwei
  3566. Maschinenbefehle.
  3567. %%-----------
  3568. \begin{quote}
  3569. af) 8080 $\rightarrow$ V30EMU $\rightarrow$ 8085 $\rightarrow$ 8085UNDOC
  3570. \end{quote}
  3571. Der 8085 kennt zus"atzlich die Befehle \tty{RIM} und \tty{SIM} zum Steuern der
  3572. Interruptmaske und der zwei I/O-Pins.  Der Typ {\tt 8085UNDOC} schaltet
  3573. zus"atzliche, nicht von Intel dokumentierte Befehle ein.  Diese Befehle
  3574. sind in Abschnitt \ref{8085Spec} dokumentiert.
  3575.  
  3576. {\tt V30EMU} als Ziel schaltet gegen"uber einem 8080 die Befehle {\tt RETEM}
  3577. und {\em CALLN} frei, mit denen die 8080-Emulation auf einem V20/V30/V40/V50
  3578. verlassen bzw. unterbrochen werden kann.
  3579. %%-----------
  3580. \begin{quote}
  3581. ag) 8088,8086 \\
  3582. $\rightarrow$ 80188,80186 \\
  3583. $\rightarrow$ V20,V30,V40,V50 \\
  3584. $\rightarrow$ V33,V53 \\
  3585. $\rightarrow$ V25,V35 \\
  3586. $\rightarrow$ V55 \\
  3587. $\rightarrow$ V55SC \\
  3588. $\rightarrow$ V55PI
  3589. \end{quote}
  3590. Prozessoren in der gleichen Zeile verf"ugen "uber den gleichen CPU-Kern und
  3591. damit den gleichen Befehlssatz.  Von Zeile zu Zeile kommen neue Befehle
  3592. hinzu, wobei die NEC-CPUs ausgehend vom 'V20-Basisbefehlssatz' jeweils "uber
  3593. unterschiedliche Erweiterungen verf"ugen.
  3594. %%-----------
  3595. \begin{quote}
  3596. ah) 80960
  3597. \end{quote}
  3598. %%-----------
  3599. \begin{quote}
  3600. ai) 8X300 $\rightarrow$ 8X305
  3601. \end{quote}
  3602. Der 8X305 besitzt eine Reihe zus"atzlicher Arbeitsregister, die dem
  3603. 8X300 fehlen und kann mit diesen auch zus"atzliche Operationen ausf"uhren,
  3604. wie das direkte Schreiben von 8-Bit-Werten auf Peripherieadressen.
  3605. %%-----------
  3606. \begin{quote}
  3607. aj) XAG1, XAG2, XAG3
  3608. \end{quote}
  3609. Diese Prozessoren unterscheiden sich nur in der Gr"o"se des eingebauten
  3610. ROMs, die in \tty{STDDEFXA.INC} definiert ist.
  3611. %%-----------
  3612. \begin{quote}
  3613. ak) AT90S1200, AT90S2313, AT90S2323, AT90S233, AT90S2343,\\
  3614.    AT90S4414, AT90S4433, AT90S4434, AT90S8515,\\
  3615.    AT90C8534, AT90S8535, ATTINY4, ATTINY5, ATTINY9,\\
  3616.    ATTINY10, ATTINY11, ATTINY12, ATTINY13, ATTINY13A,\\
  3617.    ATTINY15, ATTINY20, ATTINY24(A), ATTINY25,\\
  3618.    ATTINY26, ATTINY28, ATTINY40, ATTINY44(A),\\
  3619.    ATTINY45, ATTINY48, ATTINY84(A), ATTINY85,\\
  3620.    ATTINY87, ATTINY88, ATTINY102, ATTINY104,\\
  3621.    ATTINY167, ATTINY261, ATTINY261A, ATTINY43U,\\
  3622.    ATTINY441, ATTINY461, ATTINY461A, ATTINY828,\\
  3623.    ATTINY841, ATTINY861, ATTINY861A, ATTINY1634,\\
  3624.    ATTINY2313, ATTINY2313A, ATTINY4313, ATMEGA48,\\
  3625.    ATMEGA8, ATMEGA8515, ATMEGA8535, ATMEGA88,\\
  3626.    ATMEGA8U2, ATMEGA16U2, ATMEGA32U2,\\
  3627.    ATMEGA16U4, ATMEGA32U4, ATMEGA32U6, AT90USB646,\\
  3628.    AT90USB647, AT90USB1286, AT90USB1287, AT43USB355,\\
  3629.    ATMEGA16, ATMEGA161, ATMEGA162, ATMEGA163,\\
  3630.    ATMEGA164, ATMEGA165, ATMEGA168, ATMEGA169,\\
  3631.    ATMEGA32, ATMEGA323, ATMEGA324, ATMEGA325,\\
  3632.    ATMEGA3250, ATMEGA328, ATMEGA329, ATMEGA3290,\\
  3633.    ATMEGA406, ATMEGA64, ATMEGA640, ATMEGA644,\\
  3634.    ATMEGA644RFR2, ATMEGA645, ATMEGA6450,\\
  3635.    ATMEGA649, ATMEGA6490, ATMEGA103, ATMEGA128,\\
  3636.    ATMEGA1280, ATMEGA1281, ATMEGA1284,\\
  3637.    ATMEGA1284RFR2, ATMEGA2560, ATMEGA2561
  3638. \end{quote}
  3639. Die verschiedenen AVR-Varianten unterscheiden sich in erster Linie in
  3640. der Gr"o"se des On-Chip-Speichers (Flash, SRAM, EEPROM) und der integrierten
  3641. Peripherie (GPIO, Timer, UART, A/D-Wandler,...).  Die ATmegas bringen im
  3642. Vergleich zu den AT90...-Vorg"angern auch neue Maschinenbefehle
  3643. mit, den ATtinys fehlen wiederum die Multiplikationsbefehle.
  3644. %%-----------
  3645. \begin{quote}
  3646. al) AM29245 $\rightarrow$ AM29243 $\rightarrow$ AM29240 $\rightarrow$ AM29000
  3647. \end{quote}
  3648. Je weiter man sich in der Liste nach rechts bewegt, desto weniger
  3649. Befehle m"ussen in Software emuliert werden.  W"ahrend z.B. der 29245
  3650. noch nicht einmal einen Hardware-Multiplizierer besitzt, fehlen den
  3651. beiden Vertretern in der Mitte nur die Gleitkommabefehle.  Der 29000
  3652. dient dabei als ,,generischer'' Typ, der alle Befehle in Hardware versteht.
  3653. %%-----------
  3654. \begin{quote}
  3655. am) 80C166 $\longrightarrow$ 80C167,80C165,80C163
  3656. \end{quote}
  3657. 80C167 und 80C165/163 haben anstelle 256 Kbyte max. 16 Mbyte Adre"sraum,
  3658. au"serdem kennen sie einige zus"atzliche Befehle f"ur erweiterte
  3659. Adressierungsmodi sowie atomare Befehlssequenzen.  Untereinander
  3660. unterscheiden sich diese Prozessoren der ,,zweiten Generation'' nur in der
  3661. eingebauten Peripherie.
  3662. %%-----------
  3663. \begin{quote}
  3664. an) LR35902/GBZ80 $\rightarrow$ Z80 $\rightarrow$ Z80UNDOC \\
  3665.    $\rightarrow$ Z180 $\rightarrow$ Z380
  3666. \end{quote}
  3667. W"ahrend f"ur den Z180 nur die zus"atzlichen Befehle definiert sind
  3668. (d.h. die Z180-MMU findet noch keine Ber"ucksichtigung), besitzt der
  3669. Z380 32-Bit-Register, einen linearen 4Gbyte-Adre"sraum sowie neben
  3670. einer Reihe von Befehlserweiterungen, die den Befehlssatz deutlich
  3671. orthogonaler machen, neue Adressierungsmodi (Ansprechen der
  3672. Indexregisterh"alften, Stack-relativ).  Zu einem kleinen Teil existieren
  3673. diese Erweiterungen aber auch schon beim Z80 als undokumentierte
  3674. Befehle, die mit der Variante \tty{Z80UNDOC} zugeschaltet werden
  3675. k"onnen.  Eine Liste mit den zus"atzlichen Befehlen findet sich im
  3676. Kapitel mit den prozessorspezifischen Hinweisen.
  3677.  
  3678. Der im Gameboy verbaute Prozessor (offizielle Bezeichnung LR35902,
  3679. umgangssprachlich auch als ,,Gameboy-Z80'' bezeichnet) ist eine
  3680. Mischung aus Z80 und 8080.  Ihm fehlen die IX/IY-Register, der
  3681. I/O-Adre"sraum, die zweite Registerbank sowie eine Reihe von
  3682. 16-Bit-Befehlen.
  3683. %%-----------
  3684. \begin{quote}
  3685. ao) Z8601, Z8603, Z86C03, Z86E03, Z86C06, Z86E06, \\
  3686.    Z86C08, Z86C21, Z86E21, Z86C30, Z86C31, Z86C32 Z86C40 \\
  3687.    $\rightarrow$ Z88C00, Z88C01 \\
  3688.    $\rightarrow$ eZ8, Z8F0113, Z8F011A, Z8F0123, Z8F012A, \\
  3689.    Z8F0130, Z8F0131, Z8F0213, Z8F021A, Z8F0223, Z8F022A, \\
  3690.    Z8F0230, Z8F0231, Z8F0411, Z8F0412, Z8F0413, Z8F041A, \\
  3691.    Z8F0421, Z8F0422, Z8F0423, Z8F042A, Z8F0430, Z8F0431, \\
  3692.    Z8F0811, Z8F0812, Z8F0813, Z8F081A, Z8F0821, Z8F0822, \\
  3693.    Z8F0823, Z8F082A, Z8F0830, Z8F0831, Z8F0880, Z8F1232, \\
  3694.    Z8F1233, Z8F1621, Z8F1622, Z8F1680, Z8F1681, Z8F1682, \\
  3695.    Z8F2421, Z8F2422, Z8F2480, Z8F3221, Z8F3222, Z8F3281, \\
  3696.    Z8F3282, Z8F4821, Z8F4822, Z8F4823, Z8F6081, Z8F6082, \\
  3697.    Z8F6421, Z8F6422, Z8F6423, Z8F6481, Z8F6482
  3698. \end{quote}
  3699. Die Varianten mit Z8-Kern unterscheiden sich nur in
  3700. Speicherausbau und Peripherie, d.h. die Wahl hat auf den
  3701. unterst"utzten Befehlssatz keinen Effekt.  Deutlich anders sind
  3702. jedoch die Super8- und eZ8-Varianten, jeweils mit (in unterschiedliche
  3703. Richtungen) stark erweiterten Befehlss"atzen, die auch auf Quellcode-Ebene
  3704. nur g"o"stenteils aufw"arts-kompatibel sind.
  3705. %%-----------
  3706. \begin{quote}
  3707. ap) Z8001, Z8002, Z8003, Z8004
  3708. \end{quote}
  3709. "Uber die Wahl des Prozessors wird die Betriebsart (segmentiert f"ur
  3710. Z8001 und Z8003, nicht segmentiert f"ur Z8002 und Z8004) bestimmt.  Eine
  3711. Unterscheidung zwischen dem Z8001/8002 einerseits und Z8003/8004 andererseits
  3712. findet aktuell nicht statt.
  3713. %%-----------
  3714. \begin{quote}
  3715. aq) KCPSM, KCPSM3
  3716. \end{quote}
  3717. Bei beiden Prozessorkernen handelt es sich um keine eigenst"andigen
  3718. Bausteine, sondern Logik-Kerne f"ur Gate-Arrays der Firma Xilinx.  Die
  3719. 3er-Variante bietet einen gr"o"seren Adre"sraum sowie einige zus"atzliche
  3720. Instruktionen.  Es ist zu beachten, da"s sie nicht bin"ar
  3721. aufw"artskompatibel ist!
  3722. %%-----------
  3723. \begin{quote}
  3724. ar) MICO8\_05, MICO8\_V3, MICO8\_V31
  3725. \end{quote}
  3726. Leider hat Lattice die Maschinencodes des Mico8 mehrfach ge"andert, so
  3727. da"s verschiedene Targets notwendig wurden, um auch alte Designs weiter
  3728. zu unterst"utzen.  Die erste Variante entspricht der Variante, wie sie
  3729. im 2005er-Manual beschrieben wurde, die beiden anderen die Versionen 3.0
  3730. bzw. 3.1.
  3731. %%-----------
  3732. \begin{quote}
  3733. as) 96C141, 93C141
  3734. \end{quote}
  3735. Diese beiden Prozessoren repr"asentieren die beiden Varianten der
  3736. Prozessorfamilie: TLCS-900 und TLCS-900L.  Die Unterschiede dieser beiden
  3737. Varianten werden in Abschnitt \ref{TLCS900Spec} genauer beleuchtet.
  3738. %%-----------
  3739. \begin{quote}
  3740. at) 90C141
  3741. \end{quote}
  3742. %%-----------
  3743. \begin{quote}
  3744. au) 87C00, 87C20, 87C40, 87C70
  3745. \end{quote}
  3746. Die Prozessoren der TLCS-870-Reihe haben zwar den identischen CPU-Kern, je
  3747. nach Variante aber eine unterschiedliche Peripherieausstattung.  Zum
  3748. Teil liegen Register gleichen Namens auf unterschiedlichen Adressen.
  3749. Die Datei STDDEF87.INC benutzt analog zur MCS-51-Familie die hier
  3750. m"ogliche Unterscheidung, um automatisch den korrekten Symbolsatz
  3751. bereitzustellen.
  3752. %%-----------
  3753. av) TLCS-870/C
  3754. Momentan ist nur der Prozessorkern der TLCS-870/C-Familie implmentiert.
  3755. %%-----------
  3756. \begin{quote}
  3757. aw) 47C00 $\rightarrow$ 470C00 $\rightarrow$ 470AC00
  3758. \end{quote}
  3759. Diese drei Varianten der TLCS-47-Familie haben unterschiedlich gro"se
  3760. RAM-und ROM-Adre"sbereiche, wodurch jeweils einige Befehle zur
  3761. Bankumschaltung hinzukommen oder wegfallen.
  3762. %%-----------
  3763. \begin{quote}
  3764. ax) 97C241
  3765. \end{quote}
  3766. %%-----------
  3767. \begin{quote}
  3768. ay) TC9331
  3769. \end{quote}
  3770. %%-----------
  3771. \begin{quote}
  3772. az) 16C54 $\rightarrow$ 16C55 $\rightarrow$ 16C56 $\rightarrow$ 16C57
  3773. \end{quote}
  3774. Diese Prozessoren unterscheiden sich durch den verf"ugbaren
  3775. Adre"sraum im Programmspeicher, d.h. durch die Adresse, ab der
  3776. der \asname{} "Uberl"aufe anmeckert.
  3777. %%-----------
  3778. \begin{quote}
  3779. ba) 16C64, 16C84
  3780. \end{quote}
  3781. Analog zur MCS-51-Familie findet hier keine Unterscheidung im
  3782. Codegenerator statt, die unterschiedlichen Nummern dienen lediglich
  3783. der Einblendung der korrekten SFRs in STDDEF18.INC.
  3784. %%-----------
  3785. \begin{quote}
  3786. bb) 17C42
  3787. \end{quote}
  3788. %%-----------
  3789. \begin{quote}
  3790. bc) SX20, SX28
  3791. \end{quote}
  3792. Der SX20 steckt in einem kleineren Geh"ause, weshalb der Port C
  3793. fehlt.
  3794. %%-----------
  3795. \begin{quote}
  3796. bd) ST6200, ST6201, ST6203, ST6208, ST6209,\\
  3797.    ST6210, ST6215, ST6218, ST6220, ST6225,\\
  3798.    ST6228, ST6230, ST6232, ST6235, ST6240,\\
  3799.    ST6242, ST6245, ST6246, ST6252, ST6253,\\
  3800.    ST6255, ST6260, ST6262, ST6263, ST6265,\\
  3801.    ST6280, ST6285
  3802. \end{quote}
  3803. Die einzelnen ST6-Varianten differieren in der Menge der
  3804. On-Chip-Peripherie und dem eingebauten Speicher.
  3805. %%-----------
  3806. \begin{quote}
  3807. be) ST7 \\
  3808.    ST72251G1, ST72251G2, ST72311J2, ST72311J4, \\
  3809.    ST72321BR6, ST72321BR7, ST72321BR9, ST72325S4, \\
  3810.    ST72325S6, ST72325J7, ST72325R9, ST72324J6, \\
  3811.    ST72324K6, ST72324J4, ST72324K4, ST72324J2, \\
  3812.    ST72324JK21, ST72325S4, ST72325J7, ST72325R9, \\
  3813.    ST72521BR6, ST72521BM9, ST7232AK1, ST7232AK2, \\
  3814.    ST7232AJ1, ST7232AJ2, ST72361AR4, ST72361AR6, \\
  3815.    ST72361AR7, ST72361AR9, ST7FOXK1, ST7FOXK2, \\
  3816.    ST7LITES2Y0, ST7LITES5Y0, ST7LITE02Y0, \\
  3817.    ST7LITE05Y0, ST7LITE09Y0 \\
  3818.    ST7LITE10F1, ST7LITE15F1, ST7LITE19F1, \\
  3819.    ST7LITE10BF0, ST7LITE15BF0, ST7LITE15BF1, \\
  3820.    ST7LITE19BF0, ST7LITE19BF1, \\
  3821.    ST7LITE20F2, ST7LITE25F2, ST7LITE29F2, \\
  3822.    ST7LITE30F2, ST7LITE35F2, ST7LITE39F2, \\
  3823.    ST7LITE49K2, \\
  3824.    ST7MC1K2, ST7MC1K4, ST7MC2N6, ST7MC2S4, \\
  3825.    ST7MC2S6, ST7MC2S7, ST7MC2S9, ST7MC2R6, \\
  3826.    ST7MC2R7, ST7MC2R9, ST7MC2M9, \\
  3827.    STM8 \\
  3828.    STM8S001J3, STM8S003F3, STM8S003K3, STM8S005C6,\\
  3829.    STM8S005K6, STM8S007C8, STM8S103F2, STM8S103F3,\\
  3830.    STM8S103K3, STM8S105C4, STM8S105C6, STM8S105K4,\\
  3831.    STM8S105K6, STM8S105S4, STM8S105S6, STM8S207MB,\\
  3832.    STM8S207M8, STM8S207RB, STM8S207R8, STM8S207R6,\\
  3833.    STM8S207CB, STM8S207C8, STM8S207C6, STM8S207SB,\\
  3834.    STM8S207S8, STM8S207S6, STM8S207K8, STM8S207K6,\\
  3835.    STM8S208MB, STM8S208RB, STM8S208R8, STM8S208R6,\\
  3836.    STM8S208CB, STM8S208C8, STM8S208C6, STM8S208SB,\\
  3837.    STM8S208S8, STM8S208S6, STM8S903K3, STM8S903F3,\\
  3838.    STM8L050J3, STM8L051F3, STM8L052C6, STM8L052R8,\\
  3839.    STM8L001J3, STM8L101F1, STM8L101F2, STM8L101G2,\\
  3840.    STM8L101F3, STM8L101G3, STM8L101K3, STM8L151C2,\\
  3841.    STM8L151K2, STM8L151G2, STM8L151F2, STM8L151C3,\\
  3842.    STM8L151K3, STM8L151G3, STM8L151F3, STM8L151C4,\\
  3843.    STM8L151C6, STM8L151K4, STM8L151K6, STM8L151G4,\\
  3844.    STM8L151G6, STM8L152C4, STM8L152C6, STM8L152K4,\\
  3845.    STM8L152K6, STM8L151R6, STM8L151C8, STM8L151M8,\\
  3846.    STM8L151R8, STM8L152R6, STM8L152C8, STM8L152K8,\\
  3847.    STM8L152M8, STM8L152R8, STM8L162M8, STM8L162R8,\\
  3848.    STM8AF6366, STM8AF6388, STM8AF6213, STM8AF6223,\\
  3849.    STM8AF6226, STM8AF6246, STM8AF6248, STM8AF6266,\\
  3850.    STM8AF6268, STM8AF6269, STM8AF6286, STM8AF6288,\\
  3851.    STM8AF6289, STM8AF628A, STM8AF62A6, STM8AF62A8,\\
  3852.    STM8AF62A9, STM8AF62AA, STM8AF5268, STM8AF5269,\\
  3853.    STM8AF5286, STM8AF5288, STM8AF5289, STM8AF528A,\\
  3854.    STM8AF52A6, STM8AF52A8, STM8AF52A9, STM8AF52AA,\\
  3855.    STM8AL3136, STM8AL3138, STM8AL3146, STM8AL3148,\\
  3856.    STM8AL3166, STM8AL3168, STM8AL3L46, STM8AL3L48,\\
  3857.    STM8AL3L66, STM8AL3L68, STM8AL3188, STM8AL3189,\\
  3858.    STM8AL318A, STM8AL3L88, STM8AL3L89, STM8AL3L8A,\\
  3859.    STM8TL52F4, STM8TL52G4, STM8TL53C4, STM8TL53F4,\\
  3860.    STM8TL53G4
  3861. \end{quote}
  3862. Der STM8-Kern erweitert den Adre"sraum auf bis zu 16 MByte und f"uhrt
  3863. eine ganze Reihe neuer Befehle ein.  Obwohl viele Befehle den
  3864. gleichen Maschinencode wie beim ST7 haben, ist er nicht bin"ar
  3865. aufw"artskompatibel.
  3866. %%-----------
  3867. \begin{quote}
  3868. bf) ST9020, ST9030, ST9040, ST9050
  3869. \end{quote}
  3870. Diese 4 Namen vetreten die vier ,,Unterfamilien'' der ST9-Familie, die
  3871. sich durch eine unterschiedliche Ausstattung mit On-Chip-Peripherie
  3872. auszeichnen.  Im Prozessorkern sind sie identisch, so da"s diese
  3873. Unterscheidung wieder nur in der Include-Datei mit den Peripherieadressen zum
  3874. Zuge kommt.
  3875. %%-----------
  3876. \begin{quote}
  3877. bg) 6804
  3878. \end{quote}
  3879. %%-----------
  3880. \begin{quote}
  3881. bh) 32010 $\rightarrow$ 32015
  3882. \end{quote}
  3883. Der TMS32010 besitzt nur 144 Byte internes RAM, weshalb \asname{} Adressen im
  3884. Datensegment auf eben diesen Bereich begrenzt.  F"ur den 32015 gilt diese
  3885. Beschr"ankung nicht, es kann der volle Bereich von 0--255 angesprochen
  3886. werden.
  3887. %%-----------
  3888. \begin{quote}
  3889. bi) 320C25 $\rightarrow$ 320C26 $\rightarrow$ 320C28
  3890. \end{quote}
  3891. Diese Prozessoren unterscheiden sich nur leicht in der
  3892. On-Chip-Peripherie sowie den Konfigurationsbefehlen.
  3893. %%-----------
  3894. \begin{quote}
  3895. bj) 320C30, 320C31 $\rightarrow$ 320C40, 320C44
  3896. \end{quote}
  3897. Der 320C31 ist eine etwas ,,abgespeckte'' Version des 320C30 mit dem
  3898. gleichen Befehlssatz, jedoch weniger Peripherie.  In STDDEF3X.INC
  3899. wird diese Unterscheidung ausgenutzt.  Die C4x-Varianten sind
  3900. Quellcode-aufw"artskompatibel, unterscheiden sich im
  3901. Maschinencode einiger Befehle jedoch subtil.  Auch hier ist ist
  3902. der C44 eine abgespeckte Version des C40, mit weniger Peripherie
  3903. und kleinerem Adre"sraum.
  3904. %%-----------
  3905. \begin{quote}
  3906. bk) 320C203 $\rightarrow$ 320C50, 320C51, 320C53
  3907. \end{quote}
  3908. Ersterer ist der generelle Repr"asentant f"ur die
  3909. C20x-Signalprozessorfamilie, die eine Untermenge des C5x-Befehlssatzes
  3910. implementieren.  Die Unterscheidung zwischen den verschiedenen
  3911. C5x-Prozessoren wird von \asname{} momentan nicht ausgenutzt.
  3912. %%-----------
  3913. \begin{quote}
  3914. bl) 320C541
  3915. \end{quote}
  3916. Dies ist momentan der Repr"asentant f"ur die TMS320C54x-Familie...
  3917. %%-----------
  3918. \begin{quote}
  3919. bm) TI990/4, TI990/10, TI990/12 \\
  3920.    TMS9900, TMS9940, TMS9995, TMS99105, TMS99110
  3921. \end{quote}
  3922. Die TMS99xx/99xxx-Prozessoren sind im Prinzip Single-Chip-Implementierungen
  3923. der TI990-Minicomputer, einige TI990-Modelle basieren auch auf einem solchen
  3924. Prozessor anstatt einer diskret aufgebauten CPU.  Die einzelnen Modelle
  3925. unterscheiden sich im Befehlssatz (der TI990/12 hat den gr"o"sten), und
  3926. dem Vorhandensein eines privilegierten Modus.
  3927. %%-----------
  3928. \begin{quote}
  3929. \begin{tabbing}
  3930. \hspace{0.7cm} \= \kill
  3931. bn) \> TMS70C00, TMS70C20, TMS70C40, \\
  3932.    \> TMS70CT20, TMS70CT40, \\
  3933.    \> TMS70C02, TMS70C42, TMS70C82, \\
  3934.    \> TMS70C08, TMS70C48 \\
  3935. \end{tabbing}
  3936. \end{quote}
  3937. Alle Mitglieder dieser Familie haben den gleichen CPU-Kern,
  3938. unterscheiden sich im Befehlssatz also nicht.  Die Unterschiede
  3939. finden sich nur in der Datei REG7000.INC, in der Speicherbereiche
  3940. und Peripherieadressen definiert werden.  Die in einer Zeile
  3941. stehenden  Typen besitzen jeweils gleiche Peripherie und gleiche
  3942. interne RAM-Menge, unterscheiden sich also nur in der Menge
  3943. eingebauten ROMs.
  3944. %%-----------
  3945. \begin{quote}
  3946. bo) 370C010, 370C020, 370C030, 370C040 und 370C050
  3947. \end{quote}
  3948. Analog zur MCS-51-Familie werden die unterschiedlichen Typen nur
  3949. zur Unterscheidung der Peripherie in STDDEF37.INC genutzt, der
  3950. Befehlssatz ist identisch.
  3951. %%-----------
  3952. \begin{quote}
  3953. bp) MSP430 $\rightarrow$ MSP430X
  3954. Die X-Variante des CPU-Kerns erweitert den Adre"sraum von 64
  3955. KiByte auf 1 MiByte und erweitert den Befehlssatz, um
  3956. Instruktionen mehrfach ausf"uhren zu k"onnen.
  3957. \end{quote}
  3958. %%-----------
  3959. \begin{quote}
  3960. bq) TMS1000, TMS1100, TMS1200, TMS1300
  3961. \end{quote}
  3962. F"ur TMS1000 und TMS1200 sind jeweils 1 KByte ROM und 64 Nibbles
  3963. RAM vorgesehen, f"ur TMS1100 und TMS1300 jeweils das doppelte.  Des
  3964. weiteren hat TI f"ur TMS1100 und TMS1300 einen deutlich anderen
  3965. Default-Befehlssatz vorgesehen (\asname{} kennt nur die Default-
  3966. Befehlss"atze!).
  3967. %%-----------
  3968. \begin{quote}
  3969. br) IMP-16C/200, IMP-16C/300, IMP-16P/200, IMP-16P/300, IMP-16L
  3970. \end{quote}
  3971. Beim IMP-16L sind einige zus"atzliche Bits im Statusregister sowie
  3972. weitere Sprungbedingungen definiert. Den erweiterten Befehlssatz
  3973. unterst"utzt er ebenso wie die 300er-Varianten.
  3974. %%-----------
  3975. \begin{quote}
  3976. bs) IPC-16, INS8900
  3977. \end{quote}
  3978. Der INS8900 ist lediglich eine Re-Implementierung des PACE in
  3979. einem modernerem NMOS-Fertigungsprozess; es bestehen keine
  3980. Unterschiede im Befehlssatz.
  3981. %%-----------
  3982. \begin{quote}
  3983. bt) SC/MP
  3984. \end{quote}
  3985. %%-----------
  3986. \begin{quote}
  3987. bu) 8070
  3988. \end{quote}
  3989. Dieser Prozessor repr"asentiert die gesamte 807x-Familie (die mindestens
  3990. aus den 8070, 8072 und 8073 besteht), der jedoch ein einheitlicher
  3991. CPU-Kern gemeinsam ist.
  3992. %%-----------
  3993. \begin{quote}
  3994. bv) COP87L84
  3995. \end{quote}
  3996. Dies ist das momentan einzige unterst"utzte Mitglied der COP8-Familie
  3997. von National Semiconductor.  Mir ist bekannt, da"s die Familie
  3998. wesentlich gr"o"ser ist und auch Vertreter mit unterschiedlich gro"sem
  3999. Befehlssatz existieren, die nach Bedarf hinzukommen werden.  Es ist eben
  4000. ein Anfang, und die Dokumentation von National ist ziemlich umfangreich...
  4001. %%-----------
  4002. \begin{quote}
  4003. bw) COP410 $\rightarrow$ COP420 $\rightarrow$ COP440 $\rightarrow$ COP444
  4004. Die COP42x-Derivate bieten einige weitere Befehle, des weiteren wurden
  4005. Befehlen in ihrem Wertebereich erweitert.
  4006. \end{quote}
  4007. %%-----------
  4008. \begin{quote}
  4009. \begin{tabbing}
  4010. \hspace{0.7cm} \= \kill
  4011. bx) \> SC14400, SC14401, SC14402, SC14404, SC14405, \\
  4012.    \> SC14420, SC14421, SC14422, SC14424 \\
  4013. \end{tabbing}
  4014. \end{quote}
  4015. Diese Gruppe von DECT-Controller unterscheidet sich in ihrem
  4016. Befehlsumfang, da jeweils unterschiedliche B-Feld Datenformate
  4017. unterst"utzt werden und deren Architektur im Laufe der Zeit optimiert
  4018. wurde.
  4019. %%-----------
  4020. \begin{quote}
  4021. by) NS16008, NS32008, NS08032, NS16032, NS32016, NS32032, \\
  4022.    NS32332, NS32CG16, NS32532
  4023. \end{quote}
  4024. National hat in den ersten Jahren die CPUs der ersten Generation
  4025. mehrfach umbenannt, hinter NS16008/NS32008/NS08032 bzw.
  4026. NS16032/NS32016 versteckt sich der gleiche Baustein.  NS32332
  4027. und NS32532 unterst"utzen eine Adre"sraum von 4 GByte statt 16 MByte,
  4028. und der NS32CG16 ist eine Embedded-Variante mit Zusatzbefehlen f"ur
  4029. Bitblock-Transfers.
  4030. %%-----------
  4031. \begin{quote}
  4032. bz) ACE1101, ACE1202
  4033. \end{quote}
  4034. %%-----------
  4035. \begin{quote}
  4036. ca) F3850, MK3850, \\
  4037.    MK3870, MK3870/10, MK3870/12, "MK3870/20, MK3870/22, \\
  4038.    MK3870/30, MK3870/32, MK3870/40, MK3870/42, \\
  4039.    MK3872, MK3873, MK3873/10, MK3873/12, MK3873/20, MK3873/22, \\
  4040.    MK3874, MK3875, MK3875/22, MK3875/42, MK3876, MK38P70/02, \\
  4041.    MK38C70, MK38C70/10, \\
  4042.    MK38C70/20, MK97400, MK97410, MK97500, MK97501, MK97503
  4043. \end{quote}
  4044. Die gro"se Menge an Varianten ergibt sich zum Teil daraus, da"s
  4045. Mostek Anfang der 80er-Jahre diversen Varianten neue Namen gegeben
  4046. hat. Am neuen Benamungsschema kann man am Suffix die Menge internen
  4047. ROMs (0 bis 4 f"ur 0..4 KByte) bzw. die Menge des eingebauten
  4048. Executable RAM (0 oder 2 f"ur 0 oder 64 Byte) ablesen.  3850 und
  4049. MK975xx unterst"utzen einen 64 KByte gro"sen Adre"sraum, beim Rest ist
  4050. er 4 KByte gro"s. P-Varianten haben einen Piggyback-Sockel f"ur ein
  4051. EPROM, C-Varianten sind in CMOS ausgef"uhrt und kennen zwei
  4052. neue Maschinenbefehle (HET und HAL).  Der MK3873 enth"alt als
  4053. ,,Spezialit"at'' eine eingebaute serielle Schnittstelle, der
  4054. MK3875 bietet einen zweiten Betriebsspannungsanschlu"s, um den
  4055. internen RAM-Inhalt im Standby halten zu k"onnen.
  4056. %%-----------
  4057. \begin{quote}
  4058. cb) 7800, 7801, 7802 \\
  4059. 78C05, 78C06 \\
  4060. 7807, 7808, 7809 \\
  4061. 7810 $\rightarrow$ 78C10, 78C11, 78C12, 78C14, 78C17, 78C18
  4062. \end{quote}
  4063. $\mu$PD7800 bis $\mu$PD7802 repr"asentieren die ''erste Generation'' der
  4064. uCOM87-Familie von NEC.  $\mu$PD78C05 und $\mu$PD78C06 sind davon abgespeckte
  4065. Versionen, die nur eine Untermenge des Befehlssatzes unterst"utzen.  7807
  4066. bis 7809 stellen die uCOM87-Serie dar, die um weitere Befehle und erg"anzt
  4067. wurde.  Alle $\mu$PD781x-Varianten geh"oren zur uCOM87AD-Serie, die dar"uber
  4068. hinaus um einen A/D-Wandler erg"anzt wurde, daf"ur wurden die Befehle zur
  4069. Verarbeitung von Bits wieder entfernt.  \bb{ACHTUNG!} Der Befehlssatz ist
  4070. generell nur teilweise bin"ar aufw"artskompatibel!  Die NMOS-Version
  4071. $\mu$PD7810 besitzt keinen STOP-Modus; der entsprechende Befehl sowie das
  4072. ZCM-Register fehlen demzufolge.  \bb{VORSICHT!} NMOS- und CMOS-Version
  4073. differieren zum Teil in den Reset-Werten einiger Register!
  4074. %%-----------
  4075. \begin{quote}
  4076. cc) 7566 $\leftrightarrow$ 7508
  4077. \end{quote}
  4078. Es existieren in der $\mu$PD75xx-Familie zwei verschiedene
  4079. CPU-Kerne: Der 7566 repr"asentiert den 'instruction set B', der
  4080. deutlich weniger Befehle, einige Register weniger und kleinere
  4081. Adre"sr"aume erlaubt.  Der 7508 repr"asentiert den 'vollen'
  4082. Befehlssatz A.  {\bf VORSICHT!} Beide Maschinen-Befehlss"atze
  4083. sind nicht 100\%-ig bin"arkompatibel!
  4084. %%-----------
  4085. \begin{quote}
  4086. \begin{tabbing}
  4087. \hspace{0.7cm} \= \kill
  4088. cd) \> 75402, \\
  4089.    \> 75004, 75006, 75008, \\
  4090.    \> 75268, \\
  4091.    \> 75304, 75306, 75308, 75312, 75316, \\
  4092.    \> 75328, \\
  4093.    \> 75104, 75106, 75108, 75112, 75116, \\
  4094.    \> 75206, 75208, 75212, 75216, \\
  4095.    \> 75512, 75516 \\
  4096. \end{tabbing}
  4097. \end{quote}
  4098. Dieses ,,F"ullhorn'' an Prozessoren unterscheidet sich innerhalb einer
  4099. Gruppe nur durch die RAM- und ROM-Gr"o"se; die Gruppen untereinander
  4100. unterscheiden sich einmal durch ihre on-chip-Peripherie und
  4101. zum anderen durch die M"achtigkeit des Befehlssatzes.
  4102. %%-----------
  4103. \begin{quote}
  4104. ce) 78070
  4105. \end{quote}
  4106. Dies ist das einzige, mir momentan vertraute Mitglied der
  4107. 78K0-Familie von NEC.  Es gelten "ahnliche Aussagen wie zur
  4108. COP8-Familie!
  4109. %%-----------
  4110. \begin{quote}
  4111. cf) 78214
  4112. \end{quote}
  4113. Dies ist momentan der Repr"asentant der 78K2-Familie von NEC.
  4114. %%-----------
  4115. \begin{quote}
  4116. cg) 78310
  4117. \end{quote}
  4118. Dies ist momentan der Repr"asentant der 78K3-Familie von NEC.
  4119. %%-----------
  4120. \begin{quote}
  4121. ch) 784026
  4122. \end{quote}
  4123. Dies ist momentan der Repr"asentant der 78K4-Familie von NEC.
  4124. %%-----------
  4125. \begin{quote}
  4126. ci) 7720 $\rightarrow$ 7725
  4127. \end{quote}
  4128. Der $\mu$PD7725 bietet im Vergleich zu seinem Vorg"anger gr"o"sere
  4129. Adre"sr"aume und einige zus"atzliche Befehle. {\bf VORSICHT!}  Die
  4130. Prozessoren sind nicht zueinander bin"arkompatibel!
  4131. %%-----------
  4132. \begin{quote}
  4133. cj) 77230
  4134. \end{quote}
  4135. %%-----------
  4136. \begin{quote}
  4137. ck) 70616
  4138. \end{quote}
  4139. Dies ist momentan der Repr"asentant der V60-Familie von NEC.
  4140. %%-----------
  4141. \begin{quote}
  4142. \begin{tabbing}
  4143. cl) \= SYM53C810, SYM53C860, SYM53C815, SYM53C825, \\
  4144.    \> SYM53C875, SYM53C895
  4145. \end{tabbing}
  4146. \end{quote}
  4147. Die einfacheren Mitglieder dieser Familie von SCSI-Prozessoren besitzen
  4148. einige Befehlsvarianten nicht, au"serdem unterscheiden sie sich in ihrem
  4149. Satz interner Register.
  4150. %%-----------
  4151. \begin{quote}
  4152. cm) MB89190
  4153. \end{quote}
  4154. Dieser Prozessortyp repr"asentiert die F$^{2}$MC8L-Serie von Fujitsu...
  4155. %%-----------
  4156. \begin{quote}
  4157. cn) MB9500
  4158. \end{quote}
  4159. ...so wie dieser es momentan f"ur die 16-Bit-Varianten von Fujitsu tut!
  4160. %%-----------
  4161. \begin{quote}
  4162. co) MSM5840, MSM5842, MSM58421, MSM58422, MSM5847
  4163. \end{quote}
  4164. Diese Varianten der OLMS-40-Familie unterscheiden sich im
  4165. Befehlssatz sowie im internen Programm- und Datenspeicher.
  4166. %%-----------
  4167. \begin{quote}
  4168. cp) MSM5054, MSM5055, MSM5056, MSM6051, MSM6052
  4169. \end{quote}
  4170. Gleiches wie bei der OLMS-40-Familie: Unterschiede im
  4171. Befehlssatz sowie im internen Programm- und Datenspeicher.
  4172. %%-----------
  4173. \begin{quote}
  4174. cq) MN1610[ALT] $\rightarrow$ MN1613[ALT]
  4175. \end{quote}
  4176. Zus"atzlich zu den Funktionen seines Vorg"angers bietet der
  4177. MN1613 einen gr"o"seren Adre"sraum, eine Floating-Point-Einheit
  4178. sowie eine ganze Reihe neuer Befehle.
  4179. %%-----------
  4180. \begin{quote}
  4181. cr) RXV1, RX110, RX111, RX113, RX130, RX210,\\
  4182.    RX21A, RX220, RX610, RX621, RX62N, RX630,\\
  4183.    RX631 $\longrightarrow$ \\
  4184.    RXV2, RX140, RX230, RX231, RX64M,\\
  4185.    RX651 $\longrightarrow$ \\
  4186.    RXV3, RX660, RX671, RX72M, RX72N
  4187. \end{quote}
  4188. Die Controller der RX-Serie k"onnen grob in drei
  4189. Gruppen bzw. Generationen eingeteilt werden, wobei
  4190. von Generation zu Generation (RXv1, RXv2, RXv3)
  4191. jeweils neue Instruktionen hinzu gekommen sind.
  4192. %%-----------
  4193. \begin{quote}
  4194. cs) PMC150, PMS150, PFS154, PMC131, PMS130, PMS131 \\
  4195. PMS132, PMS132B, PMS152, PMS154B, PMS154C, PFS173 \\
  4196. PMS133, PMS134, DF69, MCS11, PMC232, PMC234, PMC251 \\
  4197. PMC271,PMC884, PMS232, PMS234, PMS271
  4198. \end{quote}
  4199. Die Padauk-Controller unterscheiden sich allesamt in
  4200. der Gr"o"se des internen (ROM/RAM)-Speichers, der Art
  4201. des internen ROMs (l"oschbar oder OTP), der eingebauten
  4202. Peripherie sowie in Umfang und Kodierung des Befehlssatzes.
  4203. %%-----------
  4204. \begin{quote}
  4205. ct) 1802 $\rightarrow$ 1804, 1805, 1806 $\rightarrow$ 1804A, 1805A
  4206. 1806A
  4207. \end{quote}
  4208. 1804, 1805 und 1806 haben gegen"uber dem 'Original' 1802 einen leicht
  4209. erweiterten Befehlssatz sowie on-chip-RAM und einen integrierten
  4210. Timer.  Die A-Versionen erweitern den Befehlssatz um \tty{DSAV},
  4211. \tty{DBNZ}, sowie um Befehle f"ur Addition und Subtraktion im
  4212. BCD-Format.
  4213. %%-----------
  4214. \begin{quote}
  4215. cu) XS1
  4216. \end{quote}
  4217. Dieser Typ repr"asentiert die XCore-''Familie''.
  4218. %%-----------
  4219. \begin{quote}
  4220. cv) 1750
  4221. \end{quote}
  4222. MIL STD 1750 ist ein Standard, also gibt es auch nur eine
  4223. (Standard-)Variante...
  4224. %%-----------
  4225. \begin{quote}
  4226. cw) KENBAK
  4227. \end{quote}
  4228. Es hat nie einen KENBAK-2 gegeben...
  4229. %%-----------
  4230. \begin{quote}
  4231. cx) CP-1600
  4232. \end{quote}
  4233. %%-----------
  4234. \begin{quote}
  4235. cy) HPNANO
  4236. \end{quote}
  4237. %%-----------
  4238. \begin{quote}
  4239. cz) 6100 $\rightarrow$ 6120
  4240. \end{quote}
  4241. Der IM6120 unterst"utzt einen gr"o"seren Adre"sraum (32K
  4242. anstelle 4K) sowie zus"atzliche Maschinenbefehle.
  4243. %%-----------
  4244. \begin{quote}
  4245. da) SC61860
  4246. \end{quote}
  4247. Dies ist der in den meisten Sharp Pocket Computern (PC-12xx...PC-15xx) verbaute
  4248. Prozessor.
  4249. %%-----------
  4250. \begin{quote}
  4251. db) SC62015
  4252. \end{quote}
  4253. Dies ist der im Sharp PC-E500 verbaute Prozessor.
  4254.  
  4255. Ein spezielles, bisher hier nicht aufgelistetes Target ist
  4256. NONE.  Es ist als Default eingestellt, wenn kein Target
  4257. per {\tt -cpu} Argument auf der Kommandozeile vorgegeben
  4258. wurde, und auch bisher keine {\tt CPU}-Anweisung assembliert
  4259. wurde.  Target-unabh"angige Pseudo-Befehle sind in diesem
  4260. Zustand weiter m"oglich, aber es kann kein Code erzeugt
  4261. werden, weder durch Maschinenbefehle noch durch Datenablage.
  4262. Prinzipiell ist es auch m"oglich, dieses Target per {\tt -cpu}
  4263. oder {\tt CPU} auszuw"ahlen, aber der praktische Nutzen davon
  4264. ist nat"urlich beschr"ankt.
  4265.  
  4266. Beim CPU-Befehl mu"s der Prozessortyp als einfaches Literal
  4267. angegeben werden, eine Berechnung \`a la
  4268. \begin{verbatim}
  4269.        CPU     68010+10
  4270. \end{verbatim}
  4271. ist also nicht zul"assig.  G"ultige Aufrufe sind z.B.
  4272. \begin{verbatim}
  4273.        CPU     8051
  4274. \end{verbatim}
  4275. oder
  4276. \begin{verbatim}
  4277.        CPU     6800
  4278. \end{verbatim}
  4279. Egal, welcher Prozessortyp gerade eingestellt ist, in der
  4280. Integervariablen MOMCPU wird der momentane Status als Hexadezimalzahl
  4281. abgelegt.  F"ur den 68010 ist z.B. \tty{MOMCPU=\$68010}, f"ur den 80C48
  4282. \tty{MOMCPU=80C48H}.  Da man Buchstaben au"ser A..F nicht als Hexziffer
  4283. interpretieren kann, mu"s man sich diese bei der Hex-Darstellung
  4284. des Prozessors wegdenken. F"ur den Z80 ist z.B. \tty{MOMCPU=80H}.
  4285. \par
  4286. Dieses Feature kann
  4287. man vorteilhaft einsetzen, um je nach Prozessortyp unterschiedlichen
  4288. Code zu erzeugen.  Der 68000 z.B. kennt noch keinen Befehl f"ur den
  4289. Unterprogrammr"ucksprung mit Stapelkorrektur.  Mit der Variablen
  4290. \tty{MOMCPU} kann man ein Makro definieren, das je nach Prozessortyp den
  4291. richtigen Befehl benutzt oder ihn emuliert:
  4292. \begin{verbatim}
  4293. myrtd   MACRO   disp
  4294.        IF      MOMCPU$<$68010   ; auf 68008 und
  4295.         MOVE.L (sp),disp(sp)    ; 68000 emulieren
  4296.         LEA    disp(sp),sp
  4297.         RTS
  4298.        ELSEIF
  4299.         RTD    #disp            ; ab 68010 direkt
  4300.        ENDIF                    ; benutzen
  4301.        ENDM
  4302.  
  4303.        CPU     68010
  4304.        MYRTD   12               ; ergibt RTD #12
  4305.  
  4306.        CPU     68000
  4307.        MYRTD   12               ; ergibt MOVE.. /
  4308.                                 ; LEA.. / RTS
  4309. \end{verbatim}
  4310. Da nicht alle Prozessornamen nur aus Ziffern und Buchstaben zwischen
  4311. A und F bestehen, wird zus"atzlich der volle Name in der
  4312. String-Variablen \tty{MOMCPUNAME} abgelegt.
  4313. \par
  4314. Implizit schaltet der Assembler mit dem \tty{CPU}-Befehl das aktuelle Segment
  4315. wieder auf Code zur"uck, da dies das einzige Segment ist, das alle
  4316. Prozessoren definieren.
  4317. \par
  4318. Eine wichtige "Anderung: Das Default-Target ist nich mehr der 68008.  Falls
  4319. kein {\tt -cpu} Kommandozeilen-Argument gegeben wurde, dann ist bis zur
  4320. ersten \tty{CPU}-Anweisung das reservierte Target \tty{NONE} gesetzt.  Vom
  4321. Target unabh"angig verf"ugbare Pseudo-Anweisungen sind in dieser Situation
  4322. weiterhin erlaubt, zum Beispiel um Konstanten oder Makros zu definieren.
  4323. Es ist aber nicht m"oglich, irgendwelchen Code zu definieren, weder "uber
  4324. Maschinenbefehle, noch durch Ablegen von Daten im Speicher.
  4325.  
  4326. F"ur einige Ziele sind Optionen bzw. Varianten definiert, die so grundlegend
  4327. sind, da"s sie direkt zusammen mit dem \tty{CPU}-Befehl gew"ahlt werden m"ussen.
  4328. Solche Optionen h"angt man direkt an das Argument mit Doppelpunkten an, und sie
  4329. haben die Form von Variablenzuweisungen:
  4330. \begin{verbatim}
  4331.  CPU <CPU-Name>:<var1>=<wert1>:<var2>=<wert2>:...
  4332. \end{verbatim}
  4333. Ob das jeweilige Ziel solche Optionen unterst"utzt, und wenn ja welche, wird im
  4334. jeweils zugeh"origen Unterkapitel mit prozessorspezifischen Hinweisen beschrieben.
  4335.  
  4336. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4337.  
  4338. \subsection{SUPMODE, FPU, PMMU, CUSTOM}
  4339. \ttindex{SUPMODE}\ttindex{FPU}\ttindex{PMMU}\ttindex{CUSTOM}
  4340. \label{SectSUPMODE}
  4341.  
  4342. {\em
  4343. \begin{itemize}
  4344. \item{G"ultigkeit SUPMODE: 680x0, NS32xxx, PDP-11, i960, TLCS-900,
  4345.      SH7000, i960, 29K, XA, PowerPC, M*CORE, V60 und TMS9900}
  4346. \item{G"ultigkeit FPU: 680x0, NS32xxx, 80x86}
  4347. \item{G"ultigkeit PMMU: 680x0, NS32xxx}
  4348. \item{G"ultigkeit CUSTOM: NS32xxx}
  4349. \end{itemize}
  4350. }
  4351.  
  4352. Mit diesen Schaltern kann bestimmt werden, auf welche Teile des
  4353. Befehlssatzes verzichtet werden soll, weil die daf"ur n"otigen
  4354. Vorbedingungen im folgenden Codest"uck nicht gegeben sind.  Als
  4355. Parameter f"ur diese Befehle darf entweder \tty{ON} oder \tty{OFF} gegeben werden,
  4356. der momentan gesetzte Zustand kann aus einer Variablen ausgelesen
  4357. werden, die entweder TRUE oder FALSE ist.  Die Befehle bedeuten im einzelnen
  4358. folgendes:
  4359. \begin{itemize}
  4360. \item{\tty{SUPMODE}: erlaubt bzw. sperrt Befehle, f"ur deren Ausf"uhrung
  4361.      der Prozessor im Supervisorstatus sein mu"s.  Die Statusvariable
  4362.      hei"st \tty{INSUPMODE}.}
  4363. \item{\tty{FPU}: erlaubt bzw. sperrt die Befehle des numerischen Koprozessors
  4364.      8087, NS32081/32381 bzw. 68881/68882.  Die Statusvariable hei"st \tty{FPUAVAIL}.
  4365.      F"ur NS32xxx als Ziel darf neben einem einfachen \tty{ON} oder \tty{OFF}
  4366.      auch der FPU-Typ (\tty{NS32081}, \tty{NS32181}, \tty{NS32381} oder \tty{NS32580})
  4367.      angegeben werden, um die erweiterten Register und Befehle freizugeben oder
  4368.      zu verbieten.}
  4369. \item{\tty{PMMU}: erlaubt bzw. sperrt die Befehle der Speicherverwaltungseinheit
  4370.      68851 bzw. der im 68030 eingebauten MMU.  \bb{ACHTUNG!} Die 68030-MMU
  4371.      erlaubt nur eine relativ kleine Untermenge der 68851-Befehle, dies wird
  4372.      "uber den \tty{FULLPMMU}-Befehl gesteuert.  Die Statusvariable hei"st
  4373.      \tty{PMMUAVAIL}. F"ur NS32xxx als Ziel darf neben einem einfachen \tty{ON}
  4374.      oder \tty{OFF} auch der MMU-Typ (\tty{NS32082}, \tty{NS32382} oder \tty{NS32532})
  4375.      angegeben werden, um den jeweiligen MUU-Registersatz freizugeben.}
  4376. \item{\tty{CUSTOM}: erlaubt bzw. sperrt die f"ur benutzerdefinierte Slave-Prozessoren
  4377.      vorgesehenen Befehle.}
  4378. \end{itemize}
  4379. Benutzung von auf diese Weise gesperrten Befehlen erzeugt bei \tty{SUPMODE}
  4380. eine Warnung, bei \tty{PMMU} und \tty{FPU} eine echte Fehlermeldung.
  4381.  
  4382. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4383.  
  4384. \subsection{CIS, EIS, FIS und FP11}
  4385. \ttindex{CIS}\ttindex{EIS}\ttindex{FIS}\ttindex{FP11}
  4386.  
  4387. {\em
  4388. \begin{itemize}
  4389. \item{G"ultigkeit: PDP-11}
  4390. \end{itemize}
  4391. }
  4392.  
  4393. Mit diesen Anweisungen schaltet man die Verf"ugbarkeit bestimmter
  4394. PDP-11-Befehlssatzerweiterungen ein oder aus.  Voraussetzung f"ur die
  4395. Verf"ugbarkeit einer dieser Anweisungen ist, da"s die fraglichen Befehle
  4396. nicht bereits im Basis-Befehlssatz enthalten sind, und da"s eine
  4397. entsprechende Aufr"ustm"oglichkeit bestanden hat.  Im einzelnen:
  4398. \begin{itemize}
  4399. \item{{\tt CIS}: ,,Commercial Instruction Set'', d.h. Befehle zur
  4400.      Verarbeitung gepackter und nicht gepackter BCD-Zahlen mit
  4401.      variabler L"ange.  Diese waren auf dem LSI-11 sowie der
  4402.      PDP-11/44 als Option verf"ugbar.}
  4403. \item{{\tt EIS}: Die Befehle {\tt MUL, DIV, ASH} und {\tt ASHC},
  4404.      die auf fr"uhen bzw. einfachen PDP-11-Systemen nicht Teil
  4405.      des Basisbefehlssatzes waren.  Auf dem LSI-11 bzw. der
  4406.      PDP-11/35 und PDP-11/40 waren sie per Option nachr"ustbar.}
  4407. \item{{\tt FIS}: Stack-orientierte Befehle, die die Grundrechenarten
  4408.      f"ur Gleitkommazahlen im F-Format (32 Bit) implementieren.
  4409.      Auf dem LSI-11 bzw. der PDP-11/35 und PDP-11/40 waren sie
  4410.      per Option nachr"ustbar.}
  4411. \item{{\tt FP11}: Volle Gleitkomma-Unterst"utzung mit separaten
  4412.      FPU-Registern im F- und D-Format (32/64 Bit).}
  4413. \end{itemize}
  4414.  
  4415. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4416.  
  4417. \subsection{FULLPMMU}
  4418. \ttindex{FULLPMMU}
  4419.  
  4420. {\em G"ultigkeit: 680x0}
  4421.  
  4422. Motorola hat zwar ab dem 68030 die PMMU in den Prozessor integriert,
  4423. diese aber nur mit einer Funktionsuntermenge der externen PMMU 68851
  4424. ausgestattet.  \asname{} sperrt bei aktiviertem PMMU-Befehlssatz (s.o.) deshalb
  4425. alle fehlenden Befehle, wenn als Zielprozessor 68030 oder h"oher
  4426. eingestellt wurde.  Nun kann es aber sein, da"s in einem System mit
  4427. 68030-Prozessor die interne MMU abgeschaltet wurde und der Prozessor
  4428. mit einer externen 68851 betrieben wird.  Mit \tty{FULLPMMU ON} kann man
  4429. \asname{} dann mitteilen, da"s der vollst"andige MMU-Befehlssatz zugelassen
  4430. ist.  Umgekehrt kann man, wenn man portablen Code erzeugen will, alle
  4431. zus"atzlichen Befehle trotz 68020-Zielplattform mit \tty{FULLPMMU OFF}
  4432. abschalten.  Die Umschaltung darf beliebig oft erfolgen, die momentane
  4433. Einstellung kann aus einem gleichnamigen Symbol ausgelesen werden.
  4434. \bb{ACHTUNG!}  Der \tty{CPU}-Befehl besetzt f"ur 680x0-Argumente implizit
  4435. diese Einstellung vor!  \tty{FULLPMMU} mu"s also auf jeden Fall nach dem
  4436. \tty{CPU}-Befehl kommen!
  4437.  
  4438. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4439.  
  4440. \subsection{PADDING}
  4441. \ttindex{PADDING}
  4442.  
  4443. {\em G"ultigkeit: 680x0, 68xx, M*Core, XA, H8, SH7000, TMS9900,\\
  4444.     MSP430(X), ST7/STM8, AVR (nur wenn die Granularit"at des Code-Segments
  4445.     8 Bit ist)}
  4446.  
  4447. Diverse Prozessorfamilien verlangen, da"s Objekte von mehr als einem
  4448. Byte L"ange auf einer geraden Adresse liegen m"ussen.  Neben Datenobjekten
  4449. schlie"st dies auch Instruktionsworte selber ein - auf einem 68000
  4450. l"osen Wortzugriffe auf eine ungerade Adresse zum Beispiel eine
  4451. Exception aus, andere Prozessoren wie die H8-Familie setzen das
  4452. unterste Adre"sbit bei einem Wortzugriff einfach hart auf Null.
  4453.  
  4454. Mit dem \tty{PADDING}-Befehl kann man einen Mechanismus aktivieren,
  4455. mit dem der Assembler versucht, solches 'Misalignment' nach M"oglichkeit
  4456. zu verhindern.  Steht die Situation an, da"s ein Instruktionswort,
  4457. oder auch z.B. mit \tty{DC} angelegte Daten von 16 Bit oder mehr auf
  4458. einer ungeraden Adresse landen w"urden, dann wird automatisch ein F"ullbyte
  4459. davor eingef"ugt.  Im Listing wird dieses F"ullbyte in einer separaten
  4460. Zeile mit dem Hinweis
  4461. \begin{verbatim}
  4462. <padding>
  4463. \end{verbatim}
  4464. ausgewiesen.
  4465.  
  4466. Steht in der Quellzeile ein Label, so verweist dieses Label weiterhin
  4467. auf den von dieser Zeile erzeugten Code, also auf die Adresse unmittelbar
  4468. nach dem F"ullbyte.  Das gleiche gilt auch f"ur ein Label in einer
  4469. separaten Zeile unmittelbar davor, sofern diese Zeile {\em alleine} das
  4470. Label und selber keine Anweisung enth"alt.  Im folgenden Beispiel:
  4471. \begin{verbatim}
  4472.       padding  on
  4473.       org      $1000
  4474.  
  4475.       dc.b     1
  4476. adr1:  nop
  4477.  
  4478.       dc.b     1
  4479. adr2:
  4480.       nop
  4481.  
  4482.       dc.b     1
  4483. adr3:  equ      *
  4484.       nop
  4485. \end{verbatim}
  4486. w"urden die Labels \tty{adr1} und \tty{adr2} die (durch ein F"ullbyte
  4487. auf einen geraden Wert aufgerundete) Adresse der jeweiligen \tty{NOP}-
  4488. Instruktion beinhalten, \tty{adr3} w"urde jedoch auf das F"ullbyte {\em vor}
  4489. der dritten \tty{NOP}-Instruktion zeigen.
  4490.  
  4491. Als Argument zu \tty{PADDING} ist analog zu den vorherigen Befehlen
  4492. \tty{ON} oder \tty{OFF} erlaubt, und die augenblickliche Einstellung
  4493. kann aus dem gleichnamigen Symbol ausgelesen werden. Defaultm"a"sig
  4494. ist \tty{PADDING} nur f"ur die 680x0-Familie eingeschaltet, f"ur alle
  4495. anderen werden erst nach Umschaltung Padding-Bytes eingef"ugt.
  4496.  
  4497. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4498.  
  4499. \subsection{PACKING}
  4500. \ttindex{PACKING}\label{SectPACKING}
  4501.  
  4502. {\em G"ultigkeit: 56000, AVR, TMS3203x/4x, TMS3206x, MN1610, \\
  4503.     CP1600, $\mu$PD7720/7725, $\mu$PD77230}
  4504.  
  4505. {\tt PACKING} ist in gewisser Weise "ahnlich zu {\tt PADDING}, es arbeitet
  4506. nur gewisserma"sen anders herum: w"ahrend {\tt PADDING} die
  4507. abgelegten Daten erg"anzt, um komplette Worte und damit ein Alignment zu
  4508. erhalten, quetscht {\tt PACKING} mehrere Werte in ein einzelnes Wort.
  4509. Dies macht im Code-Segment des AVR Sinn, weil dort mit einem Spezialbefehl
  4510. ({\tt LPM}) auf einzelne Bytes in den 16-Bit-Worten zugegriffen werden
  4511. kann.  Ist diese Option eingeschaltet (Argument {\tt ON}), so werden immer
  4512. zwei Byte-Werte bei {\tt DATA} in ein Wort gepackt, analog zu den
  4513. einzelnen Zeichen von String-Argumenten.  Der Wertebereich der
  4514. Integer-Argumente reduziert sich dann nat"urlich auf -128...+255.  Ist
  4515. diese Option dagegen ausgeschaltet, (Argument {\tt OFF}), so bekommt
  4516. jedes Integer-Argument sein eigenes Wort und darf auch Werte von
  4517. -32768...+65535 annehmen.
  4518.  
  4519. Diese Unterscheidung betrifft nur Integer-Argumente von {\tt DATA},
  4520. Strings werden immer gepackt.  Zu beachten ist weiterhin, da"s dieses
  4521. Packen nur innerhalb der Argumente eines {\tt DATA}-Befehls funktionieren
  4522. kann, wer also mehrere {\tt DATA}-Befehle hintereinander hat, f"angt sich
  4523. bei ungeraden Argumentzahlen trotzdem halbvolle W"orter ein!
  4524.  
  4525. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4526.  
  4527. \subsection{MAXMODE}
  4528. \ttindex{MAXMODE}
  4529.  
  4530. {\em G"ultigkeit: TLCS-900, H8}
  4531.  
  4532. Die Prozessoren der TLCS-900-Reihe k"onnen in 2 Betriebsarten arbeiten,
  4533. dem Minimum-und Maximum-Modus.  Je nach momentaner Betriebsart gelten
  4534. f"ur den Betrieb und den Assembler etwas andere Eckwerte.  Mit diesem Befehl
  4535. und den Parametern \tty{ON} oder \tty{OFF} teilt man \asname{} mit, da"s der
  4536. folgende Code im Maximum- oder Minimum-Modus abl"auft.  Die momentane
  4537. Einstellung kann aus der Variablen \tty{INMAXMODE} ausgelesen werden.
  4538. Voreinstellung ist \tty{OFF}, d.h. Minimum-Modus.
  4539. \par
  4540. Analog dazu teilt man im H8-Modus \asname{} mit diesem Befehl mit, ob
  4541. mit einem 64K- oder 16Mbyte-Adre"sraum gearbeitet wird.  F"ur den
  4542. einfachen 300er ist diese Einstellung immer \tty{OFF} und kann nicht
  4543. ver"andert werden.
  4544.  
  4545. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4546.  
  4547. \subsection{EXTMODE und LWORDMODE}
  4548. \ttindex{EXTMODE}\ttindex{LWORDMODE}
  4549.  
  4550. {\em G"ultigkeit: Z380}
  4551.  
  4552. Der Z380 kann in insgesamt 4 Betriebsarten arbeiten, die sich durch
  4553. die Einstellung von 2 Flags ergeben: Das XM-Flag bestimmt, ob der
  4554. Prozessor mit einem 64 Kbyte oder 4 Gbyte gro"sen Adre"sraum arbeiten
  4555. soll und kann nur gesetzt werden (nach einem Reset steht es
  4556. Z80-kompatibel auf 0).  Demgegen"uber legt das LW-Flag fest, ob
  4557. Wort-Befehle mit einer Wortl"ange von 16 oder 32 Bit arbeiten sollen.
  4558. Die Stellung dieser beiden Flags beeinflu"st Wertebereichseinschr"ankungen
  4559. von Konstanten oder Adressen, weshalb man \asname{} "uber diese beiden Befehle
  4560. deren Stellung mitteilen mu"s.  Als Default nimmt \asname{} an, da"s beide
  4561. Flags auf 0 stehen, die momentane Einstellung (\tty{ON} oder \tty{OFF})
  4562. kann aus den vordefinierten Variablen \tty{INEXTMODE} bzw. \tty{INLWORDMODE}
  4563. ausgelesen werden.
  4564.  
  4565. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4566.  
  4567. \subsection{SRCMODE}
  4568. \ttindex{SRCMODE}
  4569.  
  4570. {\em G"ultigkeit: MCS-251}
  4571.  
  4572. Intel hat den Befehlssatz der 8051er beim 80C251 deutlich erweitert,
  4573. hatte aber leider nur noch einen einzigen freien Opcode f"ur diese
  4574. Befehle frei.  Damit der Prozessor nicht auf alle Ewigkeit durch
  4575. einen Pr"afix behindert bleibt, hat Intel zwei Betriebsarten vorgesehen:
  4576. Den Bin"ar- und den Quellmodus.  Im Bin"armodus ist der Prozessor voll
  4577. 8051-kompatibel, alle erweiterten Befehle ben"otigen den noch freien
  4578. Opcode als Pr"afix.  Im Quellmodus tauschen diese neuen Befehle ihre
  4579. Position in der Code-Tabelle mit den entsprechenden 8051-Instruktionen,
  4580. welche dann wiederum mit einem Pr"afix versehen werden m"ussen.
  4581. Damit \asname{} wei"s, wann er Pr"afixe setzen mu"s und wann nicht, mu"s man
  4582. ihm mit diesem Befehl mitteilen, ob der Prozessor im Quellmodus (\tty{ON})
  4583. oder Bin"armodus (\tty{OFF}) betrieben wird.  Die momentane Einstellung
  4584. kann man aus der Variablen \tty{INSRCMODE} auslesen.  Der Default ist
  4585. \tty{OFF}.
  4586.  
  4587. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4588.  
  4589. \subsection{PLAINBASE}
  4590. \ttindex{PLAINBASE}\label{SectPLAINBASE}
  4591.  
  4592. {\em G"ultigkeit: 6809}
  4593.  
  4594. Historisch erlaubt \asname{}, bei indizierten Adressierungsausdr"ucken ein
  4595. leeres, erstes Argument wegzulassen.  Ein
  4596. \begin{verbatim}
  4597.  lda  x
  4598. \end{verbatim}
  4599. zum Beispiel war also "aquivalent zu
  4600. \begin{verbatim}
  4601.  lda  ,x
  4602. \end{verbatim}
  4603. Obwohl als Feature gedacht, wurde dies jedoch gelegentlich eher als Bug
  4604. angesehen.  Deshalb darf ein leeres Index-Argument nicht mehr weggelassen werden
  4605. bzw. wird mit einer Fehlermeldung "uber eine falsche Anzahl Argumente quittiert.
  4606. Falls die Funktion gew"unscht ist bzw. f"ur existierenden Code gebraucht wird,
  4607. kann sie mit einem
  4608. \begin{verbatim}
  4609.  plainbase on
  4610. \end{verbatim}
  4611. wieder eingeschaltet werden.  Die aktuelle Einstellung kann aus dem gleichnamigen
  4612. Symbol ausgelesen werden.
  4613.  
  4614. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4615.  
  4616. \subsection{BIGENDIAN}
  4617. \ttindex{ENDIAN}\ttindex{BIGENDIAN}\label{SectBIGENDIAN}
  4618.  
  4619. {\em G"ultigkeit: MCS-51/251, PowerPC, SC/MP, 2650, NS32000}
  4620.  
  4621. Bei den Prozessoren der 8051-Serie ist Intel seinen eigenen Prinzipien
  4622. untreu geworden: Der Prozessor verwendet entgegen jeglicher Tradition
  4623. eine Big-Endian-Orientierung von Mehrbytewerten!  W"ahrend dies bei
  4624. den MCS-51-Prozessoren noch nicht gro"sartig auffiel, da der Prozessor
  4625. ohnehin nur 8-bittig auf Speicherzellen zugreifen konnte, man sich die
  4626. Byte-Anordnung bei eigenen Datenstrukturen also aussuchen konnte, ist
  4627. dies beim MCS-251 nicht mehr so, er kann auch ganze (Lang-)Worte aus
  4628. dem Speicher lesen und erwartet dabei das MSB zuerst.  Da dies nicht der
  4629. bisherigen Arbeitsweise von \asname{} bei der Konstantenablage entspricht,
  4630. kann man nun mit diesem Befehl umschalten, ob die Befehle \tty{DB, DW, DD,
  4631. DQ} und \tty{DT} mit Big- oder Little-Endian-Orientierung arbeiten sollen.
  4632. Mit \tty{BIGENDIAN OFF} (Voreinstellung) wird wie bei "alteren \asname{}-Versionen
  4633. zuerst das niederwertigste Byte abgelegt, mit \tty{BIGENDIAN ON} wird die
  4634. MCS-251-kompatible Variante benutzt.  Nat"urlich kann man diese Einstellung
  4635. beliebig oft im Code "andern; die momentane Einstellung kann aus dem
  4636. gleichnamigen Symbol ausgelesen werden.
  4637.  
  4638. F"ur Renesas RX ist die Endianess ebenfalls umschaltbar, aus Kompatibilit"at
  4639. zum Original-Assembler hei"st der Befehl hier jedoch \tty{ENDIAN} und
  4640. akzeptiert ein \tty{LITTLE} oder \tty{BIG} als Argument.
  4641.  
  4642. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4643.  
  4644. \subsection{WRAPMODE}
  4645. \ttindex{WRAPMODE}
  4646.  
  4647. {\em G"ultigkeit: Atmel AVR}
  4648.  
  4649. Ist dieser Schalter auf {\tt ON} gesetzt, so veranla"st man \asname{} dazu,
  4650. anzunehmen, der Programmz"ahler des Prozessors habe nicht die volle, durch
  4651. die Architektur gegebene L"ange von 16 Bits, sondern nur eine L"ange, die
  4652. es gerade eben erlaubt, das interne ROM zu adressieren.  Im Falle des
  4653. AT90S8515 sind dies z.B. 12 Bit, entsprechend 4 KWorten oder 8 KBytes.
  4654. Damit werden relative Spr"unge vom Anfang des ROMs zum Ende und umgekehrt
  4655. m"oglich, die bei strenger Arithmetik einen out-of-branch ergeben w"urden,
  4656. hier jedoch funktionieren, weil die "Ubertragsbits bei der
  4657. Zieladressenberechnung 'unter den Tisch' fallen.  Vergewissern Sie sich
  4658. genau, ob die von Ihnen eingesetzte Prozessorvariante so arbeitet, bevor
  4659. Sie diese Option einschalten!  Im Falle des oben erw"ahnten AT90S8515 ist
  4660. diese Option sogar zwingend n"otig, um "uberhaupt quer durch den ganzen
  4661. Adre"sraum springen zu k"onnen...
  4662.  
  4663. Defaultm"a"sig steht dieser Schalter auf {\tt OFF}, der momentane Stand
  4664. l"a"st sich aus einem gleichnamigen Symbol auslesen.
  4665.  
  4666. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4667.  
  4668. \subsection{PANEL}
  4669. \ttindex{PANEL}
  4670.  
  4671. {\em G"ultigkeit: IM61x0}
  4672.  
  4673. Mit diesem Schalter teilt man dem Assembler mit, ob der folgende Code
  4674. mit gesetztem oder gel"oschtem {\em Control Panel Flip-Flop} ausgef"uhrt
  4675. wird.  Eine Reihe von {\tt IOT}-Instruktionen sind nur bei einer bestimmten
  4676. Stellung des Flip-Flops zul"assig.  Ihre Verwendung im anderen Modus
  4677. wird vom Assembler mit einer Fehlermeldung quittiert.
  4678.  
  4679. Die aktuelle Einstellung kann aus dem Symbol {\tt INPANEL} gelesen werden.
  4680.  
  4681. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4682.  
  4683. \subsection{SEGMENT}
  4684. \ttindex{SEGMENT}
  4685. \label{SEGMENT}
  4686.  
  4687. {\em G"ultigkeit: alle Prozessoren}
  4688.  
  4689. Bestimmte Mikrokontroller und Signalprozessoren kennen mehrere
  4690. Adre"sbereiche, die nicht miteinander mischbar sind und jeweils auch
  4691. verschiedene Befehle zur Ansprache ben"otigen.  Um auch diese verwalten zu
  4692. k"onnen, stellt der Assembler mehrere Programmz"ahler zur Verf"ugung,
  4693. zwischen denen mit dem
  4694. \tty{SEGMENT}-Befehl hin-und hergeschaltet werden kann.  Dies erlaubt es,
  4695. sowohl in mit \tty{INCLUDE} eingebundenen Unterprogrammen als auch im
  4696. Hauptprogramm ben"otigte Daten an der Stelle zu definieren, an denen
  4697. sie benutzt werden.  Im einzelnen werden folgende Segmente mit folgenden
  4698. Namen verwaltet:
  4699. \begin{itemize}
  4700. \item{\tty{CODE}: Programcode;}
  4701. \item{\tty{DATA}: direkt adressierbare Daten (dazu rechnen auch SFRs);}
  4702. \item{\tty{XDATA}: im extern angeschlossenen RAM liegende Daten oder
  4703.             X-Adre"sraum beim DSP56xxx oder ROM-Daten beim $\mu$PD772x;}
  4704. \item{\tty{YDATA}: Y-Adre"sraum beim DSP56xxx;}
  4705. \item{\tty{IDATA}: indirekt adressierbare (interne) Daten;}
  4706. \item{\tty{BITDATA}: der Teil des 8051-internen RAMs, der bitweise
  4707.      adressierbar ist;}
  4708. \item{\tty{IO}: I/O-Adre"sbereich;}
  4709. \item{\tty{REG}: Registerbank des ST9;}
  4710. \item{\tty{ROMDATA}: Konstanten-ROM der NEC-Signalprozessoren;}
  4711. \item{\tty{EEDATA}: eingebautes EEPROM.}
  4712. \end{itemize}
  4713. Zu Adre"sbereich und Initialwerten der Segmente siehe Abschnitt \ref{SectORG}.
  4714. (\tty{ORG}).  Je nach Prozessorfamilie sind auch nicht alle Segmenttypen
  4715. erlaubt.
  4716. \par
  4717. Das Bitsegment wird so verwaltet, als ob es ein Bytesegment w"are,
  4718. d.h. die Adressen inkrementieren um 1 pro Bit.
  4719. \par
  4720. Labels, die in einem Segment eines bestimmten Typs definiert werden,
  4721. erhalten diesen Typ als Attribut.  Damit hat der Assembler eine
  4722. begrenzte Pr"ufm"oglichkeit, ob mit den falschen Befehlen auf Symbole
  4723. in einem Segment zugegriffen wird.  In solchen F"allen wird der
  4724. Assembler eine Warnung ausgeben.
  4725. \par
  4726. Beispiel:
  4727. \begin{verbatim}
  4728.        CPU     8051    ; MCS-51-Code
  4729.  
  4730.        SEGMENT code    ; Testcodeblock
  4731.  
  4732.        SETB    flag    ; keine Warnung
  4733.        SETB    var     ; Warnung : falsches Segment
  4734.  
  4735.        SEGMENT data
  4736.  
  4737. var     DB      ?
  4738.  
  4739.        SEGMENT bitdata
  4740.  
  4741. flag    DB      ?
  4742. \end{verbatim}
  4743.  
  4744. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4745.  
  4746. \subsection{PHASE und DEPHASE}
  4747. \ttindex{PHASE}\ttindex{DEPHASE}
  4748.  
  4749. {\em G"ultigkeit: alle Prozessoren}
  4750.  
  4751. In manchen Anwendungen (speziell Z80-Systeme) mu"s Code vor der
  4752. Benutzung in einen anderen Adre"sbereich verschoben werden.  Da der
  4753. Assembler davon aber nichts wei"s, w"urde er alle Labels in dem zu
  4754. verschiebenden Teil auf die Ladeadressen ausrichten.  Der Programmierer
  4755. m"u"ste Spr"unge innerhalb dieses Bereiches entweder lageunabh"angig
  4756. kodieren oder die Verschiebung bei jedem Symbol ,,zu Fu"s'' addieren.
  4757. Ersteres ist bei manchen Prozessoren gar nicht m"oglich, letzteres sehr
  4758. fehleranf"allig.
  4759. \par
  4760. Mit dem Befehlen \tty{PHASE} und \tty{DEPHASE} ist es m"oglich, dem
  4761. Assembler mitzuteilen, auf welcher Adresse der Code im Zielsystem
  4762. effektiv ablaufen wird:
  4763. \begin{verbatim}
  4764.        PHASE   <Adresse>
  4765. \end{verbatim}
  4766. informiert den Assembler davon, da"s der folgende Code auf der
  4767. spezifizierten Adresse ablaufen soll.  Der Assembler berechnet
  4768. daraufhin die Differenz zum echten Programmz"ahler und addiert diese
  4769. Differenz bei folgenden Operationen dazu:
  4770. \begin{itemize}
  4771. \item{Adre"sangabe im Listing}
  4772. \item{Ablage von Labelwerten}
  4773. \item{Programmz"ahlerreferenzen in relativen Spr"ungen und
  4774.      Adre"sausdr"ucken}
  4775. \item{Abfrage des Programmz"ahlers mit den Symbolen \verb!*! bzw. \verb!$!}
  4776. \end{itemize}
  4777. Diese ,,Verschiebung'' wird mit dem Befehl
  4778. \begin{verbatim}
  4779.        DEPHASE
  4780. \end{verbatim}
  4781. wieder auf den vor der zugeh"origen \tty{PHASE}-Anweisung zur"uck ge"andert.
  4782. \tty{PHASE} und \tty{DEPHASE} k"onnen also auf diese Weise geschachtelt
  4783. verwendet werden.
  4784. \par
  4785. Obwohl dieses Befehlspaar vornehmlich in Codesegmenten Sinn macht,
  4786. verwaltet der Assembler f"ur alle definierten Segmente Phasenwerte.
  4787.  
  4788. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4789.  
  4790. \subsection{SAVE und RESTORE}
  4791. \ttindex{SAVE}\ttindex{RESTORE}
  4792. \ttindex{.SAVE}\ttindex{.RESTORE}
  4793. \ttindex{SAVEENV}\ttindex{RESTOREENV}
  4794.  
  4795. {\em G"ultigkeit: alle Prozessoren}
  4796.  
  4797. Mit dem Befehl \tty{SAVE} legt der Assembler den Inhalt folgender
  4798. Variablen auf einen internen Stapel:
  4799. \begin{itemize}
  4800. \item{momentan gew"ahlter Prozessortyp (mit \tty{CPU} gesetzt);}
  4801. \item{momentan aktiver Speicherbereich (mit \tty{SEGMENT} gesetzt);}
  4802. \item{Flag, ob Listing ein- oder ausgeschaltet ist (mit \tty{LISTING}
  4803.      gesetzt);}
  4804. \item{Flags, zu welchem Teil Expansionen folgender Makos im Listing
  4805.      ausgegeben werden sollen (mit \tty{MACEXP\_DFT/MACEXP\_OVR}
  4806.      gesetzt).}
  4807. \item{momentan aktive Zeichen"ubersetzungstabelle (mit \tty{CODEPAGE}
  4808.      gesetzt).}
  4809. \end{itemize}
  4810. Mit dem Gegenst"uck \tty{RESTORE} wird entsprechend der zuletzt
  4811. gesicherte Zustand von diesem Stapel wieder heruntergeladen.  Diese beiden
  4812. Befehle sind in erster Linie f"ur Include-Dateien definiert worden, um
  4813. in diesen Dateien die obigen Variablen beliebig ver"andern zu k"onnen,
  4814. ohne ihren originalen Inhalt zu verlieren.  So kann es z.B. sinnvoll sein,
  4815. in Include-Dateien mit eigenen, ausgetesteten Unterprogrammen die
  4816. Listingerzeugung auszuschalten:
  4817. \begin{verbatim}
  4818.        SAVE            ; alten Zustand retten
  4819.        LISTING OFF     ; Papier sparen
  4820.        ..              ; der eigentliche Code
  4821.        RESTORE         ; wiederherstellen
  4822. \end{verbatim}
  4823. Gegen"uber einem einfachen \tty{LISTING OFF..ON}-P"archen wird hier
  4824. auch dann der korrekte Zustand wieder hergestellt, wenn die Listingerzeugung
  4825. bereits vorher ausgeschaltet war.
  4826. \par
  4827. Der Assembler "uberpr"uft, ob die Zahl von \tty{SAVE}-und \tty{RESTORE}-Befehlen
  4828. "ubereinstimmt und liefert in folgenden F"allen Fehlermeldungen:
  4829. \begin{itemize}
  4830. \item{\tty{RESTORE} und der interne Stapel ist leer;}
  4831. \item{nach Ende eines Passes ist der Stapel nicht leer.}
  4832. \end{itemize}
  4833. Falls das aktuell benutzte Target bereits einen Maschinenbefehl namens \tty{SAVE}
  4834. bzw. \tty{RESTORE} hat, kann die Funktionalit"at "uber \tty{SAVEENV} bzw.
  4835. \tty{RESTOREENV} erreicht werden.  Wahlweise ist es auch immer m"oglich, explizit
  4836. die Pseudobefehle durch voran gestellte Punkte (\tty{.SAVE} bzw. \tty{.RESTORE})
  4837. aufzurufen.
  4838.  
  4839. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4840.  
  4841. \subsection{ASSUME}
  4842. \ttindex{ASSUME}
  4843.  
  4844. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  4845.  
  4846. {\em G"ultigkeit: diverse}
  4847.  
  4848. Mit diesem Befehl kann man \asname{} den aktuellen Stand bestimmter Register
  4849. mitteilen, deren Inhalt sich nicht mit einem einfachen \tty{ON} oder
  4850. \tty{OFF} beschreiben l"a"st.  Typischerweise sind dies Register, die die
  4851. Adressierungseinheiten beeinflussen und deren Werte \asname{} wissen mu"s, um
  4852. korrekte Adressierungen zu erzeugen.  Wichtig ist, da"s man \asname{} mit ASSUME
  4853. diese Werte nur mitteilt, es wird {\em kein} Maschinencode erzeugt, der
  4854. diese Werte in die entsprechenden Register l"adt!
  4855.  
  4856. Ein mit \tty{ASSUME} definierter Wert l"a"st sich mit der
  4857. eingebauten Funktion \tty{ASSUMEDVAL} wieder abfragen oder in
  4858. Ausdr"ucke einbauen.  Dies gilt f"ur alle im folgenden gelisteten
  4859. Architekturen mit Ausnahme des 8086.
  4860.  
  4861. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  4862.  
  4863. \subsubsection{65CE02}
  4864.  
  4865. Der 65CE02 besitzt ein Register 'B', mit dem die 'Base-Page' festgelegt wird.
  4866. Im Gegensatz zum 'einfachen' 6502 l"a"st sich damit die Speicherseite, die
  4867. mit kurzen (8-bittigen) Adressen ansprechbar ist, frei im 64K-Adre'sraum hin-
  4868. und herschieben.  Nach einem Reset steht dieses Register auf Null, der 65CE02
  4869. verh"alt sich also wie sein Vorbild.  Dies ist auch die Default-Annahme des
  4870. Assemblers.  Mittels eines \tty{ASSUME B:xx} kann man ihm den aktuellen Wert
  4871. mitteilen, und f"ur Adressen in dieser Seite werden dann automatisch kurze
  4872. Adressierungsarten benutzt.
  4873.  
  4874. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  4875.  
  4876. \subsubsection{6809}
  4877.  
  4878. Im Gegensatz zu seinen ,,Vorg"angern'' wie 6800 und 6502 kann beim
  4879. 6809 die Lage der direct page, d.h. des Adressbereiches, der mit ein
  4880. Byte langen Adressen erreichbar ist, frei bestimmt werden.  Dazu dient
  4881. das sog. ,,Direct Page Register'' (\tty{DPR}), das die Seitennummer
  4882. festlegt.  Ihm mu"s man mittels \tty{ASSUME} einen passenden Wert
  4883. zuweisen, wenn man einen anderen Wert als die Vorgabe von 0 in DPR
  4884. schreibt, sonst werden Adressen falscher L"ange erzeugt...
  4885.  
  4886.  
  4887. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  4888.  
  4889. \subsubsection{68HC11K4}
  4890.  
  4891. Auch beim HC11 kamen die Entwickler letzen Endes nicht um eine Form von
  4892. Banking herum, um mit 16 Adre"sleitungen mehr als 64 Kbyte anzusprechen.  Die
  4893. Register {\tt MMSIZ}, {\tt MMWBR}, {\tt MM1CR} und {\tt MM2CR} legen fest,
  4894. ob und wie die beiden zus"atzlichen 512K-Bereiche in den Adre"sraum der CPU
  4895. eingeblendet werden sollen.  Initial nimmt \asname{} den Reset-Zustand
  4896. dieser Register an, d.h. alle mit \$00 belegt und das Windowing ist
  4897. abgeschaltet.
  4898.  
  4899. Weiterhin kann man die Werte der Register {\tt CONFIG}, {\tt INIT} und {\tt INIT2}
  4900. festlegen.  Aus diesen kann der Assembler die Lage der CPU-internen Register sowie
  4901. des CPU-internen RAM/EEPROM bestimmen.  Deren Mapping hat eine h"ohere Priorit"at
  4902. als die per Windowing eingeblendeten Speicherbereiche.
  4903.  
  4904. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  4905.  
  4906. \subsubsection{68HC12X}
  4907.  
  4908. Wie die Variante ohne anh"angendes 'X' kennt auch der HC12X eine kurze
  4909. direkte Adressierungsart, die hier jedoch auch andere Adre"sbereiche als
  4910. die ersten 256 Byte erreichen kann.  "Uber das {\tt DIRECT}-Register kann
  4911. die 256-Byte-Seite vorgegeben werden, die mit dieser kurzen
  4912. Adressierungsart angesprochen wird.  Mittels {\tt ASSUME} wird \asname{} der
  4913. momentane Stand dieses Registers mitgeteilt, so da"s bei absoluten
  4914. Adressen automatisch die effizienteste Adressierungsart gew"ahlt werden
  4915. kann.  Default ist 0, was auch dem Reset-Zustand entspricht.
  4916.  
  4917. \subsubsection{68HC16}
  4918.  
  4919. Um mit seinen nur 16 Bit breiten Adre"soperanden einen 1 Mbyte gro"sen
  4920. Adre"sraum ansprechen zu k"onnen, bedient sich der 68HC16 einer Reihe
  4921. von Bank-Registern, die die fehlenden oberen vier Adre"sbits nachliefern.
  4922. Davon ist das \tty{EK}-Register f"ur absolute Datenzugriffe (nicht
  4923. Spr"unge!) zust"andig.  \asname{} "uberpr"uft bei jeder absoluten Adressierung,
  4924. ob die oberen vier Bits der Adresse mit dem "uber \tty{ASSUME}
  4925. spezifizierten Wert "ubereinstimmen.  Differieren die Werte, gibt \asname{} eine
  4926. Warnung aus.  Der Vorgabewert f"ur \tty{EK} ist 0.
  4927.  
  4928. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  4929.  
  4930. \subsubsection{H8/500}
  4931.  
  4932. Im Maximum-Modus wird der erweiterte Adre"sraum dieser Prozessorreihe
  4933. durch eine Reihe von Bank-Registern adressiert.  Diese tragen die
  4934. Namen DP (Register 0..3, absolute Adressen), EP (Register 4/5) und
  4935. TP (Stack).  Den momentanen Wert von DP ben"otigt \asname{}, um zu "uberpr"ufen,
  4936. ob absolute Adressen in der momentan adressierbaren Bank liegen;
  4937. die beiden anderen Register werden nur f"ur indirekte Adressierungen
  4938. benutzt und entziehen sich daher der Kontrolle; ob man ihre Werte
  4939. angibt oder nicht, ist daher Geschmackssache.  Wichtig ist dagegen
  4940. wieder das BR-Register, das angibt, auf welchen 256-Byte-Bereich
  4941. mit kurzen Adressen zugegriffen werden kann.  Allen Registern ist
  4942. gemeinsam, da"s \asname{} {\em keine} Initialwerte f"ur sie annimmt, da sie nach
  4943. einem Prozessor-Reset undefiniert sind; wer absolut adressieren
  4944. will, mu"s daher auf jeden Fall DR und DP belegen!
  4945.  
  4946. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  4947.  
  4948. \subsubsection{MELPS740}
  4949.  
  4950. Die Mikrokontroller dieser Reihe kennen f"ur den \tty{JSR}-Befehl eine
  4951. besondere Adressierungsart ,,special page'', mit deren Hilfe man Spr"unge
  4952. in die oberste Seite des internen ROMs k"urzer kodieren kann.  Diese
  4953. ist nat"urlich vom jeweiligen Chip abh"angig, und es gibt mehr Chips,
  4954. als es mit dem \tty{CPU}-Befehl sinnvoll w"are, zu kodieren...also mu"s
  4955. \tty{ASSUME} herhalten, um die Lage dieser Seite vorzugeben, z.B.
  4956. \begin{verbatim}
  4957.        ASSUME SP:$1f ,
  4958. \end{verbatim}
  4959. falls das interne ROM 8K gro"s ist.
  4960.  
  4961. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  4962.  
  4963. \subsubsection{MELPS7700/65816}
  4964.  
  4965. Diese Prozessoren beinhalten eine Reihe von Registern, deren Inhalt \asname{}
  4966. kennen mu"s, um den korrekten Code zu erzeugen.  Es handelt sich um folgende
  4967. Register:
  4968. \begin{center}\begin{tabular}{|l|l|l|l|}
  4969. \hline
  4970. Name  & Bedeutung           & Wertebereich & Default\\
  4971. \hline
  4972. \hline
  4973. DT/DBR & Datenbank           & 0-\$ff       & 0 \\
  4974. PG/PBR & Code-Bank           & 0-\$ff       & 0 \\
  4975. DPR   & direkt adr. Seite   & 0-\$ffff     & 0 \\
  4976. X     & Indexregisterbreite & 0 oder 1     & 0 \\
  4977. M     & Akkumulatorbreite   & 0 oder 1     & 0 \\
  4978. \hline
  4979. \end{tabular}\end{center}
  4980. \par
  4981. Um mich nicht in endlose Wiederholungen zu ergehen, verweise ich f"ur die
  4982. Benutzung dieser Werte auf Kapitel \ref{MELPS7700Spec}.  Die Handhabung
  4983. erfolgt ansonsten genauso wie beim 8086, d.h. es k"onnen auch hier mehrere
  4984. Werte auf einmal gesetzt werden und es wird \bb{kein} Code erzeugt, der
  4985. die Register mit den Werten besetzt.  Dies bleibt wieder einzig und allein
  4986. dem Programmierer "uberlassen!
  4987.  
  4988. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  4989.  
  4990. \subsubsection{MCS-196/296}
  4991.  
  4992. Alle Prozessoren der MCS-96-Familie besitzen ab dem 80196 ein Register \tty{WSR},
  4993. mit dessen Hilfe Speicherbereiche aus dem erweiterten internen RAM
  4994. oder dem SFR-Bereich in Bereiche des Registerfiles eingeblendet werden
  4995. und so mit kurzen Adressen angesprochen werden k"onnen.  Teilt man \asname{}
  4996. mit Hilfe des \tty{ASSUME}-Befehls mit, welchen Wert das WSR-Register
  4997. hat, so stellt er bei absoluten Adressen automatisch fest, ob  sie
  4998. durch das Windowing mit 1-Byte-Adressen erreicht werden k"onnen;
  4999. umgekehrt werden auch f"ur durch das Windowing "uberdeckte Register
  5000. automatisch lange Adressen erzeugt.  Der 80296 besitzt ein zus"atzliches,
  5001. zweites Register \tty{WSR1}, um zwei unterschiedliche Speicherbereiche
  5002. gleichzeitig in das Registerfile einblenden zu k"onnen.  Sollte
  5003. es m"oglich sein, eine Speicherzelle "uber beide Bereiche zu adressieren,
  5004. so w"ahlt \asname{} immer den Weg "uber \tty{WSR}!
  5005.  
  5006. Bei indirekter Adressierung k"onnen Displacements wahlweise kurz (8 Bit,
  5007. -128 bis +127) oder lang (16 Bit) sein.  Der Assembler w"ahlt automatisch
  5008. anhand des Displacements die k"urzestm"ogliche Kodierung.  Es ist aber m"oglich,
  5009. durch ein vorangestelltes Gr"o"ser-Zeichen (\verb!>!) eine 16-Bit-Kodierung
  5010. des Displacements zu erzwingen.  Gleiches gilt f"ur absolute Adressen im
  5011. Bereich 0ff80h...0ffffh, die mit einem kurzen Offset relativ zum "Nullregister"
  5012. adressiert werden k"onnen.
  5013.  
  5014. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5015.  
  5016. \subsubsection{8086}
  5017.  
  5018. Der 8086 kann Daten aus allen Segmenten in einem Befehl adressieren,
  5019. ben"otigt jedoch sog. ,,Segment-Pr"afixe'', wenn ein anderes Segmentregister
  5020. als DS verwendet werden soll.  Zus"atzlich kann es sein, da"s das
  5021. DS-Register auf ein anderes Segment verstellt ist, um z.B. "uber l"angere
  5022. Strecken nur Daten im Codesegment zu adressieren.  Da \asname{} aber keine
  5023. Sinnanalyse des Codes vornimmt, mu"s ihm "uber diesen Befehl mitgeteilt
  5024. werden, auf welche Segmente die Segmentregister momentan zeigen, z.B.
  5025. \begin{verbatim}
  5026.   ASSUME  CS:CODE, DS:DATA    .
  5027. \end{verbatim}
  5028. Allen vier Segmenten des 8086 (SS,DS,CS,ES) k"onnen auf diese Weise Annahmen
  5029. zugewiesen werden.  Dieser Befehl erzeugt jedoch \bb{keinen} Code, um
  5030. die Werte auch wirklich in die Segmentregister zu laden, dies mu"s vom
  5031. Programm getan werden.
  5032. \par
  5033. Die Benutzung diese Befehls hat zum einen die Folge, da"s \asname{} bei
  5034. sporadischen Zugriffen ins Codesegment automatisch Pr"afixe voranstellen
  5035. kann, andererseits da"s man \asname{} mitteilen kann, da"s das DS-Register verstellt
  5036. wurde und man sich im folgenden explizite \tty{CS:}-Anweisungen sparen
  5037. kann.
  5038. \par
  5039. G"ultige Argumente hinter dem Doppelpunkt sind \tty{CODE, DATA} und
  5040. \tty{NOTHING}.  Letzterer Wert dient dazu, \asname{} mitzuteilen, da"s das
  5041. Segmentregister keinen f"ur \asname{} verwendbaren Wert enth"alt.
  5042. Vorinitialisiert sind folgende \tty{ASSUME}s :
  5043. \begin{verbatim}
  5044.  CS:CODE, DS:DATA, ES:NOTHING, SS:NOTHING
  5045. \end{verbatim}
  5046.  
  5047. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5048.  
  5049. \subsubsection{Z180}
  5050.  
  5051. Der Z180 besitzt eine eingebaute MMU, die den ,,logischen Adre"sraum'' des
  5052. CPU-Kerns von 64 KByte auf einen physischen Adre"sraum von 512 KByte "ubersetzt.
  5053. Das genaue Mapping wird durch die drei Register {\tt CBAR}, {\tt CBR} und {\tt BBR}
  5054. gesteuert.  Im Gegensatz zum 68HC11K4 nimmt der Assembler aktuell keine
  5055. automatischen Umrechnungen von physischen auf logische Adressen vor, sondern
  5056. h"alt lediglich intern Umrechnungstabellen vor.  Es ist aber m"oglich, diese
  5057. unter Benutzung der {\tt phys2cpu()}-Funktion zu benutzen.
  5058.  
  5059. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5060.  
  5061. \subsubsection{XA}
  5062.  
  5063. Die XA-Familie besitzt einen Datenadre"sraum von 16 Mbyte, ein Proze"s
  5064. kann jedoch nur immer innerhalb einer 64K-Seite adressieren, die
  5065. durch das DS-Register vorgegeben wird.  \asname{} mu"s man den momentanen
  5066. Wert dieses Registers vorgeben, damit er Zugriffe auf absolute
  5067. Adressen "uberpr"ufen kann.
  5068.  
  5069. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5070.  
  5071. \subsubsection{29K}
  5072.  
  5073. Die Prozessoren der 29K-Familie besitzen ein Register \tty{RBP}, mit dessen
  5074. Hilfe B"anke von 16 Registern vor der Benutzung im User-Modus gesch"utzt
  5075. werden k"onnen.  Dazu kann man ein entsprechendes Bit in diesem Register
  5076. setzen.  Mit \tty{ASSUME} kann man \asname{} nun mitteilen, welchen Wert RBP
  5077. gerade hat.  Auf diese Weise kann \asname{} warnen, falls versucht wird, im
  5078. User-Modus auf gesch"utzte Register zuzugreifen.
  5079.  
  5080. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5081.  
  5082. \subsubsection{80C166/167}
  5083.  
  5084. Obwohl keines der Register im 80C166/167 breiter als 16 Bit ist, besitzt
  5085. dieser Prozessor 18/24 Adre"sleitungen, kann also bis zu 256 Kbyte/16 Mbyte
  5086. adressieren.  Um diesen Widerspruch unter einen Hut zu bekommen, verwendet
  5087. er nicht die von Intel her bekannte (...und ber"uchtigte) Segmentierung oder
  5088. hat unflexible Bankregister...nein, er macht Paging!  Dazu wird der ,,logische''
  5089. Adre"sraum von 64 Kbyte in 4 Seiten zu 16 Kbyte eingeteilt, und f"ur jede
  5090. Seite existiert ein Seitenregister (bezeichnet als \tty{DPP0...DPP3}), das
  5091. bestimmt, welche der physikalischen 16/1024 Seiten dort eingeblendet wird.  \asname{} versucht
  5092. nun, den Adre"sraum grunds"atzlich mit 256 Kbyte/16 Mbyte aus der Sicht des
  5093. Programmierers zu verwalten, d.h. bei absoluten Zugriffen ermittelt \asname{} die
  5094. physikalische Seite und schaut in der mit \tty{ASSUME} eingestellten
  5095. Seitenverteilung nach, wie die Bits 14 und 15 der logischen Adresse gesetzt
  5096. werden m"ussen.  Pa"st kein Seitenregister, so wird eine Warnung ausgegeben.
  5097. Defaultm"a"sig nimmt \asname{} an, da"s die vier Register linear die ersten 64 Kbyte
  5098. abbilden, etwa in der folgenden Form:
  5099. \begin{verbatim}
  5100.        ASSUME  DPP0:0,DPP1:1,DPP2:2,DPP3:3
  5101. \end{verbatim}
  5102. Der 80C167 kennt noch einige Befehle, die die Seitenregister in ihrer
  5103. Funktion "ubersteuern k"onnen.  Wie diese Befehle die Adre"sgenerierung
  5104. beeinflussen, ist im Kapitel mit den prozessorspezifischen Hinweisen
  5105. beschrieben.
  5106. \par
  5107. Einige Maschineninstruktionen kennen ein verk"urzte Kodierung, wenn das
  5108. Argument in einem bestimmten Wertebereich liegt:
  5109. \begin{itemize}
  5110. \item{\verb!MOV Rn,#<0..15>!}
  5111. \item{\verb!ADD/ADDC/SUB/SUBC/CMP/XOR/AND/OR Rn, #<0..7>!}
  5112. \item{\verb!LOOP Rn,#<0..15>!}
  5113. \end{itemize}
  5114. Der Assembler verwendet im Default automatisch die k"urzere Kodierung
  5115. wenn m"oglich.  Falls man die l"angere erzwingen m"ochte, schreibt
  5116. man analog zum 65xx/68xx ein Gr"o"serzeichen vor den Operanden (hinter
  5117. das Doppelkreuz!).  Umgekehrt kann man auch ein Kleinerzeichen schreiben,
  5118. wenn man die kurze Kodierung erzwingen will.  Falls der Operand nicht
  5119. im erlaubten Wertebereich liegt, gibt es eine Fehlermeldung.  Singem"a"s
  5120. das gleiche gilt f"ur Spr"unge, die mit kurzem Displacement oder langem,
  5121. absolutem Argument kodiert werden k"onnen.
  5122.  
  5123. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5124.  
  5125. \subsubsection{TLCS-47}
  5126.  
  5127. Der von der Architektur her vorgegebene Datenadre"sraum dieser
  5128. Prozessoren (egal ob man direkt oder "uber das HL-Register adressiert)
  5129. betr"agt lediglich 256 Nibbles.  Da die ,,besseren'' Familienmitglieder
  5130. aber bis zu 1024 Nibbles RAM on chip haben, war Toshiba gezwungen, einen
  5131. Bankingmechanismus "uber das DMB-Register einzuf"uhren.  \asname{} verwaltet
  5132. das Datensegment als einen durchgehenden Adre"sraum und pr"uft bei jeder
  5133. direkten Adressierung, ob die Adresse in der momentan aktiven Bank
  5134. liegt.  Die von \asname{} momentan angenommene Bank kann mittels
  5135. \begin{verbatim}
  5136.        ASSUME  DMB:<0..3>
  5137. \end{verbatim}
  5138. festgelegt werden.  Der Default ist 0.
  5139.  
  5140. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5141.  
  5142. \subsubsection{IPC-16/INS8900}
  5143. \label{PACEAssume}
  5144.  
  5145. Der Prozessor verf"ugt "uber einen Eingangs-Pin namens {\tt BPS}, mit dem man
  5146. w"ahlen kann, welcher Adre"sbereich direkt adressierbar sein soll: entweder
  5147. die untersten 256 Worte des Speichers, oder die jeweils obersten und untersten
  5148. 128 Worte.  Der Default is ersteres, mit einem {\tt ASSUME BPS:1} schaltet man
  5149. auf die zweite Variante um.
  5150.  
  5151. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5152.  
  5153. \subsubsection{ST6}
  5154. \label{ST6Assume}
  5155.  
  5156. Die Mikrokontroller der ST6-Reihe sind in der Lage, einen Teil (64 Byte)
  5157. des Codebereiches in den Datenbereich einzublenden, z.B. um Konstanten aus
  5158. dem ROM zu laden.  Dies bedeutet aber auch, da"s zu einem Zeitpunkt immer
  5159. nur ein Teil des ROMs adressiert werden kann.  Welcher Teil dies ist, wird
  5160. durch ein bestimmtes Register bestimmt.  Dem Inhalt dieses Registers kann
  5161. \asname{} zwar nicht direkt kontrollieren, man kann ihm aber mit diesem Befehl
  5162. mitteilen, wenn man dem Register einen neuen Wert zugewiesen hat.  \asname{} kann
  5163. dann pr"ufen und ggfs. warnen, falls auf Adressen im Codesegment
  5164. zugegriffen wird, die nicht im ,,angek"undigten'' Fenster liegt.
  5165. Hat die Variable \tty{VARI} z.B. den Wert 456h, so setzt
  5166. \begin{verbatim}
  5167.        ASSUME  ROMBASE:VARI>>6
  5168. \end{verbatim}
  5169. die \asname{}-interne Variable auf 11h, und ein Zugriff auf \tty{VARI} erzeugt einen
  5170. Zugriff auf die Adresse 56h im Datensegment.
  5171.  
  5172. Anstelle eines Symbols kann auch schlicht \tty{NOTHING} angegeben
  5173. werden, z.B. wenn das Bank-Register tempor"ar als Speicherzelle benutzt
  5174. wird.  Dieser Wert ist auch die Voreinstellung.
  5175.  
  5176. Der Programmz"ahler dieser Mikrokontroller ist lediglich 12 Bit breit.  Das
  5177. bedeutet f"ur Varianten mit mehr als 4 KByte Programmspeicher, da"s man sich
  5178. eine Art von Banking einfallen lassen mu"ste.  Dazu werden Adre"sraum und
  5179. Programmspeicher in 2 KByte-Seite eingeteilt.  Seite 1 des Adre"sraumes
  5180. greift immer auf Seite 1 des Programmspeichers zu.  "Uber das bei diesen
  5181. Varianten vorhandene \tty{PRPR}-Register kann der Programmierer bestimmen,
  5182. welche Seite des Programmspeichers "uber die Adressen 000h bis 7ffh
  5183. zugegriffen wird.  \asname{} betrachtet den Adre"sraum in erster N"aherung als
  5184. linear und von der Gr"o"se des Programmspeichers.  Erfolgt ein Sprung von
  5185. Seite 1 aus auf eine Adresse au"serhalb dieser Seite, wird gepr"uft, ob deren
  5186. Adresse mit dem aktuell angenommenen Wert des \tty{PRPR}-Registers identisch
  5187. ist.  Erfolgt ein Sprung von einer anderen Seite aus auf eine Adresse au"serhalb
  5188. Seite 1, wird gepr"uft, ob die Zieladresse innerhalb der gleichen Seite
  5189. liegt.  {\bf WICHTIG}: Da der Programmz"ahler nur 12 Bit breit ist, ist
  5190. es nicht m"oglich, ohne einen Umweg "uber Seite 1 von einer Seite in eine
  5191. andere zu springen - Mit einem Umsetzen des \tty{PRPR}-Registers au"serhalb
  5192. von Seite 1 w"urde man sich seinen eigenen Code unter den F"u"sen wegziehen.
  5193.  
  5194. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5195.  
  5196. \subsubsection{ST9}
  5197.  
  5198. Die ST9-Familie verwendet zur Adressierung von Code- und Datenbereich
  5199. exakt die gleichen Befehle.  Welcher Adre"sraum dabei jeweils
  5200. angesprochen wird, h"angt vom Stand des DP-Flags im Flag-Register ab.
  5201. Damit \asname{} bei absoluten Zugriffen "uberpr"ufen kann, ob man mit Symbolen
  5202. aus dem korrekten Adre"sraum arbeitet (das funktioniert nat"urlich {\em nur}
  5203. bei absoluten Zugriffen!), mu"s man ihm per \tty{ASSUME} mitteilen, ob das
  5204. DP-Flag momentan auf 0 (Code) oder 1 (Daten) steht.  Der Initialwert
  5205. dieser Annahme ist 0.
  5206.  
  5207. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5208.  
  5209. \subsubsection{uPD78(C)1x}
  5210.  
  5211. Diese Prozessoren besitzen ein Register (V), mit dessen Hilfe die
  5212. ,,Zeropage'', d.h. die Lage der mit nur einem Byte adressierbaren
  5213. Speicherzellen sich in Seitengrenzen im Speicher frei verschieben l"a"st.
  5214. Da man aber aus Bequemlichkeitsgr"unden nicht mit Ausdr"ucken wie
  5215. \begin{verbatim}
  5216.        inrw    Lo(Zaehler)
  5217. \end{verbatim}
  5218. arbeiten will, "ubernimmt \asname{} diese Arbeit, allerdings nur unter der
  5219. Voraussetzung, da"s man ihm "uber einen \tty{ASSUME}-Befehl den
  5220. Inhalt des V-Registers mitteilt.  Wird ein Befehl mit Kurzadressierung
  5221. benutzt, so wird "uberpr"uft, ob die obere H"alfte des Adre"sausdrucks
  5222. mit dem angenommenen Inhalt "ubereinstimmt.  Stimmt sie nicht, so erfolgt
  5223. eine Warnung.
  5224.  
  5225. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5226.  
  5227. \subsubsection{78K2}
  5228.  
  5229. 78K2 ist eine 8/16-Bit-Architektur, die nachtr"aglich durch Banking auf
  5230. einen (Daten-)Adre"sraum von einem MByte erweitert wurde.  Das Banking
  5231. wird mit den Registern PM6 (Normalfall) bzw. P6 (alternativer Fall mit
  5232. vorangestelltem \verb!&!) realisiert, die die fehlenden oberen vier Bits
  5233. nachliefern.  Zumindest bei absoluten Adressen kann \asname{} "uberpr"ufen, ob
  5234. die gerade angesprochene, lineare 20-bittige Adresse innerhalb des
  5235. gegebenen 64K-Fensters liegt.
  5236.  
  5237. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5238.  
  5239. \subsubsection{78K3}
  5240.  
  5241. Prozessoren mit 78K3-Kern besitzen Registerb"anke mit insgesamt 16 Registern,
  5242. die man "uber ihre Nummern ansprechen kann (\tty{R0} bis \tty{R15}) oder ihre symbolischen
  5243. Namen (\tty{X=R0, A=R1, C=R2, B=R3, VPL=R8, VPH=R9, UPL=R10, UPH=R11, E=R12,
  5244. D=R13, L=R14, H=R15}).  Der Prozessorkern besitzt ein Register-Auswahlbit
  5245. (\tty{RSS}), mit dem man das Mapping von A/X und B/C von R0..R3 auf R4..R7
  5246. umschaltet.  Dies ist in erste Linie f"ur Befehle wichtig, die implizit eines
  5247. dieser Register benutzen (d.h. bei denen die Registernummer nicht im Maschinenbefehl
  5248. kodiert ist).  Man kann dem Assembler aber auch "uber ein
  5249.  
  5250. \begin{verbatim}
  5251.  assume rss:1
  5252. \end{verbatim}
  5253.  
  5254. mitteilen, da"s die folgenden Befehle mit diesem ge"anderten Mapping arbeiten.  Der
  5255. Assembler wird f"ur Befehle, in denen die Registernummer explizit kodiert ist, dann
  5256. auch die alternativen Registernummern einsetzen.  Umgekehrt wird dann z.B. auch
  5257. \tty{R5} statt \tty{R1} im Quellcode wie \tty{A} behandelt.
  5258.  
  5259. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5260.  
  5261. \subsubsection{78K4}
  5262.  
  5263. 78K4 war als 'Upgrade-Pfad' vom 78K3 konzipiert, deshalb besitzt
  5264. dessen Prozessorkern auch ein RSS-Bit, mit dem man das Mapping
  5265. der Register AX und BC umschalten kann (auch wenn NEC von dessen
  5266. Verwendung in neuem Code abr"at).
  5267.  
  5268. Neben vielen neuen Befehlen und Adressierungsarten ist die
  5269. wesentliche Erweiterung der gr"o"sere Adre"raum von 16 MByte, von
  5270. dem allerdings nur das erste MByte f"ur Programmcode genutzt
  5271. werden kann.  Das CPU-interne RAM sowie die Special Function
  5272. Register k"onnen wahlweise am oberen Ende des ersten MByte oder
  5273. der ersten 64 KByte Seite liegen.  Dies teilt man dem Prozessor
  5274. durch den \tty{LOCATION}-Befehl mit, der als Argument wahlweise
  5275. eine 0 oder 15 akzeptiert.  Parallel damit schaltet der Prozessor
  5276. auch die Adre"sbereiche um, die mit kurzen (8-Bit) Adressen
  5277. erreicht werden k"onnen.  Parallel dazu mu"s man dem Assembler
  5278. mittels \tty{ASSUME LOCATION:..} ebenfalls dieser Wert mitgeteilt
  5279. werden, damit er kurze Adressen in den dazu passenden Bereichen
  5280. erzeugt.  Der Assembler nimmt f"ur LOCATION einen Default von Null
  5281. an.
  5282.  
  5283. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5284.  
  5285. \subsubsection{320C3x/C4x}
  5286.  
  5287. Da alle Instruktionsworte dieser Prozessorfamilie nur 32 Bit lang
  5288. sind, und von diesen 32 Bit nur 16 Bit f"ur absolute Adressen vorgesehen
  5289. wurden, m"ussen die fehlenden oberen 8/16 Bit aus dem DP-Register
  5290. erg"anzt werden.  Bei Adressierungen kann man aber trotzdem die volle
  5291. 24/32-Bit-Adresse angeben, \asname{} pr"uft dann, ob die oberen 8/16 Bit mit dem
  5292. angenommenen Inhalt von DP "ubereinstimmen.  Gegen"uber dem \tty{LDP}-Befehl
  5293. weicht \tty{ASSUME} darin ab, da"s man hier nicht eine beliebige Adresse
  5294. aus der Speicherbank angeben kann, das Herausziehen der oberen Bits
  5295. mu"s man also ,,zu Fu"s'' machen, z.B. so:
  5296. \begin{verbatim}
  5297.        ldp     @adr
  5298.        assume  dp:adr>>16
  5299.        .
  5300.        .
  5301.        .
  5302.        ldi     @adr,r2
  5303. \end{verbatim}
  5304.  
  5305. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5306.  
  5307. \subsubsection{75K0}
  5308.  
  5309. Da selbst mit Hilfe von Doppelregistern (8 Bit) nicht der komplette
  5310. Adre"sraum von 12 Bit zu erreichen ist, mu"ste NEC (wie andere auch...)
  5311. auf Banking zur"uck greifen: Die oberen 4 Adre"sbits werden aus dem
  5312. \tty{MBS}-Register geholt (welchem demzufolge mit \tty{ASSUME} Werte
  5313. zwischen 0 und 15 zugeordnet werden k"onnen), das aber nur beachtet
  5314. wird, falls das \tty{MBE}-Flag auf 1 gesetzt wurde.  Steht es (wie
  5315. die Vorgabe ist) auf 0, so kann man die obersten und untersten 128
  5316. Nibbles des Adre"sraumes ohne Bankumschaltung erreichen.  Da der 75402
  5317. weder \tty{MBE}-Flag noch \tty{MBS}-Register kennt, ist f"ur ihn der
  5318. \tty{ASSUME}-Befehl nicht definiert; Die Initialwerte von \tty{MBE} und
  5319. \tty{MBS} lassen sich daher nicht "andern.
  5320.  
  5321. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5322.  
  5323. \subsubsection{F$^2$MC16L}
  5324.  
  5325. Wie viele andere Mikrokontroller auch, leidet diese Familie etwas unter
  5326. der Knauserei seiner Entwickler: einem 24 Bit breiten Adre"sraum stehen 16
  5327. Bit breite Adre"sregister etwas unterbemittelt gegen"uber.  Also mu"sten
  5328. wieder mal Bank-Register her.  Im einzelnen sind dies PCB f"ur den
  5329. Programmcode, DTB f"ur alle Datenzugriffe, ADB f"ur indirekte Zugriffe
  5330. "uber RW2/RW6 und SSB/USB f"ur die Stacks.  Sie k"onnen alle Werte
  5331. zwischen 0 und 255 annehmen.  Defaultm"a"sig stehen alle Annahmen von \asname{}
  5332. auf 0, mit Ausnahme von 0ffh f"ur PCB.
  5333.  
  5334. Des weiteren existiert das DPR-Register, das angibt, welche Seite
  5335. innerhalb der durch DTB gegebenen 64K-Bank mit 8-Bit-Adressen erreicht
  5336. werden kann.  Der Default f"ur DPR ist 1, zusammen mit dem Default f"ur
  5337. DTB ergibt dies also eine Default-Seite bei 0001xxh.
  5338.  
  5339. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5340.  
  5341. \subsubsection{MN1613}
  5342.  
  5343. Beim MN1613 wurde eine Architektur mit 16-Bit-Adressen nachtr"aglich erweitert,
  5344. Dies wird durch einen Satz vier Bit breiter ,,Segment-Register'' (CSBR, SSBR, TSR0
  5345. und TSR1) erreicht, deren Wert (um 14 Bit nach links geschoben) zu den 16-Bit-
  5346. Adressen hinzu addiert wird.  Ein Proze"s kann auf diese Weise immer ein 64 KWorte
  5347. gro"ses Fenster im 256 KWorte gro"sen Adre"sraum adressieren.  Der Assembler
  5348. benutzt die per \tty{ASSUME} mitgeteilten Werte, um zu warnen, wenn eine absolute
  5349. Adresse innerhalb des 256K-Adre"sraums mit den aktuellen Werten nicht adressierbar
  5350. ist, und rechnet ansonsten den korrekten 16-bittigen Offset aus.  Bei indirekter
  5351. Adressierung ist so eine Pr"ufung (naturgem"a"s) nicht m"oglich.
  5352.  
  5353. %%. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  5354.  
  5355. \subsubsection{IM61x0}
  5356.  
  5357. Diese Mikroprozessoren implementieren den Befehlssatz einer PDP/8 und unterst"utzen
  5358. grunds"atzlich einen Adre"sraum von 4 Kiloworten.  Durch Banking kann dieser
  5359. auf acht ,,Felder'' von 4 Kiloworten erweitert werden.  Adressierung von Daten
  5360. und Spr"unge sind prinzipiell nur im gleichen Feld m"oglich, mit einer Ausnahme:
  5361. "uber das IB-Register sind Spr"unge in ein anderes 4K-Feld m"oglich.  Dieses gibt
  5362. die oberen Bits der insgesamt 15 Bit langen Zieladresse vor, falls IB per \tty{ASSUME}
  5363. auf einen Wert ungleich \tty{NOTHING} gesetzt ist.
  5364.  
  5365. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5366.  
  5367. \subsection{CKPT}
  5368. \ttindex{CKPT}
  5369.  
  5370. {\em G"ultigkeit: TI990/12}
  5371.  
  5372. Typ 12-Instruktionen erfordern f"ur ihre Ausf"uhrung ein sogenanntes {\em Checkpoint
  5373. Register}.  Dieses Register kann entweder explizit als viertes Argument angegeben
  5374. werden, oder es wird mit dieser Anweisung ein Default f"ur allen folgenden Code
  5375. festgelegt.  Wenn weder eine \tty{CKPT}-Anweisung noch ein explizites Register
  5376. angegeben wurde, wird eine Fehlermeldung ausgegeben. Der Default von keinem
  5377. Default-Register kann wiederhergestellt werden, indem man die \tty{CKPT}-Anweisung
  5378. mit {\tt NOTHING} als Argument aufruft.
  5379.  
  5380. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5381.  
  5382. \subsection{EMULATED}
  5383. \ttindex{EMULATED}
  5384.  
  5385. {\em G"ultigkeit: 29K}
  5386.  
  5387. AMD hat die Ausnahmebehandlung f"ur undefinierte Befehle bei der
  5388. 29000-Serie so definiert, da"s f"ur jeden einzelnen Befehl ein
  5389. Exception-Vektor zur Verf"ugung steht.  Dies legt es nahe, durch
  5390. gezielte Software-Emulationen den Befehlssatz eines kleineren
  5391. Mitgliedes dieser Familie zu erweitern.  Damit nun aber \asname{} diese
  5392. zus"atzlichen Befehle nicht als Fehler anmeckert, erlaubt es der
  5393. \tty{EMULATED}-Befehl, \asname{} mitzuteilen, da"s bestimmte Befehle doch
  5394. erlaubt sind.  Die Pr"ufung, ob der momentan gesetzte Prozessor
  5395. diesen Befehl beherrscht, wird dann "ubergangen.  Hat man z.B. f"ur
  5396. einen Prozessor ohne Gleitkommaeinheit ein Modul geschrieben, das
  5397. aber nur mit 32-Bit-IEEE-Zahlen umgehen kann, so schreibt man
  5398. \begin{verbatim}
  5399.        EMULATED FADD,FSUB,FMUL,FDIV
  5400.        EMULATED FEQ,FGE,FGT,SQRT,CLASS
  5401. \end{verbatim}
  5402.  
  5403. {\tt BRANCHEXT} mit \tty{ON} oder \tty{OFF} als Argument legt fest, ob \asname{}
  5404. kurze, nur mit einem 8-Bit-Displacement verf"ugbare Spr"unge automatisch
  5405. ,,verl"angern'' soll, indem z.B. aus einem einfachen
  5406. \begin{verbatim}
  5407.        bne     target
  5408. \end{verbatim}
  5409. automatisch eine l"angere Sequenz mit gleicher Funktion wird, falls das
  5410. Sprungziel zu weit von momentanen Programmz"ahler entfernt ist.  F"ur
  5411. {\tt bne} w"are dies z.B. die Sequenz
  5412. \begin{verbatim}
  5413.        beq     skip
  5414.        jmp     target
  5415. skip:
  5416. \end{verbatim}
  5417. Falls f"ur eine Anweisung aber kein passendes ,,Gegenteil'' existiert,
  5418. kann die Sequenz auch l"anger werden, z.B. f"ur {\tt jbc}:
  5419. \begin{verbatim}
  5420.        jbc     dobr
  5421.        bra     skip
  5422. dobr:   jmp     target
  5423. skip:
  5424. \end{verbatim}
  5425. Durch dieses Feature gibt es bei Spr"ungen keine eineindeutige Zuordnung
  5426. von Maschinen- und Assemblercode mehr, und bei Vorw"artsreferenzen handelt
  5427. man sich m"oglicherweise zus"atzliche Passes ein.  Man sollte dieses
  5428. Feature daher mit Vorsicht einsetzen!
  5429.  
  5430. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5431.  
  5432. \subsection{Z80SYNTAX}
  5433. \ttindex{Z80SYNTAX}
  5434.  
  5435. {\em G"ultigkeit: 8008, 8080/8085, $\mu$PD78xx}
  5436.  
  5437. Mit \tty{ON} als Argument kann man Assmebler-Befehle wahlweise
  5438. auch in der Form schreiben, wie sie Zilog f"ur den Z80 definiert hat.
  5439. Zum Beispiel benutzt man einfach nur noch \tty{LD} mit sich selbst
  5440. erkl"arenden Operanden, wo man in der originalen Syntax (bzw.
  5441. neueren 8008-Syntax) je nach Operanden \tty{MVI, LXI, MOV, STA, LDA,
  5442. SHLD, LHLD, LDAX, STAX} oder \tty{SPHL} schreiben mu"s.
  5443.  
  5444. Weil einige Mnemonics in der originalen und Z80-Syntax unterschiedliche
  5445. Bedeutung haben, kann man nicht zu 100\% im 'Z80-Stil' programmieren.
  5446. Alternativ schaltet man f"ur 8080/8085 mit einem \tty{EXCLUSIVE} als
  5447. Argument die originale Syntax ganz ab.  Details zu dieser Betriebsart
  5448. kann man im Abschnitt \ref{8080Spec} nachlesen.
  5449.  
  5450. Ein eingebautes Symbol mit gleichem Namen gestattet es, die aktuelle
  5451. Betriebsart auszulesen.  Es gilt \tty{0=OFF}, \tty{1=ON} und
  5452. \tty{2=EXCLUSIVE}.
  5453.  
  5454. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5455.  
  5456. \subsection{EXPECT und ENDEXPECT}
  5457. \ttindex{EXPECT}
  5458. \ttindex{ENDEXPECT}
  5459.  
  5460. Mit diesen beiden Befehlen rahmt man ein St"uck Quellcode ein, in dem ein
  5461. oder mehrere Fehler {\em erwartet} werden.  Treten die "uber ihre Nummern
  5462. (siehe Kapitel \ref{ChapErrMess}) identifizierten Fehler oder Warnungen auf, werden
  5463. sie unterdr"uckt, und die Assemblierung l"auft ohne Fehler durch - nat"urlich
  5464. ohne an dieser Stelle Code zu erzeugen.  Erwartete, aber nicht aufgetretene
  5465. Fehler oder Warnungen l"osen ihrerseits jedoch eine Fehlermeldung von
  5466. \tty{ENDEXPECT} aus.  Der Haupt-Anwendungszweck dieser Befehle findet sich
  5467. in den Selbst-Tests im tests/-Unterverzeichnis.  Z.B. kann man so testen,
  5468. ob Wertebereiche korrekt gepr"uft werden:
  5469. \begin{verbatim}
  5470.       cpu      68000
  5471.       expect   1320     ; immediate-Shift nur 1..8
  5472.       lsl.l    #10,d0
  5473.       endexpect
  5474. \end{verbatim}
  5475.  
  5476. %%---------------------------------------------------------------------------
  5477.  
  5478. \section{Datendefinitionen}
  5479.  
  5480. Die hier beschriebenen Befehle "uberschneiden sich teilweise in ihrer
  5481. Funktionalit"at, jedoch definiert jede Prozessorfamilie andere Namen
  5482. f"ur die gleiche Funktion.  Um mit den Standardassemblern konform zu
  5483. bleiben, wurde diese Form der Implementierung gew"ahlt.
  5484.  
  5485. Sofern nicht ausdr"ucklich anders erw"ahnt, kann bei allen Befehlen zur
  5486. Datenablage (nicht bei denen zur Speicherreservierung!) eine beliebige Zahl
  5487. von Parametern angegeben werden, die der Reihe nach abgearbeitet werden.
  5488.  
  5489. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5490.  
  5491. \subsection{DC[.size]}
  5492. \ttindex{DC}
  5493.  
  5494. {\em G"ultigkeit: 680x0, M*Core, 68xx, H8, SH7x00, DSP56xxx,\\
  5495.     XA, ST7/STM8, MN161x, IM61x0, CP-3F, SC61860}
  5496.  
  5497. Dieser Befehl legt eine oder mehrere Konstanten des beim durch
  5498. das Attribut bestimmten Typs im Speicher ab.  Die Attribute entsprechen
  5499. den in Abschnitt \ref{AttrTypes} definierten, zus"atzlich ist f"ur
  5500. Byte-Konstanten die M"oglichkeit vorhanden, Stringausdr"ucke im Speicher
  5501. abzulegen, wie z.B.
  5502. \begin{verbatim}
  5503. String  dc.b    "Hello world!\0"
  5504. \end{verbatim}
  5505. Die Parameterzahl darf zwischen 1 und 20 liegen, zus"atzlich darf jedem
  5506. Parameter ein in eckigen Klammern eingeschlossener Wiederholungsfaktor
  5507. vorausgehen, z.B. kann man mit
  5508. \begin{verbatim}
  5509.        dc.b    [(*+255)&$ffffff00-*]0
  5510. \end{verbatim}
  5511. den Bereich bis zur n"achsten Seitengrenze mit Nullen f"ullen.
  5512. \bb{Vorsicht!}
  5513. Mit dieser Funktion kann man sehr leicht die Grenze von 1 Kbyte erzeugten
  5514. Codes pro Zeile Quellcode "uberschreiten!
  5515. \par
  5516. Sollte die Byte-Summe ungerade sein, so kann vom Assembler automatisch
  5517. ein weiteres Byte angef"ugt werden, um die Wortausrichtung von Daten zu
  5518. erhalten.  Dieses Verhalten kann mit dem \tty{PADDING}-Befehl ein-
  5519. und ausgeschaltet werden.
  5520. \par
  5521. Mit diesem Befehl abgelegte Dezimalgleitkommazahlen (\tty{DC.P} ...) k"onnen
  5522. zwar den ganzen Bereich der extended precision "uberstreichen, zu beachten
  5523. ist dabei allerdings, da"s die von Motorola verf"ugbaren Koprozessoren
  5524. 68881/68882 beim Einlesen solcher Konstanten die Tausenderstelle des
  5525. Exponenten ignorieren!
  5526. \par
  5527. Default-Attribut ist \tty{W}, also 16-Bit-Integerzahlen.
  5528. \par
  5529. Beim DSP56xxx ist der Datentyp auf Integerzahlen festgelegt (ein
  5530. Attribut ist deshalb weder n"otig noch erlaubt), die im Bereich
  5531. -8M..16M-1 liegen d"urfen.   Stringkonstanten sind ebenfalls erlaubt,
  5532. wobei jeweils drei Zeichen in ein Wort gepackt werden.
  5533. \par
  5534. Es ist im Gegensatz zum Original Motorola-Assembler auch erlaubt, mit
  5535. diesem Kommando Speicher zu reservieren, indem man als Argument ein
  5536. Fragezeichen angibt.  Diese Erweiterung haben wohl einige Drittanbieter
  5537. von 68K-Assemblern eingebaut, in Anlehnung an das, was Intel-Assembler
  5538. machen.  Wer dies benutzt, sollte sich aber im klaren sein, da"s dies
  5539. zu Problemen beim Portieren von Code auf andere Assembler f"uhren kann.
  5540. Des weiteren d"urfen Fragezeichen als Operanden nicht mit 'normalen'
  5541. Konstanten in einer Anweisung gemischt werden.
  5542.  
  5543. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5544.  
  5545. \subsection{DS[.size]}
  5546. \ttindex{DS}
  5547.  
  5548. {\em G"ultigkeit: 680x0, M*Core, 68xx, H8, SH7x00, DSP56xxx,\\
  5549.     XA, ST7/STM8, MN161x, IM61x0, CP-3F, PPS-4, SC61860}
  5550.  
  5551. Mit diesem Befehl l"a"st sich zum einen Speicherplatz f"ur die angegebene
  5552. Zahl im Attribut beschriebener Zahlen reservieren.  So reserviert
  5553. \begin{verbatim}
  5554.        DS.B    20
  5555. \end{verbatim}
  5556. z.B. 20 Bytes Speicher,
  5557. \begin{verbatim}
  5558.        DS.X    20
  5559. \end{verbatim}
  5560. aber 240 Byte !
  5561. \par
  5562. Die andere Bedeutung ist die Ausrichtung des Programmz"ahlers, die
  5563. mit der Wertangabe 0 erreicht wird.  So wird mit
  5564. \begin{verbatim}
  5565.        DS.W    0
  5566. \end{verbatim}
  5567. der Programmz"ahler auf die n"achste gerade Adresse aufgerundet, mit
  5568. \begin{verbatim}
  5569.        DS.D    0
  5570. \end{verbatim}
  5571. dagegen auf die n"achste Langwortgrenze.  Eventuell dabei freibleibende
  5572. Speicherzellen sind nicht etwa mit Nullen oder NOPs gef"ullt,
  5573. sondern undefiniert.
  5574. \par
  5575. Vorgabe f"ur die Operandengr"o"se ist --- wie "ublich --- W, also 16 Bit.
  5576. \par
  5577. Beim 56xxx ist die Operandengr"o"se auf Worte (a 24 Bit) festgelegt,
  5578. Attribute gibt es deswegen wie bei \tty{DC} auch hier nicht.
  5579.  
  5580. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5581.  
  5582. \subsection{BLKB, BLKW, BLKL, BLKD}
  5583. \ttindex{BLKB}\ttindex{BLKW}\ttindex{BLKL}\ttindex{BLKD}
  5584.  
  5585. {\em G"ultigkeit: Renesas RX}
  5586.  
  5587. Mit diesen Befehlen wird auf dem Renesas RX Speicher reserviert.  Die
  5588. Gesamtgr"o"se des reservierten Speicher resultiert aus dem Produkt des
  5589. Arguments und der durch den Befehl gegebenen Operandengr"o"se (1 Byte
  5590. f"ur \tty{BLKB}, 2 Byte f"ur \tty{BLKW}, 4 Byte f"ur \tty{BLKL} und
  5591. 8 Byte f"ur \tty{BLKD}).
  5592.  
  5593. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5594.  
  5595. \subsection{DN,DB,DW,DD,DQ \& DT}
  5596. \ttindex{DN}\ttindex{DB}\ttindex{DW}\ttindex{DD}\ttindex{DQ}\ttindex{DT}
  5597.  
  5598. {\em\begin{tabbing}
  5599. G"ultigkeit: \= Intel (au"ser 4004/4040), Zilog, Toshiba, NEC, TMS370,\\
  5600.             \> Siemens, AMD, M16(C), MELPS7700/65816, National, ST9,\\
  5601.             \> Atmel, TMS7000, TMS1000, $\mu$PD77230, Signetics,\\
  5602.             \> Fairchild, Intersil,\\
  5603.             \> XS1, SC62015
  5604. \end{tabbing}}
  5605.  
  5606. Diese Befehle stellen sozusagen das Intel-Gegenst"uck zu \tty{DS}
  5607. und \tty{DC} dar, und wie nicht anders zu erwarten, ist die Logik
  5608. etwas anders:
  5609. \par
  5610. Zum einen wird die Kennung der Operandengr"o"se in das Mnemonic
  5611. verlegt:
  5612. \begin{itemize}
  5613. \item{\tty{DN}: 4-Bit-Integer}
  5614. \item{\tty{DB}: Byte oder ASCII-String wie bei \tty{DC.B}}
  5615. \item{\tty{DW}: 16-Bit-Integer oder Half Precision}
  5616. \item{\tty{DD}: 32-Bit-Integer oder Single Precision}
  5617. \item{\tty{DQ}: Double Precision (64 Bit)}
  5618. \item{\tty{DT}: Extended Precision (80 Bit)}
  5619. \end{itemize}
  5620. Zum anderen erfolgt die Unterscheidung, ob Konstantendefinition oder
  5621. Speicherreservierung, im Operanden.  Eine Reservierung von Speicher
  5622. wird durch ein \tty{?} gekennzeichnet:
  5623. \begin{verbatim}
  5624.        db  ?   ; reserviert ein Byte
  5625.        dw  ?,? ; reserviert Speicher fuer 2 Worte (=4 Byte)
  5626.        dd  -1  ; legt die Konstante -1 (FFFFFFFFH) ab !
  5627. \end{verbatim}
  5628. Speicherreservierung und Konstantendefinition d"urfen \bb{nicht in einer
  5629. Anweisung} gemischt werden:
  5630. \begin{verbatim}
  5631.        db  "Hallo",?  ; -->Fehlermeldung
  5632. \end{verbatim}
  5633. \ttindex{DUP}
  5634. Zus"atzlich ist noch der \tty{DUP}-Operator erlaubt, der die mehrfache Ablage
  5635. von Konstantenfolgen oder die Reservierung ganzer Speicherbl"ocke erlaubt:
  5636. \begin{verbatim}
  5637.        db  3 dup (1,2) ; --> 1 2 1 2 1 2
  5638.        dw  20 dup (?)  ; reserviert 40 Byte Speicher.
  5639. \end{verbatim}
  5640. Wie man sehen kann, mu"s das \tty{DUP}-Argument geklammert werden, darf daf"ur
  5641. aber auch wieder aus mehreren Teilen bestehen, die selber auch wieder
  5642. \tty{DUP}s sein k"onnen...das ganze funktioniert also rekursiv.
  5643. \par
  5644. \tty{DUP} ist aber auch eine Stelle, an der man mit einer anderen Grenze des
  5645. Assemblers in Ber"uhrung kommen kann: maximal k"onnen 1024 Byte Code
  5646. oder Daten in einer Zeile erzeugt werden.  Dies bezieht sich \bb{nicht}
  5647. auf die Reservierung von Speicher, nur auf die Definition von
  5648. Konstantenfeldern!
  5649. \par
  5650. Der \tty{DUP}-Operator wird nur erkannt, wenn er selber geklammert ist
  5651. und links von ihm ein nicht-leeres Argument steht; auf diese Weise ist es
  5652. m"oglich ein eventuell definiertes Symbol gleichen Namens auch als Argument
  5653. zu verwenden.
  5654. \par
  5655. Auf verschiedenen Plattformen existieren Befehle mit identischer
  5656. Funktionalit"at, jedoch anderem Namen:
  5657. \begin{itemize}
  5658. \ttindex{DEFB}\ttindex{DEFW}
  5659. \item{Um mit dem M80 vertr"aglich zu sein, darf im Z80-Modus anstelle
  5660.      von \tty{DB}/\tty{DW} auch \tty{DEFB}/\tty{DEFW} geschrieben
  5661.      werden.}
  5662. \ttindex{BYTE}\ttindex{WORD}\ttindex{ADDR}\ttindex{ADDRW}
  5663. \item{\tty{BYTE/ADDR} bzw. \tty{WORD/ADDRW} beim COP4/8 stellen einen
  5664.      Alias f"ur \tty{DB} bzw. \tty{DW} dar, wobei die beiden Paare sich
  5665.      jedoch in der Byte-Order unterscheiden: Die Befehle, die von
  5666.      National zur Adre"sablage vorgesehen waren, benutzen Big-Endian,
  5667.      \tty{BYTE} bzw. \tty{WORD} jedoch Little-Endian.}
  5668. \ttindex{BYTE}\ttindex{WORD}
  5669. \item{\tty{BYTE} bzw. \tty{WORD} stehen auf der PDP-11 und WD16 als
  5670.      Alias f"ur \tty{DB} bzw. \tty{DW} zur Verf"ugung.}
  5671. \ttindex{BYTE}\ttindex{WORD}\ttindex{LWORD}\ttindex{FLOAT}\ttindex{DOUBLE}
  5672. \item{Auf dem Renesas RX existieren:
  5673.      \begin{itemize}
  5674.      \item{\tty{BYTE} (wie \tty{DB})}
  5675.      \item{\tty{WORD} (wie \tty{DW}, nur Ganzzahl-Argumente)}
  5676.      \item{\tty{LWORD} (wie \tty{DD}, nur Ganzzahl-Argumente)}
  5677.      \item{\tty{FLOAT} (wie \tty{DD}, nur Gleitkomma-Argumente)}
  5678.      \item{\tty{DOUBLE} (wie \tty{DQ}, nur Gleitkomma-Argumente)}
  5679.      \end{itemize}}
  5680. \end{itemize}
  5681.  
  5682. Wird \tty{DB} in einem Adre"sraum angewendet, der nicht byte-adressierbar
  5683. ist (z.B. das \tty{CODE}-Segment des Atmel AVR), so werden immer zwei Bytes
  5684. in ein 16-Bit-Wort gepackt, entsprechend der durch die Architektur gegebenen
  5685. Endinaness - das untere Byte wird bei Little-Endian also zuerst gef"ullt.  Ist
  5686. die Gesamtmenge aller Bytes ungerade, so bleibt die andere Worth"alfte ungenutzt
  5687. und ist quasi ''Padding''.  Sie wird auch nicht genutzt, falls im Quellcode
  5688. eine weitere \tty{DB}-Anweisung unmittelbar folge sollte.  Sinngem"a"s gilt
  5689. das gleiche f"ur \tty{DN}, nur werden hier zwei oder vier Nibbles in ein Byte
  5690. oder 16-Bit-Wort gepackt.
  5691.  
  5692. Der NEC 77230 nimmt mit seiner \tty{DW}-Anweisung eine Sonderstellung ein:
  5693. Sie funktioniert eher wie \tty{DATA} bei seinen kleineren Br"udern,
  5694. akzeptiert aber neben String- und Integerargumenten auch Gleitkommawerte
  5695. (und legt sie prozessorspezifischen 32-Bit-Format ab). \tty{DUP} gibt es {\em
  5696. nicht}!
  5697.  
  5698. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5699.  
  5700. \subsection{FLT2, FLT3, FLT4}
  5701. \ttindex{FLT2}\ttindex{FLT3}\ttindex{FLT4}
  5702.  
  5703. {\em\begin{tabbing}
  5704. G"ultigkeit: \= PDP-11 (\tty{FLT2, FLT4}),\\
  5705.             \> WD16 (\tty{FLT3})
  5706. \end{tabbing}}
  5707.  
  5708. \tty{FLT2} und \tty{FLT4} funktionieren analog zu \tty{DD} bzw. \tty{DQ},
  5709. legen jedoch ausschlie"slich Gleitkomma-Konstanten im DEC-eigenen F- bzw.
  5710. D-Format ab.  Der WD16 verwendet hingegen ein eigenes, 48 Bit (drei
  5711. Maschinenworte) langes Format.  Gleitkomma-Konstanten in diesem Format
  5712. k"onnen mit der \tty{FLT3}-Anweisung im Speicher abgelegt werden.
  5713.  
  5714. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5715.  
  5716. \subsection{DS, DS8}
  5717. \ttindex{DS}
  5718. \ttindex{DS8}
  5719.  
  5720. {\em\begin{tabbing}
  5721. G"ultigkeit: \= Intel, Zilog, Toshiba, NEC, TMS370, Siemens, AMD, M16(C),\\
  5722.             \> National, ST9, TMS7000, TMS1000, Intersil, 6502, 68xx
  5723. \end{tabbing}}
  5724.  
  5725. Dieser Befehl stellt eine Kurzschreibweise dar, um Speicherbereiche
  5726. zu reservieren:
  5727. \begin{quote}{\tt
  5728.        DS       $<Anzahl>$
  5729. }\end{quote}
  5730. ist eine Kurzschreibweise f"ur
  5731. \begin{quote}{\tt
  5732.        DB       $<Anzahl>$ DUP (?)
  5733. }\end{quote}
  5734. dar, lie"se sich also prinzipiell auch einfach "uber ein Makro realisieren,
  5735. nur scheint dieser Befehl in den K"opfen einiger mit Motorola-CPUs gro"s
  5736. gewordener Leute (gell, Michael?) so fest verdrahtet zu sein, da"s sie
  5737. ihn als eingebauten Befehl erwarten...hoffentlich sind selbige jetzt
  5738. zufrieden {\tt ;-)}
  5739.  
  5740. {\tt DS8} ist beim National SC14xxx als Alias f"ur {\tt DS} definiert.
  5741. Achten Sie aber darauf, da"s der Speicher dieser Prozessoren in Worten zu
  5742. 16 Bit organisiert ist, d.h. es ist unm"oglich, einzelne Bytes zu
  5743. reservieren.  Falls das Argument von {\tt DS} ungerade ist, wird es auf
  5744. die n"achstgr"o"sere gerade Zahl aufgerundet.
  5745.  
  5746. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5747.  
  5748. \subsection{BYT oder FCB}
  5749. \ttindex{BYT}\ttindex{FCB}
  5750.  
  5751. {\em G"ultigkeit: 6502, 68xx, SC61860}
  5752.  
  5753. Mit diesem Befehl werden im 65xx/68xx-Modus Byte-Konstanten oder
  5754. ASCII-Strings abgelegt, er entspricht also \tty{DC.B} beim 68000 oder
  5755. bei Intel dem \tty{DB} (was ebenfalls erlaubt ist).  Ein Wiederholungsfaktor
  5756. darf analog zu \tty{DC} jedem einzelnen Parameter in eckigen Klammern
  5757. vorangestellt werden.
  5758.  
  5759. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5760.  
  5761. \subsection{BYTE}
  5762. \ttindex{BYTE}
  5763.  
  5764. {\em G"ultigkeit: ST6, 320C2(0)x, 320C5x, MSP, TMS9900, CP-1600}
  5765.  
  5766. Dito.  Ein im 320C2(0)x/5x-Modus vor dem Befehl stehendes Label wird
  5767. als untypisiert gespeichert, d.h. keinem Adre"sraum zugeordnet.
  5768. Der Sinn dieses Verhaltens wird bei den prozessorspezifischen
  5769. Hinweisen erl"autert.
  5770.  
  5771. Ob beim MSP bzw. TMS9900 ungerade Mengen von Bytes automatisch um
  5772. ein Null-Byte erg"anzt werden sollen, kann mit dem PADDING-Befehl
  5773. eingestellt werden.
  5774.  
  5775. Auf dem CP-1600 weicht die Verhaltensweise von {\tt BYTE} etwas ab:
  5776. die angegebenen 16-Bit-Werte werden in jeweils zwei aufeinanderfolgenden
  5777. W"ortern aufgeteilt abgelegt (LSB zuerst).  Wenn einzelne Bytes (gepackt)
  5778. abgelegt werden sollen, mu"s stattdessen {\tt TEXT} verwendet werden!
  5779.  
  5780. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5781.  
  5782. \subsection{DC8}
  5783. \ttindex{DC8}
  5784.  
  5785. {\em G"ultigkeit: SC144xx}
  5786.  
  5787. Dieser Befehl ist ein Alias f"ur {\tt DB}, d.h. mit ihm k"onnen
  5788. Byte-Konstanten oder Strings im Speicher abgelegt werden.
  5789.  
  5790. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5791.  
  5792. \subsection{ADR oder FDB}
  5793. \ttindex{ADR}\ttindex{FDB}
  5794.  
  5795. {\em G"ultigkeit: 6502, 68xx, SC61860}
  5796.  
  5797. Mit diesem Befehl werden im 65xx/68xx-Modus Wortkonstanten
  5798. abgelegt, er entspricht also \tty{DC.W} beim 68000 oder bei Intel
  5799. dem \tty{DW} (was auch zul"assig ist).  Ein Wiederholungsfaktor darf
  5800. analog zu \tty{DC} jedem einzelnen Parameter in eckigen Klammern vorangestellt
  5801. werden.
  5802.  
  5803. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5804.  
  5805. \subsection{DDB}
  5806. \ttindex{DDB}
  5807.  
  5808. {\em G"ultigkeit: 6502, MELPS-7700}
  5809.  
  5810. Dieser Befehl funktioniert analog zu \tty{ADR}, nur mit dem Unterschied, da"s
  5811. die 16-BitWerte im Big-Endian-Format im Speicher abgelegt werden.
  5812.  
  5813. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5814.  
  5815. \subsection{DCM}
  5816. \ttindex{DCM}
  5817.  
  5818. {\em G"ultigkeit: 6502}
  5819.  
  5820. Mit diesem Befehl werden Gleitkomma-Konstanten im Speicher abgelegt, und
  5821. zwar in dem in \cite{AppleFloat} beschriebenen Format: Ein Exponent
  5822. von 8 Bit und eine 24-bittige Mantisse im Zweierkomplement, im Big-Endian-Format
  5823. abgelegt.
  5824.  
  5825. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5826.  
  5827. \subsection{WORD}
  5828. \ttindex{WORD}
  5829.  
  5830. {\em G"ultigkeit: ST6, i960, 320C2(0)x, 320C3x/C4x/C5x, MSP, CP-1600,\\
  5831.     IMP-16, IPC-16}
  5832.  
  5833. F"ur den 320C3x/C4x und i960 werden hiermit 32-Bit-Worte abgelegt, f"ur die
  5834. alle anderen Familien 16-Bit-Worte.  Ein im 320C2(0)x/5x-Modus vor dem Befehl
  5835. stehendes Label wird als untypisiert gespeichert, d.h. keinem Adre"sraum
  5836. zugeordnet.  Der Sinn dieses Verhaltens wird bei den prozessorspezifischen
  5837. Hinweisen erl"autert.
  5838.  
  5839. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5840.  
  5841. \subsection{DW16}
  5842. \ttindex{DW16}
  5843.  
  5844. {\em G"ultigkeit: SC144xx}
  5845.  
  5846. Dieser Befehl ist beim SC144xx der Weg, Konstanten mit Wortl"ange (16 Bit)
  5847. im Speicher abzulegen und damit ein ALIAS f"ur DW.
  5848.  
  5849. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5850.  
  5851. \subsection{ACON}
  5852. \ttindex{ACON}
  5853.  
  5854. {\em G"ultigkeit: 2650}
  5855.  
  5856. {\tt ACON} arbeitet analog zu {\tt DW}, jedoch werden die 16-Bit-Zahlenwerte
  5857. im Big-Endian-Format abgelegt.
  5858.  
  5859. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5860.  
  5861. \subsection{LONG}
  5862. \ttindex{LONG}
  5863.  
  5864. {\em G"ultigkeit: 320C2(0)x, 320C5x}
  5865.  
  5866. Hiermit werden 32-Bit-Integer im Speicher abgelegt, und zwar in
  5867. der Reihenfolge LoWord-HiWord.  Ein eventuell vor dem Befehl
  5868. stehendes Label wird dabei wieder als untypisiert abgelegt
  5869. (der Sinn dieser Ma"snahme ist in den prozessorspezifischen
  5870. Hinweisen erl"autert).
  5871.  
  5872. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5873.  
  5874. \subsection{SINGLE, DOUBLE und EXTENDED}
  5875. \ttindex{SINGLE}\ttindex{DOUBLE}\ttindex{EXTENDED}
  5876.  
  5877. {\em G"ultigkeit: 320C3x/C4x (nicht {\tt DOUBLE}), 320C6x (nicht {\tt
  5878.   EXTENDED})}
  5879.  
  5880. Mit diesen Befehlen werden Gleitkomma-Konstanten im Speicher abgelegt,
  5881. jedoch beim 320C3x/C4x nicht im IEEE-Format, sondern in den vom Prozessor
  5882. verwendeten 32- und 40-Bit-Formaten.  Da 40 Bit nicht mehr in eine
  5883. Speicherzelle hineinpassen, werden im Falle von \tty{EXTENDED} immer derer
  5884. 2 pro Wert belegt.  Im ersten Wort finden sich die oberen 8 Bit (der
  5885. Exponent), der Rest (Vorzeichen und Mantisse) in zweiten Wort.
  5886.  
  5887. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5888.  
  5889. \subsection{FLOAT und DOUBLE}
  5890. \ttindex{FLOAT}\ttindex{DOUBLE}
  5891.  
  5892. {\em G"ultigkeit: 320C2(0)x, 320C5x}
  5893.  
  5894. Mit diesen Befehlen k"onnen 32- bzw. 64-Bit-Gleitkommazahlen
  5895. im IEEE-Format im Speicher abgelegt werden.  Dabei wird das
  5896. niederwertigste Byte jeweils auf der ersten Speicherstelle
  5897. abgelegt.  Ein eventuell vor dem Befehl stehendes Label wird
  5898. wieder als untypisiert gespeichert (der Sinn dieser Ma"snahme
  5899. ist in den prozessorspezifischen Hinweisen erl"autert).
  5900.  
  5901. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5902.  
  5903. \subsection{SINGLE und DOUBLE}
  5904. \ttindex{SINGLE}\ttindex{DOUBLE}
  5905.  
  5906. {\em G"ultigkeit: TMS99xxx}
  5907.  
  5908. Mit diesen Befehlen k"onnen 32- bzw. 64-Bit-Gleitkommazahlen
  5909. im prozessoreigenen Format im Speicher abgelegt werden.  Das
  5910. Format entspricht dem IBM/360-Gleitkommaformat.
  5911.  
  5912. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5913.  
  5914. \subsection{EFLOAT, BFLOAT, TFLOAT}
  5915. \ttindex{EFLOAT}\ttindex{BFLOAT}\ttindex{TFLOAT}
  5916.  
  5917. {\em G"ultigkeit: 320C2(0)x, 320C5x}
  5918.  
  5919. Auch diese Befehle legen Gleitkommazahlen im Speicher ab,
  5920. jedoch in einem nicht-IEEE-Format, das evtl. leichter von
  5921. Signalprozessoren zu verarbeiten ist:
  5922. \begin{itemize}
  5923. \item{\tty{EFLOAT}: Mantisse mit 16 Bit, Exponent mit 16 Bit}
  5924. \item{\tty{BFLOAT}: Mantisse mit 32 Bit, Exponent mit 16 Bit}
  5925. \item{\tty{TFLOAT}: Mantisse mit 64 Bit, Exponent mit 32 Bit}
  5926. \end{itemize}
  5927. Gemeinsam ist den Befehlen, da"s die Mantisse vor dem
  5928. Exponenten abgelegt wird (Lo-Word jeweils zuerst) und
  5929. beide im Zweierkomplement dargestellt werden.  Ein eventuell
  5930. vor dem Befehl stehendes Label wird wieder als untypisiert
  5931. gespeichert (der Sinn dieser Ma"snahme ist in den
  5932. prozessorspezifischen Hinweisen erl"autert).
  5933.  
  5934. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5935.  
  5936. \subsection{Qxx und LQxx}
  5937. \ttindex{Qxx}\ttindex{LQxx}
  5938.  
  5939. {\em G"ultigkeit: 320C2(0)x, 320C5x}
  5940.  
  5941. Mit diesen Befehlen k"onnen Gleitkommazahlen in einem Festkommaformat
  5942. abgelegt werden.  \tty{xx} ist dabei eine zweistellige Zahl, mit deren
  5943. Zweierpotenz der Gleitkommawert vor der Umwandlung in eine ganze Zahl
  5944. multipliziert werden soll.  Er bestimmt also praktisch, wieviele Bits
  5945. f"ur die Nachkommastellen reserviert werden sollen.  W"ahrend aber
  5946. \tty{Qxx} nur ein Wort (16 Bit) ablegt, wird das Ergebnis bei \tty{LQxx}
  5947. in 2 Worten (LoWord zuerst) abgelegt.  Das sieht dann z.B. so
  5948. aus:
  5949. \begin{verbatim}
  5950.        q05     2.5      ; --> 0050h
  5951.        lq20    ConstPI  ; --> 43F7h 0032h
  5952. \end{verbatim}
  5953. Mich m"oge niemand steinigen, wenn ich mich auf meinem HP28
  5954. verrechnet haben sollte...
  5955.  
  5956. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5957.  
  5958. \subsection{DATA}
  5959. \ttindex{DATA}
  5960.  
  5961. {\em G"ultigkeit: PIC, 320xx, AVR, MELPS-4500, H8/500, \\
  5962.     HMCS400, 4004/4040, $\mu$PD772x, OLMS-40/50, Padauk}
  5963.  
  5964. Mit diesem Befehl werden Daten im aktuellen Segment abgelegt,
  5965. wobei sowohl Integer- als auch Stringwerte zul"assig sind.  Bei
  5966. Strings belegt beim 16C5x/16C8x, 17C4x im Datensegment, beim
  5967. 4500er, 4004 und HMCS400 im Code-Segement ein Zeichen ein Wort,
  5968. bei AVR, 17C4x im Codesegment, $\mu$PD772x in den Datensegmenten
  5969. und 3201x/3202x passen zwei Zeichen in ein Wort (LSB zuerst),
  5970. beim $\mu$PD7725 drei und beim 320C3x/C4x sogar derer 4 (MSB
  5971. zuerst).  Im Gegensatz dazu mu"s im Datensegment des 4500 bzw.
  5972. ein Zeichen auf zwei Speicherstellen verteilt werden, ebenso wie
  5973. beim 4004 und HMCS400.  Der Wertebereich f"ur Integers entspricht
  5974. der Wortbreite des jeweiligen Prozessors im jeweiligen Segment.
  5975. Das bedeutet, da"s \tty{DATA} beim 320C3x/C4x die Funktion von
  5976. \tty{WORD} mit einschlie"st (die von \tty{SINGLE} "ubrigens auch,
  5977. wenn \asname{} das Argument als Gleitkommazahl erkennt).
  5978.  
  5979. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5980.  
  5981. \subsection{ZERO}
  5982. \ttindex{ZERO}
  5983.  
  5984. {\em G"ultigkeit: PIC, CP-1600}
  5985.  
  5986. Dieser Befehl legt einen durch den Parameter spezifizierte
  5987. Zahl von Nullworten (=NOP bei PIC) im Speicher ab.
  5988.  
  5989. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5990.  
  5991. \subsection{FB und FW}
  5992. \ttindex{FB}\ttindex{FW}
  5993.  
  5994. {\em G"ultigkeit: COP4/8}
  5995.  
  5996. Mit diesen Befehlen kann ein gr"o"serer Block von Speicher (dessen L"ange
  5997. in Bytes bzw. Worten der erste Parameter angibt) mit einer Byte- bzw.
  5998. Wortkonstanten gef"ullt werden, die durch den zweiten Parameter angegeben
  5999. wird.
  6000.  
  6001. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6002.  
  6003. \subsection{ASCII und ASCIZ}
  6004. \ttindex{ASCII}\ttindex{ASCIZ}
  6005.  
  6006. {\em G"ultigkeit: ST6, \tty{ASCII} auch IMP-16 und IPC-16}
  6007.  
  6008. Mit diesen beiden Befehlen k"onnen Stringkonstanten im Speicher
  6009. abgelegt werden.  W"ahrend ASCII nur die reinen Daten im Speicher
  6010. ablegt, versieht \tty{ASCIZ} automatisch \ii{jeden} angegebenen String
  6011. mit einem NUL-Zeichen am Ende.
  6012.  
  6013. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6014.  
  6015. \subsection{STRING und RSTRING}
  6016. \ttindex{STRING}\ttindex{RSTRING}
  6017.  
  6018. {\em G"ultigkeit: 320C2(0)x, 320C5x}
  6019.  
  6020. Diese Anweisungen funktionieren analog zu {\tt DATA}, jedoch werden
  6021. hier Integer-Ausdr"ucke grunds"atzlich als {\it Bytes} mit einem
  6022. entsprechend eingeschr"ankten Wertebereich betrachtet, wodurch es
  6023. m"oglich wird, die Zahlen zusammen mit anderen Zahlen oder Zeichen
  6024. paarweise in Worte zu verpacken.
  6025. Die beiden Befehle unterscheiden sich lediglich in der Reihenfolge
  6026. der Bytes in einem Wort: Bei {\tt STRING} wird zuerst das
  6027. obere und danach das untere gef"ullt, bei {\tt RSTRING} ist es
  6028. genau umgekehrt.
  6029.  
  6030. Ein eventuell vor dem Befehl stehendes Label wird wieder als
  6031. untypisiert gespeichert.  Der Sinn dieser Ma"snahme ist im
  6032. entsprechenden Kapitel mit den prozessorspezifischen Befehlen
  6033. erl"autert.
  6034.  
  6035. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6036.  
  6037. \subsection{FCC}
  6038. \ttindex{FCC}
  6039.  
  6040. {\em G"ultigkeit: 6502, 68xx}
  6041.  
  6042. Mit diesem Befehl werden im 65xx/68xx-Modus String-Konstanten abgelegt.
  6043. Beachten Sie jedoch, da"s im Gegensatz zum Originalassembler
  6044. AS11 von Motorola (dessentwegen dieser Befehl existiert, bei \asname{} ist
  6045. diese Funktion im \tty{BYT}-Befehl enthalten), String-Argumente nur in
  6046. G"ansef"u"schen und nicht in Hochkommas oder Schr"agstrichen eingeschlossen
  6047. werden d"urfen!  Ein Wiederholungsfaktor darf analog zu \tty{DC} jedem
  6048. einzelnen Parameter in eckigen Klammern vorangestellt werden.
  6049.  
  6050. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6051.  
  6052. \subsection{TEXT}
  6053.  
  6054. Mit diesem Befehl werden im CP-1600-Modus String-Konstanten gepackt,
  6055. d.h. zwei Zeichen pro Wort, abgelegt.
  6056.  
  6057. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6058.  
  6059. \subsection{DFS oder RMB}
  6060. \ttindex{DFS}\ttindex{RMB}
  6061.  
  6062. {\em G"ultigkeit: 6502, 68xx}
  6063.  
  6064. Dieser Befehl dient im 65xx/68xx-Modus zur Reservierung von
  6065. Speicher, er entspricht \tty{DS.B} beim 68000 oder \tty{DB ?}
  6066. bei Intel.
  6067.  
  6068. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6069.  
  6070. \subsection{BLOCK}
  6071. \ttindex{BLOCK}
  6072.  
  6073. {\em G"ultigkeit: ST6}
  6074.  
  6075. Dito.
  6076.  
  6077. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6078.  
  6079. \subsection{SPACE}
  6080. \ttindex{SPACE}
  6081.  
  6082. {\em G"ultigkeit: i960}
  6083.  
  6084. Dito.
  6085.  
  6086. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6087.  
  6088. \subsection{RES}
  6089. \ttindex{RES}
  6090.  
  6091. {\em G"ultigkeit: PIC, MELPS-4500, HMCS400, 3201x, 320C2(0)x,\\
  6092.     320C5x, AVR, $\mu$PD772x, OLMS-40/50, Padauk, CP-1600,\\
  6093.     PPS-4, 2650}
  6094.  
  6095. Dieser Befehl dient zur Reservierung von Speicher.  Er reserviert
  6096. im Codesegment immer W"orter (10/12/14/16 Bit), im Datensegment bei
  6097. den PICs Bytes, beim 4500er, PPS-4 und OLMS-40/50 Nibbles sowie bei
  6098. TI W"orter.
  6099.  
  6100. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6101.  
  6102. \subsection{BSS}
  6103. \ttindex{BSS}
  6104.  
  6105. {\em G"ultigkeit: 320C2(0)x, 320C3x/C4x/C5x/C6x, MSP}
  6106.  
  6107. \tty{BSS} arbeitet analog zu \tty{RES}, lediglich ein eventuell vor dem
  6108. Befehl stehendes Symbol wird beim 320C2(0)x/5x als untypisiert gespeichert.
  6109. Der Sinn dieser Ma"snahme kann im Kapitel mit den prozessorspezifischen
  6110. Hinweisen nachgelesen werden.
  6111.  
  6112. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6113.  
  6114. \subsection{DSB und DSW}
  6115. \ttindex{DSB}\ttindex{DSW}
  6116.  
  6117. {\em G"ultigkeit: COP4/8}
  6118.  
  6119. Diese beiden Befehle stellen im COP4/8-Modus die zum ASMCOP von National
  6120. kompatible Methode dar, Speicher zu reservieren.  W"ahrend \tty{DSB} nur
  6121. einzelne Bytes freih"alt, reserviert \tty{DSW} W"orter und damit effektiv
  6122. doppelt soviel Bytes wie \tty{DSB}.
  6123.  
  6124. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6125.  
  6126. \subsection{DS16}
  6127. \ttindex{DS16}
  6128.  
  6129. {\em G"ultigkeit: SC144xx}
  6130.  
  6131. Dieser Befehl reserviert Speicher in Schritten von vollst"andigen Worten,
  6132. d.h. 16 Bit.  Er stellt einen Alias zu {\tt DW} dar.
  6133.  
  6134. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6135.  
  6136. \subsection{ALIGN}
  6137. \ttindex{ALIGN}
  6138.  
  6139. {\em G"ultigkeit: alle Prozessoren}
  6140.  
  6141. \tty{ALIGN} mit einem Integerausdruck als Argument erlaubt es, den
  6142. Programmz"ahler auf eine bestimmte Adresse auszurichten.  Die
  6143. Ausrichtung erfolgt dergestalt, da"s der Programmz"ahler so weit
  6144. erh"oht wird, da"s er ein ganzzahliges mehrfaches des Argumentes
  6145. wird.  In seiner Funktion entspricht \tty{ALIGN} also \tty{DS.x 0}
  6146. beim den 680x0ern, nur ist die Ausrichtung noch flexibler.
  6147. \par
  6148. Beispiel:
  6149. \begin{verbatim}
  6150.        align 2
  6151. \end{verbatim}
  6152. macht den Programmz"ahler gerade.  Wird \tty{ALIGN} in dieser Form mit nur
  6153. einem Argument verwendet, ist der Inhalt des dadurch frei bleibenden
  6154. Speicherbereichs nicht definiert.  Alternativ kann als zweites Argument ein
  6155. (Byte-)Wert angegeben werden, mit dem dieser Bereich gef"ullt wird.
  6156.  
  6157. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6158.  
  6159. \subsection{LTORG}
  6160. \ttindex{LTORG}
  6161.  
  6162. {\em G"ultigkeit: SH7x00, IM61x0, IMP-16, IPC-16}
  6163.  
  6164. Da der SH7000-Prozessor seine Register immediate nur mit 8-Bit-Werten
  6165. laden kann, \asname{} dem Programmierer jedoch vorgaukelt, da"s es eine solche
  6166. Einschr"ankung nicht g"abe, mu"s er die dabei entstehenden Konstanten
  6167. irgendwo im Speicher ablegen.  Da es nicht sinnvoll w"are, dies einzeln
  6168. zu tun (wobei jedes Mal Sprungbefehle anfallen w"urden...), werden die
  6169. Literale gesammelt und k"onnen vom Programmierer mit diesem Befehl
  6170. gezielt blockweise (z.B. am Ende eines Unterprogrammes) abgelegt werden.
  6171. Zu den zu beachtenden Details und Fallen sei auf das Kapitel mit den
  6172. SH7000-spezifischen Dingen hingewiesen.
  6173.  
  6174. %%---------------------------------------------------------------------------
  6175.  
  6176. \section{Makrobefehle}
  6177.  
  6178. {\em G"ultigkeit: alle Prozessoren}
  6179.  
  6180. Kommen wir nun zu dem, was einen Makroassembler vom normalen Assembler
  6181. unterscheidet: der M"oglichkeit, Makros zu definieren (ach was ?!).
  6182. \par
  6183. Unter Makros verstehe ich hier erst einmal eine Menge von Anweisungen
  6184. (normal oder Pseudo), die mit bestimmten Befehlen zu einem Block
  6185. zusammengefa"st werden und dann auf bestimmte Weise bearbeitet
  6186. werden k"onnen.  Zur Bearbeitung solcher Bl"ocke kennt der Assembler
  6187. folgende Befehle:
  6188.  
  6189. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6190.  
  6191. \subsection{MACRO}
  6192. \ttindex{MACRO}\ttindex{ENDM}
  6193. \label{SectMacros}
  6194.  
  6195. ist der wohl wichtigste Befehl zur Makroprogrammierung.  Mit der
  6196. Befehlsfolge
  6197. \begin{verbatim}
  6198. <Name>  MACRO   [Parameterliste]
  6199.        <Befehle>
  6200.        ENDM
  6201. \end{verbatim}
  6202. wird das Makro \tty{$<$Name:  $>$} als die eingeschlossene Befehlsfolge
  6203. definiert. Diese Definition alleine erzeugt noch keinen Code!  Daf"ur kann
  6204. fortan die Befehlsfolge einfach durch den Namen abgerufen werden, das Ganze
  6205. stellt also eine Schreiberleichterung dar.  Um die ganze Sache etwas
  6206. n"utzlicher zu machen, kann man der Makrodefinition eine Parameterliste
  6207. mitgeben.
  6208. \par
  6209. W"ahrend der Makroname selber nur den "ublichen Regeln f"ur Symbolnamen
  6210. (\ref{SectSymConv}) gen"ugen mu"s, gilt f"ur die Namen der (kommaseparierten)
  6211. Parameternamen die weitere Einschr"ankung, da"s sie keine Unterstriche
  6212. enthalten d"urfen.  Dies kann durch den Kommandozeilen-Parameter
  6213. \tty{-underscore-macroargs} aufgehoben werden, hat aber Nebenwirkungen
  6214. bei der Expansion von Makros und sollte nur eingesetzt werden, wenn
  6215. unbedingt n"otig.
  6216. \par
  6217. Sowohl Makronamen als auch -parameter sind von einer Umschaltung
  6218. von \asname{} in den case-sensitiven Modus betroffen.
  6219. \par
  6220. Makros sind "ahnlich wie Symbole lokal, d.h. bei Definition in
  6221. einer Sektion sind sie nur in dieser Sektion und ihren Untersektionen
  6222. bekannt.  Dieses Verhalten l"a"st sich aber durch die weiter unten
  6223. beschriebenen Optionen \tty{PUBLIC} und \tty{GLOBAL} in weiten Grenzen
  6224. steuern.
  6225. \par
  6226. F"ur jeden Makroparameter kann ein Defaultwert mit angeh"angtem
  6227. Gleichheitszeichen angegeben werden.  Dieser Wert wird f"ur den
  6228. Parameter eingesetzt, wenn beim Makroaufruf kein Argument f"ur
  6229. diesen Parameter angegeben wird, bzw. wenn ein Positionsargument
  6230. (s.u.) f"ur diesen Parameter leer ist.
  6231. \par
  6232. Neben den eigentlichen Makroparametern k"onnen in der Parameterliste
  6233. auch Steuerparameter enthalten sein, die die Abarbeitung des betroffenen
  6234. Makros beeinflussen; diese Parameter werden von normalen Parametern
  6235. dadurch unterschieden, da"s sie in geschweifte Klammern eingeschlossen
  6236. sind.  Es sind folgende Steuerparameter definiert:
  6237. \begin{itemize}
  6238. \item{\tty{EXPAND/NOEXPAND} : legen fest, ob bei der sp"ateren
  6239.      Verwendung diese Makros der expandierte Code mit angezeigt
  6240.      werden soll.  Default ist der durch den Pseudobefehl
  6241.      \tty{MACEXP\_DFT} festgelegte Wert.}
  6242. \item{\tty{EXPIF/NOEXPIF} : legen fest, ob bei der sp"ateren
  6243.      Verwendung diese Makros Befehle zur bedingten Assemblierung
  6244.      und dadurch ausgeschlossener Code angezeigt werden soll.  Default
  6245.      ist der durch den Pseudobefehl \tty{MACEXP\_DFT} festgelegte Wert.}
  6246. \item{\tty{EXPMACRO/NOEXPMACRO} : legen fest, ob bei der sp"ateren
  6247.      Verwendung diese Makros darin definierte Makros angezeigt werden
  6248.      sollen.  Default ist der durch den Pseudobefehl
  6249.      \tty{MACEXP\_DFT} festgelegte Wert.}
  6250. \item{\tty{EXPREST/NOEXPREST} : legen fest, ob bei der sp"ateren
  6251.      Verwendung Code-Zeilen angezeigt werden sollen, die weder
  6252.      Makro-Definitionen, bedingte Assemblierung noch durch bedingte
  6253.      Assemblierung ausgeschlossene Zeilen sind. Default ist der durch den
  6254.      Pseudobefehl \tty{MACEXP\_DFT} festgelegte Wert.}
  6255. \item{\tty{PUBLIC[:Sektionsname]} : ordnet das Makro nicht der
  6256.      aktuellen, sondern einer ihr "ubergeordneten Sektion zu.
  6257.      Auf diese Weise kann eine Sektion Makros f"ur die ,,Au"senwelt''
  6258.      zur Verf"ugung stellen.  Fehlt eine Sektionsangabe, so wird das
  6259.      Makro v"ollig global, d.h. ist "uberall benutzbar.}
  6260. \item{\tty{GLOBAL[:Sektionsname]} : legt fest, da"s neben diesem
  6261.      Makro noch ein weiteres Makro abgelegt werden soll, das zwar
  6262.      den gleichen Inhalt hat, dessen Name aber zus"atzlich mit dem
  6263.      Namen der Sektion versehen ist, in der es definiert wurde und
  6264.      das der spezifizierten Sektion zugeordnet werden soll.  Bei
  6265.      dieser mu"s es sich um eine Obersektion zu der aktuellen Sektion
  6266.      handeln; fehlt die Angabe, so wird das zus"atzliche Makro
  6267.      global sichtbar.  Wird z.B. ein Makro \tty{A} in der Sektion \tty{B}
  6268.      definiert, die wiederum eine Untersektion der Sektion \tty{C} ist,
  6269.      so w"urde neben z.B. dem Makro A ein weiteres globales mit dem
  6270.      Namen \tty{C\_B\_A} erzeugt.  W"urde dagegen \tty{C} als Zielsektion
  6271.      angegeben, so w"urde das Makro \tty{B\_A} hei"sen und der Sektion
  6272.      \tty{C} zugeordnet.  Diese Option ist defaultm"a"sig ausgeschaltet und
  6273.      hat auch nur einen Effekt, falls sie innerhalb einer Sektion
  6274.      benutzt wird.  Das lokal bekannte Originalmakro wird von ihr
  6275.      nicht beeinflu"st.}
  6276. \item{\tty{EXPORT/NOEXPORT} : legen fest, ob die Definition dieses
  6277.      Makros in einer getrennten Datei abgelegt werden soll, falls
  6278.      die Kommandozeilenoption \tty{-M} gegeben wurde.  Auf diese
  6279.      Weise k"onnen einzelne Definitionen ,,privater'' Makros selektiv
  6280.      ausgeblendet werden.  Der Default ist FALSE, d.h. die Definition
  6281.      wird nicht in der Datei abgelegt.  Ist zus"atzlich die
  6282.      \tty{GLOBAL}-Option gegeben worden, so wird das Makro mit dem
  6283.      modifizierten Namen abgelegt.}
  6284. \item{\tty{INTLABEL/NOINTLABEL} : legen fest, ob ein in der Zeile mit
  6285.      dem Makroaufruf definiertes Label innerhalb des Rumpfes als
  6286.      zus"atzlicher Parameter verwendet werden soll, als einfach
  6287.      nur die Adresse dieser Zeile zu 'labeln'.}
  6288. \item{\tty{GLOBALSYMBOLS/NOGLOBALSYMBOLS} : legt fest, ob im
  6289.      Makro definierte Labels lokal zu diesem Makro sein sollen
  6290.      oder auch au"serhalb des Makros verf"ugbar sein sollen.
  6291.      Der Default ist, da"s Labels lokal sind, weil mehrfache
  6292.      Benutzung eines Makros ansonsten schwierig w"are.}
  6293. \end{itemize}
  6294. Diese eben beschriebenen Steuerparameter werden von \asname{} aus der
  6295. Parameterliste ausgefiltert, haben also keine weitere Wirkung in
  6296. der folgenden Verarbeitung und Benutzung.
  6297. \par
  6298. Beim Aufruf eines Makros werden die beim Aufruf angegebenen
  6299. Parameternamen "uberall textuell im Befehlsblock eingesetzt und der
  6300. sich so ergebene Assemblercode wird normal assembliert.  Sollten
  6301. beim Aufruf zu wenige Parameter angegeben werden, werden Nullstrings
  6302. eingef"ugt.  Wichtig ist zu wissen, da"s bei der Makroexpansion keine
  6303. R"ucksicht auf eventuell in der Zeile enthaltene Stringkonstanten
  6304. genommen wird.  Zu diesem Detail gilt die alte IBM-Regel:
  6305. \begin{quote}
  6306. \ii{It's not a bug, it's a feature!}
  6307. \end {quote}
  6308. Diese L"ucke kann man bewu"st ausnutzen, um Parameter mittels
  6309. Stringvergleichen abzupr"ufen.  So kann man auf folgende Weise
  6310. z.B. pr"ufen, wie ein Makroparameter aussieht:
  6311. \begin{verbatim}
  6312. mul     MACRO   para,parb
  6313.        IF      UpString("PARA")<>"A"
  6314.         MOV    a,para
  6315.        ENDIF
  6316.        IF      UpString("PARB")<>"B"
  6317.         MOV    b,parb
  6318.        ENDIF
  6319.        !mul     ab
  6320.        ENDM
  6321. \end{verbatim}
  6322. Wichtig ist bei obigem Beispiel, da"s der Assembler alle
  6323. Parameternamen im case-sensitiven Modus in Gro"sbuchstaben
  6324. umsetzt, in Strings aber nie eine Umwandlung in Gro"sbuchstaben
  6325. erfolgt. Die Makroparameternamen m"ussen in den Stringkonstanten
  6326. daher gro"s geschrieben werden.
  6327. \par
  6328. Des weiteren wird die Parameter-Ersetzung davon beeinflusst, ob
  6329. Unterstriche im Parameternamen erlaubt sind oder nicht.  Falls
  6330. nicht --- was der Default ist --- wirken Unterstriche auch
  6331. als 'Begrenzungszeichen', um Parameternamen im Makrorumpf zu
  6332. erkennen.  Im Default w"urde also im folgenden Beispiel
  6333. \begin{verbatim}
  6334. setled  macro led,value
  6335.        out   led,value
  6336.        ld    led_shadow,value
  6337.        endm
  6338. \end{verbatim}
  6339. der Parameter 'led' in beiden Zeilen ersetzt, mit dem Kommandozeilen-Schalter
  6340. \tty{-underscore-macroargs} jedoch nur in der ersten.  Diverse
  6341. der mitgelieferten Include-Dateien setzen das Default-Verhalten
  6342. voraus, weshalb dieser Schalter nur wenn unbedingt n"otig genutzt
  6343. werden sollte.
  6344. \par
  6345. Argumente an ein Makro k"onnen in zwei Formen angegeben werden:
  6346. als {\em Positionsargumente} oder als {\em
  6347. Schl"usselwortargumente}.
  6348. \par
  6349. Bei Positionsargumenten ergibt sich
  6350. die Zuordnung von Argumenten zu Makro-Parametern einfach durch
  6351. ihre Position in der Aufrufliste, d.h. das erste Argument wird dem
  6352. ersten Parameter zugeordnet, das zweite Argument dem zweiten
  6353. Parameter usw..  Werden weniger Argumente angegeben als das Makro
  6354. Parameter hat, werden eventuell definierte Defaultwerte oder ein
  6355. Leerstring eingesetzt.  Gleiches gilt auch f"ur leere Argumente.
  6356. \par
  6357. Schl"usselwortargumente geben jedoch explizit an, f"ur welchen
  6358. Makro-Parameter sie gelten, indem der Parametername dem Wert
  6359. vorangestellt wird, z.B. so:
  6360. \begin{verbatim}
  6361.       mul  para=r0,parb=r1
  6362. \end{verbatim}
  6363. Wiederum wird f"ur nicht definierte Parameter ein eventuell
  6364. vorhandener Default oder ein Leerstring eingesetzt.
  6365. \par
  6366. Im Unterschied zu Positionsargumenten ist es mit
  6367. Schl"usselwortargumenten auch m"oglich, einem Parameter einen
  6368. Leerstring zuzuweisen, der einen nicht-leeren Default-Wert hat.
  6369. \par
  6370. Positions- und Schl"usselwortargumente d"urfen auch in einem
  6371. Aufruf gemischt werden, jedoch d"urfen ab dem ersten
  6372. Schl"usselwortargument keine Positionsargumente mehr verwendet
  6373. werden.
  6374. \par
  6375. F"ur die Makroparameter gelten die gleichen Konventionen wie bei
  6376. normalen Symbolen, mit der Ausnahme, da"s hier nur Buchstaben
  6377. und Ziffern zugelassen sind, also weder Punkte noch
  6378. Unterstriche. Diese Einschr"ankung hat ihren Grund in einem
  6379. verstecktem Feature: Der Unterstrich erlaubt es, einzelne
  6380. Makroparameternamen zu einem Symbol zusammenzuketten, z.B. in
  6381. folgendem Beispiel:
  6382. \begin{verbatim}
  6383. concat  MACRO   part1,part2
  6384.        CALL    part1_part2
  6385.        ENDM
  6386. \end{verbatim}
  6387. Der Aufruf
  6388. \begin{verbatim}
  6389.        concat  Modul,Funktion
  6390. \end{verbatim}
  6391. ergibt also
  6392. \begin{verbatim}
  6393.        CALL    Modul_Funktion
  6394. \end{verbatim}
  6395. \par
  6396. Neben den am Makro selber angegebenen Parametern existieren vier weitere
  6397. 'implizite' Parameter, die immer vorhanden sind und daher nicht als eigene
  6398. Makroparameter verwendet werden sollten:
  6399. \begin{itemize}
  6400. \item{{\tt ATTRIBUTE} bezeichnet bei Architekturen, die Attribute f"ur
  6401.      Prozessorbefehle zulassen, das bei einem Makroaufruf angeh"angte
  6402.      Argument.  F"ur ein Beispiel siehe z.B. unten!}
  6403. \item{{\tt ALLARGS} bezeichnet eine kommaseparierte Liste aller
  6404.      Makroargumente, z.B., um sie an eine {\tt IRP}-Anweisung
  6405.      weiterzureichen.}
  6406. \item{{\tt ARGCOUNT} bezeichnet die tat"achlich "ubergebene Anzahl der
  6407.      an das Makro "ubergebenen Argumente.  Zu beachten ist allerdings,
  6408.      da"s diese Zahl niemals geringer als die Zahl der formalen Parameter
  6409.      ist, da \asname{} fehlende Argumente mit Leerstrings auff"ullt!}
  6410. \item{{\tt \_\_LABEL\_\_} bezeichnet das Label, das in der das Makro aufrufenden
  6411.      Zeile stand.  Diese Ersetzung findet nur statt, wenn f"ur dieses
  6412.      Makro die {\tt INTLABEL}-Option gesetzt wurde!}
  6413. \end{itemize}
  6414. {\bf WICHTIG:} Die Namen dieser impliziten Parameter sind auch
  6415. case-insensitiv, wenn \asname{} insgesamt angewiesen wurde, case-sensitiv
  6416. zu arbeiten!
  6417.  
  6418. Der Zweck, ein Label 'intern' im Makro verwenden zu k"onnen, ist sicher
  6419. nicht unmittelbar einleuchtend.  Den einen oder anderen Fall mag es ja
  6420. geben, in dem es sinnvoll ist, den Einsprungpunkt in ein Makro irgendwo
  6421. in seinen Rumpf zu verschieben.  Der wichtigste Anwendungsfall sind aber
  6422. TI-Signalprozessoren, die eine Parallelisierung von Befehlen durch einen
  6423. doppelten senkrechten Strich in der Label-Spalte kennzeichnen, etwa so:
  6424. \begin{verbatim}
  6425.    instr1
  6426. ||  instr2
  6427. \end{verbatim}
  6428. (da die beiden Instruktionen im Maschinencode in ein Wort verschmelzen,
  6429. kann man die zweite Instruktion "ubrigens gar nicht separat anspringen -
  6430. man verliert also durch das Belegen der Label-Position nichts).  Das
  6431. Problem ist aber, da"s einige 'Bequemlichkeits-Befehle' durch Makros
  6432. realisiert werden.  Ein vor das Makro geschriebenes
  6433. Parallelisierungssymbol w"urde normalerweise dem Makro selber zugeordnet,
  6434. {\it nicht dem ersten Befehl im Makro selber}.  Aber mit diesem Trick
  6435. funktioniert's:
  6436. \begin{verbatim}
  6437. myinstr    macro {INTLABEL}
  6438. __LABEL__  instr2
  6439.           endm
  6440.  
  6441.           instr1
  6442. ||         myinstr
  6443. \end{verbatim}
  6444. Das Ergebnis nach der Expansion von {\tt myinstr} ist identisch zu dem
  6445. vorherigen Beispiel ohne Makro.
  6446.  
  6447. Rekursion von Makros, also das wiederholte Aufrufen eines Makros innerhalb
  6448. seines Rumpfes oder indirekt "uber andere von ihm aufgerufene Makros ist
  6449. vollkommen legal.  Wie bei jeder Rekusion mu"s man dabei nat"urlich
  6450. sicherstellen, da"s sie irgendwann ein Ende findet.  F"ur den Fall, da"s
  6451. man dies vergessen hat, f"uhrt \asname{} in jedem definierten Makro einen Z"ahler
  6452. mit, der bei Beginn einer Makroexpansion inkrementiert und an deren Ende
  6453. wieder dekrementiert wird.  Bei rekursiven Aufrufen eines Makros erreicht
  6454. dieser Z"ahler also immer h"ohere Werte, und bei einem per {\tt NESTMAX}
  6455. einstellbaren Wert bricht \asname{} ab.  Vorsicht, wenn man diese Bremse
  6456. abschaltet: der Speicherbedarf auf dem Heap kann so beliebig steigen und
  6457. selbst ein Unix-System in die Knie zwingen...
  6458. \par
  6459. Um alle Klarheiten auszur"aumen, ein einfaches Beispiel:
  6460. Ein an ,,Intel-Syntax'' gew"ohnter Programmierer m"ochte diex Befehle \tty{PUSH/POP}
  6461. unbedingt auch auf dem 68000 haben.  Er l"ost das
  6462. folgenderma"sen:
  6463. \begin{verbatim}
  6464. push    MACRO   op
  6465.        MOVE.ATTRIBUTE op,-(sp)
  6466.        ENDM
  6467.  
  6468. pop     MACRO   op
  6469.        MOVE.ATTRIBUTE (sp)+,op
  6470.        ENDM
  6471. \end{verbatim}
  6472. Schreibt man nun im Code
  6473. \begin{verbatim}
  6474.        push    d0
  6475.        pop.l   a2        ,
  6476. \end{verbatim}
  6477. so wird daraus
  6478. \begin{verbatim}
  6479.        MOVE.   d0,-(sp)
  6480.        MOVE.L  (sp)+,a2
  6481. \end{verbatim}
  6482. Eine Makrodefinition darf nicht "uber Include-Datei-Grenzen hinausgehen.
  6483. \par
  6484. In Makror"umpfen definierte Labels werden immer als lokal betrachtet,
  6485. au"ser bei der Definition des Makros wurde die
  6486. \tty{GLOBALSYMBOLS}-Option verwendet.  Ist es aus irgendwelchen Gr"unden
  6487. erforderlich, ein einzelnes Label in einem Makro global zu
  6488. machen, das ansonsten lokale Labels benutzt, so kann man es mit
  6489. \tty{LABEL} definieren, dessen Anwendung (wie bei \tty{BIT,SFR}...)
  6490. immer globale Symbole ergibt :
  6491. \begin{verbatim}
  6492. <Name>  LABEL   *
  6493. \end{verbatim}
  6494. Da der Assembler beim Parsing einer Zeile zuerst die Makroliste und
  6495. danach die Prozessorbefehle abklappert, lassen sich auch Prozessorbefehle
  6496. neu definieren.  Die Definition sollte dann aber vor der ersten Benutzung
  6497. des Befehles durchgef"uhrt werden, um Phasenfehler wie im folgenden
  6498. Beispiel zu vermeiden:
  6499. \begin{verbatim}
  6500.        BSR     ziel
  6501.  
  6502. bsr     MACRO   target
  6503.        JSR     ziel
  6504.        ENDM
  6505.  
  6506.        BSR     ziel
  6507. \end{verbatim}
  6508. Im ersten Pass ist bei der Assemblierung des \tty{BSR}-Befehles das Makro
  6509. noch nicht bekannt, es wird ein 4 Byte langer Befehl erzeugt.  Im
  6510. zweiten Pass jedoch steht die Makrodefinition sofort (aus dem ersten
  6511. Pass) zur Verf"ugung, es wird also ein 6 Byte langer \tty{JSR} kodiert.
  6512. Infolgedessen sind alle darauffolgenden Labels um zwei zu niedrig,
  6513. bei allen weiteren Labels sind Phasenfehler die Folge, und ein weiterer
  6514. Pass ist erforderlich.
  6515. \par
  6516. Da durch die Definition eines Makros ein gleichnamiger Maschinen- oder
  6517. Pseudobefehl nicht mehr zugreifbar ist, gibt es eine Hintert"ur, die
  6518. Originalbedeutung zu erreichen: Stellt man dem Mnemonic ein \tty{!} voran,
  6519. so wird das Durchsuchen der Makroliste unterdr"uckt.  Das kann
  6520. beispielsweise n"utzlich sein, um Befehle in ihrer M"achtigkeit zu
  6521. erweitern, z.B. die Schiebebefehle beim TLCS-90:
  6522. \begin{verbatim}
  6523. srl     macro   op,n      ; Schieben um n Stellen
  6524.        rept    n         ; n einfache Befehle
  6525.         !srl   op
  6526.        endm
  6527.        endm
  6528. \end{verbatim}
  6529. Fortan hat der \tty{SRL}-Befehl einen weiteren Parameter...
  6530.  
  6531. \subsubsection{Expansion im Listing}
  6532.  
  6533. Wird ein Makro im Quellcode aufgerufen, wird der durch dieses Makro definierte
  6534. Quellcode, inklusiver eingesetzter Parameter, an dieser Stelle im Listing
  6535. expandiert.  Das kann das Listing stark aufbl"ahen und schwerer lesbar
  6536. machen.  Es ist daher m"oglich, diese Expansion ganz oder teilweise zu
  6537. unterdr"ucken.  Generell teilt \asname{} die in einem Makrorumpf enthaltenen
  6538. Quelltext-Zeilen in drei Klassen ein:
  6539. \begin{itemize}
  6540. \item{Darin enthaltene Makrodefinitionen, d.h. das Makro wird benutzt, um
  6541.      seinerseits weitere Makros zu definieren, oder es enth"alt \tty{REPT/
  6542.      IRP/IRPC/WHILE}-Bl"ocke.}
  6543. \item{Befehle zur bedingten Assemblierung plus Zeilen, die aufgrund
  6544.      solcher Anweisungen {\it nicht} assembliert werden.  Da bedingte
  6545.      Assemblierung von Makro-Parametern abh"angig sein darf, kann diese
  6546.      Untermenge ebenfalls davon abh"angen.}
  6547. \item{Alle restlichen Zeilen, die nicht unter die beiden ersten Klassen
  6548.      fallen.}
  6549. \end{itemize}
  6550. F"ur jedes Makro kann einzeln festgelegt werden, welche Teile im Listing
  6551. auftauchen oder nicht auftauchen sollen.  Vorgabewert bei der Definition
  6552. eines Makros ist dabei die zuletzt mit dem Befehl \tty{MACEXP\_DFT}
  6553. (\ref{MACEXPDFT}) vorgegebene Menge.  Wird bei der Definition eines
  6554. Makros eine der Direktiven \tty{EXPAND/NOEXPAND}, \tty{EXPIF/NOEXPIF},
  6555. \tty{EXPMACRO/NOEXPMACRO} oder \tty{EXPREST/NOEXPREST} gegeben, so wirken
  6556. diese {\it zus"atzlich} und mit h"oherer Priorit"at.  Ist z.B. die Expansion
  6557. global komplett ausgeschaltet (\tty{MACEXP\_DFT OFF}), so bewirkt das
  6558. Hinzuf"ugen von \tty{EXPREST}, da"s bei der Benutzung dieses Makro nur
  6559. die Zeilen im Listing angezeigt werden, die nach Auswertung bedingter
  6560. Assemblierung verblieben sind und auch keine Makrodefinition selber sind.
  6561.  
  6562. Daraus ergibt sich, da"s eine "Anderung der Untermenge per \tty{MACEXP\_DFT}
  6563. keine Auswirkungen mehr auf Makros hat, die {\it vor} dieser Anweisung
  6564. {\it definiert} wurden.  Im Listing f"uhrt der Abschnitt mit definierten Makros
  6565. f"ur jedes Makro auf, welche Direktiven in der Summe f"ur dieses Makro
  6566. gelten.  Die in geschweiften Klammern aufgef"uhrte Liste ist dabei soweit
  6567. gek"urzt, da"s f"ur jede Klasse nur die letztg"ultige Direktive aufgef"uhrt
  6568. wird.  Ein per \tty{MACEXP\_DFT} gegebenes \tty{NOIF} taucht dort also
  6569. nicht mehr auf, falls speziell f"ur dieses Makro die Direktive \tty{EXPIF}
  6570. gegeben wurde.
  6571.  
  6572. In Einzelf"allen kann es sinnvoll sein, die f"ur ein Makro definierten
  6573. Expansionsregeln zu "ubersteuern, egal ob diese per \tty{MACEXP\_DFT} oder
  6574. Direktiven gesetzt wurden.  Dazu dient der Befehl \tty{MACEXP\_OVR}
  6575. (\ref{MACEXPOVR}), der auf in der Folge {\it expandierte} Makros wirkt.  Auch
  6576. bei diesem Befehl gilt, da"s damit gegebene Direktiven zus"atzlich zu
  6577. denen in einem Makro hinterlegten und mit h"oherer Priorit"at wirken.  Ein
  6578. \tty{MACEXP\_OVR} ohne jegliche Argumente schaltet so einen ''Override''
  6579. wieder ab.
  6580.  
  6581. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6582.  
  6583. \subsection{IRP}
  6584. \ttindex{IRP}
  6585.  
  6586. ist die eine vereinfachte Form von Makrodefinitionen f"ur den Fall,
  6587. da"s eine Befehlsfolge einmal auf mehrere Operanden angewendet werden
  6588. soll und danach nicht mehr gebraucht wird.  \tty{IRP} ben"otigt als ersten
  6589. Parameter ein Symbol f"ur den Operanden, und danach eine (fast)
  6590. beliebige Menge von Parametern, die nacheinander in den Befehlsblock
  6591. eingesetzt werden.  Um eine Menge von Registern auf den Stack zu
  6592. schieben, kann man z.B. schreiben
  6593. \begin{verbatim}
  6594.        IRP     op, acc,b,dpl,dph
  6595.        PUSH    op
  6596.        ENDM
  6597. \end{verbatim}
  6598. was in folgendem resultiert:
  6599. \begin{verbatim}
  6600.        PUSH    acc
  6601.        PUSH    b
  6602.        PUSH    dpl
  6603.        PUSH    dph
  6604. \end{verbatim}
  6605. Die Argumentliste darf analog zu einer Makro-Definition die
  6606. Steueranweisungen \tty{GLOBALSYMBOLS} bzw. \tty{NOGLOBALSYMBOLS} (durch
  6607. geschweifte Klammern als solche gekennzeichnet) enthalten, um zu
  6608. steuern, ob benutzte Labels f"ur jeden Durchgang automatisch lokal
  6609. sind oder nicht.
  6610.  
  6611. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6612.  
  6613. \subsection{IRPC}
  6614. \ttindex{IRPC}
  6615.  
  6616. \tty{IRPC} ist eine Variante von \tty{IRP}, bei der das erste Argument in
  6617. den bis \tty{ENDM} folgenden Zeilen nicht sukzessiv durch die weiteren
  6618. Parameter, sondern durch die Zeichen eines Strings ersetzt wird.  Einen
  6619. String kann man z.B. also auch ganz umst"andlich so im Speicher ablegen:
  6620. \begin{verbatim}
  6621.        irpc    char,"Hello World"
  6622.        db      'CHAR'
  6623.        endm
  6624. \end{verbatim}
  6625. \bb{ACHTUNG!} Wie das Beispiel schon zeigt, setzt \tty{IRPC} nur das
  6626. Zeichen selber ein, da"s daraus ein g"ultiger Ausdruck entsteht (also hier
  6627. durch die Hochkommas, inklusive des Details, da"s hier keine automatische
  6628. Umwandlung in Gro"sbuchstaben vorgenommen wird), mu"s man selber
  6629. sicherstellen.
  6630.  
  6631. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6632.  
  6633. \subsection{REPT}
  6634. \ttindex{REPT}
  6635.  
  6636. ist die einfachste Form der Makrobenutzung.  Der im Rumpf angegebene
  6637. Code wird einfach sooft assembliert, wie der Integerparameter von
  6638. \tty{REPT} angibt.  Dieser Befehl wird h"aufig in kleinen Schleifen anstelle
  6639. einer programmierten Schleife verwendet, um den Schleifenoverhead zu
  6640. sparen.
  6641. \par
  6642. Der Vollst"andigkeit halber ein Beispiel:
  6643. \begin{verbatim}
  6644.        REPT    3
  6645.        RR      a
  6646.        ENDM
  6647. \end{verbatim}
  6648. rotiert den Akku um 3 Stellen nach rechts.
  6649. \par
  6650. Ob Symbole f"ur jede einzelne Repetition lokal sind oder nicht,
  6651. kann wiederum durch die Steuerparameter \tty{GLOBALSYMBOLS} bzw.
  6652. \tty{NOGLOBALSYMBOLS} (durch geschweifte Klammern als solche
  6653. gekennzeichnet) bestimmt werden.
  6654.  
  6655. Ist das Argument von \tty{REPT} kleiner oder gleich Null, so wird
  6656. "uberhaupt keine Expansion durchgef"uhrt.  Dies ist ein Unterschied
  6657. zu fr"uheren Versionen von \asname{}, die hier etwas ,,schlampig'' waren
  6658. und immer mindestens eine Expansion ausf"uhrten.
  6659.  
  6660. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6661.  
  6662. \subsection{WHILE}
  6663. \ttindex{WHILE}
  6664.  
  6665. \tty{WHILE} arbeitet analog zu \tty{REPT}, allerdings tritt an die
  6666. Stelle einer festen Anzahl als Argument ein boolescher Ausdruck, und
  6667. der zwischen \tty{WHILE} und \tty{ENDM} eingeschlossene Code wird sooft
  6668. assenbliert, bis der Ausdruck logisch falsch wird.  Im Extremfall kann
  6669. dies bedeuten, da"s der Code "uberhaupt nicht assembliert wird, falls die
  6670. Bedingung bereits beim Eintritt in das Konstrukt falsch ist.  Andererseits
  6671. kann es nat"urlich auch passieren, da"s die Bedingung immer wahr bleibt,
  6672. und \asname{} l"auft bis an das Ende aller Tage...hier sollte man also etwas
  6673. Umsicht walten lassen, d.h. im Rumpf mu"s eine Anweisung stehen, die die
  6674. Bedingung auch beeinflu"st, z.B. so:
  6675. \begin{verbatim}
  6676. cnt     set     1
  6677. sq      set     cnt*cnt
  6678.        while   sq<=1000
  6679.         dc.l    sq
  6680. cnt      set     cnt+1
  6681. sq       set     cnt*cnt
  6682.        endm
  6683. \end{verbatim}
  6684. Dieses Beispiel legt alle Quadratzahlen bis 1000 im Speicher ab.
  6685. \par
  6686. Ein unsch"ones Detail bei \tty{WHILE} ist im Augenblick leider noch,
  6687. da"s am Ende der Expansion eine zus"atzliche Leerzeile, die im Quellrumpf
  6688. nicht vorhanden war, eingef"ugt wird.  Dies ist ein ,,Dreckeffekt'',
  6689. der auf einer Schw"ache des Makroprozessors beruht und leider nicht so
  6690. einfach zu beheben ist.  Hoffentlich st"ort es nicht allzusehr....
  6691.  
  6692. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6693.  
  6694. \subsection{EXITM}
  6695. \ttindex{EXITM}
  6696.  
  6697. \tty{EXITM} stellt einen Weg dar, um eine Makroexpansion oder einen der
  6698. Befehle \tty{REPT}, \tty{IRP} oder \tty{WHILE} vorzeitig abzubrechen.
  6699. Eine solche M"oglichkeit hilft zum Beispiel, umfangreichere Klammerungen
  6700. mit \tty{IF-ENDIF}-Sequenzen in Makros "ubersichtlicher zu gestalten.
  6701. Sinnvollerweise ist ein \tty{EXITM} aber selber auch immer bedingt, was zu
  6702. einem wichtigen Detail f"uhrt: Der Stack, der "uber momentan offene
  6703. \tty{IF}- oder \tty{SWITCH}-Konstrukte Buch f"uhrt, wird auf den Stand vor
  6704. Beginn der Makroexpansion zur"uck gesetzt.  Dies ist f"ur bedingte
  6705. \tty{EXITM}'s zwingend notwendig, da das den \tty{EXITM}-Befehl in
  6706. irgendeiner Form einschlie"sende \tty{ENDIF} oder \tty{ENDCASE} nicht mehr
  6707. erreicht wird und \asname{} ohne einen solchen Trick eine Fehlermeldung erzeugen
  6708. w"urde.  Weiterhin ist es f"ur verschachtelte Makrokonstruktionen
  6709. wichtig, zu beachten, da"s \tty{EXITM} immer nur das momentan innerste
  6710. Konstrukt abbricht!  Wer aus seiner geschachtelten Konstruktion
  6711. vollst"andig ,,ausbrechen'' will, mu"s auf den h"oheren Ebenen ebenfalls
  6712. \tty{EXITM}'s vorsehen!
  6713.  
  6714. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6715.  
  6716. \subsection{SHIFT}
  6717. \ttindex{SHIFT}\ttindex{.SHIFT}\ttindex{SHFT}
  6718.  
  6719. {\tt SHIFT} ist ein Mittel, um Makros mit variablen Argumentlisten
  6720. abzuarbeiten: Es verwirft den ersten Parameter, so da"s der zweite
  6721. Parameter seinen Platz einnimmt usw.  Auf diese Weise k"onnte man
  6722. sich durch eine variable Argumentliste durcharbeiten...wenn man es richtig
  6723. macht.  Folgendes funktioniert zum Beispiel {\em nicht}...
  6724. \begin{verbatim}
  6725. pushlist  macro reg
  6726.          rept  ARGCOUNT
  6727.          push  reg
  6728.          shift
  6729.          endm
  6730.          endm
  6731. \end{verbatim}
  6732. ...weil das Makro {\em einmal} expandiert wird, seine Ausgabe von {\tt
  6733. REPT} aufgenommen und dann n-fach ausgef"uhrt wird.  Das erste Argument
  6734. wird also n-fach gesichert...besser geht es schon so:
  6735. \begin{verbatim}
  6736. pushlist  macro reg
  6737.          if      "REG"<>""
  6738.           push    reg
  6739.           shift
  6740.           pushlist ALLARGS
  6741.          endif
  6742.          endm
  6743. \end{verbatim}
  6744. Also eine Rekursion, in der pro Schritt die Argumentliste ({\tt ALLARGS})
  6745. um eins verk"urzt wird.  Der wichtige Trick ist, da"s jedes Mal eine neue
  6746. Expansion gestartet wird...
  6747.  
  6748. Auf Plattformen, bei denen {\tt SHIFT} bereits eine Maschineninstruktion ist,
  6749. kann stattdessen {\tt SHFT} geschrieben werden, oder man spricht explizit
  6750. die Pseudoinstruktion durch einen vorangestellten Punkt (\tty{.SHIFT} anstelle
  6751. \tty{SHIFT}) an.
  6752.  
  6753. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6754.  
  6755. \subsection{MAXNEST}
  6756. \ttindex{MAXNEST}
  6757.  
  6758. Mit {\tt MAXNEST} kann man einstellen, wie oft ein Makro maximal rekursiv
  6759. aufgerufen werden kann, bevor \asname{} mit einer Fehlermeldung abbricht.  Dies
  6760. darf ein beliebiger ganzer, positiver Wert sein, wobei der Sonderwert 0
  6761. diese Sicherheitsbremse komplett abschaltet (vorsicht damit...).  Der
  6762. Vorgabewert f"ur die maximale Verschachtelungstiefe ist 256; die
  6763. momentane Einstellung kann aus einer gleichnamigen Variablen gelesen
  6764. werden.
  6765.  
  6766. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6767.  
  6768. \subsection{FUNCTION}
  6769. \ttindex{FUNCTION}
  6770. \label{SectFUNCTION}
  6771.  
  6772. \tty{FUNCTION} ist zwar kein Makrobefehl im engeren Sinne, da
  6773. hierbei aber "ahnliche Mechanismen wie bei Makroersetzungen
  6774. angewendet werden, soll er hier beschrieben werden.
  6775. \par
  6776. Dieser Befehl dient dazu, neue Funktionen zu definieren, die in
  6777. Formel\-ausdr"ucken wie die vordefinierten Funktionen verwendet werden
  6778. k"onnen.  Die Definition mu"s in folgender Form erfolgen:
  6779. \begin{verbatim}
  6780. <Name>  FUNCTION <Arg>,..,<Arg>,<Ausdruck>
  6781. \end{verbatim}
  6782. Die Argumente sind die Werte, die sozusagen in die Funktion
  6783. ,,hineingesteckt'' werden.  In der Definition werden f"ur die Argumente
  6784. symbolische Namen gebraucht, damit der Assembler bei der Benutzung
  6785. der Funktion wei"s, an welchen Stellen die aktuellen Werte einzusetzen
  6786. sind. Dies kann man an folgendem Beispiel sehen:
  6787. \begin{verbatim}
  6788. isgit   FUNCTION ch,(ch>='0')&&(ch<='9')
  6789. \end{verbatim}
  6790. Diese Funktion "uberpr"uft, ob es sich bei dem Argument (wenn man es
  6791. als Zeichen interpretiert) um eine Ziffer im momentan g"ultigen
  6792. Zeichencode handelt (der momentane Zeichencode ist mittels \tty{CHARSET}
  6793. ver"anderbar, daher die vorsichtige Formulierung).
  6794. \par
  6795. Die Argumentnamen (in diesem Falle \tty{CH}) m"ussen den gleichen h"arteren
  6796. Symbolkonventionen gen"ugen wie Parameter bei einer Makrodefinition,
  6797. d.h. die Sonderzeichen . und \_ sind nicht erlaubt.
  6798. \par
  6799. Selbst definierte Funktionen werden genauso benutzt wie eingebaute,
  6800. d.h. mit einer durch Kommas getrennten, geklammerten Argumentliste:
  6801. \begin{verbatim}
  6802.        IF isdigit(Zeichen)
  6803.         message "\{Zeichen} ist eine Ziffer"
  6804.        ELSEIF
  6805.         message "\{Zeichen} ist keine Ziffer"
  6806.        ENDIF
  6807. \end{verbatim}
  6808. \par
  6809. Bei dem Aufruf der Funktion werden die Argumente nur einmal berechnet
  6810. und danach an allen Stellen der Formel eingesetzt, um den
  6811. Rechenaufwand zu reduzieren und Seiteneffekte zu vermeiden.
  6812. Bei Funktionen mit mehreren Argumenten m"ussen die einzelnen Argumente
  6813. bei der Benutzung durch Kommata getrennt werden.
  6814. \par
  6815. \bb{ACHTUNG!} Analog wie bei Makros kann man mit der Definition von
  6816. Funktionen bestehende Funktionen umdefinieren.  Damit lassen sich auch
  6817. wieder Phasenfehler provozieren.  Solche Definitionen sollten daher auf
  6818. jeden Fall vor der ersten Benutzung erfolgen!
  6819. \par
  6820. Da die Berechnung des Funktionsergebnisses anhand des Formelausdruckes
  6821. auf textueller Ebene erfolgt, kann der Ergebnistyp von dem Typ des
  6822. Eingangsargumentes abh"angen.  So kann bei folgender Funktion
  6823. \begin{verbatim}
  6824. double  function x,x+x
  6825. \end{verbatim}
  6826. das Ergebnis ein Integer, eine Gleitkommazahl oder sogar ein String
  6827. sein, je nach Typ des Arguments!
  6828. \par
  6829. Bei der Definition und Ansprache von Funktionen wird im case-sensitiven
  6830. Modus zwischen Gro"s- und Kleinschreibung unterschieden, im Gegensatz
  6831. zu eingebauten Funktionen!
  6832.  
  6833. %%---------------------------------------------------------------------------
  6834.  
  6835. \section{Strukturen}
  6836. \ttindex{STRUCT}\ttindex{ENDSTRUCT}\ttindex{UNION}\ttindex{ENDUNION}
  6837. \ttindex{STRUC}\ttindex{ENDSTRUC}\ttindex{ENDS}
  6838. \ttindex{DOTTEDSTRUCTS}
  6839.  
  6840. {\em G"ultigkeit: alle Prozessoren}
  6841.  
  6842. Auch in Assemblerprogrammen ergibt sich dann und wann die Notwendigkeit,
  6843. analog zu Hochsprachen zusammengesetzte Datenstrukturen zu definieren.
  6844. \asname{} unterst"utzt sowohl die Definition als auch die Nutzung von Strukturen
  6845. mit einer Reihe von Konstrukten und Anweisungen, die im folgenden
  6846. erl"autert werden sollen:
  6847.  
  6848. \subsection{Definition}
  6849.  
  6850. Die Definition einer Struktur wird duch den Befehl \tty{STRUCT}
  6851. eingeleitet und durch \tty{ENDSTRUCT} abgeschlossen (schreibfaule
  6852. Zeitgenossen d"urfen aber auch stattdessen {\tt STRUC} bzw.  {\tt
  6853. ENDSTRUC} oder {\tt ENDS} schreiben).  Ein eventuell diesen Befehlen
  6854. voranstehendes Label wird als Name der zu definierenden Struktur
  6855. genommen; am Ende der Definition ist der Name optional und kann von
  6856. zur Festlegung des L"angennamens (s.u.) genutzt werden.  Das
  6857. restliche Verfahren ist simpel: Mit einem \tty{STRUCT} wird der
  6858. momentane Programmz"ahler gesichert und auf Null zur"uck gesetzt.
  6859. Alle zwischen \tty{STRUCT} und \tty{ENDSTRUCT} definierten Labels
  6860. ergeben mithin die Offsets der einzelnen Datenfelder in der Struktur.
  6861. Die Reservierung des Platzes f"ur die einzelnen Felder erfolgt mit
  6862. den f"ur den jeweils aktiven Zielprozessor zul"assigen Befehlen zur
  6863. Speicherplatzreservierung, also z.B.  \tty{DS.x} f"ur die Motorolas
  6864. oder \tty{DB} \& Co.  f"ur Intels.  Es gelten hier auch gleichfalls
  6865. die Regeln f"ur das Aufrunden von L"angen, um Alignments zu erhalten
  6866. - wer also 'gepackte' Strukturen definieren will, mu"s eventuell ein
  6867. {\tt PADDING OFF} voranstellen.  Umgekehrt lassen sich Ausrichtungen
  6868. nat"urlich mit Befehlen wie {\tt ALIGN} erzwingen.
  6869.  
  6870. Da eine solche Definition nur eine Art 'Prototypen' darstellt, k"onnen nur
  6871. Befehle benutzt werden, die Speicherplatz reservieren, aber keine solchen,
  6872. die Konstanten im Speicher ablegen oder Code erzeugen.
  6873.  
  6874. Innerhalb von Strukturen definierte Labels (also die Namen der Elemente)
  6875. werden nicht direkt abgespeichert, sondern es wird ihnen der Name der
  6876. Struktur vorangestellt, durch ein Trennzeichen verbunden, bei dem es sich
  6877. defaultm"a"sig um den Unterstrich (\_) handelt.  Dieses Verhalten l"a"st
  6878. sich aber durch dem \tty{STRUCT}-Befehl mitgegebene Argumente steuern:
  6879. \begin{itemize}
  6880. \item{\tty{NOEXTNAMES} unterdr"uckt das Voranstellen des Strukturnamens.
  6881.      Der Programmierer ist in diesem Falle selber daf"ur verantworlich,
  6882.      da"s Feldnamen nicht mehrfach verwendet werden.}
  6883. \item{\tty{DOTS} weist \asname{} an, als verbindendes Zeichen einen Punkt
  6884.      anstelle des Unterstriches zu verwenden.  Es sei jedoch
  6885.      ausdr"ucklich darauf hingewiesen, da"s der Punkt bei vielen
  6886.      Zielprozessoren ein Sonderfunktion zur Bitadressierung hat und
  6887.      diese zu Problemen f"uhren kann!}
  6888. \end{itemize}
  6889. Des weiteren ist es m"oglich, die Verwendung des Punktes durch den Befehl
  6890. \begin{verbatim}
  6891.        dottedstructs <on|off>
  6892. \end{verbatim}
  6893. dauerhaft ein- bzw. auszuschalten.
  6894.  
  6895. Neben den Namen der Elemente definiert \asname{} beim Abschlu"s der Definition
  6896. ein weiteres Symbol mit dem Namen {\tt LEN}, das nach dem gleichen Regeln
  6897. um den Namen der Struktur erweitert wird - oder um den Label-Namen, der
  6898. optional bei \tty{ENDSTRUCT} angegeben werden kann.
  6899.  
  6900. Das ganze sieht dan in der Praxis z.B. so aus:
  6901. \begin{verbatim}
  6902. Rec     STRUCT
  6903. Ident   db      ?
  6904. Pad     db      ?
  6905. Pointer dd      ?
  6906. Rec     ENDSTRUCT
  6907. \end{verbatim}
  6908. Hier w"urde z.B. dem Symbol {\tt REC\_LEN} der Wert 6 zugewiesen.
  6909.  
  6910. \subsection{Nutzung}
  6911.  
  6912. Ist eine Struktur einmal definiert, ist die Nutzung denkbar einfach und
  6913. "ahnlich wie ein Makro: ein einfaches
  6914. \begin{verbatim}
  6915. thisrec Rec
  6916. \end{verbatim}
  6917. reserviert Speicher in der Menge, wie er von der Struktur belegt wird, und
  6918. definiert gleichzeitig f"ur jedes Element der Struktur ein passendes
  6919. Symbol mit dessen Adresse, in diesem Falle also {\tt THISREC\_IDENT,
  6920. THISREC\_PAD} und {\tt THISREC\_POINTER}.  Das Label darf bei dem Aufruf
  6921. einer Struktur naturgem"a"s nicht fehlen; wenn doch, gibt's eine
  6922. Fehlermeldung.
  6923.  
  6924. "Uber zus"atzliche Argumente ist es m"oglich, nicht nur Speicher f"ur eine
  6925. einzelne Struktur, sondern ein ganzes Feld davon zu reservieren.  Die (bis zu
  6926. drei) Dimensionen werden "uber in eckige Klammern gesetzte Argumente definiert:
  6927. \begin{verbatim}
  6928. thisarray Rec [10],[2]
  6929. \end{verbatim}
  6930. In diesem Beispiel wird Platz f"ur $2*10=20$ Strukturen reserviert, und f"ur
  6931. jede Einzelstruktur werden Symbole erzeugt, die die Indizes im Namen enthalten.
  6932.  
  6933. \subsection{geschachtelte Strukturen}
  6934.  
  6935. Es ist ohne weiteres erlaubt, eine bereits definierte Struktur in einer
  6936. anderen Struktur aufzurufen.  Das dabei ablaufende Verfahren ist eine
  6937. Kombination aus den beiden vorigen Punkten: Elemente der Substruktur
  6938. werden definiert, mit dem Namen dieser Instanz vorangestellt, und vor
  6939. diese zusammengesetzten Namen wird wieder der Name der Struktur bzw.
  6940. sp"ater bei einer Benutzung gesetzt.  Das sieht dann z.B. so aus:
  6941. \begin{verbatim}
  6942. TreeRec struct
  6943. left    dd         ?
  6944. right   dd         ?
  6945. data    Rec
  6946. TreeRec endstruct
  6947. \end{verbatim}
  6948.  
  6949. Ebenso ist es erlaubt, eine Struktur direkt in einer anderen
  6950. Struktur zu definieren:
  6951. \begin{verbatim}
  6952. TreeRec struct
  6953. left    dd         ?
  6954. right   dd         ?
  6955. TreeData struct
  6956. name      db         32 dup(?)
  6957. id        dw         ?
  6958. TreeData endstruct
  6959. TreeRec endstruct
  6960. \end{verbatim}
  6961.  
  6962.  
  6963. \subsection{Unions}
  6964.  
  6965. Eine Union ist eine Sonderform einer Struktur, bei der die einzelnen
  6966. Elemente nicht hintereinander, sondern {\em "ubereinander} liegen, d.h.
  6967. alle Elemente liegen an Startadresse 0 innerhalb der Struktur und belegen
  6968. den gleichen Speicherplatz.  Naturgem"a"s tut so eine Definition nicht
  6969. mehr, als einer Reihe von Symbolen den Wert Null zuzuweisen, sie kann aber
  6970. sinnvoll sein, um programmtechnisch die "Uberlappung der Elemente zu
  6971. verdeutlichen und den Code so etwas 'lesbarer' zu gestalten.  Die Gr"o"se
  6972. einer Struktur ist das Maximum der Gr"o"sen aller Elemente.
  6973.  
  6974. \subsection{Namenlose Strukturen}
  6975.  
  6976. Der Name einer Struktur oder Union ist optional, allerdings nur, wenn
  6977. diese Teil einer anderen, nicht namenlosen Struktur ist.  Elemente
  6978. dieser Struktur werden dann Teil der 'n"achsth"oheren' benamten
  6979. Struktur:
  6980. \begin{verbatim}
  6981. TreeRec struct
  6982. left    dd         ?
  6983. right   dd         ?
  6984.        struct
  6985. name      db         32 dup(?)
  6986. id        dw         ?
  6987.        endstruct
  6988. TreeRec endstruct
  6989. \end{verbatim}
  6990. erzeugt also die Symbole {\tt TREEREC\_NAME} und {\tt TREEREC\_ID}.
  6991.  
  6992. Des weiteren wird f"ur namenlose Strukturen oder Unions kein Symbol
  6993. mit deren L"ange angelegt.
  6994.  
  6995. \subsection{Strukturen und Sektionen}
  6996.  
  6997. Im Verlaufe der Definition oder der Nutzung von Strukturen definierte
  6998. Symbole werden genauso behandelt wie normale Symbole, d.h. bei der Nutzung
  6999. innerhalb einer Sektion werden diese Symbole als lokal zu dieser Sektion
  7000. definiert.  Analoges gilt aber auch f"ur die Strukturen selber, d.h. eine
  7001. innerhalb einer Sektion definierte Struktur kann nicht au"erhalb der
  7002. Sektion benutzt werden.
  7003.  
  7004. \subsection{Strukturen und Makros}
  7005.  
  7006. Will man Strukturen "uber Makros instanziieren, so mu"s man die
  7007. \tty{GLOBALSYMBOLS}-Option bei der Definition des Makros
  7008. benutzen, damit die dar"uber erzeugten Symbole auch au"serhalb
  7009. des Makros verwendbar sind.  Eine Reihe von Strukturen kann man
  7010. z.B. so anlegen:
  7011.  
  7012. \begin{verbatim}
  7013.        irp     name,{GLOBALSYMBOLS},rec1,rec2,rec3
  7014. name    Rec
  7015.        endm
  7016. \end{verbatim}
  7017.  
  7018. %%---------------------------------------------------------------------------
  7019.  
  7020. \section{bedingte Assemblierung}
  7021.  
  7022. {\em G"ultigkeit: alle Prozessoren}
  7023.  
  7024. Der Assembler unterst"utzt die bedingte Assemblierung mit Hilfe der
  7025. Konstrukte \tty{IF}... sowie \tty{SWITCH}... .  Diese Befehle wirken zur
  7026. Assemblierzeit, indem entsprechend der Bedingung Teile "ubersetzt oder
  7027. "ubersprungen werden.  Diese Befehle sind also \ii{nicht} mit den
  7028. IF-Statements h"oherer Programmiersprachen zu vergleichen (obwohl es
  7029. sehr verlockend w"are, den Assembler um die Strukturierungsbefehle
  7030. h"oherer Sprachen zu erweitern...).
  7031. \par
  7032. Die folgenden Konstrukte d"urfen beliebig (bis zum Speicher"uberlauf)
  7033. geschachtelt werden.
  7034.  
  7035. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7036.  
  7037. \subsection{IF / ELSEIF / ENDIF}
  7038. \ttindex{IF}
  7039. \ttindex{ELSEIF}\ttindex{ELSE}
  7040. \ttindex{ENDIF}
  7041.  
  7042. \tty{IF} ist das gebr"auchlichere und allgemeiner verwendbare Konstrukt.
  7043. Die allgemeine Form eines \tty{IF}-Befehles lautet folgenderma"sen:
  7044. \begin{verbatim}
  7045.       IF       <Ausdruck 1>
  7046.        <Block 1>
  7047.       ELSEIF   <Ausdruck 2>
  7048.        <Block 2>
  7049.       (evtl. weitere ELSEIFs)
  7050.       ELSEIF
  7051.        <Block n>
  7052.       ENDIF
  7053. \end{verbatim}
  7054. \tty{IF} dient als Einleitung und wertet den ersten Ausdruck aus und assembliert
  7055. Block 1, falls der Ausdruck wahr (d.h. ungleich 0) ist.  Alle weiteren
  7056. \tty{ELSEIF}-Teile werden dann ignoriert.  Falls der Ausdruck aber nicht wahr
  7057. ist, wird Block 1 "ubersprungen und Ausdruck 2 ausgewertet.  Sollte dieser
  7058. nun wahr sein, wird Block 2 assembliert.  Die Zahl der \tty{ELSEIF}-Teile ist
  7059. variabel und ergibt eine \tty{IF-THEN-ELSE}-Leiter beliebiger L"ange.  Der dem
  7060. letzten \tty{ELSEIF} (ohne Parameter) zugeordnete Block wird nur assembliert,
  7061. falls alle vorigen Ausdr"ucke falsch ergaben und bildet sozusagen einen
  7062. ,,Default-Zweig''.  Wichtig ist, da"s von den Bl"ocken immer nur \ii{einer}
  7063. assembliert wird, und zwar der erste, dessen zugeordnetes \tty{IF/ELSEIF} einen
  7064. wahren Ausdruck hatte.
  7065. \par
  7066. Die \tty{ELSEIF}-Teile sind optional, d.h. auf \tty{IF} darf auch direkt \tty{ENDIF}
  7067. folgen, ein parameterloses \tty{ELSEIF} bildet aber immer den letzten Zweig.
  7068. Ein \tty{ELSEIF} bezieht sich immer auf das letzte, noch nicht abgeschlossene \tty{IF}.
  7069. \par
  7070. Neben \tty{IF} sind noch folgende weitere bedingte Befehle definiert:
  7071. \ttindex{IFDEF}\ttindex{IFNDEF}
  7072. \ttindex{IFUSED}\ttindex{IFNUSED}
  7073. \ttindex{IFEXIST}\ttindex{IFNEXIST}
  7074. \ttindex{IFB}\ttindex{IFNB}
  7075. \begin{itemize}
  7076. \item{\tty{IFDEF} $<$Symbol$>$ : wahr, falls das Symbol definiert wurde.
  7077.      Die Definition mu"s vor \tty{IFDEF} erfolgt sein.}
  7078. \item{\tty{IFNDEF} $<$Symbol$>$ : Umkehrung zu \tty{IFDEF}}
  7079. \item{\tty{IFUSED} $<$Symbol$>$ : wahr, falls das Symbol bisher mindestens einmal
  7080.      benutzt wurde.}
  7081. \item{\tty{IFNUSED} $<$Symbol$>$ : Umkehrung zu \tty{IFUSED}}
  7082. \item{\tty{IFEXIST} $<$Name:  $>$ : wahr, falls die angegebene Datei existiert.
  7083.      F"ur Schreibweise und Suchpfade gelten gleiche Regeln wie beim
  7084.      \tty{INCLUDE}-Befehl (siehe Abschnitt \ref{SectInclude}).}
  7085. \item{\tty{IFNEXIST} $<$Name:  $>$ : Umkehrung zu \tty{IFEXIST}}
  7086. \item{\tty{IFB} $<$Arg-Liste$>$ : wahr, falls alle Argumente der Parameterliste leer
  7087.                                  sind.}
  7088. \item{\tty{IFNB} $<$Arg-Liste$>$ : Umkehrung zu IFB.}
  7089. \end{itemize}
  7090.  
  7091. Anstelle von {\tt ELSEIF} darf auch {\tt ELSE} geschrieben werden, weil
  7092. das wohl alle so gewohnt sind....
  7093.  
  7094. Zu jeder {\tt IF...}-Anweisung geh"ort ein entsprechendes {\tt ENDIF},
  7095. 'offene' Konstrukte f"uhren zu einer Fehlermeldung am Ende des
  7096. Assemblierungslaufes.  Die Zuordnung, welches {\tt ENDIF} \asname{} mit welchem
  7097. {\tt IF...} 'gepaart' hat, l"a"st sich im Listing erkennen: dort wird die
  7098. Zeilennummer des entsprechenden {\tt IF}s angezeigt.
  7099.  
  7100. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7101.  
  7102. \subsection{SWITCH / CASE / ELSECASE / ENDCASE}
  7103. \ttindex{SWITCH}\ttindex{.SWITCH}\ttindex{SELECT}
  7104. \ttindex{CASE}\ttindex{ELSECASE}\ttindex{ENDCASE}
  7105.  
  7106. \tty{SWITCH} ist ein Spezialfall von \tty{IF} und f"ur den Fall gedacht, da"s ein
  7107. Ausdruck mit einer Reihe von Werten verglichen werden soll.  Dies ist
  7108. nat"urlich auch mit \tty{IF} und einer Reihe von \tty{ELSEIF}s machbar, die folgende
  7109. Form
  7110. \begin{verbatim}
  7111.       SWITCH   <Ausdruck>
  7112.       ...
  7113.       CASE     <Wert 1>
  7114.       ...
  7115.       <Block 1>
  7116.       ...
  7117.       CASE <Wert 2>
  7118.       ...
  7119.       <Block 2>
  7120.       ...
  7121.       (weitere CASE-Konstrukte)
  7122.       ...
  7123.       CASE <Wert n-1>
  7124.       ...
  7125.       <Block n-1>
  7126.       ...
  7127.       ELSECASE
  7128.       ...
  7129.       <Block n>
  7130.       ...
  7131.       ENDCASE
  7132. \end{verbatim}
  7133. bietet aber den Vorteil, da"s der zu pr"ufende Ausdruck nur einmal hingeschrieben
  7134. und berechnet werden mu"s, er ist also weniger fehleranf"allig und etwas
  7135. schneller als eine \tty{IF}-Kette, daf"ur nat"urlich auch nicht so flexibel.
  7136. \par
  7137. Es ist m"oglich, bei den \tty{CASE}-Anweisungen mehrere, durch Kommata getrennte
  7138. Werte anzugeben, um den entsprechenden Block in mehreren F"allen assemblieren
  7139. zu lassen.  Der \tty{ELSECASE}-Zweig dient wiederum als ,,Auffangstelle'' f"ur den
  7140. Fall, da"s keine der \tty{CASE}-Bedingungen greift.  Fehlt er und fallen alle
  7141. Pr"ufungen negativ aus, so gibt \asname{} eine Warnung aus.
  7142. \par
  7143. Auch wenn die Wertelisten der \tty{CASE}-Teile sich "uberlappen, so wird immer
  7144. nur \ii{ein} Zweig ausgef"uhrt, und zwar bei Mehrdeutigkeiten der erste.
  7145. \par
  7146. \tty{SWITCH} dient nur der Einleitung des ganzen Konstruktes; zwischen ihm und
  7147. dem ersten \tty{CASE} darf beliebiger Code stehen (andere \tty{IF}s d"urfen aber nicht
  7148. offen bleiben!), im Sinne eines durchschaubaren Codes sollte davon aber
  7149. kein Gebrauch gemacht werden.
  7150. \par
  7151. Ist \tty{SWITCH} auf dem gew"ahlten Target ein Maschinenbefehl,
  7152. so leitet man das Konstrukt stattdessen mit \tty{SELECT} ein, oder spricht
  7153. den Pseudobefehl explizit durch einen vorangestellten Punk an (\tty{.SWITCH}
  7154. anstelle von \tty{SWITCH}).
  7155. \par
  7156. "Ahnlich wie bei {\tt IF...}-Konstrukten, mu"s es f"ur jedes {\tt SWITCH}
  7157. genau ein {\tt ENDCASE} geben.  Analog zu {\tt ENDIF} wird bei {\tt ENDCASE}
  7158. im Listing die Zeilennummer des korrespondierenden {\tt SWITCH} angezeigt.
  7159.  
  7160. %%---------------------------------------------------------------------------
  7161.  
  7162. \section{Listing-Steuerung}
  7163.  
  7164. {\em G"ultigkeit: alle Prozessoren}
  7165.  
  7166. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7167.  
  7168. \subsection{PAGE, PAGESIZE}
  7169. \label{SectPAGE}
  7170. \ttindex{PAGE}\ttindex{.PAGE}\ttindex{PAGESIZE}
  7171.  
  7172. Mit \tty{PAGE} kann man \asname{} die Dimensionen des Papiers, auf dem das
  7173. Listing ausgedruckt werden soll, mitteilen.  Als erster Parameter
  7174. wird dabei die Anzahl von Zeilen angegeben, nach der \asname{} automatisch
  7175. einen Zeilenvorschub ausgeben soll.  Zu ber"ucksichtigen ist allerdings,
  7176. da"s bei dieser Angabe die Kopfzeilen inklusive einer evtl. mit \tty{TITLE}
  7177. spezifizierten Zeile nicht mitgerechnet werden.  Der Minimalwert f"ur
  7178. die Zeilenzahl ist 5, der Maximalwert 255.  Eine Angabe von 0 f"uhrt dazu,
  7179. da"s \asname{} "uberhaupt keine automatischen Seitenvorsch"ube ausf"uhrt, sondern
  7180. nur noch solche, die explizit durch \tty{NEWPAGE}-Befehle oder implizit am
  7181. Ende des Listings (z.B. vor der Symboltabelle) von \asname{} ausgel"ost
  7182. wurden.
  7183. \par
  7184. Die Angabe der Breite des Listings in Zeichen kann als optionaler
  7185. zweiter Parameter erfolgen und erf"ullt zwei Zwecke: Zum einen l"auft
  7186. der Zeilenz"ahler von \asname{} korrekt weiter, wenn eine Quell-Zeile "uber mehrere
  7187. Listing-Zeilen geht, zum anderen gibt es Drucker (wie z.B. Laserdrucker),
  7188. die beim "Uberschreiten des rechten Randes nicht automatisch in eine neue
  7189. Zeile umbrechen, sondern den Rest einfach ,,verschlucken''.  Aus diesem
  7190. Grund f"uhrt \asname{} auch den Zeilenumbruch selbstst"andig durch, d.h. zu lange
  7191. Zeilen werden in Bruchst"ucke zerlegt, die eine L"ange kleiner oder
  7192. gleich der eingestellten L"ange haben.  In Zusammenhang mit Druckern, die
  7193. einen automatischen Zeilenumbruch besitzen, kann das aber zu doppelten
  7194. Zeilenvorsch"uben f"uhren, wenn man als Breite exakt die Zeilenbreite des
  7195. Druckers angibt.  Die L"osung in einem solchen Fall ist, als Zeilenbreite
  7196. ein Zeichen weniger anzugeben.  Die eingestellte Zeilenbreite darf zwischen
  7197. 5 und 255 Zeichen liegen; analog zur Seitenl"ange bedeutet ein Wert von 0,
  7198. da"s \asname{} keine Splittung der Listing-Zeilen vornehmen soll; eine
  7199. Ber"ucksichtigung von zu langen Zeilen im Listing beim Seitenumbruch kann
  7200. dann nat"urlich auch nicht mehr erfolgen.
  7201. \par
  7202. Die Defaulteinstellung f"ur die Seitenl"ange ist 60 Zeilen, f"ur die
  7203. Zeilenbreite 0; letztere Wert wird auch angenommen, wenn \tty{PAGE} nur mit
  7204. einem Argument aufgerufen wird.
  7205. \par
  7206. Falls \tty{PAGE} auf dem gew"ahlten Target bereits ein Maschinenbefehl ist,
  7207. benutzt man stattdessen \tty{PAGESIZE}.  Alternativ ist es immer m"oglich,
  7208. durch Voranstellen eines Punktes (\tty{.PAGE} anstelle \tty{PAGE}) explizit
  7209. den Pseudobefehl anzusprechen.
  7210. \par
  7211. \bb{ACHTUNG!} \asname{} hat keine M"oglichkeit, zu "uberpr"ufen, ob die
  7212. eingestellte Listing-L"ange und Breite mit der Wirklichkeit "ubereinstimmen!
  7213.  
  7214. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7215.  
  7216. \subsection{NEWPAGE}
  7217. \ttindex{NEWPAGE}
  7218.  
  7219. \tty{NEWPAGE} kann dazu benutzt werden, einen Seitenvorschub zu erzwingen,
  7220. obwohl die Seite noch gar nicht voll ist.  Dies kann z.B. sinnvoll
  7221. sein, um logisch voneinander getrennte Teile im Assemblerprogramm
  7222. auch seitenm"a"sig zu trennen.  Der programminterne Zeilenz"ahler wird
  7223. zur"uck gesetzt, der Seitenz"ahler um Eins heraufgez"ahlt.  Der optionale
  7224. Parameter steht in Zusammenhang mit einer hierarchischen Seitennumerierung,
  7225. die \asname{} bis zu einer Kapiteltiefe von 4 unterst"utzt.  0 bedeutet dabei
  7226. immer die tiefste Kapitelebene, der Maximalwert kann sich w"ahrend des
  7227. Laufes ver"andern, wenn das auch verwirrend wirken kann, wie folgendes
  7228. Beispiel zeigt:
  7229. \begin{quote}\begin{tabbing}
  7230. \hspace{2.5cm} \= \hspace{4.5cm} \= \kill
  7231. Seite 1,   \> Angabe \tty{NEWPAGE 0} \> $\rightarrow$ Seite 2 \\
  7232. Seite 2,   \> Angabe \tty{NEWPAGE 1} \> $\rightarrow$ Seite 2.1 \\
  7233. Seite 2.1, \> Angabe \tty{NEWPAGE 1} \> $\rightarrow$ Seite 3.1 \\
  7234. Seite 3.1, \> Angabe \tty{NEWPAGE 0} \> $\rightarrow$ Seite 3.2 \\
  7235. Seite 3.2, \> Angabe \tty{NEWPAGE 2} \> $\rightarrow$ Seite 4.1.1 \\
  7236. \end{tabbing}\end{quote}
  7237. Je nach momentan vorhandener Kapiteltiefe kann \tty{NEWPAGE $<$Nummer$>$}
  7238. also an verschiedenen Stellen eine Erh"ohung bedeuten.  Ein automatischer
  7239. Seitenvorschub wegen Zeilen"uberlauf oder ein fehlender Parameter ist
  7240. gleichbedeutend mit \tty{NEWPAGE 0}.  Am Ende des Listings wird vor Ausgabe
  7241. der Symboltabelle ein implizites \tty{NEWPAGE $<$bish. Maximum$>$} durchgef"uhrt,
  7242. um sozusagen ein neues Hauptkapitel zu beginnen.
  7243.  
  7244. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7245.  
  7246. \subsection{MACEXP\_DFT und MACEXP\_OVR}
  7247. \ttindex{MACEXP}
  7248. \ttindex{MACEXP\_DFT}
  7249. \ttindex{MACEXP\_OVR}
  7250. \label{MACEXPDFT}
  7251. \label{MACEXPOVR}
  7252.  
  7253. Ist ein Makro einmal ausgestestet und 'fertig', m"ochte man es bei
  7254. Benutzung vielleicht gar nicht mehr im Listing sehen.  Wie im
  7255. Abschnitt "uber Makros (\ref{SectMacros}) erl"autert, kann man bei der
  7256. Definition eines Makros "uber Zusatzargumente steuern, ob und wenn ja
  7257. welche Teile des Makro-Rumpfes im Listing expandiert werden.  F"ur den
  7258. Fall, da"s eine ganze Reihe von Makros in Folge definiert werden,
  7259. mu"s man dies jedoch nicht f"ur jedes Makro einzeln festlegen.  Der
  7260. Befehl \tty{MACEXP\_DFT} setzt f"ur alle im folgenden definerten Makros,
  7261. welche Teile ihres Rumpfes expandiert werden sollen:
  7262. \begin{itemize}
  7263. \item{\tty{ON} bzw. \tty{OFF} schalten die Expansion komplett
  7264.      ein bzw. aus.}
  7265. \item{Mit den Argumenten \tty{IF} bzw. \tty{NOIF} werden Befehle
  7266.      im Rumpf zur bedingten Assemblierung und derentwegen nicht
  7267.      assemblierte Code-Teile aus- bzw. eingeblendet.}
  7268. \item{Makro-Definitionen (dazu z"ahlen auch \tty{REPT},
  7269.      \tty{WHILE} und \tty{IRP(C)}) k"onnen "uber die Argumente
  7270.      \tty{MACRO} bzw. \tty{NOMACRO} ein- und
  7271.      ausgeblendet werden.}
  7272. \item{Mit den Argumenten \tty{REST} bzw. \tty{NOREST} k"onnen die
  7273.      Zeilen ein- und ausgeblendet werden, die nicht in die ersten
  7274.      beiden Klassen fallen.}
  7275. \end{itemize}
  7276. Default ist \tty{ON}, d.h. im folgenden definierte Makros werden
  7277. komplett expandiert, au"ser nat"urlich bei den einzelnen Makros wurde
  7278. dies durch Direktiven "ubersteuert.  Weiterhin wirken angegebene Schalte
  7279. relativ zur aktuellen Einstellung: ist z.B. initial alles eingeschaltet,
  7280. sorgt ein
  7281. \begin{quote}{\tt
  7282.        MACEXP\_DFT  noif,nomacro
  7283. }\end{quote}
  7284. daf"ur, da"s nur noch das gelistet wird, was weder eine Makrodefinition
  7285. ist noch per bedingter Assemblierung ausgeschlossen wurde.
  7286. \par
  7287. Mit diesem Befehl und den pro Makro setzbaren Direktiven l"a"st sich
  7288. f"ur jedes einzelne Makro genau festlegen, welche Teile bei einer
  7289. Expansion im Listing erscheinen sollen und welche nicht.  Es kann
  7290. jedoch in der Praxis auch vorkommen, da"s man ein bestimmtes Makro an
  7291. einzelnen Stellen im Quellcode expandiert haben m"ochte, an anderen
  7292. jedoch nicht.  Dies ist mit dem Befehl \tty{MACEXP\_OVR} m"oglich: er
  7293. akzeptiert die gleichen Argumente, diese wirken jedoch als Overrides
  7294. f"ur alle im folgenden {\em expandierten} Makros, im Gegensatz zu
  7295. \tty{MACEXP\_DFT}, das auf alle im folgenden {\em definierten} Makros
  7296. wirkt.  Ist zum Beispiel f"ur ein Makro festgelegt worden, da"s weder
  7297. Makrodefinitionen noch per bedingte Assemblierung ausgeschlossene
  7298. Teile gelistet werden sollen, so schaltet ein
  7299. \begin{quote}{\tt
  7300.         MACEXP\_OVR  MACRO
  7301. }\end{quote}
  7302. f"ur folgende Expansionen das Listen von Makrodefinitionen wieder ein,
  7303. w"ahrend ein
  7304. \begin{quote}{\tt
  7305.         MACEXP\_OVR ON
  7306. }\end{quote}
  7307. wieder alles ins Listing expandiert.  \tty{MACEXP\_OVR} ohne
  7308. Argumente schaltet wiederum s"amtliche Overrides aus, Makros
  7309. verhalten sich bei der Expansion wieder so, wie zum Zeitpunkt ihrer
  7310. Definition festgelegt.
  7311. \par
  7312. Beide Befehle wirken ebenfalls auf andere Makro-artige Konstrukte
  7313. (\tty{REPT, IRP, IRPC WHILE}), da diese aber einmalig ,,in-place''
  7314. expandiert werden, verschwimmt der funktionale Unterschied zwischen
  7315. den beiden Befehlen - im Zweifelsfalle hat aber der per
  7316. \tty{MACEXP\_OVR} gesetzte Override eine h"ohere Priorit"at.
  7317.  
  7318. Die momentane mit \tty{MACEXP\_DFT} gesetzte Einstellung l"a"st sich
  7319. aus dem Symbol \tty{MACEXP} auslesen.  Anstelle von \tty{MACEXP\_DFT}
  7320. darf auch einfach \tty{MACEXP} geschrieben werden, davon sollte aber
  7321. in neuen Programmen kein Gebrauch mehr gemacht werden.
  7322.  
  7323. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7324.  
  7325. \subsection{LISTING}
  7326. \ttindex{LISTING}
  7327.  
  7328. Mit diesem Befehl kann das Listing komplett ein- und ausgeschaltet
  7329. werden. Nach einem
  7330. \begin{verbatim}
  7331.        LISTING off
  7332. \end{verbatim}
  7333. wird \ii{"uberhaupt} nichts mehr im Listing ausgegeben.  Diese Anweisung
  7334. macht Sinn f"ur erprobte Codeteile oder Include-Dateien, um den
  7335. Papierverbrauch nicht ins Unerme"sliche zu steigern.  \bb{ACHTUNG!}
  7336. Wer sp"ater das Gegenst"uck vergi"st, bekommt auch keine Symboltabelle
  7337. mehr zu sehen!  Zus"atzlich zu \tty{ON} und \tty{OFF} akzeptiert
  7338. \tty{LISTING} auch \tty{NOSKIPPED} und \tty{PURECODE} als Argument.  Mit
  7339. der \tty{NOSKIPPED}-Einstellung werden aufgrund bedingter Assemblierung
  7340. nicht assemblierte Teile nicht im Listing aufgef"uhrt, w"ahrend
  7341. \tty{PURECODE} - wie der Name schon erahnen l"a"st - auch die
  7342. \tty{IF}-Konstrukte selber nicht mehr im Listing auff"uhrt.  Diese
  7343. Einstellungen sind n"utzlich, wenn man Makros, die anhand von
  7344. Parametern verschiedene Aktionen ausf"uhren, benutzt, und im Listing
  7345. nur noch die jeweils benutzten Teile sehen m"ochte.
  7346. \par
  7347. Die momentane Einstellung l"a"st sich aus dem Symbol \tty{LISTING}
  7348. (0=\tty{OFF}, 1=\tty{ON}, 2=\tty{NOSKIPPED}, 3=\tty{PURECODE}) auslesen.
  7349.  
  7350. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7351.  
  7352. \subsection{PRTINIT und PRTEXIT}
  7353. \ttindex{PRTINIT}\ttindex{PRTEXIT}
  7354.  
  7355. Bei der Listingausgabe auf Druckern ist es oftmals sinnvoll, den
  7356. Drucker in eine andere Betriebsart (z.B. Schmalschrift) umzuschalten
  7357. und am Ende des Listings diese Betriebsart wieder zu deaktivieren. Mit
  7358. diesen Befehlen kann die Ausgabe dieser Steuerfolgen automatisiert
  7359. werden, indem man mit
  7360. \begin{verbatim}
  7361.        PRTINIT <String>
  7362. \end{verbatim}
  7363. die Zeichenfolge angibt, die vor Listingbeginn an das Ausgabeger"at
  7364. geschickt werden soll und mit
  7365. \begin{verbatim}
  7366.        PRTEXIT <String>
  7367. \end{verbatim}
  7368. analog den Deinitialisierungsstring.  In beiden F"allen mu"s
  7369. \tty{$<$String$>$} ein Stringausdruck sein.  Die Syntaxregeln f"ur
  7370. Stringkonstanten erm"oglichen es, ohne Verrenkungen Steuerzeichen in den
  7371. String einzubauen.
  7372. \par
  7373. Bei der Ausgabe dieser Strings unterscheidet der Assembler \bb{nicht},
  7374. wohin das Listing geschickt wird, d.h. Druckersteuerzeichen werden
  7375. r"ucksichtslos auch auf den Bildschirm geschickt!
  7376. \par
  7377. Beispiel :
  7378. \par
  7379. Bei Epson-Druckern ist es sinnvoll, f"ur die breiten Listings
  7380. in den Kompre"sdruck zu schalten.  Die beiden Zeilen
  7381. \begin{verbatim}
  7382.        PRTINIT "\15"
  7383.        PRTEXIT "\18"
  7384. \end{verbatim}
  7385. sorgen daf"ur, da"s der Kompre"sdruck ein- und nach dem Druck wieder
  7386. ausgeschaltet wird.
  7387.  
  7388. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7389.  
  7390. \subsection{TITLE}
  7391. \ttindex{TITLE}
  7392.  
  7393. Normalerweise versieht der Assembler bereits jede Listingseite mit
  7394. einer Titelzeile, die Quelldatei, Datum und Uhrzeit enth"alt.  Mit
  7395. diesem Befehl kann man den Seitenkopf um eine beliebige zus"atzliche
  7396. Zeile erweitern.  Der anzugebende String ist dabei ein beliebiger
  7397. Stringausdruck.
  7398. \par
  7399. Beispiel:
  7400. \par
  7401. Bei dem bereits oben angesprochenenen Epson-Drucker soll eine Titelzeile
  7402. im Breitdruck ausgegeben werden, wozu vorher der Kompre"smodus
  7403. abgeschaltet werden mu"s:
  7404. \begin{verbatim}
  7405.        TITLE   "\18\14Breiter Titel\15"
  7406. \end{verbatim}
  7407. (Epson-Drucker schalten den Breitdruck automatisch am Zeilenende aus.)
  7408.  
  7409. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7410.  
  7411. \subsection{RADIX}
  7412. \ttindex{RADIX}
  7413. \ttindex{DECIMAL}
  7414. \ttindex{OCTAL}
  7415.  
  7416. \tty{RADIX} mit einem numerischen Argument zwischen 2 und 36 legt das
  7417. Default-Zahlensystem f"ur Integer-Konstanten fest, d.h. das Zahlensystem,
  7418. das angenommen wird, wenn man nichts ausdr"ucklich anderes angegeben hat.
  7419. Defaultm"a"sig ist dies 10, und bei der Ver"anderung dieses Wertes sind
  7420. einige Fallstricke zu beachten, die in Abschnitt \ref{SectIntConsts}
  7421. beschrieben sind.
  7422.  
  7423. Unabh"angig von der momentanen Einstellung ist das Argument von {\tt
  7424. RADIX} {\em immer dezimal}; weiterhin d"urfen keine symbolischen oder
  7425. Formelausdr"ucke verwendet werden, sondern nur einfache Zahlenkonstanten!
  7426.  
  7427. Auf dem IM61x0 stehen die Anweisungen \tty{DECIMAL} und \tty{OCTAL} zur
  7428. Verf"ugung, dies sind Kurzschreibweisen f"ur \tty{RADIX 10} beziehungsweise
  7429. \tty{RADIX 8}.
  7430.  
  7431. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7432.  
  7433. \subsection{OUTRADIX}
  7434. \ttindex{OUTRADIX}
  7435.  
  7436. \tty{OUTRADIX} is gewisserma"sen das Gegenst"uck zu \tty{RADIX}: Mit ihm
  7437. kann man festlegen, in welchem Zahlensystem berechnete Integer-Ausdr"ucke
  7438. in Strings eingesetzt werden sollen, wenn man \verb!\{...}!-Konstrukte in
  7439. Stringkonstanten verwendet (siehe Abschnitt \ref{SectStringConsts}).  Als
  7440. Argument sind wieder Werte zwischen 2 und 36 erlaubt; der Default ist 16.
  7441.  
  7442. %%---------------------------------------------------------------------------
  7443.  
  7444. \section{lokale Symbole}
  7445. \label{ChapLocSyms}
  7446.  
  7447. {\em G"ultigkeit: alle Prozessoren}
  7448.  
  7449. Bei den lokalen Labels und den dazu eingef"uhrten Sektionen handelt es
  7450. sich um eine grundlegend neue Funktion, die mit Version 1.39 eingef"uhrt
  7451. wird.  Da dieser Teil sozusagen ,,1.0'' ist, ist er sicherlich noch nicht
  7452. der Weisheit letzter Schlu"s.  Anregungen und (konstruktive) Kritik sind
  7453. daher besonders erw"unscht.  Insbesondere habe ich die Verwendung von
  7454. Sektionen hier so dargestellt, wie ich sie mir vorstelle.  Es kann dadurch
  7455. passiert sein, da"s die Realit"at nicht ganz meinem Modell im Kopf entspricht.
  7456. F"ur den Fall von Diskrepanzen verspreche ich, da"s die Realit"at der
  7457. Dokumentation angepa"st wird, und nicht umgekehrt, wie es bei gr"o"seren
  7458. Firmen schon einmal vorgekommen sein soll...
  7459. \par
  7460. \asname{} erzeugt keinen linkf"ahigen Code (und wird es wohl auch nicht in n"aherer
  7461. Zukunft tun \tty{:-(} ).  Diese Tatsache zwingt dazu, ein Programm immer im ganzen
  7462. zu "ubersetzen.  Dieser Technik gegen"uber h"atte eine Aufteilung in
  7463. Linker-Module einige Vorteile:
  7464. \begin{itemize}
  7465. \item{k"urzere "Ubersetzungszeiten, da lediglich die ge"anderten Module
  7466.      neu "ubersetzt werden m"ussen;}
  7467. \item{die M"oglichkeit, durch Definition "offentlicher und privater
  7468.      Symbole definierte Schnittstellen zwischen den Modulen festzulegen;}
  7469. \item{Durch die geringere L"ange der einzelnen Module reduziert sich die
  7470.      Anzahl der Symbole im einzelnen Modul, so da"s k"urzere und trotzdem
  7471.      eindeutige Symbolnamen benutzt werden k"onnen.}
  7472. \end{itemize}
  7473. Insbesondere der letzte Punkt hat mich pers"onlich immer etwas gest"ort:
  7474. War ein Label-Name einmal am Anfang eines 2000 Zeilen langen Programms
  7475. benutzt, so durfte er nirgendwo wieder verwendet werden --- auch nicht am
  7476. anderen Ende des Quelltextes, wo Routinen mit ganz anderem Kontext standen.
  7477. Ich war dadurch gezwungen, zusammengesetzte Namen der Form
  7478. \begin{verbatim}
  7479. <Unterprogrammname>_<Symbolname>
  7480. \end{verbatim}
  7481. zu verwenden, die dann L"angen zwischen 15 und 25 Zeichen hatten und das
  7482. Programm un"ubersichtlich machten.
  7483. Das im folgenden eingehender beschriebene Sektionen-Konzept sollte zumindest
  7484. den beiden letzten genannten Punkten abhelfen.  Es ist vollst"andig optional:
  7485. Wollen Sie keine Sektionen verwenden, so lassen Sie es einfach bleiben
  7486. und arbeiten weiter wie unter den "alteren \asname{}-Versionen.
  7487.  
  7488. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7489.  
  7490. \subsection{Grunddefinition (SECTION/ENDSECTION)}
  7491.  
  7492. Eine \ii{Sektion} stellt einen durch spezielle Befehle eingerahmten
  7493. Teil des Assembler-Programms dar und hat einen vom Programmierer
  7494. festlegbaren, eindeutigen Namen:
  7495. \begin{verbatim}
  7496.        ...
  7497.        <anderer Code>
  7498.        ...
  7499.        SECTION <Sektionsname>
  7500.        ...
  7501.        <Code in der Sektion>
  7502.        ...
  7503.        ENDSECTION [Sektionsname]
  7504.        ...
  7505.        <anderer Code>
  7506.        ...
  7507. \end{verbatim}
  7508. Der Name f"ur eine Sektion mu"s den Konventionen f"ur einen Symbolnamen
  7509. entsprechen; da \asname{} Sektions-und Symbolnamen in getrennten Tabellen speichert,
  7510. darf ein Name sowohl f"ur ein Symbol als auch eine Sektion verwendet werden.
  7511. Sektionsnamen m"ussen in dem Sinne eindeutig sein, da"s auf einer Ebene
  7512. nicht zwei Sektionen den gleichen Namen haben d"urfen (was es mit den
  7513. ,,Ebenen'' auf sich hat, erl"autere ich im n"achsten Abschnitt).  Das Argument
  7514. zu \tty{ENDSECTION} ist optional, es darf auch weggelassen werden; Falls
  7515. es weggelassen wird, zeigt \asname{} den Namen der Sektion an, der er das
  7516. \tty{ENDSECTION} zugeordnet hat.  Code in einer Sektion wird von \asname{} genauso
  7517. behandelt wie au"serhalb, lediglich mit drei entscheidenden Unterschieden:
  7518. \begin{itemize}
  7519. \item{Innerhalb der Sektion definierte Symbole (z.B. Labels, \tty{EQU}s...) werden
  7520.      mit einer von \asname{} intern vergebenen, der Sektion zugeordneten Nummer
  7521.      versehen.  Diese Symbole sind von Code au"serhalb der Sektion nicht
  7522.      ansprechbar (das l"a"st sich nat"urlich durch Pseudobefehle variieren,
  7523.      aber dazu sp"ater mehr).}
  7524. \item{Durch das zus"atzliche Attribut kann ein Symbolname sowohl au"serhalb
  7525.      der Sektion als auch innerhalb definiert werden, das Attribut erlaubt
  7526.      also, Symbolnamen mehrfach zu benutzen, ohne da"s \asname{} Protest anmeldet.}
  7527. \item{Falls ein Symbol sowohl au"serhalb als auch innerhalb definiert ist,
  7528.      wird innerhalb der Sektion das ,,lokale'' verwendet, d.h. \asname{} sucht
  7529.      in der Symboltabelle zuerst nach einem Symbol des gew"unschten Namens,
  7530.      das auch gleichzeitig der Sektion zugeordnet wurde.  Erst danach wird
  7531.      nach einem globalen Symbol dieses Namens gefahndet.}
  7532. \end{itemize}
  7533. Mit diesem Mechanismus kann man z.B. den Code in Module aufteilen, wie man
  7534. es mit einem Linker getan h"atte.  Eine feinere Aufteilung w"are dagegen,
  7535. alle Routinen in getrennte Sektionen zu verpacken.  Je nach L"ange der
  7536. Routinen k"onnen die nur intern ben"otigten Symbole dann sehr kurze Namen
  7537. haben.
  7538. \par
  7539. Defaultm"a"sig unterscheidet \asname{} Gro"s-und Kleinschreibung in Sektions-
  7540. namen nicht; schaltet man jedoch in den case-sensitiven Modus um, so
  7541. wird die Schreibweise genauso wie bei Symbolnamen ber"ucksichtigt.
  7542. \par
  7543. Die bisher beschriebene Aufteilung w"urde in etwa der Sprache C entsprechen,
  7544. in der alle Funktionen auf gleicher Ebene nebeneinander stehen.  Da mein
  7545. ,,hochsprachliches'' Vorbild aber Pascal ist, bin ich noch einen Schritt
  7546. weiter gegangen:
  7547.  
  7548. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7549.  
  7550. \subsection{Verschachtelung und Sichtbarkeitsregeln}
  7551.  
  7552. Es ist erlaubt, in einer Sektion weitere Sektionen zu definieren, analog
  7553. zu der M"oglichkeit in Pascal, in einer Prozedur/Funktion weitere
  7554. Prozeduren zu definieren.  Dies zeigt folgendes Beispiel:
  7555. \begin{verbatim}
  7556. sym     EQU        0
  7557.  
  7558.        SECTION    ModulA
  7559.         SECTION    ProcA1
  7560. sym       EQU        5
  7561.         ENDSECTION ProcA1
  7562.         SECTION    ProcA2
  7563. sym       EQU        10
  7564.         ENDSECTION ProcA2
  7565.        ENDSECTION ModulA
  7566.  
  7567.        SECTION    ModulB
  7568. sym      EQU        15
  7569.         SECTION    ProcB
  7570.         ENDSECTION ProcB
  7571.        ENDSECTION ModulB
  7572. \end{verbatim}
  7573. Bei der Suche nach einem Symbol sucht \asname{} zuerst ein Symbol, das der aktuellen
  7574. Sektion zugeordnet ist, und geht danach die ganze ,,Liste'' der Vatersektionen
  7575. durch, bis er bei den globalen Symbolen angekommen ist.  Im Beispiel sehen
  7576. die Sektionen die in Tabelle \ref{TabSymErg} angegebenen Werte f"ur das Symbol
  7577. \tty{sym}.
  7578. \begin{table*}[htb]
  7579. \begin{center}\begin{tabular}{|l|l|l|}
  7580. \hline
  7581. Sektion      &    Wert   &   aus Sektion... \\
  7582. \hline
  7583. \hline
  7584. Global       &     0     &    Global        \\
  7585. \hline
  7586. \tty{ModulA} &     0     &    Global        \\
  7587. \hline
  7588. \tty{ProcA1} &     5     &    \tty{ProcA1}  \\
  7589. \hline
  7590. \tty{ProcA2} &    10     &    \tty{ProcA2}  \\
  7591. \hline
  7592. \tty{ModulB} &    15     &    \tty{ModulB}  \\
  7593. \hline
  7594. \tty{ProcB}  &    15     &    \tty{ModulB}  \\
  7595. \hline
  7596. \end{tabular}\end{center}
  7597. \caption{F"ur die einzelnen Sektionen g"ultigen Werte\label{TabSymErg}}
  7598. \end{table*}
  7599. Diese Regel kann man durchbrechen, indem man explizit an den Symbolnamen
  7600. die Sektion anh"angt, aus der man das Symbol holen will, und zwar in
  7601. eckigen Klammern am Ende des Symbolnamens:
  7602. \begin{verbatim}
  7603.        move.l  #sym[ModulB],d0
  7604. \end{verbatim}
  7605. Es d"urfen dabei nur Sektionsnamen verwendet werden, die eine Obersektion
  7606. zur aktuellen Sektion darstellen.  Als Sonderwert sind die Namen
  7607. \tty{PARENT0..PARENT9} erlaubt, mit denen man die n-ten ,,Vatersektionen''
  7608. relativ zur momentanen Sektion ansprechen kann; \tty{PARENT0} entspricht
  7609. also der momentanen Sektion selber, \tty{PARENT1} der direkt "ubergeordneten
  7610. usw.  Anstelle \tty{PARENT1} kann man auch kurz nur \tty{PARENT} schreiben.
  7611. L"a"st man dagegen den Platz zwischen den Klammern komplett frei, also
  7612. etwa so
  7613. \begin{verbatim}
  7614.        move.l  #sym[],d0 ,
  7615. \end{verbatim}
  7616. so erreicht man das globale Symbol.  \bb{ACHTUNG!} Wenn man explizit ein
  7617. Symbol aus einer Sektion anspricht, so wird auch nur noch bei den
  7618. Symbolen dieser Sektion gesucht, der Sektionsbaum wird nicht mehr
  7619. bis nach oben durchgegangen!
  7620. \par
  7621. Analog zu Pascal ist es erlaubt, da"s verschiedene Sektionen Untersektionen
  7622. gleichen Namens haben d"urfen, das Prinzip der Lokalit"at verhindert hier
  7623. Irritationen.  M.E. sollte man davon aber trotzdem sparsamen Gebrauch machen,
  7624. da in Symbol-und Querverweisliste Symbole zwar mit der Sektion, in der sie
  7625. definiert wurden, gekennzeichnet werden, aber nicht mit der "uber dieser
  7626. Sektion evtl. liegenden ,,Sektionshierarchie'' (das h"atte einfach den Platz
  7627. in der Zeile gesprengt); Unterscheidungen sind dadurch nicht erkennbar.
  7628. \par
  7629. Da ein \tty{SECTION}-Befehl von selber kein Label definiert, besteht hier
  7630. ein wichtiger Unterschied zu Pascal: Eine Pascal-Prozedur kann
  7631. ihre Unterprozeduren/funktionen automatisch ,,sehen'', unter \asname{} mu"s man
  7632. noch einen Einsprungpunkt extra definieren.  Das kann man z.B. mit folgendem
  7633. Makro-P"archen tun:
  7634. \begin{verbatim}
  7635. proc    MACRO   name
  7636.        SECTION name
  7637. name    LABEL   $
  7638.        ENDM
  7639.  
  7640. endp    MACRO   name
  7641.        ENDSECTION name
  7642.        ENDM
  7643. \end{verbatim}
  7644. Diese Beispiel zeigt gleichzeitig, da"s die Lokalit"at von Labels in
  7645. Makros nicht von den Sektionen beeinflu"st wird, deshalb der Trick mit dem
  7646. \tty{LABEL}-Befehl.
  7647. \par
  7648. Nat"urlich ist mit dieser Definition das Problen noch nicht ganz gel"ost,
  7649. bisher ist das Einsprung-Label ja noch lokal und von au"sen nicht zu
  7650. erreichen.  Wer nun meint, man h"atte das Label einfach nur vor der
  7651. SECTION-Anweisung plazieren m"ussen, sei jetzt bitte ruhig, denn er
  7652. verdirbt mir den "Ubergang auf das n"achste Thema:
  7653.  
  7654. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7655.  
  7656. \subsection{PUBLIC und GLOBAL}
  7657.  
  7658. Die \tty{PUBLIC}-Anweisung erlaubt es, die Zugeh"origkeit eines Symbols
  7659. zu einer bestimmten Sektion zu ver"andern.  Es ist m"oglich, mit einem
  7660. \tty{PUBLIC}-Befehl mehrere Symbole zu bearbeiten, ohne Beschr"ankung
  7661. der Allgemeinheit will ich aber ein Beispiel mit nur einer Variable verwenden:
  7662. Im einfachsten Falle erkl"art man ein Symbol als vollst"andig global, d.h.
  7663. es ist von allen Stellen des Programms ansprechbar:
  7664. \begin{verbatim}
  7665.        PUBLIC  <Name>
  7666. \end{verbatim}
  7667. Da ein Symbol bei seiner Definition endg"ultig in der Symboltabelle
  7668. einsortiert wird, mu"s diese Anweisung \bb{vor} der Definition des
  7669. Symbols erfolgen.  Alle \tty{PUBLIC}s werden von \asname{} in einer Liste
  7670. vermerkt und bei ihrer Definition aus dieser Liste wieder entfernt.  Bei
  7671. Beendigung einer Sektion gibt \asname{} Fehlermeldungen f"ur alle nicht
  7672. aufgel"osten ,,Vorw"artsreferenzen'' aus.
  7673. \par
  7674. Angesichts des hierarchischen Sektionenkonzepts erscheint die Methode,
  7675. ein Symbol als vollst"andig global zu definieren, reichlich brachial.
  7676. Es geht aber auch etwas differenzierter, indem man zus"atzlich einen
  7677. Sektionsnamen angibt:
  7678. \begin{verbatim}
  7679.        PUBLIC  <Name>:<Sektion>
  7680. \end{verbatim}
  7681. Damit wird das Symbol der genannten Sektion zugeordnet und damit auch
  7682. allen ihren Untersektionen zug"anglich (es sei denn, diese definieren
  7683. wiederum ein Symbol gleichen Namens, das dann das ,,globalere''
  7684. "ubersteuert).  Naturgem"a"s protestiert \asname{}, falls mehrere Untersektionen
  7685. ein Symbol gleichen Namens auf die gleiche Ebene exportieren wollen.
  7686. Als Spezialwert f"ur \tty{$<$Sektion$>$} sind die im vorigen Abschnitt
  7687. genannten \tty{PARENTx}-Namen zugelassen, um das Symbol genau n Ebenen hinaufzuexportieren.
  7688. Es sind als Sektionen nur der momentanen Sektion "ubergeordnete Sektionen
  7689. zugelassen, also keine, die im Baum aller Sektionen in einem anderen Zweig
  7690. stehen.  Sollten dabei mehrere Sektionen den gleichen Namen haben (dies ist
  7691. legal), so wird die tiefste gew"ahlt.
  7692. \par
  7693. Mit diesem Werkzeug kann das obige Prozedurmakro nun Sinn ergeben:
  7694. \begin{verbatim}
  7695. proc    MACRO   name
  7696.        SECTION name
  7697.        PUBLIC  name:PARENT
  7698. name    LABEL   $
  7699.        ENDM
  7700. \end{verbatim}
  7701. Diese Einstellung entspricht dem Modell von Pascal, in der eine
  7702. Unterprozedur auch nur von ihrem ,,Vater'' gesehen werden kann, jedoch
  7703. nicht vom ,,Gro"svater''.
  7704. \par
  7705. Falls mehrere Untersektionen versuchen, ein Symbol gleichen Namens
  7706. in die gleiche Obersektion zu exportieren, meckert \asname{} "uber doppelt
  7707. definierte Symbole, was an sich ja korrekt ist.  War das gewollt,
  7708. so mu"s man die Symbole in irgendeiner Weise ,,qualifizieren'', damit
  7709. sie voneinander unterschieden werden k"onnen.  Dies ist mit der
  7710. \tty{GLOBAL}-Anweisung m"oglich.  Die Syntax von \tty{GLOBAL} ist
  7711. der von \tty{PUBLIC} identisch, das Symbol bleibt aber lokal, anstatt
  7712. einer h"oheren Sektion zugeordnet zu werden.  Stattdessen wird ein
  7713. weiteres Symbol gleichen Werts erzeugt, dem jedoch der Untersektionsname
  7714. mit einem Unterstrich vorangestellt wird, und nur dieses Symbol wird der
  7715. Sektionsangabe entsprechend "offentlich gemacht.  Definieren z.B. zwei
  7716. Sektionen \tty{A} und \tty{B} ein Symbol \tty{SYM} und exportieren
  7717. es mit  \tty{GLOBAL} zu ihrer Vatersektion, so werden dort die Symbole
  7718. unter den Namen \tty{A\_SYM} und \tty{B\_SYM} eingeordnet.
  7719. \par
  7720. Falls zwischen Quell- und Zielsektion mehrere Stufen stehen sollten,
  7721. so wird entsprechend der komplette Namenszweig von der Ziel- bis zur
  7722. Quellsektion dem Symbolnamen vorangestellt.
  7723.  
  7724. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7725.  
  7726. \subsection{FORWARD}
  7727.  
  7728. So sch"on das bisher besprochene Modell ist, ein bei Pascal nicht
  7729. auftauchendes Detail macht "Arger: die bei Assembler m"oglichen
  7730. Vorw"artsreferenzen.  Bei Vorw"artsreferenzen kann es sein, da"s \asname{}
  7731. im ersten Pass auf ein Symbol einer h"oheren Sektion zugreift.  Dies
  7732. ist an sich nicht weiter tragisch, solange im zweiten Pass das richtige
  7733. Symbol genommen wird, es k"onnen aber Unf"alle der folgenden Art passieren:
  7734. \begin{verbatim}
  7735. loop:   .
  7736.        <Code>
  7737.        ..
  7738.        SECTION sub
  7739.        ..              ; ***
  7740.        bra.s   loop
  7741.        ..
  7742. loop:   ..
  7743.        ENDSECTION
  7744.        ..
  7745.        jmp     loop    ; Hauptschleife
  7746. \end{verbatim}
  7747. \asname{} wird im ersten Pass das globale Label \tty{loop} verwenden, sofern
  7748. das Programmst"uck bei \tty{$<$Code$>$} hinreichend lang ist, wird er
  7749. sich "uber eine zu gro"se Sprungdistanz beklagen und den zweiten Pass erst
  7750. gar nicht versuchen.  Um die Uneindeutigkeit zu vermeiden, kann man den
  7751. Symbolnamen mit einem expliziten Bezug versehen:
  7752. \begin{verbatim}
  7753.        bra.s   loop[sub]
  7754. \end{verbatim}
  7755. Falls ein lokales Symbol h"aufig referenziert wird, k"onnen die vielen
  7756. Klammern mit dem \tty{FORWARD}-Befehl eingespart werden.  Das Symbol
  7757. wird damit explizit als lokal angek"undigt.  \asname{} wird dann bei Zugriffen
  7758. auf dieses Symbol automatisch nur im lokalen Symbolbereich suchen.
  7759. In diesem Falle m"u"ste an der mit \tty{***} gekennzeichneten Stelle
  7760. daf"ur der Befehl
  7761. \begin{verbatim}
  7762.        FORWARD loop
  7763. \end{verbatim}
  7764. stehen.
  7765. Damit \tty{FORWARD} Sinn macht, mu"s es nicht nur vor der Definition des
  7766. Symbols, sondern vor seiner ersten Benutzung in der Sektion gegeben werden.
  7767. Ein Symbol gleichzeitig privat und "offentlich zu definieren, ergibt keinen
  7768. Sinn und wird von \asname{} auch angemahnt.
  7769.  
  7770. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7771.  
  7772. \subsection{Geschwindigkeitsaspekte}
  7773.  
  7774. Die mehrstufige Suche in der Symboltabelle und die Entscheidung, mit welchem
  7775. Attribut ein Symbol eingetragen werden soll, kosten naturgem"a"s etwas
  7776. Rechenzeit.  Ein 1800 Zeilen langes 8086-Programm z.B. wurde nach der
  7777. Umstellung auf Sektionen statt in 33 in 34,5 Sekunden assembliert
  7778. (80386 SX, 16MHz, 3 Durchg"ange).  Der Overhead h"alt sich also in Grenzen:
  7779. Ob man ihn in Kauf nehmen will, ist (wie am Anfang erw"ahnt) eine Frage des
  7780. Geschmacks;  man kann \asname{} genauso gut ohne Sektionen verwenden.
  7781.  
  7782. %%---------------------------------------------------------------------------
  7783.  
  7784. \section{Diverses}
  7785.  
  7786. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7787.  
  7788. \subsection{SHARED}
  7789. \label{ChapShareOrder} \ttindex{SHARED}
  7790.  
  7791. {\em G"ultigkeit: alle Prozessoren}
  7792.  
  7793. Mit diesem Befehl weist man den \asname{} an, die in der Parameterliste
  7794. angegebenen Symbole (egal ob Integer, Gleitkomma oder String) im
  7795. Sharefile mit ihren Werten abzulegen.  Ob eine solche Datei "uberhaupt
  7796. und in welchem Format erzeugt wird, h"angt von den in
  7797. \ref{SectCallConvention} beschriebenen Kommandozeilenschaltern ab.
  7798. Findet \asname{} diesen Befehl und es wird keine Datei erzeugt, f"uhrt das zu
  7799. einer Warnung.
  7800. \par
  7801. \bb{VORSICHT!} Ein eventuell der Befehlszeile anh"angender Kommentar
  7802. wird  in die erste, ausgegebene Zeile mit "ubertragen (sofern die
  7803. Argumentliste von \tty{SHARED} leer ist, wird nur der Kommentar ausgegeben).
  7804. Falls die Share-Datei f"ur C oder Pascal erzeugt wird, sind einen
  7805. C/Pascal-Kommentar schlie"sende Zeichenfolgen (\verb!*/! bzw.
  7806. \verb!*)!) im Kommentar zu vermeiden.  \asname{} pr"uft dies \ii{nicht}!
  7807.  
  7808. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7809.  
  7810. \subsection{INCLUDE}
  7811. \ttindex{INCLUDE}\label{SectInclude}
  7812.  
  7813. {\em G"ultigkeit: alle Prozessoren}
  7814.  
  7815. Dieser Befehl f"ugt die im Parameter angegebene Datei (die optional in
  7816. G"an\-se\-f"u"s\-chen eingeschlossen sein darf) so im Text ein, als ob sie dort
  7817. stehen w"urde.  Dieser Befehl ist sinnvoll, um Quelldateien aufzuspalten,
  7818. die alleine nicht in den Speicher passen w"urden oder um sich ''Toolboxen''
  7819. zu erzeugen.
  7820. \par
  7821. Falls der angegebene Dateiname keine Endung hat, wird er automatisch
  7822. um die Endung \tty{INC} erweitert.
  7823. \par
  7824. Der Assembler versucht als erstes, die angegebene Datei in den Verzeichnis
  7825. zu finden, in dem sich auch die Quelldatei befindet, die das \tty{INCLUDE}-Statement
  7826. enth"alt - ein eventuell in der Dateiangabe enthaltener Pfad ist also relativ
  7827. zu deren Pfad, und nicht zu dem Verzeichnis, von dem aus man den Assembler
  7828. aufgerufen hat.  Mit der Kommandozeilenoption
  7829. \begin{verbatim}
  7830.   -i <Pfadliste>
  7831. \end{verbatim}
  7832. l"a"st sich eine Liste von Verzeichnissen angeben, in denen automatisch
  7833. zus"atzlich nach der Include-Datei gesucht werden soll.  Wird die Datei
  7834. nicht gefunden, so ist dies ein \ii{fataler} Fehler, d.h. der Assembler
  7835. bricht sofort ab.
  7836. \par
  7837. Aus Kompatibilit"atsgr"unden ist es erlaubt, den Namen in G"ansef"u"schen
  7838. zu schreiben,
  7839. \begin{verbatim}
  7840.        INCLUDE stddef51
  7841. \end{verbatim}
  7842. und
  7843. \begin{verbatim}
  7844.        INCLUDE "stddef51.inc"
  7845. \end{verbatim}
  7846. sind also "aquivalent.  \bb{ACHTUNG!} Wegen dieser Wahlfreiheit ist
  7847. hier nur eine Stringkonstante, aber kein Stringausdruck zul"assig!
  7848. \par
  7849. Sollte der Dateiname eine Pfadangabe enthalten, so wird die Suchliste
  7850. ignoriert.
  7851.  
  7852. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7853.  
  7854. \subsection{BINCLUDE}
  7855. \ttindex{BINCLUDE}
  7856.  
  7857. {\em G"ultigkeit: alle Prozessoren}
  7858.  
  7859. \tty{BINCLUDE} dient dazu, in den von \asname{} erzeugten Code Bin"ardaten
  7860. einzubetten, die von einem anderen Programm erzeugt wurden (das kann
  7861. nat"urlich theoretisch auch von \asname{} selber erzeugter Code sein...).
  7862. \tty{BINCLUDE} hat drei Formen:
  7863. \begin{verbatim}
  7864.   BINCLUDE <Datei>
  7865. \end{verbatim}
  7866. In dieser Form wird die Datei komplett eingebunden.
  7867. \begin{verbatim}
  7868.   BINCLUDE <Datei>,<Offset>
  7869. \end{verbatim}
  7870. In dieser Form wird der Inhalt der Datei ab \verb!<Offset>! bis zum Ende
  7871. der Datei eingebunden.
  7872. \begin{verbatim}
  7873.   BINCLUDE <Datei>,<Offset>,<Len>
  7874. \end{verbatim}
  7875. In dieser Form werden \verb!<Len>! Bytes ab Offset \verb!<Offset>! eingebunden.
  7876. \par
  7877. Es gelten die gleichen Regeln bez"uglich Suchpfaden wie bei \tty{INCLUDE}.
  7878.  
  7879. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7880.  
  7881. \subsection{MESSAGE, WARNING, ERROR und FATAL}
  7882. \ttindex{MESSAGE}\ttindex{WARNING}\ttindex{ERROR}\ttindex{FATAL}
  7883.  
  7884. {\em G"ultigkeit: alle Prozessoren}
  7885.  
  7886. Der Assembler pr"uft zwar die Quelltexte so streng wie m"oglich und
  7887. liefert differenzierte Fehlermeldungen, je nach Anwendung kann es
  7888. aber sinnvoll sein, unter bestimmten Bedingungen zus"atzliche
  7889. Fehlermeldungen auszul"osen, mit denen sich logische Fehler automatisch
  7890. pr"ufen lassen.  Der Assembler unterscheidet drei Typen von Fehlermeldungen,
  7891. die "uber die drei Befehle auch dem Programmierer zug"anglich sind:
  7892. \begin{itemize}
  7893. \item{\tty{WARNING}: Fehler, die auf m"oglicherweise falschen oder
  7894.      ineffizienten Code hinweisen.  Die Assemblierung l"auft weiter,
  7895.      eine Codedatei wird erzeugt.}
  7896. \item{\tty{ERROR}: echte Fehler im Programm.  Die Assemblierung l"auft weiter,
  7897.      um m"ogliche weitere Fehler in einem Durchgang entdecken und
  7898.      korrigieren zu k"onnen.  Eine Codedatei wird nicht erzeugt.}
  7899. \item{\tty{FATAL}: schwerwiegende Fehler, die einen sofortigen Abbruch des
  7900.      Assemblers bedingen.  Eine Codedatei kann m"oglicherweise entstehen,
  7901.      ist aber unvollst"andig.}
  7902. \end{itemize}
  7903. Allen drei Befehlen ist das Format gemeinsam, in dem die Fehlermeldung
  7904. angegeben werden mu"s: Ein beliebiger String-Ausdruck, der sowohl eine einfache
  7905. Konstante als auch eine komplizierte Formel sein darf, die zu einem String
  7906. evaluiert.  Dies schlie"st auch die in \ref{SectSymConv} beschriebene
  7907. Funktion ein, um Zahlenwerte mit auszugeben:
  7908. \begin{verbatim}
  7909.       message "Startadresse ist \{start_address}"
  7910. \end{verbatim}
  7911. Diejenigen Anweisungen, die Warnungen oder Fehlermeldungen erzeugen, ergeben
  7912. nur in Zusammenhang mit bedingter Assemblierung Sinn.  Ist f"ur ein Programm
  7913. z.B. nur ein begrenzter Adre"sraum vorhanden, so kann man den "Uberlauf
  7914. folgenderma"sen testen:
  7915. \begin{verbatim}
  7916. ROMSize equ     8000h   ; 27256-EPROM
  7917.  
  7918. ProgStart: ..
  7919.        <das eigentliche Programm>
  7920.           ..
  7921. ProgEnd:
  7922.        if      ProgEnd-ProgStart>ROMSize
  7923.         error   "\aDas Programm ist zu lang!"
  7924.        endif
  7925. \end{verbatim}
  7926. Neben diesen fehlererzeugenden Befehlen gibt es noch den Befehl
  7927. \tty{MESSAGE}, der einfach nur eine Meldung im Listing und auf
  7928. der Konsole erzeugt (letzteres nur, wenn nicht im quiet-Modus
  7929. gearbeitet wird).  Seine Benutzung ist den anderen drei Befehlen
  7930. gleich.
  7931.  
  7932. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7933.  
  7934. \subsection{READ}
  7935. \ttindex{READ}
  7936.  
  7937. {\em G"ultigkeit: alle Prozessoren}
  7938.  
  7939. \tty{READ} ist sozusagen das Gegenst"uck zu der vorigen Befehlsgruppe: mit
  7940. ihm ist es m"oglich, \ii{w"ahrend} der Assemblierung Werte von der
  7941. Tastatur einzulesen.  Wozu das gut sein soll?  Um das darzulegen, soll
  7942. hier ausnahmsweise einmal das Beispiel vor die genauere Erl"auterung
  7943. gezogen werden:
  7944. \par
  7945. Ein Programm ben"otigt zum Datentransfer einen Puffer mit einer zur
  7946. "Ubersetzungszeit festzulegenden Gr"o"se.  Um die Gr"o"se des Puffers
  7947. festzulegen, k"onnte man sie einmal mit \tty{EQU} in einem Symbol
  7948. ablegen, es geht aber auch interaktiv mit \tty{READ} :
  7949. \begin{verbatim}
  7950.        IF      MomPass=1
  7951.         READ    "Puffer (Bytes)",BufferSize
  7952.        ENDIF
  7953. \end{verbatim}
  7954. Auf diese Weise k"onnen Programme sich w"ahrend der "Ubersetzung
  7955. interaktiv konfigurieren, man kann sein Programm z.B. jemandem geben,
  7956. der es mit seinen Parametern "ubersetzen kann, ohne im Quellcode
  7957. ,,herumstochern'' zu m"ussen.  Die im Beispiel gezeigte \tty{IF-}
  7958. Abfrage sollte "ubrigens immer verwendet werden, damit der Anwender
  7959. nur einmal mit der Abfrage bel"astigt wird.
  7960. \par
  7961. \tty{READ} "ahnelt sehr stark dem \tty{SET-} Befehl, nur da"s der
  7962. dem Symbol zuzuweisende Wert nicht rechts vom Schl"usselwort steht,
  7963. sondern von der Tastatur eingelesen wird.  Dies bedeutet z.B. auch,
  7964. da"s \asname{} anhand der Eingabe automatisch festlegt, ob es sich um eine
  7965. Integer- oder Gleitkommazahl oder einen String handelt und anstelle
  7966. einzelner Konstanten auch ganze Formelausdr"ucke eingegeben werden
  7967. k"onnen.
  7968. \par
  7969. \tty{READ} darf entweder nur einen Parameter oder zwei Parameter
  7970. haben, denn die Meldung zur Eingabeaufforderung ist optional.  Fehlt
  7971. sie, so gibt \asname{} eine aus dem Symbolnamen konstruierte Meldung aus.
  7972.  
  7973. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7974.  
  7975. \subsection{INTSYNTAX}
  7976. \label{SectINTSYNTAX}
  7977. \ttindex{INTSYNTAX}
  7978.  
  7979. {\em G"ultigkeit: alle Prozessoren}
  7980.  
  7981. Mit diesem Befehl kann die Menge der Schreibweisen, die f"ur Integer-Konstanten
  7982. in verschiedenen Zahlensystemen zul"assig sind, ver"andert werden.  Nach Auswahl
  7983. eines bestimmten Zieles gilt ein bestimmter Default-Satz (siehe Abschnitt
  7984. \ref{SectPseudoInst}), der um einzelne Schreibweisen erg"anzt oder bereinigt werden
  7985. kann. \tty{INTSYNTAX} akzeptiert eine beliebige Liste von Argumenten, von denen
  7986. jedes mit einem Plus- oder Minuszeichen beginnt, direkt gefolgt von der Kennung
  7987. der jeweiligen Schreibweise.  So stellt man z.B. mit folgendem Befehl
  7988. \begin{verbatim}
  7989.       intsyntax    -0oct,+0hex
  7990. \end{verbatim}
  7991. ein, da"s eine f"uhrende Null keine Oktal-, sondern eine Hexadezimalzahl
  7992. kennzeichnet, was bei manchen Assemblern f"ur den SC/MP gebr"auchlich ist.  Die
  7993. Kennungen f"ur die einzelnen Schreibweisen finden sich in Tabelle \ref{TabSystems}.
  7994. Den Kombinationsm"oglichkeiten sind keine Grenzen gesetzt, au"ser wenn sich zwei
  7995. Schreibweisen direkt widersprechen.  Im obigen Beispiel w"are es z.B. nicht
  7996. erlaubt, gleichzeitig \tty{0oct} und \tty{0hex} einzuschalten.
  7997.  
  7998. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7999.  
  8000. \subsection{RELAXED}
  8001. \label{SectRELAXED}
  8002. \ttindex{RELAXED}
  8003.  
  8004. {\em G"ultigkeit: alle Prozessoren}
  8005.  
  8006. Defaultm"a"sig ist einer Prozessorfamilie eine bestimmte Schreibweise
  8007. von Integer-Konstanten zugeordnet (die i.a. der Herstellervorgabe
  8008. entspricht, solange der nicht eine allzu abgefahrene Syntax benutzt...).
  8009. Nun hat aber jeder seine pers"onlichen Vorlieben f"ur die eine oder
  8010. andere Schreibweise und kann gut damit leben, da"s sich seine Programme
  8011. nicht mehr mit dem Standard-Assembler "ubersetzen lassen. Setzt man ein
  8012. \begin{verbatim}
  8013.        RELAXED ON
  8014. \end{verbatim}
  8015. an den Programmanfang, so kann man fortan alle Schreibweisen beliebig
  8016. gemischt und durcheinander verwenden; bei jedem Ausdruck versucht \asname{}
  8017. automatisch zu ermitteln, welche Schreibweise verwendet wurde.  Da"s
  8018. diese Automatik nicht immer das Ergebnis liefert, das man sich vorgestellt
  8019. hat, ist auch der Grund, weshalb diese Option explizit eingeschaltet
  8020. werden mu"s (und man sich davor h"uten sollte, sie einfach in einem
  8021. existierenden Programm dazuzusetzen): Ist nicht durch vor- oder
  8022. nachgestellte Zeichen zu erkennen, da"s es sich um Intel- oder
  8023. Motorola-Konstanten handelt, wird im C-Modus gearbeitet.  Eventuell
  8024. vorangestellte, eigentlich "uberfl"ussige Nullen haben in diesem Modus
  8025. durchaus eine Bedeutung:
  8026. \begin{verbatim}
  8027.        move.b  #08,d0
  8028. \end{verbatim}
  8029. Diese Konstante w"urde als Oktalkonstante verstanden werden, und weil
  8030. Oktalzahlen nur Ziffern von 0..7 enthalten k"onnen, f"uhrt das zu einem
  8031. Fehler.  Dabei h"atte man in diesem Fall noch Gl"uck gehabt, bei der
  8032. Zahl \tty{077} z.B. h"atte man ohne Meldung Probleme bekommen.  Ohne
  8033. \tty{RELAXED}-Modus w"are in beiden F"allen klar gewesen, da"s es sich
  8034. um dezimale Konstanten handelt.
  8035. \par
  8036. Die momentane Einstellung kann aus dem gleichnamigen Symbol ausgelesen
  8037. werden.
  8038.  
  8039. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8040.  
  8041. \subsection{COMPMODE}
  8042. \label{SectCompMode}
  8043. \ttindex{COMPMODE}
  8044.  
  8045. {\em G"ultigkeit: verschiedene}
  8046.  
  8047. Auch wenn sich \asname{} bem"uht, sich m"oglichst genauso zu verhalten wie die
  8048. jeweiligen ''Original-Assembler'', so gibt es in der Praxis immer wieder
  8049. Details, wo ein hundertprozentiges Nachbilden des jeweiligen Original-
  8050. Verhaltens Optimierungen verhindern w"urde, die aus meiner Sicht valide
  8051. und n"utzlich sind.  Mit einem
  8052. \begin{verbatim}
  8053.        compmode on
  8054. \end{verbatim}
  8055. kann man in eine Betriebsart umschalten, die dem ''Original-Verhalten''
  8056. Vorrang vor optimalem Code gibt.  Ob f"ur das jeweilige Target solche
  8057. F"alle vorliegen, ist im jeweiligen Unterkapitel mit dem prozessorspezifischen
  8058. Hinweisen ausgef"uhrt.
  8059. \par
  8060. Im Default ist dieser Kompatibilit"ats-Modus ausgeschaltet, au"ser er
  8061. wurde durch die gleichnamige Kommandozeilen-Option eingeschaltet. Die
  8062. momentane Einstellung kann aus dem gleichnamigen Symbol ausgelesen
  8063. werden.
  8064.  
  8065. %%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  8066.  
  8067. \subsection{END}
  8068. \ttindex{END}
  8069.  
  8070. {\em G"ultigkeit: alle Prozessoren}
  8071.  
  8072. \tty{END} kennzeichnet das Ende des Assemblerprogrammes.  Danach
  8073. noch in der Quelldatei stehende Zeilen werden ignoriert.
  8074. \bb{WICHTIG:} \tty{END} darf zwar aus einem Makro heraus aufgerufen
  8075. werden, der Stapel der bedingten Assemblierung wird aber nicht
  8076. automatisch abger"aumt.  Das folgende Konstrukt f"uhrt daher zu
  8077. einer Fehlermeldung:
  8078. \begin{verbatim}
  8079.        IF      KeineLustMehr
  8080.         END
  8081.        ENDIF
  8082. \end{verbatim}
  8083. Optional darf \tty{END} auch einen Integer-Ausdruck als Argument haben,
  8084. der den Startpunkt des Programms vermerkt.  Dieser wird von \asname{} in einem
  8085. speziellen Record der Datei vermerkt und kann z.B. von P2HEX
  8086. weiterverarbeitet werden.
  8087. \par
  8088. \tty{END} war eigentlich schon immer in \asname{} definiert, nur war es
  8089. bei fr"uheren Versionen von \asname{} aus Kompatibilit"at zu anderen
  8090. Assemblern vorhanden und hatte keine Wirkung.
  8091.  
  8092. %%===========================================================================
  8093.  
  8094. \cleardoublepage
  8095. \chapter{Prozessorspezifische Hinweise}
  8096.  
  8097. Ich habe mich bem"uht, die einzelnen Codegeneratoren m"oglichst kompatibel
  8098. zu den Originalassemblern zu halten, jedoch nur soweit, wie es keinen
  8099. unvertretbaren Mehraufwand bedeutete.  Wichtige Unterschiede, Details und
  8100. Fallstricke habe ich im folgenden aufgelistet.
  8101.  
  8102. %%---------------------------------------------------------------------------
  8103.  
  8104. \section{6811}
  8105.  
  8106. ,,Wo gibt es denn das zu kaufen, den HC11 in NMOS?'', fragt jetzt vielleicht
  8107. der eine oder andere.  Gibt es nat"urlich nicht, aber ein H l"a"st sich nun
  8108. einmal nicht in einer Hexzahl darstellen ("altere Versionen von \asname{} h"atten
  8109. solche Namen deswegen nicht akzeptiert), und dann habe ich die Buchstaben
  8110. gleich ganz weggelassen...
  8111. \par
  8112. \begin{quote}{\it
  8113. ,,Jemand, der sagt, etwas sei unm"oglich,sollte wenigstens so kooperativ
  8114. sein, denjenigen, der es gerade tut, nicht am Arbeiten zu hindern.''
  8115. }\end{quote}
  8116. Ab und zu ist man gezwungen, seine Meinung zu revidieren.  Vor einigen
  8117. Versionen hatte ich an dieser Stelle noch behauptet, ich k"onne es im Parser
  8118. von \asname{} nicht realisieren, da"s man die Argumente von \tty{BSET/BCLR} bzw.
  8119. \tty{BRSET/BRCLR} auch mit Leerzeichen trennen kann.  Offensichtlich kann
  8120. selbiger aber mehr, als ich vermutet habe...nach der soundsovielten Anfrage
  8121. habe ich mich noch einmal drangesetzt, und jetzt scheint es zu laufen.  Man
  8122. darf sowohl Leerzeichen als auch Kommas verwenden, aber nicht in allen
  8123. Varianten, um es nicht uneindeutig zu machen:  Es gibt zu jeder
  8124. Befehlsvariante zwei M"oglichkeiten; eine, die nur Kommas verwendet, sowie
  8125. eine, wie sie von Motorola wohl definiert wurde (leider sind die Datenb"ucher
  8126. nicht immer so gut wie die zugeh"orige Hardware...):
  8127. \begin{verbatim}
  8128.   Bxxx  abs8 #mask         entspricht    Bxxx  abs8,#mask
  8129.   Bxxx  disp8,X #mask      entspricht    Bxxx  disp8,X,#mask
  8130.   BRxxx abs8 #mask adr     entspricht    BRxxx abs8,#mask,adr
  8131.   BRxxx disp8,X #mask adr  entspricht    BRxxx disp8,X,#mask,adr
  8132. \end{verbatim}
  8133. Dabei steht \tty{xxx} entweder f"ur \tty{SET} oder \tty{CLR} und \tty{\#mask}
  8134. f"ur die zu verwendende Bitmaske; der Lattenzaun ist dabei optional.
  8135. Anstelle des X-Registers darf nat"urlich auch Y verwendet werden.
  8136.  
  8137. Mit der K4-Version des HC11 hat Motorola ein Banking-Schema eingef"uhrt,
  8138. mit dem man zwar einerseits eine zu klein gewordene Architektur noch
  8139. einmal aufbohren kann, den Software- und Tool-Entwicklern aber nicht
  8140. unbedingt das Leben einfacher macht...wie stellt man so etwas vern"unftig
  8141. dar?
  8142.  
  8143. Die K4-Architektur {\em erweitert} den Adre"sraum des HC11 um 2x512 Kbyte,
  8144. so da"s jetzt insgesamt 64+1024=1088 Kbyte zur Verf"ugung stehen.  \asname{} tut
  8145. so, als ob es sich dabei um einen Adre"sraum handeln w"urde, der
  8146. folgenderma"sen organisiert ist:
  8147. \begin{itemize}
  8148. \item{\$000000...\$00ffff: der alte HC11-Adre"sraum}
  8149. \item{\$010000...\$08ffff: Fenster 1}
  8150. \item{\$090000...\$10ffff: Fenster 2}
  8151. \end{itemize}
  8152. "Uber den {\tt ASSUME}-Befehl teilt man \asname{} mit, wie die Banking-Register
  8153. eingestellt sind und damit, wie und wo die erweiterten Bereiche
  8154. eingeblendet werden.  Bei absoluten Adressierungen mit Adressen jenseits
  8155. \$10000 berechnet \asname{} dann automatisch, welche Adresse innerhalb der ersten
  8156. 64K anzusprechen ist.  Das kann nat"urlich wieder nur f"ur direkte
  8157. Adressierungsarten funktionieren, bei indizierten/indirekten
  8158. Adre"sausdr"ucken ist der Programmierer daf"ur verantwortlich, "uber die
  8159. momentan aktiven Banks den "Uberblick zu behalten!
  8160. Wer sich nicht ganz sicher ist, ob die momentane Einstellung korrekt ist,
  8161. kann den Pseudobefehl {\tt PRWINS} benutzen, der dann z.B.
  8162. \begin{verbatim}
  8163. MMSIZ e1 MMWBR 84 MM1CR 00 MM2CR 80
  8164. Window 1: 10000...12000 --> 4000...6000
  8165. Window 1: 90000...94000 --> 8000...c000
  8166. \end{verbatim}
  8167. ausgibt.  Ein z.B. an Stelle \$10000 liegender Befehl
  8168. \begin{verbatim}
  8169.        jmp     *+3
  8170. \end{verbatim}
  8171. w"urde effektiv einen Sprung auf Adresse \$4003 ausl"osen.
  8172.  
  8173. %%---------------------------------------------------------------------------
  8174.  
  8175. \section{PowerPC}
  8176.  
  8177. Sicher hat es ein bi"schen den Anflug einer Schnapsidee, einen Prozessor,
  8178. der eher f"ur den Einsatz in Workstations konzipiert wurde, in \asname{}
  8179. einzubauen, der sich ja eher an Programmierer von Einplatinencomputern
  8180. wendet.  Aber was heute noch das Hei"seste vom Hei"sen ist, ist es morgen
  8181. schon nicht mehr, und sowohl der Z80 als auch der 8088 haben ja inzwischen
  8182. die Mutation von der Personal Computer-CPU zum sog. ,,Mikrocontroller''
  8183. vollzogen.  Mit dem Erscheinen von MPC505 und PPC403 hat sich die Vermutung
  8184. dann auch best"atigt, da"s IBM und Motorola diese Prozessorserie auf allen
  8185. Ebenen durchdr"ucken wollen.
  8186. \par
  8187. Die Unterst"utzung ist momentan noch nicht vollst"andig: Als Pseudobefehle
  8188. zur Datenablage werden momentan provisorisch die Intel-Mnemonics
  8189. unterst"utzt und es fehlen die etwas ungew"ohnlicheren, in \cite{Mot601}
  8190. genannten RS6000-Befehle (die aber hoffentlich keiner vermi"st...).  Das
  8191. wird aber nachgeholt, sobald Informationen verf"ugbar sind!
  8192.  
  8193. %%---------------------------------------------------------------------------
  8194.  
  8195. \section{PALM}
  8196.  
  8197. Der PALM-Prozessor von IBM war lange Zeit ,,Terra Incognita'', weil er
  8198. au"serhalb von IBM nie eingesetzt wurde.  Des weiteren waren die damit
  8199. best"uckten IBM-Systeme 5100 bis 5120 recht exotisch und teuer, und
  8200. gerieten "uber den Erfolg des IBM PC schnell in Vergessenheit.  Es ist
  8201. Christian Corti und seinem akribischen Reverse Engineering zu
  8202. verdanken, da"s dieses Target "uberhaupt implementiert werden konnte
  8203. \cite{CortPalm}.
  8204.  
  8205. Als Christian mit dem Reverse Engineering des PALM-Prozessors begann,
  8206. waren ihm die von IBM definierten Assembler-Mnemonics nicht bekannt, er
  8207. mu"ste sich seine eigenen ausdenken.  Das geschah nat"urlich mit dem
  8208. Wissen im Hinterkopf "uber all die Architekturen, die nach 1973 bis
  8209. heute entwickelt wurden.
  8210.  
  8211. Vergleicht man seine Mnemonics mit den originalen von IBM (f"ur die
  8212. dann doch noch eine Dokumentation in \cite{IBMPalm} aufgetaucht
  8213. ist...), dann dr"angt sich ein Vergleich mit den Mnemonics f"ur den
  8214. Intel 8080/8085 auf der einen Seite, und den Zilog Z80 auf der anderen
  8215. Seite auf: Die einen packen zum Teil die Adressierungsart mit in den
  8216. Befehlsnamen, z.B.  {\tt MVI} f"ur ,,Move Immediate'' oder {\tt LDHD}
  8217. f"ur ,,LoaD Halfword Direct''.  Dies ist f"ur einen Assembler deutlich
  8218. einfacher zu parsen und in Maschinencode umzusetzen.
  8219.  
  8220. Die anderen fassen unter einem Mnemonic alle Maschinenbefehle
  8221. zusammen, die grob das gleiche tun, zum Beispiel {\tt LD} bzw.
  8222. {\tt MOVE} um Daten zu transferieren.  Das macht die Nutzung f"ur
  8223. den Programmierer einfacher, sie sind mit den als Operanden
  8224. geschriebenen Adressierungsarten f"ur einen Assembler aber etwas
  8225. komplexer zu parsen.
  8226.  
  8227. Auf diese Weise haben beide Mnemonic-S"atze ihre Berechtigung: Die
  8228. einen, weil sie einfach das ,,Original'' sind und in allen
  8229. Herstellerdokumenten verwendet werden, und die anderen, weil sie
  8230. einfach moderner, zug"anglicher und praktischer sind.  Ich habe mich
  8231. deshalb entschieden, {\em beide} in meinem Assembler zu unterst"utzen,
  8232. und gl"ucklicherweise war dies auch ohne Konflikte m"oglich.  Das
  8233. schlie"st auch die ,,Makrobefehle'' {\tt CALL, RCALL, JMP, BRA, LWI}
  8234. und {\tt RET} ein.  Und was ich selber noch dazu gedichtet habe:
  8235. \begin{itemize}
  8236. \item{{\tt AND} und {\tt OR} akzeptieren auch einen Immediate-Wert als zweites
  8237.      Argument.  Dies wird auf {\tt SET} bzw. {\tt CLR} abgebildet, wobei bei
  8238.      {\tt AND} nat"urlich das Einerkomplement des Wertes eingesetzt wird.}
  8239. \item{{\tt MOVE} akzeptiert auch einen immediate-Wert als Quelle und erzeugt
  8240.      dann den gleichen Code wie {\tt LWI}.  Gleiches gilt f"ur {\tt MOVB} und
  8241.      {\tt LBI}.}
  8242. \end{itemize}
  8243. Makrobefehle, die aus mehr als einem (Halb-)Wort bestehen, bringen
  8244. allerdings ein neues Problem mit sich: Der PALM-Prozessor kennt als
  8245. bedingten Sprung nur das "Uberspringen des folgenden Instruktionsworts.
  8246. Folgt auf so einen Sprung ein Makrobefehl, so w"urde dieser nur
  8247. teilweise "ubersprungen.  Ich habe daher eine kleine State-Machine
  8248. vorgesehen, die solche Befehlsfolgen zu erkennen versucht und dann
  8249. warnt.
  8250.  
  8251. Die IBM-Systeme 5110 und 5120 verwenden nicht den heute "ublichen
  8252. ASCII-Zeichensatz, sondern den von IBM-Gro"srechnern bekannten
  8253. EBCDIC.  Im Include-Verzeichnis befindet sich eine Datei, die man
  8254. zur Umsetzung von ASCII nach EDCDIC einbinden kann.  WICHTIG:
  8255. EBCDIC ist in dieser Datei als eigene Codepage definiert, man
  8256. mu"s die Umsetzung also noch mit einem
  8257. \begin{verbatim}
  8258.        codepage        cp037
  8259. \end{verbatim}
  8260. aktivieren.
  8261.  
  8262. Noch ein Wort zur Integer-Syntax: Christian Corti hatte sich bei seiner
  8263. Implementierung f"ur die Motorola-Syntax entschieden, also
  8264. Hex-Konstanten mit vorangestelltem Dollar-Zeichen.  Ich habe mich f"ur
  8265. die 'IBM-Syntax' entschieden, also Zahlenkonstanten in Hochkommas, und z.B.
  8266. ein vorangestelltes {\tt X} f"ur hexadezimal.  Um die Programmbeispiele
  8267. auf Christians Seiten ohne "Anderungen zu "ubersetzen, f"uge man
  8268. folgenden Befehl zu Beginn ein:
  8269. \begin{verbatim}
  8270.        intsyntax       +$hex,-x'hex'
  8271. \end{verbatim}
  8272.  
  8273. %%---------------------------------------------------------------------------
  8274.  
  8275. \section{DSP56xxx}
  8276.  
  8277. Motorola, was ist nur in Dich gefahren!  Wer bei Dir ist nur auf das
  8278. schmale Brett gekommen, die einzelnen parallelen Datentransfers
  8279. ausgerechnet durch Leerzeichen zu trennen!  Wer immer nun seine Codes
  8280. etwas "ubersichtlicher formatieren will, z.B. so:
  8281. \begin{verbatim}
  8282.        move    x:var9 ,r0
  8283.        move    y:var10,r3   ,
  8284. \end{verbatim}
  8285. der ist gekniffen, weil das Leerzeichen als Trennung paralleler
  8286. Datentransfers erkannt wird!
  8287. \par
  8288. Sei's drum; Motorola hat es so definiert, und ich kann es nicht
  8289. "andern.  Als Trennung der Operationen sind statt Leerzeichen auch
  8290. Tabulatoren zugelassen, und die einzelnen Teile sind ja wieder ganz
  8291. normal mit Kommas getrennt.
  8292. \par
  8293. In \cite{Mot56} steht, da"s bei den Befehlen \tty{MOVEC, MOVEM, ANDI} und
  8294. \tty{ORI} auch die allgemeineren Mnemonics \tty{MOVE, AND} und \tty{OR}
  8295. verwendet werden k"onnen.  Bei \asname{} geht das (noch) nicht.
  8296.  
  8297. %%---------------------------------------------------------------------------
  8298.  
  8299. \section{H8/300}
  8300.  
  8301. Bei der Assemblersyntax dieser Prozessoren hat Hitachi reichlich
  8302. bei Motorola abgekupfert (was so verkehrt ja nun auch nicht war...),
  8303. nur leider wollte die Firma unbedingt ihr eigenes Format f"ur
  8304. Hexadezimalzahlen einf"uhren, und dazu noch eines, das ein einzelne
  8305. Hochkommas verwendet, etwa in dieser Form:
  8306. \begin{verbatim}
  8307.   mov.w #h'ff,r0
  8308. \end{verbatim}
  8309. Dieses Format wird von \asname{} im Default nicht unterst"utzt, es wird
  8310. stattdessen die ''Motorola-Syntax'' mit vorangestelltem Dollarzeichen
  8311. angeboten.  Falls man doch unbedingt die 'Hitachi-Syntax' benutzen
  8312. will, z.B. um existierenden Code zu "ubersetzen, so mu"s der
  8313. RELAXED-Modus eingeschaltet werden.  Bitte beachten, da"s diese Syntax
  8314. bisher wenig getestet wurde und ich keine Garantie geben kann, da"s sie
  8315. in allen F"allen funktioniert!
  8316.  
  8317. %%---------------------------------------------------------------------------
  8318.  
  8319. \section{H8/500}
  8320.  
  8321. Der {\tt MOV}-Befehl des H8/500 bietet eine interessante und ungew"ohnliche
  8322. Optimierung: Hat der Zieloperand eine L"ange von 16 Bit, so ist es trotzdem
  8323. m"oglich, einen nur 8-bittigen (Immediate-)Quelloperanden zu verwenden.  Bei
  8324. einer Anweisung der Form
  8325. \begin{verbatim}
  8326.   mov.w #$ffff,@$1234
  8327. \end{verbatim}
  8328. ist es also m"oglich, den Immediate-Quellwert lediglich in einem Byte mit
  8329. dem Wert \$ff zu kodieren und ein Byte einzusparen.  Der Prozessor f"uhrt
  8330. eine Vorzeichenerweiterung durch, so da"s aus \$ff das gew"unschte \$ffff
  8331. wird.  \asname{} kennt diese Optimierung und benutzt sie auch, wenn dies nicht
  8332. durch einen expliziten \tty{:16}-Suffix am Immediate-Operanden verboten
  8333. wird.
  8334. Es hat sich in diesem Zusammenhang nur herausgestellt, da"s der Original-Assembler
  8335. von Hitachi diese Optimierung anders umsetzt: er scheint von einer Null- statt
  8336. einer Vorzeichen-Erweiterung auszugehen.  Das bedeutet, nicht Argumente von
  8337. -128 bis +127 (\$ff80 bis \$007f) werden als ein Byte kodiert, sondern von 0 bis
  8338. 255 (\$0000 bis \$00ff).  Tests an echter Hardware haben ergeben, da"s
  8339. das Programmers Manual in dieser Hinsicht Recht hat: Es wird eine Vorzeichen-
  8340. Erweiterung durchgef"uhrt.  Deshalb verwendet \asname{} im Default die k"urzere
  8341. Kodierung nur, wenn im Quellcode ein Wert von -128 bis +127 bzw. (\$ff80 bis
  8342. \$007f) benutzt wird.  F"ur existierenden Code, der sich darauf verl"a"st,
  8343. da"s Werte von \$80 bis \$ff mit nur einem Byte kodiert werden, kann in einen
  8344. Kompatibilit"atsmodus geschaltet werden, entweder durch ein
  8345. \begin{verbatim}
  8346.  compmode on
  8347. \end{verbatim}
  8348. im Quellcode oder den gleichnamigen Schalter auf der Kommandozeile.
  8349.  
  8350. Ansonsten gelten die gleichen Hinweise bez"uglich der Syntax hexadezimaler
  8351. Zahlen wie f"ur H8/300.
  8352.  
  8353. %%---------------------------------------------------------------------------
  8354.  
  8355. \section{SH7000/7600/7700}
  8356.  
  8357. Leider hat Hitachi auch hier wieder das Extrawurst-Format f"ur
  8358. Hexadezimalzahlen verwendet, und wieder habe ich in \asname{} das nicht
  8359. nachvollzogen...bitte Motorola-Syntax benutzen!
  8360. \par
  8361. Bei der Verwendung von Literalen und dem \tty{LTORG}-Befehl sind
  8362. einige Details zu beachten, wenn man nicht auf einmal mit eigenartigen
  8363. Fehlermeldungen konfrontiert werden will:
  8364. \par
  8365. Literale existieren, weil der Prozessor nicht in der Lage ist, Konstanten
  8366. au"serhalb des Bereiches von -128 bis 127 mit immediate-Adressierung
  8367. zu laden.  \asname{} (und der Hitachi-Assembler) verstecken diese Unzul"anglichkeit,
  8368. indem sie automatisch entsprechende Konstanten im Speicher ablegen, die
  8369. dann mittels PC-relativer Adressierung angesprochen werden.  Die Frage, die
  8370. sich nun erhebt, ist die, wo diese Konstanten im Speicher abgelegt werden
  8371. sollen.  \asname{} legt sie nicht sofort ab, sondern sammelt sie so lange
  8372. auf, bis im Programm eine \tty{LTORG}-Anweisung auftritt.  Dort werden
  8373. alle Konstanten abgelegt, wobei deren Adressen mit ganz normalen
  8374. Labels versehen werden, die man auch in der Symboltabelle sehen kann.
  8375. Ein Label hat die Form
  8376. \begin{verbatim}
  8377.   LITERAL_s_xxxx_n   .
  8378. \end{verbatim}
  8379. Dabei repr"asentiert \tty{s} den Typ des Literals.  Unterschieden werden
  8380. Literale, die 16-Bit-Konstanten (\tty{s=W}), 32-Bit-Konstanten (\tty{s=L})
  8381. oder Vorw"artsreferenzen, bei denen \asname{} die Operandengr"o"se nicht
  8382. im voraus erkennen kann (\tty{s=F}), enthalten.  F"ur \tty{W} oder \tty{L}
  8383. bedeutet \tty{xxxx} den hexadezimal geschriebenen Wert der Konstante, bei
  8384. Vorw"artsreferenzen, bei denen man den Literalwert ja noch nicht kennt,
  8385. bezeichnet \tty{xxxx} eine einfache Durchnumerierung. \tty{n} kennzeichnet
  8386. das wievielte Auftreten dieses Literals in dieser Sektion.  Literale machen
  8387. ganz normal die Lokalisierung durch Sektionen mit, es ist daher zwingend
  8388. erforderlich, in einer Sektion entstandene Literale mit \tty{LTORG} auch
  8389. dort abzulegen!
  8390. \par
  8391. Die Durchnumerierung mit \tty{n} ist erforderlich, weil ein Literal in
  8392. einer Sektion mehrfach auftreten kann.  Dies ist einmal bedingt dadurch,
  8393. da"s die PC-relative Adressierung nur positive Displacements erlaubt,
  8394. einmal mit \tty{LTORG} abgelegte Literale also im folgenden Code nicht
  8395. mitbenutzt werden k"onnen, andererseits auch, weil die Reichweite der
  8396. Displacements beschr"ankt ist (512 bzw. 1024 Byte).
  8397. Ein automatisches \tty{LTORG} am Ende des Programms oder beim Umschalten
  8398. zu einer anderen CPU erfolgt nicht; findet \asname{} in einer solchen Situation
  8399. noch abzulegende Literale, so wird eine Fehlermeldung ausgegeben.
  8400. \par
  8401. Da bei der PC-relativen Adressierung der zur Adressierung herangezogene
  8402. PC-Wert der Instruktionsadresse+4 entspricht, ist es nicht m"oglich, ein
  8403. Literal zu benutzen, welches direkt hinter dem betroffenen Befehl abgelegt
  8404. wird, also z.B. so:
  8405. \begin{verbatim}
  8406.        mov     #$1234,r6
  8407.        ltorg
  8408. \end{verbatim}
  8409. Da der Prozessor dann aber sowieso versuchen w"urde, Daten als Code
  8410. auszuf"uhren, sollte diese Situation in realen Programmen nicht auftreten.
  8411. Wesentlich realer ist aber ein anderer Fallstrick:  Wird hinter einem
  8412. verz"ogerten Sprung PC-relativ zugegriffen, so ist der Programmz"ahler
  8413. bereits auf die Sprungzieladresse gesetzt, und das Displacement wird
  8414. relativ zum Sprungziel+2 berechnet.  Im folgenden Beispiel kann daher
  8415. das Literal nicht erreicht werden:
  8416. \begin{verbatim}
  8417.        bra     Target
  8418.         mov     #$12345678,r4        ; wird noch ausgefuehrt
  8419.        .
  8420.        .
  8421.        ltorg                        ; hier liegt das Literal
  8422.        .
  8423.        .
  8424. Target: mov     r4,r7                ; hier geht es weiter
  8425. \end{verbatim}
  8426. Da Target+2 hinter dem Literal liegt, w"urde sich ein negatives
  8427. Displacement ergeben.  Besonders haarig wird es, wenn mit den
  8428. Befehlen \tty{JMP, JSR, BRAF} oder \tty{BSRF} verzweigt wird:  Da \asname{} die
  8429. Zieladresse hier nicht ermitteln kann (sie ergibt sich erst zur
  8430. Laufzeit aus dem Registerinhalt), nimmt \asname{} hier eine Adresse an,
  8431. die nach M"oglichkeit nie pa"st, so da"s PC-relative Adressierung g"anzlich
  8432. unm"oglich wird.
  8433. \par
  8434. Es ist nicht direkt m"oglich, aus der Zahl und Gr"o"se der Literale
  8435. auf den belegten Speicher zu schlie"sen.  U.u. mu"s \asname{} ein F"ullwort
  8436. einbauen, um einen Langwort-Wert auf eine durch 4 teilbare Adresse
  8437. auszurichten, andererseits kann er m"oglicherweise Teile eines
  8438. 32-bittigen Literals f"ur 16-Bit-Literale mitbenutzten.  Mehrfach
  8439. auftretende Literale erzeugen nat"urlich nur einen Eintrag.  Solche
  8440. Optimierungen werden f"ur Vorw"artsreferenzen allerdings ganz
  8441. unterdr"uckt, da \asname{} den Wert dieser Literale noch nicht kennt.
  8442. \par
  8443. Da Literale die PC-relative Adressierung ausnutzen, die nur beim
  8444. \tty{MOV}-Befehl erlaubt sind, beschr"anken sich Literale ebenfalls auf
  8445. die Verwendung in \tty{MOV}.  Etwas trickreich ist hier die Art und Weise,
  8446. in der \asname{} die Operandengr"o"se auswertet.  Eine Angabe von Byte oder
  8447. Wort bedeutet, da"s \asname{} einen m"oglichst kurzen \tty{MOV}-Befehl erzeugt,
  8448. der den angegebenen Wert in den unteren 8 oder 16 Bit erzeugt, d.h.
  8449. die oberen 24 oder 16 Bit werden als don't care behandelt.  Gibt
  8450. man dagegen Langwort oder gar nichts an, so sagt dies aus, da"s
  8451. das komplette 32-Bit-Register den angegebenen Wert enthalten soll.
  8452. Das hat z.B. den Effekt, da"s in folgendem Beispiel
  8453. \begin{verbatim}
  8454.        mov.b   #$c0,r0
  8455.        mov.w   #$c0,r0
  8456.        mov.l   #$c0,r0
  8457. \end{verbatim}
  8458. der erste Befehl echte immediate-Adressierung erzeugt, der zweite und
  8459. dritte jedoch ein Wort-Literal benutzen: Da das Bit 7 in der Zahl gesetzt
  8460. ist, erzeugt der Byte-Befehl effektiv \$FFFFFFC0 im Register, was nach
  8461. der Konvention nicht das w"are, was man im zweiten und dritten Fall haben
  8462. m"ochte.  Im dritten Fall reicht auch ein Wort-Literal, weil das gel"oschte
  8463. Bit 15 des Operanden vom Prozessor in Bit 16..31 fortgesetzt wird.
  8464. \par
  8465. Wie man sieht, ist dieses ganze Literal-Konzept reichlich kompliziert;
  8466. einfacher ging's aber wirklich nicht.  Es liegt leider in der Natur
  8467. der Sache, da"s man manchmal Fehlermeldungen "uber nicht gefundene
  8468. Literale bekommt, die eigentlich logisch nicht auftreten k"onnten, weil
  8469. \asname{} die Literale ja komplett in eigener Regie verwaltet.  Treten aber bei
  8470. der Assemblierung Fehler erst im zweiten Pass auf, so verschieben sich
  8471. z.B. hinter der Fehlerstelle liegende Labels gegen"uber dem ersten Pass,
  8472. weil \asname{} f"ur die jetzt als fehlerhaft erkannten Befehle keinen Code mehr
  8473. erzeugt.  Da aber Literalnamen u.a. aus den Werten von Symbolen erzeugt
  8474. werden, werden als Folgefehler davon eventuell andere Literalnamen
  8475. nachgefragt, als im ersten Pass abgelegt wurden und \asname{} beschwert sich
  8476. "uber nicht gefundene Symbole...sollten also neben anderen Fehlern solche
  8477. Literal-Fehler auftreten, beseitigen Sie erst die anderen Fehler, bevor
  8478. Sie mich und alle Literale verfluchen...
  8479. \par
  8480. Wer aus der Motorola-Ecke kommt und PC-relative Adressierung explizit
  8481. benutzen will (z.B. um Variablen lageunabh"angig zu erreichen), sollte
  8482. wissen, da"s beim Ausschreiben der Adressierung nach Programmierhandbuch,
  8483. also z.B. so:
  8484. \begin{verbatim}
  8485.        mov.l   @(Var,PC),r8
  8486. \end{verbatim}
  8487. {\it keine} implizite Umrechnung der Adresse auf ein Displacement erfolgt,
  8488. d.h. der Operand wird so eingesetzt, wie er ist (und w"urde in diesen
  8489. Beispiel wohl mit hoher Wahrscheinlichkeit eine Fehlermeldung
  8490. hervorrufen...).  Will man beim SH7x00 PC-relativ adressieren, so tut man
  8491. das einfach mit ,,absoluter'' Adressierung, die auf Maschinenebene ja
  8492. gar nicht existiert:
  8493. \begin{verbatim}
  8494.        mov.l   Var,r8
  8495. \end{verbatim}
  8496. Hier wird das Displacement korrekt berechnet (es gelten nat"urlich die
  8497. gleichen Einschr"ankungen f"ur das Displacement wie bei Literalen).
  8498.  
  8499. %%---------------------------------------------------------------------------
  8500.  
  8501. \section{HMCS400}
  8502.  
  8503. Beim Befehlssatz dieser 4-Bit-Prozessoren f"uhlte ich mich
  8504. spontan an den 8080/8085 erinnert - sehr viele Menemonics, die
  8505. Adressierungsart (z.B.  indirekt oder direkt) ist in den Befehl
  8506. einkodiert, die Befehle sind zum Teil nur schwer zu merken.
  8507. Nat"urlich unterst"utzt \asname{} diese Syntax, wie Hitachi sie
  8508. seinerzeit definiert hat, ich habe aber zus"atzlich f"ur die
  8509. meisten Befehle eine - finde ich - sch"onere und besser lesbare
  8510. Variante implementiert, so wie Zilog es seinerzeit mit den Z80
  8511. gemacht hat.  Zum Beispiel k"onnen alle Maschineninstruktionen,
  8512. die in irgendeiner Form Daten transferieren, egal ob die
  8513. Operanden Register, Konstanten oder Speicherstellen sind, "uber den
  8514. \asname{}-spezifischen \tty{LD}-Befehl angesprochen werden.  "Ahnliche
  8515. 'Meta-Befehle' gibt es f"ur arithmetische und logische Befehle.
  8516. Eine vollst"andige Liste aller Meta-Befehle und ihrer Operanden
  8517. findet sich in den Tabellen \ref{TabHMCS400Meta} und
  8518. \ref{TabHMCS400MetaOps}, ihre praktische Verwendung kann man sich
  8519. in der Datei \tty{t\_hmcs4x.asm} ansehen.
  8520.  
  8521. \begin{table*}
  8522. \begin{center}\begin{tabular}{|l|l|}
  8523. \hline
  8524. Meta-Instruktion          & Ersetzt \\
  8525. \hline
  8526. \tty{LD} {\em src, dest}        & \tty{LAI, LBI, LMID, LMIIY,} \\
  8527.                                & \tty{LAB, LBA, LAY, LASPX, LASPY, LAMR,} \\
  8528.                                & \tty{LWI, LXI, LYI, LXA, LYA, LAM, LAMD} \\
  8529.                                & \tty{LBM, LMA, LMAD, LMAIY, LMADY} \\
  8530. \tty{XCH} {\em src, dest}       & \tty{XMRA, XSPX, XSPY, XMA, XMAD, XMB} \\
  8531. \tty{ADD} {\em src, dest}       & \tty{AYY, AI, AM, AMD} \\
  8532. \tty{ADC} {\em src, dest}       & \tty{AMC, AMCD} \\
  8533. \tty{SUB} {\em src, dest}       & \tty{SYY} \\
  8534. \tty{SBC} {\em src, dest}       & \tty{SMC, SMCD} \\
  8535. \tty{OR}  {\em src, dest}       & \tty{OR, ORM, ORMD} \\
  8536. \tty{AND} {\em src, dest}       & \tty{ANM, ANMD} \\
  8537. \tty{EOR} {\em src, dest}       & \tty{EORM, EORMD} \\
  8538. \tty{CP}  {\em cond, src, dest} & \tty{INEM, INEMD, ANEM, ANEMD, BNEM,} \\
  8539.                                & \tty{YNEI, ILEM, ILEMD, ALEM, ALEMD,} \\
  8540.                                & \tty{BLEM, ALEI} \\
  8541. \tty{BSET} {\em bit}            & \tty{SEC, SEM, SEMD} \\
  8542. \tty{BCLR} {\em bit}            & \tty{REC, REM, REMD} \\
  8543. \tty{BTST} {\em bit}            & \tty{TC, TM, TMD} \\
  8544. \hline
  8545. \end{tabular}\end{center}
  8546. \caption{Meta-Befehle HMCS400}
  8547. \label{TabHMCS400Meta}
  8548. \end{table*}
  8549.  
  8550. \begin{table*}
  8551. \begin{center}\begin{tabular}{|l|l|}
  8552. \hline
  8553. Operand                 & Typen \\
  8554. \hline
  8555. {\em src, dest}         & \tty{A, B, X, Y, W, SPX, SPY} (Register) \\
  8556.                        & \tty{M} (Speicher adressiert durch X/Y/W) \\
  8557.                        & \tty{M+} (dito, mit Autoinkrement) \\
  8558.                        & \tty{M-} (dito, mit Autodekrement) \\
  8559.                        & \tty{\#val} (2/4 bit immediate) \\
  8560.                        & \tty{addr10} (Speicherzelle direkt) \\
  8561.                        & \tty{MRn} (Memory-Register 0..15) \\
  8562. {\em cond}              & \tty{NE} (ungleich) \\
  8563.                        & \tty{LE} (kleiner oder gleich) \\
  8564. {\em bit}               & \tty{CA} (Carry) \\
  8565.                        & {\em bitpos},\tty{M} \\
  8566.                        & {\em bitpos},\tty{addr10} \\
  8567. {\em bitpos}            & \tty{0..3} \\
  8568. \hline
  8569. \end{tabular}\end{center}
  8570. \caption{Operandentypen f"ur Meta-Befehle HMCS400}
  8571. \label{TabHMCS400MetaOps}
  8572. \end{table*}
  8573.  
  8574. %%---------------------------------------------------------------------------
  8575.  
  8576. \section{H16}
  8577.  
  8578. Der Befehlssatz des H16-Kerns verdient mit Recht den Namen ,,CISC'': komplexe
  8579. Adressierungsarten, sehr variable Instruktionsl"angen, und f"ur viele
  8580. Befehle mit g"angigen Operanden gibt es Kurzschreibweisen.  So gibt
  8581. es f"ur diverse Befehle mehrere ,,Formate'', je nachdem welchen Typ Quell-
  8582. und Zieloperand haben.  Die generelle Regel ist, da"s \asname{} immer
  8583. das k"urzestm"ogliche Format benutzt, es sei denn, es wurde explizit
  8584. angegeben:
  8585. \begin{verbatim}
  8586.       mov.l     r4,r7     ; benutzt R-Format
  8587.       mov.l     #4,r7     ; benutzt RQ-Format
  8588.       mov.l     #4,@r7    ; benutzt Q-Format
  8589.       mov.l     @r4,@r7   ; benutzt G-Format
  8590.       mov:q.l   #4,r7     ; Q- statt RQ-Format erzwungen
  8591.       mov:g.l   #4,r7     ; G- statt RQ-Format erzwungen
  8592. \end{verbatim}
  8593. F"ur Immediate-Argumente wird die ,,nat"urliche'' Operandenl"ange
  8594. benutzt, also z.B. 2 Bytes f"ur 16 Bits.  K"urzere oder l"angere
  8595. Argumente lassen sich durch eine angeh"angte Operandengr"o"se
  8596. (.b, .w, .l oder :8, :16, :32) erzwingen.  Bei Displacements oder
  8597. absoluten Adressen gilt jedoch, da"s ohne explizite L"angenangabe
  8598. immer die k"urzestm"ogliche Schreibweise benutzt wird.  Das schlie"st
  8599. ein, da"s bei absoluten Adressen die oberen acht Adre"sbits vom
  8600. Prozessor nicht herausgegeben werden: eine Adresse \$ffff80 kann also
  8601. mit einem Byte (\$80) kodiert werden.
  8602.  
  8603. Des weiteren kennt \asname{} das ''Akkumulator-Bit'', d.h. bei Instruktionen
  8604. mit zwei beliebigen Operanden kann der zweite Operand weggelassen
  8605. werden, falls das Ziel Register Null ist.  Dieses Verhalten kann
  8606. nicht "ubersteuert werden.
  8607.  
  8608. Des weiteren werden folgende Optimierungen durchgef"uhrt:
  8609. \begin{itemize}
  8610. \item{\tty{MOV R0,<ea>} wird zu \tty{MOVF <ea>} optimiert, sofern
  8611.      \tty{<ea>} kein PC-relativer Ausdruck ist und sich die L"ange
  8612.      des Displacements "andern w"urde.  Diese Optimierung kann durch
  8613.      eine explizite Formatangabe unterdr"uckt werden.}
  8614. \item{\tty{SUB} existiert nicht im Q-Format, kann aber durch ein
  8615.      \tty{ADD:Q} mit negiertem immediate-Argument ersetzt werden,
  8616.      falls das Argument zu \tty{SUB} im Bereich -127...+128 liegt.
  8617.      Auch diese Optimierung kann durch eine explizite Formatangabe
  8618.      unterdr"uckt werden.}
  8619. \end{itemize}
  8620.  
  8621. %%---------------------------------------------------------------------------
  8622.  
  8623. \section{OLMS-40}
  8624.  
  8625. "Ahnlich wie beim HMCS400 sind die Adressierungsarten zu einem
  8626. gro"sen Teil in die Mnemonics hineinkodiert, und ich habe mich
  8627. auch hier daf"ur entschieden, f"ur h"aufig genutzte Befehle eine
  8628. alternative, modernere und besser lesbare Notation
  8629. bereitzustellen.
  8630. Eine vollst"andige Liste aller Meta-Befehle und ihrer Operanden
  8631. findet sich in den Tabellen \ref{TabOLMS40Meta} und
  8632. \ref{TabOLMS40MetaOps}, ihre praktische Verwendung kann man sich
  8633. in der Datei \tty{t\_olms4.asm} ansehen.
  8634.  
  8635. \begin{table*}
  8636. \begin{center}\begin{tabular}{|l|l|}
  8637. \hline
  8638. Meta-Instruktion          & Ersetzt \\
  8639. \hline
  8640. \tty{LD} {\em dest, src}        & \tty{LAI, LLI, LHI, L,} \\
  8641.                                & \tty{LAL, LLA, LAW, LAX, LAY, LAZ,} \\
  8642.                                & \tty{LWA, LXA, LYA, LPA, LTI, RTH, RTL} \\
  8643. \tty{DEC} {\em dest}            & \tty{DCA, DCL, DCM, DCW, DCX, DCY, DCZ, DCH} \\
  8644. \tty{INC} {\em dest}            & \tty{INA, INL, INM, INW, INX, INY, INZ} \\
  8645. \tty{BSET} {\em bit}            & \tty{SPB, SMB, SC} \\
  8646. \tty{BCLR} {\em bit}            & \tty{RPB, RMB, RC} \\
  8647. \tty{BTST} {\em bit}            & \tty{TAB, TMB, Tc} \\
  8648. \hline
  8649. \end{tabular}\end{center}
  8650. \caption{Meta-Befehle OLMS-40}
  8651. \label{TabOLMS40Meta}
  8652. \end{table*}
  8653.  
  8654. \begin{table*}
  8655. \begin{center}\begin{tabular}{|l|l|}
  8656. \hline
  8657. Operand                 & Typen \\
  8658. \hline
  8659. {\em src, dest}         & \tty{A, W, X, Y, Z, DPL, DPH} (Register) \\
  8660.                        & \tty{T, TL, TH} (Timer, obere/untere H"alfte) \\
  8661.                        & \tty{(DP), M} (Speicher adressiert durch DPH/DPL) \\
  8662.                        & \tty{\#val} (4/8 bit immediate) \\
  8663.                        & \tty{PP} (Port-Pointer) \\
  8664. {\em bit}               & \tty{C} (Carry) \\
  8665.                        & \tty{(PP)},{\em bitpos} \\
  8666.                        & \tty{(DP)},{\em bitpos} \\
  8667.                        & \tty{(A)},{\em bitpos} \\
  8668. {\em bitpos}            & \tty{0..3} \\
  8669. \hline
  8670. \end{tabular}\end{center}
  8671. \caption{Operandentypen f"ur Meta-Befehle OLMS-40}
  8672. \label{TabOLMS40MetaOps}
  8673. \end{table*}
  8674.  
  8675. %%---------------------------------------------------------------------------
  8676.  
  8677. \section{OLMS-50}
  8678.  
  8679. Der Datenspeicher dieser 4-Bit-Controller besteht aus bis zu 128
  8680. Nibbles.  F"ur die daf"ur ben"otigten sieben Adre"sbits war
  8681. jedoch nur in den wenigsten Instruktionen Platz, so da"s einmal
  8682. wieder Banking zur Adressierung herhalten mu"s.  Die meisten
  8683. Befehle, die Speicher adressieren, enthalten nur die untersten
  8684. vier Bits der RAM-Adresse, und sofern nicht die untersten 16
  8685. Nibbles angesprochen werden sollen, liefert das P-Register die
  8686. notwendigen obere Adre"sbits.  Dessen aktuellen Wert teilt man
  8687. dem Assembler "uber ein
  8688. \begin{verbatim}
  8689.   assume  p:<Wert>
  8690. \end{verbatim}
  8691. mit, z.B. direkt nach einem \tty{PAGE}-Befehl.
  8692.  
  8693. Mit \tty{PAGE} ist auch ein anderes Thema angeschnitten: sowohl
  8694. \tty{PAGE} als auch \tty{SWITCH} sind auf diesen Controllern
  8695. Maschinenbefehle, d.h. haben nicht ihre von anderen Targets
  8696. "ubliche Funktion.  Der Pseudobefehl, um ein \tty{SWITCH/CASE}-
  8697. Konstrukt einzuleiten, lautet im OLMS-50-Modus \tty{SELECT}, und
  8698. die Seitengr"o"se des Listings legt man mit \tty{PAGESIZE} fest.
  8699.  
  8700. %%---------------------------------------------------------------------------
  8701.  
  8702. \section{MELPS-4500}
  8703.  
  8704. Der Programmspeicher dieser Mikrokontroller ist in Seiten zu
  8705. 128 Worten eingeteilt.  Diese Einteilung existiert eigentlich nur
  8706. deswegen, weil es Sprungbefehle gibt, deren Ziel innerhalb der
  8707. gleichen Seite liegen darf, und andererseits ,,lange'' Exemplare,
  8708. die den ganzen Adre"sbereich erreichen k"onnen.  Die Standard-Syntax
  8709. von Mitsubishi verlangt eigentlich, da"s Seite und Offset als getrennte
  8710. Argument geschrieben werden m"ussen.  Da das aber reichlich unpraktisch
  8711. ist (ansonsten hat man als Programmierer keine Veranlassung, sich um
  8712. Seiten zu k"ummern, mit der Ausnahme von indirekten Spr"ungen), erlaubt
  8713. es \asname{} auch wahlweise, die Zieladresse linear zu schreiben, also z.B.
  8714. \begin{verbatim}
  8715.      bl        $1234
  8716. \end{verbatim}
  8717. anstelle
  8718. \begin{verbatim}
  8719.      bl        $24,$34  .
  8720. \end{verbatim}
  8721.  
  8722. %%---------------------------------------------------------------------------
  8723.  
  8724. \section{6502UNDOC}
  8725.  
  8726. Da die undokumentierten Befehle des 6502 sich naturgem"a"s in keinem
  8727. Datenbuch finden, sollen sie an dieser Stelle kurz aufgelistet werden.
  8728. Die Verwendung erfolgt naturgem"a"s auf eigene Gefahr, da es keine
  8729. Gew"ahr gibt, da"s alle Maskenversionen alle Varianten unterst"utzen!
  8730. Bei den CMOS-Nachfolgern des 6502 funktionieren sie sowieso nicht
  8731. mehr, da diese die entsprechenden Bitkombinationen mit offiziellen Befehlen
  8732. belegen...
  8733.  
  8734. %%TEMP
  8735. \clearpage
  8736.  
  8737. Es bedeuten:
  8738.  
  8739. \begin{tabbing}
  8740. \hspace{2cm} \= \kill \\
  8741. \&             \> bin"ares UND \\
  8742. |              \> bin"ares ODER \\
  8743. \verb!^!       \> bin"ares EXOR \\
  8744. $<<$           \> logischer Linksshift \\
  8745. $>>$           \> logischer Rechtsshift \\
  8746. $<<<$          \> Linksrotation \\
  8747. $>>>$          \> Rechtsrotation \\
  8748. $\leftarrow$   \> Zuweisung \\
  8749. (..)           \> Inhalt von .. \\
  8750. {..}           \> Bits .. \\
  8751. A              \> Akkumulator \\
  8752. X,Y            \> Indexregister X,Y \\
  8753. S              \> Stapelzeiger \\
  8754. An             \> Akkumulatorbit n \\
  8755. M              \> Operand \\
  8756. C              \> Carry \\
  8757. PCH            \> obere H"alfte Programmz"ahler \\
  8758. \end{tabbing}
  8759.  
  8760. \begin{tabbing}
  8761. Adressierungsmodi \= : \= \kill \\
  8762. Anweisung         \> : \> \tty{JAM, KIL} oder \tty{CRS} \\
  8763. Funktion          \> : \> keine, Prozessor wird angehalten \\
  8764. Adressierungsmodi \> : \> implizit \\
  8765. \end{tabbing}
  8766. \begin{tabbing}
  8767. Adressierungsmodi \= : \= \kill \\
  8768. Anweisung         \> : \> \tty{SLO} \\
  8769. Funktion          \> : \> $M\leftarrow((M)<<1)|(A)$ \\
  8770. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  8771.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  8772. \end{tabbing}
  8773. \begin{tabbing}
  8774. Adressierungsmodi \= : \= \kill \\
  8775. Anweisung         \> : \> \tty{ANC} \\
  8776. Funktion          \> : \> $A\leftarrow(A)\&(M), C\leftarrow A7$ \\
  8777. Adressierungsmodi \> : \> immediate \\
  8778. \end{tabbing}
  8779. \begin{tabbing}
  8780. Adressierungsmodi \= : \= \kill \\
  8781. Anweisung         \> : \> \tty{RLA} \\
  8782. Funktion          \> : \> $M\leftarrow((M)<<1)\&(A)$ \\
  8783. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  8784.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  8785. \end{tabbing}
  8786. \begin{tabbing}
  8787. Adressierungsmodi \= : \= \kill \\
  8788. Anweisung         \> : \> \tty{SRE} \\
  8789. Funktion          \> : \> $M\leftarrow((M)>>1)$\verb!^!$(A)$ \\
  8790. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  8791.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  8792. \end{tabbing}
  8793. \begin{tabbing}
  8794. Adressierungsmodi \= : \= \kill \\
  8795. Anweisung         \> : \> \tty{ASR} \\
  8796. Funktion          \> : \> $A\leftarrow((A)\&(M))>>1$ \\
  8797. Adressierungsmodi \> : \> immediate \\
  8798. \end{tabbing}
  8799. \begin{tabbing}
  8800. Adressierungsmodi \= : \= \kill \\
  8801. Anweisung         \> : \> \tty{RRA} \\
  8802. Funktion          \> : \> $M\leftarrow((M)>>>1)+(A)+(C)$ \\
  8803. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  8804.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  8805. \end{tabbing}
  8806. \begin{tabbing}
  8807. Adressierungsmodi \= : \= \kill \\
  8808. Anweisung         \> : \> \tty{ARR} \\
  8809. Funktion          \> : \> $A\leftarrow((A)\&(M))>>>1$ \\
  8810. Adressierungsmodi \> : \> immediate \\
  8811. \end{tabbing}
  8812. \begin{tabbing}
  8813. Adressierungsmodi \= : \= \kill \\
  8814. Anweisung         \> : \> \tty{SAX} \\
  8815. Funktion          \> : \> $M\leftarrow(A)\&(X)$ \\
  8816. Adressierungsmodi \> : \> absolut lang/kurz, Y-indiziert kurz, \\
  8817.                  \>   \> Y-indirekt \\
  8818. \end{tabbing}
  8819. \begin{tabbing}
  8820. Adressierungsmodi \= : \= \kill \\
  8821. Anweisung         \> : \> \tty{ANE} \\
  8822. Funktion          \> : \> $M\leftarrow((A)\&\$ee)|((X)\&(M))$ \\
  8823. Adressierungsmodi \> : \> immediate \\
  8824. \end{tabbing}
  8825. \begin{tabbing}
  8826. Adressierungsmodi \= : \= \kill \\
  8827. Anweisung         \> : \> \tty{SHA} \\
  8828. Funktion          \> : \> $M\leftarrow(A)\&(X)\&(PCH+1)$ \\
  8829. Adressierungsmodi \> : \> X/Y-indiziert lang \\
  8830. \end{tabbing}
  8831. \begin{tabbing}
  8832. Adressierungsmodi \= : \= \kill \\
  8833. Anweisung         \> : \> \tty{SHS} \\
  8834. Funktion          \> : \> $X\leftarrow(A)\&(X), S\leftarrow(X), M\leftarrow(X)\&(PCH+1)$ \\
  8835. Adressierungsmodi \> : \> Y-indiziert lang \\
  8836. \end{tabbing}
  8837. \begin{tabbing}
  8838. Adressierungsmodi \= : \= \kill \\
  8839. Anweisung         \> : \> \tty{SHY} \\
  8840. Funktion          \> : \> $M\leftarrow(Y)\&(PCH+1)$ \\
  8841. Adressierungsmodi \> : \> Y-indiziert lang \\
  8842. \end{tabbing}
  8843. \begin{tabbing}
  8844. Adressierungsmodi \= : \= \kill \\
  8845. Anweisung         \> : \> \tty{SHX} \\
  8846. Funktion          \> : \> $M\leftarrow(X)\&(PCH+1)$ \\
  8847. Adressierungsmodi \> : \> X-indiziert lang \\
  8848. \end{tabbing}
  8849. \begin{tabbing}
  8850. Adressierungsmodi \= : \= \kill \\
  8851. Anweisung         \> : \> \tty{LAX} \\
  8852. Funktion          \> : \> $A,X\leftarrow(M)$ \\
  8853. Adressierungsmodi \> : \> absolut lang/kurz, Y-indiziert lang/kurz, \\
  8854.                  \>   \> X/Y-indirekt \\
  8855. \end{tabbing}
  8856. \begin{tabbing}
  8857. Adressierungsmodi \= : \= \kill \\
  8858. Anweisung         \> : \> \tty{LXA} \\
  8859. Funktion          \> : \> $X{04}\leftarrow(X){04} \& (M){04},$ \\
  8860.                  \>   \> $A{04}\leftarrow(A){04} \& (M){04}$ \\
  8861. Adressierungsmodi \> : \> immediate \\
  8862. \end{tabbing}
  8863. \begin{tabbing}
  8864. Adressierungsmodi \= : \= \kill \\
  8865. Anweisung         \> : \> \tty{LAE} \\
  8866. Funktion          \> : \> $X,S,A\leftarrow((S)\&(M))$ \\
  8867. Adressierungsmodi \> : \> Y-indiziert lang \\
  8868. \end{tabbing}
  8869. \begin{tabbing}
  8870. Adressierungsmodi \= : \= \kill \\
  8871. Anweisung         \> : \> \tty{DCP} \\
  8872. Funktion          \> : \> $M \leftarrow(M)-1, Flags\leftarrow((A)-(M))$ \\
  8873. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  8874.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  8875. \end{tabbing}
  8876. \begin{tabbing}
  8877. Adressierungsmodi \= : \= \kill \\
  8878. Anweisung         \> : \> \tty{SBX} \\
  8879. Funktion          \> : \> $X\leftarrow((X)\&(A))-(M)$ \\
  8880. Adressierungsmodi \> : \> immediate \\
  8881. \end{tabbing}
  8882. \begin{tabbing}
  8883. Adressierungsmodi \= : \= \kill \\
  8884. Anweisung         \> : \> \tty{ISB} \\
  8885. Funktion          \> : \> $M\leftarrow(M)+1, A\leftarrow(A)-(M)-(C)$ \\
  8886. Adressierungsmodi \> : \> absolut lang/kurz, X-indiziert lang/kurz, \\
  8887.                  \>   \> Y-indiziert lang, X/Y-indirekt \\
  8888. \end{tabbing}
  8889.  
  8890. %%---------------------------------------------------------------------------
  8891.  
  8892. \section{MELPS-740}
  8893.  
  8894. Die Mikrokontroller dieser Reihe haben ein sehr nettes, verstecktes
  8895. Feature: Setzt man mit dem Befehl \tty{SET} das Bit 5 des
  8896. Statusregisters, so wird bei allen arithmetischen Operationen (und
  8897. Ladebefehlen) der Akkumulator durch die durch das X-Register adressierte
  8898. Speicherzelle ersetzt.  Dieses Feature syntaxm"a"sig sauber zu integrieren,
  8899. ist bisher nicht geschehen, d.h. es kann bisher nur im ,,Handbetrieb''
  8900. (\tty{SET}...Befehle mit Akkuadressierung...\tty{CLT}) genutzt werden.
  8901. \par
  8902. Nicht alle MELPS-740-Prozessoren implementieren alle Befehle.  An dieser
  8903. Stelle mu"s der Programmierer aufpassen, da"s er nur die Befehle benutzt,
  8904. die auch wirklich vorhanden sind, da \asname{} die Prozessoren dieser Familie
  8905. nicht n"aher unterscheidet.  Die Besonderheiten der
  8906. Special-Page-Adressierung werden bei der Erkl"arung von \tty{ASSUME} n"aher
  8907. erl"autert.
  8908.  
  8909. %%---------------------------------------------------------------------------
  8910.  
  8911. \section{MELPS-7700/65816}
  8912. \label{MELPS7700Spec}
  8913.  
  8914. Offensichtlich haben diese beiden Prozessorfamilien ausgehend vom
  8915. 6502 ("uber ihre 8-bittigen Vorg"anger) etwas disjunkte Entwicklungswege
  8916. hinter sich.  Kurz aufgelistet, ergeben sich folgende Unterschiede:
  8917. \begin{itemize}
  8918. \item{der 65816 hat keinen B-Akkumulator.}
  8919. \item{beim 65816 fehlen Multiplikations- sowie Divisionsbefehle.}
  8920. \item{Die Befehle \tty{SEB}, \tty{CLB}, \tty{BBC}, \tty{BBS},
  8921.      \tty{CLM}, \tty{SEM}, \tty{PSH}, \tty{PUL} und \tty{LDM}
  8922.      fehlen beim 65816.  An deren Stelle in der Code-Tabelle finden
  8923.      sich \tty{TSB}, \tty{TRB}, \tty{BIT}, \tty{CLD}, \tty{SED},
  8924.      \tty{XBA}, \tty{XCE} und \tty{STZ}.}
  8925. \end{itemize}
  8926. Identische Funktion, jedoch andere Namen haben folgende Befehle:
  8927. \par
  8928. \begin{center}\begin{tabular}{|c|c||c|c|}
  8929. \hline
  8930.   65816  &  MELPS-7700 & 65816 & MELPS-7700 \\
  8931. \hline
  8932. \hline
  8933.    \tty{REP}   &    \tty{CLP}      & \tty{PHK}   &   \tty{PHG} \\
  8934.    \tty{TCS}   &    \tty{TAS}      & \tty{TSC}   &   \tty{TSA} \\
  8935.    \tty{TCD}   &    \tty{TAD}      & \tty{TDC}   &   \tty{TDA} \\
  8936.    \tty{PHB}   &    \tty{PHT}      & \tty{PLB}   &   \tty{PLT} \\
  8937.    \tty{WAI}   &    \tty{WIT}      &       &       \\
  8938. \hline
  8939. \end{tabular}\end{center}
  8940. \par
  8941. Besonders t"uckisch sind die Befehle \tty{PHB}, \tty{PLB} und \tty{TSB}:
  8942. diese Befehle haben jeweils eine v"ollig andere Funktion und Kodierung!
  8943. \par
  8944. Leider tun diese Prozessoren mit ihrem Speicher etwas, was f"ur mich
  8945. auf der nach oben offenen Perversit"atsskala noch vor der
  8946. Intel-m"a"sigen Segmentierung rangiert: sie banken ihn!
  8947. Nunja, dies ist wohl der Preis f"ur die 6502-Aufw"artskompatibilit"at;
  8948. wie dem auch sei, damit \asname{} den gew"unschten Code erzeugen kann, mu"s
  8949. man ihn "uber den \tty{ASSUME}-Befehl "uber den Inhalt einiger
  8950. Register in Kenntnis setzen:
  8951. \par
  8952. Das M-Flag bestimmt, ob die Akkumulatoren A und B 8 Bit (1) oder 16 Bit
  8953. (0) breit sein sollen.  Analog entscheidet das Flag X "uber die Breite
  8954. der Indexregister X und Y.  \asname{} ben"otigt die Information "uber die
  8955. Registerbreite bei unmittelbarer Adressierung (\tty{\#<Konstante>}), ob das
  8956. Argument 8 oder 16 Bit breit sein soll.
  8957. \par
  8958. Der Speicher ist in 256 B"anke zu 64 Kbyte geteilt.  Da alle Register
  8959. im Prozessor nur maximal 16 Bit breit sind, kommen die obersten 8
  8960. Adre"sbits aus 2 speziellen Bank-Registern: DT liefert die oberen 8
  8961. Bits bei Datenzugriffen, PG erweitert den 16-bittigen Programmz"ahler
  8962. auf 24 Bit.  Die vom 6502 her bekannte ,,Zero-Page'' ist mittels
  8963. des 16 Bit breiten Registers DPR frei innerhalb der ersten Bank
  8964. verschiebbar.  Trifft \asname{} nun im Code auf eine Adresse (egal ob in
  8965. einem absoluten, indizierten oder indirekten Ausdruck), so versucht
  8966. er der Reihe nach folgende Adressierungsvarianten:
  8967. \begin{enumerate}
  8968. \item{Liegt die Adresse im Bereich von DPR...DPR+\$ff?  Falls ja,
  8969.      Verwendung von direkter Adressierung mit 8-Bit-Adresse.}
  8970. \item{Liegt die Adresse innerhalb der durch DT (bzw. PG f"ur
  8971.      Sprungbefehle) festgelegten Seite?  Falls ja, Verwendung von
  8972.      absoluter Adressierung mit 16-Bit-Adresse.}
  8973. \item{Falls nichts anderes hilft, Verwendung von langer Adressierung
  8974.      mit 24-Bit-Adresse.}
  8975. \end{enumerate}
  8976. Aus dieser Aufz"ahlung folgt, da"s das Wissen "uber die momentanen
  8977. Werte von DT,PG und DPR f"ur die Funktion von \asname{} essentiell ist;
  8978. sind die Angaben fehlerhaft, adressiert das Programm ,,in die W"uste''.
  8979. Diese Aufz"ahlung geht "ubrigens davon aus, da"s alle drei
  8980. Adre"sl"angen verf"ugbar sind; sollte dies einmal nicht der Fall sein,
  8981. so wird die Entscheidungskette entsprechen k"urzer.
  8982. Die oben geschilderte, automatische Festlegung der Adre"sl"ange l"a"st
  8983. sich auch durch die Verwendung von Pr"afixen "ubersteuern.  Stellt
  8984. man der Adresse ein $<$, $>$ oder $>>$ ohne trennendes Leerzeichen voran,
  8985. so wird eine Adresse mit 1, 2 oder 3 Bytes benutzt, unabh"angig davon,
  8986. ob dies die optimale L"ange ist.  Benutzt man eine f"ur diesen Befehl
  8987. nicht erlaubte oder f"ur die Adresse zu kurze L"ange, gibt es eine
  8988. Fehlermeldung.
  8989. Um die Portierung von 6502-Programmen zu erleichtern, verwendet \asname{} f"ur
  8990. Hexadezimalkonstanten die Motorola-Syntax und nicht die von Mitsubishi
  8991. "ubrigens f"ur die 740er favorisierte Intel/IEEE-Schreibweise.
  8992. Ich halte erstere auch f"ur die bessere Schreibweise, und die Entwickler
  8993. des 65816 werden dies vermutlich "ahnlich gesehen haben (da man mittels
  8994. der \tty{RELAXED}-Anweisung auch Intel-Notation benutzen kann, wird durch
  8995. diese Entscheidung auch niemand festgelegt).  Ein f"ur die
  8996. Portierung "ahnlich wichtiges Detail ist, da"s der Akkumulator A als
  8997. Ziel von Operationen auch weggelassen werden darf, anstelle von
  8998. \tty{LDA A,\#0} darf also z.B. auch einfach \tty{LDA \#0} geschrieben
  8999. werden.
  9000. \par
  9001. Ein echtes Bonbon in dem Befehlssatz sind dagegen die Blocktransferbefehle
  9002. \tty{MVN} und \tty{MVP}.  Etwas eigenartig ist nur die Adre"sangabe:
  9003. Bit 0--15 im Indexregister, Bit 16--23 im Befehl.  Bei \asname{} gibt  man als
  9004. Argument f"ur beide Speicherbl"ocke einfach die vollen Adressen an, \asname{}
  9005. fischt sich dann die passenden Bits automatisch heraus.  Dies ist ein
  9006. feiner, aber wichtiger Unterschied zum Mitsubishi-Assembler, bei dem
  9007. man die oberen 8 Bit selber herausziehen mu"s.  Richtig bequem
  9008. wird es aber erst mit einem Makro im folgendem Stil:
  9009. \begin{verbatim}
  9010. mvpos   macro   src,dest,len
  9011.        if      MomCPU=$7700
  9012.         lda    #len
  9013.        elseif
  9014.         lda    #(len-1)
  9015.        endif
  9016.        ldx     #(src&$ffff)
  9017.        ldy     #(dest&$ffff)
  9018.        mvp     dest,src
  9019.        endm
  9020. \end{verbatim}
  9021. Vorsicht, Falle: Steht im Akkumulator die Zahl $n$, so transferiert
  9022. der Mitsubishi $n$ Bytes, der 65816 jedoch $n+1$ Bytes!
  9023. \par
  9024. Sehr nett sind auch die Befehle \tty{PSH} und \tty{PUL}, mit deren Hilfe es
  9025. m"oglich ist, mit einem Befehl einen frei w"ahlbaren Satz von Registern
  9026. auf dem Stack zu sichern oder von ihm zu laden.  Nach dem
  9027. Mitsubishi-Datenbuch\cite{Mit16} mu"s die Angabe der Bitmasken immediate
  9028. erfolgen, der Programmierer soll also entweder alle
  9029. Register$\leftrightarrow$Bitstellen-Zuordnungen im Kopf behalten oder
  9030. sich passende Symbole definieren.  Hier habe ich die Syntax eigenm"achtig
  9031. erweitert, um die Sache etwas angenehmer zu machen: Es darf eine Liste
  9032. angegeben werden, die sowohl immediate-Ausdr"ucke als auch Registernamen
  9033. enthalten darf.  Damit sind z.B. die Anweisungen
  9034. \begin{verbatim}
  9035.        psh     #$0f
  9036. \end{verbatim}
  9037. und
  9038. \begin{verbatim}
  9039.        psh     a,b,#$0c
  9040. \end{verbatim}
  9041. und
  9042. \begin{verbatim}
  9043.        psh     a,b,x,y
  9044. \end{verbatim}
  9045. "aquivalent.  Da die immediate-Version weiterhin erlaubt ist, bleibt
  9046. \asname{} hier ,,aufw"artskompatibel'' zu den Mitsubishi-Assemblern.
  9047. \par
  9048. Nicht ganz habe ich beim Mitsubishi-Assembler die Behandlung des
  9049. \tty{PER}-Befehles verstanden: Mit diesem Befehl kann man eine
  9050. 16-Bit-Variable auf den Stack legen, deren Adresse relativ zum
  9051. Programmz"ahler angegeben wird.  Es ist aus der Sicht des Programmierers
  9052. also eine absolute Adressierung einer Speicherzelle.  Nichtsdestotrotz
  9053. verlangt Mitsubishi eine immediate-Adressierung, und das Argument wird so
  9054. in den Code eingesetzt, wie es im Quelltext steht.  Die Differenz mu"s
  9055. man selber ausrechnen, was mit der Einf"uhrung von symbolischen Assemblern
  9056. ja abgeschafft werden sollte...da ich aber auch ein bi"schen ,,kompatibel''
  9057. denken mu"s, enth"alt \asname{} eine Kompromi"sl"osung: W"ahlt man
  9058. immediate-Adressierung (also mit Gartenzaun), so verh"alt sich \asname{} wie das
  9059. Original von Mitsubishi.  L"a"st man ihn jedoch weg, so berechnet \asname{} die
  9060. Differenz vom Argument zum momentanen Programmz"ahler und setzt diese
  9061. ein.
  9062. \par
  9063. "Ahnlich sieht es beim \tty{PEI}-Befehl aus, der den Inhalt einer
  9064. 16-Bit-Variablen auf der Zeropage auf den Stack legt:  Obwohl der Operand
  9065. eine Adresse ist, wird wieder immediate-Adressierung verlangt.  Hier
  9066. l"a"st \asname{} schlicht beide Versionen zu (d.h. mit oder ohne Gartenzaun).
  9067.  
  9068. %%---------------------------------------------------------------------------
  9069.  
  9070. \section{M16}
  9071.  
  9072. Die M16-Familie ist eine Familie "au"serst komplexer CISC-Prozessoren
  9073. mit einem entsprechend komplizierten Befehlssatz.  Zu den Eigenschaften
  9074. dieses Befehlssatzes geh"ort es unter anderem, da"s bei Operationen
  9075. mit zwei Operanden beide Operanden verschiedene L"angen haben d"urfen.
  9076. Die bei Motorola "ubliche und von Mitsubishi "ubernommene Methode, die
  9077. Operandengr"o"se als Attribut an den Befehl anzuh"angen, mu"ste daher
  9078. erweitert werden: Es ist erlaubt, auch an die Operanden selber Attribute
  9079. anzuh"angen.  So wird im folgenden Beispiel
  9080. \begin{verbatim}
  9081.        mov     r0.b,r6.w
  9082. \end{verbatim}
  9083. Register 0 8-bittig gelesen, auf 32 Bit vorzeichenerweitert und das
  9084. Ergebnis in Register 6 kopiert.  Da man in 9 von 10 F"allen aber von
  9085. diesen M"oglichkeiten doch keinen Gebrauch macht, kann man weiterhin
  9086. die Operandengr"o"se an den Befehl selber schreiben, z.B. so:
  9087. \begin{verbatim}
  9088.        mov.w   r0,r6
  9089. \end{verbatim}
  9090. Beide Varianten d"urfen auch gemischt verwendet werden, eine
  9091. Gr"o"senangabe am Operanden "ubersteuert dann den ,,Default'' am Befehl.
  9092. Eine Ausnahme stellen Befehle mit zwei Operanden dar.   Bei diesen ist
  9093. der Default f"ur den Quelloperanden die Gr"o"se des Zieloperanden. In
  9094. folgendem Beispiel
  9095. \begin{verbatim}
  9096.        mov.h   r0,r6.w
  9097. \end{verbatim}
  9098. wird also auf Register 0 32-bittig zugegriffen, die Gr"o"senangabe
  9099. am Befehl wird "uberhaupt nicht mehr benutzt.  Finden sich "uberhaupt
  9100. keine Angaben zur Operandengr"o"se, so wird Wort(w) verwendet.  Merke:
  9101. im Gegensatz zu den 68000ern bedeutet dies 32 und nicht 16 Bit!
  9102. \par
  9103. Reichlich kompliziert sind auch die verketteten Adressierungsmodi;
  9104. dadurch, da"s \asname{} die Verteilung auf Kettenelemente automatisch
  9105. vornimmt, bleibt die Sache aber einigerma"sen "ubersichtlich.  Die
  9106. einzige Eingriffsm"oglichkeit, die bei \asname{} gegeben ist (der Originalassembler
  9107. von Mitsubishi/Green Hills kann da noch etwas mehr), ist die explizite
  9108. Festlegung von Displacement-L"angen mittels der Anh"angsel \tty{:4},
  9109. \tty{:16} und \tty{:32}.
  9110.  
  9111. %%---------------------------------------------------------------------------
  9112.  
  9113. \section{CP-3F}
  9114.  
  9115. Der CP-3F wurde Anfang der 70er-Jahre entwickelt, wo auch die Entwicklungssysteme
  9116. deutlich weniger leistungsf"ahig waren und bei der Assembler-Syntax auch
  9117. auf die leichte Umsetzbarkeit im Maschinensprache geachtet wurde.  So
  9118. gruppieren sich die Original-Mnemonics in wenige Gruppen: Befehle mit
  9119. 3/4- oder 8-Bit-immediate-Argument, solche mit einem Registeroperanden,
  9120. Spr"unge und Befehle ganz ohne Argumente.  Das l"ast sich mit relativ wenig
  9121. Aufwand in Maschinencode "ubersetzen, der Lesbarkeit des Quellcodes
  9122. ist das aber eher abtr"aglich - "ahnlich wie beim Intel 8080.  Ich habe mich
  9123. deshalb entschlossen, f"ur die meisten Befehle eine alternative Schreibweise
  9124. anzubieten, die verst"andlicher ausdr"uckt, was der jeweilige Befehl
  9125. tut:
  9126.  
  9127. \begin{longtable}{|l|l|l|}
  9128. \hline
  9129. Original & Alternativ & Funktion \\
  9130. \hline
  9131. \hline
  9132. \endhead
  9133. \input{../doc_COM/cp3finst.tex}
  9134. \\ \hline
  9135. \caption{Alternative Befehlsschreibweisen f"ur CP-3F}
  9136. \label{CP3FInst}
  9137. \end{longtable}
  9138.  
  9139. %%---------------------------------------------------------------------------
  9140.  
  9141. \section{4004/4040}
  9142.  
  9143. John Weinrich sei dank, habe ich nun auch die offiziellen Datenbl"atter
  9144. von Intel "uber diese 'Urv"ater' aller Mikroprozessoren, und die
  9145. Unklarheiten "uber die Syntax von Registerpaaren (f"ur 8-Bit-Operationen)
  9146. sind f"urs erste ausger"aumt.  Die Syntax lautet \tty{RnRm}, wobei \tty{n}
  9147. bzw. \tty{m} gerade Integers im Bereich 0 bis E bzw. 1 bis F sind.  Dabei
  9148. gilt immer \tty{m = n + 1}.
  9149.  
  9150. %%---------------------------------------------------------------------------
  9151.  
  9152. \section{MCS-48}
  9153.  
  9154. Der maximale Adre"sraum dieser Prozessoren betr"agt 4 KByte, bzw. 8 KByte
  9155. bei einigen Philips-Varianten.  Dieser Raum ist jedoch nicht linear organisiert
  9156. (wie k"onnte das bei Intel auch anders sein...), sondern in 2 B"anke zu 2
  9157. Kbyte geteilt.  Ein Wechsel zwischen diesen beiden B"anken ist nur durch die
  9158. Befehle \tty{CALL} und \tty{JMP} erlaubt, indem vor dem Sprung das h"ochste
  9159. Adre"sbit mit den Befehlen \tty{SEL MB0} bis \tty{SEL MB3} vorgegeben wird.
  9160.  
  9161. Man kann dem Assembler mit einem
  9162. \begin{verbatim}
  9163.         ASSUME MB:<0..3>
  9164. \end{verbatim}
  9165. mitteilen, welche Speicherbank gerade f"ur Sprungziele gew"ahlt ist; wird auf
  9166. eine Adresse gesprungen, die au"serhalb dieser Bank liegt, wird eine Warnung
  9167. ausgegeben.
  9168.  
  9169. Wenn der Sonderwert {\tt NOTHING} angegeben wird (dies ist auch der Default),
  9170. so greift eine in den Befehlen \tty{JMP} und \tty{CALL} eingebaute Automatik ,
  9171. die den Wechsel zwischen den B"anken vereinfacht.  Sie f"ugt automatisch einen
  9172. {\tt SEL MBx} Befehl ein, falls die Adresse des Sprungbefehles und das
  9173. Sprungziel in unterschiedlichen B"anken liegen.  Die explizite Benutzung der
  9174. \tty{SEL MBx}-Befehle ist dann nicht mehr notwendig (obwohl sie m"oglich
  9175. bleibt) und kann die Automatik auch durcheinanderbringen, wie in dem folgenden
  9176. Beispiel:
  9177. \begin{verbatim}
  9178. 000:    SEL     MB1
  9179.         JMP     200h
  9180. \end{verbatim}
  9181. \asname{} nimmt an, da"s das MB-Flag auf 0 steht und f"ugt keinen
  9182. \tty{SEL MB0}-Befehl vor dem Sprung ein, mit der Folge, da"s der
  9183. Prozessor zur Adresse A00h springt.
  9184. Weiterhin ist zu beachten, da"s ein Sprungbefehl durch diesen Mechanismus
  9185. unter Umst"anden ein Byte l"anger wird.
  9186.  
  9187. %%---------------------------------------------------------------------------
  9188.  
  9189. \section{MCS-51}
  9190.  
  9191. Dem Assembler liegen die Dateien STDDEF51.INC bzw. 80C50X.INC bei, in
  9192. denen alle Bits und SFRs der Prozessoren 8051, 8052 und 80515 bzw. 80C501,
  9193. 502 und 504 verzeichnet sind.  Je nach Einstellung des Prozessortyps mit
  9194. dem \tty{CPU}-Befehl wird dabei die korrekte Untermenge eingebunden, die
  9195. richtige Reihenfolge f"ur den Anfang eines Programms ist daher
  9196. \begin{verbatim}
  9197.         CPU     <Prozessortyp>
  9198.         INCLUDE stddef51.inc   ,
  9199. \end{verbatim}
  9200. sonst f"uhren die MCS-51-Pseudobefehle in der Include-Datei zu
  9201. Fehlermeldungen.
  9202. \par
  9203. Da der 8051 keinen Befehl kennt, um die Register 0..7 auf den Stack zu
  9204. legen, mu"s mit deren absoluten Adressen gearbeitet werden.  Diese
  9205. h"angen aber von der momentan aktiven Registerbank ab.  Um diesem Mi"sstand
  9206. etwas abzuhelfen, ist in den Include-Dateien das Makro \tty{USING} definiert,
  9207. dem als Parameter die Symbole \tty{Bank0..Bank3} gegeben werden k"onnen.
  9208. Das Makro belegt daraufhin die Symbole \tty{AR0..AR7} mit den passenden
  9209. absoluten Adressen der Register.  Dieses Makro sollte nach jeder
  9210. Bankumschaltung benutzt werden.  Es erzeugt selber \ii{keinen} Code zur
  9211. Umschaltung!
  9212. \par
  9213. Das Makro f"uhrt in der Variablen \tty{RegUsage} gleichzeitig Buch "uber
  9214. alle jemals benutzten Registerb"anke; Bit 0 entspricht Bank 0, Bit 1 der
  9215. Bank 1 usw. .  Der Inhalt kann am Ende der Quelldatei z.B. mit folgendem
  9216. Codest"uck ausgegeben werden:
  9217. \begin{verbatim}
  9218.         irp     BANK,Bank0,Bank1,Bank2,Bank3
  9219.          if      (RegUsage&(2^BANK))<>0
  9220.           message "Bank \{BANK} benutzt"
  9221.          endif
  9222.         endm
  9223. \end{verbatim}
  9224. Mit der Mehrpass-F"ahigkeit ab Version 1.38 wurde es m"oglich, zus"atzlich
  9225. die Befehle \tty{JMP} und \tty{CALL} einzuf"uhren.  Bei der Kodierung
  9226. von Spr"ungen mit diesen Befehlen w"ahlt \asname{} je nach Adre"slage automatisch
  9227. die optimale Variante, d.h. \tty{SJMP/AJMP/LJMP} f"ur \tty{JMP} und
  9228. \tty{ACALL/LCALL} f"ur \tty{CALL}.  Es ist nat"urlich weiterhin m"oglich,
  9229. die Varianten direkt zu verwenden, um eine bestimmte Kodierung zu erzwingen.
  9230.  
  9231. %%---------------------------------------------------------------------------
  9232.  
  9233. \section{MCS-251}
  9234.  
  9235. Intel hat sich beim 80C251 ja bem"uht, den "Ubergang f"ur den Programmierer
  9236. auf die neue Familie so weich wie m"oglich zu gestalten, was darin gipfelt,
  9237. da"s alte Anwendungen ohne Neu"ubersetzung auf dem neuen Prozessor ablaufen
  9238. k"onnen.  Sobald man jedoch den erweiterten Befehlssatz der 80C251 nutzen
  9239. will, gilt es, einige Details zu beachten, die sich als versteckte
  9240. Fu"sangeln auftun.
  9241. \par
  9242. An vorderster Stelle steht dabei die Tatsache, da"s der 80C251 keinen
  9243. getrennten Bitadre"sraum mehr hat.  Es sind nunmehr alle SFRs unabh"angig
  9244. von ihrer Adre"slage sowie die ersten 128 Speicherstellen des internen
  9245. RAMs bitadressierbar.  M"oglich wird dies dadurch, da"s die Bitadressierung
  9246. nicht mehr "uber einen zus"atzlichen virtuellen Adre"sraum, der andere
  9247. Adre"sr"aume "uberdeckt, erfolgt, sondern so wie bei anderen Prozessoren
  9248. auch durch eine zweidimensionale Adressierung, die aus der Speicherstelle,
  9249. die das Bit beinhaltet sowie der Bitstelle im Byte besteht.  Dies bedeutet
  9250. zum einen, da"s bei einer Bitangabe wie z.B. PSW.7 \asname{} die Zerlegung der
  9251. Teile links und rechts vom Punkt selber vornimmt.  Es ist also nicht mehr
  9252. n"otig, mittels eines \tty{SFRB}-Befehls wie noch beim 8051 explizit 8
  9253. Bitsymbole zu erzeugen.  Dies bedeutet zum anderen, da"s es den
  9254. \tty{SFRB}-Befehl "uberhaupt nicht mehr gibt.  Wird er in zu portierenden
  9255. 8051-Programmen benutzt, kann er durch einen einfachen \tty{SFR}-Befehl
  9256. ersetzt werden.
  9257. \par
  9258. Weiterhin hat Intel in den unterschiedlichen Adre"sr"aumen des 8051
  9259. geh"orig aufger"aumt: Der Bereich des internen RAMs (\tty{DATA} bzw.
  9260. \tty{IDATA}), der \tty{XDATA}-Bereich und er bisherige \tty{CODE}-Bereich
  9261. wurden in einem einzigen, 16 Mbyte gro"sen \tty{CODE}-Bereich vereinigt.
  9262. Das interne RAM beginnt bei Adresse 0, das interne ROM beginnt bei
  9263. Adresse ff0000h, dorthin mu"s also auch der Code mittels \tty{ORG}
  9264. hinverlagert werden.  Ausgelagert wurden dagegen die \tty{SFRs} in einen
  9265. eigenen Adre"sraum (der bei \asname{} als \tty{IO}-Segment definiert ist).  In
  9266. diesem neuen Adre"sraum haben sie aber die gleichen Adressen wie beim 8051.
  9267. Der \tty{SFR}-Befehl kennt diesen Unterschied und legt mit ihm erzeugte
  9268. Symbole je nach Zielprozessor automatisch ins \tty{DATA}- bzw.
  9269. \tty{IO}-Segment.  Da es keinen Bit-Adre"sraum mehr gibt, funktioniert der
  9270. \tty{BIT}-Befehl v"ollig anders: anstelle einer linearen Adresse von 0 bis
  9271. 255 beinhalten Bit-Symbole jetzt in Bit 0..7 die Adresse, in Bit 24..26
  9272. die Bitstelle.  Damit ist es jetzt leider nicht mehr so einfach m"oglich,
  9273. Felder von Flags mit symbolischen Namen anzulegen: Wo man beim 8051 noch
  9274. z.B.
  9275. \begin{verbatim}
  9276.        segment bitdata
  9277.  
  9278. bit1    db      ?
  9279. bit2    db      ?
  9280. \end{verbatim}
  9281. oder
  9282. \begin{verbatim}
  9283. defbit  macro   name
  9284. name    bit     cnt
  9285. cnt     set     cnt+1
  9286.        endm
  9287. \end{verbatim}
  9288. schreiben konnte, hilft jetzt nur noch die zweite Variante weiter, z.B.
  9289. so:
  9290. \begin{verbatim}
  9291. adr     set     20h     ; Startadresse Flags im internen RAM
  9292. bpos    set     0
  9293.  
  9294. defbit  macro   name
  9295. name    bit     adr.bpos
  9296. bpos    set     bpos+1
  9297.        if      bpos=8
  9298. bpos     set     0
  9299. adr      set     adr+1
  9300.        endif
  9301.        endm
  9302. \end{verbatim}
  9303. Ein weiteres, kleines Detail: Da Intel als Kennzeichnung f"ur den Carry
  9304. nun CY statt C bevorzugt, sollte man ein eventuell benutztes Symbol
  9305. umbenennen.  \asname{} versteht aber auch weiterhin die alte Variante in den
  9306. Befehlen \tty{CLR, CPL, SETB, MOV, ANL,} und \tty{ORL}.  Gleiches gilt
  9307. sinngem"a"s f"ur die dazugekommenen Register \tty{R8..R15, WR0..WR30,
  9308. DR0..DR28, DR56, DR60, DPX} und \tty{SPX}.
  9309. \par
  9310. Intel m"ochte es gerne, da"s man absolute Adressen in der Form \tty{XX:YYYY}
  9311. schreibt, wobei \tty{XX} eine 64K-Bank im Adre"sraum angibt bzw. mit einem
  9312. \tty{S} Adressen im IO-Raum kennzeichnet.  Wie man sich schon denken kann,
  9313. halte ich davon nicht allzu viel, weshalb man an allen Stellen Adressen
  9314. genauso gut linear angeben kann; lediglich um das S f"ur die Kennzeichnung
  9315. von I/O-Adressen kommt man nicht herum, z.B. hier:
  9316. \begin{verbatim}
  9317. Carry   bit   s:0d0h.7
  9318. \end{verbatim}
  9319. Ohne den Pr"afix w"urde \asname{} die absolute Adresse in das Code-Segment
  9320. legen, und dort sind ja nur die ersten 128 Byte bitadressierbar...
  9321. \par
  9322. Wie auch schon beim 8051 gibt es die generischen Befehle \tty{JMP} und
  9323. \tty{CALL}, die je nach Adre"slage automatisch die k"urzeste Variante
  9324. einsetzen.  W"ahrend \tty{JMP} aber die Variante mit 24 Bit mitber"ucksichtigt,
  9325. tut \tty{CALL} dies aus gutem Grund nicht: Der \tty{ECALL}-Befehl legt
  9326. n"amlich im Gegensatz zu \tty{ACALL} und \tty{LCALL} 3 Bytes auf den
  9327. Stack, und man h"atte sonst einen \tty{CALL}-Befehl, bei dem man nicht
  9328. mehr genau wei"s, was er tut.  Bei \tty{JMP} tritt diese Problem nicht auf.
  9329. \par
  9330. Aus einer Sache bin ich nicht ganz schlau geworden: Der 80251 kann
  9331. auch immediate-Operanden auf den Stack legen, und zwar sowohl einzelne
  9332. Bytes als auch ganze W"orter.  F"ur beide Varianten ist aber der gleiche
  9333. Befehl \tty{PUSH} vorgesehen -- und woher soll bitte ein Assembler bei
  9334. einer Anweisung wie
  9335. \begin{verbatim}
  9336.        push #10
  9337. \end{verbatim}
  9338. wissen, ob ein Byte oder ein Wort mit dem Wert 10 auf den Stack gelegt
  9339. werden soll?  Daher gilt im Augenblick die Regelung, da"s \tty{PUSH}
  9340. grunds"atzlich ein Byte ablegt; wer ein Wort ablegen will, schreibt
  9341. einfach \tty{PUSHW} anstelle \tty{PUSH}.
  9342. \par
  9343. Noch ein gut gemeinter Ratschlag: Wer den erweiterten Befehlssatz des
  9344. 80C251 nutzt, sollte den Prozessor auch tunlichst im Source-Modus
  9345. betreiben, sonst werden alle neuen Anweisungen ein Byte l"anger!  Um
  9346. die origin"aren 8051-Anweisungen, die daf"ur im Source-Modus l"anger
  9347. werden, ist es nicht besonders schade: Sie werden entweder von \asname{}
  9348. automatisch durch neue, leistungsf"ahigere ersetzt oder sind be-
  9349. treffen veraltete Adressierungsarten (indirekte Adressierung mit
  9350. 8-Bit-Registern).
  9351.  
  9352. %%---------------------------------------------------------------------------
  9353.  
  9354. \section{8080/8085}
  9355. \label{8080Spec}
  9356.  
  9357. Wie schon weiter vorne erw"ahnt, ist es m"oglich, durch ein
  9358. \begin{verbatim}
  9359.       Z80SYNTAX <OFF|ON|EXCLUSIVE>
  9360. \end{verbatim}
  9361. f"ur die allermeisten 8080/8085-Befehle m"oglich, sie auch wahlweise
  9362. oder ausschlie"slich im 'Z80-Stil' zu schreiben, d.h. mit weniger
  9363. Mnemonics, daf"ur aber mit deutlich aussagekr"aftigeren Operanden.
  9364. F"ur die folgenden Befehle ist die Z80-Syntax im nicht-exklusiven Modus
  9365. nicht m"oglich, da sie mit existierenden 8080-Mnemonics kollidieren:
  9366. \begin{itemize}
  9367. \item{\tty{CP} ist in der 'Intel-Syntax' der Befehl f"ur 'Call on
  9368.      Positive', in der Zilog-Syntax jedoch der Befehl f"ur
  9369.      'Compare'.  Verwendet man \tty{CP} mit einem absoluten
  9370.      Zahlenwert als Argument, so ist f"ur den Assembler nicht zu
  9371.      erkennen, ob das ein Sprung zu einer absoluten Adresse sein
  9372.      soll oder ein Vergleich mit einem immediate-Wert.  Der
  9373.      Assembler wird in so einem Fall einen Sprung kodieren, da
  9374.      die Intel-Syntax bei Mehrdeutigkeiten Vorrang hat.  M"ochte
  9375.      man den Vergleich haben, so kann man den Akkumulator als
  9376.      Zieloperanden explizit hinschreiben, also z.B. \tty{CP A,12h}
  9377.      anstatt \tty{CP 12h}.}
  9378. \item{\tty{JP} ist in der Intel-Syntax der Befehl f"ur 'Jump on
  9379.      Positive', in der Zilog-Syntax jedoch der allgemeine
  9380.      Sprung-Befehl.  F"ur bedingte Spr"unge in Zilog-Syntax (\tty{JP
  9381.      cond,addr}) ist die Sache wegen der zwei Argumente eindeutig,
  9382.      bei nur einem Argument wird der Assembler aber den bedingten
  9383.      Sprung kodieren.  Wer einen unbedingten Sprung zu einer
  9384.      absoluten Adresse haben m"ochte, mu"s weiterhin die
  9385.      Intel-Variante (\tty{JMP addr}) verwenden.}
  9386. \end{itemize}
  9387. Der 8085 unterst"utzt mit \tty{RIM} und \tty{SIM} zwei Befehle, die
  9388. im Z80-Befehlssatz nicht existieren.  Diese k"onnen ''Z80-artig'' als
  9389. \tty{LD A,IM} bzw. \tty{LD IM,A} geschrieben werden.
  9390.  
  9391. %%---------------------------------------------------------------------------
  9392.  
  9393. \section{8085UNDOC}
  9394. \label{8085Spec}
  9395.  
  9396. "Ahnlich wie beim Z80 oder 6502, sind auch beim 8085 die undokumentierten
  9397. Befehle nicht n"aher von Intel spezifiziert worden, weshalb es nicht
  9398. undenkbar ist, da"s andere Assembler andere Mnemonics daf"ur verwenden.
  9399. Deshalb sollen auch diese Befehle und ihre Funktion hier kurz aufgelistet
  9400. werden.  Und auch hier wieder ist die Verwendung dieser Befehle auf
  9401. eigenes Risiko - schon der an sich zum 8085 aufw"artskompatible Z80
  9402. benutzt diese Opcodes f"ur v"ollig andere Funktionen...
  9403.  
  9404. \begin{tabbing}
  9405. Argumente         \= : \= \kill \\
  9406. Anweisung         \> : \> \tty{DSUB [reg]} \\
  9407. Z80-Syntax        \> : \> \tty{SUB HL,reg} \\
  9408. Funktion          \> : \> HL $\leftarrow$ HL - reg \\
  9409. Flags             \> : \> CY, S, X5, AC, Z, V, P \\
  9410. Argumente         \> : \> \tty{reg} = B f"ur BC (optional f"ur nicht-Z80-Syntax) \\
  9411. \end{tabbing}
  9412.  
  9413. \begin{tabbing}
  9414. Argumente         \= : \= \kill \\
  9415. Anweisung         \> : \> \tty{ARHL} \\
  9416. Z80-Syntax        \> : \> \tty{SRA HL} \\
  9417. Funktion          \> : \> HL,CY $\leftarrow$ HL $>>$ 1 (arithmetisch) \\
  9418. Flags             \> : \> CY \\
  9419. Argumente         \> : \> keine bzw. fix f"ur Z80-Syntax \\
  9420. \end{tabbing}
  9421.  
  9422. \begin{tabbing}
  9423. Argumente         \= : \= \kill \\
  9424. Anweisung         \> : \> \tty{RDEL} \\
  9425. Z80-Syntax        \> : \> \tty{RLC DE} \\
  9426. Funktion          \> : \> CY,DE $\leftarrow$ DE $<<$ 1 \\
  9427. Flags             \> : \> CY, V \\
  9428. Argumente         \> : \> keine bzw. fix f"ur Z80-Syntax \\
  9429. \end{tabbing}
  9430.  
  9431. \begin{tabbing}
  9432. Argumente         \= : \= \kill \\
  9433. Anweisung         \> : \> \tty{LDHI d8} \\
  9434. Z80-Syntax        \> : \> \tty{ADD DE,HL,d8} \\
  9435. Funktion          \> : \> DE $\leftarrow$ HL + {\tt d8} \\
  9436. Flags             \> : \> keine \\
  9437. Argumente         \> : \> {\tt d8} = 8-Bit-Konstante, Register fix f"ur Z80-Syntax \\
  9438. \end{tabbing}
  9439.  
  9440. \begin{tabbing}
  9441. Argumente         \= : \= \kill \\
  9442. Anweisung         \> : \> \tty{LDSI d8} \\
  9443. Z80-Syntax        \> : \> \tty{ADD DE,SP,d8} \\
  9444. Funktion          \> : \> DE $\leftarrow$ SP + {\tt d8} \\
  9445. Flags             \> : \> keine \\
  9446. Argumente         \> : \> {\tt d8} = 8-Bit-Konstante, Register fix f"ur Z80-Syntax \\
  9447. \end{tabbing}
  9448.  
  9449. \begin{tabbing}
  9450. Argumente         \= : \= \kill \\
  9451. Anweisung         \> : \> \tty{RSTflag} \\
  9452. Z80-Syntax        \> : \> \tty{RST flag} \\
  9453. Funktion          \> : \> Restart zu 40h wenn {\tt flag}=1 \\
  9454. Flags             \> : \> keine \\
  9455. Argumente         \> : \> {\tt flag} = V f"ur Overflow-Bit \\
  9456. \end{tabbing}
  9457.  
  9458. \begin{tabbing}
  9459. Argumente         \= : \= \kill \\
  9460. Anweisung         \> : \> \tty{SHLX [reg]} \\
  9461. Z80-Syntax        \> : \> \tty{LD (reg),HL} \\
  9462. Funktion          \> : \> [reg] $\leftarrow$ HL \\
  9463. Flags             \> : \> keine \\
  9464. Argumente         \> : \> \tty{reg} = D/DE f"ur DE (optional f"ur nicht-Z80-Syntax) \\
  9465. \end{tabbing}
  9466.  
  9467. \begin{tabbing}
  9468. Argumente         \= : \= \kill \\
  9469. Anweisung         \> : \> \tty{LHLX [reg]} \\
  9470. Z80-Syntax        \> : \> \tty{LD HL,(reg)} \\
  9471. Funktion          \> : \> HL $\leftarrow$[reg] \\
  9472. Flags             \> : \> keine \\
  9473. Argumente         \> : \> \tty{reg} = D/DE f"ur DE (optional f"ur nicht-Z80-Syntax) \\
  9474. \end{tabbing}
  9475.  
  9476. \begin{tabbing}
  9477. Argumente         \= : \= \kill \\
  9478. Anweisung         \> : \> \tty{JNX5 adr} \\
  9479. Z80-Syntax        \> : \> \tty{JP NX5, adr} \\
  9480. Funktion          \> : \> springe zu {\tt adr} wenn X5=0 \\
  9481. Flags             \> : \> keine \\
  9482. Argumente         \> : \> {\tt adr} = absolute 16-Bit-Adresse \\
  9483. \end{tabbing}
  9484.  
  9485. \begin{tabbing}
  9486. Argumente         \= : \= \kill \\
  9487. Anweisung         \> : \> \tty{JX5 adr} \\
  9488. Funktion          \> : \> springe zu {\tt adr} wenn X5=1 \\
  9489. Flags             \> : \> keine \\
  9490. Argumente         \> : \> {\tt adr} = absolute 16-Bit-Adresse \\
  9491. \end{tabbing}
  9492.  
  9493. Mit X5 ist dabei das ansonsten unbenutzte Bit 5 im PSW-Register gemeint.
  9494.  
  9495. %%---------------------------------------------------------------------------
  9496.  
  9497. \section{8086..V35}
  9498.  
  9499. Eigentlich hatte ich mir geschworen, die Segmentseuche der 8086er aus diesem
  9500. Assembler herauszuhalten.  Da aber nun eine Nachfrage kam und Studenten
  9501. flexiblere Menschen als die Entwickler dieses Prozessors sind, findet sich
  9502. ab sofort auch eine rudiment"are Unterst"utzung dieser Prozessoren in \asname{}.
  9503. Unter ,,rudiment"ar'' verstehe ich dabei nicht, da"s der Befehlssatz nicht
  9504. vollst"andig abgedeckt wird, sondern da"s ich nicht den ganzen Wust an
  9505. Pseudoanweisungen integriert habe, die sich bei MASM, TASM \& Co. finden.
  9506. \asname{} ist auch nicht in erster Linie geschrieben worden, um PC-Programme zu
  9507. entwickeln (Gott bewahre, das hie"se wirklich, das Rad neu zu erfinden),
  9508. sondern zur Programmentwicklung f"ur Einplatinenrechner, die eben unter
  9509. anderem auch mit 8086ern best"uckt sein k"onnen.
  9510. \par
  9511. F"ur Unentwegte, die mit \asname{} doch DOS-Programme schreiben wollen, eine kleine
  9512. Liste dessen, was zu beachten ist:
  9513. \begin{itemize}
  9514. \item{Es k"onnen nur COM-Programme erzeugt werden.}
  9515. \item{Verwenden Sie nur das \tty{CODE}-Segment, und legen Sie auch alle
  9516.      Variablen darin ab.}
  9517. \item{Alle Segmentregister werden von DOS auf das Codesegment
  9518.      vorinitialisiert.  Ein \tty{ASSUME DS:CODE, SS:CODE} am
  9519.      Programmanfang ist daher notwendig.}
  9520. \item{DOS l"adt den Code ab Adresse 100h.  Ein \tty{ORG} auf diese
  9521.      Adresse ist daher zwingend.}
  9522. \item{Die Umwandlung in eine Bin"ardatei erfolgt mit P2BIN (s.u.), wobei als
  9523.      als Adre"sbereich \tty{\$-\$} anzugeben ist.}
  9524. \end{itemize}
  9525. Allgemein unterst"utzt \asname{} f"ur diese Prozessoren nur ein Small-Programmiermodell, d.h.
  9526. \ii{ein} Codesegment mit maximal 64 KByte und ein ebenfalls h"ochstens 64
  9527. KByte gro"ses Datensegment mit (f"ur COM-Dateien uninitialisierten) Daten.
  9528. Zwischen diesen beiden Segmenten kann mit dem \tty{SEGMENT}-Befehl hin-und hergeschaltet werden.
  9529. Aus dieser Tatsache folgert, da"s Spr"unge immer intrasegment"ar sind,
  9530. sofern sie sich auf Adressen im Codesegment beziehen.  Falls weite Spr"unge
  9531. doch einmal erforderlich sein sollten, k"onnen sie mit \tty{CALLF} und
  9532. \tty{JMPF} und einer Speicheradresse oder einen Segment:Offset-Wert als
  9533. Argument erreicht werden.
  9534. \par
  9535. Ein weiteres gro"ses Problem dieser Prozessoren ist deren Assemblersyntax,
  9536. deren genaue Bedeutung nur aus dem Zusammenhang erkennbar ist.  So kann im
  9537. folgenden Beispiel je nach Symboltyp sowohl unmittelbare als auch absolute
  9538. Adressierung gemeint sein:
  9539. \begin{verbatim}
  9540.        mov     ax,wert
  9541. \end{verbatim}
  9542. Bei \asname{} ist immer unmittelbare Adressierung gemeint, wenn um den Operanden
  9543. keine eckigen Klammern stehen.  Soll z.B. die Adresse oder der Inhalt einer
  9544. Variablen geladen werden, so ergeben sich die in Tabelle \ref{TabMASM}
  9545. aufgelisteten Unterschiede.
  9546. \begin{table*}
  9547. \begin{center}\begin{tabular}{|l|l|l|}
  9548. \hline
  9549. Assembler  & Adresse                  & Inhalt                 \\
  9550. \hline
  9551. \hline
  9552. MASM       & \tty{mov ax,offset vari} & \tty{mov ax,vari}      \\
  9553.           & \tty{lea ax,vari}        & \tty{mov ax,[vari]}    \\
  9554.           & \tty{lea ax,[vari]}      &                        \\
  9555.           &                          &                        \\
  9556. \asname{}         & \tty{mov ax,vari}        & \tty{mov ax,[vari]}    \\
  9557.           & \tty{lea ax,[vari]}      &                        \\
  9558.           &                          &                        \\
  9559. \hline
  9560. \end{tabular}\end{center}
  9561. \caption{Unterschiede in der Adressierungssyntax \asname{}$\leftrightarrow$MASM\label{TabMASM}}
  9562. \normalsize
  9563. \end{table*}
  9564. \par
  9565. Der Assembler pr"uft bei Symbolen, ob sie im Datensegment liegen und
  9566. versucht, automatisch einen passenden Segmentpr"afix einzuf"ugen, z.B.
  9567. falls ohne CS-Pr"afix auf Symbole im Code zugegriffen wird.  Dieser
  9568. Mechanismus kann jedoch nur funktionieren, falls der \tty{ASSUME}-Befehl
  9569. (siehe dort) korrekt angewendet wurde.
  9570. \par
  9571. Die Intel-Syntax verlangt eine Abspeicherung, ob an einem Symbol Bytes oder
  9572. W"orter abgelegt wurden.  \asname{} nimmt diese Typisierung nur vor, falls in der
  9573. gleichen Zeile wie das Label ein \tty{DB} oder \tty{DW} steht.  F"ur alle anderen F"alle
  9574. mu"s mit den Operatoren \tty{WORD PTR, BYTE PTR} usw. explizit angegeben werden,
  9575. um was f"ur eine Operandengr"o"se es sich handelt.  Solange ein Register an der
  9576. Operation beteiligt ist, kann auf diese Kennzeichnung verzichtet werden, da
  9577. durch den Registernamen die Operandengr"o"se eindeutig bestimmt ist.
  9578. \par
  9579. Der Koprozessor in 8086-Systemen wird "ublicherweise durch den TEST-Eingang
  9580. des Prozessors synchronisiert, indem selbiger mit dem BUSY-Ausgang des
  9581. Koprozessors verbunden wird.  \asname{} unterst"utzt dieses Handshaking, indem
  9582. vor jedem 8087-Befehl automatisch ein \tty{WAIT}-Befehl eingef"ugt wird.  Ist
  9583. dies aus irgendwelchen Gr"unden unerw"unscht (z.B. w"ahrend der
  9584. Initialisierung), so mu"s im Opcode hinter dem \tty{F} ein \tty{N} eingef"ugt
  9585. werden; aus
  9586. \begin{verbatim}
  9587.        FINIT
  9588.        FSTSW   [vari]
  9589. \end{verbatim}
  9590. wird so z.B.
  9591. \begin{verbatim}
  9592.        FNINIT
  9593.        FNSTSW  [vari]
  9594. \end{verbatim}
  9595. Diese Variante ist bei \ii{allen} Koprozessorbefehlen erlaubt.
  9596.  
  9597. %%---------------------------------------------------------------------------
  9598.  
  9599. \section{8X30x}
  9600. \label{8X30xSpec}
  9601.  
  9602. Die Prozessoren dieser Reihe sind auf eine einfache Manipulation von
  9603. Bitgruppen auf Peripherieadressen optimiert worden.  Um mit solchen
  9604. Bitgruppen auch symbolisch umgehen zu k"onnen, existieren die Befehle
  9605. \tty{LIV} und \tty{RIV}, mit denen einer solchen Bitgruppe ein
  9606. symbolischer Name zugewiesen wird.  Diese Befehle arbeiten "ahnlich
  9607. wie \tty{EQU}, ben"otigen aber drei Parameter:
  9608. \begin{enumerate}
  9609. \item{die Adresse der peripheren Speicherzelle, in der sich die
  9610.      Bitgruppe befindet (0..255);}
  9611. \item{die Bitnummer des ersten Bits in der Gruppe (0..7);}
  9612. \item{die L"ange der Gruppe in Bits (1..8).}
  9613. \end{enumerate}
  9614. \bb{ACHTUNG!}  Der 8X30x unterst"utzt keine Bitgruppen, die "uber mehrere
  9615. Speicherstellen hinausreichen, so da"s je nach Startposition der
  9616. Wertebereich f"ur die L"ange eingeschr"ankt sein kann.  \asname{} nimmt hier
  9617. \bb{keine} Pr"ufung vor, man bekommt lediglich zur Laufzeit merkw"urdige
  9618. Ergebnisse!
  9619.  
  9620. Im Maschinencode dr"ucken sich L"ange und Position durch ein 3-Bit-Feld
  9621. im Instruktionswort sowie ein passende Registernummer (\tty{LIVx} bzw.
  9622. \tty{RIVx}) aus.  Bei der Verwendung eines symbolischen Objektes wird \asname{}
  9623. diese Felder automatisch richtig besetzen, es ist aber auch erlaubt,
  9624. die L"ange als dritten Operanden explizit anzugeben, wenn man nicht
  9625. mit symbolischen Busobjekten arbeitet.  Trifft \asname{} auf eine L"angenangabe
  9626. trotz eines symbolischen Operanden, so vergleicht er beide L"angen
  9627. und gibt eine Fehlermeldung bei Ungleichheit aus (das gleiche passiert
  9628. "ubrigens auch, wenn man bei einem \tty{MOVE}-Befehl zwei symbolische
  9629. Operanden mit unterschiedlicher L"ange benutzt - die Instruktion hat
  9630. einfach nur ein L"angenfeld...).
  9631.  
  9632. Neben den eigentlichen Maschinenbefehlen des 8X30x implementiert \asname{}
  9633. noch "ahnlich wie das ,,Vorbild'' MCCAP einige Pseudoinstruktionen, die
  9634. als eingebaute Makros ausgef"uhrt sind:
  9635. \begin{itemize}
  9636. \item{\tty{NOP} ist eine Kurzschreibweise f"ur \tty{MOVE AUX,AUX}}
  9637. \item{\tty{HALT} ist eine Kurzschreibweise f"ur {\tt JMP \verb!*!}}
  9638. \item{\tty{XML ii} ist eine Kurzschreibweise f"ur \tty{XMIT ii,R12} (nur
  9639.      8X305)}
  9640. \item{\tty{XMR ii} ist eine Kurzschreibweise f"ur \tty{XMIT ii,R13} (nur
  9641.      8X305)}
  9642. \item{\tty{SEL $<$busobj$>$} ist eine Kurzschreibweise f"ur
  9643.      \tty{XMIT $<$adr$>$,IVL/IVR}, f"uhrt also die notwendige Vorselektion
  9644.      durch, um \tty{$<$busobj$>$} ansprechen zu k"onnen.}
  9645. \end{itemize}
  9646. Die bei MCCAP ebenfalls noch vorhandenen \tty{CALL-} und
  9647. \tty{RTN-}Instruktionen sind mangels ausreichender Dokumentation momentan
  9648. nicht implementiert. Das gleiche gilt f"ur einen Satz an
  9649. Pseudoinstruktionen zur Datenablage. Kommt Zeit, kommt Rat...
  9650.  
  9651. %%---------------------------------------------------------------------------
  9652.  
  9653. \section{XA}
  9654.  
  9655. "Ahnlich wie sein Vorg"anger MCS/51, jedoch im Unterschied zu seinem
  9656. ,,Konkurrenten'' MCS/251 besitzt der Philips XA einen getrennten Bitadre"sraum,
  9657. d.h. alle mit Bitbefehlen manipulierbaren Bits haben eine
  9658. bestimmte, eindimensionale Adresse, die in den Maschinenbefehlen auch
  9659. so abgelegt wird.  Die naheliegende M"oglichkeit, diesen dritten
  9660. Adre"sraum (neben Code und Daten) auch so in \asname{} anzubieten, habe ich
  9661. nicht nutzen k"onnen, und zwar aus dem Grund, da"s ein Teil der Bitadressen
  9662. im Gegensatz zum MCS/51 nicht mehr eindeutig ist: Bits mit
  9663. den Adressen 256 bis 511 bezeichnen Bits der Speicherzellen 20h..3fh
  9664. aus dem aktuellen Datensegment.  Dies bedeutet aber, da"s diese Adressen
  9665. je nach Situation unterschiedliche Bits ansprechen k"onnen - ein definieren
  9666. von Bits mit Hilfe von \tty{DC}-Befehlen, was durch ein extra Segment
  9667. m"oglich geworden w"are, w"urde also nicht "uberm"a"sig viel Sinn ergeben.
  9668. Zur Definition einzelner, symbolisch ansprechbarer Bits steht aber
  9669. nach wie vor der \tty{BIT}-Befehl zur Verf"ugung, mit dem beliebige Bitadressen
  9670. (Register, RAM, SFR) definiert werden k"onnen.  F"ur Bitadressen im
  9671. internen RAM wird auch die 64K-Bank-Adresse gespeichert, so da"s \asname{}
  9672. Zugriffe "uberpr"ufen kann, sofern das DS-Register korrekt mit \tty{ASSUME}
  9673. vorbesetzt wurde.
  9674. \par
  9675. Nichts drehen kann man dagegen an den Bem"uhungen von \asname{}, potentielle
  9676. Sprungziele (also Zeilen im Code mit Label) auf gerade Adressen
  9677. auszurichten.  Dies macht \asname{} genauso wie andere XA-Assembler auch durch
  9678. Einf"ugen von \tty{NOP}s vor dem fraglichen Befehl.
  9679.  
  9680. %%---------------------------------------------------------------------------
  9681.  
  9682. \section{AVR}
  9683.  
  9684. Im Gegensatz zum AVR-Assembler verwendet \asname{} defaultm"a"sig das Intel-Format
  9685. zur Darstellung von Hexadezimalkonstanten und nicht die C-Syntax.  OK, nicht
  9686. vorher in den (freien) AVR-Assembler hineingeschaut, aber als ich mit dem
  9687. AVR-Teil anfing, gab es zum AVR noch nicht wesentlich mehr als ein
  9688. vorl"aufiges Datenbuch mit Prozessortypen, die dann doch nie kamen...mit
  9689. einem \tty{RELAXED ON} schafft man dieses Problem aus der Welt.
  9690.  
  9691. Optional kann \asname{} f"ur die AVRs (es geht auch f"ur andere CPU's, nur
  9692. macht es dort keinen Sinn...) sogenannte ,,Objekt-Dateien'' erzeugen.
  9693. Das sind Dateien, die sowohl Code als auch Quellzeileninformationen
  9694. enthalten und z.B. eine schrittweise Abarbeitung auf Quellcodeebene
  9695. mit dem von Atmel gelieferten Simulator WAVRSIM erlauben.  Leider
  9696. scheint dieser mit Quelldateispezifikationen, die l"anger als ca. 20
  9697. Zeichen sind, seine liebe Not zu haben: Namen werden abgeschnitten
  9698. oder um wirre Sonderzeichen erg"anzt, wenn die Maximall"ange "uberschritten
  9699. wird.  \asname{} speichert deshalb in den Objekt-Dateien Dateinamen ohne
  9700. Pfadangabe, so da"s es eventuell Probleme geben k"onnte, wenn
  9701. Dateien (z.B. Includes) nicht im Arbeitsverzeichnis liegen.
  9702.  
  9703. Eine kleine Besonderheit sind Befehle, die Atmel bereits in der
  9704. Architektur vorgesehen hat, aber noch in keinem Mitglied der Familie
  9705. implementiert wurden.  Dabei handelt es sich um die Befehle {\tt MUL, JMP}
  9706. und {\tt CALL}.  Besonders bei letzteren fragt man sich vielleicht, wie man
  9707. denn nun den 4 KWorte gro"sen Adre"sraum des AT90S8515 erreichen kann,
  9708. wenn die 'n"achstbesten' Befehle {\tt RJMP} und {\tt RCALL} doch nur 2
  9709. KWorte weit springen kann.  Der Kunstgriff lautet 'Abschneiden der oberen
  9710. Adre"sbits' und ist n"aher bei der {\tt WRAPMODE}-Anweisung beschrieben.
  9711.  
  9712. F"ur alle AVR-CPUs ist das CPU-Argument {\tt CODESEGSIZE} definiert.
  9713. Mit einem
  9714. \begin{verbatim}
  9715.   cpu atmega8:codesegsize=0
  9716. \end{verbatim}
  9717. weist man den Assembler an, das Code-Segment (also das interne Flash-ROM)
  9718. nicht als in 16-Bit-Worten, sondern in 8-Bit-Bytes organisiert zu betrachten.
  9719. Dies ist die Sichtweise, wie man sie beim {\tt LPM}-Befehl hat und wie sie
  9720. einige andere (nicht-Atmel) Assembler grunds"atzlich verfolgen.  Sie hat den
  9721. Vorteil, da"s man Adressen im {\tt CODE}-Segment f"ur Datenzugriffe nicht selber
  9722. mit zwei multiplizieren mu"s, andererseits mu"s aber darauf geachtet werden,
  9723. da"s Instruktionen niemals auf einer ungeraden Adresse liegen d"urfen - sie
  9724. w"urden dann ja quasi halb auf einem und halb auf dem n"achsten 16-Bit-Wort
  9725. im Flash-ROM liegen.  {\tt PADDING} ist deshalb im Default aktiviert, es bleibt
  9726. aber m"oglich, mit {\tt DB} oder {\tt DATA} Byte-Felder zu definieren, ohne
  9727. da"s zwischen den Anweisungen Padding-Bytes eingestreut werden.  Bei relativen
  9728. oder absoluten Spr"ungen werden die Adressen im ''Byte-Modus'' automatisch
  9729. durch zwei geteilt.  Default ist die vom Atmel-Assembler vorgegebene Organisation
  9730. in unteilbare 16-Bit-Worte.  Diese kann auch explizit mit dem Argument
  9731. \verb!codesegsize=1! gew"ahlt werden.
  9732.  
  9733. %%---------------------------------------------------------------------------
  9734.  
  9735. \section{Z80UNDOC}
  9736.  
  9737. Da es von Zilog naturgem"a"s keine Syntaxvorgaben f"ur die undokumentierten
  9738. Befehle gibt und wohl auch nicht jeder den kompletten Satz kennt,
  9739. ist es vielleicht sinnvoll, diese Befehle hier kurz aufzuz"ahlen:
  9740. \par
  9741. Wie auch beim Z380 ist es m"oglich, die Byte-H"alften von IX und IY
  9742. einzeln anzusprechen.  Im einzelnen sind dies folgende Varianten:
  9743. \begin{verbatim}
  9744. INC Rx              LD R,Rx             LD  Rx,n
  9745. DEC Rx              LD Rx,R             LD  Rx,Ry
  9746. ADD/ADC/SUB/SBC/AND/XOR/OR/CP A,Rx
  9747. \end{verbatim}
  9748. Dabei stehen \tty{Rx} bzw. \tty{Ry} f"ur \tty{IXL, IXU, IYL} oder
  9749. \tty{IYU}.  Zu beachten ist jedoch, da"s in der \tty{LD Rx,Ry}-Variante
  9750. beide Register aus dem gleichen Indexregister stammen m"ussen.
  9751. \par
  9752. Die Kodierung von Schiebebefehlen besitzt noch eine undefinierte
  9753. Bitkombination, die als \tty{SL1}-, \tty{SLI}-, \tty{SLIA}- oder
  9754. \tty{SLS}-Befehl zug"anglich ist.  Er funktioniert wie \tty{SLA},
  9755. es wird jedoch eine Eins und nicht eine Null in Bit 0 eingeschoben.
  9756. \bb{ACHTUNG}: In Internet findet man f"ur diesen Befehl auch den
  9757. Namen \tty{SLL}, ich habe mich aber entschieden, dies nicht zu
  9758. implementieren.  \tty{SLL} steht f"ur ,,Shift Logically Left'' und
  9759. die von diesem Befehl ausgef"uhrte Operation ist kein logischer
  9760. Linksshift - wenn \tty{SLL} "uberhaupt definiert werden sollte, dann
  9761. als Alias zu \tty{SLA}.  Wer f"ur existierenden Code \tty{SLL} mit
  9762. der Funktion von \tty{SL1/SLI} braucht, definiere sich daf"ur ein
  9763. Makro.
  9764.  
  9765. Dieser undokumentierte Schiebebefehl kann, wie alle anderen
  9766. Schiebebefehle auch, noch in zwei weiteren Varianten benutzt
  9767. werden:
  9768. \begin{verbatim}
  9769.        SLIA    R,(XY+d)
  9770.        SLIA    (XY+d),R
  9771. \end{verbatim}
  9772. Dabei steht \tty{R} f"ur ein beliebiges 8-Bit-Register (aber nicht eine
  9773. Indexregisterh"alfte...), und \tty{(XY+d)} f"ur eine normale
  9774. indexregister-relative Adressierung.  Das Ergebnis dieser Operation
  9775. ist, da"s das Schiebeergebnis zus"atzlich ins Register geladen wird.
  9776. Dies funktioniert auch bei den \tty{RES-} und \tty{SET-}Befehlen:
  9777. \begin{verbatim}
  9778.        SET/RES R,n,(XY+d)
  9779.        SET/RES n,(XY+d),R
  9780. \end{verbatim}
  9781. Des weiteren gibt es noch zwei versteckte I/O-Befehle:
  9782. \begin{verbatim}
  9783.        IN      (C) bzw. TSTI
  9784.        OUT     (C),0
  9785. \end{verbatim}
  9786. Deren Funktionsweise sollte klar sein.  \bb{ACHTUNG!} Es gibt keine
  9787. Garantie daf"ur, da"s alle Z80-Masken alle diese Befehle beherrschen,
  9788. und die Z80-Nachfolger l"osen zuverl"assig Traps aus.  Anwendung
  9789. daher auf eigene Gefahr...
  9790.  
  9791. %%---------------------------------------------------------------------------
  9792.  
  9793. \section{GB\_Z80 bzw. LR35902}
  9794.  
  9795. Das im originalen Gameboy verbaute SoC namens LR35092 wurde von Sharp
  9796. entwickelt, und der darin verbaute Prozessorkern ist (vermutlich) der gleiche
  9797. wie in den SM83-Mikrokontrollern.  Dieser ist vom Befehlssatz auf dem
  9798. ,,halben Weg'' zwischen 8080 und Z80, allerdings auch mit seinen
  9799. eigenen Auslassungen und Erweiterungen.  F"ur die neuen Befehle hat
  9800. Sharp nat"urlich eine Assembler-Syntax definiert, in der
  9801. ,,Gameboy-Szene'' haben sich aber auch einige alternative
  9802. Schreibweisen eingeb"urgert.  Ich habe mich bem"uht, diese (so weit
  9803. bekannt) zu ber"ucksichtigen:
  9804.  
  9805. \begin{center}\begin{tabular}{|l|l|l|}
  9806. \hline
  9807. Sharp & alternativ & Funktion \\
  9808. \hline
  9809. \hline
  9810. LD A,(HLD)    & LD A,(HL-)  & A $\longleftarrow$ (HL), \\
  9811.              & LDD A,(HL)  & HL $\longleftarrow$ HL-1 \\
  9812. \hline
  9813. LD A,(HLI)    & LD A,(HL+)  & A $\longleftarrow$ (HL), \\
  9814.              & LDI A,(HL)  & HL $\longleftarrow$ HL+1 \\
  9815. \hline
  9816. LD (HLD),A    & LD (HL-),A  & (HL) $\longleftarrow$ A, \\
  9817.              & LDD (HL),A  & HL $\longleftarrow$ HL-1 \\
  9818. \hline
  9819. LD (HLI),A    & LD (HL+),A  & (HL) $\longleftarrow$ A, \\
  9820.              & LDI (HL),A  & HL $\longleftarrow$ HL+1 \\
  9821. \hline
  9822. LD A,(C)      & LD A,(FF00+C) & A $\longleftarrow$ (0ff00h+C) \\
  9823.              & LDH A,(C)     & \\
  9824. \hline
  9825. LD (C),A      & LD (FF00+C),A & (0ff00h+C) $\longleftarrow$ A \\
  9826.              & LDH (C),A     & \\
  9827. \hline
  9828. LD (FF00+n),A & LDH (n),A     & (0ff00h+n) $\longleftarrow$ A \\
  9829. \hline
  9830. LD A,(FF00+n) & LDH A,(n)     & A $\longleftarrow$ (0ff00h+n) \\
  9831. \hline
  9832. LDHL SP,d     & LD HL,SP+d    & HL $\longleftarrow$ SP + d \\
  9833. \hline
  9834. LDX A,(nn)    & LD A,(nn)     & A $\longleftarrow$ (nn) $^{1}$ \\
  9835. \hline
  9836. LDX (nn),A    & LD (nn),A     & (nn) $\longleftarrow$ A $^{1}$ \\
  9837. \hline
  9838. \multicolumn{3}{|l|}{$^{1}$ erzwingt 16-Bit-Adressierung. } \\
  9839. \hline
  9840. \end{tabular}\end{center}
  9841.  
  9842. %%---------------------------------------------------------------------------
  9843.  
  9844. \section{Z380}
  9845.  
  9846. Da dieser Prozessor als Enkel des wohl immer noch beliebtesten
  9847. 8-Bit-Prozessors konzipiert wurde, war es bei der Entwicklung
  9848. unabdingbar, da"s dieser bestehende Z80-Programme ohne "Anderung
  9849. ausf"uhren kann (nat"urlich geringf"ugig schneller, etwa um den
  9850. Faktor 10...).  Die erweiterten F"ahigkeiten k"onnen daher nach
  9851. einem Reset mit zwei Flags zugeschaltet werden, die XM (eXtended
  9852. Mode, d.h. 32- statt 16-Bit-Adre"sraum) und LW (long word mode,
  9853. d.h. 32- statt 16- Bit-Operanden) hei"sen.  Deren Stand mu"s man
  9854. \asname{} "uber die Befehle \tty{EXTMODE} und \tty{LWORDMODE} mitteilen, damit
  9855. Adressen und Konstantenwerte gegen die korrekten Obergrenzen
  9856. gepr"uft werden.  Die Umschaltung zwischen 32- und 16-Bit-Befehlen
  9857. bewirkt nat"urlich nur bei solchen Befehlen etwas, die auch in
  9858. einer 32-Bit-Version existieren; beim Z380 sind das momentan
  9859. leider nur Lade- und Speicherbefehle, die ganze Arithmetik kann
  9860. nur 16-bittig ausgef"uhrt werden.  Hier sollte Zilog wohl noch
  9861. einmal etwas nachbessern, sonst kann man den Z380 selbst beim
  9862. besten Willen nur als ,,16-Bit-Prozessor mit 32-Bit-Erweiterungen''
  9863. bezeichnen...
  9864.  
  9865. Kompliziert wird die Sache dadurch, da"s die mit LW eingestellte
  9866. Operandengr"o"se f"ur einzelne Befehle mit den Pr"afixen \tty{DDIR W}
  9867. und \tty{DDIR LW} "ubersteuert werden kann.  \asname{} merkt sich das
  9868. Auftreten solcher Befehle und schaltet dann f"ur den n"achsten
  9869. Prozessorbefehl automatisch mit um.  Andere \tty{DDIR}-Varianten
  9870. als \tty{W} und \tty{LW} sollte man "ubrigens nie explizit
  9871. verwenden, da \asname{} bei zu langen Operanden diese automatisch
  9872. einsetzt, und das k"onnte zu Verwirrungen f"uhren.  Die Automatik
  9873. geht "ubrigens so weit, da"s in der Befehlsfolge
  9874. \begin{verbatim}
  9875.        DDIR    LW
  9876.        LD      BC,12345678h
  9877. \end{verbatim}
  9878. automatisch der erforderliche \tty{IW}-Pr"afix mit in die
  9879. vorangehende Anweisung hineingezogen wird, effektiv wird also
  9880. der Code
  9881. \begin{verbatim}
  9882.        DDIR    LW,IW
  9883.        LD      BC,12345678h
  9884. \end{verbatim}
  9885. erzeugt.  Der im ersten Schritt erzeugte Code f"ur \tty{DDIR LW}
  9886. wird verworfen, was an einem \tty{R} im Listing zu erkennen
  9887. ist.
  9888.  
  9889. %%---------------------------------------------------------------------------
  9890.  
  9891. \section{Z8, Super8 und eZ8}
  9892. \label{Z8Spec}
  9893.  
  9894. Der Prozessorkern der Z8-Mikrokontroller beinhaltet keine eigenen
  9895. Register.  Stattdessen kann ein 16er-Block des internen Adre"sraums
  9896. aus RAM und I/O-Registern als 'Arbeitsregister' benutzt werden, die
  9897. mit 4-Bit-Adressen angesprochen werden k"onnen.  Welcher 16er-Block
  9898. als Arbeitsregister benutzt werden soll, wird mit den RP-Registern
  9899. festgelegt: Bits 4 bis 7 von RP definieren beim klassischen Z8 den
  9900. 'Offset', der auf die 4-Bit-Arbeitsregisteradresse addiert wird,
  9901. um eine 8-Bit-Adresse zu erhalten.  Beim Super8-Kern existieren
  9902. zwei RP-Register (RP0 und RP1), die es erlauben, obere und untere
  9903. H"alfte der Arbeitsregister an getrennte Stellen zu legen.
  9904.  
  9905. "Ublicherweise werden die Arbeitsregister in der Assemblersyntax als
  9906. Register R0...R15 angesprochen, man kann diese Arbeitsregister aber
  9907. auch als eine Methode zur effizienteren (k"urzeren) Adressierung eines
  9908. 16er-Bocks im internen RAM betrachten.
  9909.  
  9910. Mit dem \tty{ASSUME}-Befehl teilt man \asname{} den aktuellen Wert von RP mit.  \asname{}
  9911. ist dann in der Lage, bei einer Adresse aus dem internen RAM
  9912. automatisch zu entscheiden, ob dieser Operand mit einer 4-Bit Adresse
  9913. angesprochen werden kann oder eine 8-Bit-Adresse verwendet werden
  9914. mu"s.  Man kann diese Funktion auch dazu benutzen, Arbeitsregistern
  9915. symbolische Namen zu verpassen:
  9916. \begin{verbatim}
  9917. op1     equ     040h
  9918. op2     equ     041h
  9919.  
  9920.        srp     #040h
  9921.        assume  rp:040h
  9922.  
  9923.         ld      op1,op2         ; entspricht ld r0,r1
  9924. \end{verbatim}
  9925. Es ist auch auf dem Super8 m"oglich, RP als Argument von \tty{ASSUME}
  9926. anzugeben, obwohl dieser kein RP-Register hat (nur RP0 und RP1).  In
  9927. diesem Fall werden die angenommen Werte von RP0 und RP1 auf $wert$ bzw.
  9928. $wert+8$ gesetzt, analog zum \tty{SRP} Maschinenbefehl auf dem Super8-
  9929. Kern.
  9930.  
  9931. Im Gegensatz zum Original Zilog-Assembler ist es nicht erforderlich,
  9932. eine 'Arbeitsregisteradressierung' explizit durch ein vorangestelltes
  9933. Ausrufezeichen anzufordern, wobei \asname{} diese Syntax nichtsdestotrotz
  9934. versteht - ein vorangestelltes Ausrufezeichen erzwingt quasi
  9935. 4-Bit-Adressierung, auch wenn die Adresse eigentlich nicht im durch
  9936. RP festgelegten 16-Bit-Fenster liegt (dann wird eine Warnung
  9937. ausgegeben).  Umgekehrt ist es durch ein vorangestelltes $>$-Zeichen
  9938. m"oglich, eine Adressierung mit 8 Bit zu erzwingen, auch wenn die
  9939. Adresse eigentlich im aktuellen 16er-Fenster liegt.
  9940.  
  9941. Beim eZ8 wird das Spielchen quasi eine Stufe weiter getrieben: der
  9942. interne Daten-Adre"sbereich ist jetzt 12 statt 8 Bit gro"s.  Um
  9943. kompatibel zum alten Z8-Kern zu sein, hat Zilog die zus"atzlichen
  9944. Banking-Bits in den {\em unteren} vier Bits von RP untergebracht -
  9945. ein RP-Wert von 12h definiert also das 16er-Adre"sfenster von 210h
  9946. bis 21fh.
  9947.  
  9948. Die unteren vier Bits von RP definieren beim eZ8 gleichzeitig das
  9949. 256er-Fenster, das man mit 8-Bit-Adressen erreichen kann - hier gilt
  9950. ein analoger Mechanismus, der daf"ur sorgt, da"s \asname{} automatisch 12-
  9951. oder 8-Bit-Adressen verwendet.  'Lange' 12-Bit-Adressen kann man mit
  9952. zwei vorangestellten $>$-Zeichen erzwingen.
  9953.  
  9954. %%---------------------------------------------------------------------------
  9955.  
  9956. \section{Z8000}
  9957. \label{Z8000Spec}
  9958.  
  9959. Der Z8001/8003 kann in zwei verschiedenen Modi betrieben werden:
  9960. \begin{itemize}
  9961. \item{{\em Nicht segmentiert}: Der Speicheradre"sraum ist auf 64 KByte
  9962.      beschr"ankt, alle Adressen sind 'einfache' lineare 16-Bit-
  9963.      Adressen.  Adre"sregister sind einfache 16-Bit-Register (Rn),
  9964.      und absolute Adressen in Befehlen sind ein 16-Bit-Wort lang.}
  9965. \item{{\em Segmentiert}: Der Speicher ist in bis zu 128 Segmente von
  9966.      jeweils maximal 64 KByte aufgeteilt.  Adressen bestehen aus
  9967.      einem 7-bittigen Segment und einem 16-bittigen Offset.  Adre"sregister
  9968.      sind immer Registerpaare (RRn).  Absolute Adressen in Befehlen
  9969.      sind zwei 16-Bit-Worte lang, au"ser der Offset is kleiner 256.}
  9970. \end{itemize}
  9971.  
  9972. Die Betriebsart (segmentiert oder nicht segmentiert) hat also einen
  9973. Einflu"s auf den erzeugten Code und wird implizit "uber den verwendeten
  9974. Prozessortyp umgeschaltet.  Ist das Ziel also z.B. ein Z8001 im nicht
  9975. segmentierten Modus, so w"ahlt man einfach Z8002 als Ziel.
  9976.  
  9977. Eine 'echte' Unterst"utzung eines segmentierten Speichermodells bietet
  9978. \asname{} indes f"ur den Z8000 genauso wenig wie f"ur den 8086.  Im segmentierten
  9979. Modus wird die Segmentnummer einfach als die oberen sieben Adre"sbits
  9980. eines gedacht linearen 8MB-Adre"sraums behandelt.  Dies ist eigentlich
  9981. nicht im Sinne des Erfinders, aber es entspricht der Art und Weise, wie
  9982. der Z8001 in Systemen ohne MMU effektiv betrieben wurde.
  9983.  
  9984. Generell implementiert \asname{} die Assembler-Syntax der Z8000-Maschinenbefehle
  9985. so, wie es von Zilog in der Dokumentation vorgesehen ist.  Es existieren
  9986. jedoch Assembler, die Erweiterungen bzw. Variationen unterst"utzen.  \asname{}
  9987. implementiert davon folgendes:
  9988.  
  9989. \subsection{Bedingungen}
  9990.  
  9991. Zus"atzlich zu den von Zilog definierten Bedingungen sind folgende alternative
  9992. Namen definiert:
  9993.  
  9994. \begin{center}\begin{tabular}{|l|l|l|}
  9995. \hline
  9996. Alternativ & Zilog & Bedeutung \\
  9997. \hline
  9998. \hline
  9999. ZR         & Z     & Z = 1 \\
  10000. CY         & C     & C = 1 \\
  10001. LLE        & ULE   & (C OR Z) = 1 \\
  10002. LGE        & UGE   & C = 0 \\
  10003. LGT        & UGT   & ((C = 0) AND (Z = 0)) = 1 \\
  10004. LLT        & ULT   & C = 1 \\
  10005. \hline
  10006. \end{tabular}\end{center}
  10007.  
  10008. \subsection{Flags}
  10009.  
  10010. Als Argument f"ur die Befehle \tty{SETFLG}, \tty{COMFLG} und \tty{RESFLG} werden
  10011. auch die folgenden alternativen Namen akzeptiert:
  10012.  
  10013. \begin{center}\begin{tabular}{|l|l|l|}
  10014. \hline
  10015. Alternativ & Zilog & Bedeutung \\
  10016. \hline
  10017. \hline
  10018. ZR         & Z     & Zero-Flag \\
  10019. CY         & C     & Carry-Flag \\
  10020. \hline
  10021. \end{tabular}\end{center}
  10022.  
  10023. \subsection{Indirekte Adressierung}
  10024.  
  10025. Anstelle \verb!@Rn! darf auch \verb!Rn^! geschrieben werden, falls beim \tty{CPU}-
  10026. Statement die Option \tty{AMDSyntax=1} gesetzt wurde.  Wird eine I/O-Adresse
  10027. indirekt adressiert, so reicht es mit dieser Option auch aus, {\em nur} \verb!Rn!
  10028. zu schreiben.
  10029.  
  10030. \subsection{Direkte versus unmittelbare Adressierung}
  10031.  
  10032. Bei der von Zilog vorgegebenen Assembler-Syntax mu"s unmittelbare Adressierung
  10033. durch ein vorangestelltes Doppelkreuz kenntlich gemacht werden.  Wurde dem
  10034. \tty{CPU}-Statement jedoch die Option \tty{AMDSyntax=1} mitgegeben, wird anhand
  10035. des Arguments (Label oder Konstante) entschieden, ob direkte oder unmittelbare
  10036. Adressierung verwendet werden soll.  Unmittelbare Adressierung kann erzwungen
  10037. werden, indem dem Argument ein Circumflex vorangestellt wird, z.B. um die
  10038. Adresse eines Labels in ein Register zu laden.
  10039.  
  10040. %%---------------------------------------------------------------------------
  10041.  
  10042. \section{TLCS-900(L)}
  10043. \label{TLCS900Spec}
  10044.  
  10045. Diese Prozessoren k"onnen in zwei Betriebsarten laufen, einmal im
  10046. \ii{Minimum}-Modus, der weitgehende Z80- und TLCS-90-Quellcodekompatibilit"at
  10047. bietet, und zum anderen im \ii{Maximum}-Modus, in dem der Prozessor
  10048. erst seine wahren Qualit"aten entfaltet.  Die Hauptunterschiede zwischen
  10049. den beiden Betriebsarten sind:
  10050. \begin{itemize}
  10051. \item{Breite der Register WA,BC,DE und HL: 16 oder 32 Bit;}
  10052. \item{Anzahl der Registerbanks: 8 oder 4;}
  10053. \item{Programmadre"sraum: 64 Kbyte oder 16 Mbyte;}
  10054. \item{Breite von R"ucksprungadressen: 16 oder 32 Bit.}
  10055. \end{itemize}
  10056. Damit \asname{} gegen die richtigen Grenzen pr"ufen kann, mu"s man ihm zu Anfang
  10057. mit dem Befehl \tty{MAXMODE} (siehe dort) mitteilen, in welcher Betriebsart
  10058. der Code ausgef"uhrt werden wird; Voreinstellung ist der Minimum-Modus.
  10059. \par
  10060. Je nach Betriebsart m"ussen demzufolge auch die 16- oder 32-Bit-Versionen
  10061. der Bankregister zur Adressierung verwendet werden, d.h. WA, BC, DE und HL
  10062. im Minimum-Modus sowie XWA, XBC, XDE und XHL im Maximum-Modus.  Die Register
  10063. XIX..XIZ und XSP sind \bb{immer} 32 Bit breit und m"ussen zur Adressierung
  10064. auch immer in dieser Form verwendet werden; hier mu"s bestehender Z80-Code
  10065. also auf jeden Fall angepa"st werden (neben der Tatsache, da"s es gar keinen
  10066. I/O-Adre"sraum mehr gibt und alle I/O-Register memory-mapped sind...).
  10067. \par
  10068. Absolute Adressen sowie Displacements k"onnen in unterschiedlichen L"angen
  10069. kodiert werden.  \asname{} wird ohne explizite Angaben immer versuchen, die
  10070. k"urzestm"ogliche Schreibweise zu verwenden; dies schlie"st ein, da"s ein
  10071. Displacement von Null "uberhaupt nicht im Code erscheint und aus einen
  10072. \verb!(XIX+0)! einfach ein \verb!(XIX)! wird.  Ist eine bestimmte L"ange
  10073. erw"unscht, so kann sie durch Anh"angen eines passenden Suffixes (:8, :16,
  10074. :24) an das Displacement bzw. die Adresse erreicht werden.
  10075. \par
  10076. Die von Toshiba gew"ahlte Syntax f"ur Registernamen ist in der Hinsicht
  10077. etwas ungl"ucklich, als da"s zur Anwahl der vorherigen Registerbank ein
  10078. Hochkomma (') benutzt wird.
  10079. Dieses Zeichen wird von den prozessorunabh"angigen Teilen von \asname{} bereits zur
  10080. Kennzeichnung von Zeichenkonstanten benutzt.  Im Befehl
  10081. \begin{verbatim}
  10082.        ld      wa',wa
  10083. \end{verbatim}
  10084. erkennt \asname{} z.B. nicht das Komma zur Parametertrennung.
  10085. Dieses Problem kann man aber umgehen,
  10086. indem man ein umgekehrtes Hochkomma (`) verwendet, z.B.
  10087. \begin{verbatim}
  10088.        ld      wa`,wa
  10089. \end{verbatim}
  10090. Toshiba liefert f"ur die TLCS-900-Reihe selber einen Assembler (TAS900), der
  10091. sich in einigen Punkten von \asname{} unterscheidet:
  10092.  
  10093. \subsubsection{Symbolkonventionen}
  10094.  
  10095. \begin{itemize}
  10096. \item{TAS900 unterscheidet Symbolnamen nur auf den ersten 32 Zeichen.
  10097.      \asname{} dagegen speichert Symbolnamen immer in der vollen L"ange (bis
  10098.      255 Zeichen) und unterscheidet auch auf dieser L"ange.}
  10099. \item{Unter TAS900 k"onnen Integerkonstanten sowohl in C-Notation (mit
  10100.      vorangestellter 0 f"ur oktal bzw. 0x f"ur hexadezimal) als auch in
  10101.      normaler Intel-Notation geschrieben werden.  \asname{} unterst"utzt in der
  10102.      Default-Einstellung \bb{nur} die Intel-Notation.  Mit dem
  10103.      \tty{RELAXED}-Befehl bekommt man (unter anderem) auch die C-Notation.}
  10104. \item{\asname{} macht keinen Unterschied zwischen Gro"s- und Kleinschreibung,
  10105.      TAS900 hingegen unterscheidet Gro"s-und Kleinbuchstaben in
  10106.      Symbolnamen.  Dieses Verhalten erh"alt man bei \asname{} erst, wenn man
  10107.      die \tty{-u}-Kommandozeilenoption benutzt.}
  10108. \end{itemize}
  10109.  
  10110. \subsubsection{Syntax}
  10111.  
  10112. \asname{} ist bei vielen Befehlen in der Syntaxpr"ufung weniger streng als TAS900,
  10113. bei einigen weicht er (sehr) geringf"ugig ab.  Diese Erweiterungen bzw.
  10114. "Anderungen dienen teilweise der leichteren Portierung von bestehendem
  10115. Z80-Code, teilweise einer Schreiberleichterung und teilweise einer besseren
  10116. Orthogonalit"at der Assemblersyntax:
  10117. \begin{itemize}
  10118. \item{Bei den Befehlen \tty{LDA, JP} und \tty{CALL} verlangt TAS, da"s
  10119.      Adre"sausdr"ucke wie \tty{XIX+5} nicht geklammert sein d"urfen, wie
  10120.      es sonst "ublich ist.  \asname{} verlangt im Sinne der Orthogonalit"at f"ur
  10121.      \tty{LDA} dagegen immer eine Klammerung, bei \tty{JP} und \tty{CALL}
  10122.      ist sie dagegen f"ur einfache, absolute Adressen optional.}
  10123. \item{Bei den bedingten Befehlen \tty{JP, CALL, JR} und \tty{SCC} stellt
  10124.      \asname{} es dem Programmierer frei, die Default-Bedingung \tty{T} (= true) als
  10125.      ersten Parameter anzugeben oder nicht.  TAS900 hingegen erlaubt es
  10126.      nur, die Default-Bedingung implizit zu benutzen (also z.B.
  10127.      \tty{jp (xix+5)} anstelle von \tty{jp t,(xix+5)}).}
  10128. \item{\asname{} erlaubt beim \tty{EX}-Befehl auch Operandenkombinationen, die
  10129.      zwar nicht direkt im User's Manual\cite{Tosh900} genannt werden,
  10130.      aber durch Vertauschung auf eine genannte zur"uck gef"uhrt werden
  10131.      k"onnen.  Kombinationen wie \tty{EX f`,f} oder \tty{EX wa,(xhl)}
  10132.      werden damit m"oglich.  TAS900 hingegen l"a"st nur die ,,reine Lehre''
  10133.      zu.}
  10134. \item{\asname{} erlaubt, bei den Befehlen \tty{INC} und \tty{DEC} die Angabe
  10135.      des Inkrements oder Dekrements wegzulassen, wenn dies 1 ist.  Unter
  10136.      TAS900 dagegen mu"s auch eine 1 hingeschrieben werden.}
  10137. \item{"Ahnlich verh"alt es sich bei allen Schiebebefehlen: Ist der zu
  10138.      verschiebende Operand ein Register, so verlangt TAS900, da"s auch
  10139.      eine Schiebeamplitude von 1 ausgeschrieben werden mu"s; ist dagegen
  10140.      eine Speicherstelle der Operand, so ist die Schiebezahl
  10141.      (hardwarebedingt) immer 1 und darf auch nicht hingeschrieben werden.
  10142.      Unter \asname{} dagegen ist die Schiebezahl 1 immer optional und auch f"ur
  10143.      alle Operandentypen zul"assig.}
  10144. \end{itemize}
  10145.  
  10146. \subsubsection{Makroprozessor}
  10147.  
  10148. Der Makroprozessor wird TAS900 als externes Programm vorgeschaltet und
  10149. besteht aus zwei Komponenten: einem C-artigen Pr"aprozessor und einer
  10150. speziellen Makrosprache (MPL), die an h"ohere Programmiersprachen
  10151. erinnert.  Der Makroprozessor von \asname{} dagegen orientiert sich an
  10152. ,,klassischen'' Makroassemblern wie dem M80 oder MASM (beides Programme
  10153. von Microsoft).  Er ist fester Bestandteil des Programms.
  10154.  
  10155. \subsubsection{Ausgabeformat}
  10156.  
  10157. TAS900 erzeugt relokatiblen Code, so da"s sich mehrere, getrennt assemblierte
  10158. Teile zu einem Programm zusammenbinden lassen.  \asname{} hingegen erzeugt direkt
  10159. absoluten Maschinencode, der nicht linkbar ist.  An eine Erweiterung ist
  10160. (vorl"aufig) nicht gedacht.
  10161.  
  10162. \subsubsection{Pseudoanweisungen}
  10163.  
  10164. Bedingt durch den fehlenden Linker fehlen in \asname{} eine ganze Reihe von f"ur
  10165. relokatiblen Code erforderlichen Pseudoanweisungen, die TAS900 implementiert.
  10166. In gleicher Weise wie bei TAS900 sind folgende Anweisungen vorhanden:
  10167. \begin{quote}{\tt
  10168. EQU, DB, DW, ORG, ALIGN, END, TITLE, SAVE, RESTORE,
  10169. }\end{quote}
  10170. wobei die beiden letzteren einen erweiterten Funktionsumfang haben.
  10171. Einige weitere TAS900-Pseudobefehle lassen sich durch "aquivalente \asname{}-Befehle
  10172. ersetzen (siehe Tabelle \ref{TabTAS900}).
  10173. \par
  10174. Von Toshiba existieren zwei Versionen des Prozessorkerns, wobei die
  10175. L-Variante eine ,,Sparversion'' darstellt.  Zwischen TLCS-900 und TLCS-900L
  10176. macht \asname{} folgende Unterschiede:
  10177. \begin{itemize}
  10178. \item{Die Befehle \tty{MAX} und \tty{NORMAL} sind f"ur die L-Version
  10179.      nicht erlaubt, der \tty{MIN}-Befehl ist f"ur die Vollversion
  10180.      gesperrt.}
  10181. \item{Die L-Version kennt den Normal-Stapelzeiger \tty{XNSP/NSP} nicht,
  10182.      daf"ur das Steuerregister \tty{INTNEST}.}
  10183. \end{itemize}
  10184. Die Befehle \tty{SUPMODE} und \tty{MAXMODE} werden nicht beeinflu"st,
  10185. ebenso nicht deren ini\-tiale Einstellung OFF.  Die Tatsache, da"s die
  10186. L-Version im Maximum-Modus startet und keinen Normal-Modus kennt, mu"s
  10187. also vom Programmierer ber"ucksichtigt werden.  \asname{} zeigt sich jedoch
  10188. insofern kulant gegen"uber der L-Variante, als da"s Warnungen wegen
  10189. privilegierter Anweisungen im L-Modus unterdr"uckt werden.
  10190. \begin{table*}[htbp]
  10191. \begin{center}\begin{tabular}{|l|l|l|}
  10192. \hline
  10193. TAS900        &   \asname{}                & Bedeutung/Funktion \\
  10194. \hline
  10195. \hline
  10196. \tty{DL} $<Daten>$  & \tty{DD} $<Daten>$              & Speicher in Langworten belegen \\
  10197. \hline
  10198. \tty{DSB} $<Zahl>$  & \tty{DB} $<Zahl>$ \tty{DUP} (?) & Speicher byteweise reservieren \\
  10199. \hline
  10200. \tty{DSW} $<Zahl>$  & \tty{DW} $<Zahl>$ \tty{DUP} (?) & Speicher wortweise reservieren \\
  10201. \hline
  10202. \tty{DSD} $<Zahl>$  & \tty{DD} $<Zahl>$ \tty{DUP} (?) & Speicher langwortweise reservieren \\
  10203. \hline
  10204. \tty{\$MIN[IMUM]}   & \tty{MAXMODE OFF}         & folgender Code im Minimum-Modus \\
  10205. \hline
  10206. \tty{\$MAX[IMUM]}   & \tty{MAXMODE ON}          & folgender Code im Maximum-Modus \\
  10207. \hline
  10208. \tty{\$SYS[TEM]}    & \tty{SUPMODE ON}          & folgender Code im System-Modus \\
  10209. \hline
  10210. \tty{\$NOR[MAL]}    & \tty{SUPMODE OFF}         & folgender Code im User-Modus \\
  10211. \hline
  10212. \tty{\$NOLIST}      & \tty{LISTING OFF}         & Assemblerlisting ausschalten \\
  10213. \hline
  10214. \tty{\$LIST}        & \tty{LISTING ON}          & Assemblerlisting einschalten \\
  10215. \hline
  10216. \tty{\$EJECT}       & \tty{NEWPAGE}             & neue Seite im Listing beginnen \\
  10217. \hline
  10218. \end{tabular}\end{center}
  10219. \caption{"aquivalente Befehle TAS900$\leftrightarrow$\asname{}\label{TabTAS900}}
  10220. \end{table*}
  10221.  
  10222. %%---------------------------------------------------------------------------
  10223.  
  10224. \section{TLCS-90}
  10225.  
  10226. Vielleicht fragt sich der eine oder andere, ob bei mir die Reihenfolge
  10227. durcheinander gekommen ist, es gab ja von Toshiba zuerst den 90er als
  10228. ,,aufgebohrten Z80'' und danach den 900er als 16-Bit-Version.  Nun, ich
  10229. bin einfach "uber den 900er zum 90er gekommen (Danke, Oliver!).  Die
  10230. beiden Familien sind sich sehr artverwandt, nicht nur was ihre Syntax
  10231. angeht, sondern auch ihre Architektur.  Die Hinweise f"ur den 90er sind
  10232. daher eine Untermenge derer f"ur den 900er: Da Schieben, Inkrementieren
  10233. und Dekrementieren hier nur um eins m"oglich sind, braucht und darf diese
  10234. Eins auch nicht als erstes Argument hingeschrieben werden.  Bei den
  10235. Befehlen \tty{LDA, JP} und \tty{CALL} m"ochte Toshiba wieder die
  10236. Klammern um Speicheroperanden weglassen, bei \asname{} m"ussen sie aber aus
  10237. Gr"unden der Orthogonalit"at gesetzt werden (der tiefere Grund ist
  10238. nat"urlich, da"s ich mir damit eine Sonderabfrage im Parser gespart habe,
  10239. aber das sagt man nicht so laut).
  10240. \par
  10241. Die TLCS-90er besitzen bereits prinzipiell einen Adre"sraum von 1
  10242. Mbyte, dieser Raum erschlie"st sich aber nur bei Datenzugriffen "uber
  10243. die Indexregister.  \asname{} verzichtet daher auf eine Ber"ucksichtigung
  10244. der Bankregister und begrenzt den Adre"sraum f"ur Code auf 64 Kbyte.
  10245. Da der Bereich jenseits aber sowieso nur "uber indirekte Adressierung
  10246. erreichbar ist, sollte dies keine allzu gro"se Einschr"ankung darstellen.
  10247.  
  10248. %%---------------------------------------------------------------------------
  10249.  
  10250. \section{TLCS-870}
  10251.  
  10252. Schon wieder Toshiba...diese Firma ist im Augenblick wirklich sehr
  10253. produktiv!  Speziell dieser Spro"s der Familie (Toshibas Mikrokontroller
  10254. sind sich ja alle in Bin"arkodierung und Programmiermodell recht "ahnlich)
  10255. scheint auf den 8051-Markt abzuzielen: Die Methode, Bitstellen durch einen
  10256. Punkt getrennt an den Adre"sausdruck anzuh"angen, hatte ja beim 8051 ihren
  10257. Ursprung, f"uhrt jetzt aber auch genau zu den Problemen, die ich beim 8051
  10258. geahnt hatte: Der Punkt ist jetzt einerseits legales Zeichen in Symbolnamen,
  10259. andererseits aber auch Teil der Adre"ssyntax, d.h. \asname{} mu"s Adresse und
  10260. Bitstelle trennen und einzeln weiterverarbeiten.  Diesen Interessenkonflikt
  10261. habe ich vorerst so gel"ost, da"s der Ausdruck von \bb{hinten} an nach
  10262. Punkten durchsucht wird und so der letzte Punkt als Trenner gilt, eventuelle
  10263. weitere Punkte werden dem Symbolnamen zugerechnet.  Es gilt weiterhin die
  10264. flehentliche Bitte, im eigenen Interesse auf Punkte in Symbolnamen zu
  10265. verzichten, sie f"uhren nur zu Verwirrungen:
  10266. \begin{verbatim}
  10267.        LD      CF,A.7  ; Akku Bit 7 nach Carry
  10268.        LD      C,A.7   ; Konstante A.7 nach Register C
  10269. \end{verbatim}
  10270.  
  10271. %%---------------------------------------------------------------------------
  10272.  
  10273. \section{TLCS-47}
  10274.  
  10275. Mit dieser 4-Bit-Prozessorfamilie d"urfte wohl das unter Ende dessen
  10276. erreicht sein, was \asname{} unterst"utzen kann.  Neben dem \tty{ASSUME}-Befehl
  10277. f"ur das Datenbankregister (siehe dort) ist eigentlich nur ein Detail
  10278. erw"ahnenswert: im Daten- und I/O-Segment werden keine Bytes, sondern
  10279. Nibbles reserviert (eben 4-Bitter...).  Die Sache funktioniert "ahnlich
  10280. wie das Bitdatensegment beim 8051, wo ein \tty{DB} ja nur einzelne Bit
  10281. reserviert, nur da"s es hier eben Nibbles sind.
  10282. \par
  10283. Toshiba hat f"ur diese Prozessorfamilie einen ,,erweiterten Befehlssatz''
  10284. in Makroform definiert, um das Arbeiten mit diesem doch recht
  10285. beschr"ankten Befehlssatz zu erleichtern.  Im Fall von \asname{} ist er in der
  10286. Datei STDDEF47.INC definiert.  Einige Befehle, deren makrom"a"sige
  10287. Realisierung nicht m"oglich war, sind allerdings ,,eingebaut'' und stehen
  10288. daher auch ohne die Include-Datei zur Verf"ugung:
  10289. \begin{itemize}
  10290. \item{der \tty{B}-Befehl, der die jeweils optimale Version des
  10291.      Sprungbefehls (\tty{BSS, BS oder BSL}) automatisch w"ahlt;}
  10292. \item{\tty{LD} in der Variante HL mit immediate;}
  10293. \item{\tty{ROLC} und \tty{RORC} mit einer Schiebeamplitude $>$1.}
  10294. \end{itemize}
  10295.  
  10296. %%---------------------------------------------------------------------------
  10297.  
  10298. \section{TLCS-9000}
  10299.  
  10300. Hier ist es zum ersten Mal passiert, da"s ich einen Prozessor in \asname{}
  10301. implementiert habe, der zu diesem Zeitpunkt noch gar nicht auf dem
  10302. Markt war.  Toshiba hatte sich nach meinen Informationen leider
  10303. zwischenzeitlich auch dazu entschieden, diesen Prozessor ,,auf Eis''
  10304. zu legen, also auch kein Silizium geben.  Das hatte nat"urlich zur Folge,
  10305. da"s dieser Teil
  10306. \begin{description}
  10307. \item[1.]{ein ,,Paper-Design'' ist, d.h. noch nicht praktisch getestet
  10308.          wurde und}
  10309. \item[2.]{Die Unterlagen, die ich zum 9000er hatte \cite{Tosh9000},
  10310.          noch vorl"aufig waren, also noch nicht bis ins letzte Klarheit
  10311.          lieferten.}
  10312. \end{description}
  10313. und dieses Target foratn in einen Dornr"oschenschlaf fiel...
  10314.  
  10315. ...Schnitt, 20 Jahre sp"ater: auf einmal melden sich Leute bei
  10316. mir, da"s Toshiba wohl doch TLCS-9000-Chips an Kunden verkauft
  10317. hat, und fragen nach den Unterlagen, weil sie Reverse-Engineering
  10318. betreiben.  Vielleicht bekommen wir ja auf diesem Wege noch das
  10319. eine oder andere unklare Detail best"atigt oder gekl"art.  Fehler in
  10320. diesem Teil sind also weiterhin noch m"oglich und werden nat"urlich
  10321. bereinigt.  Zumindest die Handvoll Beispiele in \cite{Tosh9000} werden
  10322. aber richtig "ubersetzt.
  10323.  
  10324. Displacements im Maschinenbefehl selber k"onnen nur eine bestimmte
  10325. maximale L"ange (z.B. 13 oder 9 Bit) haben.  Ist das Displacement
  10326. l"anger, mu"s dem Befehl ein Pr"afix mit den ''oberen Bits''
  10327. vorangestellt werden.  \asname{} wird solche Pr"afixe automatisch nach
  10328. Bedarf einsetzen, man kann jedoch auch mit einem dem Displacement
  10329. vorangestellten \verb!'>'! das Setzen eines Pr"afix erzwingen,
  10330. z.B. so:
  10331.  
  10332. \begin{verbatim}
  10333.  ld:g.b  (0h),0       ; kein Praefix
  10334.  ld:g.b  (400000h),0  ; Praefix automatisch erzeugt
  10335.  ld:g.b  (>0h),0      ; Praefix erzwungen
  10336. \end{verbatim}
  10337.  
  10338. %%---------------------------------------------------------------------------
  10339.  
  10340. \section{TC9331}
  10341.  
  10342. Toshiba hat seinerzeit f"ur diesen Prozessor einen (DOS-basierten)
  10343. Assembler namens ASM31T geliefert.  Dieser Assembler unterst"utzt
  10344. eine Reihe von Syntax-Elementen, die sich auf \asname{} nicht ohne
  10345. "Anderungen abbilden lie"sen, die die Kompatibilit"at
  10346. zu existierenden Quelldateien f"ur andere Targets gef"ahrdert
  10347. h"atten.  An folgenden Stellen werden m"oglicherweise "Anderungen
  10348. erforderlich sein, um f"ur den ASM31T geschriebene Programme mit
  10349. \asname{} "ubersetzen zu k"onnen:
  10350.  
  10351. \begin{itemize}
  10352. \item{ASM31T unterst"utzt C-artige Kommentare (\verb!/* ... */!),
  10353.      die auch "uber mehrere Zeilen gehen d"urfen.  Diese werden
  10354.      von \asname{} nicht unterst"utzt und m"ussen in mit einem
  10355.      Semikolon eingeleitete Kommentare umgesetzt werden.}
  10356. \item{Wie ASM31T unterst"utzt \asname{} f"ur den TC9331 Kommentare in
  10357.      runden Klammern (\verb!( ... )!), aber nur innerhalb
  10358.      eines Befehlsarguments.  Enth"alt ein solcher Kommentar ein
  10359.      Komma, wird dieses Komma als Argument-Trenner behandelt und
  10360.      der Kommentar nicht beim Parsing der Argumente
  10361.      "ubersprungen.}
  10362. \item{ASM31T erlaubt Symbol- und Label-Namen, die einen
  10363.      Bindestrich enthalten.  Das ist bei \asname{} nicht zugelassen,
  10364.      der Bindestrich ist hier der Subtraktionsoperator und in
  10365.      einem Ausdruck wie \verb!end-start! w"are sonst nicht klar,
  10366.      ob ein einzelnes Symbol oder die Differenz von zwei
  10367.      Symbolen gemeint ist.}
  10368. \item{ASM31T verlangt zwingend ein \tty{END}-Statement am Ende
  10369.      des Programms; bei \asname{} ist dies optional.}
  10370. \end{itemize}
  10371.  
  10372. Des weiteren fehlen \asname{} im Moment die F"ahigkeiten, auf
  10373. miteinander kollidierende Nutzungen von Funktionseinheiten in
  10374. einem Befehl hinzuweisen.  Die Dokumentation von Toshiba ist an
  10375. diesem Punkt leider etwas schwer verst"andlich.
  10376.  
  10377. %%---------------------------------------------------------------------------
  10378.  
  10379. \section{29xxx}
  10380.  
  10381. Wie schon beim \tty{ASSUME}-Befehl beschrieben, kann \asname{} mit der Kenntnis
  10382. "uber den Inhalt des RBP-Registers feststellen, ob im User-Modus
  10383. auf gesperrte Register zugegriffen wird.  Diese F"ahigkeit
  10384. beschr"ankt sich nat"urlich auf direkte Zugriffe (also nicht, wenn
  10385. die Register IPA...IPC benutzt werden), und sie hat noch einen
  10386. weiteren Haken: da lokale Register (also solche mit Nummern$>$127)
  10387. relativ zum Stackpointer adressiert werden, die Bits in RBP sich
  10388. aber immer auf absolute Nummern beziehen, wird die Pr"ufung f"ur
  10389. lokale Register NICHT durchgef"uhrt.  Eine Erweiterung auf lokale
  10390. Register w"urde bedingen, da"s \asname{} zu jedem Zeitpunkt den absoluten
  10391. Wert von SP kennt, und das w"urde sp"atestens bei rekursiven
  10392. Unterprogrammen scheitern...
  10393.  
  10394. %%---------------------------------------------------------------------------
  10395.  
  10396. \section{80C16x}
  10397.  
  10398. Wie in der Erkl"arung des \tty{ASSUME}-Befehls schon erl"autert, versucht
  10399. \asname{}, dem Programmierer die Tatsache, da"s der Prozessor mehr physikalischen
  10400. als logischen Speicher hat, soweit als m"oglich zu verbergen.  Beachten
  10401. Sie aber, da"s die DPP-Register \bb{nur} Datenzugriffe betreffen und auch dort
  10402. nur absolute Adressierung, also weder indirekte noch indizierte Zugriffe,
  10403. da \asname{} ja nicht wissen kann, wie die berechnete Adresse zur Laufzeit
  10404. aussehen wird...Bei Codezugriffen arbeitet die Paging-Einheit leider nicht,
  10405. man mu"s also explizit mit langen oder kurzen \tty{CALL}s, \tty{JMP}s oder
  10406. \tty{RET}s arbeiten.  Zumindest bei den ,,universellen'' Befehlen \tty{CALL}
  10407. und \tty{JMP} w"ahlt \asname{} automatisch die k"urzeste Form, aber sp"atestens
  10408. beim \tty{RET} sollte man wissen, woher der Aufruf kam.  Prinzipiell
  10409. verlangen \tty{JMPS} und \tty{CALLS} dabei, da"s man Segment und Adresse
  10410. getrennt angibt, \asname{} ist jedoch so geschrieben, da"s er eine Adresse selber
  10411. zerlegen kann, z.B.
  10412. \begin{verbatim}
  10413.        jmps    12345h
  10414. \end{verbatim}
  10415. anstelle von
  10416. \begin{verbatim}
  10417.        jmps    1,2345h
  10418. \end{verbatim}
  10419. Leider sind nicht alle Effekte der chipinternen Instruktions-Pipeline
  10420. versteckt: Werden CP (Registerbankadresse), SP (Stack) oder eines der
  10421. Paging-Register ver"andert, so steht der neue Wert noch nicht f"ur den
  10422. n"achsten Befehl zur Verf"ugung.  \asname{} versucht, solche Situationen zu
  10423. erkennen und gibt im Falle eines Falles eine Warnung aus.  Aber auch
  10424. diese Mimik greift nur bei direkten Zugriffen.
  10425. \par
  10426. Mit \tty{BIT} definierte Bits werden intern in einem 13-Bit-Wort abgelegt,
  10427. wobei die Bitadresse in Bit 4..11 liegt und die Bitnummer in den unteren
  10428. vier Bits.  Diese Anordnung erlaubt es, das n"achsth"ohere bzw.
  10429. n"achstniedrigere Bit durch Inkrementieren bzw. Dekrementieren anzusprechen.
  10430. Bei expliziten Bitangaben mit Punkt funktioniert das aber nicht "uber
  10431. Wortgrenzen hinaus.  So erzeugt folgender Ausdruck eine
  10432. Wertebereichs"uberschreitung:
  10433. \begin{verbatim}
  10434.        bclr    r5.15+1
  10435. \end{verbatim}
  10436. Hier mu"s ein \tty{BIT} her:
  10437. \begin{verbatim}
  10438. msb     bit     r5.15
  10439.        .
  10440.        .
  10441.        .
  10442.        bclr    msb+1
  10443. \end{verbatim}
  10444. F"ur den 80C167/165/163 ist der SFR-Bereich verdoppelt worden; da"s ein Bit im
  10445. zweiten Teil liegt, wird durch ein gesetztes Bit 12 vermerkt.  Leider
  10446. hatte Siemens bei der Definition des 80C166 nicht vorausgesehen, da"s
  10447. 256 SFRs (davon 128 bitadressierbar) f"ur Nachfolgechips nicht reichen
  10448. w"urden. So w"are es unm"oglich, den zweiten SFR-Bereich von F000H..F1DFH
  10449. mit kurzen Adressen oder Bitbefehlen zu erreichen, h"atten die Entwickler
  10450. nicht einen Umschaltbefehl eingebaut:
  10451. \begin{verbatim}
  10452.        EXTR    #n
  10453. \end{verbatim}
  10454. Dieser Befehl bewirkt, da"s f"ur die n"achsten \tty{n} Befehle (0$<$\tty{n}$<$5)
  10455. anstelle des normalen der erweiterte SFR-Bereich angesprochen werden kann.
  10456. \asname{} erzeugt bei diesm Befehl nicht nur den passenden Code, sondern setzt
  10457. intern ein Flag, da"s f"ur die n"achsten \tty{n} Befehle nur Zugriffe auf den
  10458. erweiterten SFR-Bereich zul"a"st.  Da d"urfen nat"urlich keine Spr"unge
  10459. dabei sein... Bits aus beiden Bereichen lassen sich nat"urlich jederzeit
  10460. definieren, ebenso sind komplette Register aus beiden SFR-Bereichen
  10461. jederzeit mit absoluter Adressierung erreichbar.  Nur die kurze bzw.
  10462. Bitadressierung geht immer nur abwechselnd, Zuwiderhandlungen werden
  10463. mit einer Fehlermeldung geahndet.
  10464. \par
  10465. "Ahnlich sieht es mit den Pr"afixen f"ur absolute bzw. indirekte
  10466. Adressierung aus: Da aber sowohl Argument des Pr"afixes als auch der
  10467. Adre"sausdruck nicht immer zur "Ubersetzungszeit bestimmbar sind, sind
  10468. die Pr"ufungsm"oglichkeiten durch \asname{} sehr eingeschr"ankt, weshalb er es
  10469. auch bei Warnungen bel"a"st...im einzelnen sieht das folgenderma"sen aus:
  10470. \begin{itemize}
  10471. \item{feste Vorgabe einer 64K-Bank mittels \tty{EXTS} oder \tty{EXTSR}:
  10472.      Im Adre"sausdruck werden direkt die unteren 16 Bit der Zieladresse
  10473.      eingesetzt.  Haben sowohl Pr"afix als auch Befehl einen konstanten
  10474.      Operanden, so wird "uberpr"uft, ob Pr"afixargument und Bit 16..23 der
  10475.      Zieladresse identisch sind.}
  10476. \item{feste Vorgabe einer 16K-Seite mittels \tty{EXTP} oder \tty{EXTPR}:
  10477.      Im Adre"sausdruck werden direkt die unteren 14 Bit der Zieladresse
  10478.      eingesetzt.  Bit 14 und 15 bleiben konstant 0, da sie in diesem Modus
  10479.      nicht vom Prozessor ausgewertet werden.  Haben sowohl Pr"afix als
  10480.      auch Befehl einen konstanten Operanden, so wird "uberpr"uft, ob
  10481.      Pr"afixargument und Bit 14..23 der Zieladresse identisch sind.}
  10482. \end{itemize}
  10483. Damit das etwas klarer wird, ein Beispiel (die DPP-Register haben
  10484. die Reset-Vorbelegung) :
  10485. \begin{verbatim}
  10486.       extp     #7,#1           ; Bereich von 112K..128K
  10487.       mov      r0,1cdefh       ; ergibt Adresse 0defh im Code
  10488.       mov      r0,1cdefh       ; -->Warnung
  10489.       exts     #1,#1           ; Bereich von 64K..128K
  10490.       mov      r0,1cdefh       ; ergibt Adresse 0cdefh im Code
  10491.       mov      r0,1cdefh       ; -->Warnung
  10492. \end{verbatim}
  10493.  
  10494. %%---------------------------------------------------------------------------
  10495.  
  10496. \section{PIC16C5x/16C8x}
  10497.  
  10498. "Ahnlich wie die MCS-48-Familie teilen auch die PICs ihren
  10499. Programmspeicher in mehrere B"anke auf, da im Opcode nicht gen"ugend Platz
  10500. f"ur die vollst"andige Adresse war.  \asname{} verwendet f"ur die Befehle \tty{CALL}
  10501. und \tty{GOTO} die gleiche Automatik, d.h. setzt die PA-Bits im
  10502. Statuswort entsprechend Start- und Zieladresse.  Im Gegensatz zu den 48ern
  10503. ist dieses Verfahren hier aber noch deutlich problematischer:
  10504. \begin{enumerate}
  10505. \item{Die Befehle sind nicht mehr nur ein Wort, sondern bis zu drei Worten
  10506.      lang, k"onnen also nicht mehr in jedem Fall mit einem bedingten Sprung
  10507.      "ubergangen werden.}
  10508. \item{Es ist m"oglich, da"s der Programmz"ahler beim normalen
  10509.      Programmfortgang eine Seitengrenze "uberschreitet.  Die vom Assembler
  10510.      angenommene Belegung der PA-Bits stimmt dann nicht mehr mit der
  10511.      Realit"at "uberein.}
  10512. \end{enumerate}
  10513. Bei den Befehlen, die das Register W mit einem anderen Register
  10514. verkn"upfen, mu"s normalerweise als zweiter Parameter angegeben werden, ob
  10515. das Ergebnis in W oder im Register abgelegt werden soll.  Bei diesem
  10516. Assembler ist es erlaubt, den zweiten Parameter wegzulassen.  Welches Ziel
  10517. dann angenommen werden soll, h"angt vom Typ des Befehls ab: bei un"aren
  10518. Operationen wird defaultm"a"sig das Ergebnis zur"uck ins Register gelegt.
  10519. Diese Befehle sind:
  10520. \begin{quote}
  10521. {\tt COMF, DECF, DECFSZ, INCF, INCFSZ, RLF, RRF} und {\tt SWAPF}
  10522. \end{quote}
  10523. Die anderen Befehle betrachten W defaultm"a"sig als Akkumulator, zu dem ein
  10524. Register verkn"upft wird:
  10525. \begin{quote}
  10526. {\tt ADDWF, ANDWF, IORWF, MOVF, SUBWF} und {\tt XORWF}
  10527. \end{quote}
  10528. \par
  10529. Die von Microchip vorgegebene Schreibweise f"ur Literale ist ziemlich
  10530. abstrus und erinnert an die auf IBM 360/370-Systemen "ubliche Schreibweise
  10531. (Gr"u"se aus Neandertal...).  Um nicht noch einen Zweig in den Parser
  10532. einf"ugen zu m"ussen, sind bei \asname{} Konstanten in
  10533. Motorola-Syntax zu schreiben (wahlweise auch Intel oder C im \tty{RELAXED}-Modus).
  10534. \par
  10535. Dem Assembler liegt die Include-Datei STDDEF16.INC bei, in der die Adressen
  10536. der Hardware-Register und Statusbits verewigt sind.  Daneben enth"alt sie
  10537. eine Liste von ,,Befehlen'', die der Microchip-Assembler als Makro
  10538. implementiert.  Bei der Benutzung dieser Befehlsmakros ist gro"se Vorsicht
  10539. angebracht, da sie mehrere Worte lang sind und sich somit nicht "uberspringen
  10540. lassen!!
  10541.  
  10542. %%---------------------------------------------------------------------------
  10543.  
  10544. \section{PIC17C4x}
  10545.  
  10546. F"ur diese Prozessoren gelten im wesentlichen die gleichen Hinweise wie
  10547. f"ur ihre kleinen Br"uder, mit zwei Ausnahmen: Die zugeh"orige Include-Datei
  10548. enth"alt nur Registerdefinitionen, und die Probleme bei Sprungbefehlen
  10549. sind deutlich kleiner.  Aus der Reihe f"allt nur \tty{LCALL}, der einen
  10550. 16-Bit-Sprung erlaubt.  Dieser wird mit folgendem ,,Makro'' "ubersetzt:
  10551. \begin{verbatim}
  10552.        MOVLW   <Adr15..8>
  10553.        MOWF    3
  10554.        LCALL   <Adr0..7>
  10555. \end{verbatim}
  10556.  
  10557. %%---------------------------------------------------------------------------
  10558.  
  10559. \section{SX20/28}
  10560.  
  10561. Durch die beschr"ankte L"ange des Instruktionswortes ist es nicht
  10562. m"oglich, darin eine vollst"andige Programmspeicher-Adresse (11 Bit)
  10563. oder Datenspeicher-Adresse (8 Bit) unterzubringen.  Der Prozessor
  10564. erg"anzt die gek"urzten Adressen um die PA-Bits aus dem
  10565. STATUS-Register bzw. oberen Bits aus dem FSR-Register.  "Uber
  10566. \tty{ASSUME}-Befehle teilt man dem Assembler deren aktuellen Inhalt
  10567. mit.  Falls auf Adressen zugegriffen wird, die mit den vermerkten
  10568. Werten nicht zugreifbar sind, erfolgt eine Warnung.
  10569.  
  10570. %%---------------------------------------------------------------------------
  10571.  
  10572. \section{ST6}
  10573.  
  10574. Diese Prozessoren k"onnen das Code-ROM seitenweise in den Datenbereich
  10575. einblenden.  Weil ich nicht die ganze Mimik des \tty{ASSUME}-Befehles
  10576. hier wiederk"auen m"ochte, verweise ich auf das entsprechende Kapitel
  10577. (\ref{ST6Assume}), in dem steht, wie man mit diesem Befehl einigerma"sen
  10578. unfallfrei Konstanten aus dem ROM lesen kann.
  10579. \par
  10580. Bei n"aherer Betrachtung des Befehlssatzes fallen einige eingebaute
  10581. ,,Makros'' auf.  Die Befehle, die mir aufgefallen sind (es gibt aber
  10582. vielleicht noch mehr...), sind in Tabelle \ref{TabHid62} aufgelistet.
  10583. \par
  10584. \begin{table*}[htbp]
  10585. \begin{center}\begin{tabular}{|l|l|}
  10586. \hline
  10587. Befehl   & in Wirklichkeit \\
  10588. \hline
  10589. \hline
  10590. \tty{CLR A}    & \tty{SUB A,A} \\
  10591. \tty{SLA A}    & \tty{ADD A,A} \\
  10592. \tty{CLR adr}  & \tty{LDI adr,0} \\
  10593. \tty{NOP}      & \tty{JRZ PC+1} \\
  10594. \hline
  10595. \end{tabular}\end{center}
  10596. \caption{versteckte Makros im ST6225-Befehlssatz\label{TabHid62}}
  10597. \end{table*}
  10598. Insbesondere der letztere Fall verbl"ufft doch etwas...
  10599. Leider fehlen aber einige Anweisungen wirklich.  So gibt es z.B. zwar einen
  10600. \tty{AND}-Befehl, aber kein \tty{OR}...von \tty{XOR} gar nicht zu
  10601. reden.  In der Datei  STDDEF62.INC finden sich deshalb neben den Adressen
  10602. der SFRs noch einige Makros zur Abhilfe.
  10603. \par
  10604. Der Original-Assembler AST6 von SGS-Thomson verwendet teilweise andere
  10605. Pseudobefehle als \asname{}.  Au"ser der Tatsache, da"s \asname{} Pseudobefehle nicht
  10606. mit einem vorangestellten Punkt kennzeichnet, sind folgende Befehle
  10607. identisch:
  10608. \begin{verbatim}
  10609.  ASCII, ASCIZ, BLOCK, BYTE, END, ENDM, EQU, ERROR, MACRO,
  10610.  ORG, TITLE, WARNING
  10611. \end{verbatim}
  10612. Tabelle \ref{TabAST6} zeigt die AST6-Befehle, zu denen analoge in \asname{}
  10613. existieren.
  10614. \par
  10615. \begin{table*}[htbp]
  10616. \begin{center}\begin{tabular}{|l|l|l|}
  10617. \hline
  10618. AST6           &   \asname{}                & Bedeutung/Funktion \\
  10619. \hline
  10620. \hline
  10621. \tty{.DISPLAY} &  \tty{MESSAGE}               & Meldung ausgeben \\
  10622. \hline
  10623. \tty{.EJECT}   &  \tty{NEWPAGE}               & neue Seite im Listing \\
  10624. \hline
  10625. \tty{.ELSE}    &  \tty{ELSEIF}                & bed. Assemblierung \\
  10626. \hline
  10627. \tty{.ENDC}    &  \tty{ENDIF}                 & bed. Assemblierung \\
  10628. \hline
  10629. \tty{.IFC}     &  \tty{IF...}                 & bed. Assemblierung \\
  10630. \hline
  10631. \tty{.INPUT}   &  \tty{INCLUDE}               & Include-Datei einbinden \\
  10632. \hline
  10633. \tty{.LIST}    &  \tty{LISTING}, \tty{MACEXP\_DFT} & Listing-Einstellung \\
  10634. \hline
  10635. \tty{.PL}      &  \tty{PAGE}                  & Seitenl"ange Listing \\
  10636. \hline
  10637. \tty{.ROMSIZE} &  \tty{CPU}                   & Zielprozessor einstellen \\
  10638. \hline
  10639. \tty{.VERS}    &  \tty{VERSION} (Symbol)      & Version abfragen \\
  10640. \hline
  10641. \tty{.SET}     &  \tty{EVAL}                  & Variablen neu setzen \\
  10642. \hline
  10643. \end{tabular}\end{center}
  10644. \caption{"aquivalente Befehle AST6$\leftrightarrow$\asname{}\label{TabAST6}}
  10645. \end{table*}
  10646.  
  10647. %%---------------------------------------------------------------------------
  10648.  
  10649. \section{ST7}
  10650.  
  10651. In \cite{ST7Man} ist der '.w'-Postfix f"ur 16-Bit-Adressen nur f"ur
  10652. speicherindirekte Operanden definiert, um zu vermerken, da"s auf einer
  10653. Zeropageadresse eine 16-bittige Adresse liegt; \asname{} unterst"utzt ihn jedoch
  10654. zus"atzlich auch f"ur absolute Adressen oder Displacements in indizierter
  10655. Adressierung, um trotz eines nur 8 Bit langen Wertes (0..255) ein
  10656. 16-bittiges Displacement zu erzeugen.
  10657.  
  10658. %%---------------------------------------------------------------------------
  10659.  
  10660. \section{ST9}
  10661.  
  10662. Die Bitadressierungsm"oglichkeiten des ST9 sind relativ eingeschr"ankt:
  10663. Mit Ausnahme des \tty{BTSET}-Befehls ist es nur m"oglich, auf Bits innerhalb
  10664. des aktuellen Arbeitsregistersatzes zuzugreifen.  Eine Bit-Adresse
  10665. sieht also folgenderma"sen aus:
  10666. \begin{verbatim}
  10667.  rn.[!]b
  10668. \end{verbatim}
  10669. wobei \verb?!? eine optionale Invertierung eines Quelloperanden bedeutet.
  10670. Wird ein Bit symbolisch mittels des \tty{BIT}-Befehles definiert, so wird
  10671. die Registernummer im Symbolwert in Bit 7..4, die Bitnummer in Bit
  10672. 3..1 und eine optionale Invertierung in Bit 0 vermerkt.  \asname{} unterscheidet
  10673. direkte und symbolische Bitangaben am Fehlen eines Punktes,
  10674. der Name eines Bitsymboles darf also keinen Punkt enthalten, obwohl
  10675. sie an sich zul"assig w"aren.  Es ist auch zul"assig, bei der Referenzierung
  10676. von Bitsymbolen diese zu nachtr"aglich zu invertieren:
  10677. \begin{verbatim}
  10678. bit2    bit     r5.3
  10679.        .
  10680.        .
  10681.         bld     r0.0,!bit2
  10682. \end{verbatim}
  10683. Auf diese Weise ist es auch m"oglich, eine inverse Definition nachtr"aglich
  10684. wieder aufzuheben.
  10685. \par
  10686. Bitdefinitionen finden sich in gro"ser Zahl in der Include-Datei
  10687. REGST9.INC, in der die Register- und Bitnamen aller On-Chip-Peripherie
  10688. beschrieben sind.  Beachten Sie jedoch, da"s deren Nutzung
  10689. nur m"oglich ist, wenn die Arbeitsregisterbank vorher auch auf diese
  10690. Register ausgerichtet wurde!
  10691. \par
  10692. Im Gegensatz zu der zum AST9 von SGS-Thomson geh"orenden Definitionsdatei
  10693. sind f"ur \asname{} die Namen der Peripherieregister nur als allgemeine
  10694. Registernamen definiert (\tty{R...}), nicht auch noch als Arbeitsregister
  10695. (\tty{r...}).  Dies ist so, weil \asname{} Geschwindigkeitsgr"unden keine
  10696. Aliasnamen f"ur Register definieren kann.
  10697.  
  10698. %%---------------------------------------------------------------------------
  10699.  
  10700. \section{6804}
  10701.  
  10702. Eigentlich habe ich diesen Prozessor ja nur eingebaut, um mich "uber
  10703. das seltsame Gebaren von SGS-Thomson zu beklagen: Als ich das
  10704. 6804-Datenbuch zum ersten Mal in die Hand bekam, f"uhlte ich mich ob des
  10705. etwas ,,unvollst"andigen'' Befehlssatzes und der eingebauten Makros
  10706. spontan an die ST62-Serie vom gleichen Hersteller erinnert.  Ein
  10707. genauerer Vergleich der Opcodes f"orderte erstaunliches zu Tage:
  10708. Ein 6804-Opcode ergibt sich durch Spiegelung aller Bits im entsprechenden
  10709. ST62-OpCode!  Thomson hat hier also offensichtlich etwas
  10710. Prozessorkern-Recycling betrieben...wogegen ja auch nichts einzuwenden
  10711. w"are, wenn nicht so eine Verschleierungstaktik betrieben werden w"urde:
  10712. andere Peripherie, Motorola- anstelle Zilog-Syntax sowie das h"a"sliche
  10713. Detail, in Opcodes enthaltene Argumente (z.B. Bitfelder mit Displacements)
  10714. \bb{nicht} zu drehen. Letzterer Punkt hat mich auch nach l"angerem "Uberlegen
  10715. dazu bewogen, den 6804 doch in \asname{} aufzunehmen.  Ich wage "ubrigens keine
  10716. Spekulationen, welche Abteilung bei Thomson von welcher abgekupfert hat...
  10717. \par
  10718. Im Gegensatz zur ST62-Version enth"alt die Include-Datei f"ur den
  10719. 6804 keine Makros, die die L"ucken im Befehlssatz etwas ,,auspolstern''
  10720. sollen.  Dies "uberlasse ich dem geneigten Leser als Finger"ubung!
  10721.  
  10722. %%---------------------------------------------------------------------------
  10723.  
  10724. \section{TMS3201x}
  10725.  
  10726. Offensichtlich ist es Ehrgeiz jedes Prozessorherstellers, seine eigene
  10727. Notation f"ur Hexadezimalkonstanten zu erfinden.  Texas Instruments
  10728. war bei diesen Prozessoren besonders originell: ein vorangestelltes
  10729. $>$-Zeichen!  Die "Ubernahme dieses Formates in \asname{} h"atte zu schweren
  10730. Konflikten mit den Vergleichs-und Schiebeoperatoren von \asname{} im Formelparser
  10731. gef"uhrt.  Ich habe mich deshalb f"ur die Intel-Notation entschieden, zu
  10732. der sich TI bei der 340x0-Serie und den 3201x-Nachfolgern ja dann auch
  10733. durchgerungen hat...
  10734. \par
  10735. Leider hat das Instruktionswort dieser Prozessoren nicht gen"ugend Bits,
  10736. um bei direkter Adressierung alle 8 Bits zu enthalten, weshalb der
  10737. Datenadre"sraum logisch in 2 B"anke zu 128 W"ortern gespalten ist.  \asname{}
  10738. verwaltet diesen als ein durchgehendes Segment von 256 W"ortern und
  10739. l"oscht bei direkten Zugriffen automatisch das Bit 7 (Ausnahme: Befehl
  10740. \tty{SST}, der nur in die obere Bank schreiben kann). Der Programmierer
  10741. ist daf"ur erforderlich, da"s das Bank-Bit stets den richtigen Wert hat!
  10742. \par
  10743. Ein weiterer, nur sehr versteckt im Datenbuch stehender Hinweis: Die
  10744. \tty{SUBC}-Anweisung ben"otigt zur Ausf"uhrung intern mehr als einen
  10745. Takt, das Steuerwerk arbeitet jedoch schon an dem n"achsten Befehl weiter.
  10746. Im auf ein \tty{SUBC} folgenden Befehl darf deshalb nicht auf den
  10747. Akkumulator zugegriffen werden.  \asname{} nimmt hier \bb{keine} Pr"ufung vor!
  10748.  
  10749. %%---------------------------------------------------------------------------
  10750.  
  10751. \section{TMS320C2x}
  10752.  
  10753. Da ich nicht selber diesen Codegenerator geschrieben habe (was nichts an
  10754. seiner Qualit"at mindert), kann ich nur kurz hier umrei"sen, wieso es
  10755. Befehle gibt, bei denen ein vorangestelltes Label als untypisiert, d.h.
  10756. keinem Adre"sraum zugeordnet, gespeichert wird:  Der 20er der TMS-Reihe
  10757. kennt sowohl ein 64 Kbyte gro"ses Code- als auch Datensegment.  Je nach
  10758. externer Beschaltung kann man dabei Code- und Datenbereiche "uberlappen,
  10759. um z.B. Konstanten im Codebereich zu abzulegen und auf diese als Daten
  10760. zuzugreifen (Ablage im Code ist notwendig, weil "altere \asname{}-Versionen davon
  10761. ausgehen, da"s ein Datensegment aus RAM besteht, das in einem
  10762. Standalone-System nach dem Einschalten keinen definierten Inhalt hat und
  10763. verweigern in Segmenten au"ser Code deshalb die Ablage von Daten).  Ohne
  10764. dieses Feature w"urde \asname{} nun jeden Zugriff auf die abgelegten Daten mit
  10765. einer Warnung (,,Symbol aus falschem Segment'') quittieren.  Im einzelnen
  10766. erzeugen folgende Pseudobefehle untypisierte Labels:
  10767. \begin{quote}
  10768.  {\tt BSS, STRING, RSTRING, BYTE, WORD , LONG, FLOAT \\
  10769.  DOUBLE, EFLOAT, BFLOAT} und {\tt TFLOAT}
  10770. \end{quote}
  10771. Sollten doch einmal typisierte Labels gew"unscht sein, so kann man sich
  10772. behelfen, indem man das Label in eine getrennte Zeile vor dem Pseudobefehl
  10773. schreibt.  Umgekehrt kann man einen der anderen Pseudobefehle mit einem
  10774. typenlosen Label versehen, indem man vor dem Befehl das Label mit
  10775. \begin{verbatim}
  10776. <Name>  EQU     $
  10777. \end{verbatim}
  10778. definiert.
  10779.  
  10780. %%---------------------------------------------------------------------------
  10781.  
  10782. \section{TMS320C3x/C4x}
  10783.  
  10784. Die gr"o"sten Magenschmerzen bei diesem Prozessor hat mir die Syntax
  10785. paralleler Befehle bereitet, die auf zwei Zeilen verteilt werden,
  10786. wobei beide Befehle an sich auch sequentiell ausgef"uhrt werden k"onnen.
  10787. Deshalb erzeugt \asname{} zuerst den Code f"ur die einzelne erste Operation,
  10788. wenn er dann in der zweiten Zeile erkennt, da"s eine parallele Anweisung
  10789. vorliegt, wird der zuerst erzeugte Code durch den neuen ersetzt.
  10790. Im Listing kann man dies daran erkennen, da"s der Programmz"ahler
  10791. nicht weiterl"auft und in der zweiten Zeile anstelle eines Doppelpunktes
  10792. ein \tty{R} vor dem erzeugten Code steht.
  10793. \par
  10794. Bez"uglich der doppelten senkrechten Striche und ihrer Position in der
  10795. Zeile ist man nicht ganz so flexibel wie beim TI-Assembler: Entweder
  10796. man schreibt sie anstelle eines Labels (d.h. in der ersten Spalte oder
  10797. mit einem angeh"angten Doppelpunkt, das ist aber nicht mehr
  10798. TI-kompatibel...) oder direkt vor den zweiten Befehl ohne Leerzeichen,
  10799. sonst bekommt der Zeilenparser von \asname{} Probleme und h"alt die Striche
  10800. f"ur das Mnemonic.
  10801.  
  10802. %%---------------------------------------------------------------------------
  10803.  
  10804. \section{TMS9900}
  10805.  
  10806. Wie bei den meisten "alteren Prozessorfamilien auch, hatte TI seinerzeit
  10807. ein eigenes Format zur Schreibweise von Hexadezimal- und Bin"arkonstanten
  10808. verwendet, anstelle deren \asname{} die normale, heute auch bei TI
  10809. gebr"auchliche Intel-Notation verwendet.
  10810.  
  10811. Die TI-Syntax f"ur Register erlaubt es, da"s anstelle eines echten Namens
  10812. (entweder \tty{Rx} oder \tty{WRx}) auch eine einfache Integer-Zahl
  10813. zwischen 0 und 15 benutzt werden kann.  Dies hat zwei Folgen:
  10814. \begin{itemize}
  10815. \item{\tty{R0...R15} bzw. \tty{WR0..WR15} sind einfache, vordefinierte
  10816.      Integersymbole mit den Werten 0..15, und die Definition von
  10817.      Registeraliasen funktioniert "uber schlichte \tty{EQUs}.}
  10818. \item{Im Gegensatz zu einigen anderen Prozessoren kann ich nicht das
  10819.      zus"atzliche \asname{}-Feature anbieten, da"s das Kennzeichen f"ur
  10820.      absolute Adressierung (hier ein Klammeraffe) weggelassen werden
  10821.      darf.  Da ein fehlendes Kennzeichen hier aber Registernummern (im
  10822.      Bereich 0 bis 15) bedeuten w"urde, war das hier nicht m"oglich.}
  10823. \end{itemize}
  10824. Weiterhin wechselt TI mit der Registerbezeichnung zwischen \tty{Rx} und
  10825. \tty{WRx}...vorerst ist beides zugelassen.
  10826.  
  10827. %%---------------------------------------------------------------------------
  10828.  
  10829. \section{TMS70Cxx}
  10830.  
  10831. Diese Prozessorreihe geh"ort noch zu den "alteren, von TI entwickelten
  10832. Reihen, und deswegen benutzt TI in ihren eigenen Assemblern noch die
  10833. herstellereigene Syntax f"ur hexadezimale und bin"are Konstanten
  10834. (vorangestelltes $<$ bzw. ?).  Da das in \asname{} aber so nicht machbar ist, wird
  10835. defaultm"a"sig die Intel-Syntax verwendet.  Auf diese ist Texas bei den
  10836. Nachfolgern dieser Familie, n"amlich den 370ern auch umgestiegen.  Beim
  10837. genaueren Betrachten des Maschinenbefehlssatzes stellt man fest, da"s
  10838. ca. 80\% der 7000er-Befehle bin"ar aufw"artskompatibel sind, und auch die
  10839. Assemblersyntax ist fast gleich - aber eben nur fast.  Bei der Erweiterung
  10840. des 7000er-Befehlssatzes hat TI n"amlich auch gleich die Chance genutzt,
  10841. die Syntax etwas zu vereinheitlichen und zu vereinfachen.  Ich habe mich
  10842. bem"uht, einen Teil dieser "Anderungen auch in die 7000er Syntax
  10843. einflie"sen zu lassen:
  10844. \begin{itemize}
  10845. \item{Anstelle eines Prozentzeichens zur Kennzeichnung von
  10846.      unmittelbarer Adressierung darf auch das allgemein bekanntere Doppelkreuz
  10847.      verwendet werden.}
  10848. \item{Wenn bei den Befehlen \tty{AND, BTJO, BTJZ, MOV, OR} und
  10849.      \tty{XOR} eine Port-Adresse (\tty{P...}) als Quelle oder Ziel
  10850.      benutzt wird, ist es nicht notwendig, die Mnemonic-Form mit explizit
  10851.      angeh"angtem \tty{P} zu benutzen - die allgemeine Form reicht genauso
  10852.      aus.}
  10853. \item{Der vorangestelle Klammeraffe f"ur absolute oder B-indizierte
  10854.      Adressierung darf weggelassen werden.}
  10855. \item{Anstelle des \tty{CMPA}-Befehls darf auch einfach
  10856.      \tty{CMP} mit \tty{A} als Ziel benutzt werden.}
  10857. \item{Anstelle \tty{LDA} oder \tty{STA} darf auch einfach der \tty{MOV}-Befehl
  10858.      mit \tty{A} als Ziel bzw. Quelle benutzt werden.}
  10859. \item{Anstelle des \tty{MOVD}-Befehls darf auch \tty{MOVW} benutzt werden.}
  10860. \item{Anstelle von \tty{RETS} oder \tty{RETI} darf auch verk"urzt
  10861.      \tty{RTS} bzw. \tty{RTI} geschrieben werden.}
  10862. \item{\tty{TSTA} bzw. \tty{TSTB} d"urfen auch als \tty{TST A} bzw. \tt{TST
  10863.      B} geschrieben werden.}
  10864. \item{\tty{XCHB B} ist als Alias f"ur \tty{TSTB} zugelassen.}
  10865. \end{itemize}
  10866. Wichtig - diese Varianten sind nur beim TMS70Cxx zugelassen - entsprechende
  10867. 7000er-Varianten sind bei den 370ern {\em nicht} erlaubt!
  10868.  
  10869. %%---------------------------------------------------------------------------
  10870.  
  10871. \section{TMS370xxx}
  10872.  
  10873. Obwohl diese Prozessoren keine speziellen Befehle zur Bitmanipulation
  10874. besitzen, wird mit Hilfe des Assemblers und des \tty{DBIT}-Befehles
  10875. (siehe dort) die Illusion erzeugt, als ob man einzelne Bits manipulieren
  10876. w"urde.  Dazu wird beim \tty{DBIT}-Befehl eine Adresse mit einer
  10877. Bitposition zusammengefa"st und in einem Symbol abgelegt, das man dann
  10878. als Argument f"ur die Pseudobefehle \tty{SBIT0, SBIT1, CMPBIT, JBIT0}
  10879. und \tty{JBIT1} verwenden kann.  Diese werden in die Befehle
  10880. \tty{OR, AND, XOR, BTJZ} und \tty{BTJO} mit einer passenden Bitmaske
  10881. "ubersetzt.
  10882. \par
  10883. An diesen Bit-Symbolen ist "uberhaupt nichts geheimnisvolles, es handelt
  10884. sich um schlichte Integerwerte, in deren unterer H"alfte die
  10885. Speicheradresse und in deren oberer H"alfte die Bitstelle gespeichert
  10886. wird.  Man k"onnte sich seine Symbole also auch ohne weiteres selber
  10887. basteln:
  10888. \begin{verbatim}
  10889. defbit  macro   name,bit,adr
  10890. name    equ     adr+(bit<<16)
  10891.        endm
  10892. \end{verbatim}
  10893. aber mit dieser Schreibweise erreicht man nicht den \tty{EQU}-artigen Stil,
  10894. den Texas vorgegeben hat (d.h. das zu definierende Symbol steht anstelle
  10895. eines Labels).  ACHTUNG!  Obwohl \tty{DBIT} eine beliebige Adresse
  10896. zul"a"st, k"onnen f"ur die Pseudobefehle nur die Adressen 0..255 und
  10897. 1000h..10ffh verwendet werden, eine absolute Adressierungsart kennt
  10898. der Prozessor an dieser Stelle nicht...
  10899.  
  10900. %%---------------------------------------------------------------------------
  10901.  
  10902. \section{MSP430(X)}
  10903. \label{MSPSpec}
  10904.  
  10905. Der MSP430 wurde als RISC-Prozessor mit minimalem Stromverbrauch
  10906. konzipiert.  Aus diesem Grund ist der Satz von Befehlen, die der
  10907. Prozessor in Hardware versteht, auf das absolut notwendige reduziert
  10908. worden (da RISC-Prozessoren keinen Mikrocode besitzen, mu"s jeder
  10909. Befehl mit zus"atzlichem Silizium implementiert werden und erh"oht so
  10910. den Stromverbrauch).  Eine Reihe von Befehlen, die bei anderen
  10911. Prozessoren in Hardware gegossen wurden, werden beim MSP durch eine
  10912. Emulation mit anderen Befehlen realisiert.  Fr"uhere Versionen
  10913. von \asname{} implementierten diese Befehle "uber Makros in der Datei
  10914. \tty{REGMSP.INC}.  Wer diese Datei nicht einband, erhielt bei "uber
  10915. der H"alfte der insgesamt von TI definierten Befehle
  10916. Fehlermeldungen.  Dies ist aktuell nicht mehr so, zusammen mit
  10917. der Erweiterung auf den CPU430X-Befehlssatz werden die
  10918. Instruktionen vom Assembler direkt implementiert.
  10919. \tty{REGMSP.INC} enth"alt nur noch die Adressen von I/O-Registern.
  10920. Wer aus irgendwelchen Gr"unden die alten Makros braucht, findet
  10921. sie jetzt in der Datei \tty{EMULMSP.INC}.
  10922.  
  10923. Die emulierten Instruktionen decken auch einige Sonderf"alle ab,
  10924. die der TI-Assembler nicht beherrscht.  So wird zum Beispiel
  10925. \begin{verbatim}
  10926.    rlc  @r6+
  10927. \end{verbatim}
  10928. automatisch in
  10929. \begin{verbatim}
  10930.    addc @r6+,-2(r6)
  10931. \end{verbatim}
  10932. umgesetzt.
  10933.  
  10934. %%---------------------------------------------------------------------------
  10935.  
  10936. \section{TMS1000}
  10937.  
  10938. Der erste Mikrocontroller der Welt nun endlich auch in \asname{} - lange hat es
  10939. gedauert, nun ist die L"ucke geschlossen.  Dieses Target hat aber einige
  10940. T"ucken, die in diesem Abschnitt kurz angesprochen werden sollen.
  10941.  
  10942. Zum einen ist der Befehlssatz dieser Controller teilweise "uber die ROM-Maske
  10943. ver"anderbar, d.h. man kann die Funktion einiger Opcodes in Grenzen frei
  10944. definieren.  \asname{} kennt nur die Befehle und deren Kodierungen, die in
  10945. \cite{TMS1000PGMRef} als Default-Kodierungen beschrieben sind.  Wer f"ur eine
  10946. spezielle Anwendung andere Befehle bzw. gleiche Befehle mit anderem Opcode
  10947. hat, kann diese "uber Makros mit passende \tty{DB}-Befehlen "andern.
  10948.  
  10949. Des weiteren ist zu beachten, da"s Spr"unge und Unterprogrammaufrufe nur die
  10950. unteren 6 Bit der Zieladresse im Befehl selber beinhalten.  Die oberen 4 bzw.
  10951. 5 Bits kommen aus Page- bzw. Chapter-Registern, die vorher passend zu setzen
  10952. sind.  \asname{} selber kann hier nicht "uberpr"ufen, ob die Register vom Programmierer
  10953. korrekt gesetzt werden!.  Zumindest f"ur den Fall, da"s man im gleichen Chapter
  10954. bleibt, gibt es die Assembler-Pseudobefehle \tty{CALLL} bzw.
  10955. \tty{BL}, die einen \tty{LDP}- und einen \tty{CALL/BR}-Befehl zusammenfassen
  10956. (was angesichts des kanppen Programmspeichers eine bequeme, aber nicht immer
  10957. effiziente Variante ist).
  10958.  
  10959. %%---------------------------------------------------------------------------
  10960.  
  10961. \section{COP8}
  10962. \label{COP8Spec}
  10963.  
  10964. Leider Gottes hat sich auch National dazu entschieden, als
  10965. Schreibweise f"ur nichtdezimale Integer-Konstanten die von
  10966. IBM-Gro"srechnern bekannte (und von mir nicht geliebte) Variante
  10967. \verb!X'...! zu benutzen.  Das geht nat"urlich (wie immer) nicht.
  10968. Zum Gl"uck scheint der ASMCOP aber auch die C-Variante zuzulassen,
  10969. und diese wurde deshalb der Default f"ur die COPs...
  10970.  
  10971. %%---------------------------------------------------------------------------
  10972.  
  10973. \section{SC/MP}
  10974.  
  10975. Benutzt man beim SC/MP indirekte Adressierung mit Displacement, und
  10976. ist das benutzte Basis- bzw. Pointer-Register nicht P0 bzw. PC, dann
  10977. hat ein Displacement von -128 (80 hex) eine Sonderbedeutung: Anstelle
  10978. eben dieses Werts wird der Inhalt des E-Registers als Displacement
  10979. verwendet. Im 'klassischen' NS-Assembler mu"s der Programmierer um
  10980. diesen Umstand wissen bzw. ihn explizit benutzen, z.B. so:
  10981. \begin{verbatim}
  10982. ereg   equ -128
  10983.       ld  ereg(p1)
  10984. \end{verbatim}
  10985. Dies birgt aber das Risiko, da"s sich der Wert -128 auch einmal
  10986. 'versehentlich' als Teil einer Berechnung ergeben kann, und man
  10987. sucht erst einmal, warum das Programm nicht tut, was erwartet
  10988. wurde.  Ich habe mich deshalb entschlossen, diesen Sonderwert
  10989. etwas expliziter zu machen:
  10990.  
  10991. Wird ein Displacement von -128 verwendet, so erfolgt eine Warnung.
  10992. Diese Warnung kann man ignorieren; will man sie los werden, so
  10993. verwende man das eingebaute Literal \verb!E!, das eben dieses Register
  10994. referenziert:
  10995. \begin{verbatim}
  10996.       ld e(p1)
  10997. \end{verbatim}
  10998. Da das SC/MP-Target Registersymbole unterst"utzt, ist es auch m"oglich,
  10999. das 'eigene Symbol' passend zu definieren:
  11000. \begin{verbatim}
  11001. ereg   reg e
  11002.       ld  ereg(p1)
  11003. \end{verbatim}
  11004. Dies sollte die Anzahl notwendiger Anpassungen in existierendem
  11005. Code auf ein Minimum reduzieren.
  11006.  
  11007. %%---------------------------------------------------------------------------
  11008.  
  11009. \section{SC144xxx}
  11010. \label{SC144xxspec}
  11011.  
  11012. Original gab es f"ur diese Reihe von DECT-Controllern mit relativ
  11013. einfachem Befehlssatz nur einen sehr schlichten Assembler von National
  11014. selber.  Ein Assembler von IAR Systems ist angek"undigt, aber noch nicht
  11015. erh"altlich.  Da die Entwicklungstools von IAR allerdings auch nach
  11016. M"oglichkeit CPU-unabh"angig angelegt sind, kann man anhand erh"altlicher
  11017. Zielplattformen in ungef"ahr absch"atzen, wie dessen Pseudobefehle
  11018. aussehen werden, und damit im Blick sind die (wenigen) SC144xx-spezifisch
  11019. realisierten Befehle {\tt DC, DC8, DW16, DS, DS8, DS16, DW} angelegt. Bei
  11020. Befehlen, die bereits im \asname{}-Kern angelegt sind, wollte ich nat"urlich
  11021. nicht das Rad neu erfinden, deshalb hier eine Tabelle mit "Aquivalenzen:
  11022.  
  11023. Die Befehle \tty{ALIGN, END, ENDM, EXITM, MACRO, ORG, RADIX, SET} und
  11024. \tty{REPT} exisieren sowohl bei IAR als auch \asname{} und haben gleiche
  11025. Bedeutung.  Bei folgenden Befehlen mu"s man umstellen:
  11026.  
  11027. \begin{table*}[htb]
  11028. \begin{center}\begin{tabular}{|l|l|l|}
  11029. \hline
  11030. IAR & \asname{} & Funktion\\
  11031. \hline
  11032. \hline
  11033. \tty{\#include} & \tty{include} & Include-Datei einbinden \\
  11034. \tty{\#define} & \tty{SET, EQU} & Symbole definieren \\
  11035. \tty{\#elif, ELIF, ELSEIF} & \tty{ELSEIF} & Weiterer Zweig einer IF-Kette \\
  11036. \tty{\#else, ELSE} & \tty{ELSE} & Letzter Zweig einer IF-Kette \\
  11037. \tty{\#endif, ENDIF} & \tty{ENDIF} & Beendet eine IF-Kette \\
  11038. \tty{\#error} & \tty{ERROR, FATAL} & Fehlermeldung erzeugen \\
  11039. \tty{\#if, IF} & \tty{IF} & Beginn einer IF-Kette\\
  11040. \tty{\#ifdef} & \tty{IFDEF} & Symbol definiert ? \\
  11041. \tty{\#ifndef} & \tty{IFNDEF} & Symbol nicht definiert ? \\
  11042. \tty{\#message} & \tty{MESSAGE} & Nachricht ausgeben \\
  11043. \tty{=, DEFINE, EQU} & \tty{=, EQU} & Feste Wertzuweisung \\
  11044. \tty{EVEN} & \tty{ALIGN 2} & Programmz"ahler gerade machen \\
  11045. \tty{COL, PAGSIZ} & \tty{PAGE} & Seitengr"o"se f"ur Listing setzen \\
  11046. \tty{ENDR} & \tty{ENDM} & Ende einer REPT-Struktur \\
  11047. \tty{LSTCND, LSTOUT} & \tty{LISTING} & Umfang des Listings steuern \\
  11048. \tty{LSTEXP, LSTREP} & \tty{MACEXP} & Expandierte Makros anzeigen? \\
  11049. \tty{LSTXRF} & \verb!<Kommandozeile>! & Querverweisliste erzeugen \\
  11050. \tty{PAGE} & \tty{NEWPAGE} & Neue Seite im Listing \\
  11051. \tty{REPTC} & \tty{IRPC} & Repetition mit Zeichenersetzung \\
  11052. \hline
  11053. \end{tabular}\end{center}
  11054. \end{table*}
  11055.  
  11056. Keine direkte Entsprechung gibt es f"ur die Befehle {\tt CASEON, CASEOFF,
  11057. LOCAL, LSTPAG, \#undef} und {\tt REPTI}.
  11058.  
  11059. Ein direktes "Aquivalent der Pr"aprozessorbefehle ist nat"urlich nicht
  11060. m"oglich, solange \asname{} keinen C-artigen Pr"aprozessor besitzt.  C-artige
  11061. Kommentare sind im Moment leider auch nicht m"oglich.  Achtung: Wer
  11062. IAR-Codes f"ur \asname{} umsetzt, mu"s die Pr"aprozessorstatements nicht nur
  11063. umwandeln, sondern auch aus Spalte 1 herausbewegen, da bei \asname{} in Spalte 1
  11064. nur Labels stehen d"urfen!
  11065.  
  11066. %%---------------------------------------------------------------------------
  11067.  
  11068. \section{NS32xxx}
  11069.  
  11070. Wie es sich f"ur CISC-Prozessoren geh"ort, verf"ugt diese Serie "uber ausgefeilte
  11071. und komplexe Adressierungsarten.  National definiert in ihren Manuals f"ur
  11072. jede davon die Assembler-Syntax, und \asname{} setzt auch genau diese um.  Wie bei
  11073. fast jeder Architektur, f"ur die Werkzeuge von Drittherstellern erstellt wurden,
  11074. gibt es jedoch auch Abweichungen und Erweiterungen, und ein paar davon habe
  11075. ich auch ,,mitgenommen'':
  11076.  
  11077. Die von National vorgesehene Methode, PC-relativ zu adressieren, ist folgende:
  11078. \begin{verbatim}
  11079. movb r0,*+disp
  11080. \end{verbatim}
  11081. Das dr"uckt nat"urlich sehr klar aus, was in diesem Fall passiert, will man aber
  11082. einfach eine bestimmte Speicherstelle PC-relativ adressieren, dann mu"s man die
  11083. Distanz selber berechnen:
  11084. \begin{verbatim}
  11085. movb r0,*+(addr-*)
  11086. \end{verbatim}
  11087. Die erste Vereinfachung ist, da"s es unter bestimmten Umst"anden auch ausreicht,
  11088. einfach nur
  11089. \begin{verbatim}
  11090. movb r0,addr
  11091. \end{verbatim}
  11092. zu schreiben - absolute Adressierung wird ja durch ein vorangestelltes \@-Zeichen
  11093. kenntlich gemacht.  Diese vereinfachte Schreibweise ist unter folgenden Bedingungen
  11094. erlaubt:
  11095. \begin{itemize}
  11096. \item{Immediate-Adressierung ist nicht erlaubt, z.B. weil es sich um einen
  11097.      Zieloperanden handelt, so da"s keine Verwechslung damit m"oglich ist.}
  11098. \item{Es wird mit einer Index-Erweiterung gearbeitet (in eckigen Klammern angeh"angt),
  11099.      die nicht mit Immediate-Adressierung kombinierbar ist.}
  11100. \end{itemize}
  11101. Alternativ unterst"utzt \asname{} f"ur PC-relative Addressierung immer die Schreibweise
  11102. \begin{verbatim}
  11103. movb r0,addr(pc)
  11104. \end{verbatim}
  11105. Hier wird - analog zum 68000 - die Distanz ebenfalls automatisch berechnet.
  11106.  
  11107. F"ur den External-Mode, der in der National-Syntax folgenderma"sen geschrieben
  11108. wird:
  11109. \begin{verbatim}
  11110. movb r0,ext(disp1)+disp2
  11111. \end{verbatim}
  11112. wird auch die Variante
  11113. \begin{verbatim}
  11114. movb r0,disp2(disp1(ext))
  11115. \end{verbatim}
  11116. unterst"utzt, die wohl im UNIX-Umfeld g"angig war.
  11117.  
  11118. %%---------------------------------------------------------------------------
  11119.  
  11120. \section{uPD78(C)1x}
  11121. \label{78C1xSpec}
  11122.  
  11123. F"ur relative, unbedingte Spr"unge gibt es den \tty{JR}-Befehl (Sprungdistanz
  11124. -32...+31, 1 Byte) sowie den \tty{JRE}-Befehl (Sprungdistanz -256...+255, 2
  11125. Bytes).  \asname{} kennt weiterhin den Pseudobefehl \tty{J}, der automatisch den
  11126. k"urzestm"oglichen Befehl benutzt.
  11127.  
  11128. Architektur und Befehlssatz dieser Prozessoren sind grob an den
  11129. Intel 8080/8085 angelehnt - das gilt auch f"ur die Mnemonics.  Die
  11130. Adressierungsart (direkt, indirekt, immediate) ist mit in das
  11131. Mnemonic verpackt, und 16-Bit-Register (BC, DE, HL) werden wie
  11132. beim 8080 mit einem Buchstaben abgek"urzt.  Da NEC in der
  11133. Erkl"arung der einzelnen Adressierungsarten aber immer mal
  11134. wieder die ausgeschriebenen Registernamen benutzt, und auch mal
  11135. und mal nicht Klammern benutzt, um indirekte Adressierung anzudeuten,
  11136. habe ich mich entschlossen, neben den 'offiziellen'
  11137. Notationen aus dem NEC-Manual auch einige alternative Notationen
  11138. zuzulassen.  Einige nicht-NEC-Tools wie z.B. Disassembler
  11139. scheinen solche Notationen ebenfalls zu benutzen:
  11140.  
  11141. \begin{itemize}
  11142. \item{Anstelle \tty{B} darf auch \tty{BC}, \tty{(B)} oder
  11143.      \tty{(BC)} geschrieben werden.}
  11144. \item{Anstelle \tty{D} darf auch \tty{DE}, \tty{(D)} oder
  11145.      \tty{(DE)} geschrieben werden.}
  11146. \item{Anstelle \tty{H} darf auch \tty{HL}, \tty{(H)} oder
  11147.      \tty{(HL)} geschrieben werden.}
  11148. \item{Anstelle \tty{D+} darf auch \tty{DE+}, \tty{(D+)},
  11149.      \tty{(DE+)} oder \tty{(DE)+} geschrieben werden.}
  11150. \item{Anstelle \tty{H+} darf auch \tty{HL+}, \tty{(H+)},
  11151.      \tty{(HL+)} oder \tty{(HL)+} geschrieben werden.}
  11152. \item{Anstelle \tty{D-} darf auch \tty{DE-}, \tty{(D-)},
  11153.      \tty{(DE-)} oder \tty{(DE)-} geschrieben werden.}
  11154. \item{Anstelle \tty{H-} darf auch \tty{HL-}, \tty{(H-)},
  11155.      \tty{(HL-)} oder \tty{(HL)-} geschrieben werden.}
  11156. \item{Anstelle \tty{D++} darf auch \tty{DE++}, \tty{(D++)},
  11157.      \tty{(DE++)} oder \tty{(DE)++} geschrieben werden.}
  11158. \item{Anstelle \tty{H++} darf auch \tty{HL++}, \tty{(H++)},
  11159.      \tty{(HL++)} oder \tty{(HL)++} geschrieben werden.}
  11160. \item{Anstelle \tty{D--} darf auch \tty{DE--}, \tty{(D--)},
  11161.      \tty{(DE--)} oder \tty{(DE)--} geschrieben werden.}
  11162. \item{Anstelle \tty{H--} darf auch \tty{HL--}, \tty{(H--)},
  11163.      \tty{(HL--)} oder \tty{(HL)--} geschrieben werden.}
  11164. \item{Anstelle \tty{H+A} darf auch \tty{HL+A}, \tty{A+H},
  11165.      \tty{A+HL}, \tty{(H+A)}, \tty{(HL+A)}, \tty{(A+H)}
  11166.      oder \tty{(A+HL)} geschrieben werden.}
  11167. \item{Anstelle \tty{H+B} darf auch \tty{HL+B}, \tty{B+H},
  11168.      \tty{B+HL}, \tty{(H+B)}, \tty{(HL+B)}, \tty{(B+H)}
  11169.      oder \tty{(B+HL)} geschrieben werden.}
  11170. \item{Anstelle \tty{H+EA} darf auch \tty{HL+EA}, \tty{EA+H},
  11171.      \tty{EA+HL}, \tty{(H+EA)}, \tty{(HL+EA)}, \tty{(EA+H)}
  11172.      oder \tty{(EA+HL)} geschrieben werden.}
  11173. \end{itemize}
  11174.  
  11175. Da Architektur und Befehlssatz so ,,8080-artig''
  11176. sind, lag es auch nahe, den Schalter {\tt Z80SYNTAX} zu
  11177. unterst"utzen, so da"s sich viele Befehle in einer eing"angigeren
  11178. und vertrauteren Art und Weise schreiben lassen.  Da die
  11179. Architektur und der Original-Befehlssatz der uCOM87-Familie
  11180. sich jedoch in einigen Punkten von 8080 unterscheiden, ist hier
  11181. keine eins-zu-eins Abbildung m"oglich: Nicht alle Originalbefehle
  11182. haben ein ,,Z80-"Aquivalent'', und einge vom 8080/Z80 bekannten
  11183. Befehle haben kein Pendant beim uCOM87.  Deshalb ergibt ein
  11184. {\tt Z80SYNTAX EXCLUSIVE} hier auch keinen Sinn.
  11185.  
  11186. Die folgende Tabelle listet alle im {\tt Z80SYNTAX}-Modus
  11187. definierten Befehle und ihre "Aquivalente in der Original-Syntax:
  11188.  
  11189. \begin{longtable}{|l|l|l|l|}
  11190. \hline
  11191. {\tt Z80SYNTAX} & Original & Operation & CPUs \\
  11192. \hline
  11193. \hline
  11194. \endhead
  11195. \input{../doc_COM/78z80inst.tex}
  11196. \\ \hline
  11197. \multicolumn{4}{|l|}{CPU-Gruppe 1: 78C05, 78C06} \\
  11198. \multicolumn{4}{|l|}{CPU-Gruppe 2: 7800, 7801, 7802} \\
  11199. \multicolumn{4}{|l|}{CPU-Gruppe 3: 7807, 7808, 7809, 7810} \\
  11200. \multicolumn{4}{|l|}{CPU-Gruppe 4: 7810, 78C1x} \\
  11201. \hline
  11202. \caption{Befehlsvarianten im {\tt Z80SYNTAX}-Modus}
  11203. \end{longtable}
  11204.  
  11205. %%---------------------------------------------------------------------------
  11206.  
  11207. \section{75K0}
  11208. \label{75K0Spec}
  11209.  
  11210. Wie bei einigen anderen Prozessoren auch, kennt die Assemblersprache
  11211. der 75er von NEC Pseudo-Bitoperanden, d.h. man kann einem Symbol
  11212. eine Kombination aus Adresse und Bitnummer zuweisen, die dann bei
  11213. bitorientierten Befehlen anstelle direkter Ausdr"ucke verwendet werden
  11214. kann.  Die drei folgenden Befehle erzeugen daher z.B. identischen
  11215. Code:
  11216. \begin{verbatim}
  11217. ADM     sfr     0fd8h
  11218. SOC     bit     ADM.3
  11219.  
  11220.        skt     0fd8h.3
  11221.        skt     ADM.3
  11222.        skt     SOC
  11223. \end{verbatim}
  11224. \asname{} unterscheidet direkte und symbolische Bitzugriffe an einem
  11225. bei Symbolen fehlenden Punkt; Punkte in Symbolnamen darf man daher
  11226. nicht verwenden, da es sonst zu Mi"sverst"andnissen bei der Aufl"osung
  11227. kommt.
  11228. \par
  11229. Die Ablage von Bitsymbolen orientiert sich dabei weitgehend an der
  11230. bin"aren Kodierung, die die Prozessorhardware selber verwendet:  Es
  11231. werden 16 Bit belegt, und es existieren ein ,,kurzes'' und ein ,,langes''
  11232. Format.  Das kurze Format kann folgende Varianten aufnehmen:
  11233. \begin{itemize}
  11234. \item{direkte Zugriffe auf die Bereiche 0FBxH und 0FFxH}
  11235. \item{indirekte Zugriffe der Form Adr.@L (0FC0H $\leq$ \tty{Adr} $\leq$ 0FFFH)}
  11236. \item{indirekte Zugriffe der Form @H+d4.bit}
  11237. \end{itemize}
  11238. Das obere Byte ist auf 0 gesetzt, das untere Byte enth"alt den gem"a"s
  11239. \cite{NEC75} kodierten Bitausdruck.  Das lange Format kennt im Gegensatz
  11240. dazu nur direkte Adressierung, kann daf"ur aber (korrekte Einstellungen
  11241. von \tty{MBS} und \tty{MBE} vorausgesetzt) den ganzen Adre"sraum abdecken.
  11242. Bei langen Ausdr"ucken stehen im unteren Byte Bit 7..0 der Adresse, in
  11243. Bit 8 und 9 die Bitstelle sowie in Bit 10 und 11 konstant 01.  Letztere
  11244. erm"oglichen es, langes und kurzes Format einfach durch einen Vergleich
  11245. des oberen Bytes gegen Null zu unterscheiden.  Die Bits 12..15 enthalten
  11246. Bit 8..11 der Adresse; sie werden zwar nicht zur Generierung des Kodes
  11247. ben"otigt, m"ussen jedoch gespeichert werden, da eine Pr"ufung auf ein
  11248. korrektes Banking erst bei der Verwendung des Symboles erfolgen kann.
  11249.  
  11250. %%---------------------------------------------------------------------------
  11251.  
  11252. \section{78K0}
  11253. \label{78K0Spec}
  11254.  
  11255. NEC benutzt in seinen Datenb"uchern zur Kennzeichnung der Zugriffsweise
  11256. auf absolute Adressen verschiedene Schreibweisen:
  11257. \begin{itemize}
  11258. \item{absolut kurz: kein Pr"afix}
  11259. \item{absolut lang: vorangestelltes \verb"!"}
  11260. \item{PC-relativ: vorangestelltes \verb"$"}
  11261. \end{itemize}
  11262. Bei \asname{} sind diese Pr"afixe nur notwendig, falls man eine bestimmte
  11263. Adressierung erzwingen will und der Befehl verschiedene Varianten
  11264. zul"a"st.  Setzt man keinen Pr"afix, so w"ahlt \asname{} automatisch die
  11265. k"urzeste Variante.  Es d"urfte daher in der Praxis sehr selten
  11266. notwendig sein, einen Pr"afix zu verwenden.
  11267.  
  11268. %%---------------------------------------------------------------------------
  11269.  
  11270. \section{78K2/78K3/78K4}
  11271. \label{78K234Spec}
  11272.  
  11273. Analog wie beim 78K0 benutzt NEC auch hier wieder Dollar- und
  11274. Ausrufezeichen f"ur verschiedene L"angen von Adre"sausdr"ucken.
  11275. Zwischen langen und kurzen Adressen (sowohl im RAM- als auch
  11276. SFR-Bereich) wird wieder automatisch entschieden, nur relative
  11277. Adressierung mu"s man manuell anw"ahlen, wenn ein Befehl beides
  11278. unterst"utzt (z.B. {\tt BR}).
  11279.  
  11280. Noch eine Anmerkung (die im "ubrigens auch f"ur den 78K0 gilt): Wer
  11281. mittels {\tt RELAXED} mit Motorola-Syntax arbeitet, mu"s
  11282. Hexadezimalkonstanten klammern, weil das f"uhrende Dollarzeichen u.U. als
  11283. relative Adressierung mi"sverstanden wird...
  11284.  
  11285. %%---------------------------------------------------------------------------
  11286.  
  11287. \section{uPD772x}
  11288.  
  11289. Sowohl 7720 als auch 7725 werden von dem gleichen Codegenerator behandelt
  11290. und sind sich in ihren Befehlssatz extrem "ahnlich.  Trotzdem sollte man
  11291. sich nicht zu der Annahme verleiten lassen, sie seien bin"ar kompatibel:
  11292. Um die l"angeren Adre"sfelder und zus"atzlichen Befehle unterbringen zu
  11293. k"onnen, haben sich die Bitpositionen einiger Felder im Instruktionswort
  11294. verschoben, die Instruktionsl"ange hat sich auch insgesamt von 23 auf 24
  11295. Bit ge"andert.  Im Code-Format sind deshalb auch unterschiedliche
  11296. Header-Ids f"ur beide reserviert.
  11297.  
  11298. Gemeinsam ist beiden, da"s sie neben Code- und Datensegment auch noch ein
  11299. ROM zur Ablage von Konstanten besitzen.  Dieses ist bei \asname{} auf das
  11300. \tty{ROMDATA}-Segment abgebildet!
  11301.  
  11302. %%---------------------------------------------------------------------------
  11303.  
  11304. \section{F2MC16L}
  11305.  
  11306. Darauf, da"s man bei Anwendungen mit mehr als 64K ROM oder 64K RAM darauf
  11307. achten sollte, \asname{} die korrekte momentane Belegung der Bank-Register
  11308. mitzuteilen, wurde bereits in Zusammenhang mit dem {\tt ASSUME}-Befehl
  11309. erw"ahnt.  \asname{} "uberpr"uft bei jedem absoluten Zugriff anhand dieser
  11310. Annahmen, ob evtl. ein Zugriff auf eine Speicherstelle erfolgt, die
  11311. momentan "uberhaupt nicht greifbar ist.  Standardm"a"sig sind daf"ur
  11312. nat"urlich nur DTB und DPR wichtig, denn ADB bzw. SSB/USB werden nur bei
  11313. indirekten Zugriffen "uber RW2/RW6 bzw. RW3/RW7 benutzt, und bei
  11314. indirekten Zugriffen greift diese Pr"ufmimik ohnehin nicht.  Nun ist es
  11315. aber so, da"s man - "ahnlich wie beim 8086 - einem Befehl eine
  11316. Segmentpr"afix voranstellen kann, mit dem DTB f"ur den folgenden Befehl
  11317. durch ein beliebiges anderes Register ersetzt werden kann.  \asname{} f"uhrt
  11318. deswegen "uber die verwendeten Pr"afixbefehle Buch und schaltet bei der
  11319. Pr"ufung f"ur den n"achsten {\em Prozessorbefehl} um - eine zwischen dem
  11320. Segmentpr"afix und Prozessorbefehl eingestreute Pseudoanweisung l"oscht
  11321. den Merker also {\em nicht}.  Dies gilt auch f"ur Pseudobefehle zur
  11322. Datenablage oder Ver"anderung des Programmz"ahlers - aber wer macht so
  11323. etwas schon ;-)
  11324.  
  11325. %%---------------------------------------------------------------------------
  11326.  
  11327. \section{MN161x}
  11328.  
  11329. F"ur dieses Target gilt die Besonderheit, da"s man zwischen zwei
  11330. Code-Generatoren w"ahlen kann: Einer wurde freundlicherweise von Haruo Asano
  11331. geschrieben und ist "uber die CPU-Namen \tty{MN1610} bzw. \tty{MN1613}
  11332. erreichbar; der andere wurde von mir erstellt und ist "uber die Namen
  11333. \tty{MN1610ALT} bzw. \tty{MN1613ALT} aktivierbar.  Wer den erweiterten
  11334. Adre"sraum von 256 KWorten des MN1613 verwenden will, oder mit dem
  11335. Gleitkommaformat des MN1613 experimentieren will, mu"s das \tty{ALT}-
  11336. Target verwenden.
  11337.  
  11338. %%---------------------------------------------------------------------------
  11339.  
  11340. \section{CDP180x}
  11341.  
  11342. Prozessoren dieser Reihe kennen sowohl kurze als auch lange Sprungbefehle:
  11343. W"ahrend ein kurzer Sprung nur innerhalb der gleichen Speicherseite von 256 Byte
  11344. m"oglich ist, kann man mit einem langen Sprung jedes beliebige Ziel im
  11345. Adre"sraum von 64 KByte erreichen.  Die Assembler-Syntax sieht f"ur beide
  11346. Varianten unterschiedliche Mnemonics vor (die lange Variante mit vorangestelltem
  11347. 'L'), aber keine, die dem Assembler gestatten w"urde, automatisch einen langen
  11348. oder kurzen Befehl einzusetzen.  \asname{} kennt solche 'Pseudobehle' als Erweiterung:
  11349. \begin{itemize}
  11350. \item{\tty{JMP} wird zu \tty{BR} oder \tty{LBR}.}
  11351. \item{\tty{JZ} wird zu \tty{BZ} oder \tty{LBZ}.}
  11352. \item{\tty{JNZ} wird zu \tty{BNZ} oder \tty{LBNZ}.}
  11353. \item{\tty{JDF} wird zu \tty{BDF} oder \tty{LBDF}.}
  11354. \item{\tty{JPZ} wird zu \tty{BPZ} oder \tty{LBPZ}.}
  11355. \item{\tty{JGE} wird zu \tty{BGE} oder \tty{LBGE}.}
  11356. \item{\tty{JNF} wird zu \tty{BNF} oder \tty{LBNF}.}
  11357. \item{\tty{JM} wird zu \tty{BM} oder \tty{LBM}.}
  11358. \item{\tty{JL} wird zu \tty{BL} oder \tty{LBL}.}
  11359. \item{\tty{JQ} wird zu \tty{BQ} oder \tty{LBQ}.}
  11360. \item{\tty{JNQ} wird zu \tty{BNQ} oder \tty{LBNQ}.}
  11361. \end{itemize}
  11362.  
  11363. %%---------------------------------------------------------------------------
  11364.  
  11365. \section{KENBAK}
  11366.  
  11367. Der KENBAK-1 wurde 1970 entwickelt, zu einer Zeit, als der erste
  11368. Mikroprozessor noch drei Jahre entfernt war.  Man kann davon ausgehen, da"s
  11369. er f"ur die Hobbyisten, die sich den Bausatz seinerzeit leisten konnten, ihr
  11370. erster und einziger Computer war.  Demzufolge hatten sie auch nichts, auf
  11371. dem sie einen Assembler f"ur diesen Computer h"atten laufen lassen k"onnen -
  11372. der KENBAK-1 mit seinem Speicher von 256 Byte war daf"ur viel zu klein.  Die
  11373. pr"aferierte Methode waren vorgedruckte Tabellen, in die man die Befehle und
  11374. ihren Maschinencode eintrug.  War man mit dieser ,,Programmierung'' fertig,
  11375. konnte man den Code "uber die Schalterleiste per Hand in den Computer laden.
  11376.  
  11377. Daraus resultiert leider, da"s die Assembler-Sprache des KENBAK zwar im
  11378. Programming Manual beschrieben, aber nicht wirklich formal definiert ist.  Als
  11379. Grant Stockly vor ein paar Jahren neue KENBAK-Kits herausbrachte, hat er
  11380. eine erste KENBAK-Portierung f"ur meinen Assembler gemacht, die hat ihren
  11381. Weg jedoch leider nie wieder ''upstream'' gefunden.  In meiner Implementierung
  11382. habe ich versucht, seine Ideen aufzugreifen, jedoch andererseits auch eine
  11383. Syntax anzubieten, wie sie Programmierern eines 6502, Z80 oder "ahnlichem
  11384. eher vertraut sein d"urfte.  In der folgenden Tabelle sind die Syntax-Unterschiede
  11385. gegen"uber gestellt:
  11386.  
  11387. \hfuzz=5pt
  11388. \begin{center}\begin{longtable}{|l|l|l|}
  11389. \hline
  11390. Stockly & Alternativ & Bemerkung \\
  11391. \hline
  11392. \hline
  11393. \endhead
  11394. \multicolumn{3}{|l|}{\bf Arithmetisch/Logisch (ADD/SUB/LOAD/STORE/AND/OR/LNEG)} \\
  11395. \hline
  11396. {\it instr} {\tt Constant}, {\it Reg}, {\it Wert}, & {\it instr} {\it Reg}, {\it \#Wert} & immediate \\
  11397. {\it instr} {\tt Memory}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it Addr} & direkt \\
  11398. {\it instr} {\tt Indirect}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it (Addr)} & direkt \\
  11399. {\it instr} {\tt Indexed}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it Addr},X & indiziert \\
  11400. {\it instr} {\tt Indirect-Indexed}, {\it Reg}, {\it Addr}, & {\it instr} {\it Reg}, {\it (Addr)},X & indirekt-indiziert \\
  11401. \hline
  11402. \multicolumn{3}{|l|}{\bf Spr"unge} \\
  11403. \hline
  11404. {\tt JPD} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JP} {\it Reg}, {\it Cond}, {\it Addr} & bedingt-direkt \\
  11405. {\tt JPI} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JP} {\it Reg}, {\it Cond}, {\it (Addr)} & bedingt-indirekt \\
  11406. {\tt JMD} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JM} {\it Reg}, {\it Cond}, {\it Addr} & bedingt-direkt \\
  11407. {\tt JMI} {\it Reg}, {\it Cond}, {\it Addr} & {\tt JM} {\it Reg}, {\it Cond}, {\it (Addr)} & bedingt-indirekt \\
  11408. {\tt JPD} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JP} {\it Addr} & unbedingt-direkt \\
  11409. {\tt JPI} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JP} {\it (Addr)} & unbedingt-indirekt \\
  11410. {\tt JMD} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JM} {\it Addr} & unbedingt-direkt \\
  11411. {\tt JMI} {\tt Unconditional}, {\it Cond}, {\it Addr} & {\tt JM} {\it (Addr)} & unbedingt-indirekt \\
  11412. \hline
  11413. \multicolumn{3}{|l|}{\bf Sprungbedingungen} \\
  11414. \hline
  11415. {\tt Non-zero} & {\tt NZ} & $\neq 0$ \\
  11416. {\tt Zero} & {\tt Z} & $= 0$ \\
  11417. {\tt Negative} & {\tt N} & $< 0$ \\
  11418. {\tt Positive} & {\tt P} & $\geq 0$ \\
  11419. {\tt Positve-Non-zero} & {\tt PNZ} & $ > 0$ \\
  11420. \hline
  11421. \multicolumn{3}{|l|}{\bf Skips} \\
  11422. \hline
  11423. {\tt SKP 0}, {\it bit}, {\it Addr} & {\tt SKP0} {\it bit}, {\it Addr} {\it [,Dest]} & \\
  11424. {\tt SKP 1}, {\it bit}, {\it Addr} & {\tt SKP1} {\it bit}, {\it Addr} {\it [,Dest]} & \\
  11425. \hline
  11426. \multicolumn{3}{|l|}{\bf Bitmanipulation} \\
  11427. \hline
  11428. {\tt SET 0}, {\it bit}, {\it Addr} & {\tt SET0} {\it bit}, {\it Addr} & \\
  11429. {\tt SET 1}, {\it bit}, {\it Addr} & {\tt SET1} {\it bit}, {\it Addr} & \\
  11430. \hline
  11431. \multicolumn{3}{|l|}{\bf Schiebe/Rotierbefehle} \\
  11432. \hline
  11433. {\tt SHIFT LEFT}, {\it cnt}, {\it Reg} & {\tt SFTL} {\it [cnt,]} {\it Reg} & \\
  11434. {\tt SHIFT RIGHT}, {\it cnt}, {\it Reg} & {\tt SFTR} {\it [cnt,]} {\it Reg} & arithm. Shift \\
  11435. {\tt ROTATE LEFT}, {\it cnt}, {\it Reg} & {\tt ROTL} {\it [cnt,]} {\it Reg} & \\
  11436. {\tt ROTATE RIGHT}, {\it cnt}, {\it Reg} & {\tt ROTR} {\it [cnt,]} {\it Reg} & \\
  11437. \hline
  11438. \caption{KENBAK-Befehlssyntax \label{TabKENBAKSyntax}}
  11439. \end{longtable}\end{center}
  11440. \hfuzz=0pt
  11441.  
  11442. Es gibt keinen Pseudobefehl, um zwischen diesen beiden Syntax-Varianten umzuschalten.
  11443. Beide d"urfen jederzeit und auch in beliebiger Mischung genutzt werden.
  11444.  
  11445. Die Zieladresse {\it [Dest]}, die man optional bei den Skip-Befehlen angeben
  11446. kann, geht nicht in den erzeugten Code ein.  Der Assembler "uberpr"uft lediglich,
  11447. ob der Prozessor zur Laufzeit wirklich zur angegebene Adresse springen w"urde.
  11448. Dadurch kann z.B. gepr"uft werden, ob man nicht versehentlich versucht, einen
  11449. einzelnen Ein-Byte-Befehl zu "uberspringen.  Ein weggelassenes Schiebeargument
  11450. {\it [cnt]} bedeutet, da"s um eine Stelle geschoben werden soll.
  11451.  
  11452. %%---------------------------------------------------------------------------
  11453.  
  11454. \section{HP Nanoprocessor}
  11455.  
  11456. Der HP Nanoprocessor verf"ugt "uber keinerlei Befehle, Daten aus dem ROM-
  11457. Adre"sraum zu lesen und in ein Register zu transferieren.  Die diesbez"uglichen
  11458. Befehle {\tt LDR} und {\tt STR} sind eher das, was man bei anderen Prozessoren
  11459. als ,,immediate-Adressierung'' bezeichnen w"urde.  Aus diesen Grund sind f"ur
  11460. den HP Nanoprocessor keinerlei Pseudobefehen definiert, mit denen sich Konstanten
  11461. im ROM ablegen oder Platz reservieren l"a"st.
  11462.  
  11463. %%---------------------------------------------------------------------------
  11464.  
  11465. \section{IM61x0}
  11466.  
  11467. Dieser Mikroprozessor ist quasi eine Single-Chip-Implementierung einer PDP/8E,
  11468. weshalb als ,,Assembler-Referenz'' in Quellcode-Beispielen "ublicherweise der
  11469. PAL-III von Digital Equipment benutzt wird.  Die \asname{}-Implementierung weicht in
  11470. einigen Punkten von der PAL-III-Syntax ab, unter anderem auch, weil sich manche
  11471. Dinge nur mit gro"sem Aufwand h"atten bereit stellen lassen.  Hier einige Hinweise,
  11472. wie sich bestehender Code anpassen l"a"st:
  11473.  
  11474. \begin{itemize}
  11475. \item{Bei PAL-III werden Label durch ein angeh"angtes Komma gekennzeichnet.
  11476.      Bei \asname{} ist diese ein Doppelpunkt, bzw. gar nichts, wenn das Label in der
  11477.      ersten Spalte beginnt.}
  11478. \item{Die Ablage von Daten im Speicher erfolgt bei PAL-III einfach dadurch,
  11479.      da"s man die Konstante in das Feld des Mnemonics schreibt.  \asname{} verwendet
  11480.      zur Datenablage die \tty{DC}-Anweisung, die daf"ur auch mehrere Worte
  11481.      auf einmal als Argument akzeptiert.  Unter Umst"anden kann man sich
  11482.      die Ablage von Konstanten durch den \tty{LTORG}-Mechanismus aber auch
  11483.      teilweise ersparen.}
  11484. \item{Den Programmz"ahler setzt man mit \tty{ORG address} anstelle {*address}.}
  11485. \end{itemize}
  11486.  
  11487. %%===========================================================================
  11488.  
  11489. \cleardoublepage
  11490. \chapter{Dateiformate}
  11491.  
  11492. In diesem Kapitel sollen die Formate von von \asname{} erzeugten Dateien
  11493. beschrieben werden, deren Format sich nicht direkt erschlie"st.
  11494.  
  11495. \section{Code-Dateien}
  11496. \label{SectCodeFormat}
  11497.  
  11498. Das vom Assembler ausgegebene Codedatenformat mu"s in der Lage sein,
  11499. die Codeteile f"ur unterschiedliche Prozessoren voneinander zu trennen,
  11500. und sieht daher etwas anders aus als g"angige Formate.  Obwohl dem
  11501. Assembler Tools zur Bearbeitung der Codedateien beiliegen, halte ich es
  11502. f"ur guten Stil, das Format hier kurz offenzulegen:
  11503. \par
  11504. Sofern in der Datei Mehrbyte-Integers gespeichert sind, werden sie
  11505. im Intelformat abgelegt, d.h. mit dem LSB zuerst.  Diese Regel gilt
  11506. bereits f"ur das 16-Bit-Kennungswort mit dem Wert \$1489, d.h. jede
  11507. Codedatei beginnt mit den Bytes \$89/\$14.
  11508. \par
  11509. Danach folgt eine Reihe beliebig vieler ,,Records'', wobei ein Record
  11510. entweder ein zusammenh"angendes Teilfeld des Codes darstellt oder bestimmte
  11511. Zusatzinformationen enth"alt.  Eine Datei
  11512. kann auch ohne Umschaltung des Prozessortyps mehrere Records enthalten,
  11513. wenn Code- oder Konstantenbereiche durch reservierte (und nicht zu
  11514. initialisierende) Speicherbereiche unterbrochen werden.  Der Assembler
  11515. versucht auf diese Weise, die Datei nicht l"anger als n"otig werden
  11516. zu lassen.
  11517. \par
  11518. Allen Records ist gemein ist ein Header-Byte, das den Typ des Records
  11519. und die damit folgenden Datenstrukturen festlegt.  In einer Pascal-artigen
  11520. Form l"a"st sich die Record-Struktur folgenderma"sen beschreiben:
  11521. \begin{verbatim}
  11522. FileRecord = RECORD CASE Header:Byte OF
  11523.              $00:(Creator:ARRAY[] OF Char);
  11524.              $01..
  11525.              $7f:(StartAdr : LongInt;
  11526.                   Length   : Word;
  11527.                   Data     : ARRAY[0..Length-1] OF Byte);
  11528.              $80:(EntryPoint:LongInt);
  11529.              $81:(Header   : Byte;
  11530.                   Segment  : Byte;
  11531.                   Gran     : Byte;
  11532.                   StartAdr : LongInt;
  11533.                   Length   : Word;
  11534.                   Data     : ARRAY[0..Length-1] OF Byte);
  11535.             END
  11536. \end{verbatim}
  11537. Was in dieser Schreibweise nicht ganz zum Ausdruck kommt, ist, da"s
  11538. die L"ange von Datenfeldern variabel ist und von {\tt Length} abh"angt.
  11539. \par
  11540. Ein Record mit einem Header-Byte von \verb!$81! ist ein Record, der Code
  11541. oder Daten aus beliebigen Segmenten beinhalten kann.  Das erste
  11542. Byte (Header) gibt an, f"ur welche Prozessorfamilie die folgenden
  11543. Daten bzw. der folgende  Code bestimmt ist (siehe Tabelle \ref{TabHeader}).
  11544. \begin{center}\begin{longtable}{|c|l||c|l|}
  11545. \hline
  11546. Header & Familie & Header & Familie \\
  11547. \hline
  11548. \hline
  11549. \endhead
  11550. \input{../doc_COM/tabids.tex}
  11551. \\ \hline
  11552. \caption{Headerbytes f"ur die verschiedenen Prozessorfamilien}
  11553. \label{TabHeader}
  11554. \end{longtable}\end{center}
  11555. Das Segment-Feld gibt an, in welchen Adre"sraum des Prozessors der
  11556. folgende Code geh"ort.  Dabei gilt die in Tabelle \ref{TabSegments}
  11557. angegeben Zuordnung.
  11558. \begin{table*}[htbp]
  11559. \begin{center}\begin{tabular}{|c|l||c|l|}
  11560. \hline
  11561. Nummer & Segment & Nummer & Segment \\
  11562. \hline
  11563. \hline
  11564. \$00 &    $<$undefiniert$>$    & \$01 &    CODE \\
  11565. \$02 &    DATA                 & \$03 &    IDATA \\
  11566. \$04 &    XDATA                & \$05 &    YDATA \\
  11567. \$06 &    BDATA                & \$07 &    IO \\
  11568. \$08 &    REG                  & \$09 &    ROMDATA \\
  11569. \hline
  11570. \end{tabular}\end{center}
  11571. \caption{Kodierungen des {\tt Segment}-Feldes\label{TabSegments}
  11572.         \label{TabSegmentNums}}
  11573. \end{table*}
  11574. Das Gran-Feld gibt die ,,Granularit"at'' des Codes an, d.h. die Gr"o"se
  11575. der kleinsten, adressierbaren Einheit im folgenden Datensatz.  Dieser
  11576. Wert ist eine Funktion von Prozessortyp und Segment und ein wichtiges
  11577. Detail f"ur die Interpretation der beiden folgenden Felder, die
  11578. Startadresse und L"ange angeben: W"ahrend die Startadresse sich auf die
  11579. Granularit"at bezieht, erfolgt die L"angenangabe immer in Bytes!  W"are
  11580. die Startadresse z.B. \$300 und die L"ange 12, so w"are die sich
  11581. ergebende Endadresse bei einer Granularit"at von 1 \$30b, bei einer
  11582. Granularit"at von z.B. 4 jedoch \$303!  Andere Granularit"aten als eins
  11583. sind selten und treten in erster Linie bei Signalprozessoren auf, die
  11584. nicht  auf Einzelbyteverarbeitung ausgelegt sind deren Datenspeicher z.B.
  11585. aus 64kWorten zu 16 Bit besteht (DSP56K).  Der sich ergebende Speicherplatz
  11586. betr"agt dann zwar 128 KByte, er ist aber in $2^{16}$ Worten organisiert,
  11587. die mit Adressen von 0,1,2,...65535 adressiert werden!
  11588. \par
  11589. Die Startadresse ist 32-bittig, unabh"angig von der Adre"sbreite der
  11590. jeweiligen Prozessorfamilie.  Im Gegensatz dazu ist die L"angenangabe
  11591. nur 16 Bit lang, ein Record kann also maximal (4+4+2+(64K-1)) = 65545
  11592. Byte lang werden.
  11593. \par
  11594. Daten-Records mit den Header-Bytes \verb!$01..$7f! stellen eine
  11595. Kurzschreibweise dar und stellen die Abw"artskompatibilit"at mit fr"uheren
  11596. Definitionen des Dateiformats her: Das Header-Byte gibt direkt den
  11597. Prozessortyp gem"a"s der ersten Tabelle an, das Zielsegment ist auf \tty{CODE}
  11598. festgelegt und die Granularit"at ergibt sich aus dem Prozessortyp,
  11599. aufgerundet auf eine Zweierpotenz von Bytes.  \asname{} bevorzugt diese Records,
  11600. wenn Daten bzw. Code f"ur das \tty{CODE}-Segment anstehen.
  11601. \par
  11602. Der Record mit dem Typ-Byte \verb!$80! legt den Einsprungpunkt fest, d.h.
  11603. die Adresse, an der mit der Ausf"uhrung des Programms begonnen werden
  11604. soll.  Ein solcher Record ist das Ergebnis einer \tty{END}-Anweisung mit
  11605. einer entsprechenden Adresse als Argument.
  11606. \par
  11607. Der letzte Record in der Datei tr"agt das Header-Byte \verb!$00! und besitzt
  11608. als einziges Datenfeld einen String, dessen Ende durch das Dateiende
  11609. definiert ist.  Dieser String spezifiziert, von welchem Programm diese
  11610. Datei erzeugt wurde und hat keine weitere Bedeutung.
  11611.  
  11612.  
  11613. \section{Debug-Dateien}\label{SectDebugFormat}
  11614.  
  11615. Debug-Dateien k"onnen optional von \asname{} erzeugt werden und liefern
  11616. nachgeschalteten Werkzeugen wie Disassemblern oder Debuggern f"ur diese
  11617. wichtige Informationen.  \asname{} kann Debug-Informationen in drei Formaten
  11618. ausgeben: Zum einen im Objekt-Format der AVR-Tools von Atmel sowie eine zu
  11619. NoICE kompatible Kommandodatei und zum anderen in einem eigenen Format.
  11620. Die ersten beiden werden in \cite{AVRObj} bzw. der Dokumentation zu
  11621. NoICE ausf"uhrlich beschrieben, deshalb beschr"ankt sich die folgende
  11622. Beschreibung auf das \asname{}-eigene MAP-Format:
  11623.  
  11624. Diese Informationen in einer MAP-Datei teilen sich in drei Gruppen:
  11625. \begin{itemize}
  11626. \item{Symboltabelle}
  11627. \item{Speicherberlegung, auf Sektionen verteilt}
  11628. \item{Maschinenadressen von Quellzeilen}
  11629. \end{itemize}
  11630. Letzterer Teil findet sich zuerst in der Datei.  Ein einzelner
  11631. Eintrag in dieser Liste besteht aus zwei, von einem Doppelpunkt
  11632. getrennten Zahlen:
  11633. \begin{verbatim}
  11634. <Zeilennummer>:<Adresse>
  11635. \end{verbatim}
  11636. Ein solcher Eintrag besagt, da"s der aus einer bestimmten
  11637. Quellcodezeile erzeugte Maschinencode auf der angegebenen Adresse
  11638. (hexadezimal) zu liegen kam.  Mit einer solchen Information kann ein
  11639. Debugger beim Durchsteppen des Programms die entsprechenden
  11640. Quellcodezeilen anzeigen.  Da ein Programm aber auch aus mehreren
  11641. Include-Dateien bestehen kann, und viele Prozessoren mehr als nur
  11642. einen Adre"sraum besitzen (von dem zugegebenerma"sen nur in einem Code
  11643. liegt), m"ussen die oben beschriebenen Eintr"age sortiert werden.  \asname{}
  11644. tut dies in zwei Stufen: Das prim"are Sortierkriterium ist das
  11645. Zielsegment, innerhalb dieser Segmente wird noch einmal nach Dateien
  11646. sortiert.  Einzelne Abschnitte werden dabei durch durch spezielle
  11647. Zeilen der Form
  11648. \begin{verbatim}
  11649. Segment <Segmentname>
  11650. \end{verbatim}
  11651. bzw.
  11652. \begin{verbatim}
  11653. File <Dateiname>
  11654. \end{verbatim}
  11655. getrennt.
  11656.  
  11657. Die Symboltabelle folgt der Quellzeileninformation und ist wieder
  11658. prim"ar nach den Segmenten geordnet, aus denen die Symbole stammen.
  11659. Im Gegensatz zur Zeileninformation kommt hier allerdings auch der
  11660. Abschnitt \tty{NOTHING} hinzu, der die Symbole beinhaltet, die keinem
  11661. speziellen Adre"sraum zugeordnet sind (z.B. Symbole, die einfach mit
  11662. \tty{EQU} definiert wurden).  Die Einleitung eines Abschnittes in der
  11663. Symboltabelle erfolgt mit einer Zeile der Form
  11664. \begin{verbatim}
  11665. Symbols in Segment <Segmentname>   .
  11666. \end{verbatim}
  11667. Innerhalb eines Abschnittes sind die Symbole nach Namen sortiert, und
  11668. ein Symboleintrag belegt genau eine Zeile.  Eine solche Zeile besteht
  11669. wiederum aus sechs Feldern, die durch jeweils mindestens ein Leerzeichen
  11670. getrennt sind:
  11671.  
  11672. Das erste Feld ist der Name des Symbols selber, eventuell erweitert
  11673. um eine in eckigen Klammern eingeschlossene Sektionsnummer, die den
  11674. G"ultigkeitsbereich des Symbols einschr"ankt.  Die zweite Spalte
  11675. bezeichnet den Typ des Symbols: \tty{Int} f"ur Integerzahlen, \tty{Float} f"ur
  11676. Gleitkommazahlen und \tty{String} f"ur Zeichenketten.  Die dritte Zeile
  11677. schlie"slich beinhaltet den eigentliche Wert des Symbols.  Falls das
  11678. Symbol eine Zeichenkette beinhaltet, ist es notwendig, Steuer- und
  11679. Leerzeichen mit einer gesonderten Notation zu kennzeichnen, damit ein
  11680. im String enthaltenes Leerzeichen nicht eventuell als Trennzeichen
  11681. zur n"achsten Spalte interpretiert werden kann.  \asname{} bedient sich dazu
  11682. der bereits der in Assemblerquellen "ublichen Schreibweise, den
  11683. ASCII-Zahlenwert mit einem f"uhrenden Backslash (\verb!\!) einzusetzen.  Aus
  11684. dem String
  11685. \begin{verbatim}
  11686. Dies ist ein Test
  11687. \end{verbatim}
  11688. wird also z.B.
  11689. \begin{verbatim}
  11690. Dies\032ist\032ein\032Test
  11691. \end{verbatim}
  11692. Die Zahlenangabe ist immer dezimal und dreistellig, und der Backslash
  11693. selber wird ebenfalls in dieser Schreibweise kodiert.
  11694.  
  11695. Das vierte Feld gibt - falls vorhanden - die Gr"o"se der Datenstruktur
  11696. an, die an der durch das Symbol gekennzeichneten Adresse abgelegt
  11697. ist.  Ein Debugger kann eine solche Information z.B. nutzen, um
  11698. symbolisch angesprochene Variablen direkt in der korrekten L"ange
  11699. aufzulisten.  Hat \asname{} keine Informationen "uber die Symbolgr"o"se, so
  11700. steht in diesem Feld eine schlichte -1.
  11701.  
  11702. Das f"unfte und letzte Feld gibt an, ob das Symbol w"ahrend der
  11703. Assemblierung jemals referenziert wurde. Ein Programm, da"s die
  11704. Symboltabelle liest, kann auf diese Weise z.B. nicht benutzte Symbole
  11705. automatisch verwerfen, da sie beim folgenden Debugging oder der
  11706. Disassemblierung mit hoher Wahrscheinlichkeit auch nicht ben"otigt werden.
  11707.  
  11708. das sechste und letzte Feld gibt schlu"sendlich durch eine 0 oder 1 an,
  11709. ob es sich bei dem Symbol um eine Konstante (0) oder Variable (1) handelt.
  11710. Konstanten bekommen einmalig einen Wert zugewiesen (z.B. "uber die
  11711. \tty{EQU}-Anweisung oder ein Label), Variablen k"onnen ihren Wert beliebig
  11712. oft "andern.  In der MAP-Datei wird der letztg"ultige Wert aufgef"uhrt.
  11713.  
  11714. Der dritte Abschnitt in einer Debug-Datei beschreibt die im Programm
  11715. benutzten Sektionen n"aher.  Eine solche Beschreibung ist erforderlich,
  11716. da Sektionen den G"ultigkeitsbereich von Symbolen einschr"anken
  11717. k"onnen.  Je nach momentanem Stand des Programmz"ahlers kann z.B. ein
  11718. symbolischer Debugger einzelne Symboldefinitionen f"ur eine R"uck"ubersetzung
  11719. nicht nutzen oder mu"s Priorit"aten bei der Symbolnutzung beachten.
  11720. Die Definition einer Sektion beginnt mit einer Zeile der Form
  11721. \begin{verbatim}
  11722. Info for Section nn ssss pp     ,
  11723. \end{verbatim}
  11724. wobei \tty{nn} die Nummer der Sektion angibt (die Nummer, die als Postfix
  11725. f"ur Symbolnamen in der Symboltabelle genutzt wird), \tty{ssss} der Name der
  11726. Sektion ist und \tty{pp} die Nummer der Vatersektion darstellt.  Letztere
  11727. Information ben"otigt ein R"uck"ubersetzer, um sich bei der Auffindung
  11728. eines Symbols f"ur einen Zahlenwert ausgehend von der aktuellen Sektion
  11729. im Baum bis zur Wurzel ,,durchhangeln'' kann, bis ein passendes
  11730. Symbol gefunden wird.  Auf diese Zeile folgt eine Reihe weiterer
  11731. Zeilen, die den von dieser Sektion belegten Code-Bereich beschreiben.
  11732. Jeder einzelne Eintrag (genau einer pro Zeile) beschreibt entweder
  11733. eine einzelne Adresse oder einen durch zwei Grenzwerte beschriebenen
  11734. Bereich (Trennung von Anfangs-und Endwert durch ein Minuszeichen).
  11735. Die Grenzen sind dabei ,,inklusive'', d.h. die Grenzen geh"oren auch zu
  11736. dem Bereich.  Wichtig ist, da"s ein einer Sektion zugeh"origer Bereich
  11737. nicht nochmals f"ur ihre Vatersektionen aufgef"uhrt wird (eine Ausnahme
  11738. ist nat"urlich, wenn Bereiche absichtlich mehrfach belegt werden, aber
  11739. so etwas macht man ja auch nicht, gelle?).  Dies dient einer Optimierung
  11740. der Bereichsspeicherung w"ahrend der Assemblierung und sollte auch
  11741. f"ur eine Symbolr"uck"ubersetzung keine Probleme darstellen, da durch
  11742. die einfache Kennzeichnung bereits der Einstiegspunkt und damit der
  11743. Suchpfad im Sektionsbaum gegeben ist.  Die Beschreibung einer Sektion
  11744. wird durch eine Leerzeile oder das Dateiende gekennzeichnet.
  11745.  
  11746. Programmteile, die au"serhalb aller Sektionen liegen, werden nicht
  11747. gesondert ausgewiesen.  Diese ,,implizite Wurzelsektion'' tr"agt die
  11748. Nummer -1 und wird auch als Vatersektion f"ur Sektionen benutzt, die
  11749. keine eigentliche Vatersektion besitzen.
  11750.  
  11751. Es ist m"oglich, da"s die Datei Leerzeilen oder Kommentarzeilen
  11752. (Semikolon am Zeilenanfang) beinhaltet.  Diese sind von einem
  11753. Leseprogramm zu ignorieren.
  11754.  
  11755. %%===========================================================================
  11756.  
  11757. \cleardoublepage
  11758. \chapter{Hilfsprogramme}
  11759. \label{ChapTools}
  11760.  
  11761. Um die Arbeit mit dem Codeformat des Assemblers etwas zu erleichtern,
  11762. lege ich einige Progamme zu deren Bearbeitung bei.  F"ur diese Programme
  11763. gilt sinngem"a"s das gleiche wie in \ref{SectLicense}!
  11764.  
  11765. Allen Programmen gemeinsam sind die Returncodes, die sie liefern (Tabelle
  11766. \ref{TabToolReturns}).
  11767. \par
  11768. \begin{table*}[ht]
  11769. \begin{center}\begin{tabular}{|c|l|}
  11770. \hline
  11771. Returncode &  tritt auf bei... \\
  11772. \hline
  11773. \hline
  11774. 0          &  kein Fehler \\
  11775. 1          &  Kommandozeilenparameterfehler \\
  11776. 2          &  I/O-Fehler \\
  11777. 3          &  Dateiformatfehler \\
  11778. \hline
  11779. \end{tabular}\end{center}
  11780. \caption{Returncodes der Dienstprogramme\label{TabToolReturns}}
  11781. \end{table*}
  11782. Ebenso eintr"achtig wie \asname{} lesen sie ihre Eingaben von STDIN und schreiben
  11783. Meldungen auf STDOUT (bzw. Fehlermeldungen auf STDERR).  Ein-und
  11784. Ausgaben sollten sich daher problemlos umleiten lassen.
  11785. \par
  11786. Sofern Programme im folgenden Zahlen-oder Adre"sangaben von der
  11787. Kommandozeile lesen, d"urfen diese auch hexadezimal geschrieben werden,
  11788. indem man sie mit einem hintangestellten \tty{h}, einem voranstehenden
  11789. Dollarzeichen oder \tty{0x} wie in C versieht (z.B. \verb!$10!,
  11790. \verb!10h! oder \verb!0x10! anstelle von 16).
  11791. \par
  11792. Unix-Shells \marginpar{{\em UNIX}} ordnen dem Dollarzeichen allerdings
  11793. eine spezielle Bedeutung zu (Parameterexpansion), weshalb es n"otig ist,
  11794. einem Dollarzeichen direkt einen Backslash voranzustellen.  Die
  11795. \tty{0x}-Variante ist hier sicherlich angenehmer.
  11796. \par
  11797. Ansonsten folgen die Aufrufkonventionen und -variationen (bis auf PLIST
  11798. und AS2MSG) denen von \asname{}, d.h. man kann dauernd gebrauchte Schalter in
  11799. einer Environmentvariablen ablegen (deren Name sich aus dem Anh"angen von
  11800. CMD an den Programmnamen ergibt, z.B. BINDCMD f"ur BIND), Optionen
  11801. negieren und Gro"s-bzw. Kleinschreibung erzwingen (n"aheres zu dem Wie in
  11802. Abschnitt \ref{SectCallConvention}).
  11803. \par
  11804. Sofern Adre"sangaben benutzt werden, beziehen sie sich immer auf die
  11805. Granularit"at des Adre"sraumes des jeweiligen Prozessors; beim PIC bedeutet
  11806. z.B. eine Adre"sdifferenz von 1 nicht ein Byte, sondern ein Wort.
  11807.  
  11808. %%---------------------------------------------------------------------------
  11809.  
  11810. \section{PLIST}
  11811.  
  11812. PLIST ist das einfachste Programm der vier mitgelieferten; es dient
  11813. einfach nur dazu, die in einer Codedatei gespeicherten Records aufzulisten.
  11814. Da das Programm nicht allzuviel bewirkt, ist der Aufruf ziemlich simpel:
  11815. \begin{verbatim}
  11816.    PLIST $<$Dateiname$>$
  11817. \end{verbatim}
  11818. Der Dateiname wird automatisch um die Endung P erweitert, falls keine
  11819. Endung vorhanden ist.
  11820. \par
  11821. \bb{ACHTUNG!}  An dieser Stelle sind keine Jokerzeichen erlaubt! Falls mit
  11822. einem Befehl trotzdem mehrere Programmdateien gelistet werden sollen,
  11823. kann man sich mit folgendem ''Minibatch'' behelfen:
  11824. \begin{verbatim}
  11825.     for %n in (*.p) do plist %n
  11826. \end{verbatim}
  11827. PLIST gibt den Inhalt der Codedatei in Tabellenform aus, wobei f"ur
  11828. jeden Record genau eine Zeile ausgegeben wird.  Die Spalten haben
  11829. dabei folgende Bedeutung:
  11830. \begin{itemize}
  11831. \item{Codetyp: die Prozessorfamilie, f"ur die der Code erzeugt wurde.}
  11832. \item{Startadresse: absolute Speicheradresse, an die der Code zu laden ist.}
  11833. \item{L"ange: L"ange des Codest"ucks in Byte.}
  11834. \item{Endadresse: letzte absolute Adresse des Codest"ucks.  Diese berechnet
  11835.      sich als Startadresse+L"ange-1.}
  11836. \end{itemize}
  11837. Alle Angaben sind als hexadezimal zu verstehen.
  11838. \par
  11839. Zuletzt gibt PLIST noch einen Copyrightvermerk aus, sofern er einen
  11840. solchen in der Datei findet, und die Summe aller Codel"angen.
  11841. \par
  11842. PLIST ist praktisch ein DIR f"ur Codedateien.  Man kann es benutzen,
  11843. um sich den Inhalt einer Datei auflisten zu lassen, bevor man sie
  11844. weiterbearbeitet.
  11845.  
  11846. %%---------------------------------------------------------------------------
  11847.  
  11848. \section{BIND}
  11849.  
  11850. BIND ist ein Programm, mit dem man die Records mehrerer Codedateien
  11851. in eine Datei zusammenkopieren kann.  Die dabei vorhandene Filterfunktion
  11852. erlaubt es aber auch, nur Records eines bestimmten Typs zu "ubernehmen.
  11853. Auf diese Weise kann BIND auch dazu verwendet werden, um eine Codedatei
  11854. in mehrere aufzuspalten.
  11855. \par
  11856. Die allgemeine Syntax von BIND lautet
  11857. \begin{verbatim}
  11858.   BIND <Quelldatei(en)> <Zieldatei> [Optionen]
  11859. \end{verbatim}
  11860. Wie auch \asname{} betrachtet BIND alle nicht mit einem +, - oder / eingeleiteten
  11861. Parameter als Dateiangaben, von denen die letzte die Zieldatei angeben
  11862. mu"s.  Alle anderen Dateiangaben bezeichnen Quellen, diese Angaben d"urfen
  11863. auch wieder Jokerzeichen enthalten.
  11864. \par
  11865. An Optionen definiert BIND momentan nur eine:
  11866. \begin{itemize}
  11867. \item{\tty{f $<$Header[,Header...]$>$}: gibt eine Liste von Header-IDs
  11868.      an, die kopiert werden sollen.  Alle anderen Records werden
  11869.      nicht kopiert.  Ohne diese Angabe werden alle Records kopiert.
  11870.      Die in der Liste angegebenen entsprechen dem Header-Feld in der
  11871.      Recordstruktur, wie es in Abschnitt \ref{SectCodeFormat} beschrieben wurden. Die
  11872.      einzelnen Header-Nummern in der Liste werden durch Kommas getrennt.}
  11873. \end{itemize}
  11874. Um z.B. alle MCS-51-Codeteile aus einer Programmdatei auszusieben,
  11875. benutzt man BIND folgenderma"sen:
  11876. \begin{verbatim}
  11877.   BIND <Quellname> <Zielname> -f $31
  11878. \end{verbatim}
  11879. Fehlt bei einer Dateiangabe eine Endung, so wird automatisch die Endung
  11880. P angef"ugt.
  11881.  
  11882. %%---------------------------------------------------------------------------
  11883.  
  11884. \section{P2HEX}
  11885.  
  11886. P2HEX ist eine Erweiterung von BIND.  Es besitzt alle
  11887. Kommandozeilenoptionen von BIND und hat die gleichen Konventionen
  11888. bzgl. Dateinamen.  Im Gegensatz zu BIND wird die Zieldatei aber als
  11889. Hexfile ausgegeben, d.h. als eine Folge von Zeilen, die den Code als
  11890. ASCII-Hexzahlen enthalten.
  11891. \par
  11892. P2HEX kennt neun verschiedene Zielformate, die "uber den
  11893. Kommandozeilenparameter \bb{F} ausgew"ahlt werden k"onnen:
  11894. \begin{itemize}
  11895. \item{Motorola S-Record (\tty{-F Moto})}
  11896. \item{MOS Hex (\tty{-F MOS})}
  11897. \item{Intel-Hex (Intellec-8, \tty{-F Intel})}
  11898. \item{16-Bit Intel-Hex (MCS-86, \tty{-F Intel16})}
  11899. \item{32-Bit Intel-Hex (\tty{-F Intel32})}
  11900. \item{Tektronix Hex (\tty{-F Tek})}
  11901. \item{Texas Instruments DSK (\tty{-F DSK})}
  11902. \item{Atmel AVR Generic (\tty{-F Atmel}, siehe \cite{AVRObj})}
  11903. \item{Lattice Mico8 prom\_init (\tty{-F Mico8})}
  11904. \item{C-Arrays, zum Inkludieren in C(++)-Quelldateien (\tty{-F C})}
  11905. \end{itemize}
  11906. Wird kein Zielformat explizit angegeben, so w"ahlt P2HEX anhand des
  11907. Prozessortyps automatisch eines aus, und zwar S-Records f"ur Motorola-
  11908. Prozessoren, Hitachi und TLCS-900(0), MOS f"ur 65xx/MELPS, DSK f"ur die
  11909. 16-Bit-Texas-Signalprozessoren, Atmel Generic f"ur die AVRs und Intel-Hex
  11910. f"ur den Rest. Je nach Breite der Startadresse kommen bei S-Record Records
  11911. der Typen 1,2 oder 3 zum Einsatz, jedoch nie in einer Gruppe gemischt.
  11912. Diese Automatik l"a"st sich mit der Kommandozeilenoption
  11913. \begin{verbatim}
  11914.  -M <1|2|3>
  11915. \end{verbatim}
  11916. teilweise unterdr"ucken: Ein Wert von 2 bzw. 3 sorgt daf"ur, da"s
  11917. S-Records mit einem Mindesttyp von 2 bzw. 3 benutzt werden, w"ahrend ein
  11918. Wert von 0 der vollen Automatik entspricht.
  11919.  
  11920. Normalerweise benutzt das AVR-Format immer eine Adre"sl"ange von 3 Bytes.
  11921. Manche Programme m"ogen das leider nicht...deshalb kann man mit dem
  11922. Schalter
  11923. \begin{verbatim}
  11924.  -avrlen <2|3>
  11925. \end{verbatim}
  11926. die L"ange zur Not auf 2 Bytes reduzieren.
  11927.  
  11928. Das Mico8-Format unterscheidet sich insofern aus den anderen
  11929. Formaten, als da"s es keine Adre"sfelder besitzt - es ist eine
  11930. schlichte Auflistung der Instruktionsw"orter im Programmspeicher.
  11931. Bei der Benutzung mu"s darauf geachtet werden, da"s der
  11932. belegte Adre"sbereich (der sich z.B. mit PLIST anzeigen l"a"st)
  11933. bei Null beginnt und fortlaufend ist.
  11934.  
  11935. Die Intel-, Tektronix- und MOS-Formate sind auf 16 Bit-Adressen
  11936. beschr"ankt, das 16-Bit Intel-Format reicht 4 Bit weiter.  L"angere
  11937. Adressen werden von P2HEX mit einer Warnung gemeldet und abgeschnitten(!).
  11938. F"ur die PICs k"onnen die drei von Microchip spezifizierten Varianten des
  11939. Intel-Hex-Formates erzeugt werden, und zwar mit dem Schalter
  11940. \begin{verbatim}
  11941.  -m <0..3>
  11942. \end{verbatim}
  11943. Das Format 0 ist INHX8M, in dem alle Bytes in Lo-Hi-Ordnung enthalten
  11944. sind.  Die Adre"sangaben verdoppeln sich, weil bei den PICs die Adresse
  11945. sich nur um 1 pro Wort erh"oht.  Dieses Format ist gleichzeitig die Vorgabe.
  11946. Im Format 1 (INHX16M) werden alle Worte in ihrer nat"urlichen Ordnung
  11947. abgelegt.  Dieses Format verwendet Microchip f"ur seine eigenen
  11948. Programmierger"ate.  Format 2 (INHX8L) und 3 (INHX8H) trennen die Worte
  11949. in ihre oberen und unteren Bytes auf.  Um die komplette Information zu
  11950. erhalten, mu"s P2HEX zweimal aufgerufen werden, z.B. so:
  11951. \begin{verbatim}
  11952.  p2hex test -m 2
  11953.  rename test.hex test.obl
  11954.  p2hex test -m 3
  11955.  rename test.hex test.obh
  11956. \end{verbatim}
  11957. F"ur das Motorola-Format verwendet P2HEX zus"atzlich einen in \cite{CPM68K}
  11958. genannten Recordtyp mit der Nummer 5, der die Zahl der folgenden
  11959. Daten-Records (S1/S2/S3) bezeichnet.  Da dieser Typ vielleicht nicht jedem
  11960. Programm bekannt ist, kann man ihn mit der Option
  11961. \begin{verbatim}
  11962. +5
  11963. \end{verbatim}
  11964. unterdr"ucken.
  11965. \par
  11966. Das C-Format f"allt insofern aus dem Rahmen, als da"s es immer explizit
  11967. ausgew"ahlt werden mu"s.  Die Ausgabedatei stellt im Prinzip ein vollst"andiges
  11968. St"uck C- oder C++-Code dar, das die Daten als eine Liste von C-Arrays
  11969. enth"alt.  Neben den eigentlichen Daten wird noch eine Liste von Deskriptoren
  11970. geschrieben, die Start, L"ange und Ende der Datenbl"ocke
  11971. beschreiben.  Was diese Deskriptoren enthalten, kann mit der Option
  11972. \begin{verbatim}
  11973. -cformat <Format>
  11974. \end{verbatim}
  11975. bestimmt werden.  Jeder Buchstabe in \verb!Format! legt ein Element des
  11976. Deskriptors fest:
  11977. \begin{itemize}
  11978. \item{Ein \verb!d! oder \verb!D! definiert einen Zeiger auf die Daten.
  11979.      "Uber den Gro"s- oder Kleinbuchstaben wird festgelegt, ob die Hex-
  11980.      Konstanten Gro"s- oder Kleinbuchstaben verwenden sollen.}
  11981. \item{Ein \verb!s! oder \verb!S! definiert die Startadresse der Daten,
  11982.      wahlweise vom Typ {\em unsigned} oder {\em unsigned long}.}
  11983. \item{Ein \verb!l! oder \verb!L! definiert die L"ange der Daten,
  11984.      wahlweise vom Typ {\em unsigned} oder {\em unsigned long}.}
  11985. \item{Ein \verb!e! oder \verb!E! definiert die Endadresse der Daten,
  11986.      d.h. die letzte von den Daten benutzte Adresse,
  11987.      wahlweise vom Typ {\em unsigned} oder {\em unsigned long}.}
  11988. \end{itemize}
  11989. \par
  11990. Finden sich Code-Records verschiedener Prozessoren in einer Quelldatei,
  11991. so erscheinen die verschiedenen Hexformate auch gemischt in der Zieldatei
  11992. --- es empfiehlt sich also dringend, von der Filterfunktion Gebrauch zu
  11993. machen, oder ein fixes Format "uber die \verb!-F!-Option festzulegen.
  11994. \par
  11995. Neben dem Codetypenfilter kennt P2HEX noch ein Adre"sfilter, das n"utzlich
  11996. ist, falls der Code auf mehrere EPROMs verteilt werden mu"s:
  11997. \begin{verbatim}
  11998.  -r <Startadresse>-<Endadresse>
  11999. \end{verbatim}
  12000. Die Startadresse ist dabei die erste Speicherzelle, die im Fenster liegen
  12001. soll, die Endadresse die der letzten Speicherzelle im Fenster, \ii{nicht}
  12002. die der ersten au"serhalb.  Um z.B. ein 8051-Programm in 4 2764-EPROMs
  12003. aufzuteilen, geht man folgenderma"sen vor:
  12004. \begin{verbatim}
  12005. p2hex <Quelldatei> eprom1 -f $31 -r $0000-$1fff
  12006. p2hex <Quelldatei> eprom2 -f $31 -r $2000-$3fff
  12007. p2hex <Quelldatei> eprom3 -f $31 -r $4000-$5fff
  12008. p2hex <Quelldatei> eprom4 -f $31 -r $6000-$7fff
  12009. \end{verbatim}
  12010. Anstelle einer festen Adresse kann man als Anfang bzw. Ende auch ein
  12011. einfaches Dollarzeichen oder ein '0x' angeben.  Dies bedeutet, da"s die
  12012. niedrigste bzw. h"ochste in der Quelldatei gefundene Adresse als Anfang
  12013. bzw. Ende genommen wird.  Der Default f"ur den Bereich ist '0x-0x', d.h.
  12014. es werden alle Daten aus der Quelldatei "ubernommen.
  12015. \par
  12016. \bb{ACHTUNG!} Die Splittung "andert nichts an den absoluten Adressen, die
  12017. in den Hexfiles stehen!  Sollen die Adressen im Hexfile bei 0 beginnen,
  12018. so kann man dies durch den zus"atzlichen Schalter
  12019. \begin{verbatim}
  12020. -a
  12021. \end{verbatim}
  12022. erreichen.  Um im Gegenteil die Adre"slage auf einen bestimmten Wert zu
  12023. verschieben, kann man den Schalter
  12024. \begin{verbatim}
  12025. -R <Wert>
  12026. \end{verbatim}
  12027. verwenden.  Der dabei angegebene Wert ist ein {\em Offset}, d.h. er wird
  12028. auf die in der Code-Datei angegebenen Adressen aufaddiert.
  12029. \par
  12030. Den Inhalt einer Datei kann man mit einem Offset auf eine beliebige
  12031. Position verschieben; diesen Offset h"angt man einfach in Klammern an
  12032. den Dateinamen an.  Ist der Code in einer Datei z.B. auf Adresse 0 in
  12033. der P-Datei abgelegt, man m"ochte ihn jedoch auf Adresse 1000h
  12034. verschieben, so h"angt man an \tty{(\$1000)} an den Dateinamen (ohne
  12035. Leerzeichen!) an.
  12036. \par
  12037. Sofern die P-Datei nicht nur Daten aus dem Code-Segment enth"alt, kann
  12038. man mit dem Schalter
  12039. \begin{verbatim}
  12040. -segment <name>
  12041. \end{verbatim}
  12042. ausw"ahlen, aus welchen Segment Daten extrahiert und ins HEX-Format
  12043. gewandelt werden sollen.  Die als Argument anzugebenden Segmentnamen sind
  12044. die gleichen wie f"ur den \tty{SEGMENT}-Befehl (\ref{SEGMENT}). Ein
  12045. Sonderfall ist das TI-DSK-Format, das als einziges Format vermerken kann,
  12046. ob Daten ins Code- oder Datensegment geh"oren.  In diesem Fall extrahiert
  12047. P2HEX automatisch beide Segmente, solange kein Segment explizit angegeben
  12048. ist.
  12049. \par
  12050. Analog zur \verb!-r! Option kann man mit der Option
  12051. \begin{verbatim}
  12052. -d <Start>-<Ende>
  12053. \end{verbatim}
  12054. ein Filter f"ur das Datensegment angeben.
  12055. \par
  12056. F"ur das DSK-, Intel- und Motorola-Format relevant ist die Option
  12057. \begin{verbatim}
  12058. -e <Adresse> ,
  12059. \end{verbatim}
  12060. mit der man die in die Hex-Datei einzutragende Startadresse festlegen
  12061. kann.  Fehlt diese Angabe, so wird nach einen entsprechenden Eintrag
  12062. in der Code-Datei gesucht.  Ist auch dort kein Hinweis auf einen
  12063. Einsprungpunkt zu finden, so wird kein Eintrag in die HEX-Datei
  12064. geschrieben (DSK/Intel) bzw. das entsprechende Feld wird auf 0 gesetzt
  12065. (Motorola).
  12066. \par
  12067. Leider ist sich die Literatur nicht ganz "uber die Endezeile f"ur
  12068. Intel-Hexfiles einig.  P2HEX kennt daher 3 Varianten, einstellbar "uber
  12069. den Parameter \bb{i} mit einer nachfolgenden Ziffer:
  12070. \begin{description}
  12071. \item[0]{ :00000001FF}
  12072. \item[1]{ :00000001}
  12073. \item[2]{ :0000000000}
  12074. \end{description}
  12075. \par
  12076. Defaultm"a"sig wird die Variante 0 benutzt, die die gebr"auchlichste zu
  12077. sein scheint.
  12078. \par
  12079. Fehlt der Zieldateiangabe eine Endung, so wird \tty{HEX} als Endung angenommen.
  12080. \par
  12081. Defaultm"a"sig gibt P2HEX pro Zeile maximal 16 Datenbytes aus, wie es
  12082. auch die meisten anderen Tools tun, die Hex-Files erzeugen.  Wollen
  12083. Sie dies "andern, so k"onnen Sie dies mit dem Schalter
  12084. \begin{verbatim}
  12085. -l <Anzahl>
  12086. \end{verbatim}
  12087. tun.  Der erlaubte Wertebereich liegt dabei zwischen 2 und 254 Datenbytes;
  12088. ungerade Werte werden implizit auf gerade Anzahlen aufgerundet.
  12089. \par
  12090. Meist werden die tempor"aren, von \asname{} erzeugten Code-Dateien nach einer
  12091. Umwandlung nicht mehr unbedingt gebraucht.  Mit der Kommandozeilen-
  12092. option
  12093. \begin{verbatim}
  12094. -k
  12095. \end{verbatim}
  12096. kann man P2HEX anweisen, diese automatisch nach der Konversion zu l"oschen.
  12097. \par
  12098. Anders als BIND erzeugt P2HEX keine Leerdatei, wenn nur ein Dateiname
  12099. (=Zieldatei) angegeben wurde, sondern bearbeitet die dazugeh"orige
  12100. Codedatei.  Es ist also ein Minimalaufruf \`a la
  12101. \begin{verbatim}
  12102. P2HEX <Name>
  12103. \end{verbatim}
  12104. m"oglich, um $<$Name:  $>$.HEX aus $<$Name:  $>$.P zu erzeugen.
  12105.  
  12106. %%---------------------------------------------------------------------------
  12107.  
  12108. \section{P2BIN}
  12109.  
  12110. P2BIN funktioniert wie P2HEX und bietet die gleichen Optionen (bis
  12111. auf die a- und i- Optionen, die bei Bin"ardateien keinen Sinn ergeben), nur
  12112. wird das Ergebnis nicht als Hexdatei, sondern als einfache Bin"ardatei
  12113. abgelegt.  Dies kann dann z.B. direkt in ein EPROM gebrannt werden.
  12114. \par
  12115. Zur Beeinflussung der Bin"ardatei kennt P2BIN gegen"uber P2HEX noch
  12116. drei weitere Optionen:
  12117. \begin{itemize}
  12118. \item{\tty{l $<8-Bit-Zahl>$}: gibt den Wert an, mit dem unbenutzte
  12119.      Speicherstellen in der Datei gef"ullt werden sollen.
  12120.      Defaultm"a"sig ist der Wert \$ff, so da"s ein halbwegs
  12121.      intelligenter EPROM-Brenner sie "uberspringt.  Man kann aber
  12122.      hiermit auch andere Werte einstellen, z.B. enthalten die gel"oschten
  12123.      Speicherzellen der MCS-48-EPROM-Versionen Nullen.  In einem solchen
  12124.      Falle w"are 0 der richtige Wert.}
  12125. \item{\tty{s}: weist das Programm an, eine Pr"ufsumme "uber die Bin"ardatei zu
  12126.      berechnen.  Die Pr"ufsumme wird einmal als 32-Bit-Wert ausgegeben,
  12127.      zum anderen wird das Zweierkomplement der Bits 0..7 in der letzten
  12128.      Speicherstelle abgelegt, so da"s die Modulo-256-Summe zu 0 wird.}
  12129. \item{\tty{m}:  f"ur den Fall, da"s ein Prozessor mit 16- oder 32-Bit-Datenbus
  12130.      eingesetzt wird und die Bin"ardatei f"ur mehrere EPROMs aufgesplittet
  12131.      werden mu"s.  Das Argument kann folgende Werte annehmen:
  12132.      \begin{itemize}
  12133.      \item{\tty{ALL}: alles kopieren}
  12134.      \item{\tty{ODD}: alle Bytes mit ungerader Adresse kopieren}
  12135.      \item{\tty{EVEN}: alle Bytes mit gerader Adresse kopieren}
  12136.      \item{\tty{BYTE0}..\tty{BYTE3}: nur alle Bytes kopieren, deren Adresse die Form
  12137.            $4n+0$...$4n+3$ hat.}
  12138.      \item{\tty{WORD0},\tty{WORD1}: nur das untere bzw. obere 16-Bit-Wort der
  12139.            32-Bit-Worte kopieren.}
  12140.      \end{itemize}}
  12141. \end{itemize}
  12142.  
  12143. Nicht wundern: Bei letzteren Optionen ist die Bin"ardatei um den Faktor 2
  12144. oder 4 kleiner als bei \tty{ALL}.  Dies ist bei konstantem Adre"sfenster logisch!
  12145.  
  12146. Falls die Code-Datei keine Startadresse enth"alt, kann man diese
  12147. analog zu P2HEX "uber die \tty{-e}-Kommandozeilenoption vorgeben.  Auf
  12148. Anforderung teilt P2BIN ihren Wert der Ergebnisdatei voran.  Mit der
  12149. Kommandozeilenoption
  12150. \begin{verbatim}
  12151. -S
  12152. \end{verbatim}
  12153. wird diese Funktion aktiviert.  Sie erwartet als Argument eine
  12154. Zahlenangabe zwischen 1 und 4,  die die L"ange des Adressfeldes in
  12155. Bytes bestimmt.  Optional kann dieser Angabe auch noch der Buchstabe
  12156. L oder B vorangestellt werden, um die Byte-Order dieser Adresse
  12157. festzulegen.  So erzeugt z.B. die Angabe \tty{B4} eine 4-Byte-Adresse in
  12158. Big-Endian-Anordnung, \tty{L2} oder nur '2' eine 2-Byte-Adresse in
  12159. Little-Endian-Anordnung.
  12160.  
  12161. %%---------------------------------------------------------------------------
  12162.  
  12163. \section{AS2MSG}
  12164.  
  12165. Bei AS2MSG handelt es sich eigentlich um kein Hilfsprogramm, sondern um ein
  12166. Filter, das (gl"ucklichen) Besitzern von Borland-Pascal 7.0 das Arbeiten
  12167. mit dem Assembler erleichtern soll.  In den DOS-Arbeitsumgebungen existiert
  12168. ein ,,Tools''-Men"u, das man um eigene Programme, z.B. \asname{} erweitern kann.
  12169. Das Filter erlaubt, die von \asname{} gelieferten Fehlermeldungen mit Zeilenangabe
  12170. direkt im Editorfenster anzuzeigen.  Dazu mu"s im Tools-Men"u ein neuer
  12171. Eintrag angelegt werden (\tty{Options/Tools/New}).  Tragen Sie in die
  12172. einzelnen Felder folgende Werte ein :
  12173. \begin{itemize}
  12174. \item{Title: {\tt \verb!~!M\verb!~!akroassembler}}
  12175. \item{Program path: \tty{\asname{}}}
  12176. \item{Command line: \tty{-E !1 \$EDNAME \$CAP MSG(AS2MSG) \$NOSWAP \$SAVE
  12177. ALL}}
  12178. \item{bei Bedarf einen Hotkey zuordnen (z.B. Shift-F7)}
  12179. \end{itemize}
  12180. Die Option \tty{-E} sorgt daf"ur, da"s Turbo-Pascal nicht mit STDOUT und
  12181. STDERR durcheinander kommt.
  12182. \par
  12183. Ich setze dabei voraus, da"s sowohl \asname{} als auch AS2MSG sich in einem
  12184. Verzeichnis befinden, welches in der Pfadliste aufgef"uhrt ist.  Nach einem
  12185. Druck auf dem passenden Hotkey (oder Auswahl aus dem Tools-Men"u) wird \asname{} mit
  12186. dem Namen der Textdatei im aktiven Editorfenster aufgerufen.  Die dabei
  12187. aufgetretenen Fehler werden in ein separates Fenster geleitet, durch das man
  12188. nun ,,browsen'' kann.  Mit \bb{Ctrl-Enter} springt man eine fehlerhafte
  12189. Zeile an.  Zus"atzlich enth"alt das Fenster die Statistik, die \asname{} am Ende
  12190. der Assemblierung ausgibt.  Diese erhalten als Dummy-Zeilennummer 1.
  12191. \par
  12192. F"ur diese Arbeitsweise sind sowohl TURBO.EXE (Real Mode) als auch BP.EXE
  12193. (Protected Mode) geeignet.  Ich empfehle BP, da in dieser Variante beim
  12194. Aufruf nicht erst der halbe DOS-Speicher ,,freigeswappt'' werden mu"s.
  12195.  
  12196. \cleardoublepage
  12197.  
  12198. \appendix
  12199.  
  12200. %%===========================================================================
  12201.  
  12202. \cleardoublepage
  12203. \chapter{Fehlermeldungen von \asname{}}
  12204. \label{ChapErrMess}
  12205.  
  12206. Im folgenden findet sich eine halb-tabellarische Auflistung der in \asname{}
  12207. definierten Fehlermeldungen.  Zu jeder Fehlermeldung finden sich folgende
  12208. Angaben:
  12209. \begin{itemize}
  12210. \item{interne Fehlernummer (f"ur den Anwender nur mit der \tty{n}-Option sichtbar);}
  12211. \item{Fehlermeldung im Klartext;}
  12212. \item{Typ:
  12213.      \begin{itemize}
  12214.      \item{Warnung: zeigt m"ogliche Fehler oder ineffizienten Code an.
  12215.            Assemblierung geht weiter.}
  12216.      \item{Fehler: echte Fehler.  Assemblierung geht weiter, aber keine
  12217.            Code-Datei wird geschrieben.}
  12218.      \item{Fatal: schwerwiegende Fehler.  Assemblierung wird abgebrochen.}
  12219.      \end{itemize}}
  12220. \item{Ursache: die Situation(en), in denen der Fehler ausgegeben
  12221.      wird;}
  12222. \item{Argument: Die Ausgabe, die auf Wunsch als erweiterte Fehlermeldung
  12223.      erfolgt.}
  12224. \end{itemize}
  12225.  
  12226. \par
  12227.  
  12228. \newcommand{\errentry}[5]
  12229.           {\item[#1]{#2
  12230.                      \begin{description}
  12231.                      \item[Type:]{\ \\#3}
  12232.                      \item[Reason:]{\ \\#4}
  12233.                      \item[Argument:]{\ \\#5}
  12234.                      \end{description}}
  12235.           }
  12236.  
  12237. \begin{description}
  12238. \errentry{   5}{Displacement=0, "uberfl"ussig}
  12239.               {Warnung}
  12240.               {bei 680x0-,6809- und COP8-Prozessoren: Das Displacement
  12241.                in einem Adre"sausdruck hat den Wert 0 ergeben.  Es wird
  12242.                ein  Adre"sausdruck  ohne Displacement erzeugt.  Um keine
  12243.                Phasenfehler zu erzeugen, werden NOP-Befehle eingef"ugt.}
  12244.               {keines}
  12245. \errentry{  10}{Kurzadressierung m"oglich}
  12246.               {Warnung}
  12247.               {bei 680x0-, 6502- und 68xx-Prozessoren k"onnen
  12248.                bestimmte Speicherbereiche mit kurzen Adressen erreicht
  12249.                werden.  Um keine Phasefehler zu erzeugen, wird zwar der
  12250.                k"urzere Ausdruck erzeugt, der freie Platz wird aber mit
  12251.                NOPs aufgef"ullt.}
  12252.               {keines}
  12253. \errentry{  20}{kurzer Sprung m"oglich}
  12254.               {Warnung}
  12255.               {Bei 680x0 und 8086-Prozessoren kann der Sprung
  12256.                sowohl mit langem als auch kurzem Displacement ausgef"uhrt
  12257.                werden.  Da kein kurzer Sprung angefordert wurde, wurde im
  12258.                ersten Pass Platz f"ur den langen Sprung freigehalten.
  12259.                Es wird ein kurzer Sprung erzeugt, der freie Platz wird
  12260.                mit NOPs aufgef"ullt, um Phasenfehler zu vermeiden.}
  12261.               {keines}
  12262. \errentry{  30}{kein Sharefile angelegt, SHARED ignoriert}
  12263.               {Warnung}
  12264.               {Es wurde eine \tty{SHARED}-Anweisung gefunden, es
  12265.                wurde aber keine Kommandozeilenoption angegeben, um eine
  12266.                Shared-Datei zu erzeugen.}
  12267.               {keines}
  12268. \errentry{  40}{FPU liest Wert evtl. nicht korrekt ein ($>$=1E1000)}
  12269.               {Warnung}
  12270.               {Das BCD-Gleitkommaformat der 680x0-Koprozessoren
  12271.                erlaubt zwar vierstellige Exponenten, lt. Datenbuch
  12272.                k"onnen solche Werte aber nicht korrekt eingelesen werden.
  12273.                Der vierstellige Wert wird zwar erzeugt, eine Funktion ist
  12274.                aber nicht gew"ahleistet.}
  12275.               {keines}
  12276. \errentry{  50}{Privilegierte Anweisung}
  12277.               {Warnung}
  12278.               {Es wurde eine Anweisung benutzt, die nur im
  12279.                Supervisor-Mode zul"assig ist, obwohl dieser nicht mittels
  12280.                \tty{SUPMODE ON} vorher explizit angezeigt wurde.}
  12281.               {keines}
  12282. \errentry{  60}{Distanz 0 nicht bei Kurzsprung erlaubt (NOP erzeugt)}
  12283.               {Warnung}
  12284.               {Ein kurzer Sprung mit der Distanz 0 ist bei
  12285.                680x0- bzw. COP8-Prozessoren nicht erlaubt, da dieser Sonderwert f"ur
  12286.                lange Spr"unge ben"otigt wird.  Stattdessen wurde ein
  12287.                NOP-Befehl eingef"ugt.}
  12288.               {keines}
  12289. \errentry{  70}{Symbol aus falschem Segment}
  12290.               {Warnung}
  12291.               {Das in dem Operanden benutzte Symbol
  12292.                ist aus einem Adre"sraum, der nicht mit dem benutzten
  12293.                Befehl bearbeitet werden kann.}
  12294.               {keines}
  12295. \errentry{  75}{Segment nicht adressierbar}
  12296.               {Warnung}
  12297.               {Das in dem Operanden benutzte Symbol
  12298.                ist aus einem Adre"sraum, der mit keinem der Segmentregister
  12299.                des 8086 adressiert werden kann.}
  12300.               {Name des nicht adressierbaren Segments}
  12301. \errentry{  80}{"Anderung des Symbolwertes erzwingt zus"atzlichen Pass}
  12302.               {Warnung}
  12303.               {Ein Symbol hat einen anderen Wert zugewiesen
  12304.                bekommen als im vorhergehenden Pass.  Diese Warnung wird
  12305.                nur ausgegeben, falls die \tty{r}-Option angegeben wurde.}
  12306.               {Der Name des fraglichen Symbols}
  12307. \errentry{  90}{"Uberlappende Speicherbelegung}
  12308.               {Warnung}
  12309.               {Bei der Bildung der Belegungsliste wurde
  12310.                festgestellt, da"s ein Speicherbereich im Codesegment
  12311.                mehrfach benutzt wurde.  Ursache k"onnen un"uberlegte
  12312.                \tty{ORG}-Anweisungen sein.}
  12313.               {keines}
  12314. \errentry{  95}{"Uberlappende Registernutzung}
  12315.               {Warnung}
  12316.               {In der Anweisung wurden Register ganz oder teilweise
  12317.                mehrfach in nicht zul"assiger Weise verwendet.}
  12318.               {Das den Konflikt ausl"osende Argument}
  12319. \errentry{ 100}{keine CASE-Bedingung zugetroffen}
  12320.               {Warnung}
  12321.               {bei einem \tty{SWITCH}..\tty{CASE}-Konstrukt ohne
  12322.                \tty{ELSECASE}-Zweig traf keiner der \tty{CASE}-Zweige zu.}
  12323.               {keines}
  12324. \errentry{ 110}{Seite m"oglicherweise nicht adressierbar}
  12325.               {Warnung}
  12326.               {Das in dem Operanden benutzte Symbol
  12327.                liegt nicht in der momentan mit \tty{ASSUME} eingestellten
  12328.                Fenster (ST6,78(C)10).}
  12329.               {keines}
  12330. \errentry{ 120}{Registernummer mu"s gerade sein}
  12331.               {Warnung}
  12332.               {Die Hardware erlaubt nur ein Registerpaar
  12333.                zu verketten, dessen Startadresse gerade ist (RR0, RR2...,
  12334.                nur Z8).}
  12335.               {keines}
  12336. \errentry{ 130}{veralteter Befehl}
  12337.               {Warnung}
  12338.               {Der verwendete Befehl ist zwar noch
  12339.                definiert, ist in seiner Funktion aber durch andere,
  12340.                neue Befehle ersetzbar und daher in zuk"unftigen
  12341.                Prozessorversionen eventuell nicht mehr vorhanden.}
  12342.               {keines}
  12343. \errentry{ 140}{Nicht vorhersagbare Ausf"uhrung dieser Anweisung}
  12344.               {Warnung}
  12345.               {Die verwendete Adressierungsart ist bei
  12346.                diesem Befehl zwar prinzipiell erlaubt, ein Register
  12347.                wird jedoch in einer Weise doppelt verwendet, da"s je
  12348.                nach Aus"uhrungsreihenfolge sich unterschiedliche
  12349.                Ergebnisse einstellen k"onnen.}
  12350.               {keines}
  12351. \errentry{ 150}{Lokaloperator au"serhalb einer Sektion "uberfl"ussig}
  12352.               {Warnung}
  12353.               {Ein vorangestellter Klammeraffe dient
  12354.                dazu, sich explizit auf zu der Sektion lokale Symbole
  12355.                zu beziehen.  Wenn man sich au"serhalb einer Sektion
  12356.                befindet, gibt es keine lokalen Symbole, weshalb dieser
  12357.                Operator "uberfl"ussig ist.}
  12358.               {keines}
  12359. \errentry{ 160}{sinnlose Operation}
  12360.               {Warnung}
  12361.               {Die Anweisung ergibt entweder "uberhaupt
  12362.                keinen Sinn oder kann auf andere Weise schneller und k"urzer
  12363.                ausgef"uhrt werden.}
  12364.               {keines}
  12365. \errentry{ 170}{unbekannter Symbolwert erzwingt zus"atzlichen Pass}
  12366.               {Warnung}
  12367.               {\asname{} vermutet eine Vorw"artsreferenz eines
  12368.                Symbols, d.h. das Symbol wird benutzt, bevor es definiert
  12369.                wurde, und h"alt einen weiteren Pass f"ur unumg"anglich.
  12370.                Diese Warnung wird nur ausgegeben, falls die \tty{r}-Option
  12371.                angegeben wurde.}
  12372.               {Der Name des fraglichen Symbols}
  12373. \errentry{ 180}{Adresse nicht ausgerichtet}
  12374.               {Warnung}
  12375.               {Eine Adresse ist nicht ein mehrfaches der
  12376.                Operandengr"o"se.  Das Datenbuch verbietet zwar solche Zugriffe,
  12377.                im Instruktionswort ist aber Platz f"ur diese Adresse, so da"s
  12378.                \asname{} es bei einer Warnung belassen hat.}
  12379.               {keines}
  12380. \errentry{ 190}{I/O-Adresse darf nicht verwendet werden}
  12381.               {Warnung}
  12382.               {Der verwendete Adressierungsmodus oder die
  12383.                angesprochene Adresse sind zwar prinzipiell erlaubt, die
  12384.                Adresse liegt aber im Bereich der Peripherieregister, die in
  12385.                diesem Zusammenhang nicht verwendet werden d"urfen.}
  12386.               {keines}
  12387. \errentry{ 200}{m"ogliche Pipeline-Effekte}
  12388.               {Warnung}
  12389.               {Ein Register wird in einer Befehlsfolge so
  12390.                verwendet, da"s die Befehlsausf"uhrung m"oglicherweise nicht
  12391.                in der hingeschriebenen Form ablaufen wird.  "Ublicherweise
  12392.                wird ein Register benutzt, bevor der neue Wert zur Verf"ugung
  12393.                steht.}
  12394.               {das die Verklemmung verursachende Register}
  12395. \errentry{ 210}{mehrfache Adre"sregisterbenutzung in einer Anweisung}
  12396.               {Warnung}
  12397.               {Ein Adre"sregister wird in mehreren
  12398.                Adre"sausdr"ucken eines Befehls benutzt.  Sofern einer der
  12399.                beiden Ausdr"ucke das Register modifiziert, sind die
  12400.                Ergebnisadressen nicht eindeutig festgelegt.}
  12401.               {das mehrfach verwendete Register}
  12402. \errentry{ 220}{Speicherstelle ist nicht bitadressierbar}
  12403.               {Warnung}
  12404.               {Mit einer \tty{SFRB}-Anweisung wurde
  12405.                versucht, eine Speicherstelle als bitadressierbar zu
  12406.                deklarieren, die aufgrund der Architektur des 8051 nicht
  12407.                bitadressierbar ist.}
  12408.               {keines}
  12409. \errentry{ 230}{Stack ist nicht leer}
  12410.               {Warnung}
  12411.               {Am Ende eines Durchlaufes ist ein vom
  12412.                Programm definierter Stack nicht leer.}
  12413.               {der Name des Stacks sowie seine Resttiefe}
  12414. \errentry{ 240}{NUL-Zeichen in Strings, Ergebnis undefiniert}
  12415.                {Warnung}
  12416.                {Eine String-Konstante enth"alt ein
  12417.                NUL-Zeichen. Dies funktioniert zwar mit der Pascal-Version,
  12418.                in Hinblick auf die C-Version von \asname{} ist dies aber ein Problem,
  12419.                da C Strings mit einem NUL-Zeichen terminiert, d.h. der String
  12420.                w"are f"ur C an dieser Stelle zu Ende...}
  12421.                {keines}
  12422. \errentry{ 250}{Befehl "uberschreitet Seitengrenze}
  12423.                {Warnung}
  12424.                {Ein Befehl steht zu Teilen auf
  12425.                verschiedenen Seiten.  Da der Programmz"ahler des Prozessors
  12426.                aber nicht "uber Seitengrenzen hinweg inkrementiert wird,
  12427.                w"urde zur Laufzeit anstelle des Instruktionsbytes von der
  12428.                Folgeseite wieder das erste Byte der alten Seite geholt; das
  12429.                Programm w"urde fehlerhaft ablaufen.}
  12430.                {keines}
  12431. \errentry{ 255}{Bereichsunterschreitung}
  12432.               {Warnung}
  12433.               {Ein Zahlenwert lag unterhalb des erlaubten Bereichs.  \asname{}
  12434.                hat den Wert durch ein Abschneiden der oberen Bitstellen
  12435.                in den erlaubten Bereich gebracht, es ist jedoch nicht
  12436.                garantiert, da"s sich durch diese Operation sinnvoller und
  12437.                korrekter Code ergibt.}
  12438.               {keines}
  12439. \errentry{ 260}{Bereichs"uberschreitung}
  12440.               {Warnung}
  12441.               {Ein Zahlenwert lag oberhalb des erlaubten Bereichs.  \asname{}
  12442.                hat den Wert durch ein Abschneiden der oberen Bitstellen
  12443.                in den erlaubten Bereich gebracht, es ist jedoch nicht
  12444.                garantiert, da"s sich durch diese Operation sinnvoller und
  12445.                korrekter Code ergibt.}
  12446.               {keines}
  12447. \errentry{ 270}{negatives Argument f"ur DUP}
  12448.               {Warnung}
  12449.               {Das Wiederholungsargument einer \tty{DUP}-Direktive war
  12450.                kleiner als 0.  Es werden (analog zu einem Argument von
  12451.                genau 0) keine Daten abgelegt.}
  12452.               {keines}
  12453. \errentry{ 280}{einzelner X-Operand wird als indizierte und nicht als
  12454.                implizite Adressierung interpretiert}
  12455.               {Warnung}
  12456.               {Ein einzelner X-Operand kann sowohl als Register X als
  12457.                auch X-indizierte Adressierung mit Null-Displacement
  12458.                interpretiert werden, da sich Motorola hier nicht festlegt.
  12459.                \asname{} w"ahlt die letztere Variante, was m"oglicherweise nicht
  12460.                das erwartete ist.}
  12461.               {keines}
  12462. \errentry{ 300}{Bit-Nummer wird abgeschnitten werden}
  12463.               {Warnung}
  12464.               {Die Instruktion arbeitet nur auf Byte- bzw.
  12465.                Langwort-Operanden, Bitnummern jenseits 7 bzw. 31 werden
  12466.                von der CPU modulo-8 bzw. modulo-32 behandelt werden.}
  12467.               {keines}
  12468. \errentry{ 310}{Ung"ultiger Wert f"ur Registerzeiger}
  12469.               {Warnung}
  12470.               {G"ultige bzw. sinnvolle Werte f"ur den Registerzeiger sind
  12471.                nur Werte von 0x00...0x70 bzw. 0xf0, weil die anderen
  12472.                Registerbereiche unbelegt sind.}
  12473.               {keines}
  12474. \errentry{ 320}{Makro-Argument umdefiniert}
  12475.               {Warnung}
  12476.               {Einem Makroparameter wurden zwei oder mehr
  12477.                verschiedene Werte zugewiesen.  Dies kann bei der
  12478.                Verwendung von Schl"usselwortparametern auftreten.
  12479.                Das zuletzt angegebene Argument wird benutzt.}
  12480.               {Name des Makroparameters}
  12481. \errentry{ 330}{veraltete Anweisung}
  12482.               {Warnung}
  12483.               {Dies Anweisung ist veraltet und sollte nicht mehr
  12484.                in neuen Programmen verwendet werden.}
  12485.               {Die Anweisung, die stattdessen verwendet werden sollte.}
  12486. \errentry{ 340}{Quelloperand l"anger oder gleich Zieloperand}
  12487.               {Warnung}
  12488.               {Der Quelloperand ist l"anger oder gleich gro"s wie der
  12489.                Zieloperand, gemessen in Bits.  Eine Null- oder Vorzeichenerweiterung
  12490.                ergibt keinen Sinn mit diesen Argumenten.  Schlagen Sie im
  12491.                Referenzhandbuch der CPU das Verhalten in diesem Fall nach.}
  12492.               {keines}
  12493. \errentry{ 350}{TRAP-Nummer ist g"ultige Instruktion}
  12494.               {Warnung}
  12495.               {Ein TRAP mit dieser Nummer benutzt den gleichen Maschinencode
  12496.                wie ein von der CPU unterst"utzter Maschinenbefehl.}
  12497.               {keines}
  12498. \errentry{ 360}{Padding hinzugef"ugt}
  12499.               {Warnung}
  12500.               {Die Menge abgelegter Bytes ist ungerade; eine H"alfte des letzten
  12501.                16-Bit-Wortes bleibt ungenutzt.}
  12502.               {keines}
  12503. \errentry{ 370}{Registernummer-Umlauf}
  12504.               {Warnung}
  12505.               {Die Startregisternummer plus die Anzahl der Register ergibt ein
  12506.                letztes Register jenseits des Endes der Registerbank.}
  12507.               {das Argument mit der Registeranzahl}
  12508. \errentry{ 380}{verwende indizierte anstelle indirekter Adressierung}
  12509.               {Warnung}
  12510.               {Indirekte Adressierung ist an dieser Stelle nicht erlaubt.
  12511.                Es wird stattdessen indizierte Adressierung mit einem
  12512.                (Dummy-)Displacement von Null verwendet.}
  12513.               {das Argument mit dem Adressierungsausdruck}
  12514. \errentry{ 390}{nicht im Normal-Modus erlaubt}
  12515.               {Warnung}
  12516.               {Dieser Maschinenbefehl ist nur im Panel-Modus und nicht
  12517.                im ,,Normalbetrieb'' erlaubt.}
  12518.               {die fragliche Instruktion}
  12519. \errentry{ 400}{nicht im Panel-Modus erlaubt}
  12520.               {Warnung}
  12521.               {Dieser Maschinenbefehl ist nur im ,,Nornalbetrieb''
  12522.                und nicht im Panel-Modus erlaubt.}
  12523.               {die fragliche Instruktion}
  12524. \errentry{ 410}{Argument ausserhalb erlauben Bereichs}
  12525.               {Warnung}
  12526.               {Das Argument oder die Summe zweier Argumente
  12527.                liegt au"serhalb des f"ur diesen Befehls erlaubten
  12528.                Bereichs, obwohl in der Instruktion prinzipiell
  12529.                Raum f"ur gr"o"sere Werte ist.}
  12530.               {das fragliche Argument}
  12531. \errentry{ 420}{Versuch, eine Mehrwort-Instruktion zu "uberspringen}
  12532.               {Warnung}
  12533.               {Die vorherige Anweisung war eine Skip-Anweisung, die
  12534.                nur ein Maschinenwort im Code "uberspringen kann. Da
  12535.                die aktuelle Anweisung l"anger als ein Maschinenwort
  12536.                ist, w"urde der Skip mitten in die Anweisung springen.}
  12537.               {die fragliche Anweisung}
  12538. \errentry{ 430}{implizite Vorzeichenerweiterung}
  12539.               {Warnung}
  12540.               {Der Prozessor f"uhrt bei diesem Befehl eine Vorzeichenerweiterung
  12541.                auf die volle Registerbreite aus.  Das bedeutet, dass
  12542.                die oberen Bits f"ur das gegebene Argument mit 1 und
  12543.                nicht mit 0 gef"ullt werden.  Je nach folgender Nutzung
  12544.                kann dies irrelevant sein, mu"s aber nicht.}
  12545.               {der fragliche Wert}
  12546. \errentry{ 440}{numerischer Wert -128 bedeutet Nutzung des E-Registers (Literal 'E' verwenden, um diese Warnung zu vermeiden)}
  12547.               {Warnung}
  12548.               {Ein Displacement von -128 bedeutet beim SC/MP in diesem Fall, dass
  12549.                das Displacement aus dem E-Register genommen wird.  Der Assembler
  12550.                kann in diesem Fall nicht sicher entscheiden, ob das gewollt ist
  12551.                oder der Wert -128 sich unbeabsichtigt aus einer Berechnung ergeben
  12552.                hat.  Verwenden Sie stattdessen das Literal 'E' oder ein auf 'E'
  12553.                definiertes Registersymbol, um die Absicht klar zu machen und die
  12554.                Warnung zu vermeiden.}
  12555.               {das fragliche Displacement-Argument}
  12556. \errentry{ 450}{I/O-Adresse mu"s mit INS/OUTS angesprochen werden}
  12557.               {Warnung}
  12558.               {I/O-Adressen im Bereich des Prozessormoduls (0..3) k"onnen nur
  12559.                "uber die Befehle {\tt INS} und {\tt OUTS} erreicht werden,
  12560.                nicht "uber {\tt IN} und {\tt OUT}.}
  12561.               {das fragliche Adress-Argument}
  12562. \errentry{1000}{Symbol doppelt definiert}
  12563.               {Fehler}
  12564.               {Einem Symbol wurde durch ein Label oder
  12565.                 \tty{EQU}, \tty{PORT}, \tty{SFR}, \tty{LABEL},
  12566.                 \tty{SFRB} oder \tty{BIT} ein neuer  Wert zugewiesen, dies
  12567.                ist aber nur bei \tty{SET/EVAL} erlaubt.}
  12568.               {Name des fraglichen Symbols, bei eingeschalteter
  12569.                 Querverweisliste zus"atzlich die Zeile der ersten Definition}
  12570. \errentry{1010}{Symbol nicht definiert}
  12571.               {Fehler}
  12572.               {Ein benutztes Symbol ist auch im 2.Pass noch
  12573.                nicht in der Symboltabelle enthalten.}
  12574.               {Name des nicht gefundenen Symbols}
  12575. \errentry{1020}{Ung"ultiger Symbolname}
  12576.               {Fehler}
  12577.               {Ein Symbolname entspricht nicht den Bedingungen
  12578.                f"ur einen g"ultigen Symbolnamen.  Beachten Sie, da"s f"ur
  12579.                Makro-und Funktionsparameter strengere Regeln gelten!}
  12580.               {der fehlerhafte Symbolname}
  12581. \errentry{1090}{Ung"ultiges Format}
  12582.               {Fehler}
  12583.               {Das benutzte Befehlsformat existiert bei diesem
  12584.                Befehl nicht.}
  12585.               {Der Kennbuchstabe des verwendeten Formates}
  12586. \errentry{1100}{"Uberfl"ussiges Attribut}
  12587.               {Fehler}
  12588.               {Der benutzte Befehl (Prozessor oder Pseudo) darf
  12589.                kein mit einem Punkt angeh"angtes Attribut haben.}
  12590.               {keines}
  12591. \errentry{1105}{Attribut darf nur 1 Zeichen lang sein}
  12592.               {Fehler}
  12593.               {Das mit einem Punkt an einen Befehl angeh"angte
  12594.                Attribut mu"s genau ein Zeichen lang sein; weder mehr noch
  12595.                weniger ist erlaubt.}
  12596.               {keines}
  12597. \errentry{1107}{undefiniertes Attribut}
  12598.               {Fehler}
  12599.               {Das an einem Befehl angef"ugte Attribut ist ung"ultig.}
  12600.               {keines}
  12601. \errentry{1110}{Unpassende Operandenzahl}
  12602.               {Fehler}
  12603.               {Die bei einem Befehl (Prozessor oder Pseudo)
  12604.                angegebene Operandenzahl liegt nicht in dem f"ur diesen
  12605.                Befehl erlaubten Bereich.}
  12606.               {Die erwartete Anzahl Argumente bzw. Operanden}
  12607. \errentry{1112}{Kann Argument nicht in Teile aufspaltenl}
  12608.               {Fehler}
  12609.               {Bei bestimmten Prozessoren (z.B. DSP56000)
  12610.                m"ussen die kommaseparierten Argumente weiter in
  12611.                Einzeloperanden aufgespalten werden, diese ist
  12612.                fehlgeschlagen.}
  12613.               {keines}
  12614. \errentry{1115}{Unpassende Optionenzahl}
  12615.               {Fehler}
  12616.               {Die bei diesem Befehl angegebene Zahl
  12617.                 von Optionen liegt nicht in dem f"ur diesen
  12618.                Befehl erlaubten Bereich.}
  12619.               {keines}
  12620. \errentry{1120}{nur immediate-Adressierung erlaubt}
  12621.               {Fehler}
  12622.               {Der benutzte Befehl l"a"st nur
  12623.                immediate-Operanden (mit vorangestelltem \#) zu.}
  12624.               {keines}
  12625. \errentry{1130}{Unpassende Operandengr"o"se}
  12626.               {Fehler}
  12627.               {Der Operand hat zwar einen f"ur den Befehl
  12628.                zugelassenen Typ, jedoch nicht die richtige L"ange (in
  12629.                Bits).}
  12630.               {keines}
  12631. \errentry{1131}{Widersprechende Operandengr"o"sen}
  12632.               {Fehler}
  12633.               {Die angegebenen Operanden haben unterschiedliche
  12634.                L"angen (in Bit).}
  12635.               {keines}
  12636. \errentry{1132}{Undefinierte Operandengr"o"se}
  12637.               {Fehler}
  12638.               {Aus Opcode und Operanden l"a"st sich die
  12639.                Operandengr"o"se nicht eindeutig bestimmen (ein Problem
  12640.                des 8086-Assemblers).  Sie m"ussen die Operandengr"o"se
  12641.                durch einen \tty{BYTE}, \tty{WORD}, usw. \tty{PTR}-Pr"afix
  12642.                 festlegen.}
  12643.               {keines}
  12644. \errentry{1133}{Ganzzahl oder String erwartet, aber Gleitkommazahl erhalten}
  12645.               {Fehler}
  12646.               {An dieser Stelle kann keine Gleitkommazahl als Argument
  12647.                verwendet werden.}
  12648.               {das fehlerhafte Argument}
  12649. \errentry{1134}{Ganzzahl erwartet, aber Gleitkommazahl erhalten}
  12650.               {Fehler}
  12651.               {An dieser Stelle kann keine Gleitkommazahl als Argument
  12652.                verwendet werden.}
  12653.               {das fehlerhafte Argument}
  12654. \errentry{1136}{Gleitkommazahl erwartet, aber String erhalten}
  12655.               {Fehler}
  12656.               {An dieser Stelle kann kein String als Argument
  12657.                verwendet werden.}
  12658.               {das fehlerhafte Argument}
  12659. \errentry{1137}{Operandentyp-Diskrepanz}
  12660.               {Fehler}
  12661.               {Die beiden Argumente eines Operanden haben nicht
  12662.                den gleichen Datentyp (Integer/Gleitkomma/String).}
  12663.               {keines}
  12664. \errentry{1138}{String erwartet, aber Ganzzahl erhalten}
  12665.               {Fehler}
  12666.               {An dieser Stelle kann keine Ganzzahl als Argument
  12667.                verwendet werden.}
  12668.               {das fehlerhafte Argument}
  12669. \errentry{1139}{String erwartet, aber Gleitkommazahl erhalten}
  12670.               {Fehler}
  12671.               {An dieser Stelle kann keine Gleitkommazahl als Argument
  12672.                verwendet werden.}
  12673.               {das fehlerhafte Argument}
  12674. \errentry{1140}{zu viele Argumente}
  12675.               {Fehler}
  12676.               {Einem Befehl wurden mehr als die unter \asname{}
  12677.                zul"assigen 20 Parameter "ubergeben.}
  12678.               {keines}
  12679. \errentry{1141}{Ganzzahl erwartet, aber String erhalten}
  12680.               {Fehler}
  12681.               {An dieser Stelle kann kein String als Argument
  12682.                verwendet werden.}
  12683.               {das fehlerhafte Argument}
  12684. \errentry{1142}{Ganz- oder Gleitkommazahl erwartet, aber String erhalten}
  12685.               {Fehler}
  12686.               {An dieser Stelle kann kein String als Argument
  12687.                verwendet werden.}
  12688.               {das fehlerhafte Argument}
  12689. \errentry{1143}{String erwartet}
  12690.               {Fehler}
  12691.               {An dieser Stelle kann nur ein (in einfachen Hochkommas
  12692.                eingeschlossener) String als Argument verwendet werden.}
  12693.               {das fehlerhafte Argument}
  12694. \errentry{1144}{Ganzzahl erwartet}
  12695.               {Fehler}
  12696.               {An dieser Stelle kann nur eine ganze Zahl als Argument
  12697.                verwendet werden.}
  12698.               {das fehlerhafte Argument}
  12699. \errentry{1145}{Ganz-, Gleitkommazahl oder String erwartet, aber Register bekommen}
  12700.               {Fehler}
  12701.               {An dieser Stelle kann kein Registersymbol als Argument verwendet werden.}
  12702.               {das fehlerhafte Argument}
  12703. \errentry{1146}{Ganzzahl oder String erwartet}
  12704.               {Fehler}
  12705.               {An dieser Stelle kann keine Gleitkommazahl oder Registersymbol als Argument verwendet werden.}
  12706.               {das fehlerhafte Argument}
  12707. \errentry{1147}{Register erwartet}
  12708.               {Fehler}
  12709.               {An dieser Stelle kann nur ein Register als Argument verwendet werden.}
  12710.               {das fehlerhafte Argument}
  12711. \errentry{1148}{Registersymbol f"ur anderes Ziel}
  12712.               {Fehler}
  12713.               {Das angesprochene Registersymbol wurde f"ur einen anderen Zielprozessor
  12714.                als den aktuell verwendeten definiert und ist nicht kompatibel.}
  12715.               {das fehlerhafte Argument}
  12716. \errentry{1149}{Gleitkomma-Argument erwartet, aber Ganzzahl bekommen}
  12717.               {Fehler}
  12718.               {An dieser Stelle kann kein Ganzzahl-, sondern nur ein Gleitkomma-
  12719.                Argument verwendet werden.}
  12720.               {das fehlerhafte Argument}
  12721. \errentry{1151}{Ganz- oder Gleitkommazahl erwartet, aber Register bekommen}
  12722.               {Fehler}
  12723.               {An dieser Stelle kann kein Register, sondern nur eine Ganz-
  12724.                oder Gleitkommazahl als Argument verwendet werden.}
  12725.               {das fehlerhafte Argument}
  12726. \errentry{1152}{Ganzzahl oder String erwartet, aber Register bekommen}
  12727.               {Fehler}
  12728.               {An dieser Stelle kann kein Register, sondern nur eine Ganzzahl
  12729.                 oder ein String als Argument verwendet werden.}
  12730.               {das fehlerhafte Argument}
  12731. \errentry{1153}{Ganzzahl erwartet, aber Register bekommen}
  12732.               {Fehler}
  12733.               {An dieser Stelle kann kein Register, sondern nur eine Ganzzahl
  12734.                als Argument verwendet werden.}
  12735.               {das fehlerhafte Argument}
  12736. \errentry{1200}{Unbekannter Befehl}
  12737.               {Fehler}
  12738.               {Der benutzte Befehl ist weder ein Pseudobefehl
  12739.                von \asname{} noch ein Befehl des momentan eingestellten
  12740.                Prozessors.}
  12741.               {keines}
  12742. \errentry{1300}{Klammerfehler}
  12743.               {Fehler}
  12744.               {Der Formelparser ist auf einen (Teil-)Ausdruck
  12745.                gesto"sen, in dem die Summe "offnender und schlie"sender
  12746.                Klammern nicht "ubereinstimmt.}
  12747.               {der beanstandete (Teil-)Ausdruck}
  12748. \errentry{1310}{Division durch 0}
  12749.               {Fehler}
  12750.               {Bei einer Division oder Modulooperation ergab
  12751.                die Auswertung des rechten Teilausdruckes 0.}
  12752.               {keines}
  12753. \errentry{1315}{Bereichsunterschreitung}
  12754.               {Fehler}
  12755.               {Der angegebene Integer-Wert unterschreitet
  12756.                den zul"assigen Bereich.}
  12757.               {aktueller Wert und zul"assiges Minimum
  12758.                 (manchmal, ich stelle das seit Jahren um...)}
  12759. \errentry{1320}{Bereichs"uberschreitung}
  12760.               {Fehler}
  12761.               {Der angegebene Integer-Wert "uberschreitet
  12762.                den zul"assigen Bereich.}
  12763.               {aktueller Wert und zul"assiges Maximum
  12764.                 (manchmal, ich stelle das seit Jahren um...)}
  12765. \errentry{1322}{keine Zweierpotenz}
  12766.               {Fehler}
  12767.               {Hier sind nur Zweierpotenzen (1,2,4,8...)
  12768.                als Wert erlaubt}
  12769.               {der fragliche Wert}
  12770. \errentry{1325}{Adresse nicht ausgerichtet}
  12771.               {Fehler}
  12772.               {Die angegebene direkte Speicheradresse
  12773.                entspricht nicht den Anspr"uchen des Datentransfers, d.h.
  12774.                ist nicht ein mehrfaches der Operandengr"o"se.  Nicht alle
  12775.                Prozessoren erlauben unausgerichtete Datenzugriffe.}
  12776.               {keines}
  12777. \errentry{1330}{Distanz zu gro"s}
  12778.               {Fehler}
  12779.               {Der in einem Adre"sausdruck enthaltene
  12780.                Displacement-Wert ist zu gro"s.}
  12781.               {keines}
  12782. \errentry{1331}{Ziel nicht auf gleicher Seite}
  12783.               {Fehler}
  12784.               {Befehl und Operandenadresse m"ussen
  12785.                auf der gleichen Seite liegen.}
  12786.               {das fragliche Adre"s-Argument}
  12787. \errentry{1340}{Kurzadressierung nicht m"oglich}
  12788.               {Fehler}
  12789.               {Die Adresse des Operanden liegt au"serhalb des
  12790.                Speicherbereiches, in dem Kurzadressierung m"oglich ist.}
  12791.               {keines}
  12792. \errentry{1350}{Unerlaubter Adressierungsmodus}
  12793.               {Fehler}
  12794.               {Der benutzte Adressierungsmodus existiert
  12795.                generell zwar, ist an dieser Stelle aber nicht erlaubt.}
  12796.               {keines}
  12797. \errentry{1351}{Adresse mu"s gerade sein}
  12798.               {Fehler}
  12799.               {An dieser Stelle sind nur gerade Adressen erlaubt,
  12800.                da das unterste Bit f"ur andere Zwecke verwendet wird
  12801.                oder reserviert ist.}
  12802.               {das fragliche Argument}
  12803. \errentry{1352}{Adresse mu"s ausgerichtet sein}
  12804.               {Fehler}
  12805.               {An dieser Stelle sind nur ausgerichtete
  12806.                (d.h glatt durch 2, 4, 8... teilbare) Adressen erlaubt,
  12807.                da die untersten Bits f"ur andere Zwecke verwendet werden
  12808.                oder reserviert sind.}
  12809.               {das fragliche Argument}
  12810. \errentry{1355}{Adressierungsmodus im Parallelbetrieb nicht erlaubt}
  12811.               {Fehler}
  12812.               {Die verwendeten Adressierungsmodi
  12813.                sind zwar im sequentiellen Modus zul"assig, jedoch nicht
  12814.                bei parallelen Instruktionen.}
  12815.               {keines}
  12816. \errentry{1360}{undefinierte Bedingung}
  12817.               {Fehler}
  12818.               {Die benutzte Bedingung f"ur bedingte Spr"unge
  12819.                existiert nicht.}
  12820.               {keines}
  12821. \errentry{1365}{inkompatible Bedingungen}
  12822.               {Fehler}
  12823.               {Die benutzte Kombination von Bedingungen kann nicht
  12824.                in einem Befehl verwendet werden.}
  12825.               {die Bedingung, bei der die Unvertr"aglichkeit
  12826.                entdeckt wurde.}
  12827. \errentry{1366}{unbekanntes Flag}
  12828.               {Fehler}
  12829.               {Das angegebene Flag existiert nicht.}
  12830.               {Das Argument mit dem fraglichen Flag}
  12831. \errentry{1367}{doppeltes Flag}
  12832.               {Fehler}
  12833.               {Das angegebene Flag wurde mehrfach in der Liste verwendet.}
  12834.               {Das Argument mit dem doppelten Flag}
  12835. \errentry{1368}{unbekannter Interrupt}
  12836.               {Fehler}
  12837.               {Der angegebene Interrupt existiert nicht.}
  12838.               {Das Argument mit dem fraglichen Interrupt}
  12839. \errentry{1369}{doppelter Interrupt}
  12840.               {Fehler}
  12841.               {Der angegebene Interrupt wurde mehrfach in der Liste verwendet.}
  12842.               {Das Argument mit dem doppelten Interrupt}
  12843. \errentry{1370}{Sprungdistanz zu gro"s}
  12844.               {Fehler}
  12845.               {Sprungbefehl und Sprungziel liegen zu weit
  12846.                auseinander, um mit einem Sprung der benutzten L"ange
  12847.                "uberbr"uckt werden zu k"onnen.}
  12848.               {keines}
  12849. \errentry{1371}{Sprungdistanz ist Null}
  12850.               {Fehler}
  12851.               {Sprungbefehl und Sprungziel liegen direkt hintereinander,
  12852.                und eine Sprungdistanz von null kann nicht kodiert werden.}
  12853.               {Die Zieladresse im Quellcode}
  12854. \errentry{1375}{Sprungdistanz ist ungerade}
  12855.               {Fehler}
  12856.               {Da Befehle nur auf geraden Adressen liegen
  12857.                d"urfen, mu"s eine Sprungdistanz zwischen zwei Befehlen
  12858.                auch immer gerade sein, das Bit 0 der Distanz wird
  12859.                anderweitig verwendet.  Diese Bedingung ist verletzt
  12860.                worden.  Grund ist "ublicherweise die Ablage einer
  12861.                ungeraden Anzahl von Daten in Bytes oder ein falsches \tty{ORG}.}
  12862.               {keines}
  12863. \errentry{1376}{Skip-Ziel passt nicht}
  12864.               {Fehler}
  12865.               {Das angegebene Sprungziel ist nicht die Adresse, die der
  12866.                Prozessor bei Ausf"uhrung der Skip-Anweisung anspringen w"urde.}
  12867.               {die angegebene (beabsichtigte) Sprungadresse}
  12868. \errentry{1380}{ung"ultiges Schiebeargument}
  12869.               {Fehler}
  12870.               {als Argument f"ur die Schiebeamplitude darf nur
  12871.                eine Konstante oder ein Datenregister verwendet werden.
  12872.                (nur 680x0)}
  12873.               {keines}
  12874. \errentry{1390}{Nur Bereich 1..8 erlaubt}
  12875.               {Fehler}
  12876.               {Konstanten f"ur Schiebeamplituden oder
  12877.                \tty{ADDQ}-Argumente d"urfen nur im Bereich 1..8 liegen. (nur
  12878.                680x0)}
  12879.               {keines}
  12880. \errentry{1400}{Schiebezahl zu gro"s}
  12881.               {Fehler}
  12882.               {(nicht mehr verwendet)}
  12883.               {keines}
  12884. \errentry{1410}{Ung"ultige Registerliste}
  12885.               {Fehler}
  12886.               {Das Registerlisten-Argument von \tty{MOVEM}
  12887.                 oder \tty{FMOVEM} hat ein falsches Format. (nur 680x0)}
  12888.               {keines}
  12889. \errentry{1420}{Ung"ultiger Modus mit CMP}
  12890.               {Fehler}
  12891.               {Die verwendete Operandenkombination von \tty{CMP}
  12892.                 ist nicht erlaubt. (nur 680x0)}
  12893.               {keines}
  12894. \errentry{1430}{Ung"ultiger Prozessortyp}
  12895.               {Fehler}
  12896.               {Den mit \tty{CPU} angeforderten Zielprozessor kennt \asname{}
  12897.                nicht.}
  12898.               {der unbekannte Prozessortyp}
  12899. \errentry{1431}{Ung"ultiger FPU-Typ}
  12900.               {Fehler}
  12901.               {Den mit \tty{FPU} angeforderten numerischen Koprozessor kennt \asname{}
  12902.                nicht.}
  12903.               {der unbekannte FPU-Typ}
  12904. \errentry{1432}{Ung"ultiger PMMU-Typ}
  12905.               {Fehler}
  12906.               {Die mit \tty{PMMU} angeforderte MMU kennt \asname{} nicht.}
  12907.               {der unbekannte PMMU-Typ}
  12908. \errentry{1440}{Ung"ultiges Kontrollregister}
  12909.               {Fehler}
  12910.               {Das bei z.B. \tty{MOVEC} benutzte
  12911.                 Kontrollregister  kennt der mit CPU gesetzte Prozessor
  12912.                 (noch) nicht.}
  12913.               {keines}
  12914. \errentry{1445}{Ung"ultiges Register}
  12915.               {Fehler}
  12916.               {Das benutzte Register ist zwar prinzipiell
  12917.                vorhanden, hier aber nicht erlaubt.}
  12918.               {keines}
  12919. \errentry{1446}{Register mehr als einmal gelistet}
  12920.               {Fehler}
  12921.               {Ein Register taucht in der Liste der zu sichernden bzw.
  12922.                wiederherzustellenden Register mehrfach auf.}
  12923.               {keines}
  12924. \errentry{1447}{Register-Bank-Diskrepanz}
  12925.               {Fehler}
  12926.               {In einem Adre"sausdruck werden Register aus unterschiedlichen
  12927.                B"anken verwendet.}
  12928.               {das fragliche Register}
  12929. \errentry{1448}{Registerl"ange undefiniert}
  12930.               {Fehler}
  12931.               {An dieser Stelle k"onnen Register verschiedener L"ange verwendet werden,
  12932.                und die Registerl"ange ist nicht alleine aus der Adresse ableitbar.}
  12933.               {das fragliche Argument}
  12934. \errentry{1449}{ung"ultige Operation auf Register}
  12935.               {Fehler}
  12936.               {Diese Operation kann auf dieses Register nicht angewendet werden, z.B.
  12937.                weil das Register nur gelesen oder nur geschrieben werden darf.}
  12938.               {das fragliche Register}
  12939. \errentry{1450}{RESTORE ohne SAVE}
  12940.               {Fehler}
  12941.               {Es wurde ein \tty{RESTORE}-Befehl gefunden, obwohl
  12942.                kein mit \tty{SAVE} gespeicherter Zustand (mehr) auf dem Stapel
  12943.                vorhanden ist.}
  12944.               {keines}
  12945. \errentry{1460}{fehlendes RESTORE}
  12946.               {Fehler}
  12947.               {Nach der Assemblierung sind nicht alle
  12948.                \tty{SAVE}-Befehle wieder aufgel"ost worden.}
  12949.               {keines}
  12950. \errentry{1465}{unbekannte Makro-Steueranweisung}
  12951.               {Fehler}
  12952.               {Eine beim \tty{MACRO}-Befehl zus"atzlich angegebene
  12953.                Steueranweisung ist \asname{} unbekannt.}
  12954.               {die fragliche Anweisung}
  12955. \errentry{1470}{fehlendes ENDIF/ENDCASE}
  12956.               {Fehler}
  12957.               {Nach der Assemblierung sind nicht alle
  12958.                Konstrukte zur bedingten Assemblierung aufgel"ost
  12959.                worden.}
  12960.               {keines}
  12961. \errentry{1480}{ung"ultiges IF-Konstrukt}
  12962.               {Fehler}
  12963.               {Die Reihenfolge der Befehle in einem \tty{IF}-
  12964.                 oder \tty{SWITCH}-Konstrukt stimmt nicht.}
  12965.               {keines}
  12966. \errentry{1483}{doppelter Sektionsname}
  12967.               {Fehler}
  12968.               {Es existiert bereits eine Sektion gleichen
  12969.                Namens auf dieser Ebene.}
  12970.               {der doppelte Name}
  12971. \errentry{1484}{unbekannte Sektion}
  12972.               {Fehler}
  12973.               {Im momentanen Sichtbarkeitsbereich existiert
  12974.                keine Sektion dieses Namens.}
  12975.               {der unbekannte Name}
  12976. \errentry{1485}{fehlendes ENDSECTION}
  12977.               {Fehler}
  12978.               {Nach Ende eines Durchganges sind nicht alle
  12979.                Sektionen wieder geschlossen worden.}
  12980.               {keines}
  12981. \errentry{1486}{falsches ENDSECTION}
  12982.               {Fehler}
  12983.               {die bei \tty{ENDSECTION} angegebene Sektion
  12984.                 ist nicht die innerste offene.}
  12985.               {keines}
  12986. \errentry{1487}{ENDSECTION ohne SECTION}
  12987.               {Fehler}
  12988.               {Es wurde ein \tty{ENDSECTION}-Befehl gegeben, obwohl
  12989.                gar keine Sektion offen war.}
  12990.               {keines}
  12991. \errentry{1488}{nicht aufgel"oste Vorw"artsdeklaration}
  12992.               {Fehler}
  12993.               {ein mit \tty{FORWARD} oder \tty{PUBLIC}
  12994.                 angek"undigtes Symbol wurde nicht in der Sektion definiert.}
  12995.               {der Name des fraglichen Symbols, plus die
  12996.                Position der Vorw"arts-Deklaration im Quelltext}
  12997. \errentry{1489}{widersprechende FORWARD $\leftrightarrow$PUBLIC-Deklaration}
  12998.               {Fehler}
  12999.               {Ein Symbol wurde sowohl als privat als auch
  13000.                global definiert.}
  13001.               {der Name des Symbols}
  13002. \errentry{1490}{falsche Argumentzahl f"ur Funktion}
  13003.               {Fehler}
  13004.               {Die Anzahl der Argumente f"ur eine
  13005.                selbst definierte Funktion stimmt nicht mit der geforderten
  13006.                Anzahl "uberein.}
  13007.               {keines}
  13008. \errentry{1495}{unaufgel"oste Literale (LTORG fehlt)}
  13009.               {Fehler}
  13010.               {Am Programmende oder beim Umachalten
  13011.                zu einem anderen Zielprozessor blieben noch nicht
  13012.                abgelegte Literale "ubrig.}
  13013.               {keines}
  13014. \errentry{1500}{Befehl auf dem ... nicht vorhanden}
  13015.               {Fehler}
  13016.               {Der benutzte Befehl existiert zwar
  13017.                grunds"atzlich, das eingestellte Mitglied der
  13018.                Prozessorfamilie beherrscht ihn aber noch nicht.}
  13019.               {Die Prozessorvarianten, die diesen Befehl
  13020.                unterst"utzen w"urden.}
  13021. \errentry{1501}{FPU-Befehle nicht freigeschaltet}
  13022.               {Fehler}
  13023.               {Die FPU-Befehlssatzerweiterungen m"ussen erlaubt
  13024.                werden, um diesen Befehl zu benutzen}
  13025.               {keines}
  13026. \errentry{1502}{PMMU-Befehle nicht freigeschaltet}
  13027.               {Fehler}
  13028.               {Die PMMU-Befehlssatzerweiterungen m"ussen erlaubt
  13029.                werden, um diesen Befehl zu benutzen}
  13030.               {keines}
  13031. \errentry{1503}{voller PMMU-Befehlssatz nicht freigeschaltet}
  13032.               {Fehler}
  13033.               {Dieser Befehl ist nur im Befehlssatz der
  13034.                68851-PMMU enthalten, nicht im reduzierten
  13035.                Befehlssatz der integrierten PMMU.}
  13036.               {keines}
  13037. \errentry{1504}{Z80-Syntax nicht erlaubt}
  13038.               {Fehler}
  13039.               {Dieser Befehl ist nur erlaubt, wenn die
  13040.                Z80-Syntax f"ur 8080/8085-Befehle freigeschaltet
  13041.                wurde.}
  13042.               {keines}
  13043. \errentry{1505}{Adressierungsart auf dem ... nicht vorhanden}
  13044.               {Fehler}
  13045.               {Der benutzte Adressierungsmodus existiert
  13046.                zwar grunds"atzlich, das eingestellte Mitglied der
  13047.                Prozessorfamilie beherrscht ihn aber noch nicht.}
  13048.               {Die Prozessorvarianten, die diesen
  13049.                Adressierungsmodus unterst"utzen w"urden.}
  13050. \errentry{1506}{nicht im Z80-Syntax Exklusiv-Modus erlaubt}
  13051.               {Fehler}
  13052.               {Dieser Befehl ist nicht (mehr) erlaubt, wenn nur
  13053.                noch Z80-Syntax f"ur 8080/8085-Befehle erlaubt
  13054.                wurde.}
  13055.               {keines}
  13056. \errentry{1507}{FPU-Befehl auf dem ... nicht unterst"utzt}
  13057.               {Fehler}
  13058.               {Der benutzte FPU-Befehl existiert zwar
  13059.                grunds"atzlich, der eingestellte FPU-Typ
  13060.                beherrscht ihn aber noch nicht.}
  13061.               {Der fragliche Befehl}
  13062. \errentry{1508}{Custom-Befehle nicht freigeschaltet}
  13063.               {Fehler}
  13064.               {Die benutzerdefinierten Befehlssatzerweiterungen
  13065.                m"ussen erlaubt werden, um diesen Befehl zu benutzen.}
  13066.               {Der fragliche Befehl}
  13067. \errentry{1509}{Befehls-Erweiterung nicht freigeschaltet}
  13068.               {Fehler}
  13069.               {Dieser Befehl ist Teil einer Befehlssatz-Erweiterung,
  13070.                deren Benutzung nicht erlaubt wurde.}
  13071.               {Der Name der Erweiterung}
  13072. \errentry{1510}{Ung"ultige Bitstelle}
  13073.               {Fehler}
  13074.               {Die angegebene Bitnummer ist nicht erlaubt
  13075.                 oder eine Angabe fehlt komplett.}
  13076.               {keines}
  13077. \errentry{1520}{nur ON/OFF erlaubt}
  13078.               {Fehler}
  13079.               {Dieser Pseudobefehl darf als Argument nur \tty{ON}
  13080.                oder \tty{OFF} haben.}
  13081.               {keines}
  13082. \errentry{1530}{Stack ist leer oder nicht definiert}
  13083.               {Fehler}
  13084.               {Es wurde bei einem \tty{POPV}
  13085.                einen Stack anzusprechen, der entweder nie definiert oder
  13086.                bereits leerger"aumt wurde.}
  13087.               {der Name des fraglichen Stacks}
  13088. \errentry{1540}{Nicht genau ein Bit gesetzt}
  13089.                {Fehler}
  13090.               {In einer Bitmaske, die der \tty{BITPOS}-
  13091.                Funktion "ubergeben wurde, war nicht genau ein Bit
  13092.                gesetzt.}
  13093.               {keines}
  13094. \errentry{1550}{ENDSTRUCT ohne STRUCT}
  13095.               {Fehler}
  13096.               {Eine \tty{ENDSTRUCT}-Anweisung wurde gegeben, obwohl
  13097.                momentan keine Strukturdefinition in Gange war.}
  13098.               {keines}
  13099. \errentry{1551}{offene Strukturdefinition}
  13100.               {Fehler}
  13101.               {Nach Ende der Assemblierung waren noch nicht alle
  13102.                \tty{STRUCT}-Anweisungen durch passende \tty{ENDSTRUCT}s
  13103.                abgeschlossen.}
  13104.               {die innerste, noch nicht abgeschlossene
  13105.                Strukturdefinition}
  13106. \errentry{1552}{falsches ENDSTRUCT}
  13107.               {Fehler}
  13108.               {Der Namensparameter einer \tty{ENDSTRUCT}-Anweisung
  13109.                entspricht nicht der innersten, offenen
  13110.                Strukturdefinition.}
  13111.               {keines}
  13112. \errentry{1553}{Phasendefinition nicht in Strukturen erlaubt}
  13113.               {Fehler}
  13114.               {Was gibt es dazu zu sagen?  \tty{PHASE} in einem Record
  13115.                ergibt einfach keinen Sinn und nur Verwirrung...}
  13116.               {keines}
  13117. \errentry{1554}{ung"ultige \tty{STRUCT}-Direktive}
  13118.               {Fehler}
  13119.               {Als Direktive f"ur \tty{STRUCT} ist nur
  13120.                \tty{EXTNAMES}, \tty{NOEXTNAMES}, \tty{DOTS} und
  13121.                \tty{NODOTS} zugelassen.}
  13122.               {die unbekannte Direktive}
  13123. \errentry{1555}{Struktur redefiniert}
  13124.               {Fehler}
  13125.               {Eine Struktur dieses Namens wurde bereits definiert.}
  13126.               {der Name der Struktur}
  13127. \errentry{1556}{nicht aufl"osbare Strukturelement-Referenz}
  13128.               {Fehler}
  13129.               {Ein Element bezieht sich auf ein anderes Element in
  13130.                einer Strukturdefintions, dieses ist aber nicht
  13131.                definiert oder dessen Referenz selber is nicht
  13132.                aufl"osbar.}
  13133.               {Name des Elements und seine Referenz}
  13134. \errentry{1557}{Strukturelement doppelt}
  13135.               {Fehler}
  13136.               {Ein Element dieses Namens ist bereits in der Struktur
  13137.                enthalten.}
  13138.               {Name des Elements}
  13139. \errentry{1560}{Anweisung nicht wiederholbar}
  13140.               {Fehler}
  13141.               {Diese Maschinenanweisung kann nicht mit Hilfe eines
  13142.                {\tt RPT}-Konstruktes wiederholt werden.}
  13143.               {keines}
  13144. \errentry{1600}{vorzeitiges Dateiende}
  13145.               {Fehler}
  13146.               {Es wurde mit einem \tty{BINCLUDE}-Befehl versucht,
  13147.                "uber das Ende einer Datei hinauszulesen.}
  13148.               {keines}
  13149. \errentry{1700}{ROM-Offset geht nur von 0..63}
  13150.               {Fehler}
  13151.               {Das Konstanten-ROM der 680x0-Koprozessoren hat
  13152.                nur max. 63 Eintr"age.}
  13153.               {keines}
  13154. \errentry{1710}{Ung"ultiger Funktionscode}
  13155.               {Fehler}
  13156.               {Als Funktionscodeargument darf nur SFC, DFC, ein
  13157.                Datenregister oder eine Konstante von 0..15 verwendet
  13158.                werden. (nur 680x0-MMU)}
  13159.               {keines}
  13160. \errentry{1720}{Ung"ultige Funktionscodemaske}
  13161.               {Fehler}
  13162.               {Als Funktionscodemaske darf nur ein Wert von
  13163.                0..15 verwendet werden. (nur 680x0-MMU)}
  13164.               {keines}
  13165. \errentry{1730}{Ung"ultiges MMU-Register}
  13166.               {Fehler}
  13167.               {Die MMU hat kein Register mit dem angegebenen
  13168.                Namen. (nur 680x0-MMU)}
  13169.               {keines}
  13170. \errentry{1740}{Level nur von 0..7}
  13171.               {Fehler}
  13172.               {Die Ebene f"ur \tty{PTESTW} und \tty{PTESTR} mu"s eine
  13173.                Konstante von 0..7 sein. (nur 680x0-MMU)}
  13174.               {keines}
  13175. \errentry{1750}{ung"ultige Bitmaske}
  13176.               {Fehler}
  13177.               {Die bei den Bit-Feld-Befehlen angegebene
  13178.                Bitmaske hat ein falsches Format. (nur 680x0)}
  13179.               {keines}
  13180. \errentry{1760}{ung"ultiges Registerpaar}
  13181.               {Fehler}
  13182.               {Das angegebene Registerpaar ist hier nicht
  13183.                verwendbar oder syntaktisch falsch. (nur 680x0)}
  13184.               {keines}
  13185. \errentry{1800}{offene Makrodefinition}
  13186.               {Fehler}
  13187.               {Eine Makrodefinition war am Dateiende nicht
  13188.                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
  13189.               {keines}
  13190. \errentry{1801}{IRP ohne ENDM}
  13191.               {Fehler}
  13192.               {Ein IRP-Block war am Dateiende nicht
  13193.                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
  13194.               {keines}
  13195. \errentry{1802}{IRPC ohne ENDM}
  13196.               {Fehler}
  13197.               {Ein IRPC-Block war am Dateiende nicht
  13198.                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
  13199.               {keines}
  13200. \errentry{1803}{REPT ohne ENDM}
  13201.               {Fehler}
  13202.               {Ein REPT-Block war am Dateiende nicht
  13203.                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
  13204.               {keines}
  13205. \errentry{1804}{WHILE ohne ENDM}
  13206.               {Fehler}
  13207.               {Ein WHILE-Block war am Dateiende nicht
  13208.                abgeschlossen.  Vermutlich fehlt ein \tty{ENDM}.}
  13209.               {keines}
  13210. \errentry{1805}{EXITM au"serhalb eines Makrorumpfes}
  13211.               {Fehler}
  13212.               {\tty{EXITM} bricht die Expansion von
  13213.                Makro-Konstrukten ab.  Dieser Befehl macht nur innerhalb
  13214.                von Makros Sinn und es wurde versucht, ihn au"serhalb
  13215.                aufzurufen.}
  13216.               {keines}
  13217. \errentry{1810}{mehr als 10 Makroparameter}
  13218.               {Fehler}
  13219.               {Ein Makro darf h"ochstens 10 Parameter haben.}
  13220.               {keines}
  13221. \errentry{1811}{Schl"usselwortargument nicht in Makro definiert}
  13222.               {Fehler}
  13223.               {Ein Schl"usselwortargument bezog sich auf einen
  13224.                Parameter, den das aufgerufene Makro gar nicht
  13225.                besitzt.}
  13226.               {verwendetes Schl"usselwort bzw. Makroparameter}
  13227. \errentry{1812}{Positionsargument nach Schl"usselwortargumenten nicht mehr erlaubt}
  13228.               {Fehler}
  13229.               {Positions- und Schl"usselwortargumente d"urfen in
  13230.                einem Makroaufruf gemischt werden, aber nach dem
  13231.                ersten Schl"usselwortargument sind nur noch
  13232.                solche zugelassen.}
  13233.               {keines}
  13234. \errentry{1815}{doppelte Makrodefinition}
  13235.               {Fehler}
  13236.               {Ein Makronamne wurde in einer Sektion doppelt
  13237.                vergeben.}
  13238.               {der doppelt verwendete Name}
  13239. \errentry{1820}{Ausdruck mu"s im ersten Pass berechenbar sein}
  13240.               {Fehler}
  13241.               {Der benutzte Befehl beeinflu"st die Codel"ange,
  13242.                daher sind Vorw"artsreferenzen hier nicht erlaubt.}
  13243.               {keines}
  13244. \errentry{1830}{zu viele verschachtelte IFs}
  13245.               {Fehler}
  13246.               {(nicht mehr verwendet)}
  13247.               {keines}
  13248. \errentry{1840}{ELSEIF/ENDIF ohne ENDIF}
  13249.               {Fehler}
  13250.               {es wurde ein \tty{ELSEIF}- oder \tty{ENDIF}-Befehl gefunden,
  13251.                obwohl kein offener \tty{IF}-Befehl vorhanden ist.}
  13252.               {keines}
  13253. \errentry{1850}{verschachtelter/rekursiver Makroaufruf}
  13254.               {Fehler}
  13255.               {(nicht mehr verwendet)}
  13256.               {keines}
  13257. \errentry{1860}{unbekannte Funktion}
  13258.               {Fehler}
  13259.               {Die angesprochene Funktion ist weder eingebaut
  13260.                noch nachtr"aglich definiert worden.}
  13261.               {der Funktionsname}
  13262. \errentry{1870}{Funktionsargument au"serhalb Definitionsbereich}
  13263.               {Fehler}
  13264.               {Das Argument liegt nicht im Bereich der
  13265.                angesprochenen transzendenten Funktion.}
  13266.               {keines}
  13267. \errentry{1880}{Gleitkomma"uberlauf}
  13268.               {Fehler}
  13269.               {Das Argument liegt zwar im Bereich der
  13270.                angesprochenen transzendenten Funktion, das Ergebnis
  13271.                w"are aber nicht mehr darstellbar.}
  13272.               {keines}
  13273. \errentry{1890}{ung"ultiges Wertepaar}
  13274.               {Fehler}
  13275.               {Das benutzte P"archen aus Basis und Exponent
  13276.                kann nicht berechnet werden.}
  13277.               {keines}
  13278. \errentry{1900}{Befehl darf nicht auf dieser Adresse liegen}
  13279.               {Fehler}
  13280.               {Die Prozessorhardware erlaubt keine
  13281.                Spr"unge von dieser Adresse.}
  13282.               {keines}
  13283. \errentry{1905}{ung"ultiges Sprungziel}
  13284.               {Fehler}
  13285.               {Die Prozessorhardware erlaubt keine
  13286.                Spr"unge zu dieser Adresse.}
  13287.               {keines}
  13288. \errentry{1910}{Sprungziel nicht auf gleicher Seite}
  13289.               {Fehler}
  13290.               {Sprungbefehl und Sprungziel m"ussen bei diesem
  13291.                Befehl auf der gleichen Seite liegen.}
  13292.               {keines}
  13293. \errentry{1911}{Sprungziel nicht in gleicher Sektion}
  13294.               {Fehler}
  13295.               {Sprungbefehl und Sprungziel m"ussen bei diesem
  13296.                Befehl in der gleichen (64K-)Sektion liegen.}
  13297.               {keines}
  13298. \errentry{1920}{Code"uberlauf}
  13299.               {Fehler}
  13300.               {Es wurde versucht, mehr als 1024 Bytes Code oder
  13301.                Daten in einer Zeile zu erzeugen.}
  13302.               {keines}
  13303. \errentry{1925}{Adre"s"uberlauf}
  13304.               {Fehler}
  13305.               {Der Adre"sraum dieses Prozessors wurde
  13306.                "uberschritten.}
  13307.               {keines}
  13308. \errentry{1930}{Konstanten und Platzhalter nicht mischbar}
  13309.               {Fehler}
  13310.               {Anweisungen, die Speicher reservieren und solche,
  13311.                die ihn mit Konstanten belegen, d"urfen nicht in einer
  13312.                Pseudoanweisung gemischt werden.}
  13313.               {keines}
  13314. \errentry{1940}{Codeerzeugung in Strukturdefinition nicht zul"assig}
  13315.               {Fehler}
  13316.               {Ein \tty{STRUCT}-Konstrukt dient nur der Beschreibung
  13317.                einer Datenstruktur und nicht dem Anlegen einer solchen,
  13318.                es sind daher keine Befehle zugelassen, die Code erzeugen.}
  13319.               {keines}
  13320. \errentry{1950}{Paralleles Konstrukt nicht m"oglich}
  13321.               {Fehler}
  13322.               {Entweder sind die beiden Instruktionen
  13323.                prinzipiell nicht parallel ausf"uhrbar, oder sie stehen nicht
  13324.                unmittelbar untereinander.}
  13325.               {keines}
  13326. \errentry{1960}{ung"ultiges Segment}
  13327.               {Fehler}
  13328.               {Das angegebene Segment ist an dieser Stelle
  13329.                nicht anwendbar.}
  13330.               {der benutzte Segmentname}
  13331. \errentry{1961}{unbekanntes Segment}
  13332.               {Fehler}
  13333.               {Das angegebene Segment existiert bei
  13334.                diesem Prozessor nicht.}
  13335.               {der benutzte Segmentname}
  13336. \errentry{1962}{unbekanntes Segmentregister}
  13337.               {Fehler}
  13338.               {Das angegebene Segmentregister existiert
  13339.                nicht (nur 8086).}
  13340.               {keines}
  13341. \errentry{1970}{ung"ultiger String}
  13342.               {Fehler}
  13343.               {Der angegebene String hat ein ung"ultiges
  13344.                Format.}
  13345.               {keines}
  13346. \errentry{1980}{ung"ultiger Registername}
  13347.               {Fehler}
  13348.               {Das angegebene Register existiert nicht oder
  13349.                darf hier nicht verwendet werden.}
  13350.               {keines}
  13351. \errentry{1985}{ung"ultiges Argument}
  13352.               {Fehler}
  13353.               {Der angegebene Befehl darf nicht mit einem
  13354.                \tty{REP}-Pr"afix versehen werden.}
  13355.               {keines}
  13356. \errentry{1990}{keine Indirektion erlaubt}
  13357.               {Fehler}
  13358.               {in dieser Kombination ist keine indirekte
  13359.                Adressierung erlaubt.}
  13360.               {keines}
  13361. \errentry{1995}{nicht im aktuellen Segment erlaubt}
  13362.               {Fehler}
  13363.               {(nicht mehr verwendet)}
  13364.               {keines}
  13365. \errentry{1996}{nicht im Maximum-Modus zul"assig}
  13366.               {Fehler}
  13367.               {Dieses Register ist nur im Minimum-Modus
  13368.                definiert.}
  13369.               {keines}
  13370. \errentry{1997}{nicht im Minimum-Modus zul"assig}
  13371.               {Fehler}
  13372.               {Dieses Register ist nur im Maximum-Modus
  13373.                definiert.}
  13374.               {keines}
  13375. \errentry{2000}{Anweisungspaket "uberschreitet Adre"sgrenze}
  13376.               {Fehler}
  13377.               {Ein Anweisungspaket darf nicht "uber eine
  13378.                32-Byte-Adre"sgrenze reichen.}
  13379.               {keines}
  13380. \errentry{2001}{Ausf"uhrungseinheit mehrfach benutzt}
  13381.               {Fehler}
  13382.               {Eine der Ausf"uhrungseinheiten des Prozessors wurde in
  13383.                einem Anweisungspaket mehrfach benutzt.}
  13384.               {der Name der Funktionseinheit}
  13385. \errentry{2002}{mehrfache Lang-Leseoperation}
  13386.               {Fehler}
  13387.               {Ein Ausf"uhrungspaket enth"alt mehr als eine
  13388.                Lang-Leseoperation, was nicht erlaubt ist.}
  13389.               {eine der Funktionseinheiten, auf denen eine
  13390.                Lang-Leseoperation ausgef"uhrt wird}
  13391. \errentry{2003}{mehrfache Lang-Schreiboperation}
  13392.               {Fehler}
  13393.               {Ein Ausf"uhrungspaket enth"alt mehr als eine
  13394.                Lang-Schreiboperation, was nicht erlaubt ist.}
  13395.               {eine der Funktionseinheiten, auf denen eine
  13396.                Lang-Schreiboperation ausgef"uhrt wird}
  13397. \errentry{2004}{Lang-Lese- mit Schreiboperation}
  13398.               {Fehler}
  13399.               {Ein Ausf"uhrungspaket enth"alt sowohl eine
  13400.                Lang-Leseoperation als auch eine Schreiboperation,
  13401.                was nicht erlaubt ist.}
  13402.               {eine der Funktionseinheiten, deren Operationen im
  13403.                Konflikt stehen.}
  13404. \errentry{2005}{zu viele Lesezugriffe auf ein Register}
  13405.               {Fehler}
  13406.               {Auf das gleiche Register wurde mehr als viermal im
  13407.                gleichen Anweisungspaket Bezug genommen.}
  13408.               {der Name des Registers, das zu oft referenziert wurde}
  13409. \errentry{2006}{"uberlappende Ziele}
  13410.               {Fehler}
  13411.               {Auf das gleiche Register wurde mehrfach im gleichen
  13412.                Ausf"uhrungspaket geschrieben, was nicht erlaubt ist.}
  13413.               {der Name der fraglichen Registers}
  13414. \errentry{2008}{zu viele absolute Spr"unge in einem Anweisungspaket}
  13415.               {Fehler}
  13416.               {Ein Anweisungspaket beinhaltet mehr als einen direkten
  13417.                Sprung, was nicht erlaubt ist.}
  13418.               {keines}
  13419. \errentry{2009}{Anweisung nicht auf diese Funktionseinheit ausf"uhrbar}
  13420.               {Fehler}
  13421.               {Diese Anweisung kann nicht auf dieser Funktionseinheit
  13422.                ausgef"uhrt werden.}
  13423.               {keines}
  13424. \errentry{2010}{Ung"ultige Escape-Sequenz}
  13425.               {Fehler}
  13426.               {Das mit einem Backslash eingeleitete
  13427.                 Sonderzeichen ist nicht definiert.}
  13428.               {keines}
  13429. \errentry{2020}{ung"ultige Pr"afix-Kombination}
  13430.               {Fehler}
  13431.               {Die angegebene Kombination von Pr"afixen
  13432.                 ist nicht zul"assig oder nicht im
  13433.                 Maschinenkode darstellbar.}
  13434.               {keines}
  13435. \errentry{2030}{Konstante kann nicht als Variable redefiniert werden}
  13436.               {Fehler}
  13437.               {Ein einmal mit {\tt EQU} als Konstante\\
  13438.                definiertes Symbol kann nicht nachtr"aglich mit\\
  13439.                {\tt SET} ver"andert werden.}
  13440.               {der Name des fraglichen Symbols}
  13441. \errentry{2035}{Variable kann nicht als Konstante redefiniert werden}
  13442.               {Fehler}
  13443.               {Ein einmal mit {\tt SET} als Variable\\
  13444.                definiertes Symbol kann nicht nachtr"aglich als\\
  13445.                Konstante deklariert werden (z.B. mit {\tt EQU}.}
  13446.               {der Name des fraglichen Symbols}
  13447. \errentry{2040}{Strukturname fehlt}
  13448.               {Fehler}
  13449.               {Bei einer Strukturdefinition fehlt der zugeh"orende
  13450.                Name f"ur die Struktur.}
  13451.               {keines}
  13452. \errentry{2050}{leeres Argument}
  13453.               {Fehler}
  13454.               {In der Argumentenliste dieser Anweisung d"urfen keine
  13455.                Leerstrings benutzt werden.}
  13456.               {keines}
  13457. \errentry{2060}{nicht implementierte Anweisung}
  13458.               {Fehler}
  13459.               {Der benutzte Maschinenbefehl ist dem Assembler
  13460.                zwar bekannt, ist aber aufgrund fehlender
  13461.                Dokumentation seitens des Prozessorherstellers
  13462.                momentan nicht implementiert.}
  13463.               {Der benutzte Befehl}
  13464. \errentry{2070}{namenlose Struktur nicht Teil einer anderen Struktur}
  13465.               {Fehler}
  13466.               {Eine Struktur oder Union, die keinen Namen hat, mu"s
  13467.                immer Teil einer anderen, benamten Struktur oder Union
  13468.                sein.}
  13469.               {keines}
  13470. \errentry{2080}{STRUCT durch ENDUNION beendet}
  13471.               {Fehler}
  13472.               {ENDUNION darf nur zum Beenden der Definition einer
  13473.                Union benutzt werden, nicht einer Struktur.}
  13474.               {Name der Struktur (falls vorhanden)}
  13475. \errentry{2090}{Speicheradresse nicht auf aktiver Seite}
  13476.               {Fehler}
  13477.               {Die Zieladresse befindet sich nicht in der durch
  13478.                das Seitenregister aktuell adressierbaren
  13479.                Speicherseite.}
  13480.               {keines}
  13481. \errentry{2100}{unbekanntes Makro-Expansions-Argument}
  13482.               {Fehler}
  13483.               {Ein \tty{MACEXP\_DFT/OVR} gegebenes Argument konnte nicht
  13484.                interpretiert werden.}
  13485.               {das unbekannte Argument}
  13486. \errentry{2105}{zu viele Makro-Expansions-Argumente}
  13487.               {Fehler}
  13488.               {Die Anzahl der Argument zur Makro-Expansion hat ihre Maximalzahl "uberschritten}
  13489.               {das Argument, das zu viel ist}
  13490. \errentry{2110}{widerspr"uchliche Angaben zur Makro-Expansion}
  13491.               {Fehler}
  13492.               {Eine Angabe zur Makroexpansion und ihr genaues
  13493.                Gegenteil d"urfen nicht gleichzeitig als Argument
  13494.                von \tty{MACEXP\_DFT/OVR} verwendet werden.}
  13495.               {keines}
  13496. \errentry{2130}{erwarteter Fehler nicht eingetreten}
  13497.               {Fehler}
  13498.               {Ein per {\tt EXPECT} angek"undigter Fehler oder Warnung ist
  13499.                in dem durch {\tt ENDEXPECT} abgeschlossenen Block nicht aufgetreten.}
  13500.               {Der erwartete Fehler}
  13501. \errentry{2140}{Verschachtelung von EXPECT/ENDEXPECT nicht erlaubt}
  13502.               {Fehler}
  13503.               {Durch {\tt EXPECT/ENDEXPECT} eingerahmte Bl"ocke d"urfen keine
  13504.                geschachtelten {\tt EXPECT/ENDEXPECT}-Bl"ocke enthalten.}
  13505.               {keines}
  13506. \errentry{2150}{fehlendes ENDEXPECT}
  13507.               {Fehler}
  13508.               {Ein per {\tt EXPECT} ge"offneter Block wurde nicht per
  13509.                {\tt ENDEXPECT} abgeschlossen.}
  13510.               {keines}
  13511. \errentry{2160}{ENDEXPECT ohne EXPECT}
  13512.               {Fehler}
  13513.               {Zu einem {\tt ENDEXPECT} gibt es kein vorhergehendes {\tt EXPECT}.}
  13514.               {keines}
  13515. \errentry{2170}{kein Default-Checkpoint-Register definiert}
  13516.               {Fehler}
  13517.               {Bei einer Typ-12-Instruktion wurde kein Checkpoint-Register angegeben
  13518.                und es wurde auch keines "uber die {\tt CKPT}-Anweisung vorher definiert.}
  13519.               {keines}
  13520. \errentry{2180}{ung"ultiges Bitfeld}
  13521.               {Fehler}
  13522.               {Das Bitfeld entspricht nicht der erwarteten {\tt (start,count)}-Syntax.}
  13523.               {das fragliche Argument}
  13524. \errentry{2190}{Argument-Wert fehlt}
  13525.               {Fehler}
  13526.               {Argumente m"ussen die Form 'variable=wert' haben.}
  13527.               {das fragliche Argument}
  13528. \errentry{2200}{unbekanntes Argument}
  13529.               {Fehler}
  13530.               {Dieses Variable wird von der gew"ahlten Zielplattform nicht unterst"utzt.}
  13531.               {das fragliche Argument}
  13532. \errentry{2210}{Indexregister muss 16 Bit sein}
  13533.               {Fehler}
  13534.               {Indexregister beim Z8000 m"ussen eine L"ange von 16 Bit (Rn) haben.}
  13535.               {das fragliche Argument}
  13536. \errentry{2211}{I/O Adressregister muss 16 Bit sein}
  13537.               {Fehler}
  13538.               {Z8000-Register, um I/O-Adressen zu adressieren, m"ussen eine L"ange von 16 Bit (Rn) haben.}
  13539.               {das fragliche Argument}
  13540. \errentry{2212}{Adressregister im segmentierten Modus muss 32 Bit sein}
  13541.               {Fehler}
  13542.               {Z8000-Register, um Speicheradressen im segmentierten Modus zu adressieren, m"ussen
  13543.                eine L"ange von 32 Bit (RRn) haben.}
  13544.               {das fragliche Argument}
  13545. \errentry{2213}{Adressregister im nicht-segmentierten Modus muss 16 Bit sein}
  13546.               {Fehler}
  13547.               {Z8000-Register, um Speicheradressen im nicht-segmentierten Modus zu adressieren, m"ussen
  13548.                eine L"ange von 16 Bit (Rn) haben.}
  13549.               {das fragliche Argument}
  13550. \errentry{2220}{ung"ultiges Strukturargument}
  13551.               {Fehler}
  13552.               {Das Argument entspricht keinem der Argumente, die bei der Expansion einer
  13553.                Struktur erlaubt sind.}
  13554.               {das fragliche Argument}
  13555. \errentry{2221}{zu viele Array-Dimensionen}
  13556.               {Fehler}
  13557.               {Arrays von Strukturen d"urfen maximal drei Dimensionen haben.}
  13558.               {die Dimension, die zu viel ist}
  13559. \errentry{2230}{unbekannte Integer-Notation}
  13560.               {Fehler}
  13561.               {Die angegebene Integer-Notation existiert nicht, oder es fehlt das
  13562.                f"uhrende Plus/Minuszeichen.}
  13563.               {das fehlerhafte Argument}
  13564. \errentry{2231}{ung"ultige Liste an Integer-Schreibweisen}
  13565.               {Fehler}
  13566.               {Die geforderte "Anderung der Liste von benutzbaren Integer-Schreibweisen
  13567.                kann nicht vorgenommen werden, weil sie zu einem Widerspruch f"uhren
  13568.                w"urde.  Aktuell betrifft dies lediglich 0hex und 0oct, die nicht
  13569.                gleichzeitig verwendet werden d"urfen.}
  13570.               {keines}
  13571. \errentry{2240}{ung"ultige Skalierung}
  13572.               {Fehler}
  13573.               {Das angegebene Argument kann nicht als Skalierungsfaktor benutzt werden.}
  13574.               {das fragliche Argument}
  13575. \errentry{2250}{widerspr"uchliche String-Optionen}
  13576.               {Fehler}
  13577.               {Das angegebene String-Option steht im Widerspruch zu einer vorherigen in der Liste.}
  13578.               {die fragliche Option}
  13579. \errentry{2251}{unbekannte String-Option}
  13580.               {Fehler}
  13581.               {Das angegebene String-Option gibt es nicht.}
  13582.               {die fragliche Option}
  13583. \errentry{2252}{ung"ultiger Cache-Invalidierungs-Modus}
  13584.               {Fehler}
  13585.               {Es k"onnen nur Daten-, Instruktions- oder beide Caches invalidiert werden.}
  13586.               {das fragliche Argument}
  13587. \errentry{2253}{ung"ultige Config-Liste}
  13588.               {Fehler}
  13589.               {Die Konfigurationsliste ist entweder insgesamt syntaktisch falsch oder
  13590.                enth"alt ung"ultige Elemente.}
  13591.               {Die fragliche Liste oder ein Element daraus.}
  13592. \errentry{2254}{widerspr"uchliche Konfig-Optionen}
  13593.               {Fehler}
  13594.               {Das angegebene Option steht im Widerspruch zu einer vorherigen in der Liste oder ist dazu identisch.}
  13595.               {die fragliche Option}
  13596. \errentry{2255}{unbekannte Konfig-Option}
  13597.               {Fehler}
  13598.               {Das angegebene Option gibt es nicht.}
  13599.               {die fragliche Option}
  13600. \errentry{2260}{ung"ultiger Wert f"ur CBAR}
  13601.               {Fehler}
  13602.               {Dieser CBAR-Wert ist nicht erlaubt (CA mu"s gr"o"ser als BA sein).}
  13603.               {keines}
  13604. \errentry{2270}{Seite nicht zugreifbar}
  13605.               {Fehler}
  13606.               {Die Zieladresse liegt auf einer Speicherseite, die aktuell nicht
  13607.                zugreifbar ist.}
  13608.               {keines}
  13609. \errentry{2280}{Feld nicht zugreifbar}
  13610.               {Fehler}
  13611.               {Die Zieladresse liegt in einem Speicherfeld, das aktuell nicht
  13612.                zugreifbar ist.}
  13613.               {keines}
  13614. \errentry{2281}{Ziel nicht in gleichem Feld}
  13615.               {Fehler}
  13616.               {Befehl und Operandenadresse m"ussen
  13617.                im gleichen Speicherfeld liegen.}
  13618.               {keines}
  13619. \errentry{2290}{Ung"ultige Instruktions-Kombination}
  13620.               {Fehler}
  13621.               {Diese Befehle k"onnen nicht miteinander kombiniert werden.}
  13622.               {keines}
  13623. \errentry{2300}{nicht-gemapptes Zeichen}
  13624.               {Fehler}
  13625.               {Die Zeichenkette enth"alt einen nicht abbildbares Zeichen.}
  13626.               {die fragliche Zeichenkette}
  13627. \errentry{2310}{Multi-Zeichenkonstante mit ung"ultiger L"ange}
  13628.               {Fehler}
  13629.               {Multi-Zeichenkonstanten m"ussen zwischen ein und vier Zeichen lang sein.}
  13630.               {keines}
  13631. \errentry{2320}{kein Target gesetzt ('CPU ...' oder '-cpu ...', um eines zu setzen)}
  13632.               {fatal}
  13633.               {Es wurde noch kein Target gesetzt, der Assembler wei"s daher
  13634.                nicht, f"ur welche CPU Code erzeugt werden soll.}
  13635.               {keines}
  13636. \errentry{10001}{Fehler bein "Offnen der Datei}
  13637.               {fatal}
  13638.               {Beim Versuch, eine Datei zu "offnen, ist ein
  13639.                Fehler aufgetreten.}
  13640.               {Beschreibung des E/A-Fehlers}
  13641. \errentry{10002}{Listingschreibfehler}
  13642.               {fatal}
  13643.               {Beim Schreiben des Assemblerlistings ist ein
  13644.                Fehler aufgetreten.}
  13645.               {Beschreibung des E/A-Fehlers}
  13646. \errentry{10003}{Dateilesefehler}
  13647.               {fatal}
  13648.               {Beim Lesen aus einer Quelldatei ist ein
  13649.                Fehler aufgetreten.}
  13650.               {Beschreibung des E/A-Fehlers}
  13651. \errentry{10004}{Dateischreibfehler}
  13652.               {fatal}
  13653.               {Beim Schreiben von Code- oder Share-Datei
  13654.                ist ein Fehler aufgetreten.}
  13655.               {Beschreibung des E/A-Fehlers}
  13656. \errentry{10006}{Speicher"uberlauf}
  13657.               {fatal}
  13658.               {Der verf"ugbare Speicher reicht nicht mehr,
  13659.                 alle Datenstrukturen aufzunehmen.  Weichen Sie auf die
  13660.                 DPMI- oder OS/2-Version von \asname{} aus.}
  13661.               {keines}
  13662. \errentry{10007}{Stapel"uberlauf}
  13663.               {fatal}
  13664.               {Der Programmstapel ist wegen zu komplizierter
  13665.                 Formelausdr"ucke oder einer ung"unstigen Anlage der Symbol-
  13666.                 oder Makrotabelle "ubergelaufen.  Versuchen Sie es noch
  13667.                 einmal mit der \tty{-A}-Option.}
  13668.               {keines}
  13669. \errentry{10008}{INCLUDE zu tief verschachtelt}
  13670.               {fatal}
  13671.               {Die Include-Verschachtelungstiefe hat das gegebene Limit
  13672.                (im Default 200) "uberschritten.  Dieses Limit kann "uber
  13673.                den {\tt -maxinclevel}-Schalter herauf gesetzt werden, eine
  13674.                fehlerhafte (rekusive) Verschachtelung ist aber die
  13675.                wahrscheinlichere Ursache.}
  13676.               {Die INCLUDE-Anweisung, mit der das Limit "uberschritten wurde.}
  13677. \end{description}
  13678.  
  13679. %%===========================================================================
  13680.  
  13681. \cleardoublepage
  13682. \chapter{E/A-Fehlermeldungen}
  13683.  
  13684. Die hier aufgelisteten Fehlermeldungen werden nicht nur von \asname{} bei E/A-
  13685. Fehlern ausgegeben, sondern auch von den Hilfsprogrammen PLIST, BIND,
  13686. P2HEX und P2BIN.  Es sind nur die Fehler n"aher erkl"art, die m.E. bei
  13687. der Arbeit auftreten k"onnen.  Sollte doch einmal ein nicht erl"auterter
  13688. E/A-Fehler auftreten, so d"urfte der Grund in einem Programmfehler
  13689. liegen.  Melden Sie dies unbedingt!!
  13690.  
  13691. \begin{description}
  13692. \item[2]{Datei nicht gefunden\\
  13693.         Die angegebene Datei existiert nicht oder liegt auf einem
  13694.         anderen Laufwerk.}
  13695.  
  13696. \item[3]{Pfad nicht gefunden\\
  13697.         Der Pfad eines Dateinamens existiert nicht oder liegt auf
  13698.         einem anderen Laufwerk.}
  13699.  
  13700. \item[4]{zu viele offene Dateien\\
  13701.         DOS sind die Dateihandles ausgegangen.  Erh"ohen Sie die
  13702.         \tty{FILES=}-Angabe in der CONFIG.SYS.}
  13703.  
  13704. \item[5]{Dateizugriff verweigert\\
  13705.         Entweder reichen die Netzwerkrechte f"ur einen Dateizugriff
  13706.         nicht, oder es wur\-de ver\-sucht, ei\-ne schreib\-ge\-sch"utz\-te Da\-tei
  13707.         zu "uber\-schrei\-ben oder zu ver\-"an\-dern.  Bei Benutzung in
  13708.         DOS- Fenstern von Multitasking- Systemen ist es "uberdies m"oglich,
  13709.         da"s ein andere Proze"s die Datei in exklusivem Zugriff hat.}
  13710.  
  13711. \item[6]{ung"ultiger Dateihandle}
  13712.  
  13713. \item[12]{ung"ultiger Zugriffsmodus}
  13714.  
  13715. \item[15]{ung"ultiger Laufwerksbuchstabe\\
  13716.          Das angesprochene Laufwerk existiert nicht.}
  13717.  
  13718.  
  13719. \item[16]{aktuelles Verzeichnis kann nicht gel"oscht werden}
  13720.  
  13721. \item[17]{RENAME geht nicht "uber Laufwerke}
  13722.  
  13723. \item[100]{vorzeitiges Dateiende\\
  13724.           Eine Datei war zuende, obwohl sie es aufgrund ihrer Struktur
  13725.           noch nicht sein d"urfte.  Vermutlich ist sie besch"adigt.}
  13726.  
  13727. \item[101]{Diskette/Platte voll\\
  13728.           Das spricht wohl f"ur sich!  Aufr"aumen!!}
  13729.  
  13730. \item[102]{ASSIGN fehlt}
  13731.  
  13732. \item[103]{Datei nicht offen}
  13733.  
  13734. \item[104]{Datei nicht f"ur Einlesen offen}
  13735.  
  13736. \item[105]{Datei nicht f"ur Ausgaben offen}
  13737.  
  13738. \item[106]{Ung"ultiges numerisches Format}
  13739.  
  13740. \item[150]{Diskette ist schreibgesch"utzt\\
  13741.           Wenn Sie schon keine Festplatte als Arbeitsmedium verwenden,
  13742.           so sollten Sie wenigstens den Schreibschutz entfernen!}
  13743.  
  13744. \item[151]{Unbekanntes Ger"at\\
  13745.           Sie haben versucht, ein Peripherieger"at anzusprechen, welches
  13746.           DOS unbekannt ist.  Dies sollte normalerweise nicht auftreten,
  13747.           da der Name dann automatisch als Datei interpretiert wird.}
  13748.  
  13749. \item[152]{Laufwerk nicht bereit\\
  13750.           Schlie"sen Sie die Klappe des Diskettenlaufwerks.}
  13751.  
  13752. \item[153]{unbekannte DOS-Funktion}
  13753.  
  13754. \item[154]{Pr"ufsummenfehler auf Diskette/Platte\\
  13755.           Ein harter Lesefehler auf der Diskette.  Nochmal versuchen; wenn
  13756.           immer noch vorhanden, Diskette neu formatieren bzw. ernste Sorgen
  13757.           um Festplatte machen!}
  13758.  
  13759. \item[155]{ung"ultiger DPB}
  13760.  
  13761. \item[156]{Positionierfehler\\
  13762.           Der Platten/Disketten-Controller hat eine bestimmte Spur nicht
  13763.           gefunden.  Siehe Nr. 154!}
  13764.  
  13765. \item[157]{unbekanntes Sektorformat\\
  13766.           DOS kann mit dem Format der Diskette nichts anfangen.}
  13767.  
  13768. \item[158]{Sektor nicht gefunden\\
  13769.           Analog zu Nr. 158, nur da"s hier der angeforderte Sektor auf
  13770.           der Spur nicht gefunden werden konnte.}
  13771.  
  13772. \item[159]{Papierende\\
  13773.           Offensichtlich haben Sie die Ausgaben von \asname{} direkt auf einen
  13774.           Drucker umgeleitet.  Assemblerlistings k"onnen seeehr lang
  13775.           sein...}
  13776.  
  13777. \item[160]{Ger"atelesefehler\\
  13778.           Nicht n"aher vom Ger"atetreiber klassifizierter Lesefehler.}
  13779.  
  13780. \item[161]{Ger"ateschreibfehler\\
  13781.           Nicht n"aher vom Ger"atetreiber klassifizierter Schreibfehler.}
  13782.  
  13783. \item[162]{allgemeiner Ger"atefehler\\
  13784.           Hier ist der Ger"atetreiber v"ollig ratlos, was passiert
  13785.           sein k"onnte.}
  13786. \end{description}
  13787.  
  13788. %%===========================================================================
  13789.  
  13790. \cleardoublepage
  13791. \chapter{Programmierbeispiele}
  13792.  
  13793. Manche Fragen, wie man dieses oder jenes realisiert, werden h"aufiger gestellt,
  13794. und es ist vielleicht wert, sie in einer 'Tipps und Tricks' Ecke zu
  13795. dokumentieren.  Hier in diesem Kapitel werde ich sie sammeln und vorstellen:
  13796.  
  13797. \section{16-Bit-Befehle per Makro}
  13798.  
  13799. Viele 8-Bit-Prozessoren k"onnen - wie der Name schon sagt - immer nur acht Bit
  13800. auf einmal verarbeiten.  Oft sind jedoch genug Register vorhanden, um zwei
  13801. davon zu einem virtuellen '16 Bit Akkumulator' zusammenzufassen.  Nun soll dieser
  13802. per Makro definierte Befehlssatz m"oglichst die gleichen Adressierungsarten
  13803. wie die Hardware-Befehle unterst"utzen.  Dazu m"u"ste man die Makro-Argumente
  13804. irgendwie parsen - aber wie?
  13805.  
  13806. Der Motorola 6800 hat zum Beispiel zwei Akkumulatoren A und B, und es liegt
  13807. nahe, diese als einem 16-Bit-Akku zu behandeln.  Die Adressierungsarten
  13808. sollten die gleichen sein wie bei 8-Bit-Operationen:
  13809. \begin{itemize}
  13810. \item{immediate}
  13811. \item{direkt (Adresse innerhalb der ersten 256 Byte)}
  13812. \item{erweitert (beliebige Adresse)}
  13813. \item{indiziert}
  13814. \end{itemize}
  13815. Ein Makro, das so einen virtuellen 16-Bit-Befehl implementiert, mu"s die ein oder
  13816. zwei Argumente also analysieren:
  13817. \begin{enumerate}
  13818. \item{Indizierte Adressierung hat als einzige zwei Argumente.}
  13819. \item{Immediate-Adressierung ist am f"uhrenden Hash-Zeichen zu erkennen.}
  13820. \item{Ob eine Adresse in den ersten 256 Byte liegt oder nicht, kann man
  13821.      wieder dem Assembler "uberlassen.}
  13822. \end{enumerate}
  13823. Um Punkt 2 auszuf"uhren, mu"s ein Argument in einen String "uberf"uhrt werden.  Von
  13824. diesem kann das f"uhrend Hash-Zeichen dann auch entfernt werden, um den eigentlichen
  13825. Wert zu evaluieren.  Komplett ausgeschrieben sieht das Makro dann so aus:
  13826. \begin{verbatim}
  13827. subd    macro   ARG1,ARG2
  13828.  if      "ARG2" != ""            ; indexed?
  13829.   suba    (ARG1)+1,ARG2
  13830.   sbcb    ARG1,ARG2
  13831.  elseif                          ; not indexed?
  13832. _SARG1   set     "ARG1"           ; convert to string
  13833.  if      substr(_SARG1,0,1)='#' ; immediate?
  13834. _SARG1    set     substr(_SARG1,1,strlen(_SARG1)-1) ; yes->remove #
  13835.   suba    #lo(VAL(_SARG1))      ; ...and subtract lo/hi bytes
  13836.   sbcb    #hi(VAL(_SARG1))
  13837.  elseif                         ; no immediate->ext. or direct
  13838.   suba    (ARG1)+1              ; and subtract lo/hi bytes
  13839.   sbcb    ARG1
  13840.  endif
  13841.  endif
  13842.  endm
  13843. \end{verbatim}
  13844. Makroargumente wurden bewusst in Gro"sbuchstaben geschrieben, so dass das Makro
  13845. unabh"angig davon funktioniert, ob der case-sensitve Modus eingeschaltet ist
  13846. oder nicht.  Verwendet werden kann das Makro z.B. so:
  13847. \begin{verbatim}
  13848.        subd    $0007                   ; direct
  13849.        subd    $1234                   ; absolute
  13850.        subd    #$55aa                  ; immediate
  13851.        subd    $12,x                   ; indexed
  13852. \end{verbatim}
  13853. Jetzt ist es aber so, dass man nicht nur 16-bittig subtrahieren möchte.  Man
  13854. k"onnte f"ur jede Operation eine eigene Version des Makros hinschreiben, es
  13855. geht aber auch eleganter.  Ein Makro kann selber wieder eine Makro-Definition
  13856. enthalten.  Man kann also ein 'Meta-Makro' definieren, das die Befehlsnamen
  13857. als Argumente erh"alt:
  13858. \begin{verbatim}
  13859. def16   macro   NEWINST,LOINST,HIINST
  13860. NEWINST macro   ARG1,ARG2
  13861.  if      "ARG2" != ""            ; indexed?
  13862.   LOINST  (ARG1)+1,ARG2
  13863.   HIINST  ARG1,ARG2
  13864.  elseif                          ; not indexed?
  13865. _SARG1   set     "ARG1"                 ; convert to string
  13866.  if      substr(_SARG1,0,1)='#' ; immediate?
  13867. _SARG1    set     substr(_SARG1,1,strlen(_SARG1)-1) ; yes->remove #
  13868.   LOINST  #lo(VAL(_SARG1))      ; ...and subtract lo/hi bytes
  13869.   HIINST  #hi(VAL(_SARG1))
  13870.  elseif                         ; no immediate->ext. or direct
  13871.   LOINST  (ARG1)+1              ; ...and subtract lo/hi bytes
  13872.   HIINST  ARG1
  13873.  endif
  13874.  endif
  13875.  endm
  13876.  endm
  13877. \end{verbatim}
  13878. Dann sind die restlichen Definitionen Einzeiler:
  13879. \begin{verbatim}
  13880.        def16   addd,adda,adcb
  13881.        def16   subd,suba,sbcb
  13882.        def16   andd,anda,andb
  13883.        def16   ord,ora,orb
  13884.        def16   eord,eora,eorb
  13885. \end{verbatim}
  13886.  
  13887. %%===========================================================================
  13888.  
  13889. \cleardoublepage
  13890. \chapter{H"aufig gestellte Fragen}
  13891.  
  13892. In diesem Kapitel habe ich versucht, einige besonders h"aufig gestellte
  13893. Fragen mit den passenden Antworten zu sammeln.  Die Antworten auf
  13894. die hier auftauchenden Probleme finden sich zwar auch an anderer
  13895. Stelle in der Anleitung, jedoch findet man sie vielleicht nicht auf
  13896. den ersten Blick...
  13897.  
  13898. \begin{description}
  13899. \item[F:]{Ich bin DOS leid.  F"ur welche Plattformen gibt es \asname{} sonst ?}
  13900. \item[A:]{Neben der Protected-Mode-Version, die \asname{} unter DOS mehr Speicher
  13901.         zur Verf"ugung stellt, existieren Portierungen f"ur OS/2 und
  13902.         Unix-Systeme wie z.B. Linux (im Teststadium).  An Versionen,
  13903.         die Softwareherstellern in Redmond beim Geldscheffeln zuarbeiten
  13904.         w"urden, ist momentan nicht gedacht.  Sofern jemand anders in
  13905.         dieser Hinsicht aktiv werden will, stelle ich ihm aber gerne
  13906.         die \asname{}-Quellen zur Verf"ugung, von denen sich die C-Variante
  13907.         insbesondere eignen d"urfte.  "Uber Fragen zu diesen Quellen
  13908.         hinaus sollte er sich aber nicht viel von mir erwarten...}
  13909. \vspace{0.3cm}
  13910. \item[F:]{Ist eine Unterst"utzung des XYZ-Prozessors f"ur \asname{} geplant?}
  13911. \item[A:]{Es kommen immer neue Prozessoren heraus, und ich bem"uhe
  13912.         mich, bei Erweiterung von \asname{} Schritt zu halten.  Der Stapel
  13913.         mit der Aufschrift ,,Unerledigt'' auf meinem Schreibtisch
  13914.         unterschreitet aber selten die 10cm-Grenze... Bei der Planung,
  13915.         welche Kandidaten zuerst abgearbeitet werden, spielen W"unsche
  13916.         von Anwendern nat"urlich eine gro"se Rolle.  Das Internet und
  13917.         die steigende Zahl elektronisch publizierter Dokumentation
  13918.         erleichtern die Beschaffung von Unterlagen, speziell bei
  13919.         ausgefallenen oder "alteren Architekturen wird es aber immer
  13920.         wieder schwierig.  Wenn sich die fragliche Prozessorfamilie
  13921.         nicht in der Liste in Planung befindlicher Prozessoren
  13922.         befindet (siehe Kapitel 1), macht es sich sehr gut, der
  13923.         Anfrage auch gleich ein passendes Datenbuch hinzuzupacken
  13924.         (zur Not auch leihweise!).}
  13925. \vspace{0.3cm}
  13926. \item[F:]{Ein freier Assembler ist ja eine feine Sache, aber eigentlich
  13927.         br"auchte ich jetzt auch noch einen Disassembler...und einen
  13928.         Debugger...ein Simulator w"are auch ganz nett..}
  13929. \item[A:]{\asname{} ist ein Freizeitprojekt von mir, d.h. etwas, was ich in der
  13930.         Zeit tue, wenn ich mich nicht gerade um den Broterwerb k"ummere.
  13931.         Von dieser Zeit nimmt \asname{} schon einen ganz erheblichen Teil ein,
  13932.         und ab und zu genehmige ich mir auch mal eine Auszeit, um den
  13933.         L"otkolben zu schwingen, mal wieder eine Tangerine Dream-Platte
  13934.         bewu"st zu h"oren, mich vor den Fernseher zu hocken oder einfach
  13935.         nur dringenden menschlichen Bed"urfnissen nachzugehen.  Ich habe
  13936.         einmal angefangen, einen Disassembler zu konzipieren, der wieder
  13937.         voll reassemblierbaren Code erzeugt und automatisch Daten- und
  13938.         Code-Bereiche trennt, habe das Projekt aber relativ schnell wieder
  13939.         eingestellt, weil die restliche Zeit f"ur so etwas einfach nicht
  13940.         mehr reicht.  Ich mache lieber eine Sache gut als ein halbes
  13941.         Dutzend m"a"sig.  Von daher mu"s die Antwort also wohl ,,nein''
  13942.         hei"sen...}
  13943. \vspace{0.3cm}
  13944. \item[F:]{In den Bildschirmausgaben von \asname{} tauchen seltsame Zeichen auf,
  13945.          z.B. Pfeile und eckige Klammern.  Warum?}
  13946. \item[A:]{\asname{} verwendet zur Bildschirmsteuerung defaultm"a"sig einige
  13947.          ANSI-Terminal-Steuersequenzen.  Haben Sie keinen ANSI-Treiber
  13948.           installiert, so kommen diese Steuerzeichen ungefiltert auf
  13949.           Ihrem Bildschirm heraus.  Installieren Sie entweder einen
  13950.           ANSI-Treiber oder schalten Sie die Steuersequenzen mit dem
  13951.           DOS-Befehl \tty{SET USEANSI=N} ab.}
  13952. \vspace{0.3cm}
  13953. \item[F:]{W"ahrend der Assemblierung bricht \asname{} pl"otzlich mit der
  13954.          Meldung eines Stapel"uberlaufes ab.  Ist mein Programm zu
  13955.           kompliziert?}
  13956. \item[A:]{Ja und Nein.  Die Symboltabelle f"ur Ihr Programm ist nur
  13957.          etwas unregelm"a"sig gewachsen, was zu zu hohen Rekursionstiefen
  13958.           im Zugriff auf die Tabelle gef"uhrt hat.  Diese Fehler treten
  13959.           insbesondere bei der 16-Bit-OS/2-Version von \asname{} auf, die nur
  13960.           "uber einen relativ kleinen Stack verf"ugt.  Starten Sie \asname{} noch
  13961.           einmal mit dem \tty{-A}-Kommandozeilenschalter.  Hilft dies auch
  13962.          nicht, so kommen als m"ogliche Problemstellen noch zu komplizierte
  13963.          Formelausdr"ucke in Frage.  Versuchen Sie in einem solchen Fall,
  13964.          die Formel in Zwischenschritte aufzuspalten.}
  13965. \vspace{0.3cm}
  13966. \item[F:]{\asname{} scheint mein Programm nicht bis zum Ende zu assemblieren.
  13967.          Mit einer "alteren Version von \asname{} (1.39) hat es dagegen
  13968.           funktioniert.}
  13969. \item[A:]{Neuere Versionen von \asname{} ignorieren das \tty{END}-Statement nicht
  13970.          mehr, sondern beenden danach wirklich die Assemblierung.
  13971.           Insbesondere bei Include-Dateien ist es fr"uher vorgekommen, da"s
  13972.           Anwender jede Datei mit einem \tty{END}-Statement beendet haben.
  13973.           Entfernen Sie die "uberfl"ussigen \tty{END}s.}
  13974. \vspace{0.3cm}
  13975. \item[F:]{Weil ich noch ein paar kompliziertere Assemblierfehler im Programm
  13976.          hatte, habe ich mir ein Listing gemacht und es einmal genauer
  13977.          angeschaut.  Dabei ist mir aufgefallen, da"s einige Spr"unge nicht
  13978.          auf das gew"unschte Ziel, sondern auf sich selbst zeigen!}
  13979. \item[A:]{Dieser Effekt tritt bei Vorw"artsspr"ungen auf, bei denen der
  13980.          Formelparser von \asname{} im ersten Pass die Zieladresse noch nicht kennen
  13981.          kann.  Da der Formelparser ein unabh"angiges Modul ist, mu"s er sich
  13982.          in einem solchen Fall einen Wert ausdenken, der auch relativen
  13983.          Spr"ungen mit kurzer Reichweite nicht wehtut, und dies ist nun
  13984.          einmal die aktuelle Programmz"ahleradresse selber...im zweiten Pass
  13985.          w"aren die korrekten Werte erschienen, aber zu diesem ist es nicht
  13986.          gekommen, da schon im ersten Pass Fehler auftraten.  Korrigieren
  13987.          Sie die anderen Fehler zuerst, so da"s \asname{} zum zweiten Pass kommt,
  13988.          und das Listing sollte wieder vern"unftiger aussehen.}
  13989. \vspace{0.3cm}
  13990. \item[F:]{Mein Programm wird zwar korrekt assembliert, bei der Umwandlung
  13991.          mit P2BIN oder P2HEX erhalte ich aber nur eine leere Datei.}
  13992. \item[A:]{Dann haben Sie wahrscheinlich das Adre"s\-fil\-ter nicht korrekt
  13993.          eingestellt.  De\-faul\-tm"a"sig ist der Filter abgeschaltet, d.h.
  13994.          alle Daten werden "ubernommen, wenn ein manuell eingestellter
  13995.          Bereichsfilter nicht zu den benutzten Adressen pa"st, kann man
  13996.          mit der '-r' Option aber (versehentlich) auch leere Dateien
  13997.          erzeugen.}
  13998. \vspace{0.3cm}
  13999. \item[F:]{Ich bekomme unter Unix bei der Benutzung von P2BIN oder P2HEX
  14000.          das Dollarzeichen nicht eingegeben.  Die automatische
  14001.          Bereichsfestlegung funktioniert nicht, stattdessen gibt es
  14002.          eigenartige Fehlermeldungen.}
  14003. \item[A:]{Unix-Shells benutzen das Dollarzeichen zur Expansion von
  14004.          Shell-Variablen.  Wollen Sie ein Dollarzeichen an eine Anwendung
  14005.          durchreichen, stellen Sie einen Backslash (\verb!\!) voran.
  14006.          Im Falle der Adre"sangabe bei P2BIN und P2HEX darf aber auch
  14007.          \tty{0x} anstelle des Dollarzeichens benutzt werden, was dieses
  14008.          Problem von vornherein vermeidet.}
  14009. \vspace{0.3cm}
  14010. \item[F:]{Ich nutze \asname{} auf einem Linux-System, das Ladeprogramm f"ur
  14011.          mein Zielsystem l"auft aber auf einem Windows-Rechner.  Um das
  14012.          zu vereinfachen, greifen beide System auf das gleiche
  14013.          Netzwerklaufwerk zu.  Leider will die Windows-Seite aber die
  14014.          von der Linux-Seite erzeugten Hex-Dateien nicht lesen :-(}
  14015. \item[A:]{Windows- und Linux-Systeme benutzen ein etwas abweichendes
  14016.          Format f"ur Textdateien, unter die auch Hex-Dateien fallen.
  14017.          W"ahrend Windows jede Zeile mit den Zeichen CR (Carriage Return)
  14018.          und LF (Linefeed) abschlie"st, verwendet Linux nur ein Linefeed.
  14019.          Es h"angt nun von der ''Gutm"utigkeit'' eines Windows-Programms
  14020.          ab, ob es die Dateien im Linux-Format akzeptiert.  Falls nicht,
  14021.          kann man die Dateien anstelle "uber ein Netzwerklaufwerk "uber
  14022.          FTP im ASCII-Modus "ubertragen, oder man konvertiert die Dateien
  14023.          unter ins Windows-Format.  Das Programm {\em unix2dos} kann dazu
  14024.          z.B. verwendet werden, oder unter Linux ein kleines Script:
  14025.          \begin{verbatim}
  14026.          awk '{print $0"\r"}' test.hex >test_cr.hex
  14027.          \end{verbatim}}
  14028. \vspace{0.3cm}
  14029. \item[F:]{Ich habe in meinem Programm eine 16-bittige Adresse und mu"s
  14030.          die obere und untere H"alfte in getrennte CPU-Register laden.
  14031.          Wie extrahiere ich diese H"alften?  Bei anderen Assemblern
  14032.          gibt es daf"ur eingebaute Funktionen.}
  14033. \item[A:]{Das geht zum einen ,,zu Fu"s'' mit den logischen und
  14034.          Schiebeoperatoren, zum anderen bekommt man die Funktionen
  14035.          {\tt lo()} und {\tt hi()}, indem man die mitgelieferte Datei
  14036.          {\tt bitfuncs.inc} in das Programm inkludiert.}          
  14037. \end{description}
  14038.  
  14039. %%===========================================================================
  14040.  
  14041. \cleardoublepage
  14042. \chapter{Pseudobefehle und Integer-Syntax, gesammelt}
  14043. \label{SectPseudoInst}
  14044.  
  14045. In diesem Anhang finden sich noch einmal als schnelle Referenz alle
  14046. von \asname{} zur Verf"ugung gestellten Pseudobefehle.  Die Liste ist in zwei
  14047. Teile gegliedert: Im ersten Teil finden sich Befehle, die unabh"angig
  14048. vom eingestellten Zielprozessor vorhanden sind, danach folgen f"ur
  14049. jede Prozessorfamilie die zus"atzlich vorhandenen Befehle:
  14050.  
  14051. \subsubsection{Immer vorhandene Befehle}
  14052. \input{../doc_COM/pscomm.tex}
  14053. Zus"atzlich existieren:
  14054. \begin{itemize}
  14055. \item{\tty{SET} als Alias zu \tty{EVAL}, falls \tty{SET} nicht bereits ein
  14056.      Prozessorbefehl ist.}
  14057. \item{\tty{SHIFT} bzw. \tty{SHFT}, falls \tty{SHIFT} bereits ein Prozessorbefehl
  14058.      ist.}
  14059. \item{\tty{RESTORE} als Alias zu \tty{RESTOREENV}, falls \tty{RESTORE} nicht bereits ein
  14060.      Prozessorbefehl ist.}
  14061. \item{\tty{SAVE} als Alias zu \tty{SAVEENV}, falls \tty{SAVE} nicht bereits ein
  14062.      Prozessorbefehl ist.}
  14063. \item{\tty{PAGE} bzw. \tty{PAGESIZE}, falls \tty{PAGE} bereits ein Prozessorbefehl
  14064.      ist.}
  14065. \item{\tty{SWITCH} bzw. \tty{SELECT}, falls \tty{SWITCH} bereits ein Prozessorbefehl
  14066.      ist.}
  14067. \end{itemize}
  14068.  
  14069. \input{../doc_COM/pscpu.tex}
  14070.  
  14071. %%===========================================================================
  14072.  
  14073. \cleardoublepage
  14074. \chapter{Vordefinierte Symbole}\label{AppInternSyms}
  14075.  
  14076. \begin{center}\begin{longtable}{|l|l|l|l|}
  14077. \hline
  14078. Name             &  Datentyp   & Definition & Bedeutung \\
  14079. \hline\hline
  14080. \endhead
  14081. \tty{ARCHITECTURE} & String    & vordef.    & Zielplattform, f"ur die \asname{} \\
  14082.                 &             &            & "ubersetzt wurde, in der Form \\
  14083.                 &             &            & Prozesor-Hersteller-Betriebs- \\
  14084.                 &             &            & system \\
  14085. \hline
  14086. \tty{BIGENDIAN}  &  Boolean    & normal     & Konstantenablage mit MSB \\
  14087.                 &             &            & first ? \\
  14088. \hline
  14089. \tty{CASESENSITIVE} & Boolean  & normal     & Unterscheidung von Gro"s- \\
  14090.                 &             &            & und Kleinbuchstaben in \\
  14091.                 &             &            & Symbolnamen ? \\
  14092. \hline
  14093. \tty{CONSTPI}    &  Gleitkomma & normal     & Kreiszahl Pi (3.1415.....) \\
  14094. \hline
  14095. \tty{DATE}       &  String     & vordef.    & Datum des Beginns der  \\
  14096.                 &             &            & Assemblierung (1.Pass) \\
  14097. \hline
  14098. \tty{FALSE}      &  Boolean    & vordef.    & 0 = logisch ,,falsch'' \\
  14099. \hline
  14100. \tty{HASFPU}     &  Boolean    & dynam.(0)  & Koprozessor-Befehle \\
  14101.                 &             &            & freigeschaltet ? \\
  14102. \hline
  14103. \tty{HASPMMU}    &  Boolean    & dynam.(0)  & MMU-Befehle frei- \\
  14104.                 &             &            & geschaltet ? \\
  14105. \hline
  14106. \tty{INEXTMODE}  &  Boolean    & dynam.(0)  & XM-Flag f"ur 4 Gbyte \\
  14107.                 &             &            & Adre"sraum gesetzt ? \\
  14108. \hline
  14109. \tty{INLWORDMODE} & Boolean    & dynam.(0)  & LW-Flag f"ur 32-Bit-Befehle \\
  14110.                 &             &            & gesetzt ? \\
  14111. \hline
  14112. \tty{INMAXMODE}  &  Boolean    & dynam.(0)  & Prozessor im Maximum- \\
  14113.                 &             &            & Modus ? \\
  14114. \hline
  14115. \tty{INSUPMODE}  &  Boolean    & dynam.(0)  & Prozessor im Supervisor- \\
  14116.                 &             &            & Modus ? \\
  14117. \hline
  14118. \tty{INSRCMODE}  &  Boolean    & dynam.(0)  & Prozessor im Quellmodus ? \\
  14119. \hline
  14120. \tty{FULLPMMU}   &  Boolean    & dynam.(0/1) & voller PMMU-Befehlssatz ? \\
  14121. \hline
  14122. \tty{LISTON}     &  Boolean    & dynam.(1)  & Listing freigeschaltet ? \\
  14123. \hline
  14124. \tty{MACEXP}     &  Boolean    & dynam.(1)  & Expansion von Makrokon- \\
  14125.                 &             &            & strukten im Listing \\
  14126.                 &             &            & freigeschaltet ? \\
  14127. \hline
  14128. \tty{MOMCPU}     &  Integer    & dynam.     & Nummer der momentan \\
  14129.                 &             & (68008)    & gesetzten Ziel-CPU \\
  14130. \hline
  14131. \tty{MOMCPUNAME} &  String     & dynam.     & Name der momentan \\
  14132.                 &             & (68008)    & gesetzten Ziel-CPU \\
  14133. \hline
  14134. \tty{MOMFILE}    &  String     & Spezial    & augenblickliche Quelldatei \\
  14135.                 &             &            & (schlie"st Includes ein) \\
  14136. \hline
  14137. \tty{MOMLINE}    &  Integer    & Spezial    & aktuelle Zeilennummer in \\
  14138.                 &             &            & der Quelldatei \\
  14139. \hline
  14140. \tty{MOMPASS}    &  Integer    & Spezial    & Nummer des laufenden \\
  14141.                 &             &            & Durchgangs \\
  14142. \hline
  14143. \tty{MOMSECTION} &  String     & Spezial    & Name der aktuellen Sektion \\
  14144.                 &             &            & oder Leerstring, fall au"ser- \\
  14145.                 &             &            & halb aller Sektionen \\
  14146. \hline
  14147. \tty{MOMSEGMENT} &  String     & Spezial    & Name des mit \tty{SEGMENT} ein- \\
  14148.                 &             &            & gestellten Adre"sraumes \\
  14149. \hline
  14150. \tty{NESTMAX}    &  Integer    & dynam.(256)& maximale Verschachtelungs- \\
  14151.                 &             &            & tiefe f"ur Makros \\
  14152. \hline
  14153. \tty{PADDING}    &  Boolean    & dynam.(1)  & Auff"ullen von Bytefeldern \\
  14154.                 &             &            & auf ganze Anzahl ? \\
  14155. \hline
  14156. \tty{RELAXED}    &  Boolean    & dynam.(0)  & Schreibweise von Integer-Kon- \\
  14157.                 &             &            & stanten in beliebiger Syntax \\
  14158.                 &             &            & erlaubt ? \\
  14159. \hline
  14160. \tty{PC}         &  Integer    & Spezial    & mom. Programmz"ahler \\
  14161.                 &             &            & (Thomson) \\
  14162. \hline
  14163. \tty{TIME}       &  String     & vordef.    & Zeit des Beginns der Assem- \\
  14164.                 &             &            & blierung (1. Pass) \\
  14165. \hline
  14166. \tty{TRUE}       &  Integer    & vordef.    & 1 = logisch ,,wahr'' \\
  14167. \hline
  14168. \tty{VERSION}    &  Integer    & vordef.    & Version von \asname{} in BCD-Kodie- \\
  14169.                 &             &            & rung, z.B. 1331 hex f"ur \\
  14170.                 &             &            & Version 1.33p1 \\
  14171. \hline
  14172. \tty{WRAPMODE}   &  Integer    & vordef.    & verk"urzter Programmz"ahler \\
  14173.                 &             &            & angenommen? \\
  14174. \hline
  14175. \verb!*!         &  Integer    & Spezial    & mom. Programmz"ahler \\
  14176.                 &             &            & (Motorola, Rockwell, \\
  14177.                 &             &            & Microchip, Hitachi) \\
  14178. \hline
  14179. .                &  Integer    & Spezial    & mom. Programmz"ahler \\
  14180.                 &             &            & (IM61x0) \\
  14181. \hline
  14182. \tty{\$}         &  Integer    & Spezial    & mom. Programmz"ahler (Intel, \\
  14183.                 &             &            & Zilog, Texas, Toshiba, NEC, \\
  14184.                 &             &            & Siemens, AMD) \\
  14185. \hline
  14186. \end{longtable}\end{center}
  14187.  
  14188. Boolean-Symbole sind eigentlich normale normale Integer-Symbole, mit
  14189. dem Unterschied, da"s ihnen von \asname{} nur zwei verschiedene Werte (0 oder
  14190. 1, entsprechend FALSE oder TRUE) zugewiesen werden.  Spezialsymbole
  14191. werden von \asname{} nicht in der Symboltabelle abgelegt, sondern aus
  14192. Geschwindigkeitsgr"unden direkt im Parser abgefragt.  Sie tauchen daher
  14193. auch nicht in der Symboltabelle des Listings auf.  W"ahrend vordefinierte
  14194. Symbole nur einmal am Anfang eines Passes besetzt werden, k"onnen sich
  14195. die Werte dynamischer Symbole w"ahrend der Assemblierung mehrfach "andern,
  14196. da sie mit anderen Befehlen vorgenommene Einstellungen widerspiegeln.
  14197. \par
  14198. Die hier aufgelistete Schreibweise ist diejenige, mit der man die
  14199. Symbole auch im case-sensitiven Modus erreicht.
  14200. \par
  14201. Die hier aufgef"uhrten Namen sollte man f"ur eigene Symbole meiden;
  14202. entweder kann man sie zwar definieren, aber nicht darauf zugreifen
  14203. (bei Spezialsymbolen), oder man erh"alt eine Fehlermeldung wegen eines
  14204. doppelt definierten Symboles.  Im gemeinsten Fall f"uhrt die Neubelegung
  14205. durch \asname{} zu Beginn eines Passes zu einem Phasenfehler und einer
  14206. Endlosschleife...
  14207.  
  14208.  
  14209. %%===========================================================================
  14210.  
  14211. \cleardoublepage
  14212. \chapter{Mitgelieferte Includes}
  14213.  
  14214. Der Distribution von \asname{} liegen eine Reihe von Include-Dateien bei.  Neben
  14215. Includes, die sich nur auf eine Prozessorfamilie beziehen (und deren
  14216. Funktion sich demjenigen unmittelbar erschlie"st, der mit dieser Familie
  14217. arbeitet), existieren aber auch ein paar Dateien, die prozessorunabh"angig
  14218. sind und die eine Reihe n"utzlicher Funktionen implementieren.  Die
  14219. definierten Funktionen sollen hier kurz beschrieben werden:
  14220.  
  14221. \section{BITFUNCS.INC}
  14222.  
  14223. Diese Datei definiert eine Reihe bitorientierter Operationen, wie man sie
  14224. bei anderen Assemblern vielleicht fest eingebaut sind.  Bei \asname{} werden sie
  14225. jedoch mit Hilfe benutzerdefinierter Funktionen implementiert:
  14226.  
  14227. \begin{itemize}
  14228. \item{{\em mask(start,bits)} liefert einen Integer, in dem ab Stelle {\em
  14229.      start} {\em bits} Bits gesetzt sind;}
  14230. \item{{\em invmask(start,bits)} liefert das Einerkomplement zu {\em mask()};}
  14231. \item{{\em cutout(x,start,bits)} liefert ausmaskierte {\em bits} Bits ab
  14232.      Stelle {\em start} aus {\em x}, ohne sie auf Stelle 0 zu
  14233.      verschieben;}
  14234. \item{{\em hi(x)} liefert das zweitniedrigste Byte (Bit 8..15) aus {\em
  14235.      x};}
  14236. \item{{\em lo(x)} liefert das niederwertigste Byte (Bit 0..7) aus {\em
  14237.      x};}
  14238. \item{{\em hiword(x)} liefert das zweitniedrigste Wort (Bit 16..31) aus
  14239.      {\em x};}
  14240. \item{{\em loword(x)} liefert das niederwertigste Wort (Bit 0..15) aus
  14241.      {\em x};}
  14242. \item{{\em odd(x)} liefert TRUE, falls {\em x} ungerade ist;}
  14243. \item{{\em even(x)} liefert TRUE, falls {\em x} gerade ist;}
  14244. \item{{\em getbit(x,n)} extrahiert das Bit {\em n} aus {\em x} und liefert
  14245.      es als 0 oder 1;}
  14246. \item{{\em shln(x,size,n)} schiebt ein Wort {\em x} der L"ange {\em size}
  14247.      Bits um {\em n} Stellen nach links;}
  14248. \item{{\em shrn(x,size,n)} schiebt ein Wort {\em x} der L"ange {\em size}
  14249.      Bits um {\em n} Stellen nach rechts;}
  14250. \item{{\em rotln(x,size,n)} rotiert die untersten {\em size} Bits eines
  14251.      Integers {\em x} um {\em n} Stellen nach links;}
  14252. \item{{\em rotrn(x,size,n)} rotiert die untersten {\em size} Bits eines
  14253.      Integers {\em x} um {\em n} Stellen nach rechts;}
  14254. \end{itemize}
  14255.  
  14256. \section{CTYPE.INC}
  14257.  
  14258. Dieser Include ist das Pendant zu dem bei C vorhandenen Header {\tt
  14259. ctype.h}, der Makros zur Klassifizierung von Zeichen anbietet.  Alle
  14260. Funktionen liefern entweder TRUE oder FALSE:
  14261.  
  14262. \begin{itemize}
  14263. \item{{\em isdigit(ch)} ist TRUE, falls {\em ch} eine Ziffer (0..9)
  14264.      ist;}
  14265. \item{{\em isxdigit(ch)} ist TRUE, falls {\em ch} eine g"ultige
  14266.      Hexadezimal-Ziffer (0..9, A..F, a..f) ist;}
  14267. \item{{\em isascii(ch)} ist TRUE, falls {\em ch} sich im Bereich
  14268.      normaler ASCII-Zeichen ohne gesetztes Bit 7 bewegt;}
  14269. \item{{\em isupper(ch)} ist TRUE, falls {\em ch} ein Gro"sbuchstabe
  14270.      ist (Sonderzeichen ausgenommen);}
  14271. \item{{\em islower(ch)} ist TRUE, falls {\em ch} ein Kleinbuchstabe
  14272.      ist (Sonderzeichen ausgenommen);}
  14273. \item{{\em isalpha(ch)} ist TRUE, falls {\em ch} ein Buchstabe ist
  14274.      (Sonderzeichen ausgenommen);}
  14275. \item{{\em isalnum(ch)} ist TRUE, falls {\em ch} ein Buchstabe oder
  14276.      eine Ziffer ist);}
  14277. \item{{\em isspace(ch)} ist TRUE, falls {\em ch} ein 'Leerzeichen'
  14278.      (Space, Formfeed, Zeilenvorschub, Wagenr"ucklauf, Tabulator)
  14279.      ist);}
  14280. \item{{\em isprint(ch)} ist TRUE, falls {\em ch} ein druckbares
  14281.      Zeichen ist (also kein Steuerzeichen bis Code 31);}
  14282. \item{{\em iscntrl(ch)} ist das Gegenteil zu {\em isprint()};}
  14283. \item{{\em isgraph(ch)} ist TRUE, falls {\em ch} ein druckbares
  14284.      und {\it sichtbares} Zeichen ist;}
  14285. \item{{\em ispunct(ch)} ist TRUE, falls {\em ch} ein druckbares
  14286.      Sonderzeichen ist (d.h. weder Space, Buchstabe noch Ziffer);}
  14287. \end{itemize}
  14288.  
  14289. %%===========================================================================
  14290.  
  14291. \cleardoublepage
  14292. \chapter{Danksagungen}
  14293.  
  14294. \begin{quote}{\it
  14295. ''If I have seen farther than other men, \\
  14296. it is because I stood on the shoulders of giants.'' \\
  14297. \hspace{2cm} --Sir Isaac Newton}
  14298. \end{quote}
  14299. \begin{quote}{\it
  14300. ''If I haven't seen farther than other men, \\
  14301. it is because I stood in the footsteps of giants.'' \\
  14302. \hspace{2cm} --unknown}
  14303. \end{quote}
  14304. \par
  14305. Es hei"st ja bisweilen, die Programme, die man schreibe, w"aren so
  14306. etwas wie eigene Kinder, die man in die Welt setzt.  Ich arbeite an
  14307. diesem Assembler seit "uber 30 Jahren, und bin mittlerweile der
  14308. Ansicht, so ein Projekt ist viel mehr eine Reise, auf die man sich
  14309. begibt: Die Begegnungen mit Menschen, die man auf den Stationen
  14310. dieses Weges trifft, sind mindestens eben so wichtig wie das
  14311. vermeintliche Ziel selber.  Man lernt Neues kennen, und versteht im
  14312. besten Falle, da"s man Dinge auch aus einer ganz anderen Warte sehen
  14313. kann.  Wenn es gut l"auft, bringt das dann beide Seiten weiter.
  14314. \par
  14315. Einige Menschen sind mir auf diesem Weg besonders in Erinnerung
  14316. geblieben, weil sie auf ihre Weise dazu beigetragen haben, dieses
  14317. Projekt dorthin zu bringen, wo es jetzt ist.  Die folgende Aufz"ahlung
  14318. ist notwendigerweise unvollst"andig, einfach weil ich mich nach den
  14319. Jahren nicht mehr an jede Begebenheit erinnere.  Der zuvorderste Dank
  14320. gent daher an all die Personen, deren Namen ich in diesem Kapitel
  14321. unabsichtlich unterschlagen habe.  Die Reise geht immer noch weiter,
  14322. und vielleicht kreuzen sich die Wege wieder!
  14323. \par
  14324. \asname{} als Universalassembler, wie er jetzt besteht, ist auf Anregung von
  14325. Bernhard (C.) Zschocke entstanden, der einen ,,studentenfreundlichen'',
  14326. d.h. kostenlosen 8051-Assembler f"ur sein Mikroprozessorpraktikum
  14327. brauchte und mich dazu bewegt hat, einen bereits bestehenden
  14328. 68000-Assembler zu erweitern.  Von dortan nahm die Sache ihren Lauf...
  14329. Das Mikroprozessorpraktikum an der RWTH Aachen hat auch immer die
  14330. eifrigsten Nutzer der neuesten \asname{}-Features (und damit Bug-Sucher)
  14331. gestellt und damit einiges zur jetzigen Qualit"at von \asname{} beigetragen.
  14332. \par
  14333. Das Internet und FTP haben sich als gro"se Hilfe bei der Meldung von
  14334. Bugs und der Verbreitung von \asname{} erwiesen.  Ein Dank geht daher an
  14335. die FTP-Administratoren (Bernd Casimir in Stuttgart, Norbert Breidohr
  14336. in Aachen und J"urgen Mei"sburger in J"ulich).  Insbesondere letzterer
  14337. hat sich sehr engagiert, um eine praxisnahe L"osung im ZAM zu
  14338. finden.
  14339. \par
  14340. Ach ja, wo wir schon im ZAM sind: Wolfgang E. Nagel hat zwar nichts
  14341. direkt mit \asname{} zu tun, immerhin war er aber mein Betreuer und
  14342. Vorgesetzter und warf
  14343. st"andig vier Augen auf das, was ich tue.  Bei \asname{} scheint zumindest
  14344. ein lachendes dabei zu sein...
  14345. \par
  14346. Ein Projekt wie \asname{} ist ohne Input und Informationen nicht zu
  14347. leisten, sei es zu den unterst"utzten Prozessoren selber, zu
  14348. Programmiertechniken oder wie Dinge implementiert werden sollten.
  14349. Ich habe von einer enormen Anzahl von Menschen R"uckmeldungen
  14350. bekommen, die von einem kleinen Tip bis zu ganzen Datenb"uchern
  14351. reichen.  Hier eine Aufz"ahlung (wie wie oben gesagt, mit Sicherheit
  14352. unvollst"andig ist!):
  14353. \par
  14354. Ernst Ahlers, Charles Altmann, Marco Awater, Len Bayles, Andreas
  14355. Bolsch, Rolf Buchholz, Bernd Casimir, Nils Eilers, Gunther Ewald,
  14356. Michael Haardt, Stephan Hruschka, Fred van Kempen, Peter
  14357. Kliegelh"ofer, Ulf Meinke, Udo M"oller, Matthias Paul, Norbert Rosch,
  14358. Curt J.  Sampson, Steffen Schmid, Leonhard Schneider, Ernst Schwab,
  14359. Michael Schwingen, Oliver Sellke, Christian Stelter, Patrik
  14360. Str"omdahl, Tadashi G.  Takaoka, Oliver Thamm, Thorsten Thiele,
  14361. Leszek Ulman, Rob Warmelink, Andreas Wassatsch, John Weinrich.
  14362. \par
  14363. ...und ein leicht ironischer Dank geht an Rolf-Dieter-Klein und Tobias Thiel, die
  14364. mich mit ihren ASM68K dazu angeregt haben, "uberhaupt einen eigenen
  14365. Assembler zu schreiben.  einige Dinge darin funktionierten nicht so,
  14366. wie ich es mir vorgestellt hatte, und das war der Anlass, es besser
  14367. oder zumindest anders zu machen.
  14368. \par
  14369. So ganz allein habe ich \asname{} auch nicht geschrieben.  Die DOS-Version
  14370. von \asname{} enthielt die OverXMS-Routinen von Wilbert van Leijen,
  14371. um die Overlay-Module ins Extended Memory verlagern zu k"onnen.  Eine
  14372. wirklich feine Sache, einfach und problemlos anzuwenden!
  14373. \par
  14374. Die TMS320C2x/5x-Codegeneratoren sowie die Datei \tty{STDDEF2x.INC}
  14375. stammen von Thomas Sailer, ETH Z"urich.  Erstaunlich, an einem Wochenende
  14376. hat er es geschafft, durch meinen Code durchzusteigen und den neuen
  14377. Generator zu implementieren.  Entweder waren das reichliche Nachtschichten
  14378. oder ich werde langsam alt...gleiches Lob geb"uhrt Haruo Asano f"ur
  14379. die Targets MN1610/MN1613, IM6100, CP1600, Renesas RX und HP
  14380. NanoProcessor.
  14381.  
  14382. %%===========================================================================
  14383.  
  14384. \cleardoublepage
  14385. \chapter{"Anderungen seit Version 1.3}
  14386.  
  14387. \begin{itemize}
  14388. \item{Version 1.31:
  14389.      \begin{itemize}
  14390.      \item{zus"atzlicher MCS-51-Prozessortyp 80515.  Die Nummer wird
  14391.            wiederum nur vom Assembler verwaltet.  Die Datei STDDEF51.INC
  14392.            wurde um die dazugeh"origen SFRs erweitert. \bb{ACHTUNG!}
  14393.            Einige 80515-SFRs haben sich adre"sm"a"sig verschoben!}
  14394.      \item{zus"atzlich Prozessor Z80 unterst"utzt;}
  14395.      \item{schnellerer 680x0-Codegenerator.}
  14396.      \end{itemize}}
  14397. \item{Version 1.32:
  14398.      \begin{itemize}
  14399.      \item{Schreibweise von Zeropageadressen f"ur 65xx nicht mehr als
  14400.            Adr.z, sondern wie beim 68xx als $<$Adr;}
  14401.      \item{unterst"utzt die Prozessoren 6800, 6805, 6301 und 6811;}
  14402.      \item{der 8051-Teil versteht jetzt auch \tty{DJNZ}, \tty{PUSH} und
  14403.            \tty{POP} (sorry);}
  14404.      \item{im Listing werden neben den Symbolen jetzt auch die definierten
  14405.            Makros aufgelistet;}
  14406.      \item{Befehle \tty{IFDEF}/\tty{IFNDEF} f"ur bedingte Assemblierung,
  14407.            mit denen sich die Existenz eines Symboles abfragen l"a"st;}
  14408.      \item{Befehle \tty{PHASE}/\tty{DEPHASE} zur Unterst"utzung von Code, der zur
  14409.            Laufzeit auf eine andere Adresse verschoben werden soll;}
  14410.      \item{Befehle \tty{WARNING}/\tty{ERROR}/\tty{FATAL}, um anwenderspezifische
  14411.            Fehlermeldungen ausgeben zu k"onnen;}
  14412.      \item{Die Datei STDDEF51.INC enth"alt zus"atzlich das Makro \tty{USING}
  14413.            zur einfacheren Handhabung der Registerb"anke der MCS-51er;}
  14414.      \item{Kommandozeilenoption \tty{u}, um Segmentbelegung anzuzeigen.}
  14415.      \end{itemize}}
  14416. \item{Version 1.33:
  14417.      \begin{itemize}
  14418.      \item{unterst"utzt den 6809;}
  14419.      \item{zus"atzlich Stringvariablen;}
  14420.      \item{Die Befehle \tty{TITLE}, \tty{PRTINIT}, \tty{PRTEXIT},
  14421.            \tty{ERROR}, \tty{WARNING} und \tty{FATAL} erwarten jetzt
  14422.             einen Stringausdruck als Parameter, Konstanten
  14423.            m"ussen demzufolge nicht mehr in Hochkommas, sondern in
  14424.            G"ansef"u"schen eingeschlossen werden. Analoges gilt f"ur \tty{DB},
  14425.            \tty{DC.B} und \tty{BYT};}
  14426.      \item{Befehl \tty{ALIGN} zur Ausrichtung des Programmz"ahlers bei Intel-
  14427.            Prozessoren;}
  14428.      \item{Befehl \tty{LISTING}, um die Erzeugung eines Listings ein- und
  14429.            ausschalten zu k"onnen;}
  14430.      \item{Befehl \tty{CHARSET} zur Definition eigener Zeichens"atze.}
  14431.      \end{itemize}}
  14432. \item{Version 1.34:
  14433.      \begin{itemize}
  14434.      \item{Wenn im ersten Pass Fehler auftreten, wird gar kein zweiter
  14435.            Pass mehr durchgef"uhrt;}
  14436.      \item{neues vordefiniertes Symbol \tty{VERSION}, welches die Version von
  14437.            \asname{} enth"alt;}
  14438.      \item{Befehl \tty{MESSAGE}, um Durchsagen und Meldungen programmgesteuert
  14439.            zu erzeugen;}
  14440.      \item{Formelparser "uber Stringkonstanten zug"anglich;}
  14441.      \item{Bei Fehler in Makroexpansionen wird zus"atzlich die laufende
  14442.            Zeile im Makro angezeigt;}
  14443.      \item{Funktion \tty{UPSTRING}, um einen String in Gro"sbuchstaben zu
  14444.            wandeln.}
  14445.      \end{itemize}}
  14446. \item{Version 1.35:
  14447.      \begin{itemize}
  14448.      \item{Funktion \tty{TOUPPER}, um ein einzelnes Zeichen in Gro"sbuchstaben
  14449.            zu wandeln;}
  14450.      \item{Befehl \tty{FUNCTION}, um eigene Funktionen definieren zu k"onnen;}
  14451.      \item{Kommandozeilenoption \tty{D}, um Symbole von au"sen definieren zu
  14452.            k"onnen;}
  14453.      \item{Fragt die Environment-Variable \tty{ASCMD} f"ur h"aufig gebrauchte
  14454.            Optionen ab;}
  14455.      \item{bei gesetzter \tty{u}-Option wird das Programm zus"atzlich auf doppelt
  14456.            belegte Speicherbereiche abgepr"uft;}
  14457.      \item{Kommandozeilenoption \tty{C}, um eine Querverweisliste zu erzeugen.}
  14458.      \end{itemize}}
  14459. \item{Version 1.36:
  14460.      \begin{itemize}
  14461.      \item{unterst"utzt zus"atzlich die Familien PIC 16C5x und
  14462.            PIC17C4x;}
  14463.      \item{im Listing wird zus"atzlich die Verschachtelungsebene bei
  14464.            Include-Dateien angezeigt;}
  14465.      \item{in der Querverweisliste wird zus"atzlich die Stelle angezeigt,
  14466.            an der ein Symbol definiert wurde;}
  14467.      \item{Kommandozeilenoption \tty{A}, um eine kompaktere Ablage der
  14468.            Symboltabelle zu erzwingen.}
  14469.      \end{itemize}}
  14470. \item{Version 1.37:
  14471.      \begin{itemize}
  14472.      \item{unterst"utzt zus"atzlich die Prozessoren 8086, 80186, V30,
  14473.            V35, 8087 und Z180;}
  14474.      \item{Befehle \tty{SAVE} und \tty{RESTORE} zur besseren Umschaltung
  14475.            von Flags;}
  14476.      \item{Operatoren zur logischen Verschiebung und Bitspiegelung;}
  14477.      \item{Kommandozeilenoptionen k"onnen mit einem Pluszeichen negiert
  14478.            werden;}
  14479.      \item{Filter \tty{AS2MSG} zur bequemen Arbeit mit \asname{} unter Turbo-Pascal 7.0;}
  14480.      \item{\tty{ELSEIF} darf ein Argument zur Bildung von
  14481.            \tty{IF-THEN-ELSE}-Leitern haben;}
  14482.      \item{Zur bequemeren bedingten Assemblierung zus"atzlich ein
  14483.            \tty{CASE}-Konstrukt;}
  14484.      \item{Selbst definierte Funktionen d"urfen mehr als ein Argument haben;}
  14485.      \item{P2HEX kann nun auch Hexfiles f"ur 65er-Prozessoren erzeugen;}
  14486.      \item{BIND, P2HEX und P2BIN haben jetzt die gleichen
  14487.            Variationsm"oglichkeiten in der Kommandozeile wie \asname{};}
  14488.      \item{Schalter \tty{i} bei P2HEX, um 3 Varianten f"ur den Ende-Record
  14489.            einzustellen;}
  14490.      \item{Neue Funktionen \tty{ABS} und \tty{SGN};}
  14491.      \item{Neue Pseudovariablen \tty{MOMFILE} und \tty{MOMLINE};}
  14492.      \item{Ausgabem"oglichkeit erweiterter Fehlermeldungen;}
  14493.      \item{Befehle \tty{IFUSED} und \tty{IFNUSED}, um abzufragen, ob ein
  14494.            Symbol bisher benutzt wurde;}
  14495.      \item{Die Environment-Variablen \tty{ASCMD}, \tty{BINDCMD} usw. k"onnen auch
  14496.            einen Dateinamen enthalten, in dem f"ur die Optionen mehr
  14497.            Platz ist;}
  14498.      \item{P2HEX erzeugt nun die von Microchip vorgegebenen Hex-Formate
  14499.            (p4);}
  14500.      \item{mit der Seitenl"angenangabe 0 k"onnen automatische
  14501.            Seitenvorsch"ube im Listing vollst"andig unterdr"uckt werden
  14502.            (p4);}
  14503.      \item{neue Kommandozeilenoption \tty{P}, um die Ausgabe des Makroprozessors
  14504.            in eine Datei zu schreiben (p4);}
  14505.      \item{in der Kommandozeile definierte Symbole d"urfen nun auch mit
  14506.            einem frei w"ahlbaren Wert belegt werden (p5).}
  14507.      \end{itemize}}
  14508. \item{Version 1.38:
  14509.      \begin{itemize}
  14510.      \item{Umstellung auf Mehrpass-Betrieb.  Damit kann \asname{} auch bei
  14511.            Vorw"artsreferenzen immer den optimalen Code erzeugen;}
  14512.      \item{Der 8051-Teil kennt nun auch die Befehle \tty{JMP} und \tty{CALL};}
  14513.      \item{unterst"utzt zus"atzlich die Toshiba TLCS-900-Reihe (p1);}
  14514.      \item{Befehl \tty{ASSUME}, um dem Assembler die Belegung der
  14515.            Segmentregister des 8086 mitzuteilen (p2);}
  14516.      \item{unterst"utzt zus"atzlich die ST6-Reihe von SGS-Thomson (p2);}
  14517.      \item{..sowie die 3201x-Signalprozessoren von Texas Instruments (p2);}
  14518.      \item{Option \tty{F} bei P2HEX, um die automatische Formatwahl "ubersteuern
  14519.            zu k"onnen (p2);}
  14520.      \item{P2BIN kann nun auch durch Angabe von Dollarzeichen Anfang und
  14521.            Ende des Adre"sfensters selbstst"andig festlegen (p2);}
  14522.      \item{Der 8048-Codegenerator kennt nun auch die 8041/42-
  14523.            Befehlserweiterungen(p2);}
  14524.      \item{unterst"utzt zus"atzlich die Zilog Z8-Mikrokontroller(p3).}
  14525.      \end{itemize}}
  14526. \item{Version 1.39:
  14527.      \begin{itemize}
  14528.      \item{Definitionsm"oglichkeit von Sektionen und lokalen Labels;}
  14529.      \item{Kommandozeilenschalter \tty{h}, um Hexadezimalzahlenausgabe mit
  14530.            Kleinbuchstaben zu erzwingen;}
  14531.      \item{Variable \tty{MOMPASS}, um die Nummer des augenblicklichen Durchganges
  14532.            abfragen zu k"onnen;}
  14533.      \item{Kommandozeilenschalter \tty{t}, um einzelne Teile des Assemblerlistings
  14534.            ausblenden zu k"onnen;}
  14535.      \item{kennt zus"atzlich die L-Variante der TLCS-900-Reihe von Toshiba
  14536.            und die MELPS-7700-Reihe von Mitsubishi (p1);}
  14537.      \item{P2HEX akzeptiert nun auch Dollarzeichen f"ur Start-und Endadresse
  14538.            (p2);}
  14539.      \item{unterst"utzt zus"atzlich die TLCS90-Familie von Toshiba (p2);}
  14540.      \item{P2HEX kann Daten zus"atzlich im Tektronix- und 16-Bit
  14541.            Intel-Hex-Format ausgeben (p2);}
  14542.      \item{bei Adre"s"uberschreitungen gibt P2HEX Warnungen aus (p2);}
  14543.      \item{Include-Datei STDDEF96.INC mit Adre"sdefinitionen f"ur die
  14544.            TLCS-900-Reihe (p3);}
  14545.      \item{Befehl \tty{READ}, um Werte w"ahrend der Assemblierung interaktiv
  14546.            einlesen zu k"onnen (p3);}
  14547.      \item{Fehlermeldungen werden nicht mehr einfach auf die
  14548.            Standardausgabe, sondern auf den von DOS daf"ur vorgesehenen
  14549.            Kanal (STDERR) geschrieben (p3);}
  14550.      \item{Der beim 6811-Teil fehlende \tty{STOP}-Befehl ist nun da (scusi,p3);}
  14551.      \item{unterst"utzt zus"atzlich die $\mu$PD78(C)1x-Familie von NEC (p3);}
  14552.      \item{unterst"utzt zus"atzlich den PIC16C84 von Microchip (p3);}
  14553.      \item{Kommandozeilenschalter \tty{E}, um die Fehlermeldungen in eine Datei
  14554.            umleiten zu k"onnen (p3);}
  14555.      \item{Die Unklarheiten im 78(C)1x-Teil sind beseitigt (p4);}
  14556.      \item{neben dem MELPS-7700 ist nun auch das ,,Vorbild'' 65816
  14557.            vorhanden (p4);}
  14558.      \item{Die ST6-Pseudoanweisung \tty{ROMWIN} wurde entfernt und
  14559.            mit in den \tty{ASSUME}-Befehl eingegliedert (p4);}
  14560.      \item{unterst"utzt zus"atzlich den 6804 von SGS-Thomson (p4);}
  14561.      \item{durch die \tty{NOEXPORT}-Option in der Makrodefinition
  14562.            kann nun f"ur jedes Makro einzeln festgelegt werden, ob es
  14563.            in der MAC-Datei erscheinen soll oder nicht (p4);}
  14564.      \item{Die Bedeutung von \tty{MACEXP} f"ur Expansionen von Makros hat
  14565.            sich wegen der zus"atzlichen \tty{NOEXPAND}-Option in der
  14566.            Makrodefinition leicht ge"andert (p4);}
  14567.      \item{Durch die \tty{GLOBAL}-Option in der Makrodefinition k"onnen nun
  14568.            zus"atzlich Makros definiert werden, die durch ihren
  14569.            Sektionsnamen eindeutig gekennzeichnet sind (p4).}
  14570.      \end{itemize}}
  14571. \item{Version 1.40:
  14572.      \begin{itemize}
  14573.      \item{unterst"utzt zus"atzlich den DSP56000 von Motorola;}
  14574.      \item{P2BIN kann nun auch das untere bzw. obere Wort aus
  14575.            32-Bit-W"ortern abtrennen;}
  14576.      \item{unterst"utzt zus"atzlich die TLCS-870- und TLCS-47-Familie
  14577.            von Toshiba(p1);}
  14578.      \item{mit einem vorangestelltem ! kann man durch Makros
  14579.            ,,verdeckte'' Maschinenbefehle wieder erreichen(p1);}
  14580.      \item{mit der \tty{GLOBAL}-Anweisung lassen sich Symbolnamen
  14581.            nun auch qualifiziert exportieren(p1);}
  14582.      \item{mit der \tty{r}-Option kann man sich nun eine Liste der
  14583.            Stellen erzeugen lassen, die zus"atzliche Durchl"aufe
  14584.            erzwangen(p1);}
  14585.      \item{bei der \tty{E}-Option kann nun die Dateiangabe weggelassen werden,
  14586.            so da"s ein passender Default gew"ahlt wird(p1);}
  14587.      \item{mit der \tty{t}-Option kann nun die Zeilennumerierung im Listing
  14588.            abgeschaltet werden(p1);}
  14589.      \item{Escapesequenzen sind nun auch in in ASCII geschriebenen
  14590.            Integerkonstanten zul"assig(p1);}
  14591.      \item{Mit dem Pseudobefehl \tty{PADDING} kann das Einf"ugen
  14592.            von F"ullbytes im 680x0-Modus ein- und ausgeschaltet
  14593.            werden (p2);}
  14594.      \item{\tty{ALIGN} ist nun f"ur alle Zielplattformen erlaubt (p2);}
  14595.      \item{kennt zus"atzlich die PIC16C64-SFRs (p2);}
  14596.      \item{unterst"utzt zus"atzlich den 8096 von Intel (p2);}
  14597.      \item{Bei \tty{DC} kann zus"atzlich ein Wiederholungsfaktor angegeben
  14598.            werden (r3);}
  14599.      \item{unterst"utzt zus"atzlich die TMS320C2x-Familie von Texas
  14600.            Instruments (Implementierung von Thomas Sailer, ETH Z"urich,
  14601.            r3); P2HEX ist auch entsprechend erweitert;}
  14602.      \item{statt \tty{EQU} darf nun auch einfach ein Gleichheitszeichen
  14603.            benutzt werden (r3);}
  14604.      \item{zur Definition von Aufz"ahlungen zus"atzlich ein
  14605.            \tty{ENUM}-Befehl (r3);}
  14606.      \item{\tty{END} hat jetzt auch eine Wirkung (r3);}
  14607.      \item{zus"atzliche Kommandozeilenoption \tty{n}, um zu Fehlermeldungen
  14608.            zus"atzlich die internen Fehlernummern zu erhalten (r3);}
  14609.      \item{unterst"utzt zus"atzlich die TLCS-9000er von Toshiba (r4)};
  14610.      \item{unterst"utzt zus"atzlich die TMS370xxx-Reihe von Texas
  14611.            Instuments, wobei als neuer Pseudobefehl \tty{DBIT}
  14612.            hinzukam (r5);}
  14613.      \item{kennt zus"atzlich die DS80C320-SFRs (r5);}
  14614.      \item{der Makroprozessor kann nun auch Includes aus Makros
  14615.            heraus einbinden, wozu das Format von Fehlermeldungen
  14616.            aber leicht ge"andert werden mu"ste.  Falls Sie AS2MSG
  14617.            verwenden, ersetzen Sie es unbedingt durch die neue
  14618.            Version! (r5)}
  14619.      \item{unterst"utzt zus"atzlich den 80C166 von Siemens (r5);}
  14620.      \item{zus"atzlich eine \tty{VAL}-Funktion, um Stringausdr"ucke auswerten
  14621.            zu k"onnen (r5);}
  14622.      \item{Mithilfe von in geschweiften Klammern eingeschlossenen
  14623.            Stringvariablen lassen sich nun selber Symbole definieren
  14624.            (r5);}
  14625.      \item{kennt zus"atzlich die Eigenheiten des 80C167 von Siemens (r6);}
  14626.      \item{jetzt gibt es f"ur die MELPS740-Reihe auch die
  14627.            special-page-Adressierung (r6);}
  14628.      \item{mit eckigen Klammern kann man explizit Symbole aus einer
  14629.            bestimmten Sektion ansprechen.  Die Hilfskonstruktion mit dem
  14630.            Klammeraffen gibt es nicht mehr (r6)!}
  14631.      \item{kennt zus"atzlich die MELPS-4500-Reihe von Mitsubishi (r7);}
  14632.      \item{kennt zus"atzlich die H8/300 und H8/300H-Prozessoren von
  14633.            Hitachi (r7);}
  14634.      \item{die mit \tty{LISTING} und \tty{MACEXP} gemachten Einstellungen
  14635.            lassen sich nun auch wieder aus gleichnamigen Symbolen auslesen
  14636.            (r7);}
  14637.      \item{kennt zus"atzlich den TMS320C3x von Texas Instruments (r8);}
  14638.      \item{kennt zus"atzlich den SH7000 von Hitachi (r8);}
  14639.      \item{der Z80-Teil wurde um die Unterst"utzung des Z380 erweitert (r9);}
  14640.      \item{der 68K-Teil wurde um die feinen Unterschiede der
  14641.            683xx-Mikrokontroller erweitert (r9);}
  14642.      \item{ein Label mu"s nun nicht mehr in der ersten Spalte beginnen,
  14643.            wenn man es mit einem Doppelpunkt versieht (r9);}
  14644.      \item{kennt zus"atzlich die 75K0-Reihe von NEC (r9);}
  14645.      \item{mit dem neuen Kommandozeilenschalter o kann der Name
  14646.            der Code-Datei neu festgelegt werden (r9);}
  14647.      \item{der \verb!~~!-Operator ist in der Rangfolge auf einen
  14648.            sinnvolleren Platz gerutscht (r9);}
  14649.      \item{\tty{ASSUME} ber"ucksichtigt f"ur den 6809 jetzt auch das
  14650.            DPR-Register und seine Auswirkungen (pardon, r9);}
  14651.      \item{Der 6809-Teil kennt nun auch die versteckten
  14652.            Erweiterungen des 6309 (r9);}
  14653.      \item{Bin"arkonstanten k"onnen jetzt auch in C-artiger
  14654.            Notation geschrieben werden (r9).}
  14655.      \end{itemize}}
  14656. \item{Version 1.41:
  14657.      \begin{itemize}
  14658.      \item{"uber das Symbol \tty{MOMSEGMENT} kann der momentan
  14659.            gesetzte Adre"sraum abgefragt werden;}
  14660.      \item{anstelle von \tty{SET} bzw. \tty{EVAL} kann jetzt auch
  14661.            einfach \tty{:=} geschrieben werden;}
  14662.      \item{mit der neuen Kommandozeilenoption \tty{q} kann ein ,,stiller''
  14663.            Assemblerlauf erzwungen werden;}
  14664.      \item{das Schl"usselwort \tty{PARENT} zum Ansprechen der
  14665.            Vatersektion wurde um \tty{PARENT0...PARENT9} erweitert;}
  14666.      \item{der PowerPC-Teil wurde um die Mikrokontroller-Versionen
  14667.            MPC505 und PPC403 erweitert;}
  14668.      \item{mit \tty{SET} oder \tty{EQU} definierte Symbole k"onnen
  14669.            nun einem bestimmten Adre"sraum zugeordnet werden;}
  14670.      \item{mit \tty{SET} oder \tty{EQU} definierte Symbole k"onnen
  14671.            nun einem bestimmten Adre"sraum zugeordnet werden;}
  14672.      \item{durch das Setzen der Environment-Variablen \tty{USEANSI}
  14673.            kann die Verwendung von ANSI-Bildschirmsteuersequenzen
  14674.            an-und ausgeschaltet werden (r1);}
  14675.      \item{der SH7000-Teil kennt jetzt auch die SH7600-Befehlserweiterungen
  14676.            (und sollte jetzt korrekte Displacements berechnen...) (r1).}
  14677.      \item{im 65XX-Teil wird jetzt zwischen 65C02 und 65SC02 unterschieden
  14678.            (r1);}
  14679.      \item{neben der Variablen \tty{MOMCPU} gibt es jetzt auch den String
  14680.            \tty{MOMCPUNAME}, der den Prozessornamen im Volltext enth"alt (r1).}
  14681.      \item{P2HEX kennt jetzt auch die 32-Bit-Variante des
  14682.            Intel-Hex-Formates (r1);}
  14683.      \item{kennt jetzt auch die Einschr"ankungen des 87C750 (r2);}
  14684.      \item{die Nummern f"ur fatale Fehlermeldungen wurden auf den Bereich
  14685.            ab 10000 verschoben, um Platz f"ur normale Fehlermeldungen zu
  14686.             schaffen (r2);}
  14687.      \item{unbenutzte Symbole werden in der Symboltabelle jetzt mit einem
  14688.            Stern gekennzeichnet (r2);}
  14689.      \item{unterst"utzt zus"atzlich die 29K-Familie von AMD (r2);}
  14690.      \item{unterst"utzt zus"atzlich die M16-Familie von Mitsubishi (r2);}
  14691.      \item{unterst"utzt zus"atzlich die H8/500-Familie von Hitachi (r3);}
  14692.      \item{die Anzahl von Datenbytes, die P2HEX pro Zeile ausgibt, ist
  14693.            jetzt variierbar (r3);}
  14694.      \item{der Pass, ab dem durch die \tty{-r}-Option erzeugte Warnungen
  14695.            ausgegeben werden, ist einstellbar (r3);}
  14696.      \item{der Makroprozessor kennt jetzt ein \tty{WHILE}-Statement,
  14697.            mit dem ein Code-St"uck eine variable Anzahl wiederholt werden
  14698.             kann (r3);}
  14699.      \item{der \tty{PAGE}-Befehl erlaubt es nun auch, die Breite des
  14700.            Ausgabemediums f"urs Listing anzugeben (r3);}
  14701.      \item{Um neue Pseudo-Prozessortypen einf"uhren zu k"onnen, lassen
  14702.            sich jetzt CPU-Aliasse definieren (r3);}
  14703.      \item{unterst"utzt zus"atzlich die MCS/251-Familie von Intel (r3);}
  14704.      \item{bei eingeschalteter Querverweisliste wird bei doppelt
  14705.            definierten Symbolen die Stelle der ersten Definition
  14706.             angezeigt (r3);}
  14707.      \item{unterst"utzt zus"atzlich die TMS320C5x-Familie von Texas
  14708.            Instruments (Implementierung von Thomas Sailer, ETH Z"urich,
  14709.            r3);}
  14710.      \item{die OS/2-Version sollte jetzt auch mit langen Dateinamen
  14711.            klarkommen.  Wenn man nicht jeden Mist selber kontrolliert...
  14712.             (r3)}
  14713.      \item{"uber den Befehl \tty{BIGENDIAN} kann im MCS-51/251-Modus
  14714.            jetzt gew"ahlt werden, ob die Ablage von Konstanten im Big-
  14715.            oder Little-Endian-Format erfolgen soll (r3);}
  14716.      \item{es wird beim 680x0 jetzt zwischen dem vollen und eingeschr"ankten
  14717.            MMU-Befehlssatz unterschieden; eine manuelle Umschaltung ist mit dem
  14718.            \tty{FULLPMMU}-Befehl m"oglich (r3);}
  14719.      \item{"uber die neue Kommandozeilenoption \tty{I} kann eine Liste
  14720.            aller eingezogenen Include-Files mit ihrer Verschachtelung
  14721.            ausgegeben werden (r3);}
  14722.      \item{Beim \tty{END}-Statement kann jetzt zus"atzlich ein
  14723.            Einsprungpunkt f"ur das Programm angegeben werden (r3).}
  14724.      \item{unterst"utzt zus"atzlich die 68HC16-Familie von Motorola (r3);}
  14725.      \item{P2HEX und P2BIN erlauben es jetzt, den Inhalt einer Code-Datei
  14726.            adre"sm"a"sig zu verschieben (r4);}
  14727.      \item{einem \tty{SHARED}-Befehl anh"angende Kommentare werden jetzt
  14728.            in die Share-Datei mit "ubertragen (r4);}
  14729.      \item{unterst"utzt zus"atzlich die 68HC12-Familie von Motorola (r4);}
  14730.      \item{unterst"utzt zus"atzlich die XA-Familie von Philips (r4);}
  14731.      \item{unterst"utzt zus"atzlich die 68HC08-Familie von Motorola (r4);}
  14732.      \item{unterst"utzt zus"atzlich die AVR-Familie von Atmel (r4);}
  14733.      \item{aus Kompatibilit"at zum AS11 von Motorola existieren zus"atzlich
  14734.            die Befehle \tty{FCB}, \tty{FDB}, \tty{FCC} und \tty{RMB} (r5);}
  14735.      \item{unterst"utzt zus"atzlich den M16C von Mitsubishi (r5);}
  14736.      \item{unterst"utzt zus"atzlich den COP8 von National Semiconductor
  14737.            (r5);}
  14738.      \item{zwei neue Befehle zur bedingten Assemblierung: \tty{IFB} und
  14739.            \tty{IFNB} (r5);}
  14740.      \item{Mit dem \tty{EXITM}-Befehl ist es nun m"oglich, eine
  14741.            Makroexpansion vorzeitig abzubrechen (r5);}
  14742.      \item{unterst"utzt zus"atzlich den MSP430 von Texas Instruments
  14743.            (r5);}
  14744.      \item{\tty{LISTING} kennt zus"atzlich die Varianten
  14745.            \tty{NOSKIPPED} und \tty{PURECODE}, um nicht assemblierten
  14746.            Code aus dem Listing auszublenden (r5);}
  14747.      \item{unterst"utzt zus"atzlich die 78K0-Familie von NEC (r5);}
  14748.      \item{BIGENDIAN ist jetzt auch im PowerPC-Modus verf"ugbar (r5);}
  14749.      \item{zus"atzlich ein \tty{BINCLUDE}-Befehl, um Bin"ardaten
  14750.            einbinden zu k"onnen (r5);}
  14751.      \item{zus"atzliche TOLOWER- und LOWSTRING-Funktionen, um
  14752.                 Gro"s- in Kleinbuchstaben umzuwandeln (r5);}
  14753.      \item{es ist jetzt m"oglich, auch in anderen Segmenten als
  14754.            CODE Daten abzulegen.  Das Dateiformat wurde entsprechend
  14755.            erweitert (r5);}
  14756.      \item{der \tty{DS}-Befehl, mit dem man Speicherbereiche reservieren
  14757.            kann, ist jetzt auch im Intel-Modus zul"assig (r5);}
  14758.      \item{Mit der Kommandozeilenoption \tty{U} ist es jetzt
  14759.            m"oglich, \asname{} in einen case-sensitiven Modus umzuschalten,
  14760.            in dem Namen von Symbolen, selbst definierten Funktionen,
  14761.            Makros, Makroparametern sowie Sektionen nach Gro"s-
  14762.            und Kleinschreibung unterschieden werden (r5);}
  14763.      \item{\tty{SFRB} ber"ucksichtigt jetzt auch die Bildungsregeln
  14764.            f"ur Bitadressen im RAM-Bereich; werden nicht bitadressierbare
  14765.            Speicherstellen angesprochen, erfolgt eine Warnung (r5);}
  14766.      \item{zus"atzliche Pseudobefehle \tty{PUSHV} und \tty{POPV}, um
  14767.            Symbolwerte tempor"ar zu sichern (r5);}
  14768.      \item{zus"atzliche Funktionen \tty{BITCNT, FIRSTBIT, LASTBIT} und
  14769.                 \tty{BITPOS} zur Bitverarbeitung (r5);}
  14770.      \item{bei den CPU32-Prozessoren ist jetzt auch der 68360
  14771.            ber"ucksichtigt (r5);}
  14772.      \item{unterst"utzt zus"atzlich die ST9-Familie von SGS-Thomson (r6);}
  14773.      \item{unterst"utzt zus"atzlich den SC/MP von National Semiconductor
  14774.            (r6);}
  14775.      \item{unterst"utzt zus"atzlich die TMS70Cxx-Familie von Texas
  14776.            Instruments (r6);}
  14777.      \item{unterst"utzt zus"atzlich die TMS9900-Familie von Texas
  14778.            Instruments (r6);}
  14779.      \item{unterst"utzt zus"atzlich die Befehlssatzerweiterungen
  14780.            des 80296 (r6);}
  14781.      \item{die unterst"utzten Z8-Derivate wurden erweitert
  14782.            (r6);}
  14783.      \item{ber"ucksichtigt zus"atzlich die Maskenfehler des 80C504
  14784.            von Siemens (r6);}
  14785.      \item{zus"atzliche Registerdefinitionsdatei f"ur die C50x-Prozessoren
  14786.            von Siemens (r6);}
  14787.      \item{unterst"utzt zus"atzlich die ST7-Familie von SGS-Thomson (r6);}
  14788.      \item{die Intel-Pseudobefehle zur Datenablage sind jetzt
  14789.            auch f"ur 65816 bzw. MELPS-7700 zul"assig (r6);}
  14790.      \item{f"ur 65816/MELPS-7700 kann die Adre"sl"ange jetzt durch
  14791.            Pr"afixe explizit festgelegt werden (r6);}
  14792.      \item{unterst"utzt zus"atzlich die 8X30x-Familie von Signetics
  14793.            (r6);}
  14794.      \item{\tty{PADDING} ist nur noch f"ur die 680x0-Familie defaultm"a"sig
  14795.            eingeschaltet (r7);}
  14796.      \item{"uber das neu eingef"uhrte, vordefinierte Symbol
  14797.            \tty{ARCHITECTURE} kann ausgelesen werden, f"ur welche
  14798.            Plattform \asname{} "ubersetzt wurde (r7);}
  14799.      \item{Zus"atzliche Anweisungen \tty{STRUCT} und \tty{ENDSTRUCT} zur
  14800.            Definition von Datenstrukturen (r7);}
  14801.      \item{Hex- und Objekt-Dateien f"ur die AVR-Tools k"onnen jetzt
  14802.            direkt erzeugt werden (r7);}
  14803.      \item{\tty{MOVEC} kennt jetzt auch die 68040-Steuerregister (r7);}
  14804.      \item{zus"atzliche \tty{STRLEN}-Funktion, um die L"ange eines
  14805.            Strings zu ermitteln (r7);}
  14806.      \item{M"oglichkeit zur Definition von Registersymbolen (r7, momentan
  14807.            nur Atmel AVR);}
  14808.      \item{kennt zus"atzlich die undokumentierten 6502-Befehle (r7);}
  14809.      \item{P2HEX und P2BIN k"onnen jetzt optional die Eingabedateien
  14810.            automatisch l"oschen (r7);}
  14811.      \item{P2BIN kann der Ergebnisdatei optional zus"atzlich die
  14812.            Startadresse voranstellen (r7);}
  14813.      \item{unterst"utzt zus"atzlich die ColdFire-Familie von Motorola als
  14814.            Variation des 680x0-Kerns (r7);}
  14815.      \item{\tty{BYT/FCB, ADR/FDB} und \tty{FCC} erlauben jetzt auch den
  14816.            von \tty{DC} her bekannten Wiederholungsfaktor (r7);}
  14817.      \item{unterst"utzt zus"atzlich den M*Core von Motorola (r7);}
  14818.      \item{der SH7000-Teil kennt jetzt auch die SH7700-Befehlserweiterungen
  14819.            (r7);}
  14820.      \item{der 680x0-Teil kennt jetzt auch die zus"atzlichen Befehle des
  14821.            68040 (r7);}
  14822.      \item{der 56K-Teil kennt jetzt auch die Befehlserweiterungen bis zum
  14823.            56300 (r7).}
  14824.      \item{Mit der neuen \tty{CODEPAGE}-Anweisung k"onnen jetzt auch
  14825.            mehrere Zeichentabellen gleichzeitig verwaltet werden (r8);}
  14826.      \item{Die Argumentvarianten f"ur \tty{CHARSET} wurden erweitert
  14827.            (r8);}
  14828.      \item{Neue String-Funktionen \tty{SUBSTR} und \tty{STRSTR} (r8);}
  14829.      \item{zus"atzliches \tty{IRPC}-Statement im Makroprozessor (r8);}
  14830.      \item{zus"atzlicher {\tt RADIX}-Befehl, um das Default-Zahlensystem
  14831.            f"ur Integer-Konstanten festzulegen (r8);}
  14832.      \item{statt {\tt ELSEIF} darf auch einfach {\tt ELSE} geschrieben
  14833.            werden (r8);}
  14834.      \item{statt $=$ darf als Gleichheitsoperator auch $==$ geschrieben
  14835.            werden (r8);}
  14836.      \item{\tty{BRANCHEXT} erlaubt es beim Philips XA jetzt, die
  14837.            Sprungweite von kurzen Spr"ungen automatisch zu erweitern
  14838.            (r8);}
  14839.      \item{Debug-Ausgaben sind jetzt auch im NoICE-Format m"oglich (r8);}
  14840.      \item{unterst"utzt zus"atzlich die i960-Familie von Intel (r8);}
  14841.      \item{unterst"utzt zus"atzlich die $\mu$PD7720/7725-Signalprozssoren
  14842.            von NEC (r8);}
  14843.      \item{unterst"utzt zus"atzlich den $\mu$PD77230-Signalprozssor von
  14844.            NEC (r8);}
  14845.      \item{unterst"utzt zus"atzlich die SYM53C8xx-SCSI-Prozessoren von
  14846.            Symbios Logic (r8);}
  14847.      \item{unterst"utzt zus"atzlich den 4004 von Intel (r8);}
  14848.      \item{unterst"utzt zus"atzlich die SC14xxx-Serie von National (r8);}
  14849.      \item{unterst"utzt zus"atzlich die Befehlserweiterungen des PPC403GC
  14850.            (r8);}
  14851.      \item{zus"atzliche Kommandozeilenoption {\tt cpu}, um den
  14852.            Zielprozessor-Default zu setzen (r8);}
  14853.      \item{Key-Files k"onnen jetzt auch von der Kommandozeile aus
  14854.            referenziert werden (r8);}
  14855.      \item{zus"atzliche Kommandozeilenoption {\tt shareout}, um die
  14856.            Ausgabedatei f"ur SHARED-Definitionen zu setzen (r8);}
  14857.      \item{neuer Pseudobefehl {\tt WRAPMODE}, um AVR-Prozessoren mit
  14858.            verk"urztem Programmz"ahler zu unterst"utzen (r8);}
  14859.      \item{unterst"utzt zus"atzlich die C20x-Befehlsuntermenge im
  14860.            C5x-Teil (r8);}
  14861.      \item{hexadezimale Adre"sangaben der Hilfsprogamme k"onnen jetzt
  14862.            auch in C-Notation gemacht werden (r8);}
  14863.      \item{Das Zahlensystem f"ur Integerergebnisse in \verb!\{...}!-
  14864.            Ausdr"ucken ist jetzt per \tty{OUTRADIX} setzbar (r8);}
  14865.      \item{Die Registersyntax f"ur 4004-Registerpaare wurde korrigiert
  14866.            (r8);}
  14867.      \item{unterst"utzt zus"atzlich die F$^{2}$MC8L-Familie von Fujitsu
  14868.            (r8);}
  14869.      \item{f"ur P2HEX kann jetzt die Minimall"ange f"ur S-Record-Adressen
  14870.            angegeben werden (r8);}
  14871.      \item{unterst"utzt zus"atzlich die ACE-Familie von Fairchild (r8);}
  14872.      \item{{\tt REG} ist jetzt auch f"ur PowerPCs erlaubt (r8);}
  14873.      \item{zus"atzlicher Schalter in P2HEX, um alle Adressen zu
  14874.            verschieben (r8);}
  14875.      \item{Mit dem Schalter \tty{x} kann man jetzt zus"atzlich in einer
  14876.            zweiten Stufe bie betroffene Quellzeile ausgeben (r8).}
  14877.      \end{itemize}}
  14878. \item{Version 1.42:
  14879.      \begin{itemize}
  14880.      \item{Die Default-Zahlensyntax f"ur Atmel AVR ist jetzt C-Syntax;}
  14881.      \item{zus"atzliche Kommandozeilenoption {\tt olist}, um die
  14882.            Listing-Ausgabedatei zu setzen;}
  14883.      \item{unterst"utzt zus"atzlich die F$^{2}$MC16L-Familie von Fujitsu;}
  14884.      \item{zus"atzlicher Befehl {\tt PACKING} f"ur die AVR-Familie;}
  14885.      \item{zus"atzliche implizite Makroparameter {\tt ALLARGS} und
  14886.            {\tt ARGCOUNT};}
  14887.      \item{zus"atzlicher Befehl {\tt SHIFT} zum Abarbeiten variabler
  14888.            Argumentlisten von Makros;}
  14889.      \item{unterst"utzt tempor"are Symbole;}
  14890.      \item{zus"atzlicher Befehl {\tt MAXNEST} zum Einstellen der
  14891.            maximalen Verschachtelungstiefe von Makroexpansionen;}
  14892.      \item{zus"atzliche Kommandozeilenoption {\tt noicemask}, um
  14893.            die Menge der in einem NoICE-Debuginfofile gelisteten Segmente
  14894.            zu steuern;}
  14895.      \item{unterst"utzt zus"atzlich die 180x-Familie von Intersil;}
  14896.      \item{unterst"utzt zus"atzlich das address windowing des 68HC11K4;}
  14897.      \item{P2HEX kann jetzt die Adre"sfeldl"ange von AVR-Hex-Dateien
  14898.            variieren;}
  14899.      \item{mit der neuen Kommandozeilenoption {\tt -gnuerrors} k"onnen
  14900.            Fehlermeldungen in einem GNU-C-artigen Format ausgegeben
  14901.            werden;}
  14902.      \item{unterst"utzt zus"atzlich die TMS320C54x-Familie von Texas
  14903.            Instruments;}
  14904.      \item{Neue Makro-Option {\tt INTLABEL};}
  14905.      \item{die neuen Instruktionen und Register der MEGA-AVRs 8/16
  14906.            wurden hinzugef"ugt;}
  14907.      \item{{\tt ENDIF/ENDCASE} zeigen im Listing die Zeilennummer des
  14908.            zugeh"origen "offnenden Befehls an;}
  14909.      \item{der 8051-Teil unterst"utzt jetzt auch den erweiterten
  14910.            Adre"sraum des Dallas DS80C390;}
  14911.      \item{namenlose tempor"are Symbole hinzugef"ugt;}
  14912.      \item{unterst"utzt zus"atzlich die undokumentierten 8085-Befehle;}
  14913.      \item{verbesserte Behandlung von Strukturen;}
  14914.      \item{Funktion EXPRTYPE() hinzugef"ugt;}
  14915.      \item{Zeilenfortsetzungszeichen zulassen;}
  14916.      \item{Unterst"utzung f"ur KCPSM/PicoBlaze von Andreass Wassatsch
  14917.            integriert;}
  14918.      \item{unterst"utzt zus"atzlich die 807x-Familie von National
  14919.            Semiconductor;}
  14920.      \item{unterst"utzt zus"atzlich den 4040 von Intel;}
  14921.      \item{unterst"utzt zus"atzlich den eZ8 von Zilog;}
  14922.      \item{unterst"utzt zus"atzlich die 78K2-Familie von NEC;}
  14923.      \item{unterst"utzt zus"atzlich die KCPSM3-Variante von Xilinx;}
  14924.      \item{unterst"utzt zus"atzlich den LatticeMico8;}
  14925.      \item{unterst"utzt zus"atzlich die 12X-Befehlserweiterungen
  14926.            und den XGATE-Kern der 68HC12-Familie;}
  14927.      \item{unterst"utzt zus"atzlich den Signetics 2650;}
  14928.      \item{unterst"utzt zus"atzlich die COP4-Familie von National
  14929.            Semiconductor;}
  14930.      \item{unterst"utzt zus"atzlich die HCS08-Erweiterungen von Freescale;}
  14931.      \item{unterst"utzt zus"atzlich die RS08-Familie von Freescale;}
  14932.      \item{unterst"utzt zus"atzlich den 8008 von Intel;}
  14933.      \item{weitere Syntax f"ur Integer-Konstanten;}
  14934.      \item{Funktion \tty{CHARFROMSTR} hinzugef"ugt;}
  14935.      \item{Q f"ur Oktalkonstanten im Intel-Modus hinzugef"ugt;}
  14936.      \item{weitere Variante f"ur tempor"are Symbole hinzugef"ugt;}
  14937.      \item{der PowerPC-Teil wurde um Unterst"utzung f"ur den MPC821 erweitert
  14938.            (Beitrag von Marcin Cieslak);}
  14939.      \item{implizite Makro-Parameter sind immer case-insensitiv;}
  14940.      \item{das \tty{REG}-Statement ist jetzt auch f"ur den MSP430
  14941.            erlaubt;}
  14942.      \item{unterst"utzt zus"atzlich den XS1 von XMOS;}
  14943.      \item{zus"atzliche Parameter \tty{GLOBALSYMBOLS} und
  14944.            \tty{NOGLOBALSYMBOLS} um zu steuern, ob Labels
  14945.            in Makros lokal sind oder nicht;}
  14946.      \item{kennt zus"atzlich die 75xx-Reihe von NEC;}
  14947.      \item{kennt zus"atzlich die TMS1000-Controller von TI;}
  14948.      \item{unterst"utzt zus"atzlich die 78K2-Familie von NEC;}
  14949.      \item{alle neueren Anderungen werden nur noch in der
  14950.            separaten changelog-Datei dokumentiert.}
  14951.      \end{itemize}}
  14952. \end{itemize}
  14953.  
  14954. %%===========================================================================
  14955.  
  14956. \cleardoublepage
  14957. \chapter{Hinweise zum Quellcode von \asname{}}
  14958. \label{ChapSource}
  14959.  
  14960. Wie in der Einleitung erw"ahnt, gebe ich nach R"ucksprache den Quellcode
  14961. von \asname{} heraus.  Im folgenden sollen einige Hinweise zu dessen Handhabung
  14962. gegeben werden.
  14963.  
  14964. %%---------------------------------------------------------------------------
  14965.  
  14966. \section{Verwendete Sprache}
  14967.  
  14968. Urspr"unglich war \asname{} ein in Turbo-Pascal geschriebenes Programm.  F"ur
  14969. diese Entscheidung gab es Ende der 80er Jahre eine Reihe von Gr"unden:
  14970. Zum einen war ich damit wesentlich vertrauter als mit jedem C-Compiler,
  14971. zum anderen waren alle C-Compiler unter DOS verglichen mit der IDE von
  14972. Turbo-Pascal ziemliche Schnecken.  Anfang 1997 zeichnete sich jedoch ab,
  14973. da"s sich das Blatt gewendet hatte: Zum einen hatte Borland beschlossen,
  14974. die DOS-Entwickler im Stich zu lassen (nochmals ausdr"ucklich keinen
  14975. sch"onen Dank, Ihr Pappnasen von Borland!), und Version 7.0 etwas namens
  14976. 'Delphi' nachfolgen lie"sen, was zwar wohl wunderbar f"ur
  14977. Windows-Programme geeignet ist, die zu 90\% aus Oberfl"ache und zuf"allig
  14978. auch ein bi"schen Funktion bestehen, f"ur kommandozeilenorientierte
  14979. Progamme wie \asname{} aber reichlich unbrauchbar ist.  Zum anderen hatte sich
  14980. bereits vor diesem Zeitpunkt mein betriebssystemm"a"siger Schwerpunkt
  14981. deutlich in Richtung Unix verschoben, und auf ein Borland-Pascal f"ur
  14982. Linux h"atte ich wohl beliebig lange warten k"onnen (an alle die, die
  14983. jetzt sagen, Borland w"urde ja an soetwas neuerdings basteln: Leute, das
  14984. ist {\em Vapourware}, und glaubt den Firmen nichts, solange Ihr nicht
  14985. wirklich in den Laden gehen und es kaufen k"onnt!).  Von daher war also
  14986. klar, da"s der Weg in Richtung C gehen mu"ste.
  14987.  
  14988. Nach der Erfahrung, wohin die Verwendung von Inselsystemen f"uhrt, habe
  14989. ich bei der Umsetzung auf C Wert auf eine m"oglichst gro"se Portabilit"at
  14990. gelegt; da \asname{} jedoch z.B. Bin"ardateien in einem bestimmten Format
  14991. erzeugen mu"s und an einigen Stellen betriebssystemspezifische Funktionen
  14992. nutzt, gibt es einige Stellen, an denen man anpassen mu"s, wenn man \asname{} zum
  14993. ersten Mal auf einer neuen Plattform "ubersetzt.
  14994.  
  14995. \asname{} ist auf einen C-Compiler ausgelegt, der dem ANSI-Standard entspricht;
  14996. C++ ist ausdr"ucklich nicht erforderlich.  Wenn Sie nur einen Compiler
  14997. nach dem veralteten Kernighan\&Ritchie-Standard besitzen, sollten Sie sich
  14998. nach einem neuen Compiler umsehen; der ANSI-Standard ist seit 1989
  14999. verabschiedet und f"ur jede aktuelle Plattform sollte ein ANSI-Compiler
  15000. verf"ugbar sein, zur Not, indem man mit dem alten Compiler GNU-C baut.  Im
  15001. Quellcode sind zwar einige Schalter vorhanden, um den Code K\&R-n"aher zu
  15002. machen, aber dies ist ein nicht offiziell unterst"utztes Feature, das ich
  15003. nur intern f"ur ein ziemlich antikes Unix benutze.  Alles weitere zum
  15004. 'Thema K\&R' steht in der Datei {\tt README.KR}.
  15005.  
  15006. Der Sourcenbaum ist durch einige in der Pascal-Version nicht vorhandene
  15007. Features (z.B. dynamisch ladbare Nachrichtendateien, Testsuite,
  15008. automatische Generierung der Dokumentation aus {\em einem} Quellformat)
  15009. deutlich komplizierter geworden.  Ich werde versuchen, die Sache Schritt
  15010. f"ur Schritt aufzudr"oseln:
  15011.  
  15012. %%---------------------------------------------------------------------------
  15013.  
  15014. \section{Abfangen von Systemabh"angigkeiten}
  15015.  
  15016. Wie ich schon andeutete, ist \asname{} (glaube ich jedenfalls...) auf
  15017. Plattformunabh"angigkeit und leichte Portierbarkeit getrimmt.  Dies
  15018. bedeutet, da"s man die Platt\-form\-un\-ab\-h"an\-gig\-kei\-ten in
  15019. m"oglichst wenige Dateien zusammenzieht.  Auf diese Dateien werde ich im
  15020. folgenden eingehen, und dieser Abschnitt steht ganz vorne, weil es sicher
  15021. eines der wichtigsten ist:
  15022.  
  15023. Die Generierung aller Komponenten von \asname{} erfolgt "uber ein zentrales {\tt
  15024. Makefile}.  Damit dies funktioniert, mu"s man ihm ein passendes {\tt
  15025. Makefile.def} anbieten, das die plattformabh"angigen Einstellungen wie
  15026. z.B. Compilerflags vorgibt.  Im Unterverzeichnis {\tt
  15027. Makefile.def-samples} finden sich eine Reihe von Includes, die f"ur
  15028. g"angige Plattformen funktionieren (aber nicht zwangsweise optimal sein
  15029. m"ussen...).  Wenn die von Ihnen benutzte Plattform nicht dabei ist,
  15030. k"onnen Sie die Beispieldatei {\tt Makefile.def.tmpl} als Ausgangspunkt
  15031. verwenden (und das Ergebnis mir zukommen lassen!).
  15032.  
  15033. Ein weiterer Anlaufpunkt zum Abfangen von Systemabh"angigkeiten ist die
  15034. Datei {\tt sysdefs.h}.  Praktisch alle Compiler definieren eine Reihe von
  15035. Pr"aprozessorsymbolen vor, die den benutzten Zielprozessor sowie das
  15036. benutzte Betriebsystem beschreiben.  Auf einer Sun Sparc unter Solaris
  15037. mit den GNU-Compiler sind dies z.B. die Symbole \verb!__sparc! und
  15038. \verb!__SVR4!.  In {\tt sysdefs.h} werden diese Symbole genutzt, um f"ur
  15039. die restlichen, systemunabh"angigen Dateien eine einheitliche Umgebung
  15040. bereitzustellen.  Insbesondere betrifft dies Integer-Datentypen einer
  15041. bekannten L"ange, es kann aber auch die Nach- oder Redefinition von
  15042. C-Funktionen betreffen, die auf einer bestimmten Plattform nicht oder
  15043. nicht standardgem"a"s vorhanden sind.  Was da so an Sachen anf"allt, liest
  15044. man am besten selber nach.  Generell sind die \verb!#ifdef!-Statements in
  15045. zwei Ebenen gegliedert: Zuerst wird eine bestimmte Prozessorplattform
  15046. ausgew"ahlt, dann werden in diesem Abschnitt die Betriebssysteme
  15047. auseinandersortiert.
  15048.  
  15049. Wenn Sie \asname{} auf eine neue Plattform portieren, m"ussen Sie zwei f"ur diese
  15050. Plattform typische Symbole finden und {\tt sysdefs.h} passend erweitern
  15051. (und wieder bin ich an dem Ergebnis interessiert...).
  15052.  
  15053. %%---------------------------------------------------------------------------
  15054.  
  15055. \section{Systemunabh"angige Dateien}
  15056.  
  15057. ...stellen den g"o"sten Teil aller Module dar.  Alle Funktionen im Detail
  15058. zu beschreiben, w"urde den Rahmen dieser Beschreibung sprengen (wer hier
  15059. mehr wissen will, steigt am besten selbst in das Studium der Quellen ein,
  15060. so katastrophal ist mein Programmierstil nun auch wieder nicht...),
  15061. deshalb hier nur eine kurze Auflistung, welche Module vorhanden sind und
  15062. was f"ur Funktionen sie beinhalten:
  15063.  
  15064. \subsection{Von \asname{} genutzte Module}
  15065.  
  15066. \subsubsection{as.c}
  15067.  
  15068. Diese Datei ist die Wurzel von \asname{}: Sie enth"alt die {\em main()}-Funktion
  15069. von \asname{}, die Verarbeitung aller Kommandozeilenoptionen, die "ubergeordnete
  15070. Steuerung aller Durchl"aufe durch die Quelldateien sowie Teile des
  15071. Makroprozessors.
  15072.  
  15073. \subsubsection{asmallg.c}
  15074.  
  15075. In diesem Modul werden all die Befehle bearbeitet, die f"ur alle Prozessoren
  15076. definiert sind, z.B. \tty{EQU} und \tty{ORG}.  Hier findet sich auch der
  15077. \tty{CPU}-Befehl, mit dem zwischen den einzelnen Prozessoren hin- und
  15078. hergeschaltet wird.
  15079.  
  15080. \subsubsection{asmcode.c}
  15081.  
  15082. In diesem Modul befindet sich die Verwaltung der Code-Ausgabedatei.
  15083. Exportiert wird ein Interface, mit dem sich eine Code-Datei "offnen
  15084. und schlie"sen l"a"st, und das Routinen zum Einschreiben (und
  15085. Zur"ucknehmen) von Code anbietet.  Eine wichtige Aufgabe dieses Moduls
  15086. ist die Pufferung des Schreibvorgangs, die die Ausgabegeschwindigkeit
  15087. erh"oht, indem der erzeugte Code in gr"o"seren Bl"ocken geschrieben wird.
  15088.  
  15089. \subsubsection{asmdebug.c}
  15090.  
  15091. Optional kann \asname{} Debug-Informationen f"ur andere Tools wie Simulatoren
  15092. oder Debugger erzeugen, die einen R"uckbezug auf den Quellcode erlauben,
  15093. in diesem Modul gesammelt und nach Ende der Assemblierung in einem von
  15094. mehreren Formaten ausgegeben werden k"onnen.
  15095.  
  15096. \subsubsection{asmdef.c}
  15097.  
  15098. Dieses Modul enth"alt lediglich Deklarationen von "uberall ben"otigten
  15099. Konstanten und gemeinsam benutzten Variablen.
  15100.  
  15101. \subsubsection{asmfnums.c}
  15102.  
  15103. Intern vergibt \asname{} f"ur jede benutzte Quelldatei eine fortlaufende Nummer,
  15104. die zur schnellen Referenzierung benutzt wird.  Die Vergabe dieser Nummern
  15105. und die Umwandlung zwischen Nummer und Dateinamen passiert hier.
  15106.  
  15107. \subsubsection{asmif.c}
  15108.  
  15109. Hier befinden sich alle Routinen, die die bedingte Assemblierung steuern.
  15110. Exportiert wird als wichtigste Variable das Flag \tty{IfAsm}, welches
  15111. anzeigt, ob Codeerzeugung momentan ein- oder ausgeschaltet ist.
  15112.  
  15113. \subsubsection{asminclist.c}
  15114.  
  15115. In diesem Modul ist die Listenstruktur definiert, "uber die \asname{} die
  15116. Verschachtelung von Include-Dateien im Listing ausgeben kann.
  15117.  
  15118. \subsubsection{asmitree.c}
  15119.  
  15120. Wenn man in einer Code-Zeile das benutzende Mnemonic ermitteln will, ist
  15121. das einfache Durchvergleichen mit allen vorhandenen Befehlen (wie es noch
  15122. in vielen Codegeneratoren aus Einfachheit und Faulheit passiert) nicht
  15123. unbedingt die effizienteste Variante.  In diesem Modul sind zwei
  15124. verbesserte Strukturen (Bin"arbaum und Hash-Tabelle) definiert, die eine
  15125. effizientere Suche erm"oglichen und die einfache lineare Suche nach und
  15126. nach abl"osen sollen...Priorit"at nach Bedarf...
  15127.  
  15128. \subsubsection{asmmac.c}
  15129.  
  15130. In diesem Modul finden sich die Routinen zur Speicherung und Abfrage von
  15131. Makros.  Der eigentliche Makroprozessor befindet sich (wie bereits
  15132. erw"ahnt) in {\tt as.c}.
  15133.  
  15134. \subsubsection{asmpars.c}
  15135.  
  15136. Hier geht es ins Eingemachte: In diesem Modul werden die Symboltabellen
  15137. (global und lokal) in zwei Bin"arb"aumen verwaltet.  Au"serdem findet sich
  15138. hier eine ziemlich gro"se Prozedur \tty{EvalExpression}, welche einen
  15139. (Formel-)ausdruck analysiert und auswertet.  Die Prozedur liefert das
  15140. Ergebnis (Integer, Gleitkomma oder String) in einem varianten Record zur"uck.
  15141. Zur Auswertung von Ausdr"ucken bei der Codeerzeugung sollten allerdings eher
  15142. die Funktionen \tty{EvalIntExpression, EvalFloatExpression} und
  15143. \tty{EvalStringExpression} verwendet werden.  "Anderungen zum Einf"ugen neuer
  15144. Prozessoren sind hier nicht erforderlich und sollten auch nur mit "au"serster
  15145. "Uberlegung erfolgen, da man hier sozusagen an ,,die Wurzel'' von \asname{} greift.
  15146.  
  15147. \subsubsection{asmsub.c}
  15148.  
  15149. Hier finden sich gesammelt einige h"aufig gebrauchte Unterroutinen, welche
  15150. in erster Linie die Bereiche Fehlerbehandlung und 'gehobene'
  15151. Stringverarbeitung abdecken.
  15152.  
  15153. \subsubsection{bpemu.c}
  15154.  
  15155. Wie am Anfang erw"ahnt, war \asname{} urspr"unglich ein in Borland-Pascal
  15156. geschriebenes Programm.  Bei einigen intrinsischen Funktionen des
  15157. Compilers war es einfacher, diese zu emulieren, anstatt alle betroffenen
  15158. Stelle im Quellcode zu "andern. Na ja...
  15159.  
  15160. \subsubsection{chunks.c}
  15161.  
  15162. Dieses Modul definiert einen Datentyp, mit dem eine Liste von
  15163. Adre"sbereichen verwaltet werden kann.  Diese Funktion wird von \asname{}
  15164. f"ur die Belegungslisten ben"otigt, au"serdem benutzten P2BIN und
  15165. P2HEX diese Listen, um vor "Uberlappungen zu warnen.
  15166.  
  15167. \subsubsection{cmdarg.c}
  15168.  
  15169. Dieses Modul implementiert den Mechanismus der Kommdozeilenparameter.  Es
  15170. ben"otigt eine Spezifikation der erlaubten Parameter, zerlegt die
  15171. Kommadozeile und ruft die entsprechenden Callbacks auf.  Der Mechanismus
  15172. leistet im einzelnen folgendes:
  15173. \begin{itemize}
  15174. \item{Mitbearbeitung von Optionen in einer Environment-Variablen oder
  15175.      entsprechenden Datei;}
  15176. \item{R"uckgabe einer Menge, welche die noch nicht bearbeiteten
  15177.      Kommandozeilenparameter beschreibt;}
  15178. \item{Trenunng von positiven und negativen Schaltern;}
  15179. \item{Eine Hintert"ur, falls die dar"uberliegende Entwicklungsumgebung die
  15180.      Kommandozeile nur in Gro"s- oder Kleinschreibung "ubergibt.}
  15181. \end{itemize}
  15182. Dieses Modul wird nicht nur von \asname{}, sondern auch von den Hilfsprogrammen
  15183. \tty{BIND, P2HEX und P2BIN} verwendet.
  15184.  
  15185. \subsubsection{codepseudo.c}
  15186.  
  15187. Hier finden sich Pseudobefehle, die von mehreren Codegeneratoren verwendet
  15188. werden.  Dies ist einmal die Intel-Gruppe mit der \tty{DB..DT}-Gruppe,
  15189. zum anderen die Pendants f"ur die 8/16-Bitter von Motorola oder Rockwell.
  15190. Wer in diesem Bereich um einen Prozessor erweitern will, kann mit einem
  15191. Aufruf den gr"o"sten Teil der Pseudobefehle erschlagen.
  15192.  
  15193. \subsubsection{codevars.c}
  15194.  
  15195. Aus Speicherersparnisgr"unden sind hier einige von diversen
  15196. Codegeneratoren benutzen Variablen gesammelt.
  15197.  
  15198. \subsubsection{endian.c}
  15199.  
  15200. Doch noch ein bi"schen Maschinenabh"angigkeit, jedoch ein Teil, um den man
  15201. sich nicht zu k"ummern braucht: Ob eine Maschine Little- oder
  15202. Big-Endianess benutzt, wird in diesem Modul beim Programmstart automatisch
  15203. bestimmt.  Weiterhin wird gepr"uft, ob die in {\tt sysdefs.h} gemachten
  15204. Typfestlegungen f"ur Integervariablen auch wirklich die korrekten L"angen
  15205. ergeben.
  15206.  
  15207. \subsubsection{headids.c}
  15208.  
  15209. Gesammelt sind hier alle von \asname{} unterst"utzten Zielprozessorfamilien, die
  15210. daf"ur in Code-Dateien verwendeten Kennzahlen (siehe Kapitel
  15211. \ref{SectCodeFormat}) sowie das von P2HEX defaultm"a"sig zu verwendende
  15212. Ausgabeformat.  Ziel dieser Tabelle ist es, Das Hinzuf"ugen eines neuen
  15213. Prozessors m"oglichst zu zentralisieren, d.h. es sind im Gegensatz zu
  15214. fr"uher keine weiteren Modifikationen an den Quellen der Hilfsprogramme
  15215. mehr erforderlich.
  15216.  
  15217. \subsubsection{ioerrs.c}
  15218.  
  15219. Hier ist die Umwandlung von Fehlernummern in Klartextmeldungen abgelegt.
  15220. Hoffentlich treffe ich nie auf ein System, auf dem die Nummern nicht als
  15221. Makros definiert sind, dann kann ich n"amlich dieses Modul komplett
  15222. umschreiben...
  15223.  
  15224. \subsubsection{nlmessages.c}
  15225.  
  15226. Die C-Version von \asname{} liest alle Meldungen zur Laufzeit aus Dateien, nachdem
  15227. die zu benutzende Sprache ermittelt wurde.  Das Format der
  15228. Nachrichtendateien ist kein einfaches, sondern ein spezielles, kompaktes,
  15229. vorindiziertes Format, das zur "Ubersetzungszeit von einem Programm namens
  15230. 'rescomp' (dazu kommen wir noch) erzeugt wird.  Dieses Modul ist das
  15231. Gegenst"uck zu rescomp, die den korrekten Sprachenanteil einer Datei in ein
  15232. Zeichenfeld einliest und Zugriffsfunktionen anbietet.
  15233.  
  15234. \subsubsection{nls.c}
  15235.  
  15236. In diesem Modul wird ermittelt, welche nationalen Einstellungen (Datums-
  15237. und Zeitformat, L"andercode) zur Laufzeit vorliegen.  Das ist leider eine
  15238. hochgradig systemspezifische Sache, und momentan sind nur drei Methoden
  15239. definiert: Die von MS-DOS, die von OS/2 und die typische Unix-Methode
  15240. "uber die {\em locale}-Funktionen.  F"ur alle anderen Systeme ist leider
  15241. \verb!NO_NLS! angesagt...
  15242.  
  15243. \subsubsection{stdhandl.c}
  15244.  
  15245. Zum einen ist hier eine spezielle open-Funktion gelandet, die die
  15246. Sonderstrings {\tt !0...!2} als Dateinamen kennt und daf"ur Duplikate der
  15247. Standard-Dateihandles {\em stdin, stdout} und {\em stderr} erzeugt, zum
  15248. anderen wird hier festgestellt, ob die Standardausgabe auf ein Ger"at oder
  15249. eine Datei umgeleitet wurde.  Das bedingt auf nicht-Unix-Systemen leider
  15250. auch einige Speziall"osungen.
  15251.  
  15252. \subsubsection{stringlists.c}
  15253.  
  15254. Dies ist nur ein kleiner ,,Hack'', der Routinen zur Verwaltung von linearen
  15255. Listen mit Strings als Inhalt definiert, welche z.B. im Makroprozessor von
  15256. \asname{} gebraucht werden.
  15257.  
  15258. \subsubsection{strutil.c}
  15259.  
  15260. Hier sind einige h"aufig genutzte String-Operationen gelandet.
  15261.  
  15262. \subsubsection{version.c}
  15263.  
  15264. Die momentan g"ultige Version ist f"ur \asname{} und alle anderen Hilfsprogramme
  15265. hier zentral gespeichert.
  15266.  
  15267. \subsubsection{code????.c}
  15268.  
  15269. Dies Module bilden den Hauptteil der \asname{}-Quellen: jedes Modul beinhaltet
  15270. den Codegenerator f"ur eine bestimmte Prozessorfamilie.
  15271.  
  15272. \subsection{Zus"atzliche Module f"ur die Hilfsprogramme}
  15273.  
  15274. \subsubsection{hex.c}
  15275.  
  15276. Ein kleines Modul zur Umwandlung von Integerzahlen in
  15277. Hexadezimaldarstellung.  In C nicht mehr unbedingt erforderlich (au"ser
  15278. zur Wandlung von {\em long long}-Variablen, was leider nicht alle {\tt
  15279. printf()}'s unterst"utzen), aber es ist im Rahmen der Portierung eben auch
  15280. stehengeblieben.
  15281.  
  15282. \subsubsection{p2bin.c}
  15283.  
  15284. Die Quellen von P2BIN.
  15285.  
  15286. \subsubsection{p2hex.c}
  15287.  
  15288. Die Quellen von P2HEX.
  15289.  
  15290. \subsubsection{pbind.c}
  15291.  
  15292. Die Quellen von BIND.
  15293.  
  15294. \subsubsection{plist.c}
  15295.  
  15296. Die Quellen von PLIST.
  15297.  
  15298. \subsubsection{toolutils.c}
  15299.  
  15300. Hier sind gesammelt die Unterroutinen, die von allen Hilfsprogrammen
  15301. ben"otigt werden, z.B. f"ur das Lesen von Code-Dateien.
  15302.  
  15303. \section{W"ahrend der Erzeugung von \asname{} gebrauchte Module}
  15304.  
  15305. \subsubsection{a2k.c}
  15306.  
  15307. Dies ist ein Minimalfilter, das ANSI-C-Files in Kernighan-Ritchie
  15308. umwandelt.  Um es genau zu sagen: es werden nur die Funktionsk"opfe
  15309. umgewandelt, und auch nur dann, wenn sie ungef"ahr so formatiert sind, wie
  15310. es mein Schreibstil eben ist.  Es komme also keiner auf die Idee, das
  15311. w"are ein universeller C-Parser!
  15312.  
  15313. \subsubsection{addcr.c}
  15314.  
  15315. Ein kleiner Filter, der bei der Installation auf DOS- oder OS/2-Systemen
  15316. gebraucht wird.  Da DOS und OS/2 den Zeilenvorschub mit CR/LF vornehmen,
  15317. Unix-Systeme jedoch nur mit LF, werden s"amtliche mitgelieferten
  15318. Assembler-Includes bei der Installation durch diesen Filter geschickt.
  15319.  
  15320. \subsubsection{bincmp.c}
  15321.  
  15322. F"ur DOS und OS/2 "ubernimmt dieses Modul die Funktion die Funktion des
  15323. {\em cmp}-Befehls, d.h. den bin"aren Vergleich von Dateien w"ahrend des
  15324. Testlaufes.  W"ahrend dies prinzipiell auch mit dem mitgelieferten {\em
  15325. comp} m"oglich w"are, hat {\em bincmp} keine l"astigen interaktiven
  15326. Abfragen (bei denen man erst einmal herausfinden mu"s, wie man sie auf
  15327. allen Betriebssystemversionen abstellt...)
  15328.  
  15329. \subsubsection{findhyphen.c}
  15330.  
  15331. Dies ist das Untermodul in {\em tex2doc}, da"s f"ur die Silbentrennung von
  15332. Worten sorgt.  Der verwendete Algorithmus is schamlos von TeX
  15333. abgekupfert.
  15334.  
  15335. \subsubsection{grhyph.c}
  15336.  
  15337. Die Definition der Silbentrennungsregeln f"ur die deutsche Sprache.
  15338.  
  15339. \subsubsection{rescomp.c}
  15340.  
  15341. Dies ist der 'Resourcencompiler' von \asname{}, d.h. das Werkzeug, das die
  15342. lesbaren Dateien mit Stringresourcen in ein schnelles, indiziertes Format
  15343. umsetzt.
  15344.  
  15345. \subsubsection{tex2doc.c}
  15346.  
  15347. Ein Werkzeug, da"s die LaTeX-Dokumentation von \asname{} in ein ASCII-Format
  15348. umsetzt.
  15349.  
  15350. \subsubsection{tex2html.c}
  15351.  
  15352. Ein Werkzeug, da"s die LaTeX-Dokumentation von \asname{} in ein HTML-Dokument
  15353. umsetzt.
  15354.  
  15355. \subsubsection{umlaut.c und unumlaut.c}
  15356.  
  15357. Diese Progr"ammchen besorgen die Wandlung zwischen Sonderzeichenkodierung
  15358. im ISO-Format (alle \asname{}-Dateien verwenden im Auslieferungszustand die
  15359. ISO8859-1-Kodierung f"ur Sonderzeichen) und Sonderzeichenkodierung im
  15360. systemspezifischen Format.  Neben einer Plain-ASCII7-Variante sind dies im
  15361. Augenblick die IBM-Zeichens"atze 437 und 850.
  15362.  
  15363. \subsubsection{ushyph.c}
  15364.  
  15365. Die Definition der Silbentrennungsregeln f"ur die englische Sprache.
  15366.  
  15367. %%---------------------------------------------------------------------------
  15368.  
  15369. \section{Generierung der Nachrichtendateien}
  15370.  
  15371. Wie bereits erw"ahnt, verwendet der C-Quellenbaum von \asname{} ein dynamisches
  15372. Ladeverfahren f"ur alle (Fehler-)Meldungen.  Gegen"uber den
  15373. Pascal-Quellen, in denen alle Meldungen in einem Include-File geb"undelt
  15374. waren und so in die Programme hinein"ubersetzt wurden, macht es dieses
  15375. Verfahren "uberfl"ussig, mehrere sprachliche Varianten von \asname{} zur
  15376. Verf"ugung zu stellen: es gibt nur noch eine Version, die beim
  15377. Programmstart die zu benutzende Variante ermittelt und aus den
  15378. Nachrichtendateien die entsprechende Komponente l"adt.  Kurz zur
  15379. Erinnerung: Unter DOS und OS/2 wird dazu die gew"ahlte {\tt
  15380. COUNTRY}-Einstellung zu Rate gezogen, unter Unix werden die
  15381. Environment-Variablen {\tt LC\_MESSAGES, LC\_ALL} und {\tt LANG} befragt.
  15382.  
  15383. \subsection{Format der Quelldateien}
  15384.  
  15385. Eine Quelldatei f"ur den Message-Compiler {\em rescomp} hat "ublicherweise
  15386. die Endung {\tt .res}.  Der Message-Compiler erzeugt aus dieser Datei ein
  15387. oder zwei Dateien:
  15388. \begin{itemize}
  15389. \item{eine bin"are Datei, die zur Laufzeit von \asname{} bzw. den Hilfsprogrammen
  15390.      gelesen wird;}
  15391. \item{optional eine weitere C-Header-Datei, die allen vorhandenen
  15392.      Nachrichten eine Indexnummer zuweist.  "Uber diese Indexnummern und
  15393.      eine Indextabelle in der bin"aren Datei kann zur Laufzeit schnell
  15394.      auf einzelne Meldungen zugegriffen werden.}
  15395. \end{itemize}
  15396.  
  15397. Die Quelldatei f"ur den Message-Compiler ist eine reine ASCII-Datei, also
  15398. mit jedem beliebigen Editor bearbeitbar, und besteht aus einer Reihe von
  15399. Steueranweisungen mit Parametern.  Leerzeilen sowie Zeilen, die mit einem
  15400. Semikolon beginnen, werden ignoriert.  Das Inkludieren anderer Dateien ist
  15401. "uber das {\tt Include}-Statement m"oglich:
  15402. \begin{verbatim}
  15403. Include <Datei>
  15404. \end{verbatim}
  15405.  
  15406. Am Anfang jeder Quelldatei m"ussen zwei Statements stehen, die die im
  15407. folgenden definierten Sprachen beschreiben.  Das wichtigere der beiden
  15408. Statements ist {\tt Langs}, z.B.:
  15409. \begin{verbatim}
  15410. Langs DE(049) EN(001,061)
  15411. \end{verbatim}
  15412. beschreibt, da"s zwei Sprachen im folgenden definiert werden.  Der erste
  15413. Nachrichtensatz soll benutzt werden, wenn unter Unix die Sprache per
  15414. Environment-Variablen auf {\tt DE} gestellt wurde bzw. unter DOS bzw. OS/2
  15415. der Landescode 049 eingestellt wurde.  Der zweite Satz kommt
  15416. dementsprechend bei den Einstellungen {\tt EN} bzw. 061 oder 001 zum
  15417. Einsatz.  W"ahrend bei den 'Telefonnummern' mehrere Codes auf einen
  15418. Nachrichtensatz verweisen k"onnen, ist die Zuordnung zu den
  15419. Unix-Landescodes eineindeutig.  Dies ist in der Praxis aber kein
  15420. Beinbruch, weil die {\tt LANG}-Variablen unter Unix Unterversionen einer
  15421. Sprache als Anh"angsel beschreiben, z.B. so:
  15422. \begin{verbatim}
  15423. de.de
  15424. de.ch
  15425. en.us
  15426. \end{verbatim}
  15427. \asname{} vergleicht nur den Anfang der Strings und kommt so trotzdem zur
  15428. richtigen Entscheidung.
  15429. Das {\tt Default}-Statement gibt vor, welcher Sprachensatz verwendet
  15430. werden soll, wenn entweder "uberhaupt keine Sprache gesetzt wurde oder
  15431. eine Kennung verwendet wird, die nicht in der Liste von {\tt Langs}
  15432. vorhanden ist.  Typischerweise ist dies Englisch:
  15433. \begin{verbatim}
  15434. Default EN
  15435. \end{verbatim}
  15436. Nach diesen beiden Definitionen folgt eine beliebige Menge von {\tt
  15437. Message}-Statements, d.h. Definitionen von Meldungen:
  15438. \begin{verbatim}
  15439. Message ErrName
  15440. ": Fehler "
  15441. ": error "
  15442. \end{verbatim}
  15443. Wurden {\em n} Sprachen im {\tt Langs}-Statement angek"undigt, so nimmt
  15444. der Message-Compiler {\bf genau} die folgenden {\em n} Zeilen als die zu
  15445. speichernden Strings.  Es ist also nicht m"oglich, bei einzelnen
  15446. Nachrichten bestimmte Sprachen fortzulassen, und eine auf die Strings
  15447. folgende Leerzeile ist keinesfalls als Endemarkierung f"ur die Liste
  15448. mi"szuverstehen; eingef"ugte Leerzeilen dienen einzig und allein der
  15449. besseren Lesbarkeit.  Was allerdings erlaubt ist, ist, einzelne Meldungen
  15450. "uber mehrere Zeilen in der Quelldatei zu verteilen; alle Zeilen bis auf
  15451. die letzte m"ussen dann mit einem Backslash als Fortsetzungszeichen enden:
  15452. \begin{verbatim}
  15453. Message TestMessage2
  15454. "Dies ist eine" \
  15455. "zweizeilige Nachricht"
  15456. "This is a" \
  15457. "two-line message"
  15458. \end{verbatim}
  15459. Wie bereits erw"ahnt, handelt es sich bei den Quelldateien um reine
  15460. ASCII-Dateien; Sonderzeichen k"onnen in den Meldungstexten zwar
  15461. eingetragen werden (und der Compiler wird sie auch so durchreichen), der
  15462. gravierende Nachteil ist aber, da"s eine solche Datei nicht mehr voll
  15463. portabel ist: Wird sie auf ein anderes System gebracht, das z.B. eine
  15464. andere Kodierung f"ur Umlaute verwendet, bekommt der Anwender zur Laufzeit
  15465. nur merkw"urdige Zeichen zu sehen...Sonderzeichern sollten daher immer mit
  15466. Hilfe von speziellen Sequenzen geschrieben werden, die von HTML bzw. SGML
  15467. entlehnt wurden (siehe Tabelle \ref{TabSpecChars}).  Zeilenvorsch"ube
  15468. k"onnen in eine Zeile wie von C her gewohnt mit \verb!\n! eingebracht
  15469. werden.
  15470. \begin{table*}[htb]
  15471. \begin{center}\begin{tabular}{|l|l|}
  15472. \hline
  15473. Sequenz... & ergibt... \\
  15474. \hline
  15475. \hline
  15476. \verb!&auml; &ouml; &uuml;! & "a "o "u (Umlaute)\\
  15477. \verb!&Auml; &Ouml; &Uuml;! & "A "O "U \\
  15478. \verb!&szlig;!              & "s (scharfes s) \\
  15479. \verb!&agrave; &egrave; &igrave; &ograve; &ugrave;! & \'a \'e \'i \'o \'u (Accent \\
  15480. \verb!&Agrave; &Egrave; &Igrave; &Ograve; &Ugrave;! & \'A \'E \'I \'O \'U grave) \\
  15481. \verb!&aacute; &eacute; &iacute; &oacute; &uacute;! & \`a \`e \`i \`o \`u (Accent \\
  15482. \verb!&Aacute; &Eacute; &Iacute; &Oacute; &Uacute;! & \`A \`E \`I \`O \`U agiu) \\
  15483. \verb!&acirc; &ecirc; &icirc; &ocirc; &ucirc;! & \^a \^e \^i \^o \^u (Accent \\
  15484. \verb!&Acirc; &Ecirc; &Icirc; &Ocirc; &Ucirc;! & \^A \^E \^I \^O \^U circonflex) \\
  15485. \verb!&ccedil; &Ccedil;! & \c{c} \c{C}(Cedilla) \\
  15486. \verb!&ntilde; &Ntilde;! & \~n \~N \\
  15487. \verb!&aring; &Aring;! & \aa  \AA \\
  15488. \verb!&aelig; &Aelig;! & \ae  \AE \\
  15489. \verb!&iquest; &iexcl;! & umgedrehtes ! oder ? \\
  15490. \hline
  15491. \end{tabular}\end{center}
  15492. \caption{Sonderzeichenschreibweise des {\em rescomp}\label{TabSpecChars}}
  15493. \end{table*}
  15494.  
  15495. %%---------------------------------------------------------------------------
  15496.  
  15497. \section{Dokumentationserzeugung}
  15498.  
  15499. In einer Quellcodedistribution von \asname{} ist diese Dokumentation nur als
  15500. LaTeX-Dokument enthalten.  Andere Formate werden aus dieser mit Hilfe von
  15501. mitgelieferten Werkzeugen automatisch erzeugt.  Zum einen reduziert dies
  15502. den Umfang einer Quellcodedistribution, zum anderen m"ussen "Anderungen
  15503. nicht an allen Formatversionen eines Dokumentes parallel vorgenommen
  15504. werden, mit all den Gefahren von Inkonsistenzen.
  15505.  
  15506. Als Quellformat wurde LaTeX verwendet, weil...weil...weil es eben schon
  15507. immer vorhanden war.  Zudem ist TeX fast beliebig portierbar und pa"st
  15508. damit recht gut zum Anspruch von \asname{}.  Eine Standard-Distribution erlaubt
  15509. damit eine 'ordentliche' Ausgabe auf so ziemlich jedem Drucker; f"ur eine
  15510. Konvertierung in die fr"uher immer vorhandene ASCII-Version liegt der
  15511. Konverter {\em tex2doc} bei; zus"atzlich einen Konverter {\em tex2html},
  15512. so da"s man die Anleitung direkt ins Internet stellen kann.
  15513.  
  15514. Die Erzeugung der Dokumentation wird mit einem schlichten
  15515. \begin{verbatim}
  15516. make docs
  15517. \end{verbatim}
  15518. angesto"sen; daraufhin werden die beiden erw"ahnten Hilfstools erzeugt,
  15519. auf die TeX-Dokumentation angewandt und schlu"sendlich wird noch LaTeX
  15520. selber aufgerufen.  Dies nat"urlich f"ur alle Sprachen nacheinander...
  15521.  
  15522. %%---------------------------------------------------------------------------
  15523.  
  15524. \section{Testsuite}
  15525.  
  15526. Da \asname{} mit bin"aren Daten von genau vorgegebener Struktur umgeht, ist er
  15527. naturgem"a"s etwas empfindlich f"ur System- und Compilerabh"angigkeiten.
  15528. Um wenigstens eine gewisse Sicherheit zu geben, da"s alles korrekt
  15529. durchgelaufen ist, liegt dem Assembler im Unterverzeichnis {\tt tests}
  15530. eine Menge von Test-Assemblerquellen bei, mit denen man den frisch
  15531. gebauten Assembler testen kann.  Diese Testprogramme sind in erster Linie
  15532. darauf getrimmt, Fehler in der Umsetzung des Maschinenbefehlssatzes zu
  15533. finden, die besonders gern bei variierenden Wortl"angen auftreten.
  15534. Maschinenunabh"angige Features wie der Makroprozessor oder bedingte
  15535. Assemblierung werden eher beil"aufig getestet, weil ich davon ausgehe,
  15536. da"s sie "uberall funktionieren, wenn sie bei mir funktionieren...
  15537.  
  15538. Der Testlauf wird mit einem einfachen {\em make test} angesto"sen.  Jedes
  15539. Testprogramm wird assembliert, in eine Bin"ardatei gewandelt und mit einem
  15540. Referenz-Image verglichen.  Ein Test gilt als bestanden, wenn Referenz und
  15541. die neu erzeugte Datei Bit f"ur Bit identisch sind.  Am Ende wird
  15542. summarisch die Assemblierungszeit f"ur jeden Test ausgegeben (wer will,
  15543. kann mit diesen Ergebnissen die Datei {\tt BENCHES} erg"anzen), zusammen
  15544. mit dem Erfolg oder Mi"serfolg.  Jedem Fehler ist auf den Grund zu gehen,
  15545. selbst wenn er bei einem Zielprozessor auftritt, den Sie nie nutzen
  15546. werden!  Es ist immer m"oglich, da"s dies auf einen Fehler hinweist, der
  15547. auch bei anderen Zielprozessoren auftritt, nur zuf"allig nicht in den
  15548. Testf"allen.
  15549.  
  15550. %%---------------------------------------------------------------------------
  15551.  
  15552. \section{Einh"angen eines neuen Zielprozessors}
  15553.  
  15554. Der mit Abstand h"aufigste Grund, im Quellcode von \asname{} etwas zu ver"andern,
  15555. d"urfte wohl die Erweiterung um einen neuen Zielprozessor sein.  Neben der
  15556. Erg"anzung der Makefiles um das neue Modul ist lediglich eine Modifikation
  15557. der Quellen an wenigen Stellen erforderlich, den Rest erledigt das neue
  15558. Modul, indem es sich in der Liste der Codegeneratoren registriert.  Im
  15559. folgenden will ich kochbuchartig die zum Einh"angen erforderlichen
  15560. Schritte beschreiben:
  15561.  
  15562. \subsubsection{Festlegung des Prozessornamens}
  15563.  
  15564. Der f"ur den Prozessor zu w"ahlende Name mu"s zwei Kriterien erf"ullen:
  15565. \begin{enumerate}
  15566. \item{Der Name darf noch nicht von einem anderen Prozessor belegt sein.
  15567.      Beim Aufruf von \asname{} ohne Parameter erh"alt man eine Liste der bereits
  15568.      vorhandenen Namen.}
  15569. \item{Soll der Prozessorname vollst"andig in der Variablen \tty{MOMCPU}
  15570.      auftauchen, so darf er au"ser am Anfang keine Buchstaben au"serhalb
  15571.      des Bereiches von A..F enthalten.  In der Variablen \tty{MOMCPUNAME}
  15572.      liegt aber zur Assemblierzeit immer der volle Name vor.
  15573.      Sonderzeichen sind generell nicht erlaubt, Kleinbuchstaben
  15574.      werden vom CPU-Befehl bei der Eingabe in Gro"sbuchstaben umgewandelt
  15575.      und sind daher auch nicht im Prozessornamen sinnvoll.}
  15576. \end{enumerate}
  15577.  
  15578. Der erste Schritt der Registrierung ist die Eintragung des Prozessors oder
  15579. der Prozessorfamilie in der Datei {\tt headids.c}.  Wie bereits erw"ahnt,
  15580. wird diese Datei von den Hilfsprogrammen mitbenutzt und spezifiziert die
  15581. einer Prozessorfamilie zugeordnete Kenn-ID in Codedateien sowie das zu
  15582. verwendende Hex-Format.  Bei der Wahl der Kenn-ID w"urde ich mir etwas
  15583. Absprache w"unschen...
  15584.  
  15585. \subsubsection{Definition des Codegeneratormoduls}
  15586.  
  15587. Das Modul, das f"ur den neuen Prozessor zust"andig sein soll, sollte einer
  15588. gewissen Einheitlichkeit wegen den Namen \tty{code....} tragen, wobei
  15589. \tty{.....} etwas mit dem Prozessornamen zu tun haben sollte.  Den Kopf
  15590. mit den Includes "ubernimmt man am besten direkt aus einem bereits
  15591. vorhandenen Codegenerator.
  15592.  
  15593. Mit Ausnahme einer Initialisierungsfunktion, die zu Anfang der {\tt
  15594. main()}-Funktion im Modul {\tt as.c} aufgerufen werden mu"s, braucht das
  15595. neue Modul keinerlei Funktionen oder Variablen zu exportieren, da die
  15596. ganze Kommunikation zur Laufzeit "uber indirekte Spr"unge abgewickelt
  15597. wird.  Die dazu erforderlichen Registrierungen m"ussen in der
  15598. Initialisierungsfunktion des Moduls vorgenommen werden, indem f"ur jeden
  15599. von der Unit zu behandelnden Prozessortyp
  15600. ein Aufruf der Funktion \tty{AddCPU} erfolgt:
  15601. \begin{verbatim}
  15602.   CPUxxxx = AddCPU("XXXX", SwitchTo_xxxx);
  15603. \end{verbatim}
  15604. \tty{'XXXX'} ist dabei der f"ur den Prozessor festgelegte Name, der sp"ater
  15605. im Assemblerprogramm verwendet werden mu"s, um \asname{} auf diesen Zielprozessor
  15606. umzuschalten.  \tty{SwitchTo\_xxxx} (im folgenden kurz als ,,Umschalter''
  15607. bezeichnet) ist eine parameterlose Prozedur, die von \asname{} aufgerufen wird,
  15608. sobald auf diesen Prozessor umgeschaltet werden soll.  Als Ergebnis liefert
  15609. \tty{AddCPU} eine Zahlenwert, der als interne ,,Kennung'' f"ur diesen Prozessor
  15610. fungiert.  In der globalen Variablen \tty{MomCPU} wird st"andig die Kennung
  15611. des momentan gesetzten Zielprozessors mitgef"uhrt.  Der von \tty{AddCPU}
  15612. gelieferte Wert sollte in einer privaten Variable des Typs \tty{CPUVar} (hier
  15613. \tty{CPUxxxx} genannt) abgelegt werden.  Falls ein Codegeneratormodul
  15614. verschiedene Prozessoren (z.B. einer Familie) verwaltet, kann es so
  15615. durch Vergleich von \tty{MomCPU} gegen diese Werte feststellen, welche
  15616. Befehlsuntermenge momentan zugelassen ist.
  15617. \par
  15618. Dem Umschalter obliegt es, \asname{} auf den neuen Zielprozessor ,,umzupolen''.
  15619. Dazu m"ussen im Umschalter einige globale Variablen besetzt werden:
  15620. \begin{itemize}
  15621. \item{\tty{ValidSegs} : Nicht alle Prozessoren definieren alle von \asname{}
  15622.      unterst"utzten Adre"sr"aume.  Mit dieser Menge legt man fest,
  15623.      welche Untermenge f"ur den jeweiligen Prozessor von \tty{SEGMENT}-Befehl
  15624.      zugelassen wird.  Im mindesten mu"s das Code-Segment freigeschaltet
  15625.      werden.  Die Gesamtmenge aller vorhandenen Segmenttypen kann in der
  15626.      Datei \tty{fileformat.h} nachgelesen werden (\tty{Seg}.....-Konstanten).}
  15627. \item{\tty{SegInits} : Dieses Feld speichert die initialen (ohne \tty{ORG}-Befehl)
  15628.      Startadressen in den einzelnen Segmenten.  Nur in Ausnahmef"allen
  15629.      (physikalisch "uberlappende, aber logisch getrennte Adre"sr"aume)
  15630.      sind hier andere Werte als 0 sinnvoll.}
  15631. \item{\tty{Grans} : Hiermit kann f"ur jedes Segment die Gr"o"se des kleinsten
  15632.      adressierbaren Elements in Bytes festgelegt werden, d.h. die
  15633.      Gr"o"se des Elements, f"ur das eine Adresse um eins erh"oht wird.
  15634.      Bei den allermeisten Prozessoren (auch 16 oder 32 Bit) ist dies
  15635.      ein Byte, nur z.B. Signalprozessoren und die PICs fallen aus dem
  15636.      Rahmen.}
  15637. \item{\tty{ListGrans} : Hiermit kann wieder f"ur alle Segmente getrennt
  15638.      festgelegt werden, in was f"ur Gruppen die Bytes im Assemblerlisting
  15639.      dargestellt werden sollen.  Beim 68000 sind z.B. Befehle immer
  15640.      ein mehrfaches von 2 Bytes lang, weshalb die entsprechende Variable
  15641.      auf 2 gesetzt ist.}
  15642. \item{\tty{SegLimits} : Dieses Feld legt die h"ochste Adresse f"ur jedes
  15643.      Segment fest, z.B. 65535 f"ur einen 16-Bit-Adre"sraum.  Dieses Feld
  15644.      braucht nicht ausgef"ullt zu werden, wenn der Codegenerator die {\tt
  15645.      ChkPC}-Methode selber "ubernimmt.}
  15646. \item{\tty{ConstMode} : Diese Variable kann die Werte \tty{ConstModeIntel},
  15647.      \tty{ConstModeMoto} oder \tty{ConstModeC} haben und bestimmt, in
  15648.      welcher Form Zahlensysteme bei Integerkonstanten spezifiziert werden
  15649.      sollen (sofern das Programm nicht vom Relaxed-Modus Gebrauch macht).}
  15650. \item{\tty{PCSymbol} : Diese Variable enth"alt den String, mit dem aus dem
  15651.      Assembler-Programm heraus der momentane Stand des Programmz"ahlers
  15652.      abgefragt werden kann.  F"ur Intel-Prozessoren ist dies z.B. ein
  15653.      Dollarzeichen.}
  15654. \item{\tty{TurnWords} : Falls der Prozessor ein Big-Endian-Prozessor sein
  15655.      sollte und eines der Elemente von \tty{ListGrans} ungleich eins ist,
  15656.      sollte dieses Flag auf True gesetzt werden, um korrekte Code-Dateien
  15657.      zu erhalten.}
  15658. \item{\tty{SetIsOccupiedFnc} : Einige Prozessoren verwenden \tty{SET} als
  15659.      Maschinenbefehl.  Ist dieser Callback gesetzt, so kann der Codegenerator
  15660.      dar"uber melden, da"s \tty{SET} nicht als Pseudo-Befehl interpretiert
  15661.      werden soll.  Der R"uckgabewert kann konstant \tty{True} sein, die
  15662.      Entscheidung kann aber auch z.B. anhand der Anzahl der Argumente fallen.}
  15663. \item{\tty{HeaderID} : Dieses Byte enth"alt die Kennung, mit der in der Codedatei
  15664.      die Prozessorfamilie gekennzeichnet wird (siehe Abschnitt
  15665.      \ref{SectCodeFormat}).  Um Zweideutigkeiten zu vermeiden,
  15666.      bitte ich, den Wert mit mir abzusprechen.  Bis auf weiteres sollten
  15667.      keine Werte au"serhalb des Bereiches \$01..\$7f benutzt werden,
  15668.      diese sind f"ur Sonderzwecke (wie z.B. eine zuk"unftige Erweiterung
  15669.      um einen Linker) reserviert.  Auch wenn dieser Wert in den meisten
  15670.      "alteren Codegeneratoren hart gesetzt wird, ist es die heute
  15671.      bevorzugte Methode, den Wert aus {\tt headids.h} per {\tt
  15672.      FindFamilyByName} zu holen.}
  15673. \item{\tty{NOPCode} : In bestimmten Situationen kann es sein, da"s \asname{} unbenutzte
  15674.      Bereiche im Code mit NOPs auff"ullen mu"s.  Diese Variable beinhaltet
  15675.      den dazu erforderlichen Code.}
  15676. \item{\tty{DivideChars} : Dieser String enth"alt all jene Zeichen, die als
  15677.      Trennzeichen f"ur die Parameter eines Assemblerbefehls zugelassen
  15678.      sind.  Nur f"ur extreme Ausrei"ser (wie den DSP56) sollte sich in
  15679.      diesem String etwas anderes finden als ein Komma.}
  15680. \item{\tty{HasAttrs} : Einige Prozessoren wie die 68k-Reihe teilen einen
  15681.      Maschinenbefehl durch einen Punkt noch weiter in Mnemonic und
  15682.      Attribut auf.  Ist dies beim neuen Prozessor auch der Fall, so
  15683.      ist dieses Flag auf True zu setzen.  \asname{} liefert dann die Einzelteile
  15684.      in den Variablen \tty{OpPart} und \tty{AttrPart}.  Setzt man es
  15685.      dagegen auf False, so bleibt der Befehl in \tty{OpPart} zusammen,
  15686.      und \tty{AttrPart} ist immer leer.  Sofern der Prozessor keine
  15687.      Attribute verwendet, sollte man \tty{HasAttrs} auf jeden Fall auf False
  15688.      setzen, da man sich sonst die M"oglichkeit nimmt, Makros mit einem
  15689.      Punkt im Namen (z.B. zur Emulation anderer Assembler) zu definieren.}
  15690. \item{\tty{AttrChars} : Falls \tty{HasAttrs} gesetzt wurde, m"ussen in diesem
  15691.      String alle Zeichen eingetragen werden, die das Attribut vom Befehl
  15692.      trennen k"onnen.  Meist ist dies nur der Punkt.}
  15693. \end{itemize}
  15694. Gehen Sie nicht davon aus, da"s eine dieser Variablen einen vordefinierten
  15695. Wert hat, sondern besetzen Sie \bb{ALLE} Felder neu!!
  15696.  
  15697. Neben diesen Variablen m"ussen noch einige Funktionszeiger besetzt wird,
  15698. mit denen der Codegenerator sich in \asname{} einbindet:
  15699. \begin{itemize}
  15700. \item{\tty{MakeCode} : Diese Routine wird nach der Zerlegung einer Zeile
  15701.      in Mnemonic und Parameter aufgerufen.  Das Mnemonic liegt in der
  15702.      Variablen \tty{OpPart}, die Parameter in dem Feld \tty{ArgStr}.
  15703.      Die Zahl der Parameter kann aus der Variablen \tty{ArgCnt} ausgelesen
  15704.      werden.  Das bin"are Ergebnis mu"s in dem Byte-Feld \tty{BAsmCode}
  15705.      abgelegt werden, dessen L"ange in der Variablen \tty{CodeLen}.  Falls
  15706.      der Prozessor wortorientiert wie der 68000 oder viele Signalprozessoren
  15707.      ist, kann Feld auch wortweise als \tty{WAsmCode} adressiert werden.
  15708.      F"ur ganz extreme F"alle gibt es auch noch \tty{DAsmCode}... Die
  15709.      Codel"ange wird ebenfalls in solchen Einheiten angegeben.}
  15710. \item{\tty{SwitchFrom}: Diese parameterlose Prozedur erlaubt dem
  15711.      Codegeneratormodul, noch ,,Aufr"aumarbeiten'' durchzuf"uhren,
  15712.      wenn auf einen anderen Zielprozessor umgeschaltet wird.  So
  15713.      kann man an dieser Stelle z.B. Speicher freigeben, der im
  15714.      Umschalter belegt wurde und nur ben"otigt wird, w"ahrend dieses
  15715.      Codegeneratormodul aktiv ist.  Im einfachsten Fall zeigt diese
  15716.      Prozedurvariable auf eine leere Prozedur.  Ein Beispiel f"ur die
  15717.      Anwendung dieser Prozedur finden Sie im Modul \tty{CODE370}, das
  15718.      seine Codetabellen dynamisch erzeugt und wieder freigibt.}
  15719. \item{\tty{IsDef} : Bestimmte Prozessoren kennen neben \tty{EQU} noch weitere
  15720.      Pseudobefehle, bei denen ein in der ersten Spalte stehender
  15721.      Symbolname kein Label darstellt, z.B. \tty{BIT} beim 8051.  Diese
  15722.      Funktion mu"s TRUE zur"uckliefern, falls ein solcher, zus"atzlicher
  15723.      Befehl vorliegt.  Im einfachsten Fall braucht nur FALSE
  15724.      zur"uck geliefert zu werden.}
  15725. \end{itemize}
  15726.  
  15727. Optional kann ein Codegenerator auch noch folgende weitere Funktionszeiger
  15728. besetzen:
  15729. \begin{itemize}
  15730. \item{\tty{ChkPC} : Obwohl \asname{} die Programmz"ahler intern durchg"angig mit
  15731.      32 oder 64 Bit verwaltet, benutzen die meisten Prozessoren nur einen
  15732.      kleineren Adre"sraum.  Diese Funktion liefert \asname{} Informationen, ob
  15733.      der momentane Programmz"ahler den erlaubten Bereich "uberschritten
  15734.      hat.  Bei Prozessoren mit mehreren Adre"sr"aumen kann diese Routine
  15735.      nat"urlich deutlich komplizierter ausfallen.  Ein Beispiel daf"ur
  15736.      findet sich z.B. im Modul \tty{code16c8x.c}.  Falls alles in Ordnung ist,
  15737.      mu"s die Funktion TRUE zur"uckliefern, ansonsten FALSE.
  15738.      Diese Funktion mu"s ein Codegenerator nur implementieren, wenn er
  15739.      das Feld {\tt SegLimits} nicht belegt.  Das kann z.B. notwendig
  15740.      werden, wenn der g"ultige Adre"sbereich eines Segments nicht
  15741.      zusammenh"angend ist.}
  15742. \item{\tty{InternSymbol} : Manche Prozessoren, z.B. solche mit einer
  15743.      Registerbank im internen RAM, defineren diese 'Register' als Symbole
  15744.      vor, und es w"urde wenig Sinn machen, diese in einer separaten
  15745.      Include-Datei mit 256 oder m"oglicherweise noch mehr {\tt EQU}s
  15746.      zu definieren.  Mit dieser Funktion erh"alt man Zugang zum Formel-
  15747.      Parser von \asname{}: Sie erh"alt den Ausdruck als ASCII-String, und wenn
  15748.      sie eines der 'eingebauten Symbole' erkennt, besetzt sie die
  15749.      "ubergebene Struktur des Typs {\em TempResult} entsprechend.  Falls
  15750.      die "Uberpr"ufung nicht erfolgreich war, mu"s deren Element {\tt
  15751.      Typ} auf {\tt TempNone} gesetzt werden.  Die Routine sollte im
  15752.      Falle eines Mi"serfolges {\em keine} Fehlermeldungen ausgeben, weil
  15753.      dies immer noch anderweitig g"ultige Symbole sein k"onnen.  Seien
  15754.      Sie extrem vorsichtig mit dieser Routine, da sie einen Eingriff in
  15755.      den Parser darstellt!}
  15756. \item{\tty{DissectBit} : Falls die Zielplattform Bit-Objekte unterst"utzt,
  15757.      d.h. Objekte, die sowohl eine Register/Speicheradresse als auch eine
  15758.      Bitposition in einer einzelnen Integer-Zahl gepackt abspeichern, ist
  15759.      dies der Callback, "uber den solche gepackten Objekte f"urs Listing
  15760.      wieder in eine Quellcode-artige Form r"uck"ubersetzt werden.}
  15761. \item{\tty{DissectReg} : Falls die Zielplattform Registersymbole unterst"utzt,
  15762.      ist dies der Callback, "uber den Registernummer und -l"ange f"urs Listing
  15763.      wieder in eine Quellcode-artige Form r"uck"ubersetzt werden.
  15764.      Falls Registersymbole unterst"utzt werden, ist "ublicherweise auch
  15765.      der \tty{InternSymbol}-Callback auszuf"ullen.}
  15766. \item{\tty{QualifyQuote} : "Uber diesen optionalen Callback kann f"ur
  15767.      eine bestimmte Zielplattform von Fall zu Fall festgelegt werden, da"s
  15768.      ein einzelnes Hochkomma {\em keine} Zeichenkette einleitet.  Ein
  15769.      Beispiel daf"ur ist die als \tty{AF'} geschriebene alternative
  15770.      Registerbank beim Z80, oder die Hexadezimal-Syntax \tty{H'...} bei
  15771.      manchen Hitachi-Prozessoren.}
  15772. \end{itemize}
  15773.  
  15774. Wer will, kann sich "ubrigens auch mit einem Copyright-Eintrag verewigen,
  15775. indem er in der Initialisierung des Moduls (bei den \tty{AddCPU}-Befehlen)
  15776. einen Aufruf der Prozedur \tty{AddCopyright} einf"ugt, in der folgenden
  15777. Art:
  15778. \begin{verbatim}
  15779.    AddCopyright("Intel 80986-Codegenerator (C) 2010 Hubert Simpel");
  15780. \end{verbatim}
  15781. Der "ubergebene String wird dann nach dem Programmstart zus"atzlich zu
  15782. der Standardmeldung ausgegeben.
  15783.  
  15784. Bei Bedarf kann sich das Modul im Initialisierungsteil noch in die
  15785. Kette aller Funktionen eintragen, die vor Beginn eines Durchlaufes
  15786. durch den Quelltext ausgef"uhrt werden.  Dies ist z.B. immer dann der
  15787. Fall, wenn die Code-Erzeugung im Modul abh"angig vom Stand bestimmter,
  15788. durch Pseudobefehle beeinflu"sbarer Flags ist.  Ein h"aufig auftretender
  15789. Fall ist z.B., da"s ein Prozessor im User- oder Supervisor-Modus
  15790. arbeiten kann, wobei im User-Modus bestimmte Befehle gesperrt
  15791. sind.  Im Assembler-Quelltext k"onnte dieses Flag, das angibt, in welchem
  15792. Modus der folgende Code ausgef"uhrt wird, durch einen Pseudobefehl
  15793. umgeschaltet werden.  Es ist aber dann immer noch eine Initialisierung
  15794. erforderlich, die sicherstellt, da"s in allen Durchl"aufen ein identischer
  15795. Ausgangszustand vorliegt.  Der "uber die Funktion \tty{AddInitPassProc}
  15796. angebotene Haken bietet die M"oglichkeit, derartige Initialisierungen
  15797. vorzunehmen.  Die "ubergebene Callback-Funktion wird vor Beginn
  15798. eines Durchgangs aufgerufen.
  15799.  
  15800. Analog zu \tty{AddInitPassProc} funktioniert die "uber \tty{AddCleanUpProc}
  15801. aufgebaute Funktionsliste, die es den Codegeneratoren erlaubt, nach dem
  15802. Abschlu"s der Assemblierung noch Aufr"aumarbeiten (z.B. das Freigeben von
  15803. Literaltabellen o."a.) durchzuf"uhren.  Dies ist sinnvoll, wenn mehrere
  15804. Dateien mit einem Aufruf assembliert werden, sonst h"atte man noch
  15805. ,,M"ull'' aus einem vorigen Lauf in den Tabellen.  Momentan nutzt kein
  15806. Modul diese M"oglichkeit.
  15807.  
  15808. \subsubsection{Schreiben des Codegenerators selber}
  15809.  
  15810. Nach diesen Pr"aliminarien ist nun endlich eigene Kreativit"at gefragt:
  15811. Wie Sie es schaffen, aus dem Mnemonic und den Argumenten die Code-Bytes zu
  15812. erzeugen, ist weitgehend Ihnen "uberlassen.  Zur Verf"ugung stehen daf"ur
  15813. nat"urlich "uber den Formelparser die Symboltabellen sowie die Routinen
  15814. aus
  15815. \tty{asmsub.c} und \tty{asmpars.c}.  Ich kann hier nur einige generelle
  15816. Hinweise geben:
  15817. \begin{itemize}
  15818. \item{Versuchen Sie, die Prozessorbefehle in Gruppen aufzusplitten, die
  15819.      gleiche Operanden erwarten und sich nur in einigen Kennbits
  15820.      unterscheiden.  Alle argumentlosen Befehle kann man z.B. so in einer
  15821.      Tabelle abhandeln.}
  15822. \item{Die meisten Prozessoren haben ein festes Repertoire von
  15823.      Adressierungsarten.  Verlagern Sie das Parsing eines Adre"sausdrucks
  15824.      in eine getrennte Unterroutine.}
  15825. \item{Die Routine \tty{WrError} definiert eine Vielzahl von m"oglichen
  15826.      Fehlermeldungen und ist bei Bedarf leicht erweiterbar.  Nutzen Sie
  15827.      das!  Bei allen Fehler nur lapidar einen ,,Syntaxfehler'' zu melden,
  15828.      n"utzt niemandem!}
  15829. \end{itemize}
  15830. Mit Sicherheit wird auch das Studium der vorhandenen Module weiterhelfen.
  15831.  
  15832. \subsubsection{"Anderungen f"ur die Dienstprogramme}
  15833.  
  15834. Eine winzige "Anderung ist auch noch an den Quellen der Dienstprogramme
  15835. n"otig, und zwar in der Routine {\tt Granularity()} in {\tt toolutils.c}:
  15836. Falls eines der Adre"sr"aume dieses Prozessors eine andere Granularit"at
  15837. als 1 hat, mu"s dort die Abfrage passend erg"anzt werden, sonst verz"ahlen
  15838. sich PLIST, P2BIN und P2HEX...
  15839.  
  15840. %%---------------------------------------------------------------------------
  15841.  
  15842. \section{Lokalisierung auf eine neue Sprache}
  15843.  
  15844. Sie haben Interesse an diesem Thema?  Wunderbar!  Das ist eine Sache, die
  15845. von Programmierern gerne au"sen vor gelassen wird, insbesondere, wenn sie
  15846. aus dem Land der unbegrenzten M"oglichkeiten kommen...
  15847.  
  15848. Die Lokalisierung auf eine neue Sprache gliedert sich in zwei Teile: Die
  15849. Anpassung der Programmmeldungen sowie die "Ubersetzung der Anleitung.
  15850. Letzteres ist sicherlich eine Aufgabe herkulischen Ausma"ses, aber die
  15851. Anpassung der Programmeldungen sollte in ein bis zwei Nachmittagen "uber
  15852. die B"uhne zu bekommen sein, wenn man sowohl die neue als auch eine der
  15853. bisher vorhandenen Sprachen gut kennt.  Leider ist die "Ubersetzung auch
  15854. nichts, was man St"uck f"ur St"uck machen kann, denn der
  15855. Ressourcencompiler kann im Moment nicht mit einer variablen Zahl von
  15856. Sprachen in den verschiedenen Meldungen umgehen, es hei"st also 'alles
  15857. oder nichts'.
  15858.  
  15859. Als erstes erg"anzt man in {\tt header.res} die neue Sprache.  Die f"ur
  15860. die Sprache passende zweibuchstabige Abk"urzung holt man sich vom
  15861. n"achsten Unix-System (wenn man nicht ohnehin darauf arbeitet...), die
  15862. internationale Vorwahl aus dem n"achsten DOS-Handbuch.
  15863.  
  15864. Im zweiten Schritt geht man jetzt durch alle anderen {\tt .res}-Dateien
  15865. und erg"anzt die {\tt Message}-Statements.  Nocheinmal sei darauf
  15866. hingewiesen, Sonderzeichen in der HTML-artigen Schreibweise und nicht
  15867. direkt einzusetzen!
  15868.  
  15869. Wenn dies geschafft ist, kann man mit einem {\em make} alle betroffenen
  15870. Teile neu bauen und erh"alt danach einen Assembler, der eine Sprache mehr
  15871. schickt.  Bitte nicht vergessen, die Ergebnisse an mich weiterzuleiten,
  15872. damit mit der n"achsten Release alle etwas davon haben :-)
  15873.  
  15874. %%===========================================================================
  15875.  
  15876. \cleardoublepage
  15877.  
  15878. \begin{thebibliography}{99}
  15879.  
  15880. \input{../doc_COM/biblio.tex}
  15881.  
  15882. \end{thebibliography}
  15883.  
  15884. \cleardoublepage
  15885.  
  15886. \begin{quote}{\it
  15887. ''Ich schlage vor, dem Parlament ein Gesetz vorzulegen, \\
  15888. das einem Autor, der ein Buch ohne Index publiziert, \\
  15889. das Copyright entzieht und ihn au"serdem f"ur sein Vergehen \\
  15890. mit einer Geldstrafe belegt.''\\
  15891. \hspace{2cm} --Lord John Campbell}\end{quote}
  15892.  
  15893. \printindex
  15894.  
  15895. \end{document}
  15896.  
  15897.