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

⟦3524b6a55⟧ TextFile

    Length: 101376 (0x18c00)
    Types: TextFile
    Names: »phtxt       «

Derivation

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

TextFile

\f

;  tas 1.0 14.05.87       pool handler coroutine      phtxt     ...1...

;   @(#)phtxt	1.11  (RC International)  10/2/90
;
;********************************************************************
;*********************  POOL HANDLER COROUTINE **********************
;********************************************************************

;
; Terminal access system for rc8000 - A/S Regnecentralen
; Erik Poulsen 


;  Revisions historie
;
;  87.01.15  release til betatest
;
;  87.02.25  side 8  : kontrol af process kind i createlink
;            side 45 : kontrol af tekst i cmcl message
;            side 55 : ret så start input virker
;  
;  87.02.27  side 9  : sæt state.f8000_type i th der kører f8000
;
;  87.03.02          : hvis 1<6 i mode i output til mtty hentes localid
;                      ikke fra data men fra sidste input
;            side 43f: send_ctrl rettet så 2<12 og 4<12 finder link fra cu
;
;  87.03.03  side 9  : sæt state.link_created i th der kører f8000
;            side 33f: ret procedure output så etx findes når der køres f8000
;
;  87.03.30  side 56 : test 1<15 i linespec i set term spec message
;
;  87.04.02  side 36 : i output op til link sendes kun sidste 3 bit fra mode
;
;  87.04.06  side 9  : new_terminal kaldes med termtype 2 hvis ikke f8000
;
;  87.04.06  side 52 : sæt sim_input i th status
;
;  87.04.07  side 23 : sæt manglende kald af signal 
;            side 23 : send ikke input til th ved create link
;  87.04.08  side 6  : wait_op returnerer result fra wait
;            side 17 : send_input returnerer result fra wait i put_op
;            side 23f: wait ændret så create_link og sim_input afslutter
;                      wait hvis input venter på poolens link
;            side 31 : procedure input ændret så input message kan returneres 
;                      af create_link og sim_input
;            side 56 : ikke test på 1<15 i set term spec message
;                      localid i get/set term spec nu i mes+18 (ikke +16)
;            side 29 : procedure inpue ændret så den returnerer att
;            side 55f: afsendelse af att ændret
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...1a...

;  87.04.10  side 55 : localid i opcode=4 står i +22 (ikke i +10)
;  87.04.21  side 8  : test kun buf.mask hvis buf.mode=4 og f8000 link allerede
;            side 43 : skip th der ikke er f8000 ved i send_ctrl når type=1
;
;  87.05.14  release 1.0
;
;  88.02.25  Ret all steder state.type hentes fra state, 15 bliver til p39
;
;  88.03.17  release 1.2
;
;  88.06.16  side 35 : result 3 hvis buf.first > buf.last i output message
;
;  88.06.16  release 1.2  (tidligere release 1.2 kom kun til ARM)
;
;  88.06.16  side 50 : byte overflow til d11.
;
;  88.07.04  side 36 : extract 4 fra mode (ikke 3), nu virker indlæsning
;                      styret fra output.
;
;  88.12.13  side 30 
;            side 35 : antal halvord i input/output message skal være et 
;                      helt antal ord, rund ned hvis ulige
;
;  89.03.01  side 8  : tillad create link message med pda som intern process
;                      og pseudo process hvis den ikke er oprettet af menu
;
;  89.08.21  side 7ff: indsat test for max create link messages
; 
;  89.10.05  side 30 : slip 1<6 igennem i mode for input operationer
;
;  89.10.31  side 32 : ændring i input() så buffer ikke sættes sammen af
;                      flere operationer fra th, afh. til 3270 bibsystem
;
;  89.11.06  side 35 : output til mtty, hvor data kun består af localid
;                      bevirker at link bliver nedlagt (opdaget hos SPS)
;                      rettes ved at sende svar direkte fra ph
;
;  89.11.09  side 17 : send_input rettet så ex_mode adderes til op.opcode
;
;  89.11.09  side 54f: ny message, opcode = 64, sætter ex_mode til 64
;                      indsat afh.t. bibliosys, se ellers thtxt
;
;  89.11.10  side 40 : glemt ex_mode i start input
;
;  90.03.22  side 37 : rettet gammel fejl, første dataord med cu er i
;                       op+6 ikke i op+4
;
;  90.04.20  side 8  : rettelse til create link message (89.03.01), pseudo
;                      processer har aldrig kunne bruges, det kan de nu.
;
;  90.06.28  side 8  : tillad terminal type 9 (RC9000 sps console) i
;                      create link message.
;
;  90.08.24  side 31:  answer på input udvides med antal operationer
;                      der er i kø til poolen, samt tidsstempel sat i th
;                      da svar på input kom til th.
;                        answer+6: antal operationer
;                              +8:
;                             +10: tidsstempel
;
;  90.09.13  side 43:  send_ctrl ændres så ctrl message sendes fra ph
;                      hvis input sendt til th, gøres for at hindre deadlock.
;
;  90.09.17  side 24:  ny message, regret input, bevirker at input message
;                      der venter på operation fra link returneres.
;                       message+0: 10<12 + 0
;
;  90.09.17            svar på sense rettet så det indeholder antal operationer
;                      i kø til link.
;
;  90.10.02  side 24:  hvis sidste svar på ctrl message havde status <> 0,
;                      så virkede dsen efterfølgende regret input ikke.
;                      Fejlen rettet.
;
;
;  temp testpunkter  (700 - 799)
;;


\f

;  tas 1.0 14.05.87            rcmenu                  phtxt    ...2...

;
; PH coroutinen består af følgende procedure
;
; d2    terminate_ph
; d3    wait_op
; d4    create_link_message
; d5    remove_link_message
; d6    lookup_link_message
; d7    decrease_buf_used
; d10   send_input
; d8    search_link
; d11   copy
; d12   set_nul_answer
; d1    wait
; d9    send_att_message
; d13   sense_ready
; d14   input
; d15   output
; d16   start_input
; d17   adjust_pool
; d18   adjust_th_link
; d19   send_ctrl
; d20   cont_mcl
; d21   terminal_data
; d22   getid  
; d23   reserve_term
; d24   sim_input
; d0    send_rem_message
; d25   u33 start ph coroutine



\f

;  tas 1.0 14.05.87       pool handler coroutine      phtxt     ...3...

b.  d40, r60, o10        ; begin pool handler coroutine
w.
m.pool handler        phtxt 1.11
c.-1
l16:
z.


; routinerne i ph coroutinen bruger lokale variable i coroutine
; beskrivelsen, variabel oprådet er delt i 5 niveauer
; relativ start adresse i coroutine beskrivelse for hvert niveau
; er givet ved o-navne

o1  = q36      ; start niveau 1
o2  = o1 + 2   ; start niveau 2
o3  = o2 + 10  ; start niveau 3
o4  = o3 + 12  ; start niveau 4
o5  = o4 + 8   ; start niveau 5
o6  = o5 + 8   ; top niveau 5
q193= o6 - o1  ; stack size


; procedure terminate_ph;
;
; nedlægger en pool handler coroutine
;

b. i9,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o1 + 0 ; th

d2:   
c.a88<6
      rs. w3  6          ;  *** test no 252 *******
      jl. w3  (r44.)     ;  w0             w2
      h. 252 , 1<6   w.  ;  w1             w3 return
      0                  ;
z.
      rl. w3  (r0.)      ;
      al  w0  p39        ;  
      la  w0  x3+f21     ;  if ph oprettet efter create pool message then 
      se  w0  p35        ;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...4...

      jl.     i1.        ;
      rl. w1  (r47.)     ;
      al  w1  x1+1       ;    en mindre pool handler
      rs. w1  (r47.)     ;
i1:   al  w0  0          ;  mdescr.open1:=0;
      rs  w0  x3+q66     ;  mdescr.open2:=0;
      rl  w2  x3+q28     ;
      se  w2  0          ;  if rem_buf<>0 then
      jd      +1<11+82   ;    regret_message(rem_buf);
      al  w0  4          ;
      al  w1  x3+q8      ;
      rl  w2  x3+q72     ;
      se  w2  0          ;  if mdescr.buf1<>0 then
      jd      +1<11+22   ;    send_answer(4,ans,mdescr.buf1);
      rl  w2  x3+q74     ;                                   
      se  w2  0          ;  if mdescr.buf2<>0 then
      jd      +1<11+22   ;    send_answer(4,ans,mdescr.buf2);
      rl  w0  x3+f21     ;
      so. w0  (j0.)      ;  if state.tem=1 then
      jl.     i6.        ;    /* oprettet med tem som pool navn */
      al  w2  x3+q66-6   ;    remove(mdescr-4); /* ud af kæde */
      jl. w3  (r16.)     ;  else
      jl.     i7.        ;  begin
i6:   al  w3  x3+q60     ;    remove_process(pool_name,r);
      jd      +1<11+64   ;
      se  w0  0          ;    if r<>0 then fault;
      je      -70        ;  end;
i7:   rl. w3  (r0.)      ; rem_next:
      rl  w1  x3+q3      ;  th:=pool_head;
      sn  w1  0          ;
      jl.     i3.        ;  if th<>0 do
      rs  w1  x3+q40     ;  begin
      al  w2  x3         ;
      jl. w3  (r36.)     ;    unlink_th(ph,th);
      al  w0  0          ;    /* ident <> 0 hvis ctrl op under vejs til th */
      rs  w0  x1+q7+f75  ;    th.link.ident:=0;
      rl  w1  x3+q40     ;
      al  w0  p39        ;
      la  w0  x1+f21     ;
      se  w0  p31        ;    if th.type = th oprettet fra ph then
      jl.     i8.        ;    begin
      rl. w0  j1.        ;
      al  w2  x1+f22     ;
      al  w1  x3+q14     ;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...5...

      ds  w1  x3+q11     ;      let.type:= 1 shift 12;
      al  w0  2          ;      let.mbx:=a_sem;
      rs  w0  x3+q12     ;      let.opcode:=2;
      al  w1  x3+q9      ;      send_letter(th.main_mbx,let);
      jl. w3  (r14.)     ;
      al  w2  x3+q14     ;      wait_semaphor(a_sem);
      jl. w3  (r12.)     ;    end
      jl.     i7.        ;    else                             
i8:   rl  w1  x3+q40     ;    begin                            
      al  w2  x1+q7+f71  ;      if th.link.operation.value<0 then
      rl  w0  x2+4       ;        signal(th.link.operation);     
      sh  w0  -1         ;    
      jl. w3  (r13.)     ;    
      rl  w1  x3+q40     ;    
      rl  w0  x1+f21     ;      th.state.stty,mtty,f8000:=0;
      la. w0  j2.        ;
      rs  w0  x1+f21     ;
      al  w1  x1+q7      ;      remove_link(th.link);
      jl. w3  (r27.)     ;    end;
      jl.     i7.        ;    goto rem_next;
                         ;  end;
i3:   al  w0  0          ;
      rs  w0  x3+q7+f78  ;  link.segments:=0;

i4:   al  w2  x3+q7      ;
      rl  w0  x2+4       ;
      sl  w0  0          ;  while link.reserve.value<0 then
      jl.     i5.        ;    signal(link.reserve);
      jl. w3  (r13.)     ; 
      jl.     i4.        ;
i5:   al  w2  x3+q7+f73  ;
      rl  w0  x2+4       ;
      sh  w0  -1         ;  if link.free_seg.value<0 then
      jl. w3  (r13.)     ;    signal(link.free_seg);
      al  w1  x3+q7      ;
      jl. w3  (r27.)     ;  remove_link(link);
      al  w1  x3         ;
      jl. w3  (r37.)     ;  unlink_ph(ph);
      al  w2  x3         ;
      jl.     (r17.)     ;  remove_coroutine(ph);

j0:   p7                 ;
j1:   1<12               ;
j2:   -(:p4+p5+p6:)-1    ;  maske til at fjerne stty,mtty,f8000 i state
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...6...


e.


; procedure wait_op(op);
;
;           op  (return)  peger til første hw i operationen
;                         hvis op=-1 er input afbrudt af create_link, sim_input
;
; venter på operation på link
;
;       call        return
; w0:               undef.
; w1:               undef.
; w2:               op
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o4 +  0 ; saved return

d3:   rl. w2  (r0.)      ;
      rs  w3  x2+q40     ;  save return i cdescr;
      al  w3  x2         ;
      al  w1  x3+q7      ;
      rl  w2  x1+f74     ;
c.a88<6
      rs. w3  6          ;  *** test no 253 ******* 
      jl. w3  (r44.)     ;  w0             w2 link.cur_op
      h. 253 , 1<6   w.  ;  w1 link        w3 curco
      0                  ;
z.
      al  w0  x1+f71     ;
      se  w2  0          ;  if link.cur_op=0 then
      jl.     i1.        ;  begin
      jl. w3  d1.        ;    wait(link.operation,s);
      se  w2  0          ;    if s<>0 then return;
      jl      (x3+q40)   ;  end;
i1:   al  w1  x3+q7      ;
      al  w0  1          ;
      rs  w0  x1+f74     ;  link.cur_op:=1;
      jl. w3  (r28.)     ;  check_op(link.length,op);
      jl      (x3+q40)   ;  return

e.
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...6a...


\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...7...



; procedure create_link_mess(buf,th);
;
;           buf  (call)    mes buf addr
;           th   (return)  cda for th der er oprettet, 0 hvis ikke
;
; opretter en terminal handler og et link fra ph til th
;
;       call        return
; w0:               undef.
; w1:               th
; w2:   buf         unch.
; w3:   return      curco

b. i30,j20  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o2 +  0 ; buf
q41 = o2 +  2 ; return
q42 = o2 +  4 ; tdescr
q43 = o2 +  6 ; th
q44 = o2 +  8 ; new_state

d4:   rl. w1  (r0.)      ;
c.a88<6
      rl  w0  x2+12      ;
      rs. w3  6          ;  *** test no 254 ******* 
      jl. w3  (r44.)     ;  w0 tpda        w2 buf   
      h. 254 , 1<6   w.  ;  w1 curco       w3 return
      0                  ;
z.
      ds  w3  x1+q41     ;  save buf,return i cdescr;
      al  w0  1          ;
      rs  w0  x1+q64     ;  ctrl_result:=1;
      rl  w1  x2+12      ;
      rs. w1  j1.        ;  tpda:=buf.tpda;
      rl. w3  (r0.)      ;
      sh  w1  8          ;  if tpda<8 then
      jl.     i12.       ;  goto err3;
      rl. w2  (r43.)     ;
      rl  w2  x2+96      ;
      sl  w1  x2         ;  if tpda>current cpa then
      jl.     i12.       ;  goto err3;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...8...

      rl  w0  x1         ;  if tpda.kind
      se  w0  9          ;  <> 9   /* rc9000 ssp console */
      sn  w0  0          ;  <> 0   /* internel process */
      jl.     i23.       ;  
      se  w0  84         ;  <> 84  /* subproc perm link */
      sn  w0  85         ;  <> 85  /* subproc temp link */
      jl.     i23.       ;  
      se  w0  8          ;  <> 8   /* csp terminal */
      sn  w0  28         ;  <> 28  /* gin/gout på adp */
      jl.     i23.       ;  <> 64  /* pseudo process */
                         ;  then goto ERR3;
i0:   se  w0  64         ;  if tpda.kind = 64 /* pseudo process */
      jl.     i12.       ;  begin
      rl. w0  (r43.)     ;    if ps owner = own pda then
      sn  w0  (x1+10)    ;    then goto ERR3;
      jl.     i12.       ;  end;
i23:  al. w2  j0.        ;
      dl  w0  x1+4       ;  name:=
      ds  w0  x2+2       ;    process_name(tpda);
      dl  w0  x1+8       ;
      ds  w0  x2+6       ;
      al  w3  x2         ;
      jd      +1<11+4    ;  process_description(name,pda);
      rl. w3  (r0.)      ;
      se. w0  (j1.)      ;  if pda<>tpda then
      jl.     i12.       ;  goto err3;
      rl. w1  (r48.)     ;  w1 = max create link
      rl. w0  (r46.)     ;  w0 = antal th efter create link message
      sl  w0  x1         ;  if w0 > w1 then
      jl.     i24.       ;  goto err14;
      rl  w2  x3+q40     ;
      rl  w0  x2+10      ;
      jl. w3  d8.        ;  search_link(buf.localid,th);
      se  w1  0          ;  if th<>0 then
      jl.     i11.       ;  goto err2;
      rl. w2  j1.        ;
      jl. w3  (r34.)     ;  search_th(tpda,th);
      se  w1  0          ;  if th<>0 then
      jl.     i10.       ;  goto err1;
      rl  w2  x3+q40     ;
      rl  w0  x3+f21     ;
      zl  w1  x2+9       ;
      sn  w1  4          ;  if buf.mode=4 and
      so. w0  (j2.)      ;      state.f8000=1 then
      jl.     i1.        ;    if buf.mask<>f8000_mask then
      zl  w0  x2+16      ;    goto err11;
      se  w0  (x3+q103)  ;
      jl.     i20.       ;
      rl  w0  x3+f21     ;
i1:   se  w1  2          ;  if buf.mode=2 then begin
      jl.     i2.        ;    /* stty */
      sz. w1  (j3.)      ;    if state.stty=1 or state.mtty=1
      jl.     i19.       ;      or state.f8000=1 then goto err10;
      rl. w1  j4.        ;    new_state.stty:=1;
      rs  w1  x3+q44     ;  end
      jl.     i5.        ;  else
i2:   se  w1  0          ;  if buf.mode=0  /* mtty */ then
      jl.     i3.        ;  begin
      sz. w0  (j4.)      ;    if state.stty=1 then
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...8a...

      jl.     i18.       ;    goto err9;
      rl. w1  j5.        ;    new_state.mtty:=1;
      rs  w1  x3+q44     ;
      zl  w1  x2+14      ;    if buf.bufs>1 then
      sl  w1  2          ;    goto err8;
      jl.     i17.       ;  end
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...9...

      jl.     i5.        ;  else
i3:   se  w1  4          ;  if buf.mode=4 then
      jl.     i4.        ;  begin
      sz. w0  (j4.)      ;    if state.stty=1 then
      jl.     i16.       ;    goto err7;
      rl. w1  j6.        ;    new_state.f8000=1;
      rs  w1  x3+q44     ;    f8000_mask:=buf.mask;
      zl  w0  x2+16      ;
      rs  w0  x3+q103    ;  end
      jl.     i5.        ;  else
i4:   al  w0  3          ;  begin
      rs  w0  x3+q64     ;    ctrl_result:=3;
      jl.     i21.       ;    goto err13;
                         ;  end;

i5:   zl  w0  x2+9       ;
      se  w0  4          ;  if tbuf.mode=4 /* f8000 */ then
      am      2          ;    t:=0
      al  w0  0          ;  else t:=2;
      rl. w2  j1.        ;
      jl. w3  (r38.)     ;  new_terminal(tpda,tdescr,t);
      sn  w1  0          ;  if tdescr=0 then
      jl.     i14.       ;  goto err5;
      rs  w1  x3+q42     ;
      jl. w3  (r10.)     ;  create_coroutine(th);
      se  w1  0          ;  if th=0 then
      jl.     i7.        ;  begin
      rl  w1  x3+q42     ;
      rl  w2  x1+f101    ;    used_tdescr:=tdescr.next;
      rs. w2  (r2.)      ;
      rl. w2  (r1.)      ;    release_buffer(tdescr_pool,tdescr);
      jl. w3  (r20.)     ;    goto err4;
      jl.     i13.       ;  end;

;  init th coroutine beskrivelse

i7:   rs  w1  x3+q43     ;
      rl. w0  j8.        ;
      lo  w0  x3+q44     ;
      sz. w0  (j6.)      ;  th.state:= th uden mcl + new_state;
      lo. w0  j9.        ;  if th.state.f8000 then
      rs  w0  x1+f21     ;    th.state.f8000_type:=1; th.state.link_created:=1;
      al  w0  0          ;
      rs  w0  x1+q61     ;  th.s_name:=0;
      dl  w2  x3+q43     ;
      jl. w3  (r33.)     ;  put_in_session(tdescr,th);
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...10...

      rs  w2  x1+f103    ;  tdescr.cur_th:=th;
      al  w1  x2         ;  w1:=th;
      rl  w2  x3+q40     ;  w2:=buf;
      al  w0  0          ;
      rs  w0  x1+q0      ;  th.used_buf:=0;
      rl  w0  x2+10      ;
      rs  w0  x1+q2      ;  th.localid:=buf.localid;
      zl  w0  x2+15      ;
      ba. w0  1          ;
      rs  w0  x1+q4      ;  th.max_timer:=buf.timer+1;
      zl  w0  x2+17      ;
      la  w0  x3+q103    ;  th.cuext:=buf.subst and f8000_mask;
      rs  w0  x1+q3      ;
      zl  w0  x2+9       ;
      zl  w2  x2+14      ;  if buf.mode=2 /* stty */ then
      sn  w0  2          ;    b:=1
      al  w2  1          ;  else b:=buf.bufs;
;mangler test på max buf
      rs  w2  x1+q1      ;  th.max_buf:=b;
      rl. w0  (r40.)     ;  seg:=std seg i link spool area
      al  w1  x1+q7      ;
      jl. w3  (r29.)     ;  create_link(th.link,seg,r);
      sn  w0  0          ;  if r<>0 then
      jl.     i6.        ;  begin
      rl  w1  x3+q42     ;
      rl  w2  x1+f101    ;    used_tdescr:=tdescr.next;
      rs. w2  (r2.)      ;
      rl. w2  (r1.)      ;    release_buffer(tdescr_pool,tdescr);
      jl. w3  (r20.)     ;    goto err6;
      jl.     i15.       ;  end;

i6:   al  w2  x3         ;
      rl  w1  x3+q43     ;
      jl. w3  (r35.)     ;  link_th(ph,th);
      rl  w2  x1+q62     ;
      rl  w0  x3+q1      ;
      rs  w0  x2+f114    ;  th.tbuf.tdescr.sender:=owner;
      al  w2  x1         ;
      al  w0  a25        ;
      rl. w1  r41.       ;  ic:=start th coroutine
      jl. w3  (r11.)     ;  start_coroutine(prio,ic,th);
      al  w2  x2+f26     ;
      jl. w3  (r12.)     ;  wait_semaphor(th.stop_sem);
      rl  w2  x3+q43     ;  
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...11...

      rl  w1  x2+f27     ;  w0:=create result fra th
      se  w1  0          ;  if result<>ok then
      jl.     i22.       ;  goto err12;
      rl  w0  x3+f21     ;
      lo  w0  x3+q44     ;
      rs  w0  x3+f21     ;  state:=state + new_state;
      al  w0  0          ;
      rs  w0  x3+q78     ;  ctrl_ans.state:=0;
      rl. w1  (r46.)     ;
      al  w1  x1+1       ;  en mere th efter create link message
      rs. w1  (r46.)     ;
      rl  w1  x3+q43     ;  w1:=th;
i9:   rl  w2  x3+q40     ; R: w2:=buf;
      jl      (x3+q41)   ;  return;

; konstanter

j10: p42   ; ukendt terminal
j11: p49   ; link findes allerede
j12: p44   ; allerede link til terminal
j13: p45   ; ressource mangel

i10:  am      +j12-j11   ; err1:  s := allerede link til terminal
i11:  am      +j11-j10   ; err2:  s := link findes (localid ikke entydig )
i12:  rl. w0  j10.       ; err3:  s := ukendt terminal
      rs  w0  x3+q78     ;  ctrl_ans.status:=s;
      al  w1  0          ;  th:=0;
      jl.     i9.        ;  goto R;

i24:  am      +1         ; err14: c:=9; for mange create link
i13:  am      +1         ; err4:  c:=8; ingen frie cdescr
i14:  am      +1         ; err5:  c:=7; ingen frie term beskr
i15:  am      +1         ; err6:  c:=6; kan ikke oprette link
i16:  am      +1         ; err7:  c:=5; stty link, forsøgt f8000 link
i17:  am      +1         ; err8:  c:=4; bufs>1 ved mtty
i18:  am      +1         ; err9:  c:=3; stty link, forsøgt mtty link 
i19:  am      +1         ; err10: c:=2; allerede link
i20:  al  w1  1          ; err11: c:=1; fejl ved mask
i22:  rl. w0  j13.       ; err12:  ctrl_ans.errorcode:=c; /* altid 17 */
      ds  w1  x3+q78+2   ;  ctrl_ans.status:= reccource mangel;
i21:  al  w1  0          ; err13:   th:=0;
      jl.     i9.        ;  goto R;

j0:   0,r.4              ; name
j1:   0                  ; tpda
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...12...

j2:   p6                 ; state.f8000
j3:   p4+p5+p6           ; state.stty ! mtty ! f8000
j4:   p4                 ; state.stty
j5:   p5                 ; state.mtty
j6:   p6                 ; state.f8000
j8:   p31 + p18          ; th.state = th uden mcl
j9:   p21+p20            ; th.state.f8000_type

e.



; procedure remove_link_mess(buf);
;
;           buf  (call)  buffer addr
;
; fjerner en terminal handler og linket mellem ph og th
;
;       call        return
; w0:               undef.
; w1:               undef.
; w2:   buf         unch.
; w3:   return      curco

b. i9,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o2 +  0 ; buf
q41 = o2 +  2 ; return
q42 = o2 +  4 ; th

d5:   rl. w1  (r0.)      ;  
c.a88<6
      rs. w3  6          ;  *** test no 255 ******* 
      jl. w3  (r44.)     ;  w0             w2 buf   
      h. 255 , 1<6   w.  ;  w1 link        w3 return
      0                  ;
z.
      ds  w3  x1+q41     ;  save buf,return i cdescr;
      al  w0  1          ;
      rs  w0  x1+q64     ;  ctrl_ans.result:=1;
      rl  w0  x2+10      ;
      jl. w3  d8.        ;  search_link(buf.localid,th);
      sn  w1  0          ;  if th=0 then
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...13...

      jl.     i6.        ;  goto err;
      al  w0  p39        ;
      la  w0  x1+f21     ;  if th.type<>th uden mcl then
      se  w0  p31        ;  goto err;
      jl.     i6.        ;
      rs  w1  x3+q42     ;
      rl  w2  x3+q40     ;
      zl  w0  x2+9       ;  if buf.mode=1 then begin
      se  w0  1          ;    /* hard remove */
      jl.     i1.        ;
      al  w1  x3+q14     ;
      rl. w0  j0.        ;    let.type:=1 shift 12;
      ds  w1  x3+q11     ;    let.mbx:=a_sem;
      al  w0  2          ;
      rs  w0  x3+q12     ;    let.opcode:=2;
      al  w1  x3+q9      ;
      rl  w2  x3+q42     ;    send_letter(th.main_mbx,let);
      al  w2  x2+f22     ;
      jl. w3  (r14.)     ;
      al  w2  x3+q14     ;    wait_semaphor(a_sem);
      jl. w3  (r12.)     ;    goto L;
      jl.     i2.        ;  end;
i1:   se  w0  0          ;  else
      jl.     i3.        ;  if buf.mode=0 then begin
      al  w1  x1+q7      ;    /* soft remove */
      al  w0  2          ;
      rl. w2  r12.       ;    put_op(th.link,2,op,wait_semaphor);
      jl. w3  (r30.)     ;
      sn  w2  0          ;    if op>0 then begin
      jl.     i2.        ;      op.opcode:=1;
      al  w0  1          ;
      hs  w0  x2         ;
      al  w2  x1+f71     ;      signal(th.link.operation);
      jl. w3  (r13.)     ;    end;
i2:   al  w0  0          ; L:  ctrl_ans.status:=0;
      rs  w0  x3+q78     ;  end
      jl.     i4.        ;  else result:=3;
i3:   al  w0  3          ;
      rs  w0  x3+q64     ;
i4:   rl  w2  x3+q40     ; R: w2:=buf;
      jl      (x3+q41)   ;  return;

i6:   rl. w0  j1.        ; err:
      rs  w0  x3+q78     ;  ctrl_ans.status:=p47 /* link findes ikke */
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...14...

      jl.     i4.        ;  goto R;

j0:   1<12               ;
j1:   p47                ;

e.


; procedure lookup_link_mess(buf);
;
;           buf  (call)  message buffer addr
;
; proceduren behandler en lookup link message til pool
;   
;       call        return
; w0:               undef.
; w1:               undef.
; w2:   buf         unch.
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o2 +  0 ; buf
q41 = o2 +  2 ; return
q42 = o2 +  4 ; th

d6:   rl. w1  (r0.)      ;
c.a88<6
      rs. w3  6          ;  *** test no 256 ******* 
      jl. w3  (r44.)     ;  w0             w2 buf   
      h. 256 , 1<6   w.  ;  w1 curco       w3 return
      0                  ;
z.
      ds  w3  x1+q41     ;  save return,buf i cdescr;
      al  w0  1          ;
      rs  w0  x1+q64     ;  ctrl_result:=1;
      rl  w0  x2+10      ;
      jl. w3  d8.        ;  search_link(buf.localid,th);
      se  w1  0          ;  if th=0 then
      jl.     i1.        ;  begin
      rl. w0  j0.        ;    ctrl_ans.status:=
      rs  w0  x3+q78     ;    goto R;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...15...

      jl.     i2.        ;  end;

i1:   rs  w1  x3+q42     ;
      al  w0  0          ;
      rs  w0  x3+q78     ;  ctrl_ans(0):=0;
      rl  w0  x1+q2      ;
      rs  w0  x3+q78+2   ;  ctrl_ans(2):=th.localid;
      rl  w2  x1+q62     ;
      rl  w2  x2+f107    ;
      rs  w2  x3+q78+4   ;  ctrl_ans(4):=th.tbuf.tdescr.tpda;
      rl  w0  x1+q1      ;
      ls  w0  12         ;
      ea  w0  x1+q4      ;  ctrl_ans(6):=th.max_buf shift 12 + th.max_timer;
      rs  w0  x3+q78+6   ;
      rl  w2  x1+q5      ;
      rl  w0  x2+q0      ;
      rs  w0  x3+q78+8   ;  ctrl_ans(8):=th.ph.pool;
      rl  w2  x1+q7+f78  ;  ctrl_ans(10):=
      ws  w2  x1+q7+f73+4;    th.link.segments - th.link.free_seg.value;
      rs  w2  x3+q78+10  ;
      rl  w0  x1+q7+f73+4;
      ls  w0  9          ;
      rs  w0  x3+q78+12  ;  ctrl_ans(12):=th.link.free_seg.value*512;
i2:   rl  w2  x3+q40     ;  w2:=buf;
      jl      (x3+q41)   ;  return;

j0:   p47                ;

e.


; procedure decrease_buf_used(op);
;
;           op  (call)  adresse på operation
;
; kontrollerer at sender af en operation er i live, og tæller
; dens buf_used en ned
;
;       call        return
; w0:               undef.
; w1:               undef.
; w2:   op          unch.
; w3:   return      curco

\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...16...

b. i5,j5  w.

d7:   rs. w3  j0.        ;  save return;
      rl  w1  x2+6       ;
      rl  w0  x1+f14     ;  th:=op.sender_cda;
      se  w0  (x2+8)     ;  if th.ident = op.sender_ident then
      jl.     i1.        ;
      rl  w3  x1+q0      ;  th.buf.used:=
c.a88<6
      rs. w3  6          ;  *** test no 257 ******* 
      jl. w3  (r44.)     ;  w0             w2 op    
      h. 257 , 1<7   w.  ;  w1 th          w3 th.buf_used
      0                  ;
z.
      al  w3  x3-1       ;    th.buf_used - 1;
      rs  w3  x1+q0      ;
i1:   rl. w3  (r0.)      ;  w3:=curco;
      jl.     (j0.)      ;  return

j0:   0                  ; saved return

e.


; procedure send_input(mode,n_hw,s);
;
;           mode  (call)  mode af input operationen
;           n_hw  (call)  antal hw i input operationen
;           s     (return)  =-1  input skal returneres after create link
;                                eller sim_input
;                           ellser =0
;
; sender input operationer til all terminal handlere i poolen, til hver
; sendes så mange som der står i max_buf i th'en
;
;       call        return
; w0:   mode        undef.
; w1:   n_hw        s
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o4 +  0 ; saved return
q41 = o4 +  2 ; 3<12 + mode
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...16a...

\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...17...

q42 = o4 +  4 ; n_hw
q43 = o4 +  6 ; th

d10:  rl. w2  (r0.)      ;
      wa. w0  j0.        ;
      wa  w0  x2+q15     ;
c.a88<6
      rs. w3  6          ;  *** test no 260 ******* 
      jl. w3  (r44.)     ;  w0 mode        w2 curco 
      h. 260 , 1<7   w.  ;  w1 n_hw        w3 return
      0                  ;
z.
      ds  w1  x2+q42     ;  save mode,n_hw i cdescr;
      rs  w3  x2+q40     ;  save return i cdescr;
      al  w3  x2         ;
i1:   rl  w1  x3+q3      ; st: th:=pool_head;
i2:   sn  w1  0          ;  while th<>0 do
      jl      (x3+q40)   ;  begin
      rs  w1  x3+q43     ;
i3:   rl  w0  x1+q0      ;
      sl  w0  (x1+q1)    ;    while th.used_buf<th.max_buf do
      jl.     i4.        ;    begin
      al  w0  6          ;
      al  w1  x1+q7      ;      put_op(th.link,6,op,wait);
      al. w2  d1.        ;
      jl. w3  (r30.)     ;
      sl  w2  0          ;      if wait returnerede med w2<0 then
      jl.     i5.        ;      begin
      al  w1  -1         ;        s:=-1; return;
      jl      (x3+q40)   ;      end;
i5:   sn  w2  0          ;      if op=0 then
      jl.     i1.        ;      goto st:
      dl  w1  x3+q42     ;      op.opcode:=3 + ex_mode;
      ds  w1  x2+2       ;      op.mode:=mode;
      rl  w1  x3+q74     ;      op.hw:=n_hw;    
      rl  w0  x1+6       ;
      rs  w0  x2+4       ;      op.sender:=mdescr.buf2.sender;
      rl  w1  x3+q43     ;      
      rl  w2  x1+q0      ;
      al  w2  x2+1       ;      th.used_buf:=th.used_buf+1;
      rs  w2  x1+q0      ;
      al  w2  x1+q7+f71  ;
      jl. w3  (r13.)     ;      signal(th.operation);
      rl  w1  x3+q43     ;
      jl.     i3.        ;    end;
i4:   rl  w1  x1+q6      ;    th:_th.next_th;
      jl.     i2.        ;  end;

\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...17a...

j0:   3<12               ;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...18...


e.

; procedure search_link(localid,th);
;
;           localid  (call)    localid for link
;           th       (return)  cda for ejer af link, =0 hvis ikke fundet
;
; søger efter link med et givet localid, i en pool kæde
;
;       call        return
; w0:   localid     unch.
; w1:               th
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.


d8:   rs. w3  j0.        ;  save return;
      rl. w3  (r0.)      ;
      rl  w1  x3+q3      ;  th:=pool_head;
      rl  w2  x3+f21     ;
      sz. w2  (j1.)      ;  if state.mtty=0 and state.f8000=0 then return;
i1:   sn  w1  0          ;  while th<>0 do
      jl.     i2.        ;  begin
      sn  w0  (x1+q2)    ;    if th.localid=localid then
      jl.     i2.        ;      return;
      rl  w1  x1+q6      ;    th:=th.next_th;
      jl.     i1.        ;  end;
i2:
c.a88<6
      rs. w3  6          ;  *** test no 258 ******* 
      jl. w3  (r44.)     ;  w0 localid     w2       
      h. 258 , 1<7   w.  ;  w1 th          w3 return
      0                  ;
z.
      jl.     (j0.)      ;  return;

j0:   0                  ; saved return
j1:   p5+p6              ; state.mtty + state.f8000

e.

\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...19...


; procedure copy(hw,buf,d_addr,result);
;
;           hw      (call)    antal hw der skal kopieres
;           buf     (call)    message buffer addresse
;           d_addr  (call)    adressen på første hw i tas buffer
;           result  (return)  >0 antal hw der er kopieret
;                             -2 sender af message stoppet
;                             -3 message unintelligible
;
; kopierer data fra tas buffer til buffer beskrevet ved message buffer
; eller den anden vej (afh. af op i buffe)
;
;       call        return
; w0:   hw          result
; w1:   buf         undef.
; w2:   d_addr      undef.
; w3:   return      curco

b. i5,j8  w.


d11:  rs. w0  j0.        ;  save hw;
      rs. w1  j8.        ;  save buf;
      ds. w3  j2.        ;  save d_addr,return;
c.a88<6
      rs. w3  6          ;  *** test no 261 ******* 
      jl. w3  (r44.)     ;  w0 hw          w2 d_addr
      h. 261 , 1<7   w.  ;  w1 buf         w3 return
      0                  ;
z.
      rl. w3  (r0.)      ;
      sh  w0  0          ;  if hw=0 then
      jl.     (j2.)      ;  return;
      rl. w1  j8.        ;
      zl  w0  x1+8       ;  w:=buf.opcode extract 3;
      la. w0  j3.        ;
      se  w0  3          ;
      jl.     i1.        ;  if w=3 then
      al  w0  5          ;    w:=5
      jl.     i3.        ;  else
i1:   se  w0  5          ;  if w=5
      sn  w0  1          ;     or w=1 then
      jl.     4          ;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...20...

      jl.     i2.        ;    w:=4
      al  w0  4          ;  else
      jl.     i3.        ;  begin
i2:   al  w0  -3         ;    result:=-3; return;
      jl.     (j2.)      ;  end;
i3:   rs. w0  j4.        ;  param.funk:=w;
      rl. w1  j1.        ;
      al  w2  x1-2       ;  param.first:=d_addr;
      wa. w2  j0.        ;
      ds. w2  j6.        ;  param.last:=d_addr+hw-2;
      rl  w0  x3+q75     ;  
      rs. w0  j7.        ;  param.rel_start:=mdescr.used;
      al. w1  j4.        ;
      rl. w2  j8.        ;  general_copy(param,
      jd      +1<11+84   ;    buf,r,n_hw);
      ac  w0  (0)        ;  result:=-r;
      sn  w0  0          ;  if result=0 then
      al  w0  x1         ;    result:=n_hw;
      jl.     (j2.)      ;  return;

j0:   0                  ; hw
j1:   0                  ; d_addr
j2:   0                  ; return
j3:   7                  ; extract 3 maske

j4:   0                  ; param.func
j5:   0                  ; param.first
j6:   0                  ; param.last
j7:   0                  ; param.rel_start

j8:   0                  ; buf

e.



; procedure set_nul_answer;
;
; sætter et nul answer i answer area
;
;       call        return
; w0:               unch.
; w1:               unch.
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...21...

; w2:               unch.
; w3:   return      curco

b. i5,j5  w.

d12:  ds. w0  j1.        ;  save w0,return;
c.a88<6
      rs. w3  6          ;  *** test no 262 ******* 
      jl. w3  (r44.)     ;  w0             w2       
      h. 262 , 1<7   w.  ;  w1             w3 return
      0                  ;
z.
      rl. w3  (r0.)      ;
      al  w0  1          ;
      rs  w0  x3+q30     ;  result:=1;
      al  w0  0          ;
      rs  w0  x3+q8+0    ;  ans.status:=0;
      rs  w0  x3+q8+2    ;  ans.hw:=0;
      rs  w0  x3+q8+4    ;  ans.ch:=0;
      rl. w0  j1.        ;
      jl.     (j0.)      ;  return;

j0:   0                  ; saved return
j1:   0                  ; saved w0

e.

; procedure wait(type,letter,w2);
;
;           type  (call)  type af det der skal ventes på
;      
;                         type    ventes på
;                          1      message med opcode <9 eller opcode >106
;                          2      bruges ikke
;                          3      letter med type 1<5 på main_mbx
;                         >3      semaphor, typen er dens adresse
;           letter (return) adresse på letter der er modtaget
;           w2     (return) -1 hvis input afbrudt af create link eller
;                              sim_input
;                           0  ellers
;
;       call        return
; w0:   type        undef.
; w1:               letter
; w2:               w2
; w3:   return      curco

\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...21a...

\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...22...

b. i20,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o3 +  0 ; saved return
q41 = o3 +  2 ; type / sem
q42 = o3 +  4 ; event_mask
q43 = o3 +  6 ; event_type
q44 = o3 +  8 ; letter
q45 = o3 + 10 ; th

d1:   rl. w2  (r0.)      ;
c.a88<6
      rs. w3  6          ;  *** test no 251 ******* 
      jl. w3  (r44.)     ;  w0 type        w2 curco 
      h. 251 , 1<7   w.  ;  w1             w3 return
      0                  ;
z.
      rs  w3  x2+q40     ;  save return i cdescr;
      al  w3  x2         ;
      rs  w0  x3+q41     ;
      se  w0  1          ;  if type=1 then begin
      jl.     i1.        ;    /* message op<9 eller op>106 */
      al  w0  1<4        ;    event_mask:=1 shift 4;
      al  w1  1          ;    mdescr.open2:=1; 
      hs  w1  x3+q67     ;  end                
      jl.     i11.       ;  else               
i1:   sn  w0  2          ;  if type=2 then fault
      je      -71        ;  else
      sn  w0  3          ;  if type=3 then
      am      1<5-1<0    ;    event_mask:=1<5
      al  w0  1<0        ;  else event_mask:=1<0;
i11:  wa. w0  j0.        ;  event_mask:=evnet_mask + 1<3 + 1<6;
      rs  w0  x3+q42     ;  

i2:   al  w0  1          ; R: 
      hs  w0  x3+q66     ;  mdescr.open1:=1;
      rl  w1  x3+q42     ;  w1:=mask;
      rl  w0  x3+q41     ;  w0:=sem;
      al  w2  x3+f22     ;  w2:=addr main_mbx;
      jl. w3  (r15.)     ;  wait_sem_letter(main_mbx,
      ds  w1  x3+q44     ;     sem,mask,letter,event_type);
      se  w0  1<3        ;  if event_type = 1 shift 3 then
      jl.     i7.        ;  begin  /* message 9<=opcode<=106 */
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...23...

      rl  w2  x1+6       ;
      zl  w0  x2+8       ;    opcode:=mdescr.buf1.opcode;
      se  w0  100        ;    if opcode=100 then 
      jl.     i4.        ;    begin
      jl. w3  d4.        ;      /* create link */
i14:  rs  w1  x3+q45     ;      create_link_mess(th,mdescr.buf1);
      rl  w0  x3+q41     ;      
      rl  w2  x3+q78     ;  ret_input:
      sl  w0  4          ;      if type>3 and
      se  w2  0          ;       ctrl_ans.status=0 then
      jl.     i6.        ;      begin
      rl  w2  x3+q74     ;        buf:=mdescr.buf2;
      zl  w0  x2+8       ;        opcode:=buf.opcode;
      se  w0  3          ;        if opcode<>input then
      jl.     i6.        ;        goto rem;
dl w1 x3+q78+2
ks -780
      al  w1  x3+q78     ;
      rl  w0  x3+q64     ;        send_answer(ctrl_result,ctrl_answer,
      rl  w2  x3+q72     ;                    buf);
      jd      1<11+22    ; 
      al  w0  0          ;        mdescr.buf1:=0;
      rs  w0  x3+q72     ;        w2:=-1;
      al  w2  -1         ;        return;
      jl      (x3+q40)   ;      end;
                         ;    end else
i4:   se  w0  102        ;    if opcode=102 then
      jl.     i5.        ;      remove_link_mess(buf)
      jl. w3  d5.        ;    else
      jl.     i6.        ;  
i5:   se  w0  104        ;    if opcode = 104 then
      jl.     i12.       ;      lookup_link_mess(buf)
      jl. w3  d6.        ;    else
      jl.     i6.        ;
i12:  se  w0  9          ;    if opcode = 9 then
      jl.     i15.       ;      sim_input(buf)
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...24...

      jl. w3  d24.       ;      goto ret_input;
      jl.     i14.       ;    end else
i15:  se  w0  10         ;    if opcode = 10 then
      jl.     i13.       ;      ctrl_ans.status:=0;
      al  w0  0          ;      
      rs  w0  x3+q78     ;    
      jl.     i14.       ;      goto ret_input;
                         ;    else
i13:  al  w0  3          ;      ctrl_result:=3;
      rs  w0  x3+q64     ;
i6:   
dl w1 x3+q78+2
ks -780
      al  w1  x3+q78     ; rem:
      rl  w0  x3+q64     ;  
      rl  w2  x3+q72     ;    send_answer(ctrl_result,
      jd      +1<11+22   ;        ctrl_ans, buf);
      al  w0  0          ;  
      rs  w0  x3+q72     ;    mdescr.buf1:=0;
      jl.     i2.        ;    goto R;
                         ;  end;
i7:   al  w2  0          ;
      se  w0  1<6        ;  if event_type<> 1 shift 6 then 
      jl      (x3+q40)   ;  return;
      rl  w0  x1+8       ;  /* letter fra coroutine */
      se  w0  0          ;  if letter.opcode = 0 then begin
      jl.     i9.        ;    /* ph attention letter */
      rl  w0  x3+q41     ;
      sl  w0  3          ;    if type < 3 then
      jl.     i8.        ;    begin
      jl. w3  d9.        ;      send_attention_message;
      am      -1         ;      r:=0;
i8:   al  w0  1          ;    end else r:=1;
      rl  w1  x3+q44     ;
      rs  w0  x1+10      ;    letter.result:=r;
      rl  w2  x1+6       ;    signal(letter.mbx);
      jl. w3  (r13.)     ;    goto R;
      jl.     i2.        ;  end else
i9:   se  w0  1          ;  if letter.opcode=1 then
      jl.     i10.       ;    terminate_ph
      jl.     d2.        ;  else
i10:  se  w0  2          ;  if letter.opcode<>2 then
      je      -73        ;  fault;
      rl  w2  x3+q28     ;
      al  w1  x3+q8      ;  /* svar på remove message */
      jd      +1<11+18   ;  wait_answer(rem_buf,ans,r);
      al  w0  0          ;
      rs  w0  x3+q28     ;  rem_buf:=0;
      jl.     d2.        ;  terminate_ph;

j0:   1<3+1<6            ;
j1:   3<12               ;

e.
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...25...


; procedure send_att_message;
;
; sender en attention message til ejer af poolen. Hvis der er en
; udestående regrettes den først
;
;       call        return
; w0:               undef.
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i9,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o1 + 0 ; saved return

d9:   rl. w1  (r0.)      ;
      rs  w3  x1+q40     ;  save return i cdescr;
      rl  w2  x1+q5      ;
c.a88<6
      rs. w3  6          ;  *** test no 259 ******* 
      jl. w3  (r44.)     ;  w0             w2 att_buf
      h. 259 , 1<6   w.  ;  w1 curco       w3 return
      0                  ;
z.
      sn  w2  0          ;  if att_buf<>0 then
      jl.     i4.        ;  begin
      jd      +1<11+82   ;    regret_message(att_buff);
      al  w3  x1         ;
      al  w0  0          ;
      rs  w0  x3+q5      ;    att_buf:=0;
      rl. w1  (r3.)      ;    b:=used_att.first;
      al  w2  0          ;    prev:=0;
i1:   sn  w1  0          ;    while b<>0 do
      jl.     i3.        ;    begin
      sn  w1  (x3+q6)    ;      if b=att_eda then
      jl.     i2.        ;        goto F;
      al  w2  x1         ;      prev:=b;
      rl  w1  x1+6       ;      b:=b.next;
      jl.     i1.        ;    end;
                         ;    goto NF;
i2:   rl  w0  x1+6       ; F: p:=b.next;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...26...

      se  w2  0          ;    if prev<>0 then
      rs  w0  x2+6       ;      prev.next:=p;
      sn  w2  0          ;    if prev=0 then
      rs. w0  (r3.)      ;      used_att.first:=p
      se  w0  0          ;    if p=0 then
      jl.     i3.        ;      used_att.last:=p;
      am.     (r3.)      ;
      rs  w0  2          ;
i3:   rl. w2  (r4.)      ; NF:
      jl. w3  (r20.)     ;    release_buffer(free_att,att_eda);
                         ;  end;
i4:   rl. w2  (r4.)      ;
      jl. w3  (r19.)     ;  get_buffer(free_att,att_eda);
      se  w1  0          ;  if att_eda=0 then
      jl.     i5.        ;  begin
      rl. w2  r3.        ;    att_eda:=used_att.first;
      rl  w1  x2         ;    used_att.first:=att_eda.next;
      rl  w0  x1+6       ;
      rs  w0  x2         ;
      rl  w2  x1+2       ;
      jd      +1<11+82   ;    regret_message(att_eda.mbuf);
      al  w0  0          ;    word(att_eda.avar):=0;
      rs  w0  (x1+4)     ;  end;

i5:   rs  w1  x3+q6      ;
      rl. w0  j0.        ;  att_eda.open:=1;
      rs  w0  x1         ;  att_eda.proc:=6;
      al  w0  x3+q5      ;  att_eda.avar:= addr att_buf;
      rs  w0  x1+4       ;
      al  w0  0          ;
      rs  w0  x1+6       ;  att_eda.next:=0;
      rl. w2  r3.        ;  /* sæt ind i kæden */
      rl  w0  x2         ;
      sn  w0  0          ;  if used_att.first<>0 then
      jl.     i6.        ;  begin
      am      (x2+2)     ;    word(used_att.last):=att_eda;
      rs  w1  6          ;    used_att.last:=att_eda;
      rs  w1  x2+2       ;  end
      jl.     i7.        ;  else
i6:   rs  w1  x2         ;    used_att.first:=
      rs  w1  x2+2       ;      used_att.last:=att_eda;
i7:   rl  w0  x3+q0      ;
      al  w2  x1         ;  send_pseudo_message(
      al. w1  j1.        ;      pool,mes,att_eda,
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...27...

      al  w3  x3+q20     ;      owner_name, mbuf);
      jd      +1<11+124  ;
      rl. w3  (r0.)      ;
      rl  w1  x3+q6      ;  att_eda.mbuf:=mbuf;
      rs  w2  x1+2       ;
      rs  w2  x3+q5      ;  att_buf:=mbuf;

      jl      (x3+q40)   ;  return;

j0:   1<12+6             ;
j1:   0,0,0              ;  att message

e.


; procedure sense_ready;
;
; udfører aktionen til en sense ready message
;
;       call        return
; w0:               undef.
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o5 +  0 ; saved return


d13:  rl. w2  (r0.)      ;
c.a88<6
      rs. w3  6          ;  *** test no 263 ******* 
      jl. w3  (r44.)     ;  w0             w2 curco 
      h. 263 , 1<6   w.  ;  w1             w3 return
      0                  ;
z.
      rs  w3  x2+q40     ;  save return i cdescr;
      al  w0  0          ;
      rl. w1  (r39.)     ;
      jl. w3  d10.       ;  send_input(0,max_tbuf_size);
      al  w0  1          ;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...28...

      rs  w0  x3+q31     ;  sense_ready:=1;
      jl. w3  d3.        ;  wait_op(op);
      rl  w0  x2+10      ;
      se  w0  0          ;  if op.hw=0 then
      jl.     i1.        ;  begin
      jl. w3  d7.        ;    decrease_buf_used(op);
      dl  w1  x2+4       ;
      rs  w0  x3+q30     ;    result:=op.result;
      rs  w1  x3+q8      ;    ans.status:=op.status;
      al  w1  x3+q7      ;    release_op(link);
      jl. w3  (r31.)     ;  end;
i1:   jl      (x3+q40)   ;  return;

e.


; extern variable,  indeholder adresser på variable og routiner

u16:
r0:  h.  m24  , 1    w.  ; c0   ref curco, current coroutine
r1:  h.  m65  , 1    w.  ; c50  tdescr_pool
r2:  h.  m66  , 1    w.  ; c51  used_tdescr
r3:  h.  m48  , 1    w.  ; c31  used_att
r4:  h.  m47  , 1    w.  ; c30  free_att

r10: h. m118  , 1    w.  ; e14  create_coroutine
r11: h.   m2  , 1    w.  ; e51  start_coroutine
r12: h.  m11  , 1    w.  ; e22  wait_semaphor
r13: h.  m10  , 1    w.  ; e20  signal
r14: h.  m12  , 1    w.  ; e30  send_letter
r15: h. m117  , 1    w.  ; e34  wait_sem_letter
r16: h.  m45  , 1    w.  ; e3   remove
r17: h. m119  , 1    w.  ; e15  remove_coroutine

r19: h. m120  , 1    w.  ; e55  get_buffer
r20: h.  m22  , 1    w.  ; e57  release_buffer
r21: h.  m89  , 1    w.  ; g22  move

r27: h.  m70  , 1    w.  ; g1   remove_link
r28: h.  m73  , 1    w.  ; g4   check_op
r29: h.  m69  , 1    w.  ; g0   create_link
r30: h.  m72  , 1    w.  ; g3   put_op
r31: h.  m74  , 1    w.  ; g5   release_op
r32: h.  m71  , 1    w.  ; g2   adjust_link
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...29...

r33: h.  m92  , 1    w.  ; g27  put_in_session
r34: h.  m91  , 1    w.  ; g26  search_th
r35: h.  m96  , 1    w.  ; g31  link_th
r36: h.  m97  , 1    w.  ; g32  unlink_th
r37: h.  m99  , 1    w.  ; g34  unlink_ph
r38: h.  m90  , 1    w.  ; g25  new_terminal
r39: h. m161  , 1    w.  ; c53  max_tbuf_size
r40: h. m162  , 1    w.  ; c54  std seg i link spool area
r41: h. m127  , 1    w.  ; u31  start addr for th coroutine
r42: h.  m18  , 1    w.  ; e52  init_semaphor
r43: h.  m31  , 1    w.  ; c15  own pda
r44: h. m176  , 1    w.  ; e1   register testout
r45: h. m177  , 1    w.  ; c64  pda for ps processen tem
r46: h. m232  , 1    w.  ; c66  antal th efter create link message
r47: h. m231  , 1    w.  ; c65  antal pool handlere efter c. p. mes.
r48: h. m262  , r49. w.  ; c75  max create link messages
                         ; init listen fortsætter side 43


; procedure input(att);
;
;           att  (return)  =1 hvis der skal sendes att sammne med svaret 
;
; proceduren behandler en input fra en bruger process
;
;       call        return
; w0:               att
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i20,j12  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o5 +  0 ; saved return
q41 = o5 +  2 ; n_char
q42 = o5 +  4 ; op
q43 = o5 +  6 ; att

d14:  rl. w2  (r0.)      ;
      rs  w3  x2+q40     ;  save return i cdescr;
      rl  w0  x2+f21     ;
      la. w0  j0.        ;
      rs  w0  x2+f21     ;  state.outatt:=0;
      rl  w1  x2+q32     ;
c.a88<6
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...29a...

\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...30...

      rs. w3  6          ;  *** test no 264 ******* 
      jl. w3  (r44.)     ;  w0 state       w2 curco 
      h. 264 , 1<6   w.  ;  w1 in_mode     w3 return
      0                  ;
z.
      so. w0  (j1.)      ;  if state.stty=1 or in_mode=-1 then
      sn  w1  -1         ;  in_mode:=mdescr.buf2.mode;
      jl.     +4         ;
      jl.     i1.        ;
      am      (x2+q74)   ;
      zl  w1  9          ;
      rs  w1  x2+q32     ;
i1:   al  w3  0          ;
      rs  w3  x2+q41     ;  n_char:=0;
      rs  w3  x2+q43     ;  att:=0;

      rl  w1  x2+q74     ;  buf:=mdescr.buf2;
      rl  w3  x1+12      ;  n_hw:=buf.last-buf.first+2;
      ws  w3  x1+10      ;
      la. w3  j8.        ;  rund n_hw til lige 
      sl  w3  0          ;  if n_hw<0 then begin
      jl.     i0.        ;    att:=0;
      rl. w3  (r0.)      ;    result:=3;
      al  w0  3          ;    return;
      rs  w0  x3+q30     ;  end;
      al  w0  0          ;
      jl      (x3+q40)   ;
i0:   so. w0  (j1.)      ;  if state.stty=1 then
      jl.     i2.        ;  begin
      al  w3  x3+2       ;
      am.     (r39.)     ;
      sh  w3  (0)        ;    if n_hw>max_tbuf_size then
      jl.     i3.        ;    begin
      rl. w3  (r39.)     ;      n_hw:=max_tbuf_size;
      rl  w0  x2+q32     ;      extract tail fra in_mode;
      la. w0  j9.        ;    end;
      rs  w0  x2+q32     ;  end
      jl.     i3.        ;  else
i2:   rl. w3  (r39.)     ;   n_hw:=max_tbuf_size;
i3:   rs. w3  j3.        ;
      al  w3  x2         ;
      rl  w0  x3+q31     ;
      rl  w1  x3+q7+f71+4;  if sense_ready=1 and
      sn  w0  1          ;      link.operation = 0 and
      se  w1  0          ;      link.cur_op=0 then
      jl.     i4.        ;  begin             
      rl  w0  x3+q7+f74  ;    sense_ready:=0;  att:=0;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...31...

      se  w0  0          ;    return; 
      jl.     i4.        ;  end;      
      al  w0  0          ;  
      rs  w0  x3+q31     ;  
      jl      (x3+q40)   ;

i4:   al  w0  0          ;
      rs  w0  x3+q75     ;  mdescr.used:=0;
      rl  w0  x3+q32     ;
      rl. w1  j3.        ;  send_input(in_mode,n_hw,s);
      jl. w3  d10.       ;
      al  w0  0          ;  att:=0;
      sn  w1  -1         ;  if s=-1 then
      jl      (x3+q40)   ;  return;
i5:   jl. w3  d3.        ;  repeat
      sn  w2  -1         ;    wait_op(op);
      jl      (x3+q40)   ;    if op=-1 then
      rs  w2  x3+q42     ;    return;
      rl  w0  x2+10      ;
      rl  w1  x3+q31     ;
      sn  w0  0          ;
      se  w1  1          ;    if sense_ready=1 and op.hw=0 then
      jl.     i6.        ;    begin
      rs  w0  x3+q31     ;      sense_ready:=0; return;
      jl      (x3+q40)   ;    end;

i6:   ws  w0  x3+q33     ;    hw_count:=op.hw - op_used;
      rl  w1  x3+q74     ;    buf:=mdescr.buf2
      al  w2  x2+18      ;
      wa  w2  x3+q33     ;    copy(hw_count, buf, addr(op.data)+op_used,r);
c.a88<2
      rs. w0  j11.       ;  *** test no 275 **************
      rl  w0  x3+f13     ;
      so  w0  1<6        ;
      jl.     i15.       ;
      ds. w2  j12.       ;
      rl. w0  j10.       ;  type:=275, length:=10;
      al  w1  x2         ;  tail:= første 12 tegn af buffer
      rl. w2  j11.       ;  fourth:=hw_count
      jl. w3  (r49.)     ;  testout;
      dl. w2  j12.       ;
 i15: rl. w0  j11.       ;
 z.
      jl. w3  d11.       ;    
      rl  w2  x3+q42     ;
      rl  w1  x2+14      ;    ans.timestamp:=op.timestamp;
      rs  w1  x3+q8+8    ;
      rl  w1  x2+16      ;
      rs  w1  x3+q8+10   ;
      al  w1  0          ;
      rs  w1  x3+q8+6    ;    ans.left:=0;
      rs. w0  j5.        ;
      se  w0  -2         ;
      jl.     i8.        ;    if r=-2 then
      rl  w1  x3+q75     ;    begin
      sh  w1  0          ;      if mdescr.used>0 then
      jl.     i7.        ;      begin
      rs  w1  x3+q8+2    ;        ans.hw:=mdescr.used;
      ls  w1  -1         ;        ans.ch:=mdescr.used/2*3;
      wm. w1  j4.        ;      
      rs  w1  x3+q8+4    ;        op.ch:=op.ch-ans.ch;
      rl  w0  x2+12      ;
      ws  w0  2          ;        return;
      rs  w0  x2+12      ;      end      
i7:   jl      (x3+q40)   ;      else return;
                         ;    end;
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...31a...


i8:   se  w0  -3         ;    if r=-3 then
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...32...

      jl.     i12.       ;    begin
      al  w0  3          ;      result:=3;
      rs  w0  x3+q30     ;      return;
      jl      (x3+q40)   ;    end;

i12:  rl  w1  x3+q75     ;
      se  w1  0          ;    if mdescr.used=0 then
      jl.     i13.       ;      localid:=op.dats(1);
      rl  w1  x2+14      ;    /* gem localid fra data */
      rs  w1  x3+q27     ;
      rl  w1  x3+q75     ;  
i13:  wa  w1  0          ;    mdescr.used:=mdescr.used+r;
      rs  w1  x3+q75     ;
      wa  w0  x3+q33     ;    op_used:=op_used + r;
      rs  w0  x3+q33     ;
      rl  w1  x2+2       ;
      rs  w1  x3+q30     ;    result:=op.result;
      rl  w1  x2+4       ;
      rs  w1  x3+q8      ;    ans.status:=op.status;
      so. w1  (j6.)      ; 
      jl.     i14.       ;    if att i ans.status then
      rl  w1  x2+6       ;    begin
      rl  w1  x1+f21     ;      th:=op.sender_cda;
      la. w1  j7.        ;      if th kører mcl then
      se  w1  p31        ;        att:=1
      am      1          ;      else
      al  w1  0          ;        att:=0;
      rs  w1  x3+q43     ;    end;
i14:  se  w0  (x2+10)    ;    if op_used=op.hw then begin
      jl.     i9.        ;
      rl  w0  x2+12      ;
      wa  w0  x3+q41     ;      n_char:=n_char+op.ch;
      rs  w0  x3+q41     ;
      zl  w0  x2+1       ;      
      sn  w0  0          ;      if op.continue=0 then
      jl. w3  d7.        ;        decrease_buf_used(op);
      al  w1  x3+q7      ;      release_op(link);
      jl. w3  (r31.)     ;
      al  w0  0          ;      used_op:=0;
      rs  w0  x3+q33     ;    end 
      jl.     i11.       ;    else
i9:   rl. w1  j5.        ;    begin
      ls  w1  -1         ;      ch:=r/2*3;
      wm. w1  j4.        ;
      rl  w2  x3+q42     ;
      rl  w0  x2+12      ;      op.ch:=op.ch - ch;
      ws  w0  2          ;      
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...32a...

      rs  w0  x2+12      ;      n_char:=n_char + ch;
      wa  w1  x3+q41     ;    end;
      rs  w1  x3+q41     ;
i11:  jl.     i10.       ;  /* HACK HACK */
      rl  w2  x3+q42     ;  until op.continue=0 or
      zl  w0  x2+1       ;       (mdescr.buf2.first + mdescr.used
      sn  w0  0          ;           > mdescr.buf2.last );
      jl.     i10.       ;
      rl  w2  x3+q74     ;
      rl  w0  x2+10      ;
      wa  w0  x3+q75     ;
      sh  w0  (x2+12)    ;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...33...

      jl.     i5.        ;

i10:  rl  w0  x3+q75     ;  ans.hw:=mdescr.used;
      rl  w1  x3+q41     ;  ans.ch:=n_char;
      ds  w1  x3+q8+4    ;
      rl  w0  x3+q43     ;  w0:=att;
      jl      (x3+q40)   ;  return;

j0:   -p13-1             ; -state.outatt
j1:   p4                 ; state.stty
j3:   0                  ; n_hw
j4:   3                  ;
j5:   0                  ; r
j6:   1<16               ; att bit i status
j7:   15                 ; maske
j8:   (:-1:)<1           ;
j9:   2.111111001111
j10:  8<12 + 275
j11:  0
      0
j12:  0

e.




; procedure output;
;
; behandler en output message fra en bruger
;
;       call        return
; w0:               undef.
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i30, j20  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o4 +  0 ; saved return
q41 = o4 +  2 ; th
q42 = o4 +  4 ; hw_count

d15:  al  w2  x3         ;
      rl. w3  (r0.)      ;
      rs  w2  x3+q40     ;  save return i cdescr;
      rl  w0  x3+f21     ;
c.a88<6
      rs. w3  6          ;  *** test no 265 ******* 
      jl. w3  (r44.)     ;  w0 state       w2 return
      h. 265 , 1<7   w.  ;  w1             w3 curco
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...33a...

\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...34...

      0                  ;
z.
      so. w0  (j0.)      ;  if state.outatt=1 then
      jl.     i1.        ;  begin
      la. w0  j1.        ;    state.outatt:=0;
      rs  w0  x3+f21     ;    ans.status:=1<16;
      rl. w0  j2.        ;    return;
      rs  w0  x3+q8      ;  end;
      jl      (x3+q40)   ;

i1:   al  w1  0          ;
      rs  w1  x3+q75     ;  mdescr.used:=0;
      rl  w1  x3+q101    ;
      so. w0  (j3.)      ;  if state.stty=0 and
      se  w1  0          ;    f8000_ident=0 then
      jl.     i2.        ;  begin
      al  w0  2          ;    /* kopier localid fra data */
      rl  w1  x3+q74     ;    buf:=mdescr.buf2
      rl  w2  x1+8       ;    if 1<6 i buf.mode then
      so  w2  1<6        ;      linkid:=localid
      jl.     i0.        ;      /* hent localid fra sidste input */
      rl  w2  x3+q27     ;
      rs  w2  x3+q100    ;    else
      jl.     i2.        ;    begin
i0:   al  w2  x3+q100    ;      copy(2,buf,linkid,r);
      jl. w3  d11.       ;
      sn  w0  -2         ;      if r=-2 then
      jl      (x3+q40)   ;        return
      se  w0  -3         ;      else
      jl.     i2.        ;      if r=-3 then begin
      al  w0  3          ;        result:=3;
      rs  w0  x3+q30     ;        return;
      jl      (x3+q40)   ;      end;
                         ;    end;
                         ;  end;
i2:   rl  w1  x3+q3      ;  th:=pool_head;
      rl  w0  x3+f21     ;
      sz. w0  (j3.)      ;  if state.stty =0 then
      jl.     i7.        ;  begin
      rl  w0  x3+q101    ;
      sn  w0  0          ;    if f8000_ident<>0 then begin
      jl.     i3.        ;      th:=f8000_th;
      rl  w1  x3+q102    ;      if th_ident<>f8000_ident then
      sn  w0  (x1+f14)   ;      begin
      jl.     i7.        ;        f8000_ident:=0;
      al  w1  0          ;        th:=0;
      rs  w1  x3+q101    ;      end
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...34a...

      jl.     i7.        ;    end
i3:   rl  w0  x3+q100    ;    else
      ls  w0  -16        ;    begin
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...35...

      la  w0  x3+q103    ;      key:=(linkid shift -16) and f8000_mask;
i4:   sn  w1  0          ;      while th<>0 do begin
      jl.     i7.        ;
      rl  w2  x1+f21     ;      
      so. w2  (j4.)      ;        if th.state.mtty=1 then
      jl.     i5.        ;             
      rl  w2  x1+q2      ;          if th.localid=linkid then goto F;
      se  w2  (x3+q100)  ;        else   
      jl.     i6.        ;          if th.cuext=key then goto F;
      jl.     i7.        ;        th:=th.next_th;
i5:   sn  w0  (x1+q3)    ;      end; /* while */
      jl.     i7.        ;    end;  
i6:   rl  w1  x1+q6      ; F:
      jl.     i4.        ;  end;
i7:
c.a88<6
      rl  w0  x3+q100    ;
      rs. w3  6          ;  *** test no 277 ******* 
      jl. w3  (r44.)     ;  w0 linkid      w2
      h. 277 , 1<6   w.  ;  w1 th          w3 curco
      0                  ;
z.
      se  w1  0          ;  if th=0 then begin
      jl.     i8.        ;    /* th ikke fundet */
      rl. w0  j5.        ;    ans.status:= link ikke fundet
      rs  w0  x3+q8      ;    return;
      jl      (x3+q40)   ;  end;

i8:   rs  w1  x3+q41     ;  save th;
      rl  w0  x1+f21     ;
      rl  w1  x3+q74     ;  buf:=mdescr.buf2;
      rl  w2  x1+8       ;
      sz  w2  1<6        ;  if th.state.mtty=1 
      jl.     i19.       ;    and
      sz. w0  (j4.)      ;    1<6 in buf.mode then
      am      +2         ;    mdescr.used:=2
i19:  al  w0  0          ;  else
      rs  w0  x3+q75     ;    mdescr.used:=0;
      rl  w2  x1+12      ;  
      ws  w2  x1+10      ;  hw_count:=buf.last - buf.first;
      la. w2  j10.       ;  hvis ulige rund ned
      sl  w2  0          ;  if hw_count < 0 then begin
      jl.     i20.       ;    result:=3;
      al  w0  3          ;    return;
      rs  w0  x3+q30     ;  end;
      jl      (x3+q40)   ;
i20:  al  w2  x2+2       ;  hw_count := hw_count + 2 - mdescr.used;
      ws  w2  x3+q75     ;
      rs  w2  x3+q42     ;
      se  w2  0          ;  if hw_count = 0 then
      jl.     i9.        ;
      al  w0  2          ;
      rs  w0  x3+q8+2    ;    ans.hw:=2;
      al  w0  3          ;    ans.ch:=3;
      rs  w0  x3+q8+4    ;    return;
      jl      (x3+q40)   ;  end;
i9:   rl  w1  x3+q41     ;
      al  w1  x1+q7      ;  repeat
      rl  w2  x3+q42     ;    n_hw:=hw_count+6;
      al  w0  x2+6       ;
      al. w2  d1.        ;    put_op(th.link,n_hw,
      jl. w3  (r30.)     ;      op,wait);
      rs. w2  j7.        ;
      se  w2  0          ;    if op=0 then begin
      jl.     i10.       ;      /* link er fjernet */
      rl. w0  j5.        ;      ans.status:=link fjernet
      rs  w0  x3+q8      ;      return;
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...35a...

\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...36...

      jl      (x3+q40)   ;    end;
i10:  rl  w1  x3+f21     ;
      so. w1  (j0.)      ;    if state.outatt=1 then begin
      jl.     i18.       ;      /*  output stopped fra system menu */
      la. w1  j1.        ;      state.outatt:=0;
      rs  w1  x3+f21     ;  
      rl  w1  x3+q41     ;      
      al  w1  x1+q7      ;      
      rl. w2  j7.        ;      /* sæt first_free.rel tilbage */
      zl  w0  x1+f77+1   ;      link.first_free.rel:=
      ws  w0  x2-2       ;        link.first_free.rel - word(op-2);
      hs  w0  x1+f77+1   ;      /* sæt -1 sidst i buffer */
      al  w0  -1         ;      word(op-2):=-1;
      hs  w0  x2-2       ;      
      rl. w0  j2.        ;      ans.status:=1<16;
      rs  w0  x3+q8      ;      goto RT;
      jl.     i16.       ;    end;
i18:  al  w1  5          ;
      hs  w1  x2         ;    op.opcode:=5;
      rl  w1  x3+q74     ;
      zl  w1  x1+9       ;
      la. w1  j9.        ;
      hs  w1  x2+1       ;    op.mode:=mdescr.buf2.mode extract 4;
      rl  w1  x3+q74     ;
      rl  w1  x1+6       ;
      rs  w1  x2+4       ;    op.sender:=mdescr.buf2.sender;
      rl  w1  x3+q74     ;    buf:=mdescr.buf2
      al  w2  x2+6       ;
      al  w3  6          ;
      ws  w0  6          ;
      jl. w3  d11.       ;    copy(n_hw-6,buf,op+6,r);
      se  w0  -2         ;    if r=-2 then begin
      jl.     i12.       ;
      rl  w1  x3+q75     ;      if mdescr.used>0 then 
      sh  w1  0          ;      begin
      jl.     i11.       ;        ans.hw:=mdescr.used;
      rs  w1  x3+q8+2    ;        ans.ch:=mdescr.used/2*3;
      ls  w1  -1         ;
      wm. w1  j6.        ;      end;
      rs  w1  x3+q8+4    ;      goto R;
      jl.     i11.       ;    end;
i12:  se  w0  -3         ;    if r=-3 then
      jl.     i13.       ;    begin
      al  w1  3          ;      result:=3;
      rs  w1  x3+q30     ;      
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...37...

i11:  rl  w1  x3+q41     ;      
      al  w1  x1+q7      ;      
      rl. w2  j7.        ;      /* sæt first_free.rel tilbage */
      zl  w0  x1+f77+1   ;      link.first_free.rel:=
      ws  w0  x2-2       ;        link.first_free.rel - word(op-2);
      hs  w0  x1+f77+1   ;      /* sæt -1 sidst i buffer */
      al  w0  -1         ;      word(op-2):=-1;
      hs  w0  x2-2       ;      return;
      jl      (x3+q40)   ;    end;

i13:  rl. w1  j7.        ;
c.a88<2
      rs. w0  j12.       ;  *** test no 278 **************
      rl  w0  x3+f13     ;
      so  w0  1<6        ;
      jl.     i22.       ;
      rl. w0  j11.       ;  type:=278, length:=10;
      al  w1  x1+6       ;  tail:= første 12 tegn af buffer
      rl. w2  j12.       ;  fourth:=hw_count
      jl. w3  (r49.)     ;  testout;
      rl. w1  j7.        ;
      rl. w3  (r0.)      ;
i22:  rl. w0  j12.       ;
z.
      rs  w0  x1+2       ;    op.hw:=r;
      rl  w1  x3+q42     ;
      ws  w1  0          ;
      rs  w1  x3+q42     ;    hw_count:=hw_count - r;
      wa  w0  x3+q75     ;
      rs  w0  x3+q75     ;    mdescr.used:=mdescr.used + r;

      rl  w1  x3+q41     ;
      rl  w0  x1+f21     ;
      so. w0  (j8.)      ;    if th.state.f8000=1 then
      jl.     i15.       ;    begin
      rl. w2  j7.        ;
      rl  w0  x3+q101    ;
      se  w0  0          ;      if f8000_ident=0 then
      jl.     i17.       ;      begin
      rs  w1  x3+q102    ;        f8000_th:=th;
      rl  w0  x1+f14     ;        f8000_ident:_th.ident;
      rs  w0  x3+q101    ;        /* fjern cu extention bit */
      rl  w1  x1+q3      ;        op.dada(0):=op.data(0) and
      ls  w1  16         ;          not( th.cuext shift 16 );
      ac  w1  x1         ;
      al  w1  x1-1       ;
      la  w1  x2+6       ;
      rs  w1  x2+6       ;      end;
i17:  wa  w2  x2+2       ;
      rl  w2  x2+4       ;      w2:=sidste ord i data
i14:  sn  w2  0          ;
      jl.     i15.       ;      while w2<>0 do begin
      al  w1  0          ;        w1w2:=w2 shift 8;
      ld  w2  8          ;        if w1=ext then begin
      se  w1  3          ;          f8000_ident:=0;  goto S;
      jl.     i14.       ;        end;
      al  w0  0          ;      end;
      rs  w0  x3+q101    ; S: end;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...38...


i15:  rl  w2  x3+q41     ;
      al  w2  x2+q7+f71  ;
      jl. w3  (r13.)     ;    signal(th.link.operation);
      rl  w2  x3+q74     ;    buf:=mdescr.buf2;
      rl  w1  x2+10      ;
      wa  w1  x3+q75     ;  until buf.first+mdescr.used > buf.last;
      sh  w1  (x2+12)    ;
      jl.     i9.        ;

      rl  w0  x3+f21     ;
      so. w0  (j0.)      ;  if state.outatt=1 then begin
      jl.     i16.       ;
      la. w0  j1.        ;    state.outatt:=0;
      rs  w0  x3+f21     ;    ans.status:=1<16;
      rl. w0  j2.        ;  end;
      rs  w0  x3+q8      ;

i16:  rl  w1  x3+q75     ; RT:  n:=mdescr.used;
      rs  w1  x3+q8+2    ;  ans.hw:=n;
      ls  w1  -1         ;
      wm. w1  j6.        ;
      rs  w1  x3+q8+4    ;  ans.ch:=n/2*3;

      jl      (x3+q40)   ;  return;

j0:   p13             ; state.outatt
j1:   -p13-1          ; -state.outatt
j2:   1<16            ; att
j3:   p4              ; state.stty
j4:   p5              ; state.mtty
j5:   p47             ;
j6:   3               ;
j7:   0               ; op
j8:   p6              ; state.f8000
j9:   2.1111          ;
j10:  (:-1:)<1        ;
j11:  10<12 + 278     ;
j12:  0               ;

e.




; procedure start_input(localid);
;
;           localid  (call)  localid for link der skal sendes til
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...39...

;
; behandler en start input message fra bruger ved at sende et antal
; input operationer til et givet link
; 
;       call        return
; w0:   localid     undef.
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i5,j6  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o4 +  0 ; saved return
q41 = o4 +  2 ; bufs
q42 = o4 +  4 ; mode + 3<12
q43 = o4 +  6 ; th

d16:  rl. w2  (r0.)      ;
c.a88<6
      rs. w3  6          ;  *** test no 266 ******* 
      jl. w3  (r44.)     ;  w0 localid     w2 curco 
      h. 266 , 1<6   w.  ;  w1             w3 return
      0                  ;
z.
      rs  w3  x2+q40     ;  save return i cdescr;
      jl. w3  d8.        ;  search_link(localid,th);
      se  w1  0          ;  if th=0 then begin
      jl.     i1.        ;    ans.status:=findes ikke
      rl. w0  j0.        ;    return;
      rs  w0  x3+q8      ;  end;
      jl      (x3+q40)   ;  

i1:   rs  w1  x3+q43     ;  
      al  w2  x1+q7      ;  b:=th.link.free_seg.value * 80;
      rl  w1  x2+f73+4   ;
      wm. w1  j1.        ;
      rs. w1  j2.        ;
      rl  w2  x3+q74     ;  buf:=mdescr.buf2;
      zl  w0  x2+14      ;  bufs:=buf.bufs;
      sl. w0  (j2.)      ;  if buf>b then bufs:=b;
      rl. w0  j2.        ;
      zl  w1  x2+9       ;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...40...

      wa. w1  j3.        ;  
      wa  w1  x3+q15     ;
      ds  w1  x3+q42     ;  mode:=buf.mode + 3<12 + ex_mode;

      rl  w2  x3+q43     ;
      rl  w0  x2+f21     ;
      sz. w0  (j5.)      ;  if th.state.stty=1 then
      jl      (x3+q40)   ;  return;
      so. w0  (j6.)      ;  if state.mtty=1 then
      jl.     i2.        ;  begin
      rl  w0  x2+q0      ;
      sn  w0  0          ;    if th.used_buf<>0 then
      am      +1         ;      bufs:=1
      al  w0  0          ;    else bufs:=0;
      rs  w0  x3+q41     ;  end;

i2:   rl  w1  x3+q41     ;
      sh  w1  0          ;  while bufs>0 do
      jl      (x3+q40)   ;  begin
      al  w1  x1-1       ;    bufs:=bufs-1;
      rs  w1  x3+q41     ;
      al  w0  4          ;
      rl  w1  x3+q43     ;
      al  w1  x1+q7      ;
      al. w2  d1.        ;    put_op(th.link,
      jl. w3  (r30.)     ;       4,op,wait);
      se  w2  0          ;    if op=0 then
      jl.     i3.        ;    begin
      rl. w0  j0.        ;      ans.status:=link findes ikke;
      rs  w0  x3+q8      ;      return;
      jl      (x3+q40)   ;    end;
i3:   rl  w0  x3+q42     ;
      rl. w1  (r39.)     ;    op.opcode:=3 + ex_mode;  op.mode:=mode;
      ds  w1  x2+2       ;    op.hw:=max_tbuf_size;
      rl  w1  x3+q43     ;
      rl  w2  x1+q0      ;    th.used_buf:=
      al  w2  x2+1       ;      th.used_buf + 1;
      rs  w2  x1+q0      ;
      al  w2  x1+q7+f71  ;    signal(th.link.operation);
      jl. w3  (r13.)     ;  end;
      jl.     i2.        ;  return;

j0:   p47                ;
j1:   80                 ;
j2:   0                  ; b
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...41...

j3:   3<12               ;
j5:   p4                 ; state.stty
j6:   p5                 ; state.mtty

e.


; procedure adjust_pool;
;
; justerer antal spool segmenter i en pool handlers modtager link kø
;
;       call        undef.
; w0:               undef. 
; w1:               undef. 
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

d17:  rs. w3  j0.        ;  save return;
c.a88<6
      rs. w3  6          ;  *** test no 267 ******* 
      jl. w3  (r44.)     ;  w0             w2       
      h. 267 , 1<6   w.  ;  w1             w3 return
      0                  ;
z.
      rl. w3  (r0.)      ;
      rl  w2  x3+q74     ;  buf:=mdescr.buf2;
      rl  w0  x2+10      ;  nseg:=buf.segments;
      al  w1  x3+q7      ;
      jl. w3  (r32.)     ;  adjust_link(link,nseg,r);
      rl. w1  j1.        ;  if r<>0 then
      se  w0  0          ;    ans.status:=ikke muligt
      rs  w1  x3+q8      ;
      jl.     (j0.)      ;  return

j0:   0                  ; saved return
j1:   p51                ;

e.


; procedure adjust_th_link(localid);
;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...42...

;           localid  (call)  localid for link der skal justeres
;
; justerer antal spool segmenter i et link der er givet ved 
; localid
;
;       call        return
; w0:   localid     undef.
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

d18:  rs. w3  j0.        ;  save return;
c.a88<6
      rs. w3  6          ;  *** test no 268 ******* 
      jl. w3  (r44.)     ;  w0             w2       
      h. 268 , 1<6   w.  ;  w1             w3 return
      0                  ;
z.
      rl. w3  (r0.)      ;
      jl. w3  d8.        ;  search_link(localid,th);
      se  w0  0          ;  if th=0 then
      jl.     i1.        ;  begin
      rl. w0  j1.        ;    ans.status:=findes ikke
      rs  w0  x3+q8      ;    return;
      jl.     (j0.)      ;  end; 
i1:   rs. w1  j2.        ;
      rl  w1  x1+q7+f73+4;
      wm. w1  j3.        ;  b:=th.link.free_seg.value*80;
      rs. w1  j4.        ;
      rl. w2  j2.        ;  if th.max_buf > b then
      sh  w1  (x2+q1)    ;    th.max_buf:=b;
      rs  w1  x2+q1      ;
      rl  w1  x3+q74     ;  buf:=mdescr.buf2;
      rl  w0  x1+12      ;  nseg:=buf.segments;
      al  w1  x2+q7      ;
      jl. w3  (r32.)     ;  adjust_link(th.link,nseg,r);
      rl. w1  j5.        ;
      se  w0  0          ;  if r<>0 then
      rs  w1  x3+q8      ;   ans.status:=ikke muligt
      jl.     (j0.)      ;  return;

j0:   0                  ; saved return
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...43...

j1:   p47                ;
j2:   0                  ; th
j3:   80                 ;
j4:   0                  ; b
j5:   p51                ;

e.


; extern variable,  indeholder adresser på variable og routiner
r49: h.   m0  , 1    w.  ; e0   testout
r50: h.  m24  , 1    w.  ; c0   corco
r51: h. m176  , 1    w.  ; e1   register testout
r52: h.   m7  , 1    w.  ; e16  csendmessage
r53: h.   m8  , 0    w.  ; e18  cwaitanswer
                         ; end init list


; procedure send_ctrl(localid,type);
;
;           localid  (call)  bestemmer modtager th coroutinen
;           type     (call)  =1 er localid cu
;                            =0 er localid det fra create link 
;
; sender indhold af message fra bruger til terminal handler coroutine
; i en operation, th er bestemt af localid
;
;       call        return
; w0:   localid     undef.
; w1:   type        undef.
; w2:               undef.
; w3:   return      curco

b. i10,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o4 + 0 ; saved return
q41 = o4 + 2 ; th

d19:  rl. w2  (r0.)      ;
c.a88<6
      rs. w3  6          ;  *** test no 269 ******* 
      jl. w3  (r44.)     ;  w0 localid     w2 curco 
      h. 269 , 1<6   w.  ;  w1 type        w3 return
      0                  ;
z.
      rs  w3  x2+q40     ;  save return i cdescr;
      se  w1  1          ;
      jl.     i6.        ;  if type = f8000 then 
      ls  w0  -8         ;  begin
      al  w3  x2         ;
      la  w0  x3+q103    ;    key:=(localid shift -8) and f8000_mask;
      rl  w1  x3+q3      ;    th:=pool_head;
i5:   sn  w1  0          ;    while th<>0 do
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...43a...

      jl.     i7.        ;      if th.state.f8000=1 then
      rl  w2  x1+f21     ;        if th.cuext=key then
      so. w2  (j3.)      ;        goto F;
      jl.     i3.        ;      th:=th.next_th;
      sn  w0  (x1+q3)    ;    end
      jl.     i7.        ;  end
i3:   rl  w1  x1+q6      ;
      jl.     i5.        ;  else
i6:   jl. w3  d8.        ;  search_link(localid,th);
i7:   se  w1  0          ; F:  if th=0 then
      jl.     i2.        ;  begin
i1:   rl. w0  j0.        ; E: ans.status:=findes ikke 
      rs  w0  x3+q8      ;    return;
      jl      (x3+q40)   ;  end;
i2:   rs  w1  x3+q41     ;
      rl  w0  x1+q0      ;  if th.used_buf > 0 then begin
;ks -700
      sn  w0  0          ;  begin
      jl.     i4.        ;
      rl  w1  x3+q74     ;    from:=mdescr.buf2+8;
      al  w1  x1+8       ;
      al. w2  j4.        ;    to:=message area;
      al  w0  16         ;
      jl. w3  (r21.)     ;    move(from,to,16);
;rl. w1 j4.
;ks -701
      rl  w1  x3+q41     ;
      al  w2  x1+q65     ;    name addr:=th.tdescr.name;
      al. w1  j4.        ;    message addr:=addr message area;
      jl. w3  (r52.)     ;    csendmessage(mes,name,buf);
;ks -702
      sl  w2  2          ;    if buf<2 then begin
      jl.     i8.        ;      result:=4;
      al  w0  4          ;      return;
      jl.     i9.        ;    end;
i8:   al  w0  0          ;
      al  w1  x3+q8      ;    w1:=addr answer area;
      jl. w3  (r53.)     ;    cwaitanswer(buf,0,result);
i9:   rs  w0  x3+q30     ;    return;
;ks -703
      jl      (x3+q40)   ;  end;

\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...44...

i4:   al  w0  18         ;
      al  w1  x1+q7      ;  /* send mes til th i operatio via link */
      al. w2  d1.        ;  put_op(th.link,18,
      jl. w3  (r30.)     ;     op,wait);
      sn  w2  0          ;  if op=0 then
      jl.     i1.        ;  goto E;
      rs. w2  j1.        ;
      rl  w1  x3+q74     ;  from:=mdescr.buf2+8;
      al  w1  x1+8       ;
      al  w2  x2+2       ;  to:=op+2;
      al  w0  16         ;
      jl. w3  (r21.)     ;  move(from,to,16);
      rl. w2  j1.        ;
      rl. w0  j2.        ;
      rs  w0  x2         ;  op.opcode,mode := 20<12+0;
      rl  w1  x3+q41     ;
      rs  w3  x1+q7+f75  ;  th.link.ident:=ph;
      al  w2  x1+q7+f71  ;
      jl. w3  (r13.)     ;  signal(th.link.operation);

      al  w0  3          ;  /* vent på svar fra th i letter */
      jl. w3  d1.        ;  wait(3,let);
      rl  w0  x1+10      ;  /* result i letter, answer sætter th i ph.ans */
      rs  w0  x3+q30     ;  result:=let.result;
      jl      (x3+q40)   ;  return;

j0:   p47                ;  1<7 link findes ikke
j1:   0                  ;  op
j2:   20<12+0            ;
j3:   p6                 ;  state.f8000
j4:   0,r.8              ;  ctrl message

e.


; procedure cont_mcl(localid);
;
;           localid  (call)  bestemmer modtager th
;
; sender indholdet af en continue mcl message fra bruger videre til
; en th coroutine
;
;       call        return
; w0:   localid     undef.
; w1:               undef.
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...45...

; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o4 +  0 ; saved return
q41 = o4 +  2 ; th

d20:  rl. w2  (r0.)      ;  
c.a88<6
      rs. w3  6          ;  *** test no 270 ******* 
      jl. w3  (r44.)     ;  w0 localid     w2 curco 
      h. 270 , 1<6   w.  ;  w1             w3 return
      0                  ;
z.
      rs  w3  x2+q40     ;  save return i cdescr;
      jl. w3  d8.        ;  search_link(localid,th);
      se  w1  0          ;  if th=0 then
      jl.     i2.        ;  begin
i1:   rl. w0  j0.        ; E: ans.status:=findes ikke
      rs  w0  x3+q8      ;    return;
      jl      (x3+q40)   ;  end;
i2:   rs  w1  x3+q41     ;
      rl  w1  x3+q74     ;  buf:=mdescr.buf2;
      zl  w0  x1+13      ;  if ch i message > 15 then
      sh  w0  15         ;    result:=3;
      jl.     i3.        ;    return;
      al  w0  3          ;  end;
      rs  w0  x3+q30     ;
      jl      (x3+q40)   ;
i3:   rl  w1  x3+q41     ;
      al  w0  20         ;
      al  w1  x1+q7      ;
      al. w2  d1.        ;  put_op(th.link,20,
      jl. w3  (r30.)     ;    op,wait);
      sn  w2  0          ;  if op=0 then
      jl.     i1.        ;  goto E;
      rs. w2  j1.        ;
      rl. w0  j2.        ;  
      rs  w0  x2         ;  op.opcode:=21<12+0;
      rl  w1  x3+q74     ;
      al  w1  x1+12      ;  from:=mdescr.buf2 + 12;
      al  w2  x2+2       ;  
      al  w0  16         ;
      jl. w3  (r21.)     ;  move(from,op+2,16);
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...45a...

      al  w1  x2+10      ;
i4:   rl  w0  x2         ;  for alle tegn i teksten do
      la. w0  j3.        ;    if tegnværsi>128 then
      rs  w0  x2         ;      tegnværdi:=tegnværdi-128;
      al  w2  x2+2       ;
      se  w2  x1         ;
      jl.     i4.        ;
      rl  w1  x3+q41     ;
      al  w2  x1+q7+f71  ;
      jl. w3  (r13.)     ;  signal(th.link.operation);
      jl      (x3+q40)   ;  return;

\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...46...

j0:   p47                ;
j1:   0                  ; op
j2:   21<12+0            ;
j3:   127<16+127<8+127   ; maske

e.


; procedure terminal_data(localid);
;
;           localid  (call)  bestemmer terminalen
;
; kopiere data for en terminal type beskrivelse til en brugers buffer,
; terminalen er givet ved localid
;
;       call        return
; w0:   localid     undef.
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

d21:  rs. w3  j0.        ;  save return;
c.a88<6
      rs. w3  6          ;  *** test no 271 ******* 
      jl. w3  (r44.)     ;  w0 localid     w2       
      h. 271 , 1<6   w.  ;  w1             w3 return
      0                  ;
z.
      am      -1000      ;
      jl. w3  d8.+1000   ;  search_link(localid,th);
      se  w1  0          ;  if th=0 then
      jl.     i1.        ;  begin
      rl. w0  j1.        ;    ans.status:=findes ikke
      rs  w0  x3+q8      ;    return;
      jl.     (j0.)      ;  end;
i1:   rs. w1  j2.        ;
      al  w0  0          ;
      rs  w0  x3+q75     ;  mdescr.used:=0;
      al  w0  f120       ;
      rl  w1  x1+q62     ;  from:=th.tdescr.ttda+4;
      rl  w2  x1+f110    ;
      al  w2  x2+f123    ;
      rl  w1  x3+q74     ;  buf:=mdescr.buf2
      am      -1000      ;
      jl. w3  d11.+1000  ;  copy(size,buf,from,r);
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...47...

      sn  w0  -2         ;  if r=-2 then
      jl.     (j0.)      ;    return
      se  w0  -3         ;  if r:=-3 then
      jl.     i2.        ;  begin
      al  w0  3          ;    result:=3;
      rs  w0  x3+q30     ;    return;
      jl.     (j0.)      ;  end;

i2:   rs  w0  x3+q8+2    ;  ans.hw:=r;
      ls  w0  -1         ;
      wm. w0  j3.        ;
      rl. w3  (r0.)      ;
      rs  w0  x3+q8+4    ;  ans.ch:=r/2*3;
      jl.     (j0.)      ;  return;

j0:   0                  ; return;
j1:   p47                ;
j2:   0                  ; th
j3:   3                  ;

e.



; procedure getid(localid);
;
;           localid  (call)  bestemmer terminalen
;
; kopierer en userid der hører til en terminal til en bruger buffer.
; terminalen er givet ved en localid
;
;       call        return
; w0:   localid     undef.
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

d22:  rs. w3  j0.        ;  save return;
c.a88<6
      rs. w3  6          ;  *** test no 272 ******* 
      jl. w3  (r44.)     ;  w0 localid     w2       
      h. 272 , 1<6   w.  ;  w1             w3 return
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...48...

      0                  ;
z.
      am      -1000      ;
      jl. w3  d8.+1000   ;  search_link(localid,th);
      se  w1  0          ;  if th=0 then
      jl.     i1.        ;  begin
      rl. w0  j1.        ;    ans.status:=findes ikke
      rs  w0  x3+q8      ;    return;
      jl.     (j0.)      ;  end;

i1:   rs. w1  j2.        ;
      al  w0  0          ;
      rs  w0  x3+q75     ;  mdescr.used:=0;
      al  w0  12         ;
      rl  w1  x1+q62     ;
      al  w2  x1+f104    ;  from:=th.tdescr.userid;
      rl  w1  x3+q74     ;  buf:=mdescr.buf2
      am      -1000      ;
      jl. w3  d11.+1000  ;  copy(12,buf,from,r);
      sn  w0  -2         ;  if r=-2 then
      jl.     (j0.)      ;    return
      se  w0  -3         ;  if r=-3 then
      jl.     i2.        ;  begin
      al  w0  3          ;    result:=3;
      rs  w0  x3+q30     ;    return;
      jl.     (j0.)      ;  end;

i2:   rs  w0  x3+q8+2    ;  ans.hw:=r;
      ls  w0  -1         ;
      wm. w0  j3.        ;
      rl. w3  (r0.)      ;
      rs  w0  x3+q8+4    ;  ans.ch:=r:2*3;

      jl.     (j0.)      ;  return;

j0:   0                  ; saved return
j1:   p47                ;
j2:   0                  ; th
j3:   3                  ;

e.


; procedure reserve_term(localid);
;
;           localid  (call)  bestemmer terminalen
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...49...

;
; sætter status for en terminal sådan at operatør kommandoer enten
; ikke kan skrives eller kan. Terminalen er bestem af localid
;
;       call        return
; w0:   localid     undef.
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

d23:  rs. w3  j0.        ;  save return;
c.a88<6
      rs. w3  6          ;  *** test no 273 ******* 
      jl. w3  (r44.)     ;  w0 localid     w2       
      h. 273 , 1<6   w.  ;  w1             w3 return
      0                  ;
z.
      am      -1000      ;
      jl. w3  d8.+1000   ;  search_link(localid,th);
      se  w1  0          ;  if th=0 then
      jl.     i1.        ;  begin
      rl. w0  j1.        ;    ans.status:=findes ikke
      rs  w0  x3+q8      ;    return;
      jl.     (j0.)      ;  end;

i1:   rl  w2  x3+q74     ;
      zl  w2  x2+9       ;  mode:=mdescr.buf.mode;
      rl  w0  x1+f21     ;  if mode=1 then
      se  w2  0          ;    th.state.reserve_term:=1
      lo. w2  j2.        ;  else
      sn  w2  0          ;  if mode=0 then
      la. w2  j3.        ;    th.state.reserve_term:=0;
      rs  w2  x1+f21     ;
      jl.     (j0.)      ;  return;

j0:   0                  ; return
j1:   p47                ;
j2:   p17                ; state.reserve_term
j3:   -p17-1             ; -state.reserve_term

e.


\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...50...

; procedure sim_input;
;
; behandler en sim_input message fra en bruger
;
;       call        return
; w0:               undef.
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i20, j10  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o2 +  0 ; saved return
q41 = o2 +  2 ; th

d24:  al  w2  x3         ;
      rl. w3  (r0.)      ;
      rs  w2  x3+q40     ;  save return i cdescr;
      rl  w0  x3+f21     ;
      al  w1  1          ;  ctrl_result:=1;
      rs  w1  x3+q64     ;
      al  w1  0          ;
      rs  w1  x3+q78     ;  ctrl_ans.status:=0;
      rs  w1  x3+q75     ;  mdescr.used:=0;
      sz. w0  (j0.)      ;  if state.mtty=0 then
      jl.     i1.        ;  begin
i0:   al  w0  3          ; R3:ctrl_result:=3;
      rs  w0  x3+q64     ;    return;
      jl      (x3+q40)   ;  end;
i1:   al  w0  2          ;  /* kopier localid fra data */
      rl  w1  x3+q72     ;  buf:=mdescr.buf1;
      al  w2  x3+q100    ;  copy(2,buf,linkid,r);
      am      -1000      ;
      jl. w3  d11.+1000  ; 
      sn  w0  -2         ;  if r=-2 then 
      jl      (x3+q40)   ;    return
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...51...

      sn  w0  -3         ;  else
      jl.     i0.        ;  if r=-3 then goto R3;
i2:   rl  w0  x3+q100    ;
      am      -1000      ;
      jl. w3  d8.+1000   ;  search_link(linkid,th);
c.a88<6
      rl  w0  x3+q100    ;
      rs. w3  6          ;  *** test no 274 ******* 
      jl. w3  (r44.)     ;  w0 linkid      w2
      h. 274 , 1<6   w.  ;  w1 th          w3 curco
      0                  ;
z.
      se  w1  0          ;  if th=0 then begin
      jl.     i3.        ;    /* th ikke fundet */
      rl. w0  j1.        ;    ctrl_ans.status:= link ikke fundet
      rs  w0  x3+q78     ;    return;
      jl      (x3+q40)   ;  end;

i3:   rs  w1  x3+q41     ;  save th;
      al  w0  p39        ;
      la  w0  x1+f21     ;  if th.state.type<>th oprettet fra ph then
      se  w0  p31        ;  goto R3;
      jl.     i0.        ;
      rl  w1  x3+q72     ;  buf:=mdescr.buf1;
      rl  w2  x1+12      ;
      ws  w2  x1+10      ;  hw_count:=buf.last - buf.first + 2;
      al  w2  x2+2       ;
      al  w0  x2+4       ;  n_hw:=hw_count+4;
      rl  w1  x3+q41     ;
      al  w1  x1+q7      ;
      rl. w2  r12.       ;  put_op(th.link,n_hw,
      jl. w3  (r30.)     ;      op,wait_semaphor);
      rs. w2  j3.        ;
      se  w2  0          ;  if op=0 then begin
      jl.     i4.        ;    /* link er fjernet */
      rl. w0  j1.        ;    ctrl_ans.status:=link findes ikke
      rs  w0  x3+q78     ;    return;
      jl      (x3+q40)   ;  end;
i4:   al  w1  9          ;
      hs  w1  x2         ;  op.opcode:=9;
      rl  w1  x3+q72     ;
      zl  w1  x1+9       ;
      hs  w1  x2+1       ;  op.mode:=mdescr.buf1.mode;
      al  w2  x2+4       ;
      al  w3  4          ;
      ws  w0  6          ;
      rl. w3  (r0.)      ;
      rl  w1  x3+q72     ;  buf:=mdescr.buf1;
      am      -1000      ;
      jl. w3  d11.+1000  ;  copy(n_hw-4,buf,op+4,r);
      sn  w0  -2         ;  if r=-2 then begin
      jl.     i6.        ;    goto r;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...52...

      se  w0  -3         ;  if r=-3 then
      jl.     i7.        ;  begin
      al  w1  3          ;    result:=3;
      rs  w1  x3+q64     ;    
i6:   rl  w1  x3+q41     ; r: 
      al  w1  x1+q7      ;    
      rl. w2  j3.        ;    /* sæt first_free.rel tilbage */
      zl  w0  x1+f77+1   ;    link.first_free.rel:=
      ws  w0  x2-2       ;      link.first_free.rel - word(op-2);
      hs  w0  x1+f77+1   ;    /* sæt -1 sidst i buffer */
      al  w0  -1         ;    word(op-2):=-1;
      hs  w0  x2-2       ;    return;
      jl      (x3+q40)   ;  end;
i7:   rl. w1  j3.        ;
c.a88<2
      rs. w0  j8.        ;  *** test no 279 **************
      rl  w0  x3+f13     ;
      so  w0  1<6        ;
      jl.     i8.        ;
      rl. w0  j7.        ;  type:=279, length:=10;
      al  w1  x1+6       ;  tail:= første 12 tegn af buffer
      rl. w2  j8.        ;  fourth:=hw_count
      jl. w3  (r49.)     ;  testout;
      rl. w1  j3.        ;
      rl. w3  (r0.)      ;
i8:   rl. w0  j8.        ;
z.
      rs  w0  x1+2       ;  op.hw:=r;
      rs  w0  x3+q75     ;  mdescr.used:=r;
      rl  w2  x3+q41     ;
      rl  w1  x2+f21     ;
      lo. w1  j2.        ;  th.state.sim_input:=1;
      rs  w1  x2+f21     ;
      rl  w1  x2+q0      ;
      al  w1  x1+1       ;  th.used_buf:=th.used_buf+1;
      rs  w1  x2+q0      ;
      al  w2  x2+q7+f71  ;
      jl. w3  (r13.)     ;  signal(th.link.operation);
      rl  w1  x3+q75     ;  n:=mdescr.used;
      rs  w1  x3+q78+2   ;  ctrl_ans.hw:=n;
      ls  w1  -1         ;
      wm. w1  j6.        ;
      rs  w1  x3+q78+4   ;  ctrl_ans.ch:=n/2*3;
      jl      (x3+q40)   ;  return;

j0:   p5                 ; state.mtty
j1:   p47                ; link findes ikke
j2:   p22                ; th.state.sim_input
j3:   0                  ; op
j6:   3                  ; konstanten 
j7:   10<12 + 279
j8:   0

e.


; procedure send_rem_message;
;
; sender dummy message til process der har oprettet en pool, når
; message besvares bliver poolen nedlagt
;
;       call        return
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...52a...

; w0:               undef.
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...53...

; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

d0:   rs. w3  j0.        ;  save return;
      rl. w3  (r0.)      ;
      rl. w0  j1.        ;  eda.proc:=1 shift 12 + 7;
      al  w1  x3+f22     ;  eda.mbx:=addr main_mbx;
      ds  w1  x3+q80+2   ;
      al  w0  1<6        ;
      rs  w0  x3+q80+8   ;  eda.type:=1 shift 6;
      al  w0  2          ;  
      rs  w0  x3+q80+12  ;  eda.opcode:=2;
      rl. w0  (r45.)     ;  w0:=pda for ps processen tem
      al. w1  j2.        ;  w1:=message addr for message med opcode = -2;
      al  w2  x3+q80     ;  w2:=message flag=eda;
      al  w3  x3+q20     ;  w3:=addr owner_name;
c.a88<6
      rs. w3  6          ;  *** test no 250 ******* 
      jl. w3  (r44.)     ;  w0 pda         w2 eda   
      h. 250 , 1<6   w.  ;  w1 mess addr   w3 owner name addr
      0                  ;
z.
      jd      1<11+124   ;  sendpseudomessage(ph.pool,mes,eda,owner,buf);
      sh  w2  0          ;
      je      -12        ;  if buf<1 then fault;
      rl. w3  (r0.)      ;
      rs  w2  x3+q28     ;  rem_buf:=buf;
      jl.     (j0.)      ;  return;

j0:   0                  ; return;
j1:   1<12 + 7           ;
j2:   (:-2:)<12 + 0      ; opcode i remove message

e.


; pool handler coroutine code


b. i20,  j10             ;
w.
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...54...


d25:
u33:  rl. w3  (r0.)      ;  start ph coroutine:
      al  w0  -1         ;
      rs  w0  x3+q32     ;  in_mode:=-1;
      al  w0  0          ;
      rs  w0  x3+q15     ;  ex_mode := 0;
      al  w2  x3+q14     ;
      jl. w3  (r42.)     ;  init_semaphor(a_sem,0);
      rl. w3  (r0.)      ;
      al  w0  p39        ;
      la  w0  x3+f21     ;
      sn  w0  p35        ;  if state.type=ph efter create_pool then
      jl. w3  d0.        ;    send_rem_message;

i1:   al  w0  1          ; Next_mess;
      am      -1000      ;
      jl. w3  d1.+1000   ;  wait(1,let);
      am      -1000      ;
      jl. w3  d12.+1000  ;  set_null_answer;
      rl  w2  x3+q74     ;  buf:=mdescr.buf2;
      zl  w0  x2+8       ;  opcode:=buf.opcode;
      zl  w1  x2+9       ;  w1:=buf.mode
c.a88<6
      rs. w3  6          ;  *** test no 280 ******* 
      jl. w3  (r44.)     ;  w0 opcode      w2 buf   
      h. 280 , 1<7   w.  ;  w1 mode        w3 curco
      0                  ;
z.

; sense ready

      se  w0  0          ;  if opcode=0 then
      jl.     i2.        ;  begin
      zl  w0  x2+9       ;    if buf.mode<>0 then
      se  w0  0          ;      sense_ready;
      jl.     4          ;
      jl.     6          ;    /* SUPER HACK HACK  */
      am      -1000      ;
      jl. w3  d13.+1000  ;    goto SA
      rl  w1  x3+q7+f71+4;    /* sæt antal operationer i kø i answer */
      rs  w1  x3+q8+6    ;    ans.left:=ph.linl.operation.value;
      al  w0  x3         ;    /* sæt ph,th i answer, bruges i test */
      rl  w1  x3+q3      ;
      ds  w1  x3+q8+10   ;
      jl.     i14.       ;  end;

; f8000 device control

i2:   se  w0  2          ;  if opcode=2 then
      jl.     i3.        ;  begin
      rl  w0  x2+16      ;    localid:=buf.localid;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...55...

      al  w1  1          ;
      jl. w3  d19.       ;    send_ctrl(localid,f8000);
      jl.     i14.       ;    goto SA;
                         ;  end;

; input

i3:   se  w0  3          ;  if opcode=3 then
      jl.     i4.        ;  begin
      jl. w3  d14.       ;    input(att);
      rl  w1  x3+q7+f71+4;    /* sæt antal operationer i kø i answer */
      rs  w1  x3+q8+6    ;    ans.left:=ph.linl.operation.value;
                         ;    goto SA;
      jl.     i17.       ;  end;

; format 8000 device control

i4:   se  w0  4          ;  if opcode=4 then
      jl.     i5.        ;  begin
      rl  w0  x2+22      ;    localid:=buf.localid;
      al  w1  1          ;
      jl. w3  d19.       ;    send_ctrl(localid,f8000);
      jl.     i14.       ;    goto SA;
                         ;  end;

; output

i5:   se  w0  5          ;  if opcode=5 then
      jl.     i6.        ;  begin
      jl. w3  d15.       ;    output;  goto SA;
      rl  w1  x3+q30     ;    att:=0;
      se  w1  1          ;    if result<>1 then
      jl.     i14.       ;     goto SA;
      rl  w0  x3+q8      ;    if att i ans.status then
      sz. w0  (j0.)      ;      att:=1
      am      1          ;    else att:=0;
      al  w0  0          ;  
      jl.     i17.       ;  end;


; start input

i6:   se  w0  110        ;  if opcode=110 then
      jl.     i7.        ;  begin
      rl  w0  x2+10      ;    start_input(buf.localid);
      jl. w3  d16.       ;    goto SA;
      jl.     i14.       ;  end;

; adjust pool

i7:   se  w0  112        ;  if opcode=112 then
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...55a...

      jl.     i8.        ;  begin
      jl. w3  d17.       ;    adjust_pool;  goto SA;
      jl.     i14.       ;  end;

; adjust_th_link

\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...56...

i8:   se  w0  114        ;  if opcode=114 then
      jl.     i9.        ;  begin
      rl  w0  x2+10      ;    adjust_th_link(buf.localid);
      jl. w3  d18.       ;    goto SA;
      jl.     i14.       ;  end;

; continue mcl

i9:   se  w0  128        ;  if opcode=128 then
      jl.     i10.       ;  begin
      rl  w0  x2+10      ;    continue_mcl(buf.localid);
      jl. w3  d20.       ;    goto SA;
      jl.     i14.       ;  end;

; reserve terminal

i10:  se  w0  130        ;  if opcode=130 then
      jl.     i16.       ;  begin
      rl  w0  x2+10      ;    reserve_terminal(buf.localid);
      jl. w3  d23.       ;    goto SA;
      jl.     i14.       ;  end;

; getid

i16:  se  w0  131        ;  if opcode=131 then
      jl.     i11.       ;  begin
      rl  w0  x2+14      ;    getid(buf.localid);
      jl. w3  d22.       ;    goto SA;
      jl.     i14.       ;  end;

; set terminal spec

i11:  se  w0  132        ;  if opcode=132 then
      jl.     i12.       ;  begin
;     rl  w0  x2+22      ;    /* hvis ikke 1<15 i linespec then result 3 */
;     so. w0  (j1.)      ;
;     jl.     i15.       ;
      rl  w0  x2+18      ;    send_ctrl(buf.localid,0);
      al  w1  0          ;
      jl. w3  d19.       ;    goto SA;
      jl.     i14.       ;  end;

; get terminal spec

i12:  se  w0  134        ;  if opcode=134 then
      jl.     i13.       ;  begin
      rl  w0  x2+18      ;    send_ctrl(buf.localid,0);
\f

;; tas 1.0 14.05.87       pool handler coroutine      phtxt     ...56a...

      al  w1  0          ;
      jl. w3  d19.       ;    goto SA;
\f

;. tas 1.0 14.05.87       pool handler coroutine      phtxt     ...57...

      jl.     i14.       ;  end;

; terminal data

i13:  se  w0  139        ;  if opcode=139 then
      jl.     i18.       ;  begin
      rl  w0  x2+14      ;    terminal_data(buf.localid);
      jl. w3  d21.       ;    goto SA;
      jl.     i14.       ;  end

; set ex_mode

i18:  se  w0  192        ;  if opcode=192 then
      jl.     i15.       ;  begin
      rl. w0  j3.        ;    ex_mode := 64 shift 12;
      rs  w0  x3+q15     ;    goto SA;
      jl.     i14.       ;

i15:
c.a88<6
      rs. w3  6          ;  *** test no 281 ******* 
      jl. w3  (r51.)     ;  w0 opcode      w2 buf   
      h. 281 , 1<6   w.  ;  w1             w3 curco
      0                  ;
z.
      al  w0  3          ;  
      rs  w0  x3+q30     ;  result:=3

i14:  al  w0  0          ; SA: att:=0;
i17:  rs. w0  j2.        ;
c.a88<2
                         ;  *** test no 276 **************
      rl  w0  x3+f13     ;
      so  w0  1<6        ;
      jl.     i20.       ;
      rl. w0  j4.        ;  type:=275, length:=10;
      al  w1  x3+q8      ;  tail:= answer (4 første ord)
      rl  w2  x3+q30     ;  fourth:=result;
      jl. w3  (r49.)     ;  testout;
      rl. w3  (r50.)     ;
i20:                     ;
z.
      rl  w0  x3+q30     ; SA: send=answer(reszult,
      rl  w2  x3+q74     ;        ans,mdescr,buf);
      al  w1  x3+q8      ;
      jd      +1<11+22   ;
      al  w0  0          ;
      rs  w0  x3+q74     ;  mdescr.buf2:=0;
      rl. w0  j2.        ;  if att=0 then
      sn  w0  0          ;  goto Next_mess;
      jl.     i1.        ;  
      am      -1000      ;
      jl. w3  d9.+1000   ;  send_att_message;
      jl.     i1.        ;  goto Next_mess;

j0:   1<16               ;
j1:   1<15               ;
j2:   0                  ;
j3:   64<12              ;
j4:   8<12 + 276

e.

c.-1
l17:
z.
 

e.


    
▶EOF◀