File:  [UNIX Amiga Emulator] / uae / src / X86.S
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 16:39:04 2018 UTC (8 years, 2 months ago) by root
Branches: MAIN, BSchmidt
CVS tags: uae068, HEAD
uae-0.6.8

/* These are optimized x86 assembly versions of pfield_linetoscr.
 * Feel free to send me Sparc/PPC/Alpha versions of this... :)
 */

#ifdef X86_PPRO_OPT
#define BYTE_REG(a,b) a
#define BYTE_MOVE movzbl
#else
#define BYTE_REG(a,b) b
#define BYTE_MOVE movb
#endif

#ifndef USE_UNDERSCORE
#define SYM(NAME) NAME
#define FUNCTION_ALIGN .align 16
/* Urgl... */
#else
#define SYM(NAME) _##NAME
/* Urgl... */
#define FUNCTION_ALIGN .align 4
#endif

#ifndef USE_UNDERSCORE
	.local	lastcolor
	.comm	lastcolor,2
#else
	.comm	lastcolor,2
#endif

        .globl pfield_linetoscr_asm8
	.type  pfield_linetoscr_asm8,@function
	FUNCTION_ALIGN
pfield_linetoscr_asm8:
	pushl %ebp
	pushl %edi
	pushl %esi
	pushl %ebx
	movl 24(%esp),%esi /* start */
	movl 28(%esp),%edi /* lframe_end */
	
	movl SYM(colors_for_drawing),%edx
	movb %dl,%dh
	movw %dx,%ax
	sall $16,%eax
	movw %dx,%ax
	
        movl 20(%esp),%ebx
	movl SYM(xlinebuffer),%ecx
	jmp .La_do_start_line
.La_start_line:
	movl %eax,(%ecx,%esi)
	addl $4,%esi
.La_do_start_line:
	cmpl %esi,%edi
	jnbe .La_start_line

	call %ebx

	/* Finish off the line */

	movl SYM(xlinebuffer),%ecx
        movl 36(%esp),%edi /* stoppos */
	movl SYM(colors_for_drawing),%edx
	movb %dl,%dh
	movw %dx,%ax
	sall $16,%eax
	movw %dx,%ax
	jmp .La_do_end_line
.La_end_line:
	movl %eax,(%ecx,%esi)
	addl $4,%esi
.La_do_end_line:
	cmpl %esi,%edi
	jnbe .La_end_line

	popl %ebx
	popl %esi
	popl %edi
	popl %ebp
	ret

        .globl pfield_linetoscr_ham6_asm8
	.type  pfield_linetoscr_ham6_asm8,@function
	FUNCTION_ALIGN
pfield_linetoscr_ham6_asm8:
	movl 36(%esp),%edi /* diw_end */
.Laa_hamloop:
	cmpl %esi,%edi
	jbe .Laa_hamend

	movl SYM(ham_linebuf)+12(,%esi,4),%eax
	movb SYM(xcolors)(,%eax,4),%bh
	movl SYM(ham_linebuf)+8(,%esi,4),%eax
	movb SYM(xcolors)(,%eax,4),%bl
	sall $16,%ebx
	movl SYM(ham_linebuf)+4(,%esi,4),%eax
	movb SYM(xcolors)(,%eax,4),%bh
	movl SYM(ham_linebuf)(,%esi,4),%eax
	movb SYM(xcolors)(,%eax,4),%bl
	movl %ebx,(%ecx,%esi)
	addl $4,%esi
	jmp .Laa_hamloop

.Laa_hamend:
        ret

        .globl pfield_linetoscr_dualpf_asm8
	.type  pfield_linetoscr_dualpf_asm8,@function
	FUNCTION_ALIGN
pfield_linetoscr_dualpf_asm8:
	xorl %edx,%edx
	movl 44(%esp),%ebp /* lookup_no */
