|
|
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: 114432 (0x1bf00)
Types: TextFile
Names: »mfpaline «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer
└─⟦2ba378e4a⟧
└─⟦this⟧ »mfpaline «
\f
m. monfpaline - fpa-main, -transmitter and -receiver drivers 17.0 beta
b.i30 w.
i0= 86 10 10, i1=15 40 00
; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime;
c.i0-a133
c.i0-a133-1, a133=i0, a134=i1, z.
c.i1-a134-1, a134=i1, z.
z.
i10=i0, i20=i1
i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000
i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000
i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000
i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100
i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10
i2: <: date :>
(:i15+48:)<16+(:i14+48:)<8+46
(:i13+48:)<16+(:i12+48:)<8+46
(:i11+48:)<16+(:i10+48:)<8+32
(:i25+48:)<16+(:i24+48:)<8+46
(:i23+48:)<16+(:i22+48:)<8+46
(:i21+48:)<16+(:i20+48:)<8+ 0
i3: al. w0 i2. ; write date:
rs w0 x2+0 ; first free:=start(text);
al w2 0 ;
jl x3 ; return to slang(status ok);
jl. i3. ;
e.
j.
c.(: a80>8 a.1 :)-1 ; if fpacomplex included then
\f
; fpa 801 driver complex.
; the fpa 801 driver complex consists of a number of drivers --
; mainprocess driver
; line-process drivers: receiver driver
; transmitter driver
; subprocess drivers: hostprocess driver
; general driver
; terminal driver
; magtape driver
; disc driver
;
; block including all drivers.
b.f12,p340,v120 w.
; block including main- and line-drivers.
b.e12 w.
; block including main-process driver.
b.m20,n20,s20 w.
m. fpa mainprocess
; the following define global formats and constants
v0 = 8 ; highest number of buffers at the same time transmitted to a device
v1 = 12 ; number of bytes in private part of subproc description
v2 = 1<16-1 ; maximum buffer size for datanet
v3 = 16 ; max number of operations at the same time transmitted from a hostproc
; function codes for mainproc
; bit 1<0 should be added if data follows
v31 = 0<2 ; 0 ; create
v32 = v31+1<1 ; 2 ; answer create
v37 = 1<2 ; 4 ; remove
v38 = v37+1<1 ; 6 ; answer remove
v35 = 2<2 ; 8 ; release
v36 = v35+1<1 ; 10 ; answer release
v33 = 3<2 ; 12 ; lookup
v34 = v33+1<1 ; 14 ; answer lookup
v22 = 10<2 ; 40 ; operator output-input
v23 = v22+1<1 ; 42 ; answer operator output-input
v24 = 11<2 ; 44 ; operator output
v25 = v24+1<1 ; 46 ; answer operator output
; smallest function value for the subprocs
v40 = 1<7+0<2 ; 128 ; min subproc func value
; function codes for subprocs
; bit 1<0 should be added, if data follows
v50 = 1<7+3<2 ; 140 ; input
v51 = v50+1<1 ; 142 ; answer input
v52 = 1<7+4<2 ; 144 ; output
v53 = v52+1<1 ; 146 ; answer output
v54 = 1<7+5<2 ; 148 ; message
v55 = v54+1<1 ; 150 ; answer message
v56 = 1<7+6<2 ; 152 ; user name
v57 = v56+1<1 ; 154 ; answer user name
v58 = 1<7+7<2 ; 156 ; attention
v59 = v58+1<1 ; 158 ; answer attention
; definition of bitpatterns in state-field of subprocs (p12)
v70 = 2.0001 <8 ; subproc blocked
v71 = 2.0010 <8 ; answer attention pending
v72 = 2.0100 <8 ; messages pending
; bit 0 - 7 are reserved for bufno (used in answer attention)
\f
; process description of subprocess:
;
; monitor part:
; a250: ; driver process description address
; a402: ; user bit table
; a48: ; interval
; a49: ; interval
; a10: ; kind
; a11: ; name
; a50: ; mainproc
; a52: ; reserver
; a57, a58: ; work0, work1
; a54: ; first message
; a55: ; last message
; a56: ; external state
; specific part:
p0 =a56+2 ; first(specific part)
p1 =p0+v1 ; top(specific part)
; mainprocess part:
p11=p1 , p9=p11+1 ; devhost linkno, jobhost linkno
p10=p11+2 , p8=p10+1 ; subkind, data quality
p12=p10+2 ; state(sub)
p14=p12+2 ; next subprocess
p15=p14+2 ; last subprocess
p16=p15+2 , p17=p16+1 ; buffers free , current bufno
p18=p16+2 ; max bufsize(in bytes)
p7=p18+2 , p6=p7+1 ; devhost net-id, devhost home-reg
p5=p7+2 ; devhost host-id
p13=p5+2 ; current message
p19=p13+2 ; start(mess buf table):
a79=p19+v0<1 ; top(mess buf table)
c.(:a63-p10:)*(:a63-p10:)-1, m. name error a63
z.
c.(:a64-p12:)*(:a64-p12:)-1, m. name error a64
z.
; process description of mainprocess:
;
; monitor part:
; a250: ; driver process description address
; a402: ; user bit table
; a48: ; interval
; a49: ; interval
; a10: ; kind
; a11: ; name
; a50: ;
; a52: ; reserver
; a57, a58: ; work0, work1
; a54: ; first message
; a55: ; last message
; a56: ;
; p0 ; start of spec part:
s0=p0 ; start(ne t record)
s1=s0+2 ; top(test buffer)
s4=s1+2 ; start(testbuffer)
s5=s4+2 ; top(testbuffer)
; mask0(00:23)
s2=s5+4 ; mask0(24:47)
; mask1(48:71)
s3=s2+4 ; mask1(72:95)
; subprocess queue:
; ; not used
; p14 ; next subprocess
; p15 ; last subprocess
s16=p15+2 , s17=s16+1 ; ready flag (protocol-flag,mode from message) 0: DCP; <>0: direct
s6=s16+2 ; counter
s7=s6+2 ; home-reg<16+host-id
\f
; transmit parameters:
; ********************
b. i0 w.
i0=s7+2
; line parameters
p66=i0 , i0=i0+2; size
p60=i0 , , i0=i0+2; internal status, unused
p65=i0 , i0=i0+2; first data
p72=i0 , i0=i0+2; address code, unused
p71=i0 , i0=i0+2; message buffer
; intermediate control parameters
p79=i0 , i0=i0+2; local function
; packet control parameters
p301=i0 , p302=i0 , i0=i0+2; rec net-id, rec home-reg
p303=i0 , i0=i0+2; rec host-id
p304=i0 , i0=i0+2; packet-id
p305=i0 , i0=i0+2; facility mask
p306=i0 , i0=i0+2; priority
; device control parameters
p69=i0 , p78=i0+1 , i0=i0+2; rec linkno, sender linkno
p64=i0 , i0=i0+2; size
p61=i0 , p68=i0+1 , i0=i0+2; function, bufno
p62=i0 , p308=i0+1, i0=i0+2; state, data quality
p63=i0 , i0=i0+2; mode
; internal mainproc parameters
p67=i0 , , i0=i0+2; error count, unused
p70=i0 , i0=i0+2; proc. description
p73=i0 , p76=i0+1 , i0=i0+2; operation, blockcontrol
p77=i0 , p74=i0+1 , i0=i0+2; contents, result
p75=i0 , i0=i0+16; header transmit area
\f
; receive parameters
; ******************
; line parameters
p86=i0 , i0=i0+2; size
p80=i0 , , i0=i0+2; internal status, unused
p85=i0 , i0=i0+2; first data
p92=i0 , , i0=i0+2; address code, unused
p91=i0 , i0=i0+2; message buffer
; intermediate control parameters
p99=i0 , , i0=i0+2; local function, unused
; packet control parameters
p321=i0, p322=i0+1, i0=i0+2; sender net-id, sender home-reg
p323=i0 , i0=i0+2; sender host-id
p324=i0 , i0=i0+2; packet-id
p325=i0 , i0=i0+2; facility mask
p326=i0, p327=i0+1, i0=i0+2; packets in unit, packetno in unit
; device control parameters
p89=i0 , p98=i0+1 , i0=i0+2; rec linkno, sender linkno
p84=i0 , i0=i0+2; size
p81=i0 , p88=i0+1 , i0=i0+2; function, bufno
p82=i0 , p328=i0+1, i0=i0+2; result, data quality
p83=i0 , i0=i0+2; status
; internal mainproc parameters
p87=i0 , , i0=i0+2; error count, unused
p90=i0 , i0=i0+2; proc. description
p93=i0 , p96=i0+1 , i0=i0+2; operation, blockcontrol
p97=i0 , p94=i0+1 , i0=i0+2; contents, result
p95=i0 , i0=i0+16; header rec. area
p100=i0 ; top of std process description
e. ;
\f
; definition of internal constants.
p101=(:a84>2a.1:)-1 ; test switch, on: 0, off: -1
p102=(:a82>2a.1:)-1 ; statistics , on: 0, off: -1
p103=1 ; rc4000: 0, rc8000: 1
a65=p100 ; top of process description
p109=100 ; monitor procedure number of start-io
p110=80 ; kind of mainproc
p111=82 ; kind of hostproc
p112=84 ; kind of local subproc
p113=85 ; kind of free or remote subproc
p114=86 ; kind of receiver
p115=88 ; kind of transmitter
p120=2.0000 ; state:=ready
p121=2.0001 ; state:=waiting for buffers
p122=2.0010 ; state:=waiting for poll
p140=20 ; max number of errors
p141=50 ; max number of errors using short timer under initiation
p160=0 ; internal status:=ok
p161=1 ; internal status:=wait
p162=2 ; internal status:=skip
p163=3 ; internal status:=reject
p164=-1 ; internal status:=regret
p210=p0+42+7*6 ; rel top of proc desc(rec)
p211=p0+58+7*6 ; rel top of proc desc(trm)
p200=p100-a220 ; start(receiver proc) - start (mainproc)
p201=p200+p210-a220 ; start(transmitter proc) - start(mainproc)
p202=p201+p211-a250 ; start(hostproc) - start(mainproc)
; format of startbyte:
; (0:0) blocknumber mod 2
; (1:3) not used
; (4:4) data bit
; (5:5) header bit
; (6:6) data flag
; (7:7) special function bit
; format of header block:
; line control:
; word0 (00:15) size of succeeding text block
; host control:
; (16:23) local function
; word1 (08:15) net-id
; (16:23) home-reg
; word2 (00:15) host-id
; message control:
; word4 (15:23) format
; word5 (00:23) depends on format
; word6 (00:23) depends on format
; word7 (00:23) depends on format
;
; if device control protocol (format=0) then
; device control:
; (15:23) sender linkno
; word5 (00:05) data quality
; (06:15) receiver linkno
; word5,6 (16:07) size
; word6 (08:15) bufferno
; (16:23) function
; word7 (00:02) state/result
; (03:15) mode/status
; format of statusbyte:
; (0:0) blocknumber mod 2
; (1:3) not used
; (4:5) blockcontrol
; (6:6) blocklength flag
; (7:7) parity flag
; the value of operation should be interpreted in this way:
; value= 2.00xxxxxx1x : the block contains a data area
; 2.00xxxxx1xx : the block contains a header area
; 2.00xxxx11xx : the header implies a data block
; 2.xxxx01xxxx : short delay (wait delay, reset delay)
; 2.xxxx10xxxx : long delay (poll delay)
; 2.xxxxxxxxx1 : error actions off
; 2.xxx1xxxxxx : initiate
; 2.xx1xxxxxxx : reset
; 2.01xxxxxxxx : master clear
; 2.10xxxxxxxx : accept master clear
\f
; log and test facility.
; format of test record:
; +0 : type, length(record)
; +2 : time1
; +4 : time2
; +6 : test information
; +8 : ...
; +10: ...
;
; the call of the test facility is performed like this:
; b.f1 w. ;
; rs. w3 f0. ; save w3;
; jl. w3 f4. ; check condition(type,on/off);
; <type> ; type of test point
; f0:<saved w3> ; saved w3
; ; off: w0-w2: unchanged, w3: saved w3;
; jl. f1. ; goto end of test;
; ..... ; on: w0-w2: unchanged, w3: start(internal test area);
; ..... ; pack testinformation;
; al w0 <first> ; first:=first(test area);
; al w1 <last> ; last:=last(test area);
; jl. w3 f5. ; create test record;
; f1: ; end of test:
; e. ;
; the entry f6 may be used instead of f5 to
; generate the testrecord.
; additionally it will cause testoutput-generation to stop after
; the number of records specified in w2.
c.p101
; saved w-registers:
f0: 0 ; w0
f1: 0 ; w1
f2: 0 ; w2
f3: 0 ; w3
; parameters:
f7: 0 ; proc
f8: 0 ; buffer
f9: 0 ; type, length
; internal test area:
f10: 0, r.12 ; start:
f11=k-f10 ; size of test area
; check condition(type,on/off).
; checks the type of the test point stored in link against the test mask.
; if test is off then the procedure returns to link+4. test on implies
; that the test record is initiated, the registers are saved and return is made to link+6.
; call: return:
; w0 unchanged
; w1 unchanged
; w2 unchanged
; w3 link saved w3 (off), start(internal test area) (on)
b.i0,j1 w.
f4: ds. w1 f1. ; check condition:
rs. w2 f2. ;
rs. w3 i0. ; save link;
rl w0 x3+2 ;
rs. w0 f3. ; save saved w3;
gg w0 8.61<1 ; w0:=register select switches;
so w0 1<5<1 ; if left bit off then
jl. j0. ; goto exit2;
rl w1 b19 ; proc:=current proc;
rl w0 x1+a10 ;
se w0 p110 ; if kind(proc)<>mainprockind then
rl w1 x1+a50 ; proc:=mainproc(proc);
rl w0 x1+a10 ;
se w0 p110 ; if kind(proc)<>mainprockind then
jl. j0. ; goto exit2;
rs. w1 f7. ; save proc;
rl w3 x3 ;
sl w3 48 ; if type>=48 then
am s3-s2 ; mask:=mask1;
dl w1 x1+s2 ; shift:=type-48;
sl w3 48 ; else
am -48 ; mask:=mask0;
ld w1 x3 ; shift:=type;
sl w0 0 ; if mask shifted shift>=0 then
jl. j0. ; goto exit2;
hs. w3 f9. ; type:=type of test point;
dl. w1 f1. ;
rl. w2 f2. ; restore w0-w2;
al. w3 f10. ; w3:=start(test area);
am. (i0.) ;
jl +6 ; exit1: return to link+6;
j0: dl. w1 f1. ; exit2:
dl. w3 f3. ; restore w0-w3;
am. (i0.) ;
jl +4 ; return to link+4;
i0: 0 ; saved link;
e.
; create test record.
; creates a test record with the format shown above.
; call: return:
; w0 first saved w0
; w1 last saved w1
; w2 saved w2
; w3 link saved w3
b.i6,j6 w.
f5: al w1 x1+2 ; create test record:
ds. w1 i1. ; top:=last+2;
ds. w3 i3. ; save w0-w3;
rl w1 b19 ;
rx. w1 f7. ; current proc:=mainproc;
rs w1 b19 ; save old buffer;
j0: rl. w2 i1. ; start:
ws. w2 i0. ; length(record):=
al w2 x2+6 ; top-first+6;
hs. w2 f9.+1 ; save length;
wa w2 x1+s0 ; start(next record):=
sh w2 (x1+s1) ; start(next record)+length;
jl. j2. ; if start(next record)>top(test buffer) then
; goto insert;
j1: rl w2 x1+s1 ; insert dummy end record:
ws w2 x1+s0 ; length(dummy record):=top(test buffer)-start(next record);
sl w2 1 ; if length(dummy record)>0 then
rs w2 (x1+s0) ; dummy record:=0,length;
j5: al w0 0 ; send answer:
rs w0 x1+s0 ; start(next record):=0;
dl w0 x1+s5 ;
ds w0 x1+s1 ;
jl. j0. ; goto start;
; insert:
j2: rx w2 x1+s0 ;
rl. w0 f9. ; insert
rs w0 x2 ; type, length;
jd 1<11+36 ; get clock;
ds w1 x2+4 ; insert time in testrecord;
al w2 x2+4+2 ;
rl. w3 i0. ;
j3: sl. w3 (i1.) ; transfer test information;
jl. j4. ;
rl w0 x3 ;
rs w0 x2 ;
al w2 x2+2 ;
al w3 x3+2 ;
jl. j3. ;
j4: rl. w1 f7. ; exit:
rx w1 b19 ; restore current proc
rl w2 x1+s6 ; if counter(main)<>0 then
sn w2 0 ; begin comment: generation stopping;
jl. j6. ; counter(main):= counter(main)-1
al w2 x2-1 ;
rs w2 x1+s6 ; if counter(main)=0 then
se w2 0 ; testmask(main):= 0
jl. j6. ;
ld w0 -100 ;
ds w0 x1+s2 ;
ds w0 x1+s3 ;
j6: dl. w1 f1. ;
dl. w3 f3. ; restore w0-w3;
jl. (i3.) ; return to calling program;
i0: 0 ; first
i1: 0 ; last
i2: 0 ;
i3: 0 ; link
e.
; procedure stop testoutput
;
; this procedure will generate a testrecord.
;
; additionally it will stop testoutput after generation
; of the number of records specified in w2 at call.
;
; function: a counter in mainproc is set to the value
; specified in w2. when the counter is nonzero, it is decreased
; by one after generation of each testrecord. if this makes
; the counter zero, the testmask is set to zero.
;
; after one call of f6, further calls will only change
; the counter, if the value specified in w2 is less than the
; current value of the counter (provided, the counter is
; nonzero).
;
; call return
; w0 value before testpoint
; w1 value before testpoint
; w2 counter value before testpoint
; w3 link value before testpoint
b. i0 w. ;
f6: ;
rs. w3 i0. ; save link
rl. w3 f7. ;
rx w2 x3+s6 ; if counter(main)=0 or
se w2 0 ; counter(main)>counter then
sl w2 (x3+s6) ;
jl. +4 ;
rx w2 x3+s6 ; counter(main):= counter
rl. w3 i0. ; link:= saved link
jl. f5. ; goto create testrecord
;
i0: 0 ; saved link
e. ;
z.
\f
; mainprocess.
;
; the mainprocess accepts messages of the following types:
; start transmitter 0<12
; start receive 3<12
; reset 4<12
; transfer block 5<12
; autoload 6<12
; master clear 8<12
; set mask 12<12
;
; mode in start transmit mess:
; 0 poll
; 1 accept master clear
; 2 reset, initiate, poll
; 3 reset, initiate, accept master clear
;
;
; mode in reset mess:
; 0 remote subprocs are removed; local subprocs are cleaned i. e.
; pending messages are returned with result 4 (malfunction).
;
; 2 all subprocs are removed.
; to execute operations the sender must be
; op: 0 ..
; 3 reserver of main or receiver
; 4 reserver of main
; 5 reserver of main or transmitter
; 6 reserver of main
; 8 reserver of main
; 12 neither reservation nor user inclusion is demanded
\f
b.i10,j10 w.
a0=1<23 ;
a0>0+a0>3+a0>4+a0>5+a0>6+a0>8+a0>12
i0: a0>0+a0>1+a0>2+a0>3
h80: bz w0 x2+8 ; start main:
sn w0 12 ; if op=12 then
jl. j10. ; goto setmask;
sz w0 2.1 ; if operation odd then
am g14-g15 ; check user;
jl w3 g15 ; else check reserver;
dl. w1 i0. ;
jl w3 g16 ; check operation(0.3.4.6.8.12,0);
rl w1 b19 ;
jl. m10. ; goto supervise;
j10: rl w1 b19 ; set mask:
dl w0 x2+12 ;
ds w0 x1+s2 ; mask0:=mask(0:47);
dl w0 x2+16 ;
ds w0 x1+s3 ; mask1:=mask(48:95);
al w0 0 ;
rs w0 g20 ; status:=0;
jl w3 g18 ; deliver result1;
jl (b20) ; exit: return to sender;
e.
\f
; initiate part.
b.i10,j10 w.
i2: 0<12+2.00 ; message: start transmitter, poll
i6: 0<12+2.10 ; message: start transmitter, reset, initiate, poll
i7: 0<12+2.11 ; message: start transmitter, reset, initiate, accept master clear
i4: 0,r.8 ; answer: dummy
i5: 0 ; saved message buffer
; entry from send message.
; w1: main, w2: addr(message buffer).
m10: ; supervise:
zl w0 x2+8 ; load operation
al w3 1 ; if operation <> reset then
se w0 4 ; mode = direct
hs w3 x1+s16 ;
rl w3 x2+8 ;
hs w3 x1+s17 ; save mess.mode
rs. w2 i5. ; save message buffer addr
c.p101 b.f1 w. ;*****test1*****
rs. w3 f0. ;
jl. w3 f4. ;
1 ;
f0: 0 ;
jl. f1. ;
al w0 x2+8 ; dump message(0:8);
al w1 x2+8+8 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test1*****
bz w3 6 ;
am x3 ;
jl. (x3+2) ; goto case operation of
m11 ; (0: start transmitter(mode),
-1 ; 1: not allowed,
-1 ; 2: not allowed,
m12 ; 3: receive block,
m13 ; 4: reset,
m14 ; 5: transmit block,
m14 ; 6: autoload,
-1 ; 7: not allowed,
m15 ; 8: master clear);
; reset.
m13: al w0 4 ; reset:
jl. w3 n14. ; clear subprocesses(main,function);
al w0 0 ; w1 := receiver
al w1 x1+p200 ; receiver.state := idle
rs w0 x1+p0 ;
rl w1 x1+a235 ;
al w0 4 ; reset receiver
jd 1<11+2 ;
rl. w2 i5. ; load mess buffer;
al w0 0 ;
rs w0 g20 ; status(mess):=0;
jl w3 g18 ; deliver result(status);
jl (b20) ; goto std waiting point;
; start transmitter.
; message received from main when a master clear or accept master clear
; operation must be send to the front end.
m11: jl w3 g18 ; start transmitter: deliver result1(dummy);
al. w1 i4. ;
rl. w2 i5. ;
; jl w3 d81 ;
jd 1<11+18 ; wait answer
; jl w3 d80 ; lock monitor
rl w1 b19 ;
jl. w3 n5. ; set host-id;
al w0 0 ;
hs w0 x1+p67 ; errorcount:=0;
j2: al w0 0 ; repeat: function:= remove remote, clean local;
jl. w3 n14. ; clear subprocesses(main,function);
bz w0 x1+p67 ;
ba. w0 1 ; errorcount:=errorcount + 1;
hs w0 x1+p67 ;
sl w0 p141 ; if errorcount>max errorcount then
am 4.00200 ; operation:=long delay;
al w3 4.00000 ; else operation:=no delay;
bz w0 x1+s17 ;
sz w0 2.01 ; if mode=accept master clear then
am 4.20000 ; operation:=operation and acc master clear,no test;
al w3 x3+4.00001; else operation:=operation and dummy,no test;
sz w0 2.10 ; if mode=initiate then
al w3 x3+4.03100; operation:=operation and reset,short delay, initiate;
hs w3 x1+p73 ; operation(trm):=operation;
jl. w3 e11. ; call transmitter(operation);
c.p101 b.f1 w. ;*****test4*****
rs. w3 f0. ;
jl. w3 f4. ;
4 ;
f0: 0 ;
jl. f1. ;
al w0 x1+p73 ;
al w1 x1+p77 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test4*****
bl w0 x1+p74 ;
jl. w3 n2. ; check errorcount
se w0 0 ; if result ok then
jl. j2. ; begin
hs w0 x1+s16 ; protocol mode: dcp
al w2 0 ; clear message block
rx w2 x1+a56 ; if pending master clear message then
sn w2 0 ;
jl. m2. ;
rs w2 b18 ; begin
al w0 1 ; if not regretted deliver(message, result, return)
so w2 2.01 ; end
jl w3 g18 ; end
jl. m2. ; goto continue transmit;
; receive block.
m12: al w1 x1+p200 ; receive block:
rs w1 b19 ; curr:=receiver;
jl. h86. ; goto receiver;
; transmit block, autoload.
m14: al w1 x1+p201 ; transmit block, autoload:
rs w1 b19 ; curr:=transmitter;
jl. (h87.) ; goto transmitter;
; transmit master clear.
; all (remote and local (temp and perm)) links must be cleaned i.e. messages
; returned with result 4.
; All remote (=temp) subprocesses must be removed.
; the subhost must be cleaned.
; This applies to the local fe as well as to all dh connected through
; this fe.
m15: ; transmit master clear:
rl w0 x1+a56 ; if pending master clear message then
se w0 0 ; deliver result(unintelligble)
jl g5 ; goto std waiting point
rs w2 x1+a56 ;
al w1 x1+a54 ; link message in q
jl w3 d6 ;
rl w1 b19 ; restore main
m16: al w0 0 ; break-down:
hs w0 x1+p67 ; errorcount:=0;
c.p101 b.f1 w. ;*****test7*****
rs. w3 f0. ;
jl. w3 f4. ;
7 ;
f0: 0 ;
jl. f1. ;
al w0 x1+2 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test7*****
jl. w3 n5. ; set host-id;
j0: al w0 0 ; repeat: function:= remove remote, clean local;
jl. w3 n14. ; clear subprocesses(main,function);
bz w0 x1+p67 ;
ba. w0 1 ; errorcount:=errorcount + 1;
hs w0 x1+p67 ;
sl w0 p141 ; if errorcount>max errorcount then
am 4.00100 ; delay:=long delay;
al w0 4.13101 ; else delay:=short delay;
hs w0 x1+p73 ; operation(trm):=master clear,initiate,reset,delay,error action off;
jl. w3 e11. ; call transmitter(operation);
bl w0 x1+p74 ;
c.p101 b.f1 w. ;*****test5*****
rs. w3 f0. ;
jl. w3 f4. ;
5 ;
f0: 0 ;
jl. f1. ;
al w0 x1+2 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test5*****
jl. w3 n2. ; check errorcount
se w0 0 ; if result<>ok then
jl. j0. ; goto repeat;
j1: al w0 4.03111 ; operation(rec):=initiate,reset,short delay,
hs w0 x1+p93 ; header,error actions off;
zl w0 x1+p67 ; update no of retries
ba. w0 1 ;
hs w0 x1+p67 ;
jl. w3 e10. ; call receiver(operation);
bl w0 x1+p94 ;
c.p101 b.f1 w. ;*****test6*****
rs. w3 f0. ;
jl. w3 f4. ;
6 ;
f0: 0 ;
jl. f1. ;
al w0 x1+2 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test6*****
jl. w3 n2. ; check errorcount
sn w0 8 ; if result=abnormal termination(reset rec) then
jl. j1. ; goto restart rec;
se w0 10 ; if result<>accept master clear then
jl. j0. ; goto repeat;
al. w2 i2. ; message:=start trm, poll;
jl. w3 n4. ; send trm message(message);
al w0 4.01010 ;
hs w0 x1+p93 ; operation:=initiate,header;
jl. m0. ; goto start receiver;
; master clear received from device controller.
; all (remote and local (temp and perm)) links must be cleaned i.e. messages
; returned with result 4.
;all remote (=temp) subprocesses must be removed.
; the subhost must be cleaned.
; this applies to the local fe as well as to all dh connected through
; this fe.
m8: al w0 0 ; master clear received: function:= remove remote, clean local;
jl. w3 n14. ; clear subprocesses(main,function);
c.p101 b.f1 w. ;*****test2*****
rs. w3 f0. ;
jl. w3 f4. ;
2 ;
f0: 0 ;
jl. f1. ;
al w0 x1+2 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test2*****
al. w2 i7. ; message:=start trm, reset, initiate, acc master clear;
jl. w3 n4. ; send trm message(message);
al w0 4.01010 ;
hs w0 x1+p93 ; operation:=initiate,header;
jl. m0. ; goto start receiver;
e.
h87: h88 ; address of start transmit
\f
; receive part.
b.j20,i10 w.
m0: jl. w3 e10. ; start receive: call receiver;
m3: bz w3 x1+p94 ; continue receive:
c.p101 b.f1 w. ;*****test8*****
rs. w3 f0. ;
jl. w3 f4. ;
8 ;
f0: 0 ;
jl. f1. ;
al w0 x1+p95 ;
al w1 x1+p95+14 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test8*****
se w3 0 ; if result<>ok then
jl. j8. ; goto check result;
bz w0 x1+p97 ;
so w0 4.00002 ; if no dataflag then
jl. j0. ; goto header;
hs w3 x1+p80 ; data: internal status:=result(:=0);
rl w2 x1+p90 ; sub:=sub(rec);
jl. w3 e4. ; call entry4(sub);
bz w0 x1+p97 ;
j0: so w0 4.00010 ; header: if no headerbit then
jl. j4. ; goto ok;
jl. w3 n0. ; packout(header);
bz w0 x1+p99 ; if local function=
sn w0 1 ; host disconnect then
jl. j9. ; goto clear up
sn w0 2 ; if local function = host connected
jl. j10. ; then remove all links
sn w0 4 ; if local function=link not present then
jl. j11. ; goto clean and remove subprocess;
se w0 0 ;
sn w0 3 ; if local function<>0 and
jl. +4 ; local function<>3 then
jl. j2. ; goto reject
bl w0 x1+p81 ;
al w2 x1+p202 ; if func(header)>=min subproc func value then
sh w0 v40-1 ; sub:=subproc(rec);
rs w2 x1+p90 ; else
rl w2 x1+p90 ; sub:=hostproc(main);
se w1 (x2+a50) ; if main(sub)<>main then
jl. j2. ; goto reject;
bz w0 x1+p97 ; if no databit then
so w0 4.00020 ; goto out;
jl. j1. ;
zl w0 x1+p81 ; if headerfunction.databit is off then
sz w0 1 ; begin
jl. j7. ;
c.p101 b. f1 w. ;***** test 14 *****
rs. w3 f0. ;
jl. w3 f4. ;
14
f0: 0 ; dump receiver parameters:
jl. f1. ; line param
al w0 x1+p86 ; packet control param
al w1 x1+p95 ; device control param
; internal mainproc param
jl. w3 f5. ;
f1: ;
e.z. ;***** test 14 *****
jl. w3 e4. ; call sub(entry 4);
jl. j3. ; goto setup(blockcontrol=skip);
j7: ; end;
jl. w3 e3. ; call entry3(sub);
bz w0 x1+p80 ;
al w3 4.00012 ; operation:= if internal status=ok then
se w0 p160 ; data else header
al w3 4.00010 ;
jl. j6. ; goto setup1;
j1: jl. w3 e4. ; out:
bz w0 x1+p80 ; call entry4(sub);
jl. j5. ; goto setup;
j2: am p163-p162 ; reject: blockcontrol:=reject;
j3: am p162-p160 ; skip: blockcontrol:=skip;
j4: al w0 p160 ; ok: blockcontrol:=ok;
j5: al w3 4.00010 ; setup: operation:=header;
j6: hs w0 x1+p96 ; setup1: blockcontrol(main):=blockcontrol;
hs w3 x1+p93 ; operation(main):=operation;
ld w0 -100 ;
ds w0 x1+p95+2 ; clear header rec area;
ds w0 x1+p95+6 ;
ds w0 x1+p95+10 ;
ds w0 x1+p95+14 ;
jl. m0. ; goto start receive;
j8: ; check result:
c.p101 b.f1 w. ;*****test9*****
rs. w3 f0. ;
jl. w3 f4. ;
9 ;
f0: 0 ;
jl. f1. ;
al. w0 f0. ;
al. w1 f1. ;
al w2 2 ;
jl. w3 f6. ;
f1: ;
e.z. ;*****test9*****
sn w3 9 ; if result=master clear then
jl. m8. ; goto master clear;
sl w3 4 ; i result>3 then
jl. m16. ; goto break-down;
al w3 x3+3 ; internal status:=result+3;
hs w3 x1+p80 ;
rl w2 x1+p90 ; sub:=sub(rec);
jl. w3 e4. ; call entry4(sub);
jl. j3. ; goto skip;
; a host has been disconnected from the network.
; messages queued up at the subhost concerning the disconnected host must
; be returned with result 4 (receiver malfunction).
; all remote (temp) and local (perm) subprocesses concerning this host must
; be cleaned (i.e. return messages with result 4), and the remote subprocesses
; must be removed too.
;
; w1 = main.
j9: ;
c.p101 b. f1 w. ;***** test 10 *****
rs. w3 f0. ;
jl. w3 f4. ; dump receive area
10 ;
f0: 0 ;
jl. f1. ;
al w0 x1+p80 ;
al w1 x1+p90 ;
jl. w3 f5. ;
f1: ;
e.z. ;***** test 10 *****
;
al w3 x1 ;
zl w1 x3+p322 ; homereg := sender.homereg;
ls w1 +12 ;
ba w1 x3+p321 ; netid := sender.netid;
rl w0 x3+p323 ; hostid := sender.hostid;
al w2 x3+p202 ; subhost := this fpa.subhost;
jl. w3 n18. ; partly cleaning of subhost(homereg, netid,
; hostid, subhost);
al w1 x2-p202 ; main := this fpa.main;
rl w0 x1+p323 ; hostid := sender.hostid;
zl w2 x1+p321 ; netid := sender.netid;
jl. w3 n17. ; remove remote clear local subprocs(hostid, main, netid);
jl. j4. ; goto ok;
;
; local host connected.
; the fe has just been autoloaded.
; all (temp and perm) links to this fe must be cleaned (messages returned
; with result 4) and removed.
; all links to dh connected through this fe must be cleaned and temp links
; must be removed.
; the subhost must be cleaned.
;
; w1 = main
j10: ;
c.p101 b. f1 w. ;***** test 11 *****
rs. w3 f0. ;
jl. w3 f4. ; dump receive area
11 ;
f0: 0 ;
jl. f1. ;
al w0 x1+p80 ;
al w1 x1+p90 ;
jl. w3 f5. ;
f1: ;
e.z. ;***** test 11 *****
;
al w2 x1+p202 ; subhost := this fpa.subbhost;
jl. w3 n16. ; clean subproc(subhost);
; <* clean and remove all links to devices connected
; to the local fe *>
rl w0 x1+p323 ; hostid := sender.hostid; <* i.e. local fe *>
zl w2 x1+p321 ; netid := sender.netid;
jl. w3 n15. ; clear and remove subproc(hostid, main, netid);
;
;<* only local and remote subprocs to dh connected
; through this fe should be left now - clean the
; local and remove the remote subprocs *>
al w0 0 ; hostid := dummy;
zl w2 x1+p321 ; netid := sender.netid;
jl. w3 n17. ; remove remote clean local subprocs(hostid, main, netid);
jl. j4. ; goto ok;
; link not present at device host.
; a communication to a link which was not present at the device host,
; was initiated. clean and remove the specified link in rc8000.
; w1=main
j11: rl w2 x1+p90 ; subproc := main.current subproc;
jl. w3 n16. ; clean subproc(subproc);
jl. w3 (i0.) ; remove subproc(subproc);
jl. j4. ; goto ok;
;
i0: v102 ; address of remove subprocess
e.
\f
; transmit part.
b.j10, i10 w.
m1: jl. w3 e11. ; start transmit: call transmitter;
m2: bz w3 x1+p74 ; continue transmit:
c.p101 b.f1 w. ;*****test12*****
rs. w3 f0. ;
jl. w3 f4. ;
12 ;
f0: 0 ;
jl. f1. ;
al w0 x1+p75 ;
al w1 x1+p75+14 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test12*****
se w3 0 ; if result<>0 then
jl. j6. ; goto result-error;
bz w3 x1+p76 ; status:=blockcontrol;
j2: hs w3 x1+p60 ; insert: internal status:=status;
bz w0 x1+p77 ;
sn w0 2.0000 ; if contents=dummy then
jl. j1. ; goto get-next;
sz w0 2.1000 ; if databit
se w3 p160 ; or result<>ok then
jl. j0. ; goto aftertrm;
al w0 4.00002 ;
hs w0 x1+p73 ; operation:=data;
jl. m1. ; goto start transmit;
; aftertrm:
j0: rl w2 x1+p70 ; sub:=subproc(trm);
jl. w3 n12. ; queue out(sub);
rl w0 x2+a50 ; if main(sub)<>main then
se w0 x1 ;
jl. j1. ; goto get next subprocess
jl. w3 e2. ; call entry2(sub);
; goto get next subprocess;
e7: ; entry-get next:
j1: rl w2 x1+p14 ; get next:
sn w2 x1+p14 ; if queue is empty then
jl. j4. ; goto poll;
al w2 x2-p14 ;
bz w0 x1+p60 ;
sn w0 p161 ; if internal status=wait and
se w2 (x1+p70) ; and new sub=proc desc then
am -4.00100 ; operation:=short delay
al w0 4.00100 ; else operation:=no delay;
hs w0 x1+p73 ;
ld w0 -100 ;
ds w0 x1+p60 ;
ds w0 x1+p72 ;
ds w0 x1+p79 ;
ds w0 x1+p303 ;
ds w0 x1+p64 ;
ds w0 x1+p62 ;
rs w0 x1+p63 ;
rs w2 x1+p70 ; subproc(rec):=subproc(queue);
jl. w3 e1. ; call entry1(sub);
bz w0 x1+p60 ;
se w0 p160 ; if internal status<>ok then
jl. j3. ; goto regretted;
jl. w3 n1. ; packin(header);
rl w0 x1+p66 ;
bz w3 x1+p73 ;
se w0 0 ; if lineparam.size<>0 then
am 4.00020 ; operation:=header, data;
al w3 x3+4.00010; else
hs w3 x1+p73 ; operation:=transmit header;
jl. m1. ; goto start transmit;
j3: jl. w3 n12. ; regretted: queue out(sub);
jl. j1. ; goto get next;
j4: al w0 4.00200 ; poll:
hs w0 x1+p73 ; operation:=long delay;
jl. m1. ; goto start transmit;
j5: ; special actions:
j6: ; result-error:
c.p101 b.f1 w. ;*****test13*****
rs. w3 f0. ;
jl. w3 f4. ;
13 ;
f0: 0 ;
jl. f1. ;
al. w0 f0. ;
al. w1 f0. ;
al w2 4 ;
sh. w2 (f0.) ;
am f6-f5 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test13*****
sl w3 4 ; if max errors exceeded then
jl. m16. ; goto break-down;
al w3 x3+3 ; status:=result+3;
jl. j2. ; goto insert;
e.
\f
; main help procedures.
; packout.
; call: return:
; w0 destroyed
; w1 main unchanged
; w2 unchanged
; w3 link destroyed
b. i10 w.
n0: ; packout:
ds. w3 i1. ; save link and w2
dl w0 x1+p95+2 ; unpack
al w2 0 ;
ld w3 16 ;
rs w2 x1+p86 ; line.size
al w2 0 ;
ld w3 8 ;
hs w2 x1+p99 ; local function
;
ld w0 16 ;
la. w3 i2. ;
hs w3 x1+p321 ; sender net-id
ld w0 8 ;
la. w3 i2. ; sender home-reg
hs w3 x1+p322 ;
;
rl w0 x1+p95+4 ;
ls w0 -8 ;
rs w0 x1+p323 ; sender host-id
;
dl w3 x1+p95+10 ;
ld w3 8 ;
la. w2 i3. ;
hs w2 x1+p98 ; sender linkno
al w2 0 ;
ld w3 6 ;
hs w2 x1+p328 ; data quality
ls w3 -14 ;
bz w0 x1+p99 ;
se w0 3 ; if local function=3 (regretted) then
jl. i10. ; exchange sender linkno, receiver linkno;
bz w0 x1+p98 ;
hs w3 x1+p98 ;
rl w3 0 ;
i10: hs w3 x1+p89 ;
ls w3 1 ; index:=rec linkno*2 + name table start;
wa w3 b4 ;
rl w3 x3 ; current proc(main):= proc(index)
rs w3 x1+p90 ;
;
dl w0 x1+p95+14 ;
al w2 0 ;
ld w3 16 ;
rs w2 x1+p84 ; header.size
al w2 0 ;
ld w3 8 ;
hs w2 x1+p88 ; bufno
;
rl w2 0 ;
la. w2 i4. ;
rs w2 x1+p83 ; status
al w3 0 ;
ld w0 8 ;
hs w3 x1+p81 ; function
al w3 0 ;
ld w0 3 ;
hs w3 x1+p82 ; result
;
dl. w3 i1. ; restore w2
jl x3 ; goto link
i0: 0 ; saved w2
i1: 0 ; saved w3
i2: 8.377 ; last 8 bits
i3: 8.1777 ; last 10 bits
i4: 8.177777 ; last 16 bits
e. ; end of packout
; packin.
; call: return:
; w0 destroyed
; w1 main unchanged
; w2 unchanged
; w3 link unchanged
b. i10 w.
n1: ; packin:
rs. w3 i0. ; save link
rl w2 x1+p66 ; packin
ls w2 8 ; size
ba w2 x1+p79 ;
rs w2 x1+p75+0 ; local function
;
bz w3 x1+p301 ; format(packet):= 0
ls w3 8 ; rec net-id
ba w3 x1+p302 ;
ds w3 x1+p75+2 ; rec home-reg
;
rl w2 x1+p303 ; rec host-d
rl w3 x1+p304 ; packet-id
rl w0 x1+p305 ; facility mask
;
ls w2 8 ;
ls w0 8 ;
ld w0 -8 ;
wa w2 6 ;
rs w2 x1+p75+4 ;
rs w0 x1+p75+6 ;
;
bz w2 x1+p78 ; format(mes):= 0, sender linkno
al w3 0 ;
ld w3 -8 ;
rs w2 x1+p75+8 ; data quality
bz w2 x1+p308 ;
ls w2 10 ;
wa w2 6 ;
ba w2 x1+p69 ; receiver linkno
rs w2 x1+p75+10 ;
;
rl w2 x1+p64 ; size
ls w2 8 ;
ba w2 x1+p68 ; bufferno
rs w2 x1+p75+12 ;
;
bz w3 x1+p61 ;
ls w3 3 ; function
ba w3 x1+p62 ;
ls w3 13 ;
lo w3 x1+p63 ; mode
rs w3 x1+p75+14 ;
;
jl. (i0.) ; goto return
i0: 0 ; saved link
e. ; end of packin
; check errorcount
; returns a possible masterclear message if errorcount(trm) > max tries
;
; call return
; w0 unchanged
; w1 main unchanged
; w2 destroyed
; w3 link destroyed
;
b. i2 w.
n2: zl w2 x1+p67 ; if errorcount(trm) < maxtries then
sh w2 p140 ; return
jl x3 ; else
al w2 0 ; answer (possible) master clear message
rs w2 g20 ; with result malfunction
rx w2 x1+a56 ;
sn w2 0 ;
jl x3 ;
rs w2 b18 ; start transmitter(master clear)
ds. w1 i1. ; save w0 w1 w3
rs. w3 i2. ;
al w0 4 ; ( if fe later sends a master clear the protocol will start
so w2 2.01 ;
jl w3 g19 ;
dl. w1 i1. ;
jl. (i2.) ;
i0: 0 ; saved w0
i1: 0 ; saved w1 (main)
i2: 0 ; saved w3 (return)
e.
; send trm message.
; call: return:
; w0 destroyed
; w1 main unchanged
; w2 addr(mess) destroyed
; w3 link destroyed
b.i4 w.
n4: rs. w3 i0. ; send trm message: save link;
dl w0 x1+a11+2 ;
ds. w0 i2. ;
dl w0 x1+a11+6 ; transfer name of main proc;
ds. w0 i3. ;
al w1 x2 ; message:=message;
al. w3 i1. ; receiver:=main;
jd 1<11+16 ; send message;
rl w1 b19 ;
jl. (i0.) ; exit: return to link;
i0: 0 ; saved link
i1: 0 ; name of mainproc
i2: 0 ;
0 ;
i3: 0 ;
0 ; name table entry
e.
; set host-id.
; call: return:
; w0
; w1 main unchanged
; w2
; w3 link destroyed
b.i1 w.
n5: rs. w3 i0. ; set host-id: save link;
rl w0 x1+s7 ;
la. w0 i1. ; host-id(main):=
rs w0 x1+p303 ; host-id(main);
rl w0 x1+s7 ;
ls w0 -16 ; home-reg(trm):= home-reg(main);
hs w0 x1+p302 ;
al w0 2 ; local function(trm):= host-up;
hs w0 x1+p79 ;
jl. w3 n1. ; packin;
jl. (i0.) ; exit: return to link;
i0: 0 ; saved link
i1: 8.17 7777 ; last 16 bits
e.
; queue out(sub).
; removes a subprocess from the process queue of the mainprocess.
; call: return:
; w0 unchanged
; w1 unchanged
; w2 subproc unchanged
; w3 link destroyed
b.i6 w.
v103: ;
n12: ds. w3 i1. ; queue out:
al w2 x2+p14 ;
jl w3 d5 ; remove element;
rl. w2 i0. ;
jl. (i1.) ; exit: return;
i0: 0 ; saved w2
i1: 0 ; saved link
e.
; clear all subprocesses(main,function).
; call: return:
; w0 function destr.
; w1 main unchanged
; w2 destr.
; w3 link destr.
;
; function = 0: remote subprocs are removed ; local subprocs are cleaned
; i. e. pending messages are returned with result 4.
;
; 2: all subprocs are removed.
;
; 4: all subprocs are cleaned.
b.i10,j10 w.
n14: ds. w0 i8. ; clear subprocesses:
al w2 x1+p202 ; proc:=host;
jl. w3 n16. ; clean subprocess(proc);
al w2 x2+p19 ;
al w0 0 ;
j4: rs w0 x2 ; for bufno:=0,1,..,v3-1 do
al w2 x2+2 ; message(bufno):=0;
sh w2 x1+p100-a48+p19+v3<1-2 ;
jl. j4. ;
al w0 0 ; host-id:=undefined;
jl. w3 n15. ; clear subprocesses(host-id,main,net-id);
al w0 2 ;
rs. w0 i8. ; function:= 2(remove);
jl. (i7.) ; exit: return
i7: 0 ; saved link
i8: 2 ; function
; remove remote clean local subprocs(hostid, main, netid);
;
; all permanent and temporary links connected to the specified devicehost
; are cleaned i.e. messages are returned with result 4 (receiver malfunction).
; all temporary (remote) links are then removed.
; if the hostid has dummy value (= 0) then all subprocesses connected to the
; main process are processed.
;
; call return
; w0: hostid destroyed
; w1: main unchanged
; w2: netid destroyed
; w3: link destroyed
;
n17: ;begin
rs. w3 i9. ; save link;
al w3 0 ;
rs. w3 i8. ; function := remove remote and clean local;
jl. w3 n15. ; clear subprocesses(hostid, main, netid);
;
al w3 2 ; function := remove all subprocesses;
rs. w3 i8. ; <* default value *>
jl. (i9.) ; return;
;
i9: 0 ; save link
;end;
; clear subprocesses(host-id,main,net-id).
; the procedure clears all subprocesses that are connected to the device
; host in question. if the host-id has dummy value (=0) then all
; subprocesses connected to the main process are cleared.
; call return
; w0 host-id destroyed
; w1 main unchanged
; w2 net-id destroyed
; w3 link destroyed
n15: ds. w1 i1. ; clear subprocesses:
ds. w3 i3. ; save w0-w3;
rl w3 b4 ; entry:=first entry in name table ;
al w3 x3-2 ;
j0: al w3 x3+2 ; next: entry:=next entry in name table;
sl w3 (b5) ; if entry>last dev entry then
jl. (i3.) ; exit: return;
rl w2 x3 ; proc:=proc(entry);
se w1 (x2+a50) ; if mainproc(proc)<>mainproc then
jl. j0. ; goto next;
rl w0 x2+a10 ; kind:= kind(proc);
se w0 p112 ; if kind <> remote subkind and
sn w0 p113 ; kind <> local subkind
jl. j7. ; then goto next;
jl. j0. ;
j7:
rl. w0 i0. ;
sn w0 0 ; if host-id<>dummy then
jl. j1. ; if host-id<>host-id(sub)
se w0 (x2+p5) ; or net-id<>net-id(sub) then
jl. j0. ; goto next;
; bz w0 x2+p7 ;
; se. w0 (i2.) ;***fjernet indtil net-id er defineret
; jl. j0. ;
j1: rs. w3 i4. ;
rl. w3 i8. ;
jl. (x3+2) ; goto case function of
j5 ; (0: remove temp,
j6 ; 2: remove subproc,
j2 ; 4: clean subproc)
j5: rl w0 x2+a10 ; remove temp:
sn w0 p112 ; if proc = local subproc
jl. j2. ; then goto clean subproc;
se w0 p113 ; if proc = remote subproc
jl. j3. ; then goto remove subproc;
j6: am +2 ; remove subproc: remove subproc(proc);
j2: jl. w3 (i5.) ; clean subproc: clean subproc(proc);
j3: rl. w3 i4. ;
jl. j0. ;
i0: 0 ; saved host-id
i1: 0 ; saved main
i2: 0 ; saved net-id
i3: 0 ; saved link
i4: 0 ; name table address
i5: v101 ; address of clean subproc
i6: v102 ; address of remove remote subprocess
e.
; clean subproc(proc).
; cleans the sub process by returning all messages in the mess buffer queue with dummy answer.
; call: return:
; w0 destroyed
; w1 unchanged
; w2 sub unchanged
; w3 link destroyed
b.i3 w.
v101: ;
n16: rs. w3 i0. ; clean subproc:
rs. w1 i1. ; save w1;
al w1 x2 ;
rx w2 b19 ; cur proc:=sub;
rs. w2 i2. ; save old curr proc;
jl. w3 (i3.) ; clear subproc message queue;
dl. w2 i2. ;
rx w2 b19 ; curr proc:=old curr proc;
jl. w3 n12. ; queue out;
jl. (i0.) ; exit: return;
i0: 0 ; saved link
i1: 0 ; saved w1
i2: 0 ; saved old curr proc
i3: v100 ; address of clear subproc mess queue;
e.
; partly cleaning of subhost(dh-id, dh-netid, dh-homereg, subhost);
;
; all messages queued up at the specified subhost is scanned.
; if a message is met which is send to the specified device host it is
; returned with result 4 (receiver malfunction).
;
; call return
; w0: dh-id destroyed
; w1: dh-homereg, dh-netid destroyed
; w2: subhost unchanged
; w3: link destroyed
;
b. i10, j10 w.
n18: ;begin
ds. w1 j1. ; save parameters;
ds. w3 j3. ;
dl w1 b19 ; save current message and
ds. w1 j5. ; current receiver;
rs w2 b19 ; current receiver := subhost;
rl w0 x2+a10 ; if subhost.kind <> hostproc kind
se w0 p111 ;
jl. i6. ; then return;
;
al w1 0 ; for messno := 0 step 1 until maxmessno do
i1: rs. w1 j6. ; begin
am x1 ; message := subhost.message table(2 * messno);
am x1 ;
rl w2 x2+p19 ; if message <> 0 then
sn w2 0 ;
jl. i3. ; begin
la w2 g50 ; <* clear bit 23 in message addr *>
dl. w1 j1. ; test message destination(dh-id, dh-homereg,
jl. w3 n19. ; dh-netid, message);
jl. i3. ;+0: wrong message destination: goto next message entry;
;+2: right message destination:
rl. w1 j2. ;
rl. w2 j6. ; test and decrease stopcount(subhost, messno);
jl. w3 (j7.) ;
;
rl w0 x1+p13 ;
rl. w2 j6. ; if subhost.messagetable(2 * messno) =
am x2 ;
am x2 ;
se w0 (x1+p19) ; subhost.current message
jl. i2. ; then begin
al w0 0 ; subhost.current message := 0;
rs w0 x1+p13 ;
rs w0 x1+p12 ; subhost.internal state := ready;
i2: ; end;
al w3 1 ; subhost.freebuf := subhost.freebuf + 1;
ba w3 x1+p16 ;
hs w3 x1+p16 ;
al w3 0 ; subhost.messagetable(2 * messno) := 0;
am x2 ;
am x2 ;
rs w3 x1+p19 ;
i3: ; end <* if message <> 0 *>;
rl. w2 j2. ;
rl. w1 j6. ;
al w1 x1+1 ;
se w1 v3 ;
jl. i1. ; end <* for messno ... *>;
;
al w0 x2+a54 ; store subhost.q-head;
rs. w0 j8. ;
rl w2 x2+a54 ; mess :- subhost.q-head.first;
i4: ; while mess<>none do
sn. w2 (j8.) ; begin
jl. i6. ; next mess:-mess.next;
rl w0 x2 ;
rs. w0 j6. ;
dl. w1 j1. ; test message destination(dh-id, dh-homereg,
jl. w3 n19. ; dh-netid, message);
jl. i5. ;+0: wrong message destination:
;+2: right message destination:
rs w2 b18 ;
al w0 4 ; deliver message(message, result 4);
jl w3 g19 ;
;
i5: rl. w2 j6. ;
jl. i4. ; end <* while ... *>;
;
;
i6: dl. w1 j5. ; restore current message and
ds w1 b19 ; current receiver and
rl. w2 j2. ; subhost;
jl. (j3.) ;end;
;
j0: 0 ; save w0: dh-id
j1: 0 ; " w1: dh-homereg, dh-netid
j2: 0 ; " w2: subhost
j3: 0 ; " w3: link
j4: 0 ; save current messae
j5: 0 ; save current receiver
j6: 0 ; messno or next message
j7: v104 ; address of test and decrease stopcount
j8: 0 ; subhost q-head
; test message destination(dh-hostid, dh-homereg, dh-netid, message)
;
; It is checked whether or not the specified message is a message
; concerning the device host specified in the parameters.
;
; call return
; w0: dh-hostid unchanged
; w1: dh-homereg, dh-netid unchanged
; w2: message unchanged
; w3: link unchanged
;
; return: link + 0: message not to device host
; link + 2: message to device host
;
n19: ;
se w0 (x2+16) ; if dh-hostid = message.dh-hostid then
jl x3 ;
; se w1 (x2+18) ; and dh-homereg=message.dh-homereg
; jl x3 ; and dh-netid=message.dh-netid
; ; <* excluded until defined in net *>
jl x3+2 ; then return(link+2)
; else return(link);
e.
\f
; each subdriver has six entry points with the functions:
;
; entry0 (deliver message):
; used when send message delivers a message to the subexternal process.
;
; entry1 (set up operation):
; used when the mainproc wants the subdriver to start an operation.
;
; entry2 (end transfer):
; used when the operation - and the datablock - has been sent, and
; the receipt received.
;
; entry3 (receive operation):
; used when a header that includes a following datablock is received.
;
; entry4 (end receive):
; used when the receive operations are finished.
;
; entry5 (initiate process):
; used after creation of the subprocess.
;
; contents of registers entering the subprocess:
; w0: , w1: subproc , w2: , w3: .
; current process (b19) : subprocess.
;
; standard return from the subprocess is:
; jl (b101)
; w0-w3 undefined.
; return with initiation is:
; am (b101)
; jl -2
; with w2: process description addr of the subprocess which shall be initiated.
;
; the adresses of the different entry points are defined in a table at
; top of the subprocess drivers:
; h-name(driver start addr): addr(entry0)
; addr(entry1)
; ....
;
; call: return:
; w0 destroyed
; w1 mainproc
; w2 subproc destroyed
; w3 link destroyed
b.i10,j10 w.
e0: am 0-2 ; call(entry0):
e1: am 2-4 ; call(entry1):
e2: am 4-6 ; call(entry2):
e3: am 6-8 ; call(entry3):
e4: am 8-10 ; call(entry4):
e5: al w0 10 ; call(entry5):
se w0 10 ; if entry<>entry 5 then
rs. w3 i0. ; return addr:=link;
rs w2 b19 ; current proc:=subproc;
bl w3 x2+p10 ;
c.p101 b.f1 w. ;*****test16*****
rs. w0 i10. ;
rs. w3 f0. ;
jl. w3 f4. ;
16 ;
f0: 0 ;
jl. f1. ;
rs w0 x3 ;
rs w1 x3+2 ;
rs w2 x3+4 ;
rl. w0 f0. ;
rs w0 x3+6 ;
al w0 x3 ;
al w1 x3+6 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test16*****
al w1 x2 ;
rl w2 0 ;
am. (x3+j0.) ;
jl (x2) ;
h99 ; -2: hostprocess
j0: h100 ; 0: general sequential device
h102 ; 2: clock
h104 ; 4: bs-area
h106 ; 6: disc
h108 ; 8: terminal
h110 ; 10: reader
h112 ; 12: punch
h114 ; 14: printer
h116 ; 16: cardreader
h118 ; 18: magtape
h120 ; 20: plotter
h122 ; 22: discette
h124 ; 24: character i-o
; return points from the subprocesses.
jl. e5. ; return(init): (w2: subproc(init)) goto entry 5;
b89: rl w2 b19 ; return(std):
rl w1 x2+a50 ;
rs w1 b19 ; cur proc:=mainproc;
c.p101 b.f1,j6 w. ;*****test17*****
rs. w3 f0. ;
jl. w3 f4. ;
17 ;
f0: 0 ;
jl. f1. ;
rl. w2 i10. ;
jl. (x2+2) ;
j0 ; 0
j1 ; 1
j2 ; 2
j3 ; 3
j3 ; 4
j3 ; 5
j0: al w0 x1+2 ;
jl. j6. ;
j1: al w0 x1+p66 ;
al w1 x1+p63 ;
jl. j6. ;
j2: al w0 x1+p60 ;
al w1 x1+p60 ;
jl. j6. ;
j3: al w0 x1+p86 ;
al w1 x1+p83 ;
j6: jl. w3 f5. ;
f1: ;
e.z. ;*****test17*****
jl. (i0.) ; exit: return to link;
i0: 0 ; return addr(subproc)
i10: 0 ; saved entry no
a66=j0
e.
\f
; call of the receiver and the transmitter is carried out by use of
; these procedures.
; by entry in the trm/rec:
; w1: rec/trm , w2: main
; call: return:
; w0 destroyed
; w1 main
; w2 receiver/transmitter
; w3 link destroyed
e10: rl w2 b19 ; call receiver:
al w1 x2+p200 ; proc:=receiver;
rs w1 b19 ;
rs w3 x1+p3 ; link(rec):=link;
jl. e8. ; goto start-receiver;
e11: rl w2 b19 ; call transmitter:
al w1 x2+p201 ; proc:=transmitter;
rs w1 b19 ;
rs w3 x1+p3 ; link(trm):=link;
jl. e9. ; goto start-transmitter;
e12: rl w2 b19 ; return to main:
rl w1 x2+a50 ; main:=main(proc);
rs w1 b19 ; cur proc:=main;
jl (x2+p3) ; return to main;
\f
; dummy subprocess.
b.q5, i0 w.
h96: q0 ; addr(entry0)
q1 ; addr(entry1)
q2 ; addr(entry2)
q3 ; addr(entry3)
q4 ; addr(entry4)
q5 ; addr(entry5)
q0: jl g3 ; entry 0: goto result 5;
q1: al w0 p163 ; entry 1:
am (x1+a50) ;
hs w0 +p60 ; internal status:=reject;
q2: jl (b101) ; entry 2: return(std);
q3: al w0 p163 ; entry 3:
am (x1+a50) ;
hs w0 +p80 ; internal status:=reject;
q4: ; entry 4:
q5: jl (b101) ; entry 5: return(std);
h102=h96 , h104=h96
e.
\f
; subkind driver.
; all messages to subproces passes through this block.
; w3: subproc
h82: ; hostprocess:
h84: al w2 x3 ; subprocess:
rl w1 x2+a50 ; main:=mainproc(sub);
sn w1 0 ; if main=0 then
jl g6 ; goto result 2 (rejected)
zl w0 x1+s16 ;
se w0 0 ; if ready flag(main)=running then
jl g4 ; goto result4;
jl. w3 e0. ; call entry0(sub);
; goto main-exit;
e6: ; main-exit:
rl w2 x1+p14 ;
am x1+p201 ;
rl w0 +p2 ;
se w2 x1+p14 ; if proc queue(main) is empty
se w0 1 ; or state(trm)<>waiting before poll then
jl (b20) ; return to program;
jl. e7. ; goto get-next;
e. ; end of mainproc
; stepping stones:
jl. f4. ;
f4=k-2 ;
jl. f5. ;
f5=k-2 ; ; end of mainprocess driver (m,n and s-names).
jl. f6. ;
f6=k-2 ;
\f
; block including the receiver process.
b.c6,n5,s16 w.
; receiver.
m. fpa receiver
; process description:
; a250: ; driver process description address
; a402: ; user bit table
; a48: ; interval
; a49: ; interval
; a10: ; kind
; a11: ; name
; a50: ; mainproc
; a52: ; reserver
; a57, a58: ; work0, work1
; a54: ; next message
; a55: ; last message
; a56: ; message regretted
p2=p0 ; state(rec)
p3=p2+2 ; link
s0=p3+2 ; transmit status, cur. ch. command
; , rem. char count
; , cur. status
; , event status
s1=s0+8 ; receive status , cur. ch. command
; , rem. char count
; , cur. status
; , event status
s2=s1+8 ; startbyte<16
s3=s2+2 ; statusbyte<16
s4=s3+2 ; expected blocknumber
s5=s4+2 ; message buffer
s6=s5+2 , ; errorbits ,
s7=s6+2 ; delay
; error parameters:
s10=s7+2 , ; errorcount , blocklength error
, ; parity error , timeout(write)
, ; timeout(mon) , abnormal termination
, ; master clear , accept master clear
, ; blockno error ,
s12=s10+10 ; top of privat part proc desc
s13=s12 ; start of channel program area
; s14 ; top of channel program area
\f
; receiver channel program:
; start1:
; transmit statusbyte.
c0: 4<12+3<8 ; addr code:=devi desc , op:=write
+s3 ; first addr:=addr(statusbyte)
1 ; char count:=1
; sense status(trm).
c1: 4<12+0<8 ; addr code:=devi desc , op:=sense
+s0 ; first addr:=addr trm status
12 ; char count:=12
; start2:
; receive startbyte.
c2: 4<12+1<8+1<7 ; addr code:=devi desc , op:=read, continue
+s2 ; first addr:=addr(startbyte)
1 ; char count:=1
; receive header.
c3: 4<12+1<8+1<7 ; addr code:=devi desc , op:=read, continue
+p95-p200 ; first addr:=addr(header area in main)
2+1+11+10 ; char count
; receive data.
c4: 1<8 ; addr code , op:=read
0 ; first addr
0 ; char count
; sense status(rec).
c5: 4<12+0<8 ; addr code:=devi desc , op:=sense
+s1 ; first addr:=addr rec status
12 ; char count:=12
; stop.
c6: 15<8 ; dummy , op:=stop
0 ; dummy
600 000 ; timeout (in 0.1 msec)
s14=s13+c6+6-c0
c.(:(:p210-s14:)a.8.37777777:)-1, m.***name error p210
z.
; channelprogram used when operating direct on the receiver.
; transmit statusbyte.
c10: 4<12+3<8 ; addr code:=devi desc , op:=write
+s3 ; first addr:=addr(statusbyte)
1 ; char count:=1
; sense status.
4<12+0<8 ; addr code:=devi desc , op:=sense
+s0 ; first addr:=sense area
12 ; char count:=12
; receive startbyte.
c11: 4<12+0 ; addr code:=devi desc , op:=command1
+s2 ; first addr:=addr(startbyte)
1 ; char count:=1
; receive data.
c12: 0<12+0 ; addr code:=sender(mess) , op:=command2
0 ; first addr
0 ; char count
; stop.
c13: 15<8 ; addr code:=dummy , op:=stop
0 ; dummy
600 000 ; timeout:=60 sec (in units of 0.1 msec)
\f
b.i10,m20 w.
b.j10 w.
h86: am (x1+a50) ; receiver:
rl w0 +a52 ;
rl w2 b18 ;
rs w1 x2+4 ; receiver.buf := fparec;
sn w0 0 ; if reserver(main)=0 then
jl w3 g15 ; check reserver;
jl w3 g17 ; link operation;
j0: bz w0 x2+9 ; execute:
c.p101 b.f1 w. ;*****test40*****
rs. w3 f0. ;
jl. w3 f4. ;
40 ;
f0: 0 ;
jl. f1. ;
rl w0 x2+8 ; param0:=operation, mode;
rs w0 x3 ;
al w0 x3 ;
al w1 x3 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test40*****
so w0 2.10 ; if not mode.reset then
jl. j1. ; goto cont;
al w0 -2 ; reset:
rs w0 x1+p2 ; state:=direct reset;
rl w3 x1+a235 ; device:=device code(proc);
rl w1 x1+s7 ; timeout:=short delay;
; al w0 2<2+1<1+1 ; function:=reset, wait, exit;
; al w2 0 ; mess buff:=dummy;
al w0 1<2+1<1+1 ; function:=reset,start chpg, exit;
al. w1 c13. ; start(chpg):=stop;
jd 1<11+p109 ; start io;
m18: rl w0 x1+a56 ; after wait:
se w0 0 ; if regret flag then
jl. j7. ; goto result1;
rl w2 b18 ;
j1: rl w0 x2+14 ;
sh w0 0 ;
am 5<8-1<8 ; if size=<0 then
al w3 1<8 ; command1:=dummy;
hs. w3 c12.+1 ; command2:=dummy;
al w3 x3+1<7 ; else
hs. w3 c11.+1 ; command1:=read, continue;
ld w0 -100 ; command2:=read;
ds w0 x1+s0+2 ;
ds w0 x1+s0+6 ; clear status area;
al w0 -1 ;
rs w0 x1+s2 ; startchar:=-1;
rs w0 x1+p2 ; state:=operate direct;
rl w0 x2+12 ; receive:
ws w0 x2+10 ;
ls w0 -1 ; maxcharcount:=
ba. w0 1 ; ((last-first)//1-1)*3;
wm w0 g48 ;
sl w0 (x2+14) ; if charcount.mess>maxchar count then
se w3 0 ; goto deliver result3;
jl. j6. ;
rl w0 x2+16 ;
ls w0 4 ;
hs w0 x1+s3 ; statuschar:=statuschar(mess);
rl w3 x2+10 ; first addr:=mess.first;
rl w0 x2+14 ; charcount:=mess.charcount;
ds. w0 c12.+4 ;
bz w0 x2+9 ; if mode=trm statusbyte then
so w0 2.1 ; startchpg:=rec startbyte;
am c11-c10 ; else
al. w1 c10. ; startchpg:=trm statusbyte;
al w0 1<2+1 ; io-function:=start chpg, exit;
am (b19) ;
rl w3 +a235 ; devno:=devno(proc);
c.p101 b.f1 w. ;*****test25*****
rs. w3 f0. ;
jl. w3 f4. ;
25 ;
f0: 0 ;
jl. f1. ;
al w0 x1 ; dump channelpg;
al. w1 c12.+6 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test25*****
jd 1<11+p109 ; start io;
al w2 1<8 ; error:
rs w2 g20 ; if io-result=2 (2: sender stopped) then
ld w3 -100 ; status:=1<8 (stopped);
ds w3 g22 ; bytes,chars trf:=0,0;
al w2 -1 ; startchar rec:=-1;
rs w2 g23 ; goto result1;
sn w0 2 ; else (1: buf regretted, 3: unintelligible)
jl. j7. ; goto result3;
jl. j6. ;
m19: rl w2 b18 ; after operation:
rl w3 x2+14 ; chars:=mess.char count;
ws w3 x1+a231 ; chars:=chars-remaining char count(std status);
sl w3 (x2+14) ; if chars>=mess.char count then
rl w3 x2+14 ; chars:=mess.char count;
se w0 0 ; if io-result<>0 then
al w3 0 ; chars:=0;
rs w3 g22 ; chars trf(answer):=chars;
al w2 0 ;
al w3 x3+2 ;
wd w3 g48 ;
ls w3 1 ;
rs w3 g21 ; bytes trf(answer):=(chars+2)//3*2;
rl w3 x1+s2 ; if no startchar received then
se w3 -1 ; startchar(answer):=-1;
ls w3 -16 ; else startchar(answer):=startchar received;
rs w3 g23 ;
rl w3 x1+a233 ; status:=event status(std) or event status(proc);
lo w3 x1+s0+6 ; if io-result=3 then (monitor timeout)
sn w0 3 ; status:=execution timeout;
al w3 1<9 ;
rs w3 g20 ; status(answer):=status;
se w0 3 ; if io-result=3 (monitor timeout)
sh w3 -1 ; or bit0(status)=1 then
al w0 0 ; io-result:=0;
sn w0 0 ; if io-result=0 then
jl. j7. ; goto result1;
j5: am 4-3 ; result4: result:=4;
j6: am 3-1 ; result3: result:=3;
j7: al w0 1 ; result1: or :=1;
c.p101 b.f1 w. ;*****test41*****
rs. w3 f0. ;
jl. w3 f4. ;
41 ;
f0: 0 ;
jl. f1. ;
rs w0 g24 ;
al w0 g20 ;
al w1 g24 ; dump answer (g20,21,22,23) and result (g24);
jl. w3 f5. ;
f1: ;
e.z. ;*****test41*****
rl w1 b19 ;
rl w3 x1+a56 ;
sn w3 0 ; if message not regretted then
jl w3 g19 ; deliver: deliver result(result);
al w0 0 ;
rs w0 x1+a56 ; clear (regretted flag);
rs w0 x1+p2 ; state:=idle;
jl w3 g25 ; next operation;
jl. j0. ; goto execute;
e.
\f
; start receive.
; w1: receiver
e8: rl w2 x1+a50 ; entry1: main:=main(rec);
bz w0 x2+p93 ;
al w3 2.0010 ;
la w3 0 ; contents:=operation(6:6);
hs w3 x2+p97 ;
sz w0 4.01000 ; if initiate then
jl. w3 n3. ; initiate proc desc;
sz w0 4.00300 ; if delay then
jl. m3. ; goto start wait;
m0: jl. w3 n1. ; start trm-rec: setup statusbyte;
al w3 1<2 ; io-function:=start ch pg;
al. w0 c0. ; start:=start1;
jl. m2. ; goto start operation;
m3: al w3 2 ; start wait:
rs w3 x1+p2 ; state:=waiting;
rl w3 x1+a235 ; dev desc:=dev desc(rec);
sz w0 4.00200 ; if long delay then
am s7-s7 ; delay:=long delay;
rl w1 x1+s7 ; else delay:=short delay;
sz w0 4.02000 ; if reset then
am 1<1 ; function:=reset and start waitpg;
al w0 2<2 ; else function:=start wait pg;
al w2 0 ; mess buffer:=0;
c.p101 b.f1 w. ;*****test25*****
rs. w3 f0. ;
jl. w3 f4. ;
25 ;
f0: 0 ;
jl. f1. ;
al w0 x1+2 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test25*****
jl. m5. ; goto start io;
m6: jl. w3 n1. ; after waiting: setup startbyte;
jl. m1. ; goto rec;
m1: al w3 1<2 ; rec: io-function:=start ch pg;
al. w0 c2. ; start:=start2;
; goto start operation;
m2: ds. w0 i2. ; start operation:
jl. w3 n2. ; setup channel program;
rl w2 x1+s5 ; mess buff:=mess buff(op);
al w3 3 ;
rs w3 x1+p2 ; state(rec):=receiving;
rl w3 x1+a235 ; dev desc:=dev desc(rec);
dl. w1 i2. ; load io-function, start of ch pg;
c.p101 b.f1 w. ;*****test24*****
rs. w3 f0. ;
jl. w3 f4. ;
24 ;
f0: 0 ;
jl. f1. ;
al. w0 i1. ;
al. w1 i2. ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test24*****
c. p101 b. f1 w. ; ***test 26***
rs. w3 f0. ;*
jl. w3 f4. ;*
26 ;*
f0: 0 ;*
jl. f1. ;*
al. w0 c0. ;*
al. w1 c6.+4 ;*
jl. w3 f5. ;*
f1: ;*
e.z. ;* test 26***
m5: jd 1<11+p109 ; start io;
rl w1 b19 ;
sn w0 0 ; if io-result=0 then
jl. m9. ; wait;
rl w2 x1+a50 ;
hs w0 x2+p94 ; result:=io-result;
jl. m17. ; goto return;
m8: jl (b20) ; return: wait;
m9: rl w1 x1+a50 ; wait:
rs w1 b19 ; curr proc:=main(rec);
jl. e6. ; main-return;
\f
; after interrupt.
c43: rl w2 x1+a50 ; interrupt entry:
c.p101 b.f1 w. ;*****test42*****
rs. w3 f0. ;
jl. w3 f4. ;
42 ;
f0: 0 ;
jl. f1. ;
al w2 x3 ;
dl w0 x1+a231 ;
ds w0 x2+2 ;
dl w0 x1+a233 ;
ds w0 x2+6 ; dump std status area
rl w0 x1+a244 ; io-result;
rs w0 x2+8 ;
al w0 x2 ;
al w1 x2+8 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test42*****
c.p101 b.f1 w. ;*****test28*****
rs. w3 f0. ;
jl. w3 f4. ;
28 ;
f0: 0 ;
jl. f1. ;
al w0 x1+p2 ;
al w1 x1+s3 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test28*****
rl w3 x1+p2 ;
am x3 ;
jl. (x3+6) ; goto case state of
m18 ; ( -2: wait direct,
m19 ; -1: operate direct,
m8 ; 0: idle,
m9 ; 1: wating before poll(not possible),
m6 ; 2: waiting,
m10 ; 3: receiving);
m10: jl. w3 n0. ; after receive: check state(rec,result);
hs w3 x2+p94 ; result(main):=result;
c.p101 b.f2 w. ;*****test30*****
rs. w3 f0. ;
jl. w3 f4. ;
30 ;
f0: 0 ;
jl. f1. ;
al w0 x2+p95 ;
al w1 x2+p95+14 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test30*****
c.p101 b.f1 w. ;*****test27*****
rs. w3 f0. ;
jl. w3 f4. ;
27 ;
f0: 0 ;
jl. f1. ;
al w0 x1+s13 ;
al w1 x1+s14-2 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test27*****
sn w3 0 ; if result=0 then
jl. m15. ; goto ok;
c.p101 b.f1 w. ;*****test29*****
rs. w3 f0. ;
jl. w3 f4. ;
29 ;
f0: 0 ;
jl. f1. ;
al w2 x3 ;
dl w0 x1+a231 ;
ds w0 x2+2 ;
dl w0 x1+a233 ;
ds w0 x2+6 ;
rl w3 x1+a244 ;
rl. w0 f0. ;
ds w0 x2+10 ;
al w0 x2 ;
al w1 x2+10 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test29*****
al w0 x2 ; save w3
jl w2 (b31) ; call errorlog
rl w2 0 ; restore w3
bz w0 x2+p93 ;
sz w0 2.00000001; if no error recovery then
jl. m13. ; goto check;
; errors:
c.p102 ;*****statistics begin*****
al w0 1 ;
ba w0 x1+s10 ; errorcount:=errorcount+1;
hs w0 x1+s10 ;
al w0 1 ;
am x3-3 ;
ba w0 x1+s10 ; errorcount(result):=errorcount(result)+1;
am x3-3 ;
hs w0 x1+s10 ;
z. ;*****statistics end*****
am x3-3 ;
jl. (x3-3) ; goto case result of
m11 ; ( 4: blocklength error,
m12 ; 5: parity error,
-1 ; 6: impossible,
m1 ; 7: timeout(mon),
m1 ; 8: abnormal termination,
m16 ; 9: master clear,
m16 ; 10: accept master clear,
m0 ; 11: blocknumber error);
m11: am 2.10-2.01 ; blocklength error:
m12: al w0 2.01 ; parity error:
hs w0 x1+s6 ; errorbits:=error cause;
jl. m0. ; goto start rec-trm;
m13: se w3 9 ; check: if result<>master clear
sn w3 10 ; or accept master clear then
jl. m16. ; goto return
jl. m17. ; goto countup;
m15: bz w0 x1+s2 ; ok:
ls w0 -4 ; contents:=startbyte(4:6);
la. w0 i0. ;
hs w0 x2+p97 ; contents(main):=contents;
m16: al w0 1 ; countup:
wa w0 x1+s4 ; blockcount:=blockcount+1;
rs w0 x1+s4 ;
m17: al w0 0 ; return:
rs w0 x1+p2 ; state(rec):=ready;
hs w0 x1+s6 ;
c.p101 b.f1 w. ;*****test31*****
rs. w3 f0. ;
jl. w3 f4. ;
31 ;
f0: 0 ;
jl. f1. ;
al w0 x1+2 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test31*****
jl. e12. ; return to main;
i0: 2.00001110 ; mask
i1: 0 ; io-function
i2: 0 ; start of ch pg
e.
\f
; check state(proc,result).
; the procedure checks the result of the i/o operation by inspecting the timeout,
; the receive status area and the startbyte received.
; result: 0 ok
; 4 blocklength error
; 5 parity error(write)
; 7 time-out(monitor)
; 8 abnormal termination, that is buserror, disconnected line,
; reset received, disconnected controller, power up, etc.
; 9 master clear
; 10 accept master clear
; 11 blocknumber error
; call: return:
; w0 destroyed
; w1 proc unchanged
; w2 unchanged
; w3 link result
b.i1,j20 w.
n0: rs. w3 i0. ; check state:
rl w0 x1+a244 ;
se w0 0 ; if timeout<>0 then
jl. j1. ; goto timeout-error;
rl w0 x1+s1+6 ; event status:=event status(rec) or event status(std);
lo w0 x1+a233 ; if event status<>(0 or blocklength error) then
sz. w0 (i1.) ; goto event-error;
jl. j0. ;
bl w0 x1+s2 ; ok or blocklength:
so w0 2.1<4 ; if special bit then
jl. j3. ; begin
sn w0 -1<4 ; if startbyte=master clear then
jl. j16. ; goto master clear;
sn w0 -1<4-1<9 ; if startbyte=accept master clear then
jl. j17. ; goto accept master clear;
jl. j12. ; goto parity error;
j3: ld w0 1 ; if blockno expected mod 2 <>
lx w3 x1+s4 ; blockno rec then
sz w3 2.1 ; goto blocknumber error;
jl. j18. ;
rl w3 x1+s1+2 ; if rem char count<>0 then
se w3 0 ; goto blocklenght error;
jl. j11. ; else
jl. j10. ; goto ok;
j0: bz w3 0 ; event-error:
sz w3 1<10 ; if bit1 then
jl. j12. ; goto parity error;
jl. j15. ; goto abnormal termination;
j1: sn w0 3 ; timeout-error:
jl. j14. ; if timeout=3 then goto timeout(mon);
jl. j15. ; goto abnormal termination;
j18: am 11-10 ; blocknumber error: result:=11;
j17: am 10-9 ; accept master clear: result:=10;
j16: am 9-8 ; master clear: result:=9;
j15: am 8-7 ; abnormal termination: result:=8;
j14: am 7-5 ; timeout(mon): result:=7;
j12: am 5-4 ; parity error: result:=5;
j11: am 4-0 ; blocklength error: result:=4;
j10: al w3 0 ; ok: result:=0;
jl. (i0.) ; return;
i0: 0 ; saved link;
i1: 8.7577 7777 ; event status mask not including blocklenght error
e.
; setup statusbyte.
; call: return:
; w0 destroyed
; w1 rec unchanged
; w2 main unchanged
; w3 link destroyed
b.i0 w.
n1: rs. w3 i0. ; setup statusbyte:
bz w3 x2+p96 ; statusbyte:=
ls w3 2 ; blockcontrol<2
bl w0 x1+s2 ; +(received blockno mod 2)<7
sz w0 -1<11 ;
al w3 x3+1<7 ;
ba w3 x1+s6 ; +errorbits;
ls w3 4 ;
hs w3 x1+s3 ; insert statusbyte;
jl. (i0.) ; return;
i0: 0 ; saved link
e.
; setup channelprogram.
; call: return:
; w0 destroyed
; w1 rec unchanged
; w2 main unchanged
; w3 link destroyed
b.i0,j1 w.
n2: rs. w3 i0. ; setup ch pg:
ld w0 -100 ; clear status area;
ds w0 x1+s0+2 ;
ds w0 x1+s0+6 ;
ds w0 x1+s1+2
ds w0 x1+s1+6 ;
al w0 -1 ; startbyte(rec):= dummy
rs w0 x1+s2 ;
bz w0 x2+p93 ;
so w0 4.00002 ; if dataflag(operation)=off then
jl. j0. ; goto receive header;
rl w0 x2+p91 ; receive header-data:
rs w0 x1+s5 ;
al w0 -1 ; op(header):= dummy in cnain
hs. w0 c3.+1 ;
bz w0 x2+p92 ;
hs. w0 c4. ; addr code:=addr code(main);
al w0 1<8 ; op(data):=read;
hs. w0 c4.+1 ;
rl w0 x2+p85 ;
rs. w0 c4.+2 ; first addr:=first data rec;
rl w0 x2+p86 ;
rs. w0 c4.+4 ; size:=size data rec;
jl. (i0.) ; exit: return;
j0: al w0 0 ; receive-header:
rs w0 x1+s5 ; mess buff:=0;
al w0 1<8 ;
hs. w0 c3.+1 ; op(header):=read;
al w0 5<8 ;
hs. w0 c4.+1 ; op(data):=dummy;
j1: jl. (i0.) ; exit: return;
i0: 0 ; saved link
e.
; initiate proc desc(rec).
; clear the tail of the proc desc except the reset delay and
; the testinformation.
; call: return:
; w0 unchanged
; w1 rec unchanged
; w2 unchanged
; w3 link destroyed
b.i1,j0 w.
n3: ds. w0 i1. ; initiate proc desc:
al w3 x1+s4 ; clear proc desc from
al w0 0 ; start of status area
j0: rs w0 x3 ; to start of test information area;
al w3 x3+2 ;
se w3 x1+s7 ;
jl. j0. ;
rl. w0 i1. ;
jl. (i0.) ;
i0: 0 ;
i1: 0 ;
e.
e. ; end of receiver
\f
; block including transmitter.
b.c16,n5,s16 w.
; transmitter.
m. fpa transmitter
; process description:
; a250: ; driver process description address
; a402: ; user bit table
; a48: ; interval
; a49: ; interval
; a10: ; kind
; a11: ; name
; a50: ; mainproc
; a52: ; reserver
; a57, a58: ; work0, work1
; a54: ; next message
; a55: ; last message
; a56: ; message regretted
p2=p0 ; state(trm)
p3=p2+2 ; link
s0=p3+2 ; transmit status, cur. ch. command
; , rem. char count
; , cur. status
; , event status
s1=s0+8 ; receive status , cur. ch. command
; , rem. char count
; , cur. status
; , event status
s2=s1+8 ; startbyte<16
s3=s2+2 ; statusbyte<16
s4=s3+2 ; current blocknumber
s5=s4+2 ; message buffer
s6=s5+2 ; long delay(in 0.1 msec)
s7=s6+2 ; short delay(in 0.1 msec)
; error parameters:
s10=s7+2 , ; errorcount , blocklength error
, ; parity error , timeout(write)
, ; timeout(mon) , abnormal termination
, ; blocklength - , parity error(statusbyte)
, ; waitpg term ,
s11=s10+10 ; start time(io op)
; -
s12=s11+4 ; 0 < execution time(io-op) =< 5
; 5 < - =< 10
; 10 < - =< 20
; 20 < - =< 40
; 40 < - =< 80
; 80 < -
s13=s12+12 ; start of channel program area
; s14 ; top of channel program area
\f
; transmitter channel program:
; start1:
; transmit startbyte.
c0: 4<12+3<8+1<7 ; addr code:=devi desc , op:=write, continue
+s2 ; first addr:=addr(startbyte)
1 ; char count:=1
; transmit header.
c1: 4<12+3<8+1<7 ; addr code:=devi desc , op:=write, continue
+p75-p201 ; first addr:=start header (in mainproc)
2+1+11+10 ; char count
; transmit data.
c2: 3<8 ; addr code , op:=write
0 ; first addr
0 ; char count
; sense status(trm).
c3: 4<12+0<8 ; addr code:=devi desc , op:=sense
+s0 ; first addr:=addr(trm status)
12 ; char count:=12
; receive statusbyte.
c4: 4<12+1<8 ; addr code:=devi desc , op:=read
+s3 ; first addr:=addr(statusbyte)
1 ; char count:=1
; sense status(rec)
c5: 4<12+0<8 ; addr code:=devi desc , op:=sense
+s1 ; first addr:=addr(rec status)
12 ; char count:=12
; stop.
c6: 15<8 ; dummy , op:=stop
0 ; dummy
10 000 ; timeout:=1 sec(in units of 0.1 msec)
s14=s13+c6+6-c0
c.(:(:p211-s14:)a.8.37777777:)-1, m.***name error p211
z.
; channel program used of operations send directly
; to the transmitter.
; transmit startbyte.
c10: 4<12+3<8+1<7 ; addr code:=devi desc , op:=write, continue
+s2 ; first addr:=addr(startbyte)
1 ; char count:=1
; command1 (transmit data block, autoload or dummy).
c11: 0<12+0 ; addr code:=sender(mess) , op:=command1
0 ; first addr
0 ; char count
; sense status.
4<12+0<8 ; addr code:=devi desc , op:=sense
+s0 ; first addr:=sense area
12 ; char count:=12
; command2 (receive statusbyte or dummy).
c12: 4<12+0 ; addr code:=devi desc , op:=command2
+s3 ; first addr:=addr(startbyte)
1 ; char count:=1
; stop.
15<8 ; addr code:=dummy , op:=stop
0 ; dummy
50 000 ; timeout:=5 sec (in units of 0.1 msec)
\f
b.i10,m20 w.
b.j10 w.
h88: am (x1+a50) ; transmitter:
rl w0 +a52 ;
rl w2 b18 ;
rs w1 x2+4 ; receiver.buf := fpaxmit;
sn w0 0 ; if reserver(main)=0 then
jl w3 g15 ; check reserver;
jl w3 g17 ; link operation;
j0: bz w0 x2+9 ; execute:
c.p101 b.f1 w. ;*****test 32*****
rs. w3 f0. ;
jl. w3 f4. ;
32 ;
f0: 0 ;
jl. f1. ;
rl w0 x2+8 ; param0:=operation, mode;
rs w0 x3 ;
al w0 x3 ;
al w1 x3 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test 32*****
so w0 2.10 ; if not mode.reset then
jl. j1. ; goto cont;
al w0 -2 ; reset:
rs w0 x1+p2 ; state:=direct reset;
rl w3 x1+a235 ; device:=device code(proc);
rl w1 x1+s7 ; timeout:=short delay;
al w0 2<2+1<1+1 ; function:=reset, wait, exit;
al w2 0 ; mess buff:=dummy;
jd 1<11+p109 ; start io;
m15: rl w0 x1+a56 ; after wait:
se w0 0 ; if regret flag then
jl. j7. ; goto result1;
rl w2 b18 ;
bz w0 x2+9 ;
j1: so w0 2.01 ; cont: if mode.rec then
am 5<8-1<8 ; command2:=read
al w0 1<8 ; else
hs. w0 c12.+1 ; command2:=dummy;
ld w0 -100 ;
ds w0 x1+s0+2 ;
ds w0 x1+s0+6 ; clear status area;
al w0 -1 ;
rs w0 x1+s3 ; statuschar:=-1;
rs w0 x1+p2 ; state:=operate direct;
bz w0 x2+8 ; if operation(buf)<>transmit then
se w0 5 ; goto autoload;
jl. j3. ;
j2: rl w0 x2+12 ; transmit:
ws w0 x2+10 ;
ls w0 -1 ; maxcharcount:=
ba. w0 1 ; ((last-first)//1-1)*3;
wm w0 g48 ;
sl w0 (x2+14) ; if charcount.mess>maxchar count then
se w3 0 ; goto deliver result3;
jl. j6. ;
al w0 3<8 ;
hs. w0 c11.+1 ; command1:=write;
rl w3 x2+10 ; first addr:=mess.first;
rl w0 x2+14 ; charcount:=mess.charcount;
sh w0 0 ; if charcount=<0 then
jl. j4. ; goto receive;
ds. w0 c11.+4 ;
rl w0 x2+16 ;
ls w0 4 ;
hs w0 x1+s2 ; startchar:=startchar(mess);
al. w1 c10. ; startchpg:=trm startbyte;
jl. j5. ; goto startop;
j3: al w0 6<8 ; autoload:
hs. w0 c11.+1 ; command2:=autoload;
am c11-c12 ; start(chpg):=start1;
j4: al. w1 c12. ; receive: start(chpg):=start2;
al w2 0 ; start-op:
j5: al w0 1<2+1 ; io-function:=start chpg, exit;
am (b19) ;
rl w3 +a235 ; devno:=devno(proc);
c.p101 b.f1 w. ;*****test47*****
rs. w3 f0. ;
jl. w3 f4. ;
47 ;
f0: 0 ;
jl. f1. ;
al w0 x1 ; dump channelpg;
al. w1 c12.+6 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test47*****
jd 1<11+p109 ; start io;
ld w3 -100 ; error:
ds w3 g21 ; mess.status, mess.bytes trf:=0,0;
al w3 -1 ;
ds w3 g23 ; mess.chars trf, statuschar:=0,-1;
sn w0 3 ; if io-result=3 then
jl. j6. ; goto result3
jl. j7. ; else goto result1;
m16: rl w2 b18 ; after operation:
rl w3 x1+a233 ; status:=event status(std) or event status(proc);
lo w3 x1+s0+6 ; if io-result=3 then (monitor timeout)
sn w0 3 ; status:=execution timeout;
al w3 1<9 ;
rs w3 g20 ; status(answer):=status;
se w0 3 ; if io-result=3 (monitor timeout)
sh w3 -1 ; or bit0(status)=1 then
al w0 0 ; io-result:=0;
rl w3 x2+14 ; chars:=mess.char count;
se w0 0 ; if io-result<>0 then
al w3 0 ; chars:=0;
rs w3 g22 ; chars trf(answer):=chars;
al w2 0 ;
al w3 x3+2 ;
wd w3 g48 ;
ls w3 1 ;
rs w3 g21 ; bytes trf(answer):=(chars+2)//3*2;
rl w3 x1+s3 ; if no statuschar received then
se w3 -1 ; statuschar(answer):=-1;
ls w3 -16 ; else statuschar(answer):=statuschar received;
rs w3 g23 ;
sn w0 0 ; if io-result=0 then
jl. j7. ; goto result1;
am 4-3 ; result4: result:=4;
j6: am 3-1 ; result3: result:=3;
j7: al w0 1 ; result1: or :=1;
c.p101 b.f1 w. ;*****test46*****
rs. w3 f0. ;
jl. w3 f4. ;
46 ;
f0: 0 ;
jl. f1. ;
rs w0 g24 ;
al w0 g20 ;
al w1 g24 ; dump answer (g20,21,22,23) and result (g24);
jl. w3 f5. ;
f1: ;
e.z. ;*****test46*****
rl w1 b19 ;
rl w3 x1+a56 ;
sn w3 0 ; if message not regretted then
jl w3 g19 ; deliver: deliver result(result);
al w0 0 ;
rs w0 x1+a56 ; clear (regretted flag);
rs w0 x1+p2 ; state:=idle;
jl w3 g25 ; next operation;
jl. j0. ; goto execute;
e.
\f
; start operation.
; w1: transmitter.
e9: rl w2 x1+a50 ; entry1: main:=main(trm);
al w0 0 ;
hs w0 x1+s10 ; errorcount:=0;
bz w0 x2+p73 ;
al w3 2.1110 ;
la w3 0 ; contents:=operation(4:6);
hs w3 x2+p77 ;
sz w0 4.01000 ; if initiate then
jl. w3 n3. ; initiate proc desc;
sz w0 4.00300 ; if delay then
jl. m1. ; goto start wait;
m0: al w0 3 ; start trm-rec:
rs w0 x1+p2 ; state:=transmitting;
jl. w3 n1. ; setup startbyte;
jl. w3 n2. ; setup channelprogram;
al w0 1<2 ; function:=start channel pg;
rl w2 x1+s5 ; mess buff:=mess buff(op);
rl w3 x1+a235 ; dev desc:=dev desc(trm);
al. w1 c0. ; start(ch pg):=start1;
c.p101 b.f1 w. ;*****test33*****
rs. w3 f0. ;
jl. w3 f4. ;
33 ;
f0: 0 ;
jl. f1. ;
al. w0 c0. ;
al. w1 c6.+4 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test33*****
c.p102 ;*****statistics begin*****
c.p101 b. f1 w. ;*****test 0*****condition of statistics*****
rs. w3 f0. ; <*statistics if test 0 is on*>
jl. w3 f4. ;
0 ;
f0: 0 ;
jl. f1. ;
ds. w1 i1. ;
jd 1<11+36 ; get clock;
am (b19) ;
ds w1 +s11+2 ; save start time(operation);
dl. w1 i1. ;
f1: rl. w3 f0. ;
e.z. ;*****test 0*****end condition******
z. ;*****statistics end*****
jd 1<11+p109 ; start io;
sn w0 0 ; if result=0 then
jl (b20) ; wait;
rl w1 b19 ;
rl w2 x1+a50 ;
hs w0 x2+p74 ; result:=io-result;
jl. m12. ; goto return;
m4: am 4.02000 ; reset and wait: operation:=reset, short delay;
m5: al w0 4.00133 ; wait: operation:=short delay;
m1: sz w0 4.00033 ; start wait:
am 2-1 ; if dummy header then
al w2 1 ; state(trm):=waiting before poll;
rs w2 x1+p2 ; else state(trm):=waiting;
rl w3 x1+a235 ; dev desc:=dev desc(trm);
so w0 4.00200 ; if short delay then
am s7-s6 ; time:=short delay;
rl w1 x1+s6 ; else time:=long delay;
sz w0 4.02000 ; if reset bit then
am 1<1 ; function:=reset, start wait;
al w0 2<2 ; else function:=start std wait;
al w2 0 ; message buffer:=0;
c.p101 b.f1 w. ;*****test34*****
rs. w3 f0. ;
jl. w3 f4. ;
34 ;
f0: 0 ;
jl. f1. ;
al w0 x1+2 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test34*****
jd 1<11+p109 ; start io;
m9: jl (b20) ; wait: wait;
\f
; after interrupt.
; w1: transmitter
c44: rl w2 x1+a50 ; interrupt entry:
c.p101 b.f1 w. ;*****test49*****
rs. w0 f0. ;
jl. w3 f4. ;
49 ;
f0: 0 ;
jl. f1. ;
al w2 x3 ;
dl w0 x1+a231 ;
ds w0 x2+2 ;
dl w0 x1+a233 ;
ds w0 x2+6 ; dump std status area
rl w0 x1+a244 ; io-result;
rs w0 x2+8 ;
al w0 x2 ;
al w1 x2+8 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test49*****
c.p101 b.f1 w. ;*****test36*****
rs. w3 f0. ;
jl. w3 f4. ;
36 ;
f0: 0 ;
jl. f1. ;
al w0 x1+p2 ;
al w1 x1+s3 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test36*****
rl w3 x1+p2 ;
am x3 ;
jl. (x3+6) ; goto case state of
m15 ; (-2: wait direct,
m16 ; -1: operate direct,
m9 ; 0: idle,
m0 ; 1: waiting before poll,
m0 ; 2: waiting,
m10 ; 3: transmitting);
m10: ; after transmission:
c.p102 ;*****statistics begin*****
c.p101 b. f1 w. ;*****test 0*****condition of statistics*****
rs. w3 f0. ;
jl. w3 f4. ;
0 ;
f0: 0 ;
jl. f1. ;
ds. w1 i1. ;
ds. w3 i2. ;
jd 1<11+36 ; get clock;
rl w2 b19 ;
ss w1 x2+s11+2 ;
al w2 x2+s12 ;
sl w1 800 ; time>80.0;
al w2 x2+2 ;
sl w1 400 ; time>40.0;
al w2 x2+2 ;
sl w1 200 ; time>20.0;
al w2 x2+2 ;
sl w1 100 ; time>10.0;
al w2 x2+2 ;
sl w1 50 ; time>5.0;
al w2 x2+2 ;
al w0 1 ;
wa w0 x2 ; number(time zone) increased 1;
rs w0 x2 ;
dl. w1 i1. ;
dl. w3 i2. ;
f1: rl. w3 f0. ;
e.z. ;*****test 0*****end condition*****
z. ;*****statistics end*****
jl. w3 n0. ; check state(proc,result);
hs w3 x2+p74 ; result(main):=result;
bz w0 x1+s3 ;
ls w0 -4-2 ;
la. w0 i0. ;
hs w0 x2+p76 ; blockcontrol:=statusbyte(5:6);
c.p101 b.f2 w. ;*****test38*****
rs. w3 f0. ;
jl. w3 f4. ;
38 ;
f0: 0 ;
jl. f1. ;
al w0 x2+p75 ;
al w1 x2+p75+14 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test38*****
c.p101 b.f1 w. ;*****test35*****
rs. w3 f0. ;
jl. w3 f4. ;
35 ;
f0: 0 ;
jl. f1. ;
al w0 x1+s13 ;
al w1 x1+s14-2 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test35*****
sn w3 0 ; if result=0 then
jl. m11. ; goto ok;
c.p101 b.f1 w. ;*****test37*****
rs. w3 f0. ;
jl. w3 f4. ;
37 ;
f0: 0 ;
jl. f1. ;
al w2 x3 ;
dl w0 x1+a231 ;
ds w0 x2+2 ;
dl w0 x1+a233 ;
ds w0 x2+6 ;
rl w3 x1+a244 ;
rl. w0 f0. ;
ds w0 x2+10 ;
al w0 x2 ;
al w1 x2+10 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test37*****
al w0 x2 ; save w3
jl w2 (b31) ; call errorlog
rl w2 0 ; restore w3
bz w0 x2+p73 ;
sz w0 4.00001 ; if no error recovery then
jl. m12. ; goto return;
c.p102 ;*****statistics begin*****
al w0 1 ;
am x3-3 ;
ba w0 x1+s10 ; errorcount(result):=errorcount(result)+1;
am x3-3 ;
hs w0 x1+s10 ;
z. ;*****statistics end*****
al w0 1 ;
ba w0 x1+s10 ; errorcount:=errorcount+1;
hs w0 x1+s10 ;
sl w0 p140 ; if errorcount>=max errorcount then
jl. m12. ; goto return;
am x3-3 ;
jl. (x3-3) ; goto case result of
m0 ; 4: blocklength error(read),
m0 ; 5: parity error(read),
m4 ; 6: timeout(write),
m4 ; 7: timeout(mon),
m4 ; 8: abnormal termination,
m0 ; 9: blocklength error(statusbyte),
m0 ; 10: parity error(statusbyte),
m4 ; 11: waitpg term);
m11: al w0 1 ; ok:
wa w0 x1+s4 ; current blockno:=currentblockno+1;
rs w0 x1+s4 ;
m12: al w0 0 ; return:
rs w0 x1+p2 ; state:=ready;
c.p101 b.f1 w. ;*****test39*****
rs. w3 f0. ;
jl. w3 f4. ;
39 ;
f0: 0 ;
jl. f1. ;
al w0 x1+2 ;
jl. w3 f5. ;
f1: ;
e.z. ;*****test39*****
jl. e12. ; return to main;
i0: 2.11 ; mask
c.p102 ;*****statistics begin*****
0 ;
i1: 0 ;
0 ;
i2: 0 ;
z. ;*****statistics end*****
e.
\f
; check state(proc,result).
; the procedure checks the result of the i/o operation by inspecting the timeout,
; the status area of the receive operation and the statusbyte received.
; result: 0 ok
; 4 blocklength error
; 5 parity error(read)
; 6 time-out(write)
; 7 time-out(monitor)
; 8 abnormal termination, that is buserror, disconnected line,
; disconnected controller, power up, etc.
; 9 parity error(statusbyte)
; 10 blocklength error(statusbyte)
; 11 waitpg termination
;
; call: return:
; w0 destroyed
; w1 proc unchanged
; w2 unchanged
; w3 link result
b.i0,j20 w.
n0: rs. w3 i0. ; check state:
rl w0 x1+a244 ;
se w0 0 ; if timeout<>0 then
jl. j1. ; goto timeout-error;
bz w0 x1+s0+6 ;
sz w0 1<9 ; if bit2(write event status)<>0 then
jl. j13. ; goto timeout(write);
rl w0 x1+s1+6 ; if event status(rec)<>0 then
se w0 0 ; goto event-error;
jl. j0. ;
rl w0 x1+s1+2 ; if rem.char count=0 then
sn w0 0 ; goto check statusbyte;
jl. j2. ; else
jl. j11. ; goto blocklength error;
j0: bz w3 0 ; event-error:
sz w3 1<10 ; if bit1 then
jl. j12. ; goto parity error;
sz w3 1<7 ; if bit4 then
jl. j11. ; goto blocklength error;
jl. j15. ; goto abnormal termination;
j1: sn w0 3 ; timeout-error:
jl. j14. ; if timeout=3 then goto timeout(mon);
sn w0 5 ; if timeout=5 then
jl. j18. ; goto waitpg term;
jl. j15. ; goto abnormal termination;
j2: bz w0 x1+s3 ; check statusbyte:
sz w0 2.01<4 ; if statusbyte(7:7)=1 then
jl. j16. ; goto parity(statusbyte);
sz w0 2.10<4 ; if statusbyte(6:6)=1 then
jl. j17. ; goto blocklength(statusbyte);
jl. j10. ; goto ok;
j18: am 11-10 ; waitpg term: result:=11;
j17: am 10-9 ; blocklength(statusbyte): res:=10;
j16: am 9-8 ; parity(statusbyte): result:=9;
j15: am 8-7 ; abnormal termination: result:=8;
j14: am 7-6 ; timeout(mon): result:=7;
j13: am 6-5 ; timeout(write): result:=6;
j12: am 5-4 ; parity error: result:=5;
j11: am 4-0 ; blocklength error: result:=4;
j10: al w3 0 ; ok: result:=0;
jl. (i0.) ; return;
i0: 0 ; saved link;
e.
; setup startbyte.
; call: return:
; w0 operation
; w1 proc unchanged
; w2 main unchanged
; w3 link destroyed
b.i0,j1 w.
n1: rs. w3 i0. ; setup startbyte:
bz w0 x2+p73 ;
sz w0 4.30000 ; if operation=special header then
jl. j0. ; goto special header;
al w3 4.00032 ; startbyte:=
la w3 0 ; databit<3+headerbit<2+dataflag<1
rl w0 x1+s4 ;
sz w0 2.1 ; +blockcount mod 2<7;
al w3 x3+1<7 ; return;
jl. j1. ;
j0: sz w0 4.10000 ; special header:
am 2.00100000; if master clear then
al w3 2.11011111; startbyte:=master clear;
j1: ls w3 4 ; else
hs w3 x1+s2 ; startbyte:=accept master clear;
jl. (i0.) ; return;
i0: 0 ; saved link
e.
; setup channelprogram(trm).
; call: return:
; w0 destroyed
; w1 proc unchanged
; w2 main unchanged
; w3 link destroyed
b.i0,j0 w.
n2: rs. w3 i0. ; setup ch pg:
ld w0 -100 ; clear status area;
ds w0 x1+s0+2 ;
ds w0 x1+s0+6 ;
ds w0 x1+s1+2 ;
ds w0 x1+s1+6 ;
al w0 -1 ; statusbyte(trm):= dummy
rs w0 x1+s3 ;
bz w0 x2+p73 ;
so w0 4.00002 ; if dataflag(operation)=off then
jl. j0. ; goto transmit header;
rl w0 x2+p71 ;
rs w0 x1+s5 ; message buffer:=mess buff(main);
al w0 -1 ; op(header):= dummy in chain
hs. w0 c1.+1 ;
bz w0 x2+p72 ;
hs. w0 c2. ; addr code:=addr code(data);
al w0 3<8 ;
hs. w0 c2.+1 ; op(data):=write;
rl w0 x2+p65 ;
rs. w0 c2.+2 ; first addr:=first data trm;
rl w0 x2+p66 ;
rs. w0 c2.+4 ; size:=size data;
jl. (i0.) ; exit: return;
j0: al w0 0 ; transmit header:
rs w0 x1+s5 ; message buffer:=0;
al w0 3<8 ;
hs. w0 c1.+1 ; op(header):=write;
al w0 5<8 ;
hs. w0 c2.+1 ; op(data):=dummy;
jl. (i0.) ; exit: return;
i0: 0 ; saved link
e.
; initiate proc desc(trm).
; call: return:
; w0 unchanged
; w1 trm unchanged
; w2 unchanged
; w3 link destroyed
b.i1,j0 w.
n3: ds. w0 i1. ; initiate proc desc:
al w3 x1+s0 ;
al w0 0 ; clear privat part of
j0: rs w0 x3 ; proc desc from
al w3 x3+2 ; status area to reset delay;
se w3 x1+s6 ;
jl. j0. ;
al w0 1 ;
rs w0 x1+s4 ; current blockno:=1;
rl. w0 i1. ;
jl. (i0.) ;
i0: 0 ;
i1: 0 ;
e.
e. ; end of block including transmitter.
; stepping stones:
jl. h82. ;
h82=k-2 ;
c.p101
jl. f4. ;
f4=k-2 ;
jl. f5. ;
f5=k-2 ;
jl. f6. ;
f6=k-2 ;
z.
e. ; end of block including main- and line-drivers.
▶EOF◀