📄 gfx.s
字号:
/*************************************************************************** gfx.S - description ------------------- begin : Mon Mar 13 2000 copyright : (C) 2000 by Michael Speck email : ***************************************************************************//*************************************************************************** * * * 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. * * * ***************************************************************************/.macro CrtStack pushl %ebp movl %esp, %ebp pushl %ebx.endm .macro DelStack popl %ebx popl %ebp.endm .data .balign 16.globl rrShftrrShft: .byte 0.globl grShftgrShft: .byte 0.globl brShftbrShft: .byte 0.globl rlShftrlShft: .byte 0.globl glShftglShft: .byte 0.globl blShftblShft: .byte 0.globl rMaskrMask: .long 0.globl gMaskgMask: .long 0.globl bMaskbMask: .long 0.globl bppbpp: .byte 0.globl pixelsizepixelsize: .byte 0.globl clp_lxclp_lx: .long 0.globl clp_tyclp_ty: .long 0.globl clp_rxclp_rx: .long 0.globl clp_byclp_by: .long 0 .text .balign 16.globl SD_PntSD_Pnt: CrtStack //x < lx movl clp_lx, %eax cmp %eax, 16(%ebp) jl 9f //y < ty movl clp_ty, %eax cmp %eax, 20(%ebp) jl 9f //x > rx movl clp_rx, %eax cmp %eax, 16(%ebp) jg 9f //y > ry subl clp_by, %eax cmp %eax, 20(%ebp) jg 9f xorw %bx, %bx movb 26(%ebp), %bl //get red part movb rrShft, %cl shrb %cl, %bl movb rlShft, %cl shlw %cl, %bx xorw %ax, %ax movb 25(%ebp), %al //get green part movb grShft, %cl shrb %cl, %al movb glShft, %cl shlw %cl, %ax orw %ax, %bx xorw %ax, %ax movb 24(%ebp), %al //get blue part movb brShft, %cl shrb %cl, %al movb blShft, %cl shlw %cl, %ax orw %ax, %bx //wordvalue in bx movl 20(%ebp), %eax //y movl 12(%ebp), %ecx //w mull %ecx addl 16(%ebp), %eax //offset in eax movl 8(%ebp), %ecx movw %bx, (%ecx,%eax,2)9: DelStack ret.globl SD_BoxSD_Box: CrtStack pushl %edi //x < lx ? movl clp_lx, %eax cmpl %eax, 16(%ebp) jge 0f movl 16(%ebp), %ebx subl %ebx, %eax subl %eax, 24(%ebp) movl clp_lx, %eax movl %eax, 16(%ebp)0: //y < ty ? movl clp_ty, %eax cmp %eax, 20(%ebp) jge 1f movl 20(%ebp), %ebx subl %ebx, %eax subl %eax, 28(%ebp) movl clp_ty, %eax movl %eax, 20(%ebp)1: //x > rx movl clp_rx, %eax movl 16(%ebp), %ebx addl 24(%ebp), %ebx subl $1, %ebx cmp %eax, %ebx jle 2f movl clp_rx, %ebx movl 16(%ebp), %eax subl %eax, %ebx addl $1, %ebx movl %ebx, 24(%ebp)2: //y > ty movl clp_by, %eax movl 20(%ebp), %ebx subl $1, %ebx addl 28(%ebp), %ebx cmp %eax, %ebx jle 3f movl clp_by, %ebx movl 20(%ebp), %eax subl %eax, %ebx addl $1, %ebx movl %ebx, 28(%ebp)3: //valid w? movl 24(%ebp), %eax cmpl $0, %eax jle 4f //valid h? movl 28(%ebp), %eax cmpl $0, %eax jle 4f xorw %bx, %bx movb 34(%ebp), %bl //get red part movb rrShft, %cl shrb %cl, %bl movb rlShft, %cl shlw %cl, %bx xorw %ax, %ax movb 33(%ebp), %al //get green part movb grShft, %cl shrb %cl, %al movb glShft, %cl shlw %cl, %ax orw %ax, %bx xorw %ax, %ax movb 32(%ebp), %al //get blue part movb brShft, %cl shrb %cl, %al movb blShft, %cl shlw %cl, %ax orw %bx, %ax //wordvalue in ax pushw %ax; movl 20(%ebp), %eax //load y_pos mull 12(%ebp) addl 16(%ebp), %eax movl %eax, %edi shll $1, %edi //offset in lpdest addl 8(%ebp), %edi //add lpdest_EA pushl %ds popl %es movl 28(%ebp), %edx //get height movl 12(%ebp), %ebx subl 24(%ebp), %ebx shll $1, %ebx //edi add-on popw %axlp: movl 24(%ebp), %ecx rep; stosw addl %ebx, %edi decl %edx jnz lp4: popl %edi DelStack ret.globl SD_RctSD_Rct: CrtStack pushl %edi //x < lx ? movl clp_lx, %eax cmpl %eax, 16(%ebp) jge 0f movl 16(%ebp), %ebx subl %ebx, %eax subl %eax, 24(%ebp) movl clp_lx, %eax movl %eax, 16(%ebp)0: //y < ty ? movl clp_ty, %eax cmp %eax, 20(%ebp) jge 1f movl 20(%ebp), %ebx subl %ebx, %eax subl %eax, 28(%ebp) movl clp_ty, %eax movl %eax, 20(%ebp)1: //x > rx movl clp_rx, %eax movl 16(%ebp), %ebx addl 24(%ebp), %ebx subl $1, %ebx cmp %eax, %ebx jle 2f movl clp_rx, %ebx movl 16(%ebp), %eax subl %eax, %ebx addl $1, %ebx movl %ebx, 24(%ebp)2: //y > ty movl clp_by, %eax movl 20(%ebp), %ebx subl $1, %ebx addl 28(%ebp), %ebx cmp %eax, %ebx jle 3f movl clp_by, %ebx movl 20(%ebp), %eax subl %eax, %ebx addl $1, %ebx movl %ebx, 28(%ebp)3: //valid w? movl 24(%ebp), %eax cmpl $0, %eax jle 4f //valid h? movl 28(%ebp), %eax cmpl $0, %eax jle 4f xorw %bx, %bx movb 34(%ebp), %bl //get red part movb rrShft, %cl shrb %cl, %bl movb rlShft, %cl shlw %cl, %bx xorw %ax, %ax movb 33(%ebp), %al //get green part movb grShft, %cl shrb %cl, %al movb glShft, %cl shlw %cl, %ax orw %ax, %bx xorw %ax, %ax movb 32(%ebp), %al //get blue part movb brShft, %cl shrb %cl, %al movb blShft, %cl shlw %cl, %ax orw %bx, %ax //wordvalue in ax pushw %ax; movl 20(%ebp), %eax //load y_pos mull 12(%ebp) addl 16(%ebp), %eax movl %eax, %edi shll $1, %edi //offset in lpdest addl 8(%ebp), %edi //add lpdest_EA pushl %ds popl %es movl 28(%ebp), %edx //get height subl $2, %edx movl 12(%ebp), %ebx subl 24(%ebp), %ebx shll $1, %ebx //edi add-on popw %ax movl 24(%ebp), %ecx rep; stosw addl %ebx, %edi cmp $0, %edx jle 9flp2: movw %ax, (%edi) movl 24(%ebp), %ecx subl $1, %ecx shll $1, %ecx addl %ecx, %edi; movw %ax, (%edi) addl $2, %edi; addl %ebx, %edi decl %edx jnz lp29: movl 24(%ebp), %ecx rep; stosw4: popl %edi DelStack ret.globl SD_CBxSD_CBx: CrtStack pushl %edi //x < lx ? movl clp_lx, %eax cmpl %eax, 16(%ebp) jge 0f movl 16(%ebp), %ebx subl %ebx, %eax subl %eax, 24(%ebp) movl clp_lx, %eax movl %eax, 16(%ebp)0: //y < ty ? movl clp_ty, %eax cmp %eax, 20(%ebp) jge 1f movl 20(%ebp), %ebx subl %ebx, %eax subl %eax, 28(%ebp) movl clp_ty, %eax movl %eax, 20(%ebp)1: //x > rx movl clp_rx, %eax movl 16(%ebp), %ebx addl 24(%ebp), %ebx subl $1, %ebx cmp %eax, %ebx jle 2f movl clp_rx, %ebx movl 16(%ebp), %eax subl %eax, %ebx addl $1, %ebx movl %ebx, 24(%ebp)2: //y > ty movl clp_by, %eax movl 20(%ebp), %ebx subl $1, %ebx addl 28(%ebp), %ebx cmp %eax, %ebx jle 3f movl clp_by, %ebx movl 20(%ebp), %eax subl %eax, %ebx addl $1, %ebx movl %ebx, 28(%ebp)3: //valid w? movl 24(%ebp), %eax cmpl $0, %eax jle 4f //valid h? movl 28(%ebp), %eax cmpl $0, %eax jle 4f xorl %edi, %edi xorl %eax, %eax //edi destination pushl %ds popl %es movl 20(%ebp), %eax mull 12(%ebp) addl 16(%ebp), %eax shll $1, %eax addl 8(%ebp), %eax movl %eax, %edi //dest offset in edi movl 28(%ebp), %edx //heightouterl5: movl 24(%ebp), %ecx //width pushl %edxinnerl5: pushl %ecx xor %eax, %eax movb 34(%ebp), %al movb rrShft, %cl shrb %cl, %al mull 36(%ebp) movb rlShft, %cl shll %cl, %eax pushl %eax //relative red source part movl (%edi), %eax andl rMask, %eax shrl %cl, %eax movl $100, %ebx subl 36(%ebp), %ebx mull %ebx shll %cl, %eax //relative red dest part popl %ebx addl %ebx, %eax movl $100, %ebx divl %ebx andl rMask, %eax pushl %eax xor %eax, %eax movb 33(%ebp), %al movb grShft, %cl shrb %cl, %al mull 36(%ebp) movb glShft, %cl shll %cl, %eax pushl %eax //relative green source part movl (%edi), %eax andl gMask, %eax shrl %cl, %eax movl $100, %ebx subl 36(%ebp), %ebx mull %ebx shll %cl, %eax //relative green dest part popl %ebx addl %ebx, %eax movl $100, %ebx divl %ebx andl gMask, %eax pushl %eax xor %eax, %eax movb 32(%ebp), %al movb brShft, %cl shrb %cl, %al mull 36(%ebp) movb blShft, %cl shll %cl, %eax pushl %eax //relative blue source part movl (%edi), %eax andl bMask, %eax shrl %cl, %eax movl $100, %ebx subl 36(%ebp), %ebx mull %ebx shll %cl, %eax //relative blue dest part popl %ebx addl %ebx, %eax movl $100, %ebx divl %ebx andl bMask, %eax popl %ebx orl %ebx, %eax popl %ebx orl %ebx, %eax movw %ax, (%edi) addl $2, %edi popl %ecx decl %ecx jnz innerl5 popl %edx movl 12(%ebp), %ebx subl 24(%ebp), %ebx shll $1, %ebx addl %ebx, %edi decl %edx jnz outerl5 4: popl %edi DelStack ret.globl SC_OpqSC_Opq: CrtStack pushl %edi pushl %esi //x < lx ? movl clp_lx, %eax cmpl %eax, 16(%ebp) jge 0f movl 16(%ebp), %ebx subl %ebx, %eax subl %eax, 40(%ebp) addl %eax, 32(%ebp) movl clp_lx, %eax movl %eax, 16(%ebp)0: //y < ty ? movl clp_ty, %eax cmp %eax, 20(%ebp) jge 1f movl 20(%ebp), %ebx subl %ebx, %eax subl %eax, 44(%ebp) addl %eax, 36(%ebp) movl clp_ty, %eax movl %eax, 20(%ebp)1: //x > rx movl clp_rx, %eax movl 16(%ebp), %ebx addl 40(%ebp), %ebx subl $1, %ebx cmp %eax, %ebx jle 2f movl clp_rx, %ebx movl 16(%ebp), %eax subl %eax, %ebx addl $1, %ebx movl %ebx, 40(%ebp)2: //y > ty movl clp_by, %eax movl 20(%ebp), %ebx addl 44(%ebp), %ebx subl $1, %ebx cmp %eax, %ebx jle 3f movl clp_by, %ebx movl 20(%ebp), %eax subl %eax, %ebx addl $1, %ebx movl %ebx, 44(%ebp)3: //valid w? movl 40(%ebp), %eax cmpl $0, %eax jle 4f //valid h? movl 44(%ebp), %eax cmpl $0, %eax jle 4f xorl %edi, %edi xorl %esi, %esi xorl %eax, %eax //esi source movl 36(%ebp), %eax //sy mull 28(%ebp) //dw addl 32(%ebp), %eax //sx shll $1, %eax addl 24(%ebp), %eax movl %eax, %esi //source offset in esi //edi destination pushl %ds popl %es movl 20(%ebp), %eax mull 12(%ebp) addl 16(%ebp), %eax shll $1, %eax addl 8(%ebp), %eax movl %eax, %edi //dest offset in edi movl 12(%ebp), %eax subl 40(%ebp), %eax shll $1, %eax //edi add-on after completed line movl 28(%ebp), %ebx subl 40(%ebp), %ebx shll $1, %ebx //esi add-on after completed line movl 44(%ebp), %edx //heightouterl3: movl 40(%ebp), %ecx //line width rep; movsw addl %eax, %edi addl %ebx, %esi dec %edx jnz outerl34: popl %esi popl %edi DelStack ret.globl SC_ClpSC_Clp: CrtStack pushl %edi pushl %esi //x < lx ? movl clp_lx, %eax cmpl %eax, 16(%ebp) jge 0f movl 16(%ebp), %ebx subl %ebx, %eax subl %eax, 40(%ebp) addl %eax, 32(%ebp) movl clp_lx, %eax movl %eax, 16(%ebp)0: //y < ty ? movl clp_ty, %eax cmp %eax, 20(%ebp) jge 1f movl 20(%ebp), %ebx subl %ebx, %eax subl %eax, 44(%ebp) addl %eax, 36(%ebp) movl clp_ty, %eax movl %eax, 20(%ebp)1: //x > rx movl clp_rx, %eax movl 16(%ebp), %ebx addl 40(%ebp), %ebx subl $1, %ebx cmp %eax, %ebx jle 2f movl clp_rx, %ebx movl 16(%ebp), %eax subl %eax, %ebx addl $1, %ebx movl %ebx, 40(%ebp)2: //y > ty movl clp_by, %eax movl 20(%ebp), %ebx addl 44(%ebp), %ebx subl $1, %ebx cmp %eax, %ebx jle 3f movl clp_by, %ebx movl 20(%ebp), %eax subl %eax, %ebx addl $1, %ebx movl %ebx, 44(%ebp)3: //valid w? movl 40(%ebp), %eax cmpl $0, %eax jle 4f //valid h? movl 44(%ebp), %eax cmpl $0, %eax jle 4f xorl %edi, %edi xorl %esi, %esi xorl %eax, %eax //esi source movl 36(%ebp), %eax //sy mull 28(%ebp) //dw addl 32(%ebp), %eax //sx shll $1, %eax addl 24(%ebp), %eax movl %eax, %esi //source offset in esi //edi destination pushl %ds popl %es movl 20(%ebp), %eax mull 12(%ebp) addl 16(%ebp), %eax shll $1, %eax addl 8(%ebp), %eax movl %eax, %edi //dest offset in edi movl 12(%ebp), %eax subl 40(%ebp), %eax shll $1, %eax //edi add-on after completed line movl 28(%ebp), %ebx subl 40(%ebp), %ebx shll $1, %ebx //esi add-on after completed line movl 44(%ebp), %edxouterl2: movl 40(%ebp), %ecxinnerl2: pushl %ecx movw (%esi), %cx cmp $0, %cx jz nopixel
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -