home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / utilities / utilsf / gol / !Gol / s / slife next >
Text File  |  1993-09-21  |  11KB  |  249 lines

  1. r0  RN 0
  2. r1  RN 1
  3. r2  RN 2
  4. r3  RN 3
  5. r4  RN 4
  6. r5  RN 5
  7. r6  RN 6
  8. r7  RN 7
  9. r8  RN 8
  10. r9  RN 9
  11. r10 RN 10
  12. r11 RN 11
  13. r12 RN 12
  14. r13 RN 13
  15. r14 RN 14
  16. r15 RN 15
  17. gr  RN 12
  18. sp  RN 13
  19. lr  RN 14
  20. pc  RN 15
  21.  
  22.  
  23.         AREA |C$$code|, CODE, READONLY
  24.  
  25.  
  26. ;******************************** START life_tick ********************************
  27. ; C prototype: void life_tick(Value *src, Value *dst, char *Table, Value width|(height<<16));
  28. ; Purpose:     do one life cycle
  29. ; Parameters:  from and to bitmap pointers, width in bytes, height, and table pointer
  30. ; Return:      nothing
  31. ; r2-r7 Swapping registers
  32. ;       Table, Width, Height, count, o127, o16256, o2080768, temp1, temp2
  33. ; r0  - src     ,r1   - dst
  34. ; r2  - table   ,r3   - 127
  35. ; r4  - 16256   ,r5   - 2080768
  36. ; r8  - p       ,r9   - op1
  37. ; r10 - on1     ,r11  - n2
  38. ; r12 - n1      ,r14  - n0
  39.  
  40.         EXPORT life_tick
  41. life_tick
  42.         STMFD   sp!, {r4-r12, r14}
  43.         MOV     r6,  r3,  LSR#16        ;| CLAIM r6 AS Height
  44.         MOV     r3,  r3,  LSL#16
  45.         MOV     r3,  r3,  LSR#16
  46.         STR     r3,  [pc, #|life_width|-.-8]
  47.         STR     r6,  [pc, #|life_height|-.-8]
  48.         STR     r13, [pc, #|life_stack|-.-8]
  49.         ADD     r1,  r1, r3             ;| dst=(Value *)(((char *)dst)+width);
  50.  
  51.         MOV     r3, #63                 ;| r3=63;
  52.         MOV     r4, r3, LSL#6           ;| etc....
  53.         MOV     r5, r4, LSL#6           ;| etc..
  54.  
  55.         SUB     r13, r6,  #2            ;| count=Height-2;
  56.         MOV     r13, r13, LSL#16        ;| count=count<<16;
  57.                                         ;| RELEASE r6
  58. |life_tick_loop1|
  59.         LDR     r7,  [pc, #|life_width|-.-8] ;| CLAIM r7 AS width
  60.         LDR     r11, [r0, r7, LSL#1]    ;| n2=src[width*2];
  61.         LDR     r12, [r0, r7]           ;| n1=src[width];
  62.         LDR     r14, [r0], #4           ;| n0=*(src++);
  63.                                         ;| RELEASE r7
  64.  
  65.                                         ;| CLAIM r6 AS temp1
  66.                                         ;| CLAIM r7 AS temp2
  67.         AND     r7,  r3, r14, LSR#24    ;| temp2=(n0>>24)&127;
  68.         AND     r6,  r4, r12, LSR#18    ;| temp1=(n1>>18)&16256;
  69.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  70.         AND     r6,  r5, r11, LSR#12    ;| temp1=(n2>>12)&2080768;
  71.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  72.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  73.         MOV     r9,  r7, LSL#25         ;| op1=temp2<<25;
  74.  
  75.         AND     r7,  r3, r14, LSR#20    ;| temp2=(n0>>20)&127;
  76.         AND     r6,  r4, r12, LSR#14    ;| temp1=(n1>>14)&16256;
  77.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  78.         AND     r6,  r5, r11, LSR#8     ;| temp1=(n2>>8)&2080768;
  79.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  80.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  81.         ORR     r9,  r9, r7,  LSL#21    ;| op1=op1|(temp2<<21);
  82.  
  83.         AND     r7,  r3, r14, LSR#16    ;| temp2=(n0>>16)&127;
  84.         AND     r6,  r4, r12, LSR#10    ;| temp1=(n1>>10)&16256;
  85.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  86.         AND     r6,  r5, r11, LSR#4     ;| temp1=(n2>>4)&2080768;
  87.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  88.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  89.         ORR     r9,  r9, r7,  LSL#17    ;| op1=op1|(temp2<<17);
  90.  
  91.         AND     r7,  r3, r14, LSR#12    ;| temp2=(n0>>12)&127;
  92.         AND     r6,  r4, r12, LSR#6     ;| temp1=(n1>>6)&16256;
  93.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  94.         AND     r6,  r5, r11            ;| temp1=(n2>>0)&2080768;
  95.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  96.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  97.         ORR     r9,  r9, r7,  LSL#13    ;| op1=op1|(temp2<<13);
  98.  
  99.         AND     r7,  r3, r14, LSR#8     ;| temp2=(n0>>5)&127;
  100.         AND     r6,  r4, r12, LSR#2     ;| temp1=(n1>>2)&16256;
  101.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  102.         AND     r6,  r5, r11, LSL#4     ;| temp1=(n2<<4)&2080768;
  103.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  104.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  105.         ORR     r9,  r9, r7,  LSL#9     ;| op1=op1|(temp2<<9);
  106.  
  107.         AND     r7,  r3, r14, LSR#4     ;| temp2=(n0>>4)&127;
  108.         AND     r6,  r4, r12, LSL#2     ;| temp1=(n1<<2)&16256;
  109.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  110.         AND     r6,  r5, r11, LSL#8     ;| temp1=(n2<<8)&2080768;
  111.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  112.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  113.         ORR     r9,  r9, r7,  LSL#5     ;| op1=op1|(temp2<<5);
  114.  
  115.         AND     r7,  r3, r14            ;| temp2=(n0>>0)&127;
  116.         AND     r6,  r4, r12, LSL#6     ;| temp1=(n1<<6)&16256;
  117.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  118.         AND     r6,  r5, r11, LSL#12    ;| temp1=(n2<<12)&2080768;
  119.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  120.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  121.         ORR     r9,  r9, r7,  LSL#1     ;| op1=op1|(temp2<<1);
  122.  
  123.         AND     r8,  r3, r14, LSR#28    ;| p=(n0>>28)&127;
  124.         AND     r7,  r4, r12, LSR#22    ;| temp2=(n1>>22)&16256;
  125.         ORR     r8,  r8, r7             ;| p=p|temp2;
  126.         AND     r7,  r5, r11, LSR#16    ;| temp2=(n2>>16)&2080768;
  127.         ORR     r8,  r8, r7             ;| p=p|temp2;
  128.                                         ;| RELEASE r6
  129.                                         ;| RELEASE r7
  130.  
  131.         LDR     r6,  [pc, #|life_width|-.-8] ;| CLAIM r6 AS width
  132.         ORR     r13, r13, r6, LSR#2     ;| count=count|(width/4);
  133.         SUB     r13, r13, #1            ;| count=count-1;
  134.                                         ;| RELEASE r6
  135. |life_tick_loop2|
  136.         LDR     r6,  [pc, #|life_width|-.-8] ;| CLAIM r6 AS width
  137.         LDR     r11, [r0, r6, LSL#1]    ;| n2=src[width*2];
  138.         LDR     r12, [r0, r6]           ;| n1=src[width];
  139.         LDR     r14, [r0], #4           ;| n0=*(src++);
  140.                                         ;| RELEASE r6
  141.  
  142.                                         ;| CLAIM r6 AS temp1
  143.                                         ;| CLAIM r7 AS temp2
  144.         AND     r6,  r3, r14, LSR#24    ;| temp1=(n0>>24)&127;
  145.         AND     r7,  r4, r12, LSR#18    ;| temp2=(n1>>18)&16256;
  146.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  147.         AND     r6,  r5, r11, LSR#12    ;| temp1=(n2>>12)&2080768;
  148.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  149.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  150.         MOV     r10, r7, LSL#25         ;| on1=temp2<<25;
  151.  
  152.         AND     r6,  r3, r14, LSR#20    ;| temp1=(n0>>20)&127;
  153.         AND     r7,  r4, r12, LSR#14    ;| temp2=(n1>>14)&16256;
  154.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  155.         AND     r6,  r5, r11, LSR#8     ;| temp1=(n2>>8)&2080768;
  156.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  157.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  158.         ORR     r10, r10, r7, LSL#21    ;| on1=on1|(temp2<<21);
  159.  
  160.         AND     r6,  r3, r14, LSR#16    ;| temp1=(n0>>16)&127;
  161.         AND     r7,  r4, r12, LSR#10    ;| temp2=(n1>>10)&16256;
  162.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  163.         AND     r6,  r5, r11, LSR#4     ;| temp1=(n2>>4)&2080768;
  164.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  165.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  166.         ORR     r10, r10, r7, LSL#17    ;| on1=on1|(temp2<<17);
  167.  
  168.         AND     r6,  r3, r14, LSR#12    ;| temp1=(n0>>12)&127;
  169.         AND     r7,  r4, r12, LSR#6     ;| temp2=(n1>>6)&16256;
  170.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  171.         AND     r6,  r5, r11            ;| temp1=(n2>>0)&2080768;
  172.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  173.         LDRB    r7,  [r2, r7]           ;| temp2=table[temp2];
  174.         ORR     r10, r10, r7, LSL#13    ;| on1=on1|(temp2<<13);
  175.  
  176.         AND     r6,  r3, r14, LSR#8     ;| temp1=(n0>>8)&127;
  177.         AND     r7,  r4, r12, LSR#2     ;| temp2=(n1>>2)&16256;
  178.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  179.         AND     r6,  r5, r11, LSL#