DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦ed48bd8d0⟧ TextFile

    Length: 13824 (0x3600)
    Types: TextFile
    Names: »tcomalmove«

Derivation

└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
    └─⟦4334b4c0b⟧ 
        └─⟦this⟧ »tcomalmove« 

TextFile

\f


; comalmove   pss 78.06.28                                     page .. 1..

b. g1, e5    w.
k=0

s. g10, j50, f10, b50
h.

g0=0                         ; g0=number of externals

e5   :
g1   :  g2    ,  g2          ; head word: rel last point, absword

j6   :  g0+6  ,  0           ; rs entry end register expression
j13  :  g0+13 ,  0           ; rs entry last used
j21  :  g0+21 ,  0           ; rs entry general alarm
j30  :  g0+30  , 0           ; rs entry save sref, save w3

g2=k-2-g1                    ; end of abswords = end of points
w.

e0   :  g0                   ; start external list: no externals;
        0                    ;  no perm core
        s3                   ;  date
        s4                   ;  time
\f


; comalmove   pss 78.06.28                                     page .. 2..

; global working variables

f0   :  6<12 + 23            ; first formal of zone param
f1   :  0                    ; count
f2   :  0                    ; work count
f3   :  0                    ; zero count flag

; entry
e1   :                       ;
        rl. w2   (j13.)      ; w2:=stack ref:=last used
        ds. w3   (j30.)      ; save stackref, save w3

; check parameters

        al  w3    0          ; param:=false;
        rl  w0(x2+20)        ; get value of count
        al  w1    0          ; zero count flag:=if count=0 then 0
        se  w0    0          ;                                 else 3;
        al  w1    3          ;
        rs. w1    f3.        ;
        sh  w0    0          ; if count <= 0 then
        al  w0    0          ;    count:=0;
        bs. w0    1          ; count:=count-1;
        rs. w0    f1.        ;

        dl  w1 x2+16         ; get formal of fromfield
        se  w0    26         ; if kind<>integer var/const/exprcompcall
        al  w3    1          ;    then param:=true;
        rl  w0 x1            ;
        rs  w0 x2+20         ; fromfield:=call value fromfield;

        dl  w1 x2+12         ; get formal of tofield
        se  w0    26         ; if kind<>integer var/const/exprcompcall
        al  w3    1          ;    then param:=true;
        rl  w0 x1            ;
        rs  w0 x2+18         ; tofield:=call value tofield;
\f


; comalmove   pss 78.06.28                                     page .. 3..

        se  w3    0          ; if param then
        jl.       b0.        ;    goto paramerror;

        dl  w1 x2+8          ; get formal of base;
        se. w0   (f0.)       ; if type of base = zone then
        jl.       b1.        ; begin

        rl  w0 x1+h2+6       ;  if (zone.state <> after read,readchar,
        sl  w0    1          ;     readstring, readall, repeatchar, write,
        sn  w0    4          ;     inrec, outrec or swoprec) then
        jl.       b2.        ;     goto zstateerror;
        sn  w0    8          ;
        jl.       b2.        ;

        rl  w0 x1+h3+2       ;
        ws  w0 x1+h3+0       ;  fieldlimit:=z.last byte-z.basebufarea;
        rs  w0 x2+14         ;

        dl  w3 x2+20         ;
        sl  w2    1          ;  if tofield<1 or
        sh  w3    0          ;     fromfield<=0 then
        jl.       b3.        ;     goto fielderror;

        wa. w2    f1.        ;  if tofield+count > fieldlimit or
        wa. w3    f1.        ;     fromfield+count-1 >= fieldlimit then
        al  w3 x3-1          ;
        sh  w2   (0)         ;
        sl  w3   (0)         ;
        jl.       b3.        ;     goto fielderror;

        rl. w2   (j13.)      ;  restore stackref;
        rl  w3 x1+h3+0       ;  base address:=zone.base buf area;
        jl.       b4.        ;  goto compute start address;

                             ; end <*zone*> else
\f


; comalmove   pss 78.06.28                                     page .. 4..
 
b1   :                       ; begin
        ld  w0    12         ;
        ls  w0   -12         ;
        sl  w0    17         ;  if kind<>boolean, integer, real
        sl  w0    21         ;     or long array then
        jl.       b0.        ;     goto paramerror;

        wa  w3 x2+8          ;  dopeadr:=base adr + dope rel;
        rl  w0 x3-2          ;  fieldlimit:=dope.upper index value;
        rs  w0 x2+14         ;

        al  w0    1          ;  field:=tofield;
