|
|
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: 36096 (0x8d00)
Types: TextFile
Names: »micronetm«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦fd91a6c89⟧ »tm68net«
└─⟦this⟧
;;;;;;;; Microcomputer network ;;;;;;;;
;;;;;;;; M6800 version ;;;;;;;;
m. microcomputer network
;Anders Lindgård
;1978-10-02
;1979-02-19
;1979-06-12
;1979-11-07
;1980-10-08
;This system consist of a number of process types:
;
;micronetwork dma process (106)
;micronetwork trm process (108)
;micronetwork rec process (110)
;micronetwork sys process (112)
;micronetwork local process (114)
;micronetwork per process (116)
; the system processes are not reentrant so only one systrm,
; sysrec,sysdma and sysmain may exist.
;;;;;;;;;;;; common procedures ;;;;;;;;;;
;
b. p10, f7
; p names are used for procedures common
; q names are used for calling the other processes( eq to h names)
;
; use of q names:
; q4 =entry sys trm
; q5 =entry sys rec
; q6 =entry sys dma
; q7 =entry sys main
; q8 =entry answer dma
; q9 = entry answer trm
; q10=entry answer rec
; q14=entry send local
; q15=entry answer local
; q17=entry answer sys main
;
; f names are used for the bufferindex table
f0=a121
f1=f0+1
f2=a78+4
f3=768 ; blocksize
f4=12 ; size of blockheader
f5=f3+f4;
;
f6=3 ; max blockindex (1.2.3... maxblockindex<8)
; format of optional words of process descriptions:
; a70: <chain mask for autoload>
; a71: <entry point for send (own entry)>
; a72: <autoload chain (end of chain=0)>
; a73: <entry point answer (own entry)>
; a74: <operation mask><priviledged>
; a75: <identification word>
; a76: <exchange return point (b20)>
; a77: <work>
; a78: <work or pda>
; a78+2: <identification word of user for i/o>
; f2: <bufindex 0><bufindex1> .... for local
; a78+2: <pda of sysxxx>
; a78+4: <pda of sysyyy>
;
; message format to transmitter
;
; operation codes
; sense 0<3
; start 2<3
; transfer completed 4<3
; stop 6<3
; autoload 8<3
; find block index 10<3
; release block 12<3
; wait block 14<3
; input 3<3
; output 5<3
;
;operation codes to local microcomputer
;
; 0<12+mode ; sense
; 2<12+mode ; start
; 6<12+mode ; stop
; 8<12+mode ; autoload
;10<12+mode ; lock
;12<12+mode ; unlock
; 3<12+mode ; input
; 5<12+mode ; output
;
; lock will reserve all processes below in the hierarchy
; and reject all pending messages.
; unlock will release all reservation below in the hierarchy
; 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 ! no ! level !block! pst ! 0!
;-------------------------------------------------!
; receiver ! buf ! 1!
;-------------------------------------------------!
; 0 1920 2223
;
; in transfer completed "address" is by convention regarded
; as a blocknumber
; message buffer format (before answer)
; +8 <operation> <mode>
; +10 <first address>
; +12 <last address>
; +14 <coroutine index> <first address local micro>
; +16 <message or answer>
; +18 <receiver word>
; +20 <save message or answer>
; +22 <save buf+4>
\f
; procedure compute address
; computes an address from a blockindex
; given in an answer (x2+16)
; blockindices are numbered 1,2,3,4,5,6,7
; call return
; w0 destroyed
; w1 proc proc
; w2 buf buf
; w3 link destroyed
b. i10 ;begin
w. ;
m. compute address
i8: 0,0 ; save address
i0: 7<5 ; mask for block index
i1: a122-f6*f5 ; base for block
i2: f5 ; blocksize in bytes
i3: f6 ; maxblockindex-1
i4: 8.7760 0000 ; first byte
i5: 0 ; link
i6: 7 ; last 3 bit
i7: f4 ; header size
p7: ;
rs. w3 i5. ; begin save link
rl w0 x2+18 ; micro:=
ls w0 -20 ; receiver shift -20
wm. w0 i3. ; index:=micro*maxblockindex;
rl w3 x2+16 ; curindex:=
ls w3 -5 ; answer shift -5
la. w3 i6. ; extract 3
al w3 x3-1 ; -1
wa w0 6 ; index:=index+curindex;
wm. w0 i2. ; address:=index*blocksize+
wa. w0 i1. ; base
wa. w0 i7. ; +header size
la w0 g68 ;
rs. w0 i8.+2 ; save address
rl w3 x2+14 ; message:=address and
la. w3 i4. ;
lo w0 6 ; operation
rs w0 x2+14 ;
rs. w0 i8. ; save address
jl. (i5.) ; end
e.
; procedure check privilege
; call return
; w0 destroyed
; w1 int int
; w2 buf buf
; w3 link destroyed
b. i5
w.
p0: ; entry check privilege
rs. w3 i0. ; save link
rl w3 b19 ; cur:=cur proc
rl w0 x3+a74 ; if priv bit
so w0 1 ; then
jl. (i0.) ; begin
bz w0 x1+a22 ; mask:=int.function
so w0 1<8>5 ; if int.func.bit(8)=0 then
jl g5 ; goto result 3
jl. (i0.) ;
i0: 0 ; save link
e. ; end
; procedure examine queue(queue empty)
; call return
; w0 operation
; w1 proc
; w2 buf
; w3 link sender
b. i2
w. p1: ; begin
rs. w3 i2. ;
i0: rl w1 b19 ; w1:=proc
rl w2 x1+a54 ; exam q: proc:= current receiver;
sn w2 x1+a54 ; if buf=mess q(proc)
jl. (i2.) ; then goto empty
rs w2 b18 ; current buf:=buf
rl w3 x2+6 ; w3:=sender
bz w0 x2+8 ; operation:=buf.byte(8)
am. (i2.) ;
jl 2 ; link+2;
i2: 0 ; link;
e.
; procedure send (buffer, receiver);
; call
; w0
; w1 receiver
; w2 buf
; w3 link
;
m. send
b. w.
p2: ; send entry 1
jl w3 d5 ; remove buf
p3: ; send entry 2
rs w1 b19 ; current receiver:=receiver;
jl (x1+a71); goto receiver
e. ; end
;
; autoload own and all children
; all pending buffers in the queue are returned to the sender
; with dummy answer , rejected
; for both this process and all members in the autoload chain
; having curproc anded with chainmask as receiver in buf+18.
; it is assumed that "sysmain" and "sysrec" are the last members
; of the autoload chain. The autoload chain are process description
; adresses except for the end of the chain which is zero.
;
; call return
; w0 childmask destroyed
; w1 proc proc
; w2 buf unchanged
; w3 link unchanged
;
b. i10, j8 ;begin
w.
m. autoload
j0: 0 ; mask
j1: 0 ; proc
0 ; buf
j2: 0 ; link
j3: 0 ; save buf
j4: 0 ; save child
j5: 0 ; id word
p4: ; entry autoload
ds. w3 j2. ; save buf,link
ds. w1 j1. ; save proc and mask
rs. w1 j4. ; child:=cur
rl w0 x1+a75 ; id word:=
rs. w0 j5. ; proc.id_word;
i0: ; start:
rl w2 x1+a54 ; buf:=next(mess q(proc))
sn w2 x1+a54 ; if buf=mess q(proc)
jl. i4. ; then goto next child
al w0 x1+a54 ; savebuf:=buf;
rs. w0 j3. ;
i1: ; nextbuf:
rl w3 x2+18 ; w3:=receiver word
la. w3 j0. ; and child mask;
se. w3 (j5.) ; if id word(proc)<>receiver word(buf)
jl. i2. ; then goto nextbuffer;
al w0 2 ; result:=2;
hs w0 x2+9 ; buf.byte(9):=result
al. w3 i5. ; return address:= new return
rx w3 b20 ; return:=return address
rs w3 x1+a76 ; save return:=old return
rl w1 x2+4 ; cur:=buf.receiver
rs w1 b19 ; curreceiver:=receiver
; jl. w3 p8. ; lock
jl w3 d5 ; remove buf
jl (x1+a73) ; goto answer
i5: ; new return:
rl. w1 j4. ; child:=save child
rs w1 b19 ; curreceiver:=child
rl w3 x1+a76 ; return:=
rs w3 b20 ; save return
rl. w2 j3. ; buf:=save buf
i3: ; nextbuffer:
rl w2 x2 ; buf:=next(mess q(proc));
sn w2 x1+a54 ; if buf= last mess q(proc);
jl. i4. ; then goto nextchild
jl. i1. ; goto start;
i2: ; next buffer in queue:
rs. w2 j3. ; savebuf:=buf;
jl. i3. ; goto next buffer
i4: ; next child
rl w1 x1+a72 ; cur:=next child(cur)
rs. w1 j4. ; save child:=cur;
se w1 0 ; if cur >0 then goto start
jl. i0. ;
dl. w1 j1. ; restore
dl. w3 j2. ;
rs w1 b19 ; curproc:=saveproc
jl x3 ; end;
e. ; end autoload;
; procedure set coroutine index
; call return
; w0 index destroyed
; w1
; w2
; w3 link destroyed
;
b. i0
w. i0:0 ; link
p6: rs. w3 i0. ; save link
rl w3 x2+14 ; w2:=address
la w3 g68 ; w3:=micro address
ls w0 16 ;
lo w3 0 ;
rs w3 x2+14 ;
jl. (i0.) ; end
e.
; procedure lock processes;
; procedure unlock processes;
; call return
; w0 destroyed
; w1 proc proc
; w2 buf buf
; w3 link link
b. i4,j6
w. ; begin
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+a70 ; 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;
;;;;;;;;;; micronetwork dma process ;;;;;;;;;;
;
;process description format:
;
; a10: <kind=106>
; a11: <name>
; a50: <device number*64>
; a52: <reserved>
; a53: <user>
; a54: <next message>
; a55: <last message>
; a56: <interrupt address=c33>
; a78: <sysdma>
;
b. i10, a0=1<23 ; begin
w. a0>3+a0>5 ;
i0: a0>0 ;
m. dma
h47: jl. w3 p0. ; check privilege
jl w3 g15 ; check reservation
dl. w1 i0. ;
jl w3 g16 ; check operation(3.5,0)
rl w1 b19 ; w1:=proc
rl w1 x1+a78 ; proc:=sysdma
jl. p3. ; send (sysdma,buffer);
q8: ; answer address;
bz w0 x2+9 ; answer:=statue(2)
rs w0 x2+4 ; buf.result:=answer
jl w3 d15 ; send answer;
jl (b20) ; goto return
e. ; end micronetwork dma process;
;;;;;;;;;; micronetwork trm process ;;;;;;;;;;
;
;process description format:
;
; a10: <kind=108>
; a11: <name>
; a50: <device number*64>
; a52: <reserved>
; a53: <user>
; a54: <next message>
; a55: <last message>
; a56: <interrupt address=c33>
; a78: <systrm>
;
b. i10, a0=1<23 ; begin
w. a0>6+a0>8 ;
i0: a0>0+a0>2 ;
m. trm
h48: jl. w3 p0. ; check privilege
jl w3 g15 ; check reservation
dl. w1 i0. ;
jl w3 g16 ; check operation(6.8,0)
rl w1 b19 ; proc:=curproc
bz w3 x2+8 ; if buf.operation=autoload then
se w3 8
jl. i3. ; begin
rl w0 x1+a70 ; mask:=proc.autoloadmask
jl. w3 p4. ; autoload
bz w0 x2+9 ; mode:=buf.byte(9)
se w0 0 ; if mode>0 then goto answer
jl. i2. ;
i3: ; end else begin
dl w0 x2+12 ; move message
ds w0 x2+18 ;
rl w1 x1+a78 ; cur:="systrm"
jl. p3. ; send cur,mess);
i2:
al w0 1 ;
rs w0 x2+8 ; result:=1;
q9: ; answer:
bz w0 x2+9 ; w0:=result
rs w0 x2+4 ; buf.result:=result;
jl w3 d15 ; deliver answer;
jl (b20) ; goto return
e. ; end micronetwork trm process;
;;;;;;;;;; micronetwork rec process ;;;;;;;;;;
;
;process description format:
;
; a10: <kind=110>
; a11: <name>
; a50: <device number*64>
; a52: <reserved>
; a53: <user>
; a54: <next message>
; a55: <last message>
; a56: <interrupt address=c33>
; a78: <sysrec>
; a78+2: <systrm>
;
b. i10, a0=1<23 ; begin
w. a0>0+a0>8 ;
i0: a0>0 ;
m. rec
h49: jl. w3 p0. ; check privilege
jl w3 g15 ; check reservation
dl. w1 i0. ;
jl w3 g16 ; check operation(0.8,0)
rl w1 b19 ; proc:=curproc
dl w0 x2+12 ;
ds w0 x2+18 ; move first and last to messarea
bz w3 x2+8 ; if operation=clear then
se w3 8
jl. i3. ; begin
rl w0 x1+a70 ; mask:=proc.autoloadmask
jl. w3 p4. ; autoload
al w0 1 ; result:=1;
hs w0 x2+9 ; buf.byte(9):=result
jl. i2. ; goto send answer
i3: ; end else begin
rl w1 x1+a78 ; cur:="rec"
jl. p3. ; send
i2: ; send answer
q10: ; answer:
bz w0 x2+9 ; result:=buf.byte(9)
rs w0 x2+4 ; buf.result:=result;
dl w0 x2+18 ;
ds w0 x2+12 ; move answer
jl w3 d15 ; deliver answer;
jl (b20) ; goto return
e. ; end micronetwork rec process;
;;;;;;;;;; micronetwork sys dma process ;;;;;;;;;;
;
;process description format:
;
; a10: <kind=112>
; a11: <name>
; a50: <device number*64>
; a52: <reserved>
; a53: <user>
; a54: <next message>
; a55: <last message>
; a56: <interrupt address=c33>
;
b. i10, a0=1<23 ; begin
m. sysdma
w. i0: 0 ; save proc
q6: ; begin
jl w3 g17 ; link operation
i1: ; start:
rs. w1 i0. ; save proc:=proc
jl w3 g34 ; exam sender(done)
jl. i5. ; goto end
bz w3 x2+8 ;w3:=operation
sn w3 3 ; if operation=3 then
am 4 ; modifier:=9 else
al w3 5 ; else modifier=5
rl w0 x2+10 ; w0:=first address
am (x1+a50) ;
io w0 x3 ; io(control,first address);
sx 2.11 ; if exception then
jl. i2. ; goto disconnect;
rl w3 x2+14 ; micro address:=
la w3 g68 ;
am (x1+a50) ; buff(14) extract 16;
am -2<6 ; devaddress:=main-2;
io w3 1 ; io(control,devaddess,microaddress);
sx 2.11 ; if exception then
jl. i2. ; goto disconnect
rl w3 x2+12 ; words:=
ws w3 0 ; (last-first
al w0 x3+2 ; set bytes transferred;
rs w0 x2+10 ;
rl w3 x2+4 ; org:=buf.receiver
rl w0 x3+a10 ; kind:=org.kind
rl w3 x2+10 ;
sn w0 106 ; if kind<>dma
jl. i6. ; then begin
sh w3 510 ; if bytes>=512 then
jl. i7. ; begin
al w3 512 ; bytes:=512
rs w3 x2+10 ;
i6: al w3 x3-2 ;
ls w3 -1 ; ) //2;
am (x1+a50) ;
io w3 1 ; io(control,words);
sx 2.11 ; if exception then
jl. i2. ; goto disconnect;
jl w3 g31 ; increase stopcount
jl w3 c32 ; wait interrupt
jl w3 g32 ; decrease stop count
rl w2 b18 ; w2:=buf
rl w1 b19 ; w1:=proc
al w3 c33 ; interrupt address:=
rs w3 x1+a56 ; dummy interrupt
io w0 (x1+a50) ; io(sense,status);
sx 2.11 ; if exception then
jl. i2. ; goto disconnect
i3: rs w0 x2+8 ;
am -2 ; result:=1 or
i7: am -1 ; or 3
i2: al w0 4 ; disconnect: 4;
hs w0 x2+9 ; buff.byte(9):=result;
al. w3 i4. ; w3:=return
rx w3 b20 ; exchange return
rs w3 x1+a76 ; save return:=old return
jl w3 d5 ; remove buf
rl w1 x2+4 ; cur:=buf.receiver
jl (x1+a73) ; goto answer
i4: ; return point:
rl. w1 i0. ; cur:=save proc
rs w1 b19 ; curproc:=cur;
rl w3 x1+a76 ; ret:=save return
rs w3 b20 ; return:=save return
jl. w3 p1. ; examine queue
jl (b20) ; goto return
jl. i1. ; goto start
i5: ; sender stopped:
al w0 0 ; bytes:=
rs w0 x2+10 ; 0;
al w0 0 ; status:=0
jl. i3. ; end
e. ; end micronetwork sys dma process;
;;;;;;;;;; micronetwork sys trm process ;;;;;;;;;;
;
;process description format:
;
; a10: <kind=112>
; a11: <name>
; a50: <device number*64>
; a52: <reserved>
; a53: <user>
; a54: <next message>
; a55: <last message>
; a56: <interrupt address=c33>
; a77: <modifier for 1. or 2. word>
; a78: <no of interrupts>
;
b. i10, a0=1<23 ; begin
w. ;
m. systrm
i7: 0,0 ; save read
i5: 0,0 ; save command
i0: 0 ; save proc
q4: ; begin
jl w3 g17 ; link operation
rs. w1 i0. ; save proc
i1: ; start:
al w3 0 ; modifier:=
rs w3 x1+a77 ; 0;
i3: am x3 ; next word:
rl w0 x2+16 ; w0:=data
rs. w0 x3+i5. ; save command:=command;
am (x1+a50) ;
io w0 3 ; io(write,data); com 0);
sx 2.11 ; if exception then
jl. i2. ; goto disconnect;
jl w3 c32 ; wait interrupt
rl w3 x1+a78 ; no of interrupts:+
al w3 x3+1 ; 1;
rs w3 x1+a78 ;
jl. w3 p1. ; examine queue
jl (b20) ;
io w0 (x1+a50) ; io(sense,status);
sx 2.11 ; if exception then
jl. i2. ; goto disconnect
rl w3 x1+a77 ; w3:=modifier;
rs. w0 x3+i7. ; save word read
se. w0 (x3+i5.) ; if command<>
jl. i3. ; goto repeat
al w3 x3+2 ; modifier:=modifier+2;
rs w3 x1+a77 ;
sh w3 2 ; if modifier<2 then goto next word
jl. i3. ;
am -3 ; result:=1 or
i2: al w0 4 ; disconnect: 4;
hs w0 x2+9 ; buf.byte(9):=w0;
al w3 c33 ; interrupt return:=
rs w3 x1+a56 ; dummy interrupt
al. w3 i4. ; w3:=return
rx w3 b20 ; exchange return
rs w3 x1+a76 ; save return:=old return
jl w3 d5 ; remove buf
rl w1 x2+4 ; cur:=buf.receiver
jl (x1+a73) ; goto answer
i4: ; return point:
rl. w1 i0. ; proc:=save proc
rs w1 b19 ; curproc:=proc
rl w3 x1+a76 ; return:=
rs w3 b20 ; save return
jl. w3 p1. ; examinge queue
jl (b20) ; goto return
jl. i1. ; goto start
e. ; end micronetwork trm process;
;;;;;;;;;; micronetwork sys rec process ;;;;;;;;;;
;
;process description format:
;
; a10: <kind=112>
; a11: <name>
; a50: <device number*64>
; a52: <reserved>
; a53: <user>
; a54: <next message>
; a55: <last message>
; a56: <interrupt address=c51>
; a77: <first or second>
; a78: <no of interrupts>
;
b. i15, a0=1<23 ; begin
w. ;
m. sysrec
i0: 0 ; save proc
i5: 0,0 ; save answer
i6: 0 ; save result
q5: ; begin
jl w3 g17 ; link operation
jl (b20) ; goto return
c51: ; wait interrupt
rl w3 x1+a78 ; no of interrupts:+
al w3 x3+1 ; 1;
rs w3 x1+a78 ;
jl. w3 p1. ; examine queue
jl. i8. ; goto return
al w0 1 ; result:=1;
rs. w0 i6. ; save result:=result
am (x1+a50) ;
io w0 4 ; io(sense,data); com 1;
sx 2.11 ; if exception then
jl. i3. ; goto disconnect;
sz w0 1 ; if 2.word then
jl. i9. ; goto 2.
am (x1+a50) ;
io w0 7 ; io(write,data); com 1;
sx 2.11 ; if exception then
jl. i3. ; goto disconnect
sz w0 1 ; if 2.word then address:=address+2;
i9: am 2 ;
rs. w0 i5. ; data(i):=data
la w0 g63 ; extract 1
se w0 (x1+a77) ; if word<> wordno.proc
jl. i8. ; goto error
al w3 1 ; word:=
wa w3 0 ; (word+1)
la w3 g63 ; mod 2
rs w3 x1+a77 ;
i4: so w0 1 ; if 1. word then
jl (b20) ; goto wait interrupt
i7: rl w2 x1+a54 ; buf:=head q(proc9;
rl. w0 i5.+2 ; w0:=answer.2
i1: ; next buffer:
rl w3 x2+18 ; rec:=buf.rec
sn w0 x3 ; if rec<> rec(received) then
jl. i2. ; begin
rl w2 x2 ; buf:=link(buf)
se w2 x1+a54 ; if buf <> last q(proc)
jl. i1. ; goto start
i8: al w0 0 ; word.proc:=0
rs w0 x1+a77 ;
jl (b20) ; wait interrupt
i2: ; found:
rl. w0 i6. ; if result=1 then
se w0 1 ; begin
jl. i10. ;
rl. w0 i5.+2 ; send 2.word
am (x1+a50) ;
io w0 7 ; io(write,data)
sx 2.11 ; if exception then
jl. i3. ; goto diconnect;
rl. w0 i6. ; result:=save result
i10: hs w0 x2+9 ;
dl. w0 i5.+2 ; buf.answer:=
ds w0 x2+18 ; answer
jl w3 d5 ; remove buf
rs w2 b18 ; curbuf:=buf
rl w1 x2+4 ; w1:=proc.buf
jl (x1+a73) ; goto answer
i3: ; error
al w0 4 ; result:-4
rs. w0 i6. ;
jl. i7. ; goto find buf
e. ; end micronetwork rec process;
;;;;;;;;;;;; micronetwork sys main ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; process description format
;
; a10: <kind=112>
; a11: <name>
; a50: <not used>
; a52: <reserved>
; a53: <user>
; a54: <next message>
; a55: <last message>
; a56: <interrupt address>
; a78: <sysdma>
; a78+2: <systrm>
; a78+4: <sysrec>
;
b. i20, j20 ; begin
w. ;
m. sysmain
i4: 7<5 ; blockindex
j0: j1,j2,j3,j4,j5,j6,j7, ; coroutine
j8,j9,j10,j11,j12,j13 ; indices
q17: ; entry answer
bz w0 x2+9 ; if result <> 1
se w0 1 ;
jl. j2. ; goto local
bz w3 x2+14 ; index:=
ls w3 -4 ; buf.byte(14) shift -4;
jl. (x3+j0.) ; case index of
q7: ; entry from send
bz w3 x2+8 ; op:=buf.operation
sz w3 1 ; if op=even
jl. i6. ; then begin
al w0 0 ; coroutine index:=
jl. w3 p6. ; 0;
jl. i5. ; goto send
j1: ; answer 0
al w0 2 ; coroutine index:=2;
jl. w3 p6. ;
al w0 0 ; clear operation
hs w0 x2+8 ;
rl w1 x1+a78+4 ; send (rec,mess)
jl. p3. ;
j2: ; answer 2
rl w1 x2+22 ; proc:=save proc
rs w1 b19 ; curproc:=proc
jl (x1+a73) ; goto local
i6: ; begin comment block i/o
rl w0 x2+18 ; if buf.level0.no<>0
ls w0 -20 ;
sn w0 0 ; then
jl. i9. ; begin
se w3 3 ; if input then
jl. i8. ; begin
al w0 4 ; coroutine index:=4
jl. w3 p6. ;
i5: ; send first
rl w3 x2+4 ; rec:=buf.receiver
rs w3 x2+22 ; save receiver:=rec;
rs w1 x2+4 ; buf.receiver:=cur;
rl w1 x1+a78+2 ; rec:="trm"
jl. p3. ; send
j3: ; answer 4
al w0 6 ; coroutine index:=6
jl. w3 p6. ;
rl w1 x1+a78+4 ; rec:="rec"
jl. p3. ; send
j4: ; answer 6
al w0 8 ; coroutine index:=
jl. w3 p6. ;
jl. w3 p7. ; compute address
rl w1 x1+a78 ; rec:="dma"
jl. p3. ; send dma
j5: ; answer 8
rl w3 x2+16 ; move answer
rs w3 x2+20 ; to work
rl w0 x2+10 ; bytes:=buf.byte(8)
sn w0 0 ; if bytes=0 then op*=14 ; wait block
am 2 ;
i7: al w0 12 ; op:=12 ; release block
ls w0 16+3 ;
rl w3 x2+16
la. w3 i4. ; blockindex:=
lo w0 6 ; message:=release block
rs w0 x2+16 ;
bz w0 x2+8 ; save result and status
hs w0 x2+15 ;
bz w0 x2+9 ;
hs w0 x2+12 ;
al w0 10 ; coroutine index:=
jl. w3 p6. ; 10
rl w1 x1+a78+2 ; rec:="trm"
jl. p3. ; send
j6: ; answer 10
al w0 12 ; coroutine index:=
jl. w3 p6. ; 12;
rl w1 x1+a78+4 ; rec:="rec"
jl. p3. ; send
j7: ; answer 12
rl w0 x2+20 ;
rx w0 x2+16 ; exchange answers
rs w0 x2+20 ;
bz w0 x2+15 ; result:= save
ls w0 12 ;
hl w0 x2+12 ; result;
se w0 1 ;
rs w0 x2+8 ;
jl. j2. ; goto return
i8: ; output:
rl w0 x2+16 ;
rs w0 x2+20 ; save mess
al w0 10 ; op:=10 "find block index"
ls w0 16+3 ;
rs w0 x2+16 ;
al w0 14 ; coroutine index:=14;
jl. w3 p6. ; send
jl. i5. ; send first("trm",findblockindex)
j8: ; answer 14:
al w0 16 ; coroutine index:=16
jl. w3 p6. ;
rl w1 x1+a78+4 ; rec:="rec"
jl. p3. ; send
j9: ; answer 16:
al w0 18 ; coroutine index:=18;
jl. w3 p6. ;
jl. w3 p7. ; compute micro address
rl w1 x1+a78 ; rec:="dma"
jl. p3. ; send
j10: ; answer 18 (from dma)
rl w3 x2+20 ;
rx w3 x2+16 ; exchange output
rs w3 x2+20 ;
bz w0 x2+8 ; status:=buf.byte(8)
se w0 0 ; if status<>0 then send
jl. i7. ; release block
al w0 20 ; coroutine index:=
jl. w3 p6. ; 20;
rl w1 x1+a78+2 ; rec:="trm"
jl. p3. ; send
j11: ; answer 20 (from trm (output))
al w0 22 ; coroutine index:=22;
jl. w3 p6. ;
rl w1 x1+a78+4 ; rec:="rec"
jl. p3. ; send
j12:
jl. j2. ; goto return
i9: ; block input/output for main
al w0 24 ; coroutine index=24
jl. w3 p6. ;
al w0 0 ; message:=0;
rs w0 x2+16 ;
rl w1 x1+a78 ; rec:="dma"
jl. p3. ;
j13: ; answer 24 (from dma)
jl. j2. ; goto return
e. ; end
;;;;;;;;;;;; micronetwork local microcomputer process ;;;;;;;;;;;;;
;
;process description format
;
; a10: <kind=114>
; a11: <name>
; a50: <not used>
; a52: <reserved>
; a53: <user>
; a54: <next message>
; a55: <last message>
; a56: <interrupt address=c33>
; a78: <sysmain>
;
b. i10, a0=1<23 ; begin
w. a0>0+a0>2+a0>4+a0>6+a0>8+a0>10+a0>12+a0>3+a0>5
i0: 8.77400000 ;
m. local
h51: ; wait message:
jl. w3 p0. ; check privilege
jl w3 g15 ; check reservation
dl. w1 i0. ;
jl w3 g16 ; check operation(0.2.4.6.8.10.12.3.5,0.1.2.3.4.5.6.7);
rl w1 b19 ; proc:=curproc
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 x1+a70 ; mask:=autoload mask
jl. w3 p4. ; autoload(mask)
al w3 c33 ; return:=dummy interrupt
bz w0 x2+8 ; if operation=lock
se w0 8 ; then
jl g26 ; deliver result(1);
al w3 f0 ; bufindex:=max bufindex
jl. i4. ; goto buffer found
i6: ; unlock:
jl. w3 p9. ;
al w3 c33 ; return=dummy
jl g26 ; deliver reesult(1);
i2: ; send message:
q14: ; entry send
al w3 0 ;
i3: ; next index:
am x1+f2 ;
bz w0 x3 ; index:=proc.index(curindex)
sl w0 f0 ; if buf index<max buffer index then
jl. i4. ; goto index found
al w3 x3+1 ; curindex:=curindex+1;
sh w3 f0-1 ; if curindex<maxindex then
jl. i3. ; goto next index
jl w3 g17 ; link operation
jl (b20) ; begin
i4: ; buffer found:
am x1+f2 ; proc.bufindex:=
hs w3 x3 ; bufindex;
rs w3 x1+a77 ; work:=bufindex
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;
la w3 g50 ; and -2
lo w3 0 ;
rs w3 x2+16 ; buf.message:=
rl w0 x1+a75 ; w0:=id word
rl w3 x1+a77 ; 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
; jl. i5. ;
; bz w3 x2+8 ; buf.operation=odd then
; sz w3 1 ;
i5: lo w0 x1+a78+2 ; idword:=idword + 15<(level-1)
i8: rs w0 x2+18 ; 2. word:= receiver id and buf index
rl w1 x1+a78 ; rec:="sysmain"
jl. p3. ; send
i10: 7<1 ; buf index mask
q15: ; answer:
rl w3 x2+18 ; w3:=answer.2
la. w3 i10. ; and bufindex mask
ls w3 -1 ; //2;
al w0 -1 ;
am x1+f2 ; proc.bufindex:=
hs w0 x3 ; :=2047;
bz w0 x2+9 ; result:=buf.byte(9);
rs w0 x2+4 ; buf.result:=result;
rl w0 x2+16 ; status:=
ls w0 1 ; 1.word answer and 255<16
ls w0 -17 ;
hs w0 x2+9 ;
rl w0 x2+16 ; buf.progsw:=
la. w0 i9. ; primanswer.progsw;
ls w0 -1 ;
rs w0 x2+12 ;
jl w3 d15 ; send answer
jl. w3 p1. ; examine queue
jl (b20) ; goto return
jl w3 d5 ; remove buf
jl. i2. ; goto start
i9: 15<1 ; mask program status word;
e. ; end
;;;;;;;;;;;; micronetwork local peripheral process ;;;;;;;;;;;;;
;
;process description format
;
; a10: <kind=116>
; a11: <name>
; a50: <not used>
; a52: <reserved>
; a53: <user>
; a54: <next message>
; a55: <last message>
; a56: <interrupt address=c33>
; a78: <sysmain>
;
b. i10, a0=1<23 ; begin
w. a0>0+a0>3+a0>5
i0: 8.77400000 ;
m. local peripheral
h52: ; wait message:
jl w3 g15 ; check reservation
rl w3 b19 ; cur:=curproc
rl w0 x1+a74 ; w0:=cur.mask
la w0 g50 ; - priv
rl. w1 i0. ;
jl w3 g16 ; check operation(0.3.5,0);
rl w1 b19 ; proc:=curproc
rl w1 x1+a78 ; rec:="sysmain"
jl. p3. ; send
e. ; end
m. end micronetwork
e. ; end micronetwork system
▶EOF◀