|
|
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: 14720 (0x3980)
Types: TextFile
Names: »REGN2.PAS«
└─⟦1230711ec⟧ Bits:30003277 Digital Research Draw v.1.0 + Skriv + Regn
└─⟦this⟧ »REGN2.PAS«
└─⟦fff6648c2⟧ Bits:30004194/disk3.imd Data i Folkeskolen (Comet)
└─⟦this⟧ »REGN2.PAS«
(* REGN2.PAS INCLUDE FILE *)
æ*******************************************************************å
æ* purpose: micellaneous utilities and commands. *å
æ*******************************************************************å
PROCEDURE CURSOR(cursor_on:boolean);
begin
if cursor_on then
write(curon)
else
write(curoff);
end;
FUNCTION KEY:char; æ Allmost all keyboard inputs through this routine å
var
cch:char;
begin
CURSOR(true);
read(kbd,cch);
KEY:=cch;
CURSOR(false);
end;
PROCEDURE DELAY(antal:integer;var trykket:boolean);
var
dcount:integer;
begin
dcount:=0;
while (dcount<antal) and not trykket do begin
dcount:=dcount+1;
trykket:=keypress;
end;
end;
æ Displayes a line in the bottom of the screen and higligts the listed å
æ characters å
PROCEDURE HIGHLIGHTMSG(indlin:str128);
var
udlin1,udlin2:stringÆ128Å;
tpos:byte;
begin
udlin1:=indlin;
udlin2:='';
for tpos:=1 to len(udlin1) do begin
if (udlin1ÆtposÅ in Æ'A'..'Å','0','?'Å) then
udlin2:=udlin2+rvson+udlin1ÆtposÅ+rvsoff
else
udlin2:=udlin2+udlin1ÆtposÅ;
end;
write(udlin2);
end;
PROCEDURE MSG(s: anystring);
begin
gotoxy(0,23);
write(clreol);
write(s,rvsoff,' ');
end;
PROCEDURE FLASH(x: integer; s: anystring; blink: boolean);
var
tasttrykket:boolean;
begin
tasttrykket:=false;
write(rvson);
gotoxy(x,22);
write(s);
if blink then begin
repeat
gotoxy(x,22);
blink:=not blink;
if blink then write(rvson) else write(rvsoff);
write(s);
DELAY(pause,tasttrykket);
until tasttrykket;
end;
write(rvsoff);
end;
FUNCTION UPCASE(nch:char):char;
begin
if (ord(nch)>96) and (ord(nch)<127) then
UPCASE:=chr(ord(nch)-32)
else
UPCASE:=nch;
end;
PROCEDURE AUTO;
begin
autocalc:=not autocalc;
if autocalc then
FLASH(63,' Autoregn: TIL ',false)
else
FLASH(63,' Autoregn: FRA ',false);
end;
PROCEDURE GRID;
var
i:integer;
count:char;
begin
write(clrhom,indicator,rvson);
for count:='A' to fxmax do begin
gotoxy(xposÆcountÅ,0);
write(vline,' ',count,' ');
end;
gotoxy(0,1);
for i:=1 to fymax do writeln(i:2);
write(rvsoff);
if autocalc then
FLASH(63,' Autoregn: TIL ' ,false)
else
FLASH(63,' Autoregn: FRA ',false);
FLASH(37,' Tast / for kommando ',false);
end;
PROCEDURE INIT;
var
i: sheetindex;
j: integer;
begin
forladt:='A';repeteret:=false;
errmessageÆ1Å:='Uoverenstemmelse i filtype';
errmessageÆ2Å:='Filen findes ikke';
errmessageÆ3Å:='Disketten er fuld';
errmessageÆ4Å:='Fil forsvundet';
errmessageÆ5Å:='Programfejl - kan ikke læses';
errmessageÆ6Å:='Programfejl - kan ikke skrives';
errmessageÆ7Å:='For mange åbne filer';
errmessageÆ8Å:='Ukendt fejl';
errmessageÆ9Å:='Fejl ved indlæsning af tal';
errmessageÆ10Å:='Ukendt fejl';
errmessageÆ11Å:='For stor fil';
errmessageÆ12Å:='Fil uafsluttet';
errmessageÆ13Å:='Disketten er fuld';
errmessageÆ14Å:='Søgning udover kant af fil';
errmessageÆ15Å:='Fil ikke åben';
retning:=0;indicator:=pilh;
slut:=false;
for i:='A' to fxmax do begin
for j:=1 to fymax do begin
with sheetÆi,jÅ do begin
cellstatus:=ÆtxtÅ; æ all cells initiated with text attribut å
contents:=''; æ all strings emty å
value:=0; æ all values 0 å
dec:=2; æ default number of decimals å
fw:=normwidth; æ all cells width = normwidth å
end;
end;
end;
autocalc:=true; æ autocalc is on å
fx:='A'; fy:=1; æ first field in upper left corner å
end;
PROCEDURE CLEAR;
begin
write(rvsoff);
gotoxy(0,23); write(clreol);
write(@7+' Slet dette regneark? (J/N) ');
repeat
ch:=UPCASE(KEY);
until ch in Æ'J','N'Å;
write(ch);
if ch='J' then begin
INIT;
GRID;
end;
end;
PROCEDURE SKIFTTYPE(typenr:byte);
begin
gotoxy(4,22);write(rvson);
if typenr=0 then
write('TEKST ')
else
if typenr=1 then
write('TAL: ')
else
write('FORMEL:');
write(rvsoff);
end;
PROCEDURE FLASHTYPE;
begin
with sheetÆfx,fyÅ do begin
gotoxy(0,22);
if fy<10 then
write(fx,fy,' ')
else
write(fx,fy:2,' ');
if formula in cellstatus then
write('FORMEL: ')
else
if constant in cellstatus then
write('TAL ')
else
if txt in cellstatus then write('TEKST ');
gotoxy(0,23);write(rvsoff,clreol);
if formula in cellstatus then write(contents);
end;
end;
PROCEDURE GOTOCELL(gx: sheetindex; gy: integer);
begin
with sheetÆgx,gyÅ do begin
write(rvson);
gotoxy(xposÆgxÅ,gy);
write(copy(tom,1,fw));
gotoxy(xposÆgxÅ,gy);
if txt in cellstatus then
write(contents)
else begin
if not (formula in cellstatus) then begin
if dec>=0 then
write(value:fw:dec)
else
write(value:fw);
end else begin
if onscreen in cellstatus then begin
if dec>=0 then
write(value:fw:dec)
else
write(value:fw);
end;
end;
end;
FLASHTYPE;
gotoxy(xposÆgxÅ,gy);
end;
write(rvsoff);
end;
PROCEDURE LEAVECELL(fx:sheetindex;fy: integer);
begin
with sheetÆfx,fyÅ do begin
gotoxy(xposÆfxÅ,fy);
write(rvsoff);
if (txt in cellstatus) then begin
if not (cellstatus*Æoverwritten,lockedÅ<>ÆÅ) then
write(contents+copy(tom,1,fw-len(contents)));
end else begin
write(copy(tom,1,fw));
gotoxy(xposÆfxÅ,fy);
if onscreen in cellstatus then begin
if dec>=0 then
write(value:fw:dec)
else
write(value:fw);
end else
write(copy(points,1,fw));
end;
end;
end;
PROCEDURE UPDATE;
var
ufx: sheetindex;
ufy: integer;
begin
GRID;
for ufx:='A' to fxmax do
for ufy:=1 to fymax do
if sheetÆufx,ufyÅ.contents<>'' then LEAVECELL(ufx,ufy);
end;
PROCEDURE MOVEDOWN;
var
startx: sheetindex;
starty: integer;
begin
retning:=1;indicator:=pilned;
gotoxy(0,0);write(indicator);
LEAVECELL(fx,fy);
if forladt>fx then fx:=forladt;
startx:=fx;starty:=fy;
repeat
fy:=fy+1;
if fy>fymax then fy:=1;
while (sheetÆfx,fyÅ.cellstatus*Æoverwritten,lockedÅ<>ÆÅ)
and (fx>'A') do fx:=pred(fx);
until (sheetÆfx,fyÅ.cellstatus*Æoverwritten,lockedÅ=ÆÅ)
or ((fy=starty) and (fx=startx));
GOTOCELL(fx,fy);
end;
PROCEDURE MOVEUP;
var
startx: sheetindex;
starty: integer;
begin
LEAVECELL(fx,fy);
if forladt>fx then fx:=forladt;
startx:=fx;starty:=fy;
repeat
fy:=fy-1;
if fy<1 then fy:=fymax;
while (sheetÆfx,fyÅ.cellstatus*Æoverwritten,lockedÅ<>ÆÅ)
and (fx>'A') do fx:=pred(fx);
until (sheetÆfx,fyÅ.cellstatus*Æoverwritten,lockedÅ=ÆÅ)
or ((fy=starty) and (fx=startx));
GOTOCELL(fx,fy);
end;
PROCEDURE MOVERIGHT;
var
startx: sheetindex;
starty: integer;
begin
retning:=0;indicator:=pilh;
gotoxy(0,0);write(indicator);
LEAVECELL(fx,fy);
startx:=fx;starty:=fy;
repeat
if fx<fxmax then
fx:=succ(fx)
else begin
fx:='A';
fy:=fy+1;
if fy>fymax then fy:=1;
end;
until (sheetÆfx,fyÅ.cellstatus*Æoverwritten,lockedÅ=ÆÅ)
or ((fx=startx) and (fy=starty));
forladt:=fx;
GOTOCELL(fx,fy);
end;
PROCEDURE MOVELEFT;
var
startx: sheetindex;
starty: integer;
begin
LEAVECELL(fx,fy);
startx:=fx;starty:=fy;
repeat
if fx>'A' then
fx:=pred(fx)
else begin
fx:=fxmax;
fy:=fy-1;
if fy<1 then fy:=fymax;
end;
until (sheetÆfx,fyÅ.cellstatus*Æoverwritten,lockedÅ=ÆÅ)
or ((fx=startx) and (fy=starty));
forladt:=fx;
GOTOCELL(fx,fy);
end;
type
string3 = stringÆ3Å;
var
filename: str14;
line: stringÆ100Å;
FUNCTION EXIST(filen: anystring): boolean;
var
f: file;
begin
æ$i-å
assign(f,filen);
reset(f);
æ$i+å
if iores<>0 then EXIST:=false else EXIST:=true;
close(f);
end;
PROCEDURE FORTRYDTEKST;
begin
FLASH(37,' Fortryd - Tast ESC ',false);
end;
PROCEDURE FJERNFLASH(xpos,tlen:byte);
begin
FLASH(xpos,rvsoff+copy(tom,1,tlen),false);
end;
FUNCTION DISKVALG:char;
var
sv,udisk:char;
diskok:boolean;
begin
FORTRYDTEKST;
repeat
diskok:=true;
MSG(' Hvilket drev? ');
repeat
udisk:=UPCASE(KEY);
until udisk in Æ'A'..'P',escÅ;
if udisk<>esc then write(udisk);
if not (udisk in Æ'A','B',escÅ) then begin
diskok:=false;
FLASH(13,' DREV '+udisk+': ???? J/N '+@7,true);
repeat
sv:=UPCASE(KEY);
until sv in Æ'J','N'Å;
if sv='J' then diskok:=true;
FJERNFLASH(13,23);
end;
until diskok;
DISKVALG:=udisk;
end;
PROCEDURE GETFILENAME(xp:byte; var line: str14; filetype:string3);
begin
line:='';
FORTRYDTEKST;
gotoxy(xp,23);write(clreol);
repeat
ch:=UPCASE(KEY);
if ch in Æ'A'..'Z','_',':','0'..'9',return,venstre,delleft,escÅ then begin
if ch in Ævenstre,delleftÅ then begin
if len(line)>0 then delete(line,len(line),1);
gotoxy(xp,23);write(clreol,line);
end else begin
if ch=esc then
line:=''
else begin
write(ch);
line:=line+ch;
end;
end;
end;
until (ch=return) or (ch=esc);
if ch=return then delete(line,len(line),1);
if pos(':',line)>0 then begin
write(rvson,@7,' UMULIGT ARKNAVN! - TRYK EN TAST ',rvsoff);
ch:=KEY;ch:=@0;line:='';
end;
if line<>'' then line:=line+'.'+filetype;
FJERNFLASH(37,25);
end;
PROCEDURE SAVE;
var
udisk:char;
i: sheetindex;
j,fejl: integer;
overskriv:boolean;
begin
udisk:=DISKVALG;
if udisk<>esc then begin
DISKDIR(udisk,'????????ARK',false,'GEMTE ARK');
repeat
overskriv:=true;
filename:='';
MSG(' GEM: Angiv arknavn: ');
GETFILENAME(23,filename,'ARK');
if (filename<>'') then begin
RESETDISK;
assign(tekstfil,udisk+':'+filename);
(*$I-*)
reset(tekstfil);
(*$I+*)
fejl:=iores;
if fejl=0 then begin
MSG(@7+'ARKET: '+filename+' findes allerede! - Skal det overskrives? J/N ');
repeat
ch:=UPCASE(KEY);
until ch in Æ'J','N'Å;
write(ch);
if ch='N' then overskriv:=false;
LUK(1,fejl);
end;
end;
until (filename='') or overskriv;
if filename<>'' then begin
MSG(' Et øjeblik... - Ark: '+filename+' gemmes ');
assign(mcfile,udisk+':'+filename);
(*$I-*)
rewrite(mcfile);
fejl:=iores;
if fejl=0 then
for i:='A' to fxmax do begin
j:=1;
while (j<=fymax) and (fejl=0) do begin
write(mcfile,sheetÆi,jÅ);
fejl:=iores;
j:=j+1;
end;
end;
if fejl=0 then LUK(1,fejl);
(*$I+*)
if fejl>0 then begin
MSG(@7+' FEJL VED SKRIVNING: '+errmessageÆfejlÅ+' - TRYK EN TAST ');
ch:=KEY;
end;
end;
UPDATE;
end else
GOTOCELL(fx,fy);
end;
PROCEDURE LOAD;
var
udisk:char;
fejl:integer;
begin
udisk:=DISKVALG;
if udisk<>esc then begin
DISKDIR(udisk,'????????ARK',false,'GEMTE ARK');
MSG(' HENT: Angiv arknavn: ');
GETFILENAME(24,filename,'ARK');
if (filename<>'') then
if (not EXIST(udisk+':'+filename)) then
repeat
MSG(@7+' Intet ark: '+filename+'! - Skriv et andet arknavn: ');
filename:='';
GETFILENAME(52,filename,'ARK');
until EXIST(udisk+':'+filename) or (filename='');
if filename<>'' then begin
MSG(' Et øjeblik... - Ark: '+filename+' hentes ');
(*$I-*)
assign(mcfile,udisk+':'+filename);
reset(mcfile);
fejl:=iores;
if fejl=0 then begin
for fx:='A' to fxmax do begin
fy:=1;
while (fy<=fymax) and (fejl=0) do begin
read(mcfile,sheetÆfx,fyÅ);
fejl:=iores;
fy:=fy+1;
end;
end;
end;
æ if fejl=0 then LUK(1,fejl); å
close(mcfile);
(*$I+*)
if fejl>0 then begin
MSG(@7+' FEJL VED LÆSNING: '+errmessageÆfejlÅ+' - TRYK EN TAST ');
ch:=KEY;
end;
fx:='A'; fy:=1;
end;
UPDATE;
end else
GOTOCELL(fx,fy);
end;
PROCEDURE PRINT;
var
udisk:char;
printer,overskriv:boolean;
i:sheetindex;
j,count,fejl,
leftmargin: integer;
p:stringÆ20Å;
begin
FORTRYDTEKST;
MSG(' UDSKRIFT: På Printer eller Diskette? P/D ');
repeat
ch:=UPCASE(KEY);
until ch in Æ'P','D',escÅ;
if ch=esc then
udisk:=esc
else
write(ch);
printer:=(ch<>'D');
if not printer then udisk:=DISKVALG;
if udisk<>esc then begin
leftmargin:=1;
if not printer then begin
DISKDIR(udisk,'????????LST',false,'SKREVNE ARK');
repeat
overskriv:=true;
filename:='';
MSG(' UDSKRIFT: Angiv arknavn: ');
GETFILENAME(27,filename,'LST');
if (filename<>'') then begin
assign(tekstfil,udisk+':'+filename);
(*$I-*)
reset(tekstfil);
fejl:=iores;
(*$I+*)
if fejl=0 then begin
MSG(@7+'ARKET: '+filename+' findes allerede! - Skal det overskrives? J/N ');
repeat
ch:=UPCASE(KEY);
until ch in Æ'J','N'Å;
write(ch);
if ch='N' then overskriv:=false;
LUK(2,fejl);
end;
end;
until (filename='') or overskriv;
FJERNFLASH(37,25);
end;
if (filename<>'') or printer then begin
if printer then
filename:='LST:'
else
filename:=udisk+':'+filename;
MSG(' Udskrift på : ' + filename + '....');
assign(tekstfil,filename);
(*$I-*)
rewrite(tekstfil);
fejl:=iores;
if fejl=0 then begin
if printer then begin
count:=1;
while (count<=5) and (fejl=0) do begin
count:=count+1;
writeln(tekstfil);
fejl:=iores;
end;
end;
j:=1;
while (j<=fymax) and (fejl=0) do begin
eline:='';
i:='A';
for i:='A' to fxmax do begin
with sheetÆi,jÅ do begin
while (len(eline)-leftmargin<xposÆiÅ-3) do eline:=eline+' ';
if (constant in cellstatus) or (formula in cellstatus) then begin
if not (locked in cellstatus) then begin
if dec>=0 then str(value:fw:dec,p) else str(value:fw,p);
if (onscreen in cellstatus) or not (formula in cellstatus) then
eline:=eline+p
else
eline:=eline+copy(tom,1,fw);
end;
end else
eline:=eline+contents;
end; æ width å
end; æ one line å
for count:=1 to leftmargin do write(tekstfil,' ');
writeln(tekstfil,eline);
fejl:=iores;
j:=j+1;
end; æ end column å
if fejl=0 then LUK(2,fejl);
if printer then L_DETACH;
end;
(*$I+*)
if fejl>0 then begin
MSG(@7+' FEJL VED SKRIVNING: '+errmessageÆfejlÅ+' - TRYK EN TAST ');
ch:=KEY;
end;
end;
UPDATE;
end else
GOTOCELL(fx,fy);
end;
«eof»