.Lab_dp_loop:
        movl 36(%esp),%eax /* diw_end */
	xorl %edx,%edx
	cmpl %esi,%eax
	jbe .La_dp_done

	movl SYM(pixdata)(%esi),%eax
	movl SYM(spixstate)(%esi),%ebx
	testl %ebx,%ebx
	jne .Lab_dp_sprites
	
	/* no sprites */
	
	BYTE_MOVE %al,BYTE_REG(%edx,%dl)
	BYTE_MOVE (%ebp,%edx,4),BYTE_REG(%edx,%dl)
	movb SYM(colors_for_drawing)(,%edx,4),%cl
	BYTE_MOVE %ah,BYTE_REG(%edx,%dl)
	BYTE_MOVE (%ebp,%edx,4),BYTE_REG(%edx,%dl)
	movb SYM(colors_for_drawing)(,%edx,4),%ch
	bswapl %eax
	bswapl %ecx
	BYTE_MOVE %al,BYTE_REG(%edx,%dl)
	BYTE_MOVE (%ebp,%edx,4),BYTE_REG(%edx,%dl)
	movb SYM(colors_for_drawing)(,%edx,4),%cl
	BYTE_MOVE %ah,BYTE_REG(%edx,%dl)
	BYTE_MOVE (%ebp,%edx,4),BYTE_REG(%edx,%dl)
	movb SYM(colors_for_drawing)(,%edx,4),%ch
	bswapl %ecx
	
	movl SYM(xlinebuffer),%eax
	movl %ecx,(%eax,%esi)
	addl $4,%esi
	jmp .Lab_dp_loop
	
.Lab_dp_sprites:
        /* dual playfield with sprites */

	movb %al,%dl
	testb %bl,%bl
	je .La3
	movb SYM(colors_for_drawing)(,%edx,4),%cl
	jmp .La1
.La3:
	movb (%ebp,%edx,4),%dl
	movb SYM(colors_for_drawing)(,%edx,4),%cl
.La1:
	movb %ah,%dl
	testb %bh,%bh
	je .La6
	movb SYM(colors_for_drawing)(,%edx,4),%ch
	jmp .La4
.La6:
	movb (%ebp,%edx,4),%dl
	movb SYM(colors_for_drawing)(,%edx,4),%ch
.La4:
	bswapl %ecx	
	bswapl %eax
	bswapl %ebx
	
	movb %al,%dl
	testb %bl,%bl
	je .La9
	movb SYM(colors_for_drawing)(,%edx,4),%cl
	jmp .La7
.La9:
	movb (%ebp,%edx,4),%dl
	movb SYM(colors_for_drawing)(,%edx,4),%cl
.La7:

	movb %ah,%dl
	testb %bh,%bh
	je .La12
	movb SYM(colors_for_drawing)(,%edx,4),%ch
	jmp .La10
.La12:
	movb (%ebp,%edx,4),%dl
	movb SYM(colors_for_drawing)(,%edx,4),%ch
.La10:
	bswapl %ecx
	movl SYM(xlinebuffer),%eax
	movl %ecx,(%eax,%esi)
	addl $4,%esi
	jmp .Lab_dp_loop

.La_dp_done:
	ret

        .globl pfield_linetoscr_ehb_asm8
	.type  pfield_linetoscr_ehb_asm8,@function
	FUNCTION_ALIGN
pfield_linetoscr_ehb_asm8:
	xorl %edx,%edx
	movl SYM(xlinebuffer),%ebx
.La_ehb_loop:
	movl 36(%esp),%edi /* diw_end */
	cmpl %esi,%edi
	jbe .La_ehb_end
	
	movl SYM(pixdata)(%esi),%eax
	BYTE_MOVE %al,BYTE_REG(%edx,%dl)
	cmpb $32,%al
	movb SYM(colors_for_drawing)(,%edx,4),%cl
	jc   .La_ehb1
	movw SYM(colors_for_drawing)+32*4-32*2(,%edx,2),%di
	shrl $1,%edi
	andl $0x777,%edi
	movb SYM(xcolors)(,%edi,4),%cl
