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