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

⟦cbc912715⟧ TextFile

    Length: 51456 (0xc900)
    Types: TextFile
    Names: »smtxt       «

Derivation

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

TextFile

\f

;  tas 1.0 14.05.87        system menu coroutine      smtxt     ...1...

;  @(#)smtxt	1.3  (RC International)  7/10/90
;
;********************************************************************
;*********************  SYSTEM MENU COROUTINE ***********************
;********************************************************************


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


;  Revisions historie
;
;  87.01.15  release til betatest
;
;  87.05.14  release 1.0
;
;  88.01.08  side 20/21 test på entydig sessions navn rettet
;            side 33    tbuf.tdescr.sender sættes altid til 0 ved exit fra sm
;
;  88.02.25  Indsæt nyt punkt i 1. menu linie, !disconnect, 
;            indsæt kode til at behandle det nye punkt
;  
;  88.03.17  release 1.2
;
;  temp testpunkter (900 - 999)
;  brugte
;
;;
\f

;  tas 1.0 14.05.87            rcmenu                  smtxt    ...2...

;
; Coroutinen består af følgende procedure
;
; d0   init_sysmenu
; d1   insert_string
; d2   insert_point
; d3   gen_sysmenu
; d4   write_sysmenu
; d5   find_session
; d6   search_point
; d7   new_password
; d8   new_session
; d9   remove_session
; d12  send_att
; d13  get_choice_table
; d14  get_and_lock_choice_table
; d15  unlock_choice_table

\f

;  tas 1.0 14.05.87        system menu coroutine      smtxt     ...3...

b.  d40,r50,t50,o10      ; begin system menu coroutine
w.
m.system menu   smtxt   1.3
c.-1
l14:
z.

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

o1  = q7       ; start niveau 1
o2  = o1 + 8   ; start niveau 2
o3  = o2 + 4   ; start niveau 3
o4  = o3 + 2   ; start niveau 4
o5  = o4 + 2   ; top niveau 4
q194= o5 - o1  ; stack size

; extern variable,  indeholder adresser på variable og routiner

u15:
r0:  h.  m24  , r1.  w.  ; curco, current coroutine
r1:  h.  m67  , r9.  w.  ; free_term

r9:  h.  m123 , r10. w.  ; <:tascat:>
r10: h.  m120 , r11. w.  ; get_buffer
r11: h.  m84  , r12. w.  ; create_spool_area
r12: h.  m75  , r13. w.  ; get_spool_segment
r13: h.   m7  , r14. w.  ; csend_message
r14: h.   m8  , r15. w.  ; cwait_answer
r15: h.  m10  , r16. w.  ; signal
r16: h.  m11  , r17. w.  ; wait_semaphor
r17: h.  m85  , r18. w.  ; remove_spool_area
r18: h.  m22  , r19. w.  ; release_buffer
r19: h.  m93  , r20. w.  ; get_from_session
r20: h.  m101 , r21. w.  ; init_td
r21: h.  m102 , r22. w.  ; c_read
r22: h.  m103 , r23. w.  ; c_write
r23: h.  m109 , r24. w.  ; write
r24: h.  m108 , r25. w.  ; c_outtext
r25: h.  m113 , r26. w.  ; rd_char
r26: h.  m111 , r27. w.  ; cursor
r27: h.  m114 , r28. w.  ; read_password
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...4...

r28: h.  m119 , r29. w.  ; remove_coroutine
r29: h.  m118 , r30. w.  ; create_coroutine
r30: h.  m92  , r31. w.  ; put_in_session
r31: h.   m2  , r32. w.  ; start_coroutine
r32: h.  m110 , r33. w.  ; erase
r33: h.  m127 , r34. w.  ; start addr for th coroutine
r34: h.  m112 , r35. w.  ; in_text
r35: h.  m161 , r36. w.  ; max_tbuf_size
r36: h.  m173 , r37. w.  ; write_error
r37: h.  m176 , r38. w.  ; register testout
r38: h.  m233 , r39. w.  ; antal sysm coroutiner
r39: h.  m246 , r40. w.  ; corebuf_lock
r40: h.  m247 , r41. w.  ; corebuf_open;
r41: h.   m56 , r42. w.  ; segmenttable base
r42: h.   m49 , r43. w.  ; coretable base
r43: h.  m260 , t0.  w.  ; disconnect terminal

; adresser på tekster

t0:  h. m190  , 1    w.  ; <:password :>
t1:  h. m191  , 1    w.  ; <:new :>
t2:  h. m192  , 1    w.  ; <:remove :>
t3:  h. m193  , 1    w.  ; <:break :>
t4:  h. m194  , 1    w.  ; <:kill :>
t5:  h. m195  , 1    w.  ; <:att :>
t6:  h. m196  , 1    w.  ; <:select --> :>
t7:  h. m197  , 1    w.  ; <:new password :>
t8:  h. m198  , 1    w.  ; <:confirme password :>
t9:  h. m199  , 1    w.  ; <:password not confirmed :>
t10: h. m200  , 1    w.  ; <:password not changed :>
t11: h. m201  , 1    w.  ; <:remove session --> :>
t12: h. m202  , 1    w.  ; <:break session --> :>
t13: h. m203  , 1    w.  ; <:kill from session --> :>
t14: h. m204  , 1    w.  ; <:att to session --> :>
t15: h. m205  , 1    w.  ; <:missing resources :>
t16: h. m206  , 1    w.  ; <:session id :>
t17: h. m207  , 1    w.  ; <:illegal id, session id :>
t18: h. m208  , 1    w.  ; <:ambigous id, session id :>
t19: h. m241  , 1    w.  ; <:en session nedlagt<10>:>
t20: h. m259  , 0    w.  ; <:!disconnect:>
                         ; end init list



; procedure init_sysmenu(result);
;
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...5...

;           result  (return)  =0 ok
;                             =1 ikke frie spool segmenter
;                             =2 ingen frie terminal buffere
;
; initialisere variable der bruges i system menu coroutinen samt
; allokere corebuffer til valgstrukturen, den låses i lager, og 
; initialisere valgstruktur til en tom tabel
;
;       call        return
; w0:               result
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o1 + 0 ; saved return

d0:
      rl. w2  (r0.)      ;  w2:=curco
c. a88<4
      rs. w3  6          ;  *** test no 200 *******
      jl. w3  (r37.)     ;  w0             w2 curco
      h. 200 , 1<11  w.  ;  w1             w3 retur addr
      0                  ;
z.
      rs  w3  x2+q40     ;  save return i cdescr;
      rl. w2  (r1.)      ;  w2:=addr free_term
      jl. w3  (r10.)     ;  get_buffer(free_term,t);
      se  w1  0          ;  if t=0 then begin
      jl.     i1.        ;    result:=2;
      al  w0  2          ;    return;
      jl      (x3+q40)   ;  end;
i1:   rs  w1  x3+q63     ;  tbuf.taddr:=t;
      rl. w0  (r35.)     ;
      rs  w0  x3+q64     ;  tbuf.size:=term_size;
      al  w0  1          ;  /* alloc fri corebuffer og spool segment */
      jl. w3  (r11.)     ;  create_spool_area(1,c_seg,result);
      se  w0  0          ;  if result<>0 then
      jl      (x3+q40)   ;  return;
      rs  w2  x3+q1      ;
      al  w1  2          ;  /* find fri corebuffer, sæt write bit */
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...6...

      jl. w3  (r12.)     ;  get_spool_segment(c_seg,c_base,4);
      rs  w2  x3+q2      ;  
      al  w0  0          ;
      rs  w0  x3+q5      ;  top_line:=0;
      am      (x3+q62)   ;
      rl  w0  f116       ;
      rs  w0  x3+q23     ;  old_cth:=tbuf.tdescr.cth;
      rl  w2  x3+q62     ;
      rl  w2  x2+f110    ;
      zl  w0  x2+f129    ;  r_arrow:=tbuf.tdescr.ttda.right_key;
      rs  w0  x3+q30     ;
      zl  w0  x2+f128    ;  l_arrow:=tbuf.tdescr.ttda.left_key;
      rs  w0  x3+q31     ;
      zl  w0  x2+f127    ;  down_arrow:=tbuf.tdescr.ttda.down_key;
      rs  w0  x3+q81     ;
      zl  w0  x2+f126    ;  up_arrow:=tbuf.tdescr.ttda.up_key;
      rs  w0  x3+q80     ;
      zl  w0  x2+f124    ;  max_col:=tbuf.tdescr.ttda.max_col;
      rs  w0  x3+q82     ;
      zl  w0  x2+f125    ;  max_lin:=tbuf.tdescr.ttda.max_lin;
      rs  w0  x3+q83     ;
      al  w0  0          ;  result:=0;
      jl      (x3+q40)   ;  return;

j1:   0                  ; top

e.


; procedure insert_string(td,string,ch);
;
;           td      (call)    td for menu linie
;           string  (call)    adresse på tekst der skal indsættes
;           ch      (return)  første tegn i teksten
;
; indsætter en tekst i en menu linie, teksten skal være afsluttet 
; med et nul tegn 
;
;       call        return
; w0:               ch
; w1:   td          unch.
; w2:   string      unch.
; w3:   return      curco

\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...7...

b. i5,j5  w.

d1:   rs. w3  j0.        ;
c.a88<4
      rs. w3  6          ;  *** test no 201 *******     
      jl. w3  (r37.)     ;  w0             w2 string    
      h. 201 , 1<11  w.  ;  w1 td          w3 retur addr
      0                  ;
z.
      ds. w2  j2.        ;  save registers;
      al  w0  80         ;
      al. w1  j3.        ;
      al  w2  x2-2       ;
      jl. w3  (r20.)     ;  init_td(tdr,string-2,80);
      jl. w3  (r21.)     ;  c_read(tdr,c);
      rs. w0  j4.        ;  ch:=c;
i1:   rl. w1  j1.        ;  repeat
      jl. w3  (r22.)     ;    c_write(td,c);
      al. w1  j3.        ;    c_read(tdr,c);
      jl. w3  (r21.)     ;
      se  w0  0          ;  until c<0;
      jl.     i1.        ;
      rl. w0  j4.        ;  w0:=ch;
      dl. w2  j2.        ;  restore w1,w2;
      jl.     (j0.)      ;  return;

j0:   0                  ; saved return
j1:   0                  ; td
j2:   0                  ; string
j3:   0,r.3              ; tdr
j4:   0                  ; ch

e.



; procedure insert_point(line,string,choice);
; 
;           line    (call)    menu linie nummer
;           string  (call)    adresse på tekst til punkt
;           choice  (return)  adresse på indgang i choice tabellen
;
; indsætter et punkt i valgstrukturen
;
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...8...

;       call        return
; w0:               unch.
; w1:   line        undef.
; w2:   string      choice
; w3:   return      curco

b. i5,j5  w.

d2:   ds. w0  j1.        ;  save w0,return;
      rs. w2  j2.        ;  save w2;
c.a88<4
      rs. w3  6          ;  *** test no 202 *******     
      jl. w3  (r37.)     ;  w0             w2 string    
      h. 202 , 1<11  w.  ;  w1 line        w3 retur addr
      0                  ;
z.
      rl. w3  (r0.)      ;  w3:=curco;
      al  w2  x1+1       ;
      sl  w1  (x3+q5)    ;  if line>=top_line then
      rs  w2  x3+q5      ;    top_line:=line+1;
      ls  w1  6          ;
      wa  w1  x3+q2      ;  td:=c_base+line shift 6;
      rl. w2  j2.        ;
      jl. w3  d1.        ;  insert_string(td,string,c);
      rl  w2  x3+q2      ;
      wa  w2  x3+q21     ;  choice:=c_base+top_choice;
      rl  w1  x3+q21     ;
      al  w1  x1+6       ;  top_choice:=top_choice+6;
      rs  w1  x3+q21     ;
      sl  w1  (x3+q22)   ;  if top_choice>max_choice then
      je      -60        ;  fault;
      rs  w0  x2+0       ;  choice.ch:=c;
      rl. w0  j1.        ;  restore w0;
      jl.     (j0.)      ;  return;

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

e.


; procedure gen_sysmenu;
;
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...9...

; Initialisere choice tabellen ud fra sessions kæden
;
;       call        return
; w0:               number_of_sessions
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i15,j10  w.

d3:   ds. w1  j1.        ;
      ds. w3  j3.        ;  save registers;
c.a88<4
      rs. w3  6          ;  *** test no 203 *******     
      jl. w3  (r37.)     ;  w0             w2 
      h. 203 , 1<11  w.  ;  w1             w3 retur addr
      0                  ;
z.
      jl. w3  d13.       ;  get_choice_table;
      rl  w2  x3+q2      ;  /* init valg struktur */
      al  w1  x2+255     ;  top:=c_base+255;
      rs. w1  j7.        ;  td:=c_base;  /* init valgstruktur */
i10:  al  w1  x2+4       ;  repeat
      rs  w1  x2+0       ;    td.cur:=td+4;
      al  w1  80         ;    td.nch:=80;
      hs  w1  x2+4       ;
      al  w1  -1         ;    td.chshift:=-1;
      hs  w1  x2+5       ;    td.first:=td+6;
      al  w1  x2+6       ;
      rs  w1  x2+2       ;
      al  w2  x2+64      ;    td:=td+64;
      sh. w2  (j7.)      ;  until td > top;
      jl.     i10.       ;
      al  w1  256        ;
      rs  w1  x3+q20     ;  first_choice:=256;
      rs  w1  x3+q21     ;  top_choice:=256;
      al  w1  490        ;  max_choice:=490;
      rs  w1  x3+q22     ;
      al  w0  0          ;
      rs  w0  x3+q3      ;  number_of_sessions:=0;
      am      (x3+q62)   ;
      rl  w1  f116       ;  c:=tbuf.tdescr.cth;
      sl  w1  1          ;  if c<=0 then
      jl.     i9.        ;  begin
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...10...

      am      (x3+q62)   ;    c=tbuf.tdescr.head_session
      rl  w1  f102       ;    if c er sm coroutinen then
      sn  w1  x3         ;      c:=c.next_session;      
      rl  w1  x1+q60     ;    if c=0 then               
      sn  w1  0          ;      goto ret;               
      jl.     i7.        ;  
      am      (x3+q62)   ;    tbuf.tdescr.cur_th:=c;
      rs  w1  f116       ;  end;
i9:   rs. w1  j4.        ;  cur:=c;
      al  w0  0          ;
      rs. w0  j5.        ;  stop_th:=0;
                         ;  repeat
i1:   sn. w1  (j5.)      ;    while cur<>stop_th do
      jl.     i3.        ;    begin
      sn  w1  x3         ;      if cur<>th then
      jl.     i2.        ;      begin
      rl  w2  x3+q3      ;        
      al  w2  x2+1       ;        number_of_sessions :=
      rs  w2  x3+q3      ;          number_of_sessions + 1;
      al  w2  x1+q61     ;
      al  w1  0          ;        insert_point(0,
      jl. w3  d2.        ;          cur.tbuf.s_name,choice);
      al  w0  0          ;
      rs  w0  x2+2       ;        choice.action:=start;
      rl. w1  j4.        ;        choice.param:=cur;
      rs  w1  x2+4       ;      end;
i2:   rl  w1  x1+q60     ;      cur:=cur.tbuf.next_session;
      rs. w1  j4.        ;    end;
      jl.     i1.        ;
i3:   rl. w0  j5.        ;    if stop_th=0 then 
      se  w0  0          ;    begin
      jl.     i4.        ;      
      rl  w1  x3+q62     ;      cur:=th.tbuf.tdescr.head_session;
      rl  w1  x1+f102    ;      stop_th:=tbuf.tdescr.cth;
      rs. w1  j4.        ;
      am      (x3+q62)   ;
      rl  w0  f116       ;    end;
      rs. w0  j5.        ;  until cur=stop_th;
i4:   se. w1  (j5.)      ;
      jl.     i1.        ;
                         ;  /* indsæt de øvrige punkter */
i8:   al  w1  1          ;
      rl. w2  t0.        ;  insert_point(1,
      al  w2  x2+2       ;     <:password :>,choice);
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...11...

      jl. w3  d2.        ;  
      al  w0  2          ;
      rs  w0  x2+2       ;  choice.action:=password;
      al  w1  1          ;
      rl. w2  t1.        ;  insert_point(1,
      al  w2  x2+2       ;     <:new :>,choice);
      jl. w3  d2.        ;     
      al  w0  4          ;
      rs  w0  x2+2       ;  choice.action:=new;
      al  w1  1          ;
      rl. w2  t2.        ;  insert_point(1,
      al  w2  x2+2       ;     <:remove :>,choice);
      jl. w3  d2.        ;     
      al  w0  6          ;
      rs  w0  x2+2       ;  choice.action:=remove;
      am      (x3+q62)   ;
      rl  w1  f116       ;
      rl  w0  x1+f21     ;
      rs. w0  j6.        ;
      sz. w0  (j8.)      ;  if tbuf.tdescr.cth.state.direct=1 or
      jl.     4          ;       tbuf.tdescr.cth.state.send_get then
      jl.     i5.        ;  begin
      al  w1  1          ;
      rl. w2  t3.        ;    insert_point(1,
      al  w2  x2+2       ;       <:break :>,choice);
      jl. w3  d2.        ;       
      al  w0  8          ;    choice.action:=break;
      rs  w0  x2+2       ;  end;
      rl. w0  j6.        ;
i5:   sz  w0  p4+p5      ;  if cth.state.stty=1 or
      jl.     +4         ;     cth.state.mtty=1 then
      jl.     i6.        ;  begin
      al  w1  1          ;
      rl. w2  t4.        ;    insert_point(1,
      al  w2  x2+2       ;       <:kill :>,choice);
      jl. w3  d2.        ;       
      al  w0  10         ;    choice.action:=kill;
      rs  w0  x2+2       ;  end;
      rl. w0  j6.        ;
i6:   so  w0  p4         ;  if cth.state.stty=1 then
      jl.     i11.       ;  begin
      al  w1  1          ;
      rl. w2  t5.        ;    insert_point(1,
      al  w2  x2+2       ;       <:att :>,choice);
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...12...

      jl. w3  d2.        ;       
      al  w0  12         ;    choice.action:=att;
      rs  w0  x2+2       ;  end;
i11:  al  w1  1          ;
      rl. w2  t20.       ;  insert_point(1,
      al  w2  x2+2       ;    <:disconnect:>,choice);
      jl. w3  d2.        ;
      al  w0  14         ;  choice.action:=disconnect terminal
      rs  w0  x2+2       ;
i7:   al  w0  0          ; ret:
      am      (x3+q62)   ;   tbuf.tdescr.th_stopped:=0;
      rs  w0  f115       ;
      rl  w0  x3+q3      ;  w0 = number_of_sessions;
      jl.     (j3.)      ;  return;

j0:   0                  ; saved w0
j1:   0                  ; saved w1
j2:   0                  ; saved w2
j3:   0                  ; saved w3
j4:   0                  ; cur
j5:   0                  ; stop_th
j6:   0                  ; cth.state
j7:   0                  ; top
j8:   p7+p19             ; state.direct + state.send_get

e.



; procedure write_sysmenu(line,s);
;
;           line (call)    menu linie  nummer
;           s    (return)  write status
;
; skriver en menu linie på sidste linie på skærmen
;
;       call        return
; w0:               s
; w1:   line        undef.
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

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

d4:   rl. w2  (r0.)      ;  w2:=curco;
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...13...

c.a88<4
      rs. w3  6          ;  *** test no 204 *******     
      jl. w3  (r37.)     ;  w0             w2 curco     
      h. 204 , 1<11  w.  ;  w1 line        w3 retur addr
      0                  ;
z.
      rs  w3  x2+q40     ;  save return;
      jl. w3  d14.       ;  get_and_lock_choice_table;  /* lås valgtabel */
      ls  w1  6          ;
      wa  w1  x3+q2      ;  td:=c_case + line shift 6;
      rs  w1  x3+q41     ;
i0:   rl. w0  t6.        ; rep:
      jl. w3  (r23.)     ;  write(<:select --> :>,s);
      sz. w0  (j0.)      ;  if att i s then goto rep;
      jl.     i0.        ;
      rl  w1  x3+q41     ;
      sn  w0  2          ;  if s=2 then
      jl. w3  (r24.)     ;   c_outtext(td,s);
      sz. w0  (j0.)      ;  if att i  s then goto rep;
      jl.     i0.        ;
      jl. w3  d15.       ;  unlock_choice_table;   /* frigiv corebuffer */
      jl      (x3+q40)   ;  return;

j0:   1<16               ; att

e.


; procedure find_session(txt,cda,s);
;
;           txt  (call)    adresse på ledetekst
;           cda  (return)  cda for den valgte terminal handler, hvis
;                          =0 er valg fortrudt med att eller timeout
;           s    (return)  write status
;
; finder session ud fra valg i menu linie 1
;
;       call        return
; w0:   txt         s
; w1:               undef.
; w2:               cda eller 0
; w3:   return      curco

b. i8,j5  w.
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...14...


; proceduren bruger følgende lokale variable i cdescr

q40 = o3 + 0 ; saved return

d5:   rl. w1  (r0.)      ;
c.a88<4
      rs. w3  6          ;  *** test no 205 *******     
      jl. w3  (r37.)     ;  w0 text        w2 
      h. 205 , 1<11  w.  ;  w1 curco       w3 retur addr
      0                  ;
z.
      rs  w3  x1+q40     ;  save return;
      al  w3  x1         ;  w3:=curco;
      rl  w2  x3+q3      ;
      sl  w2  2          ;  if number_of_sessions<2 then
      jl.     i1.        ;  begin
      rl  w2  x3+q2      ;    choice:=c_base+first_choice;
      wa  w2  x3+q20     ;    goto found_ch;
      jl.     i4.        ;  end;
i1:   jl. w3  d14.       ;  get_and_lock_choice_table; /* lås coretable */
      jl. w3  (r23.)     ;  write(txt,s);
      jl. w3  d15.       ;  unlock_choice_table;   /* frigiv corebuffer */
      se  w0  2          ;  if s<>2 then
      jl.     i5.        ;  goto error_ret;
      rl  w1  x3+q2      ;  td:=c_base;
      jl. w3  (r24.)     ;  c_outtext(td,s);
      se  w0  2          ;  if s<>2 then
      jl.     i5.        ;  goto error_ret;
i2:   rl  w1  x3+q82     ; rd:  /* sæt cursor sidst på linien */
      al  w1  x1-2       ;  col:=max_col-2;
      rl  w2  x3+q83     ;  
      al  w2  x2-1       ;  lin:=max_lin-1;
      jl. w3  (r26.)     ;  curcor(col,lin,s);
      se  w0  2          ;  if s<>2 then
      jl.     i5.        ;  goto error_ret;
      al  w0  a4         ;  a4 timeout perioder
      jl. w3  (r25.)     ;  rd_char(c,a4,s);
      sz. w0  (j2.)      ;    
      jl.     i7.        ;
      so. w0  (j0.)      ;  if att or timeout i s then begin
      jl.     i3.        ;    s:=s - (att+timeout);
i7:   la. w0  j1.        ;    cda:=0;
      al  w2  0          ;    return
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...15...

      jl      (x3+q40)   ;  end;
i3:   se  w0  2          ;  if s<>2 then
      jl.     i5.        ;  goto error_ret;
      am      (x3+q62)   ;
      rl  w0  f115       ;  if tbuf.tdescr.th_stopped <> 0 then
      sn  w0  0          ;  begin
      jl.     i8.        ;    write(<:session fjernet:>);
      rl. w0  t19.       ;    goto error_ret;
      jl. w3  (r23.)     ;  end;
      jl.     i5.        ;
i8:   jl. w3  d6.        ;  search_point(c,choice);
      sn  w2  0          ;  if choice=0 then 
      jl.     i2.        ;  goto rd;
i4:   rl  w0  x2+2       ; found_ch:
      se  w0  0          ;  if choice.action<>start then
      jl.     i2.        ;  goto rd;
      al  w0  2          ;  s:=2;
      rl  w2  x2+4       ;  cda:=choice.param;
      rl  w1  x3+q62     ;  /* cda skal stå i sessions kæden */
      rl  w1  x1+f102    ;  cur:=tbuf.tdescr.head_session;
i6:   sh  w1  0          ;  while cur>0 do begin
      jl.     i5.        ;    if cur=cda then
      sn  w1  x2         ;    return;
      jl      (x3+q40)   ;    cur:=cur.next_session;
      rl  w1  x1+q60     ;  end;
      jl.     i6.        ;
      
i5:   al  w2  0          ; error_ret: cda:=0;
      la. w0  j3.        ;  s:=s-att;
      jl      (x3+q40)   ;  return;

j0:   1<16               ;  att 
j1:   -(:1<16+1<21:)-1   ;  -att-timeout
j2:   1<21               ;  timeout
j3:   -(:1<16:)-1        ;  -att

e.


; procedure search_point(ch,choice);
;
;           ch      (call)    valg tegn
;           choice  (return)  peger til indgang i choice tabellen
;                             hvis valg tegn er ch, hvis ikke funder er
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...16...

;                             choice=0
;
; søger efter indgang i valg struktur med et givet valg tegn
;
;       call        return
; w0:               undef.
; w1:   ch          undef
; w2:               choice eller 0
; w3:   return      curco

b. i5,j5  w.

d6:   rs. w3  j0.        ;  save return;
c.a88<4
      rs. w3  6          ;  *** test no 206 *******     
      jl. w3  (r37.)     ;  w0             w2 
      h. 206 , 1<11  w.  ;  w1 tegn        w3 retur addr
      0                  ;
z.
      jl. w3  d13.       ;  get_choice_table;
      rl  w2  x3+q2      ;
      wa  w2  x3+q21     ;
      al  w2  x2-1       ;
      rs. w2  j1.        ;  top:=c_base+first_choice-1;
      rl  w2  x3+q2      ;
      wa  w2  x3+q20     ;  choice:=c_base+first_choice;
      sn  w1  13         ;  if ch<>cr then begin
      jl.     i2.        ;    repeat
i1:   sn  w1  (x2)       ;      if choice.ch=c then
      jl.     i2.        ;        goto found_ch;
      al  w2  x2+6       ;      choice:=choice+6;
      sh. w2  (j1.)      ;    until choice>top;
      jl.     i1.        ;    choice:=0;
      al  w2  0          ;  end;
i2:   jl.     (j0.)      ;  found_ch:  return;

j0:   0                  ; saved return;
j1:   0                  ; top

e.



; procedure new_password(s);
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...17...

;
;           s  (return) status
;
; sætter nyt password
;
;       call        return
; w0:               s
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o1 + 0 ; saved return
q41 = o1 + 2 ; password (første ord)
q42 = o1 + 4 ; -        (andet ord)

d7:   rl. w2  (r0.)      ;
c.a88<4
      rs. w3  6          ;  *** test no 207 *******     
      jl. w3  (r37.)     ;  w0             w2 curco     
      h. 207 , 1<11  w.  ;  w1             w3 retur addr
      0                  ;
z.
      rs  w3  x2+q40     ;  save return;
      rl. w0  t7.        ;
      jl. w3  (r23.)     ;  write(<:new password :>,s);
      se  w0  2          ;  if s<>2 then
      jl.     i3.        ;  goto error_ret;
      jl. w3  (r27.)     ;  read_password(x,s);
      se  w0  2          ;  if s<>2 then
      jl.     i3.        ;  goto error_ret;
      ds  w2  x3+q42     ;
      rl. w0  t8.        ;
      jl. w3  (r23.)     ;  write(<:confirme password :>,s);
      se  w0  2          ;  if s<>2 then
      jl.     i3.        ;  goto error_ret;
      jl. w3  (r27.)     ;  read_password(y,s);
      se  w0  2          ;  if s<>2 then
      jl.     i3.        ;  goto error_ret;
      sn  w1  (x3+q41)   ;
      se  w2  (x3+q42)   ;  if x=y then 
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...18...

      jl.     i1.        ;  begin
      rl. w0  j0.        ;    
      rs  w0  x3+q66     ;    tbuf.opmocde:=9 shift 12 + 6;
      rl  w1  x3+q63     ;    tbuf.first:=tbuf.taddr;
      al  w2  x1+8       ;    tbuf.last:=tbuf.first+8;
      ds  w2  x3+q69     ;
      rl  w2  x3+q62     ;    word(tbuf.first):=
      rl  w0  x2+f106    ;       tbuf.tdescr.uid;
      rs  w0  x1         ;
      dl  w0  x2+f105    ;    dword(tbuf.first+4):=
      ds  w0  x1+4       ;      tbuf.tdescr.cpw;
      rl. w3  (r0.)      ;
      dl  w0  x3+q42     ;    dword(tbuf.first+8):=
      ds  w0  x1+8       ;       x;
      rl. w3  (r0.)      ;
      al  w1  x3+q66     ;
      rl. w2  r9.        ;    csendmessage(tbuf.op,
      jl. w3  (r13.)     ;       <:tascat:>,buf);
      sh  w2  0          ;    if buf=0 then fault
      je      -12        ;
      al  w0  0          ;
      al. w1  j1.        ;    cwaitanswer(buf,0,ans,r);
      jl. w3  (r14.)     ;
      se  w0  1          ;    if r<>1 then
      je      -18        ;    fault;
      rl  w0  x1         ;
      se  w0  0          ;    if ans.result<>0 then
      je      -18        ;    fault;
      dl  w1  x3+q42     ;
      rl  w2  x3+q62     ;    tbuf.tdescr.cpw:=x;
      ds  w1  x2+f105    ;
      al  w0  2          ;    s:=2;  
      jl.     i2.        ;  end
i1:   rl. w0  t9.        ;  else
      jl. w3  (r23.)     ;    write(<:password not confirmed :>,s);
i2:   jl      (x3+q40)   ;  return;

i3:   la. w0  j2.        ; error_ret:  s:=s-att-timeout;
      se  w0  2          ;  if s<>2 then
      jl      (x3+q40)   ;  return;
      rl. w0  t10.       ;  write(<:password not changed :>,s);
      jl. w3  (r23.)     ;
      la. w0  j3.        ;  s:=s-att;
      jl      (x3+q40)   ;  return;
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...19...


j0:   9<12+6
j1:   0,r.8              ; answer area
j2:   -(:1<21+1<16:)-1   ; -att-timeout
j3:   -(:1<16:)-1        ; -att

e.
 

; procedure new_session(cda,s);
; 
;           cda  (return)  cda for th oprettet, hvis =0 er der ikke
;                          started ny session
;           s    (return)  status
;
; opretter og starter en ny terminal handler der skal køre en session
; på en terminal
;
;       call        return
; w0:               s
; w1:               undef.
; w2:               cda eller 0
; w3:   return      curco

b. i20,j10  w.

; proceduren bruger følgende lokale variable i cdescr

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

d8:   rl. w2  (r0.)      ;
c.a88<4
      rs. w3  6          ;  *** test no 208 *******     
      jl. w3  (r37.)     ;  w0             w2 curco     
      h.  208, 1<11  w.  ;  w1             w3 retur addr
      0                  ;
z.
      rs  w3  x2+q40     ;  save return;
      rl. w0  t16.       ;
      jl. w3  (r23.)     ;  write(<:session id :>,s);
      se  w0  2          ;  if s<>2 then
      jl.     i10.       ;  goto error_ret;
i1:   al  w1  x3+q15     ; rd:
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...20...

      rl  w2  x3+q63     ;
      rs  w2  x1+2       ;  td.first:=tbuf.taddr;
      al  w0  4          ;  in_text(td,4,0,10,s);
      rl. w2  j9.        ;
      jl. w3  (r34.)     ;
      sz. w0  (j0.)      ;
      jl.     i0.        ;
      so. w0  (j1.)      ;  if att or timeout i s then begin
      jl.     i2.        ;    s:=s-att-timeout; 
i0:   la. w0  j2.        ;    goto error_ret
      jl.     i10.       ;  end;
i2:   se  w0  2          ;  if s<>2 then
      jl.     i10.       ;  goto error_ret;
      al. w1  j6.        ;
      al. w2  j2.        ;
      al  w0  9          ;  init_td(tdw,wrk_s_name,9);
      jl. w3  (r20.)     ;
      al  w1  x3+q15     ;
      jl. w3  (r21.)     ;  c_read(td,c);
      sl  w0  32         ;  if c<32 then
      jl.     i3.        ;
      al  w0  0          ;    wrk_s_name:=0;
      rs. w0  j3.        ;  else
      jl.     i9.        ;  begin
i3:   sl  w0  65         ;    if c>125 or
      sl  w0  126        ;       c<65 or
      jl.     i4.        ;
      sh  w0  96         ;      (c<97 and
      sh  w0  93         ;        c>93 ) then
      jl.     i5.        ;    begin
i4:   rl. w0  t17.       ;      write(<:illegal id, session id :>,s);
      jl. w3  (r23.)     ;      if s<>2 then
      se  w0  2          ;        goto error_ret;
      jl.     i10.       ;      goto rd;
      jl.     i1.        ;    end;
i5:   jl. w3  d13.       ;    get_choice_table;
      rl  w2  x3+q2      ;
      wa  w2  x3+q21     ;
      al  w2  x2-1       ;
      rs. w2  j4.        ;    top:=c_base+top_choice-1;
      rl  w2  x3+q2      ;
      wa  w2  x3+q20     ;    choice:=c_base+first_choice;
i6:   se  w0  (x2)       ;    repeat
      jl.     i11.       ;      if choice.ch=c then begin
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...21...

      rl. w0  t18.       ;        write(<:ambigous id, session id :>,s);
      jl. w3  (r23.)     ;        if s<>2 then goto error_ret;
      se  w0  2          ;        goto rd;
      jl.     i10.       ;      end;
      jl.     i1.        ;      choice:=choice+6;
i11:  al  w2  x2+6       ;
      sh. w2  (j4.)      ;    until choice > top ;
      jl.     i6.        ;
i7:   al  w1  0          ;    n:=0;
      rs. w1  j5.        ;    repeat
i13:  al. w1  j6.        ;      c_write(tdw,c);
      jl. w3  (r22.)     ;
      rl. w1  j5.        ;
      al  w1  x1+1       ;      n:=n+1;
      rs. w1  j5.        ;
      al  w1  x3+q15     ;      get_char(td,c);
      jl. w3  (r21.)     ;
      sl  w0  32         ;    until c<32;
      jl.     i13.       ;
      al. w1  j6.        ;
i8:   rl. w2  j5.        ;    while n<5 do 
      sl  w2  5          ;
      jl.     i14.       ;    begin
      al  w2  x2+1       ;      c_write(tdw,32);
      rs. w2  j5.        ;    end;
      al  w0  32         ;    
      jl. w3  (r22.)     ;
      jl.     i8.        ;
i14:  al  w0  0          ;    c_write(tdw,0);
      jl. w3  (r22.)     ;

i9:   al  w1  0          ;  
      rl  w2  x3+q83     ;  
      al  w2  x2-1       ;    lin:=max_lin-1;
      jl. w3  (r26.)     ;    cursor(0,lin,s);
      jl. w3  (r32.)     ;    erase(s);
      jl. w3  (r29.)     ;    create_coroutine(cda);
      sn  w1  0          ;    if cda<>0 then
      jl.     i15.       ;    begin
c.a88<4
      rs. w3  6          ;  *** test no 219 *******     
      jl. w3  (r37.)     ;  w0             w2 
      h. 219 , 1<11  w.  ;  w1 cda         w3 retur addr
      0                  ;
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...22...

z.
      rs  w1  x3+q41     ;
      rl  w3  x3+q62     ;      /* sæt term_spec fra tdescr, med type 1 */
      rl  w0  x3+f112    ;  
      rx  w0  x3+f111+2  ;  
      rs  w0  x3+f112    ;      swop ord med gemt type og ord med type 2;  
      al  w1  x3+f111    ;  
      al  w2  x3+f108    ;      csendmessage(tbuf.tdescr.termspec,
      jl. w3  (r13.)     ;         tbuf.tdescr.name,buf);  
      sh  w2  2          ;      if buf<2 then
      je      -12        ;      fault;  
      rl  w1  x3+q62     ;  
      rl  w0  x1+f112    ;  
      rx  w0  x1+f111+2  ;
      rs  w0  x1+f112    ;      swop tilbage
      al  w1  x3+q8      ;  
      al  w0  0          ;  
      jl. w3  (r14.)     ;      cwaitanswer(buf,0,ans,r);  
      rl  w1  x3+q41     ;
      rl. w0  j8.        ;
      rs  w0  x1+f21     ;      cda.state:=th_med_mcl;
      dl. w0  j7.        ;
      ds  w0  x1+q61+2   ;      s_name:=wrk_s_name;
      rl. w3  (r0.)      ;
      al  w2  x1         ;
      rl  w1  x3+q62     ;      tdescr:=tbuf.tdescr;
      jl. w3  (r30.)     ;      put_in_session(tdescr,cda);
      rs  w2  x1+f103    ;      tdescr.cur_th:=cda;
      al  w0  a25        ;      start_coroutine(prio,ic,cda);
      rl. w1  r33.       ;     
      jl. w3  (r31.)     ;    
      al  w2  x2+f26     ;        
      jl. w3  (r16.)     ;      wait_semaphor(cda.stop_sem);
      rl  w2  x3+q41     ;
      rl  w0  x2+f27     ;      w0:=create result fra th;
      sn  w0  0          ;      if result=ok then
      jl      (x3+q40)   ;       return;

      rl  w3  x3+q62     ;
      al  w1  x3+f111    ;      /* sæt term_spec fra tdescr, med type 2 */
      al  w2  x3+f108    ;      csendmessage(tbuf.tdescr.termspec,
      jl. w3  (r13.)     ;        tbuf.tdescr.name,buf);
      sh  w2  2          ;      if buf<2 then
      je      -12        ;       fault;
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...23...

      al  w1  x3+q8      ;
      al  w0  0          ;      cwaitanswer(buf,0,ans,r);
      jl. w3  (r14.)     ;      goto error_ret;
      jl.     i10.       ;   end
i15:  al  w1  18         ;   else error_no:=18;
      rl  w2  x3+q62     ;
      rl  w0  x2+f107    ;
      jl. w3  (r36.)     ;    write_error(tbuf.tdescr.tpda,error_no);
i10:  al  w2  0          ; error_ret:  cda:=0;
      jl      (x3+q40)   ;  return;

j0:   1<21               ; timeout
j1:   1<16               ; att
j2:   -(:1<21+1<16:)-1   ; -att-timeout
j3:   0,r.2              ; wrk_s_name
j7=j3+2
j4:   0                  ; top
j5:   0                  ; n
j6:   0,r.3              ; tdw
j8:   p32 + p18          ; startup værdi af th.state
j9:   a4<12              ; timeout<12+mode
e.



; procedure remove_session(cda,s);
;
;           cda  (return)  cda for valgt session, hvis 0 fortrudt med att
;           s    (return)  status
;
; finder cda for session der skal fjernes, og sætter finis=1 i
; coroutinens state variabel
;
;       call        return
; w0:               s
; w1:               undef.
; w2:               cda eller 0
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o4 + 0 ; saved return
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...24...


d9:   rl. w2  (r0.)      ;
c.a88<4
      rs. w3  6          ;  *** test no 209 *******     
      jl. w3  (r37.)     ;  w0             w2 curco     
      h. 209 , 1<11  w.  ;  w1             w3 retur addr
      0                  ;
z.
      rs  w3  x2+q40     ;  save return;
      rl. w0  t11.       ;  find_session(<:remove session --> :>,
      jl. w3  d5.        ;     cda,s);
      sn  w2  0          ;  if cda=0 then
      jl      (x3+q40)   ;  return;
      rl  w1  x2+f21     ;
      lo. w1  j0.        ;  cda.state.finis:=1;
      rs  w1  x2+f21     ;
      am      (x3+q62)   ;
      rs  w2  f116       ;  tbuf.tdescr.cth:=cda;
      jl      (x3+q40)   ;  return

j0:   p14                ; state.cont

e.


; procedure send_att(s);
;
;           s  (return)  status
;
; finder session til hvis ejer (ejer af ph) der skal sendes en
; attention message, og sætter att=1 i coroutinens state variabel
; coroutinen sættes til current
;
;       call        return
; w0:               s
; w1:               undef.
; w2:               undef.
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o1 + 0 ; saved return
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...25...


d12:  al  w0  x3         ;
      rl. w3  (r0.)      ;
c.a88<4
      rs. w3  6          ;  *** test no 212 *******     
      jl. w3  (r37.)     ;  w0 return adr  w2 
      h. 212 , 1<11  w.  ;  w1             w3 curco
      0                  ;
z.
      rs  w0  x3+q40     ;  save return;
;     rl. w0  t14.       ;  find_session(<:att to session --> :>,
;     jl. w3  d5.        ;     cda,s);
      am      (x3+q62)   ;
      rl  w2  f116       ;  cda:=tbuf.tdescr.cth;
      sn  w2  0          ;  if cda=0 then
      jl      (x3+q40)   ;  return;
      rl  w1  x2+f21     ;
      lo. w1  j0.        ;  cda.state.att:=1;
      rs  w1  x2+f21     ;
      am      (x3+q62)   ;
      rs  w2  f116       ;  tbuf.tdescr.cth:=cda;
      jl      (x3+q40)   ;  return

j0:   p15                ; state.att

e.


; procedure get_choice_table;
;
;
; proceduren sikre at choice table er i en corebuffer
;
;       call        return
; w0:               unch.
; w1:               unch.
; w2:               unch.
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

q40 = o1 + 0 ; saved w0
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...26...

q41 = o1 + 2 ; saved w1
q42 = o1 + 4 ; saved w2
q43 = o1 + 6 ; saved return

d13:  rs. w3  j0.        ;
c.a88<4
      rs. w3  6          ;  *** test no 200 *******     
      jl. w3  (r37.)     ;  w0             w2
      h. 213 , 1<11  w.  ;  w1             w3 retur addr
      0                  ;
z.
      rl. w3  (r0.)      ;
      ds  w1  x3+q41     ;  save w0,w1,w2,return i cdescr;
      rs  w2  x3+q42     ;
      rl. w0  j0.        ;  /* find corebuffer, læs hvis ikke i lager
      rs  w0  x3+q43     ;     sæt write bit i coretable indgang */
      rl  w2  x3+q1      ;  get_spool_segment(c_seg,c_base,3);
      al  w1  3          ;
      jl. w3  (r12.)     ;
      rs  w2  x3+q2      ;
      dl  w1  x3+q41     ;  restore w0,w1,w2;
      rl  w2  x3+q42     ;  
      jl      (x3+q43)   ;  return;

j0:   0                  ; saved return

e.


; procedure get_and_lock_choice_table;
;
;
; proceduren sikre at choice table er i en corebuffer, corebufferen låses
;
;       call        return
; w0:               unch.
; w1:               unch.
; w2:               unch.
; w3:   return      curco

b. i5,j5  w.

; proceduren bruger følgende lokale variable i cdescr

\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...27...

q40 = o1 + 0 ; saved w0
q41 = o1 + 2 ; saved w1
q42 = o1 + 4 ; saved w2
q43 = o1 + 6 ; saved return

d14:  rs. w3  j0.        ;
c.a88<4
      rs. w3  6          ;  *** test no 200 *******     
      jl. w3  (r37.)     ;  w0             w2 
      h. 214 , 1<11  w.  ;  w1             w3 retur addr
      0                  ;
z.
      rl. w3  (r0.)      ;
      ds  w1  x3+q41     ;  save w0,w1,w2,return i cdescr;
      rs  w2  x3+q42     ;
      rl. w0  j0.        ;  
      rs  w0  x3+q43     ;  
      al  w0  1          ;
      jl. w3  (r39.)     ;  corebuf_lock(1); /* reserver een corebuffer */
      rl  w2  x3+q1      ;  /* find corebuffer, læs hvis ikke i lager
      al  w1  7          ;     sæt write og lock bit i coretable indgang */  
      jl. w3  (r12.)     ;  get_spool_segment(c_seg,c_base,7);       
      rs  w2  x3+q2      ;
      dl  w1  x3+q41     ;  restore w0,w1,w2;
      rl  w2  x3+q42     ;  
      jl      (x3+q43)   ;  return;

j0:   0                  ; saved return

e.


; procedure unlock_choice_table
;
;
; fjerner reservationen af corebuffer med choice table
;
;       call        return
; w0:               unch.
; w1:               unch.
; w2:               unch.
; w3:   return      curco

b. i5,j5  w.
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...28...


; proceduren bruger følgende lokale variable i cdescr

q40 = o1 + 0 ; saved w0
q41 = o1 + 2 ; saved w1
q42 = o1 + 4 ; saved w2
q43 = o1 + 6 ; saved return

d15:  rs. w3  j0.        ;
c.a88<4
      rs. w3  6          ;  *** test no 215 *******     
      jl. w3  (r37.)     ;  w0             w2 
      h. 215 , 1<11  w.  ;  w1             w3 retur addr
      0                  ;
z.
      rl. w3  (r0.)      ;
      ds  w1  x3+q41     ;  save w0,w1,w2,return i cdescr;
      rs  w2  x3+q42     ;
      rl. w0  j0.        ;  
      rs  w0  x3+q43     ;  
      rl  w1  x3+q1      ;
      am.     (r41.)     ;
      am      (0)        ;
      zl  w1  x1         ;  cte:=segmenttable(c_seg)*8 + coretable_base;
      ls  w1  3          ;
      wa. w1  (r42.)     ;
      rl  w0  x1         ;
      la. w0  j1.        ;  cte.prio.L:=0;
      rs  w0  x1         ;
      jl. w3  (r40.)     ;  corebuf_open;
      rl  w2  x3+q1      ;  /* find corebuffer, læs hvis ikke i lager
      al  w1  3          ;     sæt write bit i coretable indgang */  
      jl. w3  (r12.)     ;  get_spool_segment(c_seg,c_base,3);       
      rs  w2  x3+q2      ;
      dl  w1  x3+q41     ;  restore w0,w1,w2;
      rl  w2  x3+q42     ;  
      jl      (x3+q43)   ;  return;

j0:   0                  ; saved return
j1:   -(:1<22:)-1        ;

e.  
    

\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...29...


 
;
; system menu coroutine kode
;

b. e10,i20,j7  w.        ;

d16:
u32:  rl. w3  (r38.)     ;
      al  w3  x3+1       ;  en mere aktiv sysm
      rs. w3  (r38).     ;
      jl. w3  d0.        ;  init_sysmenu(r);
      sn  w0  0          ;  if r<>0 then
      jl.     i1.        ;  begin
      rs. w0  j0.        ;
      am      (x3+q62)   ;
      rl  w2  f116       ;    w2:=tbuf.tdescr.cth;
      al  w2  x2+f26     ;    signal(cth,stop_sem);
      jl. w3  (r15.)     ;
      rl. w0  j0.        ;    if r=1 then
      se  w0  1          ;      goto error_area;
      jl.     i11.       ;    goto end_sysm;
      jl.     i10.       ;  end;

i0:   rl. w0  t19.       ; Error_and_gen_sysmenu:
      jl. w3  (r23.)     ;  write(<:en session fjernet:>);

i1:   jl. w3  d3.        ; gen_sysmenu:  gen_sysmenu;
      sh  w0  0          ;  if number_of_sessions=0 then
      jl.     i9.        ;  goto fin;
      al  w0  0          ;
      rs  w0  x3+q4      ;  lin:=0;
i2:   rl. w3  (r0.)      ; write_menu:
      rl  w1  x3+q4      ;
      jl. w3  d4.        ;  write_sysmenu(lin,s);
      se  w0  2          ;  if s<>2 then
      jl.     i13.       ;  goto error_halt;
i3:   rl  w1  x3+q82     ; next_char:  /* sæt cursor sidst på linien */
      al  w1  x1-3       ;  col:=max_col-3;
      rl  w2  x3+q83     ;  
      al  w2  x2-1       ;  lin:=max_lin-1;
      jl. w3  (r26.)     ;  cursor(col,lin,s);
      sz. w0  (j1.)      ;  if att i s then
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...30...

      jl.     i3.        ;  goto next_char;
      se  w0  2          ;  if s<>2 then
      jl.     i13.       ;  goto error_halt;
      al  w0  0          ;
      rs  w0  x3+q0      ;  timeoutcount:=0;
i16:  al  w0  0          ;  readchar med ingen timeout
      jl. w3  (r25.)     ; RD:   rd_char(c,s);
      am      (x3+q62)   ;  if tbuf.tdescr.th_stopped <> 0 then
      rl  w2  f115       ;  goto Error_and_gen_sysmenu;
      se  w2  0          ;
      jl.     i0.        ;
      so. w0  (j3.)      ;  if timeout i s then begin
      jl.     i15.       ;
      rl  w1  x3+q0      ;    timeoutcount:=timeoutcount+1;
      al  w1  x1+1       ;
      rs  w1  x3+q0      ;    if timeoutcount<=a4 then goto RD;
      sh  w1  a4         ;
      jl.     i16.       ;
i14:  la. w0  j2.        ; St: s:=s-timeout-att;
      rs  w0  x3+q6      ;
      al  w1  0          ;  
      rl  w2  x3+q83     ;  
      al  w2  x2-1       ;    lin:=max_lin-1;
      jl. w3  (r26.)     ;    cursor(0,lin,s);
      jl. w3  (r32.)     ;    erase(s);
      rl  w0  x3+q6      ;    goto error_halt;
      jl.     i13.       ;  end;
i15:  sz. w0  (j1.)      ;  if att i s then 
      jl.     i14.       ;    goto St;
i4:   se  w0  2          ;  if s<>2 then
      jl.     i13.       ;  goto error_halt;
      se  w1  (x3+q30)   ;  if c=r_arrow or
      sn  w1  (x3+q80)   ;    c=up_arrow then
      jl.     +4         ;  
      jl.     i5.        ;  begin
      rl  w1  x3+q4      ;    lin:=lin+1;
      al  w1  x1+1       ;    if lin=top_lin then lin:=0;
      sn  w1  (x3+q5)    ;
      al  w1  0          ;    goto write_menu;
      rs  w1  x3+q4      ;  end
      jl.     i2.        ;  else
i5:   se  w1  (x3+q31)   ;  if c=l_arrow or
      sn  w1  (x3+q81)   ;    c=up_arrow then
      jl.     +4         ;  
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...31...

      jl.     i6.        ;  begin
      rl  w1  x3+q4      ;
      al  w1  x1-1       ;    lin:=lin-1;
      rl  w2  x3+q5      ;
      al  w2  x2-1       ;    if lin<0 then lin:=top_lin-1;
      sh  w1  -1         ;
      al  w1  x2         ;    goto write_menu;
      rs  w1  x3+q4      ;  end;
      jl.     i2.        ;
i6:   jl. w3  d6.        ;  search_point(c,choice);
      sn  w2  0          ;  if choice=0 then
      jl.     i3.        ;  goto next_char;
      rl  w1  x2+2       ;  ac:=choice.action;
c.a88<4
      rs. w3  6          ;  *** test no 220 *******     
      jl. w3  (r37.)     ;  w0             w2 choice    
      h. 220 , 1<10  w.  ;  w1 action      w3 curco
      0                  ;
z.
      am.     (x1+4)     ;  case ac of
      jl.     x1+2       ;  begin
e0.  ; start  
e1.  ; password
e2.  ; new
e3.  ; remove
e4.  ; break
e5.  ; kill
e6.  ; att
e7.  ; disconnect terminal

                         ;  /* 0: start session */
e0:   rl  w2  x2+4       ;  begin
      am      (x3+q62)   ;
      rs  w2  f116       ;    tbuf.tdescr.cth:=choice.param;
e10:  al  w1  0          ; Start_current:
      rl  w2  x3+q83     ;  
      al  w2  x2-1       ;    lin:=max_lin-1;
      jl. w3  (r26.)     ;    cursor(0,lin,s);
      jl. w3  (r32.)     ;    erase(s);
      am      (x3+q62)   ;
      rl  w2  f116       ;    
      sn  w2  0          ;    if tbuf.tdescr.cth=0 then
      jl.     i0.        ;    goto Error_and_gen_sysmenu;
      al  w2  x2+f26     ;    signal(tbuf.tdescr.cth.stop_sem);
      jl. w3  (r15.)     ;  
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...32...

      rl  w2  x3+q62     ;
      rl  w0  x2+f116    ;    tbuf.tdescr.cur_th:=tbuf.tdescr.cth;
      rs  w0  x2+f103    ;
      jl.     i8.        ;  end;

e1:                      ;  /* 2: nyt password */
      jl. w3  d7.        ;  begin
      se  w0  2          ;    new_password(s);
      jl.     i13.       ;    if s<>2 then goto error_halt;
      jl.     i1.        ;    goto gen_sysmenu;
                         ;  end;

                         ;  /* 4: ny session */
e2:   jl. w3  d8.        ;  begin    new_session(cda,s);
      sn  w2  0          ;    if cda=0 then
      jl.     i1.        ;      goto gen_sysmenu;
      am      (x3+q62)   ;
      rs  w2  f116       ;    tbuf.tdescr.cth:=cda;
      am      (x3+q62)   ;
      rs  w2  f103       ;    tbuf.tdescr.cur_th:=cda;
      jl.     i8.        ;  end;

                         ;  /* 6: nedlæg session */
e3:   jl. w3  d9.        ;  begin
      se  w0  2          ;    remove_session(cda,s);
      jl.     i13.       ;    if s<>2 then goto error_halt;
      sn  w2  0          ;    if cda=0 then
      jl.     i1.        ;      goto gen_sysmenu;
      am      (x3+q62)   ;
      rs  w2  f116       ;    tbuf.tdescr.cth:=cda; goto start_current;
      jl.     e10.       ;  end;

                         ;  /* 8: ud af direct */
e4:   am      (x3+q62)   ;
      rl  w2  f116       ;  begin
      rl  w1  x2+f21     ;
      lo. w1  j4.        ;    tbuf.tdescr.cth.state.cont:=1;
      rs  w1  x2+f21     ;
      jl.     e10.       ;    goto start_current;
                         ;  end;

                         ;  /* 10: skip output */
e5:   am      (x3+q62)   ;
      rl  w2  f116       ;  begin
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...33...

      rl  w1  x2+f21     ;
      lo. w1  j5.        ;    tbuf.tdescr.cth.state.skip:=1;
      rs  w1  x2+f21     ;
      jl.     e10.       ;    goto start_current;
                         ;  end;

                         ;  /* 12: send att */
e6:   jl. w3  d12.       ;  begin
;     se  w0  2          ;    send_att(s););
;     jl.     i13.       ;    if s<>2 then goto error_halt;
      jl.     e10.       ;    goto start_current;
                         ;  end;

                         ;  /* 14: disconnect terminal */