.La_ehb1:
	BYTE_MOVE %ah,BYTE_REG(%edx,%dl)
	cmpb $32,%ah
	movb SYM(colors_for_drawing)(,%edx,4),%ch
	jc   .La_ehb2
	movw SYM(colors_for_drawing)+32*4-32*2(,%edx,2),%di
	shrl $1,%edi
	andl $0x777,%edi
	movb SYM(xcolors)(,%edi,4),%ch
.La_ehb2:
	sarl $16,%eax
	sall $16,%ecx
	BYTE_MOVE %al,BYTE_REG(%edx,%dl)
	cmpb $32,%al
	movb SYM(colors_for_drawing)(,%edx,4),%cl
	jc   .La_ehb3
	movw SYM(colors_for_drawing)+32*4-32*2(,%edx,2),%di
	shrl $1,%edi
	andl $0x777,%edi
	movb SYM(xcolors)(,%edi,4),%cl
.La_ehb3:
        BYTE_MOVE %ah,BYTE_REG(%edx,%dl)
	cmpb $32,%ah
	movb SYM(colors_for_drawing)(,%edx,4),%ch
	jc   .La_ehb4
	movw SYM(colors_for_drawing)+32*4-32*2(,%edx,2),%di
	shrl $1,%edi
	andl $0x777,%edi
	movb SYM(xcolors)(,%edi,4),%ch
.La_ehb4:
	roll $16,%ecx

	movl %ecx,(%ebx,%esi)
	addl $4,%esi
	jmp .La_ehb_loop

.La_ehb_end:
        ret

        .globl pfield_linetoscr_normal_asm8
	.type  pfield_linetoscr_normal_asm8,@function
	FUNCTION_ALIGN
pfield_linetoscr_normal_asm8:
	xorl %edx,%edx
	xorl %ebx,%ebx
	movl 36(%esp),%edi /* diw_end */
	movl SYM(xlinebuffer),%ebp
	jmp .La_normal_doloop
	FUNCTION_ALIGN
.La_normal_loop:
        BYTE_MOVE SYM(pixdata)(%esi),BYTE_REG(%edx,%dl)
	BYTE_MOVE SYM(pixdata)+4(%esi),BYTE_REG(%ebx,%bl)
	movb SYM(colors_for_drawing)(,%edx,4),%cl
	movb SYM(colors_for_drawing)(,%ebx,4),%al
	BYTE_MOVE SYM(pixdata)+1(%esi),BYTE_REG(%edx,%dl)
	BYTE_MOVE SYM(pixdata)+5(%esi),BYTE_REG(%ebx,%bl)
	movb SYM(colors_for_drawing)(,%edx,4),%ch
	movb SYM(colors_for_drawing)(,%ebx,4),%ah

	sall $16,%ecx
	BYTE_MOVE SYM(pixdata)+2(%esi),BYTE_REG(%edx,%dl)
	sall $16,%eax

	BYTE_MOVE SYM(pixdata)+6(%esi),BYTE_REG(%ebx,%bl)
	movb SYM(colors_for_drawing)(,%edx,4),%cl
	movb SYM(colors_for_drawing)(,%ebx,4),%al
	BYTE_MOVE SYM(pixdata)+3(%esi),BYTE_REG(%edx,%dl)
	BYTE_MOVE SYM(pixdata)+7(%esi),BYTE_REG(%ebx,%bl)
	movb SYM(colors_for_drawing)(,%edx,4),%ch
	addl $4,%esi
	roll $16,%ecx
	movb SYM(colors_for_drawing)(,%ebx,4),%ah
	roll $16,%eax

	movl %ecx,-4(%ebp,%esi)
	cmpl %esi,%edi
	jbe .La_normal_end
	movl %eax,(%ebp,%esi)
	addl $4,%esi
.La_normal_doloop:
	cmpl %esi,%edi
	jnbe .La_normal_loop

