|
|
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: 72192 (0x11a00)
Types: TextFile
Names: »write2tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »write2tx «
; rc 75.11.04. list of pageheads; write(seg. ); page 0
; list of pageheads; write(seg. ); page 0
; definition of stack variables; write(seg. ); page 1
; start write; take the zone; write(seg.1); page 2
; take next formal; type switch; write(seg.1); page 3
; long; string; write(seg.1); page 4
; unpack layout; unpack string portion; write(seg.1); page 5
; boolean; long array; integer; write(seg.1); page 6
; real; return; kind error; write(seg.1); page 7
; start segment 2; explanation; write(seg.2); page 8
; conv. number: utility procedures; write(seg.2); page 9
; outchar; variables for conv. number; write(seg.2); page 10
; start number conversion; write(seg.2); page 11
; conv. number: generate digits; write(seg.2); page 12
; print digits before the point; write(seg.2); page 13
; print digits after the point; write(seg.2); page 14
; all spaces out for b-format; write(seg.2); page 15
; conv. real: const. and variables; write(seg.3); page 16
; real to number, exp10, and zeroes; write(seg.3); page 17
; real to number, exp10, and zeroes; write(seg.3); page 18
; print the exponent part; write(seg.3); page 19
; print the exponent part; write(seg.3); page 20
; prodedures outchar, -text, -integer; write(seg.4); page 21
; prodedures outchar, -text, -integer; write(seg.4); page 22
; prodedures outchar, -text, -integer; write(seg.4); page 23
; prodedures outchar, -text, -integer; write(seg.4); page 24
; prodedures outchar, -text, -integer; write(seg.4); page 25
; prodedures outchar, -text, -integer; write(seg.4); page 26
; prodedures outchar, -text, -integer; write(seg.4); page 27
; prodedures outchar, -text, -integer; write(seg.4); page 28
; definition of entry points; write(seg.4); page 29
; tails for catalog; write(seg. ); page 30
\f
; jz 81.06.23.. definition of stack variables; write(seg. ); page 1
;b. h100 ; outer block with fp names
b. g10,d15 w.
d.
p. <:fpnames:>
l.
s. a102,b69,c25,e39,f11,g34,i42,j56
w.
;constants
g0=68 ; number of reserved bytes
;stack variable and constant addresses relative to sref
i0= -g0 ;word ; param addr
i2= 4-g0 ;double word ; string; spaces remaining
i3= 6-g0 ;byte ; b )
i4= 7-g0 ; - ; h, ) must
i5= 8-g0 ; - ; d ) be
i6= 9-g0 ; - ; pnfn(rt.byte) consecutive
i7=10-g0 ; - ; s )
i8=11-g0 ; - ; pefe )
i9=12-g0 ;word ; spaces in layout
i10=14-g0 ;byte ; state: procedure < 6 +layouttype
; procedure = 1 means write
; - = 0 - writeint
; layouttype = 2.00 - no layout
; - = 2.01 - integer -
; - = 2.10 - real -
i11=15-g0 ;byte ; sign (character);
i12=16-g0 ;word ; following zeroes, new s
i13=18-g0 ; - ; exp10
i14=20-g0 ; - ; haddr
i15=8 ; - ; record base addr
i16=6 ; - ; partial word addr
i17=26-g0 ; - ; last formal addr
i18=28-g0 ; - ; last literal addr
i19=30-g0 ; - ; general return save
i20=32-g0 ; - ; boolchar
i21=34-g0 ; - ; remaining bits in spaceword
i22=22-g0 ;double ; character count
i23=24-g0 ;word ; error (1=false, -1=true)
i24=36-g0 ;word ; pointer, long array; daddr
i25=38-g0 ; - ; upper index, long array; digit base
i32=40-g0 ; leading space char
i33=41-g0 ; space in number char
i34=42-g0 ; positive sign char
i35=43-g0 ; negative sign char
i36=44-g0 ; decimal point char
i37=45-g0 ; exponent mark char
i38=46-g0 ; ending space
i39=47-g0 ; termination star
i40=48-g0 ; terminating sign (even=false, odd=true)
i41=49-g0 ; exponent sign
i42=51-g0 ; max char count
; now follow 15 bytes to hold digits of converted
; number part i.e. g0 must be >= 40 + 15;
; notice in the code below it is used that h3=0, that
; is that the address of base address = zone descriptor
; address
\f
; jz.fgs 1981.06.09 segment 0 write, page 1a
k = 0 , g1 = 0 ; no of externals = 0
h. ;
g31: g32 , g33 ; rel of last point , rel of last absword
j41: 1<11 + 1 , 0 ; segment 1 address
j42: g1 + 21 , 0 ; rs entry 21 : general alarm
j44: g1 + 13 , 0 ; rs entry 13 : last used
j45: g1 + 30 , 0 ; rs entry 30 : (saved sref, saved w3)
j46: g1 + 6 , 0 ; rs entry 6 : end register expression
j47: g1 + 4 , 0 ; rs entry 4 : take expression
j55: g1 + 29 , 0 ; rs entry 29 : param alarm
j48: 0 , 0 ; own core : own base
j52: 0 , e29 ; own core : outtable base
j53: 0 , e31 ; own core : outtable(lower index)
g33 = k - 2 - g31 ; rel of last abs word
j43: 1<11+0 , e19 ; alarm text point
g32 = k - 2 - g31 ; rel of last point
w. ;
f2: 0 ; start external list:
e28 ; no of owns to initialize = e28
h. ;
f11: 32, 32, 43 , 45; leading space, space in number, plus , minus
46, 39, 32 , 42; point , exp mark , ending sp, star
1, 1, 2.11<10, 0; std int layout: b=h=1, leading sp=1, rest=0
0, 32, 43 , 0;
w. ;
\f
; jz.fgs 1981.06.23 segment 0 write, page 1b
b61: e29 = k-f11 , 0 ; outtable base
b62: e30 = k-f11 , 0 ; upper index(outtable)
b63: e31 = k-f11 , 0 ; lower index(outtable)
b65: e33 = k-f11 , 0 ; outindex
e34 = k-f11 ; entry convert char:
sz w0 -1<8 ; convert char:
jl x1 ; if char shift (-8) <> 0
am. (b61.) ; then return;
sn w3 x3 ; if base = 0 then
jl x1+2 ; return 2;
hs. w0 b69. ; save char;
a101:wa. w0 b65. ; lookup: field := ( char + outindex )
ls w0 1 ; * 2;
sh. w0 (b62.) ; if field > upper field or
sh. w0 (b63.) ; field <=lower field
jl x1 ; then return0 (= skip char)
wa. w0 b61. ; entry := field + outtable base
rl w0 (0) ; w0 := class shift 12 + value;
hs. w0 b68. ; save value;
zl w0 0 ; w0 := class;
se w0 1 ; if class = 1 <* shift character *> then
jl. a102. ; begin
zl. w0 b68. ; outindex := value;
rs. w0 b65. ; goto lookup;
b69 = k + 1; saved char
al w0 0 ; w0 := saved char;
jl. a101. ; end;
b68 = k + 1; saved value
a102:al w0 0 ; w0 := value;
sz w0 -1<8 ; if conv char shift (-8) <> 0
jl x1 ; then return0 (= skip char)
jl x1+2 ; else return2 (= normal char)
e28 = k - f11 ; no of owns to initialize
s3 , s4 ; time and date
; end external list
e24: rl w1 0 ; zone alarm:
al. w0 b0. ; w1 := zone state;
jl. (j42.) ; general alarm(<:z. state:>);
b0: <:<10>z. state:> ;
e23: rl. w0 j43. ; kind error:
al w1 -1 ; w0 := alarm text point;
rs w1 x2+i23 ; error := -1;
rl. w3 (j41.) ;
jl x3+e25 ; goto long string (segment 1);
<:aram<10><0>:> ; alarm text: (stored backwords)
<:ite: p:> ;
<:<10>***wr:> ;
e19 = k - 2 ; address of string point
\f
; jz 1980.01.07 segment 0 write, page 1c
e27: rl. w2 (j44.) ; replace char:
ds. w3 (j45.) ; (saved w2,w3) := lastused,call
dl w1 x2+8 ; first param:
so w0 16 ;
jl. w3 (j47.) ;
ds. w3 (j45.) ;
rl w1 x1 ; charindex := w1 := value(first param);
al. w0 b67. ;
sl w1 0 ; if charindex < 0
sl w1 8 ; or charindex >= 8
jl. w3 (j42.) ; general alarm(<:replace:>);
wa. w1 j48. ; charaddr := charindex + ownbase;
rs w1 x2+6 ;
dl w1 x2+12 ; second param:
so w0 16 ;
jl. w3 (j47.) ;
ds. w3 (j45.) ;
rl w0 x1 ;
bl w1 (x2+6) ; replacechar:=w1:=core(charaddr);
hs w0 (x2+6) ; core(charaddr) := value(second param extract 8;
rl. w3 j48. ;
bz w0 x3+2 ;
hs w0 x3+14 ; plus in signtable := plus;
bz w0 x3+0 ;
hs w0 x3+13 ; space in signtable := leading space;
jl. (j46.) ; goto end reg. expression;
b67: <:<10>replace:>
\f
; jz.fgs 1981.06.09 segment 0 write, page 1d
e35: rl. w2 (j44.) ; entry outtable:
ds. w3 (j45.) ; (saved sref,saved w3) := (last used,return);
al w0 2.11111 ; type :=
la w0 x2+6 ; first word of param extract 5;
se w0 18 ; if type <> 18 them
jl. e36. ; goto check integer;
rl w1 (x2+8) ; integer array:
rs. w1 (j52.) ; outtable base := base word(array);
bl w1 x2+6 ; dope address :=
wa w1 x2+8 ; base word address + dope rel;
dl w1 x1 ; (upper,lower) of outtable :=
ds. w1 (j53.) ; dope vector(array);
jl. (j46.) ; goto end register expression;
e36: sn w0 10 ; check integer:
jl. e37. ; if type <> integer expression
se w0 26 ; and type <> integer variable
jl. w3 (j55.) ; then param alarm;
e37: al w0 0 ;
rs. w0 (j52.) ; outtable base := 0;
jl. (j46.) ; goto end register expression;
\f
; jz 1980.01.09 segment 0 write, page 1e
e7: rl. w2 (j44.) ; entry isotable:
ds. w3 (j45.) ; (saved sref,saved w3) := (last used,this seg);
rl w3 x2+8 ;
ba w3 x2+6 ; w3 := addr(dope vector(param));
al w1 0 ; check array bounds:
sh w1 (x3-2) ; if 0 > upper index
sh w1 (x3) ; or 0 <=lower index then
jl. a9. ; index alarm;
al w1 254 ;
sh w1 (x3-2) ; if 254 > upper index
sh w1 (x3) ; or 254 <=lower index then
jl. a9. ; index alarm;
rl w3 (x2+8) ; index := addr(array(0,...));
al w2 0 ; char := 0;
al w1 -2 ; table_index :=
rs. w1 b2. ; -1;
a6: sz w2 2.111 ; next char:
jl. a8. ; if char extract 3 = 0 then
rl. w1 b2. ; begin
al w1 x1+2 ; table_index := table_index + 1;
rs. w1 b2. ; entry := class_table(table_index);
rl. w1 x1+b1. ; end;
a8: al w0 0 ; class :=
ld w1 3 ; bits(0,2,entry);
hs w0 4 ; entry := entry shift 3;
rs w2 x3 ; array(index) := class shift 12 + char;
al w2 x2+1 ; char := char + 1;
al w3 x3+2 ; index := index + 1;
sz w2 2.1111111 ; if char extract 7 <> 0 then
jl. a6. ; goto next char;
\f
; jz 1980.01.09 segment 0 write, page 1f
al w1 8 ;
rl. w2 (j44.) ; restore w2;
rl w3 (x2+8) ;
hs w1 x3+19 ; array(10) := 8 shift 12 + 10;
hs w1 x3+23 ; array(12) := 8 shift 12 + 12;
hs w1 x3+49 ; array(25) := 8 shift 12 + 25; em;
jl. (j46.) ; goto end register expression;
b4: <:<10>index :>
a9: al. w0 b4. ; index alarm:
ls w1 -1 ;
jl. w3 (j42.) ;
; class table:
b1: 8.07777777, 8.77070077, 8.77777777, 8.70777777 ; 0 -31
8.77777775, 8.77737347, 8.22222222, 8.22777777 ; 32 - 63
8.76666666, 8.66666666, 8.66666666, 8.66666677 ; 64 - 95
8.76666666, 8.66666666, 8.66666666, 8.66666670 ; 96 -127
b2: 0 ; table_index
g34: c. g34 - 506,
m. seg. 0 code too long
z.
m. segment 0
c. 502-g34, 0, r.252-g34>1 z. ; fill segment
<:write:>,0,0
\f
; jz.fgs 1981.06.09. start write; take the zone; write(seg.1); page 2
k=0
h.
g2: g15, g3; rel. last point, rel. last abs word
j0: g1+30 , 0 ; rs entry 30, save sref
j1: g1+ 3 , 0 ; - 3, reserve
j3: g1+ 4 , 0 ; - 4, take expression
j4: g1+13 , 0 ; - 13, last used
j5: g1+16 , 0 ; - 16, seg table base
j7: g1+ 6 , 0 ; - 6, end reg expr
j24: g1+60 , 0 ; - 60, last of segment table
j8: 1<11+1, 0 ; seg. 2 addr
j9: 1<11+2, 0 ; seg. 3 addr
j10: 1<11 o. (:-1:),0 ; seg. 0 addr
j36: 0 , 3 ; own core: fillchars(1:4);
j37: 0 , 7 ; own core: fillchars(5:8);
j23: g1+46 , j30 ; rs entry 46, float long, chain for rel
g3=k-g2-2
g15=k-g2-2
w.
f3:
e0: am 1<6 ; entry write: state := 1<6; skip next;
e18:al w0 0 ; entry writeint: state := 0;
rl. w2 (j4.) ; write(z, any number of variables
ds. w3 (j0.) ; or expressions);
al w1 -g0-6 ; w2:=saved sref:=last used;
jl. w3 (j1.) ; reserve local variables;
al w1 x1+6 ; check room for 3 words for
rs. w1 (j4.) ; take expression(outblock);
hs w0 x2+i10 ; save state
dl. w1 (j36.) ; move fillchars
ds w1 x2+i35 ;
dl. w1 (j37.) ; to
ds w1 x2+i39 ; stack;
al w0 0 ; initialize char count
al w1 1 ;
ds w1 x2+i23 ; char count :=0; error:=1;
al w1 -1 ;
rs w1 x2+i42 ; maxcount := -1;
rl w1 x2+8 ; get zone formals: w1:=zone descr;
rl w0 x1+h2+6 ; w0:=zone state;
se w0 3 ; if zone state=after write
sn w0 0 ; or zone state=after open
jl. a2. ; then goto zone addr;
rl. w3 (j10.) ;
jl w3 x3+e24 ; goto zone alarm (segment 0)
a2: al w0 x1+h2+4 ; partial woerd addr:=
rs w0 x2+i16 ; zone descr+h2+4;
al w0 3 ; zone state:=
rs w0 x1+h2+6 ; after write;
al w1 x2+9 ; init formal count:
rs w1 x2+i17 ; last formal addr:=2nd word of
ba w1 x2+4 ; first formal addr;
al w1 x1-2 ; last literal addr:=1st word of
rs w1 x2+i18 ; first formal addr+appetite;
\f
; jz 79.01.30. take next formal; type switch; write(seg.1); page 3
c25:al w3 0 ; take formal1: w3:=0;
e13:rs w3 x2+i19 ; save state after boolean
rl w1 x2+i17 ;
al w1 x1+4 ; w1:=last formal addr+4;
sl w1 (x2+i18) ; if w1>=last literal addr
jl. e2. ; then goto end write;
rs w1 x2+i17 ; check formal: save last formal addr;
dl w1 x1 ; w01:=formal;
al w3 2.11111; kind:= first formal
la w3 0 ; extract 5
sn w3 20 ; if kind = 20 then
jl. c6. ; goto long array;
sl w3 16 ; if (kind > 16
sl w3 23 ; and kind <= 23)
sn w3 0 ; or kind = 0
jl. e4. ; then goto kind error
so w0 16 ; if expression
jl. w3 (j3.) ; then take expression;
ds. w3 (j0.) ; w2:=saved sref;
a21:sl w1 (x2+i17) ; if last formal addr<
sl w1 (x2+i18) ; abs addr of result<
jl. a0. ; last literal addr
rs w1 x2+i18 ; then last literal addr:=abs addr;
a0:rs w1 x2+i0 ; param addr:=abs addr;
al w3 7 ; type switch:
am (x2+i17) ; w3:=type;
la w3 -2 ;
sl w3 5 ; if type>=5
jl. e4. ; then goto kind error
ls w3 1 ; type:=2*type;
am (x2+i19) ; if general return<>0 then
jl. a61. ; goto after boolean return (a17)
a61:jl. x3+a1. ; else goto case(type) of
a1:jl. c0. ; string,
jl. c3. ; boolean,
jl. c4. ; integer,
jl. c5. ; real,
; long;
\f
; jz 79.01.30. long; string; write(seg.1); page 4
dl w1 x1 ; long: w0w1 := long;
bz w3 x2+i10 ; if state = real layout
so w3 1<6+1<1 ; and procedure = write then
jl. a18. ; begin
rl. w3 ( j23.) ; convert long
jl w3 x3+0 ; goto real jump;
j30=k-1 ; comment chain for rel;
jl. a25. ; end;
a18:rl w3 x2+i17 ; number taken:
ds w1 x3 ; formal(last formal) := number;
rs w3 x2+i0 ; param addr := last formal;
rl. w3 ( j8.) ; goto integer
jl x3+e5 ; on segment 2;
e25: ; entered from segment 0 (kind alarm)
c1:rl w3 0 ; long string: w3:=addr bytes;
a5:rs w3 x2+i0 ; save addr bytes:
hs. w3 a22. ; store rel addr;
bz w3 6 ; w3:=2*seg. table entry
ls w3 1 ; +seg. table base;
wa. w3 (j5.) ;
rl. w1 (j24.) ;
sl w3 x1 ; if w3 >= last of segment table
jl. e4. ; then kind error
rl w3 x3 ; w3:=seg. table word;
a22=k+1
dl w1 x3 ; w01:=string words;
sh w1 -1 ; if w1=string pointer
jl. c1. ; then goto long string;
jl. w3 e12. ; unpack string;
rl w3 x2+i0 ; w3:=seg. number shift 12
al w3 x3-4 ; +rel addr-4;
jl. a5. ; goto save addr bytes;
c2: jl. w3 e12. ; short string: unpack string
dl w1 (x2+i17) ; take string formal
sz w0 16 ; if not expression
jl. e1. ; then goto take formal
jl. w3 (j3.) ; take expression
ds. w3 (j0.) ; save sref
c0: dl w1 x1 ; string: take portion
c7: sh w1 -1 ; if long string
jl. c1. ; then goto long string
sl w0 0 ; if short string
jl. c2. ; then goto short string
; else continue unpack layout;
\f
; jz 79.01.30. unpack layout; unpack string portion; write(seg.1); page 5
; unpack layout:
rs w0 x2+i9 ; spaces in layout := first layoutword;
al w0 0 ;
ld w1 6 ; b := b-bits;
hs w0 x2+i3 ;
al w0 0 ;
ld w1 4 ;
hs w0 x2+i4 ; h := h-bits;
bs w0 x2+i3 ;
sn w0 0 ; if h-b = 0 and
sz. w1 ( b10.) ; d = s = pefe = 0 then
am 1<1-1 ; newstate := integer layout
al w3 1 ; else newstate := real layout;
bz w0 x2+i10 ;
sz w0 1<6 ; if state = in writeinteger then
al w3 x3+1<6 ; state := newstate else
hs w3 x2+i10 ; state := newstate + 1<6;
al w0 0 ;
ld w1 4 ;
hs w0 x2+i5 ; d := d-bits;
al w0 0 ;
ld w1 4 ;
hs w0 x2+i6 ; pnfn := pnfn-bits;
al w0 0 ;
ld w1 2 ; s := s-bits;
hs w0 x2+i7 ;
ls w1 -20 ; pefe := pefe-bits;
hs w1 x2+i8 ;
jl. c25. ; goto take formal1;
b10: 2.1111 0000 11 1111 < 10; mask to determine if layout is integer
; d pnfn s pefe ; the selected bits must be null.
e12:rs w3 x2+i13 ; procedure unpack string
ac. w3 a7. ; relative return:=
wa w3 x2+i13 ; -abs addr of a7
rs w3 x2+i13 ; + abs addr of return
a7: ds w1 x2+i2 ; repeat : rest:=string
ls w0 -16 ; char:=rest.first part shift(-16)
sn w0 0 ; if char = 0
jl. e1. ; then goto take formal
rl. w3 ( j8.) ;
jl w3 x3+e15 ; outchar(char)
ds. w3 (j0.) ; save sref
dl w1 x2+i2 ; string:=rest
ld w1 8 ; shift 8 add 255
a50:al w1 x1+2.11111111; nb! mask 8 bits;
sn w0 -1 ; if string = -1
am (x2+i13) ; then return
jl. a7. ; else goto repeat
\f
; jz 1979.08.15 boolean; long array; integer; write(seg.1); page 6
c3:bz w0 x1 ; boolean:
hs w0 x2+i20 ; boolchar:=boolean parameter extract 8;
al w3 a62 ; w3:=after boolean rel. ret.
jl. e13. ; after boolean;
a17:rl w1 x1 ; w1:=index:=new param;
a62=a17-a61
se w3 4 ; if param type<>integer
jl. e4. ; then goto kind error;
bl w0 x2+i20 ;
sl w0 0 ; if boolchar >= 0
jl. a16. ; then goto index test;
wa w1 x2+i22 ;
rs w1 x2+i42 ; maxcount := index+charcount;
jl. c25. ; goto take formal1;
e1: bz w0 x2+i38 ; take formal:
hs w0 x2+i20 ; boolchar := ending space;
al w1 -1 ; index :=
rx w1 x2+i42 ; maxcharcount - charcount;
ws w1 x2+i22 ; maxcharcount := -1;;
sh w0 255 ; if boolchar>255 then goto formal1
a16:sh w1 0 ; index test: if index<=0
jl. c25. ; then goto take formal1;
al w1 x1-1 ; index:=index-1;
rs w1 x2+i13 ; save index;
bz w0 x2+i20 ; load boolchar;
la. w0 a50. ; char := boolchar extract 8;
rl. w3 ( j8.) ;
jl w3 x3+e15 ; outchar;
ds. w3 (j0.) ; save sref
rl w1 x2+i13 ; load index;
jl. a16. ; goto index test;
c6: rl w3 x1 ; long array:
sh w1 (x2+i18) ; if baseword addr <= last litteral addr
rs w1 x2+i18 ; then last litteral addr := baseword addr;
ba w1 0 ;
al w0 x1-2 ; if dope addr - 2 <=
sh w0 (x2+i18) ; last litteral addr then
rs w0 x2+i18 ; last litteral addr := dope addr - 2;
dl w1 x1 ; if lower index > 1
sl w1 2 ; then goto kind error;
jl. e4. ;
wa w0 6 ;
al w3 x3+3 ; pointer := baseword + 3;
ds w0 x2+i25 ; upper bound := upper index + baseword;
a24:rl w3 x2+i24 ; while upper index not reached do
sl w3 (x2+i25) ; begin
jl. e1. ; comment exit to take formal;
al w3 x3+4 ; pointer := pointer + 4;
rs w3 x2+i24 ;
dl w1 x3-3 ; text portion := element (pointer - 3);
sl w0 0 ; if first word < 0
sh w1 -1 ; or second word < 0 then
jl. c7. ; goto string, portion taken;
jl. w3 e12. ; unpack string;
jl. a24. ; end;
; goto take formal;
c4: rl w1 x1 ; integer:
bz w0 x2+i10 ; take number;
so w0 1<6+1<1 ; if real layout and procedure is write then
jl. a19. ; begin convert integer to real;
ci w1 0 ; goto real taken;
jl. a25. ; end;
a19:bl w0 2 ; extend integer;
bl w0 0 ;
jl. a18. ; goto number taken;
\f
; rc 75.11.04. real; return; kind error; write(seg.1); page 7
c5: bz w0 x2+i10 ; real:
so w0 1<6 ; if procedure not write then
jl. e4. ; goto kind error;
dl w1 x1 ; take number;
a25:rl. w3 ( j9.) ; real taken:
jl x3+e6 ; goto real on segment 3;
e2:rl w0 x2+i19 ; end write: wo:=general return;
se w0 0 ; if general return<>0
jl. e4. ; then goto kind error;
rl w1 x2+i15 ;
rs w0 x1+h3+4 ; record length:=0
rl w1 x2+i23 ;write:=
wm w1 x2+i22 ; charcount*error
rs. w2 (j4.) ; last used:=sref;
jl. (j7.) ; end reg expr;
e4: rl. w3 (j10.) ; kind error:
jl x3+e23 ; goto kind error on segment 0;
g8:
c. g8-506,
m. seg. 1 code too long
z.
m. segment 1
c. 502-g8, 0, r. 252-g8>1
z.
g11:<:write:>,0,0
\f
; jz 80.01.07. start segment 2; explanation; write(seg.2); page 8
k=0 ; start segment 2;
h.
g4: g7 , g5 ; headword: last point, last absword;
j11: -1 , 0 ; segment 1 address
j12: 1<11+1 , 0 ; segment 3 address
j13: g1+30 , 0 ; rs entry 30, save sref,w3;
j38: 0 , 11 ; own core: std int layout, sign table(0:3);
j49: 0 , e34 ; own core: entry convert char
j16: g1+ 4 , 0 ; rs entry 4, take expression;
g5=j16-g4 ; last absword;
j18: g1+35 , 0 ; rs entry 35, outblock;
g7=j18-g4 ; last point;
w.
;explanation of integer write:
; this code is also used to write reals after they have been converted
; to one binary long, representing the significant digits, and two binary
; integers giving the ten's exponent to be used, and the number of un-
; used digit positions following the number part.
; in case of realy integer write, the ten's exponent and the following
; zero positions are set to null.
; the significant digits of the - possibly long - integer are generated
; from the least significant end, and stored into the stack in the positions:
; sref-1, sref-2, ... etc.
; when the conversion has been made, the stack variable digit base points
; at the position just before the most significant digit.
; a logical position of the decimal point, daddr, is calculated as
; daddr = sref + following zeroes - d.
; the logical position in which printing starts is called haddr, and it
; is calculated as haddr = min ( daddr + h, base + 1).
; the logical position where printing ends is always sref - 1 + following
; zeroes;
; now, starting with the first logical position and ending with the last
; logical position, all positions before base+1 are printed as either null
; or space, depending on the layout. all positions between base+1 and sref-1
; are printed as converted digits, and all positions after sref-1 are
; printed as null if they come before daddr and as space otherwise.
; during the printing, sign, decimal point, and intermediate spaces are
; output according to the layout. the conversion of a possible exponent
; part is explained on segment 3.
\f
; jz 80.01.08 conv. number: utility procedures; write(seg.2); page 9
e9: ac. w0 g4. ; procedure outdigit:
wa w3 0 ; rel of return :=
rs w3 x2+i19 ; abs return - segment base;
al w0 x1+48 ;
jl. w3 e15. ; comment make return relative on this segment;
ds. w3 (j13.) ; char := digit + 48; outchar;
rl w1 x2+i21 ;
ls w1 1 ; bitword := bitword shift 1;
rs w1 x2+i21 ;
bz w0 x2+i33 ; char := space in number;
sh w1 -1 ; if bitword < 0 then
jl. w3 e15. ; outchar;
ds. w3 (j13.) ;
c15: am (x2+i19) ; general return on this segment:
jl. g4. ; goto segment start + relative return;
e26: al. w3 c14. ; outspaces as digits: (called from segment 3)
; set return(end number);
e17: rl w0 x2+i21 ; procedure outspaces as digits:
rs w3 x2+i19 ; save return;
al w3 x1 ; call: w1>0: digit positions, w3=return on this seg;
a13: ls w0 1 ; i := digit positions;
sh w0 -1 ; repeat
al w1 x1+1 ; bitword := bitword shift 1;
al w3 x3-1 ; if bitword < 0 then
sl w3 1 ; digit positions := digit positions + 1;
jl. a13. ; i:= i- 1;
rl w3 x2+i19 ; until i < 1;
rs w0 x2+i21 ; spaces := digit positions;
e14: am i32-i38; outspaces: boolchar := leading space else
e22: bz w0 x2+i38 ; ending spaces: boolchar := endingspace;
c23: hs w0 x2+i20 ; spaces: save boolchar;
ac. w0 g4. ; rel of return :=
wa w3 0 ; abs return - segment base;
rs w3 x2+i19 ; comment make return relative on this segment;
a12: al w1 x1-1 ; for spaces := spaces - 1 while spaces > -1 do
sh w1 -1 ;
jl. c15. ; begin
rs w1 x2+i2 ; comment ends via general return;
bz w0 x2+i20 ; char := boolchar;
jl. w3 e15. ; outchar;
ds. w3 (j13.) ;
rl w1 x2+i2 ; end;
jl. a12. ; goto general return on this segment;
\f
; jz 80.01.07 outchar; variables for conv. number; write(seg.2); page 10
e15: jl. w1 (j49.) ; outchar: char := convert char(char);
jl x3+2 ; if char<0 or char > 255 then return;
rl w1 x2+i22 ; check count:
sn w1 (x2+i42) ; if charcount=maxcharcount then
jl. e11. ; goto finis;
hs. w0 b9. ; save char;
al w1 x1+1 ; charcount :=
rs w1 x2+i22 ; charcount + 1;
sn w1 (x2+i42) ; if charcount=maxcharcount then
bz w0 x2+i39 ; char := star; (alarmprint)
sh w0 255 ; if char <= 255 then
hs. w0 b9. ; save char;
rl w1 (x2+i16) ; pack char:
al w0 0 ; w0 := 0;
ld w1 8 ; partial word :=
b9=k+1; saved char ; partial word shift 8
al w1 x1+0 ; + saved char;
rs w1 (x2+i16) ;
se w0 1 ; if partial word not full
jl x3+2 ; then return;
rx w0 (x2+i16) ; next word:
rl w1 (x2+i15) ; record base := record base + 2;
al w1 x1+2 ; buffer(record base) := partial word;
rs w0 x1 ; partial word := 1;
rs w1 (x2+i15) ;
am (x2+i15) ;
sl w1 (2) ; if buffer not filled
jl. a10. ; then goto return + 2;
jl x3+2 ;
; next block:
a10: rl w0 x2+i15 ; w0 := zone shift 4;
ls w0 4 ; w1 := outblock;
rl. w1 j18. ; take expression and return directly to
jl. (j16.) ; outchar return;
; constants and variables in convert long integer:
b30: 1<23 ; constant to test for -2**47;
b51: 10 ; ten
b52: 20 ; twenty;
-10 ; pair used in long div:
b53: 1 ; (-10, 1);
\f
; jz 79.01.18. start number conversion; write(seg.2); page 11
e5: bz w3 x2+i10 ; convert integer:
sz w3 2.11 ;
jl. a63. ; if state = no layout then
dl. w0 (j38.) ; begin
ld w1 -24 ;
ds w0 x2+i6 ; layout := unpacked << d>
ds w1 x2+i9 ; end;
dl w1 (x2+i0) ;
a63: al w3 2.11 ; comment it is used here that pnfn
la w3 x2+i6 ; is a right hand byte;
am. (j38.) ;
bz w3 x3+1 ; sign := leading char for
sh w0 -1 ; positive numbers (pefe extract 2);
bz w3 x2+i35 ; if number is negative then
hs w3 x2+i11 ; sign := -;
sn. w0 (b30.) ; a:=number;
se w1 0 ; if a <> -2**47
sl w0 0 ; and a < 0 then
jl. a64. ; a := -a;
ld w1 -100 ; comment beware of overflow
ss w1 (x2+i0) ;
ds w1 (x2+i0) ; number := a;
a64: ld w1 -100 ; zeroes := 0;
ds w1 x2+i13 ; exp10 := 0;
e20: al w0 2.11111 ; start for reals:
la w0 x2+i9 ; max := spaceword extract 5;
wa w0 x2+i22 ;
se w0 (x2+i22) ; if max <> 0 then
rs w0 x2+i42 ; maxcount := max + charcount;
al w0 -64 ;
la w0 x2+i9 ; remaining bits in space word :=
ns w0 3 ; normalized spaces in
ls w0 1 ; bits(0,22,layout) shift 1;
rs w0 x2+i21 ; leading spaces :=
bl w1 3 ; -normalization(spaces in layout);
ac w1 x1 ;
jl. w3 e14. ; outspace(leading spaces);
dl w1 (x2+i0) ;
sn w1 0 ;
se w0 0 ; if number = 0 then
jl. a65. ; begin
bz w3 x2+i6 ; if first letter = b then
so w3 2.1100 ; goto all spaces out(segment 3);
jl. a65. ;
hs w0 x2+i11 ; sign := 0;
rl. w3 (j12.) ;
jl x3+c16 ; end;
a65: al w3 x2-1 ; digit index := sref -1;
\f
; jz 1980.01.08 conv. number: generate digits; write(seg.2); page 12
;long division:
; w0 w1 w3
; a = ( a1 , a2 )
; -- -- 0
; a1 // 10 , -- a1 mod 10
; a3= (a1 mod 10 , -- ) a1 // 10
; a3 mod 20 , a3 // 20 --
; -- 2*(a3//20) --
; if >= 10 then
; a3 mod 10 a3 // 10 --
; ( a//10 ) a mod 10
a66: rs w3 x2+i25 ; long division:
sn w0 0 ; if not long then
jl. a67. ; goto short division;
al w3 0 ; digit := a mod 10;
wd. w0 b51. ;
rx w3 0 ; a := a//10;
wd. w1 b52. ;
ls w1 1 ;
sl w0 10 ; stack (digit index) := digit;
aa. w1 b53. ;
rx w3 0 ; digit index := digit index - 1;
hs w3 (x2+i25) ;
rl w3 x2+i25 ;
al w3 x3-1 ; goto long division;
jl. a66. ;
a67: sn w1 0 ; short division:
jl. a68. ; while a <> 0 do
al w0 0 ; begin
wd. w1 b51. ; stack (digit index) := a mod 10;
hs w0 x3 ; a := a // 10;
al w3 x3-1 ; digit index := digit index - 1;
jl. a67. ; end;
a68: rs w3 x2+i25 ; digit base := digit index;
al w1 x2 ;
wa w1 x2+i12 ; daddr := sref + zeroes - d;
bs w1 x2+i5 ; comment the decimal point is to be
rs w1 x2+i24 ; placed just before daddr;
bs w1 x2+i4 ; haddr := min(daddr-h,
sl w1 x3+1 ; base +1);
al w1 x3+1 ; comment this will yield at least one
rs w1 x2+i14 ; position before the point;
bz w3 x2+i6 ; switch on first letter:
ls w3 -2 ; goto case pn + 1 of
bl. w3 x3+c12. ; ( dandb, f, z, dandb);
c8: jl. x3 ; comment integer zero and b sorted out;
\f
; jz 79.06.20. print digits before the point; write(seg.2); page 13
c9: jl. w3 c21. ; f:
ds. w3 (j13.) ; printsign;
c10: dl w1 x2+i25 ; dandb:
rl w3 x2+i14 ;
sl w3 x1+1 ; if haddr < base + 1 then
jl. c11. ; begin
sl w0 x1+2 ; if daddr < base + 1
jl. a69. ; then
rl w1 0 ; leading := daddr - haddr - 1
al w1 x1-2 ; else
a69: ws w1 6 ; leading := base - haddr + 1;
al w1 x1+1 ; if leading > 0 then
wa w3 2 ; begin
sh w1 0 ; haddr := haddr + leading;
jl. c11. ; outspace as digits(leading);
rs w3 x2+i14 ; end;
jl. w3 e17. ; end;
c11: jl. w3 c21. ; z:
ds. w3 (j13.) ; printsign;
a71: rl w3 x2+i14 ; zout:
sl w3 (x2+i24) ; while haddr < daddr do
jl. a72. ; begin
al w3 x3+1 ; haddr := haddr + 1;
rs w3 x2+i14 ; digit := stack(haddr-1);
bz w1 x3-1 ;
am (x2+i25) ; if haddr <= base
sl w3 +2 ; or haddr > last digit
sl w3 x2+1 ; then
al w1 0 ; digit := 0;
jl. w3 e9. ; outdigit(digit);
jl. a71. ; end;
\f
; jz 79.01.18. print digits after the point; write(seg.2); page 14
a72: bz w3 x2+i5 ; if d <> 0 then
sn w3 0 ; begin
jl. a44. ;
bz w0 x2+i36 ; outchar(decimal point);
jl. w3 e15. ;
ds. w3 (j13.) ;
a73: rl w3 x2+i14 ; while haddr < sref do
sl w3 x2 ; begin
jl. a43. ;
bz w1 x3 ; digit := stack(haddr);
sh w3 (x2+i25) ; if haddr <= digit base then
al w1 0 ; digit := 0;
al w3 x3+1 ;
rs w3 x2+i14 ; haddr := haddr + 1;
jl. w3 e9. ; outdigit(digit);
jl. a73. ; end;
a43: rl w1 x2+i12 ;
ac w3 x2 ; zeroes := if daddr > sref
wa w3 x2+i24 ; then zeroes
sl w3 1 ; else zeroes - daddr + sref;
ws w1 6 ; if zeroes > 1 then
sl w1 1 ; outspace as digits(zeroes);
jl. w3 e17. ; end;
a44: bz w1 x2+i7 ; if s <> 0
lo w1 x2+i13 ; or exp10 <> 0 then
rl. w3 (j12.) ; goto print exp
se w1 0 ; on segment 3
jl x3+e10 ; else end number:
\f
; jz 79.01.30. write(seg.2); page 15
e21:
c14: bz w0 x2+i6 ; end number:
ls w0 -2 ;
se w0 1 ; if pn <> 1 <* f *> then
jl. c24. ; goto print ending sign;
rl w1 x2+i42 ; fill:
ws w1 x2+i22 ; count :=
al w1 x1-2 ; maxcount - charcount - 2;
jl. w3 e22. ; outspace(count,ending space);
c24: jl. w3 c22. ; print ending sign:
ds. w3 (j13.) ; printsign1;
e11: rl. w3 (j11.) ; finis:
jl x3+e1 ; goto take formal on segment 1;
c21: rl w0 x2+i9 ; print sign:
sz w0 1<5 ; if front sign not wanted
jl x3+2 ; then return;
c22: bz w0 x2+i11 ; printsign1:
sn w0 0 ; if sign = 0 then
jl x3+2 ; return;
al w1 0 ; char := sign;
hs w1 x2+i11 ; sign := 0;
jl. e15. ; goto outchar;
h. ; switch on first letter pn:
c12: c10-c8, c9-c8 ; d, f,
c11-c8, c10-c8 ; z, b;
w.
g9: c. g9-506
m. segment 2: code too long
z.
m. segment 2
c. 502 - g9, 0, r. 252 - g9 > 1
z.
<:write:>, 0, 0 ; alarm text
\f
; jz.fgs 1981.06.09. conv. real: const. and variables; write(seg.3); page 16
k=0
h.
g6: g16, g16; rel. last point, rel. last abs word
j14: -1, 0; seg. 2 addr
j39: 0, 12; own core: sign table(0:3);
j15: g1+30, 0; rs entry 30, save sref
g16=k-2-g6
1024, 0;
b25: 0, 0; 0.5
1024, 0;
b17: 0, 1; 1
1280, 0;
b24: 0, 4; 10**(2**0)
1600, 0;
0, 7; 10**(2**1)
1250, 0;
0, 14; 10**(2**2)
1525, 3600;
0, 27; 10**(2**3)
1136, 3556;
3576, 54; 10**(2**4)
1262, 726;
3393, 107; 10**(2**5)
1555, 3087;
2640, 213; 10**(2**6)
1181, 3363;
3660, 426; 10**(2**7)
1363, 3957 ;
4061, 851 ; 10**(2**8)
1816, 3280 ;
b20: 1397, 1701 ; 10**(2**9)
b21=b24+44
b18=b24+88
b14: 0, 9, 99, 999 ; exp limits
w.
b16: 0; new zeroes
b15: 0; exp10 and also nlim
b19: -1233; -l=-entier(log 2*2**12)
0;
b3: 0; real
e6: ds. w1 b3. ; convert real: save real;
bz w3 x2+i10 ;
sz w3 2.11 ;
jl. a40. ; if state = no layout then
dl. w1 b40. ;
ds w1 x2+i6 ; layout :=
dl. w1 b41. ; << -dd.dddd>;
ds w1 x2+i9 ;
rl. w0 b3.-2 ; comment it is now used that
a40:al w3 2.11 ; pnfn is a right hand byte;
la w3 x2+i6 ;
am. (j39.) ;
bz w3 x3 ; sign := leading char for positive
sh w0 -1 ; numbers(pefe extract 2);
bz w3 x2+i35 ; sign := negative sign;
hs w3 x2+i11 ; sign := <minus>;
\f
; rc 75.11.04. real to number, exp10, and zeroes; write(seg.3); page 17
sn w0 0 ; if number = 0 then
jl. e3. ; goto real zero;
bl w1 x2+i7 ; w1:=s;
bl. w1 x1+b14. ; w1:=10**s;
al w3 1 ;
bs w3 x2+i3 ;
sh w3 -12 ; w3 := 1 +
al w3 -11 ; if b <= 12
ba w3 x2+i5 ; then d + h - b
ba w3 x2+i4 ; else d + h - 12;
al w0 0 ; w0:=0;
ds. w0 b15. ; nlim:=0; new zeroes:=zeroes+1;
al w3 x1 ; w3:=10**s;
wd. w1 b16. ; w0:=(10**s)mod new zeroes
ws w0 6 ; -10**s+1
bs w0 x2+i5 ; -d;
hs. w0 b15. ; nlim:=w0;
bl w0 x2+i3 ; w0:=
sl w0 13 ; if b<=12 then b
al w0 12 ; else 12
dl. w3 b17. ; w23:=1;
al w1 -1 ; w01:=first sig. bit of b;
ns w0 3 ; w1:=bit no.:=no.sig.bits-23;
as w1 2 ; w1:=4*bit no.;
a27:ls w0 1 ; shift bits:
sh w0 -1 ; if bit=1
fm. w3 x1+b18. ; then w23:=w23*10**(2**(bit no.+22));
al w1 x1-4 ; bit no.:=bit no.-1;
sl w1 -88 ; if bit no.>=-22
jl. a27. ; then goto shift bits;
; comment: w23=10**b;
dl. w1 b3. ; w01:=real;
ds. w3 b3. ; number:=10**b;
bl w3 7 ;
bs w3 3 ; w3:=(newexp-exp-2)
al w3 x3-2 ; *(-l)*2**12;
wm. w3 b19. ; comment: 0<(log2-l)<0.000005;
sh. w3 (b15.) ;
rl. w3 b15. ; w3:=max(w3, nlim*2**12);
rs. w3 b15. ; nlim:=entier(max((exp-newexp+2)*l, nlim));
al w2 -1 ; w3(1):=first sig. bit of n;
ns w3 5 ; w2:=bit no.:=no.of sig.bits-11;
as w2 2 ; w2:=4*bit no.;
sh w3 -1 ; if n<0
jl. a28. ; then goto multiply;
sh w2 -48 ;
al w2 -44 ; bit no.:=max(bit no., -11);
sh w2 -8 ; if bit no.>-2
jl. a29. ; then begin
fd. w1 b20. ; w01:=w01/10**(2**9);
am -4 ; end;
a29:fd. w1 x2+b21. ; w01:=w01/10**(2**(bit no.+11));
\f
; rc 79.03.06. real to number, exp10, and zeroes; write(seg.3); page 18
a28:al w2 x2-4 ; multiply: bit no.:bit no.-1;
sh w2 -48 ; if bit no.=-12
jl. a30. ; then goto next;
ls w3 1 ; w3(0):=next bit;
sl w3 0 ; if bit=0
fm. w1 x2+b21. ; then w01:=w01*10**(2**(bit no.+11));
jl. a28. ; goto multiply; wo1=real*10**(2**(-n-1));
a30:sl w0 0 ; next: if w01<0
jl. a31. ; then
ld w3 50 ; begin
fs w3 2 ; w23:=0;
ds w3 2 ; w01:=-w01 end;
a31:dl. w3 (j15.) ; w2:=sref;
bl. w3 b15. ; w3:=n;
ba w3 x2+i5 ; w3:=n+d;
hs. w3 b15. ; n:=n+d;
dl. w3 b3. ; w23:=number;
ds. w1 b3. ; digits:=w01;
fm. w1 b24. ; w01:=10*digits;
fa. w1 b25. ; w01:=10*digits+0.5;
fs w3 2 ; w23:=digits-10*digits-0.5;
bl. w3 b15. ; w3:=n;
sl w2 1 ; if 10*digits>=number
jl. a32. ; then
dl. w1 b3. ; begin
fa. w1 b25. ; w01:=digits+0.5;
al w3 x3+1 ; n:=n+1; end;
hs. w3 b15. ;
a32:bl w2 6 ; extend sign of w3 to w2
bl w2 4 ;
wd. w3 b16. ; w2:=n mod new zeroes;
sh w2 -1 ; if w2 < 0 then
wa. w2 b16. ; w2:=w2+new zeroes;
bl. w3 b15. ; w3:=n;
ws w3 4 ; w3:=exp10:=n-k;
rs. w3 b15. ;
bl w3 3 ; w3:=exp2;
sh w3 0 ; if w01<=1
jl. e3. ; then goto real zero ;
rs. w2 b16. ; new zeroes:=w2;
ad w1 x3-47 ; w0:=last 6 digits;
a34:dl. w3 ( j15.) ; end conversion:
rl w3 x2+i17 ; reestablish w2
ds w1 x3 ; last formal := number;
rs w3 x2+i0 ; param addr := last formal;
dl. w1 b15. ; following zeroes := new zeroes;
ds w1 x2+i13 ; exp10(stack := exp10(this segment);
rl. w3 ( j14.) ; goto start for reals
jl x3+e20 ; on segment 2;
e3: ld w1 -100 ; real zero:
ds. w1 b15. ; exp10 := new zeroes := 0;
jl. a34. ; number := 0;
; goto end conversion;
\f
; jz 1979.01.30 print the exponent part; write(seg.3); page 19
e10:rl w0 x2+i13 ; print exp:
bz w1 x2+i8 ;
sn w0 0 ; if exp10 = 0
sz w1 2.1000 ; and first letter <> z then
jl. a3. ; begin comment b cannot occur;
al w1 0 ; spaces := 0;
jl. c13. ; goto exp as space;
a3: la. w1 b43. ; sign := signswitch(fe);
am. (j39.) ;
bz w1 x1 ;
sl w0 0 ; if exp10 < 0 then
jl. a4. ; begin
ac w0 ( 0) ; exp10 := -exp10;
rs w0 x2+i13 ; sign := <minus>;
bz w1 x2+i35 ; end;
a4: hs w1 x2+i41 ; store sign for later use;
bz w0 x2+i37 ; char := exponent mark;
rl. w3 ( j14.) ;
jl w3 x3+e15 ; outchar ( char);
ds. w3 ( j15.) ;
rl w0 x2+i13 ; news := s;
bz w1 x2+i7 ;
a14:rs w1 x2+i12 ;
bz. w3 x1+b44. ; while 10**news <= exp10 do
al w1 x1+1 ; news := news + 1;
sl w0 x3 ;
jl. a14. ;
bz w3 x2+i8 ; comment notice please that first letter
ls w3 -2 ; b cannot occur legally;
bz. w3 x3+b45. ; goto case pe+1 of
a15:jl. x3 ; (d, f, z, z);
a45:bz w0 x2+i41 ; f:
rl. w3 ( j14.) ;
se w0 0 ; if sign <> 0 then
jl w3 x3+e15 ; outchar(sign);
ds. w3 ( j15.) ; sign := 0;
al w0 0 ; comment continue as for d;
hs w0 x2+i41 ;
a46:dl w0 x2+i13 ; d:
bz. w1 x3+b46. ; comment notice please news >= 1 always;
sl w0 x1 ; while exp10 < 10**(news-1) do
jl. a47. ; begin
al w3 x3-1 ;
rs w3 x2+i12 ; news := news - 1;
rl. w3 ( j14.) ;
bz w0 x2+i32 ; outchar(leading space);
jl w3 x3+e15 ;
ds. w3 ( j15.) ; end;
jl. a46. ; comment continue as z;
\f
; jz 79.01.30. print the exponent part; write(seg.3); page 20
a47:bz w0 x2+i41 ; z: char := sign;
a42:rl. w3 ( j14.) ; rep:
se w0 0 ; if char <> 0 then
jl w3 x3+e15 ; outchar(char);
ds. w3 ( j15.) ;
dl w1 x2+i13 ;
sn w0 0 ; if news = 0 then
jl. a48. ; goto finito;
bs. w0 1 ; news := news - 1;
rs w0 x2+i12 ;
am ( 0) ;
bz. w3 +b44. ; divisor := 10 ** news;
al w0 0 ;
wd w1 6 ; number := number mod divisor;
rs w0 x2+i13 ;
al w0 x1+48 ; char := number // divisor + 48;
jl. a42. ; goto rep;
a48:rl. w3 ( j14.) ; finito:
jl x3+e21 ; goto end number on segm 2;
\f
; jz 1979.03.06 write(seg.3); page 20a
c16: bz w1 x2+i4 ; spaces :=
ba w1 x2+i5 ; h+d;
bz w0 x2+i5 ; spaces := spaces +
se w0 0 ; (if d <> 0 then
al w1 x1+1 ; 1 else 0) +
bz w3 x2+i6 ;
sz w3 2.11 ; (if fn <> 0 then
al w1 x1+1 ; 1 else 0 );
c13: bz w3 x2+i7 ; exp as space:
se w3 0 ; spaces := spaces +
am x3+1 ; (if s <> 0 then
al w1 x1 ; s + 1 else 0) +
bz w3 x2+i8 ;
sz w3 2.11 ; (if fe <> 0 then
al w1 x1+1 ; 1 else 0);
rl. w3 (j14.) ;
jl x3+e26 ; goto outspaces(segment 2);
; standard real layout:
6<12 + 2 ; b=6, h=2,
b40: 4<12 + 1 ; d=4, pnfn=1,
0<12 + 0 ; s=0, pefe=0,
b41: 2.11 < 22 ; one leading space;
b43: 2.11 ; mask: last two bits;
h.
b44: 1, 10, 100, 1000; list of powers of ten;
; switch on first letter pe:
b45: a46-a15, a45-a15 ; d, f,
a47-a15, a47-a15 ; z, b handled as z;
b46 = b44 - 1 ; powers-1 of ten;
w.
g12:
c. g12 - 506
m. segment 3: code too long
z.
m. segment 3
c. 502 - g12, 0, r. 252 - g12 > 1
z.
<:write:>, 0, 0 ; alarm text;
m. jz 80.01.09 algol8, write and writeint
\f
; jz 80.01.07 prodedures outchar, -text, -integer; write(seg.4); page 21
;the three code procedures outchar, outtext, and outinteger
;are stored on 1 segment. the usage of these procedures is found
;in the publication rcsl 31-d72.
;contents:
;label, page, name
; 22 initiate first two parameters of proc
;e2 22 entry outchar
;e3 22 entry outtext
;e4 22 entry outinteger
;e5 23 write into zone(space)
;e6 23 write into zone(char)
;e1 24 outchar
;e8 24 outtext
;e9 26 outinteger
;e10 28 store in stack
; 29 definition of entry points
b.b8,c4,e12,f1,g2,i20,j74; slang block for procedures
k=10000
i6=6,i8=8,i10=10,i12=12,i14=14,i16=16,i18=18,i20=20
h.
g0=0 ; g0=number of externals
e0: g2 , g1 ; rel of point, rel of abs words
;
;abs words:
j3: g0+3 , 0 ; rs entry 3, reserve
j4: g0+4 , 0 ; 4, take expression
j8: g0+8 , 0 ; 8, end address expression
j13: g0+13 , 0 ; 13, last used
j17: g0+17 , 0 ; 17, index alarm
j21: g0+21 , 0 ; 21, general alarm
j29: g0+29 , 0 ; 29, param alarm
j30: g0+30 , 0 ; 30, saved stack ref, saved w3
j41: 0, 6 ; own core: ending space
j42: 0, 3 ; own core: negative sign;
j43: 0, 4 ; own core: decimal point;
j44: 0, 0 ; own core: leading space
j50: 0, e34 ; own core: entry convert char
j51: -4 , 0 ; segment 0 address
g1=k-2-e0 ; end abs words
;points:
j35: g0+35 , 0 ; rs entry 35, outblock
g2=k-2-e0 ; end rel words
w.
;global variables
f0: 0 ; dec for outinteger
f1: 0 ; print for store in stack
\f
; jz 80.01.08. prodedures outchar, -text, -integer; write(seg.4); page 22
;constants and texts
b3=132 ; max number of char per line
b0: 10 ;
b1: 20 ;
-10 ;
b2: 1 ;
b4: 1<16 ; end mark
b5: 1<23 ; bit(0)=1
b7: 255 ; bit(16:23)=ones
;initiate first two parameters of proc(zone,integer,...)
;saves the stack reference and checks the validity of the
;formal parameters for the zone. partial word addr and
;record base addr are stored in the words +i6 and +i8
;of the stack, respectively. the integer parameter is
;evaluated both as an integer and as a result addr.
; entry: exit:
;w0: integer mod 2**24
;w1: result addr.integer
;w2: stack
;w3:
;stack
; +i6: zone param partial word addr
; i8: record base addr
;+i10: integer param unchanged
;+i12: destroyed
b.a1 w.
;c1=e7-e8,c2=e8-e9,c3=e9-e11
e2: am c1 ; entry outchar:
e3: am c2 ; entry outtext:
e4: al w1 c3 ; entry outinteger:
rl. w2 (j13.) ; w2 := last used;
ds. w3 (j30.) ; (saved sref, saved w3) := (w2,return);
rx w1 x2+8 ; swap(proc selector,word 1 of zone param);
rl w0 x1+h2+6 ; state := zone.state;
sn w0 0 ; if state = 0 then
al w0 3 ; state := 3 (after char print);
sn w0 3 ; if state <> 3 then
jl. a1. ;
rl. w3 (j51.) ; call zone state alarm
jl w3 x3+e24 ; on segment 0;
a1: rs w0 x1+h2+6 ; zone.state := state;
al w0 x1+h2+4 ; partial word address :=
rs w0 x2+6 ; zone.partial word address;
rx w1 x2+8 ; swap(proc selector,word 1 of zone param);
rx w1 x2+12 ; swap(proc selector,word 1 of int param);
rl w0 x2+10 ; w0 := word 0 of int param;
so w0 16 ; if expression then
jl. w3 (j4.) ; take expression;
ds. w3 (j30.) ; (saved sref,w3) := (w2,return);
rl w0 x1 ; w0 := value (integer param);
am (x2+12) ; goto
e11: jl. 0 ; procedure.proc selector;
e. ; end initiate first two parameters
\f
; jz 80.01.07 prodedures outchar, -text, -integer; write(seg.4); page 23
;procedure write into zone(char); procedure writechar(char);
;outputs the right-most 8 bits of the character to the zone
;buffer. the block is changed if necessary.
; entry: exit: writeintozone writechar
;w0: char destroyed dstroyed
;w1: unchanged destroyed
;w2: stack ref stack ref stackref
;w3: link destroyed destroyed
;stack
; +i6: partial word addr partial word addr
; +i8: record base addr record base addr
;+i10: destroyed unchanged
;+i12: destroyed unchanged
b.a3 w.
e12: bz. w0 (j44.) ; leading sp:
jl. e6. ; char := leading space else
e5: bz. w0 (j41.) ; char := ending space;
e6: rs w1 x2+i10 ; save w1
ac. w1 e0. ; relative return:=
wa w1 6 ; link - segment start
rs w1 x2+i12 ;
jl. w1 (j50.) ; char := convert char(char);
jl. a3. ; if char > 255 then goto finis;
rl w1 (x2+i6) ; pack char:
hs. w0 b8. ; save char;
al w0 0 ;
ld w1 8 ; partial word :=
b8 = k + 1 ; saved char
al w1 x1+0 ; partial word shift 8
rs w1 (x2+i6) ; + saved char;
se w0 1 ; if partial word not full
jl. a3. ; then return;
rx w0 (x2+i6) ; next word:
rl w1 (x2+i8) ; record base := record base + 2;
al w1 x1+2 ;
rs w1 (x2+i8) ; buffer(record base) := partial word;
rs w0 x1 ; partial word := 1;
am (x2+i8) ; check block change:
sl w1 (2) ; if buffer filled
jl. a2. ; then goto output buffer
jl. a3. ; else goto finis
a2: rl w0 x2+i8 ; output buffer:
ls w0 4 ; w0:=zone shift 4
rl. w1 j35. ; w1:=outblock
jl. w3 (j4.) ; take expression;
a3: rl w3 x2+i8 ; finis:
al w0 0 ; zone.record length := 0;
rs w0 x3+h3+4 ;
rl w1 x2+i10 ; restore w1;
am (x2+i12) ;
jl. e0. ; return;
e. ; end write into zone;
\f
; jz 79.08.15 prodedures outchar, -text, -integer; write(seg.4); page 24
;code procedure outchar(z,i); zone z; integer i;
; entry: usage:
;w0: integer mod 2**24
;w1: result addr.integer
;w2: stack
; +i6: partial word addr partial word addr
; +i8: record base addr record base addr
;+i10: formal i for write into zone
;+i12: undefined for write into zone
b.w.
e1: la. w0 b7. ; i := i extract 8;
jl. w3 e6. ; write into zone(i);
jl. (j8.) ; end address expression;
e. ; end outchar
;code procedure outtext(z,pos,ra,i)
; zone z; integer pos,i; real array ra;
; entry: usage:
;w0: integer mod 2**24
;w1: result addr.integer
;w2: stack
; +i6: partial word addr partial word addr
; +i8: record base addr record base addr
;+i10: formal pos pos, for write into zone
;+i12: undefined for write into zone
;+i14: formal ra last addr of ra
;+i16: current addr of ra
;+i18: formal i current value of pos
;+i20: upper index
b. a7 w.
e8: rs w0 x2+i10 ; begin
dl w1 x2+i20 ; take i parameter:
so w0 16 ; if expression then
jl. w3 (j4.) ; take expression;
ds. w3 (j30.) ; saved stack ref:= w2;
rl w1 x1 ; index:= i;
rl w3 x2+i16 ; take ra parameter:
ba w3 x2+i14 ; dope addr:= base addr+dope rel;
ls w1 2 ; index:= index*4;
sh w1 (x3-2) ; if index>upper
sh w1 (x3) ; or index<lower
a1: jl. w3 (j17.) ; then begin
; index error: index alarm(alarm)
; end;
wa w1 (x2+i16) ;
al w1 x1-2 ; cur word addr:= index+base addr-2;
rl w0 x3-2 ;
rs w0 x2+i20 ;
wa w0 (x2+i16) ; upper addr:= upper+base addr;
ds w1 x2+i16 ;
\f
; jz 79.08.16 prodedures outchar, -text, -integer; write(seg.4); page 25
rl w1 x2+i10 ;
sn w1 0 ; if pos=0 then
jl. (j8.) ; end address expression;
al w0 10 ;
sh w1 -1 ; if pos <0 then
jl. w3 e6. ; write into zone(nl);
sl w1 1 ; if pos >=0 then
ac w1 x1 ; pos:= -pos;
sh w1 -b3-1 ; if pos <-max number then
al w1 -b3 ; pos:= -max number;
rs w1 x2+i18 ;
a2: rl w1 (x2+i16) ; next word:
ld w1 8 ; word:= word shift 8
al w1 x1+1 ; + endmark;
jl. a4. ; goto test;
a3: ld w1 8 ; next char: word := word shift 8;
a4: la. w0 b7. ; char := next char extract 8;
sn w0 0 ;
jl. a6. ; goto spaces;
a5: jl. w3 e6. ; write into zone(char);
rl w3 x2+i18 ;
al w3 x3+1 ; pos:= pos+1;
sn w3 0 ; if pos=0 then
jl. (j8.) ; end address expression;
rs w3 x2+i18 ;
se. w1 (b4.) ; if not end mark then
jl. a3. ; goto next char;
rl w3 x2+i16 ;
al w3 x3+2 ; cur word addr:= cur word addr+2;
rs w3 x2+i16 ; if cur word addr
sh w3 (x2+i14) ; <=last addr then
jl. a2. ; goto next word;
rl w1 x2+i20 ; index:= upper;
jl. a1. ; goto index error;
a6: ; spaces:
rl w1 x2+i18 ; char:= ending space;
a7: jl. w3 e5. ; next space:
al w1 x1+1 ; write into z(space);
se w1 0 ; pos:= pos+1;
jl. a7. ; goto if pos >0
jl. (j8.) ; then next space
; else end address expression;
e. ; end outtext
\f
; jz 1979.08.16 prodedures outchar, -text, -integer write(seg.4); page 26
;code procedure outinteger(z,pos,dec,i);
;value i; zone z; integer pos, dec,i;
; entry: usage:
;w0: pos
;w1: result addr.pos
;w2: stack
;w3:
;stack
; +i6: partial word addr partial word addr
; +i8: record base addr record base addr
;+i10: formal pos pos.for write into zone
;+i12: undefined for write into zone
;+i14: formal dec dec
;+i16: print
;+i18: formal i i
;+i20:
b. a11 w.
e9: rs w0 x2+i10 ; begin
dl w1 x2+i16 ; take dec parameter:
so w0 16 ; if expression then
jl. w3 (j4.) ; take expression;
ds. w3 (j30.) ; saved stack ref:= w2;
rl w1 x1 ;
sh w1 15 ;
sh w1 -1 ; if dec>15 or dec<0
jl. w3 (j29.) ; then param alarm;
sn w1 0 ; if dec=0
al w1 -1 ; then dec:=-1
rs w1 x2+i14 ;
al w1 -18 ; reserve buffer:
jl. w3 (j3.) ; reserve 18 bytes in stack;
al w0 2.1111 ; take i parameter:
la w0 x2+i20-2 ; type := formal(0) extract 4;
se w0 10 ; if type <> 10 <*integer *>
sn w0 12 ; and type <> 12 <* long *>
jl. a4. ; then
jl. w3 (j29.) ; param alarm;
a4: dl w1 x2+i20 ; (w0,w1) := formal;
so w0 16 ; if expression then
jl. w3 (j4.) ; take expression;
ds. w3 (j30.) ; saved stack ref:=w2;
dl w1 x1 ;
rl w3 x2+i18 ;
sz w3 4 ; if kind=integer then
jl. a0. ; convert i to long;
sh w1 -1 ;
am -1 ;
al w0 0 ;
a0: rs. w2 f1. ; print:= stack ref;
ds w1 x2+i20 ;
\f
; jz 79.08.16 prodedures outchar, -text, -integer write(seg.4); page 27
rl w3 x2+i10 ;
sn w1 0 ; if i=0 and pos<0
se w0 0 ; then goto determine spaces;
jl. a1. ;
sh w3 -1 ;
jl. a10. ;
a1: sn. w0 (b5.) ; if i<0 and i<>-2**47
se w1 0 ; then i:= -i;
sl w0 0 ; comment avoid, integer overflow;
jl. a2. ;
ld w1 -100 ;
ss w1 x2+i20 ;
a2: al w3 x2 ;
ws w3 x2+i14 ;
rs. w3 f0. ; dec:= stack ref - dec;
al w3 0 ;
;calculate the digits corresponding to positive i.
;long division of a long integer a is performed as follows
; w0 w1 w3
; a= ( a1 , a2 )
; -- -- 0
; a1//10 -- a1 mod 10
; a3=(a1 mod 10, -- ) a1//10
; a3 mod 20 a3//20 --
; -- 2*(a3//20) --
; if >= 10 then
; a3 mod 10 a3//10 --
; ( a//10 ) a mod 10
a3: wd. w0 b0. ; long division:
rx w3 0 ;
wd. w1 b1. ; digit:= i mod 10; i:= i//10;
ls w1 1 ;
sl w0 10 ; store in stack (digit);
aa. w1 b2. ;
rx w3 0 ;
jl. w2 e10. ; <* at return: w3=0 *>
rl. w2 f1. ;
al w2 x2+1 ;
sn w0 0 ;
se w1 0 ; if i <> 0 then
jl. a3. ; goto long division;
sl. w2 (f0.) ; if print+1 >= dec then
jl. a3. ; goto long division;
dl. w2 (j30.) ; sign:
sh w0 (x1+i18) ; if i<0 then
jl. a6. ; begin
bz. w3 (j42.) ; char := negative sign;
jl. w2 c4. ; stack sign(char);
a6: al w2 x1 ; end;
\f
; jz 79.01.18. prodedures outchar, -text, -integer; write(seg.4); page 28
a10: rl. w1 f1. ; determine spaces:
rs w1 x2+i16 ;
rl w1 x2+i10 ;
sl w1 1 ; if pos>0 then
ac w1 x1 ; pos:= -pos;
sh w1 -b3-1 ; if pos <=132 then
al w1 -b3 ; pos:= -132;
wa w1 4 ; pos:= pos+stack ref;
sl w1 (x2+i16) ; if pos>=print then
jl. a11. ; goto unbuffer stack;
a7: ; spaces:
jl. w3 e12. ; write into zone(leading space);
al w1 x1+1 ; pos:= pos+1;
se w1 (x2+i16) ; if pos<>print then
jl. a7. ; goto spaces;
a11: rl w1 x2+i16 ; unbuffer stack:
a8: sn w1 x2 ; move stack:
jl. a9. ; if print=stack ref then
bz w0 x1 ; goto finish;
jl. w3 e6. ; write into zone(stack buf(print));
al w1 x1+1 ; print:= print+1;
jl. a8. ; goto move stack;
; finish:
a9: rs. w2 (j13.) ; last used:= stack ref;
jl. (j8.) ; end address expression;
;procedure store in stack(digit);
;converts the digit to the corresponding iso-character and
;stores it in the halfword stack(print). furthermore, the
;procedure inserts the decimal point as defined by dec.
; entry: exit:
;w0: unchanged
;w1: unchanged
;w2: link link
;w3: digit 0
;st(f1):print print
b. a0 w.
e10: al w3 x3+48 ; stack char:
c4: rx. w2 f1. ; stack sign:
a0: al w2 x2-1 ; stack char1: print:=print-1;
hs w3 x2 ; char:= digit+48;
bz. w3 (j43.) ; stack(print) := char;
sn. w2 (f0.) ; if print=dec then
jl. a0. ; begin
al w3 0 ; char:= decimal point;
rx. w2 f1. ; goto stack char;
jl x2 ; end;
; return;
e. ; end store in stack
e. ; end outinteger
\f
; jz 80.01.09. definition of entry points; write(seg.4); page 29
e7:
c. e7-e0-506
m. code on segment 4 too long
z.
m. segment 4
c. 502-e7+e0,-1,r. 252-(:e7-e0:)>1
; fill the rest of the segment with -1
z.
<:outchar <0>:> ; alarm text
c1=e1-e8,c2=e8-e9,c3=e9-e11
d4=e2-e0 ; entry point outchar
d5=e3-e0 ; entry point outtext
d6=e4-e0 ; entry point outinteger
m. jz 80.01.08 algol8, outchar, outtext and outinteger
i.
e. ; end block for outchar outtext outinteger
d0=e18 ; entry point writeint
d3=f3 ; entry point write
d2=f2 ; external list
d11=e27 ; entry point: replace char
d12=e28 ; no of owns
d13=e33 ; outindex (rel addr in own core)
d14=e35 ; entry point: outtable
d15=e7 ; entry point: isotable
i.
e. ; end slang segments
\f
; jz 80.01.07 tails for catalog write(seg. ); page 30
;tails to be inserted in catalog
;write
g0:
5 ; 5 segments
0,0,0,0 ; room for name
1<23 + d3 + 1<12 ; entry point
3<18+40<12+8<6 ; integer proc ( zone, gen. addr.)
0 ;
4<12 + d2 ; code proc, ext list
5<12 +d12 ; 5 segments , owns
; writeint
1<23 + 4 ; modekind = backing store;
0, 0, 0, 0 ; room for name;
1<23 + d0 + 1<12 ; entry point on first segment;
3<18+40<12+8<6, 0 ; integer procedure(zone, general address);
4<12 + d2 ; code procedure, ext list;
5<12 +d12 ; 5 segments , owns
;outchar
1<23+4 ; modekind=backing store
0,0,0,0 ; fill for name
1<23+4<12+d4 ; entry point
1<18+3<12+8<6 ; no type proc(integer,zone)
0 ;
4<12+d2 ; code proc, ext list
5<12 +d12 ; 5 code segments , owns
;outtext
1<23+4 ; modekind=backing store
0,0,0,0 ; fill for name
1<23+4<12+d5 ; entry point
1<18+3<12+26<6+3 ; no type proc(integer, real array,
8<18 ; integer, zone)
4<12+d2 ; code proc, ext list
5<12 +d12 ; 5 code segments , owns
;outinteger
1<23+4 ; modekind=backing store
0,0,0,0 ; fill for name
1<23+4<12+d6 ; entry point
1<18+41<12+3<6+3 ; no type proc(general,integer,
8<18 ; integer,zone)
4<12+d2 ; code proc, ext list
5<12 +d12 ; 5 code segments , owns
\f
; jz.fgs 1981.06.09 tails for insertp. (1) page 31
; replace char:
1<23+4 ; modekind = backing store
0,0,0,0 ; fill for name
1<23 + d11 ; entry point (segment 0)
3<18+19<12+19< 6,0; integer procedure replacechar(intaddr,intaddr);
4<12 + d2 ; code proc , start ext list
5<12 +d12 ; 5 code segments , owns
; outindex:
1<23 + 4 ; modekind = backing store
0,0,0,0 ; fill for doc name
d13 ; rel address in own core
9<18 , 0 ; integer variable
4<12 + d2 ; code proc, start ext list
5<12 + d12 ; 5 code segments + owns
; outtable:
1<23 + 4 ; modekind = backing store
0,0,0,0 ; fill for docname
1<23+0<12+d14 ; entry point(segment 0)
1<18 + 41<12 , 0 ; procedure(undef)
4<12 + d2 ; code proc , start ext list
5<12 + d12 ; 5 code segments + owns
; isotable:
g1: 1<23 + 4 ; modekind = backing store
0,0,0,0 ; fill for doc name
1<23 +0<12 +d15 ; entry point(segment 0)
1<18 +25<12 , 0 ; procedure(integer array)
4<12 + d2 ; code proc , start ext list
5<12 + d12 ; 5 code segments + owns
; use of own core initialized to
; 0 leading space space (=32)
; 1 space in number space (=32)
; 2 positive sign + (=43)
; 3 negative sign - (=45)
; 4 decimal point . (=46)
; 5 exponent mark ' (=39)
; 6 ending space space (=32)
; 7 termination star * (=42)
; 8 integer layout: b 1
; 9 integer layout: h 1
; 10 integer layout: spaceword(0:11) 2.11<10
; 11 integer layout: spaceword(12:23) 0
; 12 signtable(0) null (= 0)
; 13 signtable(1) space (=32)
; 14 signtable(2) + (=43)
; 15 signtable(3) null (= 0)
m. jz 81.06.23 algol8, write, writeint, outchar, outtext,
m. outinteger, replacechar, outindex, isotable, outtable
d.
p. <:insertproc:>
▶EOF◀