|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 101376 (0x18c00)
Types: TextFile
Names: »phtxt «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer
└─⟦40b1eb8cd⟧
└─⟦this⟧ »phtxt «
\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◀