.La_normal_end:
        ret

        .globl pfield_linetoscr_hdouble_asm8
	.type  pfield_linetoscr_hdouble_asm8,@function
	FUNCTION_ALIGN
pfield_linetoscr_hdouble_asm8:
        shrl $1,%esi
	xorl %edx,%edx
	xorl %ebx,%ebx
	movl 36(%esp),%edi /* diw_end */
	shrl $1,%edi
	movl SYM(xlinebuffer),%ebp
	jmp .La_hdouble_doloop
	FUNCTION_ALIGN
.La_hdouble_loop:
        BYTE_MOVE SYM(pixdata)+1(%esi),BYTE_REG(%edx,%dl)
	BYTE_MOVE SYM(pixdata)+3(%esi),BYTE_REG(%ebx,%bl)
	movb SYM(colors_for_drawing)(,%edx,4),%cl
	movb SYM(colors_for_drawing)(,%ebx,4),%al
	BYTE_MOVE SYM(pixdata)+0(%esi),BYTE_REG(%edx,%dl)
	movb %cl,%ch
	BYTE_MOVE SYM(pixdata)+2(%esi),BYTE_REG(%ebx,%bl)
	movb %al,%ah
	sall $16,%ecx
	movb SYM(colors_for_drawing)(,%edx,4),%cl
	sall $16,%eax
	movb SYM(colors_for_drawing)(,%ebx,4),%al
	addl $2,%esi
	movb %cl,%ch
	movb %al,%ah

	movl %ecx,-4(%ebp,%esi,2)
	cmpl %esi,%edi
	jbe .La_hdouble_end
 	movl %eax,(%ebp,%esi,2)
	addl $2,%esi
.La_hdouble_doloop:
	cmpl %esi,%edi
	jnbe .La_hdouble_loop

.La_hdouble_end:
        addl %esi,%esi
        ret

/* 16 bit functions */

        .globl pfield_linetoscr_asm16
	.type  pfield_linetoscr_asm16,@function
	FUNCTION_ALIGN
pfield_linetoscr_asm16:
	pushl %ebp
	pushl %edi
	pushl %esi
	pushl %ebx
	movl 24(%esp),%esi /* start */
	movl 28(%esp),%edi /* lframe_end */
	
	movl SYM(colors_for_drawing),%eax
	movl %eax,%edx
	sall $16,%eax
	movw %dx,%ax
	
        movl 20(%esp),%ebx
	movl SYM(xlinebuffer),%ecx
	jmp .Lb_do_start_line
.Lb_start_line:
	movl %eax,(%ecx,%esi,2)
	movl %eax,4(%ecx,%esi,2)
	addl $4,%esi
.Lb_do_start_line:
	cmpl %esi,%edi
	jnbe .Lb_start_line

	call %ebx

	/* Finish off the line */

	movl SYM(xlinebuffer),%ecx
        movl 36(%esp),%edi /* stoppos */
	movl SYM(colors_for_drawing),%eax
	movl %eax,%edx
	sall $16,%eax
	movw %dx,%ax
	jmp .Lb_do_end_line
.Lb_end_line:
	movl %eax,(%ecx,%esi,2)
	movl %eax,4(%ecx,%esi,2)
	addl $4,%esi
.Lb_do_end_line:
	cmpl %esi,%edi
	jnbe .Lb_end_line

	popl %ebx
	popl %esi
	popl %edi
	popl %ebp
	ret

        .globl pfield_linetoscr_ham6_asm16
	.type  pfield_linetoscr_ham6_asm16,@function
	FUNCTION_ALIGN
pfield_linetoscr_ham6_asm16:
	movl 36(%esp),%edi /* diw_end */
