|
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: 93696 (0x16e00) Types: TextFile Names: »phtxt «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer └─⟦39138f30b⟧ └─⟦this⟧ »phtxt «
\f ; tas 1.0 14.05.87 pool handler coroutine phtxt ...1... ;******************************************************************** ;********************* 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 ;; \f ; tas 1.0 14.05.87 rcmenu phtxt ...2... ; ; 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, r50, o10 ; begin pool handler coroutine w. m.pool handler 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 rs. w3 6 ; *** test no 254 ******* jl. w3 (r44.) ; w0 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 sn w0 0 ; jl. i0. ; <> 0 /* internel process */ se w0 84 ; <> 84 /* subproc perm link */ sn w0 85 ; <> 85 /* subproc temp link */ jl. i0. ; <> 8 /* csp terminal */ se w0 8 ; <> 28 /* gin/gout på adp */ sn w0 28 ; then jl. 4 ; goto ERR3; jl. i12. ; i0: se w0 64 ; if tpda.kind = 64 /* pseudo process */ jl. i23. ; begin rl. w0 (r43.) ; if ps owner = own pda then se 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 ks -998 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 252 ******* 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.) ; 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. wa. w0 j0. ; 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; 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, ;ks -600 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. i15,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; 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. i13. ; 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 i13: al w0 3 ; ctrl_result:=3; rs w0 x3+q64 ; i6: 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 , 0 w. ; c75 max create link messages ; end init list ; 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,j10 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 outatt 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; al w0 15 ; in_mode:=in_mode extract 4; la w0 x2+q32 ; 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+14 ; wa w2 x3+q33 ; copy(hw_count, buf, addr(op.data)+op_used,r); jl. w3 d11. ; rl w2 x3+q42 ; 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: 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 ; e. ; procedure output; ; ; behandler en output 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 = 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<6 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: 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 ; 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. ; 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+4 ; rs w1 x2+4 ; 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 ; 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. ; ds w1 x3+q42 ; mode:=buf.mode + 3<12; 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. 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. ; 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; \f ;. tas 1.0 14.05.87 pool handler coroutine phtxt ...44... i2: rs w1 x3+q41 ; 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 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. jl. w3 d8. ; 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 jl. w3 d11. ; 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. jl. w3 d8. ; 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 jl. w3 d11. ; 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. jl. w3 d8. ; 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 ; c.a88<6 rs. w3 6 ; *** test no 274 ******* jl. w3 (r44.) ; w0 state w2 return h. 274 , 1<6 w. ; w1 w3 curco 0 ; z. 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 ; ;ks -601 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); 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; ;ks -602 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. ; 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 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 ; 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; c.a88<6 rs. w3 6 ; *** test no 280 ******* jl. w3 (r44.) ; w0 opcode w2 buf h. 280 , 1<6 w. ; w1 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. w3 d13. ; goto SA al w0 x3 ; /* sæt ph,th i answer, bruges i test */ rl w1 x3+q3 ; ds w1 x3+q8+8 ; 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); 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. i15. ; begin rl w0 x2+14 ; terminal_data(buf.localid); jl. w3 d21. ; goto SA; jl. i14. ; end i15: al w0 3 ; rs w0 x3+q30 ; result:=3 i14: al w0 0 ; SA: att:=0; i17: rs. w0 j2. ; 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 ; e. c.-1 l17: z. e. ▶EOF◀