📄 mcomp_arm.asm
字号:
;*****************************************************************************
;*
;* This program is free software ; you can redistribute it and/or modify
;* it under the terms of the GNU General Public License as published by
;* the Free Software Foundation; either version 2 of the License, or
;* (at your option) any later version.
;*
;* This program is distributed in the hope that it will be useful,
;* but WITHOUT ANY WARRANTY; without even the implied warranty of
;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;* GNU General Public License for more details.
;*
;* You should have received a copy of the GNU General Public License
;* along with this program; if not, write to the Free Software
;* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;*
;* $Id: mcomp_arm.asm 327 2005-11-04 07:09:17Z picard $
;*
;* The Core Pocket Media Player
;* Copyright (c) 2004-2005 Gabor Kovacs
;*
;*****************************************************************************
;R0 src
;R1 dst
;R2 srcpitch
;R3 dstpitch
AREA |.text|, CODE
macro
PreLoad $ARM5,$Pos
if $ARM5>0
if $Pos >= 0
if $Pos > 0
pld [r0,r2,lsl #1]
add r0,r0,#8
pld [r0,r2,lsl #1]
sub r0,r0,#8
else
pld [r0,r2,lsl #1]
add r0,r0,#4
pld [r0,r2,lsl #1]
sub r0,r0,#4
endif
else
pld [r0,r2,lsl #1]
add r0,r0,#7
pld [r0,r2,lsl #1]
sub r0,r0,#7
endif
endif
mend
macro
PreLoad2Init $ARM5,$Pos
if $ARM5>0
if $Pos >= 0
if $Pos > 0
add r10,r2,r2
add r10,r10,#8
else
add r10,r2,r2
add r10,r10,#4
endif
else
add r10,r2,r2
add r10,r10,#7
endif
endif
mend
macro
PreLoad2 $ARM5,$Pos
if $ARM5>0
pld [r0,r2,lsl #1]
pld [r0,r10]
endif
mend
macro
CopyBuild $Name,$Sub,$Round,$Add,$Fast,$ARM5
align 16
export $Name
$Name proc
if $ARM5>0
add ip,r2,#7
pld [r0,r2]
pld [r0,#7]
endif
stmdb sp!, {r4 - r11, lr}
if $ARM5>0
pld [r0,ip]
pld [r0]
endif
if $Fast>0
movs r4,r0,lsl #30
beq $Name.L00
cmps r4,#0x80000000
beq $Name.L10
bhi $Name.L11
$Name.L01
bic r0,r0,#3
$Sub $Name.8,8,$Round,$Add,$ARM5
$Name.L10
bic r0,r0,#3
$Sub $Name.16,16,$Round,$Add,$ARM5
$Name.L11
bic r0,r0,#3
$Sub $Name.24,24,$Round,$Add,$ARM5
$Name.L00
$Sub $Name.0,0,$Round,$Add,$ARM5
else
$Sub $Name.s,-1,$Round,$Add,$ARM5
endif
endp
mend
;------------------------------------------
;COPYBLOCK
;------------------------------------------
macro
CopyBlockRow $Pos
if $Pos > 0
ldr r5,[r0,#8]
ldr r6,[r0,#4]
ldr r4,[r0],r2
mov r5,r5,lsl #32-$Pos
orr r5,r5,r6,lsr #$Pos
mov r4,r4,lsr #$Pos
orr r4,r4,r6,lsl #32-$Pos
else
ldr r5,[r0,#4]
ldr r4,[r0],r2
endif
str r5,[r1,#4]
str r4,[r1],r3
mend
macro
CopyBlock $Id, $Pos, $Round, $Add, $ARM5
PreLoad2Init $ARM5,$Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
PreLoad2 $ARM5,$Pos
CopyBlockRow $Pos
ldmia sp!, {r4 - r11, pc}
mend
;------------------------------------------
;COPYBLOCKM
;------------------------------------------
macro
CopyBlockMRow $Pos
if $Pos > 0
ldr r14,[r0,#16]
ldr r6,[r0,#12]
ldr r12,[r0,#8]
mov r14,r14,lsl #32-$Pos
orr r14,r14,r6,lsr #$Pos
mov r12,r12,lsr #$Pos
orr r12,r12,r6,lsl #32-$Pos
ldr r5,[r0,#8]
ldr r6,[r0,#4]
ldr r4,[r0],r2
mov r5,r5,lsl #32-$Pos
orr r5,r5,r6,lsr #$Pos
mov r4,r4,lsr #$Pos
orr r4,r4,r6,lsl #32-$Pos
else
ldr r5,[r0,#4]
ldr r12,[r0,#8]
ldr r14,[r0,#12]
ldr r4,[r0],r2
endif
str r5,[r1,#4]
str r12,[r1,#8]
str r14,[r1,#12]
str r4,[r1],r3
mend
macro
CopyBlockM $Id, $Pos, $Round, $Add, $ARM5
PreLoad2Init $ARM5,$Pos
mov r11,#16
$Id.Loop
PreLoad2 $ARM5,$Pos
CopyBlockMRow $Pos
subs r11,r11,#1
bne $Id.Loop
ldmia sp!, {r4 - r11, pc}
mend
;------------------------------------------
;COPYBLOCK16x16: no aligment!, only used in Copy()
;------------------------------------------
macro
CopyBlock16x16Row
ldr r7,[r0,#12]
ldr r6,[r0,#8]
ldr r5,[r0,#4]
ldr r4,[r0],r2
str r7,[r1,#12]
str r6,[r1,#8]
str r5,[r1,#4]
str r4,[r1],r3
mend
macro
CopyBlock16x16 $Id, $Pos, $Round, $Add, $ARM5
mov r11,#15
$Id.Loop
pld [r0,r2,lsl #1]
CopyBlock16x16Row
subs r11,r11,#1
bne $Id.Loop
;unroll last (no preload needed)
CopyBlock16x16Row
ldmia sp!, {r4 - r11, pc}
mend
;------------------------------------------
;COPYBLOCK8x8: no aligment!, only used in Copy()
;------------------------------------------
macro
CopyBlock8x8 $Id, $Pos, $Round, $Add, $ARM5
mov r11,#3
$Id.Loop
pld [r0,r2,lsl #1]
ldr r7,[r0,#4]
ldr r6,[r0],r2
pld [r0,r2,lsl #1]
ldr r5,[r0,#4]
ldr r4,[r0],r2
str r7,[r1,#4]
str r6,[r1],r3
str r5,[r1,#4]
str r4,[r1],r3
subs r11,r11,#1
bne $Id.Loop
;unroll last (no preload needed)
ldr r7,[r0,#4]
ldr r6,[r0],r2
ldr r5,[r0,#4]
ldr r4,[r0],r2
str r7,[r1,#4]
str r6,[r1],r3
str r5,[r1,#4]
str r4,[r1],r3
ldmia sp!, {r4 - r11, pc}
mend
;------------------------------------------
;ADDBLOCK
;------------------------------------------
macro
AddBlockRow $Pos
if $Pos < 0
ldrb r4,[r0]
ldrb r6,[r0,#1]
ldrb r5,[r0,#4]
ldrb r7,[r0,#5]
orr r4,r4,r6,lsl #8
ldrb r6,[r0,#2]
orr r5,r5,r7,lsl #8
ldrb r7,[r0,#6]
orr r4,r4,r6,lsl #16
ldrb r6,[r0,#3]
orr r5,r5,r7,lsl #16
ldrb r7,[r0,#7]
orr r4,r4,r6,lsl #24
add r0,r0,r2
orr r5,r5,r7,lsl #24
else
if $Pos > 0
ldr r5,[r0,#8]
ldr r6,[r0,#4]
ldr r4,[r0],r2
mov r5,r5,lsl #32-$Pos
orr r5,r5,r6,lsr #$Pos
mov r4,r4,lsr #$Pos
orr r4,r4,r6,lsl #32-$Pos
else
ldr r5,[r0,#4]
ldr r4,[r0],r2
endif
endif
ldr r7,[r1,#4]
ldr r6,[r1]
and r9,r12,r5,lsr #1
and r8,r12,r4,lsr #1
orr r5,r7,r5
orr r4,r6,r4
and r7,r12,r7,lsr #1
and r6,r12,r6,lsr #1
add r7,r7,r9
add r6,r6,r8
and r5,r5,r14
and r4,r4,r14
add r7,r7,r5
add r6,r6,r4
str r7,[r1,#4]
str r6,[r1],#8
mend
macro
AddBlock $Id, $Pos, $Round, $Add, $ARM5
PreLoad2Init $ARM5,$Pos
ldr r14,$Id.Mask
mov r11,#8
mvn r12,r14,lsl #7
$Id.Loop
PreLoad2 $ARM5,$Pos
AddBlockRow $Pos
subs r11,r11,#1
bne $Id.Loop
ldmia sp!, {r4 - r11, pc}
$Id.Mask dcd 0x01010101
mend
;------------------------------------------
; COPYBLOCKHOR
;------------------------------------------
macro
LoadHorRow $Id, $Pos
; result is r4,r5 and r8,r9 (one pixel to the right)
; r6,r7 can be used
if $Pos < 0
ldrb r4,[r0]
ldrb r6,[r0,#1]
ldrb r5,[r0,#4]
ldrb r7,[r0,#5]
orr r4,r4,r6,lsl #8
ldrb r6,[r0,#2]
orr r5,r5,r7,lsl #8
ldrb r7,[r0,#6]
orr r4,r4,r6,lsl #16
ldrb r6,[r0,#3]
orr r5,r5,r7,lsl #16
ldrb r7,[r0,#7]
orr r4,r4,r6,lsl #24
ldrb r6,[r0,#8]
orr r5,r5,r7,lsl #24
mov r8,r4,lsr #8
mov r9,r5,lsr #8
orr r8,r8,r5,lsl #24
orr r9,r9,r6,lsl #24
add r0,r0,r2
else
ldr r5,[r0,#4]
ldr r6,[r0,#8]
ldr r4,[r0],r2
if $Pos+8 < 32
mov r9,r5,lsr #$Pos+8
orr r9,r9,r6,lsl #32-$Pos-8
mov r8,r4,lsr #$Pos+8
orr r8,r8,r5,lsl #32-$Pos-8
else
mov r8,r5
mov r9,r6
endif
if $Pos > 0
mov r4,r4,lsr #$Pos
mov r6,r6,lsl #32-$Pos
orr r4,r4,r5,lsl #32-$Pos
orr r5,r6,r5,lsr #$Pos
endif
endif
mend
macro
CopyHorRow $Id, $Pos, $Round, $Add
;r14 01010101
;r12 7f7f7f7f
LoadHorRow $Id,$Pos
and r6,r12,r4,lsr #1
and r7,r12,r5,lsr #1
if $Round
and r4,r4,r8
and r5,r5,r9
else
orr r4,r4,r8
orr r5,r5,r9
endif
and r8,r12,r8,lsr #1
and r9,r12,r9,lsr #1
and r4,r4,r14
and r5,r5,r14
add r4,r4,r6
add r5,r5,r7
add r4,r4,r8
add r5,r5,r9
if $Add
ldr r7,[r1,#4]
ldr r6,[r1]
and r9,r12,r5,lsr #1
and r8,r12,r4,lsr #1
orr r5,r7,r5
orr r4,r6,r4
and r7,r12,r7,lsr #1
and r6,r12,r6,lsr #1
add r7,r7,r9
add r6,r6,r8
and r5,r5,r14
and r4,r4,r14
add r7,r7,r5
add r6,r6,r4
str r7,[r1,#4]
str r6,[r1],#8
else
str r5,[r1,#4]
str r4,[r1],r3
endif
mend
macro
CopyBlockHor $Id, $Pos, $Round, $Add, $ARM5
PreLoad2Init $ARM5,$Pos
ldr r14,$Id.Mask
mov r11,#8
mvn r12,r14,lsl #7
$Id.Loop
PreLoad2 $ARM5,$Pos
CopyHorRow $Id,$Pos,$Round,$Add
subs r11,r11,#1
bne $Id.Loop
ldmia sp!, {r4 - r11, pc}
$Id.Mask dcd 0x01010101
mend
;------------------------------------------
; COPYBLOCKVER
;------------------------------------------
macro
LoadVerRow $Id, $Pos, $Parity
if $Parity
; result is r8,r9 (r10=r8>>1,r11=r9>>1)
; r10,r11 can be used
if $Pos < 0
ldrb r8,[r0]
ldrb r10,[r0,#1]
ldrb r9,[r0,#4]
ldrb r11,[r0,#5]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -