|
|
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: 60672 (0xed00)
Types: TextFile
Names: »hcdrivert«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦this⟧ »hcdrivert«
(hcdriverpr=slang list.no xref.no;
hcdriverpr) ;
b. g2 w. ;
s. a82,b54,c3,h50,i100 w.;
;.**************************************************************************
; DRIVER
;***************************************************************************
c0=-1 ; c0>=0 test. c0<0 normal use as driver
c1=-c0 ;
c2= -1 ; c2>0 for rhdriver and normal use
c3= -c2*c1 ; c3>0 for hcdriver and 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 ; -
a20= 20 ; -
a22= 22 ; -
a49=a22-a40+2 ; buffer length
a25=106 ; a25=start of save area
a48=10 ; max numbers of buserrors
a50= 21<3 ; level 21
a51= 22<3 ; level 22
a53=5 ;
a54= a53*4 ; time out limit for mess, buff
a55= a53*20 ; 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
; -5 address request(mbuf)
; -6 mbuf copy request
; -7 mbuf copy completed
; -8 mon call completed answer in receiver field
; -9 answer (buffer not transmited)
; -10 buffer containing a mbuf address
; -11 child copy buffer
; -12 an answer mirror buf
; -13 stop i. p. buf
\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
;
; output
; 2.0001 a send buffer request is sent
; 2.0010 a buffer is sent
; 2.0100 a send data request is sent
; 2.1000 data is sent
;
; input
; 2.0001 an input buffer request is received
; 2.0010 a start input buffer is sent
; 2.0100 an input data request is received
; 2.1000 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
a69=18 ; buffer link for mirror buf: next
a70=20 ; prev
a71=22 ; reciver (mirror buf)
a72=24 ; sender (mirror buf)
a73=26 ; result
a74=28 ; status
a80=a74-a60+2 ; 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
;
;
a81=16 ;
a82=100 ; number of links
\f
b51: rs. w3 h7. ; save own process descr addr
c. c3 ;
al w0 0 ; interrupt mask:=0
al. w3 b44. ; interrupt address
jd 1<11+0 ; set interupt
z. ;
jd 1<11+28; set monitor mode
al w0 6 ;
rl. w3 h7. ; w3:=own proc desr
hs w0 x3+104 ; disable interrupt level:=6
rl w1 x3+22 ;
rs. w1 h11. ; save first of program
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
al w0 4 ;
jd 1<11+32; set own process descr addr in monitor
c. c1 ;
rl w3 8 ; w3:=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
z. ;
c. c3 ;
al w0 2 ;
jd 1<11+30; set cpu1
al w0 2 ;
al. w2 b51. ; w2:=proc start
rl. w3 h5. ;
jl. w3 x3+b51. ; goto autoload HC8000
z. ;
jl. w3 b50. ; init free chains
c. c0 ;
al. w3 h23. ;
jd 1<11+4 ;
sh w0 0 ;
jl. -6 ;
rl w2 0 ;
rl w3 x2+22 ; w3:= first addr
wa w3 x2+98 ; +base
al w2 x3 ;
al w3 x3+6 ;
rs. w3 h0. ; input location
al w3 x3+8 ;
rs. w3 h1. ; output location
al w0 0 ;
al w3 x2 ;
al w2 0 ;
rs w0 x3 ; clear interrupt table
al w2 x2+2 ;
al w3 x3+2 ;
sh w2 32 ;
jl. -8 ;
z. ;
jl. w3 b18. ; send time out limit to clock
\f
i0: rl. w1 h4. ; w1:=output-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 h8. ; w1:=input-state
sz w1 2.1010 ; if a ready for input is sent then
jl. i3. ; goto wait event
so w1 2.0001 ; else if an input buffer request is not sent then
jl. i2. ; goto test data
al w0 8 ; 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.0100 ; 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. i48. ; return 2: goto send input data ready signal
i3: al w2 0 ;
c. c0 ;
al w0 0 ;
rl. w3 h0. ;
rx w0 x3+2 ; w0:=last 'external interrupt' if any
sn w0 0 ; if no input interrupt then
rx w0 x3+12+a81 ; test input request
sn w0 0 ;
rx w0 x3+10 ; test output interrupt
z. ;
je. 2 ; interrupt level:=26
c. c0 ;
sn w0 0 ; if no 'external interrupt' then
z. ;
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
se w0 0 ; if not message then
jl. i50. ; goto i50
rs. w2 h2. ; else save buf addr
rl w0 x2+a40 ; w0:=buffer status
sn w0 -14 ; if interrupt 16,18 or 20 then
jl. i4. ; goto serve interrupt
sl w0 -7 ; if mbuf address or
sn w0 -4 ; served mirrorbuffer then
jl. i7. ; goto search waiting chain
jd 1<11+26; get event
jl. i11. ; goto link buff
i4: jl. w3 b54. ;
rl w0 x2+a8 ;
jl. w3 b39. ; remove buff
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 h8. ; w3:=input-state
sz w3 2.1010 ; 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
ls w0 -19 ;
sn w0 15 ; if mondump o. c. then
jl. i12. ; goto i12
se w0 8 ; if not i-o mess then
jl. i0. ; goto next event
jl. w3 b7. ; get i-o mess type
ls w0 -16 ;
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: rx w1 4 ; save w1
jl. w3 b5. ; remove buf
rx w1 4 ; restore w1
jl. w3 b10. ; search link with buf.w2
jl. i68. ; not found: goto remove buf
jl. i10. ; found:
i9: al w3 -12 ;
sn w0 -1 ; if copy buf then
rs w3 x2+a40 ; set buffer state to answer mirror buf
i10: al w0 0 ; set link state
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.0001 ;
lo. w0 h4. ; set output-state
rs. w0 h4. ;
jl. w3 b21. ; set link state
jl. i0. ; goto next event
i20: jl. w3 b8. ; get transfer-id from last data in
jl. w3 b16. ; search transfer-id
jl. i21. ; not found: goto seaech transfer-id o. c.
jl. i22. ; else goto i22
i21: jl. w3 b15. ; search transfer-id o.c. in case answer mirror buf
jl. i0. ; if not found then goto next event
i22: rs. w1 h6. ; set current output link
rl. w0 h3. ; w0:=last di value
rs w0 x1+a64 ;
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.0010 ;
rs. w0 h4. ; set output-state
jl. w3 i39. ; goto next event
\f
al w0 0 ;
rs. w0 h4. ; set i-o state (to nothing output pendling)
rl. w1 h6. ; w1:=current output link addr
rl w2 x1+a63 ; w2:=buffer addr
rl w0 x2+a40 ; w0:=buf.status
se w0 -6 ; if mbuf copy request or
sn w0 -1 ; a buf from copy then
jl. i32. ; goto i32
sn w0 -5 ; if a mbuf address request then
jl. i37. ; goto i37 else
sn w0 0 ; 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
jl. w3 b39. ; return buf
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
sz w0 -8 ; 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
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 w0 x1+a62 ; w0:=link state
; se w0 10 ; if real buff then
; jl. i36. ; goto i36 else
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.0100 ;
rs. w0 h4. ; set output-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 w0 x1+a62 ;
sz w0 2.0010 ; if linkstate<>2 and
sz w0 2.0101 ; linkstate<>10 then
jl. i0. ; 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
rs. w0 h4. ; set output-state
rl. w1 h6. ; save current link
jl. w3 i39. ; goto next event
al w0 0 ;
rs. w0 h4. ; set ouptut-state to nothing pendling
rl. w1 h6. ; w1:=link
rl w2 x1+a63 ; w2:=buf
rl w0 x1+a62 ; w0:=linktype
sl w0 8 ; if mirror link then
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 w2 0 ;
jd 1<11+126; get buffer
sn w2 0 ;
jl. i40. ;
rs. w2 h2. ; curr buf
jl. w3 b28. ; link buf
dl w0 x2+a2 ; w0.w3:=buffer link
ds w0 x1+a70 ; save buffer link before the buffer transfer
dl w0 x2+a6 ; save sender,receiver
ds w0 x1+a72 ;
al w0 a54 ;
rs w0 x1+a68 ; set time out limit
al w0 2.0001 ;
jl. w3 b3. ; goto set input-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
al w0 2.1110 ;
jl. w3 b2. ; remove input state
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.0010 ;
jl. w3 b3. ; set input-state
jl. w3 b29. ; change link state
jl. w3 i49. ; goto to next event
\f
al w0 2.1101 ;
jl. w3 b2. ; remove input state
rl. w1 h14. ;
rl w2 x1+a63 ; w2:=buff
dl w0 x1+a70 ; restore buffer link
ds w0 x2+a2 ;
dl w0 x1+a72 ; restore sender,receiver
ds w0 x2+a6 ;
rl w0 x2+a40 ; w0:=buf.state
c. c3 ;
jl. w3 b46. ;
z. ;
sn w0 0 ; if message then
jl. i43. ; goto i43
sn w0 -5 ; if mbuf address request then
jl. i66. ; move buffer to master
se w0 -6 ; if mbuf copy requeset or
sn w0 -1 ; a mirror buf from copy o.c. then
jl. i44. ; goto i44
sn w0 -4 ; if state= -4 then
jl. i47. ; goto i47
jl. w3 b11. ; else search mbuf-id
jl. i47. ; not found: goto search transfer-id
jl. i52. ;
i47: rl w0 x1+a64 ;
la. w0 h20. ; w0:=transfer id
jl. w3 b17. ; search buffer in chains
jl. i50. ; not found: return buffer
; w1=chain.real buf
; w2=mirror buff
; (h14)=chain.mirror buff
i52: rl w0 x2+a40 ; w0:= buf state
rs. w1 h24. ; save chain.real buff
sn w0 -11 ; if a child copy buffer then
jl. i41. ; goto i41
se w0 -8 ; if mon completed or
sn w0 -10 ; mbuf address then
jl. i41. ; goto i41
al w0 1 ;
rl w3 x1+a73 ;
sn w3 0 ; if not any result yet then
rs w0 x1+a73 ; set result 1 (the buffer is only waiting for an answer)
al. w1 h9. ; w1:=answer area
al w2 x2+a8 ;
jl. w3 b35. ; goto move eigth words
rl. w1 h24. ; w1:=chain.real buf
al w2 x2-a8 ; w2:=mirror buff
jl. w3 b34. ; goto set result in chain.real buff
rl. w1 h14. ;
jl. w3 b39. ; remove mirror buff
jl. w3 b9. ; remove chain
rl. w1 h24. ; w1:=chain:=real buff
rl w2 x1+a63 ; w2:=real buff
jl. i75. ; goto set and test result
i41: rl w1 x1+a63 ; w3:=real buff
rs w0 x1+a40 ; set buffer state to mbuf address
al w1 x1+a8 ;
al w2 x2+a8 ;
jl. w3 b35. ; move message (or answer)
al w2 x2-a8 ;
rl. w1 h14. ; w1:=chain.mirror
jl. w3 b39. ; remove mirror buf
jl. w3 b9. ; remove mirror chain
rl. w1 h24. ; w1:=chain.real buff
rl w2 x1+a63 ; w2:=real buf
jl. w3 b9. ; remove chain
jl. i66. ; goto move buffer to master
\f
i43: al w0 -3 ;
rs w0 x2+a40 ; buffer state:=mirror buffer (normal)
dl w0 x2+a6 ; change sender/receciver.this computer
rx w0 x2+a34 ;
rx w3 x2+a36 ; with sender/reciever.other comp.
rs w3 x2+a4 ;
sz w0 -8 ; if address then
rs w0 x2+a6 ; save receiver
jl. i66. ; and move buffer to master
i44: bz w0 x2+a8 ;
se w0 3 ; if not input message then
jl. i46. ; goto test output
jl. w3 b30. ; else buffer state:=output
jl. i0. ; i. e. it is a mirror buf
i46: se w0 5 ; if not output message then
jl. i43. ; move buf to master
jl. w3 b31. ; buffer state:=input (i.e. it is a mirror buf)
al w0 2.0100 ;
jl. w3 b3. ; set input-state
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
i48: rs. w1 h14. ; set current link
al w0 2.1011 ;
jl. w3 b2. ; remove input state
rl w2 x1+a63 ; w2:=buf
jl. w3 b47. ; 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 ;
ds. w0 h16. ; set next input addr
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.1000 ;
jl. w3 b3. ; set input-state
jl. w3 i49. ; set return point and goto next event
;
al w0 2.0111 ;
jl. w3 b2. ; remove input state
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 h12. ;
jd 1<11+18; remove buff
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 w3 x1+a68 ; time out limit:=
al. w3 x3-a53 ; time out limit- 1 slice
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
sz w1 -8 ; if not an answer then
jl. i62. ;
jl. i7. ; else goto search link
i62: se. w1 ( h7.) ; if receiver<>this proc then
jl. i64. ; goto i64
i68: jl. w3 b39. ; remove buff
jl. i0. ; goto next event
i67: am -1 ; set result 3 address error
i64: al w0 4 ; set result 4 rejected (buserror)
rs w0 x1+a73 ; set result
rl w0 x1+a62 ; w0:=link state
sn w0 7 ; if waiting for answer buf then
jl. i0. ; goto next event
jl. i75. ; goto send answer
i66: al. w3 h10. ;
jd 1<11+34; move buf to master proc
jl. i0. ; goto next event
;
i69: al w0 1 ;
rs w0 x1+a73 ; set result=1
al w0 0 ;
rs w0 x1+a74 ; and set status
rl w0 x2+a40 ;
sn w0 -11 ; if a child copy buffer then
jl. i75. ; goto send answer
rl w0 x1+a62 ; w0:=link type
sl w0 7 ; if mirror buf then
jl. i70. ; goto i70
jl. w3 b27. ; else set link state=wait for answer
jl. i0. ; and goto next event
i70: rl w0 x2+a40 ;
se w0 -6 ; if not mbuf copy buffer then
jl. i9. ; make buffer ready to be output
al w0 -7 ; else buffer state:=mbuf copy completed
rs w0 x2+a40 ; and
jl. i66. ; move buffer to master
i75: ; send answer and remove chain
jl. w3 b36. ; send answer
jl. w3 b9. ; remove chain
jl. i0. ;
;
i12: al w3 2.11111; core dump from o. c.
ls w3 19 ;
ds. w0 ( h1.) ;
je. w3 b0. ; send ready message
jl. 2 ;
al. w2 b49. ; addr for input monitor o.c.
al w2 x2+2000 ;
al w1 0 ;
ds. w2 ( h0.) ;
rl. w1 h7. ;
rl w0 x1+a25+4 ; wait for interrupt 18
se w0 18 ;
jl. -4 ;
jl. w3 b1. ; input
je. 2 ;
je. 2 ;
jl -2 ; halt
\f
m. var area ;
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 ; output-state
h5: b49 ; next register value at data-out
h6: 0 ; current output link
h7: 0 ; own proc descr addr
h8: 0 ; input-state
h9: 0,r.8 ; message
h10: <:rhmaster:>,0,0 ;
h11: 0 ; first of proc
h12: 0,r.8 ; pseudo message
h13: <:hcdriver:>,0,0,0; own 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
h21: <:clock:>,0,0,0 ;
h22: 0 ; next link
h23: <:rhmi:>,0,0,0,0 ; receiver name
h24: 0 ; chain address
h28: 0 ; output return addr
h29: 0 ; input return point
h31: 0,0 ; activ link chain head
h32: 0,0 ; free links head
\f
c. c1 ;
;;
;
;
; 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
;*** exception instructions does not work yet
; xs. g4. ; save ex:=ex;
; 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
c. -1 ;
bz. w3 g4. ;
al w0 x3+48 ; set exception text
al. w3 b52. ;
rs w0 x3+14 ;
z. ;
rl. w3 g3. ;
jl x3+0 ;
f3: rl. w3 g3. ;
jl x3+2 ; and return
g0: 1<23 + a51 +2.001 ;
g1: 0 ;
g3: 0 ;
g4: 0 ; exception value;
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
;*** exception instruction does not work
; xs. g4. ; save ex:=ex
; 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
c. -1 ;
bz. w3 g4. ; write ex value
al w3 x3+48 ;
ls w3 8 ;
al w0 x3+105 ; <:i:>
ls w0 8 ;
al. w3 b52. ;
rs w0 x3+16 ;
z. ;
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
g4: ; exception value;
e. ;
z. ;
\f
c. c0 ; code for simulation of input output
b. f5,g5 w. ; output to hc
b0: al w0 18 ;
rs. w3 g3. ;
rl. w3 h1. ;
rs w0 x3+4 ;
rl. w0 h5. ; w0:=do reg value
rs w0 x3-2 ;
rl. w3 g3. ;
jl x3+2 ;
g3: 0 ;
e. ;
b. f5,g5 w. ; input
b1: ds. w1 g1. ;
ds. w3 g3. ;
rl. w1 h0. ;
rl w3 x1+6+a81 ; do reg value
rs. w3 h3. ;
sh w3 0 ; if nothing to transfer then
jl. f5. ; return
rl w2 x1+8+a81 ; w2:=from address
rl w1 x1 ; w1:= to address
f0: rl w0 x2 ;
rs w0 x1 ;
al w1 x1+2 ;
al w2 x2+2 ;
al w3 x3-2 ;
sl w3 1 ; if more to transfer then
jl. f0. ; goto f0
rl. w1 h0. ;
al w0 16 ;
rs w0 x1+2 ; set input finis
al w0 20 ;
rs w0 x1+10+a81 ; set output finis
f5: dl. w1 g1. ;
dl. w3 g3. ;
jl x3+2 ; return
g0: 0 ;
g1: 0 ;
g2: 0 ;
g3: 0 ;
e. ;
;.
; controller table level 26,27,28 and 29
;
; *---------------*---------------*---------------*---------------*
; ! di reg val ! input addr ! interrupt ! 26 !
; ! RH8000 ! ! level ! !
; *---------------*---------------*---------------*---------------*
; ! do reg val ! output addr ! interrupt ! 27 !
; ! RH8000 ! ! level ! !
; *---------------*---------------*---------------*---------------*
; ! di reg val ! input addr ! interrupt ! 28 !
; ! HC8000 ! ! level ! !
; *---------------*---------------*---------------*---------------*
; ! do reg val ! output addr ! interrupt ! 29 !
; ! HC8000 ! ! level ! !
; *---------------*---------------*---------------*---------------*
z. ;
\f
;;
;
;
;
; remove input-state
; w0=state
;
b. f5,g5 w. ;
b2: ;
la. w0 h8. ;
rs. w0 h8. ;
jl x3 ; return
e. ;
;; set input-state
; w0=state
b.w. ;
b3: lo. w0 h8. ;
rs. w0 h8. ;
jl x3 ;
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. ;
b47: ;
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
;; insert a link
; w1=element, w2=head
; return: w1,w2 unchanged, w3 prev element
b. g5 w. ;
b4: rs. w3 g3. ;
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. ( g3.) ; return
g3: 0 ;
e. ;
;
;; remove a link
; w1=element
; return: w1,w2 unchanged, w3=next element
b. g5 w. ;
b5: 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. ;
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. ;
;; 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
b. g5 w. ;
b9: rs. w3 g3. ;
jl. w3 b5. ; remove link
rs. w3 h22. ; save next element
rs. w2 h2. ; save current buffer
al. w2 h32. ; free chain head
jl. w3 b4. ; insert link
rl. w2 h2. ;
jl. ( g3.) ;
g3: 0 ;
e. ;
\f
;; search a link with buf.w2
; call: w2=buf
; return w0,w2,w3 unchanged
; w1=link if found
; w1=link chain head if not found
b. f5,g5 w. ;
b10: ;
al. w1 h31. ; w1:=first link addr
jl. f1. ; goto test
f0: sn w2 (x1+a63) ; if w2=buf.link then
jl x3+2 ; return 2
f1: rl w1 x1 ; w1:=next
se. w1 h31. ; if more to compare then
jl. f0. ; goto f0
jl x3 ; else return 0
e. ;
;; search a chain with mbuf-id = mbuf-id.buffer
; if child copy buf then 7 words is compared
; call: w2=buf, w3=return
; return0 w0 mbuf-if.buffer, w2 unchanged, w1=chain head
; return2:w0 mbuf-if.buffer, w2 - , w1=chain
b. f5,g5 w. ;
b11: rs. w1 g1. ;
rs. w3 g3. ;
al w3 x3+2 ;
rs. w3 g4. ;
rl w0 x2+a40 ;
al. w1 h31. ;
jl. f1. ;
f0: sn. w1 ( g1.) ; if current chain then
jl. f1. ; goto next chain
sn w0 -11 ; if child copy buffer then
jl. w3 f3. ; compare 7 words else
rl w3 x1+a63 ; compare mbuf-id
rl w3 x3+a18 ;
sn w3 (x2+a18) ; if mbuf-id.buffer = mbuf-id.w1 then return2 else
jl. ( g4.) ; return2 else
f1: rl w1 x1 ; next mbuf
se. w1 h31. ;
jl. f0. ;
jl. ( g3.) ;
g1: 0 ;
g3: 0 ;
g4: 0 ;
f3: rs. w3 g5. ;
rl w3 x1+a63 ;
rl w0 x3+a8 ;
se w0 (x2+a8) ;
jl. ( g5.) ;
rl w0 x3+a10 ;
se w0 (x2+a10) ;
jl. ( g5.) ;
rl w0 x3+a12 ;
se w0 (x2+a12) ;
jl. ( g5.) ;
rl w0 x3+a16 ;
se w0 (x2+a16) ;
jl. ( g5.) ;
rl w0 x3+a18 ;
se w0 (x2+a18) ;
jl. ( g5.) ;
rl w0 x3+a20 ;
se w0 (x2+a20) ;
jl. ( g5.) ;
rl w0 x3+a22 ;
se w0 (x2+a22) ;
jl. ( g5.) ;
jl. ( g4.) ;
g5: 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
jl. f1. ; then goto return 0
f0: sn w0 (x1+a62) ; if link is in state.w0
jl. f2. ; goto return 2;
f1: rl w1 x1 ;
se. w1 h31. ; if more links then
jl. f0. ; get next
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. f5,g5 w. ;
;; search a link with transfer-id o. c. = w0
; and buffer state = -12 (answer mirror buf)
; if found then return 2
; else return 0
; return: w0, w2 unchanged. w1=link
b15: ;
rs. w3 g3. ;
al w3 x3+2 ;
rs. w3 g4. ;
al. w1 h31. ; w1:=link head for input
jl. f1. ;
f0: rl w3 x1+a64 ;
la. w3 h20. ; w3:=transfer id
se w0 x3 ; if link state not equal then
jl. f1. ; goto next link else
rl w3 x1+a63 ; w3:=buf
rl w3 x3+a40 ; w3:=buffer state
sn w3 -12 ; if buffer state=-12 then
jl. ( g4.) ; return2 else
f1: rl w1 x1 ;
se. w1 h31. ; if more links then
jl. f0. ; get next
jl. ( g3.) ;
g3: 0 ;
g4: 0 ;
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 x3+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 a53 ; w3,w0:=mode,delay
al. w1 h12. ;w1:=buf
ds w0 x1+2 ;
al. w3 h21. ;
jd 1<11+16;
rs. w2 h17. ; save buf addr
jl. ( g3.) ;
g3: 0 ;
e. ;
\f
b. g5,f5 w. ;
b19: ; return buf to master (after time out)
rs. w3 g3. ; save return
al w3 512 ; w3:=2.0010 0000 0000
rs w3 x1+a74 ; set status
al w0 1 ;
rs w0 x1+a73 ; set result
rl w2 x1+a63 ; w2:=buff
al w0 -9 ; set buffer state to
rs w0 x2+a40 ; error answer
jl. w3 b36. ; send answer
rl w3 x1+a62 ; w3:=mbuf state
al w0 0 ;
sn w3 0 ; if nothing is done then
jl. f4. ; let i-o state unchanged
se w3 10 ; else if mbuf is waiting
sh w3 2 ; for output then
jl. f3. ; goto set output state
f0: so w3 2.11 ; if not inputbuffer
jl. f1. ; goto f1
al w0 2.0011 ;
jl. f2. ;
f1: al w3 x3-7 ; else set w0 to 2.1101 or
ac w0 x3 ; 2.1110 and
f2: jl. w3 b2. ; goto remove input state
jl. f4. ;
f3: rs. w0 h4. ;
f4: jl. w3 b9. ; remove link and insert link in free chain
rl. w1 h22. ; w1:=next element
jl. ( g3.) ; return
g3: 0 ;
e. ;
b.w. ; set result
b32: rl w0 x2+a4 ; w0:=result or receiver
sz w0 -8 ; if receiver then
al w0 0 ; set result 0
b33: rs w0 x1+a73 ;
jl x3 ; return
e. ;
\f
;; compare and set result
b.w. ;
b34: rl w0 x2+a4 ; w0:=result.mirror buff
sz w0 -8 ;
al w0 0 ;
sh w0 (x1+a73) ;
rl w0 x1+a73 ; w0:=higthest result
jl. b33. ; and return vie b21
e. ;
\f
;; move eigth words from core.w2 to core.w1
b. g3 w. ;
b35: rs. w3 g3. ;
dl w0 x2+2 ; move
ds w0 x1+2 ;
dl w0 x2+6 ;
ds w0 x1+6 ;
dl w0 x2+10 ;
ds w0 x1+10 ;
dl w0 x2+14 ;
ds w0 x1+14 ;
jl. ( g3.) ; return
g3: 0 ;
e. ;
;; send answer
b. f6,g6 w. ;
b36: ds. w1 g1. ;
ds. w3 g3. ;
c. -1 ;
al. w3 h23. ;
rl w2 x2+a6 ; w2:=sender
dl w1 x2+2 ;
ds w1 x3+2 ; move sender name
dl w1 x2+6 ;
ds w1 x3+6 ;
dl. w2 g2. ; w1:=chain , w2:=buf
z. ;
rl. w3 h9. ;
ac. w0 ( h7.) ;
rs w0 x2+a4 ; set hcdriver as receiver
rl w0 x1+a74 ;
lo w0 x3 ; set status
rs w0 x3 ;
rl w0 x1+a73 ; w0:=result
al. w1 h9. ; w1:=answer
jd 1<11+22; send answer
dl. w1 g1. ;
dl. w3 g3. ;
jl x3 ; return
g0: 0 ;
g1: 0 ;
g2: 0 ;
g3: 0 ;
e. ;
;; remove buff
b. f3,g1 w. ;
b39: ;
jd 1<11+126; remove buffer
jl x3 ;
e. ;
b54: jl. b46. ; step
\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. ;
jl. w3 b46. ;
sz w0 2.111 ; if already linked then
jl. f0. ; goto f0
rl. w1 h32. ; else get a free link
jl. w3 b5. ;
al. w2 h31. ; and insert in
jl. w3 b4. ; activ queque
rs w0 x1+a62 ;
ld w0 -100 ;
ds w0 x1+a64 ; clear mbuf
ds w0 x1+a67 ;
ds w0 x1+a69 ;
ds w0 x1+a73 ;
rs w0 x1+a74 ;
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+a80 ; w1:=next link
sh w0 a82 ;
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 3 ; 3: ready for receiving data
ds. w0 g0. ;
rl w3 x1+a62 ; w3:=io-mess-type
rl w0 x2+a40 ; w0:=buffer state
sn w0 -12 ; if buffer state=answer mirror buf then
al w3 8 ; load mirror type
rl. w0 h20. ; w0:=mask for extracting transfer-id
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. ;
c. c3 ;
\f
b. g11,f10 w. ; program interrupt
g0=8 ; number of reg.
g1=9 ; number of digits per reg
b44: 0,r.g0 ; register values
je. 2 ;
al w1 32 ;
al. w2 g8. ; first of buff
f1: rs w1 x2 ;
al w2 x2+2 ;
se. w2 g9. ;
jl. f1. ;
al. w1 b44. ; 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 b44.+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 b44.+(:(: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 b44.+2 ;
dl. w3 b44.+6 ;
jl. 0 ;
jl. ( b44.+10); return to program
g3: 10 ;
g4: 5<12+0 ; mess
0,r.7 ;
g5: <:console1:>,0,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. ;
b. f10,g10 w. ; internal testprint
g7=16 ;
b46: ; testoutput
ds. w1 g1. ;
rs. w2 g2. ;
rx. w3 g3. ;
se w3 0 ;
jl. f0. ;
rl. w3 g4. ;
wa. w3 h11. ;
rs. w3 g5. ;
rl. w2 h7. ;
rl w2 x2+24 ;
al w2 x2-g7 ;
rs. w2 g6. ;
rl. w2 g2. ;
f0: ds w1 x3+2 ;
rs w2 x3+4 ;
rl. w2 g3. ;
ws. w2 h11. ;
rs w2 x3+6 ;
rl. w1 h4. ;
rl. w2 h8. ;
ds w2 x3+10 ;
dl w2 110 ;
ds w2 x3+14 ;
c. -1 ;
rl. w2 g2. ;
sh w2 2000 ;
jl. f1. ;
rl w2 x2+a18 ;
rs w2 x3+8 ;
z. ;
f1: al w3 x3+g7 ;
sl. w3 ( g6.) ;
rl. w3 g5. ;
rx. w3 g3. ;
rl. w2 g2. ;
dl. w1 g1. ;
jl x3 ;
g0: 0 ;
g1: 0 ;
g2: 0 ;
g3: 0 ;
g4: b45 ;
g5: 0 ;
g6: 0 ;
e. ;
z. ;
\f
c. c3 ;
b. f40,g20 w. ;
b49: ;
rs. w3 g10. ;
wa. w2 g7. ; w2:=mon input addr.
rs. w2 g7. ;
al. w1 g0. ;
al. w3 g1. ;
jd 1<11+42; lookup(<:kkmon8004:>)
se w0 0 ; if not found then
jl. f31. ; goto f31
rl. w2 g0. ; w2:=
ls w2 9 ; monitor size
rs. w2 g9. ;
rl. w1 g7. ; first byte
wa w2 2 ; last addr
ds. w2 g4. ;
al. w3 g1. ;
jd 1<11+52;
jd 1<11+8 ; create and reserve(<:kkmon8004:>)
se w0 0 ; if error then
jl. f32. ; goto f32
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. f33. ; goto f33
rl w2 x1+2 ; w2:=number of halfwords
al w2 x2+512 ;
sh. w2 ( g9.) ; if data missing then
jl. f1. ; try agian
jd 1<11+64; remove arrea proc
jd. 2 ;
al w2 -1 ; start output section
rs. w2 h5. ;
jl. w3 b0. ; start HC8000
je. f35. ;
f3: jl. w3 f19. ; wait interrupt
se w0 18 ;
jl. f3. ;
jl. w3 f18. ; get ready signal
al w3 4 ;
al. w0 g6. ;
rs. w3 h5. ;
ds. w0 ( h1.) ;
jl. w3 b0. ; send data transfer request
je. f35. ;
al w1 0 ;
f7: jl. w3 f19. ; wait interrupt
sl w0 16 ; if interrupt level<16 or
sl w0 21 ; interrupt level>20 then
jl. f7. ; goto wait
al w1 x1+1 ;
sn w0 18 ; if ready signal then
jl. w3 f18. ; load signal
sh w1 1 ; if not both interrupt received then
jl. f7. ; goto wait
al. w0 h30. ;
rl. w3 g4. ; w3:=last addr
ws w3 0 ; w3:=number of halfwords
rs. w3 h5. ;
ds. w0 ( h1.) ;
jl. w3 b0. ; start output to HC8000
je. f35. ;
al w1 0 ;
f9: jl. w3 f19. ; wait interrupt
sl w0 16 ; if interrupt level<16 or
sl w0 21 ; interrupt level>20 then
jl. f9. ; goto wait
al w1 x1+1 ;
sn w0 18 ; if ready signal then
jl. w3 f18. ; load signal
sh w1 1 ; if not both interrupt received then
jl. f9. ; goto wait
je. ( g10.) ; return
;
\f
f18: rs. w3 g8. ;
jl. w3 b1. ; get input mess
je. f35. ;
jl. ( g8.) ;
;
f19: al w2 0 ; wait
jd 1<11+24; wait
rl w0 x2+a8 ; w0:=int level
jd. b39. ; remove buf and return
g11: <:monitor program do not exist<10> :>;
g12: <:create area proc(monitor) error<10> :>;
g13: <:input error - monitor <10> :>;
b52: ;
g15: <:buseror at 2901 ex = <10> <0>:>;
g16: <:s:>,0,0,0,0 ;
g17: 1<13+1,<:finis:>,0,0,0,0,0;
g18: g12-g11 ;
g19: 5<12,0,r.7 ;
g20: <:console1:>,0,0 ;
;; error
f31: am g11-g12;
f32: am g12-g13;
f33: am g13-g15;
f35: al. w2 g15. ;
al. w1 g19. ; w1:=mess addr
rl. w3 g18. ; w3:=mess length
wa w3 4 ;
al w3 x3-2 ;
ds w3 x1+4 ;
al. w3 g20. ; w3:=name addr
jd 1<11+16;
jd 1<11+18;
jd 1<11+4 ; if process exist then
se w0 0 ;
jd 1<11+64; remove process
al. w1 g17. ;
al. w3 g16. ;
jd 1<11+16;
jd 1<11+18;
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: 1,1 ; number of shares
g7: b45 ; input start addr
g8: 0,r.8 ;
g9: 0 ; share length
g10: 0 ; return
e. ;
z. ;
m. link area ;
h30: ;
c. c3 ;
b. g5,f5 w. ;
g0: 8388600 ;
g1: 1<23+22<3+2.001 ;
g2: 0 ;
rl. w2 g0. ;
rs w2 248 ;
rs w2 274 ;
al w3 18 ;
rs w3 124 ;
al. w3 f2. ;
al w2 -40 ;
do. w2 ( g1.) ;
jl. f2. ;
f2: jl. 2,r.1000;
e. ;
z. ;
jl. 2,r.(:(:a82+1:)*a80>1:); buffer start addr
c. c3 ;
jl. 8 ;
m. b45 ;
b45=k ;
z. ;
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◀