.Lb_hamloop:
	cmpl %esi,%edi
	jbe .Lb_hamend

	movl SYM(ham_linebuf)+4(,%esi,4),%eax
	movl SYM(xcolors)(,%eax,4),%ebx
	sall $16,%ebx
	movl SYM(ham_linebuf)(,%esi,4),%eax
	movw SYM(xcolors)(,%eax,4),%bx
	movl %ebx,(%ecx,%esi,2)

	movl SYM(ham_linebuf)+12(,%esi,4),%eax
	movl SYM(xcolors)(,%eax,4),%ebx
	sall $16,%ebx
	movl SYM(ham_linebuf)+8(,%esi,4),%eax
	movw SYM(xcolors)(,%eax,4),%bx
	movl %ebx,4(%ecx,%esi,2)

	addl $4,%esi
	jmp .Lb_hamloop
.Lb_hamend:
        ret

        .globl pfield_linetoscr_dualpf_asm16
	.type  pfield_linetoscr_dualpf_asm16,@function
	FUNCTION_ALIGN
pfield_linetoscr_dualpf_asm16:
	movl 44(%esp),%ebp /* lookup_no */
.Lb_dp_loop:
        movl 36(%esp),%eax /* diw_end */
	xorl %edx,%edx
	cmpl %esi,%eax
	jbe .Lb_dp_done

	movl SYM(pixdata)(%esi),%eax
	movl SYM(spixstate)(%esi),%ebx
	testl %ebx,%ebx
	jne .Lb_dp_sprites
	
	/* no sprites */
	
	movl SYM(xlinebuffer),%ebx

	movb %ah,%dl
	movb (%ebp,%edx,4),%dl
	movl SYM(colors_for_drawing)(,%edx,4),%ecx
	sall $16,%ecx
	movb %al,%dl
	movb (%ebp,%edx,4),%dl
	movw SYM(colors_for_drawing)(,%edx,4),%cx
	sarl $16,%eax
	movl %ecx,(%ebx,%esi,2)
	movb %ah,%dl
	movb (%ebp,%edx,4),%dl
	movl SYM(colors_for_drawing)(,%edx,4),%ecx
	movb %al,%dl
	sall $16,%ecx
	movb (%ebp,%edx,4),%dl
	movw SYM(colors_for_drawing)(,%edx,4),%cx
	movl %ecx,4(%ebx,%esi,2)

	addl $4,%esi
	jmp .Lb_dp_loop
	
.Lb_dp_sprites:
        /* dual playfield with sprites */

	movb %ah,%dl
	testb %bh,%bh
	je .Lb3
	movl SYM(colors_for_drawing)(,%edx,4),%ecx
	jmp .Lb1
.Lb3:
	movb (%ebp,%edx,4),%dl
	movl SYM(colors_for_drawing)(,%edx,4),%ecx
.Lb1:
        sall $16,%ecx
	movb %al,%dl
	sarl $16,%eax
	testb %bl,%bl
	je .Lb6
	movw SYM(colors_for_drawing)(,%edx,4),%cx
	jmp .Lb4
.Lb6:
	movb (%ebp,%edx,4),%dl
	movw SYM(colors_for_drawing)(,%edx,4),%cx
.Lb4:
	movl SYM(xlinebuffer),%edi
	sarl $16,%ebx
	movl %ecx,(%edi,%esi,2)
	
	movb %ah,%dl
	testb %bh,%bh
	je .Lb9
	movl SYM(colors_for_drawing)(,%edx,4),%ecx
	jmp .Lb7
.Lb9:
	movb (%ebp,%edx,4),%dl
	movl SYM(colors_for_drawing)(,%edx,4),%ecx
.Lb7:
        sall $16,%ecx
	movb %al,%dl
	testb %bl,%bl
	je .Lb12
	movw SYM(colors_for_drawing)(,%edx,4),%cx
	jmp .Lb10
.Lb12:
	movb (%ebp,%edx,4),%dl
	movw SYM(colors_for_drawing)(,%edx,4),%cx
.Lb10:
	movl SYM(xlinebuffer),%eax
	movl %ecx,4(%eax,%esi,2)
	addl $4,%esi
	jmp .Lb_dp_loop

.Lb_dp_done:
	ret

        .globl pfield_linetoscr_ehb_asm16
	.type  pfield_linetoscr_ehb_asm16,@function
	FUNCTION_ALIGN
