|
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: 110592 (0x1b000) Types: TextFile Names: »tprocs«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦0b92c64d5⟧ »ctb« └─⟦this⟧
(bprocs = set 1 disc bprocs = slang proc.options proc.jobdescr scope user bprocs print bprocs integer words.4 0.6 ) b. w. p.1 ; kll 19.11.71 boss 2,account ...1... s0=0, s1=1 ; s. h12 w. ; h11, h12 ; 78 05 02 , 82 ; version id: m. boss 2 tprocs ;bprocs creates the following boss2-codepages: ; -account- , -bsadjust- , -initialize from usercat- ;and -unknown sender- . s. b50, g20 ,c9 w. ; b. f12 w. ; b. a20 w. ; b1., b2., b3., b4., b5., b6., b7., b8., b9. b23.,b24.,b25.,b26., b27., b28., b29., b31.,b32.,b33.,b34. b35.,b36.,b37.,b38.,b39.,b40.,b45. f0., f1., f2., f5., f7., f8., f12. h1:h2 ;end external list jl. a0. ; f0: 0 ; base of external table f1: 12 ; reserve virt f2: 13 ; move to virt f3: 1000000 ; f4: 0 ; created f6: 0, 0 ; time on account file f7: 15 ; end init f8: 31 ; init alarm ; f9, f10 f11: i105*16 - i14 ; total accounts f12: 288 ; slice length on disc a0: al w0 i12 ; virt account buf on disc; al w1 512 ; length; jl. w3 (f1.) ; reserve virt; al w2 x2+1 ; add writing; rs. w2 b10. ; b10:= virt account buf; al w0 i13 ; account code on disc; al w1 g5 ; length; jl. w3 (f1.) ; reserve virt; al w2 x2+1 ; add writing; rs. w2 b11. ; b11:= virt account code; dl. w1 b11. ; rs. w0 b42. ; rs. w1 b43. ; jl. w2 c2. ; set base(boss priv); \f ; kll 19.11.71 boss 2, account ...2... al. w0 g4. ; bufbase:= g4.; rs. w0 f9. ; al w0 0 ; al w1 i105 ; if length of accountfile is not wd. w1 f12. ; a multiplum of the slice length then se w0 0 ; goto error; jl. a14. ; al. w3 b22. ; al. w1 b17. ; jd 1<11+42; lookup(account file); rl. w1 b17. ; release:= segments * wm. w1 b19. ; records per segment; rs. w1 b18. ; al w0 i105 ; wa. w0 f12. ; ws. w0 b17. ; length:= account file segments - rs. w0 b17. ; length of account file + spare; sh w0 0 ; if length <= 0 then jl. a8. ; goto create error; jd 1<11+36; set short clock ld w1 5 ; rs. w0 b44. ; in entry al. w1 b17. ; al. w3 b21. ; jd 1<11+40; create(accountf1); rs. w0 f4. ; created:=result; jd 1<11+44; change entry; se w0 0 ; if not ok then jl. a8. ; goto create error; al w1 3 ; jd 1<11+50; permanent accountf1.3; jd 1<11+52; create area process; jd 1<11+8 ; reserve accountf1; se w0 0 ; if not reserved then jl. a9. ; goto reserve error; rl. w0 f4. ; se w0 0 ; if created then jl. a1. ; begin jl. w1 c3. ; insert end record; jl. w3 c1. ; write; a1: ; end; al w0 3 ; code:= input; hs. w0 b15. ; a2: jl. w3 c1. ; rep segment: ; read; a3: al. w3 g4. ; rep record: wa. w3 b14. ; w3:= record(index); rl w0 x3+10 ; sn w0 99 ; if kind = end then jl. a5. ; goto exit; sh. w0 (b30.) ; if kind > last private kind or sh w0 0 ; kind < 1 then jl. a4. ; goto error; \f ; kll 19.11.71 boss 2, account ...3... rl w0 x3+0 ; sl w0 1 ; if project number < 1 or sl. w0 (f3.) ; project number > 999999 then jl. a4. ; goto error; dl w1 x3+14 ; rx. w0 f6. ; if clock(record) < clock rx. w1 f6.+2 ; then goto error; ss. w1 f6.+2 ; sl w0 0 ; clock:= clock(record); jl. a4. ; rl. w1 b14. ; wa. w1 b20. ; index:= index + length; rs. w1 b14. ; sh w1 15*32 ; if index <= last then jl. a3. ; goto rep record; rl. w1 b16. ; al w1 x1+1 ; segment:= segment + 1; rs. w1 b16. ; al w0 0 ; rs. w0 b14. ; index:=0; jl. a2. ; goto rep segment; a4: al w0 0 ; error: rs. w0 b14. ; index:= segment:= 0; rs. w0 b16. ; al w0 5 ; hs. w0 b15. ; code:= output; jl. w1 c3. ; insert end record; jl. w3 c1. ; write; a5: al w0 5 ; exit: hs. w0 b15. ; code:= output; jd 1<11+36; get clock; ss. w1 f6.+2 ; if current clock < last account clock then sh w0 -1 ; jl. a11. ; goto error; rl. w2 b16. ; wm. w2 b19. ; w2:= segments * records per segment; rl. w1 b14. ; al w0 0 ; wd. w1 b20. ; w1:= index / record length; wa w2 2 ; wa. w2 b18. ; al w1 x2 ; w1:= used - total accounts; ws. w1 f11. ; sh w1 0 ; if w1 > 0 then jl. a10. ; begin ws w2 2 ; w2:= w2 - w1; rl. w0 b18. ; comment w2:= total; ws w0 2 ; release:= release - w1; rs. w0 b18. ; end; a10: rs. w2 b41. ; jl. w3 (2) ; set externals; f5: 40 ; b41: 0 , 430 ; used accounts; g0 , 431 ; rel outrec; g1 , 432 ; rel prepare; g2 , 433 ; rel private; g3 , 434 ; rel terminate; b42: 0 , 435 ; virt account buf; b43: 0 , 436 ; virt code; 0 , -1000 ; end of externals; \f ; kll 19.11.71 boss 2, account ...4... al. w0 g4. ; w0:= start virt buf; al w1 512 ; w1:= length; rl. w2 b10. ; w2:= ref virt; jl. w3 (f2.) ; move to virt; al. w0 b0. ; w0:= start code; al w1 g5 ; w1:= length; rl. w2 b11. ; w2:= ref virt; jl. w3 (f2.) ; move to virt; jl. (f7.) ; goto end init; a13: <:<10>i105 not mult of slice length <10><0>:> a12: <:<10>time inconsistence accountf1 <10><0>:> a6: <:<10>create accountf1 error <10><0>:> a7: <:<10>reserve accountf1 error <10><0>:> a14: am a13-a12; accountfile length error: a11: am a12-a6 ; time inconsistence error: a8: am a6-a7 ; create error: a9: al. w2 a7. ; w0:= text addr; rx w2 0 ; w2:= cause(monitor result); jl. w3 (f8.) ; goto init alarm; e. ; \f ; kll 19.11.71 boss 2, account ...5... b0: 0, r.5 ; abs page addresses 80<12 + 0 ; page ident: account b1: 3 ; lock b2: 4 ; open b3: 8 ; page jump b4: 25 ; call b5: 26 ; current corutine b6: 320 ; io point b7: 321 ; b8: 417 ; finis(finis cause) point b9: 427 ; b10: 0 ; virt account buf b11: 0 ; outrec account point b12: g0 ; b13: 0 ; constant 0 b14: 0 ; index b15: 5<12, 0, 0 ; output message b16: 0 ; segment b17: 0,<:disc:>, 0,r.7 ; work(tail) b44=b17+10 ; short clock b18: 0 ; release b19: 16 ; records per segment b20: 32 ; record length b21: <:accountf1:>,0,0 ; b22: <:accountfile:> ; b30: 999999 ; last private kind b33: 74 ; catalock; b45: 288 ; slice length on disc ; formats: ; ; procedure outrec account ; page 1: +0, +2 return ; +4 kind ; +6 param1 ; +8 param2 ; +10,+16 user name ; +18 project number ; +20 paper type for print records ; format of account record: ; +0 project number 0<p<1000000 ; +2,...+8 user name ; +10 kind 0<k<1000000 ; +12,+14 time accounted ascending ; +16 param1 ; +18 param2 ; +20, +30 finis params ; ; finis: kind = 1, param1 = used time, param2 = mounts, tapes ; cpu > 13, temp drum, disc , stat, size , device word 1, device word 2 ; waiting time, conversational input lines ; logout: kind = 2, param1 = login time, param2 = operations ; print: kind = 3, param1 = lines , param2 = pages , paper type ; private: kind >99, param1 = m+14, param2 = unused ; ; end record: kind = 99 ; login time is in min, used time is in sec \f ; kll 19.11.71 boss 2, account ...6... b. a5, j9 w. ; g0=k-b0 ; outrec account: rl. w2 b0.+6 ; wa. w2 b14. ; w2:= abs ref record(index); dl w1 x3+8 ; ds w1 x2+18 ; record(16:18):= param1:2; jd 1<11+36; ds w1 x2+14 ; record(12:14):= get clock; dl w1 x3+16 ; ds w1 x2+8 ; record(2:8):= user name; dl w1 x3+12 ; ds w1 x2+4 ; dl w1 x3+20 ; rs w1 x2+20 ; record(20):= paper type (or param 3); rs w0 x2+0 ; record(0) := project number; rl w1 x3+4 ; rs w1 x2+10 ; record(10):= kind; se w1 1 ; if end job record then jl. a0. ; begin j0: rl w0 x3+501 ; record(20):= cpu used(d79); j1: rl w1 x3+502 ; record(22):= temp drum, disc(d85); ds w1 x2+22 ; j2: bz w0 x3+503 ; record(24):= stations(d49); hs w0 x2+24 ; j3: rl w1 x3+504 ; j4: ws w1 x3+505 ; record(25):= size in segments:= al w1 x1+511 ; ls w1 -9 ; (top addr - first addr)//512; hs w1 x2+25 ; j5: dl w1 x3+340 ; record(26):= device word 1; ds w1 x2+28 ; record(28):= device word 2(d30); rl w1 x3+20 ; record(30):=waiting time, rs w1 x2+30 ; conversational input lines; a0: rl. w1 b14. ; end; wa. w1 b20. ; index:= index + length; rs. w1 b14. ; jd-1 sh w1 32*15 ; if index > last then jl. a1. ; begin jl. w3 c1. ; write; rl. w1 b16. ; al w1 x1+1 ; segment:= segment + 1; rs. w1 b16. ; al w1 0 ; index:= 0; rs. w1 b14. ; end; a1: jl. w1 c3. ; insert end record; rl w1 x3+4 ; rl. w0 b14. ; sl w1 100 ; if kind internal then sn w0 0 ; or index = 0 then jl. w3 c1. ; write; c0: ; return: rl. w1 (b5.) ; rl. w3 b0.+2 ; al w0 0 ; rs w0 x1+12 ; page 3:= 0; dl w3 x3+2 ; jl. (b3.) ; page jump(return); b35=j0+1, b36=j1+1, b37=j2+1, b38=j3+1, b39=j4+1, b40=j5+1 e. ; \f ; kll 19.11.71 boss 2, account ...7... b. a1 w. g1=k-b0 ; prepare account: rl. w2 b33. ; jl. w3 (b1.) ; lock(catalock); al w0 i14-2 ; rest accounts:= accounts free b27=k+1 ; to private accounts; hs w0 x3+345 ; jl. w3 c1. ; write; jl. w2 c2. ; set base; al. w3 b21. ; old name:= accountf1; al. w1 b22. ; new name:= accountfile; jd 1<11+46; rename(accountf1, accountfile); rl. w3 b0.+2 ; se w0 0 ; if not ok then jl. a1. ; goto return; rl. w2 b16. ; wm. w2 b19. ; w2:= segment * records rl. w1 b14. ; per segment; al w0 0 ; wd. w1 b20. ; w1:= index / record length; wa w2 2 ; b34=k+1 ; bs w2 x3+347 ; rs. w2 b18. ; release:= w2 + w1 - converts; rl. w1 b16. ; al w1 x1+1 ; length(accountfile):=segment+1; rs. w1 b16. ; jd 1<11+36; set short clock ld w1 5 ; rs. w0 b16.+10; in entry al. w1 b16. ; w1:= abs ref tail; al. w3 b22. ; w3:= abs ref account file; jd 1<11+64; remove area process(accountfile); jd 1<11+44; change entry; jd 1<11+42; lookup entry; al w0 i105 ; wa. w0 b45. ; ws. w0 b16. ; length:= account file segments rs. w0 b16. ; - length of account file; al. w3 b21. ; jd 1<11+40; create(accountf1); al w1 3 ; jd 1<11+50; permanent accountf1.3; jd 1<11+52; create area process; jd 1<11+8 ; reserve process; se w0 0 ; if not ok then c.-1, o88, z. ; (bossfault xref) jd -88 ; boss fault 88; al w0 0 ; rs. w0 b14. ; index:= 0; rs. w0 b16. ; segments:= 0; jl. w1 c3. ; insert end record; jl. w3 c1. ; write; a1: rl. w2 b33. ; jl. w3 (b2.) ; open(catalock); jl. c0. ; goto return; e. \f ; kll 19.11.71 boss 2, account ...8... b. a5, j9 w. ; g2=k-b0 ; private account: rl. w2 b0.+8 ; rl w2 x2+4 ; kind:= m + 12; dl w1 x2+18 ; param 2 := m+8; rs w0 x3+8 ; param 3 := m+10; rs w1 x3+20 ; dl w1 x2+22 ; param1:= m + 14; ds w1 x3+6 ; sh. w0 (b30.) ; if kind > last kind or sh w0 99 ; kind < 100 then jl. a1. ; goto unintelligible; j1: bz w1 x3+345 ; al w1 x1-1 ; sh w1 -1 ; if rest account-1 <0 then jl. a2. ; goto finis; j2: hs w1 x3+345 ; rest accounts:=rest accounts-1 j4: al w2 x3+326 ; dl w1 x2-8 ; move job name to ds w1 x3+12 ; page 1 +10, +16; dl w1 x2-4 ; ds w1 x3+16 ; j6: rl w0 x3+326 ; +18:= project number rs w0 x3+18 ; rl. w1 (b5.) ; rl. w0 b10. ; rs w0 x1+12 ; page 3:= virt account buf; dl. w3 b12. ; jl. w1 (b4.) ; call outrec account; am -2 ; result:= normal answer; a1: al w0 3 ; unintelligible: rl. w1 (b5.) ; result:= unintelligible; j7: rl w2 x3+338 ; rs w2 x1+8 ; page1:=jobfilepage al w2 0 ; rs w2 x1+14 ; page 4:= 0; rl. w1 b0.+8 ; rx w2 x1+4 ; message(sender table):= 0; al. w1 b13. ; jd 1<11+22; send answer(result); dl. w3 b7. ; jl. (b3.) ; page jump(io); a2: al w0 17 ; finis: j3: hs w0 x3+339 ; finis cause:= accounts exceeded; dl. w3 b9. ; jl. (b3.) ; page jump(finis(finis cause)); ; call w2 = link c2: rl w1 66 ; set base: rl w1 x1+76 ; comment boss private base; al w0 x1 ; w0:= w1:= boss max base low limit; al. w3 b13. ; w3:= abs ref 0; jd 1<11+72; set base(w0, w1); rl. w3 b0.+2 ; w3:= abs ref page 1; jl x2 ; goto return; b24=j1+1, b25=j2+1, b26=j3+1, b29=j4+1, b31=j6+1, b32=j7+1 e. ; \f ; kll 19.11.71 boss 2, account ...9... b. a5, j5 w. ; g3=k-b0 ; terminate account: ; comment the accountjob must release the following number ; of accounts: ; accounts in file - (converts - rest converts) - (accounts ; - rest accounts) - 2 rl. w2 b33. ; jl. w3 (b1.) ; lock(catalock); jl. w2 c2. ; set base; al. w1 b17. ; al. w3 b22. ; w3:= abs ref account file; jd 1<11+42; lookup entry; sn w0 0 ; if not ok then jl. a1. ; begin al w0 i105 ; length:= account file rs. w0 b17. ; segments; jd 1<11+36; set short clock ld w1 5 ; rs. w0 b44. ; in entry al. w1 b17. ; al. w3 b21. ; w3:= abs ref accountf1; jd 1<11+44; change entry; rl. w3 b0.+2 ; rl. w1 b18. ; release account:= release b23=k+1 ; ba w1 x3+345 ; + rest accounts - al w1 x1-i14 ; b28=k+1 ; max accounts used by accountjob; hs w1 x3+345 ; a1: rl. w2 b33. ; end; jl. w3 (b2.) ; open(catalock); jl. c0. ; goto return; e. ; ; call: w3 = link, exit: w3 = page 1 c1: rs. w3 b17.+18; write: rl. w3 b0.+6 ; first addr:= page 3; al w0 x3+510 ; last addr:= first addr + 512; ds. w0 b15.+4 ; al. w1 b15. ; w1:= ref message; al. w3 b21. ; w3:= ref accountf1; jd 1<11+16; send message; al. w1 b17. ; jd 1<11+18; wait answer; al w2 1 ; ls w2 (0) ; w2:=result; al w0 x2 ; sn w0 1<1 ; if normal answer then lo w0 x1 ; se w0 1<1 ; w0:=logical status; c.-1, o80 , z. ; bossfault xref jd -80 ; alarm; rl. w3 b0.+2 ; w3:= abs ref page 1; jl. (b17.+18); goto saved return; ; call w1 = link c3: rl. w2 b0.+6 ; insert end record: wa. w2 b14. ; record(index).kind:= al w0 99 ; end; rs w0 x2+10 ; jl x1 ; goto return; g4: g5=g4-b0 ; length f9 = b0 +6 e.i. e. \f ; boj 30.8.71 boss 2, bs adjust, ...10... ; the slang conditions in bsadjust are the following: ; c. i27: drum exists. if drum exists the main catalog will be on the ; drum, and there is an auxiliary device called <:disc:>, ; which is used as system device. else there is only one ; system device, which will be called <:disc:>, and which ; contains the main catalog. ; c. i30-1: private kits exist. ; c. i30+i27: some auxiliary-catalog device exist. ; initialization s.b50 ;global variables and constants c10 ;routines f15 ;initialization names g25 ;external displacements j25 ; w. h2=h1. ;start external list: ; external list b1.,b2.,b3.,b4.,b5.,b6.,b8. b9.,b15.,b16.,b50. f0.,f1.,f2.,f3.,f4. g11.,g12.,g16.,g21.,g22.,g23. c.i27,g4.,g5.,g9.,g10.,g14.,g18.,g19.,g20. z. c.i30-1,g0.,g13.,g17. z. c.i27+i30,g1.,g2.,g3.,g7. z. h3: h4 ; end external list b. w. ; ; reserve virtual: al w1 f5 ; w1:= length of page 0; al w0 i28 ; w0:= drum or disc; jl. w3 (f1.) ; reserve virtual(w0, w1), virt ref page 0: (w2); al w2 x2+1 ; put on writing bit; ; initialize externals: w2 = virt ref page 0. rs. w2 b17. ; rs. w2 f11. ; ext(415); al w0 f6 ; rs. w0 b18. ; rel ref prepare; rl. w0 b4. ; rs. w0 f12. ; ext(74); jl. w3 (2) ; set externals; f4: 40 ; f11: 0 , 415 ; virt ref page 0; f6 , 413 ; rel ref prepare; f8 , 428 ; rel ref transfer permclaims; f7 , 414 ; rel ref terminal; f12: 0 , 74 ; abs ref catalock; 0 , -1000 ; end of externals; al w0 1 ; rs. w0 (b4.) ; catalock:=1 ; move to virtual: w1 = length of code, w2 = virt ref page 0. al. w0 b0. ; w0:= abs ref page 0; jl. w3 (f2.) ; move to virt(w0, w1, w2); am.(4,jl.4,h1.) ; goto initialize account e. \f ; boj 5.1.72 boss 2, bs adjust, ...11... ; variables used by initialization f0: 0 ; base externals f1: 12 ; ref reserve virt f2: 13 ; ref move to virt f3: 15 ; ref end init ;f5= f4-b0 ; length of code ;f6= c0-b0 ; rel ref prepare ;f7= c1-b0 ; rel ref terminate ;f8= c6-b0 ; rel ref transfer ; ; variables and constants used by code b0: 0 ; page0: codes and variables 0 ; page1: unused 0 ; page2: unused 0 ; page3: usercat buffer = ext(416) 0 ; page4: job description 81<12 + 0 ; page ident: bsadjust b2: 2 ; send and wait fast b3: 3 ; lock simple b4:e13<12+19 ; catalock semaphore b5: 75 ; reserve usercat semaphore b6: 4 ; open simple b8: 8 ; page jump b9: 25 ; call b15: 416 ; virt ref buffer b16: 26 ; ref ref own description b17: 0 ; virt b18: 0 ; rel ref prepare bs adjust b28: h. 0 ; mente b29: 0 ; counter for claims exceeded b7: 0 ; mask b10: 0 ; shiftmask b31: 0 ; usercat segm writing bit b36: 0 w.; claims exceeded 0, 0 ;b27-4: usercat ref, page 4 ref (in c7) b27: 0 ; save ref old (in c2) save return from c7 and c8 b20: 0, r.i29*4 ; save claims on unknown kits b30: 0, r.i29*4 ; b20+i29*4: save oldclaims b32: 0 0 ; save return from c6 0 ; b33-2: return from c5 b33: 0 ; save w0 in c5 b37: 0,0,0,0 ; monitorclaims,key=0,1,2,3 b38: 0,0,0,0 ; docname(docindex) b35: 0 ; save docindex 0 ; b35+2: save w3 from c4 c. i30-1 b39: 0 ; kittable index z. b40: 0,0,0,0 ; restclaims b45: 0 ; new usercat segm, rel b41: 0 ; save page 3 b42:c.i27,<:drum:>,0,0 ; b43:z. <:disc:>,0,0 ; b46: 0 ; output from c5, get rest3 from usercat b47: 0,0,0,0 ; message to usercat b48: <:usercat:>,0,286; name,name table address b49: 0 ; return from c2,translate and c4,get claims b50: 21 ; privout b1 = b48+8 ; name table address usercat \f ; boj 30.8.71 boss 2, bs adjust, ...12... ; routines: ; c0 prepare ; c1 terminate ; c2 translate ; c3 test names ; c4 get monitorclaims ; c5 get usercat segment ; c6 transfer and prepare ; c7 compare ; c8 strange maincat entries ; c9 adjust rest 3 ; ; procedure prepare bs adjust ; =========================== ; abstract:lock(catalock) ; for docindex:=ref drumtable step 2 until top_bs_table-2 ; do begin get monitorclaims;save claims end ; b.a5 w. ; c0: rl. w2 b4. ; w2:=ref catalock; jl. w3 (b3.) ; lock(w2); ld w1 -100 ; al. w3 b20. ; clear claims on unknown kits a2: ds w1 x3+2 ; al w3 x3+4 ; se. w3 b30. ; jl. a2. ; index:=base oldclaims; rl w2 92 ; docindex:=drumtable; a0: sn w2 (96) ; rep: if docindex=top bs table jl. a1. ; then goto return; jl. w1 c4. ; get monitorclaims; dl. w1 b37.+2 ; ds w1 x3+2 ; dl. w1 b37.+6 ; ds w1 x3+6 ; oldclaims(index):=monitorclaims; al w3 x3+8 ; index:=index+8; al w2 x2+2 ; docindex:=docindex+2; jl. a0. ; goto rep; ;return: a1: rl. w3 b0.+2 ; w3:=ref page 1; dl w3 x3+2 ; w2w3:=ref return; jl. (b8.) ; page jump (return); e. \f ; boj 30.8.71 boss 2, bs adjust, ...13... ; procedure get monitor claims ; ============================ ; call return ; w0 undef ; w1 link undef ; w2 docindex unch ; w3 unch ; b35 docindex ; b37 claims ; b38 docname ; ; the format of the monitors claims are the following: ; ; 66: process description ; 92: drumtable ; 96: table end ; drumtable: slicelist 0 ; : slicelist 1 ; ..... : ... ; table end: 0 ; ; slicelist i -36: rel ref claims ; -18: doc name ; -8 : slice length ; -4 : auxiliary catalog, - ; ; proc desc+rel ref claims:entries<12+slices(key=0,1,2,3) b. a1 w. ; c4: ds. w3 b35.+2 ; save w2w3; rs. w1 b49. ; save w1; rl w3 x2+0 ; w3:= slicelist; dl w1 x3-18+2 ; move docname ds. w1 b38.+2 ; dl w1 x3-18+6 ; ds. w1 b38.+6 ; to b38; rl w2 x3-36 ; w2:= proc descr rel ref claims; wa w2 66 ; w2:= abs ref claims; dl w1 x2+2 ; begin move claims ds. w1 b37.+2 ; to b37; dl w1 x2+6 ; ds. w1 b37.+6 ; c. i27+i30 c. 2-e79 bl w0 x3-4 ; if auxiliary catalog se w0 -1 ; then z. c. e79-3 sn w3 (98) ; if not maincat device then z. jl. a0. ; bl. w0 b37.+4 ; key 2 entries hs. w0 b37.+2 ; := key 1 entries hs. w0 b37.+0 ; := key 0 entries; a0: z. ; end; rl. w1 (b16.) ; bz w0 x1+4 ; if test 2 then so w0 2 ; jl. a1. ; al. w1 b37. ; al w0 18<6+16; jl. w3 (b50.) ; privout b37; a1: dl. w3 b35.+2 ; restore w2w3; jl. (b49.) ; return; e. ; \f ; boj 30.8.71 boss 2, bs adjust, ...14... ; procedure test name ; =================== ; call return ; w0 undef ; w1 undef ; w2 ref name unch ; w3 link abs ref page 4 ; b38 ref doc name unch b. a3 w. ; c3: rs. w3 b33. ; save return; rl. w3 b0.+8 ; w3:= abs ref page 4; dl w1 x2+2 ; w0w1:= first 6 chars; sn. w0 (b38.) ; if se. w1 (b38.+2); any difference jl. a0. ; then return to link+2 dl w1 x2+6 ; else w0w1:= last 6 chars; sn. w0 (b38.+4); if still no difference se. w1 (b38.+6); jl. a0. ; then return to link+ 2 jl. (b33.) ; return to link a0: rl. w1 b33. ; jl x1+2 ; e. ; ; procedure terminate bs adjust ; ============================= ; page4=jobdescription ; abstract: ; claims exceeded:= false; ; lock(reserve usercat); ; drumentries(1):=drumentries(1)+strange maincat entries ; docindex:= drumtable; ; rep1: if docindex = top bstable then goto end1; ; get monitorclaims(docindex); ; if name = <:drum:> then goto drum; ; if name = <:disc:> then goto disc; ; kitindex:= first in kittable; ; rep2: if kitname(kitindex)=0 then goto unknown kit ; if name = kitname(kitindex) then goto private_kit; ; kitindex:= kitindex + kittable entry length; ; goto rep2; ; ; step_docindex: docindex:= docindex + 2; goto rep1; ; ; end: drumentries:=drumentries-strange maincat entries ; terminate usercat; ; open(reserve usercat); ; if claims exceeded then error return; ; open(catalock); ; normal return; ; ; unknown kit: drum: disc: private_kit: get bossclaims; update claims; put claims; ; goto step_docindex; \f ; boj 5.1.72 boss 2, bs adjust, ...15... ; terminate bs adjust b. a8 w. ; c1: ac w1 1 ; rs. w1 b47.+6 ; current segment:= -1; al w0 0 ; w0:= 0; hs. w0 b36. ; claims exceeded:= false; rl. w1 (b16.) ; w1:= ref own corutine description; rl. w0 b15. ; rx w0 x1+12 ; page 3:=usercat buffer rs. w0 b41. ; save old page 3 rl. w2 b5. ; w2:= abs ref reserve usercat; jl. w3 (b3.) ; lock(w2); (w3:= abs ref page 1); c.i27+i30 jl. w3 c8. ; drumentries:=drumentries c.i27 j1: ba w0 x3+412 ; +strange maincatentries j2: hs w0 x3+412 ; z.c.-i27 j1: ba w0 x3+410 ; j2: hs w0 x3+410 ; z. z. rl w2 92 ; for docindex:= drumtable a0: sn w2 (96) ; until top bs table - 2 jl. a1. ; do begin ld w1 64 ; ds. w1 b40.+2 ; rest 0,1:=0 ds. w1 b40.+6 ; rest 2,3:=0 jl. w1 c4. ; get monitorclaims(docindex); save docindex; al. w2 b42. ; w2:= abs ref<:drum:>; jl. w3 c3. ; if name = <:drum:> (w3:= abs ref page 4) jl. a2. ; then goto drum; c.i27 al. w2 b43. ; w2:= abs ref<:disc:> jl. w3 c3. ; if name = <:disc:> (w3:= abs ref page 4) jl. a3. ; then goto disc; z. c.i30-1 j0: al w1 x3+403 ; kitindex:= first in kittable; a4: rl w0 x1+0 ; if kitname = 0 then sn w0 0 ; goto unknown kit; jl. a8. ; rs. w1 b39. ; save kitindex; al w2 x1+0 ; w2:= abs ref kit name; jl. w3 c3. ; if name = kitname (w3:= abs ref page 4) jl. a5. ; then goto private kit; al w1 14 ; kitindex:=entry length wa. w1 b39. ; + kitindex; jl. a4. ; goto rep; z. ; step docindex: a6: al w2 2 ; docindex:= docindex + 2; wa. w2 b35. ; jl. a0. ; end; \f ; boj 30.8.71 boss 2, bs adjust, ...16... a1: ; end: c.i27+i30 jl. w3 c8. ; drumentries ac w0 (0) ; :=drumentries c.i27 j3: ba w0 x3+412 ; -strange maincat entries j7: hs w0 x3+412 ; z.c.-i27 j3: ba w0 x3+410 ; j7: hs w0 x3+410 ; z. sh w0 -1 ; if temp entry claim exceeded then hs. w0 b36. ; claims exceeded:=true; sh w0 -1 ; jd -1 ; z. ac w2 1 ; w2:= -1; jl. w3 c5. ; output last segment on usercat; rl. w0 b41. ; rl. w1 (b16.) ; w1:= own corutine descr; rs w0 x1+12 ; restore page 3; rl. w2 b5. ; w2:= abs ref reserve usercat semaphore; jl. w3 (b6.) ; open(w2); w3:= abs ref page 1; bz. w0 b36. ; w0:= claims exceeded; dl w3 x3+2 ; w2w3:= return; se w0 0 ; if claims exceeded jl. (b8.) ; then page jump(error return); rl. w2 b4. ; w2:= abs ref catalock semaphore; jl. w3 (b6.) ; open(w2); w3:= abs ref page 1; dl w3 x3+2 ; w2w3:= return; al w3 x3+2 ; normal return:= call + 4; jl. (b8.) ; page jump(return); a2: c.i27 ; drum: j4: dl w1 x3+411 ; ds. w1 b40.+4 ; rest 1,2:=drumrest 1,2 j5: rl w2 x3+408 ; jl. w3 c5. ; get usercat al w0 2.1101 ; mask:=key 3,2,0 jl. w3 c2. ; translate rl. w0 b40. ; w0:=entries,slices key 0+1 rl. w1 b40.+4 ; w1:=entries,slices key 2 j9: ds w1 x3+411 ; drumrest 1,2:=w01 rl. w0 b40.+6 ; w0:=entries,slices key 3 jl. a7. ; goto save in usercat \f ;boj 26.4.72 boss 2, bsadjust, ...17... a3: z. ; disc: j11: dl w1 x3+409 ; ds. w1 b40.+4 ; rest 1,2:=discrest 1,2 j12: rl w2 x3+407 ; jl. w3 c5. ; get usercat al w0 2.1101 ; mask:=key 3,2,0 jl. w3 c2. ; translate rl. w0 b40. ; w0:=entries,slices key 0+1 rl. w1 b40.+4 ; w1:=entries,slices key 2 j16: ds w1 x3+409 ; discrest 1,2:=w01 rl. w0 b40.+6 ; w0:=entries,slices key 3 c.i30-1 jl. a7. ; goto save in usercat a8: ; unknown kit: rl. w3 b35. ; get temporary ws w3 92 ; claims on unknown kits ls w3 2 ; al. w3 x3+b20. ; dl w1 x3+2 ; ds. w1 b40.+2 ; dl w1 x3+6 ; ds. w1 b40.+6 ; al w1 6 ; jl. w3 c9. ; adjust rest3(w1 = sub from entries); al w1 7 ; jl. w3 c9. ; adjust rest3(w1 = sub from slices); al w0 2.1111 ; mask:= key 3210; jl. w3 c2. ; translate; rl. w3 b35. ; save temporary ws w3 92 ; claims on unknown kits ls w3 2 ; al. w3 x3+b20. ; dl. w1 b40.+2 ; ds w1 x3+2 ; dl. w1 b40.+6 ; ds w1 x3+6 ; jl. a6. ; goto step docindex; a5: ; private kit: rl. w3 b39. ; b39 = abs ref kittable entry, you know rl w2 x3+8 ; w2:= usercat ref rest 3 jl. w3 c5. ; get usercat al w0 2.0001 ; mask:=key 0 jl. w3 c2. ; translate rl. w0 b40. ; w0:=entries,slices key 0+1+2+3 z. a7: al w2 -1 ; save in usercat: rs w0 2 ; rx. w0 (b46.) ; save claim in usercat se w0 x1 ; if any changes hs. w2 b31. ; then writing:=true ; comment if b46 = ref b45 and writing then bossalarm. ; to be implemented at occasion. ; in that case the job has removed areas on a disc ; he must not know. jl. a6. ; goto step docindex; g11=j11+1 g12=j12+1 g16=j16+1 c.i27 g4=j4+1 g5=j5+1 g9=j9+1 z.c.i30-1 g0=j0+1 z.c.i27+i30 g1=j1+1 g2=j2+1 g3=j3+1 g7=j7+1 z. e. ; \f ; boj 5.1.72 boss 2, bs adjust, ...18... ; procedure get rest3 from usercat: ; ================================= ; call return ; w0 unch ; w1 undef ; w2 usercatrefrest3 undef ; w3 link abs ref page 4 ; b46 abs ref rest3 ; b40(0:5) rest(0:2) unch ; b40(6:7) rest3 corrected for loans ; ; w2=0 : rest3=0 ; w2=-1 : output last segment ; w2=seg<12+rel : else ; ; abstract: start: if newsegment<> current segment then goto write; ; adjust rest3;exit; ; write: if current segment = -1 then goto read; if writing then ; outblock(current); current:= -1; goto start; ; read: current:= new; inblock(current); writing:=false; goto start; b. a6 w. ; c5: ws. w3 b0. ; ds. w0 b33. ; save w3w0; rs. w2 b45. ; save w2; se w2 0 ; if usercatref=0 jl. a0. ; then al. w2 b45. ; w2:=ref 0 jl. a3. ; ; start: a0: bl. w0 b45. ; w0:= new segment; se. w0 (b47.+6); if new <> current jl. a1. ; then goto write; bl. w2 b45.+1 ; w2:= page 3 rel ref rest3 sn w2 -1 ; if -1 jl. a5. ; then return wa. w2 b0.+6 ; w2:=abs ref rest3 a3: rs. w2 b46. ; b46:= abs ref rest3; rl w0 x2 ; rs. w0 b40.+6 ; save rest3 al w1 6 ; jl. w3 c9. ; adjust rest3(w1=sub from entries) al w1 7 ; jl. w3 c9. ; adjust rest3(w1=sub from slices) a5: rl. w1 (b16.) ; bz w0 x1+4 ; so w0 2 ; if test 2 then jl. a6. ; al. w1 b40. ; privout b40 al w0 10<6+16; jl. w3 (b50.) ; a6: rl. w3 b0.+8 ; w3:=ref page4 rl. w0 b33. ; w0:= save w0; am. (b33.-2); return; jl. b0. ; \f ; boj 7.12.72 boss 2, bs adjust, ...19... ; write: w0 = new segment. a1: rl. w1 b47.+6 ; w1:= current segment; sn w1 -1 ; if current = -1 jl. a2. ; then goto read; bl. w0 b31. ; if writingbit sn w0 0 ; jl. a4. ; then begin al w2 5 ; w2:= 5; hs. w2 b47. ; operation:= output; rl. w1 b0.+6 ; al w2 x1+510 ; ds. w2 b47.+4 ; message:=first last al. w1 b47. ; w1:= ref message; al. w2 b48. ; w2:= ref<:usercat:>; jl. w3 (b2.) ; send and wait fast; se w0 2 ; if not normal answer c.-1, o81, z. ; (bossfault xref) jd -81 ; then bossalarm; a4: ac w1 1 ; end w1:= -1; rs. w1 b47.+6 ; current:= -1; jl. a0. ; goto start; ; read: w0 = new segment. a2: rs. w0 b47.+6 ; current:= new; al w2 3 ; w2:= 3; hs. w2 b47. ; operation:= input; rl. w1 b0.+6 ; al w2 x1+510 ; ds. w2 b47.+4 ; message:=first last al. w1 b47. ; w1:= ref message; al. w2 b48. ; w2:= ref<:usercat:>; jl. w3 (b2.) ; send and wait fast; se w0 2 ; if not normal answer c.-1, o82, z. ; (bossfault xref) jd -82 ; then bossalarm; al w0 0 ; hs. w0 b31. ; writing:=false jl. a0. ; goto start; e. ; \f ; boj 6.4.72 boss 2, bs adjust, ...20... c.i27+i30 c8: ; integer procedure strange maincat entries ; ; call return ; w0 result ; w1 und ; w2 und ; w3 link abs ref page 4 b. a2 w. ws. w3 b0. ; save return rs. w3 b27. ; rl. w3 b0.+8 ; w3:=ref page4 ld w1 64 ; w0:=0 ds. w1 b40.+6 ; b40(0:7):=0 ds. w1 b40.+2 ; c.i30-1 ; if private kits j13: al w1 x3+403 ; then begin a1: ; for b39:=first in kittable rl w2 x1+0 ; while name(b39)<>0 sn w2 0 ; do begin jl. a0. ; rl w2 x1+8 ; ws w1 6 ; rs. w1 b39. ; jl. w3 c5. ; get usercat ba. w0 b40.+6 ; w0:=w0+kitentries al w1 x3+14 ; b39:=b39+14 wa. w1 b39. ; jl. a1. ; end a0: ; z. ; end c.i27 ; if drum j10: dl w2 x3+409 ; then begin ds. w2 b40.+4 ; b40(2:5):= discrest(1:2); j14: rl w2 x3+407 ; jl. w3 c5. ; get usercat ba. w0 b40.+4 ; w0:=w0+discentries(2) ba. w0 b40.+6 ; +discentries(3) z. ; end am. (b27.) ; jl. b0. ; c.i27 g10=j10+1 g14=j14+1 z.c.i30-1 g13=j13+1 z. e. z. \f ; boj 30.8.71 boss 2, bs adjust, ...21... ; procedure translate: ; ==================== ; abstract: ; (1-1 ) ; rest:= rest + ( 1-1 ) (new - old) ; ( 1-1) ; ( 1) ; old:= new; ; rest(3) ; :=rest(3) ; + min(0,rest(2),rest(2)+rest(1) ; ,rest(2)+rest(1)+rest(0) ; ) ; (1 ) ; rest:= ( 1 ) * rest ; ( 0 ) ; ( 1 1) ; for mask=(1 1 0 1); if claims exceeded then rise flag ; end; ; w0 = mask ; b37 = ref new ; b40 = ref rest ; b27 = ref old ; procedure translate: b. a5 w. ; c2: rs. w3 b49. ; save return; hs. w0 b7. ; save mask rl. w3 b35. ; ws w3 92 ; ls w3 2 ; al. w3 x3+b30. ; rs. w3 b27. ; al w1 6 ; w1:=6 a1: hs. w0 b10. ; shiftmask:=mask al w0 0 ; rs. w0 b28. ; b28:= b29:= 0; a0: bl. w0 x1+b40. ; rep: bs. w0 b28. ; rest:= rest - b28; bl. w2 x1+b37. ; am. (b27.) ; bl w3 x1 ; am. (b27.) ; hs w2 x1 ; old:= new; bs w2 7 ; hs. w2 b28. ; b28:= new - old; ba w0 5 ; bl. w2 b10. ; leftshift shiftmask ls w2 1 ; hs. w2 b10. ; sz w2 1<4 ; if mask(key)=0 jl. a3. ; then begin ba. w0 x1+b40.-2 ; rest(next lower key) hs. w0 x1+b40.-2 ; +:=rest al w0 0 ; rest:=0 a3: ; end hs. w0 x1+b40. ; rest:= rest + b28; ba. w0 b29. ; hs. w0 b29. ; b29:= b29 + rest; sh w0 -1 ; if b29<0 hs. w0 b36. ; then claims exceeded:=true sh w0 -1,jd-1 al w1 x1-2 ; w1:= w1 - 2; sl w1 0 ; if w1 >= 0 then jl. a0. ; goto rep; jl. w3 c9. ; adjust key 3(w1=add to entries or slices) se w1 -2 ; if w1 = -2 then jl. a2. ; begin al w1 7 ; w1:= 7; bl. w0 b7. ; w0:=mask jl. a1. ; goto set b28 - b29; a2: rl. w3 b0.+8 ; end else w3:= ref page 4; jl. (b49.) ; return; e. ; \f ; boj 14.11.72 boss 2, bs adjust, ...21a... c9: ; procedure adjust key 3 ; ; call: return: local use: ; w0 undef min ; w1 code unchanged code ; w2 undef index ; w3 link ref page 4 sum ; b40 rest(0:3) rest(0:3) ; ; ; code = 6: subtract entries ; -2: add entries ; 7: subtract slices ; -1: add slices ; ; this procedure prevents two jobs under the same project ; from using the same permanent claims. ; the value in the usercat is actually: ; rest(3) minus the loans of all the jobs. ; before =translate= this is transferred to: ; rest(3) minus the loans of all other jobs ; and afterwards it is transferred back again. b. a1 w. ; rs. w3 a0. ; save link; ldw0 -100 ; min:= sum:= 0; sz w1 1 ; index:= if code odd am 1 ; then 5 al w2 4 ; else 4; a1: ba. w3 x2+b40. ; loop: sum+:= rest(index); sl w0 x3 ; if min > sum then al w0 x3 ; min:= sum; al w2 x2-2 ; index-:= 2; sl w2 0 ; if index >= 0 then jl. a1. ; goto loop; sl w1 0 ; if code >= 0 then ac w0 (0) ; min:= - min; ba. w0 x2+b40.+8 ; rest(3)+:= min; hs. w0 x2+b40.+8 ; rl. w3 b0.+8 ; w3:= ref page 4; jl. (a0.) ; return; a0: 0 ; save link; e. ; \f ; boj 5.1.72 boss2 bs adjust ...22... ; procedure prepare bs adjust and transfer permanent claims ; from usercat to jobdescription ; b. a5 w. c6: dl w1 x3+2 ; ds. w1 b32.+2 ; save return dl. w3 b18. ; jl. w1 (b9.) ; call prepare bs adjust rl. w1 (b16.) ; rl. w0 b15. ; rx w0 x1+12 ; page3:=usercat buffer rs. w0 b41. ; save old page3 rl. w2 b5. ; jl. w3 (b3.) ; lock( reserve usercat) al w0 -1 ; rs. w0 b47.+6 ; current:=-1 rl. w3 b0.+8 ; w3:=ref page4 ld w1 -100 ; clear b40(0:7) ds. w1 b40.+2 ; ds. w1 b40.+6 ; c.i30-1 ; if private kits j17: al w1 x3+403 ; then begin a0: ; for b39:=first in kittable rl w2 x1+0 ; while name(b39)<>0 sn w2 0 ; do begin jl. a1. ; rl w2 x1+8 ; w2:=usercatref rest3 ws w1 6 ; al w0 x1+10 ; w0:=page4ref rest3 rs. w1 b39. ; jl. w1 c7. ; compare al w1 x3+14 ; b39:=b39+14 wa. w1 b39. ; jl. a0. ; a1: ; end z. ; end c.i27 ; if drum j18: dl w2 x3+411 ; then begin ds. w2 b40.+4 ; b40(2:5):=rest(1:2) j19: rl w2 x3+408 ; w2:=usercatref rest3 j20: al w0 476 ; w0:=page4ref rest3 jl. w1 c7. ; compare z. ; end j21: dl w1 x3+409 ; ds. w1 b40.+4 ; b40(2:5):=discrest(1:2) j22: rl w2 x3+407 ; w2:=usercatref rest3 j23: al w0 475 ; w0:=page4ref rest3 jl. w1 c7. ; compare rl. w0 b41. ; rl. w1 (b16.) ; rs w0 x1+12 ; restore page3 rl. w2 b5. ; jl. w3 (b6.) ; open (reserve usercat) dl. w3 b32.+2 ; jl. (b8.) ; pagejump(saved return) c.i30-1 g17=j17+1 z.c.i27 g18=j18+1 g19=j19+1 g20=j20+1 z. g21=j21+1 g22=j22+1 g23=j23+1 e. ;end a-names \f ; boj 5.1.72 boss2 bsadjust ...23... ; ; procedure compare ; call return ; w0 page4ref(a) undef ; w1 link unch ; w2 usercatref(b) und ; w3 ref page4 unch c7: ws. w1 b0. ; rs. w2 b27.-4 ; save usercat ref; ds. w1 b27. ; save page 4 ref and return; am (0) ; rl w1 x3 ; b40(6:7):= perm option key3; rs. w1 b40.+6 ; al w1 6 ; adjust key 3(entries, slices); jl. w3 c9. ; al w1 7 ; jl. w3 c9. ; rl. w1 b40.+6 ; am. (b27.-2); perm option key 3:= b40(6:7); rs w1 x3 ; rl. w2 b27.-4 ; get usercat ref; jl. w3 c5. ; get usercat segment wa. w3 b27.-2 ; w3:=absref(a) bz w0 x3 ; get a.entries bz. w1 b40.+6 ; and b.entries sl w0 x1 ; if a>=b hs w1 x3 ; then a:=b bz w0 x3+1 ; and similarily for slices bz. w1 b40.+7 ; sl w0 x1 ; hs w1 x3+1 ; rl. w3 b0.+8 ; w3:=ref page4 rl. w1 b27. ; return jl. x1+b0. ; f5=k-b0 ; f6=c0-b0 ; f7=c1-b0 ; f8=c6-b0 ; i. e. ; end bsadjust procedures segment \f ; rc 02.10.71 boss 2, init from usercat ...24... ; first the job-descr. is initialized with the boss-2 std values ; next the project number is searched in the user catalog: ; first by lookup in the index from which the first relevant ; segment number in the catalog is obtained ; then the project number is searched on the actual segment ; and all project values are transferred to the job-descr. . ; ; finally the actual user is searched, and all user values are ; transferred to the job-descr. . ; ; ; the routine may be called from any coroutine, but works singular ; by locking a binary semaphore on entry and opening it on exit. ; ; ; 3 types of exits are performed: ; normal exit to call + 8 ; used exit to call + 6 when the jobname is allready ; used ; not found exit to call + 4 when project number or user ; is not found in the catalog ; illegal exit to call + 2 when the user index is too big ; ; ; the pages are used as follows: ; page 0 code and variables ; page 1 not used (but restablished on exit) ; page 2 not used ; page 3 user cat buffer ; page 4 job-descr. ; ; ; names on page 0 ; a - names are used as local labels ; b - names are used as global variables and constants ; c - names are used as global labels ; j - names are used as local variables ; ; names on page 4 ; d - names are used as relative addresses in the job-descr. ; ; global names ; g - names are used as table bases (g20 and g21) and to define ; the values in the external list. b. f10 w. p.2 ; input jobdescr s. g50 w. ; external table h4=h3. ; g25., g26., g27., g28., g29., g30., g31., g32., g33., g34. g35., g36., g37., g38., g39., g41., g42. h5: h6 ; end external list jl. g24. ; goto start init b. b35, c25 w. \f ; rc 02.10.71 boss 2, init from usercat ...25... ; initialize code and variables g24: al w0 1 ; reserve - usercat - rs. w0 (b9.) ; semaphore := 1; rl. w0 b9. ; ext 75 := abs addr of rs. w0 b33. ; ext(75); al w0 i38 ; w0 := reserve on disc al w1 512 ; w1 := length of page 3 jl. w3 (g25.) ; reserve virt (w0, w1); al w2 x2+1 ; writing(virt addr) := true; rs. w2 b20. ; save virt addr; rs. w2 b34. ; ext(416); al w0 i37 ; w0 := reserve on disc; al w1 g23 ; w1 := length of page0; jl. w3 (g25.) ; reserve virt (w0, w1); al w2 x2+1 ; writing (virt addr) := true; al w3 g22 ; w3 := rel entry on page 0; rs. w2 b31. ; rs. w3 b32. ; jl. w3 (2) ; set externals; g27: 40 ; b33: 0 , 75 ; reserve usercat semaphore; b34: 0 , 416 ; virt addr of usercat buffer; b31: 0 , 159 ; virt addr of page 0; b32: 0 , 160 ; rel entry page 0; d26, 529 ; rel project base (not maxbase) 0 , -1000 ; end of externals; al. w0 b0. ; w0 := first of page 0; jl. w3 (g26.) ; move to virt (w0, w1); am.(4,jl.4,h3.) ; goto initialize bsadjust g25: 12 ; reserve virt g26: 13 ; move to virt g28: 0 ; start of ext. table \f ; rc 02.10.71 boss 2, init from usercat ...26... ; global variables and constants for all page 0 ; ; start of page 0 b0: 0 ; abs addr of page 0 b1: 0 ; abs addr of page 1 b2: 0 ; abs addr of page 2 b3: 0 ; abs addr of page 3 b4: 0 ; abs addr of page 4 82<12 + 0 ; page ident: init from usercat b5: 2 ; ext. send and wait fast b6: 0 ; global work (normally an address) b7: <:usercat:>,0 ; name of usercat g35: 286 ; external name table address b8: 4<12 ; top type of interest in scan b9: h. e13, 19 w. ; ext. reserve-usercat-semaphore b10: 3 ; ext. lock b11: 4 ; ext. open ;b12 ; start + 2 of std values ;b13 ; last of std values b14: 3<12, 0 ; input message: operation, first b15: 0 ; last of transfer b16: 0 ; segment number ;b17 0 or 1 ; state: 0 = user found, 1 = project found b18: 26 ; ext. addr of cur coroutine descr addr 0 ; b19: 0 ; saved return point b20: 0 ; virt addr of page 3 b21: 0 ; saved page 1 addr b22: 8 ; ext page jump addr b23: 7 ; ext get pages b24: 280 ; ext virt addr of banker page b25: 281 ; ext rel of first job name b26: 284 ; ext job descr length 0 ; b29: 0,0 ; job name part 1 b30: 0 ; job name part 2 ; g - names ; g20: start of action table ; g21: start of rel.addr. in job-descr. ; g22: rel entry in page 0 ; g23: length of page 0 ; define addresses in external list: g29 = b5 g30 = b9 g31 = b10 g32 = b11 g33 = b18 g34 = b22 g36 = b23 g37 = b24 g38 = b25 g39 = b26 \f ; rc 02.10.71 boss 2, init from usercat ...27... ; entry page 0 ; ; registers: undefined ; page 0 : this page ; page 1 : coroutines page 1 ; page 2 : 0 ; page 3 : irrelevant ; page 4 : job-descr. g22 = k - b0 ; define rel entry of page 0 rl. w0 b20. ; rl. w2 (b18.) ; rs w0 x2+12 ; insert page-3 descr; rl. w2 b9. ; w2 := semaphore; jl. w3 (b10.) ; lock (w2); dl w1 x3+2 ; ds. w1 b19. ; save return point; al w0 0 ; rl. w2 (b18.) ; page-1 descr := 0; rx w0 x2+8 ; rs. w0 b21. ; save old page-1 descr; ; insert std values in job description ; ; b12 = start + 2 of std values ; b13 = last of std values ; d63 = first + 2 of job-descr. to be initialized b.a0 w. al. w1 b12. ; from := start + 2; am. (b4.) ; al w2 +d63 ; to := first + 2 in page 4; a0: dl w0 x1 ; rep: ds w0 x2 ; double(to) := double(from); al w1 x1+4 ; from := from + 4; al w2 x2+4 ; to := to + 4; sh. w1 b13. ; if from <= last then jl. a0. ; goto rep; e. \f ; rc 25.10.71 boss 2, init from usercat ...28... ; search project number in index b. a5, j0 w. al w1 0 ; get and rs. w1 j0. ; save first index segm no; jl. w3 c6. ; comment w2 := first index; a0: am. (b4.) ; get project: rl w0 +d20 ; w0 := project from job-descr. ; a1: sh w0 (x2) ; test: if w0 > word(w2) then jl. a2. ; begin al w2 x2+2 ; am. (b3.) ; if w2 < top of segment then sh w2 +510 ; goto test; jl. a1. ; jl. w3 c5. ; next segment; jl. a0. ; goto get project; ; end; a2: ws. w2 b3. ; w2 := final segment no ls w2 -1 ; mod 256; rl. w1 b16. ; w1 := relative ws. w1 j0. ; index segm no ls w1 8 ; * 256 + wa w1 4 ; w2; jl. w3 c6. ; get segment (w1); j0 = b30 ; use jobname area as work; ; search actual type-0 record in page 3 ; if not found on the actual segment, an ; error exit is performed; se w1 x1 ; if false then a3: ba w2 x2+1 ; next: w2 := addr of next; rl w0 x2 ; w0 := type. length; sl w0 512 ; if type > 0 then jl. a3. ; goto next; sn w0 0 ; test: if type, length = 0 then jl. c3. ; goto exit not found; rl w0 x2+2 ; w0 := project(w2); am. (b4.) ; rl w1 +d20 ; w1:= actual project; sh w0 x1-1 ; if w0 < actual then jl. a3. ; goto next; se w0 x1 ; if w0 <> actual then jl. c3. ; goto exit not found; ; now w2 points on the actual type-0 record ; transfer the contents jl. w3 c1. ; calculate address; rl. w3 b4. ; w3 := base of job-descr. ; al w1 x1+8 ; rs w1 x3+d22 ; save addr of rest claims; dl w1 x2+6 ; ds w1 x3+d21 ; transfer max interval, may be redifined in case of a userpool; ds w1 x3+d26 ; project interval, may not be redefined; al w0 1 ; hs. w0 b17. ; state := 1; (project found); hs. w0 b27. ; userpool:= false(=1); e. \f ; rc 02.10.71 boss 2, init from usercat ...29... ; next record ; ; the address of the next record is made available in w2 ; exit is made to the action found in table g20 ; ; entry exit ; ; w0 - type, length ; w1 - type ; w2 old record new record ; w3 - destroyed b. a1 w. c9: ba w2 x2+1 ; w2 := top addr of old record a0: rl w0 x2 ; test type sn w0 0 ; if type, length = 0 then jl. a1. ; goto next; bz w1 0 ; w1 := type; bz w3 0 ; w3 := type>1 ls w3 -1 ; sl w3 g19 ; (if outside table then c.-1, o89, z. ; (bossfault xref) jd -89 ; bossfault 89) ba. w3 x3+g20. ; + byte(table+type>1); jl. x3+g20. ; goto action(table+x3); a1: jl. w3 c5. ; next: call next segment; jl. a0. ; goto test type; e. ; the following contains the actions transferring ; information from the user catalog to the job ; description ; type 0 action ; goto if state = 0 then normal exit ; else not found exit c10: bz. w0 b17. ; w0 := state; se w0 0 ; if w0 <> 0 then jl. c3. ; goto not found exit; jl. c2. ; goto normal exit; ; type 2 action ; if state = 0 then goto normal exit; ; search actual user ; state := 1; c11: sn w1 x1 + 0 ; if state = 0 then jl. c2. ; goto normal exit; b17 = c11+1 ; define state \f ; rc 05.01.72 boss 2, init from usercat ...30... ; search user b. a20, j10 w. a0: am. (b4.) ; start: al w3 +d23 ; w3 := addr of user name; a1: dl w1 x3+2 ; test name: sn w0 (x2+2) ; if first part of name se w1 (x2+4) ; not ok then jl. a2. ; goto nextrec; dl w1 x3+6 ; sn w0 (x2+6) ; if second part of name se w1 (x2+8) ; not ok then jl. a2. ; goto nextrec; jl. a5. ; goto found; a2: ba w2 x2+1 ; nextrec: w2 := top of record; am. (b3.) ; sl w2 +512 ; if w2 > last of segment then a3: jl. w3 c5. ; next: next segment; rl w0 x2 ; w0 := type, length; sl. w0 (b8.) ; if w0 > 3<12 then jl. a2. ; goto nextrec; sn w0 0 ; if w0 = 0 then jl. a3. ; goto next; sh w0 512 ; if type = 0 then jl. c3. ; goto exit not found; jl. a0. ; goto start; ; transfer contents of type 2 record; a5: rl. w3 b4. ; found: w3 := base of job-descr. ; rl w0 x3+d61 ; w0 := user id addr; se w0 0 ; if w0 = 0 then jl. a6. ; begin jl. w3 c1. ; calculate address; al w1 x1+2 ; rl. w3 b4. ; insert user id addr; rs w1 x3+d61 ; end; a6: rl w1 x3+d25 ; w1 := user index; sl w1 (x2+14) ; if w1 >= top index then jl. c4. ; goto illegal exit; wm w1 x2+12 ; w1 := userindex * sublength wa w1 x2+10 ; + start of interval; hs. w0 b17. ; state := 0; comment w0 = 0; hs. w0 b27. ; userpool:= true; al w0 x1-1 ; w0 := w1-1+sublength; wa w0 x2+12 ; rx w1 0 ; change (w0, w1); ds w1 x3+d24 ; save std interval; rl w1 x2+12 ; userinterval := wm w1 x2+14 ; (start interval, wa w1 x2+10 ; start interval + al w1 x1-1 ; top user index * rl w0 x2+10 ; sublength - 1); ds w1 x3+d24+4 ; \f ; rc 02.10.71 boss 2, init from usercat ...31... ; create jobname ; ; 1. insert user name as jobname dl w1 x3+d23+2 ; ds w1 x3+d19+2 ; move name dl w1 x3+d23+6 ; ds w1 x3+d19+6 ; al w1 x3+d19 ; w1 := addr of name; a7: rl w0 x1 ; next: so. w0 (j0.) ; if word(w1) is not filled then jl. a8. ; goto convert; al w1 x1+2 ; w1 := addr of next word; jl. a7. ; goto next; ; 2. convert user index to text a8: ws. w2 b3. ; w2 := rel of w2; ds. w2 j2. ; save w1, w2; rl w2 x3+d25 ; sh w2 9 ; if user index < 10 then jl. a9. ; goto single; al w1 0 ; wd. w2 j3. ; separate digits; al w2 x2+48 ; so. w0 (j4.) ; ls w2 8 ; so. w0 (j5.) ; insert 1. digit as text ls w2 8 ; in job name wa w0 4 ; rs. w0 (j1.) ; al w2 x1 ; number := 2. digit a9: al w2 x2+48 ; single: sz w0 32 ; if textword is filled then jl. a10. ; goto new word; so. w0 (j4.) ; ls w2 8 ; so. w0 (j5.) ; insert number as text ls w2 8 ; in jobname; wa w0 4 ; rs. w0 (j1.) ; jl. a11. ; goto move to banker; a10: ls w2 16 ; new word: am. (j1.) ; word (w1+2) := rs w2 + 2 ; number shift 16; ; 3. move job name to banker page a11: dl w1 x3+d19+2 ; move jobname to ds. w1 b29. ; work area; dl w1 x3+d19+6 ; ds. w1 b30. ; rl. w0 b24. ; rl. w2 (b18.) ; rs w0 x2+8 ; page 1 := banker page; jl. w3 (b23.) ; get pages; a12: rl. w3 b1. ; again: wa. w3 b25. ; w3 := addr of first job name; al w0 i45 ; rest psjobs := rs. w0 b6. ; no of psjobs; \f ; rc 02.10.71 boss 2, init from usercat ...32... a14: dl. w1 b29. ; test next: if first part of sn w0 (x3+0) ; jobname = first part of se w1 (x3+2) ; jobname in banker then jl. a13. ; goto not used; dl. w1 b30. ; if second part of jobname sn w0 (x3+4) ; = second part of jobname se w1 (x3+6) ; in banker then jl. a13. ; goto not used; jl. a16. ; goto test psjobno; a13: wa. w3 b26. ; not used: w3 := addr of next job name; al w1 -1 ; rest psjobs := wa. w1 b6. ; rest psjobs -1; rs. w1 b6. ; se w1 0 ; if rest psjobs <> 0 then jl. a14. ; goto test next; am. (b4.) ; bz w2 d14+3 ; w2 := psjob no al w2 x2-2 ; -2 wm. w2 b26. ; * length of description wa. w2 b25. ; + rel of first description wa. w2 b1. ; + base of descriptions; dl. w1 b29. ; ds w1 x2+2 ; move jobname to dl. w1 b30. ; banker page; ds w1 x2+6 ; a15: rl. w2 (b18.) ; release: al w0 0 ; rs w0 x2+8 ; release banker page; rl. w2 j2. ; w2:= saved rel record + wa. w2 b3. ; abs user cat buf; jl. c9. ; goto next record; ; test psjobno ; if psjobno(banker) <> psjobno(psjobdescr) ; then goto used exit; a16: ws. w3 b1. ; w3 := psjobno(banker) := ws. w3 b25. ; (abs cur name - page 1 al w2 0 ; - rel of first name)/ wd. w3 b26. ; length of entry; am. (b4.) ; w3 := w3 - bs w3 +d14+3 ; psjobno (psjobdescr); se w3 -2 ; if w3 <> -2 then jl. c7. ; goto used exit; jl. a15. ; goto release; j0: 32<16+32<8+32 ; 3 chars used mask j1: 0 ; saved w1 j2: 0 ; saved w2 j3: 10 ; j4: 32<8 ; 2. char used mask j5: 32<16 ; 1. char used mask j6: 4095 ; serial jobno mask e. \f ; rc 02.10.71 boss 2, init from usercat ...33... ; type 4 action ; transfer respite directely; ; transfer priority through store byte; c12: rl w0 x2+4 ; am. (b4.) ; rs w0 +d27 ; transfer respite; jl. c15. ; goto store byte; ; type 6 action ; search device name ; transfer address of claims b. a1 w. c13: se w1 x1+0 ; if userpool then b27=c13+1 ; begin jl. a1. ; rl. w3 b4. ; maxinterval:= dl w1 x3+d24 ; std interval; ds w1 x3+d21 ; al w3 1 ; w3:= 1; hs. w3 b27. ; userpool:= false; al w0 0 ; am. (b4.) ; rs w0 +d62 ; no of privkits:= 0; a0: sl w3 d80-d28; clear all private kit table...; jl. a1. ; am. (b4.) ; rs w0 x3+d28-1 ; al w3 x3+2 ; jl. a0. ; end; a1: ; jl. w3 c0. ; search devicename rl w1 x2+14 ; slicelength:= slice length of kit; rl w0 x2+10 ; job claims := rest claims; ds w1 x3+d113 ; jl. w3 c1. ; calculate address al w1 x1+10 ; of rest claims; am. (b6.) ; rs w1 +d29 ; save address; jl. c9. ; goto next record; e. ; \f ; rc 19.12.72 boss 2, init from usercat ...33a... ; type 8 action ; transfer variable length record to job-descr. b.a1 w. c14: bz. w1 x1+g21. ; w1 := rel on job descr; hs. w1 a1. ; bz w1 x2+1 ; w1 := no of bytes + 2; a0: al w1 x1-2 ; next: w1 := w1 - 2; am (x2) ; rl w0 x1 ; w0 := word(record+x1); am. (b4.) ; word(job-descr. + a1=k+1 rs w0 x1;+d30-2 ; rel-of-bits + x1) := w0; se w1 2 ; if w1 <> 2 then jl. a0. ; goto next; jl. c9. ; goto next record; e. ; transfer byte c15: rl w0 x2+2 ; w0 := word (record + 2); bz. w1 x1+g21. ; w1 := rel in job-descr. ; am. (b4.) ; hs w0 x1 ; byte(list + x1) := w0; jl. c9. ; goto next record; ; transfer word c16: rl w0 x2+2 ; w0 := word( record + 2); bz. w1 x1+g21. ; w1 := rel in job-descr. ; am. (b4.) ; rs w0 x1 ; word(list + w1) := w0; jl. c9. ; goto next record; \f ; rc 02.10.71 boss 2, init from usercat ...34... ; transfer double c17: dl w0 x2+4 ; w3,w0 := double(record + 4); bz. w1 x1+g21. ; w1 := rel in job-descr. ; am. (b4.) ; ds w0 x1 ; double(list + w1) := w3,w0; jl. c9. ; goto next record; ; type 42, 44 action ; transfer addr of record(2); c18: bz. w1 x1+g21. ; rs. w1 b6. ; b6 := rel addr in list; jl. w3 c1. ; calculate address al w1 x1+2 ; + 2; rl. w3 b6. ; am. (b4.) ; word(list + b6) := rs w1 x3 ; address; jl. c9. ; goto next record; ; type 48 action ; transfer private claim c19: jl. w3 c0. ; search device name; rl w0 x2+10 ; claims(device) := rs w0 x3+d57 ; word(record + 10); jl. c9. ; goto next record; ; type 34 action ; transfer disc claims ; goto transfer double (max interval) c20: rs. w1 b6. ; save w1 jl. w3 c1. ; calculate addr; al w1 x1+6 ; addr := rel 6; rl. w3 b4. ; rs w1 x3+d22 ; save claim addr; rl. w1 b6. ; get w1; jl. c17. ; goto transfer double; ; type 54 action ; transfer program name c21: bz. w3 x1+g21. ; wa. w3 b4. ; w3 := abs destination; dl w1 x2+4 ; ds w1 x3+2 ; dl w1 x2+8 ; move program name; ds w1 x3+6 ; al w1 0 ; name table addr := 0; rs w1 x3+8 ; jl. c9. ; goto next record; \f ; rc 02.10.71 boss 2, init from usercat ...35... ; search device name ; ; entry exit ; w0 - destroyed ; w1 - destroyed ; w2 record addr unchanged ; w3 return device addr ; on exit b6 = device addr b. a3, j0 w. c0: rs. w3 j0. ; save return; am. (b4.) ; w3 := addr of first device al w3 +d28-14 ; - 14; a0: al w3 x3+14 ; next: w3 := addr of next device; dl w1 x3+2 ; w0,w1 := devicename(1); sn w0 (x2+2) ; se w1 (x2+4) ; if not expected name then jl. a1. ; goto test empty; dl w1 x3+6 ; w0,w1 := devicename(2); sn w0 (x2+6) ; se w1 (x2+8) ; if not expected name then jl. a0. ; goto next; jl. a2. ; goto save; a1: se w0 0 ; test empty: if not empty then jl. a0. ; goto next; rl. w1 b4. ; rl w0 x1+d62 ; sl w0 i30 ; if no of kits >= max number of private kits then c.-1, o87, z. ; (bossfault xref) jd -87 ; boss alarm; ba. w0 1 ; no of kits:= no of kits + 1; rs w0 x1+d62 ; dl w1 x2+4 ; ds w1 x3+2 ; move name from usercat dl w1 x2+8 ; to job-descr. ; ds w1 x3+6 ; a2: rs. w3 b6. ; save: b6 := device address; jl. (j0.) ; return; j0: 0 ; saved return; e. ; calculate usercat address ; the current value of x2 is transformed to ; segmentno < 12 + segmentrel; ; ; entry exit ; w0 - destroyed ; w1 - address ; w2 abs addr unchanged ; w3 return return c1: al w1 x2 ; w1 := ws. w1 b3. ; rel addr ls w1 12 ; shift 12 + rl. w0 b16. ; segmno shift 24 ld w1 -12 ; shift (-12); jl x3 ; return; \f ; rc 02.10.71 boss 2, init from usercat ...36... ; exits ; normal exit to call + 8 ; used exit to call + 6 ; not found exit to call + 4 ; illegal exit to call + 2 c2: am 2 ; normal exit: w0 := 6 or c7: am 2 ; used exit: w0 := 4 or c3: am 2 ; not found exit: w0 := 2 or c4: al w0 0 ; illegal exit: w0 := 0; wa. w0 b19. ; rel := rel + w0; rs. w0 b19. ; (rel = call + 2) rl. w2 b9. ; w2 := semaphore; jl. w3 (b11.) ; open (w2); rl. w3 (b18.) ; al w0 0 ; rs w0 x3+12 ; page 3 addr := 0; rl. w0 b21. ; rs w0 x3+8 ; page 1 addr := saved addr; dl. w3 b19. ; get return point; jl. (b22.) ; return with page jump; ; next segment ; ; entry exit ; w0 - destroyed ; w1 - destroyed ; w2 - first of segment ; w3 link destroyed c5: rl. w1 b16. ; al w1 x1+1 ; w1 := segmno + 1; ; get segment ; ; entry exit ; w0 - destroyed ; w1 segment no destroyed ; w2 - first of segment ; w3 link destroyed c6: rs. w1 b16. ; segmno := w1; ws. w3 b0. ; rs. w3 b6. ; b6 := rel return; rl. w1 b3. ; w1 := first of transfer; al w2 x1+510 ; w2 := last of transfer; ds. w2 b15. ; save buffer limits; al. w1 b14. ; w1 := message address; al. w2 b7. ; w2 := name address; jl. w3 (b5.) ; send and wait fast; rl w1 x1+2 ; w1:= bytes transferred; sn w0 1<1 ; if not normal answer or se w1 512 ; bytes transferred <> 512 then c.-1, o83, z. ; (bossfault xref) jd -83 ; alarm; rl. w2 b3. ; w2 := first of segment; am. (b6.) ; jl. b0. ; goto (page-0-start + rel); \f ; rc 09.12.71 boss 2, init from usercat ...37... ; boss 2 std values b12 = k + 2 <:fp:>,0,0,0,0 ; program name, table entry h. 0 ; no of conversational input lines 0 ; tape table entries w. i122 h. ; terminal user rights; 0, r.8 ; usercat addresses c.i27,0 z. c.-i27, i126 z. ; temp disc entries i121 ; - - slices i113 ; login disc entries i114 ; - - slices 2047 ; perm disc entries 2047 ; - - slices c.-i27,0 z. c.i27, i126 z. ; temp drum entries i127 ; - - slices 0 ; login drum entries 0 ; - - slices 2047 ; perm drum entries 2047 ; - - slices c. i30 - 1 0, r.14*i30 z. ; space for private kits 0,0 ; h. 0 ; std values online job allowed i131 ; degree of information w. -1 ; max core lock h. 1 ; priority 0 ; clean catalog w. i134 ; waiting time swopped out i123 ; link h. 1 ; keys i132 ; stations 0 ; mounts 0 ; tapes i135 ; converts i136 ; accounts i137 ; output i138 ; suspendings w. i139 ; time i140 ; size h. i141 ; buffers i142 ; areas 0 ; internals 1<5 ; function: generate name only w. 1<23-1 ; max wait 0,r.6 ; intervals 0,0 ; device word \f ; re 6.2.75 boss 2, init from usercat ...37a... h. 0 ; max values online job allowed 1 ; degree of information w. -1 ; max core lock h. 1 ; priority 0 ; clean catalog w. i157 ; waiting time swopped out i124 ; link h. i143 ; keys i144 ; stations i145 ; mounts i146 ; tapes i147 ; converts i148 ; accounts i149 ; output i150 ; suspendings w. i151 ; time i152 ; size h. i153 ; buffers i154 ; areas i155 ; internals 1<5 ; function: generate name only w. i156 ; respite g41: -8 ; max device g42: -7 ; max device b13 = k c.(:(:b13-b12+2-d65-4+d18:)a. 4095:)-1 m. *** wrong length initialize table z. \f ; rc 02.10.71 boss 2, init from usercat ...38... ; action table ; index = type > 1 c22=c9, c.i27, c22=c16 z. h. g20: ; type: c10. , c11. , c12. , c13. , c14. , c15. ; 0 - 10 c15. , c15. , c15. , c15. , c15. , c15. ; 12 - 22 c15. , c16. , c15. , c15. , c16. , c20. ; 24 - 34 c22. , c16. , c16. , c18. , c18. , c16. ; 36 - 46 c19. , c16. , c9. , c21. , c15. , c15. ; 48 - 58 c16. , c15. , c15. , c16. , c15. , c16. ; 60 - 70 c15. ; 72-82 ; relative addresses in pseudo-job-list g21: ; std , max ; type , contents 0 , 0 ; 0 , (project) 0 , 0 ; 2 , (user) d132 , d133 ; 4 , max priority and respite 0 , 0 ; 6 , (private) d30-2, d65-2; 8 , device word d31 , d32 ; 10 , accounts d33 , d34 ; 12 , area claim d35 , d36 ; 14 , buffer claim d68 , d72 ; 16 , converts d39 , d40 ; 18 , internal claim d41 , d42 ; 20 , no of keys d43 , d44 ; 22 , mounts d45 , d46 ; 24 , output d47 , d48 ; 26 , size d49 , d50 ; 28 , stations d51 , d52 ; 30 , tapes d53 , d54 ; 32 , time d21 , d21 ; 34 , max interval d59 , d59 ; 36 , drum entries d58 , d58 ; 38 , disc entries d55 , d55 ; 40 , user entries disc d61 , d61 ; 42 , user identification d60 , d60 ; 44 , rest claim drum d56 , d56 ; 46 , user entries drum 0 , 0 ; 48 , (user entries, private) d66 , d27 ; 50 , latest 0 , 0 ; 52 , (project id) d18 , d18 ; 54 , program name d71 , d73 ; 56 , suspendings d75 , d76 ; 58 , online job allowed d77 , d78 ; 60 , max sec corelock d102 , d103 ; 62 , degree of information d132 , d133 ; 64 , priority d138 , d139 ; 66 , waiting time d134 , d135 ; 68 , clean catalog d143 , d143 ; 70 , terminal user rights (priv); d148 , d147 ; 72 , rblink w. g19=g21-g20 ; length of table \f ; rc 07.04.72 boss 2, init from usercat ...39... g23 = k - b0 ; define length of page 0 i. e.e. ; end initialization from usercat \f ; sl 14.7.71 boss 2, unknown sender, ...40... ; this corutine must be loaded last in order to get the last sender ; table entry. s. b40, g40 w. ; h6=h5. ; external list: g10., g11., g12., g13., g14., g15., g16., g17., g18., g19. g20., g21., g22., g23., g24., g25., g26., g27., g28., g29. g30., g31., g32., g33., g34., g35. h7: h8 ; jl. g2. ; goto init; b. a20, j10 w. ; begin code and variable page g0: ; b0: 0,r.5 ; page abs addresses 83<12 + 0 ; page ident: unknown sender b1: g10: e13<12+19 ; unknown sender sem, reserve b2: g11: 5 ; lock chain b3: g12: 10<12+ 20 ; unknown sender in sender table, reserve b4: 0 ; last terminal sender b5: 0 ;-2 saved sender proc addr b6: 0 ; saved sender table addr b7: 10 ; length of sender table entry b8: e12 ; length of corutine descr b9: g13: 101 ; first commio corutine b10: g14: 26 ; current corutine b11: g15: 7 ; get pages b12: g16: 4 ; open b13: g17: 163 ; first terminal sender; b14: 0,r.10 ; answer b15: 0 ; proc addr of main console; b17: 0 ; for set base b18: 6<12 ; illegal message to terminal b19: g18: 1 ; send and wait b21: g26: 67 ; banker que b22: g27: 6 ; open chain b20: 0, 10<12 ; banker operation: get psjob b24: g28: e13<12+19 ;+4 answer sem b23: g29: 3 ; lock b25: e13 ; semafore length b26: g30: 63 ; first psjob que b27: 0, 6, 0, r.12; newjob operation to psjob b28: <:disc:> ; name of disc b29: g31: 288 ; slicelength on disc b30: 0 ; bankerop release: 2<12+1 ;+2 code,psjob 0 ;+4 all,stations 1<12;+slices ;+6 entries,slices 0 ;+8 accounts,converts b31: 0, r.17 ; catalog entry b32: g32: 74 ; catalog semafor b33: g33: 78 ; printer answer reservation b34: g34: 76 ; first of psjob answer semafors b35: 0, 4 ; attention operation b36: g35: e13<12+19 ;+4 answer semafore; \f ; sl 14.7.71 boss 2, unknown sender, ...41... a1: rl. w2 b1. ; wait: jl. w3 (b2.) ; lock chain(unknown sender sem); g3: rl w2 x1+4 ; start corutine: w2:= mess buf addr; rl w3 x2+8 ; w3:= message-operation rl w2 x2+6 ; w2:= sender addr; sh w2 0 ; if sender does not exist then jl. a2. ; goto reject message; rl w0 x2 ; sn w0 0 ; sender.processkind <> internal or sn w3 0 ; message.operationcode = loginattention then jl. 4 ; goto attentionmessage else jl. a3. ; goto internal job; rl. w3 b13. ; w3:= first terminal sender; sn. w2 (b15.) ; if sender addr = main console then jl. a5. ; goto commandio found; a4: al w3 x3+10 ; rep: w3:= next sender; rl w0 x3 ; sn w0 0 ; if sender table.proc addr = 0 then jl. a5. ; goto commandio found; se. w3 (b4.) ; if w3 <> last terminal sender then jl. a4. ; goto rep; a2: am 1 ; reject message: a6: al w0 1 ; normal answer: w0:= result; rl. w3 b3. ; w3:= unknown sender addr; al w2 0 ; mess addr:=0; allow message. rx w2 x3+8 ; w2:= old mess addr; al. w1 b14. ; w1:= answer addr; jd 1<11+22; send answer; jl. a1. ; goto wait; a5: ds. w3 b6. ; commandio found: save proc addr, sender tab; rs w2 x3 ; sender table.proc addr:= sender addr; ws. w3 b13. ; al w2 0 ; w3:= (sender tab addr - first terminal sender) wd. w3 b7. ; // length of sender tab entry wm. w3 b8. ; * length of corutine descr wa. w3 b9. ; + first commio corutine; rl w0 x3+8 ; w0:= page 1 of current corutine rl. w3 (b10.) ; := page 1 of commandio; rs w0 x3+8 ; jl. w3 (b11.) ; get pages; rl. w2 b5. ; w2:= saved sender proc addr; dl w1 x2+4 ; g4: ds w1 x3+0 ; dl w1 x2+8 ; copy name to terminal name in page 1; g5: ds w1 x3+0 ; al w0 0 ; ; find name table address of sender rl w1 74 ; w1 := first name table address; a13: sn w2 (x1) ; rep: if proc descriptions equals then jl. a14. ; goto sender found; al w1 x1+2 ; w1 := next name table address; se w1 (80) ; if name table exhausted then jl. a13. ; goto reject message rl. w3 b6. ; else goto rep; rs w0 x3 ; sender table.proc address := 0; jl. a2. ; a14: ; sender found: g6: rs w1 x3+0 ; save name table address of sender; rl. w3 (b10.) ; rs w0 x3+8 ; page 1 descr:= not used; al. w3 b17. ; am (66) ; dl w1 +74 ; set cat base to boss max interval; jd 1<11+72; \f ; sl 24.4.72 boss 2, unknown sender, ...42... rl. w3 b0.+2 ; j1: al w3 x3+217 ; w3:= terminal name addr; rl. w2 b5. ; c.i181 ; suppress reservation att login se. w2 (b15.) ; if sender addr <> main console then jd 1<11+8 ; reserve process; z. am. (b6.) ; rl w2 +2 ; w2:= saved sender table.semafor; al. w1 b35. ; w1:= op; jl. w3 (b22.) ; open chained(login attention); rl. w2 b36. ; jl. w3 (b23.) ; lock answer; jl. a6. ; goto normal answer; a3: dl w0 x2+78 ; internal job: ds. w0 b27.+16; move std int of sender to psjob operation; rl w2 x1+4 ; w2:= mess buf addr; dl w0 x2+18 ; ds. w0 b27.+8 ; move file name from dl w0 x2+22 ; message to psjob operation; ds. w0 b27.+12; bz w0 x2+8 ; w0:=operation code; se w0 12 ; if not new job then jl. a8. ; goto remove area; al. w1 b20. ; rl. w2 b21. ; open chain(bankerque, get psjob); jl. w3 (b22.) ; rl. w2 b24. ; jl. w3 (b23.) ; lock(answer); bl. w1 b20.+3 ; w1:= psjob number; al w0 1 ; w0:= prepare for no psjob idle; sn w1 0 ; if no psjob idle then jl. a7. ; goto newjob answer; al w2 x1-2 ; wm. w2 b25. ; w2:= (psjob number -2) * semafore length wa. w2 b26. ; + first psjob queue; al w3 6 ; op.2 := internal job rl. w0 b24. ; ds. w0 b27.+4 ; op.4:= answer sem; ; note: rb variables are always cleared al. w1 b27. ; jl. w3 (b22.) ; open chain(psjob que, newjob operation); rl. w2 b24. ; jl. w3 (b23.) ; lock(answer); bl. w0 b27.+2 ; w0:= result of newjob; a7: rs. w0 b14. ; newjob answer: store status; jl. a6. ; goto normal answer; g19=j1+1 ; \f ; pm 3.7.72 boss 2, unknown sender, ...43... a8: se w0 40 ; remove area: if not remove area then jl. a2. ; goto reject message dl. w1 b27.+16; set catalogbase to standardbase of sender al. w3 b17. ; jd 1<11+72; se w0 0 ; if result <> 0 then jl. a10. ; goto test result al. w3 b27.+6 ; w3:=areaname addr jd 1<11+52; create areaprocess se w0 0 ; if result <> 0 then jl. a9. ; goto test cause jd 1<11+8 ; reserve process se w0 0 ; if result <> 0 then jl. a12. ; goto remove and reject al. w1 b31. ; lookup head and tail jd 1<11+76; se w0 0 ; if result <> 0 then c.-1, o84, z. ; (bossfault xref) jd -84 ; bossalarm rl. w0 b31. ; if not scope temp then sz w0 6 ; jl. a12. ; goto remove and reject rl. w1 b31.+14; w1:=size sh w1 -1 ; if size<0 then al w1 0 ; w1:=0 al w0 0 ; wd. w1 b29. ; w1:=size//discslicelength se w0 0 ; if size mod discslicelength <> 0 then al w1 x1+1 ; w1:=w1+1 hs. w1 b30.+7 ; bankeroprelease.slice:=w1 sh w1 0 ; if w1>0 then jl. a11. ; begin dl. w1 b31.+18; if documentname <> <:disc:> then sn. w0 (b28.) ; se. w1 (b28.+2); jl. a12. ; goto remove and reject ; end \f ; pm 3.7.72 boss 2, unknown sender, ...44... a11: al. w1 b14.+2 ; send normal answer al w3 0 ; allow messages am. (b3.) ; rs w3 +8 ; al w0 1 ; jd 1<11+22; rl. w2 b32. ; lock(catalog semafor) jl. w3 (b23.) ; dl. w1 b27.+16; set catalogbase al. w3 b17. ; jd 1<11+72; al. w3 b31.+6 ; remove entry jd 1<11+48; rl. w2 b32. ; open(catalog semafor) jl. w3 (b12.) ; rl. w2 b33. ; lock(printer answer reservation) jl. w3 (b23.) ; rl. w2 b21. ; open chain(banker, release) al. w1 b30. ; jl. w3 (b22.) ; rl. w2 b34. ; lock(printer answer) al w2 x2+e13 ; jl. w3 (b23.) ; rl. w2 b33. ; open(printer answer reservation) jl. w3 (b12.) ; jl. a1. ; goto wait a9: sl w0 3 ; test cause: if hard error then jl. a2. ; bossalarm else goto reject message c.-1, o85, z. ; (bossfault xref) jd -85 ; a10: sl w0 4 ; test result: if hard error then c.-1, o86, z. ; (bossfault xref) jd -86 ; bossalarm else goto reject message jl. a2. ; a12: jd 1<11+64; remove and reject: remove process jl. a2. ; goto reject message e. ; end code and variable page g1=k-g0 ; \f ; sl 14.7.71 boss 2, unknown sender, ...45... g7: 3<15+e83<12 + g3-g0; initial test mode, start relative g20: e12<12+ 18 ; reserve one corutine descr g21: 217 ; terminal name g22: 14 ; simulate lock g23: 12 ; reserve virtual g24: 13 ; move to virtual g25: 15 ; end init g8: 0,0,0,0 ; work, process name g2: rl. w1 b13. ; start init: al w1 x1+10*i4 ; last terminal sender:= first terminal sender rs. w1 b4. ; + number of commios * 10 - 10; rl. w1 g21. ; al w1 x1+2 ; hs. w1 g4.+1 ; al w1 x1+4 ; set rel addresses of terminal name; hs. w1 g5.+1 ; al w1 x1+2 ; hs. w1 g6.+1 ; rl w2 74 ; rl w2 x2+i1<1 ; w2:= proc addr of main console; dl w1 x2+4 ; ds. w1 g8.+2 ; copy name of main console dl w1 x2+8 ; ds. w1 g8.+6 ; al. w3 g8. ; jd 1<11+4 ; get process addr; rs. w0 b15. ; differs from w2 under simulation. rl. w2 b1. ; w2:= addr of unknown sender sem; am. (b3.) ; rs w2 +2 ; sender table.sem addr:= w2; rl. w1 g20. ; jl. w3 (g22.) ; simulate lock al w0 i61 ; al w1 g1 ; jl. w3 (g23.) ; reserve virtual al w2 x2+1 ; write page al. w0 g0. ; jl. w3 (g24.) ; move to virt rl. w1 g7. ; am. (g20.) ; ds w2 +6 ; set start addr and page 0 am.(4,jl.4,h5.) ; goto initialize tinitcat; i.e. \f ; lkn remote batch ...46... ; this code page contains procedures for communicating with the net supervisor ; process, named <host> ; ; the procedures are: ; ; lookup host gets the description of the device host corresponding ; to a link process ; ; lookup device checks whether or not a device matching the device ; description, is connected to the specified host ; ; lookup and reserve device ; as lookup device and if the device exists a link ; is created and the link process is reserved ; ; ; ; ; initialization: s. b100, c100, f100, g100 w. h8=h7. ; external table g10., g11., g12., g13., g14., g15. 0 b. a10 w. al w0 i64 ; start initialization al w1 g1 ; jl. w3 (g10.) ; reserve virtual al. w0 b0. ; jl. w3 (g11.) ; move to virtual rs. w2 a1. ; set virtual address of code page jl. w3 (2) ; set externals g12: 40 ; a1: 0 , 140 ; virt of code g20, 141 ; rel lookup and reserve g21, 142 ; rel lookup device g25, 146 ; rel lookup host 0 , -1000 ; end of externals am. (4) ; jl. 4 ; goto initialize unknown sender h7. ; e. g10: 12 ; reserve virtual g11: 13 ; move to virtual \f ; lkn remote batch ...47... ; definition of various formats: ; ; message format: f0 = 0, f1 = 1 ;+0 operation , function mode<1 + address mode f2 = 2 ;+2 first of operation f3 = 4 ;+4 last of operation f4 = 6, f5 = 7 ;+6 dh. linkno , dh. hostno ( or process description ) f6 = 8 ;+8 dh. hostid f7 =10, f8 =11 ;+10 dh. homereg , dh. netid ; operation format (input or output to or from <host>) f20= 0, f21= 1 ;+0 mode , kind f22= 2, f23= 3 ;+2 timeout , buffers f24= 4 ;+4 buffer size f25= 6 ;+6 device name ;+8 - ;+10 - ;+12 - f26=14 ;+14 unused f27=16 ;+16 jh. hostid f28=18, f29=19 ;+18 jh. homereg , jh. netid f30=20 ;+20 process description ; answer format: f40= 0 ;+0 device status < 16 + link descriptor < 12 + return value f41= 2 ;+2 bytes f42= 4 ;+4 characters f43= 6, f44= 7 ;+6 dh. linkno , dh. hostno f45= 8 ;+8 dh. hostid f46=10, f47=11 ;+10 dh. homereg , dh. netid \f ; lkn remote batch ...48... ; start of code page b0: 0 ; page 0 b1: 0 ; page 1: contains parameters b2: 0 ; page 2 b3: 0 ; page 3 b4: 0 ; page 4: job description page at search and define device 84<12+0; page identification b10: 1<12, 0,r.7 ; message area b11: 0,r.5 ; name of process, name table address b12: g13: 1 ; send and wait b13: g14: 8 ; page jump b14: g15: 21 ; coruno output b20: <:printer:>,0 ; some printer is converted to the name <printer> b22: <:host:>,0,0,0 ; name of host process b23: 0 ; work b24: 15 ; mask b25: (:-1:)>1 ; mask1 b26: 97<16-1 ; base of legal name formats b27: 3 ; characters per word \f ; lkn remote batch ...49... ; lookup host: ; ; call and return parameters as described in options (page 7b) ; error return: device locally connected ; ; this procedure sends a lookup message to <host> to get the description of the ; device host corresponding to the link process pointed out b. a10 w. c0: rl w2 x3+r40 ; lookup host: jl. w1 c20. ; clear message area al w0 4<6+12 ; al w1 x3+r40 ; jl. w3 (b14.) ; testout(call parameters) al w0 2<1+1 ; hs. w0 b10.+f1; function mode:=lookup process rl w2 x3+r40 ; rs. w2 b10.+f2; set first, al w2 x2+f30 ; rs. w2 b10.+f3; last of operation area rl w0 x3+r41 ; rs. w0 b10.+f4; set process description address al w0 16<6+12; al. w1 b10. ; jl. w3 (b14.) ; testout(message) al. w1 b10. ; w1:=abs ref message al. w2 b22. ; jl. w3 (b12.) ; send and wait lookup process so w0 1<1 ; if result <> 1 jl. c14. ; al w0 16<6+12; rs. w1 b23. ; save answer reference jl. w3 (b14.) ; testout(answer) rl. w1 b23. ; bz w0 x1+f40+1 ; or return value <> 0 se w0 0 ; jl. c15. ; then goto error return bz w0 x1+f40 ; la. w0 b24. ; se w0 1 ; if not connected as rb device jl. c15. ; then goto error return dl w1 x1+f45 ; set dh.linkno < 12 + hostno, ds w1 x3+r142+2 ; dh. hostid al w0 22<6+12; rl w1 x3+r40 ; jl. w3 (b14.) ; testout(host input) jl. c10. ; goto normal return e. \f ; lkn remote batch ...50... ; lookup device: ; ; call and return parameters as described in options (page 7b) ; error return: device not found ; ; this procedure sends a lookup message to host to get a total description of ; a device at a specified host b. a10 w. c6: rs. w1 b23. ; set lookup operation: al w0 22<6+12; al w1 x3+r0 ; jl. w3 (b14.) ; testout(call parameters) rl w0 x3+r1 ; if device = some printer se w0 1 ; then jl. a1. ; begin dl. w1 b20.+2 ; device name:=<:printer:> ds w1 x3+r1+2 ; dl. w1 b20.+6 ; ds w1 x3+r1+6 ; al w0 14; mode is unchanged (=option i185) ; device kind:=14 hs w0 x3+r4 ; end a1: rl w2 x3+r0 ; w2:=message area jl. w1 c20. ; clear message area rs. w2 b10.+f2; set first, al w0 x2+f30 ; rs. w0 b10.+f3; last of message area, dl w1 x3+r2+2 ; dh. linkno < 12 + hostno ds. w1 b10.+f6; dh. hostid al w0 0 ; rs. w0 b10.+f7; homereg < 12 + netid := 0 rl w0 x3+r3 ; set host output: rs w0 x2+f20 ; mode, kind dl w1 x3+r1+2 ; ds w1 x2+f25+2 ; device name dl w1 x3+r1+6 ; ds w1 x2+f25+6 ; al w0 16<6+12; al. w1 b10. ; jl. w3 (b14.) ; testout(message) al w0 22<6+12; rl w1 x3+r0 ; jl. w3 (b14.) ; testout(host output) jl. (b23.) ; return \f ; lkn remote batch ...51... c1: al w0 3<1 ; lookup device: hs. w0 b10.+f1; function mode:=lookup jl. w1 c24. ; lookup device name in catalog jl. w1 c6. ; set operation al. w1 b10. ; w1:= abs ref message area al. w2 b22. ; w2:=receiver name jl. w3 (b12.) ; send and wait (lookup) so w0 1<1 ; if result <> 1 jl. c14. ; al w0 16<6+12; rs. w1 b23. ; save answer reference jl. w3 (b14.) ; testout(answer) rl. w1 b23. ; bz w0 x1+f40+1 ; se w0 0 ; if return value <> 0 jl. c14. ; then goto error return bz w0 x1+f40 ; la. w0 b24. ; sl w0 2 ; if not free or connected as rb device then jl. c14. ; then goto error return al w0 22<6+12; rl w1 x3+r0 ; jl. w3 (b14.) ; testout(host input) al w0 0 ; rs w0 x3+r102 ; set device no = 0 c7: rl w2 x3+r0 ; set return parameters rs w0 x3+r101 ; return value, bz w0 x3+r3 ; sh w0 -1 ; if mode(call)=dummy bz w0 x2+f20 ; then take return mode rs w0 x3+r103 ; mode, bz w0 x3+r4 ; sh w0 -1 ; if kind(call)=dummy bz w0 x2+f21 ; then take return kind rs w0 x3+r104 ; kind, al w0 0 ; rl w1 x2+f24 ; w0w1:= max buffer size (chars) wd. w1 b27. ; w1:= max buffer size (words) ls w1 1 ; w1:= max buffer size (bytes) rs w1 x3+r106 ; set max buffer size al w0 10<6+12; al w1 x3+r101 ; jl. w3 (b14.) ; testout(return parameters) jl. c10. ; goto normal return e. \f ; lkn remote batch ...52... ; lookup and reserve device ; ; call and return parameters as described in options (page 7b) ; error return: result = 1 unknown ; = 2 reserved by other host ; = 3 no resources ; = 4 time exceeded ; = 7 reserved by other process in job host ; > 7 nta of process reserved by boss ; ; this procedure creates a link process to a specified device at a specified host ; and reserves the link process b. a10 w. c2: al w0 6<1 ; lookup and reserve device: hs. w0 b10.+f1; function mode:=link up remote jl. w1 c24. ; lookup device name in catalog jl. w1 c6. ; set lookup operation rl w2 x3+r0 ; rl w0 x3+r5 ; hs w0 x2+f22 ; set timeout al. w1 b10. ; w1:=abs ref message al. w2 b22. ; w2:=receiver jl. w3 (b12.) ; send and wait (link up remote) so w0 1<1 ; if result <> 1 jl. c14. ; al w0 16<6+12; rs. w1 b23. ; save answer reference jl. w3 (b14.) ; testout(answer) rl. w1 b23. ; bz w0 x1+f40+1 ; or return value <> 0 se w0 0 ; jl. c13. ; then goto error return bz w0 x1+f40 ; la. w0 b24. ; se w0 1 ; if not connected as rb device then jl. c14. ; goto error return al w0 22<6+12; rl w1 x3+r0 ; jl. w3 (b14.) ; testout(host input) rl w2 x3+r0 ; rl w2 x2+f30 ; w2:=process description address jl. w1 c21. ; check reservation jl. c12. ;+2 reserved by other process jl. c11. ;+4 reserved by boss al. w3 b11. ; dl w1 x2+4 ; move process name ds w1 x3+2 ; dl w1 x2+8 ; ds w1 x3+6 ; jd 1<11+8 ; reserve process rl. w3 b1. ; sn w0 0 ; if result = 0 then goto set return parameters jl. a0. ; se w0 1 ; if result = 1 then device unknown al w0 7 ; else device reserved by other process jl. c15. ; goto error return a0: rl w1 74 ; al w1 x1-2 ; w1:=base of devices in name table a1: al w1 x1+2 ; w1:=next device rl w0 x1 ; w0:=process description address se w0 x2 ; if w0 <> w2 jl. a1. ; then goto next al w0 x1 ; ws w1 74 ; ls w1 -1 ; w1:=rc device no rs w1 x3+r102 ; save device no jl. c7. ; set rest of return parameter e. \f ; lkn remote batch ...53... ; return from rb procedures b. a10 w. c10: dl w3 x3+2 ; normal return: al w3 x3+2 ; jl. (b13.) ; return to link+2 c11: am x2-7 ; device reserved by boss c12: al w0 7 ; device reserved by other process jl. c15. ; c13: se w0 1 ; if return value=1 then jl. a1. ; begin bz w1 x1+f40 ; ls w1 -4 ; w1:=device status jl. a2. ; end a1: sl w0 4 ; if return value > 4 al w0 4 ; then return value := 4 sh w0 0 ; if return value < 0 c14: al w0 1 ; then return value:=1 (=device unknown) c15: al w1 0 ; a2: rs w0 x3+r100 ; set return value rs w1 x3+r100+2 ; set device status al w0 4<6+12 ; al w1 x3+r100 ; jl. w3 (b14.) ; testout(return value) dl w3 x3+2 ; jl. (b13.) ; error return to link e. \f ; lkn remote batch ...54... ; clear message area ; sets dummy values for all fields in <host output> ; ; call: return: ; w0 = irr. w0 = destr. ; w1 = return w1 = unch. ; w2 = abs ref message area w2 = unch. ; w3 = irr. w3 = unch. b. a10 w. c20: al w0 -1 ; clear message area: hs w0 x2+f20 ; -1: mode, hs w0 x2+f21 ; kind, rs w0 x2+f30 ; process description al w0 0 ; rs w0 x2+f27 ; 0: jh. hostid rs w0 x2+f28 ; jh. homereg < 12 + jh. netid hs w0 x2+f22 ; timeout rs w0 x2+f25 ; device name al w0 1 ; hs w0 x2+f23 ; 1: buffers al w0 2046 ; rs w0 x2+f24 ; >>0: buffer size jl x1 ; return e. ; check reservation ; checks the reserver word of the process description referenced by w2 ; ; call: return: ; w0 = irr. w0 = destr. ; w1 = return w1 = destr. ; w2 = process description w2 = unch. ; w3 = abs ref page 1 w3 = unch. b. a10 w. c21: al w1 x1+4 ; save link+4 as return rs. w1 b23. ; rl w0 x2+12 ; w0:=reserver of process sn w0 0 ; if no reserver jl. (b23.) ; then return to link+4 rl. w1 b23. ; w1:=link+4 am (66) ; se w0 (+12) ; if reserver <> boss al w1 x1-2 ; then return to link jl x1-2 ; else return to link+2 e. \f ; lkn remote batch ...55... ; lookup device name in catalog ; if the device name specified in the call parameters for lookup, lookup reserve ; and search lookup corresponds to to a file descriptor in the main catalog, ; then the mode kind and the document name from this file descriptor is ; used for the the operations sent to <:host:> ; ; call: return: ; w0 = irr. w0 = destr. ; w1 = return w1 = destr. ; w2 = irr. w2 = destr. ; w3 = page 1 abs w3 = unch. b. a10 w. c24: rs. w1 b23. ; lookup device name in catalog; rl w0 x3+r1 ; w0:=first of name sh. w0 (b26.) ; if name format illegal jl x1 ; then return dl w1 x3+r6+2 ; al w1 x1+1 ; upper=upper proj+1 al. w3 b22.+4 ; w3:=abs ref 0 jd 1<11+72; set own catalog base rl. w3 b1. ; w3:=abs ref page 1 al. w1 a1. ; w1:=abs ref catalog entry buffer al w3 x3+r1 ; w3:=abs ref device name jd 1<11+76; lookup entry head and tail al w3 x3-r1 ; rl w2 x1+14 ; w2:=mode,kind sn w0 0 ; if entry not found sl w2 0 ; or entry describes an area jl. (b23.) ; then return rl w0 x1 ; la. w0 a0. ; if entry not permanent se w0 3 ; jl. (b23.) ; then return la. w2 b25. ; remove 1<23 rs w2 x3+r3 ; set mode,kind in call parameters al w2 x1+14 ; dl w1 x2+4 ; device name (call parameters) ds w1 x3+r1+2 ; := document name (file descriptor) dl w1 x2+8 ; ds w1 x3+r1+6 ; dl w1 x2+14 ; w0,w1:=host description from catalog entry sn w0 0 ; if descriptor not default (=0,0) se w1 0 ; then ds w1 x3+r2+2 ; overwrite host description(call parameters) jl. (b23.) ; return a0: 7 ; mask for extracting catalog key a1: 0,r.17 ; catalog entry buffer e. g1 =k-b0 ; length of code page g20=c2-b0 ; rel entry lookup and reserve g21=c1-b0 ; rel entry lookup g25=c0-b0 ; rel entry lookup host i. e. ; end remote batch page e.e. ; end tpsjobdescr h11=s0, h12=s1 ; final chech sums e.e.e. ; end h-names, options, tprocs \f ▶EOF◀