|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6144 (0x1800) Types: TextFile Names: »alutproc«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦84e44a383⟧ »crypr« └─⟦this⟧
<* alutproc utility procedures connectin disconnectin readtext putstruct getstruct readroman writeroman writerec writedate inc 1980-09-10 corrected 1982-11-16 *> real procedure inc(a); array a; begin own integer i; i:=i+1; inc:=a(i); if a(i) extract 8=0 then i:=0; end inc; procedure writedate(out,time); value time; real time; zone out; begin real r; if time=0.0 then systime(1,0,time); write(out,"sp",2,<< dd dd dd>,systime(4,time,r),r); end writedate; procedure connectin(name); array name; begin integer res,i; res:=connectcuri(name); if res<>0 then begin unstackcuri; i:=1; alarm("nl",1,"*",3,<:connect in to :>,string name(increase(i)),res); end; setposition(in,0,0); end connectin; procedure disconnectin; begin setposition(in,0,0); if instacked>0 then begin unstackcuri; end; end; integer procedure readtext(in,text); zone in; array text; begin integer char,sh,c,i,cc; cleararray(text); i:=1; cc:=0; repeatchar(in); sh:=0; for c:=readchar(in,char) while char<>34 and char<>25 do; if char=34 then begin for c:=readchar(in,char) while char<>34 and char<>25 do begin text(i):=text(i) shift 8 add char; cc:=cc+1; sh:=sh+1; if sh=6 then begin sh:=0; i:=i+1; end; end inner loop; end char=34; text(i):=text(i) shift (8*(6-sh)); readtext:=cc; end readtext; integer procedure putstruct(name,struct,firstbselem,lastbselem,elemsize,fsegm); value firstbselem,lastbselem,elemsize,fsegm; integer firstbselem,lastbselem,elemsize,fsegm; integer array struct; array name; begin integer array field s; integer i,j,ebase,els; els:=s:=0; connectin(name); setposition(in,0,fsegm); for i:=0 step 1 until firstbselem-1 do swoprec6(in,elemsize); for i:=0 step 1 until lastbselem-firstbselem do begin els:=els+elemsize; swoprec6(in,elemsize); ebase:=i*elemsize//2; for j:=elemsize//2 step -1 until 1 do in.s(j):=struct(ebase+j); end loop; putstruct:=fsegm+els//512+(if els mod 512=0 then 0 else 1); disconnectin; end putstructure; integer procedure getstruct(name,struct,firstbselem,lastbselem,elemsize,fsegm); value firstbselem,lastbselem,elemsize,fsegm; integer firstbselem,lastbselem,elemsize,fsegm; integer array struct; array name; begin integer array field s; integer i,j,ebase,els; els:=s:=0; connectin(name); setposition(in,0,fsegm); for i:=0 step 1 until firstbselem-1 do inrec6(in,elemsize); for i:=0 step 1 until lastbselem-firstbselem do begin els:=els+elemsize; inrec6(in,elemsize); ebase:=i*elemsize//2; for j:=elemsize//2 step -1 until 1 do struct(ebase+j):=in.s(j); end loop; getstruct:=fsegm+els//512+(if els mod 512=0 then 0 else 1); disconnectin; end getstructure; integer procedure writeroman(z,i); value i; integer i; zone z; begin integer j,char; char:=0; while i>0 and i<5000 do begin for j:=i//1000 step -1 until 1 do char:=char+write(z,<:M:>); i:=i mod 1000; if i>=900 then begin i:=i-900; char:=char+write(z,<:CM:>); end; if i>=400 then begin i:=i-400; if i>=100 then i:=i-100 else char:=char+write(z,<:C:>); char:=char+write(z,<:D:>); end; for j:=i//100 step -1 until 1 do char:=char+write(z,<:C:>); i:=i mod 100; if i>=90 then begin i:=i-90; char:=char+write(z,<:XC:>); end; if i>=40 then begin i:=i-40; if i>=10 then i:=i-10 else char:=char+write(z,<:X:>); char:=char+write(z,<:L:>); end; for j:=i//10 step -1 until 1 do char:=char+write(z,<:X:>); i:=i mod 10; if i>=9 then begin i:=i-9; char:=char+write(z,<:IX:>); end; if i>=4 then begin i:=i-4; if i>=1 then i:=i-1 else char:=char+write(z,<:I:>); char:=char+write(z,<:V:>); end; for i:=i step -1 until 1 do char:=char+write(z,<:I:>); end; writeroman:=char; end; integer procedure readroman(z); zone z; begin integer i,j,lj,jc,nj,dsum,fak,char; nj:=1; jc:=maxinteger; dsum:=i:=0; for j:=readchar(z,char) while char>'B' and char<'Y' and nj<3 do begin lj:=jc; fak:=0; for j:=1 step 1 until 7 do begin if char=(case j of ('I','V','X','L','M','D','M')) then begin jc:=j; fak:=case jc of(1,5,10,50,100,500,1000); end symbol found; end for; if fak>0 and nj<3 then begin if jc=lj then begin nj:=nj+1; dsum:=dsum+fak end else if jc>lj and nj=1 then begin nj:=1; dsum:=fak-dsum end else if jc<lj then begin nj:=1; i:=i+dsum; dsum:=fak; end else begin fak:=0; nj:=4; end; end fak>0 else fak:=0; end read; readroman:=if nj>3 or fak=0 then 0 else i+dsum; end readroman; procedure write_rec(out,a,f,l,recsize); value f,l,recsize; integer f,l,recsize; zone out; integer array a; begin integer i,j,max; integer array field ifi; max:=recsize//2; for f:=f step 1 until l do begin write(out,"nl",1,<<ddd>,f,<: . :>); ifi:=f*recsize; for j:=1 step 1 until max do write(out,<< dddddd>,a.ifi(j)); end rec_loop; end write_record; procedure timing(z,text,first); value first; boolean first; zone z; string text; begin own integer bread,br; own long tc,tr,cpu,time; if first then begin cpu:=doubleload(owndescr+56); time:=getclock; bread:=blocksread; end else begin tc:=doubleload(owndescr+56); tr:=getclock; br:=blocksread; cpu:=tc-cpu; time:=tr-time; bread:=br-bread; write(out,"nl",1,<:timing of :>,true,12,text,"nl",1, <:cputime used:>,"sp",10, << dd dd dd>,cpu/10000,"nl",1, <:real time used :>,"sp",7,time/10000, "nl",1,<:cpu <37> :>,"sp",18,<< dd.dd>,cpu/time*100,"nl",1, <:blocksread :>,<< dddddd>,bread); outendcur(10); cpu:=tc; time:=tr; bread:=br; end writing; end timing; ▶EOF◀