mirror of
				https://github.com/RaySollium99/picodrive.git
				synced 2025-10-27 21:48:50 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			695 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			695 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| @ some color conversion and blitting routines
 | |
| 
 | |
| @ (c) Copyright 2006, notaz
 | |
| @ All Rights Reserved
 | |
| 
 | |
| 
 | |
| @ Convert 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0
 | |
| @ to      00000000 rrr00000 ggg00000 bbb00000 ...
 | |
| 
 | |
| @ lr =  0x00e000e0, out: r3=lower_pix, r2=higher_pix; trashes rin
 | |
| @ if sh==2, r8=0x00404040 (sh!=0 destroys flags!)
 | |
| .macro convRGB32_2 rin sh=0
 | |
|     and     r2,  lr, \rin, lsr #4 @ blue
 | |
|     and     r3,  \rin, lr
 | |
|     orr     r2,  r2,   r3, lsl #8         @ g0b0g0b0
 | |
| 
 | |
|     mov     r3,  r2,  lsl #16             @ g0b00000
 | |
|     and     \rin,lr,  \rin, ror #12       @ 00r000r0 (reversed)
 | |
|     orr     r3,  r3,  \rin, lsr #16       @ g0b000r0
 | |
| .if \sh == 1
 | |
|     mov     r3,  r3,  ror #17             @ shadow mode
 | |
| .elseif \sh == 2
 | |
|     adds    r3,  r3,  #0x40000000         @ green
 | |
|     orrcs   r3,  r3,  #0xe0000000
 | |
|     mov     r3,  r3,  ror #8
 | |
|     adds    r3,  r3,  #0x40000000
 | |
|     orrcs   r3,  r3,  #0xe0000000
 | |
|     mov     r3,  r3,  ror #16
 | |
|     adds    r3,  r3,  #0x40000000
 | |
|     orrcs   r3,  r3,  #0xe0000000
 | |
|     mov     r3,  r3,  ror #24
 | |
|     orr     r3,  r3,   r3, lsr #3
 | |
| .else
 | |
|     mov     r3,  r3,  ror #16             @ r3=low
 | |
|     orr     r3,  r3,   r3, lsr #3
 | |
| .endif
 | |
| 
 | |
|     str     r3, [r0], #4
 | |
| 
 | |
|     mov     r2,  r2,  lsr #16
 | |
|     orr     r2,  r2,  \rin, lsl #16
 | |
| .if \sh == 1
 | |
|     mov     r2,  r2,  lsr #1
 | |
| .elseif \sh == 2
 | |
|     mov     r2,  r2,  ror #8
 | |
|     adds    r2,  r2,  #0x40000000         @ blue
 | |
|     orrcs   r2,  r2,  #0xe0000000
 | |
|     mov     r2,  r2,  ror #8
 | |
|     adds    r2,  r2,  #0x40000000
 | |
|     orrcs   r2,  r2,  #0xe0000000
 | |
|     mov     r2,  r2,  ror #8
 | |
|     adds    r2,  r2,  #0x40000000
 | |
|     orrcs   r2,  r2,  #0xe0000000
 | |
|     mov     r2,  r2,  ror #8
 | |
|     orr     r2,  r2,   r2,  lsr #3
 | |
| .else
 | |
|     orr     r2,  r2,   r2,  lsr #3
 | |
| .endif
 | |
| 
 | |
|     str     r2, [r0], #4
 | |
| .endm
 | |
| 
 | |
| 
 | |
| .global vidConvCpyRGB32 @ void *to, void *from, int pixels
 | |
| 
 | |
| vidConvCpyRGB32:
 | |
|     stmfd   sp!, {r4-r7,lr}
 | |
| 
 | |
|     mov     r12, r2, lsr #3 @ repeats
 | |
|     mov     lr, #0x00e00000
 | |
|     orr     lr, lr, #0x00e0
 | |
| 
 | |
| .loopRGB32:
 | |
|     subs    r12, r12, #1
 | |
| 
 | |
|     ldmia    r1!, {r4-r7}
 | |
|     convRGB32_2 r4
 | |
