|
|
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: 21504 (0x5400)
Types: TextFile
Names: »translat4tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »translat4tx «
; fgs 1988.09.16 translated page ...1...
;b. ; dummy outer block for fpnames;
d.
p.<:fpnames:>
l.
b. g3 ; block for insertproc;
w.
d.
p.<:fpnames:>
l.
k=h55
s. a30, b30, c30, d30, e30
w.
; a-names: alarm
; b-names. labels in program
; c-names: texts for alarm
; d-names: constants and texts
; e-names: work loc
e0 : 0 ; addr of sep in front of next param
e1 : 0 ; addr of sep in front of program name
e2 : 0 ; error text addr
e3 : 0 ; addr compiler name
e4 : 0 ; addr of date
e5 : 0 ; work loc
e6 : 0 ; work loc
e7 : 0, r.10 ; lookup area no. 1
e8 : 0, r.10 ; lookup area no. 2
e9 : 0, 0 ; saved shortclock
e10: 0, r.4 ; saved name
e11: 0 ; spec. out zone
\f
; fgs 1988.10.04 translated page ...2...
g3: jl. w1 b20. ; init program;
jl. w3 b28. ; if left side then connect output;
b7: rs. w1 e11. ; save output zone address;
al. w1 h19. ; w1:=addr(cur prog zone);
jl. w3 h79. ; terminate zone;
am +2000 ;
al. w3 c27. ; first shared(cur prog zone):=
rs. w3 h80.+2 ; addr of buffer start;
al w3 x3-1 ; base buf(cur prog zone):=
rs w3 x1+h0 ; first of buffer-1;
al w3 x3+512 ; last buf(cur prog zone):=
rs w3 x1+h0+2; base buf+512;
b0: al. w1 h19. ; paramloop:
jl. w3 h79. ; terminate cur prog zone;
rl. w1 e0. ;
bl w2 x1 ;
sh w2 3 ; if endparam then
jl. b4. ; goto exit;
bl w2 x1+1 ;
wa w1 4 ;
rs. w1 e0. ; update param pointer;
se w2 10 ; if param<>text then
jl. a2. ; alarm (param);
rl. w3 e0. ;
al. w1 e7. ;
al w3 x3-8 ;
jd 1<11+42; lookup param;
se w0 0 ; if not found then
jl. a4. ; alarm (unknown);
rl. w1 e7. ; lookup area no. 2.size :=
rs. w1 e8. ; entry.size;
bl. w1 e7.+16 ;
sl w1 2 ; if entry.contents < 2
sl w1 4 ; or entry.contents > 3 then
jl. a5. ; alarm (not program);
\f
; fgs 1988.09.16 translated page ...3...
rl. w1 e7. ;
sl w1 0 ; if entry.size < 0 then
jl. a7. ; begin <*bs entry*>
al. w1 e8. ;
al. w3 e7.+2 ;
jd 1<11+42; lookup (entry.docname, lookup area no. 2);
se w0 0 ; if not found then
jl. a4. ; alarm (not found);
a7: rl. w1 e0. ; end <*bs entry*>;
al w2 x1-8 ;
al. w1 h19. ; zone := spec. out zone;
jl. w3 h27. ; connect (curr prog, entry);
se w0 0 ; if not connected then
jl. a3. ; alarm (error);
zl. w1 e7.+17 ;
se w1 0 ; if entry.entry point = 0 then
jl. a8. ; begin <*pascal*>
al. w0 d9. ; compiler addr :=
rs. w0 e3. ; addr <:pascal:>;
rl. w0 e7.+18 ; rel addr := entry.load length;
sl w0 4 ; if rel addr < 4
sl w0 510 ; or rel addr > 510 then
jl. b10. ; goto take shortclock;
rl. w2 h19.+h0; addr first :=
al w2 x2+6 ; addr first + 6;
jl. a11. ; goto print;
; end <*pascal*> else
a8: rl. w1 e7.+12 ;
se w1 0 ; if entry.file count = 0 then
jl. a9. ; begin <*slang*>
al. w0 d8. ; addr compiler name :=
rs. w0 e3. ; addr <:slang:>;
jl. a11. ; goto print;
; end <*slang*>;
a9: zl. w0 e7.+13 ; rel addr := entry.word7.rel;
el. w1 e7.+12 ; segm := entry.word7.segm;
\f
; fgs 1988.09.16 translated page ...4...
sl w1 6 ; if segm >= 6 and
sl w1 12 ; segm < 12 then
jl. a12. ; begin <*program descriptor vector*>
wa. w1 e7.+14 ; curr prog.segm count :=
am. h19. ; segm +
rs w1 h1+16 ; entry.block count ;
al. w1 h19. ; zone := spec. out zone;
jl. w3 h22. ; inblock;
rl. w2 h19.+h0; addr first := curr prog.base buffer area;
am (0) ; modeword2 :=
rl w1 x2+3 ; prog descriptor vector.modeword2;
ls w1 -5 ; addr compiler :=
al. w3 d7. ; if modeword shift (-5) = 1 then
sz w1 1 ; addr <:fortran:>
al. w3 d6. ; else
rs. w3 e3. ; addr <:algol:>;
am (0) ; segm :=
zl w1 x2+19 ; prog descr vect.entry point.segm;
am (0) ; rel addr :=
zl w0 x2+20 ; prog descr vect.entry point.rel ;
sl w1 12 ; if segm < 12
sl. w1 (e8.) ; or segm >= lookup area no. 2.size then
jl. b10. ; goto take shortclock;
jl. a10. ; goto print0;
; end <*program descriptor vector*>;
a12: sh w1 11 ; if segm >= 12 then
jl. a13. ; begin <*entry point to main program*>
sl. w1 (e8.) ; if segm >= lookup area no. 2.size then
jl. b10. ; goto take shortclock;
al. w3 d12. ; addr compiler :=
rs. w3 e3. ; addr <:algol/fortran:>;
rl. w2 h19.+h0; addr.first := curr prog.base buffer area;
jl. a10. ; goto print0;
; end <*entry point to main program*>;
\f
; fgs 1988.09.16 translated page ...5...
a13: al. w1 h19. ; <*search program entry point in rts segment 0*>
jl. w3 h22. ; inblock (curr prog, segm 0);
rl. w2 h19.+h0; addr first := curr prog.base buffer area;
rl w1 x2+1 ; first := (addr first);
se w1 4 ; if first = 4
sn w1 0 ; or first = 0 then
jl. b6. ; goto ok
jl. a5. ; else
; alarm (not program);
;
b6: al. w1 d12. ; ok:
rs. w1 e3. ; addr compiler := addr <:algol/fortran:>;
al w1 -1 ;
b1: al w1 x1+2 ; loop: if(0,-8388698,511) not found
sl w1 451 ; among words (0:450) then
jl. b10. ; goto take shortclock;
am x2 ; word :=
rl w3 x1 ; cont (first);
se w3 0 ; if word<>0 then
jl. b1. ; goto loop;
am x2 ; word :=
rl w3 x1+2 ; cont (first + 2);
se. w3 (d1.) ; if word<>-8388608 then
jl. b1. ; goto loop;
am x2 ; word :=
rl w3 x1+4 ; cont (first + 4);
se w3 511 ; if word<>511 then
jl. b1. ; goto loop;
am x1 ; addr nextword :=
al w3 x2+6 ; addr of next word;
rl w1 x3 ; nextword := cont (addr nextword);
al. w0 d7. ; addr compiler := addr <:algol:>;
sn w1 0 ; if nextword = 0 then
al. w0 d6. ; addr compiler := addr <:fortran:>;
rs. w0 e3. ; save addr compiler;
sn w1 0 ; if nextword = 0 then
al w3 x3+12 ; addr nextword := addr nextword + 12 (fortran);
bl w1 x3 ; rel segm := nextword.segm;
bl w0 x3+1 ; rel addr := nextword.addr;
\f
; fgs 1988.09.16 translated page ...6...
rl. w3 e3. ;
se w1 0 ; if rel segm = 0
sn w0 0 ; or rel addr = 0 then
al. w3 d12. ; addr compiler := addr <:algol/fortran:>;
rs. w3 e3. ;
sl w1 6 ; if rel segm < 6
sl. w1 (e8.) ; or rel segm > lookup area no. 2.size then
jl. b10. ; goto take shortclock;
a10: sl w0 4 ; if rel addr < 4
sl w0 510 ; or rel addr > 510 then
jl. b10. ; goto take shortclock;
a11: wa. w1 e7.+14 ; curr prog.segm count :=
am. h19. ; rel segm +
rs w1 h1+16 ; entry.block count ;
al. w1 h19. ; zone := curr prog zone;
jl. w3 h22. ; inblock (curr prog);
am (0) ; addr of date :=
al w1 x2-3 ; addr of first +
rs. w1 e4. ; rel addr -3;
rl. w1 e3. ;
sn. w1 d8. ; if slang then
jl. w3 b11. ; get shortclock;
rl. w0 (e4.) ;
sh w0 0 ; if date <= 0 then
jl. w3 b11. ; get shortclock;
\f
; fgs 1988.09.16 translated page ...7...
a14: rl. w1 e0. ; print:
dl w0 x1-6 ; move name
lo. w3 d10. ; from parameter
lo. w0 d10. ; to saved name
ds. w0 e10.+2 ; and
dl w0 x1-2 ; extend
lo. w3 d10. ; with spaces
lo. w0 d11. ; to 12 positions;
ds. w0 e10.+6 ;
al. w0 e10. ;
rl. w1 e11. ; zone := spec. out zone;
jl. w3 h31. ; outtext (saved name);
al. w0 d5. ;
jl. w3 h31. ; outtext (translated by);
rl. w0 e3. ;
jl. w3 h31. ; outtext ((addr compiler));
rl. w0 (e4.) ;
sh. w0 (d14.) ; if date > 991231
sh. w0 (d13.) ; or date <= 750100 then
jl. w3 b11. ; goto take shortclock;
al. w1 d4. ;
al w2 46 ;
jl. w3 b2. ; print(dd.);
al. w1 d3. ;
al w2 46 ;
jl. w3 b2. ; print(mm.);
al. w1 d2. ;
al w2 32 ;
jl. w3 b2. ; print(yy );
rl. w1 e4. ;
rl w0 x1+2 ;
rl. w1 e3. ;
sn. w1 d9. ; if pascal then
jl. b3. ; goto printnl;
al. w1 d4. ;
al w2 46 ;
jl. w3 b2. ; print(hours.);
al. w1 d3. ;
al w2 10 ;
jl. w3 b2. ; print(min<10>);
jl. b0. ; goto paramloop
\f
; fgs 1988.09.16 translated page ...8...
b2: rs. w3 e6. ; procedure print
al w3 0 ;
wd w0 x1 ;
rs. w3 e5. ;
rl. w1 e11. ; zone := spec. out zone;
jl. w3 h32. ;
48<12+2 ;
jl. w3 h26. ;
rl. w0 e5. ;
jl. (e6.) ;
b3: al w2 10 ; printnl:
rl. w1 e11. ; zone := spec. out zone;
jl. w3 h26. ; outchar (zone, 'nl');
jl. b0. ; goto paramloop;
b4: rl. w1 e11. ; exit:
se w1 0 ; if no sec zone
sn. w1 h21. ; or zone = cur out then
jl. b8. ; begin <*terminate sec out*>
bz w3 x1+h1+1;
se w3 4 ; char := if kind=bs
sn w3 18 ; or if kind=mt then em
am 25 ; else
al w2 0 ; null
jl. w3 h34. ; close up (char);
jl. w3 h79. ; terminate zone;
bz w0 x1+h1+1;
se w0 4 ; if kind = bs
jl. b9. ; begin <*cut down*>
al w3 x1+h1+2;
al. w1 c17. ; lookup entry(outfile);
jd 1<11+42; size(tail) :=
rl w0 x3+14 ; segment count;
rs. w0 c17. ; change entry;
jd 1<11+44; end <*cut down*>;
\f
; fgs 1988.09.16 translated page ...9...
b9: rl. w3 h8. ; <*set contents*>
al w3 x3+2 ;
al. w1 c17. ; lookup entry(outfile);
jd 1<11+42;
al w0 0 ;
am 16 ;
rs. w0 c17. ; content := text;
jd 1<11+44; change entry(outfile);
b8: ; end <*terminate sec. out*>
rl. w1 d0. ;
al w2 0 ;
se w1 0 ;
al w2 1 ; if errors then ok no
am -2000;
jl. h7.+2000; goto fp;
b10: jl. w3 b11. ; take shortclock:
jl. a14. ; get shortclock and goto print;
b. b0 ; begin block get shortclock;
w.
b11: rs. w3 b0. ;get shortclock: save return;
rl. w0 e7.+10 ; shortclock := entry.shortclock;
jl. w3 b12. ; convert clock (shortclock);
rs. w0 e9. ; save converted date;
rs. w3 e9.+2 ; save converted clock;
al. w3 e9. ; addr of date :=
rs. w3 e4. ; addr converted shortclock;
jl. (b0.) ; return;
b0: 0 ; saved return
e. ; end block get shortclock;
\f
; fgs 1988.09.16 translated page ...10...
; procedure convert clock (short clock)
;
; (taken from lookup)
;
; this procedure is an inversion of the following algorithm
; for computing day-number from a date (year,month,date)
; extended with a conversion of the time of the day:
;
;
; if month<3 then
; begin
; month:=month+12;
; year:=year-1;
; end;
; dayno:=(1461*year)//4 + (153*month+3)//5 + day;
;
;
;
; call: return:
;
; w0 short clock year*10000+month *100+date
; w1 irrelevant destroyed
; w2 irrelevant destroyed
; w3 return hour*10000+minute*100
;
;
;
b. a13, b0 w. ; begin block convert clock
b12: ld w2 -100 ; clear w1,w2;
rs. w3 a8. ; save return address;
al w3 0 ; clear w3;
ld w0 10 ; w3,w0:=short clock<10 (=truncated clock>9);
wd. w0 a2. ; w0:=dayno;
al w3 x3+a13 ; add minute rounding;
wd. w3 a1. ; w3:=hour;
wd. w2 a0. ; w2:=minute;
ds. w3 a10.; save minute,hour;
\f
; fgs 1988.09.16 translated page ...11...
al w3 0 ; clear w3;
ld w2 -100 ; clear w1,w2;
ls w0 2 ; w0:=dayno*4;
wa. w0 a5. ; add offset;
wd. w0 a4. ; w0:=year;
ls w3 -2 ; w3 is converted ;
wm. w3 a6. ; to fifthdays;
al w3 x3+a11 ; w3:=w3+three months offset;
wd. w3 a3. ; w3:=month;
sh w3 12 ; if month>12 then
jl. b0. ; begin
ba. w0 1 ; increase year;
al w3 x3-12 ; decrease month
b0: al w2 x2+a12 ; end;
wd. w2 a6. ; w2:=date;
rs w3 2 ; save month (in w1);
wm. w0 a7. ; w0:=year*100
wa w0 2 ; + month
wm. w0 a7. ; * 100
wa w0 4 ; + date;
rl. w3 a10.; w3:=hour
wm. w3 a7. ; * 100
wa. w3 a9. ; + minute
wm. w3 a7. ; * 100;
jl. (a8.); return;
a0: 1172 ; units per minute
a1: 70313 ; units per hour
a2: 1687500 ; units per day
a3: 153 ; days in the five months (march-july)
a4: 1461 ; days in four years
a5: 99111 ; offset for computing year
a6: 5 ;
a7: 100 ; constant for packing date and time
a8: 0 ; saved return address
a9: 0 ; saved minute
a10: 0 ; saved hour
a11=461 ; three months offset
a12=5 ; one days offset
a13=586 ; half a minute
e. ; end block convert clock;
\f
; fgs 1988.09.16 translated page ...12...
c0: <:***<0>:>
c1: <: connect:>
c2: <: param <0>:>
c3: <: connect<10><0>:>
c4: <: unknown<10><0>:>
c5: <: not program<10><0>:>
c6: <: date not found<10><0>:>
a1: am c1-c2 ; alarm (connect);
a2: am c2-c3 ; alarm (param);
a3: am c3-c4 ; alarm (connect);
a4: am c4-c5 ; alarm (unknown);
a5: am c5-c6 ; alarm (not program);
a6: al. w0 c6. ; alarm (date not found);
rs. w0 e2. ; save alarm cause
al. w0 c0. ;
jl. w3 h31.-2 ; outtext (***);
rl. w3 e1. ;
al w0 x3+2 ;
jl. w3 h31.-2 ; outtext (programname);
rl. w1 e2. ;
sh. w1 c2. ; if not connect out and
jl. b5. ; if not param then
al w2 32 ;
jl. w3 h26.-2 ; outsp;
rl. w1 e2. ;
b5: se. w1 c1. ; if connect out alarm then
jl. b13. ; begin
am -2000;
rl. w3 h8.+2000;
al w0 x3+2 ;
jl. w3 h31.-2 ; outtext (out, outfile.name);
jl. b15. ; end else
b13: sn. w1 c2. ; if not param alarm then
jl. b15. ; begin
rl. w3 e0. ;
al w0 x3-8 ; outtext (param);
jl. w3 h31.-2 ; end;
\f
; fgs 1988.09.16 translated page ...13...
b15: rl. w0 e2. ;
jl. w3 h31.-2 ; outtext (error cause);
rl. w2 d0. ;
al w2 x2+1 ; errors:=errors+1;
rs. w2 d0. ;
rl. w0 e2. ;
sn. w0 c2. ; if not param alarm then
jl. b14. ; begin
al w2 10 ; outcr;
jl. w3 h26.-2 ;
rl. w0 e2. ; end;
b14: sn. w0 c1. ; if connect output error then
jl. b7. ; goto continue; <*w1 = curr. out zone*>
se. w0 c2. ; if not param alarm then
jl. b0. ; goto paramloop;
rl. w1 e0. ;
rl w0 x1-2 ;
jl. w3 h32.-2 ; outinteger (param);
1 ;
al w2 10 ;
jl. w3 h26.-2 ; outcr;
jl. b0. ; goto paramloop;
\f
; fgs 1988.09.16 translated page ...14...
;procedure init program
;
;called just after entry nb: link w1
;
b20: ds. w3 e1. ; save stack pointers;
al w2 x3+10 ; addr next param :=
rs. w2 e0. ; addr program name + 10;
bz w2 x3 ;
se w2 6 ; return:=
am 2 ; if delim <> 6 then link+2
al w3 x1 ; else link;
al. w1 h21. ; w1:=addr of curr out zone;
jl x3 ; goto return;
;connect special output zone
;
b. j4 ;
w.
j0: 0 ; save return
b28: rs. w3 j0. ;
jl. w3 h29.-4 ; stack curr in;
rl. w2 e1. ;
al w2 x2-8 ; w2:=addr(outfile name);
al w0 1<2+0 ;
jl. w3 h28. ; connect cur in (outfile);
se w0 0 ; if troubles then
jl. a1. ; goto connect output alarm;
bl w0 x1+h1+1;
se w0 4 ; if not bs and
sn w0 18 ; not mt then
jl. b29. ; return;
jl. (j0.) ;
b29: al. w1 h54. ; w1:=lookup area;
rl. w2 e1. ;
al w2 x2-8 ;
jl. w3 b30. ; prepare output
am -2000;
al.w1 h20.+2000; w1:=cur in
jl. (j0.) ; return; comment: now w1
; points to cur out zone;
e. ; end of connect second out
\f
; fgs 1988.09.16 translated page ...15...
; procedure prepare entry for textoutput
; w0 not used
; w1 lookup area
; w2 name addr, entry must be present
; w3 return addr
b. a2 w.
b30: ds. w1 a1. ; save w0.w1
ds. w3 a2. ; save w2.w3
al w3 x2 ; w3:=name addr
jd 1<11+42; lookup
bz w2 x1+16 ;
sh w2 32 ; if contents=4 or
sn w2 4 ; contents>=32
jl. 4 ; then
jl. a0. ; file:=block:=0;
rs w0 x1+12 ;
rs w0 x1+14 ;
a0: rs w0 x1+16 ; contents.entry:=0;
rs w0 x1+18 ; loadlength:=0;
dl w1 110 ;
ld w1 5 ; shortclock;
rl. w1 a1. ;
rs w0 x1+10 ;
jd 1<11+44; changeentry;
dl. w1 a1. ; restore w0,w1
dl. w3 a2. ; restore w2,w3
jl x3 ; return
0 ; saved w0
a1: 0 ; saved w1
0 ; saved w2
a2: 0 ; saved w3
e. ; end prepare entry for text output
\f
; fgs 1988.09.16 translated page ...16...
d0 : 0 ; errors
d1 : -8388608 ;
d2 : 1 ;
d3 : 100 ;
d4 : 10000 ;
d5 : <: translated by <0>:>
d6 : <: fortran <0>:>
d7 : <: algol <0>:>
d8 : <: slang <0>:>
d9 : <: pascal <0>:>
d10: <:<32><32><32>:>
d11: <:<32><32><00>:>
d12: <: algol/fortran <0>:>
d13: 750100
d14: 991231
g2=k-h55
c17: 0 ; start buffer program zone
c27 = c17 - 2000 ;
m.translated 1988.10.04
e.
g0:g1: (:g2+511:)>9 ; segm
0, r.4 ; doc
s2 ; date
0, 0 ; file, block
2<12+(:g3-h55:); contents.entry
g2 ; loadlength
d.
p.<:insertproc:>
▶EOF◀