|
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: 82944 (0x14400) Types: TextFile Names: »complex«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦this⟧ »complex« └─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦this⟧ »complex«
\f skip 35.1 vedr. e r r o r l o g - c o m p l e x . ========================================= 1.0 noget om navne 2.0 "complex" 2.1 opstart af "errorsnoop" 2.2 udskrivning af "rclogarea" under boss 2.3 udskrivning af "rclogarea" under s 3.0 "errorsnoop" 4.0 "outrclog" 4.1 overskrift 4.2 disc 4.3 fpa 4.4 subprocess 4.5 break 5.0 "rclog" a. referencer b. error-record format c. de vigtigste ukommenterede værdier i udskriften fra "outrclog" \f 1.0 noget om navne: ===================== "complex" er en text-fil, der indeholder de fp-kommandoer og program- texter, der er nødvendige for at benytte "errorlog"- faciliteten i rc8000's monitor fra release 6.0; se 2.0. "errorlog" er en ekstern process, der findes i rc8000's monitor fra release 6.0; denne process gør det muligt at hente information om visse breaks og om de fejl, der sker på disc, fpa og subprocess; i det følgende vil disse informationer, omtales som error-records. ref.16. "errorsnoop" er en intern process, der v.h.a. et slang-program, modtager error-records fra "errorlog" og skriver disse på en bs-fil. se 3.0. "watchdog" er et slang-program, der kører i "errorsnoop". "rclogarea" er en bs-fil, hvori "errorsnoop" skriver error-records. "outrclog" er et algol-program, der udskriver error-records fra "rclogarea" på en rimelig fornuftig måde. se 4.0. "rclog" er et newjob, der sørger for det praktiske ved udskrivningen fra "rclogarea" - diverse messages til "errorsnoop" og kald af "outrclog". se 5.0. "log" er en bs-fil, der oprettes til udskrivning af "rclog", hvis lp ikke kan reserveres. \f 2.0 complex ============= "complex" er en text-fil, der indeholder de fp-kommandoer og program- texter, der er nødvendige for at benytte "errorlog"-faciliteten i rc8000's monitor fra release 6.0. implementering: 1) lav en all-process og tast: i complex følgende områder vil blive oprettet på disc med user-base: rclogarea = set 108 ; watchdog = set 2 ; slang-program outrclog = set 56 ; algol-program rclog = set 1 ; newjob 2) indsæt et brugbart user-name og project-number i 1.linie af "rclog". 3) dokumentation kan udskrives således (a4 høj): (i complex lp=copy 35.1 end) herefter kan "errorsnoop" startes, se 2.1; vedr. udskrivning af error-records, se 2.2 og 2.3; \f 2.1 således startes errorsnoop ================================ *att s new errorsnoop size 1100 buf 2 area 1 mode 0 ready *att s base -8388607 8388605 prog watchdog run bs disc 0 0 ready from errorsnoop start \f 2.2 således udskrives loggen under boss ========================================= *>> newjob rclog from errorsnoop stop start *att boss att no således udskrives loggen under boss, hvis errorsnoop har skrevet stop ===================================================================== from errorsnoop stop *att boss newjob rclog from errorsnoop start *att boss att no \f 2.3 således udskrives loggen under s ====================================== *att s all xxx run ready to xxx i rclog from errorsnoop stop start to xxx *att s proc xxx remove ready således udskrives loggen under s, hvis errorsnoop har skrevet stop ================================================================== from errorsnoop stop *att s all xxx run ready to xxx i rclog from errorsnoop start to xxx *att s proc xxx remove ready \f 3.0 errorsnoop ================ "errorsnoop" modtager error-records fra "errorlog" og udskriver disse i "rclogarea"; "errorsnoop" startes med følgende s-kommandoer: new errorsnoop size 1100 buf 2 area 1 mode 0 prog watchdog base -8388607 8388605 run bs disc 0 0 fejl-udskrifter: no errorlog ; den externe process "errorlog" findes ikke ; i monitoren - monitor release tidligere end 6.0; no rclogarea ; bs-filen "rclogarea" findes ikke; ; opret området i en all-process: ; rclogarea=set 108 disc ; scope user rclogarea no buffercore ; der er ikke plads til en buffer på 512 halfwords; ; size ved opstart er for lille; bemærk: alle meddelelser (også fejl-udskrifter) fra "errorsnoop" udskrives på output-terminalen, der er defineret til device 2 (hovedconsolen); ønskes device-nummeret ændret, se under: eventuelt. ved korrekt opstart sker følgende: "rclogarea" reserveres og tidspunktet skrives i segment 0, <:start:> udskrives på output-terminalen, kommunikationen med "errorlog" begynder, der modtages en error-record af gangen, denne skippes i følgende tilfælde: disc: hvis <process-name> = <:wrk:> eller hvis event status indeholder data overrun; fpa: hvis transmitteren's channel program counter er 0 i first sense eller hvis transmitteren's event status i first sense indeholder timeout; subproc: hvis subkind = 18(magtape) og <process-name> = <:wrk:> eller hvis subkind = 8(terminal) og status indeholder timer; (hvis ovennævnte error-records ønskes registreret, se under: eventuelt) alle øvrige error-records skrives i "rclogarea" fra segment 1 og til sidste segment, et segment indeholder fra 6 til 15 error-records; når "rclogarea" er fyldt op, frigives det og <:stop:> udskrives på output-terminalen; \f problemer: hvis result <> 1 eller status <> 0 i answer fra "rclogarea", frigives "rclogarea" og <:stop:> udskrives på output-terminalen; hvis result <> 1 eller status <> 0 i answer fra output-terminalen, gentages; bemærk: "errorsnoop" kræver mode 0 , da output-terminalen's reserver-ord nulstilles inden output til denne; under skrivning i "rclogarea" kommunikerer "errorsnoop" ikke med "errorlog"; \f "errorsnoop" accepterer følgende messages fra andre interne processer: (alle messages besvares med et result og et answer - vedr. answer, se: answer format) message format: --------------- start: +0: 0 +2: sta hvis "errorsnoop" har skrevet <:stop:>: "rclogarea" reserveres og tidspunktet udskrives i segment 0, <:start:> udskrives på output-terminalen og kommunikationen med "errorlog" begynder; message besvares med result 1; hvis "errorsnoop" har skrevet <:start:>: message besvares med result 2; stop: +0: 0 +2: sto hvis "errorsnoop" har skrevet <:start:>: message til "errorlog" regrettes, den sidste error-record afsluttes med <25> (em) og udskrives i "rclogarea", der frigives, <:stop:> udskrives på output-terminalen message besvares med result 1; hvis "errorsnoop" har skrevet <:stop:>: message besvares med result 2; on: +0: 0 +2: on<0> <:on:> udskrives på output-terminalen; <process-name> i alle efterfølgende error-records vil blive udskrevet på output-terminalen; bemærk, at "errorsnoop" ikke kan registrerer andre error-records under udskrivningen; message besvares med result 1; off: +0: 0 +2: off <:off:> udskrives på output-terminalen; <process-name> fra accepterede error-records vil ikke blive udskrevet; message besvares med result 1; alle øvrige messages returneres med result 2; \f answer format: -------------- alle messages, uanset result 1 eller 2, besvares med følgende answer: +0: <number of error-records> det er altså muligt på et hvilket som helst tidspunkt at sende en uacceptabel message til "errorsnoop" og få at vide, hvor mange error-records, der er registreret på det pågældende tidspunkt; eks.: do x3.errorsnoop x1.0.0 send message wait answer write x1.2 end udskrift: x1.zzzzz +0 <number of error-records> ( zzzzz er en irrelevant lager-adresse ) do kan naturligvis også anvendes til acceptable messages; eks.: do x3.errorsnoop x1.0.on send message wait answer write x1.2 end eller do x3.errorsnoop x1.0.stop send message wait answer write x1.2 end eventuelt: ---------- hvis output-terminalen ønskes ændret til et andet device-nummer, gøres følgende i en all-process: complex = edit complex l./æ35æ/, l./;***output-terminal:/, l1, r/2/z/,f hvor z erstattes af et andet device-nummer; hvis alle error-records ønskes registreret, gøres følgende i en all-process: complex = edit complex l./æ35æ/, l./;***terminal:/, l1, r/ /;/, l1, r/ /;/, l./;***magtape:/, l1, r/ /;/, l./;***disc:/, l1, r/ /;/, l1, r/ /;/, l1, r/ /;/, l./;***fpa:/, l1, r/ /;/, l1, r/ /;/, l1, r/ /;/, f efter en eventuel editering, se 2.0; bemærk, at udskrift-programmet "outrclog" ikke udskriver error-records, hvis process-name begynder med <:wrk:>; se: 4.0. \f 4.0 outrclog ============== "outrclog" er et algol-program, der udskriver de error-records, der måtte være registreret i "rclogarea", på en rimelig fornuftig måde; det er vigtigt, at det er den samme monitor ved udskrivningen som ved genereringen af error-records; papir-format: a4 - tværs programkald: programnavn <bsfil>.tt tt ::= test / andet eks. outrclog rclogarea.andet "outrclog" stopper udskrivningen: 1) hvis en error-record's første ord = em (<25>), 2) hvis tidspunktet i en error-record, er tidligere end start-tidspunktet i segment 0 eller 3) når hele området er udskrevet; bemærk, at alle error-records, hvis process-name begynder med <:wrk:>, ikke udskrives; det kan ændres på følgende måde i en all-process: complex=edit complex l./æ35æ/, l./<***wrk-name:/, l1, i/ <* /, l3, i/ *> /, f efter en eventuel editering, se: 2.0. det følgende er en gennemgang af de 4 typer udskrifter, der kan forekomme: 1) disc 2) fpa-receiver, fpa-transmitter 3) subprocess 4) break hvor texter er omgivet af <: og :>, refereres til konstante texter i udskriften; hvor texter er omgivet af < og >, refereres til variable texter i udskriften; \f 4.1 overskrift ---------------- 1.linie indledes med <:rc8000:> ; efter <:period:> angives start-tidspunkt for "errorsnoop" og udskrift-tidspunkt. 2.linie efter <:error log for device no:> udskrives device-nummeret for fysisk-disc, fpa-receiver, fpa-transmitter eller subprocess; error-records udskrives i device-nummer-orden, dernæst i tids-orden; break indledes med <:error log for special reasons:> og udskrives til sidst i tids-orden; <:page:>-tæller gælder for hvert device-nummer og break. 3.linie afhængig af udskrift-type, indledes med: 1) <:disc:> , hvis devicet er en disc-process 2) <process-name> på receiver eller transmitter , hvis devicet er en fpa-process 3) <:kind:> , hvis devicet er en sub-process 4) <:procname:> , hvis det er breaks. \f 4.2 disc ---------- ref.2, 5, 6. en error-record består af 2 linier, hvoraf den første linie angiver <process-name> på area-processen, den logiske disc-process eller den fysiske disc-process; hvis efterfølgende error-records har samme <process-name>, udskrives det ikke; i så fald består en error-record kun af en linie; error-recorden læses udfra overskriften (linie 3:8): <:op:> := operation; hvis denne er 0 (sense) udskrives <:sen:> 3 (input) - <:inp:> 5 (output) - <:out:> andre værdier udskrives som integer; hvis den efterfølgende <:op:> er den samme, udskrives <: - :>; <:mode:> := mode; udskrives som integer; er normalt 0; <:first:> <:addr :> := first core address, hvor transporten er startet; <:first:> <:segm :> := first segment number; første logiske eller fysiske segment nummer, hvor transporten er startet; hvis <process-name> angiver en area-process => logisk segment nummer en logisk disc => logisk segment nummer en fysisk disc => fysisk segment nummer da <process-name> normalt angiver en area-process, betyder det, at der skal lægges 1197 til, hvis det fysiske device er en stor disc, og 1050, hvis det er en lille, for at få det korrekte fysiske segment nummer; <:cyl:> := cylinder number; udregnes: <:cyl:>:= <:first segm:> // segm.pr.cyl; segm.pr.cyl hentes fra den fysiske disc-process beskrivelse; <:cyl:> er kun korrekt, hvis <:first segm:> er det fysiske segment nummer; da <process-name> normalt angiver en area-process, betyder det, at der skal lægges 3 til, hvis det fysiske device er en stor disc, og 10, hvis det er en lille, for at få det korrekte cylinder nummer; \f <:hea:> := head number; udregnes: <:hea:>:= (<:first segm:> mod segm.pr.cyl) // segm.pr.track; segm.pr.cyl og segm.pr.track hentes fra den fysiske disc-process beskrivelse; <:hea:> er normalt altid korrekt, da logiske disce fylder hele cylindre; <:hea:> kan være efterfulgt af en <:*:>, der angiver, at transporten er foregået over flere heads; if ( <:sec:> + <:tra seg:> ) > segm.pr.track then <:*:> else <: :>; <:sec:> := sector; udregnes: <:sec:>:= <:first segm:> mod segm.pr.track; <:sec:> er normalt altid korrekt, da logiske disce fylder hele cylindre; <:tra:> <:seg:> := number of segments in current transfer; transportens størrelse i segmenter; <:io:> := io result; <:io:> er et result, der er genereret af monitoren; kan have følgende værdier og betydning: 0 normal termination ; interrupt received 1 bus reject, busy ; device not started.(ex.bit 23) 2 bus timeout, disconnect ; device not started.(ex.bit 22) 3 software timeout ; no interrupt received 4 abnormal termination ; interrupt received 5 waitprogram terminated ; interrupt received 6 power restart ; software generated hvis <:io:> er 1, 2, 3 eller 6, vil <:remain char:>, <:<cur>:>, <:<event>:> og <:<detailed>:> være 0; hvis <:io:> er 5, vil <process-name>, <:op:>, <:mode:>, <:first addr:>, <:first segm:>, <:cyl:>, <:hea:>, <:sec:> og <:tra seg:> være irrelevant; <:io:> = 4 betyder, at et interrupt er modtaget, men den sidst udførte kommando er hverken stop eller wait; <:remain:> <: char :> := remaining character count; <:remain char:> er udefineret, hvis read eller write kommandoen ikke er udført; <:< cur >:> := current status; <:< event >:> := event status; <:<detailed>:> := detailed status; texten under <: <- cur -> < event > <--- detailed ---> :> læses l o d r e t og skulle give et fingerpeg om, hvad de enkelte status-bit betyder; ubenyttede bit i current og event status udskrives ikke; bit 7 i detailed status benyttes ikke; \f texten under <:<cur>:> : <:power:> := bit 0 power low <:local:> := - 1 local <:seek :> := - 5 seek error <:write:> := - 8 write protect <:high :> := - 9 high density <:mode :> := - 10 mode <:dev.k:> := - 16:23 devicekind texten under <:<event:> : <:inter:> := bit 0 intervention <:datae:> := - 1 data error <:datao:> := - 3 data overun <:hard :> := - 4 hard error <:posit:> := - 5 position error <:commu:> := - 20 communication error <:irupt:> := - 21 interrupt error <:busti:> := - 22 bus timeout <:buspa:> := - 23 bus parity error texten under <:<detailed>:> : <:facec:> := bit 0 interface check <:drivc:> := - 1 drive status check <:powec:> := - 2 powerfail check <:commc:> := - 3 command sequence check <:cuins:> := - 4 cu instruction execution incomplete <:datac:> := - 5 data check <:datao:> := - 6 data overrun <:.....:> := - 7 <:multi:> := - 8 multiple or no unit selected <:secto:> := - 9 sector- or index-error <:diagn:> := - 10 check drive diagnostic <:-sync:> := - 11 synccharacter not found <:-mark:> := - 12 address mark not found <:atten:> := - 13 read or write while attention <:-serv:> := - 14 no servo clock <:+offs:> := - 15 write and offset active <:-head:> := - 16 no head select <:writf:> := - 17 write fault <:offcy:> := - 18 write or read and off cylinder <:wrrdf:> := - 19 write and read fault <:voltf:> := - 20 voltage fault <:headf:> := - 21 head select fault <:seek :> := - 22 seek-error <:writp:> := - 23 write protect \f 4.3 fpa --------- ref.3, 4. en error-record består af 3 linier: 1. l i n i e <:start:> := start byte; alle transporter på fpa-linien begynder med en start-byte; de 8 bit betyder: bit 0 : blocknumber - 1 : - 2 : - 3 : - 4 : data follows - 5 : header bit - 6 : data flag - 7 : special function special funktioner er: 1 1 1 1 1 1 1 1 master clear 1 1 0 1 1 1 1 1 accept master clear \f 2. l i n i e <:statu:> := status byte; alle transporter bliver besvaret med en status-byte, der specificerer resultatet at transmissionen; de 8 bit betyder: bit 0 : blocknumber - 1 : - 2 : - 3 : - 4 : block control - 5 : - - - 6 : blocklength error - 7 : parity error blockcontrol(4:5) indeholder acceptance eller rejection af en modtaget header; feltet er dummy, hvis parity-bit er sat; blockcontrol kan have følgende værdier og betydning: bit 4:5 0 0 accepted 0 1 wait operationen kan ikke blive modtaget i øjeblikket, p.gr.a. manglende ressourcer i front-end; 1 0 skip header og data bør skippes; 1 1 reject uforståelig funktion eller linien ikke initieret; anden linie fortsætter med de 5 første kommandoer af det channel-program, som fpa-en har forsøgt at få udført; følgende kommandoer og parametre kan forekomme: <:sen:> sense 1.param first word address <:rea1:> read continue 1.param first word address 2.param character count <:rea0:> read 1.param first word address 2.param character count <:*2*:> illegal command <:wri1:> write continue 1.param first word address 2.param character count <:wri0:> write 1.param first word address 2.param character count <:wai:> wait <:*5*:> illegal command <:con:> control <:sto:> stop \f 3. l i n i e læses udfra overskriften (linie 3:8), der er delt op i 3 blokke; disse giver information om de 3 sense-operationer, der kan have været udført i channel- programmet, nemlig <:first:> <:second:> <:standard:> <:sense:> <:sense :> <:status :> hver blok giver information om: <:channel:> := current channel program address; <:rem.ch.:> := remaining character count; <:<cur>:> := current status; <:<event>:> := event status; texten under <: <cur> <event> :> læses l o d r e t og skulle give et fingerpeg om, hvad de enkelte status-bit betyder i current og event status; ubenyttede bit udskrives ikke; \f texten under <:<cur>:> : <:disco:> := bit 0 front-end disconnected <:dev.k:> := - 21 device kind (receiver = 0; transmitter = 1) <:blo.o:> := - 23 block orientated = 1 texten under <:<event>:> : <:reset:> := bit 0 reset received from front-end <:parit:> := - 1 parity error in medium <:timeo:> := - 2 time-out <:blo.l:> := - 4 block length error <:buspa:> := - 20 bus parity error <:statu:> := - 21 status transfer error <:busti:> := - 22 bus time-out <:busco:> := - 23 bus communication error \f 4.4 subprocess ---------------- en error-record består af 1 linie, der læses ud fra overskriften (linie 3:4): <:kind:> := subkind; angiver, hvad subprocessen har været anvendt til; kan have følgende værdier og betydning: 0 general sequential device 4 area-process ref.5 6 disc - 7 8 typewriter - 8 10 papertape reader - 9 12 papertape punch - 10 14 lineprinter - 11 16 cardreader - 12 18 magnetic tape or casette - 13, 14 22 diskette - 15 hvis den efterfølgende <:kind:> er den samme, udskrives <: - :>; <:procname:> := name of process; hvis det efterfølgende <:procname:> er det samme, udskrives <: - :>; \f <: m e s s a g e :> <:oper:> := operation; hvis denne er 0 (sense) udskrives <:sen:> 3 (input) - <:inp:> 5 (output) - <:out:> yderligere for <:kind:> = 18(magtape): 6 (erase) - <:era:> 8 (move) - <:mov:> 10 (write tape mark) - <: tm:> 12 (set mode) - <:set:> andre værdier udskrives som integer; hvis den efterfølgende <:oper:> er den samme, udskrives <: - :>; obs obs der kan forekomme værdier, der ikke findes i de respektive ref' er; i disse tilfælde vil informationen under <:message:> være irrelevant som message, da det vil være en kopi af de 4 første ord under <:answer:>; <:mode:> := mode; hvis <:kind:> = 18(magtape) er mode = trail + density + parity inden udskrivning maskes trail fra; de resterende muligheder er 0 pe + odd udskrives <:pe:> 2 pe + even - <:pee:> 4 nrz + odd - <:nrz:> 6 nrz + even - <:nrze:> vedr. trail: se under m e s s a g e <:4.word:>; øvrige <:mode:> udskrives som integer; hvis den efterfølgende <:mode:> er den samme, udskrives <: - :>; <:2.word:> <:3.word:> <:4.word:> := betydningen af disse er afhængig af <:oper:>; hvis <:oper:> er <:inp:> eller <:out:>, genereres <:4.word:> af udskrift-programmet "outrclog", dog ikke hvis <:kind:> = 6 (rc3600-disc); for <:inp:> og <:out:> gælder følgende: <:2.word:> = first core address; <:3.word:> = last core address; <:4.word:> = buffer-size i karakter; <:4.word:> udregnes på følgende måde: ( (<:3.word:> - <:2.word:>) + 2)/ 2 * 3; hvis <:kind:> = 18(magtape) fratrækkes yderligere trail; <:4.word:> sammenlignes med a n s w e r <:char:>; afhængig af sammenligningen udskrives foran <:4.word:>: <: - :> , hvis <:4.word:> er større end <:char:> <: :> , hvis - er lig med - <: + :> , hvis - er mindre end - \f < : a n s w e r :> <:status 0:11:>:= statusbit 0 til 11; betydningen er afhængig af <:kind:>, men normalt betyder de: 0 intervention 1 parity error 2 timer 3 data overrun 4 block length error 5 end of tape 6 begin of tape 7 tape mark 8 write enable 9 mode error 10 read error (cardreader) 11 card reject or disc error bit 1,2,3,4,9,10 eller 11 vil altid forekomme; <: 12:23 :> := bør altid være 0; <:halfw:> := number of halfwords; antal halvord, der har været berørt ved operationen; <:char:> := number of characters; antal karakterer, der har været berørt ved operationen; <:4.word:> <:5.word:> := hvis <:kind:> = 18(magtape) angiver <:4.word:> = file number <:5.word:> = block number \f 4.5 break ----------- ref.1. en error-record består af 1 linie, der læses ud fra overskriften (linie 3); <:procname:> := name of process; navnet på den interne process, som har fået et break; <:w0:> <:w1:> <:w2:> <:w3:> <:status:> <:ic:> <:cause:> <:sb:> := de forskellige registre på break-tidspunktet; udskrives som integer; <:cause:> angiver, hvilken break, det drejer sig om; <:(ic-4):> <:(ic-2):> := <:(ic-2):> er den sidste instruktion, der er udført; udskrives som integer; omskrives til instruktion v.h.a. do: do w0.<:(ic-2):> write w0.code hvis <:(ic-2):> er negativt: do w0.0.de.abs<:(ic-2):> write w0.code break 6 (<:cause:> = 6 ) vil være den hyppigst forekomne; break 6 er monitor-genereret og betyder parameter-fejl i monitor-kald; det vil normalt fremgå af <:sb:>, hvilket monitor-kald, det drejer sig om: monitor-kald = 2048 - abs( <:sb:> ); hvis <:sb:> f.eks. er -2030, vil sidste instruktion være jd 1<11 + 18 ( wait answer ); \f 5.0 rclog =========== "rclog" er et newjob, der sørger for diverse messages til "errorsnoop" og kald af "outrclog"; husk: at indsætte et brugbart user-name og project-number i 1.linie af "rclog"; vedr. kald af "rclog" under boss og s, se under henholdsvis 2.2 og 2.3; "rclog" bør justeres inden kald under sos; "rclog" gør følgende: hvis "errorsnoop" eksisterer, sendes en stop-message til "errorsnoop", result og number of error-records udskrives; current output forsøges ændret til lp, hvis det ikke lykkes, ændres current output til "log", en bs-fil; dernæst kaldes udskriftprogrammet: outrclog rclogarea.andet current output ændres til c; hvis "errorsnoop" eksisterer, sendes en start-message til "errorsnoop", result udskrives; convert til "log"; problem: hvis "rclogarea" ikke er blevet udskrevet inden en evt. autoload, bør man inden start af "errorsnoop" kalde "rclog". \f a. referencer ================ 1. rcsl no 42-i1235: rc8000 computer family reference manual 2. rcsl no 30-m43: dsc801, disc storage controller reference manual 3. rcsl no 52-aa661: fpa801, front end processor adaptor reference manual 4. rcsl no 31-d496: fpa line control protocol 5. rcsl no 31-d539: rc8000 backing storage area process 6. rcsl no 31-d528: rc8000 disc process 7. rcsl no 31-d546: rc8000 disc process (rc36xx) 8. rcsl no 31-d580: rc8000 terminal process 9. rcsl no 31-d535: rc8000 paper tape reader process 10. rcsl no 31-d534: rc8000 paper tape punch process 11. rcsl no 31-d536: rc8000 line printer process 12. rcsl no 31-d537: rc8000 punched card reader process 13. rcsl no 31-d533: rc8000 magnetic tape process (9-track) rcsl no 31-d540: rc8000 magnetic tape process (7-track) 14. rcsl no 31-d542: rc8000 cassette tape process 15. rcsl no 31-d543: flexible disc process 16. rcsl no 31-d624: errorlog process \f b. error-records formater, som "error-log" afleverer dem: ============================================================= disc: + 0: <kind=62><local kind=0> + 2: <proc name> + 4: < - - > + 6: < - - > + 8: < - - > + 10: <operation><mode> + 12: <first address> + 14: <segment no> + 16: <trans segm><not used> + 18: <io result> + 20: <remaining byte count> + 22: <current status> + 24: <event status> + 26: <detailed status> + 28: <current process> + 30: <time> + 32: < - > fpa: + 0: <kind=86(rec)/88(tra)><local kind=0> + 2: <proc name> + 4: < - - > + 6: < - - > + 8: < - - > + 10: <ch.prog.counter> (std.status) + 12: <remaining byte count> + 14: <current status> + 16: <event status> + 18: <ch.prog.counter> (1.sense) + 20: <remaining byte count> + 22: <current status> + 24: <event status> + 26: <start byte><status byte> + 28: <current process> + 30: <time> + 32: < - > + 34: <ch.prog.counter> (2.sense) + 36: <remaining byte count> + 38: <current status> + 40: <event status> + 42: <1.ch.command> + 44: < - - > + 46: < - - > + 48: <2.ch.command> + 50: < - - > + 52: < - - > + 54: <3.ch.command> + 56: < - - > + 58: < - - > + 60: <4.ch.command> + 62: < - - > + 64: < - - > + 66: <5.ch.command> + 68: < - - > + 70: < - - > + 72: <not used> \f subprocess: + 0: <kind=84/85><local kind> + 2: <proc name> + 4: < - - > + 6: < - - > + 8: < - - > + 10: <message + 8> + 12: < - + 10> + 14: < - + 12> + 16: < - + 14> + 18: <answer + 8> + 20: < - + 10> + 22: < - + 12> + 24: < - + 14> + 26: < - + 16> + 28: <current process> + 30: <time> + 32: < - > break: + 0: <kind=0><local kind=0> + 2: <proc name> + 4: < - - > + 6: < - - > + 8: < - - > + 10: <w0> + 12: <w1> + 14: <w2> + 16: <w3> + 18: <status> + 20: <ic> + 22: <cause> + 24: <sb> + 26: <word(ic-4)> + 28: <word(ic-2)> + 30: <time> + 32: < - > \f c. disc --------- <:io:> := io result; 0 normal termination ; interrupt received 1 bus reject, busy ; device not started.(ex.bit 23) 2 bus timeout, disconnect ; device not started.(ex.bit 22) 3 software timeout ; no interrupt received 4 abnormal termination ; interrupt received 5 waitprogram terminated ; interrupt received 6 power restart ; software generated fpa --- <:start:> := start byte; bit 0 : blocknumber - 4 : data follows - 5 : header bit - 6 : data flag - 7 : special function special funktioner er: 1 1 1 1 1 1 1 1 master clear 1 1 0 1 1 1 1 1 accept master clear <:statu:> := status byte; bit 0 : blocknumber - 4 : block control - 5 : - - - 6 : blocklength error - 7 : parity error blockcontrol indeholder acceptance eller rejection af en modtaget header; feltet er dummy, hvis parity-bit er sat; blockcontrol kan have følgende værdier og betydning: 0 accepted 1 wait; operationen kan ikke blive modtaget i øjeblikket, p.gr.a. manglende ressourcer i frontend; 2 skip; header og data bør skippes; 3 reject; uforståelig funktion eller linien ikke initieret; subprocess ---------- <:kind:> := subkind; 0 general sequential device 4 area-process 6 disc 8 typewriter 10 papertape reader 12 papertape punch 14 lineprinter 16 cardreader 18 magnetic tape or casette 22 diskette <:status 0:11:>:= statusbit 0 til 11; 0 intervention 1 parity error 2 timer 3 data overrun 4 block length error 5 end of tape 6 begin of tape 7 tape mark 8 write enable 9 mode error 10 read error (cardreader) 11 card reject or disc error bit 1,2,3,4,9,10 eller 11 vil altid forekomme; # \f ; ehp 810302 ; mode list.yes rclogarea=set 108 disc scope user rclogarea watchdog=set 2 disc (watchdog=slang watchdog) ; ehp 1981.03.02 ; ; version 1981.03.02 ; ; the program receives error-records from !errorlog! and ; writes these on !rclogarea!. ; the !rclogarea! must have been created before start of program. ; ; ; the internal process, in which the program is running, is ; started with the following s-commands: ; ; new errorsnoop size 1100 buf 2 area 1 mode 0 ; base -8388607 8388605 prog watchdog run bs disc 0 0 ; ; ; error messages: ; <:no errorlog<10>:> ; the external process, !errorlog!, is not included ; in the monitor. this process is needed to get the ; error-records. ; <:no rclogarea<10>:> ; <:no buffercore<10>:> ; ; all texts (also error-messages) are sent to the output-terminal defined ; by a1. default: device 2 (main-console). ; ; when the internal process is created correctly, the program ; will write on the output-terminal: ; <:start<10>:> ; the program will now receive error-records from ; !errorlog! and update these in !rclogarea!. ; a message with the second word equal to the text <:sto:> ; will cause the program to update the the last error-records ; at bs-area and finis with an <em> character on this. ; the !rclogarea! is released, when the text <:stop<10>:> ; is written on the output-terminal. ; the program can be started again by a new message ; with the second word equal to the text <:sta:>. ; ; in case of error during output to the bs-area, or when the ; bs-area is full, the program write on the output-terminal the ; text <:stop<10>:>. ; ; \f b.g5 ; begin w. ; d. p.<:fpnames:> l. g2: ; s.a5,b35,e5,i35 ; begin w. ; a0 = 510 ; size of error log buffer ;***output-terminal: a1 = 2<6 ; device no of output-terminal shift 6 a2 = 74 ; size of max record a3 = 34 ; size of std record a4 = 32 ; addr(time in record) b0: <:errorlog:>,0 ; name of error log process 0 ; used by send message b1: 19<12 ; error log message 0 ; first address b2: 0 ; last address b25:0 ; proc descr addr b3: <:rclogarea:>,0 ; name of log area 0 ; used by send message b4: 5<12 ; log area message 0 ; first address b5: 0 ; last address b6: 0 ; segment no b7: 0 ; size of log area b8: 0 ; message buffer address b9: 0,r.8 ; answer b10:0,0,0,0 ; name of console 0 ; used by send message b11:5<12 ; console message 0 ; first address b12:0 ; last address b13:0 ; console proc descr. addr. b29:1<20 ; data overrun(event status - disc) b35:1<21 ; timeout(event status - transmit) b14:<:start<10>:> ; b15:<:stop<10>:> ; b16:<:on<0>:> ; b17:<:off:> ; b26:<:proc :> ; b18:0,r.4 ; procname b19:<:<10><0><0>:> ; nl b20:0 ; outerror b21:0 ; switch b22:<:wrk:> ; b23:<:addr 0:> ; b24:0 ; no of records ; procedure out segment(link): ; comments: outputs the error log buffer on the log area; ; in case of unacceptable result or status, it returns to ; !type stop!. ; call: return: ; w0 next segment no ; w1 destroyed ; w2 destroyed ; w3 link destroyed ; b. ; begin w.i1: ; out segment: rs. w3 i0. ; save link; al. w3 b3. ; al. w1 b4. ; jd 1<11+16 ; send message(message,name;buf); al. w1 b9. ; jd 1<11+18 ; wait answer(buf;result,answer); bz. w1 b9. ; sn w0 1 ; if result <> 1 se w1 0 ; or status <> 0 then jl. i17. ; goto type stop; wa. w0 b6. ; rs. w0 b6. ; segment no:= segment no + 1; jl. (i0.) ; goto saved link; e. ; end of out segment; ; procedure check message(buf,link;switch): ; comments: if word(message+10) contains the text <:sta:>,<:sto:>,<:on<0>:> ; or <:off:>, an answer is sent with result 1 and return is taken to link + 2; ; the same is done, if word(message+10) contains the text <:pro:> and ; word(message+18) is zero or equal to a device process description address; ; if not, an answer is sent with result 2 and return is taken to ; link; ; if buffer claim exceeded, return is taken to wait event. ; call: return: ; w0 switch (if return to link+2) ; w1 destroyed ; w2 buf destroyed ; w3 link destroyed ; b.j10 ; begin w.i6: al w3 x3+1 ; check message1: i2: sn w2 0 ; check message2: if buf = 0 then jl. i16. ; goto wait event; rs. w2 b21. ; switch:= buf; rl. w0 b24. ; rs. w0 b9. ; word(answer):= no of records; rl w0 x2+10 ; text:= word(buf+10); sn. w0 (b26.) ; if text = <:pro:> then jl. j5. ; goto check proc; se. w0 (b16.) ; if text = <:on:> sn. w0 (b17.) ; or text = <:off:> then jl. j3. ; goto set; sz w3 2.1 ; result:= am b14-b15 ; if text = (if link(23) <> 0 then <:sta:> sn. w0 (b15.) ; else <:sto:>) then j1: am 1-2 ; res1: 1 j2: al w0 2 ; res2: else 2; jd 1<11+26 ; get event(buf); al. w1 b9. ; jd 1<11+22 ; send answer(result,answer,buf); se w0 1 ; if result <> 1 then jl x3+0 ; goto link; rl. w0 b21. ; get switch; jl x3+2 ; goto link +2; j3: rs. w0 b20. ; set: outerror:= text; al w0 10 ; rs. w0 b21. ; switch:= 10; jl. j1. ; goto res1; j5: ; check proc: rl w0 x2+18 ; addr:= proc descr addr(mess+18); sn w0 0 ; if addr = 0 then jl. j7. ; goto found; rl w1 74 ; nameaddr:= first device in name table; al w1 x1-2 ; nameaddr:= nameaddr - 2; j6: al w1 x1+2 ; next: nameaddr:= nameaddr + 2; sl w1 (76) ; if nameaddr >= first area in name table then jl. j2. ; goto res2; se w0 (x1+0) ; if addr <> word(nameaddr) then jl. j6. ; goto next; j7: rs. w0 b25. ; found: proc descr addr:= addr; rs. w3 i0. ; save link; rl w3 0 ; sn w3 0 ; if addr = 0 then al. w3 b23.-2 ; addr:= addr(text(<:addr 0:>) - 2); dl w1 x3+4 ; ds. w1 b18.+2 ; dl w1 x3+8 ; move proc name or text ds. w1 b18.+6 ; to procname; al w3 0 ; rs. w3 b21. ; switch:= 0; rl. w3 i0. ; unsave link; jl. j1. ; goto link; e. ; end of check message; ; procedure type(text,link): ; comments: writes a text on the output-terminal. ; call: return: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed ; b.j5 ; begin w.i8: rl. w0 b20. ; checkout: am. (b2.-2) ; rl w1 28 ; se. w1 (b25.) ; if cur proc(record) = proc descr addr se. w0 (b16.) ; or outerror <> <:on:> then jl x3+0 ; goto link; al. w1 b18. ; first addr:= addr(procname); al. w2 b19. ; last addr:= addr(nl); jl. i5. ; goto type3; i9: al. w1 b26. ; type5: first addr:= addr(<:proc:>); al. w2 b19. ; last addr:= addr(nl); jl. i5. ; goto type3; i7: am b20-b14 ; type4: text:= addr(outerror) i3: am b14-b15 ; type1: or <:start:> i4: al. w1 b15. ; type2: or <:stop:>; al w2 x1+2 ; i5: ds. w2 b12. ; type3: save first and last address; rs. w3 i0. ; save link; j1: al w0 0 ; repeat: rl. w1 b13. ; proc:= console descr. addr.; ;HCØ rs w0 x1+12 ; reserver(proc):= 0; al. w3 b10. ; al. w1 b11. ; jd 1<11+16 ; send message(message,name;buf); al. w1 b9. ; jd 1<11+18 ; wait answer(buf;result,answer); bz. w1 b9. ; sn w0 1 ; if result <> 1 se w1 0 ; or status <> 0 then jl. j1. ; goto repeat; jl. (i0.) ; goto saved link; e. ; end of type; i0: 0 ; saved link(common for i1.,i2.,i3.,i4., and i.) ; central code: ; w.i10: ; wait for start: al w2 0 ; event:= 0; jd 1<11+24 ; wait event(event;result,next); jl. w3 i6. ; check message1(buf,link;switch); jl. i10. ; if rejected then goto wait for start; sl w0 0 ; if switch < 0 sl w0 11 ; or switch >= 11 then jl. i21. ; goto start; se w0 0 ; if switch <> 0 then am i7-i9 ; type4(outerror,link) jl. w3 i9. ; else type5(proc,link); jl. i10. ; goto wait for start; i21:al. w3 b3. ; start: jd 1<11+8 ; reserve process(name;result); se w0 0 ; if result <> 0 then jl. i17. ; goto type stop; rs. w0 b6. ; segment no:= 0; rs. w0 b24. ; no of records:= 0; rl. w2 b5.-2 ; get first address; dl w1 110 ; ds w1 x2+a4 ; move(time, error log + addr(time)); jl. w3 i1. ; out segment(link); i11: ; type start: jl. w3 i3. ; type1(<:start:>,link); i12: ; init: rl. w2 b5.-2 ; get first addr; al w3 x2+a2 ; last addr:= first addr + size of max record; ds. w3 b2. ; save first and last addr in error log mess; jl. i23. ; goto clear; i22:jl. w3 i8. ; check: checkout(link); i23:rl. w2 b2.-2 ; clear: al w0 25 ; rs w0 x2+0 ; word(first addr):= 25; al. w3 b0. ; al. w1 b1. ; jd 1<11+16 ; send message(message,name;buf); rs. w2 b8. ; save buf address; i15: ; wait event0: al w2 0 ; event:= 0; i16:jd 1<11+24 ; wait event: wait event(event;result,buf); se w0 1 ; if result <> 1 then jl. i18. ; goto exam message; rl w0 x2+4 ; result:= receiver(buf); jd 1<11+26 ; get event(buf); se w0 1 ; if result <> 1 then jl. i17. ; goto type stop; rl. w1 b2.-2 ; addr:= first addr(error log mess); bz w0 x1+0 ; kind:= byte(addr); sl w0 84 ; if kind < 84 sl w0 86 ; or kind >= 86 then jl. i28. ; goto disc; bz w3 x1+1 ; localkind:= byte(addr+1); se w3 8 ; if localkind <> 8 then jl. i26. ; goto magtape; bz w3 x1+18 ; status:= byte(addr+18); ;***terminal: (2 lines) sn w3 1<9 ; if status = timer then jl. i23. ; goto clear; jl. i29. ; goto update; i26: ; magtape: ;***magtape: (1 line) se w3 18 ; if localkind <> 18 then jl. i29. ; goto update; i27:rl w3 x1+2 ; name: sn. w3 (b22.) ; if word(addr+2) = <:wrk:> then jl. i23. ; goto clear; jl. i29. ; goto update; i28:se w0 62 ; disc: if kind <> 62 then jl. i24. ; goto tra; rl w3 x1+24 ; la. w3 b29. ; ;***disc: (3 lines) se w3 0 ; if event status(record) <> 0 then jl. i23. ; goto clear; jl. i27. ; goto name; i24:se w0 88 ; tra: if kind <> 88 then jl. i29. ; goto update; rl w3 x1+18 ; rl w2 x1+24 ; event:= event status(first sense) ws. w2 b35. ; - timeout; ;***fpa: (3 lines) se w3 0 ; if channel(first sense) = 0 sn w2 0 ; or event = 0 then jl. i23. ; goto clear; i29: ; update: dl w3 x1+4 ; ds. w3 b18.+2 ; dl w3 x1+8 ; move record name ds. w3 b18.+6 ; to proc name; al w2 1 ; wa. w2 b24. ; no of records:= rs. w2 b24. ; no of records + 1; al w2 x1+a3 ; first addr:= addr + size of std record; se w0 86 ; if kind = 86 or kind = 88 then sn w0 88 ; first addr:= first addr - size of std al w2 x2-a3+a2 ; record + size of max record; al w3 x2+a2 ; last addr:= first addr + size of max record; ds. w3 b2. ; save first and last addr; sh. w3 (b5.) ; if last addr <= last addr(log area mess) then jl. i22. ; goto check; jl. w3 i8. ; checkout(link); jl. w3 i1. ; out segment(link;segment no); sh. w0 (b7.) ; if segment no <= size of log area then jl. i12. ; goto init; i17: ; type stop: al. w3 b3. ; jd 1<11+10 ; release process(name); jl. w3 i4. ; type2(<:stop:>,link); jl. i10. ; goto wait for start; i18: ; exam message: jl. w3 i2. ; check message2(buf,link;switch); jl. i15. ; if rejected then goto wait event0; se w0 0 ; if switch <> 0 then jl. i30. ; goto check10; rl. w2 b8. ; buf:= saved buf address; jd 1<11+82 ; regret message(buf); jl. w3 i9. ; type5(proc,link); jl. i23. ; goto clear; i30:se w0 10 ; check10: if switch <> 10 then jl. i19. ; goto stop; jl. w3 i7. ; type4(outerror,link); jl. i15. ; goto wait event0; i19:rl. w2 b8. ; stop: buf:= saved buf address; jd 1<11+82 ; regret message(buf); jl. w3 i1. ; out segment(link); jl. i17. ; goto type stop; ; ; end of central code; i20: 0,r.50 ; first word(buffer); ; init code: ; ; comments: the following code ; 1) initialize the name of the terminal by means of ; !device no of output-terminal!, ; 2) initializes the !errorlog!, ; 3) creates and reserves an area process for the !rclogarea!, ; and output the time in segment 0, ; 4) and examines whether there is room for the log ; buffer or not. ; in case of an unacceptable result during this job, an error ; message is send to the output-terminal ; and the program will be running after error. ; w.g5: ; entry point: al w1 a1 ; proc:= ls w1 -5 ; word(device no of output-terminal * 2 wa w1 74 ; + first device in name table); rl w1 x1+0 ; rs. w1 b13. ; output-terminal descr. addr.:= proc; dl w3 x1+4 ; ds. w3 b10.+2 ; dl w3 x1+8 ; ds. w3 b10.+6 ; name of output-terminal:= name(proc); al. w3 b0. ; jd 1<11+4 ; process description(name;result); sn w0 0 ; if result = 0 then jl. e0. ; goto error0; al. w3 b3. ; al. w1 g5.-20 ; jd 1<11+42 ; lookup entry(tail,name;tail); rl w1 x1+0 ; al w1 x1-1 ; rs. w1 b7. ; size of log area:= size(tail); jd 1<11+52 ; create area process(name); jd 1<11+8 ; reserve process(name;result); se w0 0 ; if result <> 0 then jl. e1. ; goto error1; am (66) ; rl w1 24 ; top address:= top address(own process); al. w2 i20. ; first address:= addr(first address(buffer)); al w3 x2+a0 ; last address:= first address + size of error log buffer; sl w3 x1+0 ; if last address >= top address then jl. e2. ; goto error2; ds. w3 b2. ; save first and last address in error log ds. w3 b5. ; message and log area message; dl w1 110 ; ds w1 x2+a4 ; move(time, error log + addr(time)); jl. w3 i1. ; out segment(link); jl. i11. ; goto type start; b30:<:no errorlog <10>:> b31:<:no rclogarea <10>:> b32:<:proc size too small<10>:> e0: am b30-b31 ; error0: text:= (b30:b31) e1: am b31-b32 ; error1: or (b31:b32) e2: al. w1 b32. ; error2: or (b32:e0) al w2 x1+12 ; jl. w3 i5. ; type3(text,link); jl -1 ; running after error; ; end of init code; e. ; end of central codesegment; ; information for insertproc: ; g3: ; g0: g1: ; first and last tail (:g3-g2+511:) > 9 ; no of segments 0,0,0,0 ; name 0 ; date 0 ; 0 ; 3<12+g5-g2 ; contents, entry g3-g2 ; length d. p.<:insertproc:> scope user watchdog \f outrclog=set 60 disc outrclog=algol begin <* ehp 810302 program til udskrivning af error log from drivers. programkald : programnavn errorlog.tt tt ::= test / andet error loggen består af et antal poster i en bs-fil første segment indeholder kun 1 post,der alene angiver et starttidspunkt. hvis filen er helt fyldt op, findes der ikke nogen slutmarkering. posterne i filen er sorteret i tidsrækkefølge, mens udskriften skal være opdelt efter devicenummer. devicenummeret står desværre ikke i posten, men skal søges i monitorens devicetabel. der er en entydig sammenhæng mellem devicenr. og procesbeskrivelsesadressen men det er naturligvis vigtigt, at det er den samme monitor ved udskrivningen som ved genereringen af posterne. udskriften omfatter 4 grupper: 1) disc, 2) fpa, 3) subprocess og 4) break. poster med name1 = <:wrk:> udskrives ikke. *> \f integer i,ii,j,jj,adr,hash,bit, post,postantal, maxdev, <* antallet af devicenumre i monitoren *> specdev, <* antallet af specielle typer *> devno,kind,local_kind,gllocal_kind, segmprcyl,segmprhead,cyl,head,sector,rest, oper,mode, stdrec,maxrec, gloper,glmode, beregnet_char, command, linietæller,sidetæller,maxlinier, maxhash; <* et tal >= maksimale antal forskellige forekommende processer *> real dato,kl,kl1,s_dato,s_kl,mill,cpu,rtid,tid,gltid,starttid; boolean ff,nl,sp, test, disc, fpa, sub, tape, disc3600, card; integer field førsteord, current_proc; long array field procnavn; integer array field word; long field time; long array glnavn(1:2), monnavn(1:2); integer array core(0:20); <* bestemmelse af størrelse på devicetabellen *> system(5,74 <* første device i navnetabellen *>, core); maxdev := ( core(1) - core(0) )/2; specdev := 47; system(5,1192,monnavn); if monnavn(1) = long <::> then monnavn(1):= long <:rc8000:>; systime(1,0,mill); dato := systime(4,mill,kl); stdrec := 34; maxrec := 74; procnavn := 0; førsteord := 2; word := 8; current_proc := 28; time := 32; maxlinier := 48; <* udskriftslinier pr side *> maxhash := 70; nl := false add 10; sp := false add 32; ff := false add 12; \f begin integer array procadr(0:maxdev+specdev), <* monitorens devicetabel + special devices *> hashproc(0:maxhash); <* hjælpetabel til undersøgelse af om en procadr er behandlet *> zone fil(2*128,2,ende); procedure ende(z,s,b); zone z; integer s,b; if s extract 1 = 1 then stderror(z,s,b) else begin <* ikke flere poster *> goto gennemløb_slut; end; integer procedure beregn_hash(adr); value adr; integer adr; begin <* proceduren finder adr eller en tom plads i tabellen hashproc *> integer h,t; h:=(adr shift (-1)) mod maxhash -1; t:=0; <* t skal forhindre cykling i fyldt hashproc tabel *> for h:=(h+1) mod maxhash while t<=maxhash and adr <> hashproc(h) and -1 <> hashproc(h) do t:= t+1; if t>maxhash then system(9,adr,<:<10>prog.f:>); beregn_hash := h; end procedure beregnhash; <* indlæsning af fp-kaldet og åbning til errorloggen *> begin array navn(1:2); test := system(4,2,navn) = 8 shift 12 + 10 <* . navn *> and navn(1) = real <:test:> ; system(4,1,navn); i:= 1; open(fil,4,string navn(increase(i)),1 shift 18); end; <* find adressen på første device i monitorens navnetabel, og hent procesbeskrivelsesadresserne *> system(5,74 <* first dev i navnetabel *>, core ); system(5,core(0),procadr); <* procadr(0:maxdev-specdev) indeholder nu adresser på alle devices i monitoren. procadr(maxdev+1:maxdev+specdev) skal bringes til at indeholde de mulige andre tal, der kan forekomme i current proc feltet. i første omgang anvendes tallene fra 0 - 16. *> for i:=1 step 1 until specdev do procadr(i+maxdev) := i -1; <* div initialiseringer før den centrale løkke *> if test then begin write(out,nl,5,<:navnetabel:>); for i:=0 step 1 until maxdev + specdev do write(out,nl,1,<< ddd>,i,<< dddddd>,procadr(i)); cpu:=systime(1,0,rtid); end; for i:= maxhash step -1 until 0 do hashproc(i) := -1; <* indlæsning af start tidspunktet *> inrec_6(fil,2); inrec_6(fil,stdrec-2); starttid:= fil.time; s_dato := systime(4,fil.time/10000,s_kl); <* først undersøges hvilke devicenumre der forekommer i filen. adresserne indsættes i hashproc tabellen *> postantal := 0; setposition(fil,0,1); for j:= 1 step 1 until 500000 do begin setposition(fil,0,j); i:= - stdrec; for i:= i + stdrec while (512 - i) >= maxrec do begin inrec_6(fil,2); kind:= fil.førsteord shift (-12); local_kind:= fil.førsteord extract 12; if kind = 86 or kind = 88 then begin inrec_6(fil,maxrec-2); i:= i + maxrec - stdrec; end else inrec_6(fil,stdrec-2); if local_kind = 25 or starttid > fil.time then goto gennemløb_slut; adr := fil.current_proc; if kind <> 0 then begin hash := beregn_hash(adr); hashproc(hash) := adr; end; postantal:= postantal + 1; end; end; gennemløb_slut: if test then write(out,nl,2,<:postantal ::>,postantal); <* dernæst gennemløbes filen igen, en gang for hvert forekommende device *> for devno := 0 step 1 until maxdev + specdev do if hashproc( beregn_hash(procadr(devno))) <> -1 then begin <* start på nyt device *> linietæller := 10000; <* sideskift *> sidetæller := 1; if devno > maxdev then disc := fpa := sub := false else begin <* bestemmelse af kind *> system(5,procadr(devno),core); kind := core(0); disc := kind=62 and procadr(devno) >= 100; fpa := kind=86 or kind=88 and procadr(devno) >= 100; sub := -,disc and -,fpa and procadr(devno) >= 100; if kind = 62 then begin segmprcyl:= core(18); segmprhead:= core(16); end; end; <* markering i hashtabel *> hash := beregn_hash(procadr(devno)); hashproc(hash) := hashproc(hash) + 1_000_000; j:= 0; ii:= 512; for post := 1 step 1 until postantal do begin ii:= ii + stdrec; if 512 - ii < maxrec then begin j:= j + 1; setposition(fil,0,j); ii:= 0; end; inrec_6(fil,2); kind:= fil.førsteord shift (-12); local_kind:= fil.førsteord extract 12; if kind = 86 or kind = 88 then begin inrec_6(fil,maxrec-2); ii:= ii + maxrec - stdrec; end else inrec_6(fil,stdrec-2); if fil.current_proc = procadr(devno) <***wrk-name: (2 linier) *> and (fil.procnavn(1) shift (-24) <> long <:wrk:> shift (-24) ) then begin <* udskrivning af post *> tape:= local_kind = 18 and sub; disc3600:= local_kind = 6 and sub; linietæller := linietæller + 1; if linietæller > maxlinier then begin <* overskrift *> writeint(out,ff,1); write(out, sp,11-writeint(out,monnavn), sp,32,<:period::>,sp,10); outdate(out,round s_dato); writeint(out,<: :>); outdate(out,round s_kl ); writeint(out,<: - :>); outdate(out,round dato); writeint(out,<: :>); outdate(out,round kl ); writeint(out,nl,2,<:error log for device no::>, << ddd>,devno,sp,61, <:page::>,<< ddd>,sidetæller,nl,1); if sub then begin writeint(out,nl,1, <:kind procname <----------- message ----------->:>, sp,2, <:<------------------- answer -------------------> :>, <:date and time:>, nl,2,sp,17, <:oper.mode 2.word 3.word 4.word:>,sp,2, <:status 0:11 12:23 halfw char 4.word 5.word:>,nl,1); end else if disc then writeint(out,nl,1,<:disc: :>, sp,42,<:<- cur -> < event > <------ detailed ------>:>, nl,2,sp,54, <:plswhm d iddhpcibb fdpccdd.msd--a-+-wowvhsw:>, nl,1,sp,54, <:ooerio e naaaooruu aroouaa.ueismtsohrfroeer:>, nl,1,sp,54, <:wceigd v tttrsmuss ciwmitt.lcayatefeifrlaei:>, nl,1,sp,10,<:first first:>,sp,14,<:tra remain :>, <:eakthe . eaadimptp evemnaa.ttgnrerfatcdtdkt:>, nl,1, <:op.mode addr. segm. cyl hea sec seg io char :>, <:rl e k reo tutia ccccsco.ioncknvsdfyfff p:>, sp,1,<:date and time:>,nl,1) else if fpa then begin writeint(out,nl,1); writeint(out, sp,11-writeint(out,fil.procnavn), sp, 6,<:<cur> < event>:>, sp,20,<:<cur> < event>:>, sp,20,<:<cur> < event>:>,nl,2, <:first ddb rptbbsbb:>,sp,3, <:second ddb rptbbsbb:>,sp,3, <:standard ddb rptbbsbb:>,nl,1, <:sense iel eailutuu:>,sp,3, <:sense iel eailutuu:>,sp,3, <:status iel eailutuu:>,nl,1, sp,18,<:svo srmosass:>, sp,21,<:svo srmosass:>, sp,21,<:svo srmosass:>,nl,1, sp,18,<:c.. eie.pttc:>, sp,21,<:c.. eie.pttc:>, sp,21,<:c.. eie.pttc:>,nl,1, <:channel rem.ch. oko ttolauio:>,sp,3, <:channel rem.ch. oko ttolauio:>,sp,3, <:channel rem.ch. oko ttolauio:>,sp,2, <:date and time:>,nl,1); end; linietæller := if sub then 9 else if disc then 13 else if fpa then 13 else 9; sidetæller := sidetæller + 1; <* dokumentnavnet samt datoen,operation og mode (og local_kind, hvis sub) skal altid udskrives øverst på en ny side *> glnavn(1):= 0; gltid := 0; gloper := glmode := -1; gllocal_kind := -1; end overskrift; writeint(out,nl,1); if sub then writeint(out,sp,5-( if gllocal_kind = local_kind then writeint(out,<: -:>) else writeint(out,<<-dd>,local_kind) ) ); gllocal_kind:= local_kind; if -,fpa and -,disc then writeint(out,sp,11-( if glnavn(1)=fil.procnavn(1) and glnavn(2)=fil.procnavn(2) then writeint(out,<: -:>) else writeint(out,fil.procnavn) )); if disc then begin if glnavn(1)<>fil.procnavn(1) or glnavn(2)<>fil.procnavn(2) then begin writeint(out,fil.procnavn,nl,1); linie_tæller:= linie_tæller + 1; gloper:= -1; end end; glnavn(1) := fil.procnavn(1); glnavn(2) := fil.procnavn(2); if sub then begin <* operation og mode *> oper := fil.word(1) shift (-12); mode := fil.word(1) extract 12; if oper <> gloper then begin if tape then begin if oper >= 0 and oper <= 14 then i := writeint(out,case oper+1 of( <: sen:>,<::>,<::>,<: inp:>, <::>,<: out:>,<: era:>,<::>, <: mov:>,<::>,<: tm:>,<::>, <::>,<::>,<: set:>)) else i:= 0; if oper<0 or oper > 14 or i<1 then writeint(out,<<-ddd>,oper) else writeint(out,sp,4-i); end else begin if oper >= 0 and oper <= 5 then i:= writeint(out,case oper+1 of( <: sen:>,<::>,<::>,<: inp:>, <::>,<: out:>)) else i:= 0; if oper < 0 or oper > 5 or i < 1 then writeint(out,<<-ddd>,oper) else writeint(out,sp,4-i); end; gloper := oper; end else writeint(out,<: - :>); if mode <> glmode or (oper <> 3 and oper <> 5 and oper <> 14) then begin if oper = 3 <* inp *> or oper = 5 <* out *> or oper =14 <* set *> then begin if tape then i := writeint(out,case (mode extract 3)+ 1 of( <: pe :>,<::>,<: pee:>,<::>, <: nrz:>,<::>,<: nrze:>,<::>)) else i := 0; if i=0 then writeint(out,<<-dddd>,mode); glmode := mode; end else begin glmode := -1; writeint(out,<<-dddd>,mode); end; end else writeint(out,<: - :>); writeint(out,sp,1, <<-ddddddd>,fil.word(2),fil.word(3)); if oper = 3 <* input *> or oper = 5 <* output *> and -,disc3600 then begin <* i stedet for det irrelevatne word(message+14) (= fil.word(4) ) udskrives et beregnet antal karakterer *> beregnet_char := (fil.word(3)-fil.word(2)+2)*1.5 -(mode shift(-4)*((oper=5) <* output *> extract 1)); writeint(out,if beregnet_char = fil.word(7) then <: :> else if beregnet_char > fil.word(7) then <: -:> else <: +:>, <<-ddddd>,beregnet_char,sp,2); end else writeint(out,<<-ddddddd>,fil.word(4),sp,2); bit := fil.word(5); for i := 1 step 1 until 12 do begin outchar(out,if bit < 0 then 49 <* 1 *> else 46 <* . *>); bit := bit shift 1; end; bit:= fil.word(5) extract 12; writeint(out,<<-ddd>,bit); writeint(out, <<-ddddddd>,fil.word(6),fil.word(7), fil.word(8),fil.word(9)); end else if disc then begin <* operation *> oper := fil.word(1) shift (-12); if oper <> gloper then begin if oper=3 then writeint(out,<:inp:>) else if oper=5 then writeint(out,<:out:>) else if oper=0 then writeint(out,<:sen:>) else writeint(out,<<-dd>,oper); gloper := oper; end else writeint(out,<: - :>); cyl:= fil.word(3)//segmprcyl; rest:= fil.word(3) mod segmprcyl; head:= rest//segmprhead; sector:= fil.word(3) mod segmprhead; writeint(out,<<-ddd>,fil.word(1) extract 12); writeint(out, <<-ddddddd>,fil.word(2), fil.word(3), <<-ddd>, cyl, <<-ddd>, head, (if fil.word(4) shift (-12) + sector <= segmprhead then <: :> else <:*:>), <<-dd>, sector, <<-dddd>, fil.word(4) shift (-12), <<-ddd>, fil.word(5), <<-ddddddd>,fil.word(6), sp,2); bit := fil.word(7); for i:= 0 step 1 until 71 do begin if i = 24 or i = 48 then begin writeint(out,sp,2); bit := if i = 24 then fil.word(8) else fil.word(9); end; if i = 16 then begin writeint(out,<<-dd>,bit shift (-16)); i:= 23; end; jj:= case i + 1 of ( 0, 0,-1,-1,-1, 0,-1,-1, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1, 0, 0,-1, 0, 0, 0, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); if jj = 0 then outchar(out,if bit < 0 then 49 <* 1 *> else 46 <* . *>); bit := bit shift 1; end; end else if fpa then begin <* start byte, status byte og channel program *> writeint(out,nl,1,<:start :>); bit:= fil.word(9); for i:= 1 step 1 until 8 do begin outchar(out,if bit < 0 then 49 else 46); bit:= bit shift 1; end; writeint(out,nl,1,<:statu :>); bit:= fil.word(9) extract 12 shift 12; for i:= 1 step 1 until 8 do begin outchar(out,if bit < 0 then 49 else 46); bit:= bit shift 1; end; for i:= 17 step 3 until 29 do begin command:= fil.word(i) shift (-8) extract 3; writeint(out,case command + 1 of ( <: sen:>,<: rea:>,<: *2*:>, <: wri:>,<: wai:>,<: *5*:>, <: con:>,<: sto:>)); if command = 0 then writeint(out,<<-ddddddd>,fil.word(i+1)); if command = 1 or command = 3 then writeint(out, <<d>,fil.word(i) shift (-7) extract 1, <<-ddddddd>,fil.word(i+1), fil.word(i+2)); if command = 7 then i:= 29; end; writeint(out,nl,1); for i:= 5,13,1 do begin writeint(out,<<-dddddd>,fil.word(i),sp,2, fil.word(i+1),sp,2); for jj:= 0,21,23 do outchar(out,if fil.word(i+2) shift jj < 0 then 49 else 46); writeint(out,sp,2); for jj:= 0,1,2,4,20,21,22,23 do outchar(out,if fil.word(i+3) shift jj < 0 then 49 else 46); if i <> 1 then writeint(out,sp,3); end; linietæller:= linietæller + 3; end; tid:=systime(4,fil.time/10000 +0.0,kl1); tid := round(tid) mod 10000 ; if tid <> gltid then write(out,<< dd.dd>,tid/100,sp,2) else writeint(out,<: - :>); outdate(out,round kl1); gltid := tid; <* slut med udskrift af linie *> end; end for post; end for devno; <* udskrift for special *> linietæller:= 10000; <* sideskrift *> sidetæller:= 1; j:= 0; ii:= 512; for post:= 1 step 1 until postantal do begin ii:= ii + stdrec; if 512 - ii < maxrec then begin j:= j + 1; setposition(fil,0,j); ii:= 0; end; inrec_6(fil,2); kind:= fil.førsteord shift (-12); if kind = 86 or kind = 88 then begin inrec_6(fil,maxrec-2); ii:= ii + maxrec - stdrec; end else inrec_6(fil,stdrec-2); if kind = 0 then begin linietæller:= linietæller + 1; if linietæller > maxlinier then begin <* overskrift *> writeint(out,ff,1); writeint(out, sp,11-writeint(out,monnavn), sp,32,<:period::>,sp,10); outdate(out,round s_dato); writeint(out,<: :>); outdate(out,round s_kl ); writeint(out,<: - :>); outdate(out,round dato); writeint(out,<: :>); outdate(out,round kl ); writeint(out,nl,2,<:error log for special reasons:>,sp,61, <:page::>,<< ddd>,sidetæller,nl,2); writeint(out,<:procname:>, sp,3, <: w0 w1 w2 w3:>, <: status ic cause sb:>, <: (ic-4) (ic-2) date and time:>,nl,1); linietæller:= 7; sidetæller:= sidetæller + 1; glnavn(1):= 0; gltid:= 0; end overskrift; writeint(out,nl,1); writeint(out,sp,11-( if glnavn(1)=fil.procnavn(1) and glnavn(2)=fil.procnavn(2) then writeint(out,<: -:>) else writeint(out,fil.procnavn) )); for i:= 1 step 1 until 10 do writeint(out,<< -ddddddd>,fil.word(i)); tid:= systime(4,fil.time/10000 +0.0,kl1); tid:= round(tid) mod 10000; if tid <> gltid then write(out,<< dd.dd>,tid/100,sp,2) else writeint(out,<: - :>); outdate(out,round kl1); gltid:= tid; end; end; close(fil,true); if test then begin <* udskrift af hashtabel *> write(out,ff,1,<:testudskrift:>,nl,2,<: nr adresse:>); for i:= 0 step 1 until maxhash do writeint(out,nl,1,<< ddd>,i,<< -dddddd>,hashproc(i)); <* udskrift af tidsforbrug *> cpu:= systime(1,rtid,rtid) - cpu; write(out,nl,2,<:cpu og real tid :>,<< dddd.d>,cpu,rtid); end; <* check af at alle current proc. er udskrevne *> linietæller := 10000; for i := 0 step 1 until maxhash do if hashproc(i) <> -1 and hashproc(i) < 1_000_000 then begin <* en current proc uden udskriftsmarkering *> if linietæller > maxlinier then begin writeint(out,ff,1, <:the following current processes were not found in the monitor:>,nl,2); linietæller := 2; end; writeint(out,nl,1,<:current proc. ::>,hashproc(i)); linietæller := linietæller + 1; end for i; if -,test then write(out,ff,1); end; end scope user outrclog \f rclog=set 2 disc rclog=copy ø.1 job user-name project-number time 10 01 output 500000 ; eks. ehp 234567 do x3.errorsnoop process description, if w0.ne.0, x1.0.stop, send message wait answer, write w0 x1.word.2 end, fi, exit o lp if ok.no o log outrclog rclogarea.andet o c do x3.errorsnoop process description, if w0.ne.0, x1.0.start, send message wait answer, write w0 end, fi, exit convert log finis ø scope user rclog lookup rclogarea watchdog outrclog rclog end finis ▶EOF◀