home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 3
/
PDCD_3.iso
/
utilities
/
utilsf
/
gol
/
!Gol
/
s
/
slife
next >
Wrap
Text File
|
1993-09-21
|
11KB
|
249 lines
r0 RN 0
r1 RN 1
r2 RN 2
r3 RN 3
r4 RN 4
r5 RN 5
r6 RN 6
r7 RN 7
r8 RN 8
r9 RN 9
r10 RN 10
r11 RN 11
r12 RN 12
r13 RN 13
r14 RN 14
r15 RN 15
gr RN 12
sp RN 13
lr RN 14
pc RN 15
AREA |C$$code|, CODE, READONLY
;******************************** START life_tick ********************************
; C prototype: void life_tick(Value *src, Value *dst, char *Table, Value width|(height<<16));
; Purpose: do one life cycle
; Parameters: from and to bitmap pointers, width in bytes, height, and table pointer
; Return: nothing
; r2-r7 Swapping registers
; Table, Width, Height, count, o127, o16256, o2080768, temp1, temp2
; r0 - src ,r1 - dst
; r2 - table ,r3 - 127
; r4 - 16256 ,r5 - 2080768
; r8 - p ,r9 - op1
; r10 - on1 ,r11 - n2
; r12 - n1 ,r14 - n0
EXPORT life_tick
life_tick
STMFD sp!, {r4-r12, r14}
MOV r6, r3, LSR#16 ;| CLAIM r6 AS Height
MOV r3, r3, LSL#16
MOV r3, r3, LSR#16
STR r3, [pc, #|life_width|-.-8]
STR r6, [pc, #|life_height|-.-8]
STR r13, [pc, #|life_stack|-.-8]
ADD r1, r1, r3 ;| dst=(Value *)(((char *)dst)+width);
MOV r3, #63 ;| r3=63;
MOV r4, r3, LSL#6 ;| etc....
MOV r5, r4, LSL#6 ;| etc..
SUB r13, r6, #2 ;| count=Height-2;
MOV r13, r13, LSL#16 ;| count=count<<16;
;| RELEASE r6
|life_tick_loop1|
LDR r7, [pc, #|life_width|-.-8] ;| CLAIM r7 AS width
LDR r11, [r0, r7, LSL#1] ;| n2=src[width*2];
LDR r12, [r0, r7] ;| n1=src[width];
LDR r14, [r0], #4 ;| n0=*(src++);
;| RELEASE r7
;| CLAIM r6 AS temp1
;| CLAIM r7 AS temp2
AND r7, r3, r14, LSR#24 ;| temp2=(n0>>24)&127;
AND r6, r4, r12, LSR#18 ;| temp1=(n1>>18)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11, LSR#12 ;| temp1=(n2>>12)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
MOV r9, r7, LSL#25 ;| op1=temp2<<25;
AND r7, r3, r14, LSR#20 ;| temp2=(n0>>20)&127;
AND r6, r4, r12, LSR#14 ;| temp1=(n1>>14)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11, LSR#8 ;| temp1=(n2>>8)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
ORR r9, r9, r7, LSL#21 ;| op1=op1|(temp2<<21);
AND r7, r3, r14, LSR#16 ;| temp2=(n0>>16)&127;
AND r6, r4, r12, LSR#10 ;| temp1=(n1>>10)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11, LSR#4 ;| temp1=(n2>>4)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
ORR r9, r9, r7, LSL#17 ;| op1=op1|(temp2<<17);
AND r7, r3, r14, LSR#12 ;| temp2=(n0>>12)&127;
AND r6, r4, r12, LSR#6 ;| temp1=(n1>>6)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11 ;| temp1=(n2>>0)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
ORR r9, r9, r7, LSL#13 ;| op1=op1|(temp2<<13);
AND r7, r3, r14, LSR#8 ;| temp2=(n0>>5)&127;
AND r6, r4, r12, LSR#2 ;| temp1=(n1>>2)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11, LSL#4 ;| temp1=(n2<<4)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
ORR r9, r9, r7, LSL#9 ;| op1=op1|(temp2<<9);
AND r7, r3, r14, LSR#4 ;| temp2=(n0>>4)&127;
AND r6, r4, r12, LSL#2 ;| temp1=(n1<<2)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11, LSL#8 ;| temp1=(n2<<8)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
ORR r9, r9, r7, LSL#5 ;| op1=op1|(temp2<<5);
AND r7, r3, r14 ;| temp2=(n0>>0)&127;
AND r6, r4, r12, LSL#6 ;| temp1=(n1<<6)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11, LSL#12 ;| temp1=(n2<<12)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
ORR r9, r9, r7, LSL#1 ;| op1=op1|(temp2<<1);
AND r8, r3, r14, LSR#28 ;| p=(n0>>28)&127;
AND r7, r4, r12, LSR#22 ;| temp2=(n1>>22)&16256;
ORR r8, r8, r7 ;| p=p|temp2;
AND r7, r5, r11, LSR#16 ;| temp2=(n2>>16)&2080768;
ORR r8, r8, r7 ;| p=p|temp2;
;| RELEASE r6
;| RELEASE r7
LDR r6, [pc, #|life_width|-.-8] ;| CLAIM r6 AS width
ORR r13, r13, r6, LSR#2 ;| count=count|(width/4);
SUB r13, r13, #1 ;| count=count-1;
;| RELEASE r6
|life_tick_loop2|
LDR r6, [pc, #|life_width|-.-8] ;| CLAIM r6 AS width
LDR r11, [r0, r6, LSL#1] ;| n2=src[width*2];
LDR r12, [r0, r6] ;| n1=src[width];
LDR r14, [r0], #4 ;| n0=*(src++);
;| RELEASE r6
;| CLAIM r6 AS temp1
;| CLAIM r7 AS temp2
AND r6, r3, r14, LSR#24 ;| temp1=(n0>>24)&127;
AND r7, r4, r12, LSR#18 ;| temp2=(n1>>18)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11, LSR#12 ;| temp1=(n2>>12)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
MOV r10, r7, LSL#25 ;| on1=temp2<<25;
AND r6, r3, r14, LSR#20 ;| temp1=(n0>>20)&127;
AND r7, r4, r12, LSR#14 ;| temp2=(n1>>14)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11, LSR#8 ;| temp1=(n2>>8)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
ORR r10, r10, r7, LSL#21 ;| on1=on1|(temp2<<21);
AND r6, r3, r14, LSR#16 ;| temp1=(n0>>16)&127;
AND r7, r4, r12, LSR#10 ;| temp2=(n1>>10)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11, LSR#4 ;| temp1=(n2>>4)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
ORR r10, r10, r7, LSL#17 ;| on1=on1|(temp2<<17);
AND r6, r3, r14, LSR#12 ;| temp1=(n0>>12)&127;
AND r7, r4, r12, LSR#6 ;| temp2=(n1>>6)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11 ;| temp1=(n2>>0)&2080768;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
LDRB r7, [r2, r7] ;| temp2=table[temp2];
ORR r10, r10, r7, LSL#13 ;| on1=on1|(temp2<<13);
AND r6, r3, r14, LSR#8 ;| temp1=(n0>>8)&127;
AND r7, r4, r12, LSR#2 ;| temp2=(n1>>2)&16256;
ORR r7, r7, r6 ;| temp2=temp2|temp1;
AND r6, r5, r11, LSL#