e7:   am      (x3+q62)   ;  begin
      rl  w1  f116       ;    th := tbuf.tdescr.cth;
      jl. w3  (r43.)     ;    disconnect_terminal(th);
      jl.     e10.       ;    goto start_current;
                         ;  end;

i8:                      ;  end case;

i9:   al  w0  0          ; fin:
      rl  w2  x3+q62     ;
;     rl  w1  x2+f116    ;  if old_cth<>tbuf.tdescr.cth then
;     se  w1  (x3+q23)   ;   tbuf.tdescr.sender:=0;
      rs  w0  x2+f114    ;
      rl  w1  x3+q1      ; fin:
      jl. w3  (r17.)     ;  remove_spool_area(c_seg);
i10:  rl  w1  x3+q63     ; error_area:
      rl. w2  (r1.)      ;    
      jl. w3  (r18.)     ;  release_buffer_(tbuf.taddr,free_term);
i11:                     ; end_sysm:
      al  w1  x3         ;  get_from_session(
      jl. w3  (r19.)     ;    th,session,cda);
      al  w0  0          ;
      am      (x3+q62)   ;  tbuf.tdescr.cth:=0;
      rs  w0  f116       ;
      rl. w2  (r38.)     ;
      al  w2  x2-1       ;  en mindre aktiv sysm
      rs. w2  (r38).     ;
      al  w2  x3         ;  remove_coroutine(th); /* sig selv */
      jl. w3  (r28.)     ;

