|
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 - download
Length: 5195 (0x144b) Description: Bits:30000866 sldisksort 31-T87 SG1 10.11.1972 14 51 44 Types: 8-hole paper tape Notes: Gier Text
; sl 13.1.72 sldisksort page 1 sldisksort=set 5 sldisksort=algol index.no list.no external procedure sldisksort(filnavn,læ,antalindiv,segmprblok,ngl); value segmprblok; string filnavn; integer læ,antalindiv,segmprblok,ngl; begin integer fysisksubbloklængde, fysiskbloklængde, b; integer array ia(1:20); array ra(1:2); fysisksubbloklængde := 512 ⨯ segmprblok; b:= (system(2,b,ra)-8⨯512)//(2⨯fysisksubbloklængde); fysiskbloklængde := b ⨯ fysisksubbloklængde; segmprblok := b ⨯ segmprblok; begin integer diff, fa, indivlæ2, logiskbloklængde, logisksubbloklængde, nedbasis, nedplads, nedslut, opbasis, opplads, opslut, slut2, start2, subblokstart, transporter; integer field indivlæ; real r; real field i; array field m, ned, op; integer array nuvblok(0:1); zone z(fysiskbloklængde//2,1,blproc); real mid; real field nøgle; procedure blproc(z,s,b); zone z; integer s, b; if s extract 19 < 1 shift 18 or ia(4)<>5 shift 12 then stderror(z,s,b); procedure io(plads,operation); integer plads, operation; begin b:=nuvblok(plads)⨯segmprblok; if b>=0 then begin ia(4):= operation shift 12; ia(7):= b; ia(5):= b:= fa + plads⨯fysiskbloklængde; ia(6):= b + fysiskbloklængde - 2; setshare(z,ia,1); monitor(16,z,1,ia); check(z); end end io;[ s t o p ] comment sl 13.1.72 page 2; procedure quicksort(start,slut,enblok); value start, slut, enblok; integer start, slut; boolean enblok; begin for m:=(start+slut)//indivlæ2⨯indivlæ while start<slut-indivlæ2 do begin op:= start-opbasis; ned:= slut-nedbasis; m:= m-opbasis; if -,enblok then begin transporter:=0; transport(m,opbasis,opplads,nedplads); nedslut:=ned; opslut:=op; end; mid:= z.m.nøgle; søgned: ned:= ned-indivlæ; if ned < nedslut then begin transport(ned,nedbasis,nedplads,opplads); nedslut:= subblokstart; end; if z.ned.nøgle > mid then goto søgned; søgop: op:= op+indivlæ; if op >= opslut then begin transport(op,opbasis,opplads,nedplads); opslut:= subblokstart + logisksubbloklængde; if transporter=3 then enblok:= nedslut=subblokstart; end; if z.op.nøgle < mid then goto søgop; if op+opbasis < ned+nedbasis then begin for i:=4 step 4 until indivlæ do begin r:=z.op.i; z.op.i:=z.ned.i; z.ned.i:=r end; if indivlæ extract 2 > 0 then begin i:= z.op.indivlæ; z.op.indivlæ:=z.ned.indivlæ; z.ned.indivlæ:=i; end; goto søgned; end; slut2:= op+opbasis; start2:= start; start:= ned+nedbasis; if slut-start < slut2-start2 then begin i:=slut; slut:=slut2; slut2:=i; i:=start; start:=start2; start2:=i; end; if start2<slut2-indivlæ2 then quicksort(start2,slut2,enblok); end for m; end quicksort;[ s t o p ] comment sl 13.1.72 page 3; procedure transport(fysisk,basis,plads,andenplads); integer fysisk, basis, plads, andenplads; begin integer logisk, blok, blokrel, subbloknr, blokbasis; logisk:= fysisk+basis; blok:= logisk//logiskbloklængde; blokrel:= logisk mod logiskbloklængde; if blok = nuvblok(0) then plads := 0 else if blok = nuvblok(1) then plads := 1 else begin plads := 1-andenplads; io(plads,5); nuvblok(plads):= blok; io(plads,3); end; subbloknr := blokrel//logisksubbloklængde; blokbasis := plads ⨯ fysiskbloklængde; fysisk := blokrel + subbloknr ⨯ diff + blokbasis; subblokstart := subbloknr ⨯ fysisksubbloklængde + blokbasis; basis := logisk - fysisk; transporter := transporter + 1; end transport; open(z,4,filnavn,1 shift 18); close(z,false); getzone(z,ia); fa:=ia(19)+1; getshare(z,ia,1); nøgle:=ngl; indivlæ:=læ; indivlæ2:=2⨯indivlæ; if nøgle<4 or indivlæ<nøgle then system(9,nøgle,<:<10>index :>); diff:= fysisksubbloklængde mod indivlæ; logisksubbloklængde := fysisksubbloklængde - diff; logiskbloklængde := b ⨯ logisksubbloklængde; nuvblok(0) := nuvblok(1) := -1; opbasis:= nedbasis:= nedplads:= 0; quicksort(-indivlæ, indivlæ⨯antalindiv, false); io(0,5); io(1,5); end zone blok; end disksort; end[ s t o p ]