|
|
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: 69888 (0x11100)
Types: TextFile
Names: »mons1«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦d53069465⟧ »kkmon2filer«
└─⟦this⟧
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦f874557f7⟧ »kkmon2filer«
└─⟦this⟧
\f
m. mons1 - operating system s, part 1
b.i30 w.
i0=81 05 20, i1=12 00 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, h50,g110,f29,e90,d90,c100,j5
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= 2 ; 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
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
c89=8+12*a112 ; standard length of susercatentry
c100=1 ; number of privileged conseles
c15=k, <:disc:>,0,0 ; standard work device name
; 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 console
c22=c18+2 ; 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
c29=c27+1 ; 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
c44=c96+10 ; 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; top console description
c1=c48+2 ; size of console description
; 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
; bit 4:include,exclude
; bit 5:size,pr,pk,login,user,project,,prio,base
; bit 6:addr,function,buf,area,internal,key,bs,temp,perm,all,call
; bit 7:new,create,run,init,
; bit 8:privileged
; 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
c80=c78+2
c91=c80+2 ; remove indicator
c52=c91+2 ; console
c53=c52+2 ; last addr
c54=c53+2 ; char shift
c55=c54+2 ; char addr
c56=c55+2 ; chilel
c57=c56+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
c60=10 ; 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+36 ; 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 ;
jl. w3 d24. ; find console(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);
jl. (i4.) ; goto end line;
i0:<:<10>s-break:<0>:> ;
i2: e25
i3: e32
i4: g30 ;
e.
z. ; end
b. i20, j20 w.
i0: 0 ; saved link
i1: 0 ; saved w3
i2: 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
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
; procedure stack input
; stacks the input pointers and selects the given area for input
;
; call: w2=name, w3=link
; exit: all regs undef
d79: ; stack input:
rs. w3 i0. ; save return;
rl. w1 (j5.) ; w1 := work;
rl w3 x1+c58 ; w3 := stack pointer;
sn w3 x1+c72 ; if stack pointer = last stack entry then
jl. (j0.) ; 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 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
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
;
; 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;
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 i2. ; 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.) ;
jd 1<11+92; create entry lock process(area name);
se w0 0 ; if result <> ok then
jl. (j1.) ; goto area unknown;
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. (j2.) ; goto area error;
i10: ; return:
rl. w1 i2. ; restore regs;
dl. w3 i1. ;
jl x2 ; return;
e. ;
; procedure next char(char,type)
; comment: unpacks and classifies the next character from
; the console buffer:
; character type:
; 0 <small 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 link
b.i24 ; begin
w.d1: dl. w2 e28. ;
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;
sh. w2 (e26.) ; if char addr > last addr then
jl. i0. ; begin
al w0 10 ; char := newline;
rl. w1 e24. ;
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. d1. ; 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 e28. ;
i1: ; classify char:
rl w1 0 ;
ls w1 -2 ;
wa. w1 e5. ;
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);
jl x3 ; end;
i3:8.177 ;
i4:8.7 ;
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 ; begin
w.d2: rs. w3 e60. ;
ds. w2 e59. ;
al w1 0 ;
se. w1 (e87.) ; if areabuf undef then
jl. w2 d81. ; get segment;
rs. w1 e87. ; areabuf := defined;
al w0 0 ; param type := 0;
ds. w1 e19. ; integer:=0;
ds. w1 e21. ;
ds. w1 e23. ; name:=0
al w0 10 ;
rl. w1 e6. ; radix:=10;
ds. w1 e57. ; state:=param table;
d3: jl. w3 d1. ; continue:
wa. w1 e57. ; 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 e6. ; state:=
rs. w2 e57. ; param table+8*entry(10:11);
jl. x1 +d2. ; goto action;
d4: rl. w3 e19. ; letter:
sl w3 11 ; if integer>=10
jl. d7. ; then goto unknown;
al w2 0 ;
wd. w3 i0. ;
ls w2 3 ; char:=char shift
ac w2 x2 -16 ; (16-integer mod 3 * 8);
ls w0 x2 +0 ;
ls w3 1 ; addr:=name+integer/3*2;
lo. w0 x3+e20. ;
rs. w0 x3+e20. ; word(addr):=word(addr) or char;
rl. w3 e19. ;
al w3 x3 +1 ;
al w2 1 ; integer:=integer+1;
ds. w3 e19. ; param type:=1;
jl. d3. ; goto continue;
d5: se w0 45 ; radix or minus
jl. i1. ; if minus thrn
al w3 -1 ;
rs. w3 i4. ;
jl. d3. ;
i1: al w3 0 ;
rx. w3 e19. ; radix:=integer;
rs. w3 e56. ; integer:=0;
jl. d3. ; goto continue;
d6: rl. w3 e19. ; digit:
wm. w3 e56. ;
al w3 x3 -48 ; integer:=
wa w3 0 ; integer*radix-48+char;
al w2 2 ; param type:=2;
ds. w3 e19. ;
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;
d7: ; unknown:
sn w0 25 ; if char = em then
jl. w2 d80. ; unstack input;
al w2 3 ;
rs. w2 e18. ; param type:=3;
d8: rl. w0 e18. ; delimiter:
rl. w2 e18. ;
se w2 2 ;
jl. i2. ;
rl. w3 i4. ;
sh w3 -1 ;
ac. w3 (e19.) ;
sh w3 -1 ;
rs. w3 e19. ;
rs. w2 i4. ;
i2: dl. w2 e59. ;
c.(:c24>21a.1:)-1 ; if param testoutput then
jd 1<11+28 ; type w0(param type);
z. jl. (e60.) ;
i0:3 ;
i4:0 ;sign
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. g2. ; then goto end line;
jl. (i0.) ;
i0:0 ; end
; 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. g2. ; then goto end line;
rl. w0 e19. ;
jl. (i0.) ;
e. ; end
; procedure increase access(console)
; comment: increases the access counter of a given console,
; and if the console was in the free pool, it is hooked
; onto the used chain.
; call: return:
; w0 destroyed
; w1 console console
; w2 unchanged
; w3 link unchanged
b. i24 w.
d9: ds. w3 i1. ;
al w0 1 ; begin
wa w0 x1+c28 ;
sh w0 1 ;
al w0 2 ;
rx w0 x1+c28 ; access count:= access count + 1;
i4:; if access count was <> 0
sl. w1 (e31.) ; or console belongs to the predefined
jl. 4 ; then return;
jl. w3 d17. ; remove element(console);
dl. w3 i1. ; return
jl x3 ; end;
; procedure decrease access(console);
; comment: decreases the access counter of a given console,
; and if the access counter becomes null, and the console
; description belongs to the potentially free consoles, it
; is removed from the used chain and hooked onto the
; rear of the free chain.
; call: return:
; w0 unchanged
; w1 console console
; w2 unchanged
; w3 link destroyed
d10: ds. w3 i1. ; begin
rl w3 x1+c28 ;
se w3 2 ;
jl. +8 ;
rl. w2 e81. ;
sn w2 0 ;
al w3 x3 -1 ;
al w3 x3 -1 ; access count:= access - 1;
sh w3 0
al w3 0
rs w3 x1+c28 ;
sn w3 0 ; if access count <> 0
sl. w1 (e31.) ; or console is predefined
jl. i10. ; then return;
al. w2 e35. ;
jl. w3 d18. ; link element(console,free chain);
i10: dl. w3 i1. ; return
jl x3 ;
; end;
i0:0 ; common room for register save
i1:0 ; in increase and decrease access.
i3:c82 ; standard console mask
; 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 init write
; comment: prepares the writing of characters in the line buffer
; within the current work area.
; call: return:
; w0 unchanged
; w1 unchanged
; w2 unchanged
; w3 link link
b.i24 ; begin
w.d19:rs. w3 e55. ;
rl. w3 e24. ;
al w3 x3+c65 ;
rs. w3 e45. ; line addr:=work+linebuf;
rs. w3 e46. ; writeaddr:=lineaddr;
al w3 16 ; writeshift:=16;
rx. w3 e55. ;
jl x3 +0 ;
e. ; end
; procedure writechar(char)
; comment: packs the next character in the storage address
; initialized by initwrite.
; call: return:
; w0 char destroyed
; w1 unchanged
; w2 unchanged
; w3 link link
b.i24 ; begin
w.d20:rx. w1 e55. ; if writeshift<0
rx. w2 e46. ; then
sl w1 0 ; begin
jl. i0. ; writeshift:=16;
al w1 16 ; writeaddr:=writeaddr+2;
al w2 x2 +2 ; end;
i0: 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;
rx. w1 e55. ;
rx. w2 e46. ;
jl x3 +0 ;
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 e60. ;
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 e58. ;
jl. w3 d20. ; write char(ch);
rl. w3 e58. ;
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 e58. ;
i7: dl. w3 e60. ;
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 e60. ; 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 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:
al. w1 e44. ; mess := output message;
d26: ; send buf:
rs. w3 e60. ;
rl. w2 e25. ;
rl w2 x2+c25 ;
dl w0 x2+a11+2 ;
ds. w0 e41. ;
dl w0 x2+a11+6 ;
ds. w0 e43. ; receiver:=name(proc);
al. w3 e40. ;
jd 1<11+16 ; send mess(receiver,typemess,buf);
jl. (e60.) ;
e. ; end
; procedure find console(device no, console, sorry)
; comment: searches a console with a given process descr. addr.
; call: return:
; w0 cons addr cons addr
; w1 console
; w2 unchanged
; w3 link link
b.i24 ; begin
w.d24:rl. w1 e9. ; for console:=first console
i0: sn w0 (x1+c25) ; step console size
jl x3 +2 ; until last console do
sn. w1 (e10.) ; if device(console)=device no
jl. +6 ; then goto found;
al w1 x1 +c1 ; goto sorry;
jl. i0. ; found:
al. w1 e35. ; if not found then get
rl w1 x1+c20 ; free consolebuffer
sn. w1 e35. ;
jl x3 +0 ;
rs w0 x1+c25 ;
jl x3 +2 ;
e. ; end
; 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 e30. ; entry first hole:
rl. w0 e16. ; hole addr:= first core;
al. w3 e15. ; element:= core table head;
jl. j2. ; goto advance;
j1: rx. w3 e30. ; entry next hole:
sn. w3 e15. ; element:= core table element
jl. (e30.) ; if element = core table head then
am (x3+c17) ; return sorry;
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 e15. ; if element = core table head
al. w1 e1. ; el then tophole=topcore
rs. w2 i5.
rl w2 x1+a182
rl w1 x1+a17 ; else tophole:= first addr(child(element));
se. w3 e15. ;
wa w1 4 ; add base
ws w1 0 ; hole size:= top hole - hole addr;
rx. w3 e30. ; core table element:= element;
rl. w2 i5. ;
jl x3 +2 ; return happy;
i5: 0
; procedure find parent(child,console,coretableelement,sorry);
; comment: searches the parent console of a given child and
; sets the variable core table element.
; call: return:
; w0: destroyed
; w1: console
; w2: child child
; w3: link core table element
d25: rs. w3 e60. ; begin
am j0-j1 ; for i:= first hole,
i0: jl. w3 j1. ; next hole while happy do
jl. (e60.) ; begin
rl. w3 e30. ; if child = child(element) then
se w2 (x3+c17) ; begin console:= console(element);
jl. i0. ; return happy
rl w1 x3+c18 ; end;
am. (e60.) ; end;
jl +2 ; return sorry;
; 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 e37. ; begin
rs. w3 e38. ; 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. (e38.) ; goto found;
sl. w1 (e37.) ; return sorry;
jl. 4 ; found: size:= wanted size;
jl. i1. ; first addr:= hole addr;
dl. w2 e38. ; return happy;
jl x2 +2 ; 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 e57. ; begin
rs. w3 e58. ;
rl w2 0 ;
am j0-j1 ; for size:= first hole, next hole while happy do
i2: jl. w3 j1. ; begin
jl. (e58.) ; if holeaddr > start addr then
sl w0 x2 +2 ; return sorry;
jl. (e58.) ; add := hole addr + hole size
wa w1 0 ; - wanted size;
ws. w1 e57. ; if add >= start then goto found;
sh w1 x2 -2 ; end;
jl. i2. ; return sorry;
al w0 x2 ; found:
dl. w2 e58. ; return happy;
jl x2 +2 ; 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 e58. ; 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
jl. (e58.) ; 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 e60. ; i:= base core table;
rl. w1 e33. ; 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;
rx. w2 e30. ; link element(core table entry(i),
jl. w3 d18. ; core table element);
al w2 x1 ; core table element:= core table entry(i);
rx. w1 e30. ; core table element. child:= child;
ds w1 x2+c18 ; core table element. console:= console;
rl. w3 e79. ;
rs w3 x2+c22 ; coretable element. segm:=segmentno
al w3 -1 ;
rs. w3 e79. ;
rl w0 x2+c17 ;
jl. (e60.) ; return;
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 e30. ;
al w2 -1 ;
rs w2 x1 c22 ;
rl w1 x1+c18 ; console:= core table element.console;
jl. w3 d10. ; decrease access(console);
rl. w1 e30. ;
jl. w3 d17. ; release element (core table element);
jl. (i1.) ; return
i1:0
e. ; end
c.-4000 ; only in rc4000
; procedure find keys(keys,pr,pk,sorry)
; comment: examines all children and creates a possible
; protection register with zeroes in all available protection
; bits. from this possible register, a protection register pr
; with a given number of keys is selected from left to right.
; the protection key pk is set equal to the right-most assigned
; key. upon return, keys is diminished by the number of assigned
; keys.
; call: return:
; w0 pr
; w1 pk
; w2 keys keys
; w3 link link
b.i24 ; begin
w.d32:ds. w3 e60. ;
rl w1 b1 ;
bz w0 x1+a24 ; possible:=pr(s);
al. w2 e15. ; addr:=core table;
i0: rl w2 x2+c20 ; while word(addr)<>0 do
sn. w2 e15. ; begin
jl. i2. ; child:=word(addr);
rl w3 x2+c17 ;
bz w3 x3+a24 ; possible:=possible or
lx. w3 i1. ; (pr(child) exor last 7);
lo w0 6 ; addr:=addr+2;
jl. i0. ;
i1:8.177 ;end;
i2: rl. w2 e59. ; pr:=possible;
al w3 0 ;
i3: ls w0 1 ; bit:=16;
al w3 x3 -1 ; repeat
sz w0 1<7 ; bit:=bit+1;
jl. i4. ; if pr(bit)=0 then
al w2 x2 -1 ; begin
sn w2 0 ; keys:=keys-1;
jl. i5. ; if keys=0 then goto found;
i4: se w3 -7 ; end;
jl. i3. ; until bit=24;
jl. (e60.) ; goto sorry;
i5: lo. w0 i1. ; found: pk:=bit;
ls w0 x3 +0 ; while bit<>24 do
ac w1 x3 +0 ; begin
rl. w3 e60. ; pr(bit):=1; bit:=bit+1;
jl x3 +2 ; end;
e. ; end
z.
; 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 e29. ;
dl w1 x2+a11+2 ;
ds. w1 e41. ;
dl w1 x2+a11+6 ; receiver:=name(child);
ds. w1 e43. ;
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 parent of the
; child.
; call: return:
; w0 destroyed
; w1 console
; w2 child
; w3 link destroyed
b.i24 ; begin
w.d34:rs. w3 i0. ;
rl. w1 e25. ;
al w3 x1+c29 ; process description(
jd 1<11+4 ; process name(console),result);
rs. w0 e29. ; child:=result;
rl w2 0 ;
rl w1 x2 +0 ;
se w2 0 ; if child=0
se w1 0 ; or kind(child)<>0
jl. g9. ; then goto end line;
jl. w3 d25. ;
jl. g3. ; find parent(child,parent,end line);
sn. w1 (e25.) ;
jl. (i0.) ; if console<>parent
rl. w1 e25. ;
bz w0 x1+c27 ; and not privileged(console)
so w0 1<3 ;
jl. g3. ; then goto end line;
jl. (i0.) ;
i0:0 ;
e. ; end
; 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. 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.i25, j10 w. ; begin
d35:rs. w3 i2. ; find core:
el. w2 e81. ;
se w2 1 ;
jl. w3 d9. ;
rl. w2 e25. ;
rl w0 x2+c30 ; start:=first addr(console);
rl w1 x2+c39 ; size:=size(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. g4. ;
rl. w2 e25. ;
rs w0 x2+c30 ; first addr(console):=start;
wa w0 x2+c39 ; top addr(console):=
rs w0 x2+c31 ; start+size(console);
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. g3. ;
al w0 0 ; then 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. g5. ; 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. g6. ; 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. g7. ; 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. g19. ; then goto base alarm;
rl w1 x2+c43 ;
sl w1 (x2+c41) ; 3; if cons.user.lo < cons.max.lo
jl. 4 ;
jl. g19. ;
ws w1 0 ;
sl w1 1 ;
jl. g19. ; 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. g19. ;
al w1 x1 -2 ;
sl w1 (x3+a45-0) ; 7; if cons.max.hi > s.std.hi
jl. g19. ; 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. g4. ;
sn w0 2 ;
jl. g11. ;
se w0 0 ; if result<>0
jl. g10. ; 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+c44 ;
jl. j0. ;
; set the priority of the process
; if the priority differs from default. (0)
al w3 x1+c29 ; name adr=process name.console
zl w1 x1+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. g27. ; goto end line
; include process as user of all peripheral devices except those listed
; in the s device exception tablr.
i19: 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: jd 1<11+12 ; include user(name addr, devno);
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. ; w2:=addr(device);
jl. w1 d84. ; lookup bs claims
rs. w1 i0. ; := base of bs claims store;
al. w2 e51. ;
i6: dl w0 x1+2 ; w0:=segments; w3:=entries;
ds w0 x2+2 ; :=entries,segments;
al w2 x2+4 ;
al w1 x1+4 ; w1:=next key;
am. (i0.) ;
sh w1 a110*4 ; if key<= max key then
jl. i6. ; goto next key;
rl. w2 e25. ;
al w3 x2+c29 ;
al. w2 e20. ;
al. w1 e51. ;
jd 1<11+78 ;
se w0 0 ; if result<>0
jl. g20. ;
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. g18. ;
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;
al. w2 g20. ; 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;
al w0 1 ;
hs. w0 e81. ; fiddle with remove indicator...
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;
al. w2 g25. ; 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)
i0: e86 ; addr of bs claims store
i2:0 ; end
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,console,coretableelement,
am 0 ; irrelevant);
rl w1 x1+c25 ;
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);
d75: rs. w3 i20. ;
rl. w3 e29.
dl w1 x3+a43 ; get catbase of pr. descr.(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
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;
am (x2+a182) ; add base
sl w1 (x2+a18) ; 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);
bz. w1 e67. ;
wa w1 0 ; child ic:=
rs. w1 e66. ; first addr(child)+ic(tail);
am (x2+a182)
sl w1 (x2+a18) ; if child ic>=top addr(child)
jl. i13. ; then goto give up 0;
al. w1 e47. ; load program:
jd 1<11+16 ; send mess(receiver,area mess,buf);
al w1 0 ; (prepare for clearing last of command table)
sh. w0 (e8.) ; if first addr of child <= last of initcat code then
rs. w1 (e12.) ; terminate command-table with a zero;
; (i.e. prohibit further use of initcat-commands)
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 ;
jl. i15. ; goto restore base(s)
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
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);
jl. (i0.) ;
i0:0 ;
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.
; 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 ; return;
al w1 x1+c2 ; increase(work);
sh. w1 (e14.) ; if work <= last work then
jl. i0. ; goto loop;
jl. g31. ; goto exam next; <* not expecting this answer *>
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;
c.(:c24>19a.1:)-1 ; if work testoutput
jd 1<11+32 ; then type w2(state);
z. 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 type description
; comment: testoutput of a console description
; call: return:
; w0 unchanged
; w1 destroyed
; w2 destroyed
; w3 link destroyed
c.(:c24>18a.1:)-1 ; if console testoutput then
b.i24 ; begin
w.d44:rs. w3 i1. ;
rl. w1 e25. ;
al w2 x1 +0 ; addr:=console;
i0: bz w3 x2 +0 ; repeat
jd 1<11+34 ; type w3(byte(addr));
al w2 x2 +1 ; addr:=addr+1
se w2 x1 +c1 ; until addr=console+console size;
jl. i0. ;
jl. (i1.) ;
i1:0 ;
e. ;
z. ; 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 clear claimlist
; comment sets zeroes in whole claimlist of console descr
;
; call: w3 = link
; exit: all regs undef
b. i10 w.
d46: ; clear claimlist:
rl. w1 e25. ; w1 := console;
al w2 x1+c48-c44+2; w2 := rel top of claimlist;
al w0 0 ;
i0: ; rep:
al w2 x2-2 ; decrease(pointer);
sl w1 x2 ; if pointer <= start of console then
jl x3 ; return;
rs w0 x2+c44 ; claimlist(pointer) := 0;
jl. i0. ; goto rep;
e.
; 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.
d84: al. w3 i2. ; entry0: w3:=addr('s');
d85: 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
; initial state:
h.h1: i3, i5, i4, i0 ; letter 1, digit 2, unknown 0, continue 0
i6, i9, i6, i0 ; unknown 0, endline, 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, unknown 0, continue 1
; after digit:
i6, i5, i4, i7 ; unknown 0, digit 2, radix 2, delimit 0
i7, i9, i6, i2 ; delimit 0, endline, unknown 0, continue 2
e.
jl. d2. ;
d2=k-2
jl. d9. ;
d9=k-2
jl. d10. ;
d10=k-2
jl. d15. ;
d15=k-2
jl. d16. ;
d16=k-2
jl. d19. ;
d19=k-2
jl. d20. ;
d20=k-2
jl. d21. ;
d21=k-2
jl. d22. ;
d22=k-2
jl. d23. ;
d23=k-2
jl. d25. ;
d25=k-2
jl. d26. ;
d26=k-2
jl. d27. ;
d27=k-2
jl. d29. ;
d29=k-2
jl. d32. ;
d32=k-2
jl. d34. ;
d34=k-2
jl. d35. ;
d35=k-2
jl. d36.
d36=k-2
jl. d38.
d38=k-2
jl. d39. ;
d39=k-2
jl. d42. ;
d42=k-2
jl. d46. ;
d46=k-2
jl. d61. ;
d61=k-2
jl. d70. ;
d70=k-2
jl. d71. ;
d71=k-2
jl. d77. ;
d77=k-2
jl. d78. ;
d78=k-2
jl. d79. ;
d79=k-2
jl. d84. ;
d84=k-2
jl. d85. ;
c69:<:susercat:>, 0, 0 ; name of s-usercat, incl. name table table entry
▶EOF◀