|
|
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»