|
|
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: 14592 (0x3900)
Types: TextFile
Names: »movestr3tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »movestr3tx «
; fgs 1987.07.02 algol 6, outdate page 1
;the code procedure outdate is stored on 1 segment. the usage
;of the procedure is found in the publication rcsl 31-d72.
;contents:
;label, page, name
;d2 2 outdate
;d5 2 initiate first two parameters of proc
;d6 4 write into zone
; 5 tail part
;b. h100 ; fpnames dummy block
b. e7, g1 w. ; block with names for tail
s. b8,d6,g2,i12,j60 ; slang segment for procedures
k=10000
i6=6,i8=8,i10=10,i12=12
h.
g0=0
e0: g2 , g1 ; rel of point ,rel of abs word
; abs words:
j3: g0+3 , 0 ; rs entry 3, reserve
j4: g0+4 , 0 ; 4, take expression
j6: g0+6 , 0 ; 6, end register expression
j8: g0+8 , 0 ; 8, end address expression
j13: g0+13 , 0 ; 13, last used
j16: g0+16 , 0 ; 16, segment table base
j17: g0+17 , 0 ; 17, index alarm
j21: g0+21 , 0 ; 21, general alarm
j29: g0+29 , 0 ; 29, param alarm
j60: g0+60 , 0 ; 60, last in segm table
j30: g0+30 , 0 ; 30, saved stack rel, saved w3
g1=k-2-e0 ; end abs words
;points:
j35: g0+35 , 0 ; rs entry 35, outblock
g2=k-2-e0 ; end rel words
w. ; start of external list
e1: 0 ; no externals
0 ; no owns
s3 ; date
s4 ; time
; constants and texts
b0: 10 ;
b6: <:<10>z. state:> ; alarm text
b7: 255 ; bit(16:23)=ones
b8: 255<16 ; bit(0:7)=ones
\f
; 01.12.71 algol 6, outdate page 2
;code procedure outdate(z,i); zone z; integer i;
b. a3 w. ; begin
e2: ; entry:
d2:
;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. a0 w.
d5: rl. w2 (j13.) ; zone parameter:
ds. w3 (j30.) ; saved stack ref:= w2:= last used;
rl w3 x2+i8 ; zone descr:= zone formal 2;
rl w1 x3+h2+6 ; state:= zone state.zone descr;
se w1 3 ;
sn w1 0 ; if state<>after write
jl. a0. ; and state<>after open
; then
al. w0 b6. ; general alarm(state,alarm text);
jl. w3 (j21.) ;
a0: sn w1 0 ; if state = after open
rs w1 x3+h3+4 ; then record length:= 0;
al w1 3 ;
rs w1 x3+h2+6 ; state:= after write;
al w0 x3+h2+4 ; partial word addr:= zone descr+h2+4;
al w1 x3+h3 ; record base addr:= zone descr+h3;
ds w1 x2+i8 ;
dl w1 x2+i12 ; integer parameter:
rl. w3 (j30.) ;
rs w3 x2+i12 ;
so w0 16 ; if expression then
jl. w3 (j4.) ; take expression;
ds. w3 (j30.) ; saved stack ref:= w2;
rl w0 x1 ; w0:= integer mod 2**24;
e. ; end initiate first two parameters
\f
; 01.12.71 algol 6, outdate page 3
al w1 -8 ; reserve 8 bytes in stack
jl. w3 (j3.) ;
al w3 46 ;
hs w3 x2-3 ; stack buf(stack ref-3):=
hs w3 x2-6 ; stack buf(stack ref-6):= <:.:>;
al w1 x2-1 ; print:= stack ref-1;
a0: al w3 0 ; next char:
wd. w0 b0. ; char:= date mod 10+48;
al w3 x3+48 ; date:= date//10;
hs w3 x1 ; stack buf(print):= char;
a1: al w1 x1-1 ; print:= print-1;
sh w1 x2-9 ; if print<=stack ref-9 then
jl. a2. ; move stack buf and finish;
se w1 x2-3 ; if print= stack ref-3 or
sn w1 x2-6 ; print= stack ref-6 then
jl. a1. ; print:= print-1;
jl. a0. ; goto next char;
;move stack buf and finish:
;moves the contents of the stack buffer into the zone
;and releases the stack buffer.
a2: al w1 x1+1 ; move stack:
sn w1 x2 ; print:= print+1;
jl. a3. ; if print=stack ref then
bz w0 x1 ; goto finish;
jl. w3 d6. ; write into zone(stack buffer(print));
jl. a2. ; goto move stack;
; finish:
a3: rs. w2 (j13.) ; last used:= stack ref:
jl. (j8.) ; end address expression;
e. ; end outdate
\f
; 01.12.71 algol 6, outdate page 4
;procedure write into zone(char);
;outputs the right-most 8 bits of the character to the zone
;buffer. the block is changed if necessary.
; entry: exit:
;w0: char destroyed
;w1: uchanged
;w2: stack ref stack ref
;w3: link destroyed
;stack
; +i6: partial word addr partial word addr
; +i8: record base addr record base addr
;+i10: destroyed
;+i12: destroyed
b.a1 w.
d6: la. w0 b7. ; begin
rs w1 x2+i10 ;
rl w1 (x2+i6) ; char:= char(16:23);
sz. w1 (b8.) ; if partial word not full then
jl. a0. ; begin
ls w1 8 ; partial word:= partial word
lo w1 0 ; shift 8 or char;
rs w1 (x2+i6) ; return;
rl w1 x2+i10 ;
jl x3 ; end;
a0: ls w1 8 ; next word:
lo w0 2 ; partial word:= partial word
rl w1 (x2+i8) ; shift 8 or char;
al w1 x1+2 ; record base:= record base+2;
rs w1 (x2+i8) ; zone buf(record base):=
rs w0 x1 ; partial word;
al w0 1 ; partial word:= empty:= 1;
rs w0 (x2+i6) ;
am (x2+i8) ; if record base < last byte
sl w1 (2) ; then return;
jl. a1. ;
rl w1 x2+i10 ;
jl x3 ;
a1: al. w0 e0. ; change block:
ws w3 0 ; rel:= link-segment start;
rs w3 x2+i12 ;
rl w0 x2+i8 ;
ls w0 4 ; w0:= zone descr addr shift 4;
rl. w1 j35. ; w1:= outblock entry point;
jl. w3 (j4.) ; take expression;
ds. w3 (j30.) ; saved stack ref:= w2;
rl w1 x2+i10 ;
am (x2+i12) ; link:= segment start+rel;
jl. e0. ; return (link);
\f
; fgs 1987.08.25 algol 6, movestring page 5
;integer procedure movestring(ra,ix,str);
e. ; end write into zone
; value ix; integer ix; real array ra; string str;
b. f5, d3, c0, b1, a5 ; block for move string
w.
f0: 0 ; work
f1: 0 ; return
f2: <:<10>segment<32>:>; alarm address
e3: rl. w2 (j13.) ; entry movestring:
ds. w3 (j30.) ; saved stack ref:= w2:= last used;
dl w1 x2+12 ; take index parameter:
so w0 16 ; if expression
jl. w3 (j4.) ; then take expression;
ds. w3 (j30.) ; saved stack ref:= w2;
dl w1 x1 ; take integer value:
rl w3 x2+10 ; w3:= formal1.ix;
sz w3 1 ; if real
cf w1 0 ; then round(index);
; take array parameter:
al w0 2.11111; check array param:
la w0 x2+6 ;
sh w0 23 ; if kind (param 1) > zone
sh w0 17 ; or kind (param 1) < integer array then
jl. w3 (j29.) ; goto param alarm;
se w0 18 ; typeshift :=
am 1 ; if kind = integer array then 1
al w3 1 ; else 2;
se w0 21 ; if kind = double array
sn w0 22 ; or kind = complex array then
al w3 3 ; typeshift := 3;
hs. w3 b1. ;
al w0 1 ; length :=
ls w0 x3 ; 1 shift typeshift;
rs w0 x2+12 ;
rl w3 x2+8 ; dope addr :=
ea w3 x2+6 ; dope rel + baseword addr;
b1 = k + 1 ; typeshift:
ls w1 0 ; index := index shift typeshift;
sh w1 (x3-2) ; if index > upper
sh w1 (x3 ) ; or index < lower
jl. w3 (j17.) ; then alarm(index,<:index:>);
wa w1 (x2+8) ; start addr:= next addr:=
al w1 x1+4 ; 4 -
ws w1 x2+12 ; length +
rs w1 x2+10 ; index + base addr;
rl w0 x3-2 ;
wa w0 (x2+8) ; last addr:= upper + base addr + 1;
ba. w0 1 ;
ds w1 x2+8 ; formal locations are used as working
; locations;
a3: dl w1 x2+16 ; take string param:
so w0 16 ; if expr then take expression;
jl. w3 (j4.) ; comment w1=address of string value;
ds. w3 (j30.) ; saved stack ref:= w2;
dl w1 x1 ; item:= core(param addr);
sh w1 -1 ; if second word.item < 0
jl. d1. ; then goto long string;
sl w0 0 ; if first word.item >= 0
jl. d0. ; then goto short string;
jl. w3 c0. ; layout: store(item);
jl. d2. ; goto exit normal;
d0: jl. w3 c0. ; short string: store(item);
jl. a3. ; goto take string param;
\f
; fgs 1987.08.25 algol 6, move string page 6
d1: hs. w0 b0. ; long string:
bz w3 0 ; comment w0 = point = segm number <12 +
rl. w0 (j60.) ; segm relative;
rl. w1 (j16.) ; prepare segment test:
ds. w1 f1. ;
al w1 x3 ;
al. w0 f2. ;
ls w3 1 ;
wa. w3 (j16.) ; segm table addr:= segm number*2 +
; segm table base;
sl. w3 (f1.) ; if segm table addr < segm table base
sl. w3 (f0.) ; or segm table addr >= last in segm table
jl. w3 (j21.) ; then alarm(segm no,<:segment:>);
rl w3 x3 ;
b0=k+1; segm relative ; w3:= segm table(segm table addr);
a0: dl w1 x3+0 ; next: item:= core(w3+segm relative);
sh w1 -1 ; if second word.item < 0
jl. d1. ; then goto long string;
rs. w3 f0. ;
jl. w3 c0. ; store(item);
rl. w3 f0. ;
al w3 x3-4 ; w3:= w3 - 4;
jl. a0. ; goto next;
;subprocedure store(item);
;call: w0,w1 = item, w3 = return address;
;checks whether the array is filled and, if not, stores the
;item in ra(next addr). if item contains a null character
;a jump to exit is performed.
c0: rs. w3 f1. ; entry store:
rl w3 x2+8 ; save return;
sl w3 (x2+6) ; if next addr > last addr
jl. a4. ; then goto try exit filled;
ds w1 x3 ; ra(next addr):= item;
al w3 x3+4 ; next addr:= next addr + 4;
rs w3 x2+8 ;
al w3 0 ; check null character:
jl. a2. ; for i:= 1 step 1 until 6 do
a1: al w3 x3+1 ; begin
sn w3 6 ;
jl. (f1.) ;
ld w1 -8 ; if bits 40-48.item = 0
a2: sz w1 8.377 ; then goto exit normal;
jl. a1. ; item:= item shift (-8);
; end; return;
d2: am 1 ; exit normal: negative:= false; goto a;
d3: al w3 0 ; exit full: negative:= true;
rl w1 x2+8 ; a: elements:=
ws w1 x2+10 ; (next addr - start addr)//length;
al w0 0 ;
wd w1 x2+12 ;
se w3 1 ; move string:= if not negative then
ac w1 x1 ; elements else (-elements);
jl. (j6.) ; goto rs end register expression;
; try exit filled:
a4: am (x2+6) ;
sl w3 2 ; if next addr < last addr + 2 then
jl. d3. ; begin
rs w0 x3-2 ; ra (next addr - 2) := item (1);
al w3 x3+2 ; next addr :=
rs w3 x2+8 ; next addr + 2;
jl. d3. ; goto exit filled;
e. ; end block for movestring
\f
; fgs 1987.07.02 algol 6, movestring page 7
e7:
c. e7-e0-506
m. code on segment 1 too long
z.
c. 502-e7+e0, -1,r. 252-(:e7-e0:)>1
; fill the rest of the segment with -1
z.
<:outdat/move:> ; alarm text
e. ; end slang segment
m. rc 1987.08.25 outdate movestring
; tail part
; outdate:
g0:
1 ; area entry with 1 segment
0,0,0,0 ; fill for name
1<23+e2-e0 ; entry point
1<18+3<12+8<6 ; no type proc( integer,
0 ; zone)
4<12+e1-e0 ; code proc, ext list
1<12+0 ; code segm, own bytes
;move string
g1: 1<23+4 ; modekind=backing storage
0,0,0,0 ; fill
1<23+e3-e0 ; entry point
3<18+9<12+13<6+41 ; integer procedure(undefined, value integer,
0 ; string). (specifications stored backwards)
4<12+e1-e0 ; code proc, ext list
1<12+0 ; code segm, bytes
\f
\f
▶EOF◀