|     convRGB32_2 r5
 | |
|     convRGB32_2 r6
 | |
|     convRGB32_2 r7
 | |
| 
 | |
|     bgt     .loopRGB32
 | |
| 
 | |
|     ldmfd   sp!, {r4-r7,lr}
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| .global vidConvCpyRGB32sh @ void *to, void *from, int pixels
 | |
| 
 | |
| vidConvCpyRGB32sh:
 | |
|     stmfd   sp!, {r4-r7,lr}
 | |
| 
 | |
|     mov     r12, r2, lsr #3 @ repeats
 | |
|     mov     lr, #0x00e00000
 | |
|     orr     lr, lr, #0x00e0
 | |
| 
 | |
| .loopRGB32sh:
 | |
|     subs    r12, r12, #1
 | |
| 
 | |
|     ldmia    r1!, {r4-r7}
 | |
|     convRGB32_2 r4, 1
 | |
|     convRGB32_2 r5, 1
 | |
|     convRGB32_2 r6, 1
 | |
|     convRGB32_2 r7, 1
 | |
| 
 | |
|     bgt     .loopRGB32sh
 | |
| 
 | |
|     ldmfd   sp!, {r4-r7,lr}
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| .global vidConvCpyRGB32hi @ void *to, void *from, int pixels
 | |
| 
 | |
| vidConvCpyRGB32hi:
 | |
|     stmfd   sp!, {r4-r7,lr}
 | |
| 
 | |
|     mov     r12, r2, lsr #3 @ repeats
 | |
|     mov     lr, #0x00e00000
 | |
|     orr     lr, lr, #0x00e0
 | |
| 
 | |
| .loopRGB32hi:
 | |
|      ldmia    r1!, {r4-r7}
 | |
|     convRGB32_2 r4, 2
 | |
|     convRGB32_2 r5, 2
 | |
|     convRGB32_2 r6, 2
 | |
|     convRGB32_2 r7, 2
 | |
| 
 | |
|     subs    r12, r12, #1
 | |
|     bgt     .loopRGB32hi
 | |
| 
 | |
|     ldmfd   sp!, {r4-r7,lr}
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| @ -------- M2 stuff ---------
 | |