i13:  rl  w2  x3+q62     ; error_halt:
      rs  w0  x2+f113    ;  tbuf.tdescr.s:=s;
      rl  w2  x2+f116    ;
      sn  w2  0          ;  if tbuf.tdescr.cth = 0 then
      jl.     i0.        ;  goto Error_and_gen_sysmenu;
      sn  w0  2          ;  
      jl.     i17.       ;  if s<>2 then 
\f

;. tas 1.0 14.05.87        system menu coroutine      smtxt     ...34...

      rl  w0  x2+f21     ;    tbuf.tdescr.cth.state.finis:=1;
      lo. w0  j6.        ;
      rs  w0  x2+f21     ;
i17:  am      (x3+q62)   ;
      rs  w2  f103       ;  tbuf.tdescr.cur_th:=tbuf.tdescr.cth;
      al  w2  x2+f26     ;
      jl. w3  (r15.)     ;  signal(tbuf.tdescr.cth.stop_sem); /* start næste */
      jl.     i9.        ;  goto fin;

j0:   0                  ; r
j1:   1<16               ; att
j2:   -(:1<21+1<16:)-1   ; -att-timeout
j3:   1<21               ; timeout
j4:   p12                ; state.cont
j5:   p11                ; state.skip
j6:   p14                ; state.finis

e.

c.-1
l15:
z.

e.

 
▶EOF◀