DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦94f10f1fc⟧ TextFile

    Length: 29184 (0x7200)
    Types: TextFile
    Names: »alw«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦this⟧ »alw« 

TextFile


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