|
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: 27648 (0x6c00) Types: TextFile Names: »discstat3tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »discstat3tx «
discstat version: 8, latest corrections : fgs date: 1984.10.10 discstat version: 9, latest corrections : fb date: 1984.10.10 begin <* pej 09.02.78 discstat dirty corrections dh.79.03.14 page 1 discstat -------- the program extracts statistical information from a disc driver or from a coredumparea with core addr 0 equivalent to area addr 0, and it prints the information on current output. example ------- the following command extracts statistics about the disc to which the disc driver process named 'disc2' is connected: discstat disc.disc2 the following command creates the peripheral process 'disc2auto' on device 12: discstat disc.disc2auto.12 call ---- 1 1 1 (<outfile>) = discstat (clear.<yesno>) disc.<drivername>(.<device number>) 0 0 0 or 1 (<outfile>) = discstat <s> dump.<dumparea name>.<driver addr> 0 -------- the program sends a message to the specified driver to collect the statistics. the driver may be either a logical or a physical disc driver - in either case the statistics concerns the information created by a physical driver. please note that the driver will reset its statistics when the information has been collected. if <device> is specified the program creates a peripheral process named <drivername> to the device. if the first parameter is dump, the program takes input from the area at such a position that the specified discdriver is read. then it is checked that the first word has the contents = 62, i.e. kind disc. if the contents of word 10 <> 0 then this address is used for driveraddr, and positioning takes place again, checking that the first word is 62 et cetera, until a main device is found. now the zone is positioned and the remaining data taken so that it is simulated that it was an answer to a statistics message. error messages -------------- param param error in call. buffer claim exceeded or break 6 no message buffer available. monitor result <result> a normal answer was not received from the disc driver. <result> is the result delivered in the answer to the message. create <result> not possible to create a peripheral process for a reason given by <result>. disc specified not disc the driver address in the dumparea is not a main disc and does not lead to a main disc status error <status> <status> is the (decimal) statusword received from the disc driver. giveup <integer> algolcheck called from .... .... .... .... *device status <dumpareaname> .... .... only relevant if the first parameter is dump. the message after device status will give the cause. please remember that does not exist may mean: too few areaprocesses. *> \f <* pej 09.02.78 discstat page 2 *> long procedure long_bytes (z, bytes); value bytes ; integer bytes ; zone z ; begin integer c1,c2,c3,c4,c5,c6; integer array byte_table (0:255); for c1:= 0 step 1 until 255 do byte_table(c1):= 6 shift 12 + c1; c1:= c2:= c3:= c4:= c5:= c6:= 0; intable (byte_table); goto case bytes of (l1,l2,l3,l4,l5,l6) ; l6: readchar (z, c1); l5: readchar (z, c2); l4: readchar (z, c3); l3: readchar (z, c4); l2: readchar (z, c5); l1: readchar (z, c6); intable(0); long_bytes:= extend 0 add c2 shift 8 add c1 shift 8 add c4 shift 8 add c3 shift 8 add c6 shift 8 add c5; end long_bytes; procedure print_ida_statistics (rz, control_module, slave_unit, phys_disc); value control_module, slave_unit, phys_disc ; integer control_module, slave_unit, phys_disc ; zone rz ; begin integer i, pos, count, cylinder, head, sector; write (out, <:control unit::>,<<ddd>,control_module, <: - slave unit::>,slave_unit, <<ddddd>, <: - device number of physical disc::>,phys_disc, "nl",1); for i:= 1 step 1 until if slave_unit = 0 then 35 else 21 do begin outchar (out, 10); pos:= write (out, case i of ( <: detailed stastistics for slave device:>, <: no of seeks:>, <: seek error:>, <: unable to read header:>, <: unable to read data:>, <: write protected media violation:>, <: no device response:>, <: data correction applied:>, <: seek retry applied:>, <: data retry applied:>, <: no head select fault:>, <: write fault:>, <: (r+w) x off cylinder fault:>, <: (r*w) fault:>, <: voltage fault:>, <: head select fault:>, <: software write protect fault:>, <: 1. defective sector address (count,c,h,s):>, <: 2. defective sector address (count,c,h,s):>, <: 3. defective sector address (count,c,h,s):>, <: 4. defective sector address (count,c,h,s):>, <: detailed statistics for control module:>, <: command block overwrite:>, <: illegal command byte:>, <: illegal secondary seek address:>, <: illegal primary seek address:>, <: illegal command parameter:>, <: i/o illegal write error:>, <: i/o illegal disconnect:>, <: i/o parity error:>, <: r/w scheduler parity error:>, <: buffer parity error:>, <: ecc hardware fault:>, <: illegal device/no control field:>, <: diagnostic fault detected:>)); write (out, false add 46, 45-pos); case i of begin write (out, ".", 15, "nl",1, "=", 64); write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 6)); <* seeks *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* seek error *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* unable t.r. header *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* unable t.r. data *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* wr. pr. media viol. *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* no device responce *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* data corect. applied *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* seek retry applied *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* data retry applied *> begin long_bytes(rz, 4); <* skip unused *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* no head select fault *> end; write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* write fault *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* (r+w) x off cyl. fault *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* (r*w) fault *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* voltage fault *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* head select fault *> begin long_bytes(rz, 2); <* skip unused *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* soft. write pr. fault *> end; begin long_bytes(rz, 6); <* skip unused *> count:= long_bytes(rz, 2); cylinder:= long_bytes(rz, 2); sector:= long_bytes (rz, 1) shift (-8); head:= long_bytes (rz, 1) shift (-8); write (out, <<ddddd>, count, << ddddd>, cylinder, << ddd>, head, sector); end; begin count:= long_bytes(rz, 2); cylinder:= long_bytes(rz, 2); sector:= long_bytes (rz, 1) shift (-8); head:= long_bytes (rz, 1) shift (-8); write (out, <<ddddd>, count, << ddddd>, cylinder, << ddd>, head, sector); end; begin count:= long_bytes(rz, 2); cylinder:= long_bytes(rz, 2); sector:= long_bytes (rz, 1) shift (-8); head:= long_bytes (rz, 1) shift (-8); write (out, <<ddddd>, count, << ddddd>, cylinder, << ddd>, head, sector); end; begin count:= long_bytes(rz, 2); cylinder:= long_bytes(rz, 2); sector:= long_bytes(rz, 1) shift (-8); head:= long_bytes(rz, 1) shift (-8); write (out, <<ddddd>, count, << ddddd>, cylinder, << ddd>, head, sector); end; write (out, ".", 15, "nl", 1, "=", 64); write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* comm. bl. overwrite *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* ill. command byte *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* ill. sec. seek addr. *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* ill. prim. seek addr. *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* ill. com. param. *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* i/o ill. write error *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* i/o ill. disconnect *> begin long_bytes(rz, 4); <* skip unused *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* i/o parity error *> end; write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* r/w schd. par. error *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* buffer par. error *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* ecc hardware fault *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* ill. dev./no cntrl. field *> write (out, <<ddd ddd ddd ddd ddd>, long_bytes(rz, 2)); <* diagnostic fault detec. *> end; <* end case *> end; <* end for i *> end; procedure write_disc_statistics(z,ra); zone z ; <* output zone *> real array ra ; <* disc driver statistics *> begin integer field accesses, errors, ecc_correc, rep_correc; boolean field neg, pos, late, late_neg, late_pos, early, early_neg, early_pos; boolean array field magnitude; boolean array field compound; boolean array field detailed; integer array field segments; integer field segm_no; boolean field in_ok, in_rep, out_ok, out_rep; integer i; boolean sp, nl; sp:= false add 32; nl:= false add 10; accesses:= 2; errors:= 4; ecc_correc:= 6; rep_correc:= 8; neg:= 9; pos:= 10; late:= 12; late_neg:= 13; late_pos:= 14; early:= 16; early_neg:= 17; early_pos:= 18; magnitude:= 19; compound:= 34; detailed:= 58; segments:= 82; segm_no:= 2; in_ok:= 3; in_rep:= 4; out_ok:= 5; out_rep:= 6; \f <* pej 09.02.78 discstat page 3 *> write(z,<<ddddddd>,nl,3, <:number of accesses:>,sp,17,ra.accesses,nl,3, <:errors in first attempt:>,sp,12,ra.errors,nl,1, <:errors corrected solely by ecc:>,sp,5,ra.ecc_correc,nl,1, <:errors corrected within 3 retries:>,sp,2,ra.rep_correc,nl,3); write(z,<<dddd>, <:errors corrected by::>,nl,1, <: neg offset:>,sp,17,ra.neg extract 12,nl,1, <: pos offset:>,sp,17,ra.pos extract 12,nl,1, sp,15,<:late strobe:>,sp,3,ra.late extract 12,nl,1, <: neg offset + late strobe:>,sp,3,ra.late_neg extract 12,nl,1, <: pos offset + late strobe:>,sp,3,ra.late_pos extract 12,nl,1, sp,15,<:early strobe:>,sp,2,ra.early extract 12,nl,1, <: neg offset + early strobe:>,sp,2,ra.early_neg extract 12,nl,1, <: pos offset + early strobe:>,sp,2,ra.early_pos extract 12,nl,3); write(z, <:errors corrected by offset magnitude::>,nl,1, <: -01- -02- -03- -04- -05- -06- -07- :>, <:-08- -09- -10- -11- -12- -13- -14- -15-:>,nl,1,sp,2); for i:= 1 step 1 until 15 do write(z,<<dddd>,ra.magnitude(i) extract 12,sp,1); write(z,nl,3, <:occurrencies of::>,nl,1); for i:= 7,8,12,9,10,11, <* curr status *> 1,2,4,5,6,21,22,23,24, <* event status *> 20,19,18,17,16,15,14 do <* i/o result *> write(out,case i of ( <: event status bit 0 intervention :>, <: 1 data error (parity) :>, <::>, <: 3 data overrun :>, <: 4 hard error :>, <: 5 position error :>, <: curr status bit 0 power low :>, <: 1 local :>, <: 8 write protect :>, <: 9 high density :>, <: 10 mode :>, <: 5 seek error :>, <::>, <: 6 power restart :>, <: 5 wait progr. termination :>, <: 4 abnorm. termination :>, <: 3 software timeout :>, <: 2 bus timeout :>, <: 1 bus reject :>, <: i/o result 0 normal termination :>, <: 20 bus communication error :>, <: 21 interrupt error :>, <: 22 bus timeout :>, <: 23 bus parity error :>), <<dddd>,ra.compound(i) extract 12,nl,1); \f <* fgs 1984.04.09 discstat page 5 *> write(z,nl,2, <:occurrencies of detailed statusbit::>,nl,1, <: -00- -01- -02- -03- -04- -05- -06- -07- -08- -09- -10- -11-:>, nl,1,sp,2); for i:= 1 step 1 until 12 do write(z,<<dddd>,ra.detailed(i) extract 12,sp,1); write(z,nl,2, <: -12- -13- -14- -15- -16- -17- -18- -19- -20- -21- -22- -23-:>, nl,1,sp,2); for i:= 13 step 1 until 24 do write(z,<<dddd>,ra.detailed(i) extract 12,sp,1); if ra.segments.segm_no <> -1 then begin write(z,nl,3, <:segment successful input op. successful output op.:>, nl,1, <:number input op. with rep. output op. with rep.:>, nl,1); for segments:= 82 step 6 until 136 do if ra.segments.segm_no = -1 then segments:= 137 else write(z, sp,1,<<dddddd>,ra.segments.segm_no, sp,6,<<dddd>,ra.segments.in_ok extract 12, sp,8,ra.segments.in_rep extract 12, sp,9,ra.segments.out_ok extract 12, sp,9,ra.segments.out_rep extract 12,nl,1); end else write(z,nl,3,<:no error segments detected:>,nl,1); errorbits := 0; <*ok.yes, warning.no*> end; \f <* fgs 1984.04.05 discstat dirty corrections dh.79.03.14 page 6 *> integer statistics_length, zone_size; statistics_length:= 142; <* no of bytes *> zonesize := 128 *((112+statistics_length+511)//512 + 1); <* in segments: (first_of_stat_field + 2 + enough) converted to segments + 1 segment to avoid segment boundaries *> begin integer procedure stack_current_output (file_name); long array file_name ; begin integer result ; result := 2; <*1<1 <=> 1 segment, preferably disc*> fp_proc (29, 0, out, chain_name); <*stack c o*> fp_proc (28, result, out, file__name); <*connect *> if result <> 0 then fp_proc (30, 0, out, chain_name); <*unstack *> stack_current_output := result; end stack_current_output; procedure unstack_current_output ; begin fp_proc (34, 0, out, 25); <*close up*> fp_proc (79, 0, out, 0); <*terminate*> fp_proc (30, 0, out, chain_name); <*unstack *> end unstack_current_output; \f <* fgs 1984.10.10 discstat page 6a *> procedure maybe_device_status (z); zone z ; <***********************************************************> <* *> <* The procedure writes on the zone z a device status mes- *> <* sage with document name and status bit names the same *> <* way fp does if the program was to terminate with a give *> <* up alarm instead of having trapped one. *> <* *> <***********************************************************> begin integer status, cause, param, bit; long array text (1:4); long array field docname; docname := 8; <*fields possible docname in text*> status := getalarm (text); cause := alarmcause extract 24 ; param := alarmcause shift (-24); if cause = -11 then begin <*give up*> write (z, "nl", 1, <:device status :>, text.docname); for bit := 0 step 1 until 23 do if status shift bit < 0 then write (z, "nl", 1, case (bit + 1) of ( <:intervention:>, <:parity error:>, <:timer:>, <:data overrun:>, <:block length error:>, <:end of document:>, <:load point:>, <:tape mark or attention:>, <:writing enabled:>, <:mode error:>, <:read error:>, <:card rejected or disk error:>, <:checksum error:>, <:bit 13:>, <:bit 14:>, <:stopped:>, <:word defect:>, <:position error:>, <:process does not exist:>, <:disconnected:>, <:unintelligible:>, <:rejected:>, <:normal:>, <:hard error:>)); write (z, "nl", 1); end; end maybe device status; \f <* fgs1984.10.10 discstat page 6b *> procedure fejl (z, text, param); zone z ; string text ; array param ; begin long array field laf; laf := 0; write (z, "nl", 1, <:***:>, progname, "sp", 1, text, "sp", 1, param.laf, "nl", 2, <: call : (<outfile> = ) discstat (clear.<yesno>) disc.<disc name> (.<device number>) or : (<outfile> = ) discstat dump.<area name>.<process address> :>); end fejl; zone z(zone_size,1,stderror); integer array ia,ia1(1:20), dummy (1:1), core (0:24); integer i,i1, base_buffer_area, typ, paramno, sepleng, result; boolean proc_created, clear; long array progname, outfile, chainname (1:2); real array discname(1:2), ra(1:2); real time, r; integer field if2; \f <* fgs 1984.02.05 discstat page 7 *> proc_created := clear := false; errorbits := 3; <*ok.no, warning.yes*> trap (slutlabel); trapmode := 1 shift 10; <*no end alarm written*> system (4, 0, out_file); sepleng := system (4, 1, progname); if sepleng shift (-12) <> 6 <*=*> then begin <*noleft side, progname is param after programname*> for i := 1, 2 do begin prog_name (i) := out_file (i); out__file (i) := long <::> ; param_no := 1 ; end; end <*no left side*> else param_no := 2; if out_file (1) <> long <::> then begin <*stack current out and connect*> result := stack_current_output (out_file); if result <> 0 then begin write (out, "nl", 1, <:***:>, progname, "sp", 1, <:connect :>, outfile, "sp", 1, case result of ( <:no resources:>, <:malfunction:>, <:not user, not exist:>, <:convention error:>, <:not allowed:>, <:name format error:> )); out_file (1) := long <::>; end; end <*stack current out and connect*>; if2 := 2; ra(1) := 0; system(4, increase (paramno), ra); if ra (1) = real <:clear:> then begin <*clear*> if system (4, increase (paramno), ra) <> 8 shift 12 + 10 or (ra (1) <> real <:yes:> and ra (1) <> real <:no:>) then fejl (out, <:param:>, ra) else begin clear := ra (1) = real <:yes:>; system (4, increase (paramno), ra); end; end <*clear*>; if ra(1) = real <:dump:> then typ := 2 else if ra(1) = real <:disc:> then typ := 1 else typ := 0; \f <* fgs 1984.04.05 discstat page 8 *> if typ = 0 then fejl (out, <:param:>, ra) else if system(4,increase (paramno),discname) <> 8 shift 12 add 10 then fejl (out, <:param:>, discname) else begin <*param ok*> systime(1,0,time); i:= 1; write(out,<:<10><10>disc statistics, :>, case typ of(<:disc: :>, <:dump: :>), string discname(increase(i)),<: date: :>,<<dd dd dd>, systime(4,time,r),<: time: :>,r,<:<10>:>, false add 45,76,<:<10>:>); i:= 1; open(z, case typ of(6, 4), string discname(increase(i)), 0); i := system(4, paramno, ra); case typ of begin <*case*> \f <* fgs 1984.10.09 discstat page 9 *> <*case 1*> if i = 8 shift 12 add 4 then begin i:= ra(1); i:= monitor(54)create_peripheral:(z,i,ia); proc_created := i = 0; end else begin <*find physical disc and its autoload part*> integer array discdescr, main (0:14); integer physical , deviceno; long array field name; name := 0; <*fields name in procdescr (0:...)*> i := monitor (4) proc descr addr :(z, 1, ia); if i > 0 then begin <*process exists*> system (5) move core :(i, discdescr); if discdescr (0) = 6 then begin <*ida disc, find physical*> physical := i; <*present disc*> system (5) move core :(discdescr (5), main); if main (0) = 6 then physical := discdescr (5); end else if discdescr (0) = 62 then begin <*disc but not ida, find physical*> physical := i; <*present disc*> if discdescr (5) > 0 then physical := discdescr (5); <*main*> end else i := 7; <*process not a disc*> if i > 0 then begin <*process is a physical disc, find device no of autoload disc*> integer array ia (1:4); integer maxdev; \f <* 1984.10.10 discstat page 9a *> system (5) move core :(74, ia); <*ia (1) first device in nametable*> <*ia (2) first area in nametable*> maxdev := (ia (2) - ia (1)) // 2; begin <*block for nametable*> integer array nametable (0 : maxdev); integer dev; system (5, ia (1), nametable); for dev := 0 step 1 until maxdev do begin <*search disc with main = physical and first segment = 0*> system (5) move core :(nametable (dev), discdescr); if (discdescr ( 0) = 62 <*disc not ida*> or discdescr ( 0) = 6 <*disc ida*>) and discdescr ( 5) = physical and discdescr (14) = 0 <*first segm *> then begin device_no := dev; dev := maxdev; end; end <*search*>; end <*block for nametable*>; close (z, true); open (z, 6, discdescr.name, 0); if discdescr (1) = 0 then begin <*create peripheral process with wrk name*> i := monitor (54) create peripheral proc :(z, deviceno, ia); proc_created := i = 0; end else i := 0; <*found and name ok*> end <*process is a physical disc*>; end <*process exists*> else i := 8; <*process does not exist*> end <*find physical disc and its autoload disc*>; \f <* fgs 1984.10.09 discstat page 10 *> <*case 2*> if i <> 8 shift 12 + 4 then fejl (out, <:param:>, ra) else begin i := ra(1); rep: setposition(z, 0, i shift(-9)); inrec6(z, i extract 9); inrec6(z, 2); if z.if2 <> 62 then i := 9 <*not a disc or an ida disc*> else begin inrec6(z, 8); inrec6(z, 2); i := z.if2; if i <> 0 then goto rep; end end typ = 2 i.e. dump; end <*case*>; if i <> 0 and i <> 3 then write (out, "nl", 1, <:***:>, progname, "sp", 1, if typ = 1 and i <= 6 then <:create peripheral process :> else <:disc specified :>, case i of ( <:function forbidden in calling process:>, <:calling proc not user; catalog i/o error:>, <:name conflict:>, <:device no does not exist:>, <:device is reserved by another user:>, <:name format illegal:>, <:is not a disc:>, <:does not exist:>, <:is either not a disc or it is an ida disc:>), "nl", 1) else begin <*get statistics and print*> if typ > 1 then begin inrec6(z, 96-10); for i := 5, 6, 7 do begin inrec6(z, 2); ia(i) := z.if2; end; inrec6(z, 6); inrec6(z, statistics_length); core (0) := 62; <*not ida*> end else begin <*typ = 1*> \f <* fgs 1984.10.09 discstat page 11 *> <*begin typ = 1*> getzone6(z,ia); base_buffer_area:= ia(19); ia(14):= base_buffer_area; <* record base *> ia(16):= statistics_length; <* record length *> setzone6(z,ia); getshare6(z,ia,1); ia(4):= 9 shift 12 + (if clear then 1 else 0); <* operation *> ia(5):= base_buffer_area + 1; <* firstaddr *> ia(6):= ia(5) + statistics_length - 2; <* lastaddr *> setshare6(z,ia,1); monitor (16) send message :(z, 1, ia); i := 1 shift monitor (18) wait answer :(z, 1, ia); if i = 1 shift 1 then i := ia (1) add i; <*status add normal answer*> if i <> 1 shift 1 then stderror (z, i, if i = 1 shift 1 then 0 else ia (2)); getshare6 (z, ia1, 1); i:= ia(2) + ia1(5); <* top transferred = first shared + halfwords *> ia1(12):= i; setshare6 (z, ia1, 1); getzone6 (z, ia1); ia1(15):= i-1; <* last byte last transferred - 1 *> ia1(13):= 2; <* zone state after repeat char *> system (5, ia1(14)+1, core); ia1(12):= core(0)shift 8 + 1; <* init partial word *> setzone6 (z, ia1); system (5)move_core:(monitor(4)process_description:(z,1,core),core); end <*typ = 1*>; if core(0)=6 then print_ida_statistics (z,core(22),core(23), core(18)) else begin <*not ida*> write_disc_statistics(out,z); write(out,<:<10>:>); for i:= 5, 6, 7 do begin write(out,<:<10>:>,case i-4 of ( <:latest sensed curr status :>, <: event status :>, <: detailed status:>),<: :>); for i1:= -23 step 1 until 0 do write(out,if ia(i) shift i1 extract 1 = 0 then <:.:> else <:1:>); end ; end <*not ida*>; end <*get statistics and print*>; end <*param ok*>; write(out,<:<10><10><10><10>:>); if false then slutlabel: maybe_device_status (out); if proc_created then monitor (64) remove process :(z, 1, dummy); if outfile (1) <> long <::> then unstack_current_output; end; end; ▶EOF◀