pfield_linetoscr_ehb_asm16:
	xorl %edx,%edx
	xorl %ebx,%ebx
.Lb_ehb_loop:
	movl 36(%esp),%edi /* diw_end */
	cmpl %esi,%edi
	jbe .Lb_ehb_end
	
	movl SYM(pixdata)(%esi),%eax
	movb %ah,%bl
	cmpb $32,%ah
	movl SYM(colors_for_drawing)(,%ebx,4),%ecx
	jc   .Lb_ehb2
	movw SYM(colors_for_drawing)+32*4-32*2(,%ebx,2),%di
	shrl $1,%edi
	andl $0x777,%edi
	movl SYM(xcolors)(,%edi,4),%ecx
.Lb_ehb2:
	sall $16,%ecx
	movb %al,%dl
	movw SYM(colors_for_drawing)(,%edx,4),%cx
	cmpb $32,%al
	jc   .Lb_ehb1

	movw SYM(colors_for_drawing)+32*4-32*2(,%edx,2),%di
	shrl $1,%edi
	andl $0x777,%edi
	movw SYM(xcolors)(,%edi,4),%cx
.Lb_ehb1:
	movl SYM(xlinebuffer),%edi
	sarl $16,%eax
	movl %ecx,(%edi,%esi,2)
	movb %ah,%bl
	movl SYM(colors_for_drawing)(,%ebx,4),%ecx
	cmpb $32,%ah
	jc   .Lb_ehb4

	movw SYM(colors_for_drawing)+32*4-32*2(,%ebx,2),%di
	shrl $1,%edi
	andl $0x777,%edi
	movl SYM(xcolors)(,%edi,4),%ecx
.Lb_ehb4:
	sall $16,%ecx
	movb %al,%dl
	movw SYM(colors_for_drawing)(,%edx,4),%cx
	cmpb $32,%al
	jc   .Lb_ehb3

	movw SYM(colors_for_drawing)+32*4-32*2(,%edx,2),%di
	shrl $1,%edi
	andl $0x777,%edi
	movw SYM(xcolors)(,%edi,4),%cx
.Lb_ehb3:

	movl SYM(xlinebuffer),%edi
	movl %ecx,4(%edi,%esi,2)
	addl $4,%esi
	jmp .Lb_ehb_loop

.Lb_ehb_end:
        ret

	.globl pfield_linetoscr_normal_asm16
	.type  pfield_linetoscr_normal_asm16,@function
	FUNCTION_ALIGN
pfield_linetoscr_normal_asm16:
	movl 36(%esp),%edi /* diw_end */
	jmp .Lb_normal_doloop

	FUNCTION_ALIGN
.Lb_normal_loop:
	xorl %edx,%edx	
	BYTE_MOVE SYM(pixdata)+1(%esi),BYTE_REG(%edx,%dl)
	xorl %ebx,%ebx
	BYTE_MOVE SYM(pixdata)+5(%esi),BYTE_REG(%ebx,%bl)

	movl SYM(colors_for_drawing)(,%edx,4),%edi
	movl SYM(colors_for_drawing)(,%ebx,4),%ecx
	sall $16,%edi
	BYTE_MOVE SYM(pixdata)+0(%esi),BYTE_REG(%edx,%dl)
	sall $16,%ecx
	BYTE_MOVE SYM(pixdata)+4(%esi),BYTE_REG(%ebx,%bl)
	movw SYM(colors_for_drawing)(,%edx,4),%di
	movw SYM(colors_for_drawing)(,%ebx,4),%cx
	BYTE_MOVE SYM(pixdata)+3(%esi),BYTE_REG(%edx,%dl)
	BYTE_MOVE SYM(pixdata)+7(%esi),BYTE_REG(%ebx,%bl)
	movl SYM(colors_for_drawing)(,%edx,4),%eax
	movl SYM(colors_for_drawing)(,%ebx,4),%ebp
	sall $16,%eax
	BYTE_MOVE SYM(pixdata)+2(%esi),BYTE_REG(%edx,%dl)
	sall $16,%ebp
	BYTE_MOVE SYM(pixdata)+6(%esi),BYTE_REG(%ebx,%bl)
	movw SYM(colors_for_drawing)(,%edx,4),%ax
	addl $4,%esi
	movw SYM(colors_for_drawing)(,%ebx,4),%bp

	movl SYM(xlinebuffer),%ebx
	movl %edi,-8(%ebx,%esi,2)
	movl 36(%esp),%edi
	movl %eax,-4(%ebx,%esi,2)

	cmpl %esi,%edi
	jbe .Lb_normal_done

	movl %ecx,(%ebx,%esi,2)
	movl %ebp,4(%ebx,%esi,2)

	addl $4,%esi
