📄 spr8x8_8.s
字号:
pushl %esi
pushl %ebx
movl 16(%esp),%esi // source
movl 24(%esp),%ebx // y
movl 28(%esp),%eax // cmap
sall $2,%ebx
movb %al,%ah // cmap
movl 0xDEADBEEF(%ebx),%edi
blin_08:
mov %ax,%cx // cmap
addl 20(%esp),%edi // x
shll $16,%ecx // cmap
movl $0xDEADBEEF,%edx // screen width
bitw_08:
mov %ax,%cx // cmap
//#define OPTIMIZATION_MMX
#ifdef OPTIMIZATION_MMX
// This is an mmx version... It is faster? Not really :(
movl %ecx,(%edi)
movl %ecx,4(%edi)
movq (%edi),%mm0
movq (%esi),%mm1
movq 8(%esi),%mm2
por %mm0,%mm1
movq 16(%esi),%mm3
por %mm0,%mm2
movq 24(%esi),%mm4
por %mm0,%mm3
movq %mm1,(%edi)
por %mm0,%mm4
movq 32(%esi),%mm1
movq %mm2,0xDEADBEEF(%edi); mmx_w01:
por %mm0,%mm1
movq 40(%esi),%mm2
movq %mm3,0xDEADBEEF(%edi); mmx_w02:
por %mm0,%mm2
movq 48(%esi),%mm3
movq %mm4,0xDEADBEEF(%edi); mmx_w03:
por %mm0,%mm3
movq 56(%esi),%mm4
movq %mm1,0xDEADBEEF(%edi); mmx_w04:
por %mm0,%mm4
movq %mm2,0xDEADBEEF(%edi); mmx_w05:
movq %mm3,0xDEADBEEF(%edi); mmx_w06:
movq %mm4,0xDEADBEEF(%edi); mmx_w07:
emms // This instruction costs a lot of CPU !
#else
movl (%esi),%eax
movl 4(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi)
movl %ebx,4(%edi)
movl 8(%esi),%eax
movl 12(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi,%edx)
movl %ebx,4(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 16(%esi),%eax
movl 20(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi)
movl %ebx,4(%edi)
movl 24(%esi),%eax
movl 28(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi,%edx)
movl %ebx,4(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 32(%esi),%eax
movl 36(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi)
movl %ebx,4(%edi)
movl 40(%esi),%eax
movl 44(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi,%edx)
movl %ebx,4(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 48(%esi),%eax
movl 52(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi)
movl %ebx,4(%edi)
movl 56(%esi),%eax
movl 60(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi,%edx)
movl %ebx,4(%edi,%edx)
#endif
popl %ebx
popl %esi
popl %edi
ret
FUNC(Draw8x8_FlipY)
pushl %edi
pushl %esi
pushl %ebx
movl 16(%esp),%esi // source
movl 24(%esp),%ebx // y
movl 28(%esp),%eax // cmap
sall $2,%ebx
movb %al,%ah // cmap
movl 0xDEADBEEF(%ebx),%edi
blin_09:
mov %ax,%cx // cmap
addl 20(%esp),%edi // x
shll $16,%ecx // cmap
movl $0xDEADBEEF,%edx // screen width
bitw_09:
mov %ax,%cx // cmap
movl (%esi),%eax
movl 4(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi)
movl %ebx,(%edi)
movl 8(%esi),%eax
movl 12(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi,%edx)
movl %ebx,(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 16(%esi),%eax
movl 20(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi)
movl %ebx,(%edi)
movl 24(%esi),%eax
movl 28(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi,%edx)
movl %ebx,(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 32(%esi),%eax
movl 36(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi)
movl %ebx,(%edi)
movl 40(%esi),%eax
movl 44(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi,%edx)
movl %ebx,(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 48(%esi),%eax
movl 52(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi)
movl %ebx,(%edi)
movl 56(%esi),%eax
movl 60(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi,%edx)
movl %ebx,(%edi,%edx)
popl %ebx
popl %esi
popl %edi
ret
FUNC(Draw8x8_FlipX)
pushl %edi
pushl %esi
pushl %ebx
movl 16(%esp),%esi // source
movl 24(%esp),%ebx // y
movl 28(%esp),%eax // cmap
sall $2,%ebx
movb %al,%ah // cmap
movl 0xDEADBEEF(%ebx),%edi
blin_10:
mov %ax,%cx // cmap
addl 20(%esp),%edi // x
shll $16,%ecx // cmap
movl $0xDEADBEEF,%edx // screen width
bitw_10:
mov %ax,%cx // cmap
neg %edx
movl (%esi),%eax
movl 4(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi)
movl %ebx,4(%edi)
movl 8(%esi),%eax
movl 12(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi,%edx)
movl %ebx,4(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 16(%esi),%eax
movl 20(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi)
movl %ebx,4(%edi)
movl 24(%esi),%eax
movl 28(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi,%edx)
movl %ebx,4(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 32(%esi),%eax
movl 36(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi)
movl %ebx,4(%edi)
movl 40(%esi),%eax
movl 44(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi,%edx)
movl %ebx,4(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 48(%esi),%eax
movl 52(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi)
movl %ebx,4(%edi)
movl 56(%esi),%eax
movl 60(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
movl %eax,(%edi,%edx)
movl %ebx,4(%edi,%edx)
popl %ebx
popl %esi
popl %edi
ret
FUNC(Draw8x8_FlipXY)
pushl %edi
pushl %esi
pushl %ebx
movl 16(%esp),%esi // source
movl 24(%esp),%ebx // y
movl 28(%esp),%eax // cmap
sall $2,%ebx
movb %al,%ah // cmap
movl 0xDEADBEEF(%ebx),%edi
blin_11:
mov %ax,%cx // cmap
addl 20(%esp),%edi // x
shll $16,%ecx // cmap
movl $0xDEADBEEF,%edx // screen width
bitw_11:
mov %ax,%cx // cmap
neg %edx
movl (%esi),%eax
movl 4(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi)
movl %ebx,(%edi)
movl 8(%esi),%eax
movl 12(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi,%edx)
movl %ebx,(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 16(%esi),%eax
movl 20(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi)
movl %ebx,(%edi)
movl 24(%esi),%eax
movl 28(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi,%edx)
movl %ebx,(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 32(%esi),%eax
movl 36(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi)
movl %ebx,(%edi)
movl 40(%esi),%eax
movl 44(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi,%edx)
movl %ebx,(%edi,%edx)
leal (%edi,%edx,2),%edi
movl 48(%esi),%eax
movl 52(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi)
movl %ebx,(%edi)
movl 56(%esi),%eax
movl 60(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
bswap %eax
bswap %ebx
movl %eax,4(%edi,%edx)
movl %ebx,(%edi,%edx)
popl %ebx
popl %esi
popl %edi
ret
FUNC(Draw8x8_Trans)
pushl %edi
pushl %esi
pushl %ebx
movl 16(%esp),%esi // source
movl 24(%esp),%ebx // y
movl 28(%esp),%eax // cmap
sall $2,%ebx
movb %al,%ah // cmap
movl 0xDEADBEEF(%ebx),%edi
blin_12:
mov %ax,%cx // cmap
addl 20(%esp),%edi // x
shll $16,%ecx // cmap
movl $8,%edx // tile height
mov %ax,%cx // cmap
jmp 9f
.align 8
9:
movl (%esi),%eax
movl 4(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
cmpb %ch,%al
je 7f
movb %al,(%edi)
7: cmpb %ch,%bl
je 7f
movb %bl,4(%edi)
7: cmpb %ch,%ah
je 7f
movb %ah,1(%edi)
7: cmpb %ch,%bh
je 7f
movb %bh,5(%edi)
7:
shr $16,%eax
shr $16,%ebx
cmpb %ch,%al
je 7f
movb %al,2(%edi)
7: cmpb %ch,%bl
je 7f
movb %bl,6(%edi)
7: cmpb %ch,%ah
je 7f
movb %ah,3(%edi)
7: cmpb %ch,%bh
je 7f
movb %bh,7(%edi)
7:
addl $8,%esi // Next Tile Line
addl $0xDEADBEEF,%edi // Next Screen Line
bitw_12:
decl %edx
jne 9b
popl %ebx
popl %esi
popl %edi
ret
FUNC(Draw8x8_Trans_FlipY)
pushl %edi
pushl %esi
pushl %ebx
movl 16(%esp),%esi // source
movl 24(%esp),%ebx // y
movl 28(%esp),%eax // cmap
sall $2,%ebx
movb %al,%ah // cmap
movl 0xDEADBEEF(%ebx),%edi
blin_13:
mov %ax,%cx // cmap
addl 20(%esp),%edi // x
shll $16,%ecx // cmap
movl $8,%edx // tile height
mov %ax,%cx // cmap
jmp 9f
.align 8
9:
movl (%esi),%eax
movl 4(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
cmpb %ch,%al
je 7f
movb %al,7(%edi)
7: cmpb %ch,%bl
je 7f
movb %bl,7-4(%edi)
7: cmpb %ch,%ah
je 7f
movb %ah,7-1(%edi)
7: cmpb %ch,%bh
je 7f
movb %bh,7-5(%edi)
7:
shr $16,%eax
shr $16,%ebx
cmpb %ch,%al
je 7f
movb %al,7-2(%edi)
7: cmpb %ch,%bl
je 7f
movb %bl,7-6(%edi)
7: cmpb %ch,%ah
je 7f
movb %ah,7-3(%edi)
7: cmpb %ch,%bh
je 7f
movb %bh,(%edi)
7:
addl $8,%esi // Next Tile Line
addl $0xDEADBEEF,%edi // Next Screen Line
bitw_13:
decl %edx
jne 9b
popl %ebx
popl %esi
popl %edi
ret
FUNC(Draw8x8_Trans_FlipX)
pushl %edi
pushl %esi
pushl %ebx
movl 16(%esp),%esi // source
movl 24(%esp),%ebx // y
movl 28(%esp),%eax // cmap
sall $2,%ebx
movb %al,%ah // cmap
movl 0xDEADBEEF(%ebx),%edi
blin_14:
mov %ax,%cx // cmap
addl 20(%esp),%edi // x
shll $16,%ecx // cmap
movl $8,%edx // tile height
mov %ax,%cx // cmap
jmp 9f
.align 8
9:
movl (%esi),%eax
movl 4(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
cmpb %ch,%al
je 7f
movb %al,(%edi)
7: cmpb %ch,%bl
je 7f
movb %bl,4(%edi)
7: cmpb %ch,%ah
je 7f
movb %ah,1(%edi)
7: cmpb %ch,%bh
je 7f
movb %bh,5(%edi)
7:
shr $16,%eax
shr $16,%ebx
cmpb %ch,%al
je 7f
movb %al,2(%edi)
7: cmpb %ch,%bl
je 7f
movb %bl,6(%edi)
7: cmpb %ch,%ah
je 7f
movb %ah,3(%edi)
7: cmpb %ch,%bh
je 7f
movb %bh,7(%edi)
7:
addl $8,%esi // Next Tile Line
subl $0xDEADBEEF,%edi // Next Screen Line
bitw_14:
decl %edx
jne 9b
popl %ebx
popl %esi
popl %edi
ret
FUNC(Draw8x8_Trans_FlipXY)
pushl %edi
pushl %esi
pushl %ebx
movl 16(%esp),%esi // source
movl 24(%esp),%ebx // y
movl 28(%esp),%eax // cmap
sall $2,%ebx
movb %al,%ah // cmap
movl 0xDEADBEEF(%ebx),%edi
blin_15:
mov %ax,%cx // cmap
addl 20(%esp),%edi // x
shll $16,%ecx // cmap
movl $8,%edx // tile height
mov %ax,%cx // cmap
jmp 9f
.align 8
9:
movl (%esi),%eax
movl 4(%esi),%ebx
orl %ecx,%eax
orl %ecx,%ebx
cmpb %ch,%al
je 7f
movb %al,7(%edi)
7: cmpb %ch,%bl
je 7f
movb %bl,7-4(%edi)
7: cmpb %ch,%ah
je 7f
movb %ah,7-1(%edi)
7: cmpb %ch,%bh
je 7f
movb %bh,7-5(%edi)
7:
shr $16,%eax
shr $16,%ebx
cmpb %ch,%al
je 7f
movb %al,7-2(%edi)
7: cmpb %ch,%bl
je 7f
movb %bl,7-6(%edi)
7: cmpb %ch,%ah
je 7f
movb %ah,7-3(%edi)
7: cmpb %ch,%bh
je 7f
movb %bh,(%edi)
7:
addl $8,%esi // Next Tile Line
subl $0xDEADBEEF,%edi // Next Screen Line
bitw_15:
decl %edx
jne 9b
popl %ebx
popl %esi
popl %edi
ret
FUNC(init_spr8x8asm)
movl GLOBL(GameBitmap),%eax // Adress of the GameBitmap's structure
movl (%eax),%eax // Width
movl %eax,bitw_00-4
movl %eax,bitw_01-4
movl %eax,bitw_02-4
movl %eax,bitw_03-4
movl %eax,bitw_04-4
movl %eax,bitw_05-4
movl %eax,bitw_06-4
movl %eax,bitw_07-4
movl %eax,bitw_08-4
movl %eax,bitw_09-4
movl %eax,bitw_10-4
movl %eax,bitw_11-4
movl %eax,bitw_12-4
movl %eax,bitw_13-4
movl %eax,bitw_14-4
movl %eax,bitw_15-4
movl GLOBL(GameBitmap),%eax
addl $64,%eax // Line 0
movl %eax,blin_00-4
movl %eax,blin_01-4
movl %eax,blin_04-4
movl %eax,blin_05-4
movl %eax,blin_08-4
movl %eax,blin_09-4
movl %eax,blin_12-4
movl %eax,blin_13-4
addl $7*4,%eax // Line 7
movl %eax,blin_02-4
movl %eax,blin_03-4
movl %eax,blin_06-4
movl %eax,blin_07-4
movl %eax,blin_10-4
movl %eax,blin_11-4
movl %eax,blin_14-4
movl %eax,blin_15-4
#ifdef OPTIMIZATION_MMX
push %ebx
movl GLOBL(GameBitmap),%ebx // Adress of the GameBitmap's structure
movl (%ebx),%ebx // Width
movl %ebx,%eax
movl %eax,mmx_w01-4 // Width * 1
addl %ebx,%eax
movl %eax,mmx_w02-4 // Width * 2
addl %ebx,%eax
movl %eax,mmx_w03-4 // Width * 3
addl %ebx,%eax
movl %eax,mmx_w04-4 // Width * 4
addl %ebx,%eax
movl %eax,mmx_w05-4 // Width * 5
addl %ebx,%eax
movl %eax,mmx_w06-4 // Width * 6
addl %ebx,%eax
movl %eax,mmx_w07-4 // Width * 7
pop %ebx
#endif
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -