Doku zu PROGRAM R65 Edit #7 18-Jul-84 Autor: -tf- File: R65DOC.TXT =================== RT11SJ-V4/5, Oregon PASCAL V1.2; 28 KW, (RK05, NOSWAP) Weitergabe und Gebrauch dieses Programms ohne Service und Haftung Dieser Crossassembler fuer den R6500 Microrechner (AIM65) ist das Resultat einer Semesterarbeit der Herren Daniel Schillinger und Rolf Seiffert, SS 81, am Hybridrechenzentrum AIE der ETH Zuerich. Die Korrekturen und Ergaenzungen stammen von F. Kuster. Es ist nicht ge- plant, das Programm weiter auszubauen oder zu optimieren, obwohl konkrete Wuensche bekannt sind. Die Modifkationen: - Dezimal-Zahlen koennen auch mit '.' statt mit 'Z' markiert werden - Das Tabulator-Zeichen ist syntaktisch gleichwertig zum Blank - Das Form-Feed erzwingt ein NEWPAG, welches im Listing zusaetzlich mit markiert ist. Das muss am Anfang der Zeile stehen. - Im MARK - ist ein Ausdruck erlaubt. Damit ist es moeglich, auf eine 'runde' Adresse aufzufuellen oder den Markblock auf eine bekannte Laenge zu fuellen. - auch ";" als Kommentar-Zeichen (wie "*") - Der Command "*file" ist gleichbedeutend mit "file,file=file" - Die Procedur EXPRESSION ist korrigiert und erweitert - Die Prozedur CHECKSUM ist korrigiert - Listing-Header ergaenzt - Symbol-Tabelle neu (ohne SYMKL%.ASM) - Load-Format ergaenzt - Fehlermeldungen ergaenzt - Filehandling ergaenzt: Files, die neu erzeugt werden, werden vorher geloescht. Fuer Short-assembly 'unbrauchbare' Files werden geloescht. - Verschiedene Files sind umgetauft worden (s. unten) - File Sizes auf (unser !) 8K-AIM-Programm zugeschnitten: .LST 400 Bloecke (Listing und Symbol-Tabelle) .LST 80 Bloecke (nur Symbol-Tabelle) .LOD 50 Bloecke (Load Modul) STATST.ASM 300 Bloecke (Uebersetzes Prog.: 1 Block fuer 18 Source-Zeilen) SYMTAB.ASM 104 Bloecke (112 Symbole pro Anfangsbuchstabe) MRKLST.ASM 2 Bloecke (fuer LISTE1 und LISTE2) Achtung: Listing auf TT: nicht empfehlenswert, da Kontroll-Output Die R65-Befehle sind leider nicht genau gleich wie CSI-Befehle. Sie duerfen keine .ext und keine Groessenangabe enthalten [size]. R65-Commands: Bedeutung: ------------ --------- Loadmodul ,Listing =Quelle/switches lodfil,lstfil=srcfil lodfil.LOD,lstfil.LST=srcfil.AIM *srcfil srcfil.LOD,scrfil.LST=scrfil.AIM lodfil=scrfil lodfil.LOD,TT: =srcfil.AIM (TT: nur Fehlermeldungen) ,lstfil=srcfil ,lstfil.LST=srcfil.AIM lodfil=srcfil/C lodfil.LOD,srcfil.LST=srcfil.AIM (!) Switches sind nur bei der Quellenangabe erlaubt: /C Symboltabelle auf filnam.LST (bei fehlender List-File-Angabe wird der Name des Quellen-Files genommen !) (geplant war eine Cross-Referenz-Liste, desshalb /C) /S short assembly: nur zwischen 'MARK +' und 'MARK -' wird neu uebersetzt Das 'Loeschen' von nicht mehr gebrauchten Files geschieht mit der Anweisungssequenz REWRITE(DELETFILE,filename,/SIZE:1); CLOSE(DELETFILE); Damit bleibt zwar der Directory-Eintrag, die Groesse ist aber auf 0 gesetzt. - Auftretende Files alt: neu: R65ASM.PAS/SAV R65.PAS/SAV Cross-Assembler progra.LDA progra.LOD Load-Modul fuer AIM65 DK: LODAT .ASM DK: INSR65.ASM Quelle der Instr. f. INLOAD RLOAD .PAS/SAV INLOAD.PAS/SAV INSR65.ASM ==> R65INS.ASM DK: INSTRT.ASM DK: R65INS.ASM (1) Instruktionen (/SEEK) CONTRL.PAS/SAV INCTRL.PAS/SAV R65INS.ASM ==> LST:R65INS.LST EX: INSTRT.INH LST:R65INS.LST Kontrolle von R65INS.ASM DK: LODERR.ASM DK: ERRR65.ASM Quelle der Fehlermeldungen ERLOAD.PAS/SAV ERLOAD.PAS/SAV ERRR65.ASM ==> R65ERR.ASM DK: R65ERR.ASM DK: R65ERR.ASM (2) Fehlermeldungen (/SEEK) ERCTRL.PAS/SAV ERCTRL.PAS/SAV R65ERR.ASM ==> LST:R65ERR.LST EX: LST:R65ERR.LST Kontrolle von R65ERR.ASM neu: R65GEN.COM erzeugt alle noetigen Files R65COP.COM Kopiert alle Quellen-Files von DK: auf OUT: INSR65.ALL Quelle der Instruktionen INSR65.C02 Quelle der Instr. (Subset) INSR65.11Q Quelle der Instr. (Subset) ALL.COM startet R65 mit R65INS.ALL ==> R65INS.ASM C02.COM startet R65 mit R65INS.C02 ==> R65INS.ASM 11Q.COM startet R65 mit R65INS.11Q ==> R65INS.ASM unveraendert: progra.AIM AIM-Quellen-Programm (allg.: R65-Quellen-Programm) progra.LST Listing/Symbol-Tabelle DK: R65COM.ASM temporaeres Command-File DK: STATST.ASM (3) temporaeres 'Statement-Store', bleibt fuer 'short' DK: SYMTAB.ASM (3) temporaere 'Symbol-Tabelle', bleibt fuer 'short' DK: MRKLST.ASM (3) temporaere 'Mark-List', bleibt fuer 'short' nicht mehr gebraucht: DK: SYMKLA.ASM Temporaer-File fuer Symboltabelle DK: SYMKLB.ASM Temporaer-File fuer Symboltabelle (1) das Instruktions-File R65INS.ASM muss auf DK: vorhanden sein. (2) das Fehlermeldungs-File wird auf DK: erwartet; ohne dieses File werden nur die Fehler-Nummern gedruckt. (3) diese drei Files bleiben auf DK:, wenn 'short assembly' moeglich ist und werden erwartet, wenn mit /S 'short assembly verlangt wird. Files, Zugriffsart und File-Variablen und einige wichtige Prozeduren srcfil(s).AIM ! ! ! ! INPUT, seq. INSR65.ASM ! ! ! V V ! !--------------------! ! INLOAD.PAS/SAV ! GETCH ! ! ! GETSYM ! V INSTRFIL /seek! ! OUTPUT seq. R65INS.ASM ------------->! !----------------> TT: ! ! R65.PAS/SAV ! Protokoll, ! ! =========== ! Fehlermeldungen ! INCTRL.PAS/SAV ! ! INPUT seq. ! ! --- !<--------------- TT: ! ! ! ! R65-Commands LST:R65INS.INH ! GETCMND! ! ! ! ! OLDCMND /seek ! --- !<--------------> R65COM.ASM ERRR65.ASM ! ! R65-Commands ! ! ! ! ! ! MRKFIL /seek ! ERLOAD.PAS/SAV ! !<--------------> MRKLST.ASM ! ! ! Updateliste V ERRTAB /seek ! ! fuer 'short' R65ERR.ASM ------------> ! ----! ! ! ! ! SYMTABOUT ! SYMBTAB /seek ! ! !---------------- !<--------------> SYMTAB.ASM ! ERCTRL.PAS/SAV ! ! ! ! Symboltabelle ! ! ! ! ! bleibt fuer 'short' ! ! ! ! ! LST:R65ERR.INH ! ! ! PRINTOUT ! STATSTORE /seek ! ! !------------- !<--------------> STATST.ASM ! ! ! ! ! Statementstore ! ! ! LOADOUT! ! bleibt fuer 'short' !--------------------! ! ! ! LSTFIL ! ! ! LDAFIL seq. ! ! ! seq. V V V Symbol-Tabelle, Listing lodfil.LOD lstfil.LST Load-Modul Adressierung Syntax fuer Operanden mit Beispiel ------------ ---------------------------------- Implizite BRK Accu ASL A Immediate AND #Ausdruck Absolut AND Ausdruck Zero Page *) AND Ausdruck Absolut Index X AND Ausdruck,X Zero Page Index X *) AND Ausdruck,X Absolut Index Y AND Ausdruck,Y Zero Page Index Y *) AND Ausdruck,Y Indirect Absolut JMP [Ausdruck] Indirect Zero Page *) JMP [Ausdruck] Indirect Absolut Index X AND [Ausdruck,X] Indirect Zero Page Index X *) AND [Ausdruck,X] Indexed indirect Y AND [Ausdruck],Y Relativ BEQ Ausdruck (Sprungmarke) Zero Page, Relative BBR0 Ausdruck,Ausdruck (Z-Page, Sprungmarke) *) Zero-Page Adressierung wird automatisch eingefuegt, wenn der Ausdruck im ersten Pass vollstaendig definiert ist (keine Vorwaerts-Referenzen), die Adresse in der Zero-Page (High Byte = '00') liegt und der Zero-Page-Befehl existiert. Definition von 'AUSDRUCK' Ausdruck := 'Summe' von Termen Term := 'Produkt' von Factoren Factor := Konstante (mit Vorzeichen) oder Ausdruck (mit Vorzeichen) oder Funktion eines Ausdruckes oder einer Konstanten (mit Vorzeichen) Konstante := hexadezimale Zahl: erste Ziffer [0..9], dann [0..9,A..F] ohne Suffix (oder 'H') oder dezimale Zahl: Ziffern [0..9], Suffix 'Z' oder '.' oder oktale Zahl: Ziffern [0..7], Suffix 'O' oder binaere Zahl: Ziffern [1..2], Suffix 'L' oder Symbol (Label) oder String ('xxx') Rechenpraezedenzen: 'Summe' = '+' (Addition) oder '-' (Subtraktion) oder '!' (logisches OR) 'Produkt' = '*' (Multiplikation) oder '/' (Division) oder '&' (logisches AND) 'Funktion' = '>' (high Byte) oder '<' (low Byte) oder '^' (logisches NOT) Auf der gleichen Stufe wird von links nach rechts gerechnet. V ! ! !<-------------------[ ! ]--!------------------------------------------------! ! ! ! Term ! ! !--[ + ]--! !--[ & ]--! ! ! ! ! ! ! ! ! !--[ - ]--! !--[ / ]--! ! ! Factor ! ! ! !<--------------------------------------------------------[ * ]--!-----------! ! ! ! Funktion Vorzeichen ! ! !--[ ^ ]--! !--[ + ]--! ! ! Vorzeichen ! ! ! ! ! ! !--[ + ]--! !--[ > ]--! !--[ - ]--! ! ! ! ! ! ! ! ! ! ! !--[ - ]--! !--[ < ]------!---------! !---------[ Konstante ]---------! ! ! ! ! ! ! ! !---!-------------!--------------------------!--[ ( ]--[ Ausdruck ]--[ ) ]--! ! ! V Das Folgende ist ein Ausschnitt aus der oben erwaehnten Semesterarbeit, soweit der Benuetzer des Crossassemblers daran interessiert ist. Die Kapitel-Bezeichnung ist uebernommen worden. Der Text ist dem aktuellen Stand angepasst und z.T. ergaenzt. Das Programm selber ist auch in der Semesterarbeit beschrieben; man muss aber die obgenannten Aenderungen beruecksichtigen. 1. Uebersicht ueber den Crossassembler R65 ======================================= 1.1 Manual ====== 1.1.1 Einfuehrung ----------- Der Crossassembler R65 verarbeitet ein Quellenprogramm in zwei Schritten. Er erzeugt ein ASCII-Outputfile und ein Assembly-Listingfile. Das Quellen- programm muss sich auf einem File mit der Extension '.AIM' befinden. Vom Assembler erzeugte Outputfiles tragen die Extension '.LST' (Listingfile) bzw. '.LOD' (Loadmodul). 1.1.2 Format eines Statements ----------------------- Jede Sourcezeile besteht aus bis zu 4 Feldern in der folgenden Reihenfolge: (Anmerkung: (oder ) und sind syntaktisch gleichwertig) 1. Labelfeld: muss am linken Rand beginnen Delimiter: mind. 1 blank 2. Operatorenfeld: darf nicht mit dem ersten Zeichen einer Zeile beginnen. Delimiter: mind. 1 blank 3. Operandenfeld: Delimiter: mind. 1 blank 4. Kommentarfeld: beginnt nach dem Operatoren- bzw. nach dem Operandenfeld. Ein '*' oder ';' als erstes Zeichen einer Zeile macht diese zu einer Kommentarzeile. Ein an der ersten Stelle einer Zeile erzeugt eine Leerzeile im Listingfile. ACHTUNG: Zeilen, die ein oder mehrere blanks, und anschliessend ein enthalten, sind fehlerhaft (Error 38). 1.1.3 BEZEICHNER (Symbole) -------------------- BEZEICHNER koennen im Label- und/oder im Operandenfeld vorkommen. Sie beginnen mit einem Buchstaben und koennen bis zu 10 Buchstaben oder Ziffern umfassen. 1.1.4 KONSTANTE --------- 1.1.4.1 Zahlen 4 verschiedene Basen zu Zahlen sind moeglich: - hexadezimal: Suffix H (optional) - deximal: Suffix Z oder . - octal: Suffix O - binaer (logical): Suffix L moeglicher Wertebereich fuer Zahlen: 0..65535(10). 1.1.4.2 Strings Strings (von druckbaren ASCII-Zeichen) stehen zwischen einfachen Anfuehrungs- zeichen. Der String ''' erzeugt den Code fuer das Zeichen ' (27H). 1.1.4.3. ALC Der aktuelle Wert des Allocation-Counter (ALC) kann mit dem Symbol '$' bezogen werden. 1.1.5 Ausdruck -------- Ausdruecke sind im Operatorenfeld zugelassen. Bei ihrer Berechnung werden sowohl Klammern, als auch die Punkt-vor-Strich Regel beruecksichtigt. Neben den bekannten Operatoren (+,-,! und *,/,&) gibt es noch drei Funktionen: > : vom folgenden stehenden Ausdruck wird lediglich das High-byte beruecksichtigt (ohne Vorzeichen) < : vom folgenden Ausdruck, wird lediglich das Low-byte beruecksichtigt ^ : Inversion, NOT, Einercomplement Strings sind Konstanten; daraus folgt: man kann mit ihnen arithmetische Operationen durchfuehren (rechnen). Dabei wird dem String folgende Zahl zugeordnet: Summe der ASCII-Codes der ersten beiden Zeichen des Strings, wobei der erste mit 256(10) (==> high Byte) gewichtet ist. Weitere Zeichen sind in diesem Fall ohne Bedeutung. Enthaelt der String nur ein Zeichen, so wird dessen ASCII-Code eingesetzt. NB: Ueber arithmetische Over- bzw. Underflow beim Auswerten von Ausdruecken wird keine Kontrolle gefuehrt. Es wird im Kreis herum weitergerechnet. Die Kontrolle ueber die 'Vernuenftigkeit' des Ergebnisses obliegt dem Anwender. 1.1.6 Adressierungsarten ------------------ Die Syntax fuer die 13 verschiedenen Adressierungsarten bei der R6500- Familie geht aus der Tabelle hervor. In Abweichung zur ueblichen Notation wird bei den indirekteen Adressierungs- arten die eckige Klammer ('[',']') verwendet, um letztere von normalen Ausdruecken unterscheiden zu koennen. 1.1.7 Assemblerdirektiven ------------------- Assemblerdirektiven stehen grundsaetzlich im Operatorenfeld. 1.1.7.1 ORG - setze absolut den Programm-Ursprung ORG, gefolgt von einem Ausdruck, weist diesen dem ALC zu. 1.1.7.2 EQU - definiere BEZEICHNER Weist den Ausdruck in seinem Operandenfeld dem BEZEICHNER in seinem Labelfeld zu. 1.1.7.3 BSS - verschiebe relativ den ALC BSS addiert zum aktuellen location counter (ALC) den Wert des Ausdruckes in seinem Operandenfeld hinzu. 1.1.7.4 WORD, ADDR, BYTE - definiere Daten Definieren ein bzw. zwei Datenbytes ab aktuellem ALC mit dem Wert des Ausdruckes im Operandenfeld. Auf der gleichen Zeile sind mehrere Ausdruecke (bis zu 4 bei WORD, ADDR ; bis zu 8 bei BYTE), mit ',' voneinander getrennt, zugelassen. ADDR vertauscht zusaetzlich das High- und das Low-byte miteinander, was die Konstruktion von Sprungtabellen erleichtert. 1.1.7.5 TEXT - definiere Textstring Definiert den Speicherplatz ab ALC mit den ASCII-Codes des Strings in seinem Operandenfeld. Maximal zulaessige Zeichenzahl: 8. 1.1.7.6 NEWFILE - springe auf naechstes Sourcefile Schaltet den Input auf das File (mit der Extension '.AIM'), das im BEZEICHNER im Operandenfeld angegeben ist, um. 1.1.7.7 SUBFILE, RETURN - schalte in Unterfile um SUBFILE schaltet den Input auf das Subfile (mit der Extension '.AIM') um, das im BEZEICHNER im Operandenfeld angegeben ist. RETURN auf schaltet zum ersten Befehl nach dem SUBFILE-Statement zurueck Maximale Verschachtelungstiefe von Subfiles: 20. (Anmerkung: Dieser Mechanismus ist bekannt als INCLUDE) 1.1.7.8 MARK +, MARK - markiere Block fuer Short-Assembly Statements, die sich zwischen diesen beiden Befehlen befinden, werden auch im Short-Assembly assembliert. Die im Operandenfeld von 'MARK -' stehende Zahl gibt an, wieviele Speicherplaetze (Bytes) und wieviele Zeilennummern reser- viert werden sollen, um ein Groesserwerden des markierten Blockes im Short- Assembly zu ermoeglichen. Zum 'MARK +'-Befehl ist kein Operand erforderlich, beim 'MARK -' ist er zwingend. Es koennen bis 127 markierte Bloecke in ein Programm eingefuegt werden. (Original-Text: "in beliebiger Anzahl" ???) 1.1.7.9 LIST, NOLIST - Kontrolle ueber Listing Wenn ein Assembly-Listingfile angegeben wurde, ueben LIST und NOLIST eine zusaetzliche Kontrolle auf das Listing aus: NOLIST unterdrueckt das Ausdrucken des Listings bis zum naechsten LIST. Im Short-Assembly ist die Wirkung der beiden Befehle auf einen markierten Block beschraenkt. 1.1.7.10 NEWPAG - neue Seite im Listingfile Initialisiert eine neue Seite im Listing. Das ASCII-Zeichen (Form-Feed), das am Anfang einer Zeile stehen muss, erzwingt ebenfalls ein NEWPAGE, das im Listing mit 'NEWPAGE ' erscheint. 1.1.7.11 END - Endes des Quellenprogramms Dieser Befehl muss als letztes Statement im Quellenprogramm stehen. Er signalisiert das Ende der Eingabe. 1.1.8 Aufruf und Gebrauch von R65 --------------------------- Der Crossassembler wird mit dem Befehl 'RU R65' gestartet. Er antwortet mit der alten Commandline und erfragt den neuen Befehl. startet den Crossassembler mit der alten Commandline, falls keine neue eingegeben wurde. ACHTUNG: NUR GROSSBUCHSTABEN ! (Extensions oder File-Sizes koennen nicht eingegeben werden !) Aufbau der Commandline: Loadfile,Listfile=Sourcefile/Switches Folgende zwei Switches existieren: /C : Veranlasst das Ausdrucken der Symboltabelle (falls nicht gesetzt, erscheint eine Symboltable mit allen fehlerhaften Label, sofern solche vorkommen). /S : Short-Assembly. Es werden nur die markierten Bloecke und die update-Zeilen assembliert. Die beiden Switches koennen kombiniert werden. siehe auch ... 1.1.9 Format des Loadmoduls --------------------- Daten-Record: ; N N A A A A D D .....D D X X X X es bedeuten: N N : Anzahl Datenbytes im Record, max. 24(10) A A A A : Startadresse des Records (Adresse des ersten Datenbytes) D D : Datenbyte X X X X : Checksum. Quersumme aller Zeichen mit Ausnahme von ';' und X .. X . Letzter Record: ; 0 0 C C C C X X X X es bedeutet: C C C C : Anzahl Records Dabei bedeuten N N .. X X je ein ASCII-codiertes Nibble (4-bit-Teil) des betreffenden, hexadezimal dargestellten Byte. 1.3 KONZEPTION DES CROSSASSEMBLERS R65 ================================== 1.3.1 ABLAUF DER ASSEMBLIERUNG ------------------------ Quellenprogramme, die den in Kapitel 1.1 aufgestellten Regeln genuegen, werden in zwei Durchgaengen uebersetzt. PASS 1: Erstellen einer Symbol-Tabelle auf dem File SYMTAB.ASM (vergl. Kap. 2.3). Falls das Source-Programm keine speziellen, syntaktischen Fehler enthaelt, sind am Endes des Passes saemtliche Labels - unabhaengig davon, ob diese definiert worden oder als Operanden aufgetreten sind - in der Symbol-Tabelle enthalten. Jedes Statement wird vollstaendig syntaktisch analysiert. Im ersten Durchgang koennen dadurch alle syntaktischen Fehler erkannt und die definitiven, absoluten Adressen festgelegt werden. Statements, die z.B. wegen Vorwaertsverweisen noch einmal behandelt werden muessen, werden entsprechen markiert (vgl. 1.3.2.3). PASS 2: Es werden ein Source-Listing erstellt und die im ersten Pass markierten Statements erneut uebersetzt. Nach dem zweiten Pass werden die Symbol-Tabelle ausgedruckt und falls keine Fehler erkannt worden sind, ein Load-Modul generiert. 1.3.3 BEHANDLUNG VON FEHLERN ---------------------- Der Assembler unterscheidet drei Kategorien von Fehlern: - Fehler, die den Start der Uebersetzung verunmoeglichen. Dabei kann es sich um syntaktische Fehler in der Command-Line oder I/O-Errors, verursacht durch nicht existierende, bei der Assemblierung benoetigte Files handeln. - Fehler, die eine weitere Assemblierung verunmoeglichen. Dies betrifft I/O-Errors, die im Zusammenhang mit dem Quellenfile (vgl. Kap. 2.5.2) oder dem short assembly (vgl. Kap. 2.5.1) auftreten. Fehler dieser Art werden als fatal bezeichnet und bewirken den Abbruch des Passes. - Die uebrigen Fehler, die vom Assembler erkannt werden, sind weniger gravierend und bewirken den Abbruch des aktuellen und Uebergang zum naechsten Statement. Anmerkung: bei gewissen Fehlern im Zusammenhang mit MARK-Befehlen koennen Folgefehler auftreten 1.4 Short-Assembly ============== Es handelt sich hierbei um eine Option, die es erlaubt, Subroutinen und Programmteile, welche bereits funktionieren, nach dem Abaendern von Programmteilen, die nocht nicht funktionieren, nicht mehr assemblieren zu muessen. Sie wird mittels des /S-switch's eingeschaltet. Zwei neue Befehle (Assemblerdirektiven) wurden eingefuehrt: 'MARK +' , 'MARK - ' Ein Programmteil, der zwischen diesen beiden Direktiven liegt, wird als markierter Block bezeichnet. Der Offset nach dem 'MARK -'-Befehl bestimmt, wieviel Speicherplatz (Bytes) und wieviele Zeilennummern nach dem markierten Block reserviert werden sollen, um ein Laengerwerden dieses Blockes beim short-assembly zu ermoeglichen. Reservierter Speicherplatz wird mit NOP- Befehlen (EA) aufgefuellt, um ein homogenes ganzes Programm zu erhalten. Label, die in einem markierten Block definiert werden, werden ebenfalls markiert (vgl. Kap. 2.3.1.4). Dies wiederum bewirkt, dass alle Nummern von Zeilen, die nicht innerhalb eines markierten Blockes liegen und markierte Label benutzen, in eine update-Liste eingetragen werden. Ebenso werden werden die Zeilennummern von 'NEWFILE','SUBFILE','RETURN','MARK +' und 'END'-Statements in die update-Liste eingetragen, die ersten 3 allerdings nur dann, wenn sie sich nicht in einem markierten Block befinden (die andern koennen sich nicht in einem solchen befinden !). ALC und Zeilennnummer des naechsten Sourcefile-Statements nach dem MARK-Block werden ebenfalls in eine Liste eingetragen. Ueberschreiten des reservierten Platzes an Zeilen oder Speicherplaetzen fuehrt zu einem fatalen Fehler. Der Offset ist im short-assembly bedeutungslos. Es versteht sich von selbst, dass die update-Liste nur im full-assembly erstellt, und beim anschliessenden short-assembly nicht mehr veraendert wird. Kommen syntaktische Fehler vor, die sich nicht innerhalb eines markierten Blockes befinden, so wird keine update-Liste erzeugt, und damit ein short-assembly verunmoeglicht (vgl. Kap. 2.7.2). Im short-assembly werden der Reihe nach nur diejenigen Zeilen assembliert, welche in der update-Liste stehen. Es muessen aber alle Quellenfiles vorhanden sein. Stoesst der Assembler auf einen 'MARK +'-Befehl, so wird auf full-assembly umgeschaltet. Der folgende 'MARK -'-Befehl schaltet wieder auf short-assembly zurueck, fuellt den verbliebenen reservierten Speicherplatz mit 'NOP' und erzeugt, falls noetig, Leerzeilen. Im short-assembly werden nur die markierten Bloecke ausgedruckt, es sei denn, es trat ein Fehler in einer externen Zeile auf. Beschreibung einer speziellen Routine aus dem Programm: 2.4.3 'REDUCE' ------- Eine Betrachtung des Instruktionssatzes zeigt, dass bezuegliche Reduktion folgende Faelle zu unterscheiden sind: - Bei den Instruktionen STX und STY muss bei indizierter Adressierung immer die entsprechende Zero Page Variante gewaehlt werden, weshalb ein Operand, der groesser ist als 255(10) als Fehler taxiert wird. Nach Ausklammerung dieser Singularitaeten kann gesagt werden, dass die Adressierungsarten ABSX und YPAGX bei saemtlichen Instruktionen gemeinsam auftreten, waehrend dies im Falle der Indizierung mity Y nur gerade fuer LDY gilt. - Mit Ausnahme von JMP und JSR treten bei allen Instruktionen die Adressierungsmodi ABS und ZPAG zusammen auf. Darf bei einem Befehl sowohl die absolute als auch die Zero Page Version einer Adressierungsart eingesetzt werden, kann der definitive Modus grundsaetzlich anhand der Groesse des Operanden bestimmt werden. Der Assembler macht zusaetzlich die folgenden Einschraenkungen, die damit zusammenhaengen, dass eine einmal berechnete Instruktionslaenge nicht mehr veraendert werden darf: Das Flag 'REDUCEFLG' entscheidet endgueltig ueber eine Reduktion; es ist gesetzt, wenn der Operand - kleiner als 256(10) ist - keine Vorwaertsverweise enthaelt - des ausserhalb eines markierten Blocks liegenden Statements keine in einem solchen definierten Labels enthaelt. Anmerkung: Die Funktionen > und < (High Byte/Low Byte) wuerden ein Reduzieren auch erlauben. Der entsprechnende Test ist aber nicht eingebaut. Adresse des Autors: Telefon: F. Kuster 01 / 256 5336 Hybridrechenzentrum AIE 01 / 256 2211 (Zentrale) Gloriastrasse 35 ETH-Zentrum, ETZ J96 CH-8092 Zuerich