| /*
 | |
| .global vidConvCpy_90 @ void *to, void *from, int width
 | |
| 
 | |
| vidConvCpy_90:
 | |
|     stmfd   sp!, {r4-r10,lr}
 | |
| 
 | |
|     mov     lr, #0x00F00000
 | |
|     orr     lr, lr, #0x00F0
 | |
| 
 | |
|     mov     r12, #224/4            @ row counter
 | |
|     mov     r10, r2, lsl #2        @ we do 2 pixel wide copies
 | |
| 
 | |
|     add     r8,  r0, #256*4        @ parallel line
 | |
|     add     r1,  r1, #0x23000
 | |
|     add     r1,  r1, #0x00B80      @ r1+=328*223*2+8*2
 | |
|     mov     r9,  r1
 | |
| 
 | |
|     mov     r4,  #0                @ fill bottom border
 | |
|     mov     r5,  #0
 | |
|     mov     r6,  #0
 | |
|     mov     r7,  #0
 | |
|     stmia   r0!, {r4-r7}
 | |
|     stmia   r0!, {r4-r7}
 | |
|     stmia   r8!, {r4-r7}
 | |
|     stmia   r8!, {r4-r7}
 | |
| 
 | |
| .loopM2RGB32_90:
 | |
| 	subs    r12, r12, #1
 | |
| 
 | |
|     @ at first this loop was written differently: src pixels were fetched with ldm's and
 | |
|     @ dest was not sequential. It ran nearly 2 times slower. It seems it is very important
 | |
|     @ to do sequential memory access on those items, which we have more (to offload addressing bus?).
 | |
| 
 | |
|     ldr     r4, [r1], #-328*2
 | |
|     ldr     r5, [r1], #-328*2
 | |
|     ldr     r6, [r1], #-328*2
 | |
|     ldr     r7, [r1], #-328*2
 | |
| 
 | |
|     convRGB32_2 r4, 1
 | |
|     convRGB32_2 r5, 1
 | |
|     convRGB32_2 r6, 1
 | |
|     convRGB32_2 r7, 1
 | |
| 
 | |
|     str     r4, [r8], #4
 | |
|     str     r5, [r8], #4
 | |
|     str     r6, [r8], #4
 | |
|     str     r7, [r8], #4
 | |
| 
 | |
|     bne     .loopM2RGB32_90
 | |
| 
 | |
|     mov     r4,  #0                @ top border
 | |
|     mov     r5,  #0
 | |
|     mov     r6,  #0
 | |
|     stmia   r0!, {r4-r6,r12}
 | |
|     stmia   r0!, {r4-r6,r12}
 | |
|     stmia   r8!, {r4-r6,r12}
 | |
|     stmia   r8!, {r4-r6,r12}
 | |
| 
 | |
|     subs    r10, r10, #1
 | |
|     ldmeqfd sp!, {r4-r10,pc}        @ return
 | |
| 
 | |
|     add     r0,  r8,  #16*4         @ set new dst pointer
 | |
|     add     r8,  r0,  #256*4
 | |
|     add     r9,  r9,  #2*2          @ fix src pointer
 | |
|     mov     r1,  r9
 | |
| 
 | |
|     stmia   r0!, {r4-r6,r12}        @ bottom border
 | |
|     stmia   r0!, {r4-r6,r12}
 | |
|     stmia   r8!, {r4-r6,r12}
 | |
|     stmia   r8!, {r4-r6,r12}
 | |
| 
 | |
|     mov     r12, #224/4             @ restore row counter
 | |
|     b       .loopM2RGB32_90
 | |
| 
 | |
| 
 | |
| 
 | |
| @ converter for vidConvCpy_270
 | |
| @ lr =  0x00F000F0, out: r3=lower_pix, r2=higher_pix; trashes rin
 | |
| .macro convRGB32_3 rin
 | |
|     and     r2,  lr, \rin, lsr #4 @ blue
 | |
|     and     r3,  \rin, lr
 | |
|     orr     r2,  r2,   r3, lsl #8         @ g0b0g0b0
 | |
| 
 | |
|     mov     r3,  r2,  lsl #16             @ g0b00000
 | |
|     and     \rin,lr,  \rin, ror #12       @ 00r000r0 (reversed)
 | |
|     orr     r3,  r3,  \rin, lsr #16       @ g0b000r0
 | |
| 
 | |
|     mov     r2,  r2,  lsr #16
 | |
|     orr     r2,  r2,  \rin, lsl #16
 | |
|     str     r2, [r0], #4
 | |
| 
 | |
|     mov     \rin,r3,  ror #16             @ r3=low
 | |
| .endm
 | |
| */
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| 
 | |
| @ takes byte-sized pixels from r3-r6, fetches from pal and stores to r7,r8,r10,lr
 | |
| @ r2=pal
 | |
| .macro mode2_4pix shift
 | |
|     and     r7, r11, r3, lsr #\shift
 | |
