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 <FF> markiert ist. Das <FF> 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:  <blank> (oder <space>) und <tab> 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 <CR><LF> an der ersten Stelle einer Zeile erzeugt
                   eine Leerzeile im Listingfile.

          ACHTUNG: Zeilen, die ein oder mehrere blanks, und anschliessend
                   ein <CR><LF> 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 <ff> (Form-Feed), das am Anfang einer Zeile stehen muss,
erzwingt ebenfalls ein NEWPAGE, das im Listing mit 'NEWPAGE <ff>' 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.
<CR> 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 <cr><lf>

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 - <Offset>'

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

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      