home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / utilities / utilsf / gol / !Gol / s / slife_f < prev   
Text File  |  1993-10-16  |  14KB  |  346 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. ;******************************** START word_copy ********************************
  26. ; C prototype: void word_copy_32(Value *src, Value *dst, Value bytes);
  27. ; Purpose:     Fastest copy there is
  28.  
  29.         EXPORT word_copy_32
  30. word_copy_32
  31.         ADD     r3, pc, #word_copy_data-.-8
  32.         STMIA   r3, {r4-r14}
  33.  
  34. |word_copy_32_loop|
  35.         LDMIA   r0!, {r3-r14}
  36.         STMIA   r1!, {r3-r14}
  37.         LDMIA   r0!, {r3-r14}
  38.         STMIA   r1!, {r3-r14}
  39.         LDMIA   r0!, {r3-r10}
  40.         STMIA   r1!, {r3-r10}
  41.         SUBS    r2, r2, #128
  42.         BLE     |word_copy_32_loop|  
  43.  
  44.         ADD     r3, pc, #word_copy_data-.-8
  45.         LDMIA   r3, {r4-r14}
  46.         MOV     pc, r14
  47.  
  48.  
  49.  
  50.  
  51. ;******************************** START word_copy ********************************
  52. ; C prototype: void word_copy(Value *src, Value *dst, Value bytes);
  53. ; Purpose:     Fastest copy there is
  54. ; r0  - src     ,r1   - dst
  55. ; r2  - bytes   ,r3-r14
  56.  
  57.         EXPORT word_copy
  58. word_copy
  59.         ADD     r3, pc, #word_copy_data-.-8
  60.         STMIA   r3, {r4-r14}
  61.  
  62.         SUBS    r2,  r2,  #48
  63.         BMI     |word_copy_loop1_nop|
  64. |word_copy_loop1|
  65.         LDMIA   r0!, {r3-r14}
  66.         STMIA   r1!, {r3-r14}
  67.         SUBS    r2,  r2,  #48
  68.         BPL     |word_copy_loop1|
  69. |word_copy_loop1_nop|
  70.         ADDS    r2,  r2,  #48
  71.  
  72.         CMP     r2,  #32
  73.         LDMPLIA r0!, {r3-r10}
  74.         STMPLIA r1!, {r3-r10}
  75.         SUBPL   r2,  r2,  #32
  76.  
  77.         CMP     r2,  #16
  78.         LDMPLIA r0!, {r3-r6}
  79.         STMPLIA r1!, {r3-r6}
  80.         SUBPL   r2,  r2,  #16
  81.  
  82.         CMP     r2,  #8
  83.         LDMPLIA r0!, {r3-r4}
  84.         STMPLIA r1!, {r3-r4}
  85.         SUBPL   r2,  r2,  #8
  86.  
  87.         CMP     r2,  #4
  88.         LDRPL   r3,  [r0]
  89.         STRPL   r3,  [r0]
  90.  
  91.         ADD     r3, pc, #word_copy_data-.-8
  92.         LDMIA   r3, {r4-r14}
  93.         MOV     pc, r14
  94.  
  95. word_copy_data
  96.         DCD     &00000000
  97.         DCD     &00000000
  98.         DCD     &00000000
  99.         DCD     &00000000
  100.         DCD     &00000000
  101.         DCD     &00000000
  102.         DCD     &00000000
  103.         DCD     &00000000
  104.         DCD     &00000000
  105.         DCD     &00000000
  106.         DCD     &00000000
  107.  
  108. ;******************************** END word_copy **********************************
  109.  
  110.  
  111. ;******************************** START life_tick_f ******************************
  112. ; C prototype: void life_tick(Value *src, Value *dst, char *Table, Value width|(height<<16));
  113. ; Purpose:     do one life cycle
  114. ; Parameters:  from and to bitmap pointers, width in bytes, height, and table pointer
  115. ; Return:      nothing
  116. ; r2-r7 Swapping registers
  117. ;       Table, Width, Height, count, o127, o16256, o2080768, temp1, temp2
  118. ; r0  - src     ,r1   - dst
  119. ; r2  - table   ,r3   - 127
  120. ; r4  - 16256   ,r5   - 2080768
  121. ; r8  - p       ,r9   - op1
  122. ; r10 - on1     ,r11  - n2
  123. ; r12 - n1      ,r14  - n0
  124.  
  125.         EXPORT life_tick_f
  126. life_tick_f
  127.         STMFD   sp!, {r4-r12, r14}
  128.         MOV     r6,  r3,  LSR#16        ;| CLAIM r6 AS Height
  129.         MOV     r3,  r3,  LSL#16
  130.         MOV     r3,  r3,  LSR#16
  131.         STR     r3,  [pc, #|life_width|-.-8]
  132.         STR     r6,  [pc, #|life_height|-.-8]
  133.         STR     r13, [pc, #|life_stack|-.-8]
  134.         ADD     r1,  r1, r3             ;| dst=(Value *)(((char *)dst)+width);
  135.  
  136.         MOV     r3, #63                 ;| r3=63;
  137.         MOV     r4, r3, LSL#6           ;| etc....
  138.         MOV     r5, r4, LSL#6           ;| etc..
  139.  
  140.         SUB     r13, r6,  #2            ;| count=Height-2;
  141.         MOV     r13, r13, LSL#16        ;| count=count<<16;
  142.                                         ;| RELEASE r6
  143. |life_tick_loop1|
  144.         LDR     r7,  [pc, #|life_width|-.-8] ;| CLAIM r7 AS width
  145.         LDR     r11, [r0, r7, LSL#1]    ;| n2=src[width*2];
  146.         LDR     r12, [r0, r7]           ;| n1=src[width];
  147.         LDR     r14, [r0], #4           ;| n0=*(src++);
  148.                                         ;| RELEASE r7
  149.  
  150.                                         ;| CLAIM r6 AS temp1
  151.                                         ;| CLAIM r7 AS temp2
  152.         ORR     r9,  r11, r12           ;| op1=n2|n1;
  153.         ORRS    r9,  r14, r9            ;| op1=n0|op1;
  154.         MOV     r8,  #0                 ;| p=0;
  155.         BEQ     |life_tick_skip1|       ;| if (!op1) goto |life_tick_skip|;
  156.  
  157.         AND     r7,  r3, r14, LSR#24    ;| temp2=(n0>>24)&127;
  158.         AND     r6,  r4, r12, LSR#18    ;| temp1=(n1>>18)&16256;
  159.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  160.         AND     r6,  r5, r11, LSR#12    ;| temp1=(n2>>12)&2080768;
  161.         ORRS    r7,  r7, r6             ;| temp2=temp2|temp1;
  162.         LDRNEB  r7,  [r2, r7]           ;| temp2=table[temp2];
  163.         MOV     r9,  r7, LSL#25         ;| op1=temp2<<25;
  164.  
  165.         AND     r7,  r3, r14, LSR#20    ;| temp2=(n0>>20)&127;
  166.         AND     r6,  r4, r12, LSR#14    ;| temp1=(n1>>14)&16256;
  167.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  168.         AND     r6,  r5, r11, LSR#8     ;| temp1=(n2>>8)&2080768;
  169.         ORRS    r7,  r7, r6             ;| temp2=temp2|temp1;
  170.         LDRNEB  r7,  [r2, r7]           ;| temp2=table[temp2];
  171.         ORR     r9,  r9, r7,  LSL#21    ;| op1=op1|(temp2<<21);
  172.  
  173.         AND     r7,  r3, r14, LSR#16    ;| temp2=(n0>>16)&127;
  174.         AND     r6,  r4, r12, LSR#10    ;| temp1=(n1>>10)&16256;
  175.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  176.         AND     r6,  r5, r11, LSR#4     ;| temp1=(n2>>4)&2080768;
  177.         ORRS    r7,  r7, r6             ;| temp2=temp2|temp1;
  178.         LDRNEB  r7,  [r2, r7]           ;| temp2=table[temp2];
  179.         ORR     r9,  r9, r7,  LSL#17    ;| op1=op1|(temp2<<17);
  180.  
  181.         AND     r7,  r3, r14, LSR#12    ;| temp2=(n0>>12)&127;
  182.         AND     r6,  r4, r12, LSR#6     ;| temp1=(n1>>6)&16256;
  183.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  184.         AND     r6,  r5, r11            ;| temp1=(n2>>0)&2080768;
  185.         ORRS    r7,  r7, r6             ;| temp2=temp2|temp1;
  186.         LDRNEB  r7,  [r2, r7]           ;| temp2=table[temp2];
  187.         ORR     r9,  r9, r7,  LSL#13    ;| op1=op1|(temp2<<13);
  188.  
  189.         AND     r7,  r3, r14, LSR#8     ;| temp2=(n0>>5)&127;
  190.         AND     r6,  r4, r12, LSR#2     ;| temp1=(n1>>2)&16256;
  191.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  192.         AND     r6,  r5, r11, LSL#4     ;| temp1=(n2<<4)&2080768;
  193.         ORRS    r7,  r7, r6             ;| temp2=temp2|temp1;
  194.         LDRNEB  r7,  [r2, r7]           ;| temp2=table[temp2];
  195.         ORR     r9,  r9, r7,  LSL#9     ;| op1=op1|(temp2<<9);
  196.  
  197.         AND     r7,  r3, r14, LSR#4     ;| temp2=(n0>>4)&127;
  198.         AND     r6,  r4, r12, LSL#2     ;| temp1=(n1<<2)&16256;
  199.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  200.         AND     r6,  r5, r11, LSL#8     ;| temp1=(n2<<8)&2080768;
  201.         ORRS    r7,  r7, r6             ;| temp2=temp2|temp1;
  202.         LDRNEB  r7,  [r2, r7]           ;| temp2=table[temp2];
  203.         ORR     r9,  r9, r7,  LSL#5     ;| op1=op1|(temp2<<5);
  204.  
  205.         AND     r7,  r3, r14            ;| temp2=(n0>>0)&127;
  206.         AND     r6,  r4, r12, LSL#6     ;| temp1=(n1<<6)&16256;
  207.         ORR     r7,  r7, r6             ;| temp2=temp2|temp1;
  208.         AND     r6,  r5, r11, LSL#12    ;| temp1=(n2<<12)&2080768;
  209.         ORRS    r7,  r7, r6             ;| temp2=temp2|temp1;
  210.         LDRNEB  r7,  [r2, r7]           ;| temp2=table[temp2];
  211.         ORR     r9,  r9, r7,  LSL#1     ;| op1=op1|(temp2<<1);
  212.  
  213.         AND     r8,  r3, r14, LSR#28    ;| p=(n0>>28)&127;
  214.         AND     r7,  r4, r12, LSR#22    ;| temp2=(n1>>22)&16256;
  215.         ORR     r8,  r8, r7             ;| p=p|temp2;
  216.         AND     r7,  r5, r11, LSR#16    ;| temp2=(n2>>16)&2080768;
  217.         ORR     r8,  r8, r7             ;| p=p|temp2;
  218. |life_tick_skip1|
  219.                                         ;| RELEASE r6
  220.                                         ;| RELEASE r7
  221.  
  222.         LDR     r6,  [pc, #|life_width|-.-8] ;| CLAIM r6 AS width
  223.         ORR     r13, r13, r6, LSR#2     ;| count=count|(width/4);
  224.         SUB     r13, r13, #1            ;| count=count-1;
  225.                                         ;