S
ollen mehrere kurze Programme auf einer Diskette gespeichert werden, stößt man schnell an die Grenze der verfügbaren Speicher-Kapazität. Der Turbo-Pas- cal-Compiler bietet mit der H-Option die Möglichkeit, Programme ohne die Run-Time-Library zu compilieren und sie dann als sogenannte Chain-Files aufzurufen. Von dieser Möglichkeit, Platz zu sparen, macht das vorliegende Pro
gramm Gebrauch.
Die Benutzer-Programme werden speicherplatzsparend als xxx.chn-Files direkt auf die Filer-Diskette compiliert, ins Inhaltsverzeichnis (Inhalt.fil) eingelesen und dann von Filer aus aufgerufen. Um wieder zu Filer zurückkehren zu können, sollten die Benutzer-Programme mit der Prozedur »Ende«
(siehe Listing) abgeschlossen werden.
Die Auswahl der einzelnen Funktionen von Filer erfolgt mit den Cursor-Tasten »Pfeil nach oben«, »..nach unten«, »..rechts und links«. Die jeweilige Funktion beziehungsweise die Benutzer-Programme werden invers als Leuchtfeld darge
stellt. Durch Drücken der Home-Taste wird die angezeigte Funktion (Benutzer-Programm) ausgeführt.
»Programm« führt die Benutzer-Programme aus, »Neuauf
nahme« liest ein auf der Diskette vorliegendes xxx.chn- Programm in das Inhaltsverzeichnis ein, »Löschen, Umbe
nennen und CP/M« erklären sich von allein und bedürfen somit keiner weiteren Erläuterung.
Ob groß, ob klein . •.
Alle vom Programm geforderten Eingaben können beliebig als Klein- oder Großbuchstaben erfolgen. Durch Drücken der ESC-Taste können alle laufenden Routinen abgebrochen werden.
Das Quellprogramm besteht aus filer.pas und lib.inc. In lib.inc können Anpassungen an verschiedene Terminals vor
genommen werden. Die Erläuterungen sind in das Programm-Usting eingefügt. Das lauffähige Programm besteht aus filer.com. Das File inhalt.fil wird beim ersten Programm-Lauf automatisch erzeugt.
(M.Schlösser/ev)
program f i l e r ;
(X W ritte n bv M.A. Schlösser X)
(X R h e in s tr. 20 X)
(X 6100 Damsta d t X)
(X T e l: 86151 - 2 25 38 X)
(X Stand vom 25. Juni 1985 ¡0
lin e s , in h a rra y a rra y n r, a rra y la e n g e .i file n a m e ,h e lp s trin g p r u e f . f i l e . e x i s t f i l e v a r zch
d e f s tr in g ; in te g e r;
a n y s trin g ; boolean;
f i l e ; ch ar;
(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi
(X Turbo-Pascal Programme können s p e ic h e rp la tz -s p a re n d X) (X m t der H-Option des C ompilers c o m p ilie rt und von X)
(X diesem Programm aus aufg eru fe n werden. X)
(XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)
type in h a ltre e = re cord
Progname: s t r in g ( . 1 2 . ) ; end;
var d a t e ib u ffe r ; in h a ltre e ; d a te i : f i l e o f in h a ltr e e ; type
d e fS trin g = a rra y ( . 1 . . 3 2 . ) o f s t r in g ( . 1 2 . ) ; d e fs e t = se t o f ch ar;
a n y s trin g = s tr in g ( . 8 0 . ) ; const
b e ll = AG; (X Glocke X)
(X$I f i l e r . l i b X)
procedure i n i t i n h a l t (v a r z ; d e f s tr in g ; va r a n z .re c : in t e g e r ) ; (X l i e s t In h a lts v e rz . von der D is k e tte und X)
(X erzeugt in h a rra y X)
begin a n z .re c := 0;
p ru e f:= e x is t ( ' a s i n h a l t . f i l ' ) ; assign ( d a t e i, ' a : i n h a l t . f i I ' ) ; i f p ru e f then
begin r e s e t ( d a t e i) ;
w h ile n o t e o f ( d a te i) do begin
read (d a te i . d a t e ib u f f e r ) ; Listing, »filer.pas«
a n z .re c := a n z _ re c *l;
z (.a n z _ re c .):= d a te ib u ffe r.p ro g n a m e ;
end; (X w h ile X) Fortsetzung auf Seite 6 8
6 6
i f anz.rec=8 then begin lo u vid e o ;
g o to xyi 1 ,1 2 )¡w r ite ( Neuaufnahme a u fru fe n ' ) ; normvideo:
end; (St i f anz-rec *) end ( f i f p rue f St) e ls e begin
r e w r ite ( d a t e i) ; lo u vid e o ;
g o t o x y iI , 1 2)¡w r ite ('Neuaufnahme a u fru fe n ' ) ; normvideo;
end; (St e ls e *) clo se ( d a t e i) ;
end; (St procedure i n i t i n h a l t SO
procedure h e a d -s trin g (va r z z d e f s tr in g ) ; (St D ient zu r Zuordnung der Daten f ü r den SO
(Sl auszudruckenden a rra y SO
begin
z ( . l . ) ; = 'Programm'; z ( . 2 . ) i “ 'Neuaufnahme'; z ( . 3 . ) ¡ “ 'L ö s c h e n ';
z ( . 4 . ) : = 'Onbenennen'j z ( . 5 . ) : = 'C P /M ';
end; (SS procedure h e a d -s trin g SO
procedure p ro g ra m n -u e b e rsch rift;
begin
g o t o x y ( l, ld ) ; c l r e o l ;
w r it e ( 'PROGRAMME (v o rh : '.a r r a y la e n g e ,' max: 32 ) ' ) ; end;
procedure m s g C z e ile :in te g e r);
begin
g o t o x y iI , z e ile ) ;
w r it e ln ('L e u c h tfe ld m it C ursor-Tasten auf gewünschtes Programm s t e l l e n ') ; w r it e ln ('u n d d ie HOME-Taste d r ü c k e n .') ;
end;
procedure in i t . a r r a y ;
(St S c h re ib t inh a rra v auf D is k e tte SO
begin
assign ( d a t e i , ' i n h a l t . f i l ' ) ; re w rite ( d a t e i) ;
f o r i : = 1 to arraylaenge do begin
d a te ib u f f e r .prognane := i n h a r r a y t . i . ) ; w r it e ( d a t e i. d a t e ib u f f e r ) ;
end; (S( f o r i SO d o s e ( d a t e i) ;
end; (Sl procedure i n i t - a r r a y SO
(MMMmHHHMkMHKStMSiStälHSiStMSiStM)
<X Hauptprogramm F i l e r SO
(S(XSESfS(SfSfXSSfSS()(9ES(Sf3(Sf Sf)f3(3(S(SEXSfSf3(jESSfSfS(XSE)fS(XX9f)f3fS(S(Sf) begin
c lr s c r ;
w r i t e l n ! ' F ile r f ü r Turbo-Pascal Programme u n te r C P /M ');
w r i t e l n ! ' w r itte n by M .A.Schlösser Juni 1 9 8 5 ');
w r it e ln ;
fo r i : = 1 to 79 do w r it e ( ' - ' ) ; i n i t i n h a l t (in h a rra y ,a rra y la e n g e );
h e a d -s trin g ( l in e s ) ; (Sl l i e s t Funktion-Auswahl in das a rra y lin e s 0 s c h re ib -a rra y ( lin e s , 5 , 1 ,5 , 15, 4 ) ;
(St a r r a y / a nz/ x -y p os/ abstand/ w o r te /z e ile SO g o to x y i1 ,7 ); f o r i : = 1 to 79 do w r it e ( ' - ' ) ;
programm-ueber sehr i f t ;
s c h re ib -a rra y (in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );
(Si s c h re ib t Benutz e r-P ro g. SO repeat (St u n t il tru e = fa ls e SO m sg(9);
a rra y n r!“ s e le c t ( lin e s , 5 , 1 ,5 , 15, 4 ) ; (St a r r a y / anz/ x - y p os/ a bstand/ w o rte /z e ile it)
c l r ln ( 9 , 1 2 ) ; case a rra y n r o f
1: begin (St Programm SO g o to x y i1 ,9 ) ¡lo u v id e o ;
w r it e ln ('Program m -Ausw ahl');norm video;
msg(18);
arrayn rs= s e le c t (in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );
i f a rra y n r <> 0 then begin
a s s ig n l f i le v a r , i n h a r r a y ! . a r r a y n r . ) * '. c h n ') ; . chain ( f i l e v a r ) ;
end (St i f a rra y n r f ) e ls e d r l n ( 9 , l l ) ; end; (If case o f 1 St) 2 : begin (Si Neuaufnahme SO
g o to x y (l,9 );L o w v id e o ;w rite ln ('N e u a u fn a h m e ')¡n o rm v id e o ; w r it e ('D as in s In h a lts v e rz e ic h n is aufzunehmende F i l e m u i ' ) ; w r it e ln ( 'u n t e r xxx.chn auf d e r ') ;
w r it e ln ( 'D is k e tt e v o rlie g e n . D ie Namen-Eingabe ohne F ile -K e n n u n g !');
lin e - e d ito r ('Programm-Namen eingeben',1 , 1 3 , 8 , file n a m e , A ' . . ' z ' . » ;
( f Text-Ausgabe/ x -y p os/ Lange/ v a r ia b le / g ü ltig e Zeichen St) i f filen a m e ö " then
begin
Umw-in.6rossbuchstaben (file n a m e );
h e lp s tr in g !“ file n a m e * '.c h n ';
p ru e f!“ e x is t ( h e lp s tr in g ) ; i f p ru e f then
begin
a rra yla e n g e := a rra yla e n g e *1;
i n h a rra y (. a rra y Iaenge. ) s=f iIenam e:
p ro g ra m n u ie b e rs c h rift;
s c h re ib -a rra y ( in h a r r a y , a r ra y la e n g e ,I,1 7 ,1 5 ,4 );
i n i t - a r r a y ; end e ls e begin
w r it e ( b e l l ) ; gotoxy( 1,13) ; d r e o l ;
w r it e ('D a s F ile --> '. h e l p s t r i n g , '
<— i s t n ic h t a uf D is k e t t e ') ; w r it e ( ' vorhanden. Taste d r ü c k e n .') ; re peat u n t il keypressed;
end; (St e ls e l)
end; (St i f file n a n e <> " it) c l r l n (9 ,1 4 );
end; (St case o f 2 it) 3 : begin (it Löschen it)
g o to x y (l,9 );lo w v id e o ; w r it e ( 'L ö s c h e n '); normvideo;
msg(18);
a rra y n r:“ s e le c t (in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );
i f a rra yn r< )8 then begin c l r l n ( 1 0 , l l ) ;
g o to x y i1 ,1 0 )¡w r ite ( ' F i l e in h a r r a y !.a r r a y n r . ) , '< — löschen <j / n ) ' ) ;
re peat read (k b d .z c h );
u n t il upcase(zch) IN ( . ' J ' , ' N ' . ) ; i f upcase(zch) = ' J ' then
begin
assign ( f i l e v a r , i n h a r r a y ( . a r r a y n r . ) * '. c h n ') ; erase ( f i l e v a r ) ;
f o r i : = a rra y n r to a rrayla e ng e do in h a r r a y ! . i . ) ¡= in h a rra y ( . i * l . ) j a rra yla e n g e :“ a rra y la e n g e -1 ; in it_ a r r a y ;
c l r l n f 1 7,2 4);
s c h re itu a rra y (in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );
end; (St i f zch = J SO end; (St i f a rra y n r Q 8 SO d r l n ( 9 , l l ) ;
p ro g ra m u u e b e rs c h rif t ;
end; ( f case löschen ¡0 Listing, »filer.pas«
4 : begin (St Umbenennen if) (Fortsetzung)
r»',YsT.'iv>
IQ M RJTEI
6 8
9 o to x y (l,9 );lo w v id e o ; w r it e ('U mbenennen'); normvideo;
msg (1 8 );
a rra y n r;* s e le c t ( in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );
i t a rra y n r <> 0 then begin
•f i le_ e xi st := fa ls e ; c l r l n (1 0 ,1 1 );
g o to x y (1 ,1 0 );
w r it e ln ( ' F i l e umbenennen ,in h a r r a y ( .a r r a y n r .) ) ; l in e . e d it o r ('N euer Name
' , l , l l , 8 , f i l e n a m e , ( . ' 0 ' . . ' 9 ' , ' A ' . . ' z ' . ) ) ; UI«w_in_Grossbuchstaben (file n a m e );
f o r i : = 1 to a r r a y ) aenge do
i f file n a m e = in h a rra y ( , i . ) then f i l e _ e x i s t : = tru e ; i f f i l e _ e * i s t then
begin
g o t o x y ( l , l l ) ; c l r e o l ;
w r it e ( b e l l , 'e in F ile ' , file n a m e ," e x i s t i e r t b e r e its . Taste drücken ' ) ;
repeat u n t il keypressed;
end (K i f f i l e - e x i s t X) e ls e begin
assign ( f iI e v a r , in h a r r a y ( , a r r a y n r . H '. c h n ') ; rename ( f il e v a r , f il e n a m e * '. c h n ') j
in h a rra y ( . a r r a y n r . ) ;= file n a m e ; i n i t . a r r a y ;
c l r l n (1 7 ,2 4 );
s c h re ib .a rra y ( in h a rra y ,a rra y la e n g e ,1 ,1 7 ,1 5 ,4 );
end; (X e ls e X) end; (X i f a rra y n r O 0 ¡0 c l r l n (9 ,1 1 );
end; (X case umbenennen SO 5 : begin (X Rückkehr zu CP/M SO
d r s c r ; w r it e <'CP/M - B e trie b s s y s te m ');
w r it e ln ;w r it e 1 n ; h a l t ;
end; (X case CP/N X) end; (Xcase SO
u n t il tru e = fa ls e ; Listing, »filer.pas«
end. (Schluß)
(X L ib r a r y - in d u d e Proceduren SO
fu n c tio n e x is K file n a m e : a n y s tr in g ) ; boolean;
(Si p r ü f t , ob F ile auf D is k e tte vorhanden X) (ü wenn vorhanden w ird e x is t= tru e g e se tzt SO v a r f : f i l e ;
begin (W H O
a s s ig n tf ,file n a m e );
r e s e t ( f ) ;
<X*I+X)
i f IO re s u ltO B then e x is t := fa ls e e ls e e x is t ;= tr u e ;
end; (X fu n c tio n e x is t X)
Drocedure Umw.in.Grossbuchstaben (v a r te x t z a n y s trin g );
(X*V-X) va r i ; in te g e r;
begin
f o r i := 1 to le n g th (te x t) do t e x t ( . i . ) ; = upcase ( t e x t i . i , ) ) ; end; (X procedure Umw-in.Grossbuchstaben X)
procedure s c h re ib -a rra v (v a r name: d e f s tr in g ;
a n z , x s ta r t,y s ta r t,a b s ta n d ,
w o rte .p ro _ Z e ile ; in te g e r ) ; (X s c h re ib t a rra y an vorgegebene S t e lle des B ild s c h irm s X) (X d e fs tr in g muss g lobal d e f in i e r t werden X) (X u nte r anz i s t d ie Länge des A rra ys zu verstehen X) var
i.x ,y ,w o r tz a e h le r : in te g e r;
begin
x;= x s t a r t ; y ; = y s t a r t ; w o rtz a e h le r;* 8 ;
g o t o x y ( x s t a r t , y s t a r t ) s c lr e o l;
f o r i := 1 to anz do begin
g o to x v (x ,y );
w r it e ( n a m e ( .i.) ) ; x ;= x*abstand;
w o rtz a e h le rs s u o rtz a e h le r ♦ 1;
i f w o rtz a e h le r* w o rte _ o ro .z e ile then begin
y := y+1; x ;= x s t a r t ; w o rtz a e h le r:* 0;
g o to x y (x ,y ); c l r e o l ; end;
end; (X f o r i X)
end; (X procedure s c h re ib .a rra v X)
fu n c tio n s e le c t (va r name ; d e f s tr in g ;
a n z , x s t a r t , y s t a r t , abstand,
w o rte -p ro L z e ile ; in t e g e r ) ; in te g e r;
(X Bewegt das L e u c h tfe ld entsprechend der d e fin ie r te n Tasten X) (X w ird d ie ESC-Taste g e d rü c k t, so w ird se le ct= 0 z u r ü c k g e lie fe rt X)
(X ansonsten d ie lf d n r des übergebenen A rra ys X)
const
(X Diese Codes beziehen s ic h auf das Term inal X) (X Basis 108 und müssen a uf andere Te rm ina ls X)
(X angepasst werden. X)
hoch = 0139; (X L e u c h tfe ld 1 Z e ile nach oben X) r u n te r* 1138; (X L e u c h tfe ld 1 Z e ile nach unten X) re c h ts * 0149; (X L e u c h tfe ld 1 Wort nach re c h ts X) lin k s * 013d; (X L e u c h tfe ld 1 Wort nach lin k s X)
b e ll = ' 6 ; (X Glocke X)
esc = 027; (X ESC - Taste X)
home = 0192; (X HOME - Taste X)
var
zch ; c h a r;
x,y ,x m a x ,y m a x ,i,
a rra y n r ; in te g e r;
o n . o ff : boolean;
procedure in v e r s .o n .o ff ; begin
g o to x v ( x ,y ) ;
fo r i ;= 1 to abstand do w r it e ( ' ' ) ; o n . o f f : * n ot ( o n _ o ff ) ; i f o n .o ff then low video;
g o to x y ( x ,y ) ;
w r it e (n a m e (.a rra y n r.));
normvideo;
end; (X procedure in v e r s .o n .o ff X) (X HauptProgramm s e le c to r X) begin
x := x s t a r t ; y ;= y s t a r t ; a r r a y n r :* 1; o n . o f f ; * fa ls e ; xrnax:* w o rte .p ro -z e ile X abstand;
vmax:=( anz d iv w o r t e . o r o . z e ile l+ y s ta r t;
i f anz mod w o r te .p ro .z e ile ) 8 then vmax:=vmax ♦ 1;
tn v e r s .o n .o ff;
repeat repeat read (k b d ,z c h );
u n t il zch IN ( .h o c h ,r u n t e r , r e c h ts ,lin k s ,e s c ,h o n e .);
case zch o f hoch; begin
in v e r s .o n .o ff ; v : = y - l ; i f y < y s ta rt tnen
begin y := y s t a r t ; in v e r s .o n .o ff ; end (X i f X) e ls e begin
a r r a y n r :* a rra y n r - w o rte _ p ro _ z e ile ; in v e r s _ o n .o ff;
end;
end; (X case hoch X) Listing. »Iib.inc«
, A , J, i.
u rn n * r < r ,y n
IQ M R J T E I
69
r u n t e r: begin in v e r s .o n .o ff ;
y:=y+1;
i f y)ynax then begin y := y - 1 ;
in v e rs _ o n .o ff;
end (k i f ¡0 e ls e begin
a r r a v n r :5 a rra v n r ♦ w o rte .p ro .z e i Ie ; i f a rra y n r) anz then
begin
a r r a y n r :5 a rra y n r - w o r te .p r a - z e ile ; y : = y - l ;
end;
in v e r s .o n _ o ff;
end; (k e ls e k) end; (k ru n te r It) re c h ts : begin
in v e r s .o n .o ff : x:= x*a b sta nd ; i f x)x»ax then
begin x := x-a bsta nd ; in v e rs .o n _ o ff;
end e ls e begin
a rra y n r:5 a rra y n r ♦ 1;
i f a rra v n r > anz then begin
a rra v n r:5 anz;
x:= x-a bsta nd ; end;
in v e r s .o n .o ff ; end; <k e ls e k) end; (k re c h ts k) lin k s : begin
in v e r s .o n .o ff ; x:=x-a b sta n d ; i f x f x s t a r t then
begin x := x s t a r t ; in v e r s , o n . o ff;
end e ls e begin
a r r a y n r :5 a rra v n r - 1;
i f a r r a y n r d then begin
a rra v n r:5 1;
x := x s t a r t ; end;
in v e rs _ o n .o ff;
end: <k e ls e k) end; (k lin k s k) esc : begin
inversL.on.off;
a rra v n r:5 0;
zch:= h<xne;
end; <k esc k) end: (k case k) u n t il z c h ^ a n e ;
i f a rra v n rO 0 then in v e r s . o n . o f f ; s e le c t:5 a rra y n r;
end; (It fu n c tio n s e le c t k)
procedure lin e - e d it o r ( t e x t : a n y s trin g ; x s t a r t , y s t a r t ,
e in g fe ld : in te g e r;
va r s tr in g v a r : a n y s trin g ; a d d s trin g : d e fs e t) ;
OS W ird d ie ESC-Taste g e d rü ckt, so w ird e in le e re r S trin g k) (k z u r ü c k g e lie fe r t. Unter e in g fe ld i s t d ie Länge des z u rü ck- k) OS z u lie fe rn d e n S trin g s zu v e rs te h e n . IS) (k W -k )
const OS D iese Codes überprüfen und e v t l . anpassen k) b e ll = A6 ; OS K lin g e lz e ic h e n IS)
Esc 5 127; OS ESC-Taste k>
re tu rn 5 013; <k Return Taste k)
backspc 5 'H ; OS Cursor 1 Zeichen nach lin k s k>
va r x , i ,
za eh le r ; in te g e r;
zch : ch ar;
begin
z a e h le r:5 0 ; s tr in g v a r :5 " ; x := len g th ( t e x t ) *3 ; OS Schreibe Text und s t e l le Cursor a uf k)
0 ! E ing a b efeld k)
gotoxy ( x s t a r t , y s t a r t ) ¡ c l r e o l ; w r it e ( t e x t , ' : ' ) ; f o r i := 1 to e in g fe ld do
w r it e ( ' ' ) ; w r it e ( ' ; ' ) ; g o t o x y ( x ,y s ta r t) ;
OS Erzeugen der auszugebenden V a ria b le n k) repeat <k u n t il re tu rn k)
repeat read (k b d .z c h );
u n t il (zch IN (.b a c k s p c ,re tu rn ,e s c .)) o r <zch IN ( a d d s trin g ) ) ; i f (z a e h le r )= e in g fe ld ) and (n o t(z c h IN (.b a c k s p c ,re tu rn ,e s c .))) then
w r it e ( b e ll) e ls e begin
case zch o f backspc: begin
i f le n g th (s trin g v a r> )0 then begin
d e le te ( s t r in g v a r , Ie n g th ( s tr in g v a r ) , 1 ) ; w r it e (b a c k s p c ,' ' , backspc);
z a e h le r:5 z a e h le r-1 ; end;
end; OS backspc k) Esc: begin
s tr in g v a r :5 " ; zch := r e tu r n ; end; 01 esc k) r e t u r n : :
e ls e
s t r in g v a r : 5 s trin g v a r* z c h ; w r it e (z c h ) ;
z a e h le r:5 za eh le r * 1;
end; (k case k) end; (k e ls e k) u n t il zch 5 re tu r n ;
end; (k procedure lin e - e d it o r k) procedure d r l n ( s t a r t e n d e : in te g e r ) ; (k lö s c h t d ie Z e ile n von S ta rt b is Ende k) v a r i : in te g e r;
begin
f o r i : = s t a r t to Ende do begin
g o t o x y ( l, i) ; d r e o l ; end;
end; (k procedure d r l n k) Listing. »Iib.inc«
(k Ende der L ib r a r y - in d u d e Proceduren k) (Schluß)
(k Die Benutzer-Progranme xxx.chn s o llte n k) (k » i t d ie s e r Procedur abgeschlossen werden, k) (k um nach F i l e r zurückkehren zu können k)
procedure ende;
v a r d i s k f i l e : f i l e ; begin
assign ( d i s k f i l e , 'f i l e r . c o m ') ; ' execute ( d i s k f i l e ) ;
end; Listing, »ende.inc«