|
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: 7680 (0x1e00) Types: TextFile Names: »tasdemotxt «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer └─⟦40b1eb8cd⟧ └─⟦this⟧ »tasdemotxt «
tasdemo = algol ; *** tasdemotxt *** ; ; ; et eksempel på et program der skal kommunikere med et antal terminaler ; via en terminal pool i TAS ; ; programmet er opbygget på følgende måde ; ; opret terminal pool ; loop: ; læs en linie fra poolen ; hvis input fra en ny terminal så tæl antal aktive terminal op ; skriv terminal id ; skriv linecount ; skriv teksten læst fra terminalen ; hvis afmelding fra terminal så tæl antal aktive terminaler ned ; hvis flere aktive terminal goto loop begin zone poolin,poolout(26,1,stderror); real time,r; integer i,activeterminals,maxterminals,currterminal; long array lokalid(1:1), temname(1:2); integer procedure createpool(z); <* i denne procedure oprettes en terminal pool i TAS, poolens navn står i z*> zone z; begin integer i; integer array zia(1:20),sia(1:12); zone ztem(1,1,stderror); open(ztem,0,temname,0); getzone6(z,zia); getshare6(ztem,sia,1); sia(4):=90 shift 12; for i:=0 step 1 until 3 do sia(8+i):=zia(2+i); setshare6(ztem,sia,1); monitor(16,ztem,1,sia); createpool:=if monitor(18,ztem,1,sia) <> 1 then -1 else sia(1); close(ztem,true); end createpool; integer procedure removepool(z); <* i denne procedure nedlægges en pool i TAS *> zone z; begin integer i; integer array zia(1:20),sia(1:12); zone ztem(1,1,stderror); open(ztem,0,temname,0); getzone6(z,zia); getshare6(ztem,sia,1); sia(4):=92 shift 12; for i:=0 step 1 until 3 do sia(8+i):=zia(2+i); setshare6(ztem,sia,1); monitor(16,ztem,1,sia); removepool:=if monitor(18,ztem,1,sia) <> 1 then -1 else sia(1); close(ztem,true); end removepool; integer procedure send_cmcl(z, id, text); zone z; long array id, text; <* Zone z skal være åbnet til primær output f.eks. med: system(7)primout:(kind, name) hvor kind skal være 64 for tas-session open(z, 0, name, 0) eller zonen skal beskrive en terminalpulje der er oprettet af TAS. Hvis zonen beskriver en terminalpulje skal Long array ID's tre første tegn indeholde lokalid benyttet ved inkludering af terminal fra TAS ellers 0. Long array TEXT kan indeholde op til femten tegn der vil blive sendt til TAS-mclprogram. Result status: bit 16 session findes ikke bit 15 pool findes ikke *> begin integer pos, char; integer array sd, gemsd(1:12); long array field laf; laf:=0; getshare6(z, sd, 1); getshare6(z, gemsd, 1); sd(4):= 128 shift 12 + 0; sd(5):= id(1) shift (-24) extract 24; pos:= 1; repeat getchar(text, pos, char); until char = 0 or pos = 16; pos:= pos-2; sd(6):= pos; sd(7):= sd(8):= sd(9):= sd(10):= sd(11):= 0; puttext(sd.laf, 19, text, pos); setshare6(z, sd, 1); monitor(16)send_message:(z, 1, sd); monitor(18)wait_answer:(z, 1, sd); send_cmcl:= sd(4); setshare6(z, gemsd, 1); end; maxterminals:=99; activeterminals:=0; begin boolean luk, homeup, eraseeol, eraseeos, sosproc; integer i,j,l; integer array field iaf; integer array class(1:200),linecount(0:maxterminals),alfa(0:127); long array field laf, type; long array linebuf(1:200), parent_name,poolname(1:2), status(1:3); <* init diverse variable *> iaf:=0; laf:=0; type:= 12; luk:= false; homeup:= false add 157; eraseeol:= false add 158; eraseeos:= false add 159; temname(1):=long <:tem:>; temname(2):=0; <* hent parent name *> system(8)parent_descr:(i,parent_name); sosproc:=parent_name(1) = long <:sos:>; <* hvis input/output gennem sos skal poolnavn være tem, eller kan det vælges frit *> if sosproc then poolname(1):=long <:tem:> else poolname(1):=long <:demo:>; poolname(2):=long <::>; isotable(alfa); for i:=32 step 1 until 127 do alfa(i):= 6 shift 12 + i; intable(alfa); for i:=1 step 1 until maxterminals do linecount(i):=0; <* åbn zoner til pool, 1 shift 18 i output betyder at localid fra sidste input sættes i output message, virker både når programmet kører gennem sos eller direkte mod tas *> open(poolin,8,poolname,0); open(poolout, 1 shift 18 + 8 ,poolname,0); <* opret terminal pool *> i:=createpool(poolin); if i<>0 then system(9)run_time_alarm:(i,<: create pool<10>:>); write(out,"nl",1,"sp",10,<:*** T A S D E M O S T A R T E D ***:>,"nl",2); setposition(out, 0, 0); loop: <* læs en linie fra en terminal *> l:=readall(poolin,linebuf,class,1); setposition(poolin,0,0); <* skip resten af linien *> <* hent localid som er de første tre tegn i input *> lokalid(1):= linebuf(1) shift (-24) extract 24; lokalid(1):= lokalid(1) shift 24; write(out, <:Inddata fra :>, lokalid, <:: :>, linebuf, <:<10>:>); <* for i:=1 step 1 until l do begin if class(i)=6 then begin integer a,b,c,d; long l; l:=linebuf(i); for a:=5 step -1 until 0 do write(out,<< d>, l shift (-a*8) extract 8); end else write(out,<< d>,linebuf(i)); end; *> setposition(out,0,0); <* localid skal have formen 00a, 01a, 02a o.s.v *> <* beregn terminal nummer ud fra localid *> i:=lokalid(1) shift (-40); i:=if i>48 then i-48 else 0; j:=(lokalid(1) shift (-32) extract 8)-48; currterminal:=i*10 + j; <* tæl antal linier fra terminalen *> linecount(currterminal):=linecount(currterminal)+1; if linebuf(2) = 1 then begin <* login fra en terminal, linien består af <localid><1><1> att <terminal navn><10>*> linecount(currterminal):=0; write(poolout, homeup, 4, eraseeos, 4, <:tas demoprogram ready<10>:>); setposition(poolout,0,0); activeterminals:=activeterminals+1; systime(1,0,time); systime(4,time,r); write(out,<<dd dd dd>,r); write(out,<:: login: :>,<<dd>,currterminal,<:,:>,linebuf.type,"nl",1); setposition(out,0,0); end else if linebuf(2) = 2 then begin <* logout fra terminal, linien består af <localid><2><2> out<10> eller <localid><2><2> hard error<10> *> activeterminals:=activeterminals-1; systime(1,0,time); systime(4,time,r); write(out,<<dd dd dd>,r); write(out,<:: logout: :>,<<dd>,currterminal,<:,:>,linebuf.type,"nl",1); setposition(out,0,0); end else begin <* linien er en tekst linie en * først på linien opfattes som slut kommando en + først på linien opfattes som program afslutnings kommando *> if linebuf(1) shift 24 = long <:*:> <* Slut *> or linebuf(1) shift 24 = long <:+:> <* Nedluk *> then begin if linebuf(1) shift 24 = long <:+:> <* Nedluk efter sidste logout *> then luk:= true; write(poolout, <:Farvel<10>:>); setposition(poolout,0,0); status(1):= if linebuf(1) shift 24 = long <:+:> then long <:luk:> else long <:slut:>; status(2):=status(3):=0; send_cmcl(poolout, lokalid, status); end else begin write(poolout, <: term = :>,<<dd>,currterminal, <: line = :>,<<ddd>,linecount(currterminal),<:: :>, linebuf, "nl",1); setposition(poolout,0,0); end; end; if activeterminals = 0 and luk then <* Ingenting *> else goto loop; end; removepool(poolin); close(poolin,true); close(poolout,true); end ▶EOF◀