|     ldr     r7, [r2, r7, lsl #2]
 | |
| 
 | |
|     and     r8, r11, r4, lsr #\shift
 | |
|     ldr     r8, [r2, r8, lsl #2]
 | |
| 
 | |
|     and     r10,r11, r5, lsr #\shift
 | |
|     ldr     r10,[r2, r10,lsl #2]
 | |
| 
 | |
|     and     lr, r11, r6, lsr #\shift
 | |
|     ldr     lr, [r2, lr, lsl #2]
 | |
| .endm
 | |
| 
 | |
| @ r2=pal, r11=0xff
 | |
| .macro mode2_4pix_getpix0 dreg sreg
 | |
|     and     \dreg, r11, \sreg
 | |
|     ldr     \dreg, [r2, \dreg, lsl #2]
 | |
| .endm
 | |
| 
 | |
| .macro mode2_4pix_getpix1 dreg sreg
 | |
|     and     \dreg, r11, \sreg, lsr #8
 | |
|     ldr     \dreg, [r2, \dreg, lsl #2]
 | |
| .endm
 | |
| 
 | |
| .macro mode2_4pix_getpix2 dreg sreg
 | |
|     and     \dreg, r11, \sreg, lsr #16
 | |
|     ldr     \dreg, [r2, \dreg, lsl #2]
 | |
| .endm
 | |
| 
 | |
| .macro mode2_4pix_getpix3 dreg sreg
 | |
|     and     \dreg, r11, \sreg, lsr #24
 | |
|     ldr     \dreg, [r2, \dreg, lsl #2]
 | |
| .endm
 | |
| 
 | |
| @ takes byte-sized pixels from reg, fetches from pal and stores to r3-r6
 | |
| @ r11=0xFF, r2=pal
 | |
| .macro mode2_4pix2_0 reg
 | |
|     mode2_4pix_getpix0 r3, \reg
 | |
|     mode2_4pix_getpix1 r4, \reg
 | |
|     mode2_4pix_getpix2 r5, \reg
 | |
|     mode2_4pix_getpix3 r6, \reg
 | |
| .endm
 | |
| 
 | |
| @ ...
 | |
| .macro mode2_4pix2_180 reg
 | |
|     mode2_4pix_getpix3 r3, \reg
 | |
|     mode2_4pix_getpix2 r4, \reg
 | |
|     mode2_4pix_getpix1 r5, \reg
 | |
|     mode2_4pix_getpix0 r6, \reg
 | |
| .endm
 | |
| 
 | |
| @ takes byte-sized pixels from reg, fetches from pal and stores to r3-r5
 | |
| @ r11=0xFF, r2=pal, r10=0xfcfcfc, r6=tmp
 | |
| .macro mode2_4pix_to3 reg is180
 | |
| .if \is180
 | |
|     mode2_4pix_getpix3 r3, \reg
 | |
|     mode2_4pix_getpix2 r4, \reg
 | |
| .else
 | |
|     mode2_4pix_getpix0 r3, \reg     @ gathering loads cause a weird-hang
 | |
|     mode2_4pix_getpix1 r4, \reg
 | |
| .endif
 | |
| 
 | |
|     sub     r3, r3,  r3, lsr #2     @ r3 *= 0.75
 | |
|     add     r3, r3,  r4, lsr #2     @ r3 += r4 * 0.25
 | |
|     and     r3, r3,  r10
 | |
| 
 | |
| .if \is180
 | |
|     mode2_4pix_getpix1 r5, \reg
 | |
|     mode2_4pix_getpix0 r6, \reg
 | |
| .else
 | |
|     mode2_4pix_getpix2 r5, \reg
 | |
|     mode2_4pix_getpix3 r6, \reg
 | |
| .endif
 | |
| 
 | |
|     mov     r4, r4,  lsr #1
 | |
|     add     r4, r4,  r5, lsr #1     @ r4 = (r4 + r5) / 2;
 | |
| @    and     r4, r4,  r10
 | |
|     sub     r6, r6,  r6, lsr #2     @ r6 *= 0.75
 | |
|     add     r5, r6,  r5, lsr #2     @ r5 = r6 + r5 * 0.25
 | |
|     and     r5, r5,  r10
 | |
| .endm
 | |
| 
 | |
| 
 | |
| @ void *to, void *from, void *pal, int width
 | |
| .macro vidConvCpyM2_landscape is270
 | |
|     stmfd   sp!, {r4-r11,lr}
 | |
| 
 | |
|     mov     r11, #0xff
 | |
| 
 | |
|     mov     r12, #(224/4-1)<<16    @ row counter
 | |
|     orr     r12, r12, r3, lsl #1   @ we do 4 pixel wide copies (right to left)
 | |
| 
 | |
| .if \is270
 | |
|     add     r1,  r1, #324
 | |
| .else
 | |
|     add     r1,  r1, #0x11c00
 | |
|     add     r1,  r1, #0x00308      @ 328*224+8
 | |
| .endif
 | |
|     mov     r9,  r1
 | |
| 
 | |
|     mov     r3,  #0                @ fill top border
 | |
|     mov     r4,  #0
 | |
|     mov     r5,  #0
 | |
|     mov     r6,  #0
 | |
|     stmia   r0!, {r3-r6}
 | |
|     stmia   r0!, {r3-r6}
 | |
|     add     r7,  r0, #256*4-8*4
 | |
|     stmia   r7!, {r3-r6}
 | |
|     stmia   r7!, {r3-r6}
 | |
|     add     r7,  r7, #256*4-8*4
 | |
|     stmia   r7!, {r3-r6}
 | |
|     stmia   r7!, {r3-r6}
 | |
|     add     r7,  r7, #256*4-8*4
 | |
|     stmia   r7!, {r3-r6}
 | |
|     stmia   r7!, {r3-r6}
 | |
| 
 | |
| 0: @ .loopM2RGB32_270:
 | |
| 	subs    r12, r12, #1<<16
 | |
| 
 | |
| .if \is270
 | |
|     ldr     r3, [r1], #328
 | |
|     ldr     r4, [r1], #328
 | |
|     ldr     r5, [r1], #328
 | |
|     ldr     r6, [r1], #328
 | |
| .else
 | |
|     ldr     r3, [r1, #-328]!
 | |
|     ldr     r4, [r1, #-328]!
 | |
|     ldr     r5, [r1, #-328]!
 | |
|     ldr     r6, [r1, #-328]!
 | |
| .endif
 | |
| 
 | |
| .if \is270
 | |
|     mode2_4pix 24
 | |
| .else
 | |
|     mode2_4pix  0
 | |
| .endif
 | |
|     stmia   r0, {r7,r8,r10,lr}
 | |
|     add     r0, r0, #256*4
 | |
| 
 | |
| .if \is270
 | |
|     mode2_4pix 16
 | |
| .else
 | |
|     mode2_4pix  8
 | |
| .endif
 | |
|     stmia   r0, {r7,r8,r10,lr}
 | |
|     add     r0, r0, #256*4
 | |
| 
 | |
| .if \is270
 | |
|     mode2_4pix  8
 | |
| .else
 | |
|     mode2_4pix 16
 | |
| .endif
 | |
|     stmia   r0, {r7,r8,r10,lr}
 | |
|     add     r0, r0, #256*4
 | |
| 
 | |
| .if \is270
 | |
|     mode2_4pix  0
 | |
| .else
 | |
|     mode2_4pix 24
 | |
| .endif
 | |
|     stmia   r0!,{r7,r8,r10,lr}
 | |
|     sub     r0, r0, #256*4*3
 | |
| 
 | |
|     bpl     0b @ .loopM2RGB32_270
 | |
| 
 | |
|     mov     r3,  #0                @ bottom border
 | |
|     mov     r4,  #0
 | |
|     mov     r5,  #0
 | |
|     mov     r6,  #0
 | |
|     stmia   r0!, {r3-r6}
 | |
|     stmia   r0!, {r3-r6}
 | |
|     add     r0,  r0, #256*4-8*4
 | |
|     stmia   r0!, {r3-r6}
 | |
|     stmia   r0!, {r3-r6}
 | |
|     add     r0,  r0, #256*4-8*4
 | |
|     stmia   r0!, {r3-r6}
 | |
|     stmia   r0!, {r3-r6}
 | |
|     add     r0,  r0, #256*4-8*4
 | |
|     stmia   r0!, {r3-r6}
 | |
|     nop                             @ phone crashes if this is commented out. Do I stress it too much?
 | |
|     stmia   r0!, {r3-r6}
 | |
| 
 | |
|     add     r12, r12, #1<<16
 | |
|     subs    r12, r12, #1
 | |
|     ldmeqfd sp!, {r4-r11,pc}        @ return
 | |
| 
 | |
|     add     r0,  r0, #16*4
 | |
| .if \is270
 | |
|     sub     r9,  r9, #4            @ fix src pointer
 | |
| .else
 | |
|     add     r9,  r9, #4
 | |
| .endif
 | |
|     mov     r1,  r9
 | |
| 
 | |
|     stmia   r0!, {r3-r6}            @ top border
 | |
|     stmia   r0!, {r3-r6}
 | |
|     add     r7,  r0, #256*4-8*4
 | |
|     stmia   r7!, {r3-r6}
 | |
|     stmia   r7!, {r3-r6}
 | |
|     add     r7,  r7, #256*4-8*4
 | |
|     stmia   r7!, {r3-r6}
 | |
|     stmia   r7!, {r3-r6}
 | |
|     add     r7,  r7, #256*4-8*4
 | |
|     stmia   r7!, {r3-r6}
 | |
|     stmia   r7!, {r3-r6}
 | |
| 
 | |
|     orr     r12, r12, #(224/4-1)<<16 @ restore row counter
 | |
|     b       0b @ .loopM2RGB32_270
 | |
| .endm
 | |
| 
 | |
| 
 | |
| .global vidConvCpy_90 @ void *to, void *from, void *pal, int width
 | |
| 
 | |
| vidConvCpy_90:
 | |
|     vidConvCpyM2_landscape 0
 | |
| 
 | |
| 
 | |
| .global vidConvCpy_270 @ void *to, void *from, void *pal, int width
 | |
| 
 | |
| vidConvCpy_270:
 | |
|     vidConvCpyM2_landscape 1
 | |
| 
 | |
| 
 | |
| .global vidConvCpy_center_0 @ void *to, void *from, void *pal
 | |
| 
 | |
| vidConvCpy_center_0:
 | |
|     stmfd   sp!, {r4-r6,r11,lr}
 | |
| 
 | |
|     mov     r11, #0xff
 | |
|     add     r1,  r1, #8     @ not border (centering 32col here)
 | |
| 
 | |
|     mov     r12, #(240/4-1)<<16
 | |
|     orr     r12, r12, #224
 | |
| 
 | |
| .loopRGB32_c0:
 | |
|     ldr     lr, [r1], #4
 | |
| 	subs    r12, r12, #1<<16
 | |
| 
 | |
|     mode2_4pix2_0 lr
 | |
|     stmia   r0!, {r3-r6}
 | |
|     bpl     .loopRGB32_c0
 | |
| 
 | |
| 	sub     r12, r12, #1
 | |
| 	adds    r12, r12, #1<<16
 | |
|     ldmeqfd sp!, {r4-r6,r11,pc} @ return
 | |
|     add     r0,  r0, #16*4
 | |
|     add     r1,  r1, #88
 | |
|     orr     r12, #(240/4-1)<<16
 | |
|     b       .loopRGB32_c0
 | |
| 
 | |
| 
 | |
| .global vidConvCpy_center_180 @ void *to, void *from, void *pal
 | |
| 
 | |
| vidConvCpy_center_180:
 | |
|     stmfd   sp!, {r4-r6,r11,lr}
 | |
| 
 | |
|     mov     r11, #0xff
 | |
|     add     r1,  r1, #0x11c00
 | |
|     add     r1,  r1, #0x002B8 @ #328*224-72
 | |
| 
 | |
|     mov     r12, #(240/4-1)<<16
 | |
|     orr     r12, r12, #224
 | |
| 
 | |
| .loopRGB32_c180:
 | |
|     ldr     lr, [r1, #-4]!
 | |
| 	subs    r12, r12, #1<<16
 | |
| 
 | |
|     mode2_4pix2_180 lr
 | |
|     stmia   r0!, {r3-r6}
 | |
|     bpl     .loopRGB32_c180
 | |
| 
 | |
| 	sub     r12, r12, #1
 | |
| 	adds    r12, r12, #1<<16
 | |
|     ldmeqfd sp!, {r4-r6,r11,pc} @ return
 | |
|     add     r0,  r0, #16*4
 | |
|     sub     r1,  r1, #88
 | |
|     orr     r12, #(240/4-1)<<16
 | |
|     b       .loopRGB32_c180
 | |
| 
 | |
| 
 | |
| @ note: the following code assumes that (pal[x] & 0x030303) == 0
 | |
| 
 | |
| .global vidConvCpy_center2_40c_0 @ void *to, void *from, void *pal, int lines
 | |
| 
 | |
| vidConvCpy_center2_40c_0:
 | |
|     stmfd   sp!, {r4-r6,r10,r11,lr}
 | |
| 
 | |
|     mov     r11, #0xff
 | |
|     mov     r10, #0xfc
 | |
|     orr     r10, r10, lsl #8
 | |
|     orr     r10, r10, lsl #8
 | |
|     add     r1,  r1, #8     @ border
 | |
| 
 | |
|     mov     r12, #(240/3-1)<<16
 | |
|     orr     r12, r12, r3
 | |
| 
 | |
| .loopRGB32_c2_40c_0:
 | |
|     ldr     lr, [r1], #4
 | |
| 	subs    r12, r12, #1<<16
 | |
| 
 | |
|     mode2_4pix_to3 lr, 0
 | |
| 
 | |
|     stmia   r0!, {r3-r5}
 | |
|     bpl     .loopRGB32_c2_40c_0
 | |
| 
 | |
| 	sub     r12, r12, #1
 | |
| 	adds    r12, r12, #1<<16
 | |
|     ldmeqfd sp!, {r4-r6,r10,r11,pc} @ return
 | |
|     add     r0,  r0, #16*4
 | |
|     add     r1,  r1, #8
 | |
|     orr     r12, #(240/3-1)<<16
 | |
|     b       .loopRGB32_c2_40c_0
 | |
| 
 | |
| 
 | |
| .global vidConvCpy_center2_40c_180 @ void *to, void *from, void *pal, int lines
 | |
| 
 | |
| vidConvCpy_center2_40c_180:
 | |
|     stmfd   sp!, {r4-r6,r10,r11,lr}
 | |
| 
 | |
|     mov     r11, #0xff
 | |
|     mov     r10, #0xfc
 | |
|     orr     r10, r10, lsl #8
 | |
|     orr     r10, r10, lsl #8
 | |
| 
 | |
|     mov     r4,  #328
 | |
|     mla     r1,  r3, r4, r1
 | |
| @    add     r1,  r1, #0x11000
 | |
| @    add     r1,  r1, #0x00f00 @ #328*224
 | |
| 
 | |
|     mov     r12, #(240/3-1)<<16
 | |
|     orr     r12, r12, r3
 | |
| 
 | |
| .loop_c2_40c_180:
 | |
|     ldr     lr, [r1, #-4]!
 | |
| 	subs    r12, r12, #1<<16
 | |
| 
 | |
|     mode2_4pix_to3 lr, 1
 | |
| 
 | |
|     stmia   r0!, {r3-r5}
 | |
|     bpl     .loop_c2_40c_180
 | |
| 
 | |
| 	sub     r12, r12, #1
 | |
| 	adds    r12, r12, #1<<16
 | |
|     ldmeqfd sp!, {r4-r6,r10,r11,pc} @ return
 | |
|     add     r0,  r0, #16*4
 | |
|     sub     r1,  r1, #8
 | |
|     orr     r12, #(240/3-1)<<16
 | |
|     b       .loop_c2_40c_180
 | |
| 
 | |
| 
 | |
| .global vidConvCpy_center2_32c_0 @ void *to, void *from, void *pal, int lines
 | |
| 
 | |
| vidConvCpy_center2_32c_0:
 | |
|     stmfd   sp!, {r4-r11,lr}
 | |
| 
 | |
|     mov     r10, #0xfc
 | |
|     orr     r10, r10, lsl #8
 | |
|     orr     r10, r10, lsl #8
 | |
|     mov     r11, #0xff
 | |
|     add     r1,  r1, #8     @ border
 | |
| 
 | |
|     mov     r12, #(240/15-1)<<16
 | |
|     orr     r12, r12, r3
 | |
| 
 | |
| .loop_c2_32c_0:
 | |
|     ldmia   r1!, {r7-r9,lr}
 | |
| 	subs    r12, r12, #1<<16
 | |
| 
 | |
|     mode2_4pix2_0 r7
 | |
|     stmia   r0!, {r3-r6}
 | |
|     mode2_4pix2_0 r8
 | |
|     stmia   r0!, {r3-r6}
 | |
|     mode2_4pix2_0 r9
 | |
|     stmia   r0!, {r3-r6}
 | |
|     mode2_4pix_to3 lr, 0
 | |
|     stmia   r0!, {r3-r5}
 | |
|     bpl     .loop_c2_32c_0
 | |
| 
 | |
| 	sub     r12, r12, #1
 | |
| 	adds    r12, r12, #1<<16
 | |
|     ldmeqfd sp!, {r4-r11,pc} @ return
 | |
|     add     r0,  r0, #16*4
 | |
|     add     r1,  r1, #64+8
 | |
|     orr     r12, #(240/15-1)<<16
 | |
|     b       .loop_c2_32c_0
 | |
| 
 | |
| 
 | |
| .global vidConvCpy_center2_32c_180 @ void *to, void *from, void *pal, int lines
 | |
| 
 | |
| vidConvCpy_center2_32c_180:
 | |
|     stmfd   sp!, {r4-r11,lr}
 | |
| 
 | |
|     mov     r10, #0xfc
 | |
|     orr     r10, r10, lsl #8
 | |
|     orr     r10, r10, lsl #8
 | |
|     mov     r11, #0xff
 | |
| 
 | |
|     mov     r4,  #328
 | |
|     mla     r1,  r3, r4, r1
 | |
| @    add     r1,  r1, #0x11000
 | |
| @    add     r1,  r1, #0x00f00 @ #328*224
 | |
| 
 | |
|     mov     r12, #(240/15-1)<<16
 | |
|     orr     r12, r12, r3
 | |
| 
 | |
| .loop_c2_32c_180:
 | |
|     ldmdb   r1!, {r7-r9,lr}
 | |
| 	subs    r12, r12, #1<<16
 | |
| 
 | |
|     mode2_4pix2_180 lr
 | |
|     stmia   r0!, {r3-r6}
 | |
|     mode2_4pix2_180 r9
 | |
|     stmia   r0!, {r3-r6}
 | |
|     mode2_4pix2_180 r8
 | |
|     stmia   r0!, {r3-r6}
 | |
|     mode2_4pix_to3 r7, 1
 | |
|     stmia   r0!, {r3-r5}
 | |
|     bpl     .loop_c2_32c_180
 | |
| 
 | |
| 	sub     r12, r12, #1
 | |
| 	adds    r12, r12, #1<<16
 | |
|     ldmeqfd sp!, {r4-r11,pc} @ return
 | |
|     add     r0,  r0, #16*4
 | |
|     sub     r1,  r1, #64+8
 | |
|     orr     r12, #(240/15-1)<<16
 | |
|     b       .loop_c2_32c_180
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| 
 | |
| .global vidClear @ void *to, int lines
 | |
| 
 | |
| vidClear:
 | |
|     stmfd   sp!, {lr}
 | |
|     mov     r12, #240/16-1
 | |
|     orr     r12, r1, r12, lsl #16
 | |
|     mov     r1, #0
 | |
|     mov     r2, #0
 | |
|     mov     r3, #0
 | |
|     mov     lr, #0
 | |
| 
 | |
| .loopVidClear:
 | |
| 	subs    r12, r12, #1<<16
 | |
| 
 | |
|     stmia   r0!, {r1-r3,lr}
 | |
|     stmia   r0!, {r1-r3,lr}
 | |
|     stmia   r0!, {r1-r3,lr}
 | |
|     stmia   r0!, {r1-r3,lr}
 | |
|     bpl     .loopVidClear
 | |
| 
 | |
| 	sub     r12, r12, #1
 | |
| 	adds    r12, r12, #1<<16
 | |
|     ldmeqfd sp!, {pc}        @ return
 | |
|     add     r0,  r0, #16*4
 | |
|     orr     r12, #(240/16-1)<<16
 | |
|     b       .loopVidClear
 | |
| 
 | 
