⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcomp_arm.asm

📁 大名鼎鼎的CE下播放软件,TCPPMP的源代码!!!2410下可以流畅的解QVGA的H264,MPEG4等格式.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*****************************************************************************
;*
;* 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 + -