|
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: 37632 (0x9300) Types: TextFile Names: »hcmtx«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦this⟧ »hcmtx«
b. a200,b100,c3,d41,h31 w.; ;.**************************************************************************** ; MASTER ;***************************************************************************** c0=-1 ; c0>0 for test and c0<0 for normal use of master c1=-c0 ; c1>0 for normal use c2=c1 ; c2>0 for rhmaster normal use c3=-c2*c1 ; c3>0 for hcmaster normal use ;. format of message buffer a40=-10 ; buffer state a38= -8 ; receiver<12+sender (computer numbers) a36= -6 ; process description addr for receiver other computer a34= -4 ; - - - - sender - - a32= -2 ; w2 a0 = 0 ; next buffer a2 = 2 ; prev buffer a4 = 4 ; receiver a6 = 6 ; sender ; i-o (normal) i-o (other com) mon call a8 = 8 ; message op<12 +mode 3<12 1<22+m_p_n a10= 10 ; - first address first addr w0 a12= 12 ; - last address last addr w1 a14= 14 ; - 1. segment first addr(oc) w2 a16= 16 ; - comp no w3 a18= 18 ; - mbuf-id a20= 20 ; answer: ip addr a22= 22 ; - result a49=a22-a40+2 ; buffer length ; ;. buffer state 0 normal message buffer ;; -1 copy buffer ; -2 mon call buffer ; -3 mirror buffer received from rhdriver ; -4 - - - - a proc at this computer ; (useal an answer) ; -5 address request(mbuf) ; -6 mbuf copy request ; -7 mbuf copy completed ; -8 mon call completed answer in receiver field ; -9 answer (buffer not transmitted) ; -10 a buffer containing a mbuf address ; -11 a child copy buffer ; -12 an answer mirror buf ; -13 a stop i. p. buff ; a194=-14 ; proc addr other computer a192=-12 ; proc type a190=-10 ; pda of master a188=-8 ; computer number.reciever < 12 + computer number.sender a134= 50 ; pda parent ; ; ; \f ;. all information among mon call is contained in mbufs: a56=-4 ; buffer address (to other computer) a57=-2 ; mbuf state a58=0 ; next mbuf a59=2 ; prev mbuf a60=4 ; buffer addr (this computer) a61=6 ; 1<22 + mon call number a62=8 ; saved w0 a63=10 ; w1 a64=12 ; w2 a65=14 ; w3 a66=16 ; name a67=18 ; a68=20 ; a69=22 ; a70=24 ; answer other computer a71=26 ; proc addr a72=28 ; parent name if no mirror parent exist a73=36 ; proc addr of mirror parent (if exist) a74=38 ; pda of mirror parent a80=40 ; other information about the call a99= 70 ; last mbuf a100=a99-a56 +2 ; mbuf length a101=a99-a61 ; copy length for mbuf ; ;. mbuf state = 0 free mbuf ;; 1 mon call not send to driver ; 2 mon call send to driver, no answer arrived ; 3 moncal send and an answer is arrived ; state>15 is moncall other computer ; 17 mbuf not received ; 18 mbuf received but not served ; 19 mbuf received and served but no answer is send ; ; ; contents of w1 area at create internal proc ; normal mirror ; 0 first addr first addr ; 2 last addr last addr ; 4 buf,area buf,area ; 6 internals internals ; 8 0 -8 (proc type) ; 10 max: upper max: upper ; 12 lower lower ; 14 std: upper std: upper ; 16 lower lower ; m. hcmaster start rl w3 66 \f rs. w3 h0. ; own proc desr addr dl w2 x3+24 ; rs. w1 h11. ; start of proc wa. w1 h22. ; start addr + program ds. w2 h23. ; bz w0 x3+28 ; w0:=int. claim ls w0 4 ; make room for wa w1 0 ; core table rs. w1 h24. ; first of free core ws w2 2 ; w2:=length of free core rl. w1 h22. ; w1:=first of core table rs w2 x1+2 ; save core length rl. w0 h24. ; rs w0 x1 ; first free ld w0 -100 ; al w1 x1+4 ; ds w0 x1+2 ; clear core table sh. w1 ( h24.) ; jl. -6 ; rl. w3 h14. ; al. w3 d41. wa. w3 h11. ; jd 1<11+0 ; set interrupt addr al. w1 h30. ; al. w2 h30. ; ds w2 x2+2 ; mbuf head:=mbuf head al. w1 h31. ; al. w2 h31. ; ds w2 x2+2 ; free mbuf head:=free mbufhead jl. w3 d40. ; goto chain free mbuf al w0 2 ; jd 1<11+32; set own process descr addr in monitor jd 1<11+28; set monitor mode al w0 6 ; rl. w3 h0. ; own pda hs w0 x3+104 ; set interrupt level = 6<12+29 al. w3 h2. ; jd 1<11+4 ; w0:=process descr addr(driver) rs. w0 h1. ; al. w3 h5. ; jd 1<11+4 ; mirror rl w1 0 ; address to w1 c. c0 ; al w0 5 ; rl. w3 h0. ; ds w0 x1+a192 ; set pda o.c. and mirror type z. ; c. c1 ; rs. w1 h6. ; c. c3 al w3 5 ; w3:=mirror type rl. w0 h0. ; w0:=pda master ds w0 x1+a190 ; al w2 0 ; jd 1<11+126; get buf rl. w3 h1. ; w3:=pda driver ds w0 x2+a10 ; save pda mirror, pda master rs w1 x2+a12 ; and pda mirror master in buf and al w1 x2 ; save buffer address al. w3 h2. ; jd 1<11+34; move buf to driver jd 1<11+24; wait event (answer) se w2 x1 ; if not answer from master o.c. then jl. -4 ; wait rl. w1 h6. ; else rl w0 x2+a16 ; set pda rs w0 x1+a194 ; of master oc in mirror master proc jd 1<11+26; jd 1<11+126; release and remove buff z. z. ; c. c2 ; al w2 0 ; jd 1<11+24; wait event (buffer from master o. c.) rl w0 x2+a10 ; w0:=pda hcmaster rs w0 x1+a194 ; save addr in rhmaster mirror rl. w0 h0. ; pda master rl. w3 h1. ; pda driver ds w0 x2+a16 ; to buf rs w1 x2+a18 ; pda master mirror this comp. to buf al w0 -4 ; rs w0 x2+a40 ; set buffer state to served mirrorbuf al. w3 h2. ; and jd 1<11+34; move buf to master z. \f b0: al w2 0 ; je. 2 ; jd 1<11+24; wait event jd. 2 ; se w0 0 ; if answer then jl. b20. ; goto b20 rl w0 x2+a40 sn w2 (x2) ; if buf is not removed se w2 (x2+2) ; then jd 1<11+26; get event (remove buff) rs w0 x2+a40 ; !!! rl w0 x2+a40 ; w0:=buffer state sn w0 0 ; if a normal buffer then jl. b10. ; goto b10 sn w0 -2 ; if mon call this computer then jl. b30. ; goto test mon-call se w0 -1 ; if copy buffer or sn w0 -4 ; served mirror buffer then jl. b12. ; goto b12 sn w0 -3 ; if mirror buffer (from driver) then jl. b35. ; goto b35 (move buffer to proc this computer) sn w0 -5 ; if mbuf address request from other computer then jl. b50. ; goto b50 else sn w0 -7 ; if mbuf from other computer then jl. b60. ; goto b60 sn w0 -8 ; if moncal completed (other computer) then jl. b70. ; goto b70 sn w0 -9 ; if refused buffer (with error) then jl. b20. ; goto b20 sn w0 -10 ; if mbuf address then jl. b40. ; sn w0 -11 ; if a child copy buf then jl. b21. ; goto b21 ; else (not possible) ; else message: ; move buf to driver \f b10: rl w1 x2+a4 ; w1:=receiver this computer (mirror proc) sh w1 0 ; ac w1 x1 ; sh w1 10 ; jl. b20. ; goto answer rl w3 x1+a194 ; w3:=receiver other computer (real proc) rs w3 x2+a36 ; to buf bz w3 x1+a188 ; w3:=computer number other computer hs w3 x2+a38 ; to buf rl w3 x2+a6 ; w3:=sender this computer rl w3 x3+a194 ; mirror.sender rs w3 x2+a34 ; to buf b12: al. w3 h2. ; w3:=driver jd 1<11+34; move buf to driver jl. b0. ; goto wait event b20: rl w3 x2+a40 ; w3:=buffer type sn w3 -13 ; if stop ip buf then jl. b76. ; goto b76 rl w1 x2+a6 ; w3:=sender sn. w1 ( h0.) ; if sender=master then jl. b85. ; goto remove buf and send answer al w0 x1+2 ; w0:=name addr jl. w3 d13. ; goto move name jd 1<11+34; move buf to sender jl. b0. ; and goto wait event b21: al w0 -1 ; change buffer state rs w0 x2+a40 ; to a normal copy buffer jl. b12. ; and return it to driver \f b30: ; monitor call(this computer) rl. w1 h31. ; w1:=first mbuf sn. w1 h31. ; if no more mbufs then jl. w3 b100. ; goto b100 rs. w1 h7. ; set current mbuf rs w2 x1+a60 ; save buffer addr jl. w3 d5. ; remove mbuf al. w2 h30. ; jl. w3 d4. ; insert mbuf rl w2 x1+a60 ; w2:=buf al w0 1 ; rs w0 x1+a57 ; set mbuf state rl w0 x2+a8 ; al. w3 h20. ; ws w3 2 ; wd. w3 h19. ; compute mbuf-id ba w3 0 ; hs w3 0 ; and save it in mbuf rs w0 x1+a61 ; 1<22+mon call number dl w0 x2+a12 ; ds w0 x1+a63 ; move saved w0,w1 dl w0 x2+a16 ; ds w0 x1+a65 ; move saved w2,w3 rl w3 x2+a16 ; w3:=saved w3 rl w0 x3+0 ; rs w0 x1+a66 ; move name rl w0 x3+2 ; rs w0 x1+a67 ; rl w0 x3+4 ; rs w0 x1+a68 ; rl w0 x3+6 ; rs w0 x1+a69 ; rl w3 x2+a6 ; w3:=sender sh w3 0 ; ac w3 x3 ; w3:=sender = parent rs w3 x1+a74 ; save pda of calling proc rl w0 x3+a194 ; w0:=parent mirror pda if it exist rs w0 x1+a73 ; se w0 0 ; if parent.mirror already exist then jl. b33. ; goto b33 rl w0 x3+2 ; else move parent name to mbuf rs w0 x1+a72+0 ; rl w0 x3+4 ; rs w0 x1+a72+2 ; rl w0 x3+6 ; rs w0 x1+a72+4 ; rl w0 x3+8 ; rs w0 x1+a72+6 ; b33: ; bz w0 x2+a8+1 ; w0:=mon call number se w0 62 ; if modify or sn w0 56 ; create internal proc then jl. b31. ; goto move param jl. b32. ; else goto move mbuf \f b31: rl w3 x2+a12 ; w3:=saved w1 rl w0 x3+0 ; move w1 area to mbuf rs w0 x1+a80+0 ; rl w0 x3+2 ; rs w0 x1+a80+2 ; rl w0 x3+4 ; rs w0 x1+a80+4 ; rl w0 x3+6 ; rs w0 x1+a80+6 ; rl w0 x3+8 ; rs w0 x1+a80+8 ; rl w0 x3+10 ; rs w0 x1+a80+10 ; rl w0 x3+12 ; rs w0 x1+a80+12 ; rl w0 x3+14 ; rs w0 x1+a80+14 ; rl w0 x3+16 ; rs w0 x1+a80+16 ; bz w0 x2+a8+1 ; w0:=mon call number se w0 56 ; if not create internal proc then jl. b32. ; goto b32 al w0 -8 ; else create internal mirror proc rs w0 x1+a80+8 ; al w3 x1+a66 ; w3:=name addr al w1 x1+a80 ; w1:=param addr jd 1<11+56; create se w0 0 ; if not created then jl. b77. ; send answer jd 1<11+4 ; else mirror proc addr rl. w1 h7. ; w1:=current mbuf rs w0 x1+a71 ; save mirror proc addr rl w2 0 ; w2:=pda of mirror proc al w3 5 ; w3:=type.mirror rl. w0 h0. ; w0:=master pda ds w0 x2+a190 ; proc.type:=mirror b32: al w2 0 ; jd 1<11+126; get an empty buffer rs w2 x1+a56 ; save buffer addr al w3 x1+a61 ; w3:=first of mbuf contents al w0 x3+a101 ; w0:=last of mbuf ds w0 x2+a12 ; al w0 5 ; ls w0 12 ; rs w0 x2+a8 ; save output mess al w0 -5 ; rs w0 x2+a40 ; rl w0 x1+a61 ; mbuf-if to rs w0 x2+a18 ; buffer al. w3 h2. ; name jd 1<11+34; move message to rhmaster(address request) jl. b0. ; and goto wait event \f b35: ; move mirror buffer to proc at this computer al w0 -4 ; change buffer state to moved mirror buf rs w0 x2+a40 ; rl w1 x2+a4 ; w0:=receiver sh w1 0 ; ac w1 x1 ; sn. w1 ( h0.) ; if rec. = master then jl. b49. ; b36: al w0 x1+2 ; jl. w3 d13. ; goto move name jd 1<11+34; move buffer se w0 0 ; if not receiver error then jl. b0. ; goto next event al w0 5 ; rs w0 x2+a4 ; send answer jl. b12. ;to sender other computer b40: ; answer to this proc: jl. w3 d8. ; search matching mbuf jl. b0. ; not found: goto b0 (impossible ?) rl w0 x1+a57 ; w0:=mbuf state se w0 1 ; if not waiting for mbuf address other computer then jl. b48. ; goto b48 al w0 2 ; rs w0 x1+a57 ; mbuf state:=2 al w0 -6 ; rs w0 x2+a40 ; buffer state:= al. w3 h2. ; move message to jd 1<11+34; to rhdriver jl. b0. ; and goto next event b48: se w0 19 ; if not served mbuf then jl. w3 b81. ; goto return buf rl w2 x1+a60 ; w2:=buf jl. b68. ; and goto complete the mon call stop ip b49: ; rl w1 x2+a6 ; w1:=sender rl w0 x1+a192 ; w0:=proc type se w0 5 ; if not mirror proc then jl. b36. ; goto b36 al w0 x2+a16 ; w0:=name addr jl. w3 d12. ; get pda sn w3 0 ; if no proc then jl. b36. ; goto b36 rl w0 x3 ; w0:=kind sn w0 0 ; if not ip then se w1 (x3+a134) ; if proc is not a child of sender then jl. b36. ; goto b36 al w0 -11 ; else set buf as child copy buf rs w0 x2+a40 ; rl w0 x3+22 ; w0:=first addr. child wa w0 x2+a14 ; rs w0 x2+a14 ; set first addr this comp. jl. b12. ; goto move buf \f b50: ; mbuf address request rl. w1 h31. ; sn. w1 h31. ; if all mbufs is occupied then jl. w3 b100. ; goto b100 rs w2 x1+a60 ; save buffer address al w0 x1+a61 ; rs w0 x2+a14 ; al w0 -10 ; set buffer state rs w0 x2+a40 ; to mbuf address jl. w3 d5. ; remove mbuf al. w2 h30. ; jl. w3 d4. ; insert mbuf rs. w1 h7. ; set current mbuf al w0 17 ; rs w0 x1+a57 ; mbuf-state:=17 rl w2 x1+a60 ; w2:=buf al. w3 h2. ; jd 1<11+34; send buffer to driver jl. b0. ; and goto get event \f b60: ; mbuf is received from o.c. jl. w3 d7. ; search matching mbuf jl. b0. ; not found: goto b0 (not possible ?) rs. w1 h7. ; save current mbuf rs w2 x1+a60 ; set buffer addr al w0 18 ; rs w0 x1+a57 ; set mbuf state c. c0 ; rl w0 x1+a66 ; rs w0 x1+a67 ; rl w0 x1+a72 ; rs w0 x1+a72+2 ; z. ; bz w0 x1+a61+1 ; w0:=moncall number am ( 0) ; case moncall of jl. -54 ; jl. b61. ; create internal proc jl. b62. ; start internal proc jl. b63. ; stop internal proc jl. b64. ; modify internal proc jl. b65. ; remove internal proc b61: ; create internal proc rl w0 x1+a73 ; w0:=pda parent.mirror sn w0 0 ; if parent.mirror not exist then jl. w3 d9. ; create one rl w3 x1+a73 ; sh w3 0 ; if not createt then jl. b67. ; then goto set result al w0 0 ; create internal proc rs w0 x1+a80+8 ; set create type rl w3 x1+a80+2 ; w3:=last o. c. ws w3 x1+a80+0 ; w3:=size-2 al w0 x3+2 ; w0:=wanted size jl. w3 d10. ; search core jl. b66. ; not found: goto answer 1 ds w0 x1+a80+2 ; found: save first and last al w3 x1+a66 ;name addr al w1 x1+a80 ; w1 area jd 1<11+56; create internal proc se w0 0 ; if result<>0 then jl. b67. ; goto set result al w2 ( 0) ; w2:=result jd 1<11+4 ; w0:=proc addr rl. w1 h7. ; w1:=curent mbuf rx w0 x1+a71 ; save proc addr, w0:=proc addr o. c. rl w3 x1+a71 ; w3:=proc addr this computer rs w0 x3+a194 ; set proc addr rl w0 x1+a73 ; w0:=parent.mirror rs w0 x3+a134 ; set parent al w0 x2 ; jl. b67. ; goto set result \f b62: ; start internal proc al w0 x1+a66 ; w3:=name addr jl. w3 d12. ; get pda c. c0 ; al w2 0 ; rx w2 x3-14 ; rs w2 x1+a80+18 ; z. ; rs w3 x1+a80+20 ; rl. w2 h0. ; own pda rx w2 x3+a134 ; set master as parent rs w2 x1+a80+22 ; al w3 x1+a66 ; w3:=name addr jd 1<11+58; start internal proc rl w3 x1+a80+20 ; pda rl w2 x1+a80+22 ; mirror parent rs w2 x3+a134 ; to proc c. c0 ; rl w2 x1+a80+18 ; rx w2 x3-14 ; z. ; jl. b67. ; goto set result b63: ; stop internal proc al w0 x1+a66 ; w3:=name addr jl. w3 d12. ; get pda c. c0 ; al w2 0 ; rx w2 x3-14 ; rs w2 x1+a80+18 ; z. ; rs w3 x1+a80+20 ; rl. w2 h0. ; w2:=own pda rx w2 x3+a134 ; set master as parent rs w2 x1+a80+22 ; al w3 x1+a66 ; w3:=name addr jd 1<11+60; stop internal proc se w0 0 ; if result<>0 then jl. b67. ; rs w2 x1+a56 ; save wait buffer addr al w0 -13 ; rs w0 x2+a40 ; set stp ip buffer type rl w3 x1+a80+20 ; rl w2 x1+a80+22 ; rs w2 x3+a134 ; set mirror parent c. c0 ; rl w2 x1+a80+18 ; rx w2 x3-14 ; z. ; jl. b0. ; goto wait result b64: ; modify internal proc al w0 x1+a66 ; w3:=name addr jl. w3 d12. ; get pda c. c0 ; al w2 0 ; rx w2 x3-14 ; rs w2 x1+a80+18 ; z. ; rs w3 x1+a80+20 ; rl. w2 h0. ; rx w2 x3+a134 ; change parent rs w2 x1+a80+22 ; al w3 x1+a66 ; name addr al w1 x1+a80 ; w1:=w1 area jd 1<11+62; modify internal proc rl. w1 h7. ; w1:=current mbuf rl w3 x1+a80+20 ; rl w2 x1+a80+22 ; rs w2 x3+a134 ; set mirror parent c. c0 ; rl w2 x1+a80+18 ; rx w2 x3-14 ; z. ; jl. b67. ; goto set result b65: ; remove internal proc al w3 x1+a66 ; w3:=name addr jd 1<11+4 ; rs w0 x1+a71 ; save proc addr rl. w2 h0. ; am ( 0) ; rs w2 a134 ; c. c0 ; al w2 0 ; am ( 0) ; rs w2 -14 ; am ( 0) ; rs w2 -12 ; z. ; am ( 0) ; dl w2 +24 ; first,last addr jd 1<11+64; remove internal proc jl. w3 d11. ; release core jl. b67. ; \f b66: al w0 1 ; result 1 b67: rl. w1 h7. ; w1:=mbuf b69: rl w2 x1+a60 ; w2:=buffer rs w0 x1+a70 ; save result rs w0 x2+a22 ; rl w0 x1+a71 ; move proc addr rs w0 x2+a20 ; to buf rl w0 x1+a73 ; pda of mirror parent rs w0 x2+a16 ; al w0 -8 ; rs w0 x2+a40 ; al w0 19 ; rs w0 x1+a57 ; set mbuf state b68: al. w3 h2. ; else send answer jd 1<11+34; driver jl. w3 d5. ; al. w2 h31. ; jl. w3 d4. ; insert mbuf in free chain jl. b0. ; and goto wait event b76: jl. w3 d8. ; search buf jl. b89. ; not found: remove buf jd 1<11+126; remove buf and jl. b69. ; and goto send answer to other computer \f b70: ; mon call this computer jl. w3 d8. ; search matching mbuf jl. b0. ; not found: goto b0 (not possible ?) bz w0 x1+a61+1 ; w0:=moncall number am ( 0) ; case moncall of jl. -54 ; jl. b71. ; create internal proc jl. b72. ; start internal proc jl. b73. ; stop internal proc jl. b74. ; modify internal proc jl. b75. ; remove internal proc b71: ; create internal mirror proc rl w0 x2+a22 ; w0:=result o.c. se w0 0 ; if result o.c. is not ok then jl. b75. ; goto remove proc this comp. rl w3 x2+a20 ; w3:=pda o.c. rl w0 x2+a16 ; w0:=pda of parent mirror o.c. rl w2 x1+a71 ; w2:=pda this comp. (mirror) rs w3 x2+a194 ; chain procs rl w3 x1+a74 ; w3:=pda of parent this comp. rs w0 x3+a194 ; chain parents rs w3 x2+a134 ; set parent in mirror proc rl w2 x1+a56 ; restore w2 jl. b78. ; goto set result b72: ; start internal proc c. -1 ; al w3 x1+a66 ; w3:=name addr jd 1<11+58; start internal proc z. ; jl. b78. ; goto set result b73: ; stop internal proc c. -1 ; al w3 x1+a66 ; w3:=name addr jd 1<11+60; stop internal proc am. ( h7.) ; rs w2 a80 ; z. ; jl. b78. ; goto set result b74: ; modify internal proc c. -1 ; al w3 x1+a66 ; w3:=name addr al w1 x1+a80 ; w1:=w1 area jd 1<11+62; modify internal proc z. ; jl. b78. ; goto set result b75: ; remove internal proc al w3 x1+a66 ; w3:=name addr jd 1<11+4 ; w0:= proc desr addr rl. w2 h0. ; set master as parent am ( 0) ; rs w2 a134 ; jd 1<11+64; remove internal proc \f b77: rl. w1 h7. ; w1:=mbuf rl w2 x1+a56 ; jl. b79. ; b78: al w0 0 ; b79: rl w3 x2+a22 ; ds. w0 h13. ; sh. w0 ( h12.) ; rl. w0 h12. ; w0:= highest result rl w2 x1+a60 ; w2:=buffer al. w1 h12. ; jd 1<11+22; send answer rl. w1 h7. ; w1:=current mbuf rl w2 x1+a56 ; jd 1<11+126; remove buff jl. w3 d5. ; al. w2 h31. ; jl. w3 d4. ; insert mbuf in free chain jl. b0. ; and goto wait event b85: jl. w3 d8. ; search matching mbuf jl. b86. ; not found: goto search mbuf-id jl. b87. ; found: goto send answer b86: jl. w3 d7. ; search matching mbuf-id jl. b89. ; not found: goto remove buf b87: rl w0 x2+a4 ; w0:=answer jl. b79. ; goto remove mbuf b89: jd 1<11+126; remove buf jl. b0. ; goto wait event b80: am 1 ;send answer in case of no free mbuf other computer b81: am 19 ; b100:jd -100 ;no free mbuf this computer jl. 0 ; jl. b0. ; \f m. var area ; h0: 0 ; own proc h1: 0 ; hc-hcdriver proc addr h2: <:rhdriver:>,0,0,0; h3: <:rhmaster:>,0,0,0; h4: 0,r.5 ; name area for receiver h5: <:rhmastermi:>,0 ; m. ma mi add h6: 0 ; pda mirror master o c. 0 ; first mbuf addr h8: 0 ; mbuf length h9: 0 ; h10: 0,r.5 ; h7: 0 ; current mbuf h11: 0 ; start of proc h12: 0 ; answer buf h13: 0 ; h14: d41 ; h15: 0,r.5 ; h18: <:hcmaster:>,0,0 ; h19: a49 ; mbuf length h22: a200 ; first of core table h23: 0 ; last of proc h24: 0 ; first free h30: 0,0 ; used mbuf head h31: 0,0 ; free mbuf head \f b. g5w. ; ;; insert a mbuf ; w1=element, w2=head ; return: w1,w2 unchanged, w3 prev element d4: ; rs. w3 g3. ; rl w3 x2+2 ; w2:=prev mbuf rs w1 x2+2 ; prev mbuf:=curr mbuf rs w1 x3+0 ; rs w2 x1+0 ; rs w3 x1+2 ; jl. ( g3.) ; return g3: 0 ; e. ; b. g5w. ; ;; remove a mbuf ; w1=element ; return: w1,w2 unchanged, w3=next element d5: ; rs. w3 g3. ; rl w3 x1+0 ; rx w1 x1+2 ; rs w3 x1+0 ; rx w1 x3+2 ; rs w1 x1+0 ; jl. ( g3.) ; g3: 0 ; e. ; ; ;; search mbuf in state>16 with mbuf-id = mbuf-id.buffer ; call: w2=buf, w3=return ; return0 w0 mbuf-if.buffer, w2,w3 unchanged, w1=mbuf chain head ; return2:w0 mbuf-if.buffer, w2,w3 - , w1=mbuf b. f5,g5 w. ; d7: al. w1 h30. ; rl w0 x2+a18 ; jl. f1. ; f0: sn w0 (x1+a61) ; if mbuf-id.buffer = mbuf-id.w1 then return2 else jl x3+2 ; return2 else f1: rl w1 x1 ; next mbuf se. w1 h30. ; jl. f0. ; jl x3 ; e. ; ; ;; call: w2=buf, w3=link ; return 0: w0,w2 unchanged w1=mbuf pool end ; 2: - - w1=mbuf ;. search mbuf with buffer address =w2 b. f5,g5 w. ; d8: ; al. w1 h30. ; mbuf pool head jl. f1. ; goto test mbuf pool end f0: sn w2 (x1+a56) ; if mbuf.buf=buf.w2 jl x3+2 ; then return 2 f1: rl w1 x1 ; else test mobuf pool end se. w1 h30. ; jl. f0. ; jl x3 ; e. ; \f ;; create mirror proc b. g5,f5 w. ; d9: ds. w2 g2. ; rs. w3 g3. ; al w3 x1+a72 ; name al. w1 g4. ; param addr c. c0 ; al w0 0 ; rs w0 x1+8 ; z. ; rl w0 x1+0 ; se w0 0 ; if param is init. then jl. f0. ; goto create al w0 x1-2 ; else ds w1 x1+2 ; else set first and last addr rl. w2 h0. ; w2:=own proc addr rl w0 x2+76 ; w0:=lower std base rs w0 x1+10 ; rs w0 x1+12 ; rs w0 x1+14 ; rs w0 x1+16 ; f0: jd 1<11+56; create proc rs. w0 g0. ; save result jd 1<11+4 ; w0:= proc addr rl. w1 g1. ; w1:=mbuf rs w0 x1+a73 ; save proc addr rl w2 0 ; w2:=pda rl w0 x1+a74 ; rs w0 x2+a194 ; rl. w0 h0. ; w0:=pda.master al w3 5 ; ds w0 x2+a190 ; proc.type:=mirror dl. w3 g3. ; jl x3 ; g0: 0 ; g1: 0 ; g2: 0 ; g3: 0 ; g4: ; 0 ; first addr 0 ; last 0 ; buf,area 0 ; ip,func -8 ; pr,pk (create mirror) 0 ; lower max base 0 ; upper - - 0 ; lower std - 0 ; upper - - e. ; \f ;; get free core ; call: w0=core length w3=return ; return0: no free core or too short core left w1,w2 unchanged ; return2: w3=first of core,w0=last of core, w1,w2 unchanged ; the free core is chained in a table as follews: ; 1. word 2. word ; next core length of free core b. f10,g9 w. ; d10: ds. w1 g1. ; ds. w3 g3. ; rl. w3 h22. ; w3:=first of core table f0: dl w2 x3+2 ; w1:=first addr, w2:=length sn w2 0 ; if no more left then jl. f10. ; goto return0 sl. w2 ( g0.) ; if core size>=wanted core size then jl. f1. ; goto f1 al w3 x3+4 ; else goto to next in table jl. f0. ; f1: al w0 x1 ; w0:=first addr se. w2 ( g0.) ; if current core size>wanted core size then jl. f4. ; goto f4 (cut of) f2: dl w2 x3+6 ; ds w2 x3+2 ; compress core table al w3 x3+4 ; se w2 0 ; if not end of table then jl. f2. ; goto move next jl. f9. ; goto return2 f4: ws. w2 g0. ; w2:=core left wa. w1 g0. ; w1:=new first addr ds w2 x3+2 ; f9: dl. w2 g2. ; rl. w3 g3. ; al w3 x3+2 ; rs. w3 g3. ; rl. w3 g0. ; wa w3 0 ; al w3 x3-2 ; rx w0 6 ; jl. ( g3.) ; f10: dl. w2 g2. ; jl. ( g3.) ; return0 g0: 0 ; g1: 0 ; g2: 0 ; g3: 0 ; e. ; \f ;; return free core ; call: w1=first addr, w2=last addr, w3=return addr ; return: all reg unchanged b. f5,g5 w. ; d11: ds. w1 g1. ; ds. w3 g3. ; ws w2 2 ; al w0 x2+2 ; w0:=size rl. w3 h22. ; w3:=first of core table f0: dl w2 x3+2 ; w1:=first addr, w2:=length se w2 0 ; if end of table or sl. w1 ( g1.) ; first addr.curr core >=first addr.call then jl. f1. ; goto f1 al w3 x3+4 ; else jl. f0. ; goto next f1: ws w1 0 ; se. w1 ( g1.) ; jl. f2. ; wa w2 0 ; ds w2 x3+2 ; set new first addr and size jl. f4. ; goto return f2: ds. w2 g5. ; save curr core rl. w1 g1. ; new first addr rl w2 0 ; new size ds w2 x3+2 ; f3: al w3 x3+2 ; dl w2 x3+2 ; move table rx. w1 g4. ; rx. w2 g5. ; ds w2 x3+2 ; se w2 0 ; if more to move then jl. f3. ; goto f3 f4: dl. w1 g1. ; dl. w3 g3. ; jl x3 ; g0: 0 ; g1: 0 ; g2: 0 ; g3: 0 ; g4: 0 ; g5: 0 ; e. ; \f ;; get pda ; call: w0= name addr, w3=return addr ; return: w0,w1,w2 unchanged, w3=pda if any b. f5,g5 w. ; d12: ds. w1 g1. ; ds. w3 g3. ; rl w3 0 ; w3:=name addr sl. w3 ( h11.) ; if name addr sl. w3 ( h23.) ; outside proc then jl. w3 d13. ; move name to this proc (h4) jd 1<11+4 ; get pda dl. w2 g2. ; rx w3 0 ; jl. ( g3.) ; g0: 0 ; g1: 0 ; g2: 0 ; g3: 0 ; e. ; ;; move name from (w0) to h4 ; call: w0=name addr, w3=return addr ; return: w0,w1,w2 unchanged, w3=name addr b. g5,f5 w. ; d13: ds. w1 g1. ; ds. w3 g3. ; al. w3 h4. ; rl w2 0 ; w2:=name addr dl w1 x2+2 ; move name ds w1 x3+2 ; dl w1 x2+6 ; ds w1 x3+6 ; dl. w2 g2. ; rl. w0 g0. ; jl. ( g3.) ; g0: 0 ; g1: 0 ; g2: 0 ; g3: 0 ; e. ; \f b. f5,g5 w. ; d40: ; ;; set up chain with free mbufs rs. w3 g3. ; al w0 0 ; al. w2 h31. ; w2:=head al. w1 h20. ; w1:=first f0: jl. w3 d4. ; chain mbuf rs w0 x1+a57 ; set mbuf-state al w1 x1+a100 ; w1:=next mbuf sh. w1 h21. ; jl. f0. ; jl. ( g3.) ; g3: 0 ; e. ; 0,r.2 ; m. mbuf start ; h. ; h20: 0,r.(:a100*8:) ; h21: 0,r.a100 ; w. ; \f b. g11,f10 w. ; program interrupt g0=8 ; number of reg. g1=9 ; number of digits per reg m. reg dump start d41: 0,r.g0 ; register values m. reg dump end gg 66,r.4 je. 0 al w1 32 ; al. w2 g8. ; first of buff f1: rs w1 x2 ; al w2 x2+2 ; se. w2 g9. ; jl. f1. ; al. w1 d41. ; w1:= addr of first reg val al. w2 g8. ; al w2 x2-2 ; rs. w2 g7. ; f2: rl. w2 g7. ; w2 := al w2 x2+(:g1<1:); next in buff rs. w2 g7. ; al w3 32 ; rl w0 x1 ; sn. w1 d41.+10; if ic then ws. w0 h11. ; w0:=relative ic sl w0 0 ; if val >= 0 then jl. f3. ; goto f3 al w3 x3+13 ; ac w0 ( 0) ; f3: rs. w3 g6. ; f4: al w3 0 ; wd. w0 g3. ; w3:= next digit al w3 x3+48 ; rs w3 x2 ; al w2 x2-2 ; se w0 0 ; if more digits then jl. f4. ; goto f4 rl. w3 g6. ; else rs w3 x2 ; set sign al w1 x1+2 ; w1:=next reg addr sh. w1 d41.+(:(:g0-1:)<1:); if all reg val is coverted then jl. f2. ; goto f2 al. w3 g8. ; al. w2 g9. ; output buffer f6: rl w1 x3 ; ls w1 8 ; lo w1 x3+2 ; ls w1 8 ; lo w1 x3+4 ; w1:= next 3 digits rs w1 x2 ; al w2 x2+2 ; al w3 x3+6 ; se. w3 g9. ; jl. f6. ; al. w1 g4. ; w1:= mess area al. w2 g9. ; first of buff al. w3 g10. ; last of buff ds w3 x1+4 ; al. w3 g5. ; jd 1<11+16; al. w1 g11. ; jd 1<11+18; dl. w1 d41.+2 ; dl. w3 d41.+6 ; jl. ( d41.+10); return to program g3: 10 ; g4: 5<12+0 ; mess 0,r.7 ; g5: <:terminal28:>,0,0; g6: 32 ; sign g7: 0 ; buffer position g8: 0,r.(:g0*g1:) ; g9: 0,r.(:g0*g1/3:) ; g10: 10<16 ; g11: 0,r.8 ; e. ; a200=k m. end of hcmaster e. ▶EOF◀