|
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: 102144 (0x18f00) Types: TextFile Names: »ms1 «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer └─⟦2ba378e4a⟧ └─⟦this⟧ »ms1 «
\f m. mons1 - operating system s, part 1 17.0 beta ;88.05.06 14.30 kak max buffer in connect dlc/ioc included ;88.05.24 07.50 kak change of cpa and address base included ;88.06.07 08.00 kak prepare dump included ;88.06.14 10.00 kak initialize main included ;88 10 03 15.02 hsi wait 1 second after each start command (c mixup) ;88 10 12 09.55 kak two new commands: privileged and unprivileged introducted ;88 11 09 12.26 kak error in find console corrected ;89 01 17 13.50 kak create child corrected: no bit 2 check if abs protection ; description of command mask updated ;89 02 27 08.30 kak d59 insert in list of dummy names; used if ioc/lan is not included ;89 03 13 14.06 kak the last char read is saved, and may be used to detect end of line ; in commands with a variable number of paramters ;89 05 31 13.15 hsi set stack depth to 3, as in release 81 ;90 09 06 08.40 kak *********************** RELEASE 17.0 ************************************ ;90 09 06 08.41 kak procedure find parent console changed: ; if the child is found in the coretable, the monitor procedure ; process_description(console_name,pda) is called, ; and the returned pda is used, if the process does not exist the main console is used. ; the main declaration changed: g127 increased to g128 ;91 01 30 13.46 kak the change from 90.09.06-08.41 is modified: the selection of the main console is moved to type_line (d23). b.i30 w. i0=91 02 01 i1=11 53 00 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; c.i0-a133 c.i0-a133-1, a133=i0, a134=i1, z. c.i1-a134-1, a134=i1, z. z. i10=i0, i20=i1 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 i2:<: date :> (:i15+48:)<16+(:i14+48:)<8+46 (:i13+48:)<16+(:i12+48:)<8+46 (:i11+48:)<16+(:i10+48:)<8+32 (:i25+48:)<16+(:i24+48:)<8+46 (:i23+48:)<16+(:i22+48:)<8+46 (:i21+48:)<16+(:i20+48:)<8+ 0 i3: al. w0 i2. ; write date: rs w0 x2 +0 ; first free:=start(text); al w2 0 ; jl x3 ; return to slang(status ok); jl. i3. ; e. j. ; rc date ; segment 8: operating system s s. k=k, b1, h50,g128,f29,e109,d90, l90,c107,u109, v109, r105 w.b127=k, c70, k = k-2 ; segment structure: ; definitions (c names) ; utility procedures (d names) ; variables (e names) ; command actions (g names) ; tables (h names) ; ; (i and j names are used locally) ; size options: c0=k ; first addr of s ; c1=def below; size of console description ; c2=def below; size of work area c3=4 ; no of own work areas c16= 3 ; stack depth ( of nested 'reads' ) c4=c3+1 ; no of own buffers c5=2 ; no of own area processes c7=7 ; - buf c8=6 ; - area c9=0 ; - internal c10=8.7440 ; - function ;c11=def below; size of core table entry c12=12800 ; standard size c.(:a399>23a.1:)-1 c12= 8.0003 0000 ; standard size mod 2k :=0; z. c13=20 ; - entries,perm,work device c14=800 ; - segments,perm,work device c81=a117/2 ; number of console desriptions (arbitrary choosen value) c82=8.0760 ; standard mask c84=-1 ; devno of 1st connection (select a free) c89=8+12*a112 ; standard length of susercatentry c100=1 ; number of privileged conseles c.(:a399>21a.1:)-1 c107=162 ; min size for memory dump (prepare dump - dump) z. c15=k, <:disc:>,0,0 ; standard work device name c36=k, <:slogarea:>, 0 ; default log-area of s ; definition of chain head. chain heads may be ; placed any where in the elements, but the location ; must be the same in all sorts of chains ;c69 ; susercatname c20=0 ; next chain element c21=c20+2 ; last chain element c23= 8.77740000 ; systemoptions: all commands, ; terminals unblocked after start up. t.m. s size options included c4=c3+1; no of own buffers c5=2 ; no of own area processes ; systemoptions: ; systemoptions determine whether code is included for certain ; commands. they are defined by bits in the identifier c23 ; as follows: ; ; break: c23=c23 o. 1<22 ; include/exclude: c23=c23 o. 1<21 ; call: c23=c23 o. 1<20 ; list: c23=c23 o. 1<19 ; max: c23=c23 o. 1<18 ; replace: c23=c23 o. 1<17 ; all: c23=c23 o. 1<16 ; print: c23=c23 o. 1<15 ; job: c23=c23o.1<14 ; terminals blocked after start up c23=c23 o. 1<13 ; testoptions: ; testoptions are used during debugging of the system. they ; are defined by bits in the identifier c24 as follows: ; ; internal interrupt: c24=c24 o. 1<23 ; character testoutput: c24=c24 o. 1<22 ; parameter testoutput: c24=c24 o. 1<21 ; event testoutput: c24=c24 o. 1<20 ; work testoutput: c24=c24 o. 1<19 ; console testoutput: c24=c24 o. 1<18 c24 = a93 ; definition of core table entry format: ;c20=def above; next entry ;c21=def above; last entry c17=c21+2 ; child c18=c17+2 ; child terminal (subprocess) c106=c18+2 ; name of terminalprocess c22=c106+8 ; segment no in susercat or -1 c19=c22+2 ; kind , name of alternative primary input c93=c19+10 ; kind , name of alternative primary output c11=c93+10+2 ; size of coretable entry ; definition of a console description format ;c20=def above; next console ;c21=def above; last console c28=c21+2 ; access count word c25=c28+2 ; process description word c26=c25+2 ; priority halfword c27=c26+1 ; command mask halfword c75=c27+1 ; terminal name quadrouple c29=c75+8 ; process name quadrouple c30=c29+8 ; first address word c31=c30+2 ; top address word c32=c31+2 ; buf claim halfword c33=c32+1 ; area claim; halfword c34=c33+1 ; internal claim; halfword c35=c34+1 ; function mask; halfword c37=c35+1 ; protection register;halfword c38=c37+1 ; protection key; halfword c41=c38+1 ; max interval; double c42=c41+4 ; standard interval; double c39=c42+4 ; size; word c40=c39+2 ; program name; quadrouble c43=c40+8 ; user interval; double c95=c43+4 ; primin : kind , name c96=c95+10 ; primout: kind , name c97=c96+10 ; first logic address c98=c97+2 ; cpa limit c44=c98+2 ; entries temp oth device c45=c44+2 ; segments temp oth device c46=c45+2 ; entries perm oth device c47=c46+2; segments perm on 0th device ; --- ;c44+n<3 ; entries temp nth device ;c45+n<3 ; segments temp nth device ;c46+n<3 ; entries perm nth device ;c47+n<3 ; segments perm mth device c48=c44+a112<3-2; last of console description c1=c48+2 ; size of console description ;last part of console buffer will be cleared at each call of ; new , all , get or job. c49=c95 ; first parameter to be cleared ; meaning of command mask: ; bit 0:(not used) ; bit 1:all bs resources ; bit 2:mode,modify,print,date ; bit 3:job,start,stop,break,dump,list,max,remove,proc,prog,load,read,unstack,i,o,get,removelink ; bit 4:include,exclude ; bit 5:size,pr,pk,login,user,project,,prio,base,relocate ; bit 6:addr,function,buf,area,internal,key,bs,temp,perm,all,call, ; connect, disconnect, initkit, link, linkall, unlink,cpa,memdump,preparedump ; bit 7:new,create,run,init,createlink ; bit 8:privileged: autorel,closec,lock,jobremove,privileged,unprivileged,cleanup,unlock ; bit 9:absolute protection ; bit 10:absolute address ; bit 11:not used ; definition of work area format: c50=0 ; state (=0=> available: <> 0 => buff addr) c51=c50+2 ; restart addr ; *** start of part to be saved-restored c90=c51+2 ; name area c78=c90+10 ; used in list, connect, disconnect,linkall c80=c78+2 c79=c80+2 ; segment in susercat c91=c79+2 ; continue indicator c83=c91+2 ; subroutine return address c92=c83+4 ; cur catalogbase: lower upper limit c52=c92+2 ; console c53=c52+2 ; last addr c54=c53+2 ; char shift c55=c54+2 ; char addr c56=c55+2 ; chilel c74=c56+2 ; terminal address c101=c74+2 ; device no of disc containing description c102=c101+2 ; physical disc device no c103=c102+2 ; pointer in disc description c105=c103+2 ; size of log disc description c57=c105+2 ; core table entry ; *** end of part to be saved-restored c58=c57+2 ; input stack pointer c59=c58+2 ; first stack element ; subformat of stack entry: ; name + nta of area ; cur catalog base lower limit c68=12 ; upper limit c60=c68+2 ; segment no c61=c60+2 ; saved last addr c62=c61+2 ; saved char shift c63=c62+2 ; saved char addr c64=c63+2 ; (size of entry) c71=c16*c64+c59; (top of stack) c72=c71-c64 ; last stack entry start c73=c59-c64 ; base of stack c65=c71+2 ; output buffer start c66=c65+46 ; input buffer start; often output buffer top c67=c66+52 ; last addr of buffer c2=c67+2 ; size of a work area ; the input buffer may be overwritten by output in certain cases ; meaning of work area state: ; state=0 available ; state=buf addr waiting for answer ; procedure type internal ; comment: internal interrupt procedure used during debugging ; of s. d0: c.(:c24>23a.1:)-1 ; if internal interrupt then w. 0,r.a180>1 ; begin b.i24 w. am (b4) ; rl w0 a199<1 ; rs. w0 (i5.) ; terminal:=main console; jl. w3 d24. ; find_and_select_console_1(mainconsole); jl. 0 ;+2: not found: wait forever; rs. w1 (i2.) ; console:=main console; jl. w3 d19. ; init write; al. w1 i0. ; jl. w3 d21. ; write text(<:s-break:>); al. w2 d0. ; i1: al w0 32 ; next: jl. w3 d20. ; write char(sp); rl w1 x2 ; jl. w3 d22. ; write integer(param); al w2 x2 +2 ; se. w2 d0.+a180; if not all printed then jl. i1. ; goto next; al w0 10 ; jl. w3 d20. ; writechar(nl); jl. w3 d23. ; type line(buf); al. w1 (i3.) ; jd 1<11+18 ; wait answer(buf); al w2 -1 ; executing reentrant code := true; rs. w2 (i6.) ; jl. (i4.) ; goto end line; i0:<:<10>s-break:<0>:> ; i2: e25 i3: e32 i4: g30 ; i5:e90 i6: e89 ; e. z. ; end b. i20, j20 w. i0: 0 ; saved link i1: 0 ; saved w3 i2: 0 ; saved w0 i3:0 ; saved w1 i5: h20 ; first of buffer j0: g3 ; end line: not allowed j1: g12 ; end line: area unknown j2: g15 ; end line: area error j3: g19 ; end line: base illegal j5: e24 ; pointer to: work j6: e26 ; pointer to: last addr j7: e28 ; pointer to: char addr j8: e27 ; pointer to: char shift j10: e47 ; pointer to: area input mess j11: e49 ; pointer to: last of buffer j12: e50 ; pointer to: segment number j13: e32 ; pointer to: answer j14: e51 ; pointer to: tail j15: e75 ; pointer to: cur catalogbase j16: e76 ; pointer to: max catalogbase ; procedure stack input ; stacks the input pointers and selects the given area for input ; and sets current catalogbase ; ; call: w0,w1=catalogbase, w2=name, w3=link ; exit: all regs undef d79: ; stack input: rs. w3 i0. ; save return; ds. w1 i3. ; save catalog base; jl. w3 d84. ; set s-catalog base(cur catalog base); jl. (j3.) ;+0: base illegal; ;+2: ok al w3 x2 ; w3=name addr; rl. w1 j14. ; w1=tail addr; jd 1<11+42 ; lookup entry(name,tail); lo w0 x1+16 ; if result<>ok or tail.content,key<>0 <* i.e. text *> se w0 0 ; then goto unknown; jl. i11. ; ; rl. w1 (j5.) ; w1 := work; rl w3 x1+c58 ; w3 := stack pointer; sn w3 x1+c72 ; if stack pointer = last stack entry then jl. i13. ; goto not allowed; (* i.e. stack overflow *) al w3 x3+c64 ; increase (stack pointer); rs w3 x1+c58 ; rl. w1 (j6.) ; rs w1 x3+c61 ; save last addr in stack entry; dl. w1 (j7.) ; ds w1 x3+c63 ; save char shift and char addr in stack entry; dl. w1 (j15.) ; ds w1 x3+c68 ; save cur catalog base; dl w1 x2+2 ; move name to stack entry; ds w1 x3+2 ; dl w1 x2+6 ; ds w1 x3+6 ; ; prepare variables for immediately buffer change ; and set cur catalog base dl. w1 i3. ; set cur catalog base; ds. w1 (j15.) ; al w0 -1 ; rs w0 x3+c60 ; segment.stack entry := -1; rl. w2 i0. ; w2 := return; jl. d82. ; goto next segment; ; procedure unstack input ; restores the char pointers from the stack, and maybe also the buffer ; and cur catalog base ; ; call: w2=link ; exit: all regs undef d80: ; unstack input: rl. w1 (j5.) ; w1 := work; rl w3 x1+c58 ; w3 := stack pointer; sn w3 x1+c73 ; if stack pointer = stack base then jl x2 ; return; al w0 x3-c64 ; rs w0 x1+c58 ; decrease (stack pointer); dl w1 x3+c63 ; ds. w1 (j7.) ; restore char shift and char addr from stack entry; rl w1 x3+c61 ; rs. w1 (j6.) ; restore last addr from stack entry; dl w1 x3+c68 ; restore cur catalog base ds. w1 (j15.) ; jl. d81. ; goto get segment; ; procedure get segment ; ; call: w2 = link ; exit: w1,w2,w3=unch, w0=undef d81: ; get segment: am 0-1 ; increment := 0; ; procedure get next segment ; ; call: w2 = link ; exit: w1,w2,w3=unch, w0=undef d82: ; next segment: al w0 1 ; increment := 1; ; procedure read segment ; ; call: w0 = increment, w2 = link ; exit: w1,w2,w3=unch, w0=undef d83: ; read segment: ds. w3 i1. ; save return, w3; rs. w1 i3. ; save w1; rl. w1 (j5.) ; w1 := work; rl w3 x1+c58 ; w3 := stack pointer; sn w3 x1+c73 ; if stack pointer = stack base then jl. i10. ; goto return; rl. w1 i5. ; w1 := first of buffer; al w2 x1+510 ; w2 := last of buffer; ds. w2 (j11.) ; sn w0 0 ; if increment <> 0 then jl. i8. ; begin rs. w2 (j6.) ; last addr := last of buffer; rs. w1 (j7.) ; char addr := first of buffer; al w1 -16 ; rs. w1 (j8.) ; char shift := -16; i8: ; end; wa w0 x3+c60 ; segment := segment + increment; rs w0 x3+c60 ; rs. w0 (j12.) ; al w2 x3 ; save nameaddr; dl. w1 (j15.) ; ; jl. w3 d84. ; set s-catalog base(cur catalog base); jl. (j3.) ;+0: error: base illegal; ;+2: ok: al w3 x2 ; restore nameaddr; jd 1<11+92; create entry lock process(area name); se w0 0 ; if result <> ok then jl. i12. ; goto area error; al. w1 (j10.) ; jd 1<11+16; send message (area input, area name); al. w1 (j13.) ; jd 1<11+18; wait answer(answer area); rl w1 x1 ; lo w1 0 ; w1 := status 'or' result; jd 1<11+64; remove process (area name); se w1 1 ; if any arror then jl. i12. ; goto area error; i10: ; return: dl. w1 (j16.) ; jl. w3 d84. ; set s-catalog base(max catalog base); jl. (j3.) ;+0: base illegal; ;+2: ok al w1 0 ; areabuf := defined; rs. w1 (u87.) ; rl. w1 i3. ; restore regs; dl. w3 i1. ; jl x2 ; return; i12: am j2.-j1. ;error return: area error i11: am j1.-j0. ; : area unknown i13: am j0.-j0. ; : not allowed rl. w2 j0. ; rl. w1 (j5.) ; stackpointer := stackbase; al w0 x1+c73 ; rs w0 x1+c58 ; dl. w1 (j16.) ; jl. w3 d84. ; set s-catalog base(max catalog base); am 0 ;+0: base illegal, ignore; jl x2 ; return e. ; ; procedure set s-catalog base(new base) ; call return, ok: link+2, error: link ; w0: lower limit lower limit ; w1: upper limit upper limit ; w2: - unchange ; w3: link link ; b. i5 w. i0: 0 ; process name = 0 i1: 0 ; save w2 i2: 0 ; save w3 d84: ; begin ds. w3 i2. ; al. w3 i0. ; name = 0; jd 1<11+72 ; set catalog base(name, lower, upper); dl. w3 i2. ; sn w0 0 ; if result=ok then am +2 ; goto link+2 jl x3 ; else goto link; ; end; e. ; procedure next char(char,type) ; comment: unpacks and classifies the next character from ; the console buffer: ; character type: ; 0 <letter> ; 1 <digit> ; 2 <radix point or minus sign> ; 3 <space> ; 4 <separator> ; 5 <end line> ; 6 <other graphic> ; 7 <blind> ; call: return: ; w0 char ; w1 type ; w2 destroyed ; w3 link destroyed b.i24 ; begin w.d1: rs.w3 i5. ; save link; i2: dl. w2 (u28.) ; sh w1 0 ; if charshift>0 then jl. i0. ; begin al w1 -16 ; char shift := -16; al w2 x2+2 ; char addr := char addr + 2; rl. w3 (u26.) ; sh w2 x3 ; if char addr > last addr then jl. i0. ; begin al w0 10 ; char := newline; rl. w1 (u24.) ; rl w2 x1+c58 ; sn w2 x1+c73 ; if stack pointer = stack base then jl. i1. ; goto classify char; (* i.e. not end of area-read-buffer *) jl. w2 d82. ; get next segm; jl. i2. ; goto next char; ; end; i0: rl w0 x2 +0 ; ls w0 x1 +0 ; char:=word(charaddr) shift charshift; la. w0 i3. ; char:=char(17:23); al w1 x1 +8 ; charshift:=charshift+8; ds. w2 (u28.) ; i1: ; classify char: rl w1 0 ; ls w1 -2 ; wa. w1 (u5.) ; bz w1 x1 +0 ; entry:=byte(chartable+char/4); so w0 2.10 ; type:= ls w1 -6 ; if char mod 4=0 then entry(0:2) else so w0 2.01 ; if char mod 4=1 then entry(3:5) else ls w1 -3 ; if char mod 4=2 then entry(6:8) else la. w1 i4. ; entry(9:11); rs. w0 (u109.) ; save last read char; jl. (i5.) ; end; i3:8.177 ; i4:8.7 ; i5: 0 ; e. ; end ; procedure next param(type) ; comment: converts and classifies the next parameter from ; the console buffer. ; parameter type: ; 0 <empty> ; 1 <name> ; 2 <integer> ; 3 <unknown> ; call: return: ; w0 type ; w1 unchanged ; w2 unchanged ; w3 link link b.i24,j10 ; begin w.d2: rs. w3 (u60.) ; ds. w2 (u59.) ; rl. w1 (u87.) ; se w1 0 ; if area buf undefined then jl. w2 d81. ; get segment; al w1 0 ; rs. w1 (u87.) ; areabuf := defined; al w0 0 ; param type := 0; ds. w1 (u19.) ; char_count:=0; ds. w1 (u21.) ; ds. w1 (u23.) ; name:=0 rs. w0 i5. ; char_count:=0; al w0 10 ; rl. w1 ( u6.) ; radix:=10; ds. w1 (u57.) ; state:=param table; d3: jl. w3 d1. ; continue: wa. w1 (u57.) ; next char(char,type); bz w1 x1 +0 ; entry:=byte(state+type); al w2 0 ; ld w2 -2 ; action:=entry(0:9); ls w2 -19 ; wa. w2 ( u6.) ; state:= rs. w2 (u57.) ; param table+8*entry(10:11); jl. x1 +d2. ; goto action; d4: rl. w3 (u19.) ; letter: jl. w1 j5. ; insert_next_char(letter); rl. w3 (u19.) ; al w3 x3 +1 ; al w2 1 ; char_count:=char_count+1; ds. w3 (u19.) ; param type:=1; jl. d3. ; goto continue; d5: se w0 45 ; radix or minus jl. j1. ; if minus then al w3 -1 ; rs. w3 i4. ; jl. d3. ; j1: al w3 0 ; rx. w3 (u19.) ; radix:=integer; rs. w3 (u56.) ; integer:=0; jl. d3. ; goto continue; d6: rl. w3 (u19.) ; digit: wm. w3 (u56.) ; al w3 x3 -48 ; integer:= wa w3 0 ; integer*radix-48+char; al w2 2 ; param type:=2; ds. w3 (u19.) ; ; rl. w3 i5. ; jl. w1 j5. ; insert_next_char(digit); rl. w3 i5. ; al w3 x3+1 ; rs. w3 i5. ; char_count:=char_count+1; jl. d3. ; goto continue; d11: ; newline or semicolon: sn w0 10 ; jl. d8. ; while char <> newline do jl. w3 d1. ; next char; jl. d11. ; goto delimiter; d13: ; alfa_num: rl. w3 i5. ; rs. w3 (u19.) ; char_count.letter:=char_count.digit; jl. w3 d4. ; goto letter; d7: ; unknown: sn w0 25 ; if char = em then jl. w2 d80. ; unstack input; al w2 3 ; rs. w2 (u18.) ; param type:=3; d8: rl. w0 (u18.) ; delimiter: rl. w2 (u18.) ; se w2 2 ; jl. j2. ; rl. w3 i4. ; sl w3 0 ; jl. j3. ; rl. w3 (u19.) ; ac w3 x3 ; j3: sh w3 -1 ; rs. w3 (u19.) ; rs. w2 i4. ; j2: dl. w2 (u59.) ; rl. w3 (u60.) ; jl x3 ; return; i0:3 ; i4:0 ; sign i5:0 ; char_count; ; j5: ; procedure insert_next_char(char); ; begin sl w3 11 ; if char_count>=10 jl. d7. ; then goto unknown; al w2 0 ; wd. w3 i0. ; ls w2 3 ; char:=char shift ac w2 x2 -16 ; (16-char_count mod 3 * 8); ls w0 x2 +0 ; ls w3 1 ; addr:=name+char_count/3*2; am. (u20.) ; lo w0 x3+0 ; am. (u20.) ; rs w0 x3+0 ; word(addr):=word(addr) or char; jl x1 ; end; e. ; end ; procedure next name ; comment: checks that the next parameter from the console ; buffer is a name: ; call: return: ; w0 type ; w1 unchanged ; w2 unchanged ; w3 link link b.i24 ; begin w.d15:rs. w3 i0. ; jl. w3 d2. ; next param(type); se w0 1 ; if type<>1 jl. (i2.) ; then goto end line; jl. (i0.) ; i0:0 ; end i2: g2 ; procedure next integer(integer) ; comment: checks that the next parameter from the console ; buffer is an integer. ; call: return: ; w0 integer ; w1 unchanged ; w2 unchanged ; w3 link link w.d16:rs. w3 i0. ; begin jl. w3 d2. ; next param(type); se w0 2 ; if type<>2 jl. (i2.) ; then goto end line; rl. w0 (u19.) ; jl. (i0.) ; e. ; end ; procedure increase access(console) ; comment sets the access counter of a given console. ; ; call return ; w0: unchanged ; w1: console console ; w2: unchanged ; w3: link link ; b. i24 w. d9: ; begin rs. w0 i0. ; al w0 1 ; console.access count:=1; rs w0 x1+c28 ; rl. w0 i0. ; jl x3 ; end; ; procedure decrease access(console); ; comment resets the access counter of a given console. ; ; call return ; w0: unchanged ; w1: console console ; w2: unchanged ; w3: link link ; d10: ; begin rs. w0 i0. ; al w0 0 ; rs w0 x1+c28 ; console.access count:=0; rl. w0 i0. ; jl x3 ; end; i0: 0 ; common work variables for register save i1: 0 ; in increase and decrease access. ; procedure remove element(element) ; comment: removes an element from its chain and makes ; it point at itself. ; call: return: ; w0 unchanged ; w1 element element ; w2 old next ; w3 link old last d17: rs. w3 i2. ; begin dl w3 x1+c21 ; next(last):= next(element) rs w2 x3+c20 ; last(next):= last(element) rs w3 x2+c21 ; next(element):= element; rs w1 x1+c21 ; last(element):= element; rs w1 x1+c20 ; return; jl. (i2.) ; end; ; procedure link element(element,head); ; comment: links a console to the rear of the chain ; defined by head. this is equivalent to linking ; into a chain immediately before the element named ; head. ; call: return: ; w0 unchanged ; w1 element element ; w2 head head ; w3 link old last d18: rs. w3 i2. ; begin rl w3 x2+c21 ; rear:= last(head); rs w1 x2+c21 ; last(element):= last(head) rs w1 x3+c20 ; next(rear):= element; rs w2 x1+c20 ; next(element):= head; rs w3 x1+c21 ; last(element):= rear; jl. (i2.) ; return; ; end; i2:0 ; general return for remove and link; e. ; end ; procedure change write mode(mode, start, top) ; note: this is only used from cat-init part of s. ; mode = 0: writing to terminal buffer ; = 1: writing to memory buffer ; if mode = 1 the writeaddress and lineaddress is changed to the specified ; buffer and the mode indication is set accordingly. ; if mode = 0 the mode switch is set to terminal (normal) and init write is ; called. the start,stop parameters are not used. ; ; procedure init write ; prepares the writing of characters in the line buffer within the current ; work area. this is not done if the mode switch = 1 i.e. memory buffer. ; ; change write mode init write ; call return call return ; w0 mode mode - unchanged ; w1 top addr destroyed - unchanged ; w2 start addr destroyed - unchanged ; w3 link link link link ; b. i10, j10 w. d12: rs. w0 (u53.) ; procedure change write mode; sn w0 0 ; begin jl. d19. ; write mode := mode; jl. j1. ; if mode = 1 then goto init pointers ; else goto init write; ; d19: ; entry point: init write: ds. w2 i2. ; rl. w1 (u53.) ; if write mode <> 0 then se w1 0 ; return; jl. j2. ; rl. w2 (u24.) ; start := work.writebuf.start; al w2 x2+c65 ; top := work.writebuf.top; al w1 x2+c66-c65 ; j1: rs. w2 (u45.) ; init pointers: rs. w2 (u46.) ; write start := start; rs. w1 (u42.) ; line start := start; al w2 16 ; write top := top; rs. w2 (u55.) ; write shift := 16; ; j2: dl. w2 i2. ; return: jl x3 ; ; 0 ; i2: 0 ; e. ; end; ; procedure writechar(char) ; comment: packs the next character in the storage address ; initialized by initwrite. ; if a write is attempted beyond the actual write buffer (terminal- or ; memory-buffer), nothing is written but normal return is used. ; call: return: ; w0 char destroyed ; w1 unchanged ; w2 unchanged ; w3 link link b.i24 ; begin w. d20: rs. w3 i3. ; rl. w3 (u42.) ; get writebuf.top; rx. w1 (u55.) ; if writeshift < 0 then rx. w2 (u46.) ; then sl w1 0 ; begin jl. i0. ; writeshift:=16; al w1 16 ; writeaddr:=writeaddr+2; al w2 x2 +2 ; end; i0: sl w2 x3+ 0 ; if writeaddr >= writebuf.top then return; jl. i1. ; ls w0 x1 +0 ; char:=char shift writeshift; se w1 16 ; if writeshift<>16 then lo w0 x2 +0 ; char:=char or word(writeaddr); rs w0 x2 +0 ; word(writeaddr):=char; al w1 x1 -8 ; writeshift:=writeshift-8; i1: rx. w1 (u55.) ; rx. w2 (u46.) ; jl. (i3.) ; return; ; i3: 0 ; saved return; e. ; end ; procedure writetext(addr) ; comment: moves a textstring terminated by a null to the ; storage address initialized by initwrite. ; call: return: ; w0 no of chars ; w1 addr destroyed ; w2 unchanged ; w3 link link b.i24 ; begin w.d21:ds. w3 (u60.) ; al w3 0 ; al w2 x1 ; i0: rl w1 x2 ; next word: portion:= word(addr); al w2 x2 +2 ; addr:= addr + 2; i1: al w3 x3 +1 ; al w0 0 ; repeat ld w1 8 ; ch:= portion shift (-16); sn w0 0 ; if ch = 0 then jl. i2. ; goto endtext; rs. w3 (u58.) ; jl. w3 d20. ; write char(ch); rl. w3 (u58.) ; al w1 x1 +8.377 ; portion:= portion shift 8 + 255; sn w1 -1 ; until portion = 1; am i0-i1 ; jl. i1. ; goto next word; i2: al w0 32 ; end text: al w1 x3 ; jl. w3 d20. ; writechar(32); i6: rl. w1 (u58.) ; i7: dl. w3 (u60.) ; jl x3 +0 ; end ; procedure writeinteger(integer) ; comment converts a positive integer to a textstring which ; is moved to the storage address initialized by initwrite. ; call: return: ; w0 destroyed ; w1 integer number of digits ; w2 unchanged ; w3 link link i4:1 000 000 ; powers of ten: 100 000 ; 10 000 ; 1 000 ; 100 ; 10 ; 1 ; d22: ds. w3 (u60.) ; begin sl w1 0 ; if number < 0 then jl. i10. ; begin ac w1 x1 ; number:= -number; am 45-32 ; sign:= <minus>; i10: al w0 32 ; end al w3 7 ; rs. w3 i15. ; sl w1 0 ; else sign:= <sp>; sl. w1 (i4.) ; if number = 1 < 23 jl. i12. ; or number > 10 ** 6 then al w2 12 ; divisor:= 10 ** 6; al w3 1 ; i11: sl. w1 (x2 +i4.-2) ; else jl. +4 ; jl. i13. ; begin al w2 x2 -2 ; divisor:= 1; al w3 x3 +1 ; jl. i11. ; while number > divisor * 10 do i12: al w2 0 ; divisor:= divisor * 10; i13: rs. w3 i15. ; jl. w3 d20. ; end; i14: al w0 0 ; writechar(sign); wd. w1 x2 +i4. ; repeat al w1 x1 +48 ; digit:= 48 + number // divisor; rx w1 0 ; number:= number mod divisor; jl. w3 d20. ; writechar(digit); al w2 x2 +2 ; divisor:= divisor // 10; sh w2 12 ; until divisor = 0; jl. i14. ; comment return via rl. w1 i15. ; jl. i7. ; end in writetext i15: 0 ; number of digits e. ; end ; procedure writebits(integer); ; comment: moves the specified integer to the storage address initialized ; by initwrite. it is moved as a string of 24 bits (ones and points). ; ; call return ; w0 - destroyed ; w1 integer integer ; w2 - unchanged ; w3 link destroyed ; b. i5, j5 w. d14: ; writebits ds. w2 i2. ; begin rs. w3 i3. ; al w2 -1 ; j1: sl w1 0 ; for i:= 1 step 1 until 24 do am 46-49 ; writechar( if integer(i) = 1 then '1' al w0 49 ; else '.' ); jl. w3 d20. ; ld w2 1 ; se w2 0 ; jl. j1. ; dl. w2 i2. ; jl. (i3.) ; ; 0 ; i2: 0 ; i3: 0 ; e. ; end; ; procedure typeline(buf) ; comment: starts the output on the current console of the line buffer ; within the current work area. ; call: return: ; w0 destroyed ; w1 destroyed ; w2 buf ; w3 link destroyed ; procedure send buf (mess, buf) ; (as typeline, but at call: w1=mess) b.i24 ; begin w. d23: ; type line: rl. w1 u44. ; mess := output message; d26: ; send buf: rs. w3 (u60.) ; rl. w2 (u25.) ; dl w0 x2+c75+2 ; ds. w0 (u41.) ; dl w0 x2+c75+6 ; ds. w0 (u43.) ; receiver:=name(proc); rl. w3 u40. ; zl w0 x1+0 ; se w0 5 ; if op=output then jl. i2. ; begin jd 1<11+4 ; process_description(name,curr.pda); se w0 0 ; if no process then jl. i2. ; begin am (b4) ; rl w2 a199<1 ; pda:=main_cosole.pda dl w0 x2+a11+2 ; ds. w0 (u41.) ; dl w0 x2+a11+6 ; ds. w0 (u43.) ; rl. w3 u40. ; ; end; ; end; i2: jd 1<11+16 ; send mess(receiver,typemess,buf); rl. w3 (u60.) ; jl x3 ; e. ; end ; procedure find or select console_1(name_address, console buf); ; comment: search for a console buffer which has been used with the given ; device name. if not found a new is selected and this will be cleared and ; the name and device address are inserted. ; ; procedure find or select console_2(name address, console buf); ; comment: search for a console buffer which has been used with the given ; device name. if not found a new is selected and this will be cleared and ; the name is inserted. ; ; procedure find console(name address, console buf); ; comment: search for a console buffer which has been used with the given ; device name. ; name address may be an address of an external process or a core tabel element ; address (+c18). ; ; return: link + 0: not found and no free selected ; link + 2: found ; call return ; w0: device address device address ; w1: console buffer (error: destroyed) ; w2: unchanged ; w3: link link b. i24, j24 w. d64: am 2 ; find and select console_2; d44: am 2 ; find console; d24: al w1 0 ; find and select console_1; rs. w1 i4. ; begin ds. w3 i3. ; rl. w1 (u9.) ; console := first console; rl w2 0 ; j0: dl w0 x2+a11+2 ; begin sn w3 (x1+c75+0) ; se w0 (x1+c75+2) ; if device.name = consolebuf.terminalname then jl. j1. ; goto found; dl w0 x2+a11+6 ; sn w3 (x1+c75+4) ; se w0 (x1+c75+6) ; jl. j1. ; jl. j4. ; ; j1: al w1 x1+c1 ; increment: rl. w3 (u10.) ; if console<=last console then sh w1 x3 ; jl. j0. ; goto next; ; end; rl. w0 i4. ; sn w0 2 ; if not find_and_select_console then jl. j5. ; return; ; else ; begin <* select a free *> rl. w1 u35. ; console := free list.first; rl w1 x1+c20 ; sn. w1 (u35.) ; if console = none then jl. j5. ; goto error-return; ; al w0 0 ; <* clear the free console buffer *> al w3 c29 ; j3: am x3 ; for field := namefield, next until rs w0 x1+0 ; userinterval-field do al w3 x3+2 ; console.field := 0; sh w3 c43+2 ; jl. j3. ; ; end; dl w0 x2+a11+2 ; found: ds w0 x1+c75+2 ; dl w0 x2+a11+6 ; consolebuf.terminalname := terminal name; ds w0 x1+c75+6 ; j4: rl. w0 i4. ; sn w0 0 ; if find_and_select_console_1 then rs w2 x1+c25 ; consolebuf.console description := terminal address; al w0 x2 ; dl. w3 i3. ; jl x3+2 ; return ok; ; j5: ; return not ok: <* no free console buffer or not found*> dl. w3 i3. ; jl x3+0 ; ; 0 ; save w2 i3: 0 ; save w3 i4: 0 ; branch address e. ; common block for the procedures find parent, find size, ; find addr, and max size. the procedures use the ; variable core table element (e30) as work variable, and ; the three first mentioned procedures leave it pointing ; at a suitable element. i.e. for find parent, e30 points ; at the core table element for the chilet, and for ; find size and find addr, e30 points at an element ; before which a suitable hole may be found. b. i24, j24 w. ; local sub procedures first hole and next hole(addr, size, sorry); ; comment: this set of procedures perform the actual up ; dating of the variable core table element. ; call: return ; w0: hole addr ; w1: hole size ; w2: unchanged ; w3: link link j0: rs. w3 (u30.) ; entry first hole: rl. w0 (u16.) ; hole addr:= first core; rl. w3 u15. ; element:= core table head; jl. j2. ; goto advance; j1: rx. w3 (u30.) ; entry next hole: se. w3 (u15.) ; element := core table element; jl. j3. ; rl. w3 (u30.) ; if element = core table head then jl x3 ; return sorry; j3: am (x3+c17) ; ; rl w0 a18 ; hole addr:= top addr(child(element)); am (x3+c17) wa w0 a182 ; add base j2: rl w3 x3+c20 ; advance: rl w1 x3+c17 ; element:= next(element); sn. w3 (u15.) ; if element = core table head rl. w1 u1. ; el then tophole=topcore rs. w2 i5. rl w2 x1+a182 rl w1 x1+a17 ; else tophole:= first addr(child(element)); se. w3 (u15.) ; wa w1 4 ; add base ws w1 0 ; hole size:= top hole - hole addr; rx. w3 (u30.) ; core table element:= element; rl. w2 i5. ; jl x3 +2 ; return happy; i5: 0 ; procedure find parent(child,terminal.pda,coretableelement,sorry); ; comment: searches the parent console of a given child and ; sets the variable core table element. ; if the child is found, the console name is checked, if the process does not exist ; the main console is selected, or if the process has got a new process description addr this is used ; call: return: ; w0: destroyed ; w1: terminal ; w2: child child ; w3: link core table element d25: rs. w3 (u60.) ; begin am j0-j1 ; for i:= first hole, i0: jl. w3 j1. ; next hole while happy do jl. i6. ; begin rl. w3 (u30.) ; if child = child(element) then se w2 (x3+c17) ; exit jl. i0. ; end; rl w1 x3+c18 ; al w3 x3+c106 ; jd 1<11+4 ; process_description(name,found.pda); se w0 0 ; if no process then rl w1 0 ; terminal.pda:=old.pda else terminal.pda:=found.pda rl. w3 (u30.) ; restore core table element; rs w1 x3+c18 ; am +2 ; ok return; i6: al w0 0 ; return sorry: wa. w0 (u60.) ; jl (0) ; end; ; procedure find size(start,size,sorry); ; comment: the core table is searched for the first ; hole not less than the size given. the start address ; is returned and the variable core table entry is set ; to point at the element before which a hole is ; found. ; call: return: ; w0: first addr ; w1: size size (i.e. unchanged) ; w2: destroyed ; w3: link destroyed d27: rs. w1 (u37.) ; begin rs. w3 (u38.) ; wanted size:= size; am j0-j1 ; for size:= first hole, next hole while happy do i1: jl. w3 j1. ; if size >= wanted size then jl. i7. ; goto found; rl. w3 (u37.) ; goto return sorry; sl w1 x3 ; jl. 4 ; found: size:= wanted size; jl. i1. ; first addr:= hole addr; dl. w2 (u38.) ; return happy; jl x2 +2 ; i7: dl. w2 (u38.) ; return sorry: jl x2 ; end; ; procedure find addr (start,size,sorry); ; comment: the core table is searched for a hole with ; a given start address and a size not less than given. ; call: return: ; w0: start start (i.e. unchanged) ; w1: size size (i.e. unchanged) ; w2: destroyed ; w3: link destroyed d28: rs. w1 (u57.) ; begin rs. w3 (u58.) ; rl w2 0 ; am j0-j1 ; for size:= first hole, next hole while happy do i2: jl. w3 j1. ; begin jl. i8. ; if holeaddr > start addr then sl w0 x2 +2 ; return sorry; jl. i8. ; add := hole addr + hole size wa w1 0 ; - wanted size; ws. w1 (u57.) ; if add >= start then goto found; sh w1 x2 -2 ; end; jl. i2. ; return sorry; al w0 x2 ; found: dl. w2 (u58.) ; return happy; jl x2 +2 ; i8: dl. w2 (u58.) ; return sorry; jl x2 ; end; ; procedure find max(size) ; comment: the core table is searched for the size of the largest ; hole, and the size is delivered; ; call: return: ; w0: destroyed ; w1: size ; w2: destroyed ;w3: link destroyed d29: rs. w3 (u58.) ; begin al w2 0 ; am j0-j1 ; max:= 0; i3: jl. w3 j1. ; for size:= firsthole,nexthole while happy do jl. i4. ; if size >= max then sl w1 x2 ; max:= size; al w2 x1 ; jl. i3. ; size:= max; i4: al w1 x2 ; return c.(:a399>22a.1:)-1 rl. w3 (u82.) ; sl w1 x3 ; if max > max r.size then al w1 x3 ; max:= max r.size; z. rl. w3 (u58.) ; jl x3 ; end; e. ; procedure reserve core(child) ; comment: inserts a child in the core table just before ; the element pointed at by core table entry. the variable ; core table entry is updated to point at the new element; ; call: return: ; w0 child child ; w1 console ; w2 console core table element ; w3 link destroyed b.i24 w. ; begin d30: rs. w3 (u60.) ; i:= base core table; rl. w1 (u33.) ; repeat i0: al w1 x1+c11 ; i:= i + core table entry size; se w1 (x1+c21) ; until jl. i0. ; core table entry(i) is free; rs. w2 i5. ; save console; rl. w2 (u30.) ; link element(coretable entry(i)); jl. w3 d18. ; core table element); al w2 x1 ; core table element:= core table entry(i); rs. w1 (u30.) ; core table element. child:= child; rl. w1 i5. ; rl w1 x1+c25 ; ds w1 x2+c18 ; core table element. console:= console; rl. w1 i5. ; rl. w3 (u79.) ; rs w3 x2+c22 ; coretable element. segm:=segmentno al w3 -1 ; rs. w3 (u79.) ; rl w0 x2+c17 ; rl. w3 (u60.) ; return; jl x3 ; i5: 0 ; saved console e. ; end; ; procedure release core(child) ; comment: removes a child from the core table; ; call: return: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed b.i24 w. ; begin d31: rs. w3 i1. ; rl. w1 (u30.) ; al w2 -1 ; rs w2 x1 c22 ; rl. w1 (u30.) ; jl. w3 d17. ; release element (core table element); jl. (i1.) ; return i1:0 e. ; end ; procedure child name ; comment: moves child name to receiver name. ; call: return: ; w0 destroyed ; w1 destroyed ; w2 child ; w3 link link b.i24 ; begin w.d33:rl. w2 (u29.) ; dl w1 x2+a11+2 ; ds. w1 (u41.) ; dl w1 x2+a11+6 ; receiver:=name(child); ds. w1 (u43.) ; jl x3 +0 ; e. ; end ; procedure check child ; comment: checks that the process name in the console ; description refers to a child of s. the console must ; either be a privileged console or the terminal from which ; the child was created. ; call: return: ; w0 destroyed ; w1 console (if result ok) ; w2 child " ; w3 link destroyed b.i24,j2 ; begin w.d34:rs. w3 i0. ; rl. w1 (u25.) ; al w3 x1+c29 ; process description( jd 1<11+4 ; process name(console),result); rs. w0 (u29.) ; child:=result; rl w2 0 ; rl w1 x2 +0 ; se w2 0 ; if child=0 se w1 0 ; or kind(child)<>0 jl. (r9.) ; then goto end line; jl. w3 d25. ; jl. (r3.) ; find parent(child,parent,end line); rl. w2 (u25.) ; w2:=current console zl w0 x2+c27 ; sz w0 1<3 ; if privileged then jl. j0. ; ok return dl w1 x3+c106+2 ; sn w0 (x2+c75+0) ; se w1 (x2+c75+2) ; jl. (r3.) ; dl w1 x3+c106+6 ; sn w0 (x2+c75+4) ; if name.core table <> name.console table se w1 (x2+c75+6) ; then jl. (r3.) ; goto end line j0: rl. w2 (u29.) ; jl. (i0.) ; i0:0 ; e. ; end ; ; u block ; indirect addressing of e-names ; u1: e1 u5: e5 u6: e6 u9: e9 u10: e10 u15: e15 u16: e16 u18: e18 u19: e19 u20: e20 u21: e21 u22: e22 u23: e23 u24: e24 u25: e25 u26: e26 u27: e27 u28: e28 u29: e29 u30: e30 u31: e31 u33: e33 u35: e35 u37: e37 u38: e38 u40: e40 u41: e41 u42: e42 u43: e43 u44: e44 u45: e45 u46: e46 u53: e53 u55: e55 u56: e56 u57: e57 u58: e58 u59: e59 u60: e60 u79: e79 c.(:a399>22a.1:)-1 u82: e82 z. u87: e87 u90: e90 u109:e109 ; r-block ; indirect addressing of g-names ; r3 : g3 r4 : g4 r5 : g5 r6 : g6 r7 : g7 r8 : g8 r9 : g9 r10: g10 r11: g11 r18: g18 r19: g19 r20: g20 r25: g25 r27: g27 r101:g101 ; stepping stones ; jl. (2) , d20 , d20=k-4 jl. (2) , d22 , d22=k-4 ; procedure create child ; comment: allocates resources and creates a child process in ; accordance with the console parameters. the child is included as ; user of all devices in the device table, except temp links not used ; by the child. finally, the identification ; bit of the child is set in the description of the console. ; call: return: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed b.i30, j10 w. ; begin d35:rs. w3 i2. ; find core: rl. w2 e25. ; rl w1 x2+c39 ; size:=size(console); sn w1 0 ; if size = 0 then jl. w3 d29. ; find max(size); rl. w2 e25. ; rl w0 x2+c30 ; start := first addr(console); bz w3 x2+c27 ; sz w3 1<1 ; if abs addr(console) am d28-d27 ; then find addr(start,size,end line) jl. w3 d27. ; else find size(start,size,end line); jl. (r4.) ; rl. w2 e25. ; rs w0 x2+c30 ; first addr(console):=start; wa w0 2 ; top addr(console):= rs w0 x2+c31 ; start+size; bz w3 x2+c27 ; find protection: c.-4000 ; in rc4000: sz w3 1<2 ; if not abs protection(console) then jl. i0. ; begin bz w2 x2+c26 ; jl. w3 d32. ; find keys(keys(console), jl. g8. ; new pr,new pk, end line); rl. w2 e25. ; pr(console):=new pr; hs w0 x2+c37 ; pk(console):=new pk; hs w1 x2+c38 ; end; i0: bl w0 x2+c37 ; sz w0 -1<8 ; if pr(console)(0:3)<>0 then jl. g8. ; goto end line; z. c.8000 ; in rc8000: rl. w0 i21. ; so w3 1<2 ; if abs protection jl. j1. ; ;* so w3 1<9 ; and allowed(console) ;* jl. (r3.) ; al w1 -1 ; then no relocation and rs w1 x2+c97 ; al w0 0 ; pr,pk=0,0 else j1: rs w0 x2+c37 ; pr,pk=240<12+7 , usermode z. rl. w3 b1. ; check claims: bz w0 x2+c32 ; bz w1 x3+a19 ; ws. w1 e2. ; if buf claim(console)> sl w0 x1 +1 ; buf claim(s)-own buf jl. (r5.) ; then goto end line; bz w0 x2+c33 ; bz w1 x3+a20 ; if area claim(console)> ws. w1 e3. ; sl w0 x1 +1 ; area claim(s)-own area jl. (r6.) ; then goto end line; bz w0 x2+c34 ; bz w1 x3+a21 ; if internal claim(console)> sl w0 x1 +0 ; internal claim(s)-1 jl. (r7.) ; then goto end line; ; test intervals: ; comment: the testing that the interval limits are contained ; in each other is performed as schetched below ; standard: !2! ; 4 1 dl w1 x2+c42+2 ; the numbers refer to the numbers about sh w1 (x2+c43+2) ; 1; if cons.std.hi >= cons.user.hi sl w0 x1 +1 ; jl. (r19.) ; then goto base alarm; rl w1 x2+c43 ; sl w1 (x2+c41) ; 3; if cons.user.lo < cons.max.lo jl. 4 ; jl. (r19.) ; sh w1 (x2+c42) ; sz ; jl. (r19.) ; then goto base alarm; dl w1 x2+c41+2 ; al w1 x1 +1 ; sl w0 (x3+a45-2) ; 6; or cons.max.hi < cons.user.hi sh w1 (x2+c43+2) ; then goto base alarm; jl. (r19.) ; al w1 x1 -2 ; sl w1 (x3+a45-0) ; 7; if cons.max.hi > s.std.hi jl. (r19.) ; then goto base alarm i25: al w1 x2+c30 ; create internal process( al w3 x2+c29 ; process name(console), jd 1<11+56 ; first addr(console),result); sn w0 1 ; jl. (r4.) ; sn w0 2 ; jl. (r11.) ; se w0 0 ; if result<>0 jl. (r10.) ; then goto end line; jd 1<11+4 ; process description( rs. w0 e29. ; process name(console),result); jl. w3 d30. ; reserve core al w3 x1+c95 ; move kind,name of primin al w2 x2+c19 ; and primout to coretable j0 : rl w0 x3 ; (set by i and o commands ) rs w0 x2 ; al w3 x3+2 ; al w2 x2+2 ; se w3 x1+c97 ; jl. j0. ; rl. w2 e30. ; dl w0 x1+c75+2 ; move name of terminal ds w0 x2+c106+2 ; to core table dl w0 x1+c75+6 ; ds w0 x2+c106+6 ; al w3 x1+c29 ; al w2 x1 ; rl w1 x1+c97 ; if first logic address defined then sn w1 -1 ; jl. j2. ; begin rl w1 x2+c30 ; displacement := first address ( "physical") ws w1 x2+c97 ; - first logic address jd 1<11+98 ; change address base sn w0 0 ; if not ok jl. j2. ; then begin jl. w3 d40. ; remove process jl. (r101.) ; write illegal relocation ; end ; set the cpa register(child) j2 : rl w1 x2+c98 ; if cpa < > initial cpa then sn w1 1 ; begin jl. j3. ; sn w1 -1 ; if cpa(console) = -1 (default) rl. w1 e16. ; then cpa(child) = top of s own area jd 1<11+126 ; set cpa sn w0 0 ; if not ok then jl. j3. ; begin jl. w3 d40. ; remove process jl. (r8.) ; write illegal cpa ; set the priority of the process ; if the priority differs from default. (0) j3: zl w1 x2+c26 ; prio=prio.console sn w1 0 ; if prio<> 0 then jl. i19. ; jd 1<11+94 ; set priority sn w0 0 ; if result <> 0 then jl. i19. ; jl. w3 d40. ; remove process jl. (r27.) ; goto end line ; include process as user of all peripheral devices except those listed ; in the s device exception tablr. ; process will not be included as user of temp links ; execpt the temp link for the process' console. i19: rl. w2 e25. ; rl w2 x2+c25 ; rs. w2 i26. ; save child.console; rl. w2 e11. ; addr:=start(exception table); al w1 0 ; devno:=0; i1: bz w0 x2 ; include: se w0 x1 ; if devno:=devno(addr) then jl. i3. ; addr:=addr+1; al w2 x2+1 ; else jl. i4. ; i3: rs. w2 i28. ; save exception table address. al w2 x1 ; next device := 2 * deviceno + first device; ls w2 1 ; wa w2 b4 ; rl w2 x2 ; if next device.kind <> temp link or rl w0 x2 ; (next device.kind = temp link and sn w0 85 ; next device = child.console) then sn. w2 (i26.) ; jd 1<11+12 ; include user(device,name addr); rl. w2 i28. ; restore exception table address; i4: al w1 x1+1 ; devno:=devno+1; se w1 a127 ; if devno<>number of peripheral processes then jl. i1. ; goto include; ; give the child the required backing storage claims ; if claims cannot be granted, the process is ; removed and an alarm message is issued rl. w2 e25. ; al w3 -1 ; rs. w3 e79. ; bz w0 x2+c27 ; so w0 1<10 ; if all bs (console) jl. i8. ; then begin c.(:c23>16 a.1:)-1 rl w3 b22 ; i5: rs. w3 i11. ; next device: rl w3 x3 ; w3:= chaintable rl w0 x3-a88+16 ; sn w0 0 ; if chaintable <> free jl. i7. ; then begin dl w1 x3-a88+18 ; ds. w1 e21. ; dl w1 x3-a88+22 ; ds. w1 e23. ; work device:= docname(chaintab) al. w2 e20. ; jl. w1 d73. ; lookup bs claims(device,s) rl. w3 e25. ; al w3 x3+c29 ; jd 1<11+78 ; se w0 0 ; if result<>0 jl. (r20.) ; i7: rl. w3 i11. ; al w3 x3 +2 ; chaintab:= chaintab + 2 se w3 (b24) ; if chain <> chain end jl. i5. ; then goto next device jl. (i2.) ; return i12:0 ; i11:0 ; end z. ; jl. (r18.) ; i21: 240<12 + 7 ; pr,pk usermode ; transfer claims to child, ; the claimlist in the console-description i8: ; not 'all' bs (console): rl. w3 e25. ; w3 := claimbase := console; i13: ; next chaintable: rs. w3 i22. ; save claimbase; dl w1 x3+c44+6 ; perm claim := claimlist(claimbase); ds. w1 i24. ; wa w0 x3+c44+0 ; temp entries := temp+perm entry claim; wa w1 x3+c44+2 ; temp segms := temp+perm segm claim; rs. w0 i23. ; main entries := temp entries; al w0 0 ; temp entries := 0; ws. w3 e25. ; w3 := index in claimlist; ls w3 -2 ; wa w3 b22 ; w3 := chain table number; sl w3 (b24) ; if all chains handled then jl. (i2.) ; return; rl w3 x3 ; w3 := chain table addr; rl. w2 r20. ; error addr := claims exceeded; i14: ; transfer claim: ; w0=temp entries, w1=temp segments ; w2=error address ; w3=chaintable address rs. w2 i20. ; save(error addr); al w2 0 ; key := 0; i15: ; next key: ds. w1 x2+e52. ; claim(key) := entries,segments; al w2 x2+4 ; increase(key); sn w2 a109*4 ; if key = min aux key then dl. w1 i24. ; entries,segments := perm claim; sh w2 a110*4 ; if key <= max cat key then jl. i15. ; goto next key; dl w1 x3-a88+18 ; name := docname.chaintable; ds. w1 e21. ; dl w1 x3-a88+22 ; ds. w1 e23. ; rl. w3 e25. ; w3 := proc name; al w3 x3+c29 ; al. w2 e20. ; w2 := docname; al. w1 e51. ; w1 := claim; jd 1<11+78; set bs claim; sn w0 0 ; if result = ok then jl. i16. ; goto maincat entries; se w0 1 ; if result <> claims exceeded then jl. i17. ; goto next entry; jl. w3 d40. ; remove child; jl. (i20.) ; goto error; i16: ; maincat entries: ld w1 -100 ; perm claim := 0,0; ds. w1 i24. ; rx. w0 i23. ; w0 := main entries; main entries := 0; rl w3 b25 ; w3 := main catalog chain table; rl. w2 r25. ; w2 := error addr := no maincat entries; se w0 0 ; if main entries <> 0 then jl. i14. ; goto transfer claim; i17: ; next entry: rl. w3 i22. ; increase (claimbase); al w3 x3+8 ; jl. i13. ; goto next chaintable; i20: 0 ; error addr i22: 0 ; claimbase i23: 0 ; main entries; i24=k+2, 0,0 ; perm claim (entries, segments) i2:0 ; end i26: 0 ; child.console i28: 0 ; save exception table addr. e. ; end ; procedure modify child(addr) ; comment: modifies the registers of the current child as follows: ; child w0 = 0 or process description of parent console ; child w1 = process description of s ; child w2 = process description of parent console ; child w3 = process description of child ; child ex = 0 ; child ic = addr ; call: return: ; w0 addr destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed b.i24 ; begin w.d36:rs. w3 i0. ; rs. w0 e66. ; child ic:=addr; rl. w0 b1. ; rs. w0 e62. ; child w1:=s; jl. w3 d33. ; child name; jl. w3 d25. ; find parent(child,terminal,coretableelement, am 0 ; irrelevant); rs. w1 e61. ; child w0:= child w2; ds. w2 e64. ; child w3:=child; ; override these default w0 and w2 assignments, ; in case of user-defined primary input (or -output) names al w1 x3+c19 ; w1 := addr of primary input descr; rl w0 x1+2 ; se w0 0 ; if name defined then rs. w1 e61. ; child w0 := primary input descr; al w1 x3+c93 ; w1 := addr of primary output descr; rl w0 x1+2 ; se w0 0 ; if name defined then rs. w1 e63. ; child w2 := primary output descr; al. w1 e61. ; al. w3 e40. ; modify internal process( jd 1<11+62 ; receiver, child w0); jl. (i0.) ; i0:0 ; e. ; end ; procedure load child ; comment: loads a program from backing store into ; a child process in accordance with the console parameters. ; the program must be described as follows in the catalog: ; <size of area> ; <6 irrelevant words> ; <first segment to load> ; <content=3><instruction counter> ; <bytes to load> ; call: return: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed b.i24 ; begin w.d37: ; create and look up: rl. w1 e29. ; if state.process <> wait start zl w1 x1+a13 ; then goto error so w1 2.100000 ; jl. g3. ; rl. w2 e25. ; dl w1 x2+c40+2 ; ds. w1 e41. ; dl w1 x2+c40+6 ; ds. w1 e43. ; receiver:=prog(console); rs. w3 i20. ; dl w1 x2+c43+2 ; get catbase of console.(child) al. w3 i1. ; name=0 jd 1<11+72 ; catbase(s)=catbase(child) se w0 0 ; if not ok then jl. g19. ; goto end line base illegal al. w3 e40. ; jd 1<11+52 ; create area process(prog) al. w3 i1. ; prevent remove of process sn w0 2 ; if result=2 or jl. i10. ; sn w0 3 ; result=3 or jl. i9. se w0 0 ; result<>0 then jl. i11. ; goto give up al. w3 e40. ; al. w1 e51. ; look up entry( jd 1<11+42 ; receiver,tail,result); sn w0 2 ; if result=2 jl. i10. ; then goto give up 0; rl. w2 e29. ; check description: bz. w0 e59. ; se w0 3 ; if content(tail)<>3 sn w0 8 ; and content(tail)<>8 sz ; jl. i11. ; then goto give up 0; rl w0 x2+a17 ; first addr(area mess):= wa w0 x2+a182 zl. w1 e67. ; child ic:= first addr(child) (logical) + wa w1 x2+a17 ; ic(tail) rs. w1 e66. ; sl w1 (x2+a18) ; if ic > top addr(child) then jl. i13. ; give up rl w1 x2+a18 ; save physical top(child) wa w1 x2+a182 ; al w2 x1 ; rl. w1 e60. ; first addr(child); al w1 x1+511 ; as w1 -9 ; load size:= as w1 9 ; (bytes(tail)+511)/512*512; wa w1 0 ; last addr(area mess):= al w1 x1 -2 ; first addr(child)+load size-2; sl w1 x2 ; if last addr(area mess)>= jl. i13. ; top addr(child) ds. w1 e49. ; then goto give up 0; rl. w1 e58. ; segment(area mess):= rs. w1 e50. ; segment(tail); al. w1 e47. ; load program: jd 1<11+16 ; send mess(receiver,area mess,buf); al. w1 e51. ; jd 1<11+18 ; wait answer(buf,answer,result); rl. w1 e51. ; sn w0 1 ; if result<>1 se w1 0 ; or status(answer)<>0 jl. i14. ; then goto give up 0; al. w3 e40. ; jd 1<11+64 ; remove process(receiver,result); rl. w0 e66. ; jl. w3 d36. ; modify child(child ic); rl. w2 e25. ; dl w1 x2+c43+2 ; set catalog base al. w3 e40. ; set catalog base(version,result) jd 1<11+72 ; al. w3 i1. ; (prevent remove process(proc) sn w0 0 ; if not ok then jl. i15. ; goto restore base(s) am 2 ; base illegal i9: am 2 ; i10: am 2 ; i11: am 2 ; i12: am 2 ; area reserved i13: am 2 ; program too big i14: rl. w2 i16. ; area error rs. w2 i20. ; store exit jd 1<11+64 ; remove process(prog) i15: dl. w1 i2. ; restore base(s) al. w3 i1. ; jd 1<11+72 ; jl. (i20.) ; exit i1: 0 a107 i2: a108-1 i3 : 2.100000 ; state bit : wait for stop or start i20: 0 i16: g15 ; 0 g14 ; +2 g13 ; +4 g12 ; +6 g11 ; +8 g29 ; +10 g19 ; +12 e. ; procedure start child ; comment: starts a child process. ; call: return: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed b.i24 ; begin w. d38: rs. w3 i0. ; jl. w3 d33. ; child name; al. w3 e40. ; jd 1<11+58 ; start internal process(receiver,result); al. w3 i10. ; wait: al. w1 i11. ; jd 1<11+16 ; send message(clock,wait); al. w1 i12. ; jd 1<11+18 ; wait answer(answer area); jl. (i0.) ; i0:0 ; i10: <:clock:>,0,0,0 ; clock-name and name table entry i11: 0<12 ; delay message 1 ; time (in seconds) i12: 0,r.8 ; answer area e. ; end ; procedure stop child ; comment: stops a child process. ; call: return: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed b.i24 ; begin w.d39:rs. w3 i0. ; jl. w3 d33. ; child name; al. w3 e40. ; jd 1<11+60 ; stop internal process(receiver,buf,result); al. w1 e51. ; jd 1<11+18 ; wait answer(buf,answer,result); jl. (i0.) ; i0:0 ; e. ; end ; procedure remove child ; comment: excludes a child as a user of all devices and ; removes it. ; call: return: ; w0 destroyed ; w1 destroyed ; w2 destroyed ; w3 link destroyed b.i24 ; begin w.d40:rs. w3 i1. ; jl. w3 d33. ; child name; jl. w3 d25. ; find parent(child,console, am 0 ; irrelevant); al. w3 e40. ; jd 1<11+64 ; se w0 0 ; if result not ok then jl. g11. ; write out catalog error jl. w3 d31. ; release core jl. (i1.) ; i1:0 ; e. ; end ; procedure find work(state,work) ; comment: searches a work area in a given state. ; return: link + 0: not found ; link + 2: found ; call: return: ; w0 unchanged ; w1 work ; w2 state state ; w3 link link b.i24 ; begin w. d41: ; find work: rl. w1 e13. ; work := first work; i0: ; loop: rs. w1 e24. ; sn w2 (x1+c50) ; if state(work) = state then jl x3+2 ; return ok; al w1 x1+c2 ; increase(work); sh. w1 (e14.) ; if work <= last work then jl. i0. ; goto loop; jl x3 ; return sorry e. ; found: ; end; ; procedure save work(state) ; comment: saves a state and a number of variables in the ; current work area and proceeds to examine the event queue. ; call: return: ; w0 destroyed ; w1 work ; w2 state destroyed ; w3 link link b.i24 ; begin w.d42:rl. w1 e24. ; state(work):=state; ds w3 x1+c51 ; interrupt addr(work):=link; rs. w2 e88. ; expected answer := state; al. w2 e20. ; i0: rl w0 x2 +0 ; rs w0 x1+c90 ; save(console) al w1 x1 +2 ; to(core addr) al w2 x2 +2 ; in(work); sh. w2 e30. ; jl. i0. ; rl. w3 e2. ; al w3 x3 -1 ; own buf:= own buf-1 rs. w3 e2. ; jl. g30. ; goto exam first; e. ; end ; procedure restore work(work, state) ; comment: restores a number of variables from a work area ; and jumps to the interrupt address. ; call: return: ; w0 logical status ; w1 work ; w2 state ; w3 link ; ; return address: link + 0 : status <> 0 ; link + 2 : status = 0 b.i24 ; begin w.d43:rl. w1 e24. ; al. w2 e20. ; rs. w2 e87. ; areabuf := undef; i0: rl w0 x1+c90 ; rs w0 x2 +0 ; restore(console) al w1 x1 +2 ; to(core addr) al w2 x2 +2 ; from(work); sh. w2 e30. ; jl. i0. ; rl. w1 e24. ; state:=state(work); al w2 0 ; state(work):=0; rx w2 x1+c50 ; rl. w3 e2. ; al w3 x3 +1 ; own buf:= own buf+1 rs. w3 e2. ; rl. w0 e59. ; w0 := logical status; se w0 1<1 ; if status <> 0 then jl (x1+c51) ; goto interrupt addr(work); am (x1+c51) ; goto 2 + interrupt addr(work); jl +2 ; e. ; end ; procedure next bitnumbers(bits, type) ; comment: converts a sequence of integers from the console buffer ; and sets the corresponding bits in a word equal to one. ; call: return: ; w0 type ; w1 unchanged ; w2 bits ; w3 link link b.i24 ; begin w.d45:rs. w3 i1. ; al w2 0 ; bits:=0; i0: jl. w3 d2. ; next bit: se w0 2 ; next param(type); jl. (i1.) ; if type=2 then ac. w3 (e19.) ; begin al w0 1 ; ls w0 x3 +23 ; bits(23-integer):=1; lo w2 0 ; goto next bit; jl. i0. ; end; i1:0 ; e. ; end ; procedure reset last part of console ; comment sets zeroes in whole claimlist of console descr ; and in primin and primout. ; initialize first logic address to standart value. ; ; call: w3 = link ; exit: all regs undef b. i10 w. d46: ; clear claimlist: rl. w1 e25. ; w1 := console; al w2 x1+c48-c49+2; w2 := rel top of area to be cleared; al w0 0 ; i0: ; rep: sl w1 x2 ; if pointer <= start of console then jl. i1. al w2 x2-2 ; decrease pointer rs w0 x2+c49 ; claimlist(pointer) := 0; jl. i0. ; goto rep; i1: rl. w0 e72. ; set first logic address rs w0 x1+c97 ; and cpa al w0 -1 ; return rs w0 x1+c98 ; jl x3 ; e. ; procedure release temp link(console addr); ; comment if the console is a temp link it will be removed. ; (if s is the only user 'remove process' will remove the link.) ; ; call return ; link+2: ok link: error ; w0: destroyed ; w1: destroyed ; w2: console addr console addr ; w3: link link ; b. i10 w. d48: ; begin rl. w1 e25. ; w1:=curr console zl w0 x1+c27 ; sz w0 1<3 ; if privileged console then jl x3 ; return rl w1 x2+ a10 ; if console.kind<>temp link se w1 85 ; sn w1 q8 ; or console.kind<>csp terminal then sz ; jl x3 ; error return; rs. w3 i3. ; dl w1 x2+a11+2 ; <* get and move name of link *> ds. w1 i1. ; dl w1 x2+a11+6 ; ds. w1 i2. ; al. w3 i0. ; jd 1<11+64 ; remove process(temp link); rl. w3 i3. ; if result = ok then sn w0 0 ; am +2 ; ok return jl x3 ; else error return; ; i0: 0 ; name area i1: 0,0 ; i2: 0 ; i3: 0 ; save link e. c. (:a80>16a.1:)-1 ; if itc included b. m0 , n2 w. ; block including procedures used by itc controller commands m0: 0,0,0,0,0 ; save name area + name table address ; procedure connect(name address, param address, devno, log status); ; ; procedure initalize_main(name address,buffers,log status); ; ; a connect operation (specified by the parameters) is send to the ; itc main process specified by name. if the connection is made the ; rc8000 devno is returned else logical status is returned. ; format of the param area must be: ; ; connect initialize ; + 0: control module or formatter number max buffs ; + 2: disc unit or station number ; + 4: wanted rc8000 devno of connection or ; -1 if no specific devno is wanted ; + 6: device kind, device type ; ; call return ; connect initialize ; w0 - logical status ; w1 name address name address destroyed ; w2 param address buffers devno ; w3 link link destroyed ; ; return: link + 0: error (devno not valid) ; link + 2: ok ; b. i5, j5 w. d59: am 16 ; procedure inittialize_main d51: al w0 6 ; procedure connect rs. w0 i0. ; rs. w3 e83. ; begin dl w0 x1+2 ; <* save return in stack part of work area *> ds. w0 m0.+2 ; <* move name to name area *> dl w0 x1+6 ; ds. w0 m0.+6 ; al. w1 e32. ; <* move parameters to message area *> rl. w0 i0. ; message.operation := connect/initialize; hs w0 x1+0 ; se w0 6 ; if connect then jl. j2. ; begin al w0 1 ; message.mode := include all users; hs w0 x1+1 ; dl w0 x2+2 ; message.cm := param.cm; ds w0 x1+4 ; message.unit := param.unit; dl w0 x2+6 ; message.devno:= param.devno; ds w0 x1+8 ; message.devkind, type := param.devkind, type; rl w0 x2+8 ; rs w0 x1+10 ; message.count:=max buffer jl. j3. ; end else j2: rs w2 x1+2 ; message.buffs:=param.buffres; j3: al. w3 m0. ; jd 1<11+16 ; send message(connect message, itcmain); jl. w3 d42. ; save work; jl. j1. ; +0: error: goto error; ; +2: ok: j0: rl. w2 e52. ; devno := answer.devno; am. (e83.) ; jl +2 ; ok-return; ; j1: sz w0 2.111101 ; error: jl. (e83.) ; if not result-error then rl w1 0 ; begin ls w1 -8 ; if status.result = 0 then sz w1 2.111111 ; goto ok-return jl. (e83.) ; else error-return; al w0 1<1 ; <it is assumed that status.result=0 => jl. j0. ; device description=1!> ; end else error-return; i0: 0 ; link kind; e. ; end; ; procedure disconnect(device number); ; ; a disconnect operation is send to the itc main process which is ; supervisor for the specified device. ; ; call return ; w0 device number logical status ; w1 - destroyed ; w2 - destroyed ; w3 link destroyed ; ; return: link + 0: error - w0 contains logical status. ; link + 2: ok - w0 is undefined. ; b. i5, j5 w. d52: ; disconnect rs. w3 e83. ; begin al. w1 e32. ; rs w0 x1+2 ; message.rc8000 devno := device number; al w2 10 ; ls w2 +12 ; message.operation, mode := rs w2 x1+0 ; disconnect, 0; rl w1 0 ; jl. w3 d56. ; check device(devno); jl. j3. ; +0: error: goto simulate result 3; al w2 x2+a11 ; +2: ok: al. w3 e20. ; jl. w1 n2. ; move name(itcmain.name, name area); ; al. w1 e32. ; jd 1<11+16 ; send message(disconnect mess, itcmain.name); jl. w3 d42. ; save work(buffer); jl. j4. ; +0: error: ; +2: ok: j0: am. (e83.) ; ok-return; jl +2 ; ; else ; error-return: j3: al w0 1<3 ; simulate result 3; j4: jl. (e83.) ; error return; ; e. ; end; ; procedure link(param,devno,logical status); ; ; a link operation is send to the ida main process which supervice the ; physical disc stated in the param area. ; ; call return ; w0: - logical status ; w1: - destroyed ; w2: param address device no of logical disc ; w3: link destroyed ; ; return: link + 0: error: result or status error ; link + 2: ok: w2 contains device number of logical disc ; ; format of param area: ; +0: devno of logical disc or -1 ; +2: devno of physical disc ; +4: first segment ; +6: no of segments ; b. i5, j5 w. d53: ; procedure link rs. w3 i3. ; begin al. w1 e32. ; dl w0 x2+2 ; <*.move param to message area *> ds w0 x1+4 ; dl w0 x2+6 ; ds w0 x1+8 ; al w0 16 ; message.operation, mode := ls w0 +12 ; link logical disc, include all users; ba. w0 1 ; rs w0 x1+0 ; ; rl w1 x1+4 ; jl. w3 d56. ; check device(devno); jl. j3. ; +0: error: goto simulate result 3; ; +2: ok: al w2 x2+a11 ; al. w3 m0. ; jl. w1 n2. ; move name(idamain, name area); al. w1 e32. ; jd 1<11+16 ; send message(link message, idamain.name); al. w1 e51. ; jd 1<11+18 ; wait answer(answer, result); jl. j1. ; ; j3: al w0 3 ; simulate result 3: sz ; j1: ; return: rl. w2 e52. ; devno of link := answer.devno of logical disc; rl. w3 i3. ; jl. n1. ; compute logical status and return; ; i3: 0 ; link ; e. ; end; ; procedure unlink(devno); ; ; a unlink logical disc operation is send to the ida main process which ; supervise the stated logical disc. ; ; call return ; w0 devno of log disc logical status ; w1 - logical status ; w2 - destroyed ; w3 link destroyed ; ; return: link + 0: error ; link + 2: ok ; b. i5, j5 w. d54: ; procedure unlink rs. w3 i3. ; begin al. w3 e32. ; rs w0 x3+2 ; message.devno := devno; al w1 18 ; ls w1 +12 ; message.operation, mode := rs w1 x3+0 ; unlink, 0; rl w1 0 ; jl. w3 d56. ; check device(devno); jl. j3. ; +0: error: goto simulate result 3; se w0 6 ; +2: ok jl. j3. ; if device.kind <> idadisc then ; goto simulate result 3; al w2 x2+a11 ; al. w3 e20. ; move name(idamain, name area); jl. w1 n2. ; al. w1 e32. ; jd 1<11+16 ; send message(unlink mess, idamain.name); ; al. w1 e51. ; jd 1<11+18 ; wait answer(answer, result); jl. j1. ; ; return answer: j3: al w0 3 ; simulate result 3: j1: rl. w3 i3. ; return: jl. n1. ; compute logical status and return; ; i3: 0 ; saved link ; e. ; end; ; procedure read segment(segment, devno); ; procedure write segment(segment, devno); ; ; the specified segment is input to the disc description buffer or the ; buffer is output to the disc with the specified device no. ; ; call return ; w0 segment logical status ; w1 devno logical status ; w2 - destroyed ; w3 link destroyed ; ; return: link + 0: disc error ; link + 2: ok ; b. i10, j10 w. d55: am -2 ; read segment d57: al w2 5 ; write segment ls w2 +12 ; begin rs. w3 i3. ; rs. w3 i4. ; wrkname := undefined; rs. w1 i1. ; al. w3 e32. ; rs w2 x3+0 ; message.operation := read or write; rs w0 x3+6 ; message.segment := segment; dl. w1 i5. ; message.first add := buffer.first; ds w1 x3+4 ; message.last add := buffer.last; rl. w1 i1. ; ; jl. w3 d56. ; check device(devno, device); jl. j4. ; +0: if error then goto error return; ; +2: al w2 x1+a11 ; al. w3 m0. ; jl. w1 n2. ; move name(device.name, name save area); ; j1: al. w1 e32. ; reserve and send: zl w0 x1+0 ; if operation = output then sn w0 5 ; reserve process(disc name); jd 1<11+8 ; jd 1<11+16 ; send message(messagearea, device); al. w1 e51. ; jd 1<11+18 ; wait answer(message, answer); se w0 5 ; if result <> 5 then jl. j2. ; return; ; < result = 5 i.e. unknown > al w0 0 ; rs w0 x3+0 ; name(0) := 0; rl. w1 i1. ; jd 1<11+54 ; create peripheral process(name, devno); se w0 0 ; if result <> ok then jl. j2. ; return; rs. w0 i4. ; wrkname := defined; jl. j1. ; goto send; ; j4: al w0 3 ; simulate result 3: jl. j3. ; j2: ; return: rl w2 0 ; <save result> jd 1<11+10 ; release process(disc); rl. w1 i4. ; if wrkname = defined then sn w1 0 ; remove process(disc); jd 1<11+64 ; al w0 x2 ; j3: rl. w3 i3. ; jl. n1. ; compute logical status and return; ; i1: 0 ; devno i3: 0 ; link i4: 0 ; wrkname defined (0=defined) h23 ; disc description buffer: first i5: h24 ; --- " --- : last ; e. ; end; ; procedure check device(devno); ; ; checks that the specified devno is legal and that the device is an ; idadisc, ida mag tape or ifp gsd device. ; the process description addresses of the device and the itc main process ; for the device is returned. ; ; call return ; w0 - kind of device ; w1 devno proc addr of device ; w2 - proc addr of itcmain of device ; w3 link type of device ; ; return: link + 0: not an itcdevice ; link + 2: ok ; b. i5, j5 w. d56: ; procedure check device rs. w3 i3. ; begin ls w1 +1 ; wa w1 b4 ; device := nametable(devno); sl w1 (b4) ; if not device = external then sl w1 (b5) ; error-return; jl x3 ; rl w1 x1 ; rl w0 x1+a10 ; if device.kind <> idadisc and se w0 6 ; device.kind <> idamt and sn w0 18 ; device.kind <> ifpgsd and jl. j1. ; ; se w0 28 ; sn w0 8 ; device.kind <> csp_terminal then jl. j1. ; error return; jl x3 ; error return; j1: ; rl w2 x1+a50 ; itcmain := device.main.main; rl w2 x2+a50 ; < second load only needed for an ida logical disc > zl w3 x1+a57 ; type := device.type; am. (i3.) ; jl +2 ; ok-return; ; i3: 0 ; saved link ; e. ; end; c.(:a399>21a.1:)-1 ; procedure prepare dump(pda of external_proc/area_proc,address_buff); ; a prepare dump is sent to the mainprocess associated with the ext/area proc ; ; reg call return ; w0 - undef ; w1 pda - ; w2 address buff - ; w3 link - ; return: link+0: not ok ; link+2 ok b. i5,j5 w. d58: ds. w2 i2. ; rs. w3 i3. ; al. w3 m0. ; al w2 x1+a11 ; jl. w1 n2. ; move_name(proc.name,name save area); jd 1<11+8 ; reserve process se w0 0 ; if reserve ok then jl. j2. ; begin rl. w1 i1. ; j0: rl w1 x1+a50 ; rl w0 x1+a10 ; sn w0 q6 ; while kind=disc kind do jl. j0. ; goto inspect next se w0 q20 ; if kind=ida kind then jl. j2. ; begin al. w3 m0. ; al w2 x1 ; jl. w1 n2. ; move_name(proc.name,name save area); rl. w2 e106. ; se w2 0 ; if pp_buff sent then jd 1<11+82; regret message al. w1 e32. ; rl. w2 i2. ; dl w0 x2+2 ; ds w0 x1+4 ; mess.low:=addres_buff.low dl w0 x2+6 ; ds w0 x1+8 ; mess.high:=address_buff.high rl. w0 i1. ; rs w0 x1+10 ; mess.pda:=ext_proc/area_proc al w0 2 ; hs w0 x1+0 ; mess.op:=prepare dump jd 1<11+16; send message rs. w2 e106. ; pp_buff:=buffer addresss am 2 ; return ok j2: al w0 0 ; return not ok jd 1<11+10; release process rl. w3 i3. ; end; am (0) ; jl x3 ; end; i1: 0 ; saved w1 i2: 0 ; - w2 i3: 0 ; - w3 e. z. c.-(:a399>21a.1:) d58: jl x3 ; z. ; procedure compute logical status and return(result, error return address) ; ; the logical status is created. if it signals ok status return is made to ; error return + 2 else return is made to error return address. ; it is assumed that e51 contains status. ; ; call return is made with ; w0 result logical status ; w1 - logical status ; w2 - unchanged ; w3 error link destroyed ; n1: ; compute logical status and return al w1 1 ; begin ls w1 (0) ; logical status := if result error then sn w1 1<1 ; set result error lo. w1 e51. ; else set status error; al w0 x1 ; sn w0 1<1 ; if logical status = ok then am +2 ; return ok jl x3 ; else return error; ; end; ; procedure move name(name address, destination address); ; ; call return ; w0 - unchanged ; w1 link destroyed ; w2 name address name address ; w3 destination destination ; b. i5, j5 w. n2: ; procedure move name ds. w1 i1. ; begin dl w1 x2+2 ; move the name; ds w1 x3+2 ; dl w1 x2+6 ; ds w1 x3+6 ; rl. w0 i0. ; jl. (i1.) ; ; i0: 0 ; i1: 0 ; e. ; end; e. ; end of block for itc controller commands z. c.-(:a80>16a.1:) ; if itc not included then insert dummy procedures d51: ; d52: ; d53: ; d54: ; d55: ; d56: ; d57: ; d58: ; d59: ; jl x3 ; ; z. ; end itc not included; ; procedure devno(name adr. , devno*8, sorry) ; comment: search the chaintable for a given name and ; returns deviceno.*8 (relative adr. for claim list in console table ) ; and chaintable address , ; or returns sorry if name not found. ; call: return: ; w0 destroyed ; w1 destroyed ; w2 name adr. deviceno.*8 ; w3 link chaintable adr. ; b. i10, j10 w. d61: rs. w3 i0. ; al w1 -2 ; rs. w1 i1. ; j1: rl. w3 i1. ; next chaintable al w3 x3+2 ; rs. w3 i1. ; wa w3 b22 ; get adr of next chaintable ; if adr. of next chaintable sl w3 (b24) ; >= top of chaintable then jl. (i0.) ; return sorry rl w3 x3 ; begin compare names dl w1 x3-a88+18 ; if name(chaintable) sn w0 (x2) ; = name(adr.) se w1 (x2+2) ; then return happy jl. j1. ; else get next chaintable dl w1 x3-a88+22 ; sn w0 (x2+4) ; se w1 (x2+6) ; jl. j1. ; rl. w2 i1. ; ls w2 2 ; rl. w1 i0. jl x1+2 i0: 0 i1: 0 e. c.(: c23>19 a.1:) -1 ; if list option then b.i24 ; begin ; block for the list option ; ; procedure writespace(no of spaces) ; comment this procedure writes out a number of spaces <32> ; call return ; w0 destroyed ; w1 c no of spaces ; w2 unchanged ; w3 link link ; w. d70: rs. w3 i1. ; i10: al w0 32 ; while no of spaces>=0 jl. w3 d20. ; do al w1 x1 -1 ; se w1 0 ; writechar space jl. i10. ; jl. (i1.) ; ; ; ; procedure writeint(integer,type) ; comment this procedure left justify an integer in ; a 8 or 4 chars space filled field, according to type ; call return ;w0 type destroyed ;w1 integer no of positions ;w2 unchanged ;w3 link link ; d71: ds. w0 i0. ; save registers jl. w3 d22. ; writeinteger(integer) ws. w1 i0. ; sl w1 0 ; fill with spaces jl. (i1.) ; according to type ac w1 x1 ; jl. i10. ; return through writespace i1:0 i0:0 e.z. c.(:c23>14a.1:)-1 b. i24 ; ; procedure get_segment(segno) ; comment: performs the transport of the stated segment ; from <:susercat:> ; call: return ; w0 destroyed ; w1 segno destroyed ; w2 address destroyed ; w3 link destroyed w.d77: ; get_segment: rs. w3 i10. ; al. w3 c69. ; jd 1<11+52 ; create areaprocess(susercat) sl w0 2 ; if result <> 0 jl. g12. ; then goto end line se w0 0 ; jl. g6. ; i22: rs. w1 e50. ; al. w1 e47. ; rs. w2 e48. ; al w2 x2+512 ; prepare inputmessage rs. w2 e49. ; jd 1<11+16 ; send message al. w1 e51. ; jd 1<11+18 ; lo. w0 e51. ; 'or' status and result rl w1 0 ; save result jd 1<11+64 ; remove area.susercat se w1 1 ; if <>1 then jl. g11. ; error goto end line jl. (i10.) ; i10:0 ; procedure find_entry(name) ; comment: finds the entry identified by the given name ; returns with the value -10 if entry not found in this segment or -1 if entry not exist ; call: return: ; w0 destroyed ; w1 destroyed ; w2 entry address or -10 or -1 ; w3 link destroyed w. d78: ; find_entry: rs. w3 i10. ; rl. w1 e71. ; i0: rl w2 x1 ; if entry not exsist sn w2 -1 ; jl. (i10.) ; then return sn w2 -2 ; if entry deleted then jl. i1. ; try next entry al w2 x1 ; dl w0 x1 +6 ; sn. w3 (e20.) ; compare names se. w0 (e21.) ; jl. i1. ; if names unequal then dl w0 x1+10 ; try next entry sn. w3 (e22.) ; else return se. w0 (e23.) ; jl. i1. jl. (i10.) ; entry found i1: rl. w2 e70. ; al w2 x2 +2 ; rl. w3 e71. ; wa w1 x2 ; am. (e85. ; sl w3 x1 ; jl. i0. ; al w2 -10 ; entry not found jl. (i10.) ; e.z. ; procedure lookup bs claims(device,process); ; comment the bs-claims for the process is looked up on the given device; ; call: return: ;w0 - result ;w1 return addr. of bs-claims ;w2 device unchanged ;w3 process - b. i2 w. d73: al. w3 i2. ; entry0: w3:=addr('s'); d74: rs. w1 i0. ; entry2: store(w1); rl. w1 i1. ; w1:= addr(bs claim store); jd 1<11+118 ; lookup bs-claims jl. (i0.) ; return; i0: 0 ; i1: e86 ; addr of bs claims i2: <:s:>,0,0,0 ; current process e. ; parameter table: ; contains a byte for each character type in the follwoing states: ; 0 initial state ; 1 after letter ; 2 after digit ; each entry defines the address of an action (relative to the ; procedure next param) and a new state: ; entry=action<2 + new state b.i24 i0=(:d3-d2:)<2+0, i1=i0+1, i2=i0+2 i3=(:d4-d2:)<2+1, i4=(:d5-d2:)<2+2, i5=(:d6-d2:)<2+2 i6=(:d7-d2:)<2+0, i7=(:d8-d2:)<2+0 i9=(:d11-d2:)<2+0,i10=(:d13-d2:)<2+1 h.h1: ; initial state: i3, i5, i4, i0 ; letter 1, digit 2, unknown 0, continue 0 i6, i9, i6, i0 ; unknown 0, endline 0, unknown 0, continue 0 ; after letter: i3, i3, i6, i7 ; letter 1, letter 1, radix 0, delimit 0 i7, i9, i6, i1 ; delimit 0, endline 0, unknown 0, continue 1 ; after digit: i10, i5, i4, i7 ; alfa num 0, digit 2, radix 2, delimit 0 i7, i9, i6, i2 ; delimit 0, endline 0, unknown 0, continue 2 e. ; ; assignment of d-names to l-names used in all following stepping stone blocks ; l0 = d0, l1 = d1, l2 = d2, l3 = d3, l4 = d4, l5 = d5 l6 = d6, l7 = d7, l8 = d8, l9 = d9, l10 = d10, l11 = d11 l12 = d12 l14 = d14, l15 = d15, l16 = d16, l17 = d17, l18 = d18, l19 = d19 l20 = d20, l21 = d21, l22 = d22, l23 = d23, l24 = d24, l25 = d25 l26 = d26, l27 = d27, l28 = d28, l29 = d29, l30 = d30, l31 = d31 l33 = d33, l34 = d34, l35 = d35, l36 = d36, l37 = d37 l38 = d38, l39 = d39, l40 = d40, l41 = d41, l42 = d42, l43 = d43 l44 = d44, l45 = d45, l46 = d46, l48 = d48, l51 = d51, l52 = d52 l53 = d53, l54 = d54, l55 = d55, l56 = d56, l57 = d57, l58 = d58 l59 = d59, l61 = d61, l64 = d64, l70 = d70, l71 = d71, l73 = d73 l74 = d74, l77 = d77, l78 = d78, l79 = d79, l80 = d80, l81 = d81 l82 = d82, l83 = d83, l84 = d84 ; ; stepping stones ; jl. (2) , l2 , d2 = k-4 jl. (2) , l9 , d9 = k-4 jl. (2) , l10 , d10 = k-4 jl. (2) , l12 , d12 = k-4 jl. (2) , l14 , d14 = k-4 jl. (2) , l15 , d15 = k-4 jl. (2) , l16 , d16 = k-4 jl. (2) , l17 , d17 = k-4 jl. (2) , l18 , d18 = k-4 jl. (2) , l19 , d19 = k-4 jl. (2) , l20 , d20 = k-4 jl. (2) , l21 , d21 = k-4 jl. (2) , l22 , d22 = k-4 jl. (2) , l23 , d23 = k-4 jl. (2) , l24 , d24 = k-4 jl. (2) , l25 , d25 = k-4 jl. (2) , l26 , d26 = k-4 jl. (2) , l27 , d27 = k-4 jl. (2) , l29 , d29 = k-4 jl. (2) , l34 , d34 = k-4 jl. (2) , l35 , d35 = k-4 jl. (2) , l36 , d36 = k-4 jl. (2) , l37 , d37 = k-4 jl. (2) , l38 , d38 = k-4 jl. (2) , l39 , d39 = k-4 jl. (2) , l40 , d40 = k-4 jl. (2) , l41 , d41 = k-4 jl. (2) , l42 , d42 = k-4 jl. (2) , l44 , d44 = k-4 jl. (2) , l45 , d45 = k-4 jl. (2) , l46 , d46 = k-4 jl. (2) , l51 , d51 = k-4 jl. (2) , l52 , d52 = k-4 jl. (2) , l53 , d53 = k-4 jl. (2) , l54 , d54 = k-4 jl. (2) , l55 , d55 = k-4 jl. (2) , l56 , d56 = k-4 jl. (2) , l57 , d57 = k-4 jl. (2) , l58 , d58 = k-4 jl. (2) , l61 , d61 = k-4 jl. (2) , l64 , d64 = k-4 jl. (2) , l70 , d70 = k-4 jl. (2) , l71 , d71 = k-4 jl. (2) , l77 , d77 = k-4 jl. (2) , l78 , d78 = k-4 jl. (2) , l79 , d79 = k-4 jl. (2) , l80 , d80 = k-4 c69:<:susercat:>, 0, 0 ; name of s-usercat, incl. name table table entry ▶EOF◀