DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦cc78d8a92⟧ TextFile

    Length: 7680 (0x1e00)
    Types: TextFile
    Names: »tasdemotxt  «

Derivation

└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer
    └─⟦40b1eb8cd⟧ 
        └─⟦this⟧ »tasdemotxt  « 

TextFile

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◀