b5   :                       ;  rep:
        am       (0)         ;
        rl  w1 x2+18         ;
        sh  w1(x3)           ;  if field <= (low index val - k) then
        jl.       b3.        ;     goto fielderror;
        wa. w1    f1,        ;
        sh. w0   (f3.)       ;
        al  w1 x1-1          ;
        sl  w1(x3-2)         ;  if field+count-1 >= upp index val then
        jl.       b3.        ;     goto dieldepror;
        ba. w0    1          ;  if field=tofield then
        sh  w0    2          ;   begin   field:=fromfield;
        jl.       b5.        ;           goto rep;
                             ;   end;
        rl  w3(x2+8)         ;   base address:=array base address;
                             ; end array;
\f


; comalmove   pss 78.06.28                                     page .. 4..

; compute start address:

b4   :  dl  w2 x2+20         ;
        wa  w1    6          ; to:=base address + tofield;
        wa  w2    6          ; from:=base address + fromfield;

        rl. w3    f1.        ; count;

        sh  w1 x2            ; if to > from then
        jl.       b6.        ; begin

; move area starting from higher addresses

        wa  w1    6          ;  to:=to+count;
        wa  w2      6        ;  from:=from+count;
        al  w3 x3+1          ;  count:=count+1;
        sh  w3    0          ;  if count<=0 then
        jl.       b15.       ;     goto done;

        sz  w1    1          ;  if to is even then
        jl.       b7.        ;  begin

        bz  w0 x2            ;
        hs  w0 x1            ;   move one byte;
        al  w1 x1-1          ;   to:=to-1;
        al  w2 x2-1          ;    from:=from-1;
        al  w3 x3-1          ;   count:=count-1;
                             ;  end;
b7  :   sh  w3    7          ;  if count < 8 then 
        jl.       b8.        ;     goto movetail;
        so  w2    1          ;  if from is even then
        jl.       b9.        ;     goto moveright;

b10  :  rs. w3    f2.        ;  movestraight:
        dl  w0 x2            ;
        ds  w0 x1            ;
        dl  w0 x2-4          ;
        ds  w0 x1-4          ;  move 8 halfwords;

        al  w1 x1-8          ;  t0:=to-8;
        al  w2 x2-8          ;  from:=from-8;
        rl. w3    f2.        ;
        al  w3 x3-8          ;  count:=count-8;
        sl  w3    8          ;  if count>=8 then
        jl.       b10.       ;  goto movestraight else
        jl.       b8.        ;  goto movetail;
\f


; comalmove   pss 78.06.28                                     page .. 5..

; moveright:

b9   :
        rs. w3    f2.        ;
        dl  w0 x2-1          ;
        ld  w0    12         ;
        hl  w0 x2            ;
        ds  w0 x1            ;

        dl  w0 x2-5          ;
        ld  w0    12         ;
        hl  w0 x2-4          ;
        ds  w0 x1-4          ;  move 8 halfwords;

        al  w1 x1-8          ;  to:=to-8;
        al  w2 x2-8          ;  from:=from-8;
        rl. w3    f2.        ;
        al  w3 x3-8          ;  count:=count-8;
        sl  w3    8          ;  if count >= 8 then
        jl.       b9.        ;     goto moveright;

; movetail:

b8   :  sh  w3    0          ;  if count <= 0 then
        jl.       b15.       ;     goto done;
b17  :  bz  w0 x2            ;  mvrep:
        hs  w0 x1            ;  move 1 halfword;
        al  w1 x1-1          ;  to:=to-1;
        al  w2 x2-1          ;  from:=from-1;
        al  w3 x3-1          ;  count:=count-1;
        se  w3    0          ;  if count > 0 then
        jl.       b17.       ;     goto movetail else
        jl.       b15.       ;     goto done;
                             ; end <* move starting from higher address *>
                             ; else
\f


; comalmove   pss 78.06.28                                     page .. 6..

; move area starting from lower addresses

b6   :                       ; begin
        al  w3 x3+1          ;  count:=count+1;
        sh  w3    0          ;  if count<=0 then
        jl.       b15.       ;     goto done;

        so  w1    1          ;  if to is odd then
        jl.       b11.       ;   begin

        bz  w0 x2            ;
        hs  w0 x1            ;    move 1 halfword;
        al  w1 x1+1          ;    to:=to+1;
        al  w2 x2+1          ;    from:=from+1;
        al  w3 x3-1          ;    count:=count-1;
                             ;   end;
b11  :  sh  w3    7          ;  if count<8 then
        jl.       b12.       ;     goto movetl;
        sz  w2    1          ;  if from is odd then
        jl.       b13.       ;     goto moveleft;

; movest:

b14  :  rs. w3    f2.        ;
        dl  w0 x2+2          ;
        ds  w0 x1+2          ;
        dl  w0 x2+6          ;
        ds  w0 x1+6          ;  move 8 halfwords
        al  w1 x1+8          ;  to:=to+8;
        al  w2 x2+8          ;  from:=from+8;
        rl. w3    f2.        ;
        al  w3 x3-8          ;  count:=count-1;
        sl  w3    8          ;  if count >= 8 then
        jl.       b14.       ;     goto movest else
        jl.       b12.       ;     goto movetl;

