|
|
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: 42240 (0xa500)
Types: TextFile
Names: »system3tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »system3tx «
; jz.fgs 1986.04.04 algol 8, system(fnc,i,arr or s), page ...1...
; the segments also contain increase, check, blockproc,
; stderror. see page 9
; after evaluation of the three parameters: fnc (integer),
; i (integer) and arr or s (array or string), the contents
; of the formal locations are:
; last used : return information (unchanged)
; + 2 : - - -
; + 4 : - - -
; + 6 : value of fnc
; + 8 : abs address of value of i
; +10 : kind of third parameter (0=string,1=boo,2=int,3=real or long,
; 4=complex or double)
; +12 : abs address of dope (array), or unchanged (string)
; +14 : abs address of first array elem (array), or unchanged (string)
; +16 : abs address of last array elem (array), or unchanged (string)
; b. ; begin block fpnames
; w. ;
b. e7, g1 ; global block for tail parts
w. ; used by insertproc
e6 = 0 ; segments := 0;
s. i6 ;begin 3 segments for system, check, increase,
; blockproc and stderror
\f
; jz.fgs 1987.07.08 algol 8, system(fnc, i, arr or s), page ...2...
b. a21, b6, c30, d1, f1, g5, j104 ; begin segment 1
w. ;
k = 0, g0 = 0 ; no of externals + no of globals = 0
h. ;
d0: g1 , g2 ; rel of last point , rel of last absword
j3: g0+ 3 , 0 ; rs entry 3 : reserve
j4: g0+ 4 , 0 ; rs entry 4 : take expression
j6: g0+ 6 , 0 ; rs entry 6 : end register expression
j13: g0+13 , 0 ; rs entry 13: last used
j15: g0+15 , 0 ; rs entry 15: first of program
j21: g0+21 , 0 ; rs entry 21: general alarm
j26: g0+26 , 0 ; rs entry 26: in (current input zone address)
j29: g0+29 , 0 ; rs entry 29: param alarm
j30: g0+30 , 0 ; rs entry 30: saved stackreference , saved w3
j38: g0+38 , 0 ; rs entry 38: console process address
j39: g0+39 , 0 ; rs entry 39: trap base
j40: g0+40 , 0 ; rs entry 40: name of program document
j41: g0+41 , 0 ; rs entry 41: parent process address
j42: 1<11+1 , 0 ; ref to second segment
j43: 1<11+2 , 0 ; ref to third segment
j54: g0+54 , 0 ; rs entry 54: field alarm
j74: g0+74 , 0 ; rs entry 74: max last used
j104: g0+104, 0 ; rs entry 104 : own proc descr addr
g2 = k - d0 - 2 ; define rel of last absword
g1 = k - d0 - 2 ; define rel of last point
w. ;
e0: 0 ; start of external list:
0 ;
s3 ; date
s4 ; time
\f
; jz.fgs 1986.04.04 algol 6, system(fnc,i,arr or s), page ...3...
w. ;
b0: <:<10>entry<32><32><32>:>;
e1: rl. w2 (j13.) ; entry system:
ds. w3 (j30.) ; save(stack ref,w3);
al w1 -2 ;
jl. w3 (j3.) ; reserve two halfs for
ds. w3 (j30.) ; type of third parameter;
dl w1 x2+8 ; take first parameter:
so w0 16 ; if param 1 is expr or proc
jl. w3 (j4.) ; then take expression;
ds. w3 (j30.) ; save(stack ref,w3);
rl w1 x1 ; w1 := value(fnc);
al. w0 b0. ; w0 := addr(<:entry:>);
sh w1 g3 ; if fnc > no of entries
sh w1 0 ; or fnc < 0 then
jl. w3 (j21.) ; general alarm(<:entry:>,fnc);
rs w1 x2+6 ; formal(6) := value of fnc;
dl w1 x2+12 ; take second parameter:
so w0 16 ; if param 2 is expr or proc
jl. w3 (j4.) ; then take expression;
ds. w3 (j30.) ; save(stack ref,w3);
rs w1 x2+8 ; formal(8) := address of value of i;
al w0 2.111 ; take third parameter:
la w0 x2+14 ; type := formal (14) extract 3;
rs w0 x2-2 ; work := type;
se w0 2.111 ; if zone
sn w0 2.100 ; or long
al w0 3 ; then type:=3
se w0 2.101 ; if double precision
sn w0 2.110 ; or complex
al w0 4 ; then type:= 4
al w1 1 ;
ls w1 (0) ; type1 := 1 shift type;
am (x2+6) ;
bz. w3 f0. ; check type:
so w3 x1 ; if type1 is not in type table(fnc)
jl. w3 (j29.) ; then param alarm;
rs w0 x2+10 ; formal(10) := type;
ls w1 -1 ; type1 := type1 shift -1;
al w0 2.11111 ; test string:
la w0 x2+14 ;
se w0 8 ; if kind = string expression
sn w0 24 ; or kind = string variable
jl. a0. ; then goto call action;
sh w0 23 ; test array or zone:
sh w0 16 ; if kind is not zone or array
jl. w3 (j29.) ; then param alarm;
\f
; jz.fgs 1987.11.06 algol 6, system(fnc,i,arr or s), page ...4...
rl w3 x2+16 ; array:
ba w3 x2+14 ; formal(12) := abs address of dope :=
rs w3 x2+12 ; abs address of baseword + dope rel;
am (x2+6) ; maybe check array:
el. w0 f1. ;
so w0 1 ; if check array then
jl. a0. ; begin <*compute first address*>
rl w0 x3 ; w0 := lower index value - k;
al w1 2 ; w1 := field := 2; <*word field index 1*>
sh w1 (x3-2) ; if field > upper index value
sl w0 x1-1 ; or field < lower index value - k then
jl. w3 (j54.) ; goto field alarm;
wa w1 (x2+16) ; formal (14) := addr first word index 1 :=
rs w1 x2+14 ; field + baseword;
rl w1 (x2+16) ; <*compute last address*>
wa w1 x3-2 ; formal (16) := last array :=
rs w1 x2+16 ; base word + upper index;
al w1 5 ;
sn w1 (x2+6) ; if fnc <> 5 then
jl. a0. ; begin
al w1 8 ; w1 := field := 8; <*word field index 7*>
am (x3-2) ;
sl w1 1 ; if field >= upper index value + 1 then
jl. w3 (j54.) ; goto field alarm;
; end;
; end;
a0: am (x2+6) ; call action:
el. w3 f1. ; action := action table (fnc);
d1: jl. x3 ; goto action;
; exit conditions :
;
; w0 : return value of i
; w1 : - - - system
; w2 : sref
; w3 : addr of first word of text to be moved to array
; from (x3, x3+2), ... to ((x2+14), (x2+14)+2), ...
;
c21: ds w1 x2+12 ; exit 0: (from system (4, ...) save w0, w1;
rl w1 x2+16 ; array length :=
ws w1 x2+14 ; first array - last array +
al w0 x1+2 ; 2;
zl w1 x2+13 ; halfs to move :=
al w1 x1-2 ; seplength extract 12 - 2; <*multiple of 8*>
sh w0 x1 ; if halfs to move >= array length then
rl w1 0 ; halfs to move := array length;
jl. a4. ; goto continue system (4, ...;
c11: ds w1 x2+12 ; exit 1: (from system (2, ... and (6, ...) save w0, w1;
al w1 8 ; halfs to move := 8;
a4: am (x2+14) ; to__index :=
al w2 2 ; addr first double word of array;
al w3 x3+2 ; fromindex := addr first double word of text;
wa w1 6 ; from__top :=
rs. w1 b1. ; fromindex + halfs to move;
a3: dl w1 x3 ; repeat
ds w1 x2 ; move 4 halfs from fromindex to to__index;
al w2 x2+4 ; increment to__index;
al w3 x3+4 ; increment fromindex;
se. w3 (b1.) ; until
jl. a3. ; fromindexx = from__top;
dl. w3 (j30.) ; restore w2, w3;
dl w1 x2+12 ; restore w0, w1;
c12: rs w0 (x2+8) ; exit 2: i := w0; system := w1;
c0: rs. w2 (j13.) ; exit 3: release reservation;
jl. (j6.) ; end register expression;
\f
; jz.fgs 1987.11.06 algol 6, system(fnc,i,arr or s), page ...5...
; entry 1, floating point precision (note that third parameter
; of the call is not used)
; fgs 1982.09.06 : the entry is emptied to spare 8 instructions
c1: al w1 0 ;
; xs 3 ; second byte(w1) := exception register;
; ls w1 -2 ; system := exception(21);
; rl w0 (x2+8) ;
; sh w0 1 ;
; sh w0 -1 ; if i > 1 or i < 0 then
; jl. w3 (j29.) ; param alarm;
; js w0 2 ;
; xl 1 ; exception(21) := i;
jl. c0. ; goto exit3;
; entry 2, free core, program name
c2: rl. w1 (j13.) ; free core:
rl. w0 (j74.) ; w1:=last used; w0 := max last used;
se w0 0 ; if max last used = 0 then
jl. a21. ; begin
rl. w0 (j15.) ; w0 := first of program;
al w1 x1-1024 ; w1 := w1 - 1024;
a21: ws w1 0 ; end;
al w1 x1+8 ; system := w1 :=
ba w1 x2+4 ; last used - w0 + 2 + 6 + appetite;
al w0 x1 ; (two halfs reserved for type third param)
rl. w3 j40. ;
jl. c11. ; w3 := program name addr; goto exit 1;
; entry 3, array bounds
c3: rl. w3 (j42.) ; goto system entry 3
jl x3+i0 ; on next segment;
; entry 4, fileprocessor parameter
c4: rl. w3 j26. ; fileprocessor parameter:
rl w3 x3+h8-h20 ; w3 := abs address(fp current command);
rl w0 (x2+8) ; w0 := i;
rs. w0 b1. ; parameter no := i;
al w1 0 ; count := 0;
a2: sn. w1 (b1.) ; next parameter:
jl. a5. ; if count = parameter no then
al w1 x1+1 ; goto get parameter;
ba w3 x3+1 ; count:=count+1; next param;
bl w0 x3 ;
sl w0 3 ; if separator <> end command
jl. a2. ; then goto next parameter;
al w1 0 ; illegal parameter no:
jl. c0. ; w1 := 0; goto exit3;
b1: 0 ; parameter no, from_top in c11, c21, exit 0 and exit 1
\f
; jz.fgs 1987.07.08 algol 6, system(fnc,i,arr or s), page ...6...
; entry 4 (continued)
a5: bl w0 x3+1 ; get parameter:
rl w1 x3 ; system := w1 := separator and length(param);
se w0 4 ; if length (param) <> 4 then
jl. a7. ; goto text parameter;
rl w0 x3+2 ; integer parameter:
rl. w3 b3. ; w3 :=
sl w0 0 ; sign extension of w0;
al w3 0 ; if type third param = long array then
am (x2-2) ; arr(first) := value of param
se w3 x3-4 ; else
ci w0 0 ;
am (x2+14) ; arr(first) := float(value of param);
ds w0 2 ;
jl. c0. ; goto exit3;
a7: al w3 x3+2 ; text parameter:
rl w0 (x2+8) ; w0 := i; w3 := address(value of param);
jl. c21. ; goto exit 1;
; entry 5, move core area
b2: jl. (2) ; trap instruction;
b3: -1 ; sign extension of neg values;
c5: rl. w1 j39. ; modify trap routine:
dl w0 x1+2 ; formal(10:12) :=
ds w0 x2+12 ; instruction(trap base:trap base+2);
al. w0 a10. ; new instruction :=
rl. w3 b2. ; goto outside core;
ds w0 x1+2 ; comment: executed on illegal interrupts;
rl w1 (x2+8) ; attempt move:
rl w3 x2+14 ; index := first index;
a9: rl w0 x1 ; move next:
rs w0 x3 ; arr(index) := core(i);
al w1 x1+2 ; i := i + 2;
al w3 x3+2 ; index := index+2;
sh w3 (x2+16) ; if index =< upper then
jl. a9. ; goto move next;
am 1 ; moving ok: if true then w1 := 1 else
a10: al w1 0 ; outside core: w1 := 0;
dl. w3 (j30.) ; restore sref;
dl w0 x2+12 ; reset trap routine:
am. (j39.) ; instruction(trap base:trap base+2) :=
ds w0 2 ; formal(10:12);
jl. c0. ; goto exit3;
\f
; jz.fgs 1985.03.08 algol 8, system(fnc,i,arr or s), page ...7...
; entry 6, any message, own process
;prepared for system 3, but also valid in system 1 and 2
; ***danger*** uses knowledge of rs key variables!!!!
c6: ; any message:
al. w3 (j38.) ; w3 := addr of rs38, console addr;
rl w2 x3-6 ; w2:=spare mess buffer address
al w1 x3-38 ; w1:=answer address
jd 1<11 + 18 ; wait answer, spare mess buffer
al w1 x3-52 ; w1:=addr of dummy message
al w3 x3-18 ; w3:=addr of program name
jd 1<11 + 16 ; send message, i.e. link ans to the
al. w3 (j38.) ; w3 := addr of rs38, console proc addr;
rs w2 x3-6 ; save new spare buffer addr
ld w2 24 ; w1:=spare buff addr; w2:=0
a12: jd 1<11 + 24 ; next in q: wait event
sn w2 x1 ; if spare buffer seen then goto qmt
jl. a13. ;
sn w0 1 ; if answer then goto next in q
jl. a12.
sh w2 0 ; if buf claim exceeded
am -1 ; then result:=-1
am x2 ; buffer found
a13: al w0 0 ; qmt:
dl. w3 (j30.) ; restore stackref
rl. w1 (j104.) ; own process descr addr
a14: al w3 x1+2 ; process name
jl. c11. ; goto exit 1
; entry 7, console description
c7: rl. w1 (j38.) ; console description: w1 := console proc addr;
jl. a6. ; goto kind;
; entry 8, parent description
c8: rl. w1 (j41.) ; parent description: w1 := parent descr addr;
a6: rl w0 x1 ; kind: w0 := kind(process descr);
jl. a14. ; goto move process name;
\f
; jz.fgs 1986.04.04 algol 8, system (fnc,i,arr or s), page ...8...
; entry 9, run time alarm
c9: rl. w3 (j42.) ; goto system entry 9
jl x3+i1 ; on next segment
; entry 10, parent message
c10: rl. w3 (j42.) ; goto system entry 10
jl x3+i2 ; on next segment
; entry 11, intervals
c13: rl. w3 (j42.) ; goto system entry 11
jl x3+i3 ; on next segment
; entry 12, activity description
c14: rl. w3 (j43.) ; goto system entry 12
jl x3+i4 ; on third segment;
; entry 13, fp absent, release<12+subrelease, year<12+date, rs segments
c15: rl. w3 (j42.) ; goto system entry 13
jl x3+i5 ; on next segment;
; entry 14, get latest answer
c16: rl. w3 (j43.) ; goto system entry 14
jl x3+i6 ; on third segment;
\f
; jz.fgs 1987.11.06 algol 8, system(fnc,i,arr or s), page ...9...
; type table (type requirements for third parameter:
; (cmplx or double)<4+(long or real)<3+integer<2+boolean<1+string):
h. ;
f0 = k - 1 ;
; ; fnc:
1<4+1<3+1<2+1<1+1 ; 1 floating point precision
1<4+1<3 ; 2 free core, program name
1<4+1<3+1<2+1<1 ; 3 array bounds
1<4+1<3 ; 4 fileprocessor parameter
1<4+1<3+1<2 ; 5 move core area
1<4+1<3 ; 6 any message, own process
1<4+1<3 ; 7 console description
1<4+1<3 ; 8 parent description
1 ; 9 run time alarm
1<4+1<3+1<2 +1 ; 10 parent message
1<4+1<3+1<2 ; 11 intervals
1<4+1<3+1<2 ; 12 activity description
1<4+1<3+1<2 ; 13 fp, release, rs segments
1<4+1<3+1<2 ; 14 latest answer
; action table (+1 means that third parameter in the call
; must be real array with length >=2):
h. ;
f1 = k - 1 ;
; ; fnc:
c1 -d1 ; 1 floating point precision
c2 -d1+1 ; 2 free core, program name
c3 -d1 ; 3 array bounds
c4 -d1+1 ; 4 fileprocessor parameter
c5 -d1+1 ; 5 move core area
c6 -d1+1 ; 6 any message, own process
c7 -d1+1 ; 7 console description
c8 -d1+1 ; 8 parent description
c9 -d1 ; 9 run time alarm
c10-d1+1 ; 10 parent message
c. h57 < 3 ; if system 3 then include
c13-d1+1 ; 11 intervals
z. c14-d1+1 ; 12 activity description
c15-d1+1 ; 13 fp, release, rs segments
c16-d1+1 ; 14 latest answer
g3 = k - f1 - 1 ; no of entries in system
w. ;
g4:
c. k - 506
m. code too long
z.
c. 502 - g4, 0,r.252 - g4>1 z. ; fill segment with 0
<:system0<0>:>, 0 ; alarm text
i. ; id list
e. ; end first segment
e6 = e6 + 1 ; segments := segments + 1;
\f
; jz.fgs 1987.11.06 algol 8, system, page ...10...
b. a9, b5, c5, d1, g4, j104 ; begin of segment 2
h.
d0: g1 , g2 ; rel of last point, rel of last absword
j3: 3 , 0 ; rs entry 3: reserve
j4: 4 , 0 ; rs entry 4: take expression
j6: 6 , 0 ; rs entry 6: end register expression
j13: 13 , 0 ; rs entry 13: last used
j16: 16 , 0 ; rs entry 16: segment table base
j18: 18 , 0 ; rs entry 18: zone alarm, prints the text <:index:>
j21: 21 , 0 ; rs entry 21: general alarm
j26: 26 , 0 ; rs entry 26: current in zone
j30: 30 , 0 ; rs entry 30: saved sref, saved w3
j41: 41 , 0 ; rs entry 41: parent descr address
j50: 50 , 0 ; rs entry 50: dr2 (double prec. reg.), used for text
j60: 60 , 0 ; rs entry 60: last of segment table
j97: 97 , 0 ; rs entry 97: fp absent
j98: 98 , 0 ; rs entry 98: release<12+subrelease, date
j102: 102 , 0 ; rs entry 102: rs segments
j103: 103 , 0 ; rs entry 103: compiler version
j104: 104 , 0 ; rs entry 104: own process descr addr
g2=k - d0 - 2 ; define rel of last absword
g1=k - d0 - 2 ; define rel of last point
; entry 3, array bounds
w.
c4: dl w1 (x2+12) ; array bounds:
ac w3 (x2+10) ; k := -type;
as w0 x3+1 ; i := upper//k;
as w1 x3+1 ; system := (lower//k) + 1;
al w1 x1+1 ;
rs w0 (x2+8) ; <*i := w0; system := w1;*>
rs. w2 (j13.) ; release reservation;
jl. (j6.) ; goto end register expression;
\f
; jz.fgs 1987.11.06 algol 8, system, page ...10a...
;procedure take string
; the procedure takes a string described in x2+14 and x2+16 and
; stores it in the stack from the address given in w1 to, but
; not including the address given in w2.
;
;registers entry exit
; w0 irrelevant spoiled
; w1 first address spoiled
; w2 top address, stackref unchanged
; w3 return point spoiled
;
; cells
; x2+6 used for work
; x2+10 - - -
; x2+12 - - -
; x2+14 reference to string unchanged
; x2+16 - - - unchanged
b. a5, b0 ; procedure take string
w. ;
c0: al. w0 d0. ; make return relative to segment start
ws w3 0 ;
rs w3 x2+10 ;
rs w1 x2+12 ; save return, start of storage area
a0: dl w1 x2+16 ; take string param
so w0 16 ; if expression
jl. w3 ( j4. ); then take expression
ds. w3 ( j30.);
dl w1 x1 ; get string portion
sh w1 -1 ; if long string
jl. a1. ; then goto longstr
sh w0 -1 ; if layout then
ld w1 -100 ; simulate null string
jl. w3 a5. ; store string
jl. a0. ; goto take string param
\f
; jz.fgs 1981.05.26 algol 6, system, page 11
; procedure take string ctd
a1: hs. w0 a2. ; longstr:
bz w3 0 ; fetch address of string
ls w3 1 ; relative is stored in a2
rl. w0 ( j60.); and segment number * 2 in w3
wa. w3 ( j16.); w3:= segment tab base+segm no * 2
sh w0 x3-1 ; if w3>last of segment table
jl. a4. ; then goto string error
rl w3 x3 ;
a2=k+1 ; address of segment relative
a3: dl w1 x3+0 ; next: fetch string portion
sh w1 -1 ; if long string
jl. a1. ; then goto longstr
rs. w3 ( j30.); save w3
jl. w3 a5. ; store string
rl. w3 ( j30.); restore w3
al w3 x3-4 ; next portion:=next portion - 4
jl. a3. ; goto next
a4: ws. w3 ( j16.); segment no :=(w3-segment tab base)//2
al w1 x3 ;
ls w1 -1 ;
al. w0 b0. ;
jl. ( j21.); general alarm(<:segment:>, segment no)
b0: <:<10>segment :>
a5: ; subprocedure store string portion
; checks if string contains nulls or area
; is filled, and returns in these cases
rs w3 x2+6 ; save return
rl w3 x2+12 ; to_pointer:=to_pointer + 4
al w3 x3+4 ;
ds w1 x3 -2 ; textarea(to_pointer):= portion;
rs w3 x2+12 ;
sl w3 x2-2 ; if textarea full
al w1 0 ; then signal finished
rl w3 x2+10 ; fetch return point
sz w1 8.377; if text extract 8 <> 0
jl (x2+6) ; then goto return from store
jl. x3+d0. ; else goto return from take string
i. ; id list
e. ; end procedure take string
\f
; jz.fgs 1982.09.08 algol 8, system, page ...12...
w.
; entry system 9, run time alarm simulates call from call point
c1: ds. w3 (j30.) ; entry system 9: save sref, w3;
rs. w2 (j13.) ; release prev reservation (type third param);
rl w1 (x2+8) ; save i parameter as it may
rs w1 x2+8 ; be located in uv
al w1 -8 ;
jl. w3 ( j3.) ; reserve 8 bytes new top in w1
jl. w3 c0. ; take string
rl. w3 j50. ; w3 := addr(dr2);
dl w1 x2-6 ; store alarm text in
ds w1 x3-2 ; dr2 - 4
rl w1 x2-4 ; dr2 - 2
rs w1 x3+0 ; and dr;
dl w0 x2+4 ; fetch calling segment
rl w3 x3+0 ; ie provoke it to be in core by
rl w1 x3+0 ; referring its first word
hs. w0 a0. ;
a0=k+1 ; rel of call point on segment
al w3 x3+0 ; w3:=abs address of return point
rl. w1 j50. ; w3 := addr(dr2);
al w0 x1-4 ; w0 := pointer to alarmtext;
ls w0 -1 ; even textaddress to ensure
ls w0 1 ; that integer parameter is printed;
bl w1 x2+4 ; last used in call:=
am x2 ; stackref + apetite
al w1 x1+8+6 ; +reserved + 6
rs. w1 ( j13.); last used:=last used in call
rl w1 x2+8 ; take i value
rl w2 x2 ; w2:=w2 in call
jl. ( j21.); goto general alarm
\f
; jz.fgs 1982.09.02 algol 6, system, page ...13...
; constants and working cells for system 10
b0: 8<13 + 0<5 + 0 ; first word of a print message
b1: 0, r. 8 ; room for parent name and name table address
; also room for answer, if wait bit=0
; entry system 10 parent message, sends either a text string
; of max 21 chars as a print message or the first 8 words
; of an array as a message to the parent. the contents of
; the array is not checked in any way. the answer from the
; parent is copied into the array, and the value of
; system is set to 0 if buffer claim is exceeded otherwise
; to the result of the answer
c2: ds. w3 (j30.) ; entry system 10: save sref, w3;
rs. w2 (j13.) ; release previous reservation (type third param);
am (x2+10) ; comment type of string = 0;
se w1 x1 ; if type <> string
jl. a1. ; then then goto array
;
al w1 -18 ; string:
jl. w3 ( j3.) ; reserve 18 bytes
ld w0 -100 ;
ds w0 x2-4 ; and initialize them
ds w0 x2-8 ; to contain a print
ds w0 x2-12 ; message with an empty string
rl w3 (x2+8) ;
se w3 1 ; if i=1
al w3 0 ; then wait:=true
lo. w3 b0. ;
ds w0 x2-16 ;
al w1 x1+2 ; let the text start in last used +2
jl. w3 c0. ; take string
rs. w2 (j13.) ; release reservation as no change in segment
; alocation can happen any more
al w1 x2-18 ; w1:=message address
jl. a2. ; goto send mess
\f
; rc 26.04.72 algol 6, system page 14
; system entry 10 ctd
a1: dl w2 x2+16 ; array:
sl w1 x2-13 ; if length of array < 16 bytes
jl. a3. ; then goto length error
a2: rl. w2 ( j41.); send mess:
dl w0 x2+8 ; parent name(4:7):=
ds. w0 b1.+6; parent descr(6:9)
dl w0 x2+4 ; parent name(0:3):=
ds. w0 b1.+2; parent descr(2:5);
al. w3 b1. ; w3:=name address
al w0 0 ; w0=result, if buffer claim exceeded
jd 1<11 +16 ; send message
rl w3 x1 ; if first word of message
so w3 1 ; has wait_bit <> 1
al. w1 b1. ; then recieve answer here on segment
se w2 0 ; if buf claim not exceeded
jd 1<11 +18 ; then wait answer
rl. w2 ( j13.); restore stackref
rl w1 0 ; system:= result
jl. (j6.) ; end register expression
a3: rl. w2 ( j13.); lengtherror: restore stackref
al w0 16 ; byte index:=16
ac w3 (x2+10) ; w3:=-type; comment -log2(k);
rl w1 (x2+12) ; lower bound:=
as w1 x3+1 ; lower bound // k
as w0 x3+1 ; index:=byte index // k
wa w1 0 ; alarm index:= lower bound + index
jl. w3 ( j18.); zone alarm, prints the text <:index:>
\f
; jz.fgs 1985.03.08 algol 8, system page ...15...
; system entry 11 intervals:
c3: ds. w3 (j30.) ; entry system 11: save sref, w3;
rs. w2 (j13.) ; release prev reservation (type third param);
dl w2 x2+16 ;
sl w1 x2-13 ; if length < 16 bytes
jl. a3. ; then goto length error;
rl. w2 (j104.) ; w2 := own process descr addr;
dl w0 x2+70 ; byte 1-4 :=
ds w0 x1+2 ; catalog base;
dl w0 x2+78 ; byte 5-8 :=
ds w0 x1+6 ; standard interval;
am. (j26.);
dl w0 h58-h20 ; byte 9-12 :=
ds w0 x1+10 ; user interval;
dl w0 x2+74 ; byte 13-16 :=
ds w0 x1+14 ; max interval;
rl. w2 (j13.) ; restore stackref;
al w1 0 ; result :=0;
jl. (j6.) ; end reg expres;
\f
; jz.fgs 1987.11.06 algol 8, system, ...16...
; system entry 13, fp absent, release<12+subrelease, date
c5: ds. w3 (j30.) ; system entry 13: save sref, w3;
rs. w2 (j13.) ; release prev reservation (type third param);
dl. w0 (j98.) ;
am (x2+14) ; array (1) := release<12 + subrelease;
ds w0 2 ; array (2) := relyear<12 + mmdd ;
dl. w0 (j102.) ;
am (x2+14) ; array (3) := no of resident rs segments;
ds w0 6 ; array (4) := no of rs segments;
rl. w0 (j103.) ; i :=
rs w0 (x2+8) ; compiler version;
jl. w3 (j97.) ; w1 :=
rl w1 0 ; fp absent;
jl. (j6.) ; goto end reg expression;
i0= c4 - d0 ; define rel entry for system 3 code
i1= c1 - d0 ; define rel entry for system 9 code
i2= c2 - d0 ; define rel entry for system 10 code
i3= c3 - d0 ; define rel entry for system 11 code
i5= c5 - d0 ; define rel entry for system 13 code
g4: c. k-(:512+506:)
m. code on segment 2 too long
z.
c. (:502+512:)-g4, jl -1, r.(:252+256:)-g4>1 ; fill segment with jl-1
z.
<:system1<0>:>, 0 ; alarm text
i. ; id list
e. ; end segment 2
e6 = e6 + 1 ; segments := segments + 1;
\f
; jz.fgs 1984.01.27 algol 8, system, page ...17...
b. a12, b5, c5, d1, g5, j103 ; begin of segment 3
h.
d0: g1 , g2 ; rel of last point, rel of last absword
j4: 4 , 0 ; rs entry 4: take expression
j5: 5 , 0 ; rs entry 5: goto point
j6: 6 , 0 ; rs entry 6: end register expression
j13: 13 , 0 ; rs entry 13: last used
j18: 18 , 0 ; rs entry 18 : zone alarm, prints the text <:index:>
j21: 21 , 0 ; rs entry 21: general alarm
j23: 23 , 0 ; rs entry 23: youngest zone
j30: 30 , 0 ; rs entry 30: saved sref, saved w3
j32: 32 , g5 ; rs entry 32: stderror with chain for rel
j61: 61 , 0 ; rs entry 61: csr, cza
j75: 75 , 0 ; rs entry 75: limit last used
j78: 78 , 0 ; rs entry 78: no of activities
j79: 79 , 0 ; rs entry 79: base of activity table
j80: 80 , 0 ; rs entry 80: (azone, aref)
j85: 85 , 0 ; rs entry 85: current activity no
j91: 91 , 0 ; rs entry 91: trap chain
j99 : 99 , 0 ; rs entry 99: saved parity count
j101: 101 , 0 ; rs entry 101:latest answer
g2=k - d0 - 2 ; define rel of last absword
j33: 33 , 0 ; rs point 33 : check
g1=k - d0 - 2 ; define rel of last point
\f
; jz.fgs 1984.01.27 algol 8, system, page ...18...
; system entry 12, get activity description
; constants and procedures
w.
b1: 0 ; activity no
b2: 0 ; activity table size
b3: 0 ; top activity table or top address of answer area
b4: 0 ; activity table address
; procedure store in array
; call: value:
; w0: value value
; w1: rel index index
; w2: sref sref
; w3: link link
;
a3: am (x2+14) ; store in array:
al w1 x1 ; index := addr first array elem + rel index;
sh w1 (x2+16) ; if index <= addr last array elem then
rs w0 x1 ; array (index) := value;
jl x3 ; return;
; procedure activity number alarm;
a5: al. w0 b5. ; actno alarm:
jl. w3 (j21.) ; general alarm;
b5: <:<10>act no :>
i4 = k - d0 ; define rel entry system 12
ds. w3 (j30.) ; entry system 12: save sref, w3;
rs. w2 (j13.) ; release prev reservation (type third param);
rl. w3 (j78.) ;
sn w3 0 ; no := no of activities;
jl. a6. ; if no=0 then goto finis;
am. (j80.) ;
rl w1 -2 ; size :=
al w1 x1+h4 ; zone address(azone) + h4
ws. w1 (j79.) ; - activity table base;
sh w3 -1 ; if no < 0 then
ac w3 x3 ; no := -no;
al w3 x3+1 ; no of activities + 1;
al w0 0 ;
wd w1 6 ; activity table size :=
rs. w1 b2. ; size//no;
rl w1 (x2+8) ; activity no := value (sec. param);
rs. w1 b1. ;
sn w1 0 ; if activity no = 0 then
jl. a6. ; goto finis;
sl w1 1 ; if activity no < 1
sl w1 x3 ; or activity no >= no of activities + 1
jl. a5. ; then goto activity no alarm;
\f
; jz.fgs 1982.09.06 algol 8, system, page ...19...
; system 12 (continued)
wm. w1 b2. ; activity table address := base activity table +
wa. w1 (j79.) ; activity no * activity table size;
rs. w1 b4. ;
wa. w1 b2. ; top activity table :=
rs. w1 b3. ; activity table address + activity table size;
rl. w1 b4. ; acindex := activity table address;
rl w3 x2+14 ; index := first array;
al w3 x3+6 ; index := index + 6;
a4: rl w0 x1 ; move activity table entry:
rs w0 x3 ; array(index) := act. table(acindex);
al w1 x1+2 ; acindex := acindex + 1;
sl. w1 (b3.) ; if acindex >= top activity table
jl. a2. ; then goto check ego;
al w3 x3+2 ; index := index + 1;
sh w3 (x2+16) ; if index <= last index then
jl. a4. ; goto move activity table entry;
a2: rl w3 x2+14 ; check ego: w3 := addr first array elem;
rl. w1 (j85.) ; w1 := current activity number;
rs w1 x3+4 ; array (3) := w1;
sh w1 -1 ; if w1 < 0 then
ac w1 x1 ; w1 := -w1;
se. w1 (b1.) ; if current activity no <> activity no then
jl. a8. ; goto check implicit passivate;
rl. w1 (j13.) ;
al w0 x1+6 ;
ba w0 x2+4 ;
al w1 10 ;
jl. w3 a3. ; save last used+6+appetite in array(6);
rl. w0 (j23.) ;
al w1 16 ;
jl. w3 a3. ; save youngest zone in array (9);
dl. w0 (j61.) ;
al w0 x3 ;
al w1 18 ;
jl. w3 a3. ; save csr in array (10);
rl. w0 (j61.) ;
al w1 20 ;
jl. w3 a3. ; save cza in array (11);
rl. w0 (j91.) ;
al w1 22 ;
jl. w3 a3. ; save trap chain in array (12);
rl. w0 (j75.) ;
al w1 24 ;
jl. w3 a3. ; save limit last used in aray (13);
rl w3 x2+14 ;
al w0 0 ;
rs w0 x3+0 ; array (1) := 0; <*buff addr*>
rl. w0 b1. ;
rs w0 x3+2 ; array (2) := activity no;
jl. a6. ; goto finis;
\f
; jz.fgs 1984.01.27 algol 8, system, page ...20...
; system 12 (continued)
a8: al w0 0 ; check implicit passivate: buf := 0;
rl. w1 b4. ; w1 := activity table address;
am (x1+8) ;
se w1 x1-2 ; if activity.state = 2 <*implicitly pass*> then
jl. a9. ; begin <*find buffer addr*>
rl w1 (x1+4) ; w1 := cont (activity.last used);<*zone addr*>
rl w0 (x1+h0+4) ; buf := zone.used share.share state;
; end;
a9: rs w0 x3+0 ; array(1) := buf;
rl w1 x3+6 ; pending activity := 0;
al w0 0 ; first core := array(4);
sh w1 0 ; if first core > 0 then
jl. a7. ; begin
rl w1 x1-2 ; pending := core(first core - 2)
ws. w1 (j79.) ; - base activity table;
wd. w1 b2. ; pending activity :=
al w0 x1 ; pending//activity table size;
a7: rs w0 x3+2 ; end;
; array(2) := pending activity;
a6: rl. w1 (j78.) ; finis: w1 := no of activities;
sh w1 -1 ; if w1 < 0 then
ac w1 x1 ; w1 := -w1;
jl. (j6.) ; goto end reg. expression;
\f
; fgs 1984.01.27 algol 8, system, page ...21...
i6 = k - d0 ; define rel entry system 14
ds. w3 (j30.) ; entry system 14: save sref, w3;
rs. w2 (j13.) ; release previous reservation (work third param);
dl w1 x2+16 ;
sl w0 x1-13 ; if length of array < 16 halfs then
jl. a12. ; goto length alarm;
rl. w1 j101. ; addr := addr latest answer;
al w3 x1+24 ; top addr answer :=
rs. w3 b3. ; addr + 24;
rl w3 x2+14 ; index := addr first array element;
a10: rl w0 x1 ; array (index) :=
rs w0 x3 ; answer (addr);
al w1 x1+2 ; index := index + 2;
sn. w1 (b3.) ; if index < top answer area then
jl. a11. ; begin
al w3 x3+2 ; addr := addr + 2;
sh w3 (x2+16) ; if addr <= addr lasr array element then
jl. a10. ; goto rep;
a11: rl. w1 (j99.) ; end;
jl. (j6.) ; system := saved parity count; goto end register expr;
a12: al w0 16 ; length alarm: byte index := 16;
ac w3 (x2+10) ; w3 := -type; <*-log2 (k)*>
rl w1 (x2+12) ; lower bound :=
as w1 x3+1 ; lower bound // k;
as w0 x3+1 ; index := byte index // k;
wa w1 0 ; alarm index := lower bound + index;
jl. w3 (j18.) ; goto zone alarm; <*prints the text <:index:>*>
\f
; jz.fgs 1984.01.27 algol 6, system, page ...22...
; the procedures increase, check, blockproc and stderror
; integer procedure increase(i);
; i integer, call and return value;
e2 = k - d0 ; rel entry increase:
rl. w2 (j13.) ; entry increase:
ds. w3 (j30.) ; w2:= saved stack ref:= last used;
dl w1 x2+8 ; get i param:
so w0 16 ; if expr then take expression;
jl. w3 (j4.) ;
ds. w3 (j30.) ; saved stack ref:= w2;
rl w3 x1 ; i:= param1;
al w3 x3+1 ; increase:= i;
rx w3 x1 ; i:= i+1;
al w1 x3 ;
jl. (j6.) ; goto rs end register expression;
; procedure check(z);
; z zone, call and return value;
; calls the running system procedure check;
e3 = k - d0 ; rel entry check:
rl. w2 (j13.) ; entry check:
rl w0 x2+8 ; zone descriptor address:= param1;
ls w0 4 ; w0:= zone descriptor address shift 4;
rl. w1 j33. ; w1:= point for rs check;
jl. (j5.) ; goto rs goto point;
; procedure blockproc(z, st, b);
; z zone, call and return value;
; st integer, call and return value;
; b integer, call and return value;
; calls the block procedure belonging to the zone z;
e4 = k - d0 ; rel entry blockproc:
rl. w2 (j13.) ; entry blockproc;
rl w1 x2+8 ; z:= param1;
dl w1 x1+h4+2 ; w1:= entry point blockproc.z;
ls w0 4 ; w0:= stack ref blockproc.z shift 4;
jl. (j5.) ; goto rs goto point;
; procedure stderror(z, st, b);
; z zone, call value;
; st integer, call value;
; b integer, call value;
; calls the running system procedure stderror;
e5 = k - d0 ; rel entry stderror:
rl. w3 (j32.) ; entry stderror:
g5= k-d0+1 ; chain for rel stops here
jl x3+0 ; goto rs stderror;
g4: c. k-(:1024+506:)
m. code on segment 3 too long
z.
c. (:502+1024:)-g4, jl -1, r.(:252+512:)-g4>1 ; fill segment with jl-1
z.
<:system2<0>:>, 0 ; alarm text
i. ; id list
e. ; end segment 3
e7 = e6 ; last segment
e6 = e6 + 1 ; segments := segments + 1;
i. ; id list
e. ; end slang segments
\f
; jz.fgs 1984.01.27 algol 8, system, page ...23...
; tails to be inserted in the catalog:
w.
g0:
; system
e6 ; three segments
0, r.4 ; fill 4 words
1<23 + e1 ; entry point
3<18+41<12+19<6+19 ; integer proc, spec undef, spec int, spec int
0 ;
4 <12+ e0 ; 4, start of external list
e6<12+ 0 ; three code segments, 0 owns
; increase
1<23+4 ; kind bs
0,0,0,0 ; room for name
1<23+e7<12+e2 ; entry point
3<18+19<12, 0 ; integer proc(integer addr)
4<12+e0 ; code proc, external list
e6<12+0 ; e6 segments, no owns
; check
1<23+4 ; kind backing storage
0,0,0,0 ; room for name
1<23+e7<12+e3 ; entry point
1<18+8<12, 0 ; proc no type(zone)
4<12+e0 ; code proc, external list
e6<12+0 ; e6 segments, no owns
; blockproc
1<23+4 ; kind backing storage
0,0,0,0 ; room for name
1<23+e7<12+e4 ; entry point
1<18+3<12+3<6+8,0; proc no type(zone, int name, int name)
4<12+e0 ; code proc, external list
e6<12+0 ; e6 segments, no owns
; stderror
g1: 1<23+4 ; kind backing storage
0,0,0,0 ; room for name
1<23+e7<12+e5 ; entry point
1<18+3<12+3<6+8,0; proc no type(zone, int name, int name)
4<12+e0 ; code proc, external list
e6<12+0 ; e6 segments, no owns
i. ; id list
m. fgs 1987.11.06 algol 8 proc,
m. system, increase, check, blockproc, stderror
\f
▶EOF◀