.Lb_normal_doloop:
	cmpl %esi,%edi
	jnbe .Lb_normal_loop

.Lb_normal_done:
        ret

	.globl pfield_linetoscr_hdouble_asm16
	.type  pfield_linetoscr_hdouble_asm16,@function
	FUNCTION_ALIGN
pfield_linetoscr_hdouble_asm16:
	shrl $1,%esi
	movl 36(%esp),%eax /* diw_end */
	shrl $1,%eax
	movl SYM(xlinebuffer),%ebp
	jmp .Lb_hdouble_doloop

	FUNCTION_ALIGN
.Lb_hdouble_loop:
	xorl %edx,%edx	
	BYTE_MOVE SYM(pixdata)(%esi),BYTE_REG(%edx,%dl)
	xorl %ebx,%ebx
	BYTE_MOVE SYM(pixdata)+1(%esi),BYTE_REG(%ebx,%bl)

	movl SYM(colors_for_drawing)(,%edx,4),%edi
	movl SYM(colors_for_drawing)(,%ebx,4),%ecx
	movl %edi,%edx
	movl %ecx,%ebx
	sall $16,%edi
	andl $0xFFFF,%edx
	sall $16,%ecx
	andl $0xFFFF,%ebx
	addl $2,%esi
	orl %edx,%edi
	orl %ebx,%ecx
	movl %edi,-8(%ebp,%esi,4)
	movl %ecx,-4(%ebp,%esi,4)

.Lb_hdouble_doloop:
	cmpl %esi,%eax
	jnbe .Lb_hdouble_loop

.Lb_hdouble_done:
        addl %esi,%esi
        ret

        .globl DitherLine
#ifndef USE_UNDERSCORE
	.type	 DitherLine,@function
#endif
	FUNCTION_ALIGN
DitherLine:
	pushl %ebp
	pushl %edi
	pushl %esi
	pushl %ebx
	movl 20(%esp),%edi
	xorl %ebx,%ebx
	movw 36(%esp),%bx
	movl 32(%esp),%edx
	andl $3,%edx
	sall $15,%edx
	movl 28(%esp),%eax
	andl $3,%eax
	sall $12,%eax
	leal SYM(cidx)(%edx,%eax),%ebp
	xorb %dl,%dl
	movl $8,%ecx
	testl %ebx,%ebx
	je .Li_end
	cmpl $8,40(%esp)
	je .Li_fast

	movl 24(%esp),%esi
.Li_loop:
	movzwl (%esi),%eax
	movzbl (%eax,%ebp),%eax
	subl 40(%esp),%ecx
	sall %cl,%eax
	orb %al,%dl
	testl %ecx,%ecx
	jne .Li_1
	movb %dl,(%edi)
	incl %edi
	movl $8,%ecx
	xorb %dl,%dl
.Li_1:
	movzwl 2(%esi),%eax
	movzbl 4096(%ebp,%eax),%eax
	subl 40(%esp),%ecx
	sall %cl,%eax
	orb %al,%dl
	testl %ecx,%ecx
	jne .Li_2
	movb %dl,(%edi)
	incl %edi
	movl $8,%ecx
	xorb %dl,%dl