; moveleft:

b13  :  rs. w3    f2.        ;
        dl  w0 x2+1          ;
        ld  w0    12         ;
        hl  w0 x2+3          ;
        ds  w0 x1+2          ;
        dl  w0 x2+5          ;
        ld  w0    12         ;
        hl  w0 x2+7          ;
        ds  w0 x1+6          ;  move 8 halfwords
        al  w1 x1+8          ;  to:=to+8;
        al  w2 x2+8          ;  from:=from+8;
        rl. w3    f2.        ;
        al  w3 x3-8          ;  count:=count-8;
        sl  w3    8          ;  if count>=8 then
        jl.       b13.       ;     goto moveleft;
\f


; comalmove   pss 78.06.28                                     page .. 7..
 
; movetl:

b12  :  sh  w3    0          ;  if count <= 0 then
        jl.       b15.       ;     goto done;
b16  :  bz  w0 x2            ;  moverep:
        hs  w0 x1            ;  move 1 halfword;
        al  w1 x1+1          ;  to:=to+1;
        al  w2 x2+1          ;  from:=from+1;
        al  w3 x3-1          ;  count:=count-1;
        se  w3    0          ;  if count > 0 then
        jl.       b16.       ;     goto moverep;
                             ; end;
; done:

b15  :  rl. w2   (j13.)      ; get last used;

        dl  w1 x2+20         ;
        wa. w0    f1.        ; tofield:=tofield+count;
        wa. w1    f1.        ;
        al  w1 x1+1          ; fromfield:=fromfield+count+1;
        rs  w1(x2+16)        ; set return value fromfield;

        rl  w1 x2+14         ;
        ws  w1    0          ; rem:=fieldlimit-tofield;

        ba. w0    1          ; tofield:=tofield+1;
        rs  w0(x2+12)        ; set return value tofield;

        jl.      (j6.)       ; goto rs end register expression;
\f


; comalmove   pss 78.06.28                                     page .. 8..

; error:

b18  :  <:<10>param   :>
b19  :  <:<10>z. state:>
b20  :  <:<10>fielderr:>

; paramerror

b0   :  al  w1    0          ; integer:=0;
        jl.       b21.       ;

; zone state error:

b2   :  rl  w1    0          ; integer:=zone state;
        jl.       b22.       ;

; field error:

b3   :  al  w1    0          ; integer:=0;
        am        b20-b19     
b22  :  am        b19-b18    ;
b21  :  al. w0    b18.       ; get textadr;
        rl. w2   (j13.)      ; get last used;
        jl. w3   (j21.)      ; goto rs general alarm;

\f


; comalmove   kc  79.06.19                                     page .. 9..

e2:      rl.    w2   (j13.)  ; long procedure getclock;
         ds.    w3   (j30.)  ; begin
         dl     w1    110    ;    getclock:=core(108..110);
         jl.         (j6.)   ; end;

e3:      rl.    w2   (j13.)  ; boolean procedure anyevents;
         ds.    w3   (j30.)  ; begin
         rl     w1    66     ;    x1:=current_process;
         dl     w1    x1+16  ;    w0:=x1.eventqueue.next;
         sn     w1   (0)     ;    w1:=x1.eventqueue.prev;
         am           1      ;    anyevents:=
         al     w1    -1     ;       -,(w0=w1)
         jl.         (j6.)   ; end;
\f


g3   :
c.      g3-g1-506
m.   code too long
z.

c.      502-g3+g1, jl -1, r. 252-(:g3-g1:)>1  z.
; fill rest of segment with the illegal instruction jl -1

<:comalmove  <0>:>           ; alarm text

e.                           ; end of slang segment;

; tail for code procedure

g0:                          ; first:
        1                    ; area with 1 segment
        0, 0, 0, 0           ; fill
        1<23+e1-e5           ; entry point on segment;
        3<18+13<12+3<6+3     ; intg proc(intg val, intg name, intg name,
        41<18+0              ;           undefined);
        4<12+e0-e5           ; code proc, start ext list
        1<12+0               ; code segments, bytes in own core;
; getclock:
        1<23+4               ; kind bs
        0,0,0,0              ; fill
        1<23+e2-e5           ; entry point
        5<18+0,0             ; long procedure
        4<12+e0-e5           ; code procedure, start external list
        1<12+0               ; 1 segment, no perm core
; anyevents:
g1:                          ; last:
        1<23+4               ; kind bs
        0,0,0,0              ; fill
        1<23+e3-e5           ; entry point
        2<18+0,0             ; boolean procedure
        4<12+e0-e5           ; code procedure, start external list
        1<12+0               ; 1 segment, no perm core

m.   790309 comalmove
▶EOF◀