home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 5
/
FreshFish_July-August1994.bin
/
bbs
/
dev
/
c2p.lha
/
C2P
/
CPU_Only
/
c2p_020.s
< prev
next >
Wrap
Text File
|
1994-07-01
|
7KB
|
287 lines
; Chunky2Planar algorithm. [writes pipelined a little]
;
; Cpu only solution
; Optimised for 020+fastram
; Aim for less than 90ms for 320x200x256 on 14MHz 020
;
;
; NOTE: uses hardcoded values for screen size
; assumes planes are allocated contiguously
;
; -------------------------------------------------------------------
;
; void __asm c2p_020( register __a0 UBYTE *chunky,
; register __a1 PLANEPTR raster );
;
; -------------------------------------------------------------------
;
; see c2p_020_test.c for example of usage
opt o-,l+,d+
xdef _c2p_020
WIDTH equ 320 ; MUST be multiple of 32
HEIGHT equ 200
plsiz equ (WIDTH/8)*HEIGHT
cnop 0,4
_c2p_020:
movem.l d2-d7/a2-a6,-(sp)
move.l a0,a2
add.l #plsiz*8,a2 ;a2 = end of chunky buffer
;; Sweep thru the whole chunky data once,
;; Performing 3 merge operations on it.
move.l #$00ff00ff,a3 ; load byte merge mask
move.l #$0f0f0f0f,a4 ; load nibble merge mask
firstsweep
movem.l (a0),d0-d7 ;8+4n 40 cycles
move.l d4,a6 a6 = CD
move.w d0,d4 d4 = CB
swap d4 d4 = BC
move.w d4,d0 d0 = AC
move.w a6,d4 d4 = BD
move.l d5,a6 a6 = CD
move.w d1,d5 d5 = CB
swap d5 d5 = BC
move.w d5,d1 d1 = AC
move.w a6,d5 d5 = BD
move.l d6,a6 a6 = CD
move.w d2,d6 d6 = CB
swap d6 d6 = BC
move.w d6,d2 d2 = AC
move.w a6,d6 d6 = BD
move.l d7,a6 a6 = CD
move.w d3,d7 d7 = CB
swap d7 d7 = BC
move.w d7,d3 d3 = AC
move.w a6,d7 d7 = BD
move.l d7,a6
move.l d6,a5
move.l a3,d6 ; d6 = 0x0x
move.l a3,d7 ; d7 = 0x0x
and.l d0,d6 ; d6 = 0b0r
and.l d2,d7 ; d7 = 0j0z
eor.l d6,d0 ; d0 = a0q0
eor.l d7,d2 ; d2 = i0y0
lsl.l #8,d6 ; d6 = b0r0
lsr.l #8,d2 ; d2 = 0i0y
or.l d2,d0 ; d0 = aiqy
or.l d7,d6 ; d2 = bjrz
move.l a3,d7 ; d7 = 0x0x
move.l a3,d2 ; d2 = 0x0x
and.l d1,d7 ; d7 = 0b0r
and.l d3,d2 ; d2 = 0j0z
eor.l d7,d1 ; d1 = a0q0
eor.l d2,d3 ; d3 = i0y0
lsl.l #8,d7 ; d7 = b0r0
lsr.l #8,d3 ; d3 = 0i0y
or.l d3,d1 ; d1 = aiqy
or.l d2,d7 ; d3 = bjrz
move.l a4,d2 ; d2 = 0x0x
move.l a4,d3 ; d3 = 0x0x
and.l d0,d2 ; d2 = 0b0r
and.l d1,d3 ; d3 = 0j0z
eor.l d2,d0 ; d0 = a0q0
eor.l d3,d1 ; d1 = i0y0
lsr.l #4,d1 ; d1 = 0i0y
or.l d1,d0 ; d0 = aiqy
move.l d0,(a0)+
lsl.l #4,d2
or.l d3,d2 ; d1 = bjrz
move.l d2,(a0)+
move.l a4,d3 ; d3 = 0x0x
move.l a4,d1 ; d1 = 0x0x
and.l d6,d3 ; d3 = 0b0r
and.l d7,d1 ; d1 = 0j0z
eor.l d3,d6 ; d6 = a0q0
eor.l d1,d7 ; d7 = i0y0
lsr.l #4,d7 ; d7 = 0i0y
or.l d7,d6 ; d6 = aiqy
move.l d6,(a0)+
lsl.l #4,d3
or.l d1,d3 ; d7 = bjrz
move.l d3,(a0)+
; move.l d0,(a0)+
; move.l d2,(a0)+
; move.l d6,(a0)+
; move.l d3,(a0)+
move.l a6,d7
move.l a5,d6
move.l a3,d0 ; d0 = 0x0x
move.l a3,d1 ; d1 = 0x0x
and.l d4,d0 ; d0 = 0b0r
and.l d6,d1 ; d1 = 0j0z
eor.l d0,d4 ; d4 = a0q0
eor.l d1,d6 ; d6 = i0y0
lsl.l #8,d0 ; d0 = b0r0
lsr.l #8,d6 ; d6 = 0i0y
or.l d6,d4 ; d4 = aiqy
or.l d1,d0 ; d6 = bjrz
move.l a3,d1 ; d1 = 0x0x
move.l a3,d6 ; d6 = 0x0x
and.l d5,d1 ; d1 = 0b0r
and.l d7,d6 ; d6 = 0j0z
eor.l d1,d5 ; d5 = a0q0
eor.l d6,d7 ; d7 = i0y0
lsl.l #8,d1 ; d1 = b0r0
lsr.l #8,d7 ; d7 = 0i0y
or.l d7,d5 ; d5 = aiqy
or.l d6,d1 ; d7 = bjrz
move.l a4,d6 ; d6 = 0x0x
move.l a4,d7 ; d7 = 0x0x
and.l d4,d6 ; d6 = 0b0r
and.l d5,d7 ; d7 = 0j0z
eor.l d6,d4 ; d4 = a0q0
eor.l d7,d5 ; d5 = i0y0
lsr.l #4,d5 ; d5 = 0i0y
or.l d5,d4 ; d4 = aiqy
move.l d4,(a0)+
lsl.l #4,d6 ; d6 = b0r0
or.l d7,d6 ; d5 = bjrz
move.l d6,(a0)+
move.l a4,d7 ; d7 = 0x0x
move.l a4,d5 ; d5 = 0x0x
and.l d0,d7 ; d7 = 0b0r
and.l d1,d5 ; d5 = 0j0z
eor.l d7,d0 ; d0 = a0q0
eor.l d5,d1 ; d1 = i0y0
lsr.l #4,d1 ; d1 = 0i0y
or.l d1,d0 ; d0 = aiqy
move.l d0,(a0)+
lsl.l #4,d7 ; d7 = b0r0
or.l d5,d7 ; d1 = bjrz
move.l d7,(a0)+
cmp.l a0,a2 ;; 4c
bne.w firstsweep ;; 6c
sub.l #plsiz*8,a0
move.l #$33333333,a5
move.l #$55555555,a6
lea plsiz*4(a1),a1 ;a2 = plane4
secondsweep
move.l (a0),d0
move.l 8(a0),d1
move.l 16(a0),d2
move.l 24(a0),d3
move.l a5,d6 ; d6 = 0x0x
move.l a5,d7 ; d7 = 0x0x
and.l d0,d6 ; d6 = 0b0r
and.l d2,d7 ; d7 = 0j0z
eor.l d6,d0 ; d0 = a0q0
eor.l d7,d2 ; d2 = i0y0
lsl.l #2,d6 ; d6 = b0r0
lsr.l #2,d2 ; d2 = 0i0y
or.l d2,d0 ; d0 = aiqy
or.l d7,d6 ; d2 = bjrz
move.l a5,d7 ; d7 = 0x0x
move.l a5,d2 ; d2 = 0x0x
and.l d1,d7 ; d7 = 0b0r
and.l d3,d2 ; d2 = 0j0z
eor.l d7,d1 ; d1 = a0q0
eor.l d2,d3 ; d3 = i0y0
lsl.l #2,d7 ; d7 = b0r0
lsr.l #2,d3 ; d3 = 0i0y
or.l d3,d1 ; d1 = aiqy
or.l d2,d7 ; d3 = bjrz
move.l a6,d2 ; d2 = 0x0x
move.l a6,d3 ; d3 = 0x0x
and.l d0,d2 ; d2 = 0b0r
and.l d1,d3 ; d3 = 0j0z
eor.l d2,d0 ; d0 = a0q0
eor.l d3,d1 ; d1 = i0y0
lsr.l #1,d1 ; d1 = 0i0y
or.l d1,d0 ; d0 = aiqy
move.l d0,plsiz*3(a1)
add.l d2,d2
or.l d3,d2 ; d1 = bjrz
move.l d2,plsiz*2(a1)
move.l a6,d3 ; d3 = 0x0x
move.l a6,d1 ; d1 = 0x0x
and.l d6,d3 ; d3 = 0b0r
and.l d7,d1 ; d1 = 0j0z
eor.l d3,d6 ; d6 = a0q0
eor.l d1,d7 ; d7 = i0y0
lsr.l #1,d7 ; d7 = 0i0y
or.l d7,d6 ; d6 = aiqy
move.l d6,plsiz*1(a1)
add.l d3,d3
or.l d1,d3 ; d7 = bjrz
move.l d3,(a1)+
move.l 4(a0),d0
move.l 12(a0),d1
move.l 20(a0),d2
move.l 28(a0),d3
move.l a5,d6 ; d6 = 0x0x
move.l a5,d7 ; d7 = 0x0x
and.l d0,d6 ; d6 = 0b0r
and.l d2,d7 ; d7 = 0j0z
eor.l d6,d0 ; d0 = a0q0
eor.l d7,d2 ; d2 = i0y0
lsl.l #2,d6 ; d6 = b0r0
lsr.l #2,d2 ; d2 = 0i0y
or.l d2,d0 ; d0 = aiqy
or.l d7,d6 ; d2 = bjrz
move.l a5,d7 ; d7 = 0x0x
move.l a5,d2 ; d2 = 0x0x
and.l d1,d7 ; d7 = 0b0r
and.l d3,d2 ; d2 = 0j0z
eor.l d7,d1 ; d1 = a0q0
eor.l d2,d3 ; d3 = i0y0
lsl.l #2,d7 ; d7 = b0r0
lsr.l #2,d3 ; d3 = 0i0y
or.l d3,d1 ; d1 = aiqy
or.l d2,d7 ; d3 = bjrz
move.l a6,d2 ; d2 = 0x0x
move.l a6,d3 ; d3 = 0x0x
and.l d0,d2 ; d2 = 0b0r
and.l d1,d3 ; d3 = 0j0z
eor.l d2,d0 ; d0 = a0q0
eor.l d3,d1 ; d1 = i0y0
lsr.l #1,d1 ; d1 = 0i0y
or.l d1,d0 ; d0 = aiqy
move.l d0,-4-plsiz*1(a1)
add.l d2,d2
or.l d3,d2 ; d1 = bjrz
move.l d2,-4-plsiz*2(a1)
move.l a6,d3 ; d3 = 0x0x
move.l a6,d1 ; d1 = 0x0x
and.l d6,d3 ; d3 = 0b0r
and.l d7,d1 ; d1 = 0j0z
eor.l d3,d6 ; d6 = a0q0
eor.l d1,d7 ; d7 = i0y0
lsr.l #1,d7 ; d7 = 0i0y
or.l d7,d6 ; d6 = aiqy
move.l d6,-4-plsiz*3(a1)
add.l d3,d3
or.l d1,d3 ; d7 = bjrz
move.l d3,-4-plsiz*4(a1)
add.w #32,a0 ;;4c
cmp.l a0,a2 ;;4c
bne.w secondsweep ;;6c
;300
exit
movem.l (sp)+,d2-d7/a2-a6
rts