|
|
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: »hcrhcomtx«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦this⟧ »hcrhcomtx«
(hcdriver=slang list.yes xref.yes;
hcdriver);
b. g2 w. ;
s. a70,b50,h50,i100 w.;
;. 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 ; -
a20= 20 ; -
a22= 22 ; -
a49=a22-a40+2 ; buffer length
a48=10 ; max numbers of buserrors
a50= 21<3 ; level 21
a51= 22<3 ; level 22
a54= 1 ; time out limit for mess, buff
a55=10 ; time out limit for transfer
;; buffer state = 0 for a normal buffer (is only copied)
; -1 for a buffer from monproc copy
; -2 for a moncall buffer
; -3 mirrorbuffer received of master
; -4 - - - - and send to receiver
\f
;.
; 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 <=0 : message
;
;
;
; di wreg addr
; wb 1<23+level<3+ 2.001 start input
; wb > 0 : input to addr specified in level location
; wb <=0 : message
;
; level location (8) + level < 3
; *----------*----------*----------*----------*
; ! number of! input or ! interrupt! !
; ! bytes to ! output ! address ! level !
; ! transfer ! address ! ! !
; *----------*----------*----------*----------*
;
;
; format of message
;
; 1<23+type<19 + mess
;
; type = 16 input-output communication
; mess = mess-type < 17 + mess-id
; mess-type = 0 send buffer request
; 1 ready for receiving a buffer
; 2 send data request
; 3 ready for receiving data
;
; mess-id is a unique number for each transfer
;
; state for i-o transfer
; 0 nothing pendling
;
; 1 a send buffer request is sent
; 2 a buffer is sent
; 4 a send data request is sent
; 8 data is sent
;
; 32 an input buffer request is received
; 64 a start input buffer is sent
; 128 an input data request is received
; 256 a start data input is sent
;
;
;
; external interrupt 16 : channel input finis
; - - 18 : channel input start (input request)
; - - 20 : channel output finis
; - - 22 : character device interrupt(not used)
\f
;. all input and output actions are described in chained links:
;
a60=0 ; link: next link
a61=2 ; prev link
a62=4 ; type
a63=6 ; buffer address
a64=8 ; link id other computer
a65=10 ; link id this computer
a66=12 ; input or output addr
a67=14 ; halfwords
a68=16 ; time left before time out
a70=a68-a60 ; length of a link
;
;. link type= 11 mirror buf describing an area waiting for input form o. c.
; 10 mirror buf - - - - to be output to o. c.
; 9 mirror buf waiting for input from o. c.
; 8 mirror buf only linked
; 7 a buffer waiting for an answer
; 3 real buf describing an area waiting for input
; 2 real buf - - - - to be output to o. c.
; 1 real buf waiting to be output to o. c.
; 0 real buf only linked
;
\f
rs. w3 h7. ; own proc desr addr
al w0 6 ;
hs w0 x3+104 ; disable interrupt level:=6
al. w1 h31. ;
al. w2 h31. ;
ds w2 x2+2 ; link head:=link head
al. w1 h32. ;
al. w2 h32. ;
ds w2 x2+2 ; free link head:=free linkhead
jl. w3 b50. ; goto chain free links
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 h8. ;
rl w3 8 ; base of controller table
al w3 x3+a50+2 ; +rel addr(level21)
rs. w3 h0. ; input location
al w3 x3+8 ;
rs. w3 h1. ; output location
jl. w3 b18. ; send time out limit to clock
\f
i0: rl. w1 h4. ; w1:=i-o state
sz w1 2.1111 ; if output pendling then
jl. i3. ; goto wait event
jl. w3 b13. ; search link waiting for output
jl. i1. ; return 0 not found: goto test input
jl. i15. ; return 2 goto send output buffer request
jl. i35. ; return 4 goto send output data request
i1: rl. w1 h4. ; w1:=i-o state
sz w1 2.101000000; if a ready for input is sent then
jl. i3. ; goto wait event
so w1 2.000100000; else if an input buffer request is not sent then
jl. i2. ; goto test data
al w0 9 ; else
jl. w3 b14. ; goto search link in state 9
jl. i3. ; not found: goto wait event
jl. i42. ; else goto send input buffer ready signal
i2: so w1 2.010000000; if an input data request is not sent then
jl. i3. ; goto wait event
jl. w3 b12. ; search input link
jl. i3. ; return 0 not found: goto wait event
jl. i45. ; return 2: goto send input data ready signal
i3: al w2 0 ;
je. 2 ; interrupt level:=26
jd 1<11+24; wait event
jd. 2 ; set interrupt level=6
sl w0 2 ; if interrupt from hc8000 then
jl. i4. ; goto i4 else
jd 1<11+26; get event
se w0 0 ; if not message then
jl. i50. ; goto i50
rs. w2 h2. ; else save buf addr
jl. i11. ; goto link buff
\f
i4: sn w0 16 ; if channel input finis then
jl. (h29.) ; goto return point for input finis
sn w0 20 ; if channel output finis then
jl. (h28.) ; goto returnpoint for output finis
rl. w3 h4. ; w3:=i-o state
sz w3 2.010100000; if input data is expected then
jl. i6. ; goto i6.
jl. w3 b1. ; else load message via data in
jl. i0. ; if buserror then goto next event
i5: jl. w3 b6. ; get mess type
se w0 8 ; if not i-o mess then
jl. i0. ; goto next event
jl. w3 b7. ; get i-o mess type
ls w0 1 ;
am (0) ;
jl. 2 ; case mess-type of
jl. i40. ; start buffer input
jl. i20. ; send a buffer
jl. i45. ; start data input
jl. i36. ; send data
;
;
i6: dl. w3 h16. ;
ds. w3 (h0.) ; set input address
jl. w3 b1. ; and start input
jl. i64. ; if buserror then goto set result
rl. w3 h3. ; w3:=last di reg value
sh w3 0 ;
jl. i5. ; goto mess
jl. i0. ; else goto wait next event
;
;
\f
;; ************************************************************
;
; start output to hc8000
;
;; ************************************************************
i7: al. w1 h31. ;
jl. i9. ;
i8: sn w2 (x1+a63); if recieved buf=buf.link then
jl. i10. ; goto i10
i9: rl w1 x1 ; next link
sn. w1 h31. ;
jl. i31. ; goto remove buf and link
jl. i8. ; else test next link
i10:al w0 0 ; set link state and
rs w0 x1+a62 ;
jl. i0. ; goto next event
i11:jl. w3 b20. ; goto link buffer
jl. i0. ;
i15:rl w2 x1+a63 ; w2:=buf
jl. w3 b40. ; set outputmess
jl. w3 b0. ; send output message to RH8000
jl. i64. ; if buserror then set result 2
al w0 a54 ;
rs w0 x1+a68 ; set time out limit
al w0 2.1 ;
jl. w3 b2. ; goto set i-o state
jl. w3 b21. ; set link state
jl. w3 i0. ; goto next event
i20:jl. w3 b8. ; get transfer-id from last data in
jl. w3 b16. ; search transfer-id
jl. i0. ; if not found then goto next event
rs. w1 h6. ; set current output link
rl w2 x1+a63 ;
al w3 a49 ; w3:=buffer length
al w0 x2+a40 ; w0:= first addr of buff
ds w0 x1+a67 ;
ds. w0 (h1.) ; set(byte,addr)
rs. w3 h5. ; next reg val for data out
jl. w3 b0. ; send output request to hc8000
jl. i64. ; if buserror then goto result 2
al w0 a54 ;
rs w0 x1+a68 ; set time out limit
al w0 2.10 ;
jl. w3 b2. ; set i-o state
jl. w3 i39. ; goto next event
\f
i30:rl. w1 h6. ; w1:=current output link addr
rl w2 x1+a63 ; w2:=buffer addr
rl w0 x2+a6 ; w0:=sender
se. w0 (h8.) ; if sender<>master then
jl. i38. ; goto i38
bz w0 x2+a8 ; w0:=op
sn w0 7 ; if op=mubf-copy then
jl. i32. ; goto copy area.buf
i38:rl w0 x2+a40 ; w0:=buf.status
sn w0 -1 ; if a buf from copy then
jl. i32. ; goto i32
sh w0 0 ; else if a normal buf then
jl. i34. ; goto set state.buf to waiting for an answerbuffer
; else is it a answer buffer to other computer,
; which now is transfered
jl. w3 b9. ; remove link from activ queque
i31:al. w1 h12. ; return buf
jd 1<11+18;
jl. i0. ; and goto next event
i32: ;
bz w0 x2+a8 ; w0:=op
se w0 3 ; if op<>input then
jl. i33. ; goto i33
jl. w3 b23. ; else link.state:=waiting for input
jl. i0. ;
i33:se w0 5 ; if op<>output then
jl. i37. ; goto i37
jl. w3 b22. ; else link.state:=waiting for output
jl. i0. ; goto next event
i34:rl w0 x2+a4 ; w0:=receiver
sl w0 10 ; if not answer from o. c. then
jl. i37. ; goto change link state
rl w3 x2+a6 ; else change sender.oc and
rx w3 x2+a34 ; sender this computer
rs w3 x2+a6 ;
jl. w3 b9. ; remove link and
rl w0 x2+a4 ;
jl. i66. ; move buf to master
i37:jl. w3 b27. ; change link state to waiting for answerbuffer
jl. i0. ; and goto next event
i35:rl w2 x1+a63 ; w2:=buf
jl. w3 b42. ; set outputmess
jl. w3 b0. ; send output data request
jl. i64. ; if buserror then goto set result
al w0 a55 ;
rs w0 x1+a68 ; set time out limit
al w0 2.100 ;
jl. w3 b2. ; goto set i-o state
jl. w3 i39. ;
\f
i36:jl. w3 b8. ; w0:=transfer-id
jl. w3 b16. ; search link
jl. i0. ; if not found then goto next event
rl w2 x1+a63 ; else w2:=buf
rl w0 x1+a62 ; w0:=linktype
sh w0 3 ; if real buf then
am a10-a14; first addr:=first addr this computer else
rl w0 x2+a14 ; w:=first addr. other computer
rl w3 x2+a12 ;
ws w3 x2+a10 ;
al w3 x3+2 ; w3 :=number of halfwords
sh w3 0 ; if nothing to transfer then
jl. i67. ; goto set result
ds w0 x1+a67 ;
ds. w0 (h1.) ;
rs. w3 h5. ;
jl. w3 b0. ; start output data
jl. i64. ; if buserror then goto set result
al w0 2.1000 ; else
jl. w3 b2. ; goto set i-o state
rl. w1 h6. ; save current link
jl. w3 i39. ; goto next event
al w0 0 ;
jl. w3 b2. ; set i-o state
rl. w1 h6. ; w1:=link
rl w2 x1+a63 ; w2:=buf
jl. w3 b9. ; remove link
rl w3 x1+a67 ;
rs w3 x2+a10 ; set number of halfwords in buf
jl. i69. ; goto set result
i39:rs. w3 h28. ; set return addr
jl. i0. ; and goto next event
\f
;; ************************************************************
;
; start input from hc8000 to rh8000
;
;; ************************************************************
i40: ; make a buffer ready for input from hc8000
al. w1 h12. ;
al. w3 h13. ; name
jd 1<11+16; get buffer
rs. w2 h2. ; curr buf
jl. w3 b28. ; link buf
al w0 a54 ;
rs w0 x1+a68 ; set time out limit
al w0 2.000100000;
jl. w3 b2. ; goto set i-o state
rl. w0 h3. ; w0:=last mess from data in
rs w0 x1+a64 ; to link
jl. i0. ; goto next event
i42:rs. w1 h14. ; set current link
rl w2 x1+a63 ; w2:=buff
al w0 x2+a40 ; w0:=1. addr
al w3 a49 ; w3:=buffer length
ds. w0 h16. ;
ds w0 x1+a67 ;
jl. w3 b41. ; set outputmess
jl. w3 b0. ; send ready signal for receiving a buffer
jl. i0. ; if buserrror then goto next event
al w0 a54 ;
rs w0 x1+a68 ; set time out limit
al w0 2.001000000;
jl. w3 b2. ; set i-o state
jl. w3 b29. ; change link state
jl. w3 i49. ; goto to next event
;
rl. w1 h14. ;
al w0 2.000001111;
jl. w3 b15. ; reset input state
rl w2 x1+a63 ; w2:=buff
rl w0 x2+a40 ; w0:=buf.state
sn w0 0 ; if message then
jl. i43. ; goto i43
sn w0 -1 ; if a mirror buf from copy o.c. then
jl. i44. ; goto i44
jl. w3 b17. ; else search buffer in chains
jl. i50. ; not found: return buffer
; else set and test result.
rl w3 x1+a63 ; w3=real buf w2=mirror buf
rl w0 x2+a4 ; w0:=result
sh w0 (x3+a4); set higthest result
rl w0 x3+a4 ; in the
rs w0 x3+a4 ; real buf
rl w0 x2+a8 ;
lo w0 x3+8 ; set status in
rs w0 x3+8 ; in the real buf
rs. w1 h14. ; save current link
al. w1 h12. ;
jd 1<11+18; return mirror buf
jl. i66. ; and move real buf to master
\f
i43:dl w0 x2+a6 ; change sender/receciver.this computer
rx w0 x2+a34 ;
rx w3 x2+a36 ; with sender/reciever.other comp.
ds w0 x2+a6 ;
jl. i66. ; and move buffer to master
i44:bz w0 x2+a8 ;
sl w0 3 ; if not input message or
sl w0 6 ; not output mesage then
jl. i43. ; move buf to master
sn w0 4 ;
jl. i43. ;
rl w3 x1+a65 ; else transfer-id to
rs w0 x2+40 ; buf
jl. w3 b30. ; set link state as mirror output
se w0 5 ;
jl. w3 b31. ; or as mirror input
jl. i0. ; and goto next event
i45:jl. w3 b8. ; w0:=transfer-id
jl. w3 b16. ; search link
jl. i0. ; if not found then goto next event
rs. w1 h14. ; set current link
rl w2 x1+a63 ; w2:=buf
jl. w3 b3. ; if address is outside proc then
jl. i67. ; goto set result
rl w0 x1+a62 ; w0:=link type
sh w3 3 ; if real buf then
am a10-a14; w0:=first addr this computer else
rl w0 x2+a14 ; else w0:=first addr other computer
rl w3 x2+a12 ;
ws w3 x2+a10 ; w3:=number of halfwords
al w3 x3+2 ; to transfer
sh w3 0 ; if nothing to transfer then
jl. i67. ; goto set result
ds w0 x1+a67 ;
jl. w3 b43. ; set ready signal for input
jl. w3 b0. ; goto send ready signal
jl. i64. ; if buserror then goto set result
al w0 a55 ;
rs w0 x1+a68 ; set time out limit
al w0 2.100000000;
jl. w3 b2. ; set i-o state
jl. w3 i49. ; set return point and goto next event
;
rl. w1 h14. ;
rl w2 x1+a63 ; w2:=buf
rl w3 x1+a67 ;
rs w3 x2+a10 ; number of halfwords to buf
jl. i69. ; set result
i49:rs. w3 h29. ; set return point and
jl. i0. ; goto next event
\f
;; ************************************************************
; send answer and/or move buffer
;; ************************************************************
i50: ; an answer is arrived
se. w2 (h17.) ; if current buf <> time delay buf then
jl. i61. ; goto return buf
al. w1 h31. ; else test chain for time out
sn. w1 h31. ; if chain is empty then
jl. i56. ; goto send a new message to clock
rl w1 x1 ; next link
i51:rl w0 x1+a68 ; time out limit:=
bs. w0 1 ; time out limit-1
rs w0 x1+a68 ;
sh w0 -1 ; if time out then
jl. w3 b19. ; goto return buffer
rl w1 x1 ; w1:=next link
se. w1 h31. ; if more to test then
jl. i51. ; goto next
i56:jl. w3 b18. ; else send new mess to clock
jl. i0. ; goto next event
;
i61: ;
rl w1 x2+a4 ; w1:=receiver
sh w0 10 ; if answer then
jl. i7. ; goto search link
se. w1 (h7.) ; if receiver<>this proc then
jl. i64. ; goto i64
i62:al w0 2 ; result=2 (rejected)
al. w1 h9. ; mess addr
jd 1<11+22; send message
jl. i0. ; goto next event
i67:am -1 ; set result 3 address error
i64:am -508 ; set result 4 rejected (buseeror)
i63:am 511 ; set result 512 time out
i65:al w0 1 ; set result 1
al w3 0 ;
se w0 512 ; if not time out then
jl. i68. ; goto set status and answer
rl w3 0 ; w3:=2.0010 0000 0000
al w0 1 ; result=1
i68:hs w3 x2+a8+1 ; set buf.status
rs w0 x2+a40 ; set result
rl w0 x1+a62 ; w0:=link state
sn w0 7 ; if waiting for answer buf then
jl. i0. ; goto next event
i66:al. w3 h10. ;
jd 1<11+34; move buf to master proc
jl. i0. ; goto next event
;
i69:al w0 1 ;
rs w0 x2+a4 ; set result=1
al w0 0 ;
rs w0 x2+a8 ; and set status
rl w0 x1+a62 ; w0:=link type
sl w0 7 ; if mirror buf then
jl. i10. ; change link state to buffer to be output
jl. w3 b27. ; else set link state=wait for answer
jl. i0. ; and goto next event
\f
h0: 0 ; controller table addr(level(21)) input
h1: 0 ; controller table addr(level(22)) output
h2: 0 ; buffer addr
h3: 0 ; last di-register value
h4: 0 ; i-o state
h5: 0 ; next register value at data-out
h6: 0 ; current output link
h7: 0 ; own proc descr addr
h8: 0 ; process description addr for master
h9: 0,r.8 ; message
h10:<:masterproc:>,0,0;
h12:0,r.8 ; pseudo message
h13:0,r.5 ; pseudo name
h14:0 ; current input link
h15:0 ; halfwords
h16:0 ; next input addr
h17:0 ; clock buf
h18:2.1111<19 ; mask for extracting mess-type
h19:2.11<17 ; mask for extracting i-o mess-type
h20:2.111111 ; mask for extracting transfer id
h28:0 ; output return addr
h29:0 ; input return point
h31:0,0 ; activ link chain head
h32:0,0 ; free links head
\f
;;
;
;
; send output request to hc8000
b. f5,g5 w. ;
b0: ;
rs. w3 g3. ; save return
al w3 0 ;
rs. w3 g1. ; reset counter
f0: rl. w3 h5. ; w3:=do-reg-value
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. ;
jl x3+0 ;
f3: rl. w3 g3. ;
jl x3+2 ; and return
g0: 1<23 + a50 +2.001 ;
g1: 0 ;
g3: 0 ;
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: rs. w3 h3. ; set di-reg-value
rl. w3 g3. ; return+2
jl x3+2 ;
g0: 1<23 + a50 +2.001 ;
g1: 0 ;
g3: 0 ; return addr
e. ;
;
\f
;;
;
;
;
; set i-o state
; w0=state
;
b. f5,g5 w. ;
b2: ;
ds. w3 g3. ;
al w2 2.1111 ;
sl w0 2.100000; if input state then
ls w2 5 ; move mask
la. w2 h4. ; extract old mask
wa w2 0 ; insert new
rs. w2 h4. ; state and store
dl. w3 g3. ;
jl x3 ; return
g2: 0 ;
g3: 0 ;
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,w1,w2 unchanged, w3 return addr
b. f5,g5 w. ;
b3: ;
ds. w0 g0. ;
rs. w1 g1. ;
al w3 2 ;
bz w0 x2+a8 ;
se w0 3 ; if not input buffer then
jl. f0. ; return
rl w1 x2+a6 ; w1:=sender
dl w0 x1+24 ; w3,w0:=first,last addr.proc
wa w3 x1+98 ; +base
wa w0 x1+98 ; +base
ba. w0 1 ;
sh w3 x2+a10 ; if first.buf<first.proc or
sh w0 x2+a12 ; last.buf >= last.proc then
am -2 ; return 2
al w3 2 ; else return 1
f0: rl. w0 g0. ;
wa. w3 g3. ;
rl. w1 g1. ;
jl x3 ;
g1: 0 ;
g3: 0 ;
g0: 0 ;
e. ;
;
;
;
;
;
\f
b.w. ;
b4: ; insert a link
; w1=element, w2=head
; return: w1,w2 unchanged, w3 prev element
rs w3 0 ;
rl w3 x2+2 ; w2:=prev link
rs w1 x2+2 ; prev link:=curr link
rs w1 x3+0 ;
rs w2 x1+0 ;
rs w3 x1+2 ;
jl (0) ; return
e. ;
b.w. ;
b5: ; remove a link
; w1=element
; return: w1,w2 unchanged, w3=next element
rs w3 0 ;
rl w3 x1+0 ;
rx w1 x1+2 ;
rs w3 x1+0 ;
rx w1 x3+2 ;
rs w1 x1+0 ;
jl (0) ;
e. ;
;
;
b.w. ; extract
b6: am h18-h19; mess type,
b7: am h19-h20; i-o mess type or
b8: rl. w0 h20. ; transfer id
la. w0 h3. ;
jl x3 ;
e. ;
;
;
b. g5 w. ; remove a link from activ chain and insert it in free chain
; call : w1=link, w2=buffer
; return w0,w3 undef, w1,w2 unchanged
; h2 is set to buf.w2
b9: rs. w3 g3. ;
jl. w3 b5. ; remove link
rs. w2 h2. ; save current buffer
al. w2 h32. ; free chain head
jl. w2 b4. ; insert link
rl. w2 h2. ;
jl. (g3.) ;
g3: 0 ;
e. ;
\f
b. g5,f5 w. ;
;; search a link in state 3 or 11
; return 0 w1=chain head, w2 unchanged
; return 2 w1=link in state 3 or 11, w2 unchanged
b12:rs. w3 g3. ;
al w3 x3+2 ;
rs. w3 g4. ; return 2
al. w1 h31. ; link head
jl. f1. ; goto test
f0: rl w0 x1+a62 ; link state
so w0 2.11 ; if state<>3 or state <>11 then
jl. f1. ; goto test next
jl. (g4.) ; else return 2
f1: rl w1 x1 ;
se. w1 h31. ; if more to test then
jl. f0. ; goto f0
jl. (g3.) ; else return 0
g3: 0 ;
g4: 0 ;
e. ;
;
;
b. g6,f5 w. ;
;; search a link in state 0, 2 or 10
; return 0: w1=chain head, w2 unchanged
; return 2: w1=link in state 0, w2 unchanged
; return 4: w1=link in state 2 or 10, w2 unchanged
b13:rs. w3 g3. ;
al w3 x3+2 ;
rs. w3 g4. ; return 2
al w3 x3+2 ;
rs. w3 g5. ; return 4
al w0 0 ;
jl. w3 b14. ; search buffer to output
jl. f2. ; not found: goto search area output
jl. (g4.) ; else return 2
f2: al. w1 h31. ; link head
jl. f1. ; goto test
f0: rl w0 x1+a62 ; link state
la. w0 g6. ;
sn w0 2 ; if state=2 or state=10 then
jl. (g5.) ; return 4
f1: rl w1 x1 ;
se. w1 h31. ; if more to test then
jl. f0. ; goto f0
jl. (g3.) ; else return 0
g3: 0 ;
g4: 0 ;
g5: 0 ;
g6: 2.111 ;
e. ;
\f
b. f5,g5 w. ;
;; search a link in state.w0 in link chain
; if found then return 2
; else return 0
; return: w0, w2 unchanged. w1=link
b14: ;
ds. w0 g0. ;
al. w1 h31. ; w1:=link head for input
sn w1 (x1) ; if chain is empty
jl. f1. ; then goto return 0
f0: rl w1 x1 ; w1:=next link
sn w0 (x1+a62); if link is in state.w0
jl. f2. ; goto return 2;
se. w1 h31. ; if more links then
jl. f0. ; get next
f1: am -2 ; else return 0
f2: al w3 2 ; return 2
rl. w0 g0. ;
wa. w3 g3. ;
jl x3 ;
g3: 0 ;
g0: 0 ;
e. ;
;
;
;
b.w. ; clear input or output state
b15:la. w0 h4. ;
rs. w0 h4. ;
jl x3 ;
e. ;
;
b. f5,g5 w. ;
;; search a link with transfer id = w0
; if found then return 2
; else return 0
; return: w0, w2 unchanged. w1=link
b16: ;
rs. w3 g3. ;
al w3 x3+2 ;
rs. w3 g4. ;
al. w1 h31. ; w1:=link head for input
jl. f1. ;
f0: rl w3 x1+a65 ;
la. w3 h20. ; w3:=transfer id
sn w0 x3 ; if link is in state.w0
jl. (g4.) ; goto return 2
f1: rl w1 x1 ;
se. w1 h31. ; if more links then
jl. f0. ; get next
jl. (g3.) ;
g3: 0 ;
g4: 0 ;
e. ;
\f
b. g5,f5 w. ;
;; search link with given transfer-id
; if mirrorbuf then transfer-id other computer
; else transfer-id this computer is compared
; w0=transfer-id
; return0: not found
; else
; return2: w1=link, w2 unchanged, w3=buf.link
b17:ds. w0 g0. ;
al w3 x2+2 ;
rs. w3 g4. ; save return2
al. w1 h31. ;
jl. f1. ;
f0: rl. w0 h20. ; w0:=mask for transfer-id
rl w3 x1+a62 ;
sl w3 7 ; if mirrorbuffer then
am a64-a65; w0:=transfer-id o.c. else
la w0 x1+a65 ; transfer-id this computer
sn. w0 (g0.) ; if found then
jl. (g4.) ; return 2
f1: rl w1 x1 ;
se. w1 h31. ; if more links then
jl. f0. ; goto next else
jl. (g3.) ; return 0: not found
g4: 0 ;
g3: 0 ;
g0: 0 ;
e. ;
b. g5 w. ;
b18: ; send message to clock
rs. w3 g3. ; save return
al w3 0 ;
al w0 1 ; w3,w0:=mode,delay
al. w1 h12. ;w1:=buf
ds w0 x1+2 ;
al. w3 h13. ;
jd 1<11<16;
rs. w2 h17. ; save buf addr
jl. (g3.) ;
g3: 0 ;
e. ;
b. g5 w. ;
b19: ; return buf to master (after time out)
rs. w3 g3. ; save return
rl w2 x1+a63 ; w2:= buf
rs. w1 g1. ; save link
al w3 512 ; w3:=2.0010 0000 0000
hs w3 x2+a8+1 ; set status
al w0 1 ;
rs w0 x2+a40 ; set result
al. w3 h10. ; w3:=master proc
jd 1<11+34; move buf to master
rl. w1 g1. ;w1:=link
jl. w3 b5. ; remove link
al. w2 h32. ; w2:=free link head
jl. w3 b4. ; insert link
jl. (g3.) ; return
g1: 0 ;
g3: 0 ;
e. ;
\f
;; set up link or change link state
; call: w2=buffer addr, w1=link (not for b28 and b20)
; return: w0=state, w1=link, w2=buffer, w3 undef
b. g5,f5 w. ; change link state to
b31:am 1 ; mirror buf describing an area waiting for input form o. c.
b30:am 1 ; mirror buf - - - - to beoutput to o. c.
b29:am 1 ; mirror buf waiting for input from o. c.
b28:am 1 ; mirror buf only linked
b27:am 4 ; a buffer waiting for an answer buf from o. c.
b23:am 1 ; real buf describing an area waiting for input
b22:am 1 ; real buf - - - - to be output to o. c.
b21:am 1 ; real buf waiting to be output to o. c.
b20:al w0 0 ; real buf only linked
ds. w3 g3. ;
sz w0 2.111 ; if already linked then
jl. f0. ; goto f0
rs w0 x1+a62 ; set link state
rl. w1 h32. ; else get a free link
jl. w3 b5. ;
al. w2 h31. ; and insert in
jl. w3 b4. ; activ queque
rl. w2 g2. ;
rs w2 x1+a63 ; buffer addr
al w0 100 ; set init value for
rs w0 x1+a68 ; for time out
jl. (g3.) ;
f0: rs w0 x1+a62 ; link state
jl. (g3.) ;
g2: 0 ;
g3: 0 ;
e. ;
b. f5,g5 w. ;
b50: ; set up chain with free links
rs. w3 g3. ;
al w0 0 ;
al. w2 h32. ; w2:=head
al. w1 h30. ; w1:=first
f0: jl. w3 b4. ; chain link
rs w0 x1+a65 ; set link-id
ba. w0 1 ;
al w1 x1+a70 ; w1:=next link
sh w0 127 ;
jl. f0. ;
jl. (g3.) ;
g3: 0 ;
e. ;
\f
;; set up output message
; transfer-id is selected from link.w1
; if mirror buffer then transfer-id other computer
; else - this -
; call: w1=link, w2=buffer
; return: w1,w2 unchanged w0,w3 undef
; outputmess to h5
b. g5 w. ;
b40:am -1 ; io-mess-type = 0: send buffer request
b41:am -1 ; 1: ready for receiving a buffer
b42:am -1 ; 2: send data request
b43:al w0 4 ; 3: ready for receiving data
ds. w0 g0. ;
rl. w0 h20. ; w0:=mask for extracting transfer-id
rl w3 x1+a62 ; w3:=io-mess-type
sl w3 7 ; if mirrorbuf then
am a64-a65; load transfer-id other computer
la w0 x1+a65 ; else load transfer-id this computer
rl. w3 g0. ;
ls w3 17 ; set up output mess
wa w3 0 ;
wa. w3 g4. ;
rs. w3 h5. ;
jl. (g3.) ;
g3: 0 ;
g0: 0 ;
g4:1<23 + 8<19 + 00<17 + 2.000000
e. ;
\f
c. -1 ;
b. f10,g10 w. ;
b49: ;
al. w1 g0. ;
al. w3 g1. ;
jd 1<11+42; lookup(<:kkmon8004:>)
se w0 0 ; if not found then
jl. f5. ; goto f5
rl. w1 h7. ; w1:=own process desc addr
rl w2 x1+24 ; w2:=last byte
al. w1 h30. ; 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. f5. ; if buserror then goto f5
al w0 20 ;
jl. w3 b2. ; wait for channel output finis
al. w1 h30. ;
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. f5. ; goto f5
f1: 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. f5. ; goto f5
jl. w3 b0. ; send output request
jl. f5. ; 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. f3. ; goto stop
jl. f1. ; else start input
f3: al. w3 g1. ;
jl. f6. ; goto remove process
f5: al. w3 g1. ;
jd 1<11+4 ; if process exist then
se w0 0 ;
f6: 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. ;
z. ;
h30: ; buffer start addr
e. ;
g2=k ;
g1: ;
g0: (:g2>9:)+1 ; size
0,r.4 ; name
s2 ; clock
0 ; file
0 ; block
3<12+0 ; contents
g2 ; size
d. ;
p. <:fpnames:> ;
p. <:insertproc:> ;
▶EOF◀