|
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: 35328 (0x8a00) Types: TextFile Names: »monmaster«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦84635a524⟧ »kkmon4filer« └─⟦this⟧
\f m. monmaster - hcmasterprocess b.i30 w. i0=80 12 30, i1=12 00 00 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; c.i0-a133 c.i0-a133-1, a133=i0, a134=i1, z. c.i1-a134-1, a134=i1, z. z. i10=i0, i20=i1 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 i2:<: date :> (:i15+48:)<16+(:i14+48:)<8+46 (:i13+48:)<16+(:i12+48:)<8+46 (:i11+48:)<16+(:i10+48:)<8+32 (:i25+48:)<16+(:i24+48:)<8+46 (:i23+48:)<16+(:i22+48:)<8+46 (:i21+48:)<16+(:i20+48:)<8+ 0 i3: al. w0 i2. ; write date: rs w0 x2 +0 ; first free:=start(text); al w2 0 ; jl x3 ; return to slang(status ok); jl. i3. ; e. j. s. c70,d70 w. b127=k,c70,k=k-2 ; c69=k ; systrm ; s. a50,h20,i20 w. ; format of message buffer a40=-10 ; message buffer address(other computer) or result 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 ; - a20= 20 ; - a22= 22 ; - ; ; format of message to another computer: ; ; do w(i) addr ; ; w(i): 1<23 + 0<3 + 2.000 hresponse ok ; 1<23 + 0<3 + 2.010 hresponse not ok ; 1<23 + addr<3 + 2.100 message buffer address ; 1<23 + op<3 + 2.110 immediately operation without hresponce ; rl w3 66 ; rs. w3 h7. ; own proc desr addr al w0 4 ; jd 1<11+32; set own process descr addr in monitor jd 1<11+28; set monitor mode al. w3 h10. ; jd 1<11+4 ; w0:=process descr addr(master) rs. w0 h6. ; i0: al w2 0 ; jd 1<11+24; wait event rl. w3 h2. ; se w3 0 ; if wait hresponce then jl. i0. ; goto wait else se w0 0 ; if not message then jl. i2. ; goto i2 rs. w2 h2. ; else save buf addr rl w3 x2+a4 ; w3:=receiver bz w1 x2+a38 ; w1:=receiver (other computer) sn. w3 (h6.) ; if receiver=masterproc then bz w2 x2+a8 ; w2:=operation else w2:=buffer address ls w1 3 ; wa. w1 h1. ; w1:=sender addr (as device addr) ls w2 3 ; sn. w3 (h6.) ; if receiver = masterprocess then am 2 ; immediately operation lo. w2 h3. ; hmess i1: do w2 x1 ; send hmess sx 2.111 ; if buserror then jl. i3. ; goto i3 else jl. i4. ; goto i4 i3: rl. w0 h8. ; w0:=counter ba. w0 1 ; counter:=counter+1; rs. w0 h8. ; save counter sh w0 10 ; if counter<=10 then jl. i1. ; repeat data out jl. i7. ; else goto result 2 i4: se. w3 (h6.) ; if receiver<>masterproc then jl. i0. ; goto wait jl. i9. ; return buffer i2: se w0 6 ; if not hresponse then jl. i0. ; goto i0. se. w2 (h5.) ; if hresponse not ok then jl. i7. ; goto result 2 rl. w2 h2. ; w2:=buf jl. i11. ; goto movebuf i7: rl. w2 h2. ; w2:=buf rl w1 x2+a4 ; w1:=receiver se. w1 (h7.) ; if receiver<>this proc then jl. i10. ; goto i10 jd 1<11+26; get event al w0 3 ; result=3 (unintelligible) al. w1 h9. ; mess addr jd 1<11+22; send message jl. i12. ; goto i12 i9: am -3 ; result=1 (command is sended) i10: am 1 ; set result 4 i11: al w0 1 ; set result 3 al. w3 h10. ; jd 1<11+34; move buf to master proc i12: al w0 0 ; rs. w0 h2. ; clear buffer addr rs. w0 h8. ; clear counter jl. i0. ; goto wait h1: 1<23 + 0<3 + 2.101; send hmess h2: 0 ; buffer addr h3: 1<23 + 0<3 + 2.100; hmess h4: 1<23 + 0<3 +2.110 ; immediately operation h5: 1<23 + 0<3 +2.010 ; h7: 0 ; own proc descr addr h8: 0 ; counter for max data out error h9: 0,r.8 ; message h6: 0,0 h10: <:hcmaster:>,0,0,0,0 e. ; c68=k ; sysrec ; s. a50,h20,i20 w. ; format of message buffer a50=-10 ; top of buffer a40=-10 ; message buffer address(other computer) or result 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 ; - a20= 20 ; - a22= 22 ; - a49=a22-a50 ; buffer size ; ; ; format of message arrived in fifo(this computer) ; ; 1<23 +addr<3 +2.100 message buffer address ; 1<23 +aadr<3 +2.110 answer buffer address ; ; rl w3 66 ; rs. w3 h10. ; own process al w0 6 ; jd 1<11+32; set own process desription address in monitor jd 1<11+28; set monitor mode di. w1 (h14.) ; w1:=own computer number rs. w1 h17. ; i0: al w2 0 ; rs. w2 h11. ; counter:=0; jd 1<11+24; wait event se w0 6 ; if not hmess then jl. i3. ; goto i3. ds. w2 h8. ; save(sender,hmess) sz w2 2.100 ; if not message or answer then am 2.010 ; set hresponse error else al w3 2.000 ; hresponse ok wa. w3 h4. ; set hresponse ls w1 3 ; wa. w1 h0. ; w1:= 1<23 +dev<3 +2.101 i1: do w3 x1 ; send message to other computer sx 2.111 ; if buserror then jl. i5. ; goto i5 else jl. i2. ; goto i2 i5: rl. w0 h11. ; w0:=counter ba. w0 1 ; counter:=counter+1; rs. w0 h11. ; sh w0 10 ; if counter<10 then jl. i1. ; repeat data out else jl. i0. ; goto wait i2: dl. w2 h8. ; load(sender,hmess) rs. w1 h8. ; h8:=sender ls w2 1 ; ls w2 -4 ; w2:=buffer address al w2 x2+a50 ; w2:=first of buff rs. w2 h7. ; al. w1 h15. ; mess addr al. w3 h16. ; name jd 1<11+16; catch buff al w1 x2+a50 ; first address al w2 x2+a22 ; last address ds. w2 h6. ; al. w1 h5. ; sendmessage(message, al. w3 h19. ; <:sysdma:>,buff) jd 1<11+16; jl. i0. ; goto wait i3: se w0 1 ; if not answer then jl. i4. ; goto i4 al. w3 h18. ; w3:=master proc jd 1<11+34; movebuff to master proc jl. i0. ; goto wait i4: se w0 0 ; if not message then goto wait jl. i0. ; rl w1 x2+a4 ; w1:=receiver sn. w1 (h10.) ; if receiver is not this proc then jl. i0. ; goto wait jd 1<11+26 ; get event (release buffer) jl. i0. ; goto wait h0: 1<23 + 0 <3 + 2.101; start dma trans h4: 1<23 ; h5: 3<12 ; mess: input 0 ; first address (this computer) h6: 0 ; last address (this computer) h7: 0 ; first address (other computer) h8: 0,r.3 ; computer number (other computer) h9: 1<23 + 0 <3 + 2.001; start dma input command h10: 0 ; own process descr addr h11: 0 ; counter for max data out repeat h14: 1<23 + 0 <3 + 2.111; h15: 0,r.8 ; pseudo message h16: 0,r.5 ; - name h17: 0 ; h18: <:hcmaster:>,0,0 h19: <:sysdma:>,0,0,0 e. c67=k ; sysdma ; ; format of input message to other computers ; mess +0 3<12 ; +2 first address (this computer) ; +4 last address (this computer) ; +6 first address (other computer) ; +8 computer number (other computer) s. a50,h20,i20 w. ; format of message buffer a40=-10 ; message buffer address(other computer) or result 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 ; - a20= 20 ; - a22= 22 ; - rl w3 66 ; rs. w3 h10. ; own process al w0 8 ; jd 1<11+32; set own process description address in monitor jd 1<11+28; set monitor mode i0: al w2 0 ; jd 1<11+24; wait event rl. w3 h11. ; w3:=buffer addr sn w0 8 ; if dma-transfer completed then jl. i1. ; goto i1. sn w0 0 ; if not message se w3 0 ; or wait dma-transfer completed then jl. i0. ; goto i0 bz w0 x2+a8 ; w0:=message type se w0 3 ; if not input message then jl. i3. ; goto result 3 rs. w2 h11. ; save buffer address rl w0 x2+a16 ; w0:=other computer number rl w1 x2+a12 ; w1:=last addr ws w1 x2+a10 ; w1:=last addr-first addr al w1 x1+2 ; w1:=number of halfwords to transfer sh w1 0 ; if nothing to transfer then jl. i3. ; then goto result 3 ds. w1 h1. ; else set dma input message rl w1 x2+a10 ; w1:=first addr (this computer) rl w0 x2+a14 ; w0:=first addr (other computer) ds. w1 h3. ; al. w3 h1. ; input message address ls w3 3 ; wa. w3 h4. ; w3:=1<23+addr<3+2.010 do x3 ; start dma-transfer sx 2.111 ; if buserror then jl. i2. ; goto result 2 jl. i0. ; else goto wait i1: sn w3 0 ; if no waiting buffer then jl. i0. ; goto wait am -1 ; result 1 i2: am -1 ; result 2 i3: al w0 3 ; result 3 rl. w2 h11. ; buffer addr jd 1<11+26; get event se w0 1 ; if not result ok then jl. i7. ; goto to send answer rs. w0 h8. ; rl. w1 h1. ; w1:=number of halfwords rs. w1 h6. ; ls w1 -1 ; w1:=number of words transfered wm. w1 h9. ; w1:=number of chars rs. w1 h7. ; rl. w0 h8. ; w0:=result i7: al. w1 h5. ; w1:=message address jd 1<11+22; send answer al w2 0 ; rs. w2 h11. ; ready jl. i0. ; goto wait 0 ; used (cpu) h0: 0 ; number (other computer) h1: 0 ; number of halfwords to transfer h2: 0 ; first address (other computer) h3: 0 ; first address (this computer) h12: 20 ; interrupt level h4:1<23 + 0 <3 + 2.010 ; device address h5: 0 ; answer: status h6: 0 ; halfwords h7: 0 ; chars h8: 0 ; h9: 3 ; constant h10: 0 ; own process h11: 0 ; bufferaddress or zero for no waiting buffer e. \f c66=k ; start of hcmaster rl. w0 d11. ; rl. w1 d11. ; jd 1<11+38 ; set clock al. w3 d0. rs w3 100 jl. w3 d0. ; dump core al w3 2047 ; ls w3 6 ; al w3 x3-1 ; sl w3 0 ; wait jl. -4 ; al. w1 d23. ; al. w3 d25. ; jl. w2 d1. ; send message(clock) al. w1 d26. ; param addr al. w3 d27. ; process name addr jd 1<11+56; create child process jl. w3 d0. ; save al. w3 d27. ; al. w1 d28. ; reg area jd 1<11+62; modify ip jl. w3 d0. ; save al. w3 d27. ; jd 1<11+58; start ip jl. w3 d0. ; save al. w3 d27. ; jd 1<11+64; remove jl. w3 d0. ; save d10:jl -1 ; hard stop b. i10 w. d1: rs. w2 i0. ; save(return) jd 1<11+16; send message jl. w3 d0. ; dump core al w1 x1+10 ; jd 1<11+18; wait answer jl. w3 d0. ; dump core jl. (i0.) ; return i0: 0 e. b. i10 w. d0: am. (i0.) ; ds w1 2 ; am. (i0.) ; ds w3 6 ; save(w0,w1,w2,w3) al w1 8 ; i5: dl w0 x1+2 ; am. (i0.) ; ds w0 x1+2 ; al w1 x1+4 ; sh w1 199 ; jl. i5. ; wa. w1 i0. ; rs. w1 i0. ; dl w3 x1-194 ; dl w1 x1-198 ; jl x3 ; return d11: i0: 20000 ; e. d23: 2,0,5000,0,0 ; message d24: 0,r.8 d25: <:clock:>,0,0,0,0 d26: c60 ; + 0 first addr. c61 ; + 2 last addr h. 4,0 ; + 4 buff,area 0,8.7777 ; + 6 ip,func. mask 0,0 ; + 8 pr,pk w. 10000 ; +10 max lower base 20000 ; +12 max upper base 10000 ; +14 std lower base 20000 ; +16 std max base d27: <:hcchild:>,0,0,0 d28: 0,0,0,0 ; w0,w1,w2,w3 0 ; exc. reg c60 ; ic 0,r.20 c60=k ; hcchild al w2 0 ; jd 1<11+24; wait event c61=k b. i24 w. ; table of preoccupied claims: ; mess buf area internal i0=1 , i1=0 , i2=1 ; proc func i3=6 , i4=0 , i5=1 ; std driver, systrm, sysrec, sysdma i6=a5-i0-24 , i7=0 , i8=a3-i2-3 ; hcmaster i10: rs. w3 i12. ; save return to autoloader; al. w3 d0. rs w3 100 ; process description for process functions: ; ; rel address contents rl w1 (b6) ; proc := first internal; jl. w2 i18. ; init description; a48 , a107 ; interval low a49 , a108 ; - high a11 , 0 ; name 0 : zero a11+2 , <:pro:> ; name 2-6: <:procfunc> a11+4 , <:cfu:> ; a11+6 , <:nc:> ; a17 , b60-b60+8 ; first address a18 , b61 ; top address a301 , 0 ; priority a26 , a89 ; interrupt mask a27 , b62 ; user exception address a170 , 0 ; user escape address a32 , 0 ; status = not monitor mode a33 , b63 ; ic = waiting point a182 , 0 ; base = no relocation a183 , 8 ; lower write limit = first core ;*** a184 , core size ; top write limit: special a185 , 6<12+b54 ; interrupt levels a42 , a107 ; catalog base low a43 , a108 ; - - high a44-2 , a107 ; max interval low a44 , a108 ; - - high a45-2 , a107 ; std - low a45 , a108 ; - - high a302 , 0 ; save area address a10 , 0;(end of words) ; kind = 0 a12 , 0 ; stop count a13 , a102 ; state = waiting for message a19 , i0 ; buf claim a20 , i1 ; area claim a22 , 8.7777 ; function mask a10 , 0;(end of bytes) ; (kind = 0) rs w0 x1+a184 ; top write limit(proc func) := core size; ; process description for std driver al w1 x1 +a4 ; proc := next internal; jl. w2 i18. ; init description; a48 , a107 ; interval low a49 , a108-1 ; - high a11 , <:dri:> ; name = <:driver proc:> a11+2 , <:ver:> ; a11+4 , <:pro:> ; a11+6 , <:c:> ; a17 , 8 ; first address a18 , b60 ; top address a301 , -1 ; priority a26 , a89 ; interrupt mask a27 , b87 ; user exception address a170 , 0 ; user escape address a171 , b60 ; initial cpa a172 , 0 ; - base a173 , 8 ; - lower write limit a174 , b60 ; - upper - - a175 , 6<12+b54 ; - interrupt levels a32 , 0 ; status = not monitor mode a33 , b85 ; ic = central waiting point a34 , 0 ; parent = undef a181 , b60 ; current cpa a182 , 0 ; - base a183 , 8 ; - lower write limit a184 , b60 ; - upper - - a185 , 6<12+b54 ; - interrupt levels a42 , a107 ; catalog base low a43 , a108-1 ; - - high a44-2 , a107 ; max interval low a44 , a108-1 ; - - high a45-2 , a107 ; std interval low a45 , a108-1 ; - - high a302 , b86 ; save area address a10 , 0 ;(end of words) ; kind = 0 a12 , 0 ; stopcount a13 , a95 ; state = running a19 , i3 ; buf claim a20 , i4 ; area claim a21 , i5-1 ; internal claim a24 , 1<7 ; (protection register) a25 , 0 ; (protection key) a22 , 8.7777 ; function mask a10 , 0 ;(end of bytes) ; (kind = 0) ; process description for initial operating system, s al w1 x1 +a4 ; proc := second internal; jl. w2 i18. ; init description; a48 , a107 ; interval low a49 , a108 ; - high a11 , <:hcm:> ; name = <:hcmaster:> a11+2 , <:ast:> ; a11+4 , <:er:> ; a11+6 , 0 ; a17 , c66 ; first address ;*** a18 , core size ; top address a301 , 0 ; priority a26 , a89 ; interrupt mask a27 , d10 ; user exception address a170 , 0 ; user escape address ;*** a171 , core size ; initial cpa a172 , 0 ; - base a173 , 8 ; - lower write limit ;*** a174 , core size ; - upper - - a175 , b54<12+b54 ; - interrupt levels a32 , 0 ; status = not monitor mode a33 , c66 ; ic = start init a34 , 0 ; parent = undef ;*** a181 , core size ; current cpa a182 , 0 ; - base a183 , 8 ; - lower write limit ;*** a184 , core size ; - upper - - a185 , b54<12+b54 ; - interrupt levels a42 , a107 ; catalog base low a43 , a108-1 ; - - high a44-2 , a107 ; max interval low a44 , a108-1 ; - - high a45-2 , a107 ; std interval low a45 , a108-1 ; - - high a302 , 0 ; save area address a10 , 0;(end of words) ; kind = 0 a12 , 0 ; stopcount a13 , a95 ; state = running a19 , i6 ; buf claim a20 , i7 ; area claim a21 , i8-1 ; internal claim a24 , 1<7 ; (protection register, for compatibility reasons) a25 , 0 ; (protection key, for compatibility reasons) a22 , 8.7777 ; function mask a10 , 0;(end of bytes) ; (kind = 0) rs w0 x1+a18 ; top address(s) := rs w0 x1+a171 ; initial cpa(s) := rs w0 x1+a174 ; initial upper write limit(s) := rs w0 x1+a181 ; current cpa(s) := rs w0 x1+a184 ; current upper write limit(s) := core size; ; process description for systrm: ; ; rel address contents al w1 x1 +a4 ; proc := next internal; jl. w2 i18. ; init description; a48 , a107 ; interval low a49 , a108-1 ; - high a11 , <:sys:> ; name 0-4 : <:systrm:> a11+2 , <:trm:> ; a11+4 , 0 ; a11+6 , 0 ; a17 , c69 ; first address a18 , c68-2 ; top address a301 , 0 ; priority a26 , a89 ; interrupt mask a27 , 0 ; user exception address a170 , 0 ; user escape address ;*** a171 , core size ; initial cpa a172 , 0 ; initial base a173 , c69 ; initial lower write linit a174 , c68-2 ; initial upper write limit a175 , b54<12+b54 ; interrupt levels a32 , 0 ; status = not monitor mode a33 , c69 ; ic = waiting point ;***a181 , core size ; current cpa a182 , 0 ; current base a183 , c69 ; lower write limit a184 , c68-2 ; top write limit a185 , b54<12+b54 ; interrupt levels a42 , a107 ; catalog base low a43 , a108-1 ; - - high a44-2 , a107 ; max interval low a44 , a108-1 ; - - high a45-2 , a107 ; std - low a45 , a108-1 ; - - high a302 , 0 ; save area address a10 , 0;(end of words) ; kind = 0 a12 , 0 ; stop count a13 , a104 ; state = waiting for event a19 , i3 ; buf claim a20 , i4 ; area claim a22 , 8.7777 ; function mask a10 , 0;(end of bytes) ; (kind = 0) rs w0 x1+a171 ; initial cpa(systrm)=core size rs w0 x1+a181 ; current cpa(systrm):=core size ; process description for initial sysrec al w1 x1 +a4 ; proc := next internal; jl. w2 i18. ; init description; a48 , a107 ; interval low a49 , a108-1 ; - high a11 , <:sys:> ; name = <:sysrec:> a11+2 , <:rec:> ; a11+4 , 0 ; a11+6 , 0 ; a17 , c68 ; first address a18 , c67-2 ; top address a301 , 0 ; priority a26 , a89 ; interrupt mask a27 , 0 ; user exception address a170 , 0 ; user escape address ;*** a171 , core size ; initial cpa a172 , 0 ; initial base a173 , c68 ; initial lower write linit a174 , c67-2 ; initial upper write limit a175 , b54<12+b54 ; - interrupt levels a32 , 0 ; status = not monitor mode a33 , c68 ; ic = start init ;***a181 , core size ; current cpa a182 , 0 ; current base a183 , c68 ; lower write limit a184 , c67-2 ; upper - - a185 , b54<12+b54 ; interrupt levels a42 , a107 ; catalog base low a43 , a108-1 ; - - high a44-2 , a107 ; max interval low a44 , a108-1 ; - - high a45-2 , a107 ; std interval low a45 , a108-1 ; - - high a302 , 0 ; save area address a10 , 0;(end of words) ; kind = 0 a12 , 0 ; stopcount a13 , a104 ; state = waiting for event a19 , i3 ; buf claim a20 , i4 ; area claim a22 , 8.7777 ; function mask a10 , 0;(end of bytes) ; (kind = 0) rs w0 x1+a171 ; initial cpa(sysrec):=core size rs w0 x1+a181 ; current cpa(sysrec):=core size ; process description for sysdma al w1 x1 +a4 ; proc := next internal; jl. w2 i18. ; init description; a48 , a107 ; interval low a49 , a108-1 ; - high a11 , <:sys:> ; name = <:sysdma:> a11+2 , <:dma:> ; a11+4 , 0 ; a11+6 , 0 ; a17 , c67 ; first address a18 , c66-2 ; top address a301 , 0 ; priority a26 , a89 ; interrupt mask a27 , 0 ; user exception address a170 , 0 ; user escape address ;*** a171 , core size ; initial cpa a172 , 0 ; initial base a173 , c67 ; initial lower write linit a174 , c66-2 ; initial upper write limit a175 , b54<12+b54 ; - interrupt levels a32 , 0 ; status = not monitor mode a33 , c67 ; ic = central waiting point ;***a181 , core size ; current cpa a182 , 0 ; current base a183 , c67 ; lower write limit a184 , c66-2 ; upper write limit a185 , b54<12+b54 ; interrupt levels a42 , a107 ; catalog base low a43 , a108-1 ; - - high a44-2 , a107 ; max interval low a44 , a108-1 ; - - high a45-2 , a107 ; std interval low a45 , a108-1 ; - - high a10 , 0 ;(end of words) ; kind = 0 a12 , 0 ; stopcount a13 , a104 ; state = waiting for event a19 , i3 ; buf claim a20 , i4 ; area claim a21 , i5-1 ; internal claim a22 , 8.7777 ; function mask a10 , 0 ;(end of bytes) ; (kind = 0) rs w0 x1+a171 ; initial cpa(sysdma):=core size rs w0 x1+a181 ; current cpa(sysdma):=core size \f al w2 x1+a16 ; w2:=addr(internal.sysdma.timer q) rl w1 b2 ; al w2 x2 -a4 ; w2:=addr(internal.sysrec.timer q) al w2 x2 -a4 ; w2:=addr(internal.systrm.timer q) al w2 x2 -a4 ; w2:=addr(internal.hcmaster.timer q) jl w3 b36 ; link(timer q,internal.hcmaster) al w2 x2 -a4 ; w2:=addr(internal.driver proc.timer q) jl w3 b36 ; link(timer q, internal.driver proc); jl. w3 i14. ; take control b3 ; (first name table entry, b6 ; first internal, b29+1*a4 ; driver proc); jl. w3 i14. ; take control b76 ; (first secondary interrupt, k ; irrellevant, b29+1*a4 ; driver proc); jl (10) ; goto start ; take control ; comment: searches through the specified part of name table and initializes driver ; proc address. i14: rl w1 (x3) ; entry := param 1; i15: am (x3 +2) ; next: sn w1 (0) ; if entry = top entry (i.e. param 2) jl x3 +6 ; then return; rl w2 x1 +0 ; proc := nametable(entry); sn w2 0 ; if end of table then jl x3 +6 ; then return; rl w0 x3 +4 ; if driverproc(proc) = 0 then rx w0 x2+a250 ; driverproc(proc) := param 3; se w0 0 ; rs w0 x2+a250 ; al w1 x1 +2 ; entry := entry + 2; jl. i15. ; goto next; ; procedure init description ; call: w1 = process description address, w2 = init table ; exit: w0 = core size, w1 = unchanged i18: dl w0 x2 +2 ; move words: al w2 x2 +4 ; move contents to outpointed am x1 ; relatives in process description rs w0 x3 ; se w3 a10 ; until kind is moved; jl. i18. ; i19: dl w0 x2 +2 ; move bytes: al w2 x2 +4 ; move contents to outpointed am x1 ; relatives in process description hs w0 x3 ; se w3 a10 ; until kind is moved; jl. i19. ; rl w0 b12 ; jl x2 ; i12:0 ; after loading: jl. i10. ; goto initialize segment; c70= k-b127 + 2 k=i10 ; e. ; i. e. ; end of masterproc \f ; segment 10 ; rc 05.08.70 bjørn ø-thomsen ; ; this segment moves segment 2 - 9 in this way: ; ; segment 2 is moved to cell 8 and on, after which ; control is transferred to the last moved word with the ; following parameters: ; w2 = top load address (= new address of last moved ; word + 2) ; w3 = link ; ; after initializing itself, the program segment returns ; to this segment with: ; w2 = load address of next segment ; ; the next segment will then be moved to cell(w2) and on, ; after which it is entered as described above. ; ; when initialize catalog (segment 9) is entered, the values ; of the two switches (writetext, medium) may be found in ; the words x3-4 and x3-2. ; ; segment 10 is entered from segment 1 in its last word ; entry conditions: ; w0,w1 = init catalog switches ; w2 = start address of segment 2 s. i10, j10 w. j3. ; length of segment 10 j0: 0 ; init cat switch: writetext j1: 0 ; init cat switch: medium ; return point from initializing of some segment i0: rl. w1 j2. ; get load address; i1: wa w1 x1+0 ; calculate top address: rx. w1 j2. ; change(old load address, top address); al w1 x1+2 ; skip segment length; ; now w1, w2 = old, new load address ; move segment: sh w2 x1 ; if new addr > old addr then jl. i2. ; begin ds. w2 j5. ; save (old, new); ws w2 2 ; diff := new - old; sh w2 i5 ; (at least size of move loop); al w2 i5 ; al. w1 j2. ; from := last of segment; ; move to higher: i4: rl w0 x1 ; move word(from) am x2 ; to word(from + diff); rs w0 x1 ; al w1 x1-2 ; sn. w1 j0. ; if exactly all moveloop moved then jl. x2+i4. ; goto the moved moveloop... sl. w1 (j4.) ; if not all moved then jl. i4. ; goto move to higher; rl. w1 j4. ; old := old + diff; wa w1 4 ; wa. w2 j2. ; top address := top address + diff; rs. w2 j2. ; rl. w2 j5. ; restore(new); ; end; i2: rl w0 x1+0 ; move word from old rs w0 x2+0 ; to new address; al w1 x1+2 ; update old addr; al w2 x2+2 ; update new addr; se. w1 (j2.) ; if old addr <> top addr jl. i2. ; then goto move segment; ; now the segment has been moved ; jump to the last moved word al. w3 i0. ; insert return; jl x2-2 ; goto word(top addr - 2); ; comment: jump to last loaded word with ; w2 = top load address ; w3 = link ; word(x3-4) = init cat switch, writetext ; word(x3-2) = init cat switch, medium ; initialize segment 10 i3: ds. w1 j1. ; save init cat switches rs. w2 j2. ; ; get monitor mode and clear all interrupts gg w3 b91 ; w3 := inf; rl. w0 j6. ; w0 := monitor mode; al. w1 i6. ; w1 := new entry; al. w2 j7. ; w2 := regdump; rs w2 x3+a326 ; user regdump := regdump; rs w0 x3-a325+a328+6; monitor status := monitor mode; rs w1 x3-a325+a328+2; monitor call entry := new entry; jd 1<11+0 ; call monitor; i.e. enter below, in monitor mode; i6: al w0 1 ; after monitor mode got: gp w0 b91 ; inf := 1; i.e. prevent any response; al w1 1<3 ; device := 1; i7: am. (j8.) ; next device: do x1+2 ; reset device (device); al w1 x1+1<3 ; increase (device); sh w1 255<3 ; if device <= 255 then jl. i7. ; goto next device; al w2 8 ; new load address := 8; jd. i0. ; goto get load address; j6: 1 < 23 ; monitor mode; j7: 0, r. a180>1 ; regdump j8: 1 < 23 ; device address bit j4: 0 ; saved old j5: 0 ; saved new i5 = k - j0 ; aproximate size of moveloop j2: 0 ; top address jl. i3. ; goto initialize segment 10 j3: ; top address of segment 10: e. ; end segment 10 i. ; last segment s.w. 0 ; last segment empty e. ; end of last segment m. end of monitor e. ; end of global block e. ▶EOF◀