.Li_2:
	movzwl 4(%esi),%eax
	movzbl 8192(%ebp,%eax),%eax
	subl 40(%esp),%ecx
	sall %cl,%eax
	orb %al,%dl
	testl %ecx,%ecx
	jne .Li_3
	movb %dl,(%edi)
	incl %edi
	movl $8,%ecx
	xorb %dl,%dl
.Li_3:
	movzwl 6(%esi),%eax
	movzbl 12288(%ebp,%eax),%eax
	addl $8,%esi
	subl 40(%esp),%ecx
	sall %cl,%eax
	orb %al,%dl
	testl %ecx,%ecx
	jne .Li_4
	movb %dl,(%edi)
	incl %edi
	movl $8,%ecx
	xorb %dl,%dl
.Li_4:
	subl $4,%ebx
	jne .Li_loop
	jmp .Li_end
	
	/* Fast 8-bit version */
.Li_fast:
	movl 24(%esp),%esi
	xorl %edx,%edx
	xorl %ecx,%ecx
	FUNCTION_ALIGN
.Li_fast_loop:
	movw (%esi),%edx
	movw 2(%esi),%cx
	movb (%edx,%ebp),%al	
	movw 4(%esi),%dx
	movb 4096(%ebp,%ecx),%ah
	
	movw 6(%esi),%cx
	sall $16,%eax
	movb 8192(%ebp,%edx),%al
	
	movb 12288(%ebp,%ecx),%ah
	
	roll $16,%eax
	movl %eax,(%edi)
	addl $4,%edi
	addl $8,%esi
	
	subl $4,%ebx
	jne .Li_fast_loop

.Li_end:
	popl %ebx
	popl %esi
	popl %edi
	popl %ebp
	ret
#if 0	
.globl compiler_do_rts
        /* Entry: EDX == regs.regs + 15 */
compiler_do_rts:
        movl (%edx),%esi
        addl address_space,%esi
	movl jsr_num,%ecx
	movl (%esi),%esi
	orl %ecx,%ecx
	bswapl %esi
	jz cdrts_noway
	decl %ecx
	cmpl jsr_rets(,%ecx,4),%esi
	jne cdrts_noway
	movl jsr_hash(,%ecx,4),%ebx
	movl (%ebx),%ebx
	orl %ebx,%ebx
	jz cdrts_noway
	addl $4,(%edx)
	movl %ecx,jsr_num
	jmp %ebx
cdrts_noway:
        ret
#endif
#if 0
.globl longget_stub
longget_stub:
        pushl %ecx
        pushl %eax
	pushl %edx
	call SYM(longget)
	popl %ecx
	movl %eax,%ecx
	popl %eax
        ret

.globl wordget_stub
wordget_stub:
        pushl %ecx
        pushl %eax
	pushl %edx
	call SYM(wordget)
	popl %ecx
	movl %eax,%ecx
	popl %eax
        ret

.globl byteget_stub
byteget_stub:
        pushl %ecx
        pushl %eax
	pushl %edx
	call SYM(byteget)
	popl %ecx
	movl %eax,%ecx
	popl %eax
        ret

.globl longput_stub
longput_stub:
        pushl %ecx
        pushl %eax
	pushl %ebx
	pushl %edx
	call SYM(longput)
	movl %eax,%ecx
	addl $8,%esp
	popl %eax
        ret

.globl wordput_stub
wordput_stub:
        pushl %ecx
        pushl %eax
	pushl %ebx
	pushl %edx
	call SYM(wordput)
	movl %eax,%ecx
	addl $8,%esp
	popl %eax
        ret

.globl byteput_stub
byteput_stub:
        pushl %ecx
        pushl %eax
	pushl %ebx
	pushl %edx
	call SYM(byteput)
	movl %eax,%ecx
	addl $8,%esp
	popl %eax
        ret
#endif
	.ident	"Crux CC 3.14.15"

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.