DNeliac Example 72

Program-Transformation.Org: The Program Transformation Wiki
This page represents examples 72, 73, and 74 of Halstead's "Machine-Independent Computer Programming". Comments in italics, as well as the disassembly and Algol hand translation, have been added by MikeVanEmmerik.

  EXAMPLE 72.
  Address         ff  jkb  yyyyy              Ad.dress    ff   jkb   yyyyy
  00522           00  000  00000              00565       12   130   00130
  00523           65  000  00352              00566       10   030   00132
  00524           65  000  00211              00567       14   031   00000
  00525           16  030  00130              00570       61   000   00526
  00526           16  030  00131              00571       65   000   00346
  00527           16  030  00132              00572       12   500   00007
  00530           12  300  00000              00573       10   030   00130
  00531           10  030  00130              00574       27   515   00133
  00532           27  500  00051              00575       61   000   00541
  00533           61  000  00571              00576       72   500   00573
  00534           10  030  00130              00577       11   530   00130
  00535           27  500  00045              00600       61   000   00571
  00536           61  000  00571              00601       10   030   00130
  00537           65  000  00346              0060?       27   500   00004
  00540           61  000  00526              00603       61   000   00571
  00541           10  003  00000              00604       10   030   00130
  00542           27  700  00005              00605       27   500   00057
  00543           61  000  00553              00606       61   000   00571
  00544           10  030  00131              00607       10   030   00130
  00545           05  000  00003              00610       27   500   00047
  00546           14  030  00467              00611       61   000   00571
  00547           10  005  00000              00612       10   030   00130
  00550           26  030  00467              00613       27   500   00077
  00551           14  030  00131              00614       61   000   00571
  00552           61  000  00561              00615       10   030   00130
  00553           10  030  00132              00616       27   400   00042
  00554           05  000  00003              00617       61   000   00526
  00555           14  030  00467              00620       65   000   00346
  00556           10  005  00000              00621       10   030   00130
  00557           26  030  00467              00622       27   400   00042
  00560           14  030  00132              00623       61   000   00526
  00561           12  303  00001              00624       65   000   00265
  00562           10  003  00000              00625       65   000   00363
  00563           27  400  00017              00626       61   010   00522
  00564           61  000  00571              00627       00   000   00000

Again, here is MikeVanEmmerik's hand disassembly of the above:

00522 START:  .word   0
00523         call    SUB_A
00524         call    SUB_B
00525         st      b,AA
00526 ENT_A:  st      b,AB
00527         st      b,AC
00530         ld      b,#0           ; Why is j=3?
00531         ld      q,AA
00532         sub     <>,q,#00051    ; Subtract and skip if result not equal to 0
00533         jmp     ENT_B
00534         ld      q,AA
00535         sub     <>,q,#00045
00536         jmp     ENT_B
00537         call    SUB_C
00540         jmp     ENT_A
00541 ENT_D:  ld      q,#0           ; Why is b=3?
00542         sub     <,q,#5         ; subtract and skip if result < 0
00543         jmp     ENT_F
00544         ld      q,AB
00545         shl     q,3
00546         st      q,AD
00547         ld      q,0(b)
00550         add     q,AD
00551         st      q,AB
00552         jmp     ENT_E
00553 ENT_F:  ld      q,AC
00554         shl     q,#3
00555         st      q,AD
00556         ld      q,0(b)
00557         add     q,AD
00560         st      q,AC
00561 ENT_E:  add     b,#1
00562         ld      q,#0
00563         sub     <,q,#00017      ; subtract and skip if result < 0?
00564         jmp     ENT_B
00565         ld      =,b,AB          ; why is j=1?
00566         ld      q,AC
00567         st      q,0(b)
00570         jmp     ENT_A
00571 ENT_B:  call    SUB_C
00572         ld      b,#7            ; why is j=5?
00573         ld      q,AA
00574         sub     <>,q,AE(b)      ; ?
00575         jmp     ENT_D
00576         jmp     ?
00577         ld      <>,a,AA         ; load a and skip if non zero
00600         jmp     ENT_B
00601         ld      q,AA
00602         sub     <>,q,#4         ; subtract immediate 4 and skip if non zero
00603         jmp     ENT_B
00604         ld      q,AA
00605         sub     <>,q,#00057
00606         jmp     ENT_B
00607         ld      q,AA
00610         sub     <>,q,#00047
00611         jmp     ENT_B
00612         ld      q,AA
00613         sub     <>,q,#00077
00614         jmp     ENT_B
00615         ld      q,AA
00616         sub     =,q,#00042
00617         jmp     ENT_A
00620         call    SUB_C
00621         ld      q,AA
00622         sub     =,q,#00042
00623         jmp     ENT_A
00624         call    SUB_D
00625         call    SUB_E
00626         jmp     *START
00627         .word   0

ex73_1.jpg

Here is MikeVanEmmerik's hand translation to Algol:

integer procedure START();
begin
    SUB A();
    SUB B();
    aa := 0;
ENT A:
    ab := 0;
    ac := 0;
    k := 0;
    if aa-058 <> 0 ;
    else goto ENT B;
    if aa-045 <> 0 ;
    else goto ENT B;
    SUB C();
    goto ENT A;
ENT D:
    if k-5 < 0 ;
    else goto ENT F;
    ad := ab * 2**3;
    ab := m + ad;
    goto ENT E;
ENT F:
    ad := ac * 2**3;
    ac := m + ad;
ENT E:
    k := k+1;
    if k - 017 = 0 ;
    else goto ENT B;
    i := ab;
    [i] := ac;
    goto ENT A;
ENT B:
    SUB C();
    m := 7;
    for m := m step 1 until 0 do
        begin
            if aa - ae[m](0..14) <> 0 ;
            else goto ENT D;
        end;
    if aa <> 0 ;
    else goto ENT_B;
    if aa-4 <> 0 ;
    else goto ENT_B;
    if aa-057 <> 0 ;
    else goto ENT_B;
    if aa-047 <> 0 ;
    else goto ENT_B;
    if aa-077 <> 0 ;
    else goto ENT_B;
    if aa-042 = 0 ;
    else goto ENT_A;
    SUB C();
    if aa-042 = 0 ;
    else goto ENT_A;
    SUB D();
    SUB E();
end

EXAMPLE 74.
SUB A  0 352
SUB B  0 211
SUB C  0 346
ENT A  0 526
ENT B  0 571
SUB D  0 265
SUB E  0 363
ENT C  0 522
ENT D  0 541
ENT E  0 561
ENT F  0 553
START  0 522
AA    3 130
AB    3 131
AC    3 132
AD    3 467
AE    3 133

CategoryDecompilation