DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦a690e6156⟧ TextFile

    Length: 165632 (0x28700)
    Types: TextFile
    Names: »D21«

Derivation

└─⟦3d57f1d87⟧ Bits:30005867/disk03.imd Dokumenter (RCSL m.m.)
    └─⟦this⟧ »D21« 

TextFile

                                                i 
           
          F_O_R_O_R_D_ 
           
          Første udgave: RCSL: 42-i1339. 
          Systemet bygger på ID-COMAL, som er udviklet på instituttet for
          Datateknik, Danmarks Tekniske Højskole uder ledelse af Tom
          Østerby. Knud Henningsen og Erik Jeppesen har for Regnecentralen
          foretaget ændringer i COMAL og det underliggende system for dels
          at tilpasse det til RC700-mikrodatamaten og dels at tilnærme ID- 
          COMAL til RC BASIC/COMAL, som kendes fra RC7000 - minidatamaten. 
           
          Indeværende manual er skrevet med udgangspunkt i Tom Østerby>s
          beskrivelse af ID-COMAL, Dok.nr: ID-788, 1978-9-20. 
           
           
          Anden udgave: RCSL: 42-i1578.  
          Denne 2. udgave af manualen beskriver dels nye faciliteter, som
          er indført i COMAL og dels ændringer som følge af den nye udgave,
          RC702, af mikrodatamaten med tilhørende nyt tastatur. Ændringer i
          forhold til første udgave er markeret med en lodret streg i
          venstre margin. 
           
           
          Erik Jeppesen & Stig Møllgaard 
          A/S Regnecentralen af 1979, december 1980. 
           \f

                                                ii 
           \f

                                      iii 
           
          I_N_D_H_O_L_D_S_F_O_R_T_E_G_N_E_L_S_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          1.  INDLEDNING ............................................   1 
           
          2.  INDTASTNING ...........................................   2 
              2.1  Programsætninger .................................   2 
              2.2  Kommandoer .......................................   2 
              2.3  Editering ........................................   3 
           
          3.  COMAL PROGRAMMER ......................................   4 
              3.1  Tal ..............................................   4 
              3.2  Identifikatorer ..................................   5 
              3.3  Reserverede nøgleord .............................   6 
                       3.4  Reelle variable ..................................   6 
              3.5  Strengvariable ...................................   8 
              3.6  Aritmetiske udtryk ...............................   9 
                   3.6.1  Operatorers prioritet .....................  10 
              3.7  Strengudtryk .....................................  11 
              3.8  Logiske udtryk ...................................  11 
           
          4.  COMAL SÆTNINGER .......................................  14 
              4.1  REM - sætning ....................................  14 
              4.2  LET - sætning ....................................  14 
              4.3  DIM - sætning ....................................  15 
              4.4  DEF - sætning ....................................  16 
              4.5  PRINT - sætning ..................................  17 
              4.6  READ - sætning ...................................  18 
              4.7  INPUT - sætning ..................................  19 
              4.8  DATA - sætning ...................................  20 
              4.9  RESTORE - sætning ................................  21 
              4.10 Betingede sætninger ..............................  21 
              4.11 FOR/NEXT - sætning ...............................  22 
              4.12 WHILE/ENDWHILE - sætning .........................  23 
              4.13 REPEAT/UNTIL - sætning ...........................  24 
              4.14 LOOP/ENDLOOP - sætning ...........................  25 
           \f

                                        iv 
           
          I_N_D_H_O_L_D_S_F_O_R_T_E_G_N_E_L_S_E_ _ _(_f_o_r_t_s_a_t_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
              4.15 EXIT - sætning ..................................   26 
              4.16 RETURN - sætning ................................   26 
              4.17 PROCEDURE - sætning .............................   27 
              4.18 Procedurekald ....................................  28 
           
          5.  SPECIELLE SÆTNINGER ...................................  30 
              5.1  GOTO - sætning ...................................  30 
              5.2  ON - sætning .....................................  31 
              5.3  ON ESC - sætning .................................  31 
              5.4  GOSUB - sætning ..................................  32 
              5.5  IN - sætning .....................................  32 
              5.6  OUT - sætning ....................................  33 
              5.7  RANDOMIZE - sætning ..............................  33 
              5.8  OUTPUT - sætning .................................  34 
           
          6.  STANDARDFUNKTIONER ....................................  35 
              6.1  Matematiske funktioner ...........................  35 
              6.2  Andre aritmetiske funktioner .....................  35 
              6.3  Streng-orienterede funktioner ....................  36 
              6.4  Diverse funktioner ...............................  36 
           
          7.  FILSYSTEM .............................................  37 
              7.1  CREATE - sætning .................................  38 
              7.2  DELETE - sætning .................................  39 
              7.3  OPEN - sætning ...................................  39 
              7.4  GET - sætning ....................................  40 
              7.5  PUT - sætning ....................................  41 
              7.6  CLOSE - sætning ..................................  42 
              7.7  CHAIN - sætning ..................................  42 \f

                                        v 
           
          I_N_D_H_O_L_D_S_F_O_R_T_E_G_N_E_L_S_E_ _ _(_f_o_r_t_s_a_t_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          8.  SYSTEMKOMMANDOER ......................................  44 
              8.1  Sletning af programsætninger .....................  44 
              8.2  AUTO .............................................  44 
              8.3  BYE ..............................................  45 
              8.4  CON ..............................................  45 
              8.5  DELETE ...........................................  46 
              8.6  EDIT .............................................  46 
              8.7  HELP .............................................  47 
              8.8  LET ..............................................  47 
              8.9  LIST .............................................  48 
              8.10 LOAD .............................................  48 
              8.11 LOOKUP ...........................................  49 
              8.12 NEW ..............................................  49 
              8.13 OUTPUT ...........................................  50 
              8.14 PRINT ............................................  50 
              8.15 RENUMBER .........................................  51 
              8.16 RUN ..............................................  51 
              8.17 SAVE .............................................  52 
           
          A_P_P_E_N_D_I_C_E_S_:
           
          A.  ARITMETISKE VÆRDIER AF ASCII TEGN (DANSK TASTATUR) ....  53 
           
               B.  FEJL VED BRUG AF FILSÆTNINGER .........................  54 \f

                                        vi \f

F_       1_._ _ _ _ _ _ _ _ _I_N_D_L_E_D_N_I_N_G_ 1.
           
          Denne manual beskriver den version af programmeringsproget COMAL,
          som er implementeret på Regnecentralen af 1979>s mikrodatamatsy-
          stem, RC700. Manualen beskriver kun anvendelsen af COMAL. Med
          hensyn til installation og betjening af mikrodatamaten henvises
          til "RC700 Brugervejledning". 
           
          I manualen er COMAL-sprogets syntaks beskrevet på en slags
          Backus-Naur Form. 
          Denne beskrivelsesmetode kan bedst forklares ved et eksempel: 
           
          1: <strengudtryk'   ::= <strengoperand' ! <strengudtryk' + <strengoperand'
           
          2: <strengoperand'  ::= <strengvariabel' ! <strengkonstant' ! 
          CHR>(> <aritmetisk udtryk'>)> 
           
          3: <strengkonstant' ::= "<vilkårlig ASCII-streng undtagen 
          CR, LF, og >">'" 
           
          Symbolet >::=>  kan læses som >består af>. 
          Tegnet   > ! >  kan læses som >eller>. 
           
          Linie 1 siger så, at strengudtryk består af strengoperand eller
          strengudtryk + strengoperand. 
          Linie 2 siger, at strengoperand består af strengvariabel eller
          strengkonstant eller CHR(aritmetiske udtryk). 
          Linie 3 siger, at strengkonstant består af en følge af ASCII-tegn
          omgivet af anførelsestegn ("). 
                    
          Generelt kan det siges, at 
            - store bogstaver angiver (nøgle-)ord, som brugeren skal skrive.
            - små bogstaver omgivet af < og ' angiver begreber, som er el-
              ler vil blive defineret, dvs. at <...' optræder n gang på
              venstresiden af symbolet >::=>. 
            - paranteser angiver, at elementerne i paranteserne kan angives
              eller udelades. Hvis brugeren skal skrive et af tegnene
              (eller), er dette angivet ved >(> og >)>. 
           \f

F_       2_._ _ _ _ _ _ _ _ _I_N_D_T_A_S_T_N_I_N_G_ 2.
           
               Når der tændes for datamaten, og en systemdiskette indsættes, vil
          teksten >RC700 COMAL REV. X.XX> normalt komme frem på skærmen.
          Sker dette ikke, se da brugervejledningen. Herefter udskrives en
          >*> som tegn på at systemet er klar til indtastning. 
          Der kan nu indtastes program-sætninger eller kommandoer. 
           
 
         2_._1_ _ _ _ _ _ _ _P_r_o_g_r_a_m_s_æ_t_n_i_n_g_e_r_ 2.1
           
          Programsætninger indledes af et linienummer, der er bestemmende
          for sætningens placering i programmet. Et linienummer er et hel-
          tal mellem 1 og 9999. Sætningerne kan indtastes i vilkårlig or-
          den, idet systemet selv ordner dem efter stigende linienumre.
          Indtastes en sætning med samme linienummer som en allerede eksi-
          sterende, vil den nye sætning erstatte den eksisterende. 
          Når en sætning er indtastet, undersøges det, om det er en korrekt
          COMAL-sætning (syntaksanalyse). Er dette tilfældet, lagres den i
          programmet i overenstemmelse med sit linienummer. 
          Er den ikke syntaktisk korrekt, udskrives den igen med cursor>en
          placeret på det sted, hvor fejlen blev detekteret. Herefter kan
          sætningen rettes og sendes til syntaksanalyse igen. 
          COMAL-sætningerne er beskrevet i kapitel 4. 
           
 
2_._2_ _ _ _ _ _ _ _K_o_m_m_a_n_d_o_e_r_ 2.2
           
          En kommando adskiller sig fra en programsætning ved ikke at star-
          te med et linienummer. 
          Kommandoer udføres øjeblikkeligt og anvendes til listning, afvik-
          ling og indkøring af programmer samt til håndtering af filer på
          disketten. 
          Kommandoerne er beskrevet i kapitel 8. 
           \f

         2_._3_ _ _ _ _ _ _ _E_d_i_t_e_r_i_n_g_ 2.3
           
          Indtastning sker på skærmens nederste linie og afsluttes ved at
          trykke på tasten mærket >   > (>RETURN>). 
          Under indtastningen har brugeren forskellige editeringsfacilite-
          ter til rådighed. Til de fleste af disse faciliteter er knyttet
          en speciel tast på tastaturet, mens enkelte faciliteter aktiveres
          ved hjælp af kontroltegn, som fremkommer ved, at der trykkes på
          tasten mærket >CTRL> og en anden tast s_a_m_t_i_d_i_g_t_. F.eks. betyder
          >CTRL H>: tryk samtidig på tasterne >CTRL> og >H>. 
           
          De specielle editeringstaster kontroltegn har følgende betydning
          i COMAL: 
           
          - >   > (RETURN): afslutning på indtastning. 
          - >   > (LINE FEED), = >CTRL J>): som RETURN. 
          - >   > (CURSOR LEFT, = >CTRL H>): Cursor>en flyttes en plads til
            venstre, uden at linien ændres. 
          - >   > (CURSOR RIGHT, = >CTRL X>): Cursor>en flyttes en plads
            til højre, uden at linien ændres. 
          - >   > (INSERT CHARACTER, = >CTRL I>): alle tegn fra og med
            cursorens placering flyttes en plads til højre, og et blank
            tegn fremkommer på cursorens position. 
          - >   > (DELETE CHARACTER, = >CTRL E>): alle tegn fra cursorens
            placering flyttes en plads til venstre, og det oprindelige tegn
            på cursoren>s position fjernes. 
          - >CTRL K> (DELETE LINE): alle tegn placeret på cursoren>s
            position og til højre for denne fjernes. 
          - >ESC> (ESCAPE): den netop indtastede linie fjernes, n >*>
            udskrives, og en ny linie kan indtastes. 
           
          Ovennævnte taster kan bruges dels under indtastningen af
          programmer og dels, når systemets editor, som er beskrevet i
          kapitel 8, benyttes.  
           
           \f

F_       3_._ _ _ _ _ _ _ _ _C_O_M_A_L_ _P_R_O_G_R_A_M_M_E_R_  3.
           
          Et COMAL program består af et antal sætninger. Hver programlinie
          indledes af et linienummer, der efterfølges af et COMAL-nøgleord,
          som identificerer sætningstypen. Efter nøgleordet kan følge et
          antal argumenter, bestående af følgende grundelementer: 
           
                    - variable 
                    - nøgleord 
                    - aritmetiske udtryk 
                    - logiske udtryk 
           
          Aritmetiske og logiske udtryk bygges op af: 
           
                    - talkonstanter 
                    - identifikatorer 
                    - operatorer 
           
          Disse grundlæggende sprog-elementer beskrives i det følgende. 
           
           
3_._1_ _ _ _ _ _ _ _T_a_l_ 3.1
           
          Tal benyttes som operander i aritmetiske udtryk, samt i inddata. 
          Reelle tal kan udtrykkes enten som heltal, decimaltal eller på
          eksponentiel form. 
          I den eksponentielle notation betyder >E>: >gange 10 opløftet til
          potensen>. 
           
          Eksempler: 
           
          Heltal         decimaltal          eksponentiel form 
           
          13             13. 
          150000                             15E4 
                         12.5 
                         0.25                2.5E-1 
          125                                .125E+3 
                         .33                 330E-3 \f

         3_._2_ _ _ _ _ _ _ _I_d_e_n_t_i_f_i_k_a_t_o_r_e_r_ 3.2
           
          Identifikatorer benyttes til at navngive forskellige størrelser i
          et COMAL-program. En identifikator består af op til 16 bogstaver
          og cifre og skal begynde med et bogstav. Blanktegn må ikke indgå
          i en identifikator, og den skal efterfølges af et tegn, som ikke
          er et bogstav eller et ciffer. 
           
          Eksempler: 
           
             I 
             X1 
             COMAL 
             H20 
           
          Identifikatorer kan skrives med små eller store bogstaver, men
          alle bogstaver omsættes til store bogstaver. 
           
          Identifikatorer kan betegne følgende størrelser i et program: 
           
          - simple reelle variable 
          - indicerede reelle variable 
          - simple strengvariable 
          - indicerede strengvariable 
          - brugerdefinerede funktioner 
          - procedurer 
          - formelle parametre 
          - filvariable 
           
          Samme identifikator kan ikke betegne forskellige størrelser i et
          program, og identifikatorer må ikke være de samme som de reserve-
          rede nøgleord. 
           
                    \f

         3_._3_ _ _ _ _ _ _ _R_e_s_e_r_v_e_r_e_d_e_ _n_ø_g_l_e_o_r_d_ 3.3
           
          I COMAL findes en række reserverede nøgleord, der har en fast
          betydning, disse nøgleord må ikke benyttes i anden betydning. 
           
          De reserverede nøgleord er: 
           
                 AND                CHAIN           CLOSE 
                 CREATE             DATA            DEF 
                 DELETE             DIM             ELSE 
                 END                ENDWHILE        ENDIF 
                 ENDLOOP            ENDPROC         ESC 
                 EXEC               EXIT            FN 
                 FOR                GET             GO 
                 GOSUB              GOTO            IF 
                 IN                 INPUT           LET 
                 LOOP               NEXT            NOT 
                 ON                 OPEN            OR 
                 OUT                OUTPUT          PRINT 
                 PROC               PUT             READ 
                 REM                REPEAT          RESTORE 
                 RETURN             STEP            STOP 
                 THEN               TO              UNTIL 
                 USING              WHILE 
                  
          Nøgleord kan skrives med store eller små bogstaver, men ved
          udskrift vil de blive konverteret til små bogstaver. Et nøgleord
          skal altid efterfølges af mindst et blanktegn. 
           
           
         3_._4_ _ _ _ _ _ _ _R_e_e_l_l_e_ _v_a_r_i_a_b_l_e_ 3.4
           
          I COMAL findes to typer reelle variable, nemlig simple variable
          og talsæt. 
           
          Reelle variable kan tildeles reelle værdier og disse værdier lag-
          res i 4 oktetter - 1 til eksponent og 3 til taldel. 
           \f

          Absolut - værdi af reelle værdier ligger i området 
           
          2.9E - 39 < x < 1.7E38 
           
          Hvis resultatet af en beregning bliver større end 1.7E38, sker
          der overløb, og programmet standses med en fejlmeddelelse. Sker
          der underløb (resultatet mindre end 2.9E - 39), sættes resultatet
          til nul, og beregningen fortsættes. 
           
          En simpel variabel refereres ved dens tilhørende identifikator.
          En simpel variabel skal ikke erklæres. Erklæringen foregår første
          gang den findes på venstre side af et >=> i en tildelingssætning
          (LET-sætning) eller i variabellisten i en INPUT- eller
          READ-sætning. 
           
          Et talsæt består af en samling indicerede variable organiseret i
          form af en vektor eller en matrix. En indiceret variabel har føl-
          gende opbygning: 
           
          <indicereret variabel' ::= <identifikator' >(> <index' >)>! 
                                     <identifikator' >(> <index' , <index'>)>
          <index'                ::= <aritmetisk udtryk' 
           
                   hvor >identifikator> betegner navnet på talsættet. Dette skal
          være forskelligt fra navnene på de systemdefinerede funktioner. 
           
          Et talsæt skal erklæres, før det anvendes. Ved en sådan erklæring
          skal der angives dimension, og øvre indeks for hver enkel dimen-
          sion. Nedre indeks er fast lig 1. Erklæringen foregår i en DIM-
          sætning. Ved udførelse af denne sætning afsættes plads til tal-
          sættet, og de indicerede variable initialiseres til nul. 
                    
          Ved alle referencer til talsæt foretages indekscheck, dvs. det
          undersøges, om antallet af indices og deres værdier er tillade-
          lige. 
                    
           \f

         3_._5_ _ _ _ _ _ _ _S_t_r_e_n_g_v_a_r_i_a_b_l_e_                                                      3.5
           
          COMAL er i stand til at arbejde med strenge bl.a ved hjælp af
          strengvariable og strengkonstanter. 
           
          En strengvariabel kan tildeles værdi i form af en streng af
          ASCII-tegn. 
           
          COMAL har to typer af strengvariable, nemlig simple strengvari-
          able og vektorer af strengvariable (indicerede strengvariable).
          En strengvariabel har følgende opbygning: 
           
          <strengvariabel'           ::= <simpel strengvariabel'! 
                                         <indiceret strengvariabel' 
           
          <simpel strengvariabel'    ::= <strengidentifikator'! 
                                         <strengidentifikator' ( <selektor')
           
          <indiceret strengvariabel' ::= <strengidentifikator' >(> <index' >)>!
                                         <strengidentifikator' 
                                                 >(> <index' , <selektor' >)>
           
          <strengidentifikator'      ::= <identifikator' 
           
          <selektor'                 ::= <startposition' : <længde' 
           
          <startposition'            ::= <aritmetisk udtryk' 
           
          <længde'                   ::= <aritmetisk udtryk' 
           
          Strengvariable adskilles fra reelle variable ved, at der efter
          identifikatoren skal følge >>. 
           
                   Når en simpel strengvariabel kun angives ved den tilhørende
          strengidentifikator, betyder dette hele strengen af ASCII-tegn.
          Er der angivet en >selektor>, betyder dette en delstreng star-
          tende med >startposition> og med et antal tegn lig >længde>.
          Første tegn i en strengvariabel refereres med position = 1. 
           \f

          For en indiceret strengvariabel skal der angives et indeks, der
          angiver det ønskede element i vektoren. Herudover kan der eventu-
          elt være en angivelse af selektor. Betydningen af denne er som
          under simple strengvariable. 
           
          Strenge og vektorer af strenge skal erklæres i en DIM-sætning.
          Ved udførelse af denne sætning afsættes lagerplads til strengva-
          riablen, og den initialiseres med tegnværdier, hvis betydning er
          uinitialiseret (NULL). Strengens maksimale længde erklæres derfor
          i DIM-sætningen. Strengens aktuelle længde er derimod det antal
          tegn startende fra position 1 indtil det første tegn lig >NULL>.
          Ved erklæring af en streng vil den aktuelle længde derfor være 0.
           
          Ved programudførelsen foretages indekscheck, dvs. at indeks til
          strengvektor, startposition og længde er tilladelige. 
          
 
3_._6_ _ _ _ _ _ _ _A_r_i_t_m_e_t_i_s_k_e_ _u_d_t_r_y_k_ 3.6
           
              Aritmetiske udtryk indgår i en række forskellige sætninger. 
           
          Aritmetiske udtryk har følgende opbygning: 
           
          <aritmetisk udtryk' ::= ( + ! - ) <a-udtryk' 
           
          <a-udtryk'          ::= <led' ! <a-udtryk' + <led' ! <a-udtryk' - <led'
           
          <led'               ::= <faktor' ! <led'*<faktor' ! <led'/<faktor' !
                                  <led' MOD <faktor' ! <led' DIV <faktor' 
                
              <faktor'            ::= <operand' ! <faktor'    <operand' 
           
          <operand'           ::= >(> <aritmetisk udtryk' >)> ! <reelt tal' !
                                  <reel variabel' ! <systemfunktion' ! 
                                  <brugerfunktion' ! (logisk udtryk) ! 
                                  <filvariabel' ! <formel parameter' 
           
          <brugerfunktion'    ::= (FN) <identifikator'>(><aritmetisk udtryk>)
           \f

          Systemfunktioner er beskrevet i kapitel 6. 
           
          En brugerfunktion anvendt som operand skal være erklæret - i en
          DEF-sætning - inden den benyttes. Nøgleordet >FN> kan udelades
          ved kald af en brugerdefineret funktion. 
           
          Reelle variable der benyttes som operander i aritmetiske udtryk
          skal være oprettede og have fået tildelt værdier - i LET-, READ-
          eller INPUT-sætninger. 
                
               Operatoren      er potensopløftning, >MOD> er modulus, >DIV> er
          heltalsdivison. 
           
          3.6.1
3_._6_._1_ _ _ _ _ _O_p_e_r_a_t_o_r_e_r_s_ _p_r_i_o_r_i_t_e_t_ 
           
          Aritmetiske udtryk beregnes normalt fra venstre mod højre. Række-
          følgen kan dog ændres med paranteser og som følge af, at operato-
          rerne har forskellig prioritet. 
          Følgende regler gælder: 
           
          1. Udtryk i parantes beregnes først. Er der paranteser i flere
             niveauer beregnes det inderste udtryk først. 
              
          2. Derefter udregnes funktioner. 
              
          3. De aritmetiske operatorers prioriteter er: 
              
             Første: monadisk plus og monadisk minus 
             Anden:  potensopløftning 
             Tredie: multiplikation, division, modulus regning 
             Fjerde: addition og subtraktion 
              
          4. Har to operatorer samme prioritet beregnes de fra venste mod
             højre. 
              \f

         3_._7_ _ _ _ _ _ _ _S_t_r_e_n_g_u_d_t_r_y_k_ 3.7
           
          Strengudtryk benyttes ved tildeling af værdier til strengvariable
          (i LET-sætning), ved udskrivning (i PRINT-sætning) og i rela-
          tioner. 
           
          Strengudtryk har følgende opbygning: 
           
          <strengudtryk'    ::= <strengoperand' ! <strengudtryk' + <strengoperand'
           
          <strengoperand'   ::= <strengvariabel' ! <strengkonstant' ! 
                                           CHR >(> <aritmetisk udtryk' >)> 
           
          <strengkonstant'  ::= "<vilkårlig ASCII-streng undtagen CR, LF og > " >'"
           
          >+> er en strengoperator, der angiver konkatenering (sammenkædning).
           
          E_k_s_e_m_p_e_l_ 
           
          Er A= "RC" og B= "700", da har A+B værdien "RC700". 
           
          Tegnet > " > samt kontroltegn (tegn med ASCII-værdi <32) til
          f.eks cursor-styring kan indsættes i tegnstrenge ved hjælp af
          funktionen CHR (se afsnit 6.3 ). 
           
          3.8
3_._8_ _ _ _ _ _ _ _L_o_g_i_s_k_e_ _u_d_t_r_y_k_ 
           
          Logiske udtryk benyttes til at gøre sætningsudførelsen betinget. 
          Logiske udtryk indgår i IF/THEN - sætning, WHILE - sætning og
          UNTIL - sætning. 
           
          Et logisk udtryk har følgende opbygning: 
           
          <logisk udtryk'       ::= ( NOT ) <l-udtryk' 
           
          <1-udtryk'            ::= <l-led' ! <l-udtryk' OR <l-led' 
           
          <1-led'               ::= <l-operand' ! <l-led' AND <l-operand' 
           \f

          <l-operand'           ::= <relation' ! >(><logisk udtryk'>)> 
           
          <relation'            ::= <strengrelation' ! <aritmetisk relation'
           
          <strengrelation'      ::= <strengudtryk' <reloper' <strengudtryk'
           
          <aritmetisk relation'  ::= <aritmetisk udtryk' <reloper' 
          <aritmetisk udtryk' 
           
          <reloper'             ::= < ! <= ! =< ! ' ! '= ! =' ! <' ! = 
           
                   De logiske operatorer er defineret ved hjælp af følgende sand-
          hedstabeller: 
           
          NOT:      A         NOT A 
                  FALSK       SAND 
                  SAND        FALSK 
          OR:       A           B         A  OR  B 
                  FALSK       FALSK        FALSK 
                  FALSK       SAND         SAND 
                  SAND        FALSK        SAND 
                  SAND        SAND         SAND 
          AND:      A           B         A  OR  B 
                  FALSK       FALSK        FALSK 
                  FALSK       SAND         FALSK 
                  SAND        FALSK        FALSK 
                  SAND        SAND         SAND 
           
          Betydningen af relationsoperatorerne er: 
           
               '   : større end 
               '=  : større end eller lig med 
               =   : lig med 
               <'  : ikke lig med 
               <=  : mindre end eller lig med 
               <   : mindre end 
           \f

          Hvis relationen mellem to udtryk er opfyldt, er værdien sand, el-
          lers er den falsk. 
          I en strengrelation sammemlignes strengudtrykkene tegn for tegn
          fra venstre mod højre. Sammenligningen sker på grundlag af
          tegnenes ASCII-værdier (se App. A). 
          Hvis to strenge af forskellig længde sammenlignes, og de første
          tegn i den længste streng er lig med tegnene i den korteste, da
          vil den korteste streng være mindst. F.eks. er følgende relation
          sand: 
               "ABC" < "ABCD". 
           
                   Hvis logiske udtryk indgår i aritmetiske udtryk, da vil værdien
          >sand> svare til den aritmetiske værdi 1, og >falsk> til 0. 
           
          Prioriteten af de logiske operatorer er: 
           
          Første:  NOT 
             Anden :  AND 
             Tredie:  OR 
           
          Rækkefølgen af beregningerne kan ændres ved hjælp af paranteser. \f

F_       4_._ _ _ _ _ _ _ _ _C_O_M_A_L_ _S_Æ_T_N_I_N_G_E_R_ 4.
           
4_._1_ _ _ _ _ _ _ _R_E_M_ _-_ _s_æ_t_n_i_n_g_ 4.1
           
          REM - sætningen benyttes til at kommentere et program. 
          REM - sætningen har følgende opbygning: 
          <rem - sætning' ::= REM <kommentar' 
          En REM - sætning har ingen virkning ved programudførelsen. 
           
           
4_._2_ _ _ _ _ _ _ _L_E_T_ _-_ _s_æ_t_n_i_n_g_ 4.2
           
          LET - sætninger benyttes til at tildele værdier til reelle vari-
          able og strengvariable. 
           
          En LET - sætning har følgende opbygning: 
           
          <let-sætning'            ::= (LET) <tildelingsliste' 
           
          <tildelingsliste'        ::= <tildeling' ! 
                                       <tildelingsliste' ; <tildeling' 
           
          <tildeling'              ::= <aritmetisk tildeling' ! <streng tildeling'
           
          <aritmetisk tildeling    ::= <variabelliste' = <aritmetisk udtryk'
           
          <variabelliste'          ::= <reel variabel' ! 
                                       <variabelliste', <reel variabel' 
           
          <streng tildeling'       ::= <strengvariabel' = <streng udtryk' 
           
          Nøgleordet, LET, kan udelades. 
           
          I den aritmetiske tildelingssætning vil alle variable på venstre
          side af >=> få tildelt værdien af det aritmetiske udtryk. 
           \f

                   Såfremt >streng udtryk> er længere end >strengvariabel> vil >streng
          udtryk> blive afkortet, idet kun den første del vil blive benyt-
          tet. I >streng tildeling> må >strengvariable> gerne indgå i >streng
          udtryk>. Følgende tildeling er ikke alene tilladelig, men også
          hensigtsmæssig: 
           
          LET string = string+ "er" 
           
          der har den virkning at >er> bliver placeret efter de tegn, der
          tidligere er blevet placeret i string. Indeholder >strengvari-
          abel> ikke nogen selektor, vil >strengvariabel> efter tildelingen
          indeholde >streng udtryk> efterfulgt af null-tegn. Indeholder
          >strengvariabel> en selektor tildeles kun de tegn, der er
          omfattet af selektor. 
           
           
4_._3_ _ _ _ _ _ _ _D_I_M_ _-_ _s_æ_t_n_i_n_g_ 4.3
           
          DIM - sætning benyttes til at erklære reelle talsæt (vektorer og
          matricer) samt strenge og vektorer af strenge. 
           
          DIM - sætningen har følgende opbygning: 
           
          <dim-sætning'       ::= DIM <erklæringsliste' 
           
          <erklæringsliste'   ::= <erklæring' ! 
                                  <erklæringsliste' , <erklæring' 
           
          <erklæring'         ::= <talsæterklæring'! <strengerklæring' 
           
          <talsæterklæring'   ::= <identifikator' >(><aritmetisk udtryk'>)> !
                                  <identifikator' 
                                  >(><aritmetisk udtryk' , <aritmetisk udtryk'>)>
           
          <strengerklæring'   ::= <identifikator'  >(><aritmetisk udtryk'>)> !
                                  <identifiaktor'  
                                  >(><aritmetisk udtryk' , <aritmetisk udtryk'>)>
           \f

                   Identifikatoren for et reelt talsæt skal være forskellig fra alle
          identifikatorer for simple reelle variable og bruger- og system-
          definede funktioner. 
           
          Identifikatoren for en strengvariabel skal være forskellig fra
          alle identifikatorer for simple reelle variable og brugerdefine-
          rede funktioner. 
           
          Ved udførelsen af DIM - sætningen afsættes plads i dataområdet
          til de størrelser, der erklæres. Maksimumsstørrelsen for en
          indiceret variabel eller en strengvariabel er kun begrænset af
          arbejdslagerets størrelse. 
           
           
4_._4_ _ _ _ _ _ _ _D_E_F_ _-_ _s_æ_t_n_i_n_g_ 4.4
           
          En DEF - sætning benyttes til at erklære betydningen af en bruger-
          defineret funktion. 
           
          DEF - sætningen har følgende opbygning: 
           
          <def-sætning'       ::= DEF (FN) <funktionsnavn'>(><formel parameter'>)>
                                                           =<aritmetisk udtryk'
          <funktionsnavn'     ::= <identifikator' 
           
          <formel parameter'  ::= <identifiaktor' 
           
          Nøgleordet >FN> kan udelades. Identifikatoren for funktionenen
          skal være forskellig fra alle identifikatorerne for alle andre
          størrelser. En brugerdefineret funktion kan kun have n parame-
          ter. 
           
          En brugerdefineret funktion skal erklæres, før den benyttes. Det
          er tilladt at kalde andre brugerdefinerede funktioner i det
          aritmetiske udtryk, der definerer funktionen. Rekursive kald er
          ikke tilladte. 
           \f

                   Ved kald af en brugerdefineret funktion vil >formel parameter> få
          tildelt værdien af aktuel parameter, hvorefter det aritmetiske
          udtryk udregnes. Værdien af dette udtryk indsættes på brugerfunk-
          tionens plads. 
           
           
4_._5_ _ _ _ _ _ _ _P_R_I_N_T_ _-_ _s_æ_t_n_i_n_g_ 4.5
           
          PRINT - sætningen benyttes til udskrivning af resultater, enten
          tal eller tekstrenge. 
           
          PRINT - sætningen har følgende opbygning: 
           
          <print-sætning'     ::= PRINT ! 
                                  PRINT <printlist' <printafslut' ! 
                                  PRINT USING <strengudtryk' : <printlist' 
           
          <printlist'         ::= <printelement' ! 
                                  <printlist' <printseparator' <printelement'
           
          <printelement'      ::= <aritmetisk udtryk' ! <strengudtryk' ! <tabudtryk'
           
          <tabudtryk'         ::= TAB >(><aritmetisk udtryk'>)> 
           
          <printafslut'       ::= >tom> ! <printseparator' 
           
          <printseparator'    ::= , ! ; 
           
          En PRINT - sætning uden >printlist> bevirker, at den følgende ud-
          skrift starter i første position på næste linie. 
           
          Parametren >printseparator> har indflydelse på udskriftens pla-
          cering på linien. Anvendes >,> vil en linie være opdelt i 5 søj-
          ler, der starter i position 1, 17, 33, 49 og 65 og et printele-
          ment vil starte i næste søjle. Er separatoren >;> vil udskriften
          blive pakket, således at der udskrives et blanktegn foran og bag-
          efter tal, mens tegnstrenge udskrives uden omgivende blanktegn. 
           \f

                   Ved udskrift af relle tal gælder følgende regler: 
           
            - tal i området 1 <= x <= 9999999 udskrives på decimal form
              uden eksponent og med maksimalt 7 cifre. 
            - decimaltal, hvor alle cifre efter decimalpunktum er nul, ud-
              udskrives som heltal uden decimalpunkt. 
            - efterstillede nuller i decimaldel undertrykkes. 
            - eventuelt nul foran decimalpunktum udskrives 
            - tal i området x < 1 eller x '= 10000000 udskrives med eks-
              ponent og 7 cifre i mantissen, heraf 1 ciffer foran decima-
              punkt. 
           
          TAB er en tabulator-funktion, som bevirker, at næste printelement
          udskrives i den position, som argumentet angiver. Positionerne på
          linien nummereres fra 1 til 80. Er den aktuelle position større
          end argumentet for TAB-funktionen, ignoreres denne. 
           
          PRINT USING benyttes, når programmet selv ønsker at styre
          udskriften af resultater i >printlist>. >Strengudtryk> benyttes
          som formatstreng. Tegnene i dette udtryk fortolkes på følgende
          måde: 
           
              > >  cifferposition og fortegn 
              >.>  decimalpunktum (kun omgivet af  ) 
                   alle andre tegn overføres direkte til udskrift. 
           
          Kan formatet ikke opfyldes, udskrives >*>-er 
          Fortegnet kræver altid 1 position, også selvom tallet er
          positivt, i hvilket tilfælde der udskrives et blanktegn. 
           
           
4_._6_ _ _ _ _ _ _ _R_E_A_D_ _-_ _s_æ_t_n_i_n_g_4.6
           
          READ - sætningen benyttes til at tildele startværdier til reelle
          variable og strengvariable. 
           \f

          READ - sætningen har følgende opbygning: 
           
          <read-sætning'      ::= READ <variabel liste' 
           
          <variabel liste'    ::= <variabel' ! <variabel liste' , <variabel'
           
          <variabel'          ::= <reel variabel' ! <strengvariabel' 
           
          Ved udførelsen af READ - sætningen vil variablene i variabellis-
          ten få tildelt værdier på følgende måde: Den første værdi udpeg-
          et ved >Datapil> til >Dataliste> vil blive tildelt den første
          variabel i >variabel liste>, samtidig med at Datapil vil blive
          justeret til at pege på næste værdi i Dataliste. Dataliste op-
          bygges ved udførelse af DATA - sætningerne. 
           
          Stemmer den læste værdis type ikke med den angivne variables type
          eller er Dataliste udtømt stoppes udførelsen med fejludskrift. 
           
          Før programmet udføres, løbes det igennem, og alle DATA - sæt-
          ninger findes og kædes sammen til >Dataliste>. 
           
           
4_._7_ _ _ _ _ _ _ _I_N_P_U_T_ _-_ _s_æ_t_n_i_n_g_  4.7
           
          INPUT - sætningen benyttes til at indlæse værdier fra tastaturet
          og tildele disse til reelle variable og strengvariable. 
           
          INPUT - sætningen har følgende opbygning: 
           
          <input-sætning'     ::= INPUT <input liste' 
           
          <input liste'       ::= <input element' ! <input liste' , <inputelement'
           
          <input element'     ::= <variabel' ! <strengkonstant' 
           
          Udførelsen af INPUT - sætningen bevirker, at >input liste> gen-
          nemgåes fra starten, idet strengkonstanter først udskrives, her-
          efter kan brugeren indtaste en linie, der indeholder værdier i\f

          form af relle tal og en tegnkonstant. En reel værdi kan indeholde
          fortegn, cifre, decimalpunktum og eksponent. Flere reelle værdier
          adskilles af blanktegn. En strengkonstant skrives som en tegn-
          streng uden >">. Den indtastede linie gennemgåes sammen med input
          listen og værdierne tildeles. 
          Den indtastede linie gennemgåes sammen med input listen og vær-
          dierne tildeles. Indeholder input listen flere >strengkonstanter>,
          udskrives disse, når de mødes, og der vendes tilbage til indlæs-
          ning fra tastaturet. 
           
          Ved indtastning kan brugeren anvende de sædvanlige editeringsfa-
          ciliteter og indlæsningen afsluttes med >RETURN> 
           
           
4_._8_ _ _ _ _ _ _ _D_A_T_A_ _-_ _s_æ_t_n_i_n_g_ 4.8
           
          DATA - sætningen benyttes til angivelse af værdier, der skal læ-
          ses ved hjælp af READ - sætningen. 
           
          DATA - sætningen har følgende opbygning: 
           
          <data-sætning'      ::= DATA <værdi liste' 
           
          <værdi liste'       ::= <værdi' ! <værdi liste' , <værdi' 
           
          <værdi'             ::= ( + ! -) <reelt tal' ! <strengkonstant' 
           
          Ved starten af programmets udførelse (run - kommando) gennemgåes
          programmet sekventielt, og alle DATA - sætningerne kædes sammen
          til Dataliste, og Datapil sættes til at pege på den første DATA -
          sætning i listen. 
           
          DATA - sætningerne kan placeres hvor som helst i programmet. 
           
           \f

4_._9_ _ _ _ _ _ _ _R_E_S_T_O_R_E_ _-_ _s_æ_t_n_i_n_g_ 4.9
           
          RESTORE - sætningen benyttes til at retablere Datapil til at pege
          på den første DATA - sætning i Dataliste. 
           
          RESTORE - sætningen har følgende opbygning: 
           
          <restore-sætning'   ::= RESTORE 
           
          4.10
4_._1_0_ _ _ _ _ _ _B_e_t_i_n_g_e_d_e_ _s_æ_t_n_i_n_g_e_r_ 
           
          ID - COMAL har en række muligheder for at gøre udførelsen af en
          række sætninger betinget af udregnede værdier. Sproget indeholder
          den samme mulighed som standard-BASIC med if - then efterfulgt af
          et sætningsnummer. Det er også muligt at placere en vilkårlig
          sætning efter >then>. Ønskes en række sætninger udført, når en
          betingelse er opfyldt, skrives disse efter >then> og afsluttes
          med >endif>. Endelig findes if - then - else, hvorved en række
          sætninger kan udføres afhængigt af, om betingelsen er opfyldt el-
          ler ikke opfyldt. 
           
          Betinget sætning har følgende opbygning: 
           
          <betinget sætning'     ::= <if-sætning' ! <if/then-sætning' ! 
             <if/then/else-sætning' 
           
          <if-sætning'           ::= IF <logisk udtryk' THEN <sætningsnummer' !
                                     IF <logisk udtryk' THEN <sætning' 
           
          <if/then-sætning'      ::= IF <logisk udtryk' THEN 
                                     <sætningsliste' 
                                     ENDIF <kommentar' 
           
          <if/then/else-sætning' ::= IF <logisk udtryk' THEN 
                                     <sætningsliste' 
                                     ELSE <kommentar' 
                                     <sætningsliste' 
          ENDIF <kommentar' 
           \f

          <sætningsliste' må indeholde vilkårlige sætninger, også betingede
          sætninger. 
           
                   Ved en udførelse af en betinget sætning udregnes det logiske ud-
          tryk efter >if>. Er værdien af dette >sand> udføres sætningen/er-
          ne efter >then> indtil det eventuelt tilhørende >else>, hvorefter
          programudførelsen fortsætter med den næste sætning efter det til-
          hørende >endif>. Er værdien af det logiske udtryk >falsk> af-
          hænger det af den betingede sætnings form. Ved en >if-sætning>
          fortsættes med næste sætning. For en >if/then-sætning> fortsættes
          med den næste sætning efter det tilhørende >endif>. Er det en if/
          then/else-sætning> fortsættes efter >else>. 
           
           
4_._1_1_ _ _ _ _ _ _F_O_R_/_N_E_X_T_ _-_ _s_æ_t_n_i_n_g_ 4.11
           
          FOR/NEXT - sætningen benyttes, når en række sætninger skal udfør-
          es et antal gange. 
           
          FOR/NEXT - sætningen har følgende opbygning: 
           
          <for/next-sætning   ::= <for-sætning' 
                              ::= <sætningsliste' 
                              ::= <next-sætning' 
           
          <for-sætning'       ::= FOR <simpel variabel' = <startværdi' 
                                  TO <slutværdi' (STEP <trinværdi' ) DO 
           
          <startværdi'        ::= <aritmetisk udtryk' 
           
          <slutværdi'         ::= <aritmetisk udtryk' 
           
          <trinværdi'::= <aritmetisk udtryk' 
           
          <next-sætning'      ::= NEXT <simpel variabel' 
           
          Er >trinværdi> udeladt, vil dette betyde værdien 1. 
           \f

          <sætningsliste' må indeholde vilkårlige sætninger, også FOR/ NEXT
          - sætninger. 
           
                   Ved udførelsen af en FOR - sætning vil den simple variabel
          (styrevariablen) få tildelt værdien, >startværdi>, og sætnings-
          udførelsen vil fortsætte med den næste sætning i programmet.
          Ligeledes oprettes en indgang i programsætningsstakken med infor-
          mation om FOR - sætningen til brug ved udførelsen af den tilhø-
          rende NEXT - sætning. Derefter testes om området har nogen me-
          ning dvs. 
           
              <slutværdi - startværdi' * SGN(trinværdi) '= 0 
           
          Er dette ikke tilfældet overspringes FOR/NEXT - sætningen. 
           
          Når en NEXT - sætning udføres, testes først, om den simple vari-
          able angivet efter >NEXT> er identisk med styrevariablen i den
          tilhørende FOR - sætning. Er dette ikke tilfældet, afsluttes
          kørslen med fejludskrift. Ellers udregnes >trinværdi> og denne
          adderes til værdien af styrevariablen. Såfremt styrevariablens
          nye værdi ligger i området mellem >startværdi> og >slutværdi>
          fortsættes programudførelsen med første sætning efter FOR -
          sætningen, og ellers fortsættes med næste sætning efter NEXT -
          sætningen, idet den tilhørende indgang i programsætningsstakken
          afstakkes. 
           
           
4_._1_2_ _ _ _ _ _ _W_H_I_L_E_/_E_N_D_W_H_I_L_E_ _-_ _s_æ_t_n_i_n_g_ 4.12
           
          WHILE/ENDWHILE - sætningen benyttes, når en række sætninger skal
          udføres, sålænge en betingelse er opfyldt. 
           
          WHILE/ENDWHILE - sætningen har følgende opbygning: 
           
          <while/endwhile-sætning' ::= <while-sætning' 
          <sætningsliste' 
                <endwhile-sætning' 
           \f

          <while-sætning'::= WHILE <logisk udtryk' DO 
           
          <endwhile-sætning'       ::= ENDWHILE <kommentar' 
              
                   <sætningsliste' må indeholde vilkårlige sætninger også
          WHILE/ENDWHILE - sætninger. 
           
          Når en WHILE - sætning udføres, oprettes først en indgang i pro-
          gramsætningsstakken med information om WHILE - sætningen. Deref-
          ter udregnes værdien af det logiske udtryk efter >WHILE>. Har
          dette værdien >sand>, fortsættes programudførelsen med den næste
          sætning. Er værdien >falsk>, fortsættes udførelsen med den næste
          sætning efter den tilhørende ENDWHILE - sætning, og indgangen i
          programsætningsstakken afstakkes. 
           
          Udførelsen af en ENDWHILE - sætning bevirker udregning af det
          logiske udtryk i den tilhørende WHILE - sætning, og programud-
          førelsen fortsætter som ved WHILE - sætningen. 
           
 4.13
4_._1_3_ _ _ _ _ _ _R_E_P_E_A_T_/_U_N_T_I_L_ _-_ _s_æ_t_n_i_n_g_ 
           
          REPEAT/UNTIL - sætningen benyttes, når en række sætninger skal
          udføres, indtil en betingelse er opfyldt. 
           
          REPEAT/UNTIL - sætningen har følgende opbygning: 
           
          <repeat/until-sætning' ::= <repeat-sætning' 
          <sætningsliste' 
          <until-sætning' 
           
          <repeat-sætning'       ::= REPEAT <kommentar' 
           
          <until-sætning'        ::= UNTIL <logisk udtryk' 
           
          <sætningsliste' må indeholde vilkårlige, sætninger også
          REPEAT/UNTIL - sætninger. 
           \f

          En REPEAT - sætning bevirker oprettelse af en indgang i program-
          sætningsstakken med information om REPEAT - sætningen. Derefter
          fortsætter programudførelsen med den næste sætning. 
           
                   Når en UNTIL - sætning udføres, udregnes det logiske udtryk efter
          >UNTIL>. Er værdien af dette >sand> fortsætter udførelsen med den
          næste sætning efter UNTIL - sætningen, og den øverste indgang i
          programsætningsstakken fjernes. Er værdien af det logiske udtryk
          >falsk>, fortsættes med den næste sætning efter den tilhørende
          REPEAT - sætning. 
           
 
4_._1_4_ _ _ _ _ _ _L_O_O_P_/_E_N_D_L_O_O_P_ _-_ _s_æ_t_n_i_n_g_ 4.14
           
          LOOP/ENDLOOP - sætningen benyttes til at udføre en række sætning-
          er flere gange. 
           
          LOOP/ENDLOOP - sætningen har følgende udseende: 
           
          <loop/endloop-sætning' ::= <loop-sætning' 
          <sætningsliste' 
          <endloop-sætning' 
           
          <loop-sætning'       ::= LOOP <kommentar' 
           
          <endloop-sætning'      ::= ENDLOOP <kommentar' 
           
          <sætningsliste' må indeholde vilkårlige sætninger, også LOOP/
          ENDLOOP - sætninger. 
           
          En LOOP - sætning bevirker, at der oprettes en indgang i program-
          sætningsstakken med information om LOOP - sætningen, og at pro-
          gramudførelsen fortsætter med den næste sætning. 
           
          Udførelse af en ENDLOOP - sætning bevirker, at programudførelsen
          fortsætter med næste sætning efter den tilhørende LOOP - sætning.
           \f

          Udhop fra en LOOP/ENDLOOP - konstruktion kan ske ved en EXIT -
          sætning. 
           
           
         4_._1_5_ _ _ _ _ _ _E_X_I_T_ _-_ _s_æ_t_n_i_n_g_    4.15
           
          En EXIT - sætning benyttes til udhop af en løkke eller til retur
          fra et underprogram. 
           
          En EXIT - sætning har følgende opbygning: 
           
          <exit-sætning'      ::= EXIT <kommentar' 
           
          EXIT - sætningen bevirker, at programudførelsen fortsætter med
          næste sætning efter afslutning af den sidst startede løkke eller
          underprogram dvs. efter den inderste NEXT -, ENDWHILE -, UNTIL-, 
          eller GOSUB - sætning. Samtidigt fjernes den øverste indgang i
          programsætningsstakken. En EXIT - sætning vil ofte være placeret
          i en >if-sætning>. 
           
           
4_._1_6_ _ _ _ _ _ _R_E_T_U_R_N_ _-_ _s_æ_t_n_i_n_g_ 4.16
           
          RETURN - sætning benyttes til at returnere fra et underprogram. 
           
          RETURN - sætningen har følgende opbygning: 
           
          <return-sætning'    ::= RETURN <kommentar' 
           
          Ved udførelse af RETURN - sætningen fortsætter programudførelsen
          med den næste sætning efter den sætning, hvor kaldet af underpro-
          grammet foregik, og samtidigt afstakkes den øverste indgang i
          programsætningsstakken. 
           
           \f

         4_._1_7_ _ _ _ _ _ _P_R_O_C_E_D_U_R_E_ _-_ _s_æ_t_n_i_n_g_ 4.17
           
          PROCEDURE - sætningen benyttes til at definere et underprogram. 
           
          PROCEDURE - sætningen har følgende opbygning: 
           
          <procedure-sætning'    ::= <proc-sætning' 
          <sætningsliste' 
          <endproc-sætning 
           
          <proc-sætning'::= PROC <identifikator' 
          ( >(> <for.parameterliste' >)> ) 
           
          <for.parameterliste'   ::= <formel parameter' ! 
          <for.parameterliste' , <formel parameter'
           
          <formel parameter'     ::= <identifikator' 
           
          <endproc'              ::= ENDPROC <kommentar' 
           
          PROCEDURE - sætningen definerer at >sætningsliste> skal opfattes
          som et underprogram med navnet >identifikator> efter >PROC>. 
          Navnet på underprogrammet skal være forskelligt fra alle identi-
          fikatorer på brugerdefinerede funktioner samt reelle og streng-
          variable. 
           
          En PROCEDURE - sætning kan placeres et vilkårligt sted i program-
          met. En eventuel >for.parameterliste> indeholder en eller flere
          formelle parametre, der indgår som identifikatorer i procedurens
          sætningsliste. Formelle parametre kan indgå som simple eller in-
          dicerede reelle variable, simple eller indicerede strengvariable,
          brugerdefinerede funktioner, aktuelle parammtre, procedurer samt
          filvariable. Navnene på de formelle parametre skal være forskel-
          lige fra navnene på andre størrelser. 
           
          Ved udførelse af et underprogram vil de formelle parametre blive
          erstattet af de aktuelle parametre. 
           
           \f

         4_._1_8_ _ _ _ _ _ _P_r_o_c_e_d_u_r_e_k_a_l_d_ 4.18
           
          Procedurekald benyttes til at få udført et underprogram. 
           
          Procedurekald har følgende opbygning: 
           
          <kalde-sætning'     ::= EXEC <identifikator' 
                                       ( >(> <akt.parameterliste' >)> ) 
           
          <akt.parameterliste ::= <aktuel parameter' ! 
                                  <akt.parameterliste' , <aktuel parameter'
           
          <aktuel parameter'  ::= <aritmetisk udtryk' ! <strengvariabel' ! 
          <identifikator' 
           
          Denne sætning bevirker, at underprogrammet betegnet ved >identi-
          fikator> startes. Programudførelsen fortsætter i underprogrammet
          indtil RETURN sætning eller ENDPROC-sætning mødes. Derefter
          fortsætter programudførelsen med næste sætning efter kaldet. 
           
          Indeholder procedurekaldet en aktuel parameterliste, skal antal-
          let af aktuelle parametre og deres type stemme med den formelle
          parameterliste i procedureerklæringen. 
           
          Reglerne for substitution af de formelle parametre med de aktuel-
          le parametre er følgende: 
           
          - aktuel parameter er identifikator for 
                 - en simpel reel variabel 
                     - en datasætidentifikator 
                     - en formel parameter 
                     - en procedure 
                     - en filvariabel 
                da vil formel parameter blive erstattet med en reference
                til aktuel parameter (call by reference). 
              - aktuel parameter er en strengvariabel, formel parameter er-
                stattes af reference til strengvariabel samt længde \f

                       - aktuel parameter er et aritmetisk udtryk, værdien at udtryk-
                ket udregnes og der oprettes en lokal variabel, der initia-
                liseres med værdien (call by value). Ønskes en aktuel vari-
                abel opfattet som >call by value> omgives den af paranteser.
           \f

F_       5_._ _ _ _ _ _ _ _ _S_P_E_C_I_E_L_L_E_ _S_Æ_T_N_I_N_G_E_R_ 5.
           
          Foruden de i kaptiel 4 nævnte COMAL - sætninger, indeholder COMAL
          systemet nogle sætninger, der anvendes i specielle tilfælde. 
          Disse omfatter: 
           
          - BASIC - sætninger 
          - sætninger til styring af ydre enheder 
           
          BASIC - sætningerne GOTO, GOSUB og ON er medtaget for at gøre det
          muligt at udføre eksisterende BASIC-programmer. 
          IN og OUT sætningerne gør det muligt at styre specielle ydre en-
          heder tilsluttet mikrodatamatsystemet (se brugervejledningen). 
          Diskette og skærm kan i_k_k_e_ styres med disse sætninger! 
           
           
5_._1_ _ _ _ _ _ _ _G_O_T_O_ _-_ _s_æ_t_n_i_n_g_ 5.1
           
          GOTO - sætningen benyttes til at bryde den normale sekventielle
          programudførelse for at fortsætte programudførelsen med en speci-
          fik sætning. 
           
          GOTO - sætningen har følgende opbygning: 
           
          <goto-sætning'      ::= GOTO <sætningsnummer' ! 
          GO TO <sætningsnummer' 
           
          Programudførelsen vil fortsætte med sætningen angivet ved heltal-
          let efter >GOTO>. Findes ingen sætning med dette sætningsnummer,
          afbrydes programudførelsen med fejlskrift. Det frarådes, at an-
          vende GOTO - sætningen ved udhop fra en indre løkke idet løkke-
          strukturen herved kan ødelægges, hvorved kørslen senere kan blive
          afsluttet med fejludskrift. Udhop fra en løkke bør ske med en
          EXIT - sætning. 
           \f

         5_._2_ _ _ _ _ _ _ _O_N_ _-_ _s_æ_t_n_i_n_g_ 5.2
           
          ON - sætningen benyttes til at fortsætte programudførelsen
          afhængig af værdien at et udtryk. 
           
          ON - sætningen har følgende opbygning: 
           
          <on-sætning'         ::= ON <aritmetisk udtryk' GOTO <sætningsnummerliste'
           
          <sætningsnummerliste'::= <sætningsnummer' ! 
          <sætningsnummerliste' , <sætningsnummer'
           
          Ved udførelsen af en ON - sætning udregnes det aritmetiske udtryk
          mellem >ON> og >GOTO>. Den udregnede værdi selekterer det sæt-
          ningsnummer i listen, hvorfra udførelsen skal fortsætte. Er vær-
          dien lig 1, fortsættes med sætningen angivet ved første nummer i
          listen osv. Er udtrykkets værdi negativt, nul eller større end
          antallet af sætningsnumre fortsættes med den næste sætning efter
          ON - sætningen. 
           
           
5_._3_ _ _ _ _ _ _ _O_N_ _E_S_C_ _-_ _s_æ_t_n_i_n_g_ 5.3
 
               ON ESC-sætningen bruges til at angive, at der skal udføres en
               sætning (som er anført i forbindelse med ON ESC-sætningen), hvis 
          brugeren trykker på >ESC>-tasten, mens programmet udføres. Hvis
          en ON-ESC-sætning ikke er udført, vil et tryk på >ESC>-tasten
          bevirke, at programudførelsen afbrydes. 
           
          ON ESC-sætningen har følgende opbygning: 
           
          <on esc-sætning' :: = ON ESC <sætningsnummer'! 
                                ON ESC <sætning' 
           
          Bemærk, at udførelsen af selve ON ESC-sætningen i sig selv ikke
          har nogen virkning. Når sætningen er udført, vil en aktivering af
          >ESC>-tasten imidlertid bevirke, at enten <sætning' udføres,
          eller at programudførelsen fortsætter ved sætningen med nummer
          <sætningsnummer'. Hvis >ESC>-tasten aktiveres igen, vil\f

          programudførelsen blive afbrudt, med mindre der er udført endnu
          en ON ESC-sætning. 
          <sætning' vil ofte være en EXEC-sætning, og den procedure, der
          kaldes, vil ofte blive indledt af en ny ON ESC-sætning. 
           
           
5_._4_ _ _ _ _ _ _ _G_O_S_U_B_ _-_ _s_æ_t_n_i_n_g_ 5.4
           
          GOSUB - sætningen benyttes til at kalde et underprogram. 
           
          GOSUB - sætningen har følgende opbygning: 
           
          <gosub-sætning'     ::= GOSUB <sætningsnummer' 
           
          Når en GOSUB - sætning udføres, fortsættes programudførelsen med
          den sætning, der angives ved >sætningsnummer>, samtidigt stakkes
          information i programsætningsstakken, således at programudførel-
          sen kan fortsætte når underprogrammet er udført (RETURN - sæt-
          ning). 
           
          Eksisterer der ingen sætning med det givne sætningsnummer, af-
          brydes kørslen med fejludskrift. 
           
          Det er muligt i et underprogram at kalde andre underprogrammer. 
          
 
         5_._5_ _ _ _ _ _ _ _I_N_ _-_ _s_æ_t_n_i_n_g_                                                        5.5
           
          IN - sætningen benyttes til læse fra ydre enheder tilsluttet mi-
          krodatamatsystemet. 
           
          IN - sætningen har følgende opbygning: 
           
          <in-sætning'        ::= IN <input port' , <variabel' 
           
          <input port'        ::= <aritmetisk udtryk' 
           
          Fra den port, der udpeges ved >input port> indlæses en værdi (0 -
          255) og denne værdi tildeles >variabel>. 
           
           \f

5_._6_ _ _ _ _ _ _ _O_U_T_ _-_ _s_æ_t_n_i_n_g_ 5.6
           
          OUT - sætningen benyttes til at udskrive en værdi til en ydre en-
          hed tilsluttet mikrodatamatsystemet. 
           
          OUT - sætning har følgende opbygning: 
           
          <out-sætning'       ::= OUT <output port' , <værdi' 
           
          <output port'       ::= <arimetisk udtryk' 
           
          <værdi'             ::= <aritmetisk udtryk' 
           
          Til den port, der udpeges ved >output port>, udskrives >værdi>.
          Både >output port> og >værdi> tages modulo 256. 
           
          Ved hjælp af IN- og OUT-sætningerne er det muligt at skrive en-
          hedsdrivere i COMAL. Anvendelsen af disse sætninger bør ske med
          stor forsigtighed på grund af sætningernes meget maskinnære sta-
          tus. 
           
           
         5_._7_ _ _ _ _ _ _ _R_A_N_D_O_M_I_Z_E_ _-_ _s_æ_t_n_i_n_g_                                                 5.7
               
          RANDOMIZE sætningen benyttes, når man ønsker, at de tilfældige
          tal, genereret af RND - funktionen (se afsnit 6.4), skal starte
          et tilfældigt sted i sekvensen af (pseudo-) tilfældige tal. 
           
          RANDOMIZE - sætningen har følgende opbygning: 
           
          <randomize-sætning' ::= RANDOMIZE 
           
          Normalt vil RND-funktionen generere samme sekvens af tilfældige
          tal efter hver RUN-kommando. Dette kan være nyttigt under program-
          afprøvning. 
           
          RANDOMIZE - sætningen genererer en tilfældig startværdi for
          sekvensen på basis af et internt register i maskinen. 
           
           \f

         5_._8_ _ _ _ _ _ _ _O_U_T_P_U_T_ _-_ _s_æ_t_n_i_n_g_ 5.8
           
          OUTPUT sætningen benyttes til at dirigere udskrifter til enten
          skærmen eller en tilsluttet enhed. 
           
          OUTPUT-sætningen har følgende opbygning: 
           
          <output-sætning' :: = OUTPUT <output-enhed' 
          <output-enhed'   :: = PRINTER ! CONSOLE 
           
          Det er tilstrækkeligt at skrive første bogstav af navnet. 
           
          Sætningen bevirker, at udskriften fra de efterfølgende PRINT og
          PRINT USING sætninger bliver dirigeret til den specificerede
          enhed. 
           \f

F_       6_._ _ _ _ _ _ _ _ _S_T_A_N_D_A_R_D_F_U_N_K_T_I_O_N_E_R_ 6.
           
          COMAL indeholder en række standardfunktioner, som kan indgå i
          aritmetiske udtryk og strengudtryk. De har alle et tre-bogstavs
          navn og t argument. 
           
           
6_._1_ _ _ _ _ _ _ _M_a_t_e_m_a_t_i_s_k_e_ _f_u_n_k_t_i_o_n_e_r_ 6.1
           
          SIN(X):   sinus til X, hvor X angives i radianer. 
           
          COS(X):   cosinus til X, hvor X angives i radianer. 
           
          TAN(X):   tangens til X, hvor X angives i radianer. 
           
          ATN(X):   arcus tangens til X, resultatet er i radianer. 
           
          LOG(X):   den naturlige logaritme af X, X'0 
           
          EXP(X):   eksponentialfunktionen af X, 
          -88 < X < 88 
          SQR(X):   kvadratroden af X, X' = 0 
           
          Argumenterne kan være aritmetiske udtryk. 
           
           
6_._2_ _ _ _ _ _ _ _A_n_d_r_e_ _a_r_i_t_m_e_t_i_s_k_e_ _f_u_n_k_t_i_o_n_e_r_ 6.2
           
          ABS(X):   den absolutte værdi af X 
           
          INT(X):   den hele del af X, dvs. det nærmeste heltal, som er
          mindre end eller lig med X. 
          INT (3.5) = 3 ; INT(-3.5) = -4 
           
          SGN(X):   X < 0  :  SGN(X) = -1 
          X = 0  :  SGN(X) = 0 
          X ' 0  :  SGN(X) = 1 
           
                   Argumenterne kan være aritmetiske udtryk. 
           \f

6_._3_ _ _ _ _ _ _ _S_t_r_e_n_g_-_o_r_i_e_n_t_e_r_e_d_e_ _f_u_n_k_t_i_o_n_e_r_ 6.3
           
          CHR(X):   returnerer et tegn, hvis ASCII-værdi (se APP. A) er X
                    modulo 256. 
                    CHR - funktionen kan anvendes i strengudtryk. 
           
          LEN(<strengudtryk'): returnerer et reelt tal, som er lig den
                               aktuelle længde af <strengudtryk'. 
           
          ORD(<strengudtryk'): returnerer ASCII-værdien af det første tegn
                               i <strengudtryk'. 
           
           
6_._4_ _ _ _ _ _ _ _D_i_v_e_r_s_e_ _f_u_n_k_t_i_o_n_e_r_ 6.4
           
          RND(X):   returnerer et pseudo-tilfældigt tal mellem 0 og 1. Argu-
          mentet benyttes ikke og ændres ikke. Se også afsnit
                    5.7. 
           
          TAB(X): benyttes i PRINT - sætninger (se afsnit 4.5). 
           \f

F_       7_._ _ _ _ _ _ _ _ _F_I_L_S_Y_S_T_E_M_ 7.
           
          COMAL besidder faciliteter for behandling af data lagret på dis-
          ketter. Data på disketten er organiseret i form af filer, hvor en
          fil består af en række poster med fast længde. 
           
          En diskette kan højst indeholde 90 filer. 
           
          Før der læses eller skrives fra/til en fil, skal denne oprettes
          ved en create sætning eller åbnes ved en open-sætning. I de to
          initialiseringssætninger skal der som parametre angives filnavn-
          et, som skal placeres i kataloget, eller som findes i kataloget.
          Desuden angives en identifikator, filreferencen, som benyttes ved
          alle senere referencer til filen. 
           
          Til brug som buffer ved overførsel til/fra filen skal der angives
          en vektor (reel eller streng), der er stor nok til at rumme en
          blok på 128 oketter, dvs. enten en strengvariabel med 128 tegn
          eller et reelt talsæt med 32 elementer. Denne buffer må ikke
          benyttes til andre formål, sålænge filen er åben. 
           
          I de to initialiseringsætinger skal postlængden angives. Ved cre-
          atesætningen angives også antallet af poster i filen. Postlængden
          angiver antallet af oktetter i posten. Reelle tal fylder 4
          oktetter, mens strengvariable fylder et antal oktetter svarende
          til antallet af tegn. 
           
          Læsning eller skrivning fra/til en fil sker ved angivelse af fil-
          reference og postnummer. De variable, hvortil/fra der skrives/læ-
          ses angives ved en liste. Variablene kan omfatte reelle variable
          eller strengvariable. Angives identifikatorer for reelle datasæt
          eller strengvektorer, læses eller skrives alle elementerne. 
           
          Efter en læsning eller skrivning vil filreferencen tildeles vær-
          dien af returkoden ved operationen (se app. B). Filvariablen vil
          kunne indgå som operand i aritmetiske og logiske udtryk. 
           \f

          Når behandlingen af filen er afsluttet, udføres en close-sætning
          på filen, hvorved den tilhørende buffer og filvariabel kan benyt-
          tes til andre formål. 
           
                   COMAL>s filsystem omfatter følgende sætninger: 
           
          <fil-sætning'       ::= <create-sætning' ! 
                                  <delete-sætning' 
                                  <open-sætning' ! 
                                  <get-sætning' ! 
                                  <put-sætning' ! 
                                  <close-sætning'! 
                                  <chain-sætning' 
          I det følgende beskrives hver enkelt sætningstype. 
           
           
7_._1_ _ _ _ _ _ _ _C_R_E_A_T_E_ _-_ _s_æ_t_n_i_n_g_ 7.1
           
          CREATE - sætning benyttes til at oprette en ny fil for lagring af
          data. 
           
          En CREATE-sætning har følgende opbygning: 
           
          <create-sætning'    ::= CREATE <filnavn' , <filvariabel' , <filbuffer' ,
          <postlængde' , <postantal' 
           
          <filnavn'           ::= <strengudtryk' 
           
          <filvariabel'::= <identifikator' 
           
          <filbuffer'         ::= <identifikator' ! <strengidentifikator' 
           
          <postlængde'        ::= <aritmetisk udtryk' 
           
          <postantal'         ::= <aritmetisk udtryk' 
           
          Når denne sætning udføres, oprettes en fil med navn, som angivet
          i første parameter. Filens størrelse vil blive >postlængde> *
          >postantal> tegn, dog forhøjet til det nærmeste antal hele blokke.
           \f

                   Parametren >filbuffer> skal være en identifikator for en reel in-
          diceret variabel eller en strengvariabel, der er lang nok til at
          rumme en blok (128 oktetter) fra filen. Denne buffer må ikke
          anvendes til andre formål. 
           
          Efter oprettelse af filen vil indholdet være udefineret. 
           
          Der kan højst oprettes 90 filer på en diskette. .
           
          Udføres sætningen korrekt vil >filvariabel> indeholde værdien >0>
          Kan sætningen ikke udføres korrekt, vil værdien være forskellig
          fra 0 (se app. B). Programudførelsen vil blive afbrudt med en
          fejlmelding, hvis filvariabel eller buffervariabel er brugt til
          andre formål, eller hvis filnavn eller postlængde ikke er
          lovlige. 
           
           
7_._2_ _ _ _ _ _ _ _D_E_L_E_T_E_ _-_ _s_æ_t_n_i_n_g_ 7.2
           
          DELETE-sætning benyttes til at slette en fil på en diskette.  
           
          En DELETE-sætning har følgende opbygning: 
           
          <delete-sætning' :: = DELETE <filnavn' 
           
          Hvis filen ikke findes eller har forkert type afbrydes
          programudførelsen med en fejlmelding. Filen skal være lukket med
          en CLOSE-sætning før den slettes. 
           
           
7_._3_ _ _ _ _ _ _ _O_P_E_N_ _-_ _s_æ_t_n_i_n_g_ 7.3
           
          OPEN - sætning benyttes til at åbne en allerede eksisterende fil
          for læsning eller skrivning. 
           
          En OPEN - sætning har følgende opbygning: 
           
          <open-sætning'      ::= OPEN <filnavn' , <filvariabel' , <filbuffer' ,
          <postlængde' 
           \f

          Når denne sætning udføres åbnes filen betegnet med >filnavn> for
          læsning og skrivning. Filen skal være oprettet i et tidligere
          COMAL-job, og der kan eventuelt tidligere være skrevet poster i
          filen. 
           
          Parametren >filbuffer> skal være identifikator for en reel indi-
          ceret eller en strengvariabel, der er lang nok til at rumme en
          blok (128 oktetter) fra filen. Denne buffer må ikke anvendes til
          andre formål. 
           
          Postlængde angiver længden af posterne i oktetter benyttet i de
          efterfølgende GET - og PUT - sætninger. 
           
          Efter udførelse af sætningen vil >filvariabel> indeholde retur-
          koden, der kan testes i logiske udtryk. Returkode = 0 vil betyde
          korrekt åbning. Se iøvrigt app. B. og afsnit 7.1 om create-sæt-
          ningen.
          
 
         7_._4_ _ _ _ _ _ _ _G_E_T_ _-_ _s_æ_t_n_i_n_g_                                                       7.4
           
          GET - sætning benyttes til at indlæse reelle værdier og streng-
          værdier til reelle variable og strengvariable fra en fil. 
           
          GET - sætningen har følgende opbygning: 
           
          <get-sætning'       ::= GET <filvariabel' , <postnummer' : <variabelliste'
           
          <postnummer'        ::= <aritmetisk udtryk' 
           
          <variabelliste'     ::= <variabelelement' ! 
          <variabelliste' , <variabelelement' 
           
          <variabelelement    ::= <reel variabel' ! <strengvariabel' ! 
          <identifikator' ! <strengidentifikator' 
           
          Parametren, >filvariabel> skal angive en idenfikator nævnt i en
          tidligere udført CREATE - eller OPEN - sætning. >postnummer> an-
          giver det sted i filen, hvorfra læsning skal starte. 
           \f

          De variable, hvortil der læses, angives ved >variabelliste>. I
          denne liste kan findes simple og indicerede reelle variable, sim-
          ple og indicerede strengvariable samt identifikatorer for datasæt
          og vektorer af strenge. I sidste tilfælde vil hele datasættet el-
          ler strengvektoren få tildelt en værdi. Det antal oktetter, der
          læses, kan være større end filens postlængde. 
           
          Ved læsning fra filen udføres ingen kontrol af om de læste
          værdier passer med variabellistens typer. 
           
          Efter udførelse af sætningen vil >filvariabel> få tildelt værdien
          af returkoden. Returkode = 0 betyder korrekt læsning, mens <' 0
          angiver fejl (see app. B). Hvis filen ikke er åbnet, afbrydes
          programudførelsen med en fejludskrift. 
           
           
         7_._5_ _ _ _ _ _ _ _P_U_T_ _-_ _s_æ_t_n_i_n_g_                                                       7.5
           
          PUT - sætning benyttes til at udskrive reelle værdier og streng-
          værdier fra reelle variable og strengvariable til en fil. 
           
          PUT - sætningen har følgende opbygning: 
           
          <put-sætning'       ::= PUT <filvariabel' , <postnummer' : <variabelliste'
           
          <postnummer'        ::= <aritmetisk udtryk' 
           
          <variabelliste'     ::= <variabelelement' ! 
          <variabelliste' , <variabelelement' 
           
          <variabelelement'   ::= <reel variabel' ! <strengvariabel' ! 
          <identifikator' ! <strengidentifikator' 
           
          Parametren, >filvariabel> skal angive en identifikator nævnt i en
          tidligere udført CREATE - eller OPEN - sætning. >Postnummer> an-
          giver det sted i filen, hvortil skrivning skal starte. De vari-
          able, hvorfra der læses, angives ved >variabelliste>. I denne li-
          ste kan findes simple og indicerede strengvariable samt identifi-\f

          katorer for datasæt og vektorer af stenge. I sidste tilfælde vil
          hele datasættet eller strengvektoren blive udskrevet. Det antal
          oktetter, der skrives, kan være større end filens postlængde. Det
          vil sige, at man (utilsigtet) kan komme til at overskrive data i
          den efterfølgende post. Efter udførelse af sætningen vil >filva-
          riabel> få tildelt værdien af returkoden. Returkode = 0 betyder
          korrekt skrivning, mens <' 0 angiver fejl (se app. B). Hvis filen
          ikke er åbnet, afbrydes programudførelsen med en fejludskrift. 
           
           
         7_._6_ _ _ _ _ _ _ _C_L_O_S_E_ _-_ _s_æ_t_n_i_n_g_                                                     7.6
           
          CLOSE - sætningen benyttes til at afslutte behandlingen af en
          fil. 
           
          CLOSE - sætningen har følgende opbygning: 
           
          <close-sætning'     ::= CLOSE <filvariabel' 
           
          Den fil, der udpeges ved filvariabel, lukkes, hvorved den tilhø-
          rende filbuffer kan benyttes til andre formål. 
           
           
7_._7_ _ _ _ _ _ _ _C_H_A_I_N_ _-_ _s_æ_t_n_i_n_g_ 7.7
           
          CHAIN-sætningen benyttes, hvis man ønsker, at systemet, når et
          program er færdigt, automatisk skal indlæse et andet fra
          disketten og starte dette. 
           
          CHAIN-sætningen har følgende opbygning: 
           
          <chain-sætning' :: = CHAIN <filnavn' 
           
          Systemet fjerner det aktuelle program fra programområdet, ind-
          læser et nyt program fra filen <filnavn' og starter dette. 
           
          Dette svarer til, at brugeren når det aktuelle program er afslut-
          tet, indtaster de tre kommandoer NEW, LOAD <filnavn' og RUN (se
          kapitel 8). 
           \f

          Hvis filen ikke findes eller har forkert type, afbrydes program-
          udførelsen med en fejlmelding. I dette tilfælde vil det oprinde-
          lige program stadig være i lageret. 
           
           \f

F_       8_._ _ _ _ _ _ _ _ _S_Y_S_T_E_M_K_O_M_M_A_N_D_O_E_R_ 8.
           
          I RC700 COMAL findes en række kommandoer, der kan anvendes til: 
           
              - udvikling af programmer 
              - afvikling af programmer 
              - dynamisk fejlfinding 
              - kalkulator funktioner 
              - fil håndtering 
           
          En kommando udføres øjeblikkeligt og adskiller sig fra en pro-
          gramlinie ved ikke at begynde med et linienummer. 
          Kommandoen indledes med et navn, der evt. efterfølges af en eller
          flere parametre. 
           
           
8_._1_ _ _ _ _ _ _ _S_l_e_t_n_i_n_g_ _a_f_ _P_r_o_g_r_a_m_s_æ_t_n_i_n_g_e_r_ 8.1
           
          Denne kommando benyttes til at slette en eller flere linier i et
          program. 
           
          Kommandoen har følgende opbygning 
           
          <slette-kommando'   ::= <linienummer' ! 
          <start linienummer',<slut linienummer' 
           
          Benyttes den sidstnævnte form slettes alle linier fra og med
          linie <start linienummer' til og med <slut linienummer' 
           
           
         8_._2_ _ _ _ _ _ _ _A_U_T_O_ 8.2
           
          AUTO - kommandoen benyttes, når systemet automatisk skal generere
          voksende linienumre ved programindtastning. 
           
          AUTO - kommandoen har følgende opbygning: 
           
          <auto-kommando'     ::= AUTO ( <startlinie' ( , <interval' ) ) 
           \f

          Når denne kommando er indtastet, vil programindtastningen gå ind
          i en autolinieringstilstand, hvor systemet automatisk genererer
          sætningsnumre, før indtastning af en linie. 
           
          Den første parameter, >startlinie> angiver sætningsnummer for
          første linie. Når denne programlinie er indtastet, adderes >in-
          terval> til sætningsnumret, og dette vil blive udskrevet. Angives
          ingen parameter >interval> vil denne være 10. Udelades >startli-
          nie> sættes denne til 10. 
           
          Autolinieringstilstanden forlades ved at trykke på >ESC>. 
           
           
8_._3_ _ _ _ _ _ _ _B_Y_E_ 8.3
           
          BYE - kommandoen anvendes når man ønsker at forlade COMAL og ud-
          føre et andet af de programmer, som er indeholdt i RC700-systemet
          (se brugervejledningen). 
           
          BYE - kommandoen har følgende opbygning: 
           
          <bye-kommando'      ::= BYE 
           
          BYE - kommandoen sletter program- og dataområdet. 
           
           
         8_._4_ _ _ _ _ _ _ _C_O_N_ 8.4
           
          CONtinue - kommandoen benyttes til at genstarte udførelsen af et
          program, der er stoppet som følge af en fejl, med ESCape, eller
          efter udførelse af en END eller STOP sætning. 
           
          CONTINUE - kommandoen har følgende opbygning: 
           
          <continue-kommando' ::= CON 
           
          Kommandoen bevirker af program-udførelsen genoptages med sætning-
          en umiddelbart efter den sætning, der forårsagede standsning af
          udførelsen. 
           \f

          Dataområdet, der rummer variables værdier, samt stakken med in-
          formation om underprogramkald og løkke-sætninger berøres ikke.
          Man skal derfor være forsigtig med at ændre i programmet, før
          CON-kommandoen benyttes. 
           
           
8_._5_ _ _ _ _ _ _ _D_E_L_E_T_E_ 8.5
           
          DELETE - kommandoen benyttes til at slette en fil på disketten. 
           
          DELETE - kommandoen har følgende opbygning: 
           
          <delete-kommando'   :: DELETE <filnavn' 
           
          Bemærk: Systemfiler kan ikke slettes. Angående filtyper se afsnit
          8.11. 
           
           
         8_._6_ _ _ _ _ _ _ _E_D_I_T_ 8.6
           
          EDIT - kommandoen benyttes til at rette i en eller flere allerede
          indtastede programlinier. 
           
          EDIT - kommandoen har følgende opbygning: 
           
          <edit-kommando'     ::= EDIT <edit område' 
           
          <edit område'       ::= >tom> ! 
          <start linienummer' ! 
          <start linienummer' , <slut linienummer' !
          <start linienummer', * 
           
          Mangler >edit område>, betyder det hele programmet. Mangler >slut
          linienummer> vil området kun bestå af den sætning, der udpeges
          ved >start linienummer>. Parameteren >*> betyder til og med
          sidste sætning i programmet. 
           \f

          Ved udførelsen af EDIT - kommandoen vil første sætning i området
          blive udskrevet nederst på skærmen og markøren vil blive placeret
          efter linienumret. Brugeren kan nu ved hjælp af systemets edite-
          ringsfaciliter (se afsnit 2.3) rette den pågældende sætning. Når
          sætningen er rettet, tastes >RETURN> og sætningen syntaksanaly-
          seres og lagres. Derefter udskrives den næste sætning der så kan
          rettes. 
           
          EDIT - kommandoen afsluttes, når den sidste sætning i området er
          blevet rettet, eller brugeren trykker på ESCape. 
           
          Det er muligt at ændre linienummeret, virkningen af dette er, at
          linien placeres svarende til linienumret. 
           
           
         8_._7_ _ _ _ _ _ _ _H_E_L_P_ 8.7
           
          HELP - kommandoen udskriver navnene på de kommandoer, der er in-
          deholdt i systemet. 
           
          HELP - kommandoen har følgende opbygning: 
           
          <help-kommando'::= HELP 
           
           
8_._8_ _ _ _ _ _ _ _L_E_T_ 8.8
           
          LET - kommandoen benyttes til at tildele værdier direkte fra kon-
          sollen. 
           
          LET - kommandoen har følgende opbygning: 
           
          <let-kommando'      ::= LET <tildelingsliste' 
           
          LET - kommandoen har samme virkning som LET - sætningen. 
           
          Det har kun mening at anvende LET - kommandoen før CON eller RUN
          <linienummer', da data-arealet slettes ved udførelse af en RUN-
          kommando. 
           
           \f

8_._9_ _ _ _ _ _ _ _L_I_S_T_8.9
           
          LIST - kommandoen benyttes til udskrivning af en eller flere li-
          nier i det indtastede program. 
           
          LIST - kommandoen har følgende opbygning: 
           
          <list-kommando'     ::= LIST <list område' 
           
          <list område'       ::= >tom> ! 
                                  <start linienummer' ! 
          <start linienummer' , <slut linienummer' !
                                  <start linienummer', * 
                   Mangler >list område> betyder det hele programmet. Mangler >slut
          linienummer> vil området kun bestå af den sætning, der udpeges
          ved >start linienummer>. Parameteren >*> betyder til og med sid-
          ste sætning i programmet. Ved udførelsen af LIST - kommandoen ud-
          skrives sætningerne i det angivne område. 
           
          Ved udskriften vil variable og brugerdefinerede funktioner ud-
          skrives med store bogstaver, mens nøgleord og systemdefinerede
          funktioner udskrives med små bogstaver. For at lette læseligheden
          vil der ske indrykning af sætninger i løkker og if/then(/else)-
          sætninger. 
           
          Listningen kan ske enten på skærmen eller på en tilsluttet prin-
          ter (se OUTPUT-kommandoen, afsnit 8.13). 
           
           
8_._1_0_ _ _ _ _ _ _L_O_A_D_ 8.10
           
          LOAD - kommando benyttes til indlæsning af et program lagret i en
          fil på disketten. 
           
          LOAD - kommandoen har følgende opbygning. 
           
          <load-kommando'     ::= LOAD <filnavn' 
           \f

          Når programmet er indlæst, kan det startes, LIST>es eller
          modificeret på samme måde, som hvis det var indtastet fra
          tastaturet. 
          Før programmet indlæses, udfører systemet en NEW - kommando, så
          programområdet er tomt. 
           
           
         8_._1_1_ _ _ _ _ _ _L_O_O_K_U_P_ 8.11
           
          LOOKUP - kommandoen benyttes til udskrivning af navnene på de
          filer, der findes på disketten. 
           
          LOOKUP - kommandoen har følgende opbygning: 
           
          <lookup-kommando'   ::= LOOKUP 
           
          Filerne listes på følgende form: 
           
          <filnavn' <fil-type' <længde' 
           
          <fil-type'  : en t-bogstavs kode, der angiver filens type. 
          Følgende typer findes: 
                        s  systemfil 
                        b  fil, der indeholder et SAVE>d program 
                        d  datafil, oprettet af et COMAL-program 
           
          <længde'    : filens længde i blokke a 128 oktetter. 
           
          Listningen kan fås enten på skærmen eller på en tilsluttet prin-
          ter (se afsnit 8.13). 
           
           
8_._1_2_ _ _ _ _ _ _N_E_W_ 8.12
           
          NEW - kommandoen benyttes til at slette et allerede eksisterende
          program og de tilhørende data, således at der kan ske indtastning
          af et nyt program. 
           \f

          NEW - kommandoen har følgende opbygning: 
           
          <new-kommando'      ::= NEW 
           
          Der udføres automatisk en NEW - kommando ved opstart og før et
          program indlæses ved hjælp af LOAD - kommandoen. 
           
           
         8_._1_3_ _ _ _ _ _ _O_U_T_P_U_T_ 8.13
           
          OUTPUT - kommandoen benyttes til at dirigere udskrifter til enten
          skærmen eller tilsluttet printer. 
           
          OUTPUT - kommandoen har følgende opbygning: 
           
          <output-kommando'   ::= OUTPUT <output-enhed' 
           
          <output-enhed'      ::= PRINTER ! CONSOLE 
           
          Det er tilstrækkeligt at skrive første bogstav af navnet. 
           
          Kommandoen bevirker at udskrifter fra PRINT og PRINT USING sæt-
          ninger samt fra LIST OG LOOKUP kommandoer bliver dirigeret til
          den specificerede enhed. 
          Fejludskrifter samt udskrifter fra INPUT - sætninger vil altid
          fremkomme på skærmen. 
          Efter udførelsen af en kommando udfører systemet automatisk en
          >OUTPUT C> - kommando, således at udskrifter fremkommer på skær-
          men indtil en ny >OUTPUT P> -kommando udføres. 
           
           
8_._1_4_ _ _ _ _ _ _P_R_I_N_T_ 8.14
           
          PRINT - kommandoen benyttes til at udskrive værdien af reelle
          variable og strengvariable. 
           
          PRINT - kommandoen har følgende opbygning: 
           
          <print-kommando'    ::= PRINT <printlist' 
           
          PRINT - kommandoen har samme virkning som PRINT - sætningen. 
           
           \f

         8_._1_5_ _ _ _ _ _ _R_E_N_U_M_B_E_R_ 8.15
           
          RENUMBER - kommandoen benyttes til at omnummerere sætningerne i
          et program. 
           
          RENUMBER - kommandoen har følgende opbygning: 
           
          <renumber-kommando'    ::= RENUMBER <område specifikation' 
           
          <område specifikation' ::= >tom> ! 
                                     <start linienummer' ! 
                                     <start linienummer' , <trin' ! 
                                     , <trin' 
           
          Programmet omnummereres således at første linie i programmet får
          >start linienummer>. Såfremt denne parameter ikke er specificeret
          antages startværdien =10. Derefter adderes >trin> til denne værdi,
          og dette bliver linienumret for næste sætning osv. Mangler >trin>
          benyttes 10. 
           
          Ved omnummereringen behandles også sætningsnumrene i hop-sætning-
          er (GOTO-, GOSUB-, IF-THEN- og ON-sætninger), således at disse
          bliver erstattet med de nye linienumre. 
           
           
8_._1_6_ _ _ _ _ _ _R_U_N_ 8.16
           
          RUN - kommandoen benyttes til at starte udførelsen at et program.
           
          RUN - kommandoen har følgende opbygning: 
           
          <run-kommando'      ::= RUN ! RUN <linienummer' 
           
          De to former af kommandoen har følgende virkninger: 
           
          RUN:                Programmet, der er lagret i maskinens lager,
          udføres fra sætningen med det laveste linie-
          nummer. \f

          Før programudførelsen slettes dataområdet, og
                                      stakken, der rummer information om underpro-
                              gramkald og løkkesætninger, initialisers. 
                               
          RUN <linienummer':  Programudførelse starter med sætningen, spe-
                              cificeret ved <linienummer'. 
                              Alle data og informationer fra en tidligere
                              udførelse bevares. 
                              Denne version af kommandoen anvendes til at
                              genoptage udførelsen efter at programmet er
                              stoppet med ESCape, eller efter en fejl. 
                               
          Udskrifter fra PRINT sætninger vil fremkomme på skærmen eller,
          hvis det er specificeret ved hjælp af OUTPUT - kommandoen (afsnit
          8.13) på en tilsluttet printer. 
           
           
8_._1_7_ _ _ _ _ _ _S_A_V_E_ 8.17
           
          SAVE - kommandoen benyttes til lagring af et indtastet COMAL pro-
          gram i en fil på disketten. 
          SAVE - kommandoen har følgende opbygning: 
           
          <save-kommando'     ::= SAVE <filnavn' 
           
          En ny fil med navnet <filnavn' oprettes, og programmet skrives i
          filen. Eksisterer <filnavn' allerede, slettes denne, og en ny fil
          med samme navn oprettes. 
          Programmet kan senere indlæses til hovedlageret igen ved hjælp af
          LOAD - kommandoen eller CHAIN-sætningen (se kapitel 7). 
           \f

F_       A_._ _ _ _ _ _ _ _ _A_R_I_T_M_E_T_I_S_K_E_ _V_Æ_R_D_I_E_R_ _A_F_ _A_S_C_I_I_ _T_E_G_N_ _(_D_A_N_S_K_ _T_A_S_T_A_T_U_R_)_ 
           
          tegn værdi          tegn værdi          tegn værdi 
           
          blank  32                 64                 96 
          !      33             A    65              a   97 
          "      34             B    66              b   98 
          #      35             C    67              c   99 
                36             D    68              d  100 
          %      37             E    69              d  101 
          &      38             F    70              f  102 
          >      39             G    71              g  103 
          (      40             H    72              h  104 
          )      41             I    73              i  105 
          *      42             J    74              j  106 
          +      43             K    75              k  107 
          ,      44             L    76              l  108 
          -      45             M    77              m  109 
          .      46             N    78              n  110 
          /      47             O    79              o  111 
          0      48             P    80              p  112 
          1      49             Q    81              q  113 
          2      50             R    82              r  114 
          3      51             S    83              s  115 
          4      52             T    84              t  116 
          5      53             U    85              u  117 
          6      54             V    86              v  118 
          7      55             W    87              w  119 
          8      56             X    88              x  120 
          9      57             Y    89              y  121 
          :      58             Z    90              z  122 
          ;      59             Æ    91              æ  123 
          <      60             Ø    92              ø  124 
          =      61             Å    93              å  125 
          '      62                  94                126 
          ?      63             -    95 \f

F_       B_._ _ _ _ _ _ _ _ _F_E_J_L_ _V_E_D_ _B_R_U_G_ _A_F_ _F_I_L_S_Æ_T_N_I_N_G_E_R_ B.
           
          Ved de fleste af de fil-sætninger, som er beskrevet i kapitel 7,
          angives en filvariabel som fortæller, om sætningen er blevet
          korrekt udført eller ej.  
           
          Følgende værdier kan antages af filvariablen: 
           
          0   OK 
          1   Diskette ikke monteret 
          2   Ingen plads i kataloget 
          3   For mange filer åbne 
          4   Diskette skrivebeskyttet 
          5   Diskette skrivebeskyttet 
          6   Skrivning/læsning uden for filen 
          7   Fil eksisterer allerede 
          8   Fil eksisterer ikke 
          9   Ingen plads på disketten 
        '10   Skrive/læse fejl (diskette fejl) 
           \f

                                                 i 
           
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          1.  INTRODUCTION ..........................................   1 
           
          2.  GENERAL DESCRIPTION ...................................   2 
              2.1  ..................................................   2 
              2.2  ..................................................   3 
              2.3  ..................................................   4 
                   2.3.1  ...........................................   4 
                   2.3.2  ...........................................   5 
                   2.3.3  ...........................................   5 
           
          3.  DRIVER FUNCTIONS, REQUESTS, AND ANSWERS ...............   6 
              3.1  Driver Functions, Command Decoding ...............   7 
                       3.1.2  Control Functions .........................   8 
                          3.1.2.1  Get Device Status ................   8 
                          3.1.2.2  Open Device ......................  10 
                          3.1.2.3  Close Device .....................  10 
                   3.1.3  Data I/O-Functions ........................  11 
              3.2  The Additional Information Block .................  12 
              3.3  Driver Results, Status Decoding ..................  14 
                   3.3.1  Result Decoding ...........................  14 
                   3.3.2  Result Modification and Classification ....  15 
           
          A_P_P_E_N_D_I_X_: 
           
          A.  REFERENCES ............................................  17 
           \f

                                                 ii 
           \f

F_       1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_C_T_I_O_N_         1.
           
          This manual describes in details the interface to the standard
          PASCAL80 Flexible Disc Driver for the PI-1 machine (ref. 2),
          which has been implemented on a Z80 microprocessor as part of the
          RC702/850 microcomputer systems. 
           
          The standard Flexible Disc Drive is designed for use with the
          uPD765 Flexible Disc Controller (ref. 1) from NEC. This con-
          troller supports up to 4 drives in daisy chain with simultaneous
          >seek all drives>-facility. Both MINI (5 1/4 inch)-  and MAXI (8
          inch)-diskette drives are supported as well as dual density, dual
          head operation may be specified. 
           
          A description is given of the driver process interface with
          special attention paid to the standard PASCAL80 process relation-
          ship between a mother process (progenitor) and the parameters
          handled over its daughter process (the flexible disc drive pro-
          cess). 
           
              The function- and statusdescription is given without further
          notice about the actual controller interface for these oper-
          ations. A deeper understanding of the driver structure therefore
          requires the knowledge of the controller command interface as
          described in ref. 1. 
           
           \f

F_       2_._ _ _ _ _ _ _ _ _G_E_N_E_R_A_L_ _D_E_S_C_R_I_P_T_I_O_N_         2.
           
          The driver supports up to four disc drives operated in a daisy
          chain. The controller interface does not support a mixed access
          to both MINI- and MAXI-drives. No parallel dataoperations are
          then allowed to occur (controller restriction) and the parallel
          seek facility of the controller is not implemented in the driver
          process, which then may be looked upon as a strictly sequential
          processor for a pool of request messages. Dataconversion is not
          supported and data is transferred under DMA-control. 
           
          The messages are handled one by one by the driver following the
          scheme outlined below. 
           
               1) Get next request message. 
               2) Execute operation. 
               3) Wait for compilation. 
               4) Returns the message. 
           
          The driver does not specify a certain sequence of messages to be
          processed in operating the device in a consious way. All neces-
          sary drive information is contained in each message and consists
          of a driveunitno., and in case datatransfer is wanted the start-
          address and bytecount for the databuffer together with a start-
          logicalblockno. and logical-blocksize for the diskette. 
           
          However certain status conditions (hard status) are classified as
          persistent until the receipt of a controlling request message
          hereby bypassing possibly datarequest following the erroneous one
          (answered with status >not processed>). 
           
           
2_._1_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 2.1
           
          The usage of a logical blocksize (user defined) is incorporated
          to allow for a general operating strategy that is independent of
          the actual diskette format in used. The driver takes care of con-
          verting the logical startblock into a appropriate cylinder, head
          and sector number as required by the controller. This function is\f

                   implemented because of the great number of various diskette-for-
          mats available today including single/double sided, single/double
          density MAXI/MINI-diskettes with variable sectorlength. In appen-
          dix B a summarized description is given. For further information
          please refer to ref. 4. 
           
          Please notice that the >Format>-function differs from the general
          description given here in that the databuffer must contain de-
          tailed information about the physical track-image, please refer
          to chapter 3 and appendix C. 
           
           
     2_._2_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _    2.2
           
          The driver does automatical update its internal information block
          (one for each driver) in case of status >OFFLINE/ONLINE> is met
          and when the >OPEN>-function is specified. The >OFFLINE>-status
          is buffered always. This feature ensures that true knowledge of
          diskette insertion/removal is obtained, in case that MAXI-drives
          are selected. 
           
          The MINI-drive does not change its ONLINE-status regardless of
          the diskette manipulation done. The user will obtain the status
          >OFFLINE> modified with the >MINI>-bit if the elapsed time since
          last operation has exceeded the >MINI-MOTOR OFF>-time (3 secs.).
          In that case a diskette manipulation is reported as possibly. The
          application program then determines otself whether a diskette
          information block should be read for identification or not. If no
          specific action is wanted the next request can be executed. 
           
          Please nitoce that the diskette must be left untouched as long as
          the >head load>-indicator on the front is lit. In case that the
          MINI-diskette is removed during operation, the next driver re-
          quest may return status >timeout>, in which case the controller
          interface may enter a >dead-lock>-situation, which may be cleared
          by loading a new diskette or resetting the device (RESET-button).
           
           \f

         2_._3_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 2.3
           
2_._3_._1_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 2.3.1
           
                   The driver is capable of handling deleted sectors too. The
          deleted sector-feature was introduced to allow for a bad-sector
          specification on different parts of the diskette, so to prevent
          the user from writing data into those areas. A so-called deleted
          dataaddress mark is written in front of the datafield of a sector
          instead of the normal data address mark. 
           
          The data address mark is always written, when data is transferred
          to the diskette, together with the triling CRC-bytes. If required
          a normal write operation may be followed by a >read data>-com-
          mand. In the readoperation the CRC-bytes are checked by the con-
          troller and status CRC-error is delivered by the driver in case
          of a data error. One may then specify a write deleted data oper-
          ation in which case the deleted data address mark is written in
          front of the data transferred. Hereafter the original write oper-
          ation should be repeated. 
           
          As mentioned in chapter 3, the driver supports two different
          >read after write>-operations, the one including an automatic
          repair of the operation which failured, as explained above.
          Please notice that the driver always operates on a logical block
          level, which means that a whole block of data is erased in case
          that a CRC-error repair situation occurs during write operations.
           
          When reading the faulty diskette the user may specify a >skip
          deleted sector>-mode, in which case all sectors with a >deleted
          data address mark> placed in front are skipped. Notice that the
          status >deleted data address mark> is always returned, regardless
          of the mode specified. 
           
          The driver does not maintain any informatin about the number of
          deleted sectors met, and therefore the user must specify the next
          >start block> to the drives including all previous error-blocks
          met. To allow for this the driver returns each operation with an
          updated value of >blocks processed>, which then includes the user\f

                   init value together with the number of blocks skipped to satisfy
          the request, refer to section 3.2. 
           
           
     2_._3_._2_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _     2.3.2
           
          A cylinder may be specified as a deleted cylinder. This
          specification is not supported in this driver/controller system.
          Shortly described the deleted cylinder is given the same physical
          cylinder no. as the previous one (or an undefined cylinder no. is
          specified, e.g. 255), and the next cylinder is preformatted with
          the number in talk. This modification is to be done in diskette
          formatting situations, when a suitable high number of CRC-errors
          are counted during run of some reliability test of the formatting
          data. The driver/controller then skips this cylinder (adds one
          seek pulse) if told to do so in later access to this diskette. 
           
          The deleted cylinder feature is not widely used, because of the
          reformatting demands made. 
           
           
2_._3_._3_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 2.3.3
           
          The special command >SCAN> is used at controller level for
          datacomparison on a sector base as the minimum information block
          to be search. The driver defines a logical block as a minimum
          information block and then requires the scan criterium to be
          satisfied within this block. During the >SCAN>-command data is
          read off from the diskette and scenned sequentially with the
          request databuffer byte for byte. 
           
          In appendix D some important drive-timervalues are listed. 
           
           \f

F_       3_._ _ _ _ _ _ _ _ _D_R_I_V_E_R_ _F_U_N_C_T_I_O_N_S_,_ _R_E_Q_U_E_S_T_S_,_ _A_N_D_ _A_N_S_W_E_R_S_         3.
           
          Commands for the driver are given as function codes specified in
          the U1-byte of the request message header. When executed, the
          driver returns the request message with the driver answer defined
          as a result code specified in the U2-byte of the request message
          header. 
           
              Message buffer:           Request               Answer 
           
                   _ _ _ _ _ _ _ _ 
                      
           
           
          Header:  _ _ _U_1_ _ _ _          Function              Unchanged 
                   _ _ _U_2_ _ _ _          Not used              Result 
                   _ _ _U_3_ _ _ _          Device number         Unchanged 
                   _ _ _U_4_ _ _ _          Not used              Not used 
           
           
           
                   _ _ _ _ _ _ _ _ 
          Data:      0              First of data         Unchanged 
                   _ _ _1_ _ _ _ _ 
                     2              Last of data          Unchanged 
                   _ _ _3_ _ _ _ _ 
                     4              Undefined             Next of data 
                   _ _ _5_ _ _ _ _ 
                     6              Additional            Additional 
                     7              information           information 
                                                          changed 
                                                          according to 
                                                          the specific-
                                                          ations given in 
                                                          section 3.2 
           
                       _ _ _ _ _ _ _ _ 
           
          Figure 1: Driver communication. 
           \f

                   In the following section the Function-field and the Result-field
          are examined in details. 
           
          The Deviceno.-field is decoded as specified below and is not
          changed by the drives. 
           
               MSB         LSB 
               7_ _ _ _ _ _ _ _ _ _ _ _ _ _0_ 
               x_ _x_ _x_ _x_ _x_ _x_ _ _N_O_ 
           
          x : not used 
          NO: 0-3 
           
          Figure 2: Device number. 
           
           
    3_._1_ _ _ _ _ _ _ _D_r_i_v_e_r_ _F_u_n_c_t_i_o_n_s_,_ _C_o_m_m_a_n_d_ _D_e_c_o_d_i_n_g_    3.1
           
          The driver supports the standard functions as defined in ref 3
          with some modifications as outlined in the following subsections.
          The standard functions are supplied as function codes specified
          in U1 of the message header. 
           
                    MSB                                   LSB 
               bit: 7_ _ _ _ _ _ _ _        _ _ _ _ _2_ _ _ _ _1_ _ _ _ _ _ _ _ _ _ _ _ _ _0_ 
          U1         _f_u_n_c_t_i_o_n modifi_c_a_t_i_o_n_ _ _ _b_a_s_i_c_ _f_u_n_c_t_i_o_n_ _ 
           
          U1 = basicfunction + 4 * function modification or shortly 
          U1 = bf + 4 * fm. 
           
          Figure 3: TITEL??????????? 
           
          The basicfunction group consists of 4 elements as listed below: 
           
          bf = 0 : control functions 
          bf = 1 : read functions 
          bf = 2 : write functions 
          bf = 3 : read after write functions (write verify) 
           \f

                   The basicfunctions of class bf=1, bf=2, and bf=3 are called data
          i/o functions. 
           
          The description of the basicfunctions is divided into two parts
          covering the control functions and the data i/o functions re-
          spectively. Except for one control operation (>sense status>) no
          control function is in use of the databuffer-part of the request-
          message. 
           
          The driver does not support data-conversion. 
           
           
     3_._1_._2_ _ _ _ _ _C_o_n_t_r_o_l_ _F_u_n_c_t_i_o_n_s_     3.1.2
           
          bf=0 ; fm=0 : Get device status (sense status) 
          bf=0 ; fm=1 : Open device 
          bf=0 ; fm=2 : Close device 
          bf=0 ; fm=3 : Regret request (not implemented) 
          bf=0 ; fm=5 : Pause (release channel) 
           
          All control functions unconditionally clear a possible >not pro-
          cessed>-status. All functions but the >Get device status>-func-
          tion of a pure controlling nature that is no databuffer is ex-
          changed serving the request message. 
           
          The regret request may be used in controlling different driver
          processes, which are maintaining internal request buffer queues.
          This is not the case with the flexible disc driver when serving
          possible >offline/online status>-interrupts. 
           
          The >pause>-function makes the driver release the flexible disc
          controller channel and the corresponding DMA-channel hereby
          allowing another process to be the channel processor. 
           
           
    3_._1_._2_._1_ _ _ _G_e_t_ _D_e_v_i_c_e_ _S_t_a_t_u_s_    3.1.2.1
           
          The >Get device Status>-function is used for transfer of actual
          device status information including >offline>, >fault>-condition,\f

                   and writeprotection, refer to subsection 3.2.3. Besides this a
          detailed device status information block is returned in the
          answer. This requires that the >sense status> control function
          should define a data area to hold this information. 
           
          For this purpose the AIB-datapart of the request buffer is used,
          see section 3.2. 
           
M_               0 
               1                                     First of data 
               2 
               3              STANDARD PASCAL80      Last of data 
               4 
               5                                     Next of data 
               6 
               7              Device diskette parameterblock 
               8 
               9 
              10              Amount of pages, unchanged 
              11 
              12              Pagesize in bytes, unchanged 
              13 
P_              14 
           
          Figure 4: The >sense status>-AIB format. 
           
          The Device Diskette Parameterblock provides the user with the
          necessary information for calculating last block, defining an
          optimal access strategy including e.g. blocklength definition and
          so on. The parameterblock is described below and covers the
          diskette dataformat used all over the diskette except for
          cylinder 0, refer to ref. 4. 
           
           
           
           
           
           
           
                    
           
          Figure 5: The diskette parameterblock. 
           \f

                   Saib0:    Formatting ident 
                    If zero, the diskette inserted is a formatted one. If
                    all ones (255) the diskette is not preformatted. 
                     
          Saib1:    Global diskette parameter 
                    Saib1(0): single/dual sided diskette (dual = 1) 
                    Saib1(1): single/dual density diskette (dual = 1) 
                    Saib1(7): mini/maxi drive (mini = 1) 
                       The saib1(1) information is invalid in case a non-pre-
                         formatted diskette is inserted (saib0 = 255) 
                            
          Saib2:    Dataformat identificator, n1 
M_                    The actual sectorlength used is specified as a power of
M_m_                                       n1 
P_P_p_                    2: sectorlength = 2   * 128 bytes. Invalid if saib0 =
                     255. 
                     
          Saib3:    Dataformat identificator, n2 
                    The number of sectors per track is specified, refer to
                    ref. 4. Invalid if saib0 = 255. 
           
           
         3_._1_._2_._2_ _ _ _O_p_e_n_ _D_e_v_i_c_e_         3.1.2.2
           
          This request forces the driver to recalibrate the device
          addressed. All internal datastructures are redefined and the
          driver returns the device status information including >offline>,
          >fault>-detect, and >writeprotected> if set. 
           
          The driver initializes its internal diskette parameter block for
          that drive, and returns the >format-error> result modification if
          a nonpreformatted diskette is inserted. 
           
           
3_._1_._2_._3_ _ _ _C_l_o_s_e_ _D_e_v_i_c_e_ 3.1.2.3
           
          This function does not have any physical effect on the drive
          selected. 
           \f

                   Using this command all pending data requests to the driver are
          released that is returned with status not-processed. The driver
          will operate the next control request given. 
           
           
     3_._1_._3_ _ _ _ _ _D_a_t_a_ _I_/_O_-_F_u_n_c_t_i_o_n_s_     3.1.3
           
          The basic functions are augmented with the >format> and the
          >scan> function using the fm(2:0)-field for decoding. 
           
          bf=1, fm(2:0)=0: Read 
          bf=2, fm(2:0)=0: Write 
          bf=3, fm(2:0)=0: Write with read check CRC (write verify) 
          bf=1, fm(2:0)=1: Scan equal, hit all one sector 
          bf=1, fm(2:0)=2: Scan low, hit all one sector 
          bf=1, fm(2:0)=3: Scan high, hit all one sector 
          bf=1, fm(2:0)=4: Format one track (special) 
           
          Table 1: Data functions. 
           
          Unless otherwise stated the functions operate on a user specified
          number of logical datablocks within one message buffer. 
           
          The basic functions may all, except the special function >FORMAT>
          be modified with the common mode bits fm(3) and fm(4). Fm(3)
          allows deleted data address mark (AM) operations whereas fm(4)
          defines cylinder zero operations to occur. If fm(4)=0 the driver
          automatically includes a cylinder offset of 1 in the position
          calculations, which are based on the logical start block number. 
           \f

          bf=1, fm(2:0)=0                Read normal only (no skip of D.D.AM) 
          bf=2, fm(2:0)=0                Write normal only (write normal D.AM) 
          bf=3, fm(2:0)=0      fm(4)=0   Write verify normal only (no CRC repair) 
          bf=1, fm(2:0)=1,2,3            Scan sector normal only (no skip of D.D.AM) 
          bf=1, fm(2:0)=4                Format one track 
           
          bf=1, fm(2:0)=0                Read skip (skip of D.D.AM) 
          bf=2, fm(2:0)=0                Write mark (write D.D.AM) 
          bf=3, fm(fm(2:0)=0   fm(4)=1   Write verify repeat (CRC repair) 
          bf=1, fm(2:0)=1,2,3            Scan sector skip (skip of D.D.AM) 
          bf=1, fm(2:0)=4                Illegal 
           
M_m_m_          All augmented 
                               fm(5)=0   A cylinder offset of 1 is automatically
          basic functions 
                                         included 
P_p_p_          except >Format> 
              
          All augmented 
                               fm(5)=1   No cylinder offset, cyl. zero operations
          basic functions                only 
           
          Table 2: Common function modification. 
           
           
3_._2_ _ _ _ _ _ _ _T_h_e_ _A_d_d_i_t_i_o_n_a_l_ _I_n_f_o_r_m_a_t_i_o_n_ _B_l_o_c_k_ 3.2
           
          As mentioned in section 3.1 the standard PASCAL80 communication
          interface cannot handle the necessary information-flow to the
          driver process. With each data i/o transfer the databuffer holds
          the so-called additional information block. 
           \f

                   Message buffer: 
M_                        _ _ _ _ _ _ _ _ _ _ _ 
          Header: 
                        _ _ _ _ _ _ _ _ _ _ _ 
                        _ _ _ _ _ _ _ _ _ _ _ 
          Data:             0                            First of data 
                        _ _ _ _ _1_ _ _ _ _ _ 
                            2        STANDARD PASCAL80   Last of data 
                        _ _ _ _ _3_ _ _ _ _ _ 
                            4                            Next of data 
                        _ _ _ _ _5_ _ _ _ _ _ 
                            6        Firstpage (doubleword) 
                            7 
                            8 
                        _ _ _ _ _9_ _ _ _ _ _                               AIB 
                           10        Amount of pages (integer) 
                        _ _ _ _1_1_ _ _ _ _ _ 
                           12        Pagesize in bytes (integer) 
                        _ _ _ _1_3_ _ _ _ _ _ 
                           14 
           
                                              Firstpage = start block 
           
                                              Amount of pages = block count
           
P_                        _ _ _ _ _ _ _ _ _ _ _            Pagesize = blocksize 
           
          Figure 6: Additional information block (AIB). 
           
          The AIB-fields are decoded as specified below: 
           
            6-9:  Firstpage (doubleword), request parameter. 
                  The driver operates on a logical data blocklevel (or
                  pagelevel). The driver recognizes dataareas as a number
                  of blocks (pages) to be processed in one request,
                  starting from the position >firstpage>. The physical
                  sector, head, and track evaluation is made in the driver
                  using (firstpage - 1) * (pagesize // sectorlength) + 1 +
                  BOOLEAN (REM) as a logically increasing sectorcount. 
                   
          10-11:  Amount of pages (integer), request/return-parameter. 
                  The driver processes the specified amount of pages (no.
                  of logical blocks) if possible without dataoverflow in
                  the databuffer (first, last). The return value of >amount
                  of pages> is specified equal to the number of pages
                  positioned on the flexible disc, which in case the
                  >deleted block>-mode bit is set may be larger than the
                  transfer block count. (The transfer block count may
                  always be calculated by means of >first> and >next>.) 
                   \f

          12-13:  Pagesize (integer), request parameter. 
                  The user of the flexible disc driver may specify his own
                  pagesize (blocklength) in bytes according to the follow-
                  ing rule: 
                  1) Pagesize should always be a multiplum of the physical
                  sectorlength, refer to ref. *. 
           
           
     3_._3_ _ _ _ _ _ _ _D_r_i_v_e_r_ _R_e_s_u_l_t_s_,_ _S_t_a_t_u_s_ _D_e_c_o_d_i_n_g_     3.3
           
          The driver supports the standard result decoding as specified in
          ref. 3 augmented with a special softerror condition. 
           
                     MSB                                  LSB 
               bit:   _7_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _3_ _ _ _2_ _ _ _ _ _ _ _ _0_ _ 
          U1          _ _r_e_s_u_l_t_ _m_o_d_i_f_i_c_a_t_i_o_n_ _ _ _ _ _ _ _ _r_e_s_u_l_t_ _ _ _ _ _ 
           
          U1 = result + 8 * result modification or shortly 
          U1 = r + 8 * rm 
           
           
3_._3_._1_ _ _ _ _ _R_e_s_u_l_t_ _D_e_c_o_d_i_n_g_ 3.3.1
           
          r0 : successfully processed 
          r1 : not processed (awaiting a control operation) 
          r2 : transient error (CRC-error) 
          r3 : hard error (awaiting a control operation, a new diskette, or
               device reset) 
          r4 : illegal function 
          r5 : soft error (del data AM). Notice: augmented standard 
          r6 : not used 
          r7 : not used 
           
           \f

         3_._3_._2_ _ _ _ _ _R_e_s_u_l_t_ _M_o_d_i_f_i_c_a_t_i_o_n_ _a_n_d_ _C_l_a_s_s_i_f_i_c_a_t_i_o_n_         3.3.2
           
          r3        rm = 1  OFFLINE: no diskette inserted 
          r3        rm = 2  HARD ERROR: equipment check, fault check 
          r3        rm = 3  HARD ERROR: wrong cylinder, sector address mark
                            not found 
                    rm = 4  HARD ERROR: data AM or deleted data, AM not
                            found 
          r3 or r2  rm = 6  CRC error, may follow rm = 3, 4 too. If not a
                            pure data CRC is found 
          r2        rm = 7  Data late (overrun) 
          r5 or r3  rm = 8  Writeprotected (if write function or sense) 
          r3 or r5  rm = 9  Deleted Data Mark 
           
          r5        rm = 10 Scan not satisfied but completed normally 
           
           \f

F_                  
           \f

F_       A_._ _ _ _ _ _ _ _ _R_E_F_E_R_E_N_C_E_S_         A.
           
          1  Reference til uPD765 
                
          2  RCSL No 31-D615: 
               The PI-1 Machine, Reference Manual 
                
          3  RCSL No 31-D617: 
               PASCAL80 Driver Conventions 
                
          4  RCSL No 43-GL10388: 
               Flexible Disc Support, General Information 
                
                \f

F_                       
                \f

                                                 i 
           
          I_N_D_H_O_L_D_S_F_O_R_T_E_G_N_E_L_S_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _S_I_D_E_ 
           
          1.  INTRODUKTION ...........................................  1 
           
          2.  NYE FUNKTIONER I RC700 COMAL ...........................  2 
              2.1  Funktioner til kontrol af tastatur, skærm og  
                   terminal-port .....................................  2 
                   2.1.1  KEY(X) .....................................  2 
                   2.1.2  CRT(X) .....................................  3 
                   2.1.3  REC(X) .....................................  4 
                   2.1.4  XMT(X) .....................................  4 
              2.2  Sætninger til transmission ........................  5 
                   2.2.1  OUT LINE-sætning ...........................  5 
                   2.2.2  IN LINE-sætning ............................  5 
           
          3.  SKÆRMEN ................................................  7 
              3.1  Styring af uddatamedium ...........................  7 
              3.2  Skærmstyring ......................................  7 
              3.3  Blink og invers skrift ............................  8 
              3.4  Semigrafisk tegnsæt ...............................  9 
              3.5  X,Y-adressering ................................... 10 
           
          4.  PRINTERSTYRING ......................................... 11 
           
          5.  STYRING AF YDRE ENHEDER ................................ 13 
           
          6.  PORTNUMRE .............................................. 14 
           \f

                                                ii 
           
          I_N_D_H_O_L_D_S_F_O_R_T_E_G_N_E_L_S_E_ _(_f_o_r_t_s_a_t_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _S_I_D_E_ 
           
          BILAG: 
           
          A.  REFERENCER ............................................. 15 
           
          B.  SEMIGRAFISK TEGNSÆT, SKÆRM ............................. 16 
           
          C.  SEMIGRAFISK TEGNSÆT, RC861 PRINTER ..................... 18 
           
          D.  PROGRAMEKSEMPLER ....................................... 19 
           
          E.  TRANSMISSIONSPROTOKOL .................................. 21 
           
          F.  KONTROLTEGN TIL INITIALISERING AF TERMINALPORT ......... 22 
           \f

F_       1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_K_T_I_O_N_                                                        1.
           
                 Formålet med denne manual er at beskrive en række specielle fa-
          ciliteter, som findes i Comal på RC700, og som ikke er beskrevet
          i ref. (1). 
           
          Kapitel 2 beskriver en række nye funktioner, som er indført i
          RC700 Comal til brug i forbindelse med datatransmission m.m. 
           
          De øvrige kapitler indeholder en uddybende beskrivelse af, hvor-
          dan dataskærmen, linieskriveren samt i/o-porte kan anvendes i
          Comalprogrammer. 
           \f

F_       2_._ _ _ _ _ _ _ _ _N_Y_E_ _F_U_N_K_T_I_O_N_E_R_ _I_ _R_C_7_0_0_ _C_O_M_A_L_                                        2.
           
         2_._1_ _ _ _ _ _ _ _F_u_n_k_t_i_o_n_e_r_ _t_i_l_ _k_o_n_t_r_o_l_ _a_f_ _t_a_s_t_a_t_u_r_,_ _s_k_æ_r_m_ _o_g_ _t_e_r_m_i_n_a_l_-_p_o_r_t_ 2.1
           
          Følgende funktioner benyttes til fra et COMAL-program at kon-
          trollere tastaturet, skærmen og terminal-porten direkte: 
           
             KEY(X) 
             CRT(X) 
             REC(X) 
             XMT(X) 
           
          Argumentet X kan være et vilkårligt aritmetisk udtryk ligesom i
          de øvrige standardfunktioner. Funktionerne benyttes i øvrigt som
          almindelige funktioner, dvs., der returneres en funktionsværdi,
          og funktionskaldene kan altså indgå i vilkårlige aritmetiske ud-
          tryk, selvom det ikke altid har nogen mening. 
           
          De enkelte funktioner beskrives i det følgende. 
           
           
2_._1_._1_ _ _ _ _ _K_E_Y_(_X_)_ 2.1.1
           
          Funktionen benyttes til at modtage et tegn fra tastaturet. 
           
          Funktionen kan benyttes på to måder afhængig af argumentet X: 
           
          X=0: 
          Når funktionen kaldes, ventes der, til der bliver indtastet et
          tegn. Funktionsværdien er ASCII-værdien af det indtastede tegn. 
           
          X<'0: 
          Funktionen benyttes til at teste, om der er indtastet et tegn.
          Funktionen kan antage følgende værdier: 
           
             <0: intet tegn indtastet siden forrige kald af funktionen.
            '=0: et tegn er tastet, funktionsværdien er lig ASCII-værdien
                 af det indtastede tegn. 
           \f

          Tegn, som indtastes i forbindelse med INPUT-sætninger, påvirker
          ikke resultatet af KEY-kaldet. 
           
          KEY-funktionen anvendes f.eks. hvis brugeren af et COMAL-program
          under udførelsen af programmet skal have mulighed for at indtaste
          tegn, som ikke skal ekko>es (dvs. skrives på skærmen, når de
          indtastes). Det kan være nyttigt i forbindelse med f.eks. spil og
          undervisningsprogrammer. 
           
           
         2_._1_._2_ _ _ _ _ _C_R_T_(_X_)_                                                           2.1.2
           
          Funktionen benyttes til at udskrive et tegn på skærmen, (eller på
          printeren, hvis dette er angivet ved OUTPUT P). Der kan være tale
          om både synlige tegn og kontroltegn. Tegnet udskrives der, hvor
          markøren er placeret. 
           
          Argumentet er ASCII-værdien af det ønskede tegn.  
           
          Funktionsværdien er lig argumentet. 
           
          Man kan også udskrive et tegn v.h.a. sætningen PRINT CHR(X). 
           
          Forskellene mellem CHR og CRT er: 
          - CHR kan kun anvendes i forbindelse med en PRINT-sætning, CRT
            indgår i et vilkårligt udtryk.  
          - ved anvendelse af PRINT-sætninger tæller systemet antallet af
            udskrevne tegn, og der laves automatisk linieskift efter 80
            tegn. Tegn som udskrives v.h.a. CHR tælles altså med, mens tegn
            udskrevet v.h.a. CRT ikke medtælles. 
          - når CRT anvendes, fremkommer tegnet straks på skærmen. Ved an-
            vendelse af CHR vises tegnet først, når en hel linie er ud-
            skrevet. Dette gør CRT mere anvendelig end CHR i forbindelse
            med x,y-adressering. 
             
          Det gælder generelt, at tegn udskrevet v.h.a. PRINT-sætninger
          først vises på skærmen eller printeren, når en linie er fyldt,
          eller når der laves linieskift. Dette bevirker, at anvendelse af
          PRINT og CRT "samtidigt" kan give uventede resultater. F.eks. vil
          programmet: 
             \f

            10 print "ABC"; 
            20 i=crt(42) 
            30 print "123" 
           
          give resultatet *ABC123 og ikke, som man måske kunne forvente
          ABC*123. 
             
             
2_._1_._3_ _ _ _ _ _R_E_C_(_X_)_ 2.1.3
           
          Funktionen benyttes til at modtage et tegn fra terminal-porten.
          Argumentet hverken benyttes eller ændres, dvs., at man kan angive
          et vilkårligt udtryk, f.eks. tallet 0. 
           
          Funktionen kan antage følgende værdier: 
           
             '=0: tegn korrekt modtaget, funktionsværdier lig ASCII-værdien
                  af tegnet. 
              -1: timeout (tegn ikke modtaget efter 2 sec.) 
              -2: fejl på linien (f.eks. paritetsfejl) 
           
           
2_._1_._4_ _ _ _ _ _X_M_T_(_X_)_                                                              2.1.4
           
          Funktionen benyttes til at sende et tegn over terminal-porten.
          Argumentet er ASCII-værdien af tegnet. Kun tegn med værdi under
          128 kan sendes. Tegn med værdier over 128 benyttes til at initia-
          lisere porten (transmissionshastighed m.m.), se appendix F.  
           
          Funktionen kan antage følgende værdier: 
           
             '=0: tegn korrekt sendt, funktionsværdien er lig ASCII-værdien
                  af tegnet. 
              -1: timeout (tegn ikke sendt efter 5 sec) 
              -2: tegnet kan ikke sendes (på grund af fejl på linien) 
           \f

         2_._2_ _ _ _ _ _ _ _S_æ_t_n_i_n_g_e_r_ _t_i_l_ _t_r_a_n_s_m_i_s_s_i_o_n_ 
           
2_._2_._1_ _ _ _ _ _O_U_T_ _L_I_N_E_-_s_æ_t_n_i_n_g_ 2.2.1
               
          OUT LINE-sætningen benyttes til at sende en streng af tegn over
          terminal-porten. Sætningen er særlig velegnet til fil-transport,
          idet alle tegn-værdier mellem 0 og 255 kan sendes på denne måde.
           
          Tegnene sendes ved hjælp af en speciel blokorienteret transmis-
          sionsprotokol med check-sum, idet hvert tegn sendes som to
          ASCII-tegn. Det ville ellers ikke være muligt at sende tegn-vær-
          dier over 127. Protokollen er beskrevet i appendix E.  
           
          OUT LINE-sætningen har følgende opbygning: 
           
          <out line-sætning'::= OUT LINE <streng variabel',<antal',<status'
          <antal'           ::= <reel variabel' 
          <status'          ::= <reel variabel' 
           
                   Værdien af <antal' angiver det antal tegn i strengen, som ønskes
          sendt. Efter udførelse af sætningen vil <status' have en værdi,
          som angiver, om strengen er korrekt sendt eller ej. Følgende
          værdier kan antages: 
           
             0: strengen korrekt sendt 
             2: strengen kan ikke sendes 
           
           
         2_._2_._2_ _ _ _ _ _I_N_ _L_I_N_E_-_s_æ_t_n_i_n_g_                                                  2.2.2
           
          IN LINE-sætningen benyttes til at modtage en streng af tegn fra
          terminal-porten. Strengen modtages i en blok sendt ved hjælp af
          en OUT LINE-sætning eller af et program, som overholder den be-
          nyttede transmissionsprotokol.  
           \f

          IN LINE-sætningen har følgende opbygning: 
           
          <in line-sætning'::= IN LINE <streng variabel',<antal',<status' 
          <antal'          ::=         <reel variabel' 
          <status'         ::=         <reel variabel' 
           
          Værdien af <antal' og <status' er uden betydning før udførelsen
          af sætningen. Efter udførelsen har <antal' en værdi, der angiver
          antallet af modtagne tegn i <streng variabel'. <status' har en
          værdi, der angiver om en streng er modtaget korrekt eller ej.  
           
          Følgende værdier kan antages: 
           
             0: strengen korrekt modtaget 
             1: time out (et tegn er ikke modtaget efter 15 sec.) 
             2: paritetsfejl eller anden fejl på linien 
             3: check-sum fejl 
           \f

F_       3_._ _ _ _ _ _ _ _ _S_K_Æ_R_M_E_N_                                                             3.
           
3_._1_ _ _ _ _ _ _ _S_t_y_r_i_n_g_ _a_f_ _u_d_d_a_t_a_m_e_d_i_u_m_    3.1
           
          RC700 Comalsystemet tillader nu, at brugeren kan programstyre sit
          valg af uddatamedium. Der kan således inden for samme program
          veksles mellem printer og skærm som uddatamedium, idet skærmen
          anvendes, indtil andet angives.  
           
          OUTPUT P-sætningen medfører, at efterfølgende udskrifter fra CRT-
          funktionen samt PRINT- og PRINT USING-sætninger bliver dirigeret
          til printeren, indtil en OUTPUT C-sætning udføres, hvorefter
          skærmen benyttes. 
           
          Eksempel: 
           
           10 output c 
           20 rem         udskrift på skærm. 
               .          . 
               .          . 
               .          . 
           50 output p 
           60 rem         udskrift på printer 
               .          . 
               .          . 
               .          . 
          120 output c 
          130 rem         udskrift på skærm 
           
           
3_._2_ _ _ _ _ _ _ _S_k_æ_r_m_s_t_y_r_i_n_g_                                                        3.2
           
          Det er ved hjælp af kontroltegn muligt at udføre forskellige
          former for skærmstyring. Typiske eksempler kan være sletning af
          skærm, linieskift samt direkte styring af markøren. 
           
          Udførelsen af den ønskede kontrolfunktion sker ved anvendelse af
          CHR(X) i PRINT sætninger, eller ved kald af CRT-funktionen. 
           \f

                   Følgende kontrolfunktioner er til rådighed: 
           
               X     CHR(X) 
            
           6     X,Y-addressering (se afsnit 3.5) 
           7     >BELL>, dvs. hørbart signal (kun RC702) 
           8     Markør en position til venstre (back space) 
           9     Horisontal tabulering (HT): markør 4 positioner til højre 
              10     Linieskift (LF): markør en position ned 
          12     Slet skærm (FF): markør til position 1,1 
          13     Vognretur (CR): markør til første position på linien 
          24     Markør en position til højre 
          26     Markør en position op 
          29     Markør til position (1,1) (home up) 
          30     Slet fra aktuel position til slutningen af linien (EOL) 
          31     Slet fra aktuel position til slutningen på skærmbilledet (EOF)
           
           
3_._3_ _ _ _ _ _ _ _B_l_i_n_k_ _o_g_ _i_n_v_e_r_s_ _s_k_r_i_f_t_                                              3.3
           
          Dele af skærmbilledet kan bringes til at blinke og/eller frem-
          træde som invers skrift (invers video). Dette gøres ved at sende
          bestemte kontroltegn større end 128, hvorefter uddata fra de
          efterfølgende printsætninger vil se ud som specificeret ved de
          anvendte kontroltegn. 
           
          CHR(128) sætter skærmstyringen tilbage til normal skrift 
           
                   X   CHR(X) 
           
          128+2 =130   Blink 
          128+4 =132   Aktivering af semigrafisk tegnsæt 
          128+16=144   Invers skrift 
          128+32=160   Understregning 
                 128   Normal skrift 
           
          Eksempel: 
           
          30 print chr(130); "RC700"; chr(128)      - teksten RC700 vil
          blinke 
           \f

          De forskellige faciliteter kan anvendes sammen, således vil
          f.eks. X=128+2+16 bevirke blinkende invers skrift. 
           
                   Bemærk, at kontroltegnet i sig selv fylder en position (en blank)
          på skærmen. Kontroltegnet vil kun have virkning, så længe det be-
          finder sig på skærmen, det vil sige, at virkningen f.eks. ophø-
          rer, hvis billedet "ruller", og tegnet dermed forsvinder. 
           
          Hvis man benytter variable til at angive de forskellige værdier,
          vil det øge programmets overskuelighed, f.eks. 
           
          10 let BLINK=2, SEMIGRAF=4 
          20 print CHR(128+BLINK+SEMIGRAF); "RC700"; CHR(128) 
           
           
3_._4_ _ _ _ _ _ _ _S_e_m_i_g_r_a_f_i_s_k_ _t_e_g_n_s_æ_t_ 3.4
           
          Skærmen indeholder mulighed for udskrivning af et semigrafisk
          tegnsæt. Denne mulighed kan f.eks. anvendes til kurvetegning,
          stolpediagrammer og simplere afbildning.  
           
          Det semigrafiske tegnsæt aktiveres ved brug af kontroltegnet 132.
          Returnering til normalt tegnsæt sker ved brug af kontroltegnet
          128. 
           
          Eksempel: 
           
          10 print chr(132); "RC700"; chr(128) 
           
          Appendix B indeholder en komplet fortegnelse over skærmens semi-
          grafiske tegnsæt. 
           
          Der er ikke semigrafisk tegnsæt på RC701. 
           
           \f

3_._5_ _ _ _ _ _ _ _X_,_Y_-_a_d_r_e_s_s_e_r_i_n_g_ 3.5
           
          X,Y-adresseringen giver mulighed for direkte positionering af
          markøren ved næste PRINT eller INPUT sætning. 
           
                   X,Y-adressering foretages f.eks. ved at inkludere følgende pro-
          cedure i programmet: 
           
                    
           
           
           
           
          Procedurekaldet sker nu på følgende måde: 
           
          500 EXEC XY(40,20) 
          eller 
          500 let XPOS=40; YPOS=20 
          510 EXEC XY(XPOS, YPOS) 
          520 print "*"; 
           
          Markøren placeres herved i position X=40 og Y=20, idet øverste
          venstre hjørne på skærmen har position (1,1) og nederste højre
          hjørne har position (80,25). 
           
          X,Y-adresseringen indledes altså med, at tegnet med ASCII-værdi 6
          sendes. De to næste tegn vil efter en transformation udgøre hen-
          holdsvis X- og Y-position. Bemærk, at der skal benyttes semikolon
          (;) mellem chr-kaldene og efter det sidste. 
           
          Positionering af (X,Y) uden for intervallerne 1<_X<_80 og 1<_Y<_25
          vil give en udefineret position. 
           
          X,Y-addressering kan også ske v.h.a. CRT-funktionen, som det
          fremgår af et af programeksemplerne i appendix D. 
           \f

F_       4_._ _ _ _ _ _ _ _ _P_R_I_N_T_E_R_S_T_Y_R_I_N_G_                                                   4.
           
          RC861-printeren har 3 forskellige skrifttyper: komprimeret, elon-
          geret samt normal skrift. Den komprimerede skrifttype giver plads
          til 132 tegn pr. linie. Comal systemet laver imidlertid automa-
          tisk linieskift efter 80 tegn. 
           
          Den elongerede skrift (40 tegn pr. line) er særdeles anvendelig
          til f.eks. overskrifter. 
           
          Yderligere indeholder printeren mulighed for udskrivning med et
          semigrafisk tegnsæt.  
           
          De forskellige faciliteter aktiveres v.h.a. CHR-funktionen an-
          vendt i PRINT-sætninger: 
           
           X    CHR(X) 
           
          14    Aktivering af semigrafisk tegnsæt 
          15    Aktivering af almindeligt alfanumerisk tegnsæt 
          29    Udskrivning med komprimeret skrift 
          30    Udskrivning med normal skrift 
          31    Udskrivning med elongeret skrift 
           
          Når man har specificeret et tegnsæt og/eller en skriftstype, vil
          printeren skrive som angivet, indtil brugeren skifter tegnsæt
          og/eller skriftstype ved at udskrive nye kontroltegn. Derfor er
          det en god ide at afslutte et program med sætningen 
             print chr(15); chr(30) 
          således, at printeren "starter" rigtigt, når den næste gang skal
          bruges.  
           
          Det skal bemærkes, at mens man kan bruge både almindeligt og se-
          migrafisk tegnsæt indenfor n linie, kan skriftstypen kun angives
          for hele linier. Hvis der udskrives flere af tegnene 29, 30 31 på
          samme linie, vil det sidst udskrevne tegn bestemme skriftstypen. 
           
          Når printeren tændes, skriver den med almindeligt tegnsæt og al-
          mindelig skrift. 
           \f

          Følgende eksempel viser udskrivning af det semigrafiske tegnsæt,
          hvor tegnværdierne er beliggende mellem 33 og 127, dog således,
          at der kun er 64 forskellige tegn. 
           
          Eksempel: 
           
           
           
           
           
           
           
           
           
           
           
           
           
          Resultatet af en udførelse af dette program er vist i appendix C.\f

F_       5_._ _ _ _ _ _ _ _ _S_T_Y_R_I_N_G_ _A_F_ _Y_D_R_E_ _E_N_H_E_D_E_R_                                          5.
           
          Comal understøtter RC700-systemets ydre enheder ved kald af en
          række sætninger og standard procedurer, som f.eks. print og
          chr(X). Anvendelsen af disse funktioner er beskrevet i ref (1),
          samt afsnit 2 og de sikrer brugeren, at kommunikationen med disse
          enheder sker via de systemunderstøttede drivprogrammer. 
           
          Endvidere er der i Comal åbnet mulighed for direkte adgang til
          systemets ydre enheder eller porte, således at f.eks. parallel-
          input/output-porten kan styres. Alle porte er tilgængelige, men
          det må på det kraftigste anbefales, at den direkte styring kun
          anvendes på parallel-porten.  
           
          Til styring af alle andre ydre enheder bør anvendes de eksiste-
          rende standardprocedurer, idet disse sikrer en hensigtsmæssig
          systemudnyttelse - en systemudnyttelse, der ikke vil kunne for-
          bedres ved indførelse af en kompleks port-procedure, skrevet i
          Comal.  
           
          En generel syntaktisk beskrivelse er angivet nedenfor, se iøvrigt
          ref. (1). 
           
          Overførsel af data til kontrol- eller dataport: 
                    OUT <output port',<værdi' 
           
          Overførsel af data fra kontrol- eller dataport: 
                    IN <input port',<variabel' 
           
          Afsnit 6 indeholder en liste over disse portnumre med angivelse
          af hhv. data og kontrol-portnummer for den enkelte port. 
           
          De forskellige porte er implementeret v.h.a. højt integrerede
          kredse, og en beskrivelse af disse er omfattende. Interesserede
          henvises derfor til fabrikanternes brugermanualer, se reference
          liste, appendix A. 
           \f

F_       6_._ _ _ _ _ _ _ _ _P_O_R_T_N_U_M_R_E_ 6.
           
          Liste over (decimale) portnumre for RC702. (I parentes er anført
          portnumre for RC701). 
           
          N_r_._ _ _ _ _ _ _ _N_a_v_n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _K_o_m_p_o_n_e_n_t_-_t_y_p_e_ _K_o_m_m_e_n_t_a_r_e_r_ _ _ _ _ _ _ _
           
           0 (200)  Skærm                 I8275 (Intel)  Kontrol (parametre)
           1 (201)                                       Data (kommando *) 
           4 (224)  Diskette (maxi/mini)  uPD765 (NEC)   Kontrol 
           5 (225)                                       Data 
           8 (136)  Seriel I/O            Z80A-SIO2      Data, Kanal A 
           9 (137)  (A=transmissionslinie (Zilog)        Data, Kanal B 
          10 (138)   B=linieskriver)                     Kontrol, Kanal A 
          11 (139)                                       Kontrol, Kanal B 
          16 (132)  Parallel I/O          Z80A-PIO       Data, tastatur 
          17 (133)                        (Zilog)        Data, parallel I/O
          18 (134)                                       Kontrol, tastatur 
          19 (135)                                       Kontrol, parallel I/O
          28 ( - )  "Beeper" - hørbart signal ved udskrivning af positivt tal
           
          *) Skærm-porten får sine data fra et lagerområde, hvorfra de
             v.h.a. DMA-kredsen udskrives på skærmen. Dette lagerområde
             starter i adresse 2048 og fylder 2048 bytes. 
           \f

F_       A_._ _ _ _ _ _ _ _ _R_E_F_E_R_E_N_C_E_R_                                                       A.
           
          1: RC700 COMAL, Brugermanual. 2. udgave. 
           
          De øvrige referencer henviser til manualer, som beskriver de højt
          integrerede kredse, som anvendes i RC700. Manualerne kan fås ved
          henvendelse til de pågældende komponentleverandørers danske
          distributører. 
           
          Zilog er repræsenteret ved 
                DITZ SCHWEITZER A/S 
                Vallensbækvej 41, 2600 Glostrup. 
           
          Manualer: 
           
          a) Z80 Assembly Language Programming (CPU) 
          b) Z80-CPU, Z80A-CPU Technical Manual 
          c) Z80-CPU Programming Reference 
          d) Microcomputer Component Data Book (PIO, SIO, CTC) 
           
          Intel er repræsenteret ved 
                Scan Supply 
           
          Manual: 
           
          Intel Component Data Book (DMA, Floppy, CRT). 
           \f

F_       B_._ _ _ _ _ _ _ _ _S_E_M_I_G_R_A_F_I_S_K_ _T_E_G_N_S_Æ_T_,_ _S_K_Æ_R_M_ B.
           
                   Det semigrafiske tegnsæt består af 64 forskellige tegn, som med
          tilhørende tegnværdier er vist på næste side. Bemærk, at der er
          et "spring" i tegnværdierne (64-95 er almindelige bogstaver, dvs.
          en del af det danske ASCII-alfabet). Tegnværdierne er valgt i
          overenstemmelse med de international vedtagne værdier til brug i
          forbindelse med "tele-text". 
           
          Det enkelte tegn er delt i 6 dele, som hver især er tændt eller
          slukkede. De 6 tegn, som kun har n del tændt, har tegnværdierne
          33, 34, 36, 40, 48, 96. 
           \f

F_                  
           \f

F_       C_._ _ _ _ _ _ _ _ _S_E_M_I_G_R_A_F_I_S_K_ _T_E_G_N_S_Æ_T_,_ _R_C_8_6_1_ _P_R_I_N_T_E_R_                               C.
           
                   De enkelte tegn er angivet med de tilsvarende tegnværdier. Be-
          mærk, at der kun er 64 forskellige teng, som f.eks. findes i
          intervallet 33-97.  
           
          Tegnene er iøvrigt opbygget på samme måde som for skærmens ved-
          kommende (jvnf. appendix B), men med andre tegnværdier, som er
          fastlagt af printerfabrikanten. 
           
          Udskriften er dannet v.h.a. programeksemplet i afsnit 4. 
           \f

F_       D_._ _ _ _ _ _ _ _ _P_R_O_G_R_A_M_E_K_S_E_M_P_L_E_R_ D.
           
          De tre følgende eksempler viser, hvordan man kan oprette en fil,
          samt hvordan man kan skrive og læse data i den.  
           \f

F_                 Det følgende eksempel viser X,Y-adressering v.h.a. CRT-funktio-
          nen. 
           \f

F_       E_._ _ _ _ _ _ _ _ _T_R_A_N_S_M_I_S_S_I_O_N_S_P_R_O_T_O_K_O_L_                                            E.
           
          IN LINE- OG OUT LINE-sætningerne benytter en blokorienteret
          transmissionsprotokol, som beskrives i det følgende. 
           
          En blok består af følgende dele: 
           
          1) start tegn: > > (ASCII-værdi 35) 
           
          2) blokstørrelse: 
             Størrelsen angiver antallet af tegn i den streng, som skal
             transmitteres; altså ikke det antal tegn, som faktisk bliver
             sendt. 
             Blokstørrelsen er et 16-bit heltal (0-65535), der deles op i
             fire 4-bit cifre. Hvert ciffer opfattes som et heltal, hvortil
             der lægges 64, således at den resulterende værdi ligger mellem
             64 og 79. Disse fire tegn transmitteres. 
              
          3) data-del: 
             Strengen, som skal transmitteres, hvor hvert tegn opdeles i to
             4-bit cifre, hvortil der lægges 64 som ovenfor. Hvert tegn i
             strengen transmitteres altså som to ASCII-tegn, hvor mest be-
             tydende del sendes først. 
              
          4) check-sum: 
             Et 8-bit tal, der sendes som to ASCII tegn, som forklaret
             ovenfor. Checksummen beregnes sådan, at den samlede sum -
             modulo 256 - af alle ASCII-værdier af tegnene i den oprinde-
             lige streng og checksummen bliver nul. 
              
          5) sluttegn: >!> (ASCII-værdi 33) 
              
          Hvis antallet af tegn i den transmitterede streng er N, bliver
          det faktiske antal sendte tegn altså 1+4+2*N+2+1 = 2*N+8. 
           \f

