home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 3
/
PDCD_3.iso
/
utilities
/
utilsf
/
gol
/
!Gol
/
s
/
slife_f
< prev
Wrap
Text File
|
1993-10-16
|
14KB
|
346 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 word_copy ********************************
; C prototype: void word_copy_32(Value *src, Value *dst, Value bytes);
; Purpose: Fastest copy there is
EXPORT word_copy_32
word_copy_32
ADD r3, pc, #word_copy_data-.-8
STMIA r3, {r4-r14}
|word_copy_32_loop|
LDMIA r0!, {r3-r14}
STMIA r1!, {r3-r14}
LDMIA r0!, {r3-r14}
STMIA r1!, {r3-r14}
LDMIA r0!, {r3-r10}
STMIA r1!, {r3-r10}
SUBS r2, r2, #128
BLE |word_copy_32_loop|
ADD r3, pc, #word_copy_data-.-8
LDMIA r3, {r4-r14}
MOV pc, r14
;******************************** START word_copy ********************************
; C prototype: void word_copy(Value *src, Value *dst, Value bytes);
; Purpose: Fastest copy there is
; r0 - src ,r1 - dst
; r2 - bytes ,r3-r14
EXPORT word_copy
word_copy
ADD r3, pc, #word_copy_data-.-8
STMIA r3, {r4-r14}
SUBS r2, r2, #48
BMI |word_copy_loop1_nop|
|word_copy_loop1|
LDMIA r0!, {r3-r14}
STMIA r1!, {r3-r14}
SUBS r2, r2, #48
BPL |word_copy_loop1|
|word_copy_loop1_nop|
ADDS r2, r2, #48
CMP r2, #32
LDMPLIA r0!, {r3-r10}
STMPLIA r1!, {r3-r10}
SUBPL r2, r2, #32
CMP r2, #16
LDMPLIA r0!, {r3-r6}
STMPLIA r1!, {r3-r6}
SUBPL r2, r2, #16
CMP r2, #8
LDMPLIA r0!, {r3-r4}
STMPLIA r1!, {r3-r4}
SUBPL r2, r2, #8
CMP r2, #4
LDRPL r3, [r0]
STRPL r3, [r0]
ADD r3, pc, #word_copy_data-.-8
LDMIA r3, {r4-r14}
MOV pc, r14
word_copy_data
DCD &00000000
DCD &00000000
DCD &00000000
DCD &00000000
DCD &00000000
DCD &00000000
DCD &00000000
DCD &00000000
DCD &00000000
DCD &00000000
DCD &00000000
;******************************** END word_copy **********************************
;******************************** START life_tick_f ******************************
; 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_f
life_tick_f
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
ORR r9, r11, r12 ;| op1=n2|n1;
ORRS r9, r14, r9 ;| op1=n0|op1;
MOV r8, #0 ;| p=0;
BEQ |life_tick_skip1| ;| if (!op1) goto |life_tick_skip|;
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;
ORRS r7, r7, r6 ;| temp2=temp2|temp1;
LDRNEB 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;
ORRS r7, r7, r6 ;| temp2=temp2|temp1;
LDRNEB 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;
ORRS r7, r7, r6 ;| temp2=temp2|temp1;
LDRNEB 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;
ORRS r7, r7, r6 ;| temp2=temp2|temp1;
LDRNEB 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;
ORRS r7, r7, r6 ;| temp2=temp2|temp1;
LDRNEB 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;
ORRS r7, r7, r6 ;| temp2=temp2|temp1;
LDRNEB 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;
ORRS r7, r7, r6 ;| temp2=temp2|temp1;
LDRNEB 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;
|life_tick_skip1|
;| 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;
;