home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_07 / IDEAL.ZIP / IDEAL / IDEAL.DOC next >
Text File  |  1988-01-17  |  49KB  |  979 lines

  1. 07201030303800
  2. 1
  3. 2
  4. F0110030
  5. 9[...................................................]001
  6. Ç.end    ;Anleitung zum I ntegrierten
  7.                        D ebugger
  8.                        E ditor
  9.                        A ssembler
  10.                        L inker
  11.  
  12.          diese Anleitung können Sie neben Ihrem Programm im Speicher halten:
  13.          - mit [HOME] [HOME] an das Ende Ihres Programmtextes gehen
  14.          - noch eine Zeile runter (Cursortasten)
  15.          - mit LOAD BLOCK (Tasten [SHIFT]-[F7] [SHIFT]-[F8]) Anleitung
  16.            hinzuladen  -  erscheint in Negativschrift
  17.  
  18.  
  19. *** DER DEBUGGER
  20.     ------------
  21.  
  22. Im normalen Arbeitsablauf des Programmierens in Assembler ist das "Debuggen"
  23. (übersetzt: entkäfern, als "bug" wird ein Programmfehler bezeichnet) der letzte
  24. Schritt. Allerdings ist der Zeitaufwand für das Debuggen enorm: bis zu 70% der
  25. gesamten Programmierzeit gehen für das Debuggen "drauf" - einer der wesentlich-
  26. sten Vorteile einer hohen Programmiersprache ist es, da₧ diese Zeit drastisch
  27. verkürzt wird.
  28. Aus diesem Grund ist ein Debugger ein sehr wichtiges Teilstück eines Assembler-
  29. entwicklungspaketes. Der Debugger im IDEAL zählt zu den leistungsfähigsten
  30. am Markt.
  31.  
  32. Im Debugger landen Sie automatisch nach dem Starten des IDEAL-Paketes. Unter der
  33. Startmeldung steht eine Zahl (z.B. $78cd4). Diese Zahl stellt die erste freie,
  34. benutzbare Adresse hinter dem IDEAL-Paket dar, und ist ein Vorschlag des De-
  35. buggers an Sie, ab dieser Adresse zu programmieren. Sie müssen diesem Vorschlag
  36. nicht folgen, es ist leicht möglich, die Adresse abzuändern:
  37. Fahren Sie mit der Taste "Cursor links" auf die Adresse 78cd4 und ändern Sie
  38. auf die gewünschte andere Adresse (nehmen wir einmal 70000) ab. Den Doppelpunkt,
  39. der nach der Adresse folgt, dürfen Sie dabei nicht überschreiben.
  40. Jetzt wollen wir die ersten Befehle des Debuggers ausprobieren. Als Beispiel
  41. nehmen wir einen Befehl, den jeder Debugger hat: den DUMP-Befehl. DUMP gibt
  42. einen Speicherbereich in hexadezimaler Form und zusätzlich als ASCII aus.
  43. Probieren Sie es einfach aus. Geben Sie in die Zeile, wo schon unsere geänderte
  44. Adresse 70000 steht, zusätzlich noch D 70000 ein und drücken Sie RETURN. (Dabei
  45. ist es unerheblich, ob Sie ein gro₧es oder ein kleines D verwenden). IDEAL gibt
  46. jetzt einen Bildschirm voll "Hexdump" aus: am Anfang der Zeile sehen Sie Adres-
  47. sen (die Zeile auf dem Bildschirm enthält die Inhalte der 16 Bytes, die ab dieser
  48. Adresse folgen), dann die Inhalte der Speicherzellen, und zum Schlu₧ die 16
  49. Bytes nochmals, und zwar diesmal in ASCII-Form.
  50. Wenn Sie sich nur für die Speicherzellen 70000-70040 interessieren, müssen Sie
  51. das dem DUMP-Befehl mitteilen. Geben Sie in diesem Fall folgendes ein:
  52. D 70000,70040 (CR)
  53. In diesem Fall werden nur noch die Speicherstellen $70000-$70040 ausgegeben.
  54. Nehmen wir einmal an, Sie haben im Speicherbereich $70000-$70040 einen Daten-
  55. satz Ihres Programms mit Bestellnummer, Preis, Lagerbestand etc.
  56. Wenn Sie jetzt den Inhalt dieses Speicherbereichs ändern wollen, entweder, weil
  57. er durch einen Programmfehler falsch ist und Sie "reparieren" wollen, oder weil
  58. Sie wissen wollen, wie Ihr Programm auf solch geänderte Daten reagiert, können
  59. Sie mit dem IDEAL wie folgt vorgehen:
  60.          Benutzen Sie die Cursortasten, um an diejenige Stelle im Hexdump zu
  61. kommen, die Sie ändern wollen, ändern Sie im Hexdump die falschen Bytes ab, und
  62. drücken Sie zur Bestätigung (CR)- schon wird die ganze geänderte Zeile in den
  63. Speicher geschrieben, und die Änderung ist damit ausgeführt. Die Möglichkeit,
  64. mit den Cursortasten auf dem Bildschirm herumfahren zu können und durch Druck
  65. auf (CR) die Zeile, in der der Cursor steht, übernehmen zu können, nennt man
  66. "Screen-Editing".
  67. Wenn Sie nur ein einziges Byte im Speicher (z.B.die Adresse $74000 auf $ff) ab-
  68. Çändern wollen, ist es umständlich, zuerst D 74000 (CR) einzugeben, und dann mit
  69. dem Cursor in die erste Zeile zu fahren und (CR) zu drücken. Es geht auch ein-
  70. facher:
  71. -ändern Sie die Adresse, die am Anfang der Cursorzeile steht, auf $74000:
  72. -tippen Sie "," zum Zeichen, da₧ jetzt ein Dump kommt
  73. -und geben Sie dann das Byte (oder die Bytefolge, getrennt durch Kommata) ein,
  74.  das Sie ändern wollen, in unserem Beispiel: $ff oder nur FF. (Zahlen ohne An-
  75.  gabe irgendeiner Zahlbasis werden im Debugger als Hex-Zahlen behandelt).
  76. Wenn Sie sich ein Dump auf den Bildschirm geben lassen, werden Sie erkennen,
  77. da₧ jeweils hinter Adresse und Doppelpunkt (der steht immer da und dient
  78. zur Kennzeichnung "hier hört die Adresse auf") ein Komma steht. Dieses Komma
  79. sagt dem Debugger beim Einlesen der Zeile, da₧ die nun folgenden Daten in den
  80. Speicher geschrieben werden sollen.
  81. Warnung!
  82. Die Information in ASCII, die nach jeder Dumpzeile ausgegeben wird, ist nur
  83. informativ, d.h., Änderungen in der ASCII-Information werden bei (CR) nicht in
  84. den Speicher übernommen!
  85. Dennoch ist der Dump-Befehl in der Lage, Informationen auch in ASCII auszuwerten.
  86. Die Unterscheidung, ob die ASCII-Information nur informativ oder aber in den
  87. Speicher zu übernehmen ist, geschieht anhand des Kommas: wenn vor der ASCII-
  88. Information ein Komma ist, wird sie in den Speicher übernommen, ist keines davor,
  89. nicht. Das klingt vielleicht kompliziert, ist es aber nicht, wie die folgenden
  90. Beispiele zeigen:
  91. $74000:,54,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55   "TUUUUUUUUUUUUUUU"
  92. Das ist ein normales Dump, wie es vom D-Befehl ausgegeben wird. Die ASCII-
  93. Information ist informativ, weil hinter der letzten 00 kein Komma mehr steht.
  94. Wenn Sie dort ein Komma einsetzen, werden insgesamt 32 Bytes übernommen, nämlich
  95. die 16 Bytes in Hexzahlen, die am Anfang stehen, und dann die 16 Byte ASCII-In-
  96. formation (nochmal das Gleiche). Diese Fähigkeit können Sie dazu ausnützen,
  97. Zeilen auch in gemischter Form einzugeben, etwa so:
  98. $74000:,80,"ich",0,"bin",0,"intelligent",0,"!",0
  99.  
  100. Am Beispiel des DUMP-Befehls haben wir Ihnen jetzt den allgemeinen Umgang mit
  101. dem Debugger erläutert. Wir wollen jetzt voll in die Materie einsteigen, und
  102. fangen deshalb mit den Zahlensystemen an.
  103. Im IDEAL können Sie an fast allen Stellen Zahlen oder Argumente in verschiedenen
  104. Zahlensystemen eingeben. So ist es in vielen Fällen praktisch, Zahlargumente
  105. nicht nur in Hexadezimal, sondern auch im üblichen Zehnersystem eingeben zu
  106. können. IDEAL erlaubt die Eingabe von Zahlen und Argumenten in Hexadezimal,
  107. Dezimal, Oktal, Binär und ASCII. Um zu kennzeichnen, in welchem Zahlensystem
  108. ein Argument gedacht ist (so kann das Zeichen "1" jedem der oben beschriebenen
  109. Zahlsysteme angehören), müssen Sie ein Kennzeichen davorsetzen. Diese Kennzeichen
  110. sind wie folgt:
  111. $ (oder gar nichts) für Hexadezimal
  112. . für Dezimal
  113. @ für Oktal
  114. % für Binär
  115. "" für ASCII (hier kann oft auch das '-Zeichen verwendet werden)
  116. So bedeutet die Zahl .10000 dezimal zehntausend, %101 steht für dezimal 5,und
  117. 10000 steht für hexadezimal 10000 (65536 dezimal).
  118.  
  119. Es folgt eine Auflistung der Debuggerbefehle:
  120. *-Befehl
  121. Um die Adresse zu ändern, an der Sie gerade sind (diejenige Adresse, die bei
  122. einem (CR) in einer leeren Zeile ausgegeben wird), haben Sie, wie bereits be-
  123. kannt, die Möglichkeit, diese Zahl auf dem Bildschirm zu ändern. Es ist aber
  124. auch möglich, das mit Hilfe des *-Befehls zu erreichen. Die Syntax ist einfach:
  125. * <neue Adresse>
  126.  
  127. A-Befehl
  128. Der A-Befehl ruft den eingebauten Two-Pass-Assembler des IDEAL auf. Zuerst mu₧
  129. im Editor ein Sourcecode erstellt werden, der dann mit Hilfe des A-Befehls
  130. Çübersetzt wird. Die genaue Erklärung kommt im "ASSEMBLER"-Teil dieser Anleitung.
  131.  
  132. B-Befehl (Breakpoints)
  133. Der Debugger gestattet das Setzen von insgesamt 7 verschiedenen sog. Breakpoints.
  134. Das sind Stellen, an denen die Programmausführung stoppt, die Register ausge-
  135. geben werden, und der Benutzer analysieren kann, was geschehen ist. Der B-Befehl
  136. gibt die momentanen Inhalte der Breakpoints aus, lä₧t Änderungen zu oder löscht
  137. alle Breakpoints. Die Syntax ist:
  138. B   -gibt alle Breakpoints auf dem Bildschirm aus
  139. B C - löscht alle Breakpoints
  140. B <Breakpointnummer> : <n>         -setzt einen Breakpoint auf Adresse <n>
  141.  
  142. C-Befehl (Call a Subroutine  -  Aufrufen eines Unterprogramms)
  143. Der C-Befehl entspricht im Wesentlichen dem bekannten GO-Befehl der meisten
  144. Debugger. Er ruft ein Maschinenprogramm auf. Die einfachste Syntax ist:
  145. C <Adresse>
  146. In diesem Fall wird das Assemblerprogramm ab der Adresse <Adresse> ausgeführt.
  147. Achtung! Die Kontrolle über das Geschehen im Rechner wird auf diese Weise dem
  148. aufgerufenen Programm überlassen - dieses kann, ohne da₧ der Debugger das ver-
  149. hindern kann, den Rechner zum Abstürzen bringen, das GEM (wenn es im RAM steht)
  150. mit Nullen überschreiben oder Ähnliches.
  151. Beim Aufruf werden dem Assemblerprogramm alle Register, der Stackpointer, das
  152. Statusregister und der Supervisorstackpointer (wie man diese ändern kann,finden
  153. Sie beim X-Befehl) übergeben. Auf dem Stack liegt zuoberst eine Rücksprung-
  154. adresse, die in den Debugger zeigt, d.h., das Assemblerprogramm kann -und soll-
  155. mit einem RTS-Befehl aufhören.
  156. Der Call-Befehl bietet auch noch einige andere Optionen. So ist es in den meisten
  157. Fällen von Nutzen, das Programm nur bis zu einer bestimmten Adresse ausführen
  158. zu lassen. Nehmen wir einmal an, Sie wollten Ihr Programm, das ab der Adresse
  159. $40b7c steht, ausführen, aber nur bis zur Adresse $410c0. In diesem Fall geben
  160. Sie dem Debugger folgendes Kommando:
  161. C 40b7c,410c0
  162. Das Programm wird aufgerufen, und wenn es an der Speicherstelle $410c0 mit der
  163. Ausführung angelangt ist, wird es gestoppt, und die Register zu diesem Zeitpunkt
  164. werden angezeigt. Weil die Rücksprungadresse aber noch auf dem Stack liegt, ist
  165. der Stackpointer um ein Langwort erniedrigt, und sollte manuell korrigiert wer-
  166. den. Diese Arbeit können Sie sich durch Verwendung des G-Befehls (siehe dort)
  167. ersparen.
  168. Wenn Sie nur "C",d.h. keine Adresse dahinter, angeben, so wird das Programm ab
  169. der derzeitigen Position des ProgramCounter (PC) der 68000 ausgeführt. Es wird
  170. allerdings nur genau der eine einzige Befehl, der dort steht, ausgeführt; danach
  171. bricht "C" ab und meldet (wie Trace, ein C etwa auf einen NOP-Befehl entspricht
  172. genau einem T auf diesen NOP-Befehl) die Register. Im Unterschied zu T kann
  173. der eine ausgeführte Befehl ein Unterprogrammaufruf sein. In diesem Fall wird
  174. das ganze Unterprogramm aufgerufen! Sie können also "C" ohne Adresse ersetzen
  175. durch "G ,<Adresse des nach dem aktuellen Befehls folgenden Befehls>".(vgl. G-
  176. Befehl).
  177.  
  178. Die vierte der möglichen Syntaxen ist das
  179. C ,<Adresse>
  180. In diesem Fall wird das Programm ab der derzeitigen Position des PC ausgeführt
  181. und, sobald die Ausführung die Adresse <Adresse> erreicht hat, abgebrochen.
  182. Das Abbrechen beim C-Befehl funktioniert, indem automatisch ein Breakpoint (und
  183. zwar Nr. 7) gesetzt wird.
  184. Beim C-Befehl ist es besonders oft sinnvoll, anstatt fester Adressen symbolische
  185. (Labelnamen) zu verwenden. Der Debugger ermöglicht das Weiterverwenden von im
  186. Assembler assemblierten Labels, oder auch das Arbeiten von mit Labels auf Disk
  187. geschriebenen .PRG-Files. Dabei wird jeder Labelname von einem . (Dezimalpunkt)
  188. eingeleitet. Beispiele für Labelnamen sind:
  189. .start
  190. ._start
  191. .ausgabe
  192. Ç.sinus
  193. etc. Dabei werden Labels mit mehr als 8 Zeichen Länge nicht unterstützt.
  194.  
  195. D-Befehl (Dump)
  196. Dieser Befehl gibt einen Speicherbereich aus. Die Syntax ist:
  197. D <Adresse>     gibt ab der Adresse einen Bildschirm voll Daten aus
  198. D <Adresse1>,<Adresse2>   gibt von Adresse1 bis Adresse2 Daten aus
  199. D               gibt ab der letzten ausgegebenen Adresse aus.
  200. Genaueres entnehmen Sie bitte der Einleitung.
  201.  
  202. E-Befehl (Editor und Execute Program)
  203. Eigentlich besteht der E-Befehl aus zwei Befehlen. Zum einen ruft E den in
  204. IDEAL eingebauten Editor auf, zum anderen kann man mit E lauffähige Programme
  205. von Disk in den Speicher einladen. Kommen wir zunächst zum einfachsten:
  206. E (ohne weitere Parameter)
  207. Der eingebaute Editor wird aufgerufen.
  208. E <name>
  209. Ein Programm mit dem Namen <name> wird eingeladen, es wird eine Basepage ein-
  210. gerichtet und es werden die Adressen reloziert-kurz, es wird alles das gemacht,
  211. was beim Anklicken eines Programmes auch gemacht wird. Allerdings wird das Pro-
  212. gramm nicht gestartet. Natürlich mu₧ das mit E geladene Programm auch wirklich
  213. ausführbar sein, also vom Typ .PRG, .TTP oder .TOS sein.
  214. Die Adresse, an die hingeladen werden soll, kann nicht beeinflu₧t werden.
  215. Ebenfalls ist es nicht möglich, zweimal hintereinander ein Programm mit E zu
  216. laden, weil GEMDOS hier gewisse Restriktionen setzt. Sie müssen also den IDEAL
  217. verlassen und neu starten, um wieder E name machen zu können. Allerdings kann
  218. ein mit E eingeladenes und anschlie₧end mit G gestartetes Programm seinerseits
  219. weitere Programme nachladen.
  220.  
  221. F-Fill memory (Speicher füllen)
  222. Mit dem Fill-Kommando können Sie Speicherbereiche mit irgendwelchen Werten
  223. füllen. Die allgemeine Syntax ist:
  224. F <Startadresse>,<Endadresse>,<Daten>
  225. Zum Beispiel:
  226. F a0000,b0000,0
  227. Hier wird der Speicherbereich von $a0000 bis $b0000 (nur beim 520 ST+ vorhanden)
  228. mit Nullen beschrieben.
  229. F a0000,b0000,4000
  230. Derselbe Speicherbereich wird mit dem Word $4000 beschrieben.
  231. F a0000,b0000,4000000c
  232. Derselbe Speicherbereich wird mit lauter Langwörtern $4000000c gefüllt.
  233. Fill lä₧t auch noch andere Datenparameter zu. Es ist zum Beispiel möglich,
  234. den Speicher mit ASCII-Zeichenfolgen zu füllen, zum Beispiel ganz romantisch:
  235. F a0000,b0000,"ich liebe Dich!"
  236. Sehr häufig mu₧ man ganze Speicherbereiche mit irgendwelchen Assemblerbefehlen
  237. füllen (normalerweise NOP oder ILLEGAL-Anweisungen). Auch dies wird vom FILL-
  238. Befehl unterstützt. Um einen Assemblerbefehl zu charakterisieren, müssen Sie
  239. ein Ausrufezeichen voranstellen, etwa:
  240. F a0000,b0000,!nop
  241. In diesem Fall wird der Speicherbereich mit dem Hexcode gefüllt, der dem Befehl
  242. NOP entspricht.
  243. Es sind auch komplizierte Ausdrücke möglich, etwa so:
  244. F a0000,b0000,!move.b $00040204,$fffff808
  245.  
  246. G - Go (Programm aufrufen)
  247. Go entspricht ganz genau dem Befehl C. Der einzige Unterschied ist, da₧ G keine
  248. Rücksprungadresse auf dem Stack ablegt, das aufgerufene Programm also nicht mit
  249. einem RTS-Befehl aufhören darf. Zweckmä₧igerweise wird man an den Schlu₧ des
  250. Programmes eine ILLEGAL-Anweisung stellen. Das Ausführen einer unerlaubten Op-
  251. eration (wie ILLEGAL) führt im 68000 zu einer Ausnahmebehandlung (Exception).
  252. Der Debugger fängt sämtliche Exceptions (es gibt noch einige andere, wie Bus-
  253. Fehler, Adressfehler, CHK-Exception,.....) ab und gibt im Falle einer Exception
  254. Çeinen entsprechenden Text aus, z.B.
  255. ENCOUNTERED THE ILLEGAL INSTRUCTION
  256. TRAPV EXCEPTION
  257. DIVISION BY ZERO EXCEPTION
  258. ADRESS ERROR, WRITING (oder reading) AT .....,TRYING TO EXECUTE ......
  259.  
  260. H-Hunt (to hunt, engl, jagen: Hunt durchsucht Speicherbereiche)
  261. Die Syntax von H entspricht der von F, nur da₧ der Speicherbereich nicht mit
  262. den Daten gefüllt wird, sondern da₧ die Daten im entsprechenden Speicherbereich
  263. gesucht werden. Gefundene Adressen werden ausgegeben. Beispiele sind:
  264. H 60000,60200,0 -durchsucht den Speicherbereich $60000-$60200 nach Nullen
  265. H .400000,.400500,%1000 0000     -durchsucht den Speicherbereich dezimal 400000
  266.                                 bis dez.400500 nach binär 10000000 (=128dez)
  267. H 60000,60200,40aa      -durchsucht den Speicherbereich nach dem Word $40aa
  268. H 60000,60200,$4a004a01
  269. H 60000,60250,"ich liebe Dich"
  270. H 60000,60250,!nop      -es wird nach NOP-Befehlen gesucht.
  271.  
  272. I-Information
  273. Der I-Befehl gibt einige Informationen zum derzeit bearbeiteten Programm aus.
  274. So zum Beispiel die Anfangsadresse des Sourcecodes im Speicher (die erste freie
  275. Adresse hinter dem Debugger selber), die Anfangsadresse der Labeltabelle nach
  276. dem Assemblieren, den Anfang des fertig assemblierten Programms, die Anfänge
  277. des DATA- und BSS-Segments (siehe Assemblerteil) und die letzte vom Programm
  278. benutzte Adresse. Diese Angaben sind rein informativ, d.h., sie können nicht
  279. geändert werden. Sinnvoll ist I vor allem in Verbindung zum E-Befehl, da I erste
  280. Aufschlüsse über Länge und Struktur des geladenen Programmes liefert.
  281.  
  282. K-Kill
  283. Mit dem K-Befehl können Sie, ähnlich wie mit dem E-Befehl, wieder zwei grundver-
  284. schiedene Dinge bewirken: löschen eines Disk-programmes, und löschen des Source-
  285. textes. Den Sourcetext löschen Sie einfach mit
  286. k "s"
  287. Ein Programm auf Diskette können Sie mit
  288. k <name>
  289. löschen. Beispiel:
  290. K ideal.prg
  291. löscht den IDEAL.PRG von der eingelegten Diskette (ein ziemlich irreversibler
  292. Vorgang, den Sie in dieser Form besser nicht ausprobieren sollten).
  293.  
  294. L-List
  295. Der L-Befehl disassembliert einen Speicherbereich. Die Syntax entspricht dem
  296. D-Befehl:
  297. L - disassembliert ab der letzten disassemblierten Adresse
  298. L <Adresse> - disassembliert ab der angegebenen Adresse (einen Bildschirm voll)
  299. L <Adresse>,<Adresse> - disassembliert von Adresse1 bis Adresse2.
  300. Das ausgegebene Format kann genau gleich wieder eingegeben werden: Sie können
  301. im disassemblierten Listing mit dem Cursor Korrekturen vornehmen und durch
  302. die Taste <CR> übernehmen.
  303. Im disassemblierten Listing erscheinen auch die symbolischen Adressen (falls
  304. welche vorhanden sind). Es handelt sich somit um einen symbolischen Disassembler.
  305.  
  306. Im Zusammenhang mit L ist die Möglichkeit, die symbolischen Adressen an jeder
  307. Stelle einsetzen zu können, von gro₧er Bedeutung. Es ist möglich, z.B.
  308. L ._start
  309. einzugeben!
  310.  
  311. M-MOVE (Speicherbereiche kopieren)
  312. Der M-Befehl kopiert einen Speicherbereich an eine andere Stelle im Speicher.
  313. So können Sie zum Beispiel den Bereich von $78000-$7ffff an die Stelle $68000
  314. (bis $6ffff) kopieren, indem Sie einfach
  315. M 78000,7ffff,68000
  316. Çeingeben. Allgemein ist die Syntax also:
  317. M Startadresse,Endadresse,Zieladresse
  318. Move ist intelligent, das hei₧t, da₧ das Kopieren in sich überlappende RAM-Be-
  319. reiche immer funktioniert:
  320. M 70000,70100,70102 und
  321. M 70000,70100,6fffe
  322. funktioniert jedesmal wie erwartet.
  323.  
  324. N - Names (Diskdirectory)
  325. Der N-Befehl gibt das Directory der Diskstation A: aus. Syntax:
  326. N
  327. Um an das Directory der Diskstation B: zu kommen, geben Sie einfach
  328. N b:
  329. Schlie₧lich ist es auch noch möglich, weitere Angaben zu machen:
  330. N b:\subdir\*.*
  331. N a:*.PRG
  332. etc.
  333.  
  334. O - Linker.
  335. Der O-Befehl linkt mehrere Files auf der Diskette zusammen. Diese müssen alle
  336. mit A,L abgespeichert worden sein. Die Syntax ist einfach:
  337. O name1,name2,name3,.....,namex=namevonallemzusammen
  338. Die Files name1...namex werden alle zusammengelinkt und unter dem Namen namevon-
  339. allenzusammen wieder auf Disk abgelegt. Um z.B. die Programmteile EINGABE,
  340. SUCHEN und AUSGABE zum Gesamt-Programm VERWALTG zusammenzufügen, geben
  341. Sie ein:
  342. O EINGABE,SUCHEN,AUSGABE=VERWALTG
  343. Zum erfolgreichen Linken mu₧ beachtet werden, da₧ alle von au₧en angesprochenen
  344. Labels als GLOBAL definiert werden müssen und da₧ keine undefinierten Ansprünge
  345. nach dem erfolgten Linken übrigbleiben. Das Programm wird wieder als linkfähiges
  346. File auf die Diskette geschrieben und kann - falls alle undefinierten Labels
  347. während des Linkens eingesetzt werden konnten - auch ausgeführt werden.
  348. In fast allen Fällen erweist es sich jedoch als zweckmä₧iger, überhaupt auf das
  349. Linken zu verzichten und direkt die beiden Sourcefiles zusammenzufügen. Probleme
  350. entstehen dabei mit identisch definierten Labels, die jedoch durch die FIND+RE-
  351. PLACE-Funktion des Editors leicht gelöst werden können.
  352. Näheres über globale Labels finden Sie im Anleitungsteil DER ASSEMBLER unter
  353. "Globale Label-Definition"
  354.  
  355. P - Printer
  356. Wenn Sie irgendeinem Befehl ein P voranstellen, gibt dieser Befehl seine Daten
  357. nicht auf den Bildschirm, sondern auf den Drucker aus:
  358. P D 50000,50010         disassembliert beispilsweise den Speicherbereich von
  359.                         50000 bis 50010 auf den Drucker,
  360. P X                     gibt den Inhalt der Register auf den Drucker aus
  361.  
  362.  
  363. Q - Queue (Spur bei Trace)   &   Quit if (Untrace abbrechen bei best. Ereignis)
  364. Wie dem Buchstaben E, so sind auch dem Buchstaben Q zwei Befehle zugeordnet:
  365.  
  366. 1. Queue (engl. Warteschlange, Schwanz, Schweif)
  367. Der IDEAL merkt sich bei TRACE und UNTRACE die 64 jeweils zuletzt ausgeführten
  368. Befehle. Diese können Sie mit dem Queue-Befehl sich wieder anzeigen lassen.
  369. Da auf den Bildschirm nur 25 Zeilen passen, müssen Sie angeben, welchen Bereich
  370. des "Schweifes" Sie sehen möchten; IDEAL gibt ab dieser Stelle 20 Befehle aus:
  371. q 5             gibt ab der fünften Stelle 20 Befehle aus.
  372. Die nullte Stelle ist hier die "älteste", die 63-ste die "neueste", also der
  373. zuletzt ausgeführte Befehl.
  374.  
  375. 2. Quit if
  376. Mit dem Q-Befehl können Sie die Bedingungen setzen und abfragen, unter denen
  377. der U-Befehl (Untrace, siehe dort) die simulierte Ausführung Ihres Programms
  378. Çabbricht und in den normalen Debugger-Modus zurückkehrt.
  379. Ansehen können Sie sich die Abbruchbedingungen, indem Sie einfach Q eingeben:
  380. Q       gibt die Abbruchbedingungen aus
  381. Sie sehen dann z.B. folgendes Bild:
  382. Q PC x                                    ;Programmzeiger
  383. Q SR xxxxx   XNZVC / EXT NEG ZER OVF CRY  ;Flags
  384. Q D0:x                                    ;beliebiges Register
  385. Q I:x                                     ;auszuführende Instruktion
  386. Q F O                                     ;Verknüpfungsregel (O=OR, A=AND)
  387. Ein kleines x bedeutet: spielt keine Rolle. Das O hinter F zeigt an, da₧ alle
  388. Bedingungen mit ODER verknüpft sind, d.h. die Erfüllung einer einzigen Bedingung
  389. führt zum Abbruch. Stünde dort ein A (für AND), mü₧ten alle Bedingungen gleich-
  390. zeitig erfüllt sein, um Untrace abbrechen zu lassen.
  391. Nehmen wir an, in Adre₧register A0 haben Sie einen Zeiger auf eine Tabelle
  392. angelegt. Da das Programm manchmal völlig falsche Werte zurückgibt, vermuten
  393. Sie, da₧ irgendwo der Zeiger in A0 zerstört wird. Um genau den Punkt zu finden,
  394. an dem dies passiert geben Sie ein:
  395. Q A0:>< .TABELLE
  396. und starten Ihr Programm mit dem U-Befehl (Nicht vergessen, mit X den PC auf
  397. den Programmstart zu legen). Sobald A0 einen anderen Wert enthält als die
  398. Adresse, die dem Label TABELLE entspricht, bricht Untrace ab.
  399. Anderes Beispiel - Ihr Programm enthält folgende Schleife:
  400.  
  401.         lea ENDE,a3
  402.         lea START,a2
  403. LOOP:   move (a2)+,d1
  404.         bsr RECHNEN
  405.         cmp a3,a2
  406.         bne LOOP
  407.  
  408. an irgendeiner Stelle kommt RECHNEN mit dem Wert 1 in d7 zurück, was, so haben
  409. Sie es in Ihrem Programm festgelegt, bedeutet, da₧ ein Fehler aufgetreten ist.
  410. Damit Sie das Programm nicht aus Versehen in RECHNEN stoppen, sondern sicher
  411. die obige Schleife erwischen, geben Sie folgendes ein:
  412. Q D7:= 1        ;Abbrechen, wenn d7 1 ist
  413. Q I:bne LOOP    ;UND   bne LOOP   ausgeführt werden soll
  414. Q F:A           ;^^^
  415. Alle anderen Bedingungen setzen Sie auf x. Wenn Sie nun das Programm wieder
  416. (nach entsprechendem Setzen des PC) mit dem U-Befehl starten, wird die
  417. Programmausführung an der gewünschten Stelle abgebrochen.
  418.  
  419.  
  420. R - Read
  421. Mit dem R-Befehl können Sie ein Maschinenprogramm von Diskette laden:
  422. R <name> <Adresse>  lädt das Maschinenprogramm <name> an die angegebene Adresse
  423. Wenn Sie ein Programm an die nächste verfügbare Adresse laden wollen, verwenden
  424. Sie bitte den E-Befehl (Execute Program).
  425.  
  426.  
  427. S - Set
  428. Dient zum Verändern einzelner Speicherinhalte. Syntax:
  429. S.B <Adresse>   Byte-weise
  430. S.W <Adresse>   Word-weise
  431. S.L <Adresse>   Long-weise
  432. Die jeweilige Adresse wird mit ihrem momentanen Inhalt ausgegeben, dahinter
  433. steht ein Komma, nach S.B 50000 beispielsweise:
  434. $50000:.B 00,
  435. Der Inhalt der Speicherzelle $50000 ist also $00. Wenn Sie nun einen anderen
  436. Wert eingeben und <Return> drücken, so erhält die Speicherzelle den von
  437. Ihnen eingebenen Wert; Drücken Sie nur <Return>, wird der Inhalt nicht
  438. verändert. In beiden Fällen erscheint die nächste Speicherzelle samt Inhalt.
  439. Um diese Eingabe abzubrechen, müssen Sie nur mit dem Cursor die Zeile verlassen
  440. Çoder den Bildschirm löschen. Sobald Sie in einer Zeile sind, die kein .B, .W, .L
  441. nach der Adresse enthält, ist die Set-Funktion abgeschaltet.
  442. Einfacher haben Sie es in den meisten Fällen jedoch mit dem D-(Dump-)Befehl.
  443.  
  444. T - Trace
  445. Wenn Sie Ihr Programm mit diesem Befehl starten, werden bei jedem ausgeführten
  446. Befehl die Inhalte der Register, der momentane Programmzähler, die Flags und
  447. der nächste auszuführende Befehl ausgegeben - Sie können also jeden Schritt
  448. Ihres Programmes genauestens überwachen. Syntax:
  449. T          führt einen Befehl ab der momentanen PC-Adresse aus (diese können
  450.            Sie mit dem X-Befehl ändern). Den nächsten Befehl können Sie durch
  451.            weiteres T ausführen lassen usw. Eine Spur (siehe Q-Befehl, Queue)
  452.            wird mitgeführt.
  453. T <zahl>   führt die angegebene Anzahl Befehle ab der momentanen PC-Adresse
  454.            aus. Nach jedem Schritt werden alle Registerinhalte, die Flags
  455.            und der nächste auszuführende Befehl angezeigt.
  456.  
  457. Trace dient vor allem zur Fehlersuche an extrem kritischen Stellen. Meist kann
  458. man auf Trace verzichten und das bequemere Untrace verwenden, da der IDEAL die
  459. Möglichkeit des Bedingten Abbruchs (Quit if) zur Verfügung stellt und sich
  460. die 64 zuletzt ausgeführten Befehle merkt (Queue).
  461.  
  462. U - Untrace
  463. Mit diesem Befehl können Sie Ihre Maschinenprogramme überwacht ablaufen lassen.
  464. Überwacht hei₧t:
  465. - Sie können Bedingungen angeben, unter denen das Programm ab-
  466.   brechen soll, beispielsweise wenn der Stack eine bestimmte Tiefe erreicht hat;
  467.   näheres über Abbruchbedingungen siehe Q-Befehl (Quit if).
  468. - Der IDEAL merkt sich die jeweils 64 zuletzt ausgeführten Befehle. So können
  469.   Sie den Programmverlauf nachträglich verfolgen. Siehe Q-Befehl (Queue).
  470. Verwenden können Sie den Untrace-Befehl auf zwei Arten:
  471. U          startet ein Maschinenprogramm ab der momentanen PC-Adresse (diese
  472.            können Sie mit dem X-Befehl ändern) und bricht erst ab, wenn die
  473.            mit Q eingestellte Bedingung erfüllt ist oder ein ILLEGAL-Befehl
  474.            ausgeführt wird. Das geUNTRACEte Programm läuft etwa 100-mal lang-
  475.            samer ab als ein normal mit G oder C gestartetes.
  476. U <zahl>   wie oben, bricht jedoch au₧erdem automatisch nach <zahl> Befehlen
  477.            ab. Beispiel: U 5    bricht nach 5 Befehlen ab.
  478.  
  479. V - View Labeltab
  480. Die beim Assemblieren erzeugte Labeltabelle können Sie mit dem V-Befehl ausgeben
  481. und so eine umfassende Antwort auf die Frage "Was steht wo?" erhalten. Sinnvoll
  482. vor allem in Zusammenarbeit mit dem P-(Printer-)Befehl:
  483. P V     gibt die Labels und die Ihnen zugeordneten Adressen auf dem Drucker aus
  484.  
  485. W - Write
  486. Schreibt einen Speicherbereich auf Disk. Syntax:
  487. W <name> <Startadresse>,<Endadresse>
  488. Beispiel:
  489. W BERGMANN.TOS 50000,55FF0      schreibt den Speicherbereich von 50000 bis
  490.                                 55FF0 unter dem Namen BERGMANN.TOS auf Disk.
  491.  
  492.  
  493. X - eXamine Registers, eXchange Register Contents
  494. Ein Buchstabe, zwei Befehle, das kennen Sie schon. Alle Register anzeigen
  495. können Sie mit der ersten Variante, eXamine Registers:
  496. X       gibt alle Register, die Flags und den an der PC-Adresse beginnenden
  497.         Befehl aus.
  498. Wenn Sie Registerinhalte ändern wollen, schreiben Sie hinter das X einen
  499. Doppelpunkt und den Namen des Registers, das Sie ändern wollen, also z.B.
  500. X: D0 ffffffff          setzt Register D0 auf den Wert $ffffffff
  501. oder
  502. ÇX: SR 0003              setzt Carry-Bit und Overflow-Bit im Statusregister
  503.  
  504.  
  505. Z - Assemblieren mit Optimieren von Branches, die nach vorne zeigen.
  506.     Mit dem normalen A-Befehl zum Assemblieren werden nur rueckwaerts zeigende
  507. Spruenge optimiert (also von .W nach .B geaendert). Der Z-Befehl optimiert
  508. auch Spruenge, die nach vorne zeigen. Allerdings wird die Assemblierzeit ver-
  509. doppelt.
  510.  
  511. Y - Notbremse, wenn Sie waehrend Z (Assemblieren mit Optimieren) mit Hilfe der
  512. Shifttaste abgebrochen haben. In diesem Fall ist Ihr Sourcetext mit viele
  513. CTRL-A's durchsetzt. Y wirft diese CTRL-A's wieder raus.
  514.  
  515. / - Exit aus dem IDEAL-System, Rueckkehr ins GEM-Desktop
  516.  
  517. Im IDEAL ist eine Moeglichkeit vorgesehen, aus Maschinenprogrammen, die z.B. in
  518. Endlosschleifen "haengen", wieder auszusteigen. Das geschieht, indem Sie gleich-
  519. zeitig beide Shifttasten druecken und dann wieder loslassen.
  520.  
  521.  
  522. *** DER ASSEMBLER
  523.     -------------
  524.  
  525. Im IDEAL ist ein schneller Two-Pass-Assembler integriert, der die mit dem Editor
  526. erstellten Quelltexte ("Sourcecodes") in ausführbare Maschinenprogramme über-
  527. setzt ("assembliert").
  528. Den Assembler rufen Sie aus dem Debugger heraus mit dem A-Befehl auf:
  529.  
  530. A               assembliert das Programm, das gerade mit dem Editor bearbeitet
  531.                 wird.
  532. A <name>        assembliert das Programm <name> von Disk.
  533.  
  534. A W             assembliert das gerade im Editor befindliche Programm und gibt
  535.                 "Warnings" aus. Warnings sind "kleine" Fehlermeldungen, Hinweise
  536.                 auf mi₧verständliche oder kritische Programmzeilen - wie z.B.
  537.                 add D0,A3
  538.                 #warning: will be extended to long-word
  539.  
  540. A W <name>      assembliert das Programm <name> von Disk und gibt Warnings aus.
  541.  
  542. Grundsätzlich wird immer in den Speicher assembliert, das fertige Programm legt
  543. IDEAL ab der ersten freien Adresse ab.  -- Es ist so noch nicht ausführbar! --
  544.  
  545. Nach dem Assemblieren MUSS eine der drei folgenden Funktionen aufgerufen werden:
  546.  
  547. a,w <name>      WRITE: schreibt das assemblierte Programm unter dem Namen
  548.                 <name> (.TOS,.TTP oder .PRG anhängen!) auf Diskette
  549.                 Das Programm ist ausführbar.
  550.  
  551. a,l <name>      LINK: wie a,w <name>,schreibt aber sämtliche Labels mit
  552.                 auf Disk. PGM wird doppelt so lang, besseres Debugging.
  553.  
  554. a,d             DEBUG: macht das Programm im Speicher ausführbar.Vor dem
  555.                 Debuggen aufrufen.Danach a,w und a,l nicht mehr versuchen!
  556.  
  557.  
  558. ** DIE SYNTAX des im IDEAL integrierten Assemblers entspricht weitgehend der
  559. Standard-Syntax von Motorola. Abweichungen ergeben sich vor allem dadurch,
  560. da₧ der IDEAL wesentlich toleranter ist.
  561. - Alle Immediate- und Adre₧register-Befehle können auch ohne das in der
  562.   Standard-Syntax vorhandene "I" bzw. "A" am Ende des Befehls-Mnemonics
  563.   eingegeben werden; also MOVE A0,A1 statt MOVEA A0,A1 oder ADD #3,D1 statt
  564. Ç  ADDI #3,D1.
  565. - TRAPs mit oder ohne #-Zeichen: TRAP 1 und TRAP#1 sind gleich.
  566. - die Bezeichnung SP ("Stackpointer") für das Register A7 ist zulässig.
  567.   MOVE D0,-(SP)  entspricht  MOVE D0,-(A7)
  568.  
  569.             Selbstverständlich ist auch die Motorola-Syntax zulässig.
  570.  
  571. ** Sprung- oder Adre₧marken ("Labels") werden durch einen nachfolgenden Doppel-
  572. punkt gekennzeichnet:
  573.  
  574. LOOP:   subq #1,d3
  575.         bne LOOP
  576.  
  577. Labelnamen dürfen bis zu 8 Zeichen lang sein.
  578.  
  579.  
  580. ** Zahlen
  581. * Zahlensysteme:
  582. 100             dezimal
  583. $100            hexadezimal (=dez. 256)
  584. %100            binär (=dez. 4)
  585. @100            oktal (=dez. 64) *+*
  586. "100"           ASCII (=dez. 49,48,48)
  587.  
  588. * Rechnen: statt einer Zahl kann stets ein Rechenausdruck stehen. Zulässig sind
  589. die vier Grundrechenarten sowie Potenzieren. Der IDEAL führt Berechnungen im
  590. Bereich von -2^31 bis +2^31 aus (long integer Arithmetik). Nachkommastellen
  591. werden nicht gerundet, sondern abgeschnitten; 10/6 ist also nicht 2, sondern 1.
  592.  
  593.  
  594. **~ PSEUDO-OPs
  595. verwenden Sie, um dem Assembler Befehle zu geben.
  596.  
  597.  
  598. *~ TABELLEN
  599. ~ Define Constant - verwendet man, um Daten abzulegen, die das Programm braucht.
  600. z.B. Fehlermeldungs-Texte, Ansprung-Tabellen.
  601.  
  602. .DC.B           Define Constant Byte - einzelne Bytes werden abgelegt.
  603.                 .DC.B $F,"A",3*3       legt die Bytes $0F,$41 und $09 ab
  604. .DC.W           Define Constant Word - Words (je 16 Bit) werden abgelegt.
  605.                 Werte, die nur ein Byte beanspruchen würden, werden trotzdem
  606.                 als Word abgelegt (werden auf Word "erweitert")
  607.                 .DC.W $30A,%1010      legt die Words $030A und $000A ab
  608. .DC.L           Define Constant Long - Longs (je 32 Bit) werden abgelegt.
  609.                 Byte- oder Word-Werte werden auf Long erweitert.
  610.                 .DC.L "SEX",6,START   legt die Longs $00534558 und $00000006
  611.                                       und die Adresse des Labels START ab.
  612.  
  613. ~ Define Space - mit diesem Pseudo-Op reservieren Sie Platz für Werte, die Ihr
  614. Programm während der Ausführung erzeugt - z.B. Zwischenergebnisse, Dateipuffer.
  615.  
  616. .DS.B           Define Space Byte - Platz für die angegebene Anzahl Bytes
  617.                 wird reserviert.
  618.                 .DS.B 10        reserviert 10 Bytes Speicherplatz
  619. .DS.W           Define Space Word - Platz für die angegebene Anzahl Words
  620.                 wird reserviert.
  621.                 .DS.W 10        reserviert 10 Words, also 20 Bytes
  622. .DS.L           Define Space Long - Platz für die angegebene Anzahl Longs
  623.                 wird reserviert.
  624.                 .DS.L 10        reserviert 10 Longs, also 40 Bytes
  625.  
  626. Ç~EVEN
  627. .EVEN           wenn die Adresse, an der das nächste Zeichen abgelegt würde,
  628.                 ungerade ist, so wird sie um 1 erhöht (ist also dann gerade).
  629.                 Wird gebraucht, wenn Tabellen, auf die mit WORD- oder LONG-
  630.                 Adressierung zugegriffen wird, auf Tabellen folgen, die BYTE-
  631.                 weise adressiert werden, da WORD- und LONG-Zugriffe auf ungerade
  632.                 Adressen vom Prozessor nicht verarbeitet werden und zu
  633.                 einem ADRESS ERROR führen.
  634.  
  635.  
  636. *# Globale Label-Definition
  637.  
  638. Wenn Sie mehrere Programmteile zu einem Gesamt-Programm zusammenfügen wollen,
  639. so gibt es in jedem Programmteil Stellen, auf die aus anderen Programmteilen
  640. zugegriffen wird.
  641. Beispielsweise besteht Ihr Programm SINUS aus den Teilen RECHNEN und ZEICHNEN.
  642. Im Programmteil RECHNEN werden alle Werte einer Sinus-Kurve komplett
  643. berechnet und in einem Speicherbereich abgelegt. Anschlie₧end werden im
  644. VOLLSTÄNDIG UNABHÄNGIGEN Programmteil ZEICHNEN die berechneten Werte aus dem
  645. Datenfeld geholt und gezeichnet. Gemeinsam ist beiden Programmteilen das
  646. Datenfeld; es mu₧ als globales Label definiert werden, wenn Sie die Programm-
  647. teile getrennt erstellen und anschle₧end mit dem O-Befehl linken.
  648.  
  649. So könnte der Programmteil RECHNEN aussehen:
  650.  
  651. RECHNEN:lea TABELLE,a0          ;Adresse der Daten-Tabelle laden
  652.         move.w #359,d0          ;in 1-Grad-Schritten von 359 bis 0
  653. NEXT:   move.w d0,d1            ;Winkel verdoppeln zur
  654.         add.w d1,d1             ;Ermittlung der Position in der Tabelle
  655.         jsr SIN_BER             ;Sinus berechnen
  656.         move.w d2,0(a0,d1.w)    ;Ergebnis in der Tabelle abspeichern
  657.         dbf d0,NEXT             ;1 Grad abziehen, nächster Wert
  658.  
  659.         usw.
  660.           usw.
  661.  
  662. TABELLE:ds.w 360                ;360 Words Platz reservieren. Label TABELLE
  663.                                 ;enthält die Adresse dieses Speicherbereiches
  664.         usw.
  665.           usw.
  666.  
  667. .globl  TABELLE                 ;Global-Definitionen MÜSSEN am Schlu₧ stehen
  668.  
  669. ;Ende des Programmteiles RECHNEN
  670.  
  671.  
  672. ...und so der Programmteil ZEICHNEN:
  673.  
  674. ZEICHNEN:lea TABELLE,a0         ;Adresse der Daten-Tabelle laden
  675.         move.w #359,d0          ;in 1-Grad-Schritten von 359 bis 0
  676. NEXT:   move.w d0,d1            ;Winkel verdoppeln zur
  677.         add.w d1,d1             ;Ermittlung der Position in der Tabelle
  678.         move.w 0(a0,d1.w),d2    ;Wert aus der Tabelle holen
  679.         jsr PLOT                ;Punkt einzeichnen
  680.         dbf d0,NEXT             ;1 Grad abziehen, nächster Wert
  681.  
  682.         usw.
  683.           usw.                  ;Das Label TABELLE steht bereits im Teil
  684.                                 ;RECHNEN, braucht also hier nicht mehr
  685.                                 ;definiert zu werden. Der ds.w-Befehl
  686.                                 ;fällt also weg.
  687.  
  688. Ç.globl  TABELLE                 ;Sie müssen jedoch darauf hinweisen, da₧
  689.                                 ;TABELLE ein globales Label ist.
  690.  
  691. ;Ende des Programmteiles ZEICHNEN
  692.  
  693. # Lokale Labels
  694. Sicher ist Ihnen aufgefallen, da₧ sowohl im Programmteil RECHNEN als auch im
  695. Teil ZEICHNEN ein Label mit dem Namen NEXT vorkommt. Da nicht
  696. ,globl NEXT
  697. am Schlu₧ der beiden Teile steht, ist dieses Label lokal, d.h. nur im jeweiligen
  698. Programmteil gültig. Die beiden Labels sind völlig unabhängig voneinander
  699. und stören sich nicht.
  700.  
  701. # .XREF und .XDEF
  702. Aus Kompatibilitätsgründen (damit Sie auch Quelltexte anderer Assembler mit
  703. dem IDEAL übersetzen können) gibt es die Befehle .xref und .xdef; sie sind
  704. 100% identisch mit dem .globl Befehl. Statt
  705. .globl  TABELLE
  706. könnte man im Programm SINUS auch schreiben:
  707. .xref   TABELLE
  708. oder
  709. .xdef   TABELLE
  710.  
  711.  
  712. *# .END
  713. Sobald IDEAL auf den Befehl .END stö₧t, ist für ihn der Quelltext zu Ende.
  714. Ab diesem Punkt wird der gesamte Rest des Quelltextes ignoriert. Diesen
  715. Befehl verwenden Sie beispielsweise, wenn Sie die Anleitung zu einem
  716. Programm zusätzlich zu dessen Quelltext im Speicher halten möchten.
  717. Ein konkretes Anwendungsbeispiel ist auch diese Anleitung: da in der ersten
  718. Zeile ein .end-Befehl steht, können Sie sie gleichzeitig mit Ihren gerade
  719. bearbeiteten Programmen im Speicher halten und bei Bedarf kurz nachschlagen.
  720.  
  721.  
  722.  
  723.  
  724.  
  725. *** DER EDITOR
  726.     ----------
  727.  
  728. Taste / Tasten-    Arbeitsweise / Wirkung
  729. kombination
  730.  
  731. [Help]          Mit [Help] rufen Sie eine Hilfe auf. Die "[Help]-Seite" ist
  732.                 jedoch nur eine kurze Auflistung aller Kommandos.
  733.                 Der "alte Hase" unter den Programmierern wird allein damit
  734.                 zurechtkommen, normalerweise ist die [Help]-Seite jedoch zum
  735.                 Nachschlagen gedacht, falls ein Kommando zu tief unten im
  736.                 "Erinnerungskasten" steckt.
  737.  
  738. Pfeil-          Die Pfeiltasten bewegen den Cursor im Text in die gewünschte
  739. tasten          Richtung.
  740.  
  741. [Delete]        Die Taste [Delete] löscht ein Zeichen und bewegt den Cursor
  742.                 nach links. Dabei rückt der Rest der Zeile nach links auf.
  743.                 Im Insert-Modus dagegen wird das Zeichen "unter" dem Cursor
  744.                 gelöscht und der Cursor bleibt stehen.
  745.  
  746. [Insert]        Die Taste [Insert] fügt eine Leerstelle im Text ein.
  747.  
  748. [Backspace]     Mit [Backspace] löscht man ein Zeichen; der Cursor geht mit
  749.                 nach links, der Rest der Zeile rückt nur im Insert-Modus
  750. Ç                auf.
  751.  
  752. [Tab]           rückt den Cursor auf die nächste 8-er-Spalte vor.
  753.                 Im Insert-Modus schiebt der Cursor den nachfolgenden Text mit.
  754.  
  755. [Return] oder   rückt den Cursor auf den Anfang der nächsten Zeile.
  756. [Enter]
  757.  
  758. [Home]          Mit [Home] bewegen Sie den Cursor zur ersten Zeile des Textes,
  759.                 oder - wenn er bereits dort ist - zur letzten Zeile.
  760.  
  761. [Control]-[Home]dient zum löschen des Restes einer Zeile
  762.  
  763. [Alternate]     Durch Drücken der Taste [Alternate] erscheint eine Information
  764.                 über die Zeile und Spalte im Text, in der sich der Cursor
  765.                 gerade befindet.
  766.                 [Alternate] hat allerdings auch noch andere Funktionen:
  767.                 - Abbrechen der Wiederholungsfunktion (Taste [F6] )
  768.                 - Abbrechen einer Such- oder Ersetzfunktion (Tasten [F2],[F3] ).
  769.  
  770. [Control]-[A]   bewirkt, da₧ das Nächste Zeichen als Control-Zeichen in den
  771.                 Text übernommen wird.
  772.  
  773. [Control]-[M]   bewegt den Cursor an den Anfang der Zeile.
  774.  
  775. [Control]-[I]   schaltet den Insert-Modus ein oder aus.
  776.  
  777. [Esc]   Mit der Taste [Esc] werden verkehrte Eingaben gelöscht. So wird eine
  778.         Zeile z.B. wiederhergestellt, wenn man ein Buch auf der Leertaste
  779.         "abgestellt" hat und auf das Klickern der Tastatur hin feststellt,
  780.         da₧ die erste Hälfte der Zeile weg ist.
  781.         Ebenso wird ein begonnenes Kommando (z.B. [Shift]-[F8], also Laden
  782.         eines Textes) mit [Esc] abgebrochen.
  783.  
  784. [Undo]  Wirkt wie [Esc]. Eine Ausnahme besteht beim Ersetzen mit Auswahl.
  785.  
  786.  
  787. Für die Funktionstasten empfehlen wir folgende Beschriftung:
  788.  
  789.   F1      F2      F3      F4      F5      F6      F7      F8      F9      F10
  790.  
  791.  
  792.  SPLIT  SCREEN   MODE    ....    ....    CUT     DEF     LOAD    DEL    FAST /\
  793. --------------------------------------------------------------------------------
  794.   GO   FIND/QU REPL/ALL  ....    ....   REPEAT  BLOCK    SAVE    INS    FAST \/
  795.  
  796.  
  797. Die Funktionen der Tasten [F4], [F5], [Shift]-[F4] und [Shift]-[F5] können Sie
  798. selbst bestimmen. Deswegen entfällt bei diesen Tasten die Beschriftung.
  799.  
  800.  
  801.  
  802.  
  803. [Control]-[D]           "DIR". Gibt ein Inhaltsverzeichnis aus.
  804.                         Gültige PATHNAMEs sind z.B.:
  805.                             A:\*.*      *.*             b:\*
  806.                             *.txT       ordner\*.prg    a:\auto\edi.pRg
  807.  
  808. [F1] [Pfeil hoch]       "GO UP". Die Zeile, in der der Cursor steht, wird
  809.                         an den oberen Bildschirmrand geholt.
  810.  
  811. [F1] [Pfeil runter]     "GO DOWN". Die Zeile, in der der Cursor steht, wird
  812. Ç                        an den unteren Bildschirmrand geholt.
  813.  
  814. [F1] [+] [9] [Return]   "GO PLUS". Der Cursor springt 9 Zeilen weiter.
  815.  
  816. [F1] [-] [9] [Return]   "GO MINUS". Der Cursor springt 9 Zeilen zurück.
  817.  
  818. [F1] [5] [0] [Return]   "GO". Der Cursor springt auf Zeile 50.
  819.  
  820. [F1] [F2]               "QUIT". Ende des Editierens. Der (Programm-)Text
  821.                         sollte bereits abgespeichert sein, wenn Sie dieses
  822.                         Kommando mit [Return] bestätigen.
  823.  
  824. [F2] [F2] Text [Return] "FIND QUERY". Sucht ab der Cursorposition. Wenn Sie
  825.                         auf die Frage "SEARCH FOR:" nichts eingeben (also
  826.                         nur [Return] ), wird derselbe Text wie das letztemal
  827.                         gesucht.
  828.                         Beispiel: Sie suchen in einem Assemblerprogramm das
  829.                         Label "conout:". Sie geben also ein:
  830.                             [Home] [F2] [F2] conout: [Return]
  831.                         Der Editor findet nun die Folgende Zeile:
  832.                             ;Besonderheiten der Routine conout: 1. Alle Register
  833.                         Sie suchen weiter:
  834.                             [F2] [F2] [Return]
  835.                         Der Editor findet nun die richtige Zeile:
  836.                             conout: movem.l d0-d2/a0-a2,-(a7)
  837.  
  838.                         Bei der Eingabe des Suchtextes sollten sie beachten,
  839.                         da₧ Leerzeichen  v o r  dem Cursor anerkannt werden,
  840.                         h i n t e r  dem Cursor nicht. Beispiele: (das "#" soll
  841.                         den Cursor symbolisieren)
  842.                            |conout: #   "conout: "
  843.                            |co#out:     "conout:"
  844.                            |#           "conout:" (der Text vom Letztenmal)
  845.                            | #          " "
  846.  
  847. [F2] [F3] Text [Return] "LIST". Nehmen wir einmal an, das Label "conout:" wäre
  848.                         im obigen Beispiel nicht gefunden worden. Nun ist guter
  849.                         Rat teuer. Wie hie₧ denn dies verf... Ding nochmal???
  850.                         Mit   [F2] [F3] [Shift]-[:] [Return]   listen Sie alle
  851.                         Stellen auf, an denen ein Doppelpunkt vorkommt:
  852.                             00001 main:   move.l #$ffffffff,-(a7)
  853.                             00015 loop:   move.b (a0)+,(a1)+
  854.                         (!) 00127 chrout: movem.l d0-d2/a0-a2,-(a7)
  855.                             00272 quit:   clr.l -(a7)
  856.                         Die Funktion "LIST" eignet sich auch zum schnellen
  857.                         nachschauen "Wo hab' ich denn das noch verwendet?".
  858.  
  859. [F3] [F2] Text1         "QUERY REPLACE". Ersetzt (mit Abfrage) ab der Cursor-
  860. [Return] Text2 [Return] position Text1 durch Text2.
  861.  
  862. [F3] [F3] Text1         "REPLACE ALL". Ersetzt (ohne Abfrage) im ganzen Text
  863. [Return] Text2 [Return] Text1 durch Text2.
  864.  
  865. [Shift]-[F1]            "SPLIT". Der Bildschirm wird in mehrere voneinander
  866.                         unabhängige Fenster geteilt. Durch diese Einteilung
  867.                         wird es möglich, an einer Stelle zu schreiben, und
  868.                         gleichzeitig eine andere Stelle zum Vergleich
  869.                         heranzuziehen.
  870.                         Nochmaliges Betätigen von [Shift]-[F1] hebt die
  871.                         Teilung wieder auf.
  872.  
  873. [Shift]-[F2]            "SCREEN". Der Cursor wechselt das Fenster, in dem er
  874. Ç                        arbeitet. Der Wechsel findet auch dann statt, wenn
  875.                         das Fenster, in dem sich der Cursor befindet, den
  876.                         ganzen Bildschirm belegt (also wenn das SPLITting
  877.                         abgeschaltet ist).
  878.  
  879. [Shift]-[F3]            "MODE". Stellt die Grö₧e der Schrift ein. Wir
  880.                         empfehlen die ganz kleine Schrift auf dem S/W-Monitor
  881.                         nur für Gro₧buchstaben und für Leute, die (noch?)
  882.                         keine Probleme mit dem Sehen haben - oder wenn man mal
  883.                         kurz ein drittes Fenster braucht.
  884.  
  885. [F6] [1] [0] [Return]   "REPEAT". Die Beliebige Taste wird 10-mal wiederholt.
  886. [Beliebige Taste]       Sollte die "Beliebige Taste" eine Funktionstaste
  887.                         (auch die definierbaren) sein, so kann das [Return]
  888.                         weggelassen werden.
  889.  
  890. [Shift]-[F6] [F9]       "CUT INSERT". Trennt die aktuelle Zeile in einen Teil
  891.                         links vom Cursor und in einen Teil rechts vom Cursor.
  892.                         Der Teil rechts vom Cursor wird nach unten in eine
  893.                         neue Zeile geschoben.
  894.  
  895. [Shift]-[F6]            "CUT DELETE". Fügt (umgekehrt wie oben) zwei Hälften
  896. [Shift]-[F9]            zu einer Zeile zusammen.
  897.  
  898. [F7] [F7]               "BLOCK". Markiert den Anfang eines Blocks.
  899.  
  900. [F7] [Shift]-[F7]       "BLOCK DEF". Markiert das Ende des Blocks.
  901.  
  902. [F7] [F8]               "BLOCK SAVE". Der Block wird abgespeichert. Siehe [F8]
  903.  
  904. [F7] [Shift]-[F8]       "BLOCK LOAD". Ein Block wird geladen und in den Text
  905.                         eingefügt. Siehe [Shift]-[F8]
  906.  
  907. [F7] [F9]               "BLOCK INSERT". Der Block wird an der Stelle, an der
  908.                         der Cursor steht, eingefügt (kopiert).
  909.  
  910. [F7] [Shift]-[F9]       Der Text im Block wird gelöscht.
  911. [Return]
  912.  
  913. [Shift]-[F7]            "DEF". Die Funktionstaste [Shift]-[F4] wird definiert.
  914. [Shift]-[F4] Text       Der Text kann auch alle Kommandos au₧er [F6] (REPEAT),
  915.      [Shift]-[F4]       [Help] und [Shift]-[F7] (DEF) beinhalten.
  916.                         Ein flei₧ig kommentierender Maschinensprache-
  917.                         programmierer wird z.B. [F4] so belegen:
  918.                             [Shift]-[F7] [F4]
  919.                             [Control]-[M] [Tab] [Tab] [Tab] [Tab] [Shift]-[;]
  920.                             [F4]
  921.                         Immer, wenn er nun [F4] eingibt, wird der Cursor
  922.                         hinter einem Semikolon (;) in Spalte 33 brav auf
  923.                         einen Kommentar warten.
  924.  
  925. [F8] Dateiname [Return] "SAVE". Speichert den Text unter dem angegebenen Namen.
  926.                         Bitte beachten Sie den Aufbau eines Dateinamens:
  927.                             [ B:\ ]  [ ordner\ ]  name.typ
  928.                         Den Schrägstrich rückwärts ("backslash") sollte man
  929.                         auch beim Laufwerknamen nicht vergessen.
  930.  
  931. [Shift]-[F8]            "LOAD". Lädt den angegebenen Text
  932. Dateiname [Return]
  933.  
  934. [F9]                    "INSERT". Fügt eine Zeile ein.
  935.  
  936. Ç[Shift]-[F9]            "DELETE". Löscht eine Zeile.
  937.  
  938. [F10]                   "FAST DOWN". Entspricht vielen "Pfeil runter"s.
  939.  
  940. [Shift]-[F10]           "FAST UP". Entspricht vielen "Pfeil hoch"s.
  941.  
  942.  
  943.  
  944.  
  945.  
  946. Zum Schlu₧ noch eine Anmerkung zum Problem der TAB's (Zeichen 9, Control-I):
  947.  
  948. Wenn zum Beispiel in einer Datei stand:
  949.        |
  950.        |hier:(TAB)moveq.l #"(TAB)",d1
  951.        |
  952. Wird auf dem Bildschirm dargestellt:
  953.        |
  954.        |hier:   moveq.l #"      ",d1        <<< ausgedruckt auf dem Drucker sieht
  955.        |                                das ganz anders aus, also schauen
  956.                                         Sie sich das besser im Editor an.
  957.  
  958. Sie können also TAB's in Anführungszeichen setzen. Beim Suchen werden TAB's
  959. jedenfalls nur als solche gewertet, wenn sie in Anführungszeichen stehen.
  960.  
  961. Wenn Sie in einer Zeile ein oder mehrere Leerzeichen eingeben, die bis zu einer
  962. 8-er-Spalte reichen, so werden diese automatisch zu einem TAB zusammengefa₧t.
  963. Es besteht also kein Unterschied darin, ob Sie mit acht Leerzeichen oder mit
  964. der Taste TAB einrücken.
  965.  
  966.  
  967.  
  968. Und nun wünschen wir Ihnen viel Spa₧ beim Arbeiten mit dem Editor.
  969. Für weitere Fragen wenden Sie sich bitte an:
  970.  
  971.         ( Vertrieb )                    ( "Technisches" )
  972.  
  973.         OMIKRON-Software                Artur Södler
  974.         Erlachstr. 15                   Belremstr. 151
  975.         7534 Birkenfeld 2               7530 Pforzheim
  976.  
  977.         Tel. 07082 5386                 Tel. 07231 766410
  978.  
  979.