|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 165632 (0x28700) Types: TextFile Names: »D21«
└─⟦3d57f1d87⟧ Bits:30005867/disk03.imd Dokumenter (RCSL m.m.) └─⟦this⟧ »D21«
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»