|
|
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◀