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