|
|
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: 168192 (0x29100)
Types: TextFile
Names: »tread«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦0b92c64d5⟧ »ctb«
└─⟦this⟧
(bread = set 1 disc
bread = slang proc.options
scope user bread
print bread integer words.4 0.6
)
b. w.
p.1
s0=0,s1=0 ; clear checksums
s. h10 ,q0 w. ; h-names used for initialization links...
; rc 21.06.71 reader read ...1...
h9 , h10 ;
78 09 15, 64; version id:
m. boss 2 tread
; the reader coroutine is activated from some pseudo-job by an
; operation defining input buffer and reading mode.
;
; in both cases the reader waits for a paper tape to be inserted
; in rc 2000 and starts reading in the specified mode.
;
; if boss controlled input is ordered, the input buffer pages
; will be filled untill end of tape is read, and an end medium
; character is added to the character string. any parity error
; will be converted to one substitute character followed by 0
; to 2 null-characters without further error indication.
;
; if job controlled input is ordered, each buffer page is
; structured in blocks, each one headed by the first 3 words
; in the input answer. if no errors are detected during reading
; each block will occupy an entire page. if an parity error is
; detected the block length will be decreased in such a way that
; the last word in the block will contain the erroneous character
; as a substitute character and 0 to 2 null characters.
; if the unused part of the buffer page is greater than 20 words
; a new block is inserted here and so on.
;
;
; the following options define the coroutine
;
; i39 job controlled input buffer on disc/drum (1/0)
; i40 boss controlled input buffer on disc/drum (1/0)
; i41 job controlled input buffer length (in pages)
; i42 boss controlled input buffer length (in pages)
; i43 coroutine on disc or drum (1 or 0)
;
; the names in the code are used as follows:
;
; a-names local labels
; b-names global variables
; c-names global labels
; f-names variables in initialization
; j-names local variables
;
; the pages are used as follows:
;
; page 0 code and constants
; page 1 variables
; page 2 unused
; page 3 request line or free
; page 4 input buffer or free
; format of operation:
; op+ 0 : chain
; + 2 : controller (1 or 2 or 3) (i.e. boss- or job- controlled or special input device)
; + 4 : answer semaphore
; + 6 : mode (0, 2, 4 or 6)
; + 8 : not used
; +10 : not used
; +12 : virtual request line address
; +14 : reader device number
\f
; rc 04.07.71 initialize reader read ...2...
s. a20, b50, c10, d50, f35 w.
q0:
f24:
k=10000
f25=k-f24
; externals in code:
b2., b3., b4., b5., b6., b9., b10., b14., b29., b36., b37.
; externals in initialization:
f2., f3., f4., f5., f10., f14., f17., f21., f22.
h0: h1 ; define link for initialization;
jl. f30. ;
; reader variable page:
d0 = k , 0, 0 ; start of variable page
d1 = k-d0 ,<:readername:>; process name;
0 ; name table address;
d43 =k-d0, <:bsfilename:> ; name of discfile, taken from the requestline
; messages:
d2 = k-d0 , 3<12+0 ; input message;
d3 = k-d0 , 0 ; first,
d4 = k-d0 , 0 ; last of buffer;
d5 = k-d0 , 3<12+4 ; empty reader message;
d6 = k-d0 , 0 ; first,
d7 = k-d0 , 0 ; last of buffer;
; operations:
d10 = k-d0 , 0, 4<12 ; release reader operation;
d11 = k-d0 , 0 ; answer semaphore;
d42 = k-d0 , 0 ; reader device no
; semaphores and virtuel adresses:
d12 = k-d0 , 0 ; boss super buffer, first virt;
d13 = k-d0 , 0 ; - top virt;
d14 = k-d0 , 0 ; - free sem;
d15 = k-d0 , 0 ; - full sem;
d16 = k-d0 , 0 ; job super buffer, first virt;
d17 = k-d0 , 0 ; - top virt;
d18 = k-d0 , 0 ; - free sem;
d19 = k-d0 , 0 ; - full sem;
d20 = k-d0 , 0 ; page count;
d25 = k-d0 , 0 ; reader operation semaphore;
\f
; lkn 76.10.20 read ...3...
; counters:
d31 = k-d0 , 0 ; buffer count;
d32 = k-d0 , 0 ; rest buffer;
; booleans:
d35 = k-d0 , 0 ; boss or job controlled or special device (0=boss controlled
; 1=job -
; 2=speceial);
d36 = d35+1 ; buffer reservation (0=not reserved);
d37 = k-d0 , 0 ; std or rb reader (0=std);
; work variables:
d40 = k-d0 , 0 ; work;
d41 = k-d0 , 0 ; rel answer on buffer page;
f1 = k-d0 ; length of page 1 (=variable page);
; variables for initialization:
; f0 ; length of page 0;
; f1 ; length of page 1 (variable page);
f2: 12 ; reserve virt;
f3: 13 ; move to virt;
f4: 14 ; simulate lock;
f5: 15 ; end init;
f6: i41<9 ; job buffer length in bytes;
f7: i42<9 ; boss buffer length in bytes;
; f8 ; rel entry on page 0;
h.f9: 0<3+e86, f8 w. ; test mode, rel entry;
f10: 0 ; base of externals;
f11: 0 ; sense message;
f12: 0,r.8 ; answer area;
f13: 0,r.5 ; first of corune descr;
; f14 ; std reader operation sem;
f16: 0 ; corunocount
h.f17: e12*(:e52+e53:),18 w.;addr of coruno descr;
; f18 ; reserve area;
f19: <:readername:>,0; process name;
f20: 0 ; work;
h.f21: (:e13*5+2:)*(:e52+e53:),19 w.; reservation of semaphores;
f33: -1 ; boolean device 0 = reader (-1 = no 0 = yes);
h.f34: 0 , r.e52 w.; std reader table (from options);
f30: am (66) ;
dl w1 +74 ; catalog base:=
al. w3 f11. ; maxbase(boss);
jd 1<11+72;
al. w1 f34. ; w1:=start of reader table;
a1: bl w2 x1 ; w2:=device no;
sn w2 0 ; if device no = 0 then
rs. w2 f33. ; device 0 = reader;
\f
; lkn 76.10.20 read ...4...
ls w2 1 ;
wa w2 74 ; w2:=name table address of reader;
rl w2 x2 ; w2:=process descr address;
rs. w1 f20. ; save w1 in work;
dl w1 x2+4 ; move reader name;
ds. w1 f19.+2 ;
dl w1 x2+8 ;
ds. w1 f19.+6 ;
rl. w1 f20. ;
al w1 x1+1 ; w1:=address of next reader;
se. w1 f34.+e52; if more readers then
jl. a1. ; continue;
rl. w0 f33. ;
se w0 0 ; if device 0 <> reader then
c.-1, o65, z. ; (boss fault xref);
jd -65 ; boss fault 65;
; reserve and move page 0 to virt:
al w0 i43 ; w0:=reserve on disc;
al w1 f0 ; w1:=length of page 0;
jl. w3 (f2.) ; reserve virt;
rs. w2 f13.+6 ; page 0:=w2;
al. w0 b0. ; w0:=first of page 0;
al w1 f0 ; w1:=length of page 0;
jl. w3 (f3.) ; move page 0 to virt;
; set externals:
jl. w3 (2) ; set externals;
f22: 40 ;
f14: (:2*e13:)<12+19,56; local reader operation sem;
0 , -1000 ; end of externals;
; set and initialize externals on variable page:
f31: rl. w2 f21. ; w2:=current semaphore address;
rs. w2 d0.+d14; set boss reader free address;
al w0 i42 ;
rs w0 x2 ; initialize boss reader free;
al w2 x2+e13 ;
rs. w2 d0.+d15; set boss reader full address;
al w2 x2+e13 ;
rs. w2 d0.+d18; set job reader free
al w0 i41 ;
rs w0 x2 ; initialize job reader free sem
al w2 x2+e13 ;
rs. w2 d0.+d19; set job reader full sem
al w2 x2+e13 ;
rs. w2 d0.+d11; set release reader answer semaphore;
al w2 x2+e13 ;
rs. w2 d0.+d20; set page count;
al w2 x2+2 ;
rs. w2 f21. ; set current sem address;
rl. w1 f16. ; w1:=coruno tÆller;
rl. w2 f14. ; w2:=local reader operation sem;
sl w1 e52 ; if rb reader then
am e13 ; w1 <> 0 else
al w1 0 ;
hs. w1 d0.+d37; set boolean (local or rb reader);
wa w2 2 ; w2:=reader operation sem;
rs. w2 d0.+d25; set operation sem on variable page;
\f
; lkn 76.10.20 read ...5...
; reserve boss contr buffer and set virt addresses:
al w0 i40 ; w0:=reserve on disc;
al w1 512 ; w1:=page size;
al w2 i42 ; w2:=number of pages;
jl. w3 f18. ; reserve area;
al w2 x2+513 ; w2:=top virt + writing;
rs. w2 d0.+d13; set top virt;
ws. w2 f7. ; w2:=top virt - length in bytes;
rs. w2 d0.+d12; set first virt;
; reserve job controlled buffer and set virt addresses
al w0 i39 ; w0:=reserve on disc
al w1 512 ; w1:=length of page
al w2 i41 ; w2:=number of pages
jl. w3 f18. ; reserve area;
al w2 x2+513 ; w2:=top virt + writing
rs. w2 d0.+d17; set top virt
ws. w2 f6. ; w2:=top virt-length in bytes
rs. w2 d0.+d16; set first virt
; reserve and move variable page to virt;
al w0 i43 ; w0:=reserve on disc;
al w1 f1 ; w1:=length of variable page;
jl. w3 (f2.) ; reserve virt;
al w2 x2+1 ; w2:=virt addr + writing;
rs. w2 f13.+8 ; page 1 := w2;
al. w0 d0. ; w0:=first of page 1;
al w1 f1 ; w1:=length of page 1;
jl. w3 (f3.) ; move page 1 to virt;
al w0 450 ; w0:=first coroutine number;
wa. w0 f16. ; w0:=actual coroutine number;
ls w0 15 ;
lo. w0 f9. ;
rs. w0 f13.+4 ; set test mode, rel entry in coruno descr;
rl. w2 f17. ; w2:=address of coruno descr;
dl. w1 f13.+2 ; move coruno descr;
ds w1 x2+2 ;
dl. w1 f13.+6 ;
ds w1 x2+6 ;
rl. w0 f13.+8 ;
rs w0 x2+8 ;
al w1 x2 ; w1:=coruno descr address;
al w2 x2+e12 ; w2;=next coruno descr;
rs. w2 f17. ; save next coruno descr addr;
\f
; lkn 76.10.20 read ...6...
; simulate lock and goto init next or exit init;
rl. w2 d0.+d25;
jl. w3 (f4.) ; simulate lock;
rl. w1 f16. ; w1:=coruno tÆller
al w1 x1+1 ; +1;
rs. w1 f16. ; coruno tÆller := w1;
se w1 e52+e53; if coruno tÆller<number of readers
jl. f31. ; then continue
jl. w3 (f5.) ; else exit init;
; reserve area
; w0 = reserve on disc
; w1 = page length
; w2 = no of pages
; on exit w2 = virt address of last page
b. a0, j1, w.
f18: rs. w3 j1. ; save return;
hs. w2 j0. ; rest:=no of pages;
a0: sn w1 x1+0 ; return: if rest=0 then
jl. (j1.) ; return;
bz. w3 j0. ;
al w3 x3-1 ; rest:=rest-1;
hs. w3 j0. ;
al. w3 a0. ; w3:=return;
jl. (f2.) ; reserve virt;
j0=a0+1 ; define rest address;
j1: 0 ; saved return;
e.
; move reader table:
b. a2 w.
a1: al. w1 e51.+f25-4; w1:=first of reader table (in options);
al. w2 f34. ; w2:=first of reader table (in init code);
a2: bl w0 x1 ; move byte from table to table;
hs w0 x2 ;
al w1 x1+1 ;
al w2 x2+1 ;
se. w2 f34.+e52; if top of table then
jl. a2. ;
al w0 0 ;
al w2 0 ; return to slang;
jl x3 ;
jl. a1. ;
j.
e.
\f
; lkn 76.10.20 read ...7...
; start of reader page:
;
; definition of b-names:
b0: 0 ; page 0: code and constants
b1: 0 ; page 1: variables
0 ; page 2: unused
0 ; page 3: request line or free
0 ; page 4: input buffer or free
60<12 +0 ; pageident: tape reader;
; cl entries:
b2: 1 ; send and wait;
b3: 3 ; lock simple;
b4: 4 ; open simple;
b5: 5 ; lock chained;
b6: 6 ; open chained;
b9: 9 ; send and wait slow;
b14: 26 ; current coroutine;
b37: 7 ; get pages;
; semaphores:
b29: 67 ; banker queue;
b36: 51 ; request queue;
; messages:
b17: 0<12 +2 ; sense ready message;
0,0,0,0,0,0,0 ; input mode and bsfilename in sense ready message;
b18: 0 ; timer message
5 ; seconds to wait
b40: 9<12+1 ; output of request line in operator mode;
0 ; first,
b41: 0 ; last of line;
b42: 0 ; process description address
b43: <:host:>,0,0,0 ; name of host-process
b44: <:clock:>,0,0,0 ; name of clock process
; constants:
b20: -1-1<23-1<22-1<17-1<16-1<13-1<12-1<1 ; error bits, give up bits, not normal answer bits
; answer
128<16+25<8 ;-6 tro
25<16 ;-4 tre
0<16+25<8 ;-2 trn
b21: 25<16 ; end medium character;
b22: 1<21 ; mask for timer status
b34: 0 ; zero for set catalog base;
\f
; lkn 76.10.20 read ...8...
; start of reader coroutine:
;
; wait for operation:
b. a10 w.
c0: al w0 0 ;
hs w0 x3+d36 ; buffer reserved:=false;
rl. w2 (b14.) ;
rs w0 x2+14 ; page 4 descr:=unused;
am (66) ;
dl w1 +74 ; set cat base (=boss max base);
al. w3 b34. ;
jd 1<11+72;
rl. w3 b0.+2 ;
bl w0 x3+d37 ; w0:=boolean (std or rb reader);
al w3 x3+d1 ; w3:=process name;
se w0 0 ; if std reader then
jl. a10. ;
jd 1<11+10; release process
jl. a9. ; else
a10: jd 1<11+64; remove process
a9:
rl. w3 b0.+2 ; w3:=abs page 1;
rl w2 x3+d25 ; w2:=reader op sem;
jl. w3 (b5.) ; lock chained(w2);
f8=k-b0
rs w1 x3+d40 ; save abs ref operation;
rl w2 x1+14 ;
rs w2 x3+d42 ; save reader device number
ls w2 1 ;
wa w2 74 ; w2:=name table addr of reader;
rs w3 x3+d1+8 ; destroy nta;
rl w2 x2 ; w2:=process descr address;
dl w1 x2+4 ; move reader name;
ds w1 x3+d1+2 ;
dl w1 x2+8 ;
ds w1 x3+d1+6 ;
al. w3 b34. ; w3:=abs ref zero
am (66) ;
dl w1 +74 ; w01:=max base (boss)
jd 1<11+72; set cat base
rl. w3 b1. ; w3:=abs page 1
al w3 x3+d1 ;
jd 1<11+8 ; reserve reader
al w3 x3-d1 ;
rl w1 x3+d40 ; w1:=abs ref operation;
b10=k+1
al w2 x1+173 ; w2:=abs reader table (on job descr page);
rl w0 x3+d20 ; move reader table to job descr page of psjob
rs w0 x2+2 ;
bz w0 x1+3 ; w0:=boolean boss- or jobcontrolled
se w0 1 ; if w0<>1 then move job controlled references
al w3 x3+8 ; else boss controlled references
dl w1 x3+d13 ;
ds w1 x2+8 ;
dl w1 x3+d15 ;
ds w1 x2+12 ;
rl. w3 b1. ; w3:=abs ref page 1
rl w1 x3+d40 ; w1:=abs ref operation;
bl w0 x1+7 ; insert mode in
hs w0 x3+d2+1 ; input operation;
rl w0 x1+12 ;
rl. w2 (b14.) ;
rs w0 x2+12 ; page 3:=virt request line;
bz w2 x1+3 ;
al w2 x2-1 ;
hs w2 x3+d35 ; set boolean (boss or job controlled);
sn w2 0 ; if job controlled then
jl. a5. ; begin
al w0 i41 ;
rs w0 (x3+d14) ; free superbufs := max (=i41)
al w0 0 ;
rs w0 (x3+d15) ; full bufs := 0
am d17-d13; w2:=top virt job contr
a5: ; end else
rl w2 x3+d13 ; w2:=top virt boss controlled
al w0 x2-512 ; w0:=start of virt buffer;
rl. w3 (b14.) ;
rs w0 x3+14 ; page 4:=first of virt buffer;
rl w2 x1+4 ; w2:=address of answer sem;
jl. w3 (b4.) ; open(w2);
jl. w3 (b37.) ; get pages;
rl. w2 b0.+6 ;
dl w1 x3+d1+2 ; move reader process name to request line
ds w1 x2+20 ;
dl w1 x3+d1+6 ;
al w1 x1+32 ; insert a space as the last character
ds w1 x2+24 ;
bl w1 x3+d35 ; if special device
sn w1 2 ; then
jl. a2. ; skip <empty reader>
am (66) ;
dl w1 +74 ; set cat base (max base)
al. w3 b34. ; w3:=ref zero
jd 1<11+72;
rl. w3 b1. ; w3:=ref page 1
\f
; lkn 76.10.20 read ...9...
a1: al w1 x3+d5 ; empty reader: w1:=input message;
rl. w2 b0.+8 ; first,
rs w2 x3+d6 ; first,
al w2 x2+510 ;
rs w2 x3+d7 ; last of buffer;
al w2 x3+d1 ; w2:=reader name;
jl. w3 (b9.) ; send and wait (w1,w2);
sz. w0 (b20.) ; if normal answer
jl. 4 ; not end of medium then
jl. a1. ; goto empty reader;
bl w0 x3+d37 ; if rb reader then
sn w0 0 ; begin
jl. a2. ;
rl. w1 b0.+6 ; w1:=request line address;
al w2 x3 ; w2=x3(page1)
dl w0 x1+48 ;
ds w0 x2+d43+2 ; move bsfilename
dl w0 x1+52 ; from requesline to readerpage
ds w0 x2+d43+6 ;
al w3 x2 ; w3=x2 (page1)
al w1 x1+6 ; w1:=first of line;
al w2 x1 ; w2:=first of line+new line
wa w2 x1-2 ; + length of line;
ds. w2 b41. ; saved first, last in message;
al w3 x3+d1 ; w3:=process name
jd 1<11+4 ; get process description address
rs. w0 b42. ; set process description address in operator output message
al. w1 b40. ; w1:=ref message;
al. w2 b43. ; w2:=address(<:host:>)
jl. w3 (b9.) ; send and wait slow;
a2: ; end;
rl. w1 b0.+6 ; send <load reader>: w1:=request line
rl. w2 b36. ; w2:=request queue
jl. w3 (b6.) ; open chained(w1,w2);
al w0 0 ; release page 3;
rl. w1 (b14.) ;
rs w0 x1+12 ;
am (66) ; cat base:=max interval;
dl w1 +74 ;
al. w3 b34. ;
jd 1<11+72;
rl. w3 b0.+2 ;
al w3 x3+d1 ; initialize reader;
jd 1<11+6 ;
al w3 x3-d1 ; reestablish w3 (=page 1);
jl. c7. ;
e.
; wait for paper tape
;
; a sense ready message is sent and waited for
; exit is made to the init sequenses
b . a0 w.
c1: al. w2 b44. ; w2:=name of process
al. w1 b18. ; w1:=timer message
jl. w3 (b2.) ; send and wait
c7: dl w1 x3+d43+2 ;
ds. w1 b17.+6 ; move bsfilename
dl w1 x3+d43+6 ; from readerpage to sense message
ds. w1 b17.+10 ;
al. w1 b17. ; w1:=sense ready message;
bl w2 x3+d2+1 ; w2:=input mode;
hs w2 x1+3 ; set input mode in sense ready message;
al w2 x3+d1 ; w2:=reader name;
jl. w3 (b2.) ; send and wait (w1,w2);
sz. w0 (b22.) ; if timer status then
jl. c1. ; goto wait for papertape
bl w1 x3+d35 ;
se w1 0 ; if job contr input then
jl. c4. ; goto init job controlled;
e.
\f
; lkn 76.10.20 read ...10...
; init boss controlled input
; check tape in reader, init buffer
al w1 x3+d40 ; w1:=
al w2 x1 ; w2:=addr of work;
ds w2 x3+d4 ; save buffer limits;
al w1 x3+d2 ; w1:=addr of input message;
al w2 x3+d1 ; w2:=addr of name;
jl. w3 (b9.) ; send and wait slow (w1,w2);
rl w2 x1+2 ;
sz w0 1<1 ; if normal answer
se w2 0 ; and no of bytes = 0 then
jl. 4 ;
jl. c1. ; goto wait for papertape;
al w2 510 ; rest buffer;
so w0 1<1 ; if not normal answer then
al w2 512 ; rest buffer:=512;
rs w2 x3+d32 ;
al w0 1 ;
rs w0 x3+d31 ; buffer count:=1;
al w0 -1 ;
rs w0 (x3+d20) ; page count:=-1;
rl w0 x3+d12 ;
rl. w2 (b14.) ;
rs w0 x2+14 ; page 4 descr:=first of buffer;
rl w2 x3+d14 ; w2:=reader free;
jl. w3 (b3.) ; lock(w2);
rl w0 x3+d40 ;
rl. w2 b0.+8 ;
rs w0 x2 ; buffer(0):=work;
rl w0 x3+d32 ;
sn w0 512 ; if rest buffer=512 (=not normal answer) then
jl. c3. ; then goto end boss controlled;
; read boss controlled
;
; cycle: read rest of buffer
; get new buffer and repeat
b. a0 w.
c2: rl. w2 b0.+8 ;
al w2 x2+510 ; w2:=last of buffer;
al w1 x2+2 ; w1:=top of buffer
ws w1 x3+d32 ; - rest buffer;
ds w2 x3+d4 ; save buffer limits;
al w1 x3+d2 ; w1:=input message address;
al w2 x3+d1 ; w2:=reader name address;
jl. w3 (b9.) ; send and wait slow;
rl w2 x1+2 ; w2:=no of bytes;
so w0 1<1 ; if not normal answer then
al w2 0 ; w2:=0;
rs w2 x3+d40 ; work:=w0;
rl w1 x3+d32 ; rest buffer:=
ws w1 4 ; rest buffer-
rs w1 x3+d32 ; no of bytes;
sn w1 0 ; if rest buffer=0 then
jl. a0. ; goto get next;
se w2 0 ; if bytes transferred <> 0 then
jl. c2. ; continue
sz. w0 (b20.) ; if end medium or abnormal answer then
jl. c3. ; goto end boss controlled
jl. c2. ; goto read boss controlled;
jl. c3. ; else goto end boss controlled
\f
; lkn 76.10.20 read ...11...
a0: rl w2 x3+d15 ; get next: w2:=reader full sem addr;
jl. w3 (b4.) ; open(w2);
rl w2 x3+d31 ;
al w2 x2+1 ; buffer count:=buffer count+1;
rs w2 x3+d31 ;
rl. w2 (b14.) ;
rl w1 x2+14 ; w1:=virt addr of buffer
al w1 x1+512 ; + 512;
sl w1 (x3+d13) ; if w1>=top virt then
rl w1 x3+d12 ; w1:=first virt;
rs w1 x2+14 ; page 4 descr:=w1;
al w0 512 ;
rs w0 x3+d32 ; rest buffer := 512;
rl w2 x3+d14 ; w2:=reader free sem;
jl. w3 (b3.) ; lock(w2);
rl w0 x3+d40 ; w0:=no of bytes;
se w0 0 ; if w0<>0 then
jl. c2. ; goto read boss controlled;
e.
; end boss controlled
;
; insert end medium character as last part of the buffer
; releaser the buffer and goto start readercoroutine
c3: rl. w2 b0.+8 ;
al w2 x2+512 ; w2:=top of buffer
ws w2 x3+d32 ; - rest buffer;
bl w1 x3+d2+1 ; w1:=mode(input message);
sl w1 7 ; if mode not std then
al w1 6 ; mode:=trf (i.e. em=25);
rl. w0 x1+b21.-6 ;
rs w0 x2 ; word(x2):=endword(mode);
rl w0 x3+d31 ; page count:=
rs w0 (x3+d20) ; buffer count;
rl w2 x3+d15 ; w2:=reader full sem addr;
jl. w3 (b4.) ; open(w2);
jl. c0. ; goto start reader;
\f
; lkn 76.10.20 read ...12...
; sense ready
;
; job controlled input stream has become empty, so wait for next portion of data by
; repeatedly sending sense ready until status = ok
c8: al. w1 b17. ; sense ready: w1:=message address;
bl w2 x3+d2+1 ;
hs w2 x1+3 ; set input mode in sense ready message
al w2 x3+d1 ; w2:=device name
jl. w3 (b2.) ; send and wait
sz. w0 (b22.) ; if timer status then
jl. c8. ; goto sense ready
; init job controlled input
;
; reserve buffer, read tape
; if not present then goto wait for paper tape
; goto read boss controlled
b. a0 w.
c4: bz w1 x3+d36 ;
se w1 0 ; if buffer reserved then
jl. a0. ; goto input;
al w0 1 ;
hs w0 x3+d36 ; buffer reserved:=true;
rl w2 x3+d16 ; w2:=virt first of job contr buffer;
rl. w1 (b14.) ;
rs w2 x1+14 ; page 4:=w2;
rl w2 x3+d18 ; w2:=reader free sem;
jl. w3 (b3.) ; lock(w2);
a0: rl. w1 b0.+8 ; input:
al w2 x1+508 ; w2:=last of buffer;
al w1 x1+6 ; w1:=first of buffer;
ds w2 x3+d4 ; save buffer limits;
al w1 x3+d2 ; w1:=input message;
al w2 x3+d1 ; w2:=reader name;
jl. w3 (b9.) ; send and wait slow(w1,w2);
dl w2 x1+4 ; w1,w2:=no of bytes,characters;
so w0 1<1 ; if not normal answer then
ld w2 -100 ; w1,w2:=0,0;
sz w0 1<1 ; if normal answer
se w1 0 ; and no of bytes=0 then
jl. 4 ;
jl. c8. ; goto sense ready;
am. (b0.+8) ;
ds w2 +4 ; save w1,w2 in buffer;
rl. w2 b0.+8 ;
rs w0 x2 ; save status;
ac w1 x1-504 ;
rs w1 x3+d32 ; rest buffer:=504-no of bytes;
al w1 0 ;
rs w1 x3+d41 ; rel:=0;
e.
\f
; lkn 76.10.20 read ...12a...
; read job controlled
;
; cycle: check input operation - maybe repeat reading
; prepare new buffer and read
; entry with: w0 = logical status, w2 = page 4, w3 = page 1
b. a1 w.
a1: sz. w0 (b20.) ; if end document or result<>1 then
jl. c6. ; goto end job controlled;
rl w1 x3+d32 ; w1:=rest buffer;
sl w1 40 ; if rest buffer>39 then
jl. a0. ; goto read;
al w0 -1 ;
ws w2 2 ; w2:=top of buffer-rest buffer -2;
rs w0 x2+510 ; word(x2):=-1;
rl w2 x3+d19 ; w2:=reader full sem;
jl. w3 (b4.) ; open(w2);
c5: rl. w2 (b14.) ; start job controlled;
rl w1 x2+14 ; w1:=virt page 4
al w1 x1+512 ; + 512;
se w1 512 ;
sl w1 (x3+d17) ; if w1>=top or page 4 is unused
rl w1 x3+d16 ; then w1:=first virt;
rs w1 x2+14 ; page 4:=w1;
al w0 510 ;
rs w0 x3+d32 ; rest buffer:=510;
rl w2 x3+d18 ; w2:=reader free sem addr;
jl. w3 (b3.) ; lock(w2);
; input:
a0: rl. w2 b0.+8 ;
al w2 x2+508 ; w2:=last of buffer;
al w1 x2+8 ; w1:=w2+8
ws w1 x3+d32 ; - rest buffer;
ds w2 x3+d4 ; save buffer limits;
al w1 x1-6 ; rel:=first-6
ws. w1 b0.+8 ; - page 4 addr;
rs w1 x3+d41 ;
al w1 x3+d2 ; w1:=input message addr;
al w2 x3+d1 ; w2:=reader name addr;
jl. w3 (b9.) ; send and wait slow(w1,w2);
dl w2 x1+4 ; w1,w2:=number of bytes,characters;
sz. w0 (b20.) ; if normal answer and
jl. a2. ; status = 0
se w1 0 ; bytes transferred=0 then
jl. a3. ;
al w0 -2 ; change buffer:
rl w1 x3+d32 ; w1:=rest buffer
rl. w2 b0.+8 ; w2:=page 4 address
ws w2 2 ; w2:=top buffer - rest buffer - 2
rs w0 x2+510 ; word(x2):=-1;
rl w2 x3+d19 ; w2:=reader full sem
jl. w3 (b4.) ; open(w2)
rl. w2 (b14.) ; w2:=current coruno
rl w1 x2+14 ; w1:=virt page 4
al w1 x1+512 ; + 512
se w1 512 ;
sl w1 (x3+d17) ; if w1>=top or page 4 is unused
rl w1 x3+d16 ; then w1:=first virt
rs w1 x2+14 ; page 4 :=w1
al w0 510 ; rest buffer := 510
rl w2 x3+d18 ; w2:=reader free sem
jl. w3 (b3.) ; lock (reader free sem)
jl. c8. ; goto sense ready
\f
; lkn 76.10.20 read ...12b...
a2: so w0 1<1 ; if not normal answer then
ld w2 -100 ; bytes,characters := 0,0
a3: rl w3 x3+d41 ;
wa. w3 b0.+8 ; w3:=saved answer addr;
ds w2 x3+4 ; save answer;
rs w0 x3 ; save logical status;
rl. w3 b0.+2 ;
ac w1 x1+6 ; w1:=-no of bytes-6
wa w1 x3+d32 ; + rest buffer;
rs w1 x3+d32 ; set rest buffer
rl. w2 b0.+8 ; w2:=page 4 addr;
jl. a1. ; goto read job controlled;
e.
; end job controlled input
;
; release buffer and reader
; goto start reader
c6: al w0 -1 ;
ws w2 2 ; w2:=top of buffer - rest buffer - 2;
rs w0 x2+510 ; word(x2):=-1;
rl w2 x3+d19 ; w2:=reader full sem addr;
jl. w3 (b4.) ; open(w2);
al w1 x3+d10 ; w1:=release reader op addr;
rl. w2 b29. ; w2:=banker queue sem;
jl. w3 (b6.) ; open chained(w1,w2);
rl w2 x3+d11 ; w2:=answer sem addr;
jl. w3 (b3.) ; lock(w2);
jl. c0. ; goto start reader;
f0 = k-b0 ; define length of page 0;
h1 = h0. ; define link for initialization;
i.
e.
\f
; rc 02.07.71 card reader read ...13...
; general description
; *******************
;
; the card reader coroutine transfers card pictures from the card
; reader to some super buffer in the following cycle:
;
; rep: lock (cards free)
; fill segment with card pictures
; open (cards full)
; goto rep
;
; the cards to be read must be structured in job decks in the following
; way:
; <job deck> ::= <job file> <datafiles> <end of job card>
; <job file> ::= <ebcdic cards defining the job>
; <data files> ::= <empty> ! <data file> <data files>
; <data file> ::= <end of file card> <data cards>
;
; the end cards must contain the following text (terminated by
; blanks) in the first 21 coloumns:
;
; ---file
; ---job
;
; when an end of job card is read, and the cardreader is not emptied,
; a new pseudo job will be activated. this pseudo job will then acti-
; vate the card reader once for each file untill the end of job is met.
; in each activation, the card reader will get information about
; reading mode and packing mode.
;
; if the packing mode specifies boss controlled input, each segment
; in the super buffer will be filled up with cards and terminated by
; null characters.
;
; if the packing mode specifies job controlled input, each segment
; will be structured in blocks, each one headed by 4 words containing
; the first part of the answer on the input message.
; usually a block will fill a whole segment (but allways an integral
; number of cards) but in case of reading error, end of deck etc a
; segment may contain several blocks.
;
; the end of file and end of job information is transferred to the
; pseudo job in two different ways depending on the packing mode.
;
; in job controlled input the status (first word of each block)
; contains status bits defining the end conditions.
;
; in boss controlled input two counters will signal end in the
; following way:
; the pseudo job has two local counters, counting segments in the
; super buffer and files in the job. when the value of such a
; counter matches a corresponding global counter, the end condition
; is fullfilled
\f
; rc 02.07.71 card reader read ...14...
; use of logical status bits
; **********************************
;
; bit
; no from monitor in boss to pseudo job
;
; 0 local local --0--
; 1 conversion error --0-- conversion error
; 2 timer timer --0--
;
; 3 data overrun data overrun --0--
; 4 --0-- --0-- --0--
; 5 end of deck end of deck end boss file/job
;
; 6 tray full tray full --0--
; 7 end card read end card read end card read
; 8 --0--/eoj from rb eoj --0--
;
; 9 --0-- --0-- --0--
; 10 reading error --0-- reading error
; 11 card rejected --0-- card rejected
;
; 12 --0-- --0-- --0--
; 13 --0-- --0-- --0--
; 14 --0-- --0-- --0--
;
; 15 --0-- --0-- --0--
; 16 --0-- --0-- --0--
; 17 --0-- --0-- --0--
;
; 18 --0-- unknown --0--
; 19 --0-- malfunction --0--
; 20 --0-- unintelligible --0--
;
; 21 --0-- rejected end boss job
; 22 --0-- normal answer --0--
; 23 --0-- mode error --0--
;
; not mentioned bits are allways 0.
; bit 21 will be removed by the pseudo job before the status
; is transferred to the job.
;
;
; internal structure
; ******************
;
; index in most tables is card type which contains the
; following bits from reading mode:
;
; bit contents
; 20 decimal conversion (in hardware)
; 21 51 coloumns cards
; 22 ebcdic conversion (in monitor)
;
; value conversion coloumns bytes/card
;
; 0 binary 80 80
; 2 -not used- -- --
; 4 binary 51 52
; 6 -not used- -- --
; 8 decimal 80 54
; 10 ebcdic 80 54
; 12 decimal 51 34
; 14 ebcdic 51 36
\f
; rc 02.07.71 card reader read ...15...
; the names are used as follows
;
; a-names local labels
; b-names global variables
; c-names global labels
; e-names system lengths
; f-names variables in initialization
; g-names tables, texts and operations
; i-names options
; j-names local variables
;
;
; the following options define the coroutine:
;
; i50 job controlled input buffer on drum/disc (o/1)
; i51 boss controlled input buffer on drum/disc (o/1)
; i52 job controlled input buffer no of pages
; i53 boss controlled input buffer no of pages
; i54 coroutine on drum/disc (o/1)
s. b200, c40, d50, f60, g20 w.
;externals on card reader page
b7., b8., b9., b10., b15., b16., b17., b18., b19., b20., b21.
b22., b30., b31., b33.
;externals on start page
b115., b117., b118., b119., b122., b123., b124., b125., b126., b130., b131., b132., b133., b134., b135.
c.i93-1, b150. z., b151., b155.,b156.,b157.,b128.,b129.
;externals in initialization
f9., f10., f11., f12., f13., f20., f21., f22.
h2:h3 ; define link for initialization
jl. c0. ; goto start init
; format of operation:
; op+ 0 : chain
; + 2 : controller (1 or 2) (i.e. boss- or job- controlled)
; + 4 : answer semaphore
; + 6 : mode
; + 8 : not used
; +10 : virtual global file count (undefined if job-controlled)
; (global block count follows immediately after global file count)
; +12 : not used
; +14 : not used
;
; format of answer:
; op+ 2 : result: 0 - answer ok
; <> 0 - mode error
; + 6 : card length (in bytes)
\f
; btj 20.7.74 card reader variables read ...16...
; card variables page. one page for each incarnation
f0: ; start of card page
k=0 ;
0,0 ; (return point, used by call)
d1: 0,r.4 ; process name (individually for each incar.)
0 ; +8 (name table address)
d2: 0,0 ; local device name for jobfile (zero for std card)
0 ; +4 (termination of name)
d3: 0 ; std mode for jobfile (undef - - - )
d4: 0,0 ; current local device name ( - - - - )
d5: 0 ; device number as text
d6: 3<12 ; input message (+current input mode)
0,0 ; +2,+4 first,last
d7: 0 ; boss status (status of last input)
d8: 0 ; bufrel
d9: 0 ; controller (0=boss, 8=job)
d10: 0 ; actual cardsize (used to see, if
; there is room enough left in buffer for
; another card)
d11: 0 ; card type (undef for rb card)
d12: 0 ; local block count
d13: 0 ; local file count
d14: 0 ; index in cardreader table
d15: 0 ; old bufrel (used temporarily by >lock whole superbuffer<)
d16: 0 ; cardreader type:
; -1 = old std cardreader (i.e. connected directly tothe rc4000)
; 0 = std cardreader (i.e. connected directly to the front-end)
; 1 = remote cardreader (i.e. connected via a remote batch
; station which accepts lookup messages)
; cardreaders of type -1 and 0 are counted in i93
; cardreaders of type 1 are counted in i200
d20: 0,1,0 ; remove request line operation
d21: 0 ; +6 virt request line addr (=0 when released)
d22: 9<12+1 ; output message (+output mode)
0,0,0 ; +2,+4,+6 first, last, proc.descr.address
d26: 0 ; virt psjob operation addr (=0 when answer send)
d30: 0 ; banker operation: (chain)
13<12 ; +2 opcode=cardjob ready
d31: 0 ; +4 answer sem
d32: 0 ; +6 rb parent device name table addr (=0 for std card)
d33: 0 ; +6+2 - - - creation number ( undef for std card)
d34: 0 ; +10 terminal ident of starting rb terminal
; (two chars, left justified)
d35: 0 ; +12 card reader queue
d36: 0 ; +14 boss super buffer: first virt
d37: 0 ; +16 - - - : top
d38: 0 ; +18 - - - : free sem
d39: 0 ; +20 - - - : full -
d40: 0 ; +22 job - - : first virt
d41: 0 ; +24 - - - : top -
d42: 0 ; +26 - - - : free sem
d43: 0 ; +28 - - - : full -
d44: 0,0 ; +30,+32 rb printername
d50: 0 ; current virt addr of input buffer
f1: ; (length of card variable page
\f
; btj 20.7.74 card reader init read ...17...
k=k+f0 ;
; variables used in initialization
;f0 ; start of card variables
;f1 ; length - - -
;f2 ; start of card reader page
;f3 ; length - - - -
;f4 ; start of start page
;f5 ; length - - -
f10: 0 ; base of externals
f11: 12 ; reserve virt
f12: 13 ; move to virt
f13: 24 ; put in active queue
h.
f20: (:i93+i200:)*e12,18; coroutine descriptions
f21: 7*(:i93+i200:)*e13,19; semafores
; each incarnation gets:
; answer semaphore
; card queue
; boss buffer free sem
; - - full -
; job buffer free -
; - - full -
; wait semaphore
w.
f30: 0 ; virt of card reader page
;f31 ; rel entry: start std card readers
;f32 ; - - - rb - -
;f36 ; rel entry: commandio start command
;f37 ; - - wait start
;f38 ; - - release and wait
f40: 0 ; incarnation count
f41: 0 ; index in cardreader table
f42: 1<15 ; increment in coroutine ident
f43: 10 ; decimal radix
h.
f45: 400<3+e85,f31 ; ident, testmode, entry for std card reader
f46: (:400+i93:)<3+e98,f32; - - - - rb - -
w.
f50: 0 ; sense message (and for set catbase)
f51: 0,r.8 ; answer area/saved return (reserve area)
f52: i53*512 ; boss buffer length in bytes
f53: i52*512 ; job - - - -
f60: h.
c.i93-1
0, r.i93 ; list of std card reader device numbers
z.
w.
\f
; btj 20.7.74 card reader init read ...18...
; reserve card reader code page and move to virt
b. a10 w.
c0:
c. i93 + i200 - 1
al w0 i54 ; w0:= card code on disc
al w1 f3 ; w1:= length of card reader page;
jl. w3 (f11.) ; reserve virt(w0,w1,w2);
rs. w2 f30. ; save virt addr;
al. w0 f2. ; w0:= start of card reader page;
jl. w3 (f12.) ; move to virt(w0,w1,w2);
z.
; repeat for each incarnation
a0: rl. w2 f40. ; next incarnation:
al w2 x2+1 ;
rs. w2 f40. ; increase(incarnation count);
sl w2 i93+i200+1; if incarnation count >= incarnations then
jl. a6. ; goto reserve start page;
; reserve and initialize std cardreader
sl w2 i93+1 ; if incarnation no <= std card reader then
jl. a1. ; begin
am (66) ;
dl w1 +74 ; set catbase (boss maxbase)
al. w3 f50. ;
jd 1<11+72;
al. w3 f0.+d1 ; w3:= ref dev name;
bl. w2 x2+f60.-1 ; w2:=device number;
c.i93-2 ; if more than one std card reader then include:
al w0 0 ;
al w1 x2 ; convert dev no to text;
wd. w1 f43. ;
se w1 0 ;
al w1 x1+48 ;
ls w1 8 ;
wa w1 0 ;
al w1 x1+48 ;
ls w1 8 ;
al w1 x1+32 ;
rs. w1 f0.+d5 ; save in card variables;
z.
ls w2 1 ;
wa w2 74 ; w2:=n t a;
rs w2 x3+8 ; save after name
rl w2 x2 ; w2:=ref process description;
dl w1 x2+4 ;
ds w1 x3+2 ;
dl w1 x2+8 ; move name to card variables;
ds w1 x3+6 ;
jd 1<11+8 ; reserve process;
al. w1 f50. ;
jd 1<11+16; send and wait(cardreader,sense)
al. w1 f51. ; in order to set name table addr;
jd 1<11+18;
; initialize boss status
al w1 1 ;
ls w1 (0) ; w1:= logical status;
sn w1 1<1 ;
lo. w1 f51. ;
la. w1 b55. ; extract boss bits;
lo. w1 b61. ; include enddeck, eofcard, end job card
rs. w1 f0.+d7 ; set in card variables;
rl. w1 f0.+d1+8; w1:=nta of device;
rl w0 (x1) ; w0:=kind;
;***nb: dangerous constant in case of monitor kind changes
sn w0 16 ; if kind= old std cardreader
am -1 ; then type := old std
am 0-1 ; else type := std
a1: al w0 1 ; end else type := remote;
rs. w0 f0.+d16; set type in card variables;
\f
; btj 20.7.74 card reader init read ...19...
; initialize semafores on card variable page
rl. w2 f21. ; w2:= current sem addr;
al. w3 f0. ; w3:= card variable page;
rs w2 x3+d20+4 ; remove line answer sem:=
rs w2 x3+d31 ; banker operation answer sem := w2(=answer sem);
al w2 x2+e13 ;
rs w2 x3+d35 ; card queue
al w2 x2+e13 ;
rs w2 x3+d38 ; boss buffer free
al w2 x2+e13 ;
rs w2 x3+d39 ; - - full
al w2 x2+e13 ;
rs w2 x3+d42 ; job buffer free
al w2 x2+e13 ; - - full
rs w2 x3+d43 ;
al w2 x2+e13 ;
; initialize entry in cardreader table
rl. w1 f41. ; save device table index
rs w1 x3+d14 ; in card variables
al w0 x1+b99 ;
rs. w0 f41. ; index:= index + entry length;
al. w1 x1+b160. ; w1:= abs table entry;
rs w2 x1+b98 ; save wait sem in entry
al w2 x2+e13 ;
rs. w2 f21. ;
rl. w2 f40. ; if std card reader then
bl. w0 x2+f60. ; set dev no in entry;
sh w2 i93 ;
hs w0 x1+b97 ;
a4: ;
\f
; btj 20.7.74 card reader init read ...20...
; reserve boss input buffer
al w0 i51 ; w0:= boss buffer on disc;
al w1 512 ; w1:= page size;
al w2 i53 ; w2:= no of pages;
rs. w2 (f0.+d38); cards free value:= no of pages;
jl. w3 a9. ; reserve area(w0,w1,w2);
al w2 x2+513 ; w2:= top virt + writing;
rs. w2 f0.+d37; save top virt;
ws. w2 f52. ; first virt:= top virt
rs. w2 f0.+d36; - buffer length;
; reserve job input buffer
al w0 i50 ; w0:= job buffer on disc;
al w1 512 ; w1:= page size;
al w2 i52 ; w2:= no of pages;
rs. w2 (f0.+d42); cards free value:= no of pages;
jl. w3 a9. ; reserve area(w0,w1,w2);
al w2 x2+513 ; w2:= top virt + writing;
rs. w2 f0.+d41; save top virt;
ws. w2 f53. ; first virt:= top virt
rs. w2 f0.+d40; - buffer length;
; reserve card variables and move to virtual store
al w0 i202 ; w0:= card variables on disc;
al w1 f1 ; w1:= length of card variables;
jl. w3 (f11.) ; reserve virt;
al w2 x2+1 ; insert writing
al. w0 f0. ; w0:= start of card variables;
jl. w3 (f12.) ; move to virt(w0,w1,w2);
; w2 = virt card variable
; initialize coroutine description
rl. w3 f20. ; w3:= current coroutine addr;
rl. w1 f30. ; w1:= virt card reader code page;
ds w2 x3+8 ; init page 0 and page 1;
rl. w1 f40. ;
sh w1 i93 ; w1:= addr of
am f45-f46; ident, test, entry word
al. w1 f46. ; for std- or rb card reader;
rl w0 x1 ; move to coroutine description;
rs w0 x3+4 ;
wa. w0 f42. ; increase coroutine ident;
rs w0 x1 ;
\f
; btj 20.7.74 card reader init read ...21...
; put coroutine in activ queue
al w1 x3 ; w1:= coroutine descr addr
al w3 x3+e12 ; increase(current coroutine addr);
rs. w3 f20. ;
jl. w3 (f13.) ; put in activ queue (w1);
; repeat for all incarnations
al w0 0 ;
rs. w0 f0.+d1 ; clear process name
rs. w0 f0.+d7 ; clear boss status
jl. a0. ; goto next incarnation;
a6: ;
; reserve start code page and move to virt
al w0 i63 ; w0:= start code page on disc
al w1 f5 ; w1:= length of start page;
jl. w3 (f11.) ; reserve virt(w0,w1,w2);
al w2 x2+1 ; insert writing
al. w0 f4. ; w0:= start of start page;
jl. w3 (f12.) ; move to virt(w0,w1,w2);
; w2 = virt start code page
; initialize externals
rs. w2 f8. ;
jl. w3 (2) ; set externals;
f9: 40 ;
f8: 0 , 365 ; virt start card;
f36, 366 ; rel start card;
f22: e13<12+19, 72 ; card reader free operations;
0 , -1000 ; end of externals;
; end initialization
am.(4,jl.4,h0.) ; goto initialize reader;
; reserve area
; w0,w1,w2 = reserve on disc, pagelength, no of pages
; on exit: w2 = virt addr of last page
a9: rs. w3 f51. ; save(return);
rs. w2 f51.+2 ; save(no of pages);
a10: rl. w3 f51.+2 ; rep:
al w3 x3-1 ; decrease(no of pages);
rs. w3 f51.+2 ;
sh w3 -1 ; if all pages reserved then
jl. (f51.) ; goto saved return;
jl. w3 (f11.) ; reserve virt(w0,w1,w2);
jl. a10. ; goto rep;
e.
; re 76.08.03 card reader init read ...21a...
; j.code to move card reader device numbers into code
b. a10 w.
c. i93-1
a2: al w1 0 ;
a3: am. (a5.) ;
a4: bl. w0 x1 ;
hs. w0 x1+f60. ;
al w1 x1+1 ;
se w1 i93 ;
jl. a3. ;
al w0 0 ; normal exit to slang:
al w2 0 ;
jl x3 ;
a5: e54-q0-12+10000-a4 ; options.first card reader
;f60: init code.first card reader
jl. a2.
j.
z.
e.
\f
; btj 20.7.74 card reader read ...22...
f2=k ; start of card reader codepage
; page descriptions
b0: 0 ; page 0 code
b1: 0 ; page 1 own variable page
b2: 0 ; page 2
b3: 0 ; page 3 input buffer
b4: 0 ; page 4 global counters
61<12+0 ; pageident: cardreader
; semaphores, queues
b7: 52 ; request free sem
b8: 51 ; request queue
b9: 67 ; banker queue
b10: 72 ; card reader free operations queue
; cl entries
b15: 1 ; send and wait
b16: 3 ; lock
b17: 4 ; open
b18: 5 ; lock chained
b19: 6 ; open chained
b20: 9 ; send and wait slow
b21: 7 ; get pages
b22: 25 ; call
; absolute addresses
b30: 26 ; current coroutine description address
; virtual addresses
b31: 365 ; virt,
b32: f37 ; rel wait start operation
b33: 365 ; virt,
b34: f38 ; rel release and wait
; definition of card reader messages
b36: 0<12+4 ; sense ready message
b39: 14<12+4 ; set mode message
0 ; +2 eof word
; program variables
b40: 0 ; saved return from move text
b48: 0 ; start of last card
; status masks + input mode masks
b54: 8.0130 0001 ; em+eof+eoj+mode error
b55: 8.5570 0076 ; boss status bits
b56: 8.2023 0000 ; job - -
b57: 8.0020 0000 ; eof card/attention
b58: 8.0100 0000 ; em (end file/end deck)
b59: 8.0400 0000 ; data overrun
b60: 8.5540 0075 ; operator status bits
b61: 8.0130 0000 ; card reader ready mask = em + eof + eoj
b62: 8.1000 0000 ; timer (=card jam or timeout on sense-ready)
b63: 8.0000 0276 ; input mode mask
b64: 8.0000 0010 ; add decimal mode
b65: 8.0000 0016 ; boss bits in mode
b66: 8.0010 0000 ; eoj card
b67: 8.0000 0004 ; end boss file (in job status)
; constants
b70: 25<16 ; em character
\f
; btj 20.7.74 card reader read ...23...
b80: <:host:>,0,0,0 ; name of host process
; definition of operator messages
; requests with bel:
g3: <: attention<0>:>
g5: <: card jam<0>:>
g7: <: data overrun<0>:>
; requests without bel:
g4: <: ready<0>:>
g6: <: disconnected<0>:>
g8: <:card reader <0>:>
g16:<: illegal job file mode<0>:>
g17:<:<13><10><127>:>
; define card lengths in bytes
g0: 80, 0, 52, 0, 54, 54, 34, 36
; define end file pictures
g1: g10., 0 , g10. , 0 , g11. , g12. , g11. , g12.
; binary , - , binary , - , decimal , ebcd , decimal , ebcd
; define end job pictures
g2: g13. , 0 , g13. , 0 , g14. , g15. , g14. , g15.
; binary , - , binary , - , decimal , ebcd , decimal , ebcd
; definition of end-card-words
;
; contents ; card type
g9: 1024<12 + 1024 ; 0 binary
0 ; 2 -not used-
1024<12 + 1024 ; 4 binary
0 ; 6 -not used-
32<16 + 32<8 + 32 ; 8 decimal
<:---:> ; 10 ebcdic
32<16 + 32<8 + 32 ; 12 decimal
<:---:> ; 14 ebcdic
\f
; btj 20.7.74 cardreader read ...24...
; define binary end of file card
g10 = k-2, h.
1024 , 2056 , 2049 , 1088 , 2064 , 0,r.7
; - , f , i , l , e
w.
; define decimal end of file card
g11 = k-2
70<16+192<8+35, 69<16+0<8+0, 0,r.4
; f i l e blanks
; define ebcdic end of file card
g12 = k-2
<:file :>, <: :>, r.4
; define binary end job card
g13 = k-2, h.
1024 , 1280 , 1032 , 2176 , 0,r.8
; - , j , o , b , blanks
w.
; define decimal end job card
g14 = k-2
33<16+38<8+66, 0,r.5
; j o b blanks
; define ebcdic end job card
g15 = k-2
<:job:>, <: :>, r.5
\f
; btj 20.7.74 card reader read ...25...
; prepare buffer
;
; ensures that page 3 may contain at least
; one card (and the answer, if job controlled).
b. a10 w.
c11: rl w0 x3+d8 ; if bufrel
wa w0 x3+d9 ; + controller
wa w0 x3+d10 ; + cardsize
sh w0 512 ; <= 512 then
jl x1 ; return
; change buffer
;
; rest of buffer is cleared, the buffer is given
; to the psjob, and the next is locked
c14: al w2 0 ; bufrel:= 0;
rx w2 x3+d8 ; w2:= old bufrel;
al w0 0 ;
a0: sl w2 512 ; rep:
jl. a1. ; if old bufrel < 512 then
am. (b3.) ; begin page3.old bufrel:= 0;
rs w0 x2 ; increase(old bufrel);
al w2 x2+2 ; goto rep;
jl. a0. ; end;
a1: rl w2 x3+d12 ; increase(local block count);
al w2 x2+1 ;
rs w2 x3+d12 ;
am (x3+d9) ;
rl w2 x3+d39 ; open(full (controller));
jl. w3 (b17.) ;
rl. w2 (b30.) ;
wa w3 x3+d9 ; w3:= page 1 + controller;
al w0 512 ; page 3:= page 3 + 512;
wa w0 x2+12 ;
sn w0 (x3+d37) ; if page 3 = top virt (controller) then
rl w0 x3+d36 ; page 3:= first virt(controller);
rs w0 x2+12 ; page 3:= w0;
rl w2 x3+d38 ;
al w3 x1 ; lock(free(controller))
jl. (b16.) ; and return;
e.
\f
; btj 20.7.74 card reader read ...26...
; read block
;
; a suitable buffer part is found, and a block
; of cards is read into it
; if answer to psjob is not send yet, it will
; be send now, indicating mode error or not.
b. a10 w.
c2: jl. w1 c11. ; prepare buffer;
rl. w1 b3. ;
al w2 x1+510 ; last in message:= page 3 + 510;
wa w1 x3+d8 ; first in message:= page 3
wa w1 x3+d9 ; + bufrel + controller;
ds w2 x3+d6+4 ;
al w1 x3+d6 ;
al w2 x3+d1 ;
jl. w3 (b20.) ; send wait slow(cardreader,input);
rl w2 x3+d8 ;
rs w2 x3+d15 ; save old bufrel;
wa w2 x3+d9 ; bufrel:= bufrel + controller
wa w2 x1+2 ; + bytes transferred;
rs w2 x3+d8 ;
sz. w0 (b66.) ; if eoj status then
lo. w0 b57. ; add eof status;
la. w0 b55. ; extract boss status bit;
rs w0 x3+d7 ; save boss status;
rl w2 x3+d9 ; if job controlled then
sn w2 0 ; begin
jl. a2. ;
rl w2 x3+d15 ; w2:= page 3 + old bufrel;
wa. w2 b3. ;
dl w0 x1+2 ; move status extract userbits,
la. w3 b56. ; bytes transferred,
ds w0 x2+2 ; chars transferred,
dl w0 x1+6 ; errorfree chars
ds w0 x2+6 ; to buffer;
rl. w3 b1. ;
a2: ; end;
\f
; btj 20.7.74 card reader read ...27...
; special care is taken for the first answer in each file.
; if unintelligible then prepare for <:illegal jobfile mode:> or <:disconnected:>
; send possibly answer to psjob
al w0 0 ; w0:= virt psjob operation;
rx w0 x3+d26 ; virt psjob operation:= 0;
sn w0 0 ; if answer is not send then
jl. a3. ; begin
rl. w2 (b30.) ;
rs w0 x2+10 ; page 2:= psjob operation;
jl. w3 (b21.) ; get pages;
rl. w1 b2. ;
rl w0 x3+d7 ; op.2:= if unintelligible
so w0 1<3 ; then <> 0 else
al w0 0 ; 0;
rs w0 x1+2 ;
rl w2 x1+4 ; open(answer sem);
jl. w3 (b17.) ;
rl w0 x3+d7 ;
so w0 1<3 ; if unintelligible then
jl. a3. ; begin
rl. w0 b57. ; status:= end card;
rl w1 x3+d13 ;
sn w1 0 ; if filecount=0(i.e. reading jobfile)
rl. w0 b54. ; then status:= em,eof,eoj,modeerror;
rs w0 x3+d7 ;
am (x3+d9) ;
rl w2 x3+d38 ; open(free(controller));
jl. w3 (b17.) ; goto test operator message;
jl. c5. ; end;
a3: ; end;
e.
; test status:
; if status ok then read next block.
;
; if eof status and std cardreader then search the last card
; read to determine whether it is a normal card
; (eof bit is cleared), an eof card, or an eoj card
; (eoj bit is set).
b. a10 w.
rl w0 x3+d7 ; w0:= boss status
sz w0 1<1 ; if not normal answer and
jl. a0. ; not old std card reader then
rl w1 x3+d16 ;
sl w1 0 ; status:= status + em + eof + eoj;
lo. w0 b61. ; comment: this will terminate the card
rs w0 x3+d7 ; reading, before giveup;
a0: sn w0 1<1 ; if logical status ok then
jl. c2. ; goto read block;
\f
; btj 20.7.74 card reader read ...28...
; status is not clear
; test for end card, if not: proceed to test operator bits
so. w0 (b57.) ; if not eof card then
jl. c5. ; goto test operator message;
rl w1 x3+d16 ; if not old std card reader then
sl w1 0 ;
jl. c4. ; goto handle end cards;
; the standard driver for card reader does not recognize
; end-file and end-job cards fully, but only indicates
; that the card can be an end card.
rl. w1 b3. ; start of endcard:=
wa w1 x3+d8 ; page 3
ws w1 x3+d10 ; + bufrel
rs. w1 b48. ; - actual cardsize;
; test for end-file card
am (x3+d11) ; w2:= abs addr of
al. w2 +g1. ; end-file card picture(card type);
wa w2 x2 ;
jl. w3 c9. ; compare(w1,w2);
jl. a2. ; +2 identical: goto eof card;
; test for end-job card
rl. w1 b48. ; w1:= start of endcard;
rl. w3 b1. ; w3 := page 1;
am (x3+d11) ; w2:= abs addr of
al. w2 +g2. ; end-job card picture (card type);
wa w2 x2 ;
jl. w3 c9. ; compare(w1,w2);
jl. a1. ; +2: identical: goto eoj card;
; the endcard status was a fony, it was a normal card
rl. w3 b1. ; w3:= page 1;
rl w0 x3+d7 ;
ws. w0 b57. ; remove eof bit from boss status;
rs w0 x3+d7 ;
jl. c5. ; goto test operator message
; end job card found:
a1: rl. w3 b1. ; w3:= page 1;
rl w0 x3+d7 ;
lo. w0 b66. ; set eoj bit in boss status;
rs w0 x3+d7 ;
; end card found:
a2: rl. w3 b1. ; w3:= page 1;
rl w0 x3+d11 ; w0:= card type;
rl. w1 b70. ;
sz w0 2 ; if conversion mode then
rs. w1 (b48.) ; first of card:= em character;
e.
\f
; btj 20.7.74 card reader read ...29...
; handle endcards:
; update global counters, or adjust user status
; release buffer
b. a10 w.
c4: rl w1 x3+d9 ; w1:= controller;
rl w0 x3+d7 ; w0:= boss status;
se w1 0 ; if boss controlled then
jl. a1. ; begin
rl. w2 b4. ; w2:= page 4 (=global counters);
rl w1 x3+d13 ;
al w1 x1+1 ; increase(local file count);
rs w1 x3+d13 ;
sz. w0 (b66.) ; if eoj status then
rs w1 x2 ; global file count:= local file count;
rl w1 x3+d12 ;
rs w1 x2+2 ; global block count:= local block count;
jl. a2. ; end
a1: ; else
rl w2 x3+d15 ; begin
wa. w2 b3. ; w2:= page 3 + old bufrel (= abs user status);
rl w1 x2 ;
lo. w1 b58. ; set end deck in user status;
sz. w0 (b66.) ; if eoj status then
lo. w1 b67. ; set end boss file in user status;
rs w1 x2 ; end;
a2: am (x3+d9) ;
rl w2 x3+d39 ; open(full (controller));
jl. w3 (b17.) ;
e.
\f
; btj 20.7.74 card reader read ...30...
; test operator message
b. a10 w.
f31 = k-b0 ; entry std card reader
c5: rl. w3 b1. ; w3:= page 1;
rl w0 x3+d7 ;
sz. w0 (b60.) ; if boss status contains
jl. 4 ; no operator bits then
jl. c7. ; goto next action;
; boss status contains one or more of the following logical
; status bits: local
; timer
; data overrun
; end deck
; tray full
; unknown
; disconnected
; unintelligible
; rejected
; mode error
; an operator message is assembled with one of the
; following texts:
; ready (=end deck+eof+eoj)
; attention (=local, enddeck, tray full)
; card jam (=timer)
; overrun (=data overrun)
; disconnected (=unknown, disconnected, unintelligible, rejected)
; illegal jobfile mode (=mode error)
; if job controlled reading, and in the middle of a file, then tell the
; psjob to stop the job
rl w1 x3+d9 ; if job controlled
se w1 0 ; and
sz. w0 (b57.) ; not eof status then
jl. a1. ; begin
jl. w1 c11. ; prepare buffer;
rl. w1 b3. ; w1:= page 3
wa w1 x3+d8 ; + bufrel;
al w0 -1 ; status of answer := -1
rs w0 x1 ; (i.e. stop job);
jl. w1 c14. ; change buffer;
a1: ; end;
e.
\f
; btj 20.7.74 card reader read ...31...
b. a10 w.
; get a request line, assemble the text
rl. w2 b7. ;
jl. w3 (b18.) ; lock chained (request free);
rl. w2 (b30.) ;
rl w0 x2+10 ; save virt request line addr;
rs w0 x3+d21 ;
al. w2 g8. ; move <:card reader:> to
jl. w3 c10. ; request line;
rl w2 x3+d5 ;
rs w2 x1-2+6 ; move devicenumber to line;
al w2 x3+d2 ; move local devicename
jl. w3 c10. ; to request line;
rl w0 x3+d7 ; w0:= boss status;
so. w0 (b61.) ; text:=
am g3-g4 ; if enddeck+eof+eoj then
al. w2 g4. ; <:ready:> else <:attention:>;
sz. w0 (b62.) ; if timer then
al. w2 g5. ; text:= <:card jam:>;
so w0 1<1 ; if unknown, disconnected, unintelligible or rejected
al. w2 g6. ; then text:= <:disconnected:>;
sz. w0 (b59.) ; if overrun then
al. w2 g7. ; text:= <:data overrun:>;
sz w0 1 ; if modeerror then
al. w2 g16. ; text:= <:illegal jobfile mode:>;
jl. w3 c10. ; move text to request line;
rl. w2 g17. ;
rs w2 x1+6 ; terminate with newline;
ws. w1 b2. ; w1:= text length excluding newline;
rl w0 x3+d16 ;
sl w0 1 ; request line type:=
jl. a1. ; if rb card reader then goto rb line;
sl. w2 g4. ; if request without bel then
jl. a2. ; goto insert line
am 1<3-1<2; code:= insert line with bel
a1: am 1<2 ; rb line
a2: al w0 1<1 ; insert line
rl. w2 b2. ; w2:= request line;
ds w1 x2+4 ; save request line type and text length;
dl w1 x3+d32+2 ; move rb parent description
ds w1 x2+e10-2 ; to last part of request line;
e.
\f
; btj 20.7.74 card reader read ...32...
; write the request line:
; if rb card reader then send the text
; in operator mode to the card reader process.
b. a10 w.
rl. w1 b2. ; w1:= abs request line;
rl. w2 b8. ; w2:= request queue;
jl. w3 (b19.) ; open chained(w1,w2);
rl w0 x3+d16 ;
sh w0 0 ; if rb card reader then
jl. a2. ; begin
a1: rl. w2 (b30.) ; write request:
rl w1 x3+d21 ;
rs w1 x2+10 ; page 2:= virt request line;
jl. w3 (b21.) ; get pages;
rl. w1 b2. ;
al w1 x1+6 ; w1:= abs first of line;
al w2 x1-2 ;
wa w2 x2 ; w2:= abs last of line including newline;
al w2 x2+2 ;
ds w2 x3+d22+4 ; save in operator message;
al w1 x3+d22 ;
al w3 x3+d1 ;
jd 1<11+4 ; get process description address
rs w0 x3+d22+6-d1; set process description address in operator output
al. w2 b80. ; w2:=address(host)
jl. w3 (b20.) ; send and wait slow(cardreader,operator output);
a2: ; end;
e.
\f
; btj 20.7.74 card reader read ...33...
; if the status contains any of:
; unknown, disconnected, unintellibible, rejected, mode error
; or (optionally) if it is a rb card reader and
; the status contains: enddeck + eof + eoj (i.e. cardreader ready)
; then the card reader is released
b. a10 w.
rl w0 x3+d7 ; w0:= boss status;
c.i201
rl w1 x3+d16 ;
sl w1 1 ; if rb card reader and
so. w0 (b61.) ; enddeck + eof + eoj
z.
sz w0 8.75 ; or not normal answer or mode error
jl. 4 ; then
jl. a3. ; begin
rl w1 x3+d16 ; if std card reader then
sh w1 0 ;
jl. a1. ; goto release;
al w1 x3+d20 ; w1:= release request line operation;
rl. w2 b8. ; w2:= request queue; (i.e. it acts as a print line)
jl. w3 (b19.) ; open chained (w1,w2);
rl w2 x3+d20+4 ;
jl. w3 (b16.) ; lock (answer sem);
f32 = k-b0 ; entry rb card reader
al w0 0 ; virt request line:= 0;
rs w0 x3+d21 ;
rl. w0 b61. ; status := em + eof + eoj;
rs w0 x3+d7 ;
a1: dl. w3 b34. ;
jl. w1 (b22.) ; call (release and wait);
jl. a5. ; goto set mode;
a3: ; end;
; if status contains data overrun then
; wait for the operator to type the start command
so. w0 (b59.) ; if data overrun then
jl. a4. ;
dl. w3 b32. ;
jl. w1 (b22.) ; call(wait start operation);
a5: rl w0 x3+d16 ; set mode:
sl w0 0 ; if old std cardreader then
jl. a4. ; begin
rl w1 x3+d11 ; w1:=card type;
rl. w0 x1+g9. ; w0:=end card word(card type);
rs. w0 b39.+2 ; save in message;
al. w1 b39. ;
al w2 x3+d1 ;
jl. w3 (b15.) ; send and wait(cardreader, set mode);
; end;
a4:
; wait until the cardreader becomes ready
al. w1 b36. ;
al w2 x3+d1 ; send and wait(cardreader,sense ready);
jl. w3 (b15.) ;
sz. w0 (b62.) ; if timeout then
jl. a4. ; goto wait...;
; if the requestline is still pending then release it
rl w0 x3+d21 ; if virt requestline <> 0 then
sn w0 0 ;
jl. a2. ; begin
al w1 x3+d20 ; w1:= release request line operations;
rl. w2 b8. ; w2:= request queue;
jl. w3 (b19.) ; open chained(w1,w2);
rl w2 x3+d20+4 ;
jl. w3 (b16.) ; lock(answer sem);
a2: ; end;
e.
\f
; btj 20.7.74 card reader read ...34...
; next action
c7: rl w0 x3+d7 ; w0:= boss status;
so. w0 (b57.) ; if not end card then
jl. c2. ; goto read block;
so. w0 (b66.) ; if not end job card then
jl. c8. ; goto wait psjob operation;
al w1 x3+d30 ; w1:= banker operation;
rl. w2 b9. ; w2:= banker queue;
jl. w3 (b19.) ; open chained (cardjob ready);
rl w2 x3+d31 ;
jl. w3 (b16.) ; lock(answer sem);
al w1 x3+d30 ; w1:= card reader operation
rl. w2 b10. ; w2:= free queue;
jl. w3 (b19.) ; open chained;
al w0 0 ;
rs w0 x3+d13 ; local file count:= 0;
; wait ps-job operation
b. a10 , j10 w.
c8: rl w2 x3+d35 ; lock chained (card reader queue);
jl. w3 (b18.) ;
rl. w2 (b30.) ;
rl w0 x2+10 ;
rs w0 x3+d26 ; save psjob operation addr;
j2: al w0 2 ; note: address part used as constant........
se w0 (x1+2) ; page 4 := if boss controlled then
wa w0 x1+10 ; global file count
bs. w0 j2.+1 ; else
rs w0 x2+14 ; 0;
rl w0 x1+2 ; controller:= (oper.controller
bs. w0 1 ; - 1)*8;
ls w0 3 ;
rs w0 x3+d9 ;
rl w0 x3+d16 ; if not old std cardreader then
sh w0 -1 ;
jl. a4. ; begin
;***until further are all files read in standard mode
al w0 10 ;
hs w0 x3+d6+1 ; op.mode:=10
al w0 2 ; operation.card length:= 2;
rs w0 x1+6 ;
al w0 80 ; actual cardsize:= 80;
rs w0 x3+d10 ; end
jl. a6. ; else begin
\f
; btj 20.7.74 card reader read ...35...
; test mode from operation (normal card reader)
a4: rl w1 x1+6 ; w1:= mode in operation;
c.-1
;***test for dct2000 cardreader
rl w2 (x3+d1+8) ; w2:= proc descr addr (cardreader);
rl w2 x2+0 ; w2:= process kind (cardreader);
sn w2 48 ; if cardreader = dct2000 then
al w1 10 ; mode:= decimal;
;***
z.
la. w1 b63. ; mode:= mode and mask;
sz w1 2 ; if ebcdic then
lo. w1 b64. ; add decimal;
hs w1 x3+d6+1 ; save mode in input operation;
la. w1 b65. ;
rs w1 x3+d11 ; card type:= mode extract boss bits;
rl. w0 x1+g0. ; actual cardsize:=
rs w0 x3+d10 ; card length(card type);
rl. w2 b2. ; move cardlength to
rs w0 x2+6 ; psjob operation;
rl. w0 x1+g9. ; w0:= end card word(card type);
rs. w0 b39.+2 ; save in message;
al. w1 b39. ;
al w2 x3+d1 ;
jl. w3 (b15.) ; send and wait(cardreader, set mode);
a6: ; end;
al w0 1 ; local block count := 1;
rs w0 x3+d12 ;
al w0 0 ;
rs w0 x3+d8 ; bufrel:= 0;
am (x3+d9) ;
rl w1 x3+d36 ; page 3:= first virt (controller);
rl. w2 (b30.) ;
rs w1 x2+12 ;
\f
; btj 20.7.74 card reader read ...35a...
; lock whole superbuffer
al w1 0 ; count:= 0;
a0: am (x3+d9) ; rep:
rl w2 x3+d38 ; w2:= free sem addr (controller);
al w0 0 ;
sh w0 (x2) ; if value(sem) >= 0 then
wa w1 x2 ; count:= count + value;
sh w0 (x2) ; if value(sem) >= 0 then
rs w0 x2 ; value(sem):= 0;
se w0 (x3+d9) ; if count = bufsize(controller)
am i52-i53;
sn w1 i53 ; then goto set value;
jl. a1. ;
al w1 x1+1 ; count:= count + 1;
rs w1 x3+d15 ;
jl. w3 (b16.) ; lock(free(controller));
rl w1 x3+d15 ;
jl. a0. ; goto rep;
a1: rs w1 x2 ; set value: value(sem):= count;
am (x3+d9) ; if value(full(controller)) <> 0 then
rl w0 (x3+d39) ;
se w0 0 ;
c.-1, o66 , z. ; (bossfault xref)
jd -66 ; bossfault(66);
jl. w3 (b16.) ; lock (free(controller));
rl w0 x3+d9 ; if job controlled then
se w0 0 ; goto read block;
jl. c2. ;
al w0 -1 ;
al w1 -1 ;
rl. w2 b4. ; global file count :=
ds w1 x2+2 ; global block count := -1;
jl. c2. ; goto read block;
e.
\f
; btj 20.7.74 card reader read ...36...
; compare
;
; called with w1 = start of card
; w2 = start of picture
; w3 = link
;
; on exit all registers are destroyed
; return to w3+2 if any difference is found
b. a0, j1
w.
c9: al w0 x2+14 ;
rs. w0 j0. ; j0 := top of picture;
a0: aa. w2 j1. ; rep: increase w1, w2;
sl. w2 (j0.) ; if w2 >= top then
jl x3+0 ; return to link+0;
rl w0 x2 ; if picture(x2) <>
se w0 (x1) ; card (x1) then
jl x3+2 ; return to link + 2;
jl. a0. ; goto rep;
j0: 0 ; saved top of picture;
2 ; increment to w1;
j1: 2 ; increment to w2;
e.
; move text (until NULL character)
;
; entry: w1 = to addr - 6, w2 = from addr, w3 = return
; exit: w1 = next to - 6, w2 = top from , w3 = page 1
b. a10 w.
c10: rs. w3 b40. ; save return
a0: rl w3 x2 ;
rs w3 x1+6 ; move word
se w3 0 ;
al w1 x1+2 ; update pointers
al w2 x2+2 ;
sz w3 255 ; if not end text then
jl. a0. ; goto move more;
rl. w3 b1. ; w3:= page 1;
jl. (b40.) ; return;
e.
f3=k-f2 ; length of card reader code page
\f
; btj 20.7.74 start card read ...37...
f4=k ; start of start card codepage
; this page is used both by commandio and card reader
b. h10, j20 w.
; page descriptions
b100: 0 ; page 0 code
b101: 0 ; page 1 job file page/card variables
b102: 0 ; page 2
b103: 0 ; page 3 not used/current virt buf
b104: 0 ; page 4 job descr page/global counters
62<12+0 ; pageident: start card
; cl entries
b115: 1 ; send and wait
b117: 4 ; open
b118: 5 ; lock chained
b119: 6 ; open chained
b122: 25 ; call
b123: 8 ; page jump
; virtual addresses
b130: 162 ; virt,
b131: 204 ; rel alarm print
b132: 140 ; virt,
b133: 142 ; rel. lookup device;
b155: 141 ; rel. lookup and reserve device;
b134: 202 ; virt,
b135: 203 ; rel after action
; constants
b127: <:std:>
b140: 0 ; for set catbase
b141: 10 ; decimal radix
b142: 1<16 ; attention status
b143: 255 ; mask
; device table.
; contains an entry for each std card reader
; and each rb card reader
;
; each entry contains:
h0 = 0 ; byte ; wait bits
h1 = 1, b97 = h1 ; byte ; devicenumber
h2 = 2, b98 = h2 ; word ; wait sem
h10= 4, b99 = h10 ; ; size of entry
b160:
c. i93+i200-1
4095,r.h10*(:i93+i200:) ; start of table
z.
b161: ; top table
; waitbits: 1<0==card reader is waiting for start operation
; 1<1==start operation is send from commandio
; devicenumber: -1==entry not in use, else devicenumber
; waitsem: chained semafor, used in common by card reader and commandio.
b162: -1 -1<0 ; card reader waiting:= false
b163: 1<0 ; card reader waiting:= true;
b164: -1-1<1 ; operation send:= false
b165: 1<1 ; operation send:= true
\f
; btj 20.7.74 start card read ...38...
; variables on job file page
j1=6 ; rel first param = <:card:>
j2=14 ; rel second - = <local devname> or the like
j3=22 ; rel third - = <rb printer name> or empty
j5=j3+6 ; index in device table
j6=j5+2 ; rel return from lookup device
;***** j5 must not be changed before the lookup procedures are generalized *****
; start card operation
j10=j6+2 ; word ; chain
j11=j10+2 ; word ; device number / result
j12=j11+2 ; dbword ; local devicename (first of dbword)
j13=j12+4 ; word ; std input mode
j14=j13+2 ; word ; operator mode
j18=j14+2 ; dbword ; rbprintername (first of dbword)
j15=j18+6 ; dbword ; dw. last
j17=j15+2 ; word ;+8 local terminal ident of starting rb terminal
c. j17-i46
m.*** i46 too small
z.
; commandio actions for <start card> command
;
; start card : mainconsole only, first std cardreader
;
; start card <devicenumber> : - - , specified cardreader
;
; start card <local name> <rbprintername> : rb terminal only, specified cardreader,
; primout on rbprintername if present
b. a10 w.
f36=k-b100 ; entry start card command
dl w1 x3+j2 ; w0w1:= param2;
sl w0 1 ; if empty or integer then
jl. a0. ; begin
c.i93-2
se w0 0 ; if more than one std cardreader
jl. c30. ; and empty then alarm(forbidden)
z.
c. i93-1
b150=k+1
rl w2 x3+134 ; if no std cardreaders or
so w2 1 ; not operator rights then
z.
jl. c30. ; alarm(<:forbidden:>);
al w2 -1 ;
rx w2 x3+j3-2 ; if param 3 not empty then
se w0 -1 ;
sn w2 -1 ; alarm(<:param:>);
jl. 4 ;
jl. c37. ;
se w0 0 ; if empty param then
bl. w1 b160.+h1; param:= devno(first entry);
jl. w3 c21. ; search card reader table;
jl. c31. ;+2 if not found: alarm(<:device not cardreader:>);
jl. w1 c26. ; set rb params
jl. c20. ; goto send operation;
a0: ; end;
\f
; btj 20.7.74 start card read ...39...
; test for rb terminal
am. (b104.) ; job descr page
b151=k+1
rl w2 +423 ; w2:= parent rb device name table addr;
sn w2 0 ; if not rb terminal then
jl. c30. ; alarm(<:forbidden:>);
ds w1 x3+j12+2 ; save local devicename in operation
jl. w1 c26. ; set rb params;
jl. w1 c24. ; lookup device; w1:= devno;
sn w1 0 ; if deviceno undefined then
jl. a1. ; goto get entry;
; a process exists in rc4000 with that local devicename
; search the cardreadertable to see if it is already connected
jl. w3 c21. ; search whole cardreadertable;
jl. 4 ;+2 if device found in table then
jl. c20. ; goto send operation;
; before using the process: test the devno and reserver
jl. w2 c25. ; check process descriptions;
; the devicenumber seems to be ok
; find an available entry in cardreadertable
a1: al w1 -1 ; get entry: w1:= free entry;
jl. w3 c21. ; search whole cardreader table;
jl. c32. ;+2 if not found: alarm(<:no more cardreaders:>);
; reserve the cardreader at remote batch terminal station
rl. w3 b101. ; w3:=job file page;
jl. w1 c23. ; lookup and reserve device; w1:= devno;
sn w1 0 ; if deviceno undefined then
jl. c31. ; alarm(<:device not cardreader:>);
; search the cardreadertable again to ensure that the
; same cardreader will not be used twice
jl. w3 c21. ; search whole cardreadertable;
jl. 4 ;+2 if device found in table then
jl. c33. ; alarm(<:cardreader busy:>);
; check the devicenumber etc and find (and initialize)
; the available cardreadertable entry
al w1 -1 ; w1:= free entry;
jl. w3 c21. ; search whole cardreadertable;
jl. c32. ;+2 if table full: alarm(<:no more cardreaders:>);
rl. w3 b101. ; w3:=job file page;
rl w1 x3+j11 ;
hs. w1 x2+b160.+h1; cardreadertable.devno(index):= devicenumber;
e.
\f
; btj 20.7.74 start card read ...40...
; send operation to cardreader
; entry: w2=rel entry in cardreader table
; if cardreader not waiting for start: alarm (busy).
; initialize operation
; send operation and wait answer.
; check result
c20: rl. w3 b101. ; w3:= job file page;
rs w2 x3+j5 ; save index;
bl. w0 x2+b160.+h0;
sz. w0 (b163.) ; if cardreader not waiting
sz. w0 (b165.) ; or operation send already then
jl. c33. ; alarm(<:cardreader busy:>);
lo. w0 b165. ;
hs. w0 x2+b160.+h0; operation send:= true;
al w1 x3+j10 ; w1:= start operation addr;
rl. w2 x2+b160.+h2; w2:= wait sem(index);
jl. w3 (b119.) ; open chained(w1,w2);
rl w2 x3+j5 ;
rl. w2 x2+b160.+h2; w2:= wait sem(index);
jl. w3 (b118.) ; lock chained(wait sem);
rl w2 x3+j5 ; w2:= index;
bl. w0 x2+b160.+h0;
la. w0 b164. ; operation send:= false;
hs. w0 x2+b160.+h0;
rl w0 x3+j11 ; w0:= result(operation);
se w0 0 ; if result <> ok then
jl. c34. ; alarm(<:not same mode:>);
dl. w3 b135. ;
jl. (b123.) ; page jump (after action);
; search cardreader table
;
; entry: w1 = deviceno, w3 = return
; exit : w0 undef, w2 = rel entry in device table
; if not in table: return to x3+0
; else: return to x3+2
b. a10 w.
c21: al w2 (:i93+i200:)*h10; search cardreadertable:
; w2:= top tablepart;
a0: al w2 x2-h10 ; rep: rel:= rel - 4;
sh w2 -1 ; if rel < 0 then
jl x3 ; error return;
bl. w0 x2+b160.+h1; if devicenumber(rel)
sn w0 x1 ; = deviceno then
jl x3+2 ; ok return;
jl. a0. ; goto rep;
e.
\f
; btj 20.7.74 start card read ...41...
b. a10 w.
c23: am 1 ; lookup and reserve:
c24: al w2 0 ; lookup device:
ws. w1 b100. ; w1:=rel return;
rs w1 x3+j6 ; save return;
dl w1 x3+j12+2 ; set device name;
ds w1 x3+r1+2 ;
ld w1 -100 ;
ds w1 x3+r1+6 ;
am. (b104.) ;
b156=k+1
dl w1 +529 ; set catalog base
ds w1 x3+r6+2 ;
b128=k+1
rl w0 x3+178 ;
rs w0 x3+r0 ; set abs ref message area
am. (b104.) ; set host ident;
b126=k+1
dl w1 +424 ;
ds w1 x3+r2+2 ;
al w0 16 ; set mode, kind;
al w1 0 ; set timeout;
ds w1 x3+r5+r4-r4;
se w2 1 ;
am b133-b155; lookup device
rl. w3 b155. ; lookup and reserve device
rl. w2 b132. ;
jl. w1 (b122.) ; call (rb procedure);
jl. a1. ;+2
rl w0 x3+r104 ;+4
se w0 16 ; if device not cardreader then
jl. c31. ; alarm;
rl w0 x3+r103 ;
rs w0 x3+j13 ; set std input mode in operation;
rs w1 x3+j14 ; set operator mode in operation;
rl w1 x3+r102 ;
rs w1 x3+j11 ; set device no;
rl w2 x3+r101 ; w2:=nta of device;
sn w2 0 ; if lookup and reserve then
jl. a2. ; begin
rl w2 x2 ; w2:=process description address;
dl w1 x2+4 ; move process name;
ds w1 x3+d1+2 ;
dl w1 x2+8 ;
ds w1 x3+d1+6 ; end;
a2:
rl w1 x3+j11 ; w1:=device number
am (x3+j6) ;
jl. b100. ; goto saved return;
a1: rl w0 x3+r100 ; w0:=result;
sn w0 6 ; if attention status then
jl. c36. ; alarm (last input lione skipped);
se w0 3 ; if no resources or
sn w0 4 ; time exceeded then
jl. c35. ; alarm (wait);
se w0 1 ; if unknown or
sn w0 5 ; disconnected then
jl. c31. ; alarm (device not card reader);
jl. c33. ; else alarm (busy);
e.
\f
; btj 20.7.74 start card read ...42...
; check process description
; entry: w1 = device number, w2 = return
; exit : w0w1 = undef, w2w3 unchanged
c25: ls w1 1 ;
wa w1 74 ; w1:= name table addr (devno);
sl w1 (76) ; if devno too large then
jl. c31. ; alarm(<:device not cardreader:>);
rl w1 x1 ; w1:= process description address;
rl w0 x1+12 ; w0:= reserver(process);
se w0 0 ; if process already reserved then
jl. c33. ; alarm(<:cardreader busy:>);
jl x2 ; return;
; procedure set rb params
; from job descr page of >start< console:
; parent rb device name table addr
; - - - creation number
; rb term ident
; rb printername is cleared in case of std card reader
; otherwise it is looked up and the parameter is set accordingly
c26: rl. w3 b101. ; w3:=job file page;
ws. w1 b100. ; w1:=rel return;
ds w2 x3+j6 ; save rel return, reader index;
b. a10 w.
ld w1 -100 ;
ds w1 x3+j18+2 ; default printer:=0;
rl. w2 b104. ;
b124=k+1
dl w1 x2+424 ; w0w1:=host ident;
ds w1 x3+j15+2 ; set host ident in operation;
se w0 0 ; if local terminal then
jl. a1. ;
; begin
dl w1 x3+j3 ;
sl w0 1 ; if param3=text then
jl. a5. ; alarm (param);
jl. a7. ; end else ok
a1: dl w1 x3+j3 ;
sh w0 0 ; if param3 not text then
al w0 1 ; printername:=1 (= some rbprinter);
sn. w0 (b127.) ; if param3=<:std:> then
se. w1 0 ;
jl. 4 ;
jl. a7. ; ok;
ds w1 x3+r1+2 ; set printername;
ds w1 x3+j18+2 ;
ld w1 -100 ;
ds w1 x3+r1+6 ;
b125=k+1
dl w1 x2+424 ; w0w1:=host description
ds w1 x3+r2+2 ; set device host description
b157=k+1
dl w1 x2+529 ;
ds w1 x3+r6+2 ; set catalog base
b129=k+1
rl w1 x3+178 ;
rs w1 x3+r0 ; set abs ref message area
al w1 14 ;
rs w1 x3+r4 ; set mode, kind
dl. w3 b133. ;
jl. w1 (b122.) ; call(lookup device);
jl. a2. ;+2 error return;
rl w0 x3+r104 ;+4 w0:=rc kind;
se w0 14 ; if device not printer then
jl. a4. ; alarm
jl. a7. ;
a2: rl w0 x3+r100 ; w0:=result;
sn w0 6 ; if attention status then
jl. a3. ; alarm;
sh w0 6 ; if result>6 or
so w0 1<0 ; result <> 1,3 or 5 then
jl. a7. ; ok else
dl w1 x3+j3 ; if param3 set then
se w0 -1 ;
jl. a6. ; device unknown else
ld w1 -100 ;
ds w1 x3+j18+2 ; set printername=0;
jl. a7. ;
a6: am 30-43 ; device unknown;
a3: am 43-27 ; last input line skipped;
a4: am 27-5 ; device not printer;
a5: al w0 5 ; param;
jl. c29. ; goto alarm;
a7:
dl w2 x3+j6 ; restore rel return, reader index;
jl. x1+b100. ; return;
e.
\f
; btj 20.7.74 start card read ...43...
; alarms for commandio start card action
c38: am 30-5 ; device unknown
c37: am 5-43 ; param
c36: am 43-49 ; last input line skipped
c35: am 49-48 ; wait
c34: am 48-47 ; not same mode
c33: am 47-46 ; card reader busy
c32: am 46-45 ; no more card readers
c31: am 45-1 ; device not card reader
c30: al w0 1 ; forbidden
; set param for alarm print
c29: rl. w3 b101. ;
rs w0 x3+4 ; save alarm index;
dl. w3 b131. ;
jl. (b123.) ; page jump(alarm print);
; release card reader
;
; page 1 = card variables, page 3 and 4 = irrell
f38=k-b100
al w0 0 ; clear std mode name;
rs w0 x3+d2 ;
al. w1 b160. ; w1:= cardreadertable
wa w1 x3+d14 ; + index;
al w0 -1 ;
sh. w1 b160.+i93*h10-1; if std cardreader then
jl. c28. ; goto wait for start operation;
hs w0 x1+h1 ; devicenumber(index):= free;
am (66) ; set catbase(boss maxbase);
dl w1 +74 ;
al. w3 b140. ;
jd 1<11+72;
rl. w3 b101. ;
al w3 x3+d1 ; remove process(cardreader);
jd 1<11+64;
\f
; btj 20.7.74 start card read ...44...
; wait start operation
;
; page 1 = card variables, page 3 = inputbuf, page 4 = global counts
b. a10 w.
f37=k-b100
c28: rl. w3 b101. ; wait for start operation:
al. w1 b160. ; w1:= devicetable
wa w1 x3+d14 ; + index;
bl w0 x1+h0 ;
lo. w0 b163. ; set waiting bit(index);
hs w0 x1+h0 ;
rl w2 x1+h2 ;
jl. w3 (b118.) ; lock chained(wait sem(index));
al w2 x1-j10 ; w2:= operation addr - start (i.e. first of jobfile);
rl w0 x3+d14 ; if std card reader then
sh w0 i93*h10-1;
jl. a3. ; goto reserve cardreader
dl w1 x3+d2+2 ; if rb cardreader not released then
sn w0 0 ; begin
jl. a1. ;
sn w0 (x2+j12) ; local devicename
; and
se w1 (x2+j12+2) ;
jl. a7. ; input mode
bz w0 x3+d6+1 ; must match:
se w0 (x2+j13) ;
jl. a7. ; if error then goto not same mode;
jl. a4. ; goto init parent words;
a1: ; end;
dl w1 x2+j12+2 ; move local device name;
ds w1 x3+d2+2 ;
dl w1 x2+j14 ; move std input mode
hs w0 x3+d6+1 ; operator mode (odd);
rl w1 x2+j11 ; convert devno to text;
al w0 0 ;
wd. w1 b141. ;
se w1 0 ; (layout=<<dd >)
al w1 x1+48 ;
ls w1 8 ;
wa w1 0 ;
al w1 x1+48 ;
ls w1 8 ;
al w1 x1+32 ;
rs w1 x3+d5 ; save in card variables;
\f
; btj 20.7.74 start card read ...45...
rl w2 x2+j11 ; name tab addr:= devno
ls w2 1 ; *2
wa w2 74 ; + first device in name table;
rs w2 x3+d1+8 ;
rl w2 x2 ; w2:= proc descr addr;
dl w1 x2+4 ;
ds w1 x3+d1+2 ; move process name
dl w1 x2+8 ;
ds w1 x3+d1+6 ;
; reserve cardreader
a3: ;
am (66) ; set catbase(boss maxbase);
dl w1 +74 ;
al. w3 b140. ;
jd 1<11+72;
rl. w3 b101. ;
al w3 x3+d1 ; reserve process(cardreader);
jd 1<11+8 ;
; initialize parent descriptions
a4: rl. w3 b101. ; move
rl. w2 b102. ;
al w2 x2-j10 ;
dl w1 x2+j18+2 ;
ds w1 x3+d44+2 ; rb printername
dl w1 x2+j15+2 ; parent rb device name table addr
ds w1 x3+d32+2 ; - - - creation number
rl w1 x2+j17 ; local term ident
rs w1 x3+d34 ;
jl. a8. ; goto answer ok;
; send answer to commandio
a7: am 1-0 ; result:= not original mode
a8: al w0 0 ; result.commio operation:= ok
rl. w1 b102. ;
rs w0 x1+j11-j10;
al. w2 b160. ;
wa w2 x3+d14 ;
rl w2 x2+h2 ; w2:= wait semaphore(index)
jl. w3 (b119.) ; open chained;
al. w1 b160. ;
wa w1 x3+d14 ; w1:= cardreadertable + index;
bl w0 x1+h0 ;
la. w0 b162. ; remove waiting bit (index);
hs w0 x1+h0 ;
; return to card reader code:
dl w3 x3+2 ;
jl. (b123.) ; page jump to return;
e.
i.
e. ; end start page
f5=k-f4 ; length of start card codepage
h3=h2. ; define link for initialization
i.
e. ; end b,c,d,f,g names for cardreader
\f
\f
; btj 28.10.71 psjob tape input read ...46...
; the reader is controlled by the psjob by means of a state-logic.
;
; state: meaning:
;
; -6 online reservation not checked yet.
; ( the first message checks the reservation, and sets
; the state -4, if ok)
;
; -4 reservation checked.
; the reader is ready for load message, which sets the
; state -2. the load message from the job causes banker-
; reserving of the reader and sending of a load-reader-
; line to the request display. input and sense are re-
; turned with normal answer and end medium status.
;
; -2 load message received.
; the input mode is checked, and the reader corutine is
; started. the first input-buffer page is locked, and the
; request line is released. ( the state is set to 0).
; ( continue with state >= 0)
;
; 0 input-buffer page not reserved.
; the next buffer page is locked. (continue with state>= 0)
;
; >=0 input transfer in progress.
; the ...state... is a relative address in the input buf-
; fer page, pointing at the answer, currently used.
; ( when the input buffer page is emptied, the state is
; set to 0, unless it is the end of the tape, in which
; case the state is set to -4)
\f
; btj 15.10.71 initialize pstape read ...47...
s. b100, c25, f100, g5 w.;
; external list:
b5., b6., b7., b8., b9., b13.
b17., b20., b21., b22., b86., b87.,
f0., f1., f2., f4., f5., f6., f7., f8., f9., f10.
f11., f12., f13., f14., f15., f18., f19., f20.
f21., f22., f23., f26., f27., f28., f29.
f31., f32., f33., f34., f35., f36., f37., f38., f39., f40.
f41.,
f42., f43., f44., f45., f46., f47., f48., f49., f50.
f51., f52., f53., f54., f55., f56., f57., f58., f59., f60.
f61., f62., f63., f64., f65., f67., f68., f69., f70.
f71., f72., f73., f74., f75., f76., f77., f78., f79., f80.
f81., f82., f83., f84.
c.-314, f91., f92., z. ; *** cf. page 54
h4: h5 ; define link for initialization
; initialize page:
al w0 i94 ; ...psjobtape on disc...
al w1 g1 ; ...length...
jl. w3 (f1.) ; reserve virtual;
al. w0 b0. ; ...start address...
jl. w3 (f2.) ; move to virtual;
rs. w2 f30. ;
jl. w3 (2) ; set externals;
f15: 40 ;
f30: 0 , 442 ; virt tape input;
g2 , 443 ; rel tape input;
0 , -1000 ; end of externals;
am. (4) ; goto initialize card reader;
jl. +4 ;
h2. ;
; variables used in initialization:
f0: 0 ; base of externals
f1: 12 ; reserve virt
f2: 13 ; move to virt
\f
; btj 15.10.71 pstape, externals and variables read ...48...
; definition of b-names
;
; pages and cl-entries
b0: 0 ; page 0 code and variables
b1: 0 ; page 1 job file page
b2: 0 ; page 2 (not used)
b3: 0 ; page 3 input buffer or job descr page
b4: 0 ; page 4 message
63<12+0 ; pageident: pstape
b5: 3 ; lock simple
b6: 4 ; open simple
b7: 6 ; open chained
b8: 8 ; page jump
b9: 7 ; get pages
;b10: 5 ; lock chained
; semaphores
b13: 56 ; tape reader que
;b85: 52 ; request line free
b86: 51 ; request que
b87: 67 ; banker que
; virtual addresses
f27: 320 ; addr of return point in psjob i/o
b17: 321 ;
b21: 473 ; addr of banker kill
b22: 364 ;
; absolute addresses
b20: 26 ; current corutine descr
; answer definitions
b30: 0 ; answer: status
b31: 0 ; no of bytes
b32: 0 ; no of chars
\f
; btj 15.10.71 pstape, variables read ...49...
; constants:
b40: 1<18 ; end of medium in status
;b43: -1-1<2 ; mask for clearing unwanted card-status bits
;b44: 1<1 ; card reader included (in online bits)
;b99: 10 ; divisor constant
;b100: <:load :>,<: :>; text constant
; variables:
; abs addresses
b45: 0 ; current answer(in buffer)
b46: 0 ; start of current buffer part
; other
b50: 0 ; length of current buffer.answer;
; relative addresses on page 1, job file page
b60= 176 ; job sem addr
b62= 446 ; state, and answer rel in tape reader buffer
b63= 447 ; start rel. of current buffer.answer
b64= 449 ; status of tape reader
b65= 448 ; current virt addr of tape reader buffer
b66= 429 ; next store in job input area
b67= 198 ; state, and answer rel in card reader buffer
b68= 450 ; start rel of current buffer.answer
b69= 200 ; status of cardreader
b70= 199 ; current virt addr of card reader buffer
b71= 201 ; card length
b72= 179 ; online bits
b73= 177 ; job descr page
b10= 148 ; reader device number on job descr page
; (leftmost byte = boss contr reader
; rightmost byte = job contr reader)
b11= 518 ; reader free sem (and temporarily at load - reader device number)
b12= 519 ; reader full sem
b15= 520 ; first virt reader buffer
b16= 521 ; top virt reader buffer
; relative addresses on page 3, job descr page
b80= 149 ; rel reader table
b74= 329 ; job name 1
b75= 330 ; job name 2
b76= 332 ; psjob operation: chain
b77= 334 ; +4 : psjob buf
b78= 348 ; banker operation + 2
b79= 325 ; dump area descr
\f
; btj 15.10.71 pstape, entry point and central return read ...50...
; a message to the tape reader is received
g2=k-b0
am. (b4.) ; ...operation address...
rl w2 +4 ; w2:=message buffer address;
rl w0 x2+10 ;
f71=k+1
rs w0 x3+b66 ; next store:=first store;
bl w0 x2+8 ; w0:= operation of message;
sn w0 3 ; if operation = input then
jl. c4. ; goto input message;
sz w0 -1-2 ; if operation <> (sense or sense ready) then
jl. c2. ; goto unintelligible;
; sense message received:
c7: ld w1 -100 ; init status:
ds. w1 b32. ; no of chars:=no of bytes:=0;
al w1 1<1 ; w1:=normal answer;
lo. w1 b40. ; and end of medium;
f4=k+1
bl w0 x3+b62 ; if state < 0 then
sh w0 -1 ;
f5=k+1
rs w1 x3+b64 ; logical status of tape reader:=w1;
c1: ; normal answer:
f6=k+1
rl w1 x3+b64 ; w1:=logical status;
al w0 -1<6 ;
la w0 2 ; w0:=status.answer
rs. w0 b30. ; :=logical status-result
ws w1 0 ; w1:=1<result;
jd-1
ci w1 -1-3 ; w1:=result-3;
jd-1
bl w1 3 ;
am x1 ;
c2: al w0 3 ; unintelligible: w0:=result;
jd-1
c0: al. w1 b30. ; send answer w1:= answer address;
am. (b4.) ;
rl w2 +4 ; w2:= message buffer address;
jd 1<11+22; send answer(w0, w1, w2);
c11: ld w2 65 ; exit:
am. (b4.) ; mess buf addr:= 0;
rs w1 +4 ;
rl. w3 (b20.) ; release page 3 and 4;
ds w2 x3+14 ;
dl. w3 b17. ; page jump to psjob i/o;
jl. (b8.) ;
; input message received:
c4: bl w1 x3+b62 ; w1:= state;
f7=c4+1
jd-1
sl w1 1 ; if state > 0 then
jl. c10. ; goto prepare transfer;
jl. x1+c5. ; goto action (state);
jl. c6. ; -6: goto check online reservation;
jl. c7. ; -4: goto init status;
jl. c8. ; -2: goto check mode;
c5: jl. c9. ; 0: goto reserve input;
\f
; btj 15.10.71 pstape, check reservation and inputmode read ...51...
; state -6. check online reservation
; continue with rejected answer or init status
c6:
al w0 -4 ; state := -4;
f35=k+1
hs w0 x3+b62 ;
jl. c7. ; goto init status;
; state -2. check mode:
; check mode
c8: rl. w2 (b20.) ; w2:= curr corutine...
f40=k+1
rl w0 x3+b73 ; page 3 descr:=
rs w0 x2+12 ; job descr page;
jl. w3 (b9.) ; get pages;
am. (b4.) ; ...operation address...
am (+4) ; ...message buffer address...
bz w0 +9 ; w0:= mode of message;
sz w0 -1<3+1 ; if mode is not 0, 2, 4 or 6 then
jl. c2. ; goto unintelligible;
f41=k+1
hs w0 x3+b63 ; save mode on job file page;
\f
; btj 11.2.72 pstape, prepare first input read ...52...
; stop job
am. (b3.) ; ...job descr address...
f42=k+1
al w1 +b78 ; w1:= banker operation address;
al w1 x1-2 ;
al w0 17 ; optype:= <stop job>;
hs w0 x1+2 ;
rl. w2 b87. ; w2:= banker que sem addr;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ;
f43=k+1
rl w2 +b77 ; w2:= psjob buf;
jl. w3 (b5.) ; lock(w2);
; get the tape reader from the banker
am. (b3.) ;
f67=k+1
al w1 +b78 ; w1:= operation address;
al w1 x1-2 ;
al w0 3 ; operation:= <reserve reader>;
hs w0 x1+2 ;
al w0 0 ; w0:= host ident;
rs w0 x1+4 ; set host ident in reserve reader operation;
f63=k+1
rl w0 x3+b11 ; w0:=reader device number (computed from loadmessage)
sh w0 -1 ; if exclusive device (dev.no < 0)
ac w0 (0) ; then change sign
am. (b3.) ; - job descr page -
am 1 ;
f64=k+1
hs w0 +b10 ; set reader device no on job descr page
rs w0 x1+6 ; set reader device no in reserve reader operation
rl. w2 b87. ; w2:= banker que;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ;
f68=k+1
rl w2 +b77 ; w2:= psjob buf;
jl. w3 (b5.) ; lock(w2);
am. (b3.) ; w1:= result;
f69=k+1
bz w1 +b78 ;
se w1 0 ; if killed then
jl. c14. ; begin
al w1 -6 ; regret the load, i.e.
f70=k+1
hs w1 x3+b62 ; state:= -6;
rl. w2 (b20.) ;
al w1 0 ;
rs w1 x2+8 ; page 1:= 0;
rx w1 x2+12 ; page 3:= 0;
rs w1 x2+14 ; page 4:= job descr;
dl. w3 b22. ;
jl. (b8.) ; page jump(banker kill);
; end;
\f
; re 11.10.73 pstape, prepare first input read ...53...
c14: am. (b3.) ; w1:= psjob operation address;
f44=k+1
al w1 +b76 ;
f45=k+1
bz w0 x3+b63 ; w0:= mode of operation;
rs w0 x1+6 ; save mode in operation;
f65=k+1
rl w0 x3+b11 ; w0:=device no (with sign)
sh w0 -1 ; if exclusive device (dev.no < 0)
am 1 ; then operation:=3 (=special job contr) else
al w0 2 ; optype:= job controlled;
rs w0 x1+2 ;
am. (b3.) ;
f79=k+1
al w2 +b78 ;
rl w0 x2+4 ; w0:=device number of reader;
rs w0 x1+14 ; set device number in operation;
f54=k+1
rl w0 x3+b65 ; move virtual request line address
rs w0 x1+12 ; to operation...
rl. w2 b13. ; w2:= tape reader que sem addr;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ;
f46=k+1
rl w2 +b77 ; w2:= psjob buf;
jl. w3 (b5.) ; lock(w2);
; reserve input
; release request line
rl. w2 b3. ; w2:=job descr page
f28=k+1
al w2 x2+b80 ; w2:=start of reader table
rl w0 x2+10 ; move:
f29=k+1
rs w0 x3+b11 ; reader free sem
rl w0 x2+12 ;
f62=k+1
rs w0 x3+b12 ; reader full sem
rl w0 x2+6 ;
f31=k+1
rs w0 x3+b15 ; virt first buffer
rl w0 x2+8 ;
f32=k+1
rs w0 x3+b16 ; virt top buffer
f33=k+1
rl w2 x3+b12 ; w2:=tape reader full sem
jl. w3 (b5.) ; lock(w2);
am. (b3.) ; ...job descr page...
f47=k+1
al w1 +b76 ; w1:= psjob operation addr;
f48=k+1
rl w0 x3+b65 ; move virt request line addr
rs w0 x1+6 ; to operation;
al w0 1 ; optype:= <remove line>;
rs w0 x1+2 ;
rl. w2 b86. ; w2:= request que sem;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ; w2:= psjob buf;
f49=k+1
rl w2 +b77 ;
jl. w3 (b5.) ; lock(w2);
\f
; btj 11.2.72 pstape, prepare input read ...54...
; start job
am. (b3.) ; w1:= banker operation address;
f50=k+1
al w1 +b78 ;
al w1 x1-2 ;
al w0 16 ; optype:= <start job>;
hs w0 x1+2 ;
rl. w2 (b20.) ;
rl w2 x2+12 ; w2:= virt of job descr page;
f53=k+1
al w2 x2+b79 ; w2:= virt of dump area descr;
rs w2 x1+4 ; save wirt in operation;
rl. w2 b87. ; w2:= banker que sem addr;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ; w2:= psjob buf;
f51=k+1
rl w2 +b77 ;
jl. w3 (b5.) ; lock(w2);
; initialize state, startrel and curr virt
; continue with prepare transfer
al w0 0 ;
f9=k+1
hs w0 x3+b63 ; start rel:= 0;
f36=k+1
rl w0 x3+b15 ; current virt:=first virt
f52=k+1
rs w0 x3+b65 ;
jl. c12. ; goto prepare transfer;
; state 0. reserve input:
; reserve input
; continue in prepare transfer
f37=k+1
c9: rl w2 x3+b12 ; w2:=tape reader full sem
rl w0 x2 ;
se w0 0 ; if more input ready then
jl. c15. ; continue
; if no more input
; and status ok
; then
; set priority of job to 0 and wait for input
rl. w2 (b20.) ; w2:=current coroutine descr
f55=k+1
rl w0 x3+b73 ; w0:=virt job descr page
rs w0 x2+12 ;
jl. w3 (b9.) ; get pages
al w0 0 ; priority:=0
jl. w2 c16. ; set priority and update arrival
c.-314 ; *** cf. p. 47 ; if the moon is made of green cheese then
rl. w1 b3. ; begin
c91=k+1
al w1 x1+b78 ; w1:=banker operation address;
al w1 x1-2 ;
al w0 17 ; operation:= <stop job>;
hs w0 x1+2 ;
rl. w2 b87. ; w2:=banker queue;
jl. w3 (b7.) ; open chained(w1,w2);
rl. w2 b3. ;
f92=k+1
al w2 x2+b77 ;
jl. w3 (b5.) ; lock(psjob buf);
z. ; end;
f61=k+1
rl w2 x3+b12 ; w2:=reader full sem
jl. w3 (b5.) ; lock(w2)
rl. w3 b3. ; w3:=job descr page
f80=k+1
al w1 x3+b78 ;
al w1 x1-2 ; w1:=banker operation
al w0 15 ;
hs w0 x1+2 ; operation:=set timer
al w2 -100 ;
rs w2 x1+4 ;
rl. w2 b87. ; w2:=banker queue
jl. w3 (b7.) ; opench(w2)
rl. w3 b3. ; w3:=job descr page
f81=k+1
rl w2 x3+b77 ; w2:=psjob buf
jl. w3 (b5.) ; lock(w2)
rl. w3 b3. ; w3:=job descr page
f82=k+1
al w1 x3+b78 ;
al w1 x1-2 ; w1:=banker operation
al w0 22 ;
hs w0 x1+2 ; operation:=update run left
f83=k+1
rl w2 x3+525 ; w2:=total net time
ws w2 x1+4 ; - net run left
al w3 x2 ;
ds w3 x1+6 ; set time increments
rl. w2 b87. ; w2:=banker queue
jl. w3 (b7.) ; opench(w2)
rl. w3 b3. ; w3:=job descr page
f84=k+1
rl w2 x3+b77 ; w2:=psjob buf
jl. w3 (b5.) ; lock(w2)
am. (b3.) ; - job descr page -
f56=k+1
bz w0 +524 ; w0:=priority
jl. w2 c16. ; set priority and update arrival
jl. c12. ;
c15:
jl. w3 (b5.) ; lock(w2);
c12: al w0 1 ; state := 1;
f8=k+1
hs w0 x3+b62 ;
; state > 0. prepare transfer:
; get the buffer segment into core
; lock job in core
c10: rl. w2 (b20.) ; page 3 descr:= curr virt
f10=k+1
rl w0 x3+b65 ; of input buffer;
rs w0 x2+12 ;
jl. w3 (b9.) ; get pages
rl. w0 (b3.) ; w0:=status,result of first answer on segment
se w0 -1 ; if w0 = -1 (end segment) or
sn w0 -2 ; w0 = -2 (stream empty) then
jl. c17. ; goto update current virtual address
f11=k+1
rl w2 x3+b60 ; lock job in core;
jl. w3 (b5.) ;\f
; btj 15.10.71 pstape, transfer from buffer to job read ...55...
; transfer characters from input buffer to job input area.
; get addresses of buffer answer and job message
rl. w1 b3. ; w1:= start of input buffer;
f12=k+1
ba w1 x3+b62 ; + answer rel;
rs. w1 b45. ;
al w0 x1+6 ; w0:= start of answer
f13=k+1
ba w0 x3+b63 ; + start rel;
rs. w0 b46. ;
am. (b4.) ; ...operation address...
rl w2 +4 ; w2:= message buffer address;
rl w1 x1+2 ; w1:= input length:= no of bytes
f14=k+1
bs w1 x3+b63 ; - start rel;
rs. w1 b50. ;
rl w2 x2+12 ;
f72=k+1
ws w2 x3+b66 ; w2:=job input area length;
al w2 x2+2 ;
; now w1 and w2 contains the length of the job input area
; and the rest of the super buffer part.
; if the job input area is big enough to contain all the
; input left in the superbuffer part then this is done
; otherwise only that part of the super buffer part which
; fits into the job input area is transferred and a normal status
; is generated.
sh w2 x1 ; w1:=min(w1,w2);
al w1 x2 ;
rs. w1 b31. ; no of bytes moved:=w1;
f73=k+1
rl w2 x3+b66 ; w2:=next store;
al w3 x1 ; w3:=no of bytes;
rl. w1 b45. ; w0:= if startrel=0 then
rl w0 x1 ; status from current answer
al w1 x1+6 ;
se. w1 (b46.) ;
al w0 0 ; else o; (for testoutput)
rl. w1 b46. ; w1:=start abs;
\f
; btj 15.10.71 pstape, compute status read ...56...
b. a3 w. ;
jd-1
a1: al w3 x3-2 ; move:
sh w3 -1 ;
jl. a0. ;
rl w0 x1 ;
rs w0 x2 ; move(no of bytes/2) words
al w1 x1+2 ; from super buffer to job area;
al w2 x2+2 ;
jl. a1. ;
;....notice: at exit w1 points at the next from-word
; i.e. the status of next answer....
; the appropriate amount of characters have been transferred to
; the job input area.
; if the super buffer is emptied, answer rel and start rel are
; updated. if all the segment is emptied, the virtual buffer address
; is updated too, and the segment is free'ed.
a0: rl. w3 b1. ; (w3 := start of page 1, job file page;)
f74=k+1
rs w2 x3+b66 ; update next store;
rl. w0 (b45.) ; w0:=status of current answer;
rl. w2 b31. ;
se. w2 (b50.) ; status:=if buffer part is emptied then
al w0 1<1 ; status from buffer
rs. w0 b30. ; else normal status;
f75=k+1
bl w0 x3+b63 ;
wa. w0 b31. ; if buffer part is not emptied then
se. w2 (b50.) ; goto update start rel;
jl. a3. ;
al w0 x1 ; w0:= answer rel:= addr of next from-word
ws. w0 b3. ; - start of buffer;
rl w2 x1 ; if next word contains
sh w2 -1 ; -1 (=end segment) or
sh w2 -3 ; -2 (=stream empty) then
jl. a2. ; begin
rs. w2 b31. ; save abs ref next status
c17: al w0 512 ; virt:= curr virt + 512;
f19=k+1
wa w0 x3+b65 ;
f38=k+1
sn w0 (x3+b16) ; if virt=top then
f39=k+1
rl w0 x3+b15 ; virt:=first virt
f20=k+1
rs w0 x3+b65 ; current virt:= virt;
f34=k+1
rl w2 x3+b11 ; open(reader free)
jl. w3 (b6.) ;
al w0 0 ; w0:= answer rel:= 0;
f21=k+1
a2: hs w0 x3+b62 ; end;
rl. w0 (b3.) ; w0:=status,result of first answer on segment
se w0 -1 ; if w0 = -1 (= end segment) or
sn w0 -2 ; w0 = -2 (= stream empty) then
jl. c9. ; goto await next input buffer
al w0 0 ; w0 := 0;
a3: hs w0 x3+b63 ; update start rel: start rel := w0;
f18=a3+1
e. ;
\f
; btj 15.10.71 pstape, compute status read ...57...
c13: rl w2 x3+b60 ; open job in core;
f22=c13+1
jl. w3 (b6.) ;
; check whether there is more to be moved or not
am. (b4.) ; ...operation address...
rl w2 +4 ; w2:=message buffer address;
rl w0 x2+12 ;
f76=k+1
ws w0 x3+b66 ;
rl. w1 b30. ;
rx. w0 b31. ; w0:=next status
sn w0 -2 ; if buffer empty and no more input then
jl. f77. ; goto prepare answer
rx. w0 b31. ; else reestablish w0
sl w0 0 ; if (last store - next store) >= 0
se w1 1<1 ; and status = 0 then
jl. 4 ; goto input received
jl. c4. ; (i.e. move some more)
; prepare the answer
f77=k+1
rs w1 x3+b64 ; save status on job file page;
f78=k+1
rl w0 x3+b66 ; w0:=total no of bytes moved;
ws w0 x2+10 ;
rs. w0 b31. ; no of bytes := w0;
ls w0 -1 ;
wa. w0 b31. ;
rs. w0 b32. ; no of chars := no of bytes / 2 * 3;
; check end document status: possibly set state := -4
f23=k+1
rl w0 x3+b64 ; w0:= tape reader status;
al w1 -4 ;
sz w0 1<1 ; if not normal answer or
sz. w0 (b40.) ; if end document then
f26=k+1
hs w1 x3+b62 ; state := -4;
jl. c1. ; goto normal answer;
; procedure set priority and update arrival, run left
;
; call return
;
; w0 priority destroyed
; w1 irrelevant destroyed
; w2 return destroyed
; w3 page 1 page 1
;
b. a10 w.
c16: ws. w2 b0. ; w2:=rel return
rl. w3 b3. ; w3:=abs job descr page
rs w2 x3+a0 ; save relative return
f58=k+1
al w1 x3+b78 ;
al w1 x1-2 ; w1:=banker operation
rs w0 x1+6 ; set priority factor
al w0 28 ;
hs w0 x1+2 ; optype:=priority and start
rl. w2 (b20.) ;
rl w2 x2+12 ; w2:=virt job descr page
f59=k+1
al w2 x2+b79 ; w2:=virt dump area descr
rs w2 x1+4 ;
f57=k+1
rl w0 x3+525 ; w0:=total net time
rs w0 x1+8 ; set net run left
dl w3 110 ; w2w3:=clock
ad w3 11 ; w3:=now
ws. w2 a1. ; - offset
rs w2 x1+10 ; set arrival time
rl. w2 b87. ; w2:=banker queue
jl. w3 (b7.) ; opench(w2)
rl. w3 b3. ; w3:=abs job descr page
f60=k+1
rl w2 x3+b77 ; w2:=psjob buf
rl w3 x3+a0 ; w3:=rel return
wa. w3 b0. ; +abs page 0
jl. (b5.) ; lock(w2) and return
a0=4
a1: i193 ; arrival time offset
e.
g1=k-b0 ; length of page
h5=h4. ; define link for initialization
i.e. ; end b, c, f and g-names
\f
; btj 28.10.71 psjob card input read ...58...
; the reader is controlled by the psjob by means of a state-logic.
;
; state: meaning:
;
; -8 after end job card: as -4, but load not allowed
; -6 online reservation not checked yet.
; ( the first message checks the reservation, and sets
; the state -4, if ok)
;
; -4 reservation checked.
; the reader is ready for load message, which sets the
; state -2. the load message from the job causes banker-
; reserving of the reader and sending of a load-reader-
; line to the request display. input and sense are re-
; turned with normal answer and end medium status.
;
; -2 load message received.
; the input mode is checked, and the reader corutine is
; started. the first input-buffer page is locked, and the
; request line is released. ( the state is set to 0).
; ( continue with state >= 0)
;
; 0 input-buffer page not reserved.
; the next buffer page is locked. (continue with state>= 0)
;
; >=0 input transfer in progress.
; the ...state... is a relative address in the input buf-
; fer page, pointing at the answer, currently used.
; ( when the input buffer page is emptied, the state is
; set to 0, unless it is the end of the tape, in which
; case the state is set to -4)
\f
; btj 15.10.71 pscard, initialization read ...59...
s. b100, c25, f100, g5 w.;
; external list:
b5., b6., b7., b8., b9.,
b17., b20., b87.
f0., f1., f2., f4., f5., f6., f7., f8., f9., f10.
f11., f12., f13., f14., f15., f16., f18., f19., f20.
f21., f22., f23., f24., f25., f26., f27.,
f32., f33., f35., f40., f42., f43., f44., f46., f47., f48., f49., f50., f52., f53., f54.
f55., f56., f57., f58., f59., f60., f61., f62., f63., f64.
f65., f66., f67., f68., f71.
f72., f73., f74., f75., f76., f77., f78.
h6: h7 ; define link for initialization
; initialize page:
al w0 i95 ; ...psjob card on disc...
al w1 g1 ; ...length...
jl. w3 (f1.) ; reserve virtual;
al. w0 b0. ; ...start address...
jl. w3 (f2.) ; move to virtual;
rs. w2 f17. ;
jl. w3 (2) ; set externals;
f16: 40 ;
f17: 0 , 444 ; virt card input;
g2 , 445 ; rel card input;
0 , -1000 ; end of externals;
am. (4) ; goto initialize tpstape
jl. +4 ;
h4. ;
; variables used in initialization:
f0: 0 ; base of externals
f1: 12 ; reserve virt
f2: 13 ; move to virt
\f
; btj 15.10.71 pscard, externals and variables read ...60...
; definition of b-names
;
; pages and cl-entries
b0: 0 ; page 0 code and variables
b1: 0 ; page 1 job file page
b2: 0 ; page 2 (not used)
b3: 0 ; page 3 input buffer or job descr page
b4: 0 ; page 4 message
64<12+0 ; pageident: pscard
b5: 3 ; lock simple
b6: 4 ; open simple
b7: 6 ; open chained
b8: 8 ; page jump
b9: 7 ; get pages
;b10: 5 ; lock chained
; semafores
;b11: 65 ; tape reader free job
;b12: 66 ; tape reader full job
;b13: 56 ; tape reader que
;b85: 52 ; request line free
;b86: 51 ; request que
b87: 67 ; banker que
; virtual addresses
;b15: 166 ; first virt of tape reader buffer
;b16: 167 ; top virt of tape reader buffer
f27: 320 ; addr of return point in psjob i/o
b17: 321 ;
; absolute addresses
b20: 26 ; current corutine descr
; answer definitions
b30: 0 ; answer: status
b31: 0 ; no of bytes
b32: 0 ; no of chars
0 ; no of error free chars (temp: no of erroneous chars)
\f
; btj 15.10.71 pscard, variables read ...61...
; constants:
b40: 1<18 ; end of medium in status
b43: -1-1<2 ; mask for clearing unwanted card-status bits
;b44: 1<0 ; card reader included (in online bits)
;b99: 10 ; divisor constant
; variables:
; abs addresses
b45: 0 ; current answer(in buffer)
b46: 0 ; start of current buffer part
; other
b50: 0 ; length of current buffer.answer;
; relative addresses on page 1, job file page
b60= 176 ; job sem addr
b62= 446 ; state, and answer rel in tape reader buffer
b63= 447 ; start rel. of current buffer.answer
b64= 449 ; status of tape reader
b65= 448 ; current virt addr of tape reader buffer
b66= 429 ; next store in job input area
b67= 198 ; state, and answer rel in card reader buffer
b68= 450 ; start rel of current buffer.answer
b69= 200 ; status of cardreader
b70= 199 ; current virt addr of card reader buffer
b71= 201 ; card length
b72= 179 ; online bits
b73= 177 ; job descr page
b80= 367 ; card reader free job
b81= 368 ; - - full -
b90= 369 ; first virt of buffer
b91= 370 ; top - - -
; relative addresses on page 3, job descr page
b74= 329 ; job name 1
b75= 330 ; job name 2
b76= 332 ; psjob operation: chain
b77= 334 ; +4 : psjob buf
b78= 348 ; banker operation + 2
b79= 325 ; dump area descr
b82= 371 ; card reader queue
\f
; btj 15.10.71 pscard, entry point and central return read ...62...
; a message to the card reader is received
g2=k-b0
am. (b4.) ; ...operation address...
rl w2 +4 ; w2:=message buffer address;
rl w0 x2+10 ;
f71=k+1
rs w0 x3+b66 ; next store := first store;
bl w0 x2+8 ; w0:= operation of message;
sn w0 3 ; if operation = input then
jl. c4. ; goto input message;
se w0 0 ; if operation <> sense then
jl. c2. ; goto unintelligible;
; sense message received:
c7: al w0 0 ; init status:
rs. w0 b31. ; no of chars := no of bytes := 0;
rs. w0 b32. ;
rs. w0 b32.+2 ; no of error free chars := 0;
f4=k+1
bl w0 x3+b67 ; w0:= state;
sl w0 0 ; if state < 0 then
jl. c1. ;
rl. w0 b40. ;
f5=k+1
rs w0 x3+b69 ; status of card reader:= end medium;
c1: am -2 ; normal answer:
c2: am 1 ; unintelligible:
c3: al w0 2 ; rejected: result:= 1 or 3 or 2;
f6=k+1
rl w1 x3+b69 ; status.answer := status in job file descr;
rs. w1 b30. ;
jd-1
c0: al. w1 b30. ; send answer w1:= answer address;
am. (b4.) ;
rl w2 +4 ; w2:= message buffer address;
jd 1<11+22; send answer(w0, w1, w2);
c11: ld w2 -100 ; exit:
am. (b4.) ; mess buf addr:= 0;
rs w1 +4 ;
rl. w3 (b20.) ; release page 3 and 4;
ds w2 x3+14 ;
dl. w3 b17. ; page jump to psjob i/o;
jl. (b8.) ;
; input message received:
c4: bl w1 x3+b67 ; w1:= state;
f7=c4+1
jd-1
sl w1 1 ; if state > 0 then
jl. c10. ; goto prepare transfer;
jl. x1+c5. ; goto action (state);
jl. c7. ; -8: goto init status;
jl. c6. ; -6: goto check online reservation;
jl. c7. ; -4: goto init status;
jl. c8. ; -2: goto check mode;
c5: jl. c9. ; 0: goto reserve input;
\f
; btj 15.10.71 pscard, check reservation and inputmode read ...63...
; state -6. check online reservation
; continue with rejected answer or init status
c6:
al w0 -4 ; state := -4;
f35=k+1
hs w0 x3+b67 ;
jl. c7. ; goto init status;
; state -2. check mode:
; check mode
c8: rl. w2 (b20.) ; page 3 := job descr page;
f53=k+1
rl w1 x3+b73 ;
rs w1 x2+12 ;
jl. w3 (b9.) ; get pages;
am. (b4.) ; ...operation address...
am (+4) ; ...message buffer address...
bz w0 +9 ; w0:= mode of message;
sz w0 2 ; if ebcdic
sz w0 8 ; and not decimal
sz w0 (:-1:)<8+1<6+1; or pure mark sense mode or illegal then
jl. c2. ; goto unintelligible;
am. (b3.) ; w1:= psjob operation address;
f44=k+1
al w1 +b76 ;
rs w0 x1+6 ; save mode in operation;
al w0 2 ; optype:= job controlled;
rs w0 x1+2 ;
am. (b3.) ;
f50=k+1
rl w2 +b82 ; w2:= card reader que sem addr;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ;
f46=k+1
rl w2 +b77 ; w2:= psjob buf;
jl. w3 (b5.) ; lock(w2);
rl. w2 b3. ; w2 := job descr page;
f47=k+1
al w1 x2+b76 ; w1 := psjob operation address
rl w0 x1+2 ;
se w0 0 ; if illegal mode then
jl. c2. ; goto unintelligible;
rl w0 x1+6 ;
f40=k+1
hs w0 x3+b71 ; save card length on job file;
\f
; rc 21.6.72 pscard, prepare input read ...64...
; initialize state, startrel and curr virt
; continue with prepare transfer
al w0 0 ;
f9=k+1
hs w0 x3+b68 ; start rel:= 0;
f48=k+1
rl w0 x3+b90 ; current virt:= first virt;
f52=k+1
rs w0 x3+b70 ;
; state 0. reserve input:
; reserve input
; continue in prepare transfer
f49=k+1
c9: rl w2 x3+b81 ; w2:= card reader full sem addr;
jl. w3 (b5.) ; lock(w2);
al w0 1 ; state := 1;
f8=k+1
hs w0 x3+b67 ;
; state > 0. prepare transfer:
; get the buffer segment into core
; lock job in core
c10: rl. w2 (b20.) ; page 3 descr:= curr virt
jd-1
f10=k+1
rl w0 x3+b70 ; of input buffer;
rs w0 x2+12 ;
rl. w1 b3. ;
f61=k+1
ba w1 x3+b67 ; if status of current answer = -1 then
al w2 -1 ;
se w2 (x1) ;
jl. c15. ; begin
rl. w2 (b20.) ; w2:=current coroutine;
f62=k+1
rl w0 x3+b73 ; page 3 descr:= job descr page;
rs w0 x2+12 ;
jl. w3 (b9.) ; get pages;
; stop job
am. (b3.) ; ...job descr address...
f42=k+1
al w1 +b78 ;
al w1 x1-2 ; w1:=banker operation address;
al w0 17 ; optype:=< stop job >;
hs w0 x1+2 ;
rl. w2 b87. ; w2:=banker que sem addr;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ;
f43=k+1
rl w2 +b77 ; w2:=psjob buf;
jl. w3 (b5.) ; lock(w2);
\f
; re 22.10.73 pscard, prepare input read ...65...
; lock ( card reader full ) ;
f72=k+1
rl w2 x3+b81 ; w2:=card reader full sem addr;
jl. w3 (b5.) ; lock(w2);
al w0 1 ;
f63=k+1
hs w0 x3+b67 ; state:=1;
; start job
rl. w2 b3. ; w2:=job descr page;
f64=k+1
al w1 x2+b78 ;
al w1 x1-2 ; w1:=banker operation address;
al w0 16 ; optype:=< start job >;
hs w0 x1+2 ;
f65=k+1
al w2 x2+b79 ; w2:=virt of dump area descr;
rs w2 x1+4 ; save virt in operation;
rl. w2 b87. ; w2:=banker que sem addr;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ; w2:=psjob buf;
f66=k+1
rl w2 +b77 ;
jl. w3 (b5.) ; lock(w2);
al w0 512 ;
f67=k+1
wa w0 x3+b70 ; virt:=curr virt+512;
f73=k+1
sn w0 (x3+b91) ; if virt=top then
f74=k+1
rl w0 x3+b90 ; virt:=first virt;
f68=k+1
rs w0 x3+b70 ; current virt:=virt;
f75=k+1
rl w2 x3+b80 ;
jl. w3 (b6.) ; open(card free);
jl. c10. ; check next answer;
; end;
c15: ;
f11=k+1
rl w2 x3+b60 ; lock job in core;
jl. w3 (b5.) ;\f
; btj 15.10.71 pscard, transfer from buffer to job read ...66...
; transfer characters from input buffer to job input area.
b. a1 w. ;
; get addresses of buffer answer and job message
rl. w1 b3. ; w1:= start of input buffer;
f12=k+1
ba w1 x3+b67 ; + answer rel;
rs. w1 b45. ;
al w0 x1+8 ; w0:= start of answer
f13=k+1
ba w0 x3+b68 ; + start rel;
rs. w0 b46. ;
jd-1
am. (b4.) ; ...operation address...
rl w2 +4 ; w2:= message buffer address;
rl w1 x1+2 ; w1:= input length:= no of bytes
f14=k+1
bs w1 x3+b68 ; - start rel;
rs. w1 b50. ;
rl w0 x2+12 ; w0:= area length - 2;
f55=k+1
ws w0 x3+b66 ;
; now w0 and w1 contains the length of the job input area
; and the rest of the super buffer part.
; if the job input area is big enough to contain all the
; input then this is done else only that part of the
; super buffer which fits into the job input area is transferred
; and a normal status is generated.
jd-1
a0: sl w0 x1-2 ; rep: if area length < input length then
jl. a1. ;
f33=k+1
bs w1 x3+b71 ; input length := input length - card length
jl. a0. ; and goto rep;
a1:
sh w1 -1 ; if the area length is less than the
al w1 0 ; card length then input length := 0;
rs. w1 b31. ; no of bytes moved:=w1;
e. ;
\f
; btj 15.10.71 pscard, move read ...67...
b. a4 w. ;
al w2 0 ;
rs. w2 b32.+2 ; clear no of erroneous chars;
f56=k+1
rl w2 x3+b66 ; w2:= addr of first to-word;
al w3 x1 ;
rl. w1 b46. ; w1:= addr of first from-word;
jd-1
a1: al w3 x3-2 ; move:
sh w3 -1 ;
jl. a4. ;
rl w0 x1 ;
rs w0 x2 ; move(no of bytes/2) words
al w1 x1+2 ; from super buffer to job area;
al w2 x2+2 ;
jl. a1. ;
;....notice: at exit w1 points at the next from-word
; i.e. the status of next answer....
\f
; rc 21.6.72 pscard, compute status read ...68...
; the appropriate amount of characters have been transferred to
; the job input area.
; if the super buffer is emptied, answer rel and start rel are
; updated. if all the segment is emptied, the virtual buffer address
; is updated too, and the segment is free'ed.
a4: rl. w3 b1. ; (w3 := start of page 1, job file page;)
f57=k+1
rs w2 x3+b66 ; update next store;
rl. w0 (b45.) ; w0:=status of current answer;
rl. w2 b31. ; status:=if buffer part is emptied then
se. w2 (b50.) ; status from buffer
al w0 0 ; else
rs. w0 b30. ; normal status;
f15=k+1
bl w0 x3+b68 ; w0 := start rel
wa. w0 b31. ; + no of bytes;
se. w2 (b50.) ; if buffer part is not emptied then
; goto update start rel;
jl. a3. ;
rl. w2 b45. ; w2 := addr of answer in buffer;
rl w0 x2+4 ; w0:=no of chars
ws w0 x2+6 ; - no of error free chars;
rs. w0 b32.+2 ; save in no of erroneous chars;
ws. w1 b3. ; w1 := next answer rel;
al w0 x1 ; w0 := answer rel := w1;
rl. w2 b30. ; if end of medium
sz. w2 (b40.) ;
jl. a0. ; or
f32=k+1
ba w1 x3+b71 ; not room enough for another answer
sh w1 512-8 ; and at least one card then
jl. a2. ; begin
a0: al w0 512 ; virt:= curr virt + 512;
f19=k+1
wa w0 x3+b70 ;
f76=k+1
sn w0 (x3+b91) ; if virt = top then
f77=k+1
rl w0 x3+b90 ; virt := first virt;
f20=k+1
rs w0 x3+b70 ; current virt:= virt;
f78=k+1
rl w2 x3+b80 ; open(card free);
jl. w3 (b6.) ;
al w0 0 ; w0:= answer rel:= 0;
a2: hs w0 x3+b67 ; end;
f21=a2+1
al w0 0 ; w0 := 0;
a3: hs w0 x3+b68 ; update start rel: start rel := w0;
f18=a3+1
jd-1
e. ;
\f
; btj 15.10.71 pscard, compute status read ...69...
c13: rl w2 x3+b60 ; open job in core;
f22=c13+1
jl. w3 (b6.) ;
; check whether there is more to be moved or not
am. (b4.) ; ...operation address...
rl w2 +4 ; w2:=message buffer address;
rl w1 x2+12 ; w1:=top store;
al w1 x1+2 ;
f58=k+1
ws w1 x3+b66 ;
rl. w0 b30. ;
f54=k+1
bs w1 x3+b71 ; if (top store - next store) >= card length
sl w1 0 ;
se w0 0 ; and status = 0 then
jl. 4 ; goto input receiced
jl. c4. ; (i.e. move some more)
; generate the answer
f59=k+1
rs w0 x3+b69 ; save status on job file page;
f60=k+1
rl w0 x3+b66 ;
ws w0 x2+10 ; w0:=total no of bytes moved;
rs. w0 b31. ; no of bytes := w0;
ls w0 -1 ;
wa. w0 b31. ;
rs. w0 b32. ; no of chars:= no of bytes / 2 * 3
ws. w0 b32.+2 ;
rs. w0 b32.+2 ; no of error free chars:= no of chars
; - no of erroneous chars;
; check the card reader status:
; if end of job status then
; state := -8
; else
; if end of file status then
; state := -4
; continue with normal answer
f23=k+1
rl w0 x3+b69 ; w0 := card reader status;
sz w0 1<2 ; if end of job then
jl. c12. ; goto end job;
al w1 -4 ;
sz. w0 (b40.) ; if end of file then
f24=k+1
hs w1 x3+b67 ; state := -4;
jl. c1. ; goto normal answer;
c12: la. w0 b43. ; end job:
f25=k+1
rs w0 x3+b69 ; clear unwanted status bits;
al w0 -8 ;
f26=k+1
hs w0 x3+b67 ; state := -8;
jl. c1. ; goto normal answer;
g1=k-b0 ; length of page
h7=h6. ; define link for initialization
i.e. ; end b, c, f and g-names
\f
; btj 28.10.71 psjob load read ...70...
; the reader is controlled by the psjob by means of a state-logic.
;
; state: meaning:
;
; -6 online reservation not checked yet.
; ( the first message checks the reservation, and sets
; the state -4, if ok)
;
; -4 reservation checked.
; the reader is ready for load message, which sets the
; state -2. the load message from the job causes banker-
; reserving of the reader and sending of a load-reader-
; line to the request display. input and sense are re-
; turned with normal answer and end medium status.
;
; -2 load message received.
; the input mode is checked, and the reader corutine is
; started. the first input-buffer page is locked, and the
; request line is released. ( the state is set to 0).
; ( continue with state >= 0)
;
; 0 input-buffer page not reserved.
; the next buffer page is locked. (continue with state>= 0)
;
; >=0 input transfer in progress.
; the ...state... is a relative address in the input buf-
; fer page, pointing at the answer, currently used.
; ( when the input buffer page is emptied, the state is
; set to 0, unless it is the end of the tape, in which
; case the state is set to -4)
\f
; btj 15.10.71 psload, initialization read ...71...
s. b100, c25, f100, g5 w.;
; external list:
b5., b6., b7., b8., b9., b10., b13.
b17., b20., b85., b86., b87.
b21., b22.
f0., f1., f2., f5., f6., f7., f8., f9., f10.
f11., f12., f13., f14., f15., f16., f17., f18., f19., f20.
f21., f22., f23., f24., f25., f26., f27., f28., f29.
f30., f31., f32., f33., f34., f35., f36., f37., f38., f39., f40.
f41., f42., f43., f44., f45., f46., f47., f48., f49., f50.
f51., f52., f53., f54., f55., f56., f57., f58., f59., f60.
f61., f62., f63., f64., f65., f66., f67., f68., f69., f70.
f71., f72., f73., f74., f76., f77., f78., f79.
f80., f81., f82., f83., f84., f85.
0 ;
; initialize page:
al w0 i96 ; ...psload on disc...
al w1 g1 ; ...length...
jl. w3 (f1.) ; reserve virtual;
al. w0 b0. ; ...start address...
jl. w3 (f2.) ; move to virtual;
rs. w2 f75. ;
jl. w3 (2) ; set externals;
f74: 40 ;
f75: 0 , 440 ; virt entry load;
g3 , 441 ; rel entry load;
g2 , 437 ; rel entry for empty files;
0 , -1000 ; end of externals;
am. (4) ; goto initialize tpscard
jl. +4 ;
h6. ;
; variables used in initialization:
f0: 0 ; base of externals
f1: 12 ; reserve virt
f2: 13 ; move to virt
\f
; btj 15.10.71 psload, externals and variables read ...72...
; definition of b-names
;
; pages and cl-entries
b0: 0 ; page 0 code and variables
b1: 0 ; page 1 job file page
b2: 0 ; page 2 (not used)
b3: 0 ; page 3 input buffer or job descr page
b4: 0 ; page 4 message
65<12+0 ; pageident: psload
b5: 3 ; lock simple
b6: 4 ; open simple
b7: 6 ; open chained
b8: 8 ; page jump
b9: 7 ; get pages
b10: 5 ; lock chained
; semafores
b13: 56 ; tape reader que
b85: 52 ; request line free
b86: 51 ; request que
b87: 67 ; banker que
; virtual addresses
f27: 320 ; addr of return point in psjob i/o
b17: 321 ;
b21: 473 ; addr of banker kill...
b22: 364 ;
; absolute addresses
b20: 26 ; current corutine descr
; answer definitions
b30: 0 ; answer: status
b31: 0 ; no of bytes
b32: 0 ; no of chars
\f
; rc 21.6.72 psload, variables read ...73...
; reader operation
; constants:
b40: 1<18 ; end of medium in status
b41: <:car:> ; text constant
;b43: -1-1<2 ; mask for clearing unwanted card-status bits
b44: 1<0 ; card reader included (in online bits)
b98: 32 ; space
b99: 10 ; divisor constant
b100: <:load :>,<: :>; text constant
<: exceeded:> ;
; variables:
; abs addresses
;b45: 0 ; current answer(in buffer)
;b46: 0 ; start of current buffer part
; other
;b50: 0 ; length of current buffer.answer;
\f
; lkn 76.10.20 read ...73a...
; relative addresses on page 1, job file page
b60= 176 ; job sem addr
b62= 446 ; state, and answer rel in tape reader buffer
b63= 447 ; start rel. of current buffer.answer
b64= 449 ; status of tape reader
b65= 448 ; current virt addr of tape reader buffer
b66= 429 ; next store in job input area
b67= 198 ; state, and answer rel in card reader buffer
b68= 450 ; start rel of current buffer.answer
b69= 200 ; status of cardreader
b70= 199 ; current virt addr of card reader buffer
b71= 201 ; card length
b72= 179 ; online bits
b73= 177 ; job descr page
b80= 367 ; card reader free job
b81= 368 ; - - full -
b90= 369 ; first virt card buffer
b91= 370 ; top - - -
b11= 518 ; reader free sem
b12= 519 ; reader full sem
b15= 520 ; first virt sem
b16= 521 ; top virt buf
; relative addresses on page 3, job descr page
b74= 329 ; job name 1
b75= 330 ; job name 2
b76= 332 ; psjob operation: chain
b77= 334 ; +4 : psjob buf
b78= 348 ; banker operation + 2
b79= 325 ; dump area descr
b82= 371 ; card reader queue
b83= 148 ; reader device no
b94= 438 ; tape counter
b95= 439 ; tapes
\f
; btj 22.10.71 psload, entry point read ...74...
; entry finis files:
; the tape reader is emptied
; and the card reader is emptied, i.e. until an end job card is read.
; at entry: page 1 = job descr, page 3 = job file, page 4= job descr
g2=k-b0
rl. w2 (b20.) ; exchange page 1 and page 3:
rl w1 x2+12 ;
rx w1 x2+8 ;
rs w1 x2+12 ;
rl. w3 b1. ;
rx. w3 b3. ;
rs. w3 b1. ;
al w0 -1 ; finis files:= true;
f53=k+1
hs w0 x3+b63 ;
jl. c1. ; goto empty tape reader;
; a load message is received
; find out to which device...
g3=k-b0
am. (b4.) ; ...operation address...
am (+4) ; ...message buffer address...
rl w0 +16 ; w0:= first part of device name;
se. w0 (b41.) ; if w0 <> <:car:> then
jl. c1. ; goto tape reader;
b. a10 w. ;
; load card reader
; depending on the card reader state, take different actions:
c0: rl. w3 b1. ;
f5=k+1
bl w1 x3+b67 ; if state > 0 then
jd-1
sl w1 1 ; state:= 0;
al w1 0 ;
jl. x1+a1. ; goto action(state);
jl. c12. ; state -8
jl. a2. ; state -6
jl. a3. ; state -4
jl. a4. ; state -2
a1: jl. a5. ; state 0
\f
; btj 20.8.74 psload, card reader, check reservation read ...75...
; state -6:
; check reservation
; continue with state -4
a2: rl w0 x3+b72 ; w0:= online bits;
f6=a2+1
so. w0 (b44.) ; if card reader not included then
jl. c12. ; goto error exit;
; state -4:
; set buffer address, state:= -2
; goto normal answer
f16=k+1
a3: rl w0 x3+b90 ; current virt:= first virt;
f7=k+1
rs w0 x3+b70 ;
al w0 -2 ;
f8=k+1
hs w0 x3+b67 ; state:= -2;
jl. c10. ; goto normal answer;
; state -2:
; skip non-initialized file, state:= 0
; continue with state 0
a4: al w0 0 ;
f9=k+1
hs w0 x3+b67 ; state := 0;
am. (b3.) ;
f21=k+1
al w1 +b76 ; w1 := psjob operation address;
al w0 i118 ;
rs w0 x1+6 ; mode := std mode;
al w0 2 ;
rs w0 x1+2 ; optype := job controlled;
am. (b3.) ;
f22=k+1
rl w2 +b82 ; w2 := card reader queue;
jl. w3 (b7.) ; open chained;
am. (b3.) ;
f23=k+1
rl w2 +b77 ; w2 := psjob buf;
jl. w3 (b5.) ; lock(w2);
rl. w2 b3. ; w2 := job descr page;
f24=k+1
al w1 x2+b76 ; w1 := psjob operation;
rl w0 x1+2 ;
se w0 0 ; if mode error then
jl. a10. ; goto end boss file;
rl w0 x1+6 ;
f54=k+1
hs w0 x3+b71 ; card length := operation(2);
\f
; btj 22.10.71 psload, empty card file read ...76...
; state 0:
; empty card file, state:= -2
; continue with check status
a5: rl w0 x3+b70 ; page 3 descr:= curr virt;
f10=a5+1
rl. w2 (b20.) ;
rs w0 x2+12 ;
jl. w3 (b9.) ; get pages;
f11=k+1
bl w1 x3+b67 ; w1:= relative of answer;
se w1 0 ; if w1 <> 0 then
jl. a7. ; goto rep;
f25=k+1
a6: rl w2 x3+b81 ; get next segment:
jl. w3 (b5.) ; lock(segments full);
al w1 0 ; relative:= 0;
a7: al w2 512-8 ; w2:= last:= 512 - length of head
f12=k+1
bs w2 x3+b71 ; - card length;
a8: wa. w1 b3. ; rep: w1:= addr of answer;
rl w0 x1 ; w0:= status;
sn w0 -1 ; if status = operator intervention then
jl. a0. ; goto next segment;
sz. w0 (b40.) ; if end of document then
jl. a9. ; goto exit;
wa w1 x1+2 ; w1:= relative of next answer:=
al w1 x1+8 ; w1 + no of bytes + length of head
ws. w1 b3. ; - start of buffer;
sh w1 x2 ; if w1 <= last then
jl. a8. ; goto rep;
a0: am 2 ; relative:= 0 else
a9: al w1 -2 ; exit: state:= -2;
f13=k+1
hs w1 x3+b67 ;
f14=k+1
rs w0 x3+b69 ; save status in job file descr;
rl. w2 (b20.) ; deliver segment:
rl w1 x2+12 ; curr virt:= curr virt + 512;
al w1 x1+512 ;
f26=k+1
sn w1 (x3+b91) ; if curr virt = top virt then
f28=k+1
rl w1 x3+b90 ; curr virt := first virt;
rs w1 x2+12 ;
f29=k+1
rl w2 x3+b80 ; w2:= segments free sem;
jl. w3 (b6.) ; open(w2);
f15=k+1
bl w1 x3+b67 ; w1:= relative;
sn w1 0 ; if w1 = 0 then
jl. a6. ; goto get next segment;
\f
; btj 22.10.71 psload, reservation etc. read ...77...
rl. w2 (b20.) ;
f73=k+1
rl w1 x3+b73 ;
rs w1 x2+12 ; page 3 := job descr page;
jl. w3 (b9.) ; get pages;
; check status:
f17=k+1
rl w0 x3+b69 ; w0:= card status;
so w0 1<2 ; if not end of job then
jl. c10. ; goto normal answer;
am -2 ; state:=-8;
a10: al w0 -6 ; end boss file: state:= -6;
f18=k+1
hs w0 x3+b67 ;
f19=k+1
rl w0 x3+b72 ; w0:= online bits;
lx. w0 b44. ; clear reservation;
f20=k+1
rs w0 x3+b72 ;
jl. c10. ; goto normal answer;
e. ;
b. a9 w. ;
; load tape reader
; depending on the reader state, take different actions
c1: bl w1 x3+b62 ; if state > 0 then
jd-1
f30=c1+1
sl w1 1 ; state:= 0;
al w1 0 ;
jl. x1+a1. ; goto action(state);
jl. a2. ; state -6:
jl. a3. ; state -4:
jl. a4. ; state -2:
a1: jl. a5. ; state 0:
; state -6
; check online reservation
; continue with state -4
a2: rl w0 x3+b72 ; w0:= online bits;
f31=a2+1
so w0 1<2 ; if tape reader not online then
jl. c11. ; goto rejected answer;
\f
; re 75.06.19 psload, empty tape file read ...78...
; state -4
; state := -2
; goto load command
a3: al w1 -2 ; state := -2;
f32=k+1
hs w1 x3+b62 ;
jl. c2. ; goto load command;
; state -2
; skip non-initialized file, state := 0
; continue with state 0
a4: jl. w2 c13. ; stop job;
; get the tape reader from the banker
am. (b3.) ;
f43=k+1
al w1 +b78 ; w1:= operation address;
al w1 x1-2 ;
al w0 3 ; operation:= <reserve reader>;
hs w0 x1+2 ;
am. (b3.) ; - job descr page -
am 1 ; rightmost byte
f82=k+1
bz w0 +b83 ; w0:=job contr reader device no
rs w0 x1+6 ;
al w0 0 ;********* JOB CONTROLLED READING ONLY FROM LOCAL DEVICES
rs w0 x1+4 ; set host ident in operation
rl. w2 b87. ; w2:= banker que;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ;
f44=k+1
rl w2 +b77 ; w2:= psjob buf;
jl. w3 (b5.) ; lock(w2);
am. (b3.) ; w1:= result;
f69=k+1
bz w1 +b78 ;
se w1 0 ; if killed then
jl. c4. ; begin
al w1 -6 ; regret the load, i.e.
f70=k+1
hs w1 x3+b62 ; state:= -6;
rl. w2 (b20.) ;
al w1 0 ;
rs w1 x2+8 ; page 1:= 0;
rx w1 x2+12 ; page 3:= 0;
rs w1 x2+14 ; page 4:= job descr;
dl. w3 b22. ;
jl. (b8.) ; page jump(banker kill);
; end;
\f
; re 11.10.73 psload, empty tape file read ...79...
c4: am. (b3.) ; - job descr page -
f83=k+1
al w1 +b76 ; w1:=abs reader operation on job descr page
al w0 2 ;
rs w0 x1+2 ; op:=job controlled
al w0 4 ;
rs w0 x1+6 ;
am. (b3.) ; - job descr page -
am 1 ; rightmost byte
f84=k+1
bz w0 +b83 ; w0:=job contr reader device no
rs w0 x1+14 ; in reader operation;
f68=k+1
rl w0 x3+b65 ; move virtual request line address
rs w0 x1+12 ; to operation...
rl. w2 b13. ; w2:= tape reader que addr;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ; - job descr page -
am +4 ;
f85=k+1
rl w2 +b76 ; w2:=answer sem (=reader operation + 4);
jl. w3 (b5.) ; lock(w2);
f76=k+1
rl w2 x3+b12 ; w2:=segments full sem
jl. w3 (b5.) ; lock(w2);
am. (b3.) ; ...job descr page...
f58=k+1
al w1 +b76 ; w1 := psjob operation address;
al w0 1 ; optype:= <remove line>;
rs w0 x1+2 ;
f34=k+1
hs w0 x3+b62 ; state := 1;
f59=k+1
rl w0 x3+b65 ; move virt request line addrress
rs w0 x1+6 ; to operation;
rl. w2 b86. ; w2 := request que sem;
jl. w3 (b7.) ; open chained(w1,w2);
am. (b3.) ; w2 := psjob buf;
f60=k+1
rl w2 +b77 ;
jl. w3 (b5.) ; lock(w2);
jl. w2 c14. ; start job;
f77=k+1
rl w0 x3+b15 ; current virt:=first virt
f33=k+1
rs w0 x3+b65 ;
\f
; btj 22.10.71 psload, empty tape file read ...80...
; state 0
; empty tape reader, state:= -2, continue with load command
a5: jl. w2 c13. ; stop job;
f35=k+1
rl w0 x3+b65 ; page 3 descr:= curr virt;
rl. w2 (b20.) ;
rs w0 x2+12 ;
jl. w3 (b9.) ; get pages;
f36=k+1
bl w1 x3+b62 ; w1:= relative of answer;
se w1 0 ; if w1 <> 0 then
jl. a7. ; goto rep;
f78=k+1
a6: rl w2 x3+b12 ; get next segment
jl. w3 (b5.) ; lock(segments full);
al w1 0 ; relative:= 0;
a7: wa. w1 b3. ; w1:= addr of answer;
a8: rl w0 x1 ; rep: w0:= status;
sz w0 1<1 ; if normal answer and
sz. w0 (b40.) ; if end of document or end of segment then
jl. a9. ; goto exit;
rl w0 x1+2 ; w0:=bytes transferred
wa w1 x1+2 ; w1:= addr of next answer:=
al w1 x1+6 ; w1 + no of bytes + length of head;
se w0 0 ; if more than 0 bytes transferred then
jl. a8. ; goto rep;
a9: so w0 -2 ; exit: if status=-1 or status=-2 then rel:=0
am -2 ; else state:= -2;
al w1 0 ;
f37=k+1
hs w1 x3+b62 ;
rl. w2 (b20.) ; deliver segment:
rl w1 x2+12 ; curr virt:= curr virt + 512;
al w1 x1+512 ;
f79=k+1
sn w1 (x3+b16) ; if current = top virt then
f80=k+1
rl w1 x3+b15 ; curr virt:=first virt
rs w1 x2+12 ;
f81=k+1
rl w2 x3+b11 ; w2:=segments free sem
jl. w3 (b6.) ; open(w2);
f39=k+1
bl w1 x3+b62 ; w1:= relative;
sn w1 0 ; if w1 = 0 then
jl. a6. ; goto get next segment;
rl. w2 (b20.) ; page 3 := job descr page;
f72=k+1
rl w0 x3+b73 ;
rs w0 x2+12 ;
jl. w3 (b9.) ;
jl. w2 c14. ; start job;
e. ;
\f
; btj 22.10.71 psload, reserve tape reader read ...81...
; load command, continue with send normal answer
c2: bl w0 x3+b63 ; if finis files then
f38=c2+1
sh w0 -1 ; goto empty card file;
jl. c0. ;
\f
; btj 22.10.71 psload, assemble load-command-line read ...82...
b. a10 w. ;
; get a request line
; assemble a line, consisting of:
; load <job name> <tape number>
; deliver the line to request que as: <insert line>
c3: rl. w2 (b20.) ; page3 := job descr page;
f71=k+1
rl w0 x3+b73 ;
rs w0 x2+12 ;
rl. w2 b85. ; w2:= request line free sem;
jl. w3 (b10.) ; lock chained(w1, w2);
dl. w3 b100.+2; move <:load:> and spaces
ds w3 x1+16 ; to line ...
ld w3 -100 ; initialize fields with nulls
ds w3 x1+8 ;
ds w3 x1+12 ;
ds w3 x1+28 ;
ds w3 x1+32 ;
lo. w3 b98. ; or a space character into last position
ds w3 x1+44 ;
am. (b3.) ; move job name to line ...
f45=k+1
dl w3 +b74 ;
ds w3 x1+36 ;
am. (b3.) ;
f46=k+1
dl w3 +b75 ;
lo. w3 b98. ; or a space into last position
ds w3 x1+40 ;
dl. w3 b100.+10; move <: exceeded:> to line ...
ds w3 x1+52 ; ...(i.e. in case of too many tapes)...
dl. w3 b100.+14;
ds w3 x1+56 ;
al w0 x1 ; save operation address...
rl. w1 b3. ; increase (tape counter);
f47=k+1
bl w3 x1+b94 ;
al w3 x3+1 ;
f48=k+1
hs w3 x1+b94 ;
f56=k+1
bl w2 x1+b95 ;
sh w3 x2 ; if tape counter > tapes then
jl. a1. ; begin
al w2 x3+5 ; tapes := tapes + 5;
f57=k+1
hs w2 x1+b95 ; line length := 52
am 8 ; end
a1: al w2 44 ; else line length := 44;
al w1 2 ; line code := <insert line>;
am (0) ;
ds w2 +4 ;
rl w1 0 ; w1 := operation address;
\f
; rc 21.6.72 psload, assemble load-command-line read ...83...
; convert the tape counter into numbers
a0: al w2 0 ; rep: w2:= w3 mod 10;
wd. w3 b99. ; w3:= w3//10;
sn w3 0 ;
se w2 0 ; if w2 and w3 = 0 then
al w2 x2+48 ; number:=
sh w0 x1+2 ; if second ciffer then space
lo. w2 b98. ; else blank
rs w2 x1+48 ; else number:= w2 + 48;
al w1 x1-2 ; decrease(addr of last ciffer);
se w0 x1+8 ; if addr <> first ciffer addr then
jl. a0. ; goto rep;
rl w1 0 ; restore operation address;
rl. w2 (b20.) ; w2:= curr corutine...
rl w0 x2+10 ; save virt op.address in
rl. w3 b1. ; current virt, in job file descr;
f49=k+1
rs w0 x3+b65 ;
e. ;
\f
; btj 22.10.71 psload, central return read ...84...
b. a2 w. ;
; send normal answer and exit:
c10: am -2 ; action:= 3;
; send rejected answer and exit:
c11: am -2 ; action:= 5;
; card reader error exit:
c12: al w3 7 ; action:= 7;
am. (b1.) ;
f52=k+1
bl w0 +b63 ; if finis files then
sl w0 0 ; begin
jl. a0. ; if card reader is not
se w3 7 ; completely emptied then
jl. c0. ; goto empty card reader;
al w3 1 ; action:= 1;
jl. a1. ; goto exit;
a0: al w0 x3-2 ; end; result:= action - 2;
se w0 1 ; if result <> 1 then
al w0 2 ; result:= 2;
al w1 0 ; status of answer:= 0;
rs. w1 b30. ;
al. w1 b30. ; w1:= address of answer;
am. (b4.) ;
rl w2 +4 ; w2:= message buffer adess;
jd 1<11+22; send answer(w0, w1, w2);
a1: ld w1 65 ; exit:
am. (b4.) ; mess buf addr:= 0;
rs w1 +4 ;
rl. w2 (b20.) ; release page 3;
rs w0 x2+12 ;
rl w1 x2+14 ; w1 := page 4 descr (=job descr page...)
sn w3 1 ; if action <> <empty files> then
jl. a2. ;
dl. w3 b17. ; goto psjob i/o;
jl. (b8.) ;
a2: rs w1 x2+8 ; page 1 := page 3 descr;
am. (b4.) ; return finis files:
dl w3 +2 ;
jl. (b8.) ; return to call point;
e. ;
\f
; btj 06.02.72 psload, procedure stop job read ...85...
; stop job
c13: ws. w2 b0. ; procedure stop job(return in w2);
f61=k+1
rs w2 x3+b64 ; save relative return...
rl. w2 (b20.) ; w2:= current corutine;
f40=k+1
rl w0 x3+b73 ; page 3 descr:=
rs w0 x2+12 ; job descr page;
jl. w3 (b9.) ; get pages;
f65=k+1
rl w2 x3+b64 ;
f66=k+1
bl w0 x3+b63 ;
sh w0 -1 ;
jl. x2+b0. ;
am. (b3.) ; ...job descr page...
f41=k+1
al w1 +b78 ; w1:= banker operation address;
al w1 x1-2 ;
al w0 17 ; optype:= <stop job>;
hs w0 x1+2 ;
rl. w2 b87. ; w2:= banker que sem addr;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ;
f42=k+1
rl w2 +b77 ; w2:= psjob buf;
f62=k+1
rl w3 x3+b64 ; w3 := absolute return address;
al. w3 x3+b0. ;
jl. (b5.) ; lock(w2);
\f
; rc 21.6.72 psload, procedure start job read ...86...
; start job
c14:
f67=k+1
bl w0 x3+b63 ; if finis files then
sh w0 -1 ; return;
jl x2 ;
ws. w2 b0. ; procedure start job(return in w2);
f63=k+1
rs w2 x3+b64 ; save relative return...
am. (b3.) ; ...job descr page...
f50=k+1
al w1 +b78 ; w1:= banker operation address;
al w1 x1-2 ;
al w0 16 ; optype:= <start job>;
hs w0 x1+2 ;
rl. w2 (b20.) ; w2 := virt of job descr page...
rl w2 x2+12 ;
f55=k+1
al w2 x2+b79 ; w2 := virt of dump area spec...
rs w2 x1+4 ; save in banker operation...
rl. w2 b87. ; w2:= banker que sem addr;
jl. w3 (b7.) ; open chained(w1, w2);
am. (b3.) ;
f51=k+1
rl w2 +b77 ; w2:= psjob buf;
f64=k+1
rl w3 x3+b64 ; w3 := absolute return address;
al. w3 x3+b0. ;
jl. (b5.) ; lock(w2);
g1=k-b0
i.
e. ; end b, c, f, g names
h9=s0,h10=s1 ; copy checksums into global variables
i.
e. ; end initialization block
e.e. ; end options, tread
▶EOF◀