|
|
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: 29184 (0x7200)
Types: TextFile
Names: »alw«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦this⟧ »alw«
;;;;;;;; Microcomputer network ;;;;;;;;
;;;;;;;; M6800 version ;;;;;;;;
;;;;;;;; for RC8000 ;;;;;;;;
;;;;;;;; single plexer ;;;;;;;;
m. microcomputer network RC8000 83-03-10
;Anders Lindgård
s. b. a100, b100, c50, d20 , e50, r5, p15, g70 w.
k=10000
c.1
p.<:fpnames:>
k=h55
z.
jl. 2
jl. 2
jl. e2. ; goto init
t.
m. end of options
a3=a2/2*3 ; chars in block
a4=a2-2 ; increment for last address
a17= 22 ; first address of internal
a18= 24 ; last address of internal
; format of a block
a50=0 ; buffer address received
a51=a50+2 ; buffer address send TRM
a52=a51+2 ; state (0=free , 1=message accepted, 2=answer received rec)
a53=a52+2 ; nextcoroutine
a54=a53+2 ; primitive message first word
a55=a54+2 ; primitive message second word
a56=a55+2 ; primitive answer first word
a57=a56+2 ; primitive answer 2.word
a60=a57+2 ; message received (0,r.8)
a61=a60+16 ; answer to message received (0,r.8)
a62=a61+16 ; message to DATA (0,r.8)
a63=a62+16 ; answer from DATA (0,r.8)
a64=a63+16 ; timeout
a65=a64+2 ; link
a66=a65+2 ; link
a67=a66+0 ;
a68=a67+2 ;pmess 1 for abs DATA
a69=a68+2 ;pmess 2 for abs DATA
a70=a69+2 ; semaphore abs DATA input
a71=a70+2 ; buffer address DATA
a72=a71+2 ; buffer 0,r.256
a80=a72+a2 ;last of block
; format of receiver table
; +0 buffer address or 0
; +2 primitive answer 1.word
; +4 primitive answer 2.word
; +6 buffer address or 0
a8=6 ; size of record
g30: 0,r.(:a1*a8/2:)
g31:
g50: 8.7777 7776 ; first 23 bit
g67: 7<1 ; mask buffer index
g68: 8.0017 7776 ; last 16 bit (even)
g69: 8.3700 0000 ; mask operation code
g70: 8.3770 0000 ; mask operation code+mode
p.<:chop:>
;;;;;;;;;;;; common procedures ;;;;;;;;;;
;
; message format primitive message
;
; operation codes
; sense 0<3
; start 2<3
; transfer completed 4<3
; stop 6<3
; autoload 8<3
; sense monitor 20<3 (command channel only)
; input 3<3
; output 5<3
;
;operation codes from RC8000 user process
;
; 0<12+mode ; sense
; 2<12+mode ; start
; 4<12+mode ; transfer completed
; 6<12+mode ; stop
; 8<12+mode ; autoload
;;10<12+mode ; lock
;;12<12+mode ; unlock
; 3<12+mode ; input
; 5<12+mode ; output
;
; autoload will send an autoload message and perform a lock
;
;
; 0 1 7 8 16 18 2223
;----------------------------------------------------!
; 0! opcode ! address ( ) ! 0 !
;----------------------------------------------------!
; receiver ! buf ! 1!
;----------------------------------------------------!
; 0 1920 2223
;
; answer format from receiver
;
; 0 1 7 8 1112 1516 1819 2223
;-------------------------------------------------!
; 1! status ! ! ! ! pst ! 0!
;-------------------------------------------------!
; receiver ! buf ! 1!
;-------------------------------------------------!
; 0 1920 2223
;
; in transfer completed "address" is by convention regarded
; as a blocknumber
; message buffer format from user process
; +8 <operation> <mode>
; +10 <first address>
; +12 <last address>
; +14 <first address local micro>
; message buffer format TRM/DATA
;-2 <flag>
;+8 5<12
;+10 <first address>
;+12 <last address>
; .
;+20 <descriptor>
\f
; procedure compute address
; call return
; w0 destroyed
; w1 desc desc
; w2
; w3 link destroyed
b. i10 ;begin
w. ;
m. compute address
i8: 0,0 ; save address
i0: 7<5 ; mask for block index
i4: 8.7760 0000 ; first byte
i5: 0 ; link
e7: ;
rs. w3 i5. ; begin save link
rl w2 x1+a51 ; w2:=buffer send from user
rl w0 x2+14 ; w0:=address other
la. w0 g68. ; and last 16 bit
rs. w0 i8.+2 ; save address
rl w3 x1+a54 ; w3:=prim message 1. word
la. w3 i4. ;
lo w0 6 ; operation
rs w0 x1+a54 ;
jl. (i5.) ; end
e.
; procedure link operation
; call return
; w0 next coroutine
; w1 desc desc
; w2
; w3 link
b. i4 w.
e10: ; entry
rs. w3 i0. ; save return
rs. w1 i4. ; save desc
al. w3 e0. ; return:=first event
rs. w3 i1. ;
rs w0 x1+a53; save next
jl. w3 e11. ; examine queue
jl. i2. ; if empty then return
i3: rl. w1 i4. ; desc:=save desc
al w2 x1+a65; w2:=elem
rl. w1 b29. ; w1:=head
jl. w3 e6. ; link (head,elem)
rl. w1 i4. ; desc:=save desc
jl. (i1.) ; goto return
i2: rl. w3 i0. ; return:=link
rs. w3 i1. ;
jl. i3. ;
i0: 0 ; link
i1: 0 ; return
i4: 0 ; save desc
e.
; procedure examine queue(queue empty)
; call return
; w0 next coroutine
; w1 desc
; w2 elem
; w3 link destroyed
b. i2
w. e11: ; begin
rs. w3 i2. ;
i0: rl. w2 b29. ; w2:=head
sn. w2 b29. ; if queue empty
jl. (i2.) ; then goto empty
al w1 x2-a65 ; w1:=desc
rl w0 x1+a53 ; w0:=next coroutine
am. (i2.) ;
jl 2 ; link+2;
i2: 0 ; link;
e.
; procedure init DATA
; call return
; w0 coroutine
; w1 desc desc
; w2
; w3 link
b. i1 w.
i0: 0 ; return
e12: ;
rs. w3 i0. ; save return
rl w2 x1+a50 ; w2:=sender.buf
bz w0 x2+8 ;
;ks-100
hs w0 x1+a62 ; move operation
al w3 x1+a72 ; w3:=first address
al w0 x3+a4 ; last:=first+510
ds w0 x1+a62+4;
rs w1 x1+a62+14; message.last:=desc
al w2 a7 ; w2:=timeout
rs w2 x1+a64 ;
al. w3 b13. ; w3:=name DATA
al w1 x1+a62 ; w1:=message
al w2 4 ; w2:=flag
jd 1<11+16 ;
al w1 x1-a62 ;
rs w2 x1+a71 ; save buf
;ks -101
jl. (i0.) ; goto return
e.
; procedure init trm
; call return
; w0
; w1 desc desc
; w2 pmess (a name) buf
; w3 link
b. i5 w.
i0: 0 ; save return
e13: rs. w3 i0. ;
al w0 2 ; state:=2
rs w0 x1+a52;
wa w2 2 ; w2:=first
;ks -201
rs. w2 i2. ;
al w2 x2+2 ; last:=first+2
rs. w2 i3. ;
al. w3 b9. ; name:=TRM
rs. w1 i5. ; save desc:=desc
rs. w1 i4. ; dave desc in buffer
al. w1 i1. ; w1:=message
al w2 6 ; flag:=6
jd 1<11+16 ; send message
rl. w1 i5. ; w1:=desc
rs w2 x1+a51; save buf
;ks -202
jl. (i0.) ; return
i1: 5<12 ; message
i2: 0
i3: 0
0,r.4
i4: 0
i5: 0 ; save desc
e.
; procedure autoload
; all pending buffers in the queue are returned to the sender
; with dummy answer , rejected
;
; call return
; w0 childmask destroyed
; w1 desc desc
; w2 buf unchanged
; w3 link unchanged
;
b. i10, j8 ;begin
w.
m. autoload
j0: 0 ; mask
j1: 0 ; desc
0 ; buf
j2: 0 ; link
j3: 0 ; save desc
j4: 0 ; save desc
j5: 0 ; ref
e4: ; entry autoload
ds. w3 j2. ; save buf,link
ds. w1 j1. ; save proc and mask
rs. w1 j4. ; save desc:=desc
al w3 -a80 ; w3:=ref
i0: rl. w1 b50. ; w1:=base of descriptors
al w3 x3+a80 ; ref:=ref+size desc
wa w1 6 ; desc:=desc+ref
rs. w3 j5. ;
sl. w1 (b51.) ; if -,exhausted then
jl. i1. ; begin
rl w0 x1+a50 ; if no buffer send
ks-301
sn w0 0 ; begin
jl. i0. ;
rl w2 x1+a51 ; w2:=buf to TRM
se w2 0 ; if buf <>0 then
jd 1<11+82 ; regret message
rl w2 x1+a71 ; w2:=buf DATA
se w2 0 ; if buf <>0 then
jd 1<11+82 ; regret message
rl w2 x1+a65 ; w2.elem.first
se w2 x1+a65 ; if in queue then
jl. w3 e5. ; remove elem
rl w2 x1+a50 ; w1:=buf sender
al w0 2 ; result:=2
al. w1 b21. ; w1:=dummy answer
jd 1<11+22 ; send answer
al w0 0 ; desc.buf sender:=
rl. w1 b50. ;
rl. w3 j5. ; desc.buf to acia
wa w1 6 ;:=0;
rs w0 x1+a50 ;
rs w0 x1+a51 ;
rs w0 x1+a52 ; state:=0;
jl. i0. ; goto next desc
i1: dl. w1 j1. ;
dl. w3 j3. ;
jl x3 ;
e.
b. i4,j6
w. ; begin
c.-1
m. lock/unlock
j0: 0 ; lock bit
j1: 0 ; proc
j2: 0 ; buf
j3: 0 ; link
p8: ; lock:
am 1 ;
p9: ; unlock:
al w0 0 ;
ds. w3 j3. ; save link, save buf
ds. w1 j1. ; save proc, save switch
rl w3 x2+6 ; w3:=sender;
rl w3 x3+12 ; w3:=sender.idword;
sn w0 0 ; if lock then reserver:=w3 else 0
rs. w3 j0. ;
al w3 x1 ; w3:=proc;
i1: ; search in chain:
rl w3 x3+a72 ; w3:=next_in_chain(w3);
sn w3 0 ; if chain exhausted
jl. i3. ; then goto END
rl w0 x3+a75 ; w3:=proc.idword
la w0 x3+a80 ; and chain mask;
se w0 x1+a75 ; if match then
jl. i1. ; begin
rl. w0 j0. ; proc.reserver:=
rs w0 x1+a52 ; reserver;
jl. i1. ; end;
i3: ; END:
dl. w1 j1. ; restore
dl. w3 j3. ; registers
jl x3 ; return
e. ; end;
z.
b18: 3<12,0,r.7, b19: 0, b20: 0; input message receiver
0,r.5
b21: 0,r.8 ; answer receiver
b22: 0,r.8 ; answer transmitter
b25: 0,r.8 ; answer send dummy answer
b26: h. -1,r.(:a1+1:) ; bufindex table
w.
b27: a80 ; size of descriptor
b29: 0,0 ; link head for queue to DATA
b30: 0<12,a6,0,r.6 ; clock message
b31: <:clock:>,0,r.3 ; name clock
b50: 0 ; address first descriptor
b51: 0 ; last address last descriptor
;;;;;;;;;;;; micronetwork coroutines ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
b. i30, c5 ; begin
w. ;
i12: 0 ; save desc
d0: 0,r.8 ; coroutine indices
0, i20: 0 ; save w2,w3
i21: 0,0,0 ; save buf index,desc from rec
i22: 0,0 ; save des,buf d7
g17: ; entry answer
;flag: 2=RECeiver
; 4=DATA channel
; 6=TRansMitter
; 8=clock
; at entry w2:=buf
rl w3 x2-2 ; w3:=flag
ds. w3 i20. ; save w3,w2
; goto case flag
ks -10
jl. x3 ; of
jl. c0. ; receiver
jl. c1. ; datachannel
jl. c2. ; transmitter
jl. c3. ; clock
c5: ; return
rl w0 x1+a50 ; w0:=buf from user
rl w3 x1+a53 ; w3:=next coroutine
;ks -11
jl. (x3+d0.) ; case index of
c0: ; RECeiver
al. w1 g30. ; w1:=first address receivetable
i23: rl w0 x1 ; w0:=save buf
sn w0 x2 ; if save buf=buf then
jl. i24. ;
al w1 x1+a8 ;
sh. w1 g31.-2 ; if exhausted then
jl. i23.
jd 1<11+26 ; remove buffer
jl. e0. ; goto first event
i24: rl w0 x1+4 ; w0:=2. word prim answer
rs. w1 i21.+2 ; save address rec record
la. w0 g67. ; and 7<1
ls w0 -1 ; //2
;ks-19
rs. w0 i21. ; save bufindex
rl. w1 b50. ; w1:=base desc
wm. w0 b27. ; +descsize
wa w1 0 ; *buf index
rl w0 x1+a51 ; if Transmitter in progress
rl w3 x1+a50
;ks -20
se w0 0 ;
jl. e1. ;
rl w0 x1+a71 ; or DATA in progress then
;ks -21
se w0 0 ;
jl. e1. ; goto next event
rs. w1 i12. ; save desc
jd 1<11+26 ; get event
rl. w1 i21.+2 ; w1:=receiver record
dl w0 x1+4 ; w0,w3:=prim answer
rl. w1 i12. ; w1:=desc
ds w0 x1+a57 ;
;ks -22
al. w1 b18. ; send message
al. w3 b11. ; RECeiver
al w2 2 ; flag:=2
jd 1<11+16 ;
rl. w3 i21.+2 ; w3:=address of receiver record
rs w2 x3 ; save buf
rl. w1 i12. ; w1:=desc
rl w2 x1+a50 ; if no buffer then
ks-23
se w2 0 ;
jl. c5. ; goto next coroutine
jl. e0. ; else goto first event
c2: ;TRansMitter
al. w1 b22. ; w1:=answer
jd 1<11+18 ; wait answer
rl w1 x1+14 ; w1:=desc
al w0 0 ; buf:=
rs w0 x1+a51 ; 0
al w0 3 ; state:=3;
rs w0 x1+a52 ;
rl w0 x1+a50 ;
ks -40
jl. c5. ; goto next coroutine
c1: ; DATA channel answer
rl w1 x2+22 ; w1:=desc
rs. w1 i12. ; save desc
al w1 x1+a63 ; w1:=answer
jd 1<11+18 ; wait answer
al w2 x1-a63+a61 ; move answer to
dl w0 x1+4 ; answer to user
ds w0 x2+4 ; answer
rl w0 x1 ;
rs w0 x2 ;
al w1 x1-a63 ; w1:=desc
al w0 0 ; buf address:=
rs w0 x1+a71 ; 0;
al w0 4 ; state:=
rs w0 x1+a52 ; 4;
ks -30
al w2 x1+a65 ; w2:=elem
jl. w3 e5. ; remove elem
;ks -32
jl. c5. ; got next coroutine
c3: ; CLOCK
jd 1<11+26 ; get event
al. w3 b31. ; w3:=name clock
al. w1 b30. ; w1:=message clock
al w2 8 ; flag:=8
jd 1<11+16 ; send message
al w3 0 ;
rl. w1 b50. ; w1:=first desc
i4: rl w3 x1+a64 ; w3:=timeout
rl w0 x1+a50 ; if buffer>0
se w0 0 ; and
sh w3 0 ; if >0 then
jl. i5. ;
al w3 x3-1 ; time out:=timeout-1
rs w3 x1+a64 ;
;ks -50
se w3 0 ; if 0 then goto
jl. i5. ; next
jl. w3 g14. ; return buf
rl w2 x1+a65 ; if w2:=elem.first
se w2 x1+a65 ; <> elem.last then
jl. w3 e5. ; remove elem
;ks -51
i5: al w1 x1+a80 ; desc:=desc+descsize
sl. w1 (b51.) ; goto next desc
jl. i4. ;
jl. e0. ; goto first event
g7: ; entry from send
bz w3 x2+8 ; op:=buf.operation
bz w0 x2+9 ; if mode>0 then
ks -2
se w0 0 ; begin
jl. i1. ;
so w3 1 ; if op=even
jl. i1. ; then
dl w0 x1+a55 ;
ds w0 x1+a69 ; move primitive message
i2: ; ABS i/o
;ks -3
al w0 0 ; next coroutine
jl. w3 e10. ; link operation
d1: ; entry coroutne 0
rl w2 x1+a50 ; w2:=buf
bz w0 x2+8 ; w0:=operation
ks -4
se w0 3 ; if input then
jl. i3. ; begin
al w0 2 ; init
jl. w3 e12. ; DATA channel
al w2 a68 ; w2:abs mess
jl. w3 e13. ; send mess TRM
al w0 2 ; next:=d2
rs w0 x1+a53 ;
al w0 3 ; semaphore :=3
rs w0 x1+a70 ;
jl. e0. ; goto first event
d2: ; RETURN data, trm or rec
; 3=trm, 4=data, 5=rec
rl w0 x1+a50
rl w3 x1+a70 ; sema:=
al w3 x3-1 ; sema
rs w3 x1+a70 ; -1
ks-5
se w3 0 ; if sema>0 then
jl. e0. ; goto first event else
rl w2 x1+a50 ; w2:=sender.buf
bz w0 x2+8 ; w0:=op
;ks-501
se w0 3 ; if input then
jl. g15. ; begin
rs. w1 i12. ; save desc
al w1 x1+a72 ; w1:=first
al w3 x1+a4 ; w3:=last
jd 1<11+70 ; copy core
rl. w1 i12. ; w1:=save desc
;ks -6
al. w3 e3. ; return:=examine
se w0 0 ; if answer <>0 then
jl. g14. ; time out else
jl. g16. ; goto answer
i3: ; ABS OUPUT
al w2 a68 ; w2:=abs mess
al w0 4 ; next:=d3
rs w0 x1+a53 ;
jl. w3 e13. ; send mess TRM
;ks -7
jl. e0. ; goto first event
d3: ; RETURN TRM
al w0 6 ; next:=d4
rs w0 x1+a53 ; wait message
;ks -8
jl. e0. ; receiver
d4: ; RETURN REC
al w0 8 ; next:=d5
rs w0 x1+a53 ;
jl. w3 e12. ; init DATA channel
;ks -9
jl. e0. ; goto first event
d5: al. w3 e3. ; goto answer
jl. g16. ; and examine
i1: ; even or user i/o
al w0 10 ; next:=d6
rs w0 x1+a53 ;
al w2 a54 ; w2:=normal mess
jl. w3 e13. ; send TRM
rl w0 x1+a50 ;
;ks -60
jl. e0. ; goto first event
d6: ; RETURN TRM
al w0 12 ; next:=d7
rs w0 x1+a53
;ks -61
jl. e0. ; wait receiver
d7: ; RETURN REC
rl w2 x1+a50 ;
ds. w2 i22.+1 ; save desc,buf
bz w0 x2+8 ; w0:=op
;ks -62
so w0 1 ; if odd then
jl. g15. ; begin
rl w0 x1+a56 ; w0:= address from rec
la. w0 g68. ; extract 16 (even)
rl w3 x1+a54 ; w3:=operation
la. w3 g69. ;
lo w0 6 ; w0:=first word abs
rs w0 x1+a68 ;
rl w0 x1+a55 ; w0:= answer from rec 2. word
la. w0 g7. ; extract buf index
lo. w0 b16. ; and id bit
rs w0 x1+a69 ;
;ks -63
jl. i2. ; goto abs io
e.
;;;;;;;;;;;; micronetwork local microcomputer ;;;;;;;;;;;;;
;
b. i15, f1,f0=1<23 ; begin
w. f0>0+f0>2+f0>4+f0>6+f0>8+f0>3+f0>5
i0: 8.77400000 ;
i13: 0 ; save desc
i14: 0 ; save buf
m. local
e3: ; examine:
jl. w3 e11. ; examine queue
jl. e0. ; if empty goto first event
jl. d1. ; else init ABS IO
e0: ; wait message:
al w2 0 ; buf:=0;
e1: jd 1<11+24 ; wait event
;ks -80
se w0 0 ; if message then
jl. g17. ; begin
jl. w3 e15. ; check reservation
dl. w1 i0. ;
jl. w3 e16. ; check operation(0.2.4.6.8.3.5,0.1.2.3.4.5.6.7);
rs. w2 i14. ; save buf:=buf
al. w1 b26. ; w1 :=first index table
bz w0 x2+8 ; if operation>=8
sh w0 6 ; then
jl. i2. ; begin
sn w0 12 ; if operation=unlock
jl. i6. ; then goto unlock
rl. w0 b14. ; mask:=autoload mask
jl. w3 e4. ; autoload(mask)
bz w0 x2+8 ; if operation=lock
se w0 8 ; then
jl. r1. ; deliver result(1);
al w3 a1 ; bufindex:=max bufindex
jd 1<11+26 ; get event
jl. i4. ; goto buffer found
i6: ; unlock:
; jl. w3 p9. ;
jl. r1. ; deliver result(1);
i2: ; send message:
jd 1<11+26 ; get event
al w3 0 ;
i3: ; next index:
am x1 ;
bz w0 x3 ; index:=tableindex(curindex)
sl w0 a1 ; if buf index<max buffer index then
jl. i4. ; goto index found
al w3 x3+1 ; curindex:=curindex+1;
sh w3 a0-1 ; if curindex<maxindex then
jl. i3. ; goto next index
jl. e1. ; wait event(next event)
i4: ; buffer found:
am x1 ; proc.bufindex:=
hs w3 x3 ; bufindex;
rs. w3 i11. ; work:=bufindex
rl. w1 b50. ; w1:=first desc
wm. w3 b27. ; +buf index*
wa w1 6 ; descsize;
rs. w1 i13. ; save desc
rl. w2 i14. ; w2:=buf
bz w0 x2+8 ; w0:=op
se w0 5 ; if output then
jl. i12. ; begin
al w1 x1+a72 ; w1:=first
al w3 x1+a4 ; w3:=last
jd 1<11+70 ; copy core
rl. w1 i13. ; desc:=save desc
sn w0 0 ; if result<>0 then
jl. i12. ; begin
al w0 -1 ; indextable(curindex):=-1
am. (i11.) ;
hs. w0 b26. ;
i12: rs w2 x1+a50 ; desc.buf send:=buf
;ks -82
al w0 1 ;
rs w0 x1+a52 ; desc.state:=1
al w3 x1+a60 ; move message
dl w1 x2+10 ;
ds w1 x3+2 ;
dl w1 x2+14 ;
ds w1 x3+6 ;
al w1 x3-a60 ;
bz w0 x2+8 ; op:=buf.operation
ls w0 3 ; 1. word:=op shift 3
bz w3 x2+9 ; mode:=buf.mode
lo w0 6 ; 1.word:=1.word + mode
ls w0 16 ; shift 16
bz w3 x2+8 ; if buf.operation
so w3 1 ; then address:=
am -4 ; buf.10 else
rl w3 x2+14 ; address:=buf.14
la. w3 g68. ; extract 16;
lo w3 0 ;
rs w3 x1+a54 ; pmess 1.word:=w3
rl. w0 b16. ; w0:=id word
rl. w3 i11. ; w3:=bufindex
ls w3 1 ;
al w3 x3+1 ; shift 1 add 1;
lo w0 6 ; or bufindex
bz w3 x2+8 ; if buf.operation=4 or
sn w3 4 ;
jl. i5. ;
bz w3 x2+9 ; if buf.mode>0
se w3 0 ; or
i5: lo. w0 b17. ; idword:=idword + 15<(level-1)
i8: rs w0 x1+a55 ; 2. word:= receiver id and buf index
ks -81
jl. g7. ; goto coroutine system
i7: 0 ; return
i10: 1<17 ; time out status in first word
g14: ; entry timeout
rl w0 x1+a56 ; w0:=prim answer 1.word
lo. w0 i10. ; add timeout
rs w0 x1+a56 ;
se w3 0 ; skip next unconditionally
g15: ; answer:
al. w3 e0. ; w3:=return (may be skipped)
g16:rs. w3 i7. ; save return
;ks-90
; w1:=desc,
rl w2 x1+a50 ; w2:=buf
rl w3 x1+a57 ; w3:=answer.2
;ks -91
la. w3 g67. ; and bufindex mask
ls w3 -1 ; //2;
al w0 -1 ;
am. b26. ; bufindextable(index):=
hs w0 x3 ; :=2047;
rl w0 x1+a56 ; status:=
ls w0 1 ; 1.word answer and 255<16
ls w0 -17 ;
hs w0 x1+a61+1 ;
rl w0 x1+a56 ; buf.progsw:=
la. w0 i9. ; primanswer.progsw;
ls w0 -1 ;
rs w0 x1+a61 ;
bz w0 x1+a63 ; get hw status
hs w0 x1+a61 ; move hw status to answer
dl w0 x1+a63+4 ; move
ds w0 x1+a61+4 ; halfwords,bytes
al w0 0 ; state:=
rs w0 x1+a64 ; timeout:=
rs w0 x1+a52 ;0;
rs w0 x1+a50 ; buf from sender:=0;
al w1 x1+a61 ; w1:=answer
al w0 1 ;
ks -92
jd 1<11+22 ; send answer
al w1 x1-a61 ; w1:=desc
jl. (i7.) ; goto start
i9: 15<1 ; mask program status word;
i11: 0 ; save desc
e. ; end
c.-1
;;;;;;;;;;;; micronetwork local peripheral process ;;;;;;;;;;;;;
;
b. i10, a0=1<23 ; begin
w. a0>0+a0>3+a0>5
i0: 8.77400000 ;
m. local peripheral
h52: ; wait message:
jl. w3 e15. ; check reservation
rl. w1 i0. ;
jl. w3 e16. ; check operation(0.3.5,0);
jl. p3. ; send
e. ; end
z.
m. end micronetwork
b. i2 w.
m. INIT system
e2: ; INIT: w0=primin, w2=primout, w3=proc
rl w3 66 ; for FP
rs. w3 b3. ; save proc
rl w1 x3+50 ; w1:=mirror parent
rs. w1 b1. ; save addres of parent
dl w0 x1+4 ; move name
ds. w0 b2.+2 ;
dl w0 x1+8 ;
ds. w0 b2.+6 ;
al. w2 d0. ; w2:=base address of coroutines
al. w3 d1.
rs w3 x2
al. w3 d2.
rs w3 x2+2
al. w3 d3.
rs w3 x2+4
al. w3 d4.
rs w3 x2+6
al. w3 d5.
rs w3 x2+8
al. w3 d6.
rs w3 x2+10
al. w3 d7. ;
rs w3 x2+12 ;
al. w3 b9. ; reserve TRM
jd 1<11+8 ;
al. w3 b11. ; reserve REC
jd 1<11+8 ;
al. w3 b13. ; reserve DATA
jd 1<11+8 ;
al. w0 g30.+2 ; set up receiver
rs. w0 b18.+2 ;
al. w0 g30.+4 ;
rs. w0 b18.+4
al w2 2 ; flag:=2 (REC)
al. w3 b11. ; w3:=name REC
al. w1 b18. ; w1:=message
jd 1<11+16 ; send message
rs. w2 g30.
al. w0 g30.+a8+2 ;
rs. w0 b18.+2 ;
al. w0 g30.+a8+4 ;
rs. w0 b18.+4
al w2 2 ; w2:=flag
jd 1<11+16 ; send message
rs. w2 g30.+a8 ; save buf
al. w0 g30.+a8+a8+2;
rs. w0 b18.+2 ;
al. w0 g30.+a8+a8+4;
rs. w0 b18.+4
al w2 2 ; w2:=flag
jd 1<11+16 ; send message
rs. w2 g30.+a8+a8;
al. w3 b29. ; w3:=head
rs w3 x3 ;
rs w3 x3+2 ;
al. w1 b60. ; w1:=address fo
rs. w1 b50.
al w3 a1+1 ; w3:=max bufindex+1
wm. w3 b27. ; *descsize
al w3 x3-2 ;
wa w3 2 ;
rs. w3 b51. ; save last
i0: al w0 x1+a65 ; w0:=addr elem
rs w0 x1+a65 ;
rs w0 x1+a66 ;
al w1 x1+a80 ;
sh w1 x3 ;
jl. i0. ; goto next link
al. w1 b30. ; init clock
al. w3 b31.
al w2 8 ; flag:=8
jd 1<11+16 ; send message
al w0 0 ; set interrupt
al. w3 e2. ;
; jd 1<11+0 ;
rl. w0 i1. ; wait instruction:=
rs w0 x3+14 ; jl.0
rs w0 x3+16
jl. e0. ; goto wait event
i1: jl. 0 ; wait indef instruction
e.
m. 0.description
b60: 0,r.(:a80/2:) ;
m. 1. description
0,r.(:a80*a1/2:) ; descriptors
b61: 0
e. ; end micronetwork system
e.
e.
e.
▶EOF◀