F_       F_._ _ _ _ _ _ _ _ _K_O_N_T_R_O_L_T_E_G_N_ _T_I_L_ _I_N_I_T_I_A_L_I_S_E_R_I_N_G_ _A_F_ _T_E_R_M_I_N_A_L_P_O_R_T_                   F.
           
          Tegn - med tegnværdi større end 128 - som sendes ud på terminal-
          porten v.h.a. funktionen XMT, opfattes som kontroltegn, der an-
          vendes til initialisering af terminal-portens sender- og modta-
          gerside.  
           
          Under initialiseringen specificeres det, hvordan porten vil blive
          benyttet ved efterfølgende anvendelse af XMT- og REC-funktionerne
          samt IN LINE- og OUT LINE-sætningerne, der er beskrevet i kapitel
          2. De parametre, som specificeres under initialiseringen angiver
          transmissionshastighed (baudrate), antal bit pr. tegn samt pari-
          tet.  
           
          Visse kontroltegn har til opgave at åbne porten, dvs. at etablere
          en forbindelse karakteriseret ved de tidligere angivne parametre.
          Under denne "open" angives endvidere, om der skal transmitteres
          via en eventuel linesectors port A eller port B. Når en forbin-
          delse er etableret v.h.a. "open" accepteres kun tegn med tegnvær-
          di under 128, dog vil et specielt tegn bevirke, at forbindelsen
          afbrydes ("close"). For modtagersidens vedkommende accepteres
          endvidere "clear status", dvs. XMT(150). 
           
          Hvis brugeren før en "open" udføres kun har specificeret nogle af
          de mulige parametre, anvendes standard-værdier for de ikke speci-
          ficerede parametre.  
           
          Hvis der startes transmission uden en forudgående "open", vil
          porten blive benyttet med standard-værdier.  
           
          De anvendte kontroltegn og deres betydning er:  
               
             T_e_g_n_v_æ_r_d_i_ _ _ _ _ _B_e_t_y_d_n_i_n_g_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
              
                           T_r_a_n_s_m_i_s_s_i_o_n_s_h_a_s_t_i_g_h_e_d_ 
             131           baudrate:  50 bps 
             132           baudrate:  75 bps 
             133           baudrate: 110 bps 
             134           baudrate: 150 bps 
             135           baudrate: 300 bps 
              \f

                      T_e_g_n_v_æ_r_d_i_ _ _ _ _ _ _ _ _ _ _B_e_t_y_d_n_i_n_g_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
              
             136                udefineret 
             137                udefineret 
             138                udefineret 
             139                baudrate:  600 bps 
             140                baudrate: 1200 bps 
             141                baudrate: 2400 bps 
            (142                baudrate: 4800 bps) 
            (143                baudrate: 9600 bps) 
              
                                b_i_t_ _p_r_._ _t_e_g_n_ 
             160                5 bit pr. tegn 
             161                6 bit pr. tegn 
             162                7 bit pr. tegn 
             163                8 bit pr. tegn 
              
                                p_a_r_i_t_e_t_,_ _s_t_o_p_b_i_t_ 
             176                1 stopbit samt ingen paritet 
             177                1 stopbit samt ulige paritet 
             179                1 stopbit samt lige paritet 
             184                1 1/2 stopbit samt ingen paritet 
             185                1 1/2 stopbit samt ulige paritet 
             187                1 1/2 stopbit samt lige paritet 
             192                2 stopbit samt ingen paritet 
             193                2 stopbit samt ulige paritet 
             195                2 stopbit samt lige paritet 
              
                                p_o_r_t_v_a_l_g_,_ _"_o_p_e_n_"_ 
             129                "open", lineselector port A 
             130                "open", lineselector port B 
             150                "clear status, receiver" 
             155                "close" 
              
          Standardværdier er: 
             Transmissionshastighed: 1200 bps.  
             2 stopbit, 7 databit samt lige paritet. 
             Der selekteres port A på en eventuel lineselector. 
              \f

                      De angivne standardværdier svarer til de værdier, som normalt
             skal anvendes ved kommunikation med RC3600/7000/8000, idet
             baudhastigheden dog er installationsafhængig. 
              
             Såfremt der ikke benyttes lineselector, skal port A angives
             ved "open". 
              
                      Hvis REC-funktionen returnerer med en fejlkode (-1: time out,
             -2: status fejl) benyttes "clear status receiver", inden der
             igen kan modtages tegn. Hvis man ønsker at modtage flere tegn
             lige efter hinanden, kan man specificere 1200 baud eller min-
             dre hastighed, og inden for hver blok er der kun tid til at
             gemme tegnene i et array. Tegnene kan f.eks. indlæses v.h.a.
             en FOR-sætning, der udføres et antal gange svarende til det
             maksimale antal tegn. Når der ikke kommer flere tegn, vil
             REC-funktionen returnere med timeout. Denne status vil blive
             bevaret, indtil en "clear status receiver" udføres, hvilket
             vil sige, at den "resterende" del af FOR-sætningen bliver ud-
             ført med maksimal hastighed, (efter at der n gang har været
             timeout, vil REC-funktionen returnere omgående ved efterføl-
             gende kald - indtil "clear status receiver" udføres). 
              \f

                    
           \f

«eof»