|
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: 15360 (0x3c00) Types: TextFile Names: »hcrhcomt«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦this⟧ »hcrhcomt«
(hcrhcom=slang list.no xref.no hcrhcom) b. g2 w. s. a50,b10,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 ; - a48=10 ; max number of buserrors a49=a22-a40+2 ; buffer length a50= 21<3 ; level ;; ; format of message to another computer: ; ; ; do wreg addr ; wa 1<23+level<3+ 2.001 send data transfer request ; wa>= 0 contents irr ; request to send data specified by level location ; wa =1<23 + message ; ; ; ; di wreg addr ; wb 1<23+level<3+ 2.001 start input ; wb >=0 input to addr specified in level location ; wb = 1<23 + message ; ; level location (8) + level < 3 ; *----------*----------*----------*----------* ; ! number of! input or ! interrupt! ! ; ! bytes to ! output ! address ! level ! ; ! transfer ! address ! ! ! ; *----------*----------*----------*----------* ; ; ; ; external interrupt 16 : channel input finis ; - - 18 : channel input start (input request) ; - - 20 : channel output finis ; - - 22 : character device interrupt(not used) ; ; 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. ; rl w3 8 ; base of controller table al w3 x3+a50+2; +rel addr(level21) rs. w1 h1. ; i0: al w2 0 ; jd 1<11+24 ; wait event jd. 2 ; set interrupt level=6 sn w0 18 ; if interrupt from hc8000 then jl. i4. ; goto i4 else se w0 0 ; if not message then jl. i8. ; goto i8 rs. w2 h2. ; else save buf addr ;; ************************************************************ ; ; start moving a buffer from rh8000 to hc8000 ; ;; ************************************************************ al w3 a49 ; w3:=buffer length al w0 x2+a40 ; w0:= first addr of buff ds. w0 (h1.) ; set(byte,addr) jl. w3 b0. ; send output request to hc8000 jl. i7. ; if buserror then goto result 2 al w0 20 ; else jl. w3 b2. ; goto wait ext interrupt(level20) rl. w2 h2. ; w2=buffer addr bz w0 x2+a8 ; w0:=op sn w0 3 ; if op=input then jl. i1. ; goto i1 se w0 5 ; else if op<>output then jl. i9. ; goto return buffer ;; ************************************************************ ; start output to hc8000 ;; ************************************************************ rl w3 x2+a12 ; last addr ws w3 x2+a10 ; w3:=last addr-first addr al w3 x3+2 ;+2 al w0 x2+a10 ; w0:=first addr ds. w0 (h1.) ; jl. w3 b0. ; send output request jl. i7. ; if buserror then goto result 2 al w0 20 ; wait jl. w3 b2. ; jl. i9. ; goto return buffer ;; ************************************************************ ; start input from hc8000 ;; ************************************************************ i1: ; al w0 18 ; jl. w3 b2. ; wait for output request from hc8000 rl w3 x2+a12 ; last addr ws w3 x2+a10 ; w3:=last addr-first addr al w3 x3+2 ;+2 al w0 x2+a10 ; w0:=first addr ds. w0 (h1.) ; jl. w3 b1. ; send input request jl. i7. ; if buserror then goto i7 al w0 16 ; wait jl. w3 b2. ; jl. i9. ; goto return buffer ;; ************************************************************ ; ; start moving af buffer from hc8000 to rh8000 ; ;; ************************************************************ i4: al. w3 h11. ; buff addr al w0 a49 ; buff length ds. w3 (h1.) ; to controller table jl. w3 b1. ; input request jl. i2. ; if buserror then goto i2 al w0 16 ; jl. w3 b2. ; wait interrupt 16 al. w2 h11. ; al w2 x2-a40 ; bz w0 x2+a8 ; w0:=op sn w0 3 ; if op=input then jl. i5. ; goto i5 (start input rh --> hc) se w0 5 ; else if not output then jl. i6. ; goto i6 (send message to masterproc) ;; ************************************************************ ; start output to hc8000 ;; ************************************************************ rl w0 x2+a14 ; w0:=first addr(rh8000) rl w3 x2+a12 ; ws w3 x2+a10 ; al w3 x3+2 ; w3:=last addr- first addr+2 ds. w0 (h1.) ; byte,addr to controller table jl. w3 b1. ; input request jl. i2. ; if buserror then goto i2 al w0 16 ; jl. w3 b2. ; wait interrupt 16; jl. i0. ; goto wait ;; ************************************************************ ; start input from hc8000 to rh8000 ;; ************************************************************ i5: ; rl w0 x2+a14 ; w0:=first addr(rh8000) rl w3 x2+a12 ; w3:= ws w3 x2+a10 ; last addr - first addr +2 al w3 x3+2 ; ds. w0 (h1.) ; byte,addr to controller table jl. w3 b0. ; start output to hc8000 jl. i2. ; if buserror then goto i2 al w0 20 ; jl. w3 b2. ; wait ext. int. 20 jl. i0. ; goto wait ;; ************************************************************ ; message buffer ; move buffer to master proc ;; ************************************************************ i6: ; al. w1 h12. ; mess addr al. w3 h13. ; name addr jd 1<11+16 ; catch buff al. w1 h11. ; buff addr(hc) al w2 x2+a40 ; buff addr(rh) al w0 a49 ; buffer length wa w0 2 ; w0:= last addr i3: rl w3 x1 ; rs w3 x2 ; move buff hc--->rh al w1 x1+2 ; al w2 x2+2 ; sh w1 (0) ; jl. i3. ; al w2 x2-a50 ; jl. i13. ; goto move buff ;; ************************************************************ ; send aswer and/or move buffer ;; ************************************************************ i2: jl. i0. ; goto wait i7: rl. w2 h2. ; w2:=buf rl w1 x2+a4 ; w1:=receiver se. w1 (h7.) ; if receiver<>this proc then jl. i10. ; goto i10 i8: jd 1<11+26 ; get event al w0 2 ; result=2 (rejected) 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 2 i11:al w0 1 ; set result 1 rs w0 x2+a40 ; set result i13:al. w3 h10. ; jd 1<11+34 ; move buf to master proc i12:al w0 0 ; rs. w0 h2. ; clear buffer addr jl. i0. ; goto wait h1: 0 ; controller table addr(level(21)) h2: 0 ; buffer addr h7: 0 ; own proc descr addr h9: 0,r.8 ; message h6: 0,0 ; h10:<:masterproc:>,0,0; h11:0,r.(:a49>1 +2:); h12:0,r.8 ; pseudo message h13:0,r.5 ; pseudo name ; ;; ************************************************************ ; ; ; send output request to hc8000 b. f5,g5 w. ; b0: ; rs. w3 g3. ; save return al w3 0 ; rs. w3 g1. ; reset counter f0: do. w3 (g0.) ; send output request to hc8000 sx 2.111 ; if buserror then jl. f2. ; goto f2 else jl. f3. ; goto f3 f2: rl. w0 g1. ; w0:=counter ba. w0 1 ; counter:=counter+1; rs. w0 g1. ; save counter sh w0 a48 ; if counter<=max number of buserrors then jl. f0. ; repeat data out rl. w3 g3. ; else return+0 jl x3+0 ; f3: rl. w3 g3. ; return+2 jl x3+2 ; g0: 1<23 + a50 +2.001; g1: 0 ; g3: 0 ; return addr e. ; ; ;; ************************************************************ ; ; ; send input request to hc8000 b. f5,g5 w. ; b1: ; rs. w3 g3. ; save return al w3 0 ; rs. w3 g1. ; reset counter f0: di. w3 (g0.) ; send input request to hc8000 sx 2.111 ; if buserror then jl. f2. ; goto f2 else jl. f3. ; goto f3 f2: rl. w0 g1. ; w0:=counter ba. w0 1 ; counter:=counter+1; rs. w0 g1. ; save counter sh w0 a48 ; if counter<=max number of buserrors then jl. f0. ; repeat data out rl. w3 g3. ; else return+0 jl x3+0 ; f3: sh w0 -1 ; if message then jl. b4. ; goto test for autoload rl. w3 g3. ; return+2 jl x3+2 ; g0: 1<23 + a50 +2.001; g1: 0 ; g3: 0 ; return addr e. ; ; ;; ************************************************************ ; ; ; ; wait external interrupt ; b. f5,g5 w. ; b2: ; ds. w1 g1. ; ds. w3 g3. ; al. w2 g5. ; wait buffer addr f0: jd 1<11+116; wait ext. interrrupt se. w0 (g0.) ; jl. f0. ; dl. w1 g1. ; dl. w3 g3. ; jd x3 ; return g0: 0 ; g1: 0 ; g2: 0 ; g3: 0 ; g5: 0,r.4 ; wait buff e. ; ;; *********************************************************** ; ; ; test buffer ; test first.buff and last.buff in case of input buffer ; call: w2=buffer addr ; return 1 if first or last is not within proc ; return 2 else ; return: w0,w2 unchanged, w3 return addr, w1 proc addr b. f5,g5 w. b3: ds. w0 g0. ; bz w0 x2+a8 ; se w0 3 ; if not input buffer then jl. f0. ; return rl w1 x2+a6 ; w1:=sender dl w0 x2+a12 ; w3,w0:=first,last addr ba. w0 1 ; sl w3 x1+24 ; if first.buf<first.proc or sl w0 x1+22 ; last.buf >= last.proc then am 2 ; return 2 al w3 2 ; else return 1 f0: rl. w0 g0. ; wa. w3 g3. ; jl x3 ; g3:0 g0:0 e. ; ; b. f10,g10 w. b4: al. w1 g0. ; al. w3 g1. ; jd 1<11+42 ; lookup(<:kkmon8004:>) se w0 0 ; if not found then jl. h5. ; goto h5 rl. w1 h7. ; w1:=own process desc addr rl w2 x1+24 ; w2:=last byte al. w1 h20. ; first byte rs. w1 g3. ; ws w2 2 ; w2:=buffer length ls w2 -9 ; in segments rs. w2 g9. ; rl. w1 g0. ; w:=monitor length al w0 0 ; wd w1 4 ; w1:=number af shares se w0 0 ; al w1 x1+1 ; round rs. w1 g6. ; al. w1 g6. ; al w0 2 ; ds. w1 (h0.) ; set(byte,addr) jl. w3 b0. ; send output request to HC8000 jl. h5. ; if buserror then goto h5 al w0 20 ; jl. w3 b2. ; wait for channel output finis al. w1 h20. ; rl. w0 g9. ; w0:=share length ls w0 9 ; in halfwords ds. w1 (h0.) ; set(byte,addr) al. w3 g1. ; jd 1<11+52 ; jd 1<11+8 ; create and reserve(<:kkmon8004:>) se w0 0 ; if error then jl. h5. ; goto h5 h1: al. w3 g1. ; al. w1 g2. ; jd 1<11+16 ; input next share al. w1 g8. ; jd 1<11+18 ; wait for input finis se w0 1 ; if error then jl. h5. ; goto h5 jl. w3 b0. ; send output request jl. h5. ; if buserror then al w0 20 ; else wait jl. w3 b2. ; for output finis rl. w3 g3. ; wa. w3 g9. ; rs. w3 g3. ; count segments sl. w3 (g0.) ; if no more then jl. h3. ; goto stop jl. h1. ; else start input h3: al. w3 g1. ; jl. h6. ; goto remove process h5: al. w3 g1. ; jd 1<11+4 ; if process exist then se w0 0 ; h6: jd 1<11+64 ; remove process jl. i0. ; goto wait g0: 0,r.10 ; tail g1: <:kkmon8004:>,0,0 g2: 3<12 + 0 ; input message g3: 0 ; first addr g4: 0 ; last addr g5: 0,r.5 ; segment g6: 0 ; number of shares g7: 1<23 ; message g8: 0,r.8 ; g9: 0 ; share length e. h20: ; buffer start addr e. ; g2=k ; g1: ; g0: 1 ; size 0,r.4 ; name s2 ; clock 0 ; file 0 ; block 3<12+0 ; contents g2 ; size d. ; p. <:fpnames:> ; p. <:insertproc:> ; ▶EOF◀