xref: /csrg-svn/sys/news3400/fb/fb_mfbs.c (revision 63259)
153893Smckusick /*
2*63259Sbostic  * Copyright (c) 1992, 1993
3*63259Sbostic  *	The Regents of the University of California.  All rights reserved.
453893Smckusick  *
553893Smckusick  * This code is derived from software contributed to Berkeley by
653893Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
753893Smckusick  *
853893Smckusick  * %sccs.include.redist.c%
953893Smckusick  *
1053893Smckusick  * from: $Hdr: fb_mfbs.c,v 4.300 91/06/27 20:42:43 root Rel41 $ SONY
1153893Smckusick  *
12*63259Sbostic  *	@(#)fb_mfbs.c	8.1 (Berkeley) 06/11/93
1353893Smckusick  */
1453893Smckusick 
1557178Sutashiro #include <sys/param.h>
1657178Sutashiro #include <news3400/iop/framebuf.h>
1757178Sutashiro #include <news3400/iop/fbreg.h>
1857178Sutashiro #include <news3400/fb/fbdefs.h>
1953893Smckusick 
2053893Smckusick u_short mfbstarttab16[16] =
2153893Smckusick     {
2253893Smckusick 	 ( 0x0000 ), ( 0x7FFF ), ( 0x3FFF ), ( 0x1FFF ),
2353893Smckusick 	 ( 0x0FFF ), ( 0x07FF ), ( 0x03FF ), ( 0x01FF ),
2453893Smckusick 	 ( 0x00FF ), ( 0x007F ), ( 0x003F ), ( 0x001F ),
2553893Smckusick 	 ( 0x000F ), ( 0x0007 ), ( 0x0003 ), ( 0x0001 ),
2653893Smckusick     };
2753893Smckusick u_short mfbendtab16[16] =
2853893Smckusick     {
2953893Smckusick 	 ( 0x0000 ), ( 0x8000 ), ( 0xC000 ), ( 0xE000 ),
3053893Smckusick 	 ( 0xF000 ), ( 0xF800 ), ( 0xFC00 ), ( 0xFE00 ),
3153893Smckusick 	 ( 0xFF00 ), ( 0xFF80 ), ( 0xFFC0 ), ( 0xFFE0 ),
3253893Smckusick 	 ( 0xFFF0 ), ( 0xFFF8 ), ( 0xFFFC ), ( 0xFFFE ),
3353893Smckusick     };
3453893Smckusick 
3553893Smckusick u_short mfbpartmasks16[16][16] = {
3653893Smckusick      { ( 0xFFFF ),  ( 0x8000 ),  ( 0xC000 ),  ( 0xE000 ),
3753893Smckusick        ( 0xF000 ),  ( 0xF800 ),  ( 0xFC00 ),  ( 0xFE00 ),
3853893Smckusick        ( 0xFF00 ),  ( 0xFF80 ),  ( 0xFFC0 ),  ( 0xFFE0 ),
3953893Smckusick        ( 0xFFF0 ),  ( 0xFFF8 ),  ( 0xFFFC ),  ( 0xFFFE )},
4053893Smckusick      { ( 0x0000 ),  ( 0x4000 ),  ( 0x6000 ),  ( 0x7000 ),
4153893Smckusick        ( 0x7800 ),  ( 0x7C00 ),  ( 0x7E00 ),  ( 0x7F00 ),
4253893Smckusick        ( 0x7F80 ),  ( 0x7FC0 ),  ( 0x7FE0 ),  ( 0x7FF0 ),
4353893Smckusick        ( 0x7FF8 ),  ( 0x7FFC ),  ( 0x7FFE ),  ( 0x7FFF )},
4453893Smckusick      { ( 0x0000 ),  ( 0x2000 ),  ( 0x3000 ),  ( 0x3800 ),
4553893Smckusick        ( 0x3C00 ),  ( 0x3E00 ),  ( 0x3F00 ),  ( 0x3F80 ),
4653893Smckusick        ( 0x3FC0 ),  ( 0x3FE0 ),  ( 0x3FF0 ),  ( 0x3FF8 ),
4753893Smckusick        ( 0x3FFC ),  ( 0x3FFE ),  ( 0x3FFF ),  ( 0x0000 )},
4853893Smckusick      { ( 0x0000 ),  ( 0x1000 ),  ( 0x1800 ),  ( 0x1C00 ),
4953893Smckusick        ( 0x1E00 ),  ( 0x1F00 ),  ( 0x1F80 ),  ( 0x1FC0 ),
5053893Smckusick        ( 0x1FE0 ),  ( 0x1FF0 ),  ( 0x1FF8 ),  ( 0x1FFC ),
5153893Smckusick        ( 0x1FFE ),  ( 0x1FFF ),  ( 0x0000 ),  ( 0x0000 )},
5253893Smckusick      { ( 0x0000 ),  ( 0x0800 ),  ( 0x0C00 ),  ( 0x0E00 ),
5353893Smckusick        ( 0x0F00 ),  ( 0x0F80 ),  ( 0x0FC0 ),  ( 0x0FE0 ),
5453893Smckusick        ( 0x0FF0 ),  ( 0x0FF8 ),  ( 0x0FFC ),  ( 0x0FFE ),
5553893Smckusick        ( 0x0FFF ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
5653893Smckusick      { ( 0x0000 ),  ( 0x0400 ),  ( 0x0600 ),  ( 0x0700 ),
5753893Smckusick        ( 0x0780 ),  ( 0x07C0 ),  ( 0x07E0 ),  ( 0x07F0 ),
5853893Smckusick        ( 0x07F8 ),  ( 0x07FC ),  ( 0x07FE ),  ( 0x07FF ),
5953893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
6053893Smckusick      { ( 0x0000 ),  ( 0x0200 ),  ( 0x0300 ),  ( 0x0380 ),
6153893Smckusick        ( 0x03C0 ),  ( 0x03E0 ),  ( 0x03F0 ),  ( 0x03F8 ),
6253893Smckusick        ( 0x03FC ),  ( 0x03FE ),  ( 0x03FF ),  ( 0x0000 ),
6353893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
6453893Smckusick      { ( 0x0000 ),  ( 0x0100 ),  ( 0x0180 ),  ( 0x01C0 ),
6553893Smckusick        ( 0x01E0 ),  ( 0x01F0 ),  ( 0x01F8 ),  ( 0x01FC ),
6653893Smckusick        ( 0x01FE ),  ( 0x01FF ),  ( 0x0000 ),  ( 0x0000 ),
6753893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
6853893Smckusick      { ( 0x0000 ),  ( 0x0080 ),  ( 0x00C0 ),  ( 0x00E0 ),
6953893Smckusick        ( 0x00F0 ),  ( 0x00F8 ),  ( 0x00FC ),  ( 0x00FE ),
7053893Smckusick        ( 0x00FF ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
7153893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
7253893Smckusick      { ( 0x0000 ),  ( 0x0040 ),  ( 0x0060 ),  ( 0x0070 ),
7353893Smckusick        ( 0x0078 ),  ( 0x007C ),  ( 0x007E ),  ( 0x007F ),
7453893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
7553893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
7653893Smckusick      { ( 0x0000 ),  ( 0x0020 ),  ( 0x0030 ),  ( 0x0038 ),
7753893Smckusick        ( 0x003C ),  ( 0x003E ),  ( 0x003F ),  ( 0x0000 ),
7853893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
7953893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
8053893Smckusick      { ( 0x0000 ),  ( 0x0010 ),  ( 0x0018 ),  ( 0x001C ),
8153893Smckusick        ( 0x001E ),  ( 0x001F ),  ( 0x0000 ),  ( 0x0000 ),
8253893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
8353893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
8453893Smckusick      { ( 0x0000 ),  ( 0x0008 ),  ( 0x000C ),  ( 0x000E ),
8553893Smckusick        ( 0x000F ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
8653893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
8753893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
8853893Smckusick      { ( 0x0000 ),  ( 0x0004 ),  ( 0x0006 ),  ( 0x0007 ),
8953893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
9053893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
9153893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
9253893Smckusick      { ( 0x0000 ),  ( 0x0002 ),  ( 0x0003 ),  ( 0x0000 ),
9353893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
9453893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
9553893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
9653893Smckusick      { ( 0x0000 ),  ( 0x0001 ),  ( 0x0000 ),  ( 0x0000 ),
9753893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
9853893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),
9953893Smckusick        ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 ),  ( 0x0000 )},
10053893Smckusick };
10153893Smckusick 
10253893Smckusick u_short mfbmask16[16] =
10353893Smckusick     {
10453893Smckusick      ( 1<<15 ),  ( 1<<14 ), ( 1<<13 ),
10553893Smckusick      ( 1<<12 ),  ( 1<<11 ), ( 1<<10 ),
10653893Smckusick      ( 1<<9 ),  ( 1<<8 ),  ( 1<<7 ),
10753893Smckusick      ( 1<<6 ),  ( 1<<5 ),  ( 1<<4 ),
10853893Smckusick      ( 1<<3 ),  ( 1<<2 ),  ( 1<<1 ),
10953893Smckusick      ( 1<<0 )
11053893Smckusick     };
11153893Smckusick u_short mfbrmask16[16] =
11253893Smckusick     {
11353893Smckusick     0xffffffff ^  ( 1<<15 ), 0xffffffff ^  ( 1<<14),
11453893Smckusick     0xffffffff ^  ( 1<<13 ), 0xffffffff ^  ( 1<<12 ),
11553893Smckusick     0xffffffff ^  ( 1<<11 ), 0xffffffff ^  ( 1<<10),
11653893Smckusick     0xffffffff ^  ( 1<<9 ),  0xffffffff ^  ( 1<<8),
11753893Smckusick     0xffffffff ^  ( 1<<7 ),  0xffffffff ^  ( 1<<6),
11853893Smckusick     0xffffffff ^  ( 1<<5 ),  0xffffffff ^  ( 1<<4),
11953893Smckusick     0xffffffff ^  ( 1<<3 ),  0xffffffff ^  ( 1<<2),
12053893Smckusick     0xffffffff ^  ( 1<<1 ),  0xffffffff ^  ( 1<<0)
12153893Smckusick     };
12253893Smckusick 
12353893Smckusick u_int mfbstarttab32[32] =
12453893Smckusick     {
12553893Smckusick 	 ( 0x00000000 ), ( 0x7FFFFFFF ), ( 0x3FFFFFFF ), ( 0x1FFFFFFF ),
12653893Smckusick 	 ( 0x0FFFFFFF ), ( 0x07FFFFFF ), ( 0x03FFFFFF ), ( 0x01FFFFFF ),
12753893Smckusick 	 ( 0x00FFFFFF ), ( 0x007FFFFF ), ( 0x003FFFFF ), ( 0x001FFFFF ),
12853893Smckusick 	 ( 0x000FFFFF ), ( 0x0007FFFF ), ( 0x0003FFFF ), ( 0x0001FFFF ),
12953893Smckusick 	 ( 0x0000FFFF ), ( 0x00007FFF ), ( 0x00003FFF ), ( 0x00001FFF ),
13053893Smckusick 	 ( 0x00000FFF ), ( 0x000007FF ), ( 0x000003FF ), ( 0x000001FF ),
13153893Smckusick 	 ( 0x000000FF ), ( 0x0000007F ), ( 0x0000003F ), ( 0x0000001F ),
13253893Smckusick 	 ( 0x0000000F ), ( 0x00000007 ), ( 0x00000003 ), ( 0x00000001 )
13353893Smckusick     };
13453893Smckusick u_int mfbendtab32[32] =
13553893Smckusick     {
13653893Smckusick 	 ( 0x00000000 ), ( 0x80000000 ), ( 0xC0000000 ), ( 0xE0000000 ),
13753893Smckusick 	 ( 0xF0000000 ), ( 0xF8000000 ), ( 0xFC000000 ), ( 0xFE000000 ),
13853893Smckusick 	 ( 0xFF000000 ), ( 0xFF800000 ), ( 0xFFC00000 ), ( 0xFFE00000 ),
13953893Smckusick 	 ( 0xFFF00000 ), ( 0xFFF80000 ), ( 0xFFFC0000 ), ( 0xFFFE0000 ),
14053893Smckusick 	 ( 0xFFFF0000 ), ( 0xFFFF8000 ), ( 0xFFFFC000 ), ( 0xFFFFE000 ),
14153893Smckusick 	 ( 0xFFFFF000 ), ( 0xFFFFF800 ), ( 0xFFFFFC00 ), ( 0xFFFFFE00 ),
14253893Smckusick 	 ( 0xFFFFFF00 ), ( 0xFFFFFF80 ), ( 0xFFFFFFC0 ), ( 0xFFFFFFE0 ),
14353893Smckusick 	 ( 0xFFFFFFF0 ), ( 0xFFFFFFF8 ), ( 0xFFFFFFFC ), ( 0xFFFFFFFE )
14453893Smckusick     };
14553893Smckusick 
14653893Smckusick u_int mfbpartmasks32[32][32] = {
14753893Smckusick      { ( 0xFFFFFFFF ),  ( 0x80000000 ),  ( 0xC0000000 ),  ( 0xE0000000 ),
14853893Smckusick        ( 0xF0000000 ),  ( 0xF8000000 ),  ( 0xFC000000 ),  ( 0xFE000000 ),
14953893Smckusick        ( 0xFF000000 ),  ( 0xFF800000 ),  ( 0xFFC00000 ),  ( 0xFFE00000 ),
15053893Smckusick        ( 0xFFF00000 ),  ( 0xFFF80000 ),  ( 0xFFFC0000 ),  ( 0xFFFE0000 ),
15153893Smckusick        ( 0xFFFF0000 ),  ( 0xFFFF8000 ),  ( 0xFFFFC000 ),  ( 0xFFFFE000 ),
15253893Smckusick        ( 0xFFFFF000 ),  ( 0xFFFFF800 ),  ( 0xFFFFFC00 ),  ( 0xFFFFFE00 ),
15353893Smckusick        ( 0xFFFFFF00 ),  ( 0xFFFFFF80 ),  ( 0xFFFFFFC0 ),  ( 0xFFFFFFE0 ),
15453893Smckusick        ( 0xFFFFFFF0 ),  ( 0xFFFFFFF8 ),  ( 0xFFFFFFFC ),  ( 0xFFFFFFFE )},
15553893Smckusick      { ( 0x00000000 ),  ( 0x40000000 ),  ( 0x60000000 ),  ( 0x70000000 ),
15653893Smckusick        ( 0x78000000 ),  ( 0x7C000000 ),  ( 0x7E000000 ),  ( 0x7F000000 ),
15753893Smckusick        ( 0x7F800000 ),  ( 0x7FC00000 ),  ( 0x7FE00000 ),  ( 0x7FF00000 ),
15853893Smckusick        ( 0x7FF80000 ),  ( 0x7FFC0000 ),  ( 0x7FFE0000 ),  ( 0x7FFF0000 ),
15953893Smckusick        ( 0x7FFF8000 ),  ( 0x7FFFC000 ),  ( 0x7FFFE000 ),  ( 0x7FFFF000 ),
16053893Smckusick        ( 0x7FFFF800 ),  ( 0x7FFFFC00 ),  ( 0x7FFFFE00 ),  ( 0x7FFFFF00 ),
16153893Smckusick        ( 0x7FFFFF80 ),  ( 0x7FFFFFC0 ),  ( 0x7FFFFFE0 ),  ( 0x7FFFFFF0 ),
16253893Smckusick        ( 0x7FFFFFF8 ),  ( 0x7FFFFFFC ),  ( 0x7FFFFFFE ),  ( 0x7FFFFFFF )},
16353893Smckusick      { ( 0x00000000 ),  ( 0x20000000 ),  ( 0x30000000 ),  ( 0x38000000 ),
16453893Smckusick        ( 0x3C000000 ),  ( 0x3E000000 ),  ( 0x3F000000 ),  ( 0x3F800000 ),
16553893Smckusick        ( 0x3FC00000 ),  ( 0x3FE00000 ),  ( 0x3FF00000 ),  ( 0x3FF80000 ),
16653893Smckusick        ( 0x3FFC0000 ),  ( 0x3FFE0000 ),  ( 0x3FFF0000 ),  ( 0x3FFF8000 ),
16753893Smckusick        ( 0x3FFFC000 ),  ( 0x3FFFE000 ),  ( 0x3FFFF000 ),  ( 0x3FFFF800 ),
16853893Smckusick        ( 0x3FFFFC00 ),  ( 0x3FFFFE00 ),  ( 0x3FFFFF00 ),  ( 0x3FFFFF80 ),
16953893Smckusick        ( 0x3FFFFFC0 ),  ( 0x3FFFFFE0 ),  ( 0x3FFFFFF0 ),  ( 0x3FFFFFF8 ),
17053893Smckusick        ( 0x3FFFFFFC ),  ( 0x3FFFFFFE ),  ( 0x3FFFFFFF ),  ( 0x00000000 )},
17153893Smckusick      { ( 0x00000000 ),  ( 0x10000000 ),  ( 0x18000000 ),  ( 0x1C000000 ),
17253893Smckusick        ( 0x1E000000 ),  ( 0x1F000000 ),  ( 0x1F800000 ),  ( 0x1FC00000 ),
17353893Smckusick        ( 0x1FE00000 ),  ( 0x1FF00000 ),  ( 0x1FF80000 ),  ( 0x1FFC0000 ),
17453893Smckusick        ( 0x1FFE0000 ),  ( 0x1FFF0000 ),  ( 0x1FFF8000 ),  ( 0x1FFFC000 ),
17553893Smckusick        ( 0x1FFFE000 ),  ( 0x1FFFF000 ),  ( 0x1FFFF800 ),  ( 0x1FFFFC00 ),
17653893Smckusick        ( 0x1FFFFE00 ),  ( 0x1FFFFF00 ),  ( 0x1FFFFF80 ),  ( 0x1FFFFFC0 ),
17753893Smckusick        ( 0x1FFFFFE0 ),  ( 0x1FFFFFF0 ),  ( 0x1FFFFFF8 ),  ( 0x1FFFFFFC ),
17853893Smckusick        ( 0x1FFFFFFE ),  ( 0x1FFFFFFF ),  ( 0x00000000 ),  ( 0x00000000 )},
17953893Smckusick      { ( 0x00000000 ),  ( 0x08000000 ),  ( 0x0C000000 ),  ( 0x0E000000 ),
18053893Smckusick        ( 0x0F000000 ),  ( 0x0F800000 ),  ( 0x0FC00000 ),  ( 0x0FE00000 ),
18153893Smckusick        ( 0x0FF00000 ),  ( 0x0FF80000 ),  ( 0x0FFC0000 ),  ( 0x0FFE0000 ),
18253893Smckusick        ( 0x0FFF0000 ),  ( 0x0FFF8000 ),  ( 0x0FFFC000 ),  ( 0x0FFFE000 ),
18353893Smckusick        ( 0x0FFFF000 ),  ( 0x0FFFF800 ),  ( 0x0FFFFC00 ),  ( 0x0FFFFE00 ),
18453893Smckusick        ( 0x0FFFFF00 ),  ( 0x0FFFFF80 ),  ( 0x0FFFFFC0 ),  ( 0x0FFFFFE0 ),
18553893Smckusick        ( 0x0FFFFFF0 ),  ( 0x0FFFFFF8 ),  ( 0x0FFFFFFC ),  ( 0x0FFFFFFE ),
18653893Smckusick        ( 0x0FFFFFFF ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
18753893Smckusick      { ( 0x00000000 ),  ( 0x04000000 ),  ( 0x06000000 ),  ( 0x07000000 ),
18853893Smckusick        ( 0x07800000 ),  ( 0x07C00000 ),  ( 0x07E00000 ),  ( 0x07F00000 ),
18953893Smckusick        ( 0x07F80000 ),  ( 0x07FC0000 ),  ( 0x07FE0000 ),  ( 0x07FF0000 ),
19053893Smckusick        ( 0x07FF8000 ),  ( 0x07FFC000 ),  ( 0x07FFE000 ),  ( 0x07FFF000 ),
19153893Smckusick        ( 0x07FFF800 ),  ( 0x07FFFC00 ),  ( 0x07FFFE00 ),  ( 0x07FFFF00 ),
19253893Smckusick        ( 0x07FFFF80 ),  ( 0x07FFFFC0 ),  ( 0x07FFFFE0 ),  ( 0x07FFFFF0 ),
19353893Smckusick        ( 0x07FFFFF8 ),  ( 0x07FFFFFC ),  ( 0x07FFFFFE ),  ( 0x07FFFFFF ),
19453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
19553893Smckusick      { ( 0x00000000 ),  ( 0x02000000 ),  ( 0x03000000 ),  ( 0x03800000 ),
19653893Smckusick        ( 0x03C00000 ),  ( 0x03E00000 ),  ( 0x03F00000 ),  ( 0x03F80000 ),
19753893Smckusick        ( 0x03FC0000 ),  ( 0x03FE0000 ),  ( 0x03FF0000 ),  ( 0x03FF8000 ),
19853893Smckusick        ( 0x03FFC000 ),  ( 0x03FFE000 ),  ( 0x03FFF000 ),  ( 0x03FFF800 ),
19953893Smckusick        ( 0x03FFFC00 ),  ( 0x03FFFE00 ),  ( 0x03FFFF00 ),  ( 0x03FFFF80 ),
20053893Smckusick        ( 0x03FFFFC0 ),  ( 0x03FFFFE0 ),  ( 0x03FFFFF0 ),  ( 0x03FFFFF8 ),
20153893Smckusick        ( 0x03FFFFFC ),  ( 0x03FFFFFE ),  ( 0x03FFFFFF ),  ( 0x00000000 ),
20253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
20353893Smckusick      { ( 0x00000000 ),  ( 0x01000000 ),  ( 0x01800000 ),  ( 0x01C00000 ),
20453893Smckusick        ( 0x01E00000 ),  ( 0x01F00000 ),  ( 0x01F80000 ),  ( 0x01FC0000 ),
20553893Smckusick        ( 0x01FE0000 ),  ( 0x01FF0000 ),  ( 0x01FF8000 ),  ( 0x01FFC000 ),
20653893Smckusick        ( 0x01FFE000 ),  ( 0x01FFF000 ),  ( 0x01FFF800 ),  ( 0x01FFFC00 ),
20753893Smckusick        ( 0x01FFFE00 ),  ( 0x01FFFF00 ),  ( 0x01FFFF80 ),  ( 0x01FFFFC0 ),
20853893Smckusick        ( 0x01FFFFE0 ),  ( 0x01FFFFF0 ),  ( 0x01FFFFF8 ),  ( 0x01FFFFFC ),
20953893Smckusick        ( 0x01FFFFFE ),  ( 0x01FFFFFF ),  ( 0x00000000 ),  ( 0x00000000 ),
21053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
21153893Smckusick      { ( 0x00000000 ),  ( 0x00800000 ),  ( 0x00C00000 ),  ( 0x00E00000 ),
21253893Smckusick        ( 0x00F00000 ),  ( 0x00F80000 ),  ( 0x00FC0000 ),  ( 0x00FE0000 ),
21353893Smckusick        ( 0x00FF0000 ),  ( 0x00FF8000 ),  ( 0x00FFC000 ),  ( 0x00FFE000 ),
21453893Smckusick        ( 0x00FFF000 ),  ( 0x00FFF800 ),  ( 0x00FFFC00 ),  ( 0x00FFFE00 ),
21553893Smckusick        ( 0x00FFFF00 ),  ( 0x00FFFF80 ),  ( 0x00FFFFC0 ),  ( 0x00FFFFE0 ),
21653893Smckusick        ( 0x00FFFFF0 ),  ( 0x00FFFFF8 ),  ( 0x00FFFFFC ),  ( 0x00FFFFFE ),
21753893Smckusick        ( 0x00FFFFFF ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
21853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
21953893Smckusick      { ( 0x00000000 ),  ( 0x00400000 ),  ( 0x00600000 ),  ( 0x00700000 ),
22053893Smckusick        ( 0x00780000 ),  ( 0x007C0000 ),  ( 0x007E0000 ),  ( 0x007F0000 ),
22153893Smckusick        ( 0x007F8000 ),  ( 0x007FC000 ),  ( 0x007FE000 ),  ( 0x007FF000 ),
22253893Smckusick        ( 0x007FF800 ),  ( 0x007FFC00 ),  ( 0x007FFE00 ),  ( 0x007FFF00 ),
22353893Smckusick        ( 0x007FFF80 ),  ( 0x007FFFC0 ),  ( 0x007FFFE0 ),  ( 0x007FFFF0 ),
22453893Smckusick        ( 0x007FFFF8 ),  ( 0x007FFFFC ),  ( 0x007FFFFE ),  ( 0x007FFFFF ),
22553893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
22653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
22753893Smckusick      { ( 0x00000000 ),  ( 0x00200000 ),  ( 0x00300000 ),  ( 0x00380000 ),
22853893Smckusick        ( 0x003C0000 ),  ( 0x003E0000 ),  ( 0x003F0000 ),  ( 0x003F8000 ),
22953893Smckusick        ( 0x003FC000 ),  ( 0x003FE000 ),  ( 0x003FF000 ),  ( 0x003FF800 ),
23053893Smckusick        ( 0x003FFC00 ),  ( 0x003FFE00 ),  ( 0x003FFF00 ),  ( 0x003FFF80 ),
23153893Smckusick        ( 0x003FFFC0 ),  ( 0x003FFFE0 ),  ( 0x003FFFF0 ),  ( 0x003FFFF8 ),
23253893Smckusick        ( 0x003FFFFC ),  ( 0x003FFFFE ),  ( 0x003FFFFF ),  ( 0x00000000 ),
23353893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
23453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
23553893Smckusick      { ( 0x00000000 ),  ( 0x00100000 ),  ( 0x00180000 ),  ( 0x001C0000 ),
23653893Smckusick        ( 0x001E0000 ),  ( 0x001F0000 ),  ( 0x001F8000 ),  ( 0x001FC000 ),
23753893Smckusick        ( 0x001FE000 ),  ( 0x001FF000 ),  ( 0x001FF800 ),  ( 0x001FFC00 ),
23853893Smckusick        ( 0x001FFE00 ),  ( 0x001FFF00 ),  ( 0x001FFF80 ),  ( 0x001FFFC0 ),
23953893Smckusick        ( 0x001FFFE0 ),  ( 0x001FFFF0 ),  ( 0x001FFFF8 ),  ( 0x001FFFFC ),
24053893Smckusick        ( 0x001FFFFE ),  ( 0x001FFFFF ),  ( 0x00000000 ),  ( 0x00000000 ),
24153893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
24253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
24353893Smckusick      { ( 0x00000000 ),  ( 0x00080000 ),  ( 0x000C0000 ),  ( 0x000E0000 ),
24453893Smckusick        ( 0x000F0000 ),  ( 0x000F8000 ),  ( 0x000FC000 ),  ( 0x000FE000 ),
24553893Smckusick        ( 0x000FF000 ),  ( 0x000FF800 ),  ( 0x000FFC00 ),  ( 0x000FFE00 ),
24653893Smckusick        ( 0x000FFF00 ),  ( 0x000FFF80 ),  ( 0x000FFFC0 ),  ( 0x000FFFE0 ),
24753893Smckusick        ( 0x000FFFF0 ),  ( 0x000FFFF8 ),  ( 0x000FFFFC ),  ( 0x000FFFFE ),
24853893Smckusick        ( 0x000FFFFF ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
24953893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
25053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
25153893Smckusick      { ( 0x00000000 ),  ( 0x00040000 ),  ( 0x00060000 ),  ( 0x00070000 ),
25253893Smckusick        ( 0x00078000 ),  ( 0x0007C000 ),  ( 0x0007E000 ),  ( 0x0007F000 ),
25353893Smckusick        ( 0x0007F800 ),  ( 0x0007FC00 ),  ( 0x0007FE00 ),  ( 0x0007FF00 ),
25453893Smckusick        ( 0x0007FF80 ),  ( 0x0007FFC0 ),  ( 0x0007FFE0 ),  ( 0x0007FFF0 ),
25553893Smckusick        ( 0x0007FFF8 ),  ( 0x0007FFFC ),  ( 0x0007FFFE ),  ( 0x0007FFFF ),
25653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
25753893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
25853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
25953893Smckusick      { ( 0x00000000 ),  ( 0x00020000 ),  ( 0x00030000 ),  ( 0x00038000 ),
26053893Smckusick        ( 0x0003C000 ),  ( 0x0003E000 ),  ( 0x0003F000 ),  ( 0x0003F800 ),
26153893Smckusick        ( 0x0003FC00 ),  ( 0x0003FE00 ),  ( 0x0003FF00 ),  ( 0x0003FF80 ),
26253893Smckusick        ( 0x0003FFC0 ),  ( 0x0003FFE0 ),  ( 0x0003FFF0 ),  ( 0x0003FFF8 ),
26353893Smckusick        ( 0x0003FFFC ),  ( 0x0003FFFE ),  ( 0x0003FFFF ),  ( 0x00000000 ),
26453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
26553893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
26653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
26753893Smckusick      { ( 0x00000000 ),  ( 0x00010000 ),  ( 0x00018000 ),  ( 0x0001C000 ),
26853893Smckusick        ( 0x0001E000 ),  ( 0x0001F000 ),  ( 0x0001F800 ),  ( 0x0001FC00 ),
26953893Smckusick        ( 0x0001FE00 ),  ( 0x0001FF00 ),  ( 0x0001FF80 ),  ( 0x0001FFC0 ),
27053893Smckusick        ( 0x0001FFE0 ),  ( 0x0001FFF0 ),  ( 0x0001FFF8 ),  ( 0x0001FFFC ),
27153893Smckusick        ( 0x0001FFFE ),  ( 0x0001FFFF ),  ( 0x00000000 ),  ( 0x00000000 ),
27253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
27353893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
27453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
27553893Smckusick      { ( 0x00000000 ),  ( 0x00008000 ),  ( 0x0000C000 ),  ( 0x0000E000 ),
27653893Smckusick        ( 0x0000F000 ),  ( 0x0000F800 ),  ( 0x0000FC00 ),  ( 0x0000FE00 ),
27753893Smckusick        ( 0x0000FF00 ),  ( 0x0000FF80 ),  ( 0x0000FFC0 ),  ( 0x0000FFE0 ),
27853893Smckusick        ( 0x0000FFF0 ),  ( 0x0000FFF8 ),  ( 0x0000FFFC ),  ( 0x0000FFFE ),
27953893Smckusick        ( 0x0000FFFF ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
28053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
28153893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
28253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
28353893Smckusick      { ( 0x00000000 ),  ( 0x00004000 ),  ( 0x00006000 ),  ( 0x00007000 ),
28453893Smckusick        ( 0x00007800 ),  ( 0x00007C00 ),  ( 0x00007E00 ),  ( 0x00007F00 ),
28553893Smckusick        ( 0x00007F80 ),  ( 0x00007FC0 ),  ( 0x00007FE0 ),  ( 0x00007FF0 ),
28653893Smckusick        ( 0x00007FF8 ),  ( 0x00007FFC ),  ( 0x00007FFE ),  ( 0x00007FFF ),
28753893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
28853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
28953893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
29053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
29153893Smckusick      { ( 0x00000000 ),  ( 0x00002000 ),  ( 0x00003000 ),  ( 0x00003800 ),
29253893Smckusick        ( 0x00003C00 ),  ( 0x00003E00 ),  ( 0x00003F00 ),  ( 0x00003F80 ),
29353893Smckusick        ( 0x00003FC0 ),  ( 0x00003FE0 ),  ( 0x00003FF0 ),  ( 0x00003FF8 ),
29453893Smckusick        ( 0x00003FFC ),  ( 0x00003FFE ),  ( 0x00003FFF ),  ( 0x00000000 ),
29553893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
29653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
29753893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
29853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
29953893Smckusick      { ( 0x00000000 ),  ( 0x00001000 ),  ( 0x00001800 ),  ( 0x00001C00 ),
30053893Smckusick        ( 0x00001E00 ),  ( 0x00001F00 ),  ( 0x00001F80 ),  ( 0x00001FC0 ),
30153893Smckusick        ( 0x00001FE0 ),  ( 0x00001FF0 ),  ( 0x00001FF8 ),  ( 0x00001FFC ),
30253893Smckusick        ( 0x00001FFE ),  ( 0x00001FFF ),  ( 0x00000000 ),  ( 0x00000000 ),
30353893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
30453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
30553893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
30653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
30753893Smckusick      { ( 0x00000000 ),  ( 0x00000800 ),  ( 0x00000C00 ),  ( 0x00000E00 ),
30853893Smckusick        ( 0x00000F00 ),  ( 0x00000F80 ),  ( 0x00000FC0 ),  ( 0x00000FE0 ),
30953893Smckusick        ( 0x00000FF0 ),  ( 0x00000FF8 ),  ( 0x00000FFC ),  ( 0x00000FFE ),
31053893Smckusick        ( 0x00000FFF ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
31153893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
31253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
31353893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
31453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
31553893Smckusick      { ( 0x00000000 ),  ( 0x00000400 ),  ( 0x00000600 ),  ( 0x00000700 ),
31653893Smckusick        ( 0x00000780 ),  ( 0x000007C0 ),  ( 0x000007E0 ),  ( 0x000007F0 ),
31753893Smckusick        ( 0x000007F8 ),  ( 0x000007FC ),  ( 0x000007FE ),  ( 0x000007FF ),
31853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
31953893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
32053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
32153893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
32253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
32353893Smckusick      { ( 0x00000000 ),  ( 0x00000200 ),  ( 0x00000300 ),  ( 0x00000380 ),
32453893Smckusick        ( 0x000003C0 ),  ( 0x000003E0 ),  ( 0x000003F0 ),  ( 0x000003F8 ),
32553893Smckusick        ( 0x000003FC ),  ( 0x000003FE ),  ( 0x000003FF ),  ( 0x00000000 ),
32653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
32753893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
32853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
32953893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
33053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
33153893Smckusick      { ( 0x00000000 ),  ( 0x00000100 ),  ( 0x00000180 ),  ( 0x000001C0 ),
33253893Smckusick        ( 0x000001E0 ),  ( 0x000001F0 ),  ( 0x000001F8 ),  ( 0x000001FC ),
33353893Smckusick        ( 0x000001FE ),  ( 0x000001FF ),  ( 0x00000000 ),  ( 0x00000000 ),
33453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
33553893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
33653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
33753893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
33853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
33953893Smckusick      { ( 0x00000000 ),  ( 0x00000080 ),  ( 0x000000C0 ),  ( 0x000000E0 ),
34053893Smckusick        ( 0x000000F0 ),  ( 0x000000F8 ),  ( 0x000000FC ),  ( 0x000000FE ),
34153893Smckusick        ( 0x000000FF ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
34253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
34353893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
34453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
34553893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
34653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
34753893Smckusick      { ( 0x00000000 ),  ( 0x00000040 ),  ( 0x00000060 ),  ( 0x00000070 ),
34853893Smckusick        ( 0x00000078 ),  ( 0x0000007C ),  ( 0x0000007E ),  ( 0x0000007F ),
34953893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
35053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
35153893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
35253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
35353893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
35453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
35553893Smckusick      { ( 0x00000000 ),  ( 0x00000020 ),  ( 0x00000030 ),  ( 0x00000038 ),
35653893Smckusick        ( 0x0000003C ),  ( 0x0000003E ),  ( 0x0000003F ),  ( 0x00000000 ),
35753893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
35853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
35953893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
36053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
36153893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
36253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
36353893Smckusick      { ( 0x00000000 ),  ( 0x00000010 ),  ( 0x00000018 ),  ( 0x0000001C ),
36453893Smckusick        ( 0x0000001E ),  ( 0x0000001F ),  ( 0x00000000 ),  ( 0x00000000 ),
36553893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
36653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
36753893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
36853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
36953893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
37053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
37153893Smckusick      { ( 0x00000000 ),  ( 0x00000008 ),  ( 0x0000000C ),  ( 0x0000000E ),
37253893Smckusick        ( 0x0000000F ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
37353893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
37453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
37553893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
37653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
37753893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
37853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
37953893Smckusick      { ( 0x00000000 ),  ( 0x00000004 ),  ( 0x00000006 ),  ( 0x00000007 ),
38053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
38153893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
38253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
38353893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
38453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
38553893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
38653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
38753893Smckusick      { ( 0x00000000 ),  ( 0x00000002 ),  ( 0x00000003 ),  ( 0x00000000 ),
38853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
38953893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
39053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
39153893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
39253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
39353893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
39453893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
39553893Smckusick      { ( 0x00000000 ),  ( 0x00000001 ),  ( 0x00000000 ),  ( 0x00000000 ),
39653893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
39753893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
39853893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
39953893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
40053893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
40153893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),
40253893Smckusick        ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 ),  ( 0x00000000 )},
40353893Smckusick };
40453893Smckusick 
40553893Smckusick u_int mfbmask32[32] =
40653893Smckusick     {
40753893Smckusick      ( 1<<31 ),  ( 1<<30 ),  ( 1<<29 ),
40853893Smckusick      ( 1<<28 ),  ( 1<<27 ),  ( 1<<26 ),
40953893Smckusick      ( 1<<25 ),  ( 1<<24 ),  ( 1<<23 ),
41053893Smckusick      ( 1<<22 ),  ( 1<<21 ),  ( 1<<20 ),
41153893Smckusick      ( 1<<19 ),  ( 1<<18 ),  ( 1<<17 ),
41253893Smckusick      ( 1<<16 ),  ( 1<<15 ),  ( 1<<14 ),
41353893Smckusick      ( 1<<13 ),  ( 1<<12 ),  ( 1<<11 ),
41453893Smckusick      ( 1<<10 ),  ( 1<<9 ),  ( 1<<8 ),
41553893Smckusick      ( 1<<7 ),  ( 1<<6 ),  ( 1<<5 ),
41653893Smckusick      ( 1<<4 ),  ( 1<<3 ),  ( 1<<2 ),
41753893Smckusick      ( 1<<1 ),  ( 1<<0 )
41853893Smckusick     };
41953893Smckusick 
42053893Smckusick u_int mfbrmask32[32] =
42153893Smckusick     {
42253893Smckusick     0xffffffff ^  ( 1<<31 ), 0xffffffff ^  ( 1<<30 ),
42353893Smckusick     0xffffffff ^  ( 1<<29 ), 0xffffffff ^  ( 1<<28),
42453893Smckusick     0xffffffff ^  ( 1<<27 ), 0xffffffff ^  ( 1<<26),
42553893Smckusick     0xffffffff ^  ( 1<<25 ), 0xffffffff ^  ( 1<<24 ),
42653893Smckusick     0xffffffff ^  ( 1<<23 ), 0xffffffff ^  ( 1<<22),
42753893Smckusick     0xffffffff ^  ( 1<<21 ), 0xffffffff ^  ( 1<<20),
42853893Smckusick     0xffffffff ^  ( 1<<19 ), 0xffffffff ^  ( 1<<18 ),
42953893Smckusick     0xffffffff ^  ( 1<<17 ), 0xffffffff ^  ( 1<<16),
43053893Smckusick     0xffffffff ^  ( 1<<15 ), 0xffffffff ^  ( 1<<14),
43153893Smckusick     0xffffffff ^  ( 1<<13 ), 0xffffffff ^  ( 1<<12 ),
43253893Smckusick     0xffffffff ^  ( 1<<11 ), 0xffffffff ^  ( 1<<10),
43353893Smckusick     0xffffffff ^  ( 1<<9 ),  0xffffffff ^  ( 1<<8),
43453893Smckusick     0xffffffff ^  ( 1<<7 ),  0xffffffff ^  ( 1<<6),
43553893Smckusick     0xffffffff ^  ( 1<<5 ),  0xffffffff ^  ( 1<<4),
43653893Smckusick     0xffffffff ^  ( 1<<3 ),  0xffffffff ^  ( 1<<2),
43753893Smckusick     0xffffffff ^  ( 1<<1 ),  0xffffffff ^  ( 1<<0)
43853893Smckusick     };
43953893Smckusick 
44053893Smckusick mergeRopRec mergeRopBits[16] = {
44153893Smckusick 	 0, 0, 0, 0,		/* BF_0		0 */
44253893Smckusick 	~0, 0, 0, 0,		/* BF_SDA	src & dst */
44353893Smckusick 	~0, 0,~0, 0,		/* BF_SDIA	src & ~dst */
44453893Smckusick 	 0, 0,~0, 0,		/* BF_S		src */
44553893Smckusick 	~0,~0, 0, 0,		/* BF_SIDA	~src & dst */
44653893Smckusick 	 0,~0, 0, 0,		/* BF_D		dst */
44753893Smckusick 	 0,~0,~0, 0,		/* BF_SDX	src ^ dst */
44853893Smckusick 	~0,~0,~0, 0,		/* BF_SDO	src | dst */
44953893Smckusick 	~0,~0,~0,~0,		/* BF_SDOI	~(src | dst) */
45053893Smckusick 	 0,~0,~0,~0,		/* BF_SDXI	~(src ^ dst) */
45153893Smckusick 	 0,~0, 0,~0,		/* BF_DI	~dst */
45253893Smckusick 	~0,~0, 0,~0,		/* BF_SDIO	src | ~dst */
45353893Smckusick 	 0, 0,~0,~0,		/* BF_SI	~src */
45453893Smckusick 	~0, 0,~0,~0,		/* BF_SIDO	~src | dst */
45553893Smckusick 	~0, 0, 0,~0,		/* BF_SDAI	~(src & dst) */
45653893Smckusick 	 0, 0, 0,~0,		/* BF_1		1 */
45753893Smckusick };
45853893Smckusick 
45953893Smckusick #define Duff(counter, block) { \
46053893Smckusick 	switch (counter & 7) { \
46153893Smckusick 	case 7: { block; } \
46253893Smckusick 	case 6: { block; } \
46353893Smckusick 	case 5: { block; } \
46453893Smckusick 	case 4: { block; } \
46553893Smckusick 	case 3: { block; } \
46653893Smckusick 	case 2: { block; } \
46753893Smckusick 	case 1: { block; } \
46853893Smckusick 	case 0:; \
46953893Smckusick 	} \
47053893Smckusick 	while ((counter -= 8) >= 0) { \
47153893Smckusick 		{ block; } \
47253893Smckusick 		{ block; } \
47353893Smckusick 		{ block; } \
47453893Smckusick 		{ block; } \
47553893Smckusick 		{ block; } \
47653893Smckusick 		{ block; } \
47753893Smckusick 		{ block; } \
47853893Smckusick 		{ block; } \
47953893Smckusick 	} \
48053893Smckusick }
48153893Smckusick 
48253893Smckusick #ifdef mc68020
48353893Smckusick #define	Duff_plus(n, dst, src, op) { \
48453893Smckusick 	switch ((n) & 7) { \
48553893Smckusick 	case 7: \
48653893Smckusick 		*(dst)++ op *(src)++; \
48753893Smckusick 	case 6: \
48853893Smckusick 		*(dst)++ op *(src)++; \
48953893Smckusick 	case 5: \
49053893Smckusick 		*(dst)++ op *(src)++; \
49153893Smckusick 	case 4: \
49253893Smckusick 		*(dst)++ op *(src)++; \
49353893Smckusick 	case 3: \
49453893Smckusick 		*(dst)++ op *(src)++; \
49553893Smckusick 	case 2: \
49653893Smckusick 		*(dst)++ op *(src)++; \
49753893Smckusick 	case 1: \
49853893Smckusick 		*(dst)++ op *(src)++; \
49953893Smckusick 	} \
50053893Smckusick 	while (((n) -= 8) >= 0) { \
50153893Smckusick 		*(dst)++ op *(src)++; \
50253893Smckusick 		*(dst)++ op *(src)++; \
50353893Smckusick 		*(dst)++ op *(src)++; \
50453893Smckusick 		*(dst)++ op *(src)++; \
50553893Smckusick 		*(dst)++ op *(src)++; \
50653893Smckusick 		*(dst)++ op *(src)++; \
50753893Smckusick 		*(dst)++ op *(src)++; \
50853893Smckusick 		*(dst)++ op *(src)++; \
50953893Smckusick 	} \
51053893Smckusick } \
51153893Smckusick 
51253893Smckusick #define Duff_minus(n, dst, src, op) { \
51353893Smckusick 	switch ((n) & 7) { \
51453893Smckusick 	case 7: \
51553893Smckusick 		*--(dst) op *--(src); \
51653893Smckusick 	case 6: \
51753893Smckusick 		*--(dst) op *--(src); \
51853893Smckusick 	case 5: \
51953893Smckusick 		*--(dst) op *--(src); \
52053893Smckusick 	case 4: \
52153893Smckusick 		*--(dst) op *--(src); \
52253893Smckusick 	case 3: \
52353893Smckusick 		*--(dst) op *--(src); \
52453893Smckusick 	case 2: \
52553893Smckusick 		*--(dst) op *--(src); \
52653893Smckusick 	case 1: \
52753893Smckusick 		*--(dst) op *--(src); \
52853893Smckusick 	} \
52953893Smckusick 	while (((n) -= 8) >= 0) { \
53053893Smckusick 		*--(dst) op *--(src); \
53153893Smckusick 		*--(dst) op *--(src); \
53253893Smckusick 		*--(dst) op *--(src); \
53353893Smckusick 		*--(dst) op *--(src); \
53453893Smckusick 		*--(dst) op *--(src); \
53553893Smckusick 		*--(dst) op *--(src); \
53653893Smckusick 		*--(dst) op *--(src); \
53753893Smckusick 		*--(dst) op *--(src); \
53853893Smckusick 	} \
53953893Smckusick }
54053893Smckusick 
54153893Smckusick #define	Duff_shift_plus(n, dst, src, op) { \
54253893Smckusick 	switch ((n) & 3) { \
54353893Smckusick 	case 3: \
54453893Smckusick 		bits = *(src)++; \
54553893Smckusick 		*(dst)++ op (bits1 << leftShift) | (bits >> rightShift); \
54653893Smckusick 	case 2: \
54753893Smckusick 		bits1 = *(src)++; \
54853893Smckusick 		*(dst)++ op (bits << leftShift) | (bits1 >> rightShift); \
54953893Smckusick 	case 1: \
55053893Smckusick 		bits = *(src)++; \
55153893Smckusick 		*(dst)++ op (bits1 << leftShift) | (bits >> rightShift); \
55253893Smckusick 	} \
55353893Smckusick 	while (((n) -= 4) >= 0) { \
55453893Smckusick 		bits1 = *(src)++; \
55553893Smckusick 		*(dst)++ op (bits << leftShift) | (bits1 >> rightShift); \
55653893Smckusick 		bits = *(src)++; \
55753893Smckusick 		*(dst)++ op (bits1 << leftShift) | (bits >> rightShift); \
55853893Smckusick 		bits1 = *(src)++; \
55953893Smckusick 		*(dst)++ op (bits << leftShift) | (bits1 >> rightShift); \
56053893Smckusick 		bits = *(src)++; \
56153893Smckusick 		*(dst)++ op (bits1 << leftShift) | (bits >> rightShift); \
56253893Smckusick 	} \
56353893Smckusick }
56453893Smckusick 
56553893Smckusick #define	Duff_shift_minus(n, dst, src, op) { \
56653893Smckusick 	switch ((n) & 3) { \
56753893Smckusick 	case 3: \
56853893Smckusick 		bits = *--(src); \
56953893Smckusick 		*--(dst) op ((bits1 >> rightShift) | (bits << leftShift)); \
57053893Smckusick 	case 2: \
57153893Smckusick 		bits1 = *--(src); \
57253893Smckusick 		*--(dst) op ((bits >> rightShift) | (bits1 << leftShift)); \
57353893Smckusick 	case 1: \
57453893Smckusick 		bits = *--(src); \
57553893Smckusick 		*--(dst) op ((bits1 >> rightShift) | (bits << leftShift)); \
57653893Smckusick 	} \
57753893Smckusick 	while (((n) -= 4) >= 0) { \
57853893Smckusick 		bits1 = *--(src); \
57953893Smckusick 		*--(dst) op ((bits >> rightShift) | (bits1 << leftShift)); \
58053893Smckusick 		bits = *--(src); \
58153893Smckusick 		*--(dst) op ((bits1 >> rightShift) | (bits << leftShift)); \
58253893Smckusick 		bits1 = *--(src); \
58353893Smckusick 		*--(dst) op ((bits >> rightShift) | (bits1 << leftShift)); \
58453893Smckusick 		bits = *--(src); \
58553893Smckusick 		*--(dst) op ((bits1 >> rightShift) | (bits << leftShift)); \
58653893Smckusick 	} \
58753893Smckusick }
58853893Smckusick 
58953893Smckusick #define	Duff_single(nlw, addr, op) { \
59053893Smckusick 	switch ((nlw) & 7) { \
59153893Smckusick 	case 7: \
59253893Smckusick 		*(addr)++ op ; \
59353893Smckusick 	case 6: \
59453893Smckusick 		*(addr)++ op ; \
59553893Smckusick 	case 5: \
59653893Smckusick 		*(addr)++ op ; \
59753893Smckusick 	case 4: \
59853893Smckusick 		*(addr)++ op ; \
59953893Smckusick 	case 3: \
60053893Smckusick 		*(addr)++ op ; \
60153893Smckusick 	case 2: \
60253893Smckusick 		*(addr)++ op ; \
60353893Smckusick 	case 1: \
60453893Smckusick 		*(addr)++ op ; \
60553893Smckusick 	} \
60653893Smckusick 	while (((nlw) -= 8) >= 0) { \
60753893Smckusick 		*(addr)++ op ; \
60853893Smckusick 		*(addr)++ op ; \
60953893Smckusick 		*(addr)++ op ; \
61053893Smckusick 		*(addr)++ op ; \
61153893Smckusick 		*(addr)++ op ; \
61253893Smckusick 		*(addr)++ op ; \
61353893Smckusick 		*(addr)++ op ; \
61453893Smckusick 		*(addr)++ op ; \
61553893Smckusick 	} \
61653893Smckusick }
61753893Smckusick #else /* mc68020 */
61853893Smckusick #define	Duff_plus(n, dst, src, op) { \
61953893Smckusick 	(src) += (n) & 7; \
62053893Smckusick 	(dst) += (n) & 7; \
62153893Smckusick 	switch ((n) & 7) { \
62253893Smckusick 	case 7: \
62353893Smckusick 		(dst)[-7] op (src)[-7]; \
62453893Smckusick 	case 6: \
62553893Smckusick 		(dst)[-6] op (src)[-6]; \
62653893Smckusick 	case 5: \
62753893Smckusick 		(dst)[-5] op (src)[-5]; \
62853893Smckusick 	case 4: \
62953893Smckusick 		(dst)[-4] op (src)[-4]; \
63053893Smckusick 	case 3: \
63153893Smckusick 		(dst)[-3] op (src)[-3]; \
63253893Smckusick 	case 2: \
63353893Smckusick 		(dst)[-2] op (src)[-2]; \
63453893Smckusick 	case 1: \
63553893Smckusick 		(dst)[-1] op (src)[-1]; \
63653893Smckusick 	} \
63753893Smckusick 	while (((n) -= 8) >= 0) { \
63853893Smckusick 		(dst) += 8; \
63953893Smckusick 		(src) += 8; \
64053893Smckusick 		(dst)[-8] op (src)[-8]; \
64153893Smckusick 		(dst)[-7] op (src)[-7]; \
64253893Smckusick 		(dst)[-6] op (src)[-6]; \
64353893Smckusick 		(dst)[-5] op (src)[-5]; \
64453893Smckusick 		(dst)[-4] op (src)[-4]; \
64553893Smckusick 		(dst)[-3] op (src)[-3]; \
64653893Smckusick 		(dst)[-2] op (src)[-2]; \
64753893Smckusick 		(dst)[-1] op (src)[-1]; \
64853893Smckusick 	} \
64953893Smckusick } \
65053893Smckusick 
65153893Smckusick #define Duff_minus(n, dst, src, op) { \
65253893Smckusick 	(src) -= (n) & 7; \
65353893Smckusick 	(dst) -= (n) & 7; \
65453893Smckusick 	switch ((n) & 7) { \
65553893Smckusick 	case 7: \
65653893Smckusick 		(dst)[7-1] op (src)[7-1]; \
65753893Smckusick 	case 6: \
65853893Smckusick 		(dst)[6-1] op (src)[6-1]; \
65953893Smckusick 	case 5: \
66053893Smckusick 		(dst)[5-1] op (src)[5-1]; \
66153893Smckusick 	case 4: \
66253893Smckusick 		(dst)[4-1] op (src)[4-1]; \
66353893Smckusick 	case 3: \
66453893Smckusick 		(dst)[3-1] op (src)[3-1]; \
66553893Smckusick 	case 2: \
66653893Smckusick 		(dst)[2-1] op (src)[2-1]; \
66753893Smckusick 	case 1: \
66853893Smckusick 		(dst)[1-1] op (src)[1-1]; \
66953893Smckusick 	} \
67053893Smckusick 	while (((n) -= 8) >= 0) { \
67153893Smckusick 		(dst) -= 8; \
67253893Smckusick 		(src) -= 8; \
67353893Smckusick 		(dst)[8-1] op (src)[8-1]; \
67453893Smckusick 		(dst)[7-1] op (src)[7-1]; \
67553893Smckusick 		(dst)[6-1] op (src)[6-1]; \
67653893Smckusick 		(dst)[5-1] op (src)[5-1]; \
67753893Smckusick 		(dst)[4-1] op (src)[4-1]; \
67853893Smckusick 		(dst)[3-1] op (src)[3-1]; \
67953893Smckusick 		(dst)[2-1] op (src)[2-1]; \
68053893Smckusick 		(dst)[1-1] op (src)[1-1]; \
68153893Smckusick 	} \
68253893Smckusick }
68353893Smckusick 
68453893Smckusick #define	Duff_shift_plus(n, dst, src, op) { \
68553893Smckusick 	(src) += (n) & 7; \
68653893Smckusick 	(dst) += (n) & 7; \
68753893Smckusick 	switch ((n) & 7) { \
68853893Smckusick 	case 7: \
68953893Smckusick 		bits = (src)[-7]; \
69053893Smckusick 		(dst)[-7] op (bits1 << leftShift) | (bits >> rightShift); \
69153893Smckusick 	case 6: \
69253893Smckusick 		bits1 = (src)[-6]; \
69353893Smckusick 		(dst)[-6] op (bits << leftShift) | (bits1 >> rightShift); \
69453893Smckusick 	case 5: \
69553893Smckusick 		bits = (src)[-5]; \
69653893Smckusick 		(dst)[-5] op (bits1 << leftShift) | (bits >> rightShift); \
69753893Smckusick 	case 4: \
69853893Smckusick 		bits1 = (src)[-4]; \
69953893Smckusick 		(dst)[-4] op (bits << leftShift) | (bits1 >> rightShift); \
70053893Smckusick 	case 3: \
70153893Smckusick 		bits = (src)[-3]; \
70253893Smckusick 		(dst)[-3] op (bits1 << leftShift) | (bits >> rightShift); \
70353893Smckusick 	case 2: \
70453893Smckusick 		bits1 = (src)[-2]; \
70553893Smckusick 		(dst)[-2] op (bits << leftShift) | (bits1 >> rightShift); \
70653893Smckusick 	case 1: \
70753893Smckusick 		bits = (src)[-1]; \
70853893Smckusick 		(dst)[-1] op (bits1 << leftShift) | (bits >> rightShift); \
70953893Smckusick 	} \
71053893Smckusick 	while (((n) -= 8) >= 0) { \
71153893Smckusick 		(dst) += 8; \
71253893Smckusick 		(src) += 8; \
71353893Smckusick 		bits1 = (src)[-8]; \
71453893Smckusick 		(dst)[-8] op (bits << leftShift) | (bits1 >> rightShift); \
71553893Smckusick 		bits = (src)[-7]; \
71653893Smckusick 		(dst)[-7] op (bits1 << leftShift) | (bits >> rightShift); \
71753893Smckusick 		bits1 = (src)[-6]; \
71853893Smckusick 		(dst)[-6] op (bits << leftShift) | (bits1 >> rightShift); \
71953893Smckusick 		bits = (src)[-5]; \
72053893Smckusick 		(dst)[-5] op (bits1 << leftShift) | (bits >> rightShift); \
72153893Smckusick 		bits1 = (src)[-4]; \
72253893Smckusick 		(dst)[-4] op (bits << leftShift) | (bits1 >> rightShift); \
72353893Smckusick 		bits = (src)[-3]; \
72453893Smckusick 		(dst)[-3] op (bits1 << leftShift) | (bits >> rightShift); \
72553893Smckusick 		bits1 = (src)[-2]; \
72653893Smckusick 		(dst)[-2] op (bits << leftShift) | (bits1 >> rightShift); \
72753893Smckusick 		bits = (src)[-1]; \
72853893Smckusick 		(dst)[-1] op (bits1 << leftShift) | (bits >> rightShift); \
72953893Smckusick 	} \
73053893Smckusick }
73153893Smckusick 
73253893Smckusick #define	Duff_shift_minus(n, dst, src, op) { \
73353893Smckusick 	(src) -= (n) & 7; \
73453893Smckusick 	(dst) -= (n) & 7; \
73553893Smckusick 	switch ((n) & 7) { \
73653893Smckusick 	case 7: \
73753893Smckusick 		bits = (src)[7-1]; \
73853893Smckusick 		(dst)[7-1] op ((bits1 >> rightShift) | (bits << leftShift)); \
73953893Smckusick 	case 6: \
74053893Smckusick 		bits1 = (src)[6-1]; \
74153893Smckusick 		(dst)[6-1] op ((bits >> rightShift) | (bits1 << leftShift)); \
74253893Smckusick 	case 5: \
74353893Smckusick 		bits = (src)[5-1]; \
74453893Smckusick 		(dst)[5-1] op ((bits1 >> rightShift) | (bits << leftShift)); \
74553893Smckusick 	case 4: \
74653893Smckusick 		bits1 = (src)[4-1]; \
74753893Smckusick 		(dst)[4-1] op ((bits >> rightShift) | (bits1 << leftShift)); \
74853893Smckusick 	case 3: \
74953893Smckusick 		bits = (src)[3-1]; \
75053893Smckusick 		(dst)[3-1] op ((bits1 >> rightShift) | (bits << leftShift)); \
75153893Smckusick 	case 2: \
75253893Smckusick 		bits1 = (src)[2-1]; \
75353893Smckusick 		(dst)[2-1] op ((bits >> rightShift) | (bits1 << leftShift)); \
75453893Smckusick 	case 1: \
75553893Smckusick 		bits = (src)[1-1]; \
75653893Smckusick 		(dst)[1-1] op ((bits1 >> rightShift) | (bits << leftShift)); \
75753893Smckusick 	} \
75853893Smckusick 	while (((n) -= 8) >= 0) { \
75953893Smckusick 		(dst) -= 8; \
76053893Smckusick 		(src) -= 8; \
76153893Smckusick 		bits1 = (src)[8-1]; \
76253893Smckusick 		(dst)[8-1] op ((bits >> rightShift) | (bits1 << leftShift)); \
76353893Smckusick 		bits = (src)[7-1]; \
76453893Smckusick 		(dst)[7-1] op ((bits1 >> rightShift) | (bits << leftShift)); \
76553893Smckusick 		bits1 = (src)[6-1]; \
76653893Smckusick 		(dst)[6-1] op ((bits >> rightShift) | (bits1 << leftShift)); \
76753893Smckusick 		bits = (src)[5-1]; \
76853893Smckusick 		(dst)[5-1] op ((bits1 >> rightShift) | (bits << leftShift)); \
76953893Smckusick 		bits1 = (src)[4-1]; \
77053893Smckusick 		(dst)[4-1] op ((bits >> rightShift) | (bits1 << leftShift)); \
77153893Smckusick 		bits = (src)[3-1]; \
77253893Smckusick 		(dst)[3-1] op ((bits1 >> rightShift) | (bits << leftShift)); \
77353893Smckusick 		bits1 = (src)[2-1]; \
77453893Smckusick 		(dst)[2-1] op ((bits >> rightShift) | (bits1 << leftShift)); \
77553893Smckusick 		bits = (src)[1-1]; \
77653893Smckusick 		(dst)[1-1] op ((bits1 >> rightShift) | (bits << leftShift)); \
77753893Smckusick 	} \
77853893Smckusick }
77953893Smckusick 
78053893Smckusick #define	Duff_single(nlw, addr, op) { \
78153893Smckusick 	(addr) += (nlw) & 7; \
78253893Smckusick 	switch ((nlw) & 7) { \
78353893Smckusick 	case 7: \
78453893Smckusick 		(addr)[-7] op; \
78553893Smckusick 	case 6: \
78653893Smckusick 		(addr)[-6] op; \
78753893Smckusick 	case 5: \
78853893Smckusick 		(addr)[-5] op; \
78953893Smckusick 	case 4: \
79053893Smckusick 		(addr)[-4] op; \
79153893Smckusick 	case 3: \
79253893Smckusick 		(addr)[-3] op; \
79353893Smckusick 	case 2: \
79453893Smckusick 		(addr)[-2] op; \
79553893Smckusick 	case 1: \
79653893Smckusick 		(addr)[-1] op; \
79753893Smckusick 	} \
79853893Smckusick 	while (((nlw) -= 8) >= 0) { \
79953893Smckusick 		(addr) += 8; \
80053893Smckusick 		(addr)[-8] op; \
80153893Smckusick 		(addr)[-7] op; \
80253893Smckusick 		(addr)[-6] op; \
80353893Smckusick 		(addr)[-5] op; \
80453893Smckusick 		(addr)[-4] op; \
80553893Smckusick 		(addr)[-3] op; \
80653893Smckusick 		(addr)[-2] op; \
80753893Smckusick 		(addr)[-1] op; \
80853893Smckusick 	} \
80953893Smckusick }
81053893Smckusick #endif /* mc68020 */
81153893Smckusick 
81253893Smckusick void
mfb_copy_area32(addrSrc,addrDst,widthSrc,widthDst,sr,dp)81353893Smckusick mfb_copy_area32(addrSrc, addrDst, widthSrc, widthDst, sr, dp)
81453893Smckusick u_int	*addrSrc;
81553893Smckusick u_int	*addrDst;
81653893Smckusick u_int	widthSrc;
81753893Smckusick u_int	widthDst;
81853893Smckusick lRectangle	*sr;	/* source rectangle */
81953893Smckusick lPoint		*dp;	/* destination point */
82053893Smckusick {
82153893Smckusick 	register u_int *psrcLine, *psrc;
82253893Smckusick 	register u_int *pdstLine, *pdst;
82353893Smckusick 	int w, h;
82453893Smckusick 	int xdir, ydir;
82553893Smckusick 	u_int startmask, endmask;
82653893Smckusick 	register int nlMiddle;
82753893Smckusick 	int xoffSrc, xoffDst;
82853893Smckusick 	register int leftShift, rightShift;
82953893Smckusick 	u_int bits;
83053893Smckusick 	u_int bits1;
83153893Smckusick 	register int nl;
83253893Smckusick 
83353893Smckusick 	if (sr->origin.y < dp->y) {
83453893Smckusick 		ydir = -1;
83553893Smckusick 		widthSrc = -widthSrc;
83653893Smckusick 		widthDst = -widthDst;
83753893Smckusick 	} else {
83853893Smckusick 		ydir = 1;
83953893Smckusick 	}
84053893Smckusick 
84153893Smckusick 	if (sr->origin.x < dp->x) {
84253893Smckusick 		xdir = -1;
84353893Smckusick 	} else {
84453893Smckusick 		xdir = 1;
84553893Smckusick 	}
84653893Smckusick 
84753893Smckusick 	w = sr->extent.x;
84853893Smckusick 	h = sr->extent.y;
84953893Smckusick 
85053893Smckusick 	if (ydir == -1) {
85153893Smckusick 		psrcLine = addrSrc + ((sr->origin.y + h - 1) * -widthSrc);
85253893Smckusick 		pdstLine = addrDst + ((dp->y + h - 1) * -widthDst);
85353893Smckusick 	} else {
85453893Smckusick 		psrcLine = addrSrc + (sr->origin.y * widthSrc);
85553893Smckusick 		pdstLine = addrDst + (dp->y * widthDst);
85653893Smckusick 	}
85753893Smckusick 	if ((dp->x & 0x1f) +w <= 32) {
85853893Smckusick 		startmask = mfbpartmasks32[dp->x & 0x1f][w & 0x1f];
85953893Smckusick 		endmask = 0;
86053893Smckusick 		nlMiddle = 0;
86153893Smckusick 	} else {
86253893Smckusick 		startmask = mfbstarttab32[dp->x & 0x1f];
86353893Smckusick 		endmask = mfbendtab32[(dp->x + w) & 0x1f];
86453893Smckusick 		if (startmask) {
86553893Smckusick 			nlMiddle = (w - (32 - (dp->x & 0x1f))) >> 5;
86653893Smckusick 		} else {
86753893Smckusick 			nlMiddle = w >> 5;
86853893Smckusick 		}
86953893Smckusick 	}
87053893Smckusick 
87153893Smckusick 	if (xdir == 1) {
87253893Smckusick 		xoffSrc = sr->origin.x & 0x1f;
87353893Smckusick 		xoffDst = dp->x & 0x1f;
87453893Smckusick 		pdstLine += (dp->x >> 5);
87553893Smckusick 		psrcLine += (sr->origin.x >> 5);
87653893Smckusick 		if (xoffSrc == xoffDst) {
87753893Smckusick 			while (h--) {
87853893Smckusick 				psrc = psrcLine;
87953893Smckusick 				pdst = pdstLine;
88053893Smckusick 				pdstLine += widthDst;
88153893Smckusick 				psrcLine += widthSrc;
88253893Smckusick 				if (startmask) {
88353893Smckusick 					*pdst = (*pdst & ~startmask |
88453893Smckusick 						 *psrc & startmask);
88553893Smckusick 					psrc++;
88653893Smckusick 					pdst++;
88753893Smckusick 				}
88853893Smckusick 				nl = nlMiddle;
88953893Smckusick 				Duff_plus(nl, pdst, psrc, =);
89053893Smckusick 				if (endmask) {
89153893Smckusick 					*pdst = (*pdst & ~endmask |
89253893Smckusick 						 *psrc & endmask);
89353893Smckusick 				}
89453893Smckusick 			}
89553893Smckusick 		} else {
89653893Smckusick 			if (xoffSrc > xoffDst) {
89753893Smckusick 				leftShift = xoffSrc - xoffDst;
89853893Smckusick 				rightShift = 32 - leftShift;
89953893Smckusick 			} else {
90053893Smckusick 				rightShift = xoffDst - xoffSrc;
90153893Smckusick 				leftShift = 32 - rightShift;
90253893Smckusick 			}
90353893Smckusick 			while (h--) {
90453893Smckusick 				psrc = psrcLine;
90553893Smckusick 				pdst = pdstLine;
90653893Smckusick 				pdstLine += widthDst;
90753893Smckusick 				psrcLine += widthSrc;
90853893Smckusick 				bits = 0;
90953893Smckusick 				if (xoffSrc > xoffDst)
91053893Smckusick 					bits = *psrc++;
91153893Smckusick 				if (startmask) {
91253893Smckusick 					bits1 = bits << leftShift;
91353893Smckusick 					bits = *psrc++;
91453893Smckusick 					bits1 |= bits >> rightShift;
91553893Smckusick 					*pdst = (*pdst & ~startmask |
91653893Smckusick 						 bits1 & startmask);
91753893Smckusick 					pdst++;
91853893Smckusick 				}
91953893Smckusick 				nl = nlMiddle;
92053893Smckusick 				bits1 = bits;
92153893Smckusick 				Duff_shift_plus(nl, pdst, psrc, =);
92253893Smckusick 				if (endmask) {
92353893Smckusick 					bits1 = bits << leftShift;
92453893Smckusick 					if (endmask << rightShift) {
92553893Smckusick 						bits1 |= *psrc >> rightShift;
92653893Smckusick 					}
92753893Smckusick 					*pdst = (*pdst & ~endmask |
92853893Smckusick 						 bits1 & endmask);
92953893Smckusick 				}
93053893Smckusick 			}
93153893Smckusick 		}
93253893Smckusick 	} else {
93353893Smckusick 		xoffSrc = (sr->origin.x + w - 1) & 0x1f;
93453893Smckusick 		xoffDst = (dp->x + w - 1) & 0x1f;
93553893Smckusick 		pdstLine += ((dp->x + w - 1) >> 5) + 1;
93653893Smckusick 		psrcLine += ((sr->origin.x + w - 1) >> 5) + 1;
93753893Smckusick 		if (xoffSrc == xoffDst) {
93853893Smckusick 			while (h--) {
93953893Smckusick 				psrc = psrcLine;
94053893Smckusick 				pdst = pdstLine;
94153893Smckusick 				pdstLine += widthDst;
94253893Smckusick 				psrcLine += widthSrc;
94353893Smckusick 				if (endmask) {
94453893Smckusick 					pdst--;
94553893Smckusick 					psrc--;
94653893Smckusick 					*pdst = (*pdst & ~endmask |
94753893Smckusick 						 *psrc & endmask);
94853893Smckusick 				}
94953893Smckusick 				nl = nlMiddle;
95053893Smckusick 				Duff_minus(nl, pdst, psrc, =);
95153893Smckusick 				if (startmask) {
95253893Smckusick 					--pdst;
95353893Smckusick 					--psrc;
95453893Smckusick 					*pdst = (*pdst & ~startmask |
95553893Smckusick 						 *psrc & startmask);
95653893Smckusick 				}
95753893Smckusick 			}
95853893Smckusick 		} else {
95953893Smckusick 			if (xoffDst > xoffSrc) {
96053893Smckusick 				rightShift = xoffDst - xoffSrc;
96153893Smckusick 				leftShift = 32 - rightShift;
96253893Smckusick 			} else {
96353893Smckusick 				leftShift = xoffSrc - xoffDst;
96453893Smckusick 				rightShift = 32 - leftShift;
96553893Smckusick 			}
96653893Smckusick 			while (h--) {
96753893Smckusick 				psrc = psrcLine;
96853893Smckusick 				pdst = pdstLine;
96953893Smckusick 				pdstLine += widthDst;
97053893Smckusick 				psrcLine += widthSrc;
97153893Smckusick 				bits = 0;
97253893Smckusick 				if (xoffDst > xoffSrc)
97353893Smckusick 					bits = *--psrc;
97453893Smckusick 				if (endmask) {
97553893Smckusick 					bits1 = bits >> rightShift;
97653893Smckusick 					bits = *--psrc;
97753893Smckusick 					bits1 |= (bits << leftShift);
97853893Smckusick 					pdst--;
97953893Smckusick 					*pdst = (*pdst & ~endmask |
98053893Smckusick 						 bits1 & endmask);
98153893Smckusick 				}
98253893Smckusick 				nl = nlMiddle;
98353893Smckusick 				bits1 = bits;
98453893Smckusick 				Duff_shift_minus(nl, pdst, psrc, =);
98553893Smckusick 				if (startmask) {
98653893Smckusick 					bits1 = (bits >> rightShift);
98753893Smckusick 					if (startmask >> leftShift) {
98853893Smckusick 						bits1 |= *--psrc << leftShift;
98953893Smckusick 					}
99053893Smckusick 					--pdst;
99153893Smckusick 					*pdst = (*pdst & ~startmask |
99253893Smckusick 						 bits1 & startmask);
99353893Smckusick 				}
99453893Smckusick 			}
99553893Smckusick 		}
99653893Smckusick 	}
99753893Smckusick }
99853893Smckusick 
99953893Smckusick void
mfb_copyinv_area32(addrSrc,addrDst,widthSrc,widthDst,sr,dp)100053893Smckusick mfb_copyinv_area32(addrSrc, addrDst, widthSrc, widthDst, sr, dp)
100153893Smckusick u_int	*addrSrc;
100253893Smckusick u_int	*addrDst;
100353893Smckusick int	widthSrc;
100453893Smckusick int	widthDst;
100553893Smckusick lRectangle	*sr;	/* source rectangle */
100653893Smckusick lPoint		*dp;	/* destination point */
100753893Smckusick {
100853893Smckusick 	register u_int *psrcLine, *psrc;
100953893Smckusick 	register u_int *pdstLine, *pdst;
101053893Smckusick 	int w, h;
101153893Smckusick 	int xdir, ydir;
101253893Smckusick 	u_int startmask, endmask;
101353893Smckusick 	register int nlMiddle;
101453893Smckusick 	int xoffSrc, xoffDst;
101553893Smckusick 	register int leftShift, rightShift;
101653893Smckusick 	u_int bits;
101753893Smckusick 	u_int bits1;
101853893Smckusick 	register int nl;
101953893Smckusick 
102053893Smckusick 	if (sr->origin.y < dp->y) {
102153893Smckusick 		ydir = -1;
102253893Smckusick 		widthSrc = -widthSrc;
102353893Smckusick 		widthDst = -widthDst;
102453893Smckusick 	} else {
102553893Smckusick 		ydir = 1;
102653893Smckusick 	}
102753893Smckusick 
102853893Smckusick 	if (sr->origin.x < dp->x) {
102953893Smckusick 		xdir = -1;
103053893Smckusick 	} else {
103153893Smckusick 		xdir = 1;
103253893Smckusick 	}
103353893Smckusick 
103453893Smckusick 	w = sr->extent.x;
103553893Smckusick 	h = sr->extent.y;
103653893Smckusick 
103753893Smckusick 	if (ydir == -1) {
103853893Smckusick 		psrcLine = addrSrc + ((sr->origin.y + h - 1) * -widthSrc);
103953893Smckusick 		pdstLine = addrDst + ((dp->y + h - 1) * -widthDst);
104053893Smckusick 	} else {
104153893Smckusick 		psrcLine = addrSrc + (sr->origin.y * widthSrc);
104253893Smckusick 		pdstLine = addrDst + (dp->y * widthDst);
104353893Smckusick 	}
104453893Smckusick 	if ((dp->x & 0x1f) +w <= 32) {
104553893Smckusick 		startmask = mfbpartmasks32[dp->x & 0x1f][w & 0x1f];
104653893Smckusick 		endmask = 0;
104753893Smckusick 		nlMiddle = 0;
104853893Smckusick 	} else {
104953893Smckusick 		startmask = mfbstarttab32[dp->x & 0x1f];
105053893Smckusick 		endmask = mfbendtab32[(dp->x + w) & 0x1f];
105153893Smckusick 		if (startmask) {
105253893Smckusick 			nlMiddle = (w - (32 - (dp->x & 0x1f))) >> 5;
105353893Smckusick 		} else {
105453893Smckusick 			nlMiddle = w >> 5;
105553893Smckusick 		}
105653893Smckusick 	}
105753893Smckusick 
105853893Smckusick 	if (xdir == 1) {
105953893Smckusick 		xoffSrc = sr->origin.x & 0x1f;
106053893Smckusick 		xoffDst = dp->x & 0x1f;
106153893Smckusick 		pdstLine += (dp->x >> 5);
106253893Smckusick 		psrcLine += (sr->origin.x >> 5);
106353893Smckusick 		if (xoffSrc == xoffDst) {
106453893Smckusick 			while (h--) {
106553893Smckusick 				psrc = psrcLine;
106653893Smckusick 				pdst = pdstLine;
106753893Smckusick 				pdstLine += widthDst;
106853893Smckusick 				psrcLine += widthSrc;
106953893Smckusick 				if (startmask) {
107053893Smckusick 					*pdst = (*pdst & ~startmask |
107153893Smckusick 						 ~*psrc & startmask);
107253893Smckusick 					psrc++;
107353893Smckusick 					pdst++;
107453893Smckusick 				}
107553893Smckusick 				nl = nlMiddle;
107653893Smckusick 				Duff_plus(nl, pdst, psrc, = ~);
107753893Smckusick 				if (endmask) {
107853893Smckusick 					*pdst = (*pdst & ~endmask |
107953893Smckusick 						 ~*psrc & endmask);
108053893Smckusick 				}
108153893Smckusick 			}
108253893Smckusick 		} else {
108353893Smckusick 			if (xoffSrc > xoffDst) {
108453893Smckusick 				leftShift = xoffSrc - xoffDst;
108553893Smckusick 				rightShift = 32 - leftShift;
108653893Smckusick 			} else {
108753893Smckusick 				rightShift = xoffDst - xoffSrc;
108853893Smckusick 				leftShift = 32 - rightShift;
108953893Smckusick 			}
109053893Smckusick 			while (h--) {
109153893Smckusick 				psrc = psrcLine;
109253893Smckusick 				pdst = pdstLine;
109353893Smckusick 				psrcLine += widthSrc;
109453893Smckusick 				pdstLine += widthDst;
109553893Smckusick 				bits = 0;
109653893Smckusick 				if (xoffSrc > xoffDst)
109753893Smckusick 					bits = *psrc++;
109853893Smckusick 				if (startmask) {
109953893Smckusick 					bits1 = bits << leftShift;
110053893Smckusick 					bits = *psrc++;
110153893Smckusick 					bits1 |= bits >> rightShift;
110253893Smckusick 					*pdst = (*pdst & ~startmask |
110353893Smckusick 						 ~bits1 & startmask);
110453893Smckusick 					pdst++;
110553893Smckusick 				}
110653893Smckusick 				nl = nlMiddle;
110753893Smckusick 				bits1 = bits;
110853893Smckusick 				Duff_shift_plus(nl, pdst, psrc, = ~);
110953893Smckusick 				if (endmask) {
111053893Smckusick 					bits1 = bits << leftShift;
111153893Smckusick 					if (endmask << rightShift) {
111253893Smckusick 						bits1 |= *psrc >> rightShift;
111353893Smckusick 					}
111453893Smckusick 					*pdst = (*pdst & ~endmask |
111553893Smckusick 						 ~bits1 & endmask);
111653893Smckusick 				}
111753893Smckusick 			}
111853893Smckusick 		}
111953893Smckusick 	} else {
112053893Smckusick 		xoffSrc = (sr->origin.x + w - 1) & 0x1f;
112153893Smckusick 		xoffDst = (dp->x + w - 1) & 0x1f;
112253893Smckusick 		pdstLine += ((dp->x + w - 1) >> 5) + 1;
112353893Smckusick 		psrcLine += ((sr->origin.x + w - 1) >> 5) + 1;
112453893Smckusick 		if (xoffSrc == xoffDst) {
112553893Smckusick 			while (h--) {
112653893Smckusick 				psrc = psrcLine;
112753893Smckusick 				pdst = pdstLine;
112853893Smckusick 				pdstLine += widthDst;
112953893Smckusick 				psrcLine += widthSrc;
113053893Smckusick 				if (endmask) {
113153893Smckusick 					pdst--;
113253893Smckusick 					psrc--;
113353893Smckusick 					*pdst = (*pdst & ~endmask |
113453893Smckusick 						 ~*psrc & endmask);
113553893Smckusick 				}
113653893Smckusick 				nl = nlMiddle;
113753893Smckusick 				Duff_minus(nl, pdst, psrc, = ~);
113853893Smckusick 				if (startmask) {
113953893Smckusick 					--pdst;
114053893Smckusick 					--psrc;
114153893Smckusick 					*pdst = (*pdst & ~startmask |
114253893Smckusick 						 ~*psrc & startmask);
114353893Smckusick 				}
114453893Smckusick 			}
114553893Smckusick 		} else {
114653893Smckusick 			if (xoffDst > xoffSrc) {
114753893Smckusick 				rightShift = xoffDst - xoffSrc;
114853893Smckusick 				leftShift = 32 - rightShift;
114953893Smckusick 			} else {
115053893Smckusick 				leftShift = xoffSrc - xoffDst;
115153893Smckusick 				rightShift = 32 - leftShift;
115253893Smckusick 			}
115353893Smckusick 			while (h--) {
115453893Smckusick 				psrc = psrcLine;
115553893Smckusick 				pdst = pdstLine;
115653893Smckusick 				pdstLine += widthDst;
115753893Smckusick 				psrcLine += widthSrc;
115853893Smckusick 				bits = 0;
115953893Smckusick 				if (xoffDst > xoffSrc)
116053893Smckusick 					bits = *--psrc;
116153893Smckusick 				if (endmask) {
116253893Smckusick 					bits1 = bits >> rightShift;
116353893Smckusick 					bits = *--psrc;
116453893Smckusick 					bits1 |= (bits << leftShift);
116553893Smckusick 					pdst--;
116653893Smckusick 					*pdst = (*pdst & ~endmask |
116753893Smckusick 						 ~bits1 & endmask);
116853893Smckusick 				}
116953893Smckusick 				nl = nlMiddle;
117053893Smckusick 				bits1 = bits;
117153893Smckusick 				Duff_shift_minus(nl, pdst, psrc, = ~);
117253893Smckusick 				if (startmask) {
117353893Smckusick 					bits1 = (bits >> rightShift);
117453893Smckusick 					if (startmask >> leftShift) {
117553893Smckusick 						bits1 |= *--psrc << leftShift;
117653893Smckusick 					}
117753893Smckusick 					--pdst;
117853893Smckusick 					*pdst = (*pdst & ~startmask |
117953893Smckusick 						 ~bits1 & startmask);
118053893Smckusick 				}
118153893Smckusick 			}
118253893Smckusick 		}
118353893Smckusick 	}
118453893Smckusick }
118553893Smckusick 
118653893Smckusick void
mfb_or_area32(addrSrc,addrDst,widthSrc,widthDst,sr,dp)118753893Smckusick mfb_or_area32(addrSrc, addrDst, widthSrc, widthDst, sr, dp)
118853893Smckusick u_int	*addrSrc;
118953893Smckusick u_int	*addrDst;
119053893Smckusick int	widthSrc;
119153893Smckusick int	widthDst;
119253893Smckusick lRectangle	*sr;	/* source rectangle */
119353893Smckusick lPoint		*dp;	/* destination point */
119453893Smckusick {
119553893Smckusick 	register u_int *psrcLine, *psrc;
119653893Smckusick 	register u_int *pdstLine, *pdst;
119753893Smckusick 	int w, h;
119853893Smckusick 	int xdir, ydir;
119953893Smckusick 	u_int startmask, endmask;
120053893Smckusick 	register int nlMiddle;
120153893Smckusick 	int xoffSrc, xoffDst;
120253893Smckusick 	register int leftShift, rightShift;
120353893Smckusick 	u_int bits;
120453893Smckusick 	u_int bits1;
120553893Smckusick 	register int nl;
120653893Smckusick 
120753893Smckusick 	if (sr->origin.y < dp->y) {
120853893Smckusick 		ydir = -1;
120953893Smckusick 		widthSrc = -widthSrc;
121053893Smckusick 		widthDst = -widthDst;
121153893Smckusick 	} else {
121253893Smckusick 		ydir = 1;
121353893Smckusick 	}
121453893Smckusick 
121553893Smckusick 	if (sr->origin.x < dp->x) {
121653893Smckusick 		xdir = -1;
121753893Smckusick 	} else {
121853893Smckusick 		xdir = 1;
121953893Smckusick 	}
122053893Smckusick 
122153893Smckusick 	w = sr->extent.x;
122253893Smckusick 	h = sr->extent.y;
122353893Smckusick 
122453893Smckusick 	if (ydir == -1) {
122553893Smckusick 		psrcLine = addrSrc + ((sr->origin.y + h - 1) * -widthSrc);
122653893Smckusick 		pdstLine = addrDst + ((dp->y + h - 1) * -widthDst);
122753893Smckusick 	} else {
122853893Smckusick 		psrcLine = addrSrc + (sr->origin.y * widthSrc);
122953893Smckusick 		pdstLine = addrDst + (dp->y * widthDst);
123053893Smckusick 	}
123153893Smckusick 	if ((dp->x & 0x1f) +w <= 32) {
123253893Smckusick 		startmask = mfbpartmasks32[dp->x & 0x1f][w & 0x1f];
123353893Smckusick 		endmask = 0;
123453893Smckusick 		nlMiddle = 0;
123553893Smckusick 	} else {
123653893Smckusick 		startmask = mfbstarttab32[dp->x & 0x1f];
123753893Smckusick 		endmask = mfbendtab32[(dp->x + w) & 0x1f];
123853893Smckusick 		if (startmask) {
123953893Smckusick 			nlMiddle = (w - (32 - (dp->x & 0x1f))) >> 5;
124053893Smckusick 		} else {
124153893Smckusick 			nlMiddle = w >> 5;
124253893Smckusick 		}
124353893Smckusick 	}
124453893Smckusick 
124553893Smckusick 	if (xdir == 1) {
124653893Smckusick 		xoffSrc = sr->origin.x & 0x1f;
124753893Smckusick 		xoffDst = dp->x & 0x1f;
124853893Smckusick 		pdstLine += (dp->x >> 5);
124953893Smckusick 		psrcLine += (sr->origin.x >> 5);
125053893Smckusick 		if (xoffSrc == xoffDst) {
125153893Smckusick 			while (h--) {
125253893Smckusick 				psrc = psrcLine;
125353893Smckusick 				pdst = pdstLine;
125453893Smckusick 				pdstLine += widthDst;
125553893Smckusick 				psrcLine += widthSrc;
125653893Smckusick 				if (startmask) {
125753893Smckusick 					*pdst++ |= *psrc++ & startmask;
125853893Smckusick 				}
125953893Smckusick 				nl = nlMiddle;
126053893Smckusick 				Duff_plus(nl, pdst, psrc, |=);
126153893Smckusick 				if (endmask) {
126253893Smckusick 					*pdst |= *psrc & endmask;
126353893Smckusick 				}
126453893Smckusick 			}
126553893Smckusick 		} else {
126653893Smckusick 			if (xoffSrc > xoffDst) {
126753893Smckusick 				leftShift = xoffSrc - xoffDst;
126853893Smckusick 				rightShift = 32 - leftShift;
126953893Smckusick 			} else {
127053893Smckusick 				rightShift = xoffDst - xoffSrc;
127153893Smckusick 				leftShift = 32 - rightShift;
127253893Smckusick 			}
127353893Smckusick 			while (h--) {
127453893Smckusick 				psrc = psrcLine;
127553893Smckusick 				pdst = pdstLine;
127653893Smckusick 				pdstLine += widthDst;
127753893Smckusick 				psrcLine += widthSrc;
127853893Smckusick 				bits = 0;
127953893Smckusick 				if (xoffSrc > xoffDst)
128053893Smckusick 					bits = *psrc++;
128153893Smckusick 				if (startmask) {
128253893Smckusick 					bits1 = bits << leftShift;
128353893Smckusick 					bits = *psrc++;
128453893Smckusick 					bits1 |= bits >> rightShift;
128553893Smckusick 					*pdst++ |= bits1 & startmask;
128653893Smckusick 				}
128753893Smckusick 				nl = nlMiddle;
128853893Smckusick 				bits1 = bits;
128953893Smckusick 				Duff_shift_plus(nl, pdst, psrc, |=);
129053893Smckusick 				if (endmask) {
129153893Smckusick 					bits1 = bits << leftShift;
129253893Smckusick 					if (endmask << rightShift) {
129353893Smckusick 						bits1 |= *psrc >> rightShift;
129453893Smckusick 					}
129553893Smckusick 					*pdst |= bits1 & endmask;
129653893Smckusick 				}
129753893Smckusick 			}
129853893Smckusick 		}
129953893Smckusick 	} else {
130053893Smckusick 		xoffSrc = (sr->origin.x + w - 1) & 0x1f;
130153893Smckusick 		xoffDst = (dp->x + w - 1) & 0x1f;
130253893Smckusick 		pdstLine += ((dp->x + w - 1) >> 5) + 1;
130353893Smckusick 		psrcLine += ((sr->origin.x + w - 1) >> 5) + 1;
130453893Smckusick 		if (xoffSrc == xoffDst) {
130553893Smckusick 			while (h--) {
130653893Smckusick 				psrc = psrcLine;
130753893Smckusick 				pdst = pdstLine;
130853893Smckusick 				pdstLine += widthDst;
130953893Smckusick 				psrcLine += widthSrc;
131053893Smckusick 				if (endmask) {
131153893Smckusick 					*--pdst |= *--psrc & endmask;
131253893Smckusick 				}
131353893Smckusick 				nl = nlMiddle;
131453893Smckusick 				Duff_minus(nl, pdst, psrc, |=);
131553893Smckusick 				if (startmask) {
131653893Smckusick 					*--pdst |= *--psrc & startmask;
131753893Smckusick 				}
131853893Smckusick 			}
131953893Smckusick 		} else {
132053893Smckusick 			if (xoffDst > xoffSrc) {
132153893Smckusick 				rightShift = xoffDst - xoffSrc;
132253893Smckusick 				leftShift = 32 - rightShift;
132353893Smckusick 			} else {
132453893Smckusick 				leftShift = xoffSrc - xoffDst;
132553893Smckusick 				rightShift = 32 - leftShift;
132653893Smckusick 			}
132753893Smckusick 			while (h--) {
132853893Smckusick 				psrc = psrcLine;
132953893Smckusick 				pdst = pdstLine;
133053893Smckusick 				pdstLine += widthDst;
133153893Smckusick 				psrcLine += widthSrc;
133253893Smckusick 				bits = 0;
133353893Smckusick 				if (xoffDst > xoffSrc)
133453893Smckusick 					bits = *--psrc;
133553893Smckusick 				if (endmask) {
133653893Smckusick 					bits1 = bits >> rightShift;
133753893Smckusick 					bits = *--psrc;
133853893Smckusick 					bits1 |= (bits << leftShift);
133953893Smckusick 					*--pdst |= bits1 & endmask;
134053893Smckusick 				}
134153893Smckusick 				nl = nlMiddle;
134253893Smckusick 				bits1 = bits;
134353893Smckusick 				Duff_shift_minus(nl, pdst, psrc, |=);
134453893Smckusick 				if (startmask) {
134553893Smckusick 					bits1 = (bits >> rightShift);
134653893Smckusick 					if (startmask >> leftShift) {
134753893Smckusick 						bits1 |= *--psrc << leftShift;
134853893Smckusick 					}
134953893Smckusick 					*--pdst |= bits1 & startmask;
135053893Smckusick 				}
135153893Smckusick 			}
135253893Smckusick 		}
135353893Smckusick 	}
135453893Smckusick }
135553893Smckusick 
135653893Smckusick void
mfb_xor_area32(addrSrc,addrDst,widthSrc,widthDst,sr,dp)135753893Smckusick mfb_xor_area32(addrSrc, addrDst, widthSrc, widthDst, sr, dp)
135853893Smckusick u_int	*addrSrc;
135953893Smckusick u_int	*addrDst;
136053893Smckusick int	widthSrc;
136153893Smckusick int	widthDst;
136253893Smckusick lRectangle	*sr;	/* source rectangle */
136353893Smckusick lPoint		*dp;	/* destination point */
136453893Smckusick {
136553893Smckusick 	register u_int *psrcLine, *psrc;
136653893Smckusick 	register u_int *pdstLine, *pdst;
136753893Smckusick 	int w, h;
136853893Smckusick 	int xdir, ydir;
136953893Smckusick 	u_int startmask, endmask;
137053893Smckusick 	register int nlMiddle;
137153893Smckusick 	int xoffSrc, xoffDst;
137253893Smckusick 	register int leftShift, rightShift;
137353893Smckusick 	u_int bits;
137453893Smckusick 	u_int bits1;
137553893Smckusick 	register int nl;
137653893Smckusick 
137753893Smckusick 	if (sr->origin.y < dp->y) {
137853893Smckusick 		ydir = -1;
137953893Smckusick 		widthSrc = -widthSrc;
138053893Smckusick 		widthDst = -widthDst;
138153893Smckusick 	} else {
138253893Smckusick 		ydir = 1;
138353893Smckusick 	}
138453893Smckusick 
138553893Smckusick 	if (sr->origin.x < dp->x) {
138653893Smckusick 		xdir = -1;
138753893Smckusick 	} else {
138853893Smckusick 		xdir = 1;
138953893Smckusick 	}
139053893Smckusick 
139153893Smckusick 	w = sr->extent.x;
139253893Smckusick 	h = sr->extent.y;
139353893Smckusick 
139453893Smckusick 	if (ydir == -1) {
139553893Smckusick 		psrcLine = addrSrc + ((sr->origin.y + h - 1) * -widthSrc);
139653893Smckusick 		pdstLine = addrDst + ((dp->y + h - 1) * -widthDst);
139753893Smckusick 	} else {
139853893Smckusick 		psrcLine = addrSrc + (sr->origin.y * widthSrc);
139953893Smckusick 		pdstLine = addrDst + (dp->y * widthDst);
140053893Smckusick 	}
140153893Smckusick 	if ((dp->x & 0x1f) +w <= 32) {
140253893Smckusick 		startmask = mfbpartmasks32[dp->x & 0x1f][w & 0x1f];
140353893Smckusick 		endmask = 0;
140453893Smckusick 		nlMiddle = 0;
140553893Smckusick 	} else {
140653893Smckusick 		startmask = mfbstarttab32[dp->x & 0x1f];
140753893Smckusick 		endmask = mfbendtab32[(dp->x + w) & 0x1f];
140853893Smckusick 		if (startmask) {
140953893Smckusick 			nlMiddle = (w - (32 - (dp->x & 0x1f))) >> 5;
141053893Smckusick 		} else {
141153893Smckusick 			nlMiddle = w >> 5;
141253893Smckusick 		}
141353893Smckusick 	}
141453893Smckusick 
141553893Smckusick 	if (xdir == 1) {
141653893Smckusick 		xoffSrc = sr->origin.x & 0x1f;
141753893Smckusick 		xoffDst = dp->x & 0x1f;
141853893Smckusick 		pdstLine += (dp->x >> 5);
141953893Smckusick 		psrcLine += (sr->origin.x >> 5);
142053893Smckusick 		if (xoffSrc == xoffDst) {
142153893Smckusick 			while (h--) {
142253893Smckusick 				psrc = psrcLine;
142353893Smckusick 				pdst = pdstLine;
142453893Smckusick 				pdstLine += widthDst;
142553893Smckusick 				psrcLine += widthSrc;
142653893Smckusick 				if (startmask) {
142753893Smckusick 					*pdst++ ^= *psrc++ & startmask;
142853893Smckusick 				}
142953893Smckusick 				nl = nlMiddle;
143053893Smckusick 				Duff_plus(nl, pdst, psrc, ^=);
143153893Smckusick 				if (endmask) {
143253893Smckusick 					*pdst ^= *psrc & endmask;
143353893Smckusick 				}
143453893Smckusick 			}
143553893Smckusick 		} else {
143653893Smckusick 			if (xoffSrc > xoffDst) {
143753893Smckusick 				leftShift = xoffSrc - xoffDst;
143853893Smckusick 				rightShift = 32 - leftShift;
143953893Smckusick 			} else {
144053893Smckusick 				rightShift = xoffDst - xoffSrc;
144153893Smckusick 				leftShift = 32 - rightShift;
144253893Smckusick 			}
144353893Smckusick 			while (h--) {
144453893Smckusick 				psrc = psrcLine;
144553893Smckusick 				pdst = pdstLine;
144653893Smckusick 				pdstLine += widthDst;
144753893Smckusick 				psrcLine += widthSrc;
144853893Smckusick 				bits = 0;
144953893Smckusick 				if (xoffSrc > xoffDst)
145053893Smckusick 					bits = *psrc++;
145153893Smckusick 				if (startmask) {
145253893Smckusick 					bits1 = bits << leftShift;
145353893Smckusick 					bits = *psrc++;
145453893Smckusick 					bits1 |= bits >> rightShift;
145553893Smckusick 					*pdst++ ^= bits1 & startmask;
145653893Smckusick 				}
145753893Smckusick 				nl = nlMiddle;
145853893Smckusick 				bits1 = bits;
145953893Smckusick 				Duff_shift_plus(nl, pdst, psrc, ^=);
146053893Smckusick 				if (endmask) {
146153893Smckusick 					bits1 = bits << leftShift;
146253893Smckusick 					if (endmask << rightShift) {
146353893Smckusick 						bits1 |= *psrc >> rightShift;
146453893Smckusick 					}
146553893Smckusick 					*pdst ^= bits1 & endmask;
146653893Smckusick 				}
146753893Smckusick 			}
146853893Smckusick 		}
146953893Smckusick 	} else {
147053893Smckusick 		xoffSrc = (sr->origin.x + w - 1) & 0x1f;
147153893Smckusick 		xoffDst = (dp->x + w - 1) & 0x1f;
147253893Smckusick 		pdstLine += ((dp->x + w - 1) >> 5) + 1;
147353893Smckusick 		psrcLine += ((sr->origin.x + w - 1) >> 5) + 1;
147453893Smckusick 		if (xoffSrc == xoffDst) {
147553893Smckusick 			while (h--) {
147653893Smckusick 				psrc = psrcLine;
147753893Smckusick 				pdst = pdstLine;
147853893Smckusick 				pdstLine += widthDst;
147953893Smckusick 				psrcLine += widthSrc;
148053893Smckusick 				if (endmask) {
148153893Smckusick 					*--pdst ^= *--psrc & endmask;
148253893Smckusick 				}
148353893Smckusick 				nl = nlMiddle;
148453893Smckusick 				Duff_minus(nl, pdst, psrc, ^=);
148553893Smckusick 				if (startmask) {
148653893Smckusick 					*--pdst ^= *--psrc & startmask;
148753893Smckusick 				}
148853893Smckusick 			}
148953893Smckusick 		} else {
149053893Smckusick 			if (xoffDst > xoffSrc) {
149153893Smckusick 				rightShift = xoffDst - xoffSrc;
149253893Smckusick 				leftShift = 32 - rightShift;
149353893Smckusick 			} else {
149453893Smckusick 				leftShift = xoffSrc - xoffDst;
149553893Smckusick 				rightShift = 32 - leftShift;
149653893Smckusick 			}
149753893Smckusick 			while (h--) {
149853893Smckusick 				psrc = psrcLine;
149953893Smckusick 				pdst = pdstLine;
150053893Smckusick 				pdstLine += widthDst;
150153893Smckusick 				psrcLine += widthSrc;
150253893Smckusick 				bits = 0;
150353893Smckusick 				if (xoffDst > xoffSrc)
150453893Smckusick 					bits = *--psrc;
150553893Smckusick 				if (endmask) {
150653893Smckusick 					bits1 = bits >> rightShift;
150753893Smckusick 					bits = *--psrc;
150853893Smckusick 					bits1 |= (bits << leftShift);
150953893Smckusick 					*--pdst ^= bits1 & endmask;
151053893Smckusick 				}
151153893Smckusick 				nl = nlMiddle;
151253893Smckusick 				bits1 = bits;
151353893Smckusick 				Duff_shift_minus(nl, pdst, psrc, ^=);
151453893Smckusick 				if (startmask) {
151553893Smckusick 					bits1 = (bits >> rightShift);
151653893Smckusick 					if (startmask >> leftShift) {
151753893Smckusick 						bits1 |= *--psrc << leftShift;
151853893Smckusick 					}
151953893Smckusick 					*--pdst ^= bits1 & startmask;
152053893Smckusick 				}
152153893Smckusick 			}
152253893Smckusick 		}
152353893Smckusick 	}
152453893Smckusick }
152553893Smckusick 
152653893Smckusick void
mfb_general_area32(func,addrSrc,addrDst,widthSrc,widthDst,sr,dp)152753893Smckusick mfb_general_area32(func, addrSrc, addrDst, widthSrc, widthDst, sr, dp)
152853893Smckusick int		func;
152953893Smckusick u_int	*addrSrc;
153053893Smckusick u_int	*addrDst;
153153893Smckusick int	widthSrc;
153253893Smckusick int	widthDst;
153353893Smckusick lRectangle	*sr;	/* source rectangle */
153453893Smckusick lPoint		*dp;	/* destination point */
153553893Smckusick {
153653893Smckusick 	register u_int *psrcLine, *psrc;
153753893Smckusick 	register u_int *pdstLine, *pdst;
153853893Smckusick 	register int leftShift, rightShift;
153953893Smckusick 	u_int bits;
154053893Smckusick 	u_int bits1;
154153893Smckusick 	register int nl;
154253893Smckusick 	u_int _ca1, _cx1, _ca2, _cx2;
154353893Smckusick 	u_int startmask, endmask;
154453893Smckusick 	int w, h;
154553893Smckusick 	int xdir, ydir;
154653893Smckusick 	register int nlMiddle;
154753893Smckusick 	int xoffSrc, xoffDst;
154853893Smckusick 
154953893Smckusick 	_ca1 = mergeRopBits[func].ca1;
155053893Smckusick 	_cx1 = mergeRopBits[func].cx1;
155153893Smckusick 	_ca2 = mergeRopBits[func].ca2;
155253893Smckusick 	_cx2 = mergeRopBits[func].cx2;
155353893Smckusick 
155453893Smckusick 	if (sr->origin.y < dp->y) {
155553893Smckusick 		ydir = -1;
155653893Smckusick 		widthSrc = -widthSrc;
155753893Smckusick 		widthDst = -widthDst;
155853893Smckusick 	} else {
155953893Smckusick 		ydir = 1;
156053893Smckusick 	}
156153893Smckusick 
156253893Smckusick 	if (sr->origin.x < dp->x) {
156353893Smckusick 		xdir = -1;
156453893Smckusick 	} else {
156553893Smckusick 		xdir = 1;
156653893Smckusick 	}
156753893Smckusick 
156853893Smckusick 	w = sr->extent.x;
156953893Smckusick 	h = sr->extent.y;
157053893Smckusick 
157153893Smckusick 	if (ydir == -1) {
157253893Smckusick 		psrcLine = addrSrc + ((sr->origin.y + h - 1) * -widthSrc);
157353893Smckusick 		pdstLine = addrDst + ((dp->y + h - 1) * -widthDst);
157453893Smckusick 	} else {
157553893Smckusick 		psrcLine = addrSrc + (sr->origin.y * widthSrc);
157653893Smckusick 		pdstLine = addrDst + (dp->y * widthDst);
157753893Smckusick 	}
157853893Smckusick 	if ((dp->x & 0x1f) +w <= 32) {
157953893Smckusick 		startmask = mfbpartmasks32[dp->x & 0x1f][w & 0x1f];
158053893Smckusick 		endmask = 0;
158153893Smckusick 		nlMiddle = 0;
158253893Smckusick 	} else {
158353893Smckusick 		startmask = mfbstarttab32[dp->x & 0x1f];
158453893Smckusick 		endmask = mfbendtab32[(dp->x + w) & 0x1f];
158553893Smckusick 		if (startmask) {
158653893Smckusick 			nlMiddle = (w - (32 - (dp->x & 0x1f))) >> 5;
158753893Smckusick 		} else {
158853893Smckusick 			nlMiddle = w >> 5;
158953893Smckusick 		}
159053893Smckusick 	}
159153893Smckusick 
159253893Smckusick 	if (xdir == 1) {
159353893Smckusick 		xoffSrc = sr->origin.x & 0x1f;
159453893Smckusick 		xoffDst = dp->x & 0x1f;
159553893Smckusick 		pdstLine += (dp->x >> 5);
159653893Smckusick 		psrcLine += (sr->origin.x >> 5);
159753893Smckusick 		if (xoffSrc == xoffDst) {
159853893Smckusick 			while (h--) {
159953893Smckusick 				psrc = psrcLine;
160053893Smckusick 				pdst = pdstLine;
160153893Smckusick 				pdstLine += widthDst;
160253893Smckusick 				psrcLine += widthSrc;
160353893Smckusick 				if (startmask) {
160453893Smckusick 					*pdst = DoMergeRopMask(*psrc, *pdst,
160553893Smckusick 							       startmask);
160653893Smckusick 					psrc++;
160753893Smckusick 					pdst++;
160853893Smckusick 				}
160953893Smckusick 				nl = nlMiddle;
161053893Smckusick #ifdef mc68020
161153893Smckusick 				Duff(nl, *pdst = DoMergeRop(*psrc, *pdst);
161253893Smckusick 					  psrc++; pdst++);
161353893Smckusick #else /* mc68020 */
161453893Smckusick 				psrc += nl & 7;
161553893Smckusick 				pdst += nl & 7;
161653893Smckusick 				switch (nl & 7) {
161753893Smckusick 				case 7:
161853893Smckusick 					pdst[-7] = DoMergeRop(psrc[-7], pdst[-7]);
161953893Smckusick 				case 6:
162053893Smckusick 					pdst[-6] = DoMergeRop(psrc[-6], pdst[-6]);
162153893Smckusick 				case 5:
162253893Smckusick 					pdst[-5] = DoMergeRop(psrc[-5], pdst[-5]);
162353893Smckusick 				case 4:
162453893Smckusick 					pdst[-4] = DoMergeRop(psrc[-4], pdst[-4]);
162553893Smckusick 				case 3:
162653893Smckusick 					pdst[-3] = DoMergeRop(psrc[-3], pdst[-3]);
162753893Smckusick 				case 2:
162853893Smckusick 					pdst[-2] = DoMergeRop(psrc[-2], pdst[-2]);
162953893Smckusick 				case 1:
163053893Smckusick 					pdst[-1] = DoMergeRop(psrc[-1], pdst[-1]);
163153893Smckusick 				}
163253893Smckusick 				while ((nl -= 8) >= 0) {
163353893Smckusick 					pdst += 8;
163453893Smckusick 					psrc += 8;
163553893Smckusick 					pdst[-8] = DoMergeRop(psrc[-8], pdst[-8]);
163653893Smckusick 					pdst[-7] = DoMergeRop(psrc[-7], pdst[-7]);
163753893Smckusick 					pdst[-6] = DoMergeRop(psrc[-6], pdst[-6]);
163853893Smckusick 					pdst[-5] = DoMergeRop(psrc[-5], pdst[-5]);
163953893Smckusick 					pdst[-4] = DoMergeRop(psrc[-4], pdst[-4]);
164053893Smckusick 					pdst[-3] = DoMergeRop(psrc[-3], pdst[-3]);
164153893Smckusick 					pdst[-2] = DoMergeRop(psrc[-2], pdst[-2]);
164253893Smckusick 					pdst[-1] = DoMergeRop(psrc[-1], pdst[-1]);
164353893Smckusick 				}
164453893Smckusick #endif /* mc68020 */
164553893Smckusick 				if (endmask) {
164653893Smckusick 					*pdst = DoMergeRopMask(*psrc, *pdst,
164753893Smckusick 							       endmask);
164853893Smckusick 				}
164953893Smckusick 			}
165053893Smckusick 		} else {
165153893Smckusick 			if (xoffSrc > xoffDst) {
165253893Smckusick 				leftShift = xoffSrc - xoffDst;
165353893Smckusick 				rightShift = 32 - leftShift;
165453893Smckusick 			} else {
165553893Smckusick 				rightShift = xoffDst - xoffSrc;
165653893Smckusick 				leftShift = 32 - rightShift;
165753893Smckusick 			}
165853893Smckusick 			while (h--) {
165953893Smckusick 				psrc = psrcLine;
166053893Smckusick 				pdst = pdstLine;
166153893Smckusick 				pdstLine += widthDst;
166253893Smckusick 				psrcLine += widthSrc;
166353893Smckusick 				bits = 0;
166453893Smckusick 				if (xoffSrc > xoffDst)
166553893Smckusick 					bits = *psrc++;
166653893Smckusick 				if (startmask) {
166753893Smckusick 					bits1 = bits << leftShift;
166853893Smckusick 					bits = *psrc++;
166953893Smckusick 					bits1 |= bits >> rightShift;
167053893Smckusick 					*pdst = DoMergeRopMask(bits1, *pdst,
167153893Smckusick 							       startmask);
167253893Smckusick 					pdst++;
167353893Smckusick 				}
167453893Smckusick 				nl = nlMiddle;
167553893Smckusick 				bits1 = bits;
167653893Smckusick 				psrc += nl & 7;
167753893Smckusick 				pdst += nl & 7;
167853893Smckusick 				switch (nl & 7) {
167953893Smckusick 				case 7:
168053893Smckusick 					bits = psrc[-7];
168153893Smckusick 					pdst[-7] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-7]);
168253893Smckusick 				case 6:
168353893Smckusick 					bits1 = psrc[-6];
168453893Smckusick 					pdst[-6] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-6]);
168553893Smckusick 				case 5:
168653893Smckusick 					bits = psrc[-5];
168753893Smckusick 					pdst[-5] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-5]);
168853893Smckusick 				case 4:
168953893Smckusick 					bits1 = psrc[-4];
169053893Smckusick 					pdst[-4] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-4]);
169153893Smckusick 				case 3:
169253893Smckusick 					bits = psrc[-3];
169353893Smckusick 					pdst[-3] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-3]);
169453893Smckusick 				case 2:
169553893Smckusick 					bits1 = psrc[-2];
169653893Smckusick 					pdst[-2] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-2]);
169753893Smckusick 				case 1:
169853893Smckusick 					bits = psrc[-1];
169953893Smckusick 					pdst[-1] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-1]);
170053893Smckusick 				}
170153893Smckusick 				while ((nl -= 8) >= 0) {
170253893Smckusick 					pdst += 8;
170353893Smckusick 					psrc += 8;
170453893Smckusick 					bits1 = psrc[-8];
170553893Smckusick 					pdst[-8] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-8]);
170653893Smckusick 					bits = psrc[-7];
170753893Smckusick 					pdst[-7] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-7]);
170853893Smckusick 					bits1 = psrc[-6];
170953893Smckusick 					pdst[-6] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-6]);
171053893Smckusick 					bits = psrc[-5];
171153893Smckusick 					pdst[-5] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-5]);
171253893Smckusick 					bits1 = psrc[-4];
171353893Smckusick 					pdst[-4] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-4]);
171453893Smckusick 					bits = psrc[-3];
171553893Smckusick 					pdst[-3] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-3]);
171653893Smckusick 					bits1 = psrc[-2];
171753893Smckusick 					pdst[-2] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-2]);
171853893Smckusick 					bits = psrc[-1];
171953893Smckusick 					pdst[-1] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-1]);
172053893Smckusick 				}
172153893Smckusick 				if (endmask) {
172253893Smckusick 					bits1 = bits << leftShift;
172353893Smckusick 					if (endmask << rightShift) {
172453893Smckusick 						bits = *psrc;
172553893Smckusick 						bits1 |= (bits >> rightShift);
172653893Smckusick 					}
172753893Smckusick 					*pdst = DoMergeRopMask(bits1, *pdst,
172853893Smckusick 							       endmask);
172953893Smckusick 				}
173053893Smckusick 			}
173153893Smckusick 		}
173253893Smckusick 	} else {
173353893Smckusick 		xoffSrc = (sr->origin.x + w - 1) & 0x1f;
173453893Smckusick 		xoffDst = (dp->x + w - 1) & 0x1f;
173553893Smckusick 		pdstLine += ((dp->x + w - 1) >> 5) + 1;
173653893Smckusick 		psrcLine += ((sr->origin.x + w - 1) >> 5) + 1;
173753893Smckusick 		if (xoffSrc == xoffDst) {
173853893Smckusick 			while (h--) {
173953893Smckusick 				psrc = psrcLine;
174053893Smckusick 				pdst = pdstLine;
174153893Smckusick 				pdstLine += widthDst;
174253893Smckusick 				psrcLine += widthSrc;
174353893Smckusick 				if (endmask) {
174453893Smckusick 					pdst--;
174553893Smckusick 					psrc--;
174653893Smckusick 					*pdst = DoMergeRopMask(*psrc, *pdst,
174753893Smckusick 							       endmask);
174853893Smckusick 				}
174953893Smckusick 				nl = nlMiddle;
175053893Smckusick #ifdef mc68020
175153893Smckusick 				Duff(nl, pdst--; psrc--;
175253893Smckusick 					  *pdst = DoMergeRop(*psrc, *pdst));
175353893Smckusick #else /* mc68020 */
175453893Smckusick 				psrc -= nl & 7;
175553893Smckusick 				pdst -= nl & 7;
175653893Smckusick 				switch (nl & 7) {
175753893Smckusick 				case 7:
175853893Smckusick 					pdst[7-1] = DoMergeRop(psrc[7-1], pdst[7-1]);
175953893Smckusick 				case 6:
176053893Smckusick 					pdst[6-1] = DoMergeRop(psrc[6-1], pdst[6-1]);
176153893Smckusick 				case 5:
176253893Smckusick 					pdst[5-1] = DoMergeRop(psrc[5-1], pdst[5-1]);
176353893Smckusick 				case 4:
176453893Smckusick 					pdst[4-1] = DoMergeRop(psrc[4-1], pdst[4-1]);
176553893Smckusick 				case 3:
176653893Smckusick 					pdst[3-1] = DoMergeRop(psrc[3-1], pdst[3-1]);
176753893Smckusick 				case 2:
176853893Smckusick 					pdst[2-1] = DoMergeRop(psrc[2-1], pdst[2-1]);
176953893Smckusick 				case 1:
177053893Smckusick 					pdst[1-1] = DoMergeRop(psrc[1-1], pdst[1-1]);
177153893Smckusick 				}
177253893Smckusick 				while ((nl -= 8) >= 0) {
177353893Smckusick 					pdst -= 8;
177453893Smckusick 					psrc -= 8;
177553893Smckusick 					pdst[8-1] = DoMergeRop(psrc[8-1], pdst[8-1]);
177653893Smckusick 					pdst[7-1] = DoMergeRop(psrc[7-1], pdst[7-1]);
177753893Smckusick 					pdst[6-1] = DoMergeRop(psrc[6-1], pdst[6-1]);
177853893Smckusick 					pdst[5-1] = DoMergeRop(psrc[5-1], pdst[5-1]);
177953893Smckusick 					pdst[4-1] = DoMergeRop(psrc[4-1], pdst[4-1]);
178053893Smckusick 					pdst[3-1] = DoMergeRop(psrc[3-1], pdst[3-1]);
178153893Smckusick 					pdst[2-1] = DoMergeRop(psrc[2-1], pdst[2-1]);
178253893Smckusick 					pdst[1-1] = DoMergeRop(psrc[1-1], pdst[1-1]);
178353893Smckusick 				}
178453893Smckusick #endif /* mc68020 */
178553893Smckusick 				if (startmask) {
178653893Smckusick 					--pdst;
178753893Smckusick 					--psrc;
178853893Smckusick 					*pdst = DoMergeRopMask(*psrc, *pdst,
178953893Smckusick 							       startmask);
179053893Smckusick 				}
179153893Smckusick 			}
179253893Smckusick 		} else {
179353893Smckusick 			if (xoffDst > xoffSrc) {
179453893Smckusick 				rightShift = xoffDst - xoffSrc;
179553893Smckusick 				leftShift = 32 - rightShift;
179653893Smckusick 			} else {
179753893Smckusick 				leftShift = xoffSrc - xoffDst;
179853893Smckusick 				rightShift = 32 - leftShift;
179953893Smckusick 			}
180053893Smckusick 			while (h--) {
180153893Smckusick 				psrc = psrcLine;
180253893Smckusick 				pdst = pdstLine;
180353893Smckusick 				pdstLine += widthDst;
180453893Smckusick 				psrcLine += widthSrc;
180553893Smckusick 				bits = 0;
180653893Smckusick 				if (xoffDst > xoffSrc)
180753893Smckusick 					bits = *--psrc;
180853893Smckusick 				if (endmask) {
180953893Smckusick 					bits1 = bits >> rightShift;
181053893Smckusick 					bits = *--psrc;
181153893Smckusick 					bits1 |= (bits << leftShift);
181253893Smckusick 					pdst--;
181353893Smckusick 					*pdst = DoMergeRopMask(bits1, *pdst,
181453893Smckusick 							       endmask);
181553893Smckusick 				}
181653893Smckusick 				nl = nlMiddle;
181753893Smckusick 				bits1 = bits;
181853893Smckusick 				psrc -= nl & 7;
181953893Smckusick 				pdst -= nl & 7;
182053893Smckusick 				switch (nl & 7) {
182153893Smckusick 				case 7:
182253893Smckusick 					bits = psrc[7-1];
182353893Smckusick 					pdst[7-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[7-1]);
182453893Smckusick 				case 6:
182553893Smckusick 					bits1 = psrc[6-1];
182653893Smckusick 					pdst[6-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[6-1]);
182753893Smckusick 				case 5:
182853893Smckusick 					bits = psrc[5-1];
182953893Smckusick 					pdst[5-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[5-1]);
183053893Smckusick 				case 4:
183153893Smckusick 					bits1 = psrc[4-1];
183253893Smckusick 					pdst[4-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[4-1]);
183353893Smckusick 				case 3:
183453893Smckusick 					bits = psrc[3-1];
183553893Smckusick 					pdst[3-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[3-1]);
183653893Smckusick 				case 2:
183753893Smckusick 					bits1 = psrc[2-1];
183853893Smckusick 					pdst[2-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[2-1]);
183953893Smckusick 				case 1:
184053893Smckusick 					bits = psrc[1-1];
184153893Smckusick 					pdst[1-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[1-1]);
184253893Smckusick 				}
184353893Smckusick 				while ((nl -= 8) >= 0) {
184453893Smckusick 					pdst -= 8;
184553893Smckusick 					psrc -= 8;
184653893Smckusick 					bits1 = psrc[8-1];
184753893Smckusick 					pdst[8-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[8-1]);
184853893Smckusick 					bits = psrc[7-1];
184953893Smckusick 					pdst[7-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[7-1]);
185053893Smckusick 					bits1 = psrc[6-1];
185153893Smckusick 					pdst[6-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[6-1]);
185253893Smckusick 					bits = psrc[5-1];
185353893Smckusick 					pdst[5-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[5-1]);
185453893Smckusick 					bits1 = psrc[4-1];
185553893Smckusick 					pdst[4-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[4-1]);
185653893Smckusick 					bits = psrc[3-1];
185753893Smckusick 					pdst[3-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[3-1]);
185853893Smckusick 					bits1 = psrc[2-1];
185953893Smckusick 					pdst[2-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[2-1]);
186053893Smckusick 					bits = psrc[1-1];
186153893Smckusick 					pdst[1-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[1-1]);
186253893Smckusick 				}
186353893Smckusick 				if (startmask) {
186453893Smckusick 					bits1 = (bits >> rightShift);
186553893Smckusick 					if (startmask >> leftShift) {
186653893Smckusick 						bits = *--psrc;
186753893Smckusick 						bits1 |= (bits << leftShift);
186853893Smckusick 					}
186953893Smckusick 					--pdst;
187053893Smckusick 					*pdst = DoMergeRopMask(bits1, *pdst,
187153893Smckusick 							       startmask);
187253893Smckusick 				}
187353893Smckusick 			}
187453893Smckusick 		}
187553893Smckusick 	}
187653893Smckusick }
187753893Smckusick 
187853893Smckusick void
mfb_clr_area32(x,y,w,h,addr,nlwidth)187953893Smckusick mfb_clr_area32(x, y, w, h, addr, nlwidth)
188053893Smckusick int x;
188153893Smckusick int y;
188253893Smckusick int w;
188353893Smckusick register int h;
188453893Smckusick register u_int *addr;
188553893Smckusick int nlwidth;
188653893Smckusick {
188753893Smckusick 	register u_int startmask;
188853893Smckusick 	u_int endmask;
188953893Smckusick 	register int nlw, nlwExtra;
189053893Smckusick 	int nlwMiddle;
189153893Smckusick 	int startoff, endoff;
189253893Smckusick 
189353893Smckusick 	addr += (y * nlwidth + (x >> 5));
189453893Smckusick 
189553893Smckusick 	startoff = x & 0x1f;
189653893Smckusick 	if (((startoff) + w) < 32) {
189753893Smckusick 		startmask = ~mfbpartmasks32[startoff][w & 0x1f];
189853893Smckusick 		nlwExtra = nlwidth;
189953893Smckusick #ifdef mc68020
190053893Smckusick 		asm("	lsl.l	#2,d4");
190153893Smckusick 		Duff(h, asm("	and.l	d6,(a5)");
190253893Smckusick 			asm("	adda.l	d4,a5"))
190353893Smckusick #else /* mc68020 */
190453893Smckusick 		Duff(h, *addr &= startmask; addr += nlwExtra)
190553893Smckusick #endif /* mc68020 */
190653893Smckusick 		return;
190753893Smckusick 	}
190853893Smckusick 	endoff = (x + w) & 0x1f;
190953893Smckusick 	if (startoff) {
191053893Smckusick 		startmask = ~mfbstarttab32[startoff];
191153893Smckusick 		nlwMiddle = (w - (32 - (startoff))) >> 5;
191253893Smckusick 		nlwExtra = nlwidth - nlwMiddle - 1;
191353893Smckusick 		if (endoff) {
191453893Smckusick 			endmask = ~mfbendtab32[endoff];
191553893Smckusick 			while (h--) {
191653893Smckusick 				nlw = nlwMiddle;
191753893Smckusick 				*addr++ &= startmask;
191853893Smckusick 				Duff_single(nlw, addr, = 0);
191953893Smckusick 				*addr &= endmask;
192053893Smckusick 				addr += nlwExtra;
192153893Smckusick 			}
192253893Smckusick 		} else {
192353893Smckusick 			while (h--) {
192453893Smckusick 				nlw = nlwMiddle;
192553893Smckusick 				*addr++ &= startmask;
192653893Smckusick 				Duff_single(nlw, addr, = 0);
192753893Smckusick 				addr += nlwExtra;
192853893Smckusick 			}
192953893Smckusick 		}
193053893Smckusick 	} else {
193153893Smckusick 		nlwMiddle = w >> 5;
193253893Smckusick 		nlwExtra = nlwidth - nlwMiddle;
193353893Smckusick 		if (endoff) {
193453893Smckusick 			endmask = ~mfbendtab32[endoff];
193553893Smckusick 			while (h--) {
193653893Smckusick 				nlw = nlwMiddle;
193753893Smckusick 				Duff_single(nlw, addr, = 0);
193853893Smckusick 				*addr &= endmask;
193953893Smckusick 				addr += nlwExtra;
194053893Smckusick 			}
194153893Smckusick 		} else {
194253893Smckusick 			while (h--) {
194353893Smckusick 				nlw = nlwMiddle;
194453893Smckusick 				Duff_single(nlw, addr, = 0);
194553893Smckusick 				addr += nlwExtra;
194653893Smckusick 			}
194753893Smckusick 		}
194853893Smckusick 	}
194953893Smckusick }
195053893Smckusick 
195153893Smckusick void
mfb_inv_area32(x,y,w,h,addr,nlwidth)195253893Smckusick mfb_inv_area32(x, y, w, h, addr, nlwidth)
195353893Smckusick int x;
195453893Smckusick int y;
195553893Smckusick int w;
195653893Smckusick register int h;
195753893Smckusick register u_int *addr;
195853893Smckusick int nlwidth;
195953893Smckusick {
196053893Smckusick 	register u_int startmask;
196153893Smckusick 	u_int endmask;
196253893Smckusick 	register int nlw, nlwExtra;
196353893Smckusick 	int nlwMiddle;
196453893Smckusick 	int startoff, endoff;
196553893Smckusick 
196653893Smckusick 	addr += (y * nlwidth + (x >> 5));
196753893Smckusick 
196853893Smckusick 	startoff = x & 0x1f;
196953893Smckusick 	if (((startoff) + w) < 32) {
197053893Smckusick 		startmask = mfbpartmasks32[startoff][w & 0x1f];
197153893Smckusick 		nlwExtra = nlwidth;
197253893Smckusick #ifdef mc68020
197353893Smckusick 		asm("	lsl.l	#2,d4");
197453893Smckusick 		Duff(h, asm("	eor.l	d6,(a5)");
197553893Smckusick 			asm("	adda.l	d4,a5"))
197653893Smckusick #else /* mc68020 */
197753893Smckusick 		Duff(h, *addr ^= startmask; addr += nlwExtra)
197853893Smckusick #endif /* mc68020 */
197953893Smckusick 		return;
198053893Smckusick 	}
198153893Smckusick 	endoff = (x + w) & 0x1f;
198253893Smckusick 	if (startoff) {
198353893Smckusick 		startmask = mfbstarttab32[startoff];
198453893Smckusick 		nlwMiddle = (w - (32 - (startoff))) >> 5;
198553893Smckusick 		nlwExtra = nlwidth - nlwMiddle - 1;
198653893Smckusick 		if (endoff) {
198753893Smckusick 			endmask = mfbendtab32[endoff];
198853893Smckusick 			while (h--) {
198953893Smckusick 				nlw = nlwMiddle;
199053893Smckusick 				*addr++ ^= startmask;
199153893Smckusick 				Duff_single(nlw, addr, ^= ~0);
199253893Smckusick 				*addr ^= endmask;
199353893Smckusick 				addr += nlwExtra;
199453893Smckusick 			}
199553893Smckusick 		} else {
199653893Smckusick 			while (h--) {
199753893Smckusick 				nlw = nlwMiddle;
199853893Smckusick 				*addr++ ^= startmask;
199953893Smckusick 				Duff_single(nlw, addr, ^= ~0);
200053893Smckusick 				addr += nlwExtra;
200153893Smckusick 			}
200253893Smckusick 		}
200353893Smckusick 	} else {
200453893Smckusick 		nlwMiddle = w >> 5;
200553893Smckusick 		nlwExtra = nlwidth - nlwMiddle;
200653893Smckusick 		if (endoff) {
200753893Smckusick 			endmask = mfbendtab32[endoff];
200853893Smckusick 			while (h--) {
200953893Smckusick 				nlw = nlwMiddle;
201053893Smckusick 				Duff_single(nlw, addr, ^= ~0);
201153893Smckusick 				*addr ^= endmask;
201253893Smckusick 				addr += nlwExtra;
201353893Smckusick 			}
201453893Smckusick 		} else {
201553893Smckusick 			while (h--) {
201653893Smckusick 				nlw = nlwMiddle;
201753893Smckusick 				Duff_single(nlw, addr, ^= ~0);
201853893Smckusick 				addr += nlwExtra;
201953893Smckusick 			}
202053893Smckusick 		}
202153893Smckusick 	}
202253893Smckusick }
202353893Smckusick 
202453893Smckusick void
mfb_set_area32(x,y,w,h,addr,nlwidth)202553893Smckusick mfb_set_area32(x, y, w, h, addr, nlwidth)
202653893Smckusick int x;
202753893Smckusick int y;
202853893Smckusick int w;
202953893Smckusick register int h;
203053893Smckusick register u_int *addr;
203153893Smckusick int nlwidth;
203253893Smckusick {
203353893Smckusick 	register u_int startmask;
203453893Smckusick 	u_int endmask;
203553893Smckusick 	register int nlw, nlwExtra;
203653893Smckusick 	int nlwMiddle;
203753893Smckusick 	int startoff, endoff;
203853893Smckusick 
203953893Smckusick 	addr += (y * nlwidth + (x >> 5));
204053893Smckusick 
204153893Smckusick 	startoff = x & 0x1f;
204253893Smckusick 	if (((startoff) + w) < 32) {
204353893Smckusick 		startmask = mfbpartmasks32[startoff][w & 0x1f];
204453893Smckusick 		nlwExtra = nlwidth;
204553893Smckusick #ifdef mc68020
204653893Smckusick 		asm("	lsl.l	#2,d4");
204753893Smckusick 		Duff(h, asm("	or.l	d6,(a5)");
204853893Smckusick 			asm("	adda.l	d4,a5"))
204953893Smckusick #else /* mc68020 */
205053893Smckusick 		Duff(h, *addr |= startmask; addr += nlwExtra)
205153893Smckusick #endif /* mc68020 */
205253893Smckusick 		return;
205353893Smckusick 	}
205453893Smckusick 	endoff = (x + w) & 0x1f;
205553893Smckusick 	if (startoff) {
205653893Smckusick 		startmask = mfbstarttab32[startoff];
205753893Smckusick 		nlwMiddle = (w - (32 - (startoff))) >> 5;
205853893Smckusick 		nlwExtra = nlwidth - nlwMiddle - 1;
205953893Smckusick 		if (endoff) {
206053893Smckusick 			endmask = mfbendtab32[endoff];
206153893Smckusick 			while (h--) {
206253893Smckusick 				nlw = nlwMiddle;
206353893Smckusick 				*addr++ |= startmask;
206453893Smckusick 				Duff_single(nlw, addr, = ~0);
206553893Smckusick 				*addr |= endmask;
206653893Smckusick 				addr += nlwExtra;
206753893Smckusick 			}
206853893Smckusick 		} else {
206953893Smckusick 			while (h--) {
207053893Smckusick 				nlw = nlwMiddle;
207153893Smckusick 				*addr++ |= startmask;
207253893Smckusick 				Duff_single(nlw, addr, = ~0);
207353893Smckusick 				addr += nlwExtra;
207453893Smckusick 			}
207553893Smckusick 		}
207653893Smckusick 	} else {
207753893Smckusick 		nlwMiddle = w >> 5;
207853893Smckusick 		nlwExtra = nlwidth - nlwMiddle;
207953893Smckusick 		if (endoff) {
208053893Smckusick 			endmask = mfbendtab32[endoff];
208153893Smckusick 			while (h--) {
208253893Smckusick 				nlw = nlwMiddle;
208353893Smckusick 				Duff_single(nlw, addr, = ~0);
208453893Smckusick 				*addr |= endmask;
208553893Smckusick 				addr += nlwExtra;
208653893Smckusick 			}
208753893Smckusick 		} else {
208853893Smckusick 			while (h--) {
208953893Smckusick 				nlw = nlwMiddle;
209053893Smckusick 				Duff_single(nlw, addr, = ~0);
209153893Smckusick 				addr += nlwExtra;
209253893Smckusick 			}
209353893Smckusick 		}
209453893Smckusick 	}
209553893Smckusick }
209653893Smckusick 
209753893Smckusick void
mfb_copy_area16(addrSrc,addrDst,widthSrc,widthDst,sr,dp)209853893Smckusick mfb_copy_area16(addrSrc, addrDst, widthSrc, widthDst, sr, dp)
209953893Smckusick u_short	*addrSrc;
210053893Smckusick u_short	*addrDst;
210153893Smckusick u_int	widthSrc;
210253893Smckusick u_int	widthDst;
210353893Smckusick lRectangle	*sr;	/* source rectangle */
210453893Smckusick lPoint		*dp;	/* destination point */
210553893Smckusick {
210653893Smckusick 	register u_short *psrcLine, *psrc;
210753893Smckusick 	register u_short *pdstLine, *pdst;
210853893Smckusick 	int w, h;
210953893Smckusick 	int xdir, ydir;
211053893Smckusick 	u_short startmask, endmask;
211153893Smckusick 	register int nlMiddle;
211253893Smckusick 	int xoffSrc, xoffDst;
211353893Smckusick 	register int leftShift, rightShift;
211453893Smckusick 	u_short bits;
211553893Smckusick 	u_short bits1;
211653893Smckusick 	register int nl;
211753893Smckusick 
211853893Smckusick 	if (sr->origin.y < dp->y) {
211953893Smckusick 		ydir = -1;
212053893Smckusick 		widthSrc = -widthSrc;
212153893Smckusick 		widthDst = -widthDst;
212253893Smckusick 	} else {
212353893Smckusick 		ydir = 1;
212453893Smckusick 	}
212553893Smckusick 
212653893Smckusick 	if (sr->origin.x < dp->x) {
212753893Smckusick 		xdir = -1;
212853893Smckusick 	} else {
212953893Smckusick 		xdir = 1;
213053893Smckusick 	}
213153893Smckusick 
213253893Smckusick 	w = sr->extent.x;
213353893Smckusick 	h = sr->extent.y;
213453893Smckusick 
213553893Smckusick 	if (ydir == -1) {
213653893Smckusick 		psrcLine = addrSrc + ((sr->origin.y + h - 1) * -widthSrc);
213753893Smckusick 		pdstLine = addrDst + ((dp->y + h - 1) * -widthDst);
213853893Smckusick 	} else {
213953893Smckusick 		psrcLine = addrSrc + (sr->origin.y * widthSrc);
214053893Smckusick 		pdstLine = addrDst + (dp->y * widthDst);
214153893Smckusick 	}
214253893Smckusick 	if ((dp->x & 0xf) +w <= 16) {
214353893Smckusick 		startmask = mfbpartmasks16[dp->x & 0xf][w & 0xf];
214453893Smckusick 		endmask = 0;
214553893Smckusick 		nlMiddle = 0;
214653893Smckusick 	} else {
214753893Smckusick 		startmask = mfbstarttab16[dp->x & 0xf];
214853893Smckusick 		endmask = mfbendtab16[(dp->x + w) & 0xf];
214953893Smckusick 		if (startmask) {
215053893Smckusick 			nlMiddle = (w - (16 - (dp->x & 0xf))) >> 4;
215153893Smckusick 		} else {
215253893Smckusick 			nlMiddle = w >> 4;
215353893Smckusick 		}
215453893Smckusick 	}
215553893Smckusick 
215653893Smckusick 	if (xdir == 1) {
215753893Smckusick 		xoffSrc = sr->origin.x & 0xf;
215853893Smckusick 		xoffDst = dp->x & 0xf;
215953893Smckusick 		pdstLine += (dp->x >> 4);
216053893Smckusick 		psrcLine += (sr->origin.x >> 4);
216153893Smckusick 		if (xoffSrc == xoffDst) {
216253893Smckusick 			while (h--) {
216353893Smckusick 				psrc = psrcLine;
216453893Smckusick 				pdst = pdstLine;
216553893Smckusick 				psrcLine += widthSrc;
216653893Smckusick 				pdstLine += widthDst;
216753893Smckusick 				if (startmask) {
216853893Smckusick 					*pdst = (*pdst & ~startmask |
216953893Smckusick 						 *psrc & startmask);
217053893Smckusick 					psrc++;
217153893Smckusick 					pdst++;
217253893Smckusick 				}
217353893Smckusick 				nl = nlMiddle;
217453893Smckusick 				Duff_plus(nl, pdst, psrc, =);
217553893Smckusick 				if (endmask) {
217653893Smckusick 					*pdst = (*pdst & ~endmask |
217753893Smckusick 						 *psrc & endmask);
217853893Smckusick 				}
217953893Smckusick 			}
218053893Smckusick 		} else {
218153893Smckusick 			if (xoffSrc > xoffDst) {
218253893Smckusick 				leftShift = xoffSrc - xoffDst;
218353893Smckusick 				rightShift = 16 - leftShift;
218453893Smckusick 			} else {
218553893Smckusick 				rightShift = xoffDst - xoffSrc;
218653893Smckusick 				leftShift = 16 - rightShift;
218753893Smckusick 			}
218853893Smckusick 			while (h--) {
218953893Smckusick 				psrc = psrcLine;
219053893Smckusick 				pdst = pdstLine;
219153893Smckusick 				psrcLine += widthSrc;
219253893Smckusick 				pdstLine += widthDst;
219353893Smckusick 				bits = 0;
219453893Smckusick 				if (xoffSrc > xoffDst)
219553893Smckusick 					bits = *psrc++;
219653893Smckusick 				if (startmask) {
219753893Smckusick 					bits1 = bits << leftShift;
219853893Smckusick 					bits = *psrc++;
219953893Smckusick 					bits1 |= bits >> rightShift;
220053893Smckusick 					*pdst = (*pdst & ~startmask |
220153893Smckusick 						 bits1 & startmask);
220253893Smckusick 					pdst++;
220353893Smckusick 				}
220453893Smckusick 				nl = nlMiddle;
220553893Smckusick 				bits1 = bits;
220653893Smckusick 				Duff_shift_plus(nl, pdst, psrc, =);
220753893Smckusick 				if (endmask) {
220853893Smckusick 					bits1 = bits << leftShift;
220953893Smckusick 					if ((endmask << rightShift) & 0xffff) {
221053893Smckusick 						bits1 |= *psrc >> rightShift;
221153893Smckusick 					}
221253893Smckusick 					*pdst = (*pdst & ~endmask |
221353893Smckusick 						 bits1 & endmask);
221453893Smckusick 				}
221553893Smckusick 			}
221653893Smckusick 		}
221753893Smckusick 	} else {
221853893Smckusick 		xoffSrc = (sr->origin.x + w - 1) & 0xf;
221953893Smckusick 		xoffDst = (dp->x + w - 1) & 0xf;
222053893Smckusick 		pdstLine += ((dp->x + w - 1) >> 4) + 1;
222153893Smckusick 		psrcLine += ((sr->origin.x + w - 1) >> 4) + 1;
222253893Smckusick 		if (xoffSrc == xoffDst) {
222353893Smckusick 			while (h--) {
222453893Smckusick 				psrc = psrcLine;
222553893Smckusick 				pdst = pdstLine;
222653893Smckusick 				psrcLine += widthSrc;
222753893Smckusick 				pdstLine += widthDst;
222853893Smckusick 				if (endmask) {
222953893Smckusick 					pdst--;
223053893Smckusick 					psrc--;
223153893Smckusick 					*pdst = (*pdst & ~endmask |
223253893Smckusick 						 *psrc & endmask);
223353893Smckusick 				}
223453893Smckusick 				nl = nlMiddle;
223553893Smckusick 				Duff_minus(nl, pdst, psrc, =);
223653893Smckusick 				if (startmask) {
223753893Smckusick 					--pdst;
223853893Smckusick 					--psrc;
223953893Smckusick 					*pdst = (*pdst & ~startmask |
224053893Smckusick 						 *psrc & startmask);
224153893Smckusick 				}
224253893Smckusick 			}
224353893Smckusick 		} else {
224453893Smckusick 			if (xoffDst > xoffSrc) {
224553893Smckusick 				rightShift = xoffDst - xoffSrc;
224653893Smckusick 				leftShift = 16 - rightShift;
224753893Smckusick 			} else {
224853893Smckusick 				leftShift = xoffSrc - xoffDst;
224953893Smckusick 				rightShift = 16 - leftShift;
225053893Smckusick 			}
225153893Smckusick 			while (h--) {
225253893Smckusick 				psrc = psrcLine;
225353893Smckusick 				pdst = pdstLine;
225453893Smckusick 				psrcLine += widthSrc;
225553893Smckusick 				pdstLine += widthDst;
225653893Smckusick 				bits = 0;
225753893Smckusick 				if (xoffDst > xoffSrc)
225853893Smckusick 					bits = *--psrc;
225953893Smckusick 				if (endmask) {
226053893Smckusick 					bits1 = bits >> rightShift;
226153893Smckusick 					bits = *--psrc;
226253893Smckusick 					bits1 |= (bits << leftShift);
226353893Smckusick 					pdst--;
226453893Smckusick 					*pdst = (*pdst & ~endmask |
226553893Smckusick 						 bits1 & endmask);
226653893Smckusick 				}
226753893Smckusick 				nl = nlMiddle;
226853893Smckusick 				bits1 = bits;
226953893Smckusick 				Duff_shift_minus(nl, pdst, psrc, =);
227053893Smckusick 				if (startmask) {
227153893Smckusick 					bits1 = (bits >> rightShift);
227253893Smckusick 					if (startmask >> leftShift) {
227353893Smckusick 						bits1 |= *--psrc << leftShift;
227453893Smckusick 					}
227553893Smckusick 					--pdst;
227653893Smckusick 					*pdst = (*pdst & ~startmask |
227753893Smckusick 						 bits1 & startmask);
227853893Smckusick 				}
227953893Smckusick 			}
228053893Smckusick 		}
228153893Smckusick 	}
228253893Smckusick }
228353893Smckusick 
228453893Smckusick void
mfb_copyinv_area16(addrSrc,addrDst,widthSrc,widthDst,sr,dp)228553893Smckusick mfb_copyinv_area16(addrSrc, addrDst, widthSrc, widthDst, sr, dp)
228653893Smckusick u_short	*addrSrc;
228753893Smckusick u_short	*addrDst;
228853893Smckusick register int	widthSrc;
228953893Smckusick register int	widthDst;
229053893Smckusick lRectangle	*sr;	/* source rectangle */
229153893Smckusick lPoint		*dp;	/* destination point */
229253893Smckusick {
229353893Smckusick 	register u_short *psrcLine, *psrc;
229453893Smckusick 	register u_short *pdstLine, *pdst;
229553893Smckusick 	int w, h;
229653893Smckusick 	int xdir, ydir;
229753893Smckusick 	u_short startmask, endmask;
229853893Smckusick 	register int nlMiddle;
229953893Smckusick 	int xoffSrc, xoffDst;
230053893Smckusick 	register int leftShift, rightShift;
230153893Smckusick 	u_short bits;
230253893Smckusick 	u_short bits1;
230353893Smckusick 	register int nl;
230453893Smckusick 
230553893Smckusick 	if (sr->origin.y < dp->y) {
230653893Smckusick 		ydir = -1;
230753893Smckusick 		widthSrc = -widthSrc;
230853893Smckusick 		widthDst = -widthDst;
230953893Smckusick 	} else {
231053893Smckusick 		ydir = 1;
231153893Smckusick 	}
231253893Smckusick 
231353893Smckusick 	if (sr->origin.x < dp->x) {
231453893Smckusick 		xdir = -1;
231553893Smckusick 	} else {
231653893Smckusick 		xdir = 1;
231753893Smckusick 	}
231853893Smckusick 
231953893Smckusick 	w = sr->extent.x;
232053893Smckusick 	h = sr->extent.y;
232153893Smckusick 
232253893Smckusick 	if (ydir == -1) {
232353893Smckusick 		psrcLine = addrSrc + ((sr->origin.y + h - 1) * -widthSrc);
232453893Smckusick 		pdstLine = addrDst + ((dp->y + h - 1) * -widthDst);
232553893Smckusick 	} else {
232653893Smckusick 		psrcLine = addrSrc + (sr->origin.y * widthSrc);
232753893Smckusick 		pdstLine = addrDst + (dp->y * widthDst);
232853893Smckusick 	}
232953893Smckusick 	if ((dp->x & 0xf) +w <= 16) {
233053893Smckusick 		startmask = mfbpartmasks16[dp->x & 0xf][w & 0xf];
233153893Smckusick 		endmask = 0;
233253893Smckusick 		nlMiddle = 0;
233353893Smckusick 	} else {
233453893Smckusick 		startmask = mfbstarttab16[dp->x & 0xf];
233553893Smckusick 		endmask = mfbendtab16[(dp->x + w) & 0xf];
233653893Smckusick 		if (startmask) {
233753893Smckusick 			nlMiddle = (w - (16 - (dp->x & 0xf))) >> 4;
233853893Smckusick 		} else {
233953893Smckusick 			nlMiddle = w >> 4;
234053893Smckusick 		}
234153893Smckusick 	}
234253893Smckusick 
234353893Smckusick 	if (xdir == 1) {
234453893Smckusick 		xoffSrc = sr->origin.x & 0xf;
234553893Smckusick 		xoffDst = dp->x & 0xf;
234653893Smckusick 		psrcLine += (sr->origin.x >> 4);
234753893Smckusick 		pdstLine += (dp->x >> 4);
234853893Smckusick 		if (xoffSrc == xoffDst) {
234953893Smckusick 			while (h--) {
235053893Smckusick 				psrc = psrcLine;
235153893Smckusick 				pdst = pdstLine;
235253893Smckusick 				psrcLine += widthSrc;
235353893Smckusick 				pdstLine += widthDst;
235453893Smckusick 				if (startmask) {
235553893Smckusick 					*pdst = (*pdst & ~startmask |
235653893Smckusick 						 ~*psrc & startmask);
235753893Smckusick 					psrc++;
235853893Smckusick 					pdst++;
235953893Smckusick 				}
236053893Smckusick 				nl = nlMiddle;
236153893Smckusick 				Duff_plus(nl, pdst, psrc, = ~);
236253893Smckusick 				if (endmask) {
236353893Smckusick 					*pdst = (*pdst & ~endmask |
236453893Smckusick 						 ~*psrc & endmask);
236553893Smckusick 				}
236653893Smckusick 			}
236753893Smckusick 		} else {
236853893Smckusick 			if (xoffSrc > xoffDst) {
236953893Smckusick 				leftShift = xoffSrc - xoffDst;
237053893Smckusick 				rightShift = 16 - leftShift;
237153893Smckusick 			} else {
237253893Smckusick 				rightShift = xoffDst - xoffSrc;
237353893Smckusick 				leftShift = 16 - rightShift;
237453893Smckusick 			}
237553893Smckusick 			while (h--) {
237653893Smckusick 				psrc = psrcLine;
237753893Smckusick 				pdst = pdstLine;
237853893Smckusick 				psrcLine += widthSrc;
237953893Smckusick 				pdstLine += widthDst;
238053893Smckusick 				bits = 0;
238153893Smckusick 				if (xoffSrc > xoffDst)
238253893Smckusick 					bits = *psrc++;
238353893Smckusick 				if (startmask) {
238453893Smckusick 					bits1 = bits << leftShift;
238553893Smckusick 					bits = *psrc++;
238653893Smckusick 					bits1 |= bits >> rightShift;
238753893Smckusick 					*pdst = (*pdst & ~startmask |
238853893Smckusick 						 ~bits1 & startmask);
238953893Smckusick 					pdst++;
239053893Smckusick 				}
239153893Smckusick 				nl = nlMiddle;
239253893Smckusick 				bits1 = bits;
239353893Smckusick 				Duff_shift_plus(nl, pdst, psrc, = ~);
239453893Smckusick 				if (endmask) {
239553893Smckusick 					bits1 = bits << leftShift;
239653893Smckusick 					if ((endmask << rightShift) & 0xffff) {
239753893Smckusick 						bits1 |= *psrc >> rightShift;
239853893Smckusick 					}
239953893Smckusick 					*pdst = (*pdst & ~endmask |
240053893Smckusick 						 ~bits1 & endmask);
240153893Smckusick 				}
240253893Smckusick 			}
240353893Smckusick 		}
240453893Smckusick 	} else {
240553893Smckusick 		xoffSrc = (sr->origin.x + w - 1) & 0xf;
240653893Smckusick 		xoffDst = (dp->x + w - 1) & 0xf;
240753893Smckusick 		pdstLine += ((dp->x + w - 1) >> 4) + 1;
240853893Smckusick 		psrcLine += ((sr->origin.x + w - 1) >> 4) + 1;
240953893Smckusick 		if (xoffSrc == xoffDst) {
241053893Smckusick 			while (h--) {
241153893Smckusick 				psrc = psrcLine;
241253893Smckusick 				pdst = pdstLine;
241353893Smckusick 				psrcLine += widthSrc;
241453893Smckusick 				pdstLine += widthDst;
241553893Smckusick 				if (endmask) {
241653893Smckusick 					pdst--;
241753893Smckusick 					psrc--;
241853893Smckusick 					*pdst = (*pdst & ~endmask |
241953893Smckusick 						 ~*psrc & endmask);
242053893Smckusick 				}
242153893Smckusick 				nl = nlMiddle;
242253893Smckusick 				Duff_minus(nl, pdst, psrc, = ~);
242353893Smckusick 				if (startmask) {
242453893Smckusick 					--pdst;
242553893Smckusick 					--psrc;
242653893Smckusick 					*pdst = (*pdst & ~startmask |
242753893Smckusick 						 ~*psrc & startmask);
242853893Smckusick 				}
242953893Smckusick 			}
243053893Smckusick 		} else {
243153893Smckusick 			if (xoffDst > xoffSrc) {
243253893Smckusick 				rightShift = xoffDst - xoffSrc;
243353893Smckusick 				leftShift = 16 - rightShift;
243453893Smckusick 			} else {
243553893Smckusick 				leftShift = xoffSrc - xoffDst;
243653893Smckusick 				rightShift = 16 - leftShift;
243753893Smckusick 			}
243853893Smckusick 			while (h--) {
243953893Smckusick 				psrc = psrcLine;
244053893Smckusick 				pdst = pdstLine;
244153893Smckusick 				psrcLine += widthSrc;
244253893Smckusick 				pdstLine += widthDst;
244353893Smckusick 				bits = 0;
244453893Smckusick 				if (xoffDst > xoffSrc)
244553893Smckusick 					bits = *--psrc;
244653893Smckusick 				if (endmask) {
244753893Smckusick 					bits1 = bits >> rightShift;
244853893Smckusick 					bits = *--psrc;
244953893Smckusick 					bits1 |= (bits << leftShift);
245053893Smckusick 					pdst--;
245153893Smckusick 					*pdst = (*pdst & ~endmask |
245253893Smckusick 						 ~bits1 & endmask);
245353893Smckusick 				}
245453893Smckusick 				nl = nlMiddle;
245553893Smckusick 				bits1 = bits;
245653893Smckusick 				Duff_shift_minus(nl, pdst, psrc, = ~);
245753893Smckusick 				if (startmask) {
245853893Smckusick 					bits1 = (bits >> rightShift);
245953893Smckusick 					if (startmask >> leftShift) {
246053893Smckusick 						bits1 |= *--psrc << leftShift;
246153893Smckusick 					}
246253893Smckusick 					--pdst;
246353893Smckusick 					*pdst = (*pdst & ~startmask |
246453893Smckusick 						 ~bits1 & startmask);
246553893Smckusick 				}
246653893Smckusick 			}
246753893Smckusick 		}
246853893Smckusick 	}
246953893Smckusick }
247053893Smckusick 
247153893Smckusick void
mfb_or_area16(addrSrc,addrDst,widthSrc,widthDst,sr,dp)247253893Smckusick mfb_or_area16(addrSrc, addrDst, widthSrc, widthDst, sr, dp)
247353893Smckusick u_short	*addrSrc;
247453893Smckusick u_short	*addrDst;
247553893Smckusick register int	widthSrc;
247653893Smckusick register int	widthDst;
247753893Smckusick lRectangle	*sr;	/* source rectangle */
247853893Smckusick lPoint		*dp;	/* destination point */
247953893Smckusick {
248053893Smckusick 	register u_short *psrcLine, *psrc;
248153893Smckusick 	register u_short *pdstLine, *pdst;
248253893Smckusick 	int w, h;
248353893Smckusick 	int xdir, ydir;
248453893Smckusick 	u_short startmask, endmask;
248553893Smckusick 	register int nlMiddle;
248653893Smckusick 	int xoffSrc, xoffDst;
248753893Smckusick 	register int leftShift, rightShift;
248853893Smckusick 	u_short bits;
248953893Smckusick 	u_short bits1;
249053893Smckusick 	register int nl;
249153893Smckusick 
249253893Smckusick 	if (sr->origin.y < dp->y) {
249353893Smckusick 		ydir = -1;
249453893Smckusick 		widthSrc = -widthSrc;
249553893Smckusick 		widthDst = -widthDst;
249653893Smckusick 	} else {
249753893Smckusick 		ydir = 1;
249853893Smckusick 	}
249953893Smckusick 
250053893Smckusick 	if (sr->origin.x < dp->x) {
250153893Smckusick 		xdir = -1;
250253893Smckusick 	} else {
250353893Smckusick 		xdir = 1;
250453893Smckusick 	}
250553893Smckusick 
250653893Smckusick 	w = sr->extent.x;
250753893Smckusick 	h = sr->extent.y;
250853893Smckusick 
250953893Smckusick 	if (ydir == -1) {
251053893Smckusick 		psrcLine = addrSrc + ((sr->origin.y + h - 1) * -widthSrc);
251153893Smckusick 		pdstLine = addrDst + ((dp->y + h - 1) * -widthDst);
251253893Smckusick 	} else {
251353893Smckusick 		psrcLine = addrSrc + (sr->origin.y * widthSrc);
251453893Smckusick 		pdstLine = addrDst + (dp->y * widthDst);
251553893Smckusick 	}
251653893Smckusick 	if ((dp->x & 0xf) +w <= 16) {
251753893Smckusick 		startmask = mfbpartmasks16[dp->x & 0xf][w & 0xf];
251853893Smckusick 		endmask = 0;
251953893Smckusick 		nlMiddle = 0;
252053893Smckusick 	} else {
252153893Smckusick 		startmask = mfbstarttab16[dp->x & 0xf];
252253893Smckusick 		endmask = mfbendtab16[(dp->x + w) & 0xf];
252353893Smckusick 		if (startmask) {
252453893Smckusick 			nlMiddle = (w - (16 - (dp->x & 0xf))) >> 4;
252553893Smckusick 		} else {
252653893Smckusick 			nlMiddle = w >> 4;
252753893Smckusick 		}
252853893Smckusick 	}
252953893Smckusick 
253053893Smckusick 	if (xdir == 1) {
253153893Smckusick 		xoffSrc = sr->origin.x & 0xf;
253253893Smckusick 		xoffDst = dp->x & 0xf;
253353893Smckusick 		pdstLine += (dp->x >> 4);
253453893Smckusick 		psrcLine += (sr->origin.x >> 4);
253553893Smckusick 		if (xoffSrc == xoffDst) {
253653893Smckusick 			while (h--) {
253753893Smckusick 				psrc = psrcLine;
253853893Smckusick 				pdst = pdstLine;
253953893Smckusick 				psrcLine += widthSrc;
254053893Smckusick 				pdstLine += widthDst;
254153893Smckusick 				if (startmask) {
254253893Smckusick 					*pdst++ |= *psrc++ & startmask;
254353893Smckusick 				}
254453893Smckusick 				nl = nlMiddle;
254553893Smckusick 				Duff_plus(nl, pdst, psrc, |=);
254653893Smckusick 				if (endmask) {
254753893Smckusick 					*pdst |= *psrc & endmask;
254853893Smckusick 				}
254953893Smckusick 			}
255053893Smckusick 		} else {
255153893Smckusick 			if (xoffSrc > xoffDst) {
255253893Smckusick 				leftShift = xoffSrc - xoffDst;
255353893Smckusick 				rightShift = 16 - leftShift;
255453893Smckusick 			} else {
255553893Smckusick 				rightShift = xoffDst - xoffSrc;
255653893Smckusick 				leftShift = 16 - rightShift;
255753893Smckusick 			}
255853893Smckusick 			while (h--) {
255953893Smckusick 				psrc = psrcLine;
256053893Smckusick 				pdst = pdstLine;
256153893Smckusick 				psrcLine += widthSrc;
256253893Smckusick 				pdstLine += widthDst;
256353893Smckusick 				bits = 0;
256453893Smckusick 				if (xoffSrc > xoffDst)
256553893Smckusick 					bits = *psrc++;
256653893Smckusick 				if (startmask) {
256753893Smckusick 					bits1 = bits << leftShift;
256853893Smckusick 					bits = *psrc++;
256953893Smckusick 					bits1 |= bits >> rightShift;
257053893Smckusick 					*pdst++ |= bits1 & startmask;
257153893Smckusick 				}
257253893Smckusick 				nl = nlMiddle;
257353893Smckusick 				bits1 = bits;
257453893Smckusick 				Duff_shift_plus(nl, pdst, psrc, |=);
257553893Smckusick 				if (endmask) {
257653893Smckusick 					bits1 = bits << leftShift;
257753893Smckusick 					if ((endmask << rightShift) & 0xffff) {
257853893Smckusick 						bits1 |= *psrc >> rightShift;
257953893Smckusick 					}
258053893Smckusick 					*pdst |= bits1 & endmask;
258153893Smckusick 				}
258253893Smckusick 			}
258353893Smckusick 		}
258453893Smckusick 	} else {
258553893Smckusick 		xoffSrc = (sr->origin.x + w - 1) & 0xf;
258653893Smckusick 		xoffDst = (dp->x + w - 1) & 0xf;
258753893Smckusick 		pdstLine += ((dp->x + w - 1) >> 4) + 1;
258853893Smckusick 		psrcLine += ((sr->origin.x + w - 1) >> 4) + 1;
258953893Smckusick 		if (xoffSrc == xoffDst) {
259053893Smckusick 			while (h--) {
259153893Smckusick 				psrc = psrcLine;
259253893Smckusick 				pdst = pdstLine;
259353893Smckusick 				psrcLine += widthSrc;
259453893Smckusick 				pdstLine += widthDst;
259553893Smckusick 				if (endmask) {
259653893Smckusick 					*--pdst |= *--psrc & endmask;
259753893Smckusick 				}
259853893Smckusick 				nl = nlMiddle;
259953893Smckusick 				Duff_minus(nl, pdst, psrc, |=);
260053893Smckusick 				if (startmask) {
260153893Smckusick 					*--pdst |= *--psrc & startmask;
260253893Smckusick 				}
260353893Smckusick 			}
260453893Smckusick 		} else {
260553893Smckusick 			if (xoffDst > xoffSrc) {
260653893Smckusick 				rightShift = xoffDst - xoffSrc;
260753893Smckusick 				leftShift = 16 - rightShift;
260853893Smckusick 			} else {
260953893Smckusick 				leftShift = xoffSrc - xoffDst;
261053893Smckusick 				rightShift = 16 - leftShift;
261153893Smckusick 			}
261253893Smckusick 			while (h--) {
261353893Smckusick 				psrc = psrcLine;
261453893Smckusick 				pdst = pdstLine;
261553893Smckusick 				psrcLine += widthSrc;
261653893Smckusick 				pdstLine += widthDst;
261753893Smckusick 				bits = 0;
261853893Smckusick 				if (xoffDst > xoffSrc)
261953893Smckusick 					bits = *--psrc;
262053893Smckusick 				if (endmask) {
262153893Smckusick 					bits1 = bits >> rightShift;
262253893Smckusick 					bits = *--psrc;
262353893Smckusick 					bits1 |= (bits << leftShift);
262453893Smckusick 					*--pdst |= bits1 & endmask;
262553893Smckusick 				}
262653893Smckusick 				nl = nlMiddle;
262753893Smckusick 				bits1 = bits;
262853893Smckusick 				Duff_shift_minus(nl, pdst, psrc, |=);
262953893Smckusick 				if (startmask) {
263053893Smckusick 					bits1 = (bits >> rightShift);
263153893Smckusick 					if (startmask >> leftShift) {
263253893Smckusick 						bits1 |= *--psrc << leftShift;
263353893Smckusick 					}
263453893Smckusick 					*--pdst |= bits1 & startmask;
263553893Smckusick 				}
263653893Smckusick 			}
263753893Smckusick 		}
263853893Smckusick 	}
263953893Smckusick }
264053893Smckusick 
264153893Smckusick void
mfb_xor_area16(addrSrc,addrDst,widthSrc,widthDst,sr,dp)264253893Smckusick mfb_xor_area16(addrSrc, addrDst, widthSrc, widthDst, sr, dp)
264353893Smckusick u_short	*addrSrc;
264453893Smckusick u_short	*addrDst;
264553893Smckusick int	widthSrc;
264653893Smckusick int	widthDst;
264753893Smckusick lRectangle	*sr;	/* source rectangle */
264853893Smckusick lPoint		*dp;	/* destination point */
264953893Smckusick {
265053893Smckusick 	register u_short *psrcLine, *psrc;
265153893Smckusick 	register u_short *pdstLine, *pdst;
265253893Smckusick 	int w, h;
265353893Smckusick 	int xdir, ydir;
265453893Smckusick 	u_short startmask, endmask;
265553893Smckusick 	register int nlMiddle;
265653893Smckusick 	int xoffSrc, xoffDst;
265753893Smckusick 	register int leftShift, rightShift;
265853893Smckusick 	u_short bits;
265953893Smckusick 	u_short bits1;
266053893Smckusick 	register int nl;
266153893Smckusick 
266253893Smckusick 	if (sr->origin.y < dp->y) {
266353893Smckusick 		ydir = -1;
266453893Smckusick 		widthSrc = -widthSrc;
266553893Smckusick 		widthDst = -widthDst;
266653893Smckusick 	} else {
266753893Smckusick 		ydir = 1;
266853893Smckusick 	}
266953893Smckusick 
267053893Smckusick 	if (sr->origin.x < dp->x) {
267153893Smckusick 		xdir = -1;
267253893Smckusick 	} else {
267353893Smckusick 		xdir = 1;
267453893Smckusick 	}
267553893Smckusick 
267653893Smckusick 	w = sr->extent.x;
267753893Smckusick 	h = sr->extent.y;
267853893Smckusick 
267953893Smckusick 	if (ydir == -1) {
268053893Smckusick 		psrcLine = addrSrc + ((sr->origin.y + h - 1) * -widthSrc);
268153893Smckusick 		pdstLine = addrDst + ((dp->y + h - 1) * -widthDst);
268253893Smckusick 	} else {
268353893Smckusick 		psrcLine = addrSrc + (sr->origin.y * widthSrc);
268453893Smckusick 		pdstLine = addrDst + (dp->y * widthDst);
268553893Smckusick 	}
268653893Smckusick 	if ((dp->x & 0xf) +w <= 16) {
268753893Smckusick 		startmask = mfbpartmasks16[dp->x & 0xf][w & 0xf];
268853893Smckusick 		endmask = 0;
268953893Smckusick 		nlMiddle = 0;
269053893Smckusick 	} else {
269153893Smckusick 		startmask = mfbstarttab16[dp->x & 0xf];
269253893Smckusick 		endmask = mfbendtab16[(dp->x + w) & 0xf];
269353893Smckusick 		if (startmask) {
269453893Smckusick 			nlMiddle = (w - (16 - (dp->x & 0xf))) >> 4;
269553893Smckusick 		} else {
269653893Smckusick 			nlMiddle = w >> 4;
269753893Smckusick 		}
269853893Smckusick 	}
269953893Smckusick 
270053893Smckusick 	if (xdir == 1) {
270153893Smckusick 		xoffSrc = sr->origin.x & 0xf;
270253893Smckusick 		xoffDst = dp->x & 0xf;
270353893Smckusick 		pdstLine += (dp->x >> 4);
270453893Smckusick 		psrcLine += (sr->origin.x >> 4);
270553893Smckusick 		if (xoffSrc == xoffDst) {
270653893Smckusick 			while (h--) {
270753893Smckusick 				psrc = psrcLine;
270853893Smckusick 				pdst = pdstLine;
270953893Smckusick 				psrcLine += widthSrc;
271053893Smckusick 				pdstLine += widthDst;
271153893Smckusick 				if (startmask) {
271253893Smckusick 					*pdst++ ^= *psrc++ & startmask;
271353893Smckusick 				}
271453893Smckusick 				nl = nlMiddle;
271553893Smckusick 				Duff_plus(nl, pdst, psrc, ^=);
271653893Smckusick 				if (endmask) {
271753893Smckusick 					*pdst ^= *psrc & endmask;
271853893Smckusick 				}
271953893Smckusick 			}
272053893Smckusick 		} else {
272153893Smckusick 			if (xoffSrc > xoffDst) {
272253893Smckusick 				leftShift = xoffSrc - xoffDst;
272353893Smckusick 				rightShift = 16 - leftShift;
272453893Smckusick 			} else {
272553893Smckusick 				rightShift = xoffDst - xoffSrc;
272653893Smckusick 				leftShift = 16 - rightShift;
272753893Smckusick 			}
272853893Smckusick 			while (h--) {
272953893Smckusick 				psrc = psrcLine;
273053893Smckusick 				pdst = pdstLine;
273153893Smckusick 				psrcLine += widthSrc;
273253893Smckusick 				pdstLine += widthDst;
273353893Smckusick 				bits = 0;
273453893Smckusick 				if (xoffSrc > xoffDst)
273553893Smckusick 					bits = *psrc++;
273653893Smckusick 				if (startmask) {
273753893Smckusick 					bits1 = bits << leftShift;
273853893Smckusick 					bits = *psrc++;
273953893Smckusick 					bits1 |= bits >> rightShift;
274053893Smckusick 					*pdst++ ^= bits1 & startmask;
274153893Smckusick 				}
274253893Smckusick 				nl = nlMiddle;
274353893Smckusick 				bits1 = bits;
274453893Smckusick 				Duff_shift_plus(nl, pdst, psrc, ^=);
274553893Smckusick 				if (endmask) {
274653893Smckusick 					bits1 = bits << leftShift;
274753893Smckusick 					if ((endmask << rightShift) & 0xffff) {
274853893Smckusick 						bits1 |= (*psrc >> rightShift);
274953893Smckusick 					}
275053893Smckusick 					*pdst ^= bits1 & endmask;
275153893Smckusick 				}
275253893Smckusick 			}
275353893Smckusick 		}
275453893Smckusick 	} else {
275553893Smckusick 		xoffSrc = (sr->origin.x + w - 1) & 0xf;
275653893Smckusick 		xoffDst = (dp->x + w - 1) & 0xf;
275753893Smckusick 		pdstLine += ((dp->x + w - 1) >> 4) + 1;
275853893Smckusick 		psrcLine += ((sr->origin.x + w - 1) >> 4) + 1;
275953893Smckusick 		if (xoffSrc == xoffDst) {
276053893Smckusick 			while (h--) {
276153893Smckusick 				psrc = psrcLine;
276253893Smckusick 				pdst = pdstLine;
276353893Smckusick 				psrcLine += widthSrc;
276453893Smckusick 				pdstLine += widthDst;
276553893Smckusick 				if (endmask) {
276653893Smckusick 					*--pdst ^= *--psrc & endmask;
276753893Smckusick 				}
276853893Smckusick 				nl = nlMiddle;
276953893Smckusick 				Duff_minus(nl, pdst, psrc, ^=);
277053893Smckusick 				if (startmask) {
277153893Smckusick 					*--pdst ^= *--psrc & startmask;
277253893Smckusick 				}
277353893Smckusick 			}
277453893Smckusick 		} else {
277553893Smckusick 			if (xoffDst > xoffSrc) {
277653893Smckusick 				rightShift = xoffDst - xoffSrc;
277753893Smckusick 				leftShift = 16 - rightShift;
277853893Smckusick 			} else {
277953893Smckusick 				leftShift = xoffSrc - xoffDst;
278053893Smckusick 				rightShift = 16 - leftShift;
278153893Smckusick 			}
278253893Smckusick 			while (h--) {
278353893Smckusick 				psrc = psrcLine;
278453893Smckusick 				pdst = pdstLine;
278553893Smckusick 				psrcLine += widthSrc;
278653893Smckusick 				pdstLine += widthDst;
278753893Smckusick 				bits = 0;
278853893Smckusick 				if (xoffDst > xoffSrc)
278953893Smckusick 					bits = *--psrc;
279053893Smckusick 				if (endmask) {
279153893Smckusick 					bits1 = bits >> rightShift;
279253893Smckusick 					bits = *--psrc;
279353893Smckusick 					bits1 |= (bits << leftShift);
279453893Smckusick 					*--pdst ^= bits1 & endmask;
279553893Smckusick 				}
279653893Smckusick 				nl = nlMiddle;
279753893Smckusick 				bits1 = bits;
279853893Smckusick 				Duff_shift_minus(nl, pdst, psrc, ^=);
279953893Smckusick 				if (startmask) {
280053893Smckusick 					bits1 = (bits >> rightShift);
280153893Smckusick 					if (startmask >> leftShift) {
280253893Smckusick 						bits1 |= (*--psrc << leftShift);
280353893Smckusick 					}
280453893Smckusick 					*--pdst ^= bits1 & startmask;
280553893Smckusick 				}
280653893Smckusick 			}
280753893Smckusick 		}
280853893Smckusick 	}
280953893Smckusick }
281053893Smckusick 
281153893Smckusick void
mfb_general_area16(func,addrSrc,addrDst,widthSrc,widthDst,sr,dp)281253893Smckusick mfb_general_area16(func, addrSrc, addrDst, widthSrc, widthDst, sr, dp)
281353893Smckusick int		func;
281453893Smckusick u_short	*addrSrc;
281553893Smckusick u_short	*addrDst;
281653893Smckusick int	widthSrc;
281753893Smckusick int	widthDst;
281853893Smckusick lRectangle	*sr;	/* source rectangle */
281953893Smckusick lPoint		*dp;	/* destination point */
282053893Smckusick {
282153893Smckusick 	register u_short *psrcLine, *psrc;
282253893Smckusick 	register u_short *pdstLine, *pdst;
282353893Smckusick 	register int leftShift, rightShift;
282453893Smckusick 	u_short bits;
282553893Smckusick 	u_short bits1;
282653893Smckusick 	register int nl;
282753893Smckusick 	u_short _ca1, _cx1, _ca2, _cx2;
282853893Smckusick 	u_short startmask, endmask;
282953893Smckusick 	int w, h;
283053893Smckusick 	int xdir, ydir;
283153893Smckusick 	register int nlMiddle;
283253893Smckusick 	int xoffSrc, xoffDst;
283353893Smckusick 
283453893Smckusick 	_ca1 = mergeRopBits[func].ca1;
283553893Smckusick 	_cx1 = mergeRopBits[func].cx1;
283653893Smckusick 	_ca2 = mergeRopBits[func].ca2;
283753893Smckusick 	_cx2 = mergeRopBits[func].cx2;
283853893Smckusick 
283953893Smckusick 	if (sr->origin.y < dp->y) {
284053893Smckusick 		ydir = -1;
284153893Smckusick 		widthSrc = -widthSrc;
284253893Smckusick 		widthDst = -widthDst;
284353893Smckusick 	} else {
284453893Smckusick 		ydir = 1;
284553893Smckusick 	}
284653893Smckusick 
284753893Smckusick 	if (sr->origin.x < dp->x) {
284853893Smckusick 		xdir = -1;
284953893Smckusick 	} else {
285053893Smckusick 		xdir = 1;
285153893Smckusick 	}
285253893Smckusick 
285353893Smckusick 	w = sr->extent.x;
285453893Smckusick 	h = sr->extent.y;
285553893Smckusick 
285653893Smckusick 	if (ydir == -1) {
285753893Smckusick 		psrcLine = addrSrc + ((sr->origin.y + h - 1) * -widthSrc);
285853893Smckusick 		pdstLine = addrDst + ((dp->y + h - 1) * -widthDst);
285953893Smckusick 	} else {
286053893Smckusick 		psrcLine = addrSrc + (sr->origin.y * widthSrc);
286153893Smckusick 		pdstLine = addrDst + (dp->y * widthDst);
286253893Smckusick 	}
286353893Smckusick 	if ((dp->x & 0xf) +w <= 16) {
286453893Smckusick 		startmask = mfbpartmasks16[dp->x & 0xf][w & 0xf];
286553893Smckusick 		endmask = 0;
286653893Smckusick 		nlMiddle = 0;
286753893Smckusick 	} else {
286853893Smckusick 		startmask = mfbstarttab16[dp->x & 0xf];
286953893Smckusick 		endmask = mfbendtab16[(dp->x + w) & 0xf];
287053893Smckusick 		if (startmask) {
287153893Smckusick 			nlMiddle = (w - (16 - (dp->x & 0xf))) >> 4;
287253893Smckusick 		} else {
287353893Smckusick 			nlMiddle = w >> 4;
287453893Smckusick 		}
287553893Smckusick 	}
287653893Smckusick 
287753893Smckusick 	if (xdir == 1) {
287853893Smckusick 		xoffSrc = sr->origin.x & 0xf;
287953893Smckusick 		xoffDst = dp->x & 0xf;
288053893Smckusick 		pdstLine += (dp->x >> 4);
288153893Smckusick 		psrcLine += (sr->origin.x >> 4);
288253893Smckusick 		if (xoffSrc == xoffDst) {
288353893Smckusick 			while (h--) {
288453893Smckusick 				psrc = psrcLine;
288553893Smckusick 				pdst = pdstLine;
288653893Smckusick 				psrcLine += widthSrc;
288753893Smckusick 				pdstLine += widthDst;
288853893Smckusick 				if (startmask) {
288953893Smckusick 					*pdst = DoMergeRopMask(*psrc, *pdst,
289053893Smckusick 							       startmask);
289153893Smckusick 					psrc++;
289253893Smckusick 					pdst++;
289353893Smckusick 				}
289453893Smckusick 				nl = nlMiddle;
289553893Smckusick 				psrc += nl & 7;
289653893Smckusick 				pdst += nl & 7;
289753893Smckusick 				switch (nl & 7) {
289853893Smckusick 				case 7:
289953893Smckusick 					pdst[-7] = DoMergeRop(psrc[-7], pdst[-7]);
290053893Smckusick 				case 6:
290153893Smckusick 					pdst[-6] = DoMergeRop(psrc[-6], pdst[-6]);
290253893Smckusick 				case 5:
290353893Smckusick 					pdst[-5] = DoMergeRop(psrc[-5], pdst[-5]);
290453893Smckusick 				case 4:
290553893Smckusick 					pdst[-4] = DoMergeRop(psrc[-4], pdst[-4]);
290653893Smckusick 				case 3:
290753893Smckusick 					pdst[-3] = DoMergeRop(psrc[-3], pdst[-3]);
290853893Smckusick 				case 2:
290953893Smckusick 					pdst[-2] = DoMergeRop(psrc[-2], pdst[-2]);
291053893Smckusick 				case 1:
291153893Smckusick 					pdst[-1] = DoMergeRop(psrc[-1], pdst[-1]);
291253893Smckusick 				}
291353893Smckusick 				while ((nl -= 8) >= 0) {
291453893Smckusick 					pdst += 8;
291553893Smckusick 					psrc += 8;
291653893Smckusick 					pdst[-8] = DoMergeRop(psrc[-8], pdst[-8]);
291753893Smckusick 					pdst[-7] = DoMergeRop(psrc[-7], pdst[-7]);
291853893Smckusick 					pdst[-6] = DoMergeRop(psrc[-6], pdst[-6]);
291953893Smckusick 					pdst[-5] = DoMergeRop(psrc[-5], pdst[-5]);
292053893Smckusick 					pdst[-4] = DoMergeRop(psrc[-4], pdst[-4]);
292153893Smckusick 					pdst[-3] = DoMergeRop(psrc[-3], pdst[-3]);
292253893Smckusick 					pdst[-2] = DoMergeRop(psrc[-2], pdst[-2]);
292353893Smckusick 					pdst[-1] = DoMergeRop(psrc[-1], pdst[-1]);
292453893Smckusick 				}
292553893Smckusick 				if (endmask) {
292653893Smckusick 					*pdst = DoMergeRopMask(*psrc, *pdst,
292753893Smckusick 							       endmask);
292853893Smckusick 				}
292953893Smckusick 			}
293053893Smckusick 		} else {
293153893Smckusick 			if (xoffSrc > xoffDst) {
293253893Smckusick 				leftShift = xoffSrc - xoffDst;
293353893Smckusick 				rightShift = 16 - leftShift;
293453893Smckusick 			} else {
293553893Smckusick 				rightShift = xoffDst - xoffSrc;
293653893Smckusick 				leftShift = 16 - rightShift;
293753893Smckusick 			}
293853893Smckusick 			while (h--) {
293953893Smckusick 				psrc = psrcLine;
294053893Smckusick 				pdst = pdstLine;
294153893Smckusick 				psrcLine += widthSrc;
294253893Smckusick 				pdstLine += widthDst;
294353893Smckusick 				bits = 0;
294453893Smckusick 				if (xoffSrc > xoffDst)
294553893Smckusick 					bits = *psrc++;
294653893Smckusick 				if (startmask) {
294753893Smckusick 					bits1 = bits << leftShift;
294853893Smckusick 					bits = *psrc++;
294953893Smckusick 					bits1 |= bits >> rightShift;
295053893Smckusick 					*pdst = DoMergeRopMask(bits1, *pdst,
295153893Smckusick 							       startmask);
295253893Smckusick 					pdst++;
295353893Smckusick 				}
295453893Smckusick 				nl = nlMiddle;
295553893Smckusick 				bits1 = bits;
295653893Smckusick 				psrc += nl & 7;
295753893Smckusick 				pdst += nl & 7;
295853893Smckusick 				switch (nl & 7) {
295953893Smckusick 				case 7:
296053893Smckusick 					bits = psrc[-7];
296153893Smckusick 					pdst[-7] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-7]);
296253893Smckusick 				case 6:
296353893Smckusick 					bits1 = psrc[-6];
296453893Smckusick 					pdst[-6] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-6]);
296553893Smckusick 				case 5:
296653893Smckusick 					bits = psrc[-5];
296753893Smckusick 					pdst[-5] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-5]);
296853893Smckusick 				case 4:
296953893Smckusick 					bits1 = psrc[-4];
297053893Smckusick 					pdst[-4] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-4]);
297153893Smckusick 				case 3:
297253893Smckusick 					bits = psrc[-3];
297353893Smckusick 					pdst[-3] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-3]);
297453893Smckusick 				case 2:
297553893Smckusick 					bits1 = psrc[-2];
297653893Smckusick 					pdst[-2] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-2]);
297753893Smckusick 				case 1:
297853893Smckusick 					bits = psrc[-1];
297953893Smckusick 					pdst[-1] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-1]);
298053893Smckusick 				}
298153893Smckusick 				while ((nl -= 8) >= 0) {
298253893Smckusick 					pdst += 8;
298353893Smckusick 					psrc += 8;
298453893Smckusick 					bits1 = psrc[-8];
298553893Smckusick 					pdst[-8] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-8]);
298653893Smckusick 					bits = psrc[-7];
298753893Smckusick 					pdst[-7] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-7]);
298853893Smckusick 					bits1 = psrc[-6];
298953893Smckusick 					pdst[-6] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-6]);
299053893Smckusick 					bits = psrc[-5];
299153893Smckusick 					pdst[-5] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-5]);
299253893Smckusick 					bits1 = psrc[-4];
299353893Smckusick 					pdst[-4] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-4]);
299453893Smckusick 					bits = psrc[-3];
299553893Smckusick 					pdst[-3] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-3]);
299653893Smckusick 					bits1 = psrc[-2];
299753893Smckusick 					pdst[-2] = DoMergeRop(((bits << leftShift) | (bits1 >> rightShift)), pdst[-2]);
299853893Smckusick 					bits = psrc[-1];
299953893Smckusick 					pdst[-1] = DoMergeRop(((bits1 << leftShift) | (bits >> rightShift)), pdst[-1]);
300053893Smckusick 				}
300153893Smckusick 				if (endmask) {
300253893Smckusick 					bits1 = bits << leftShift;
300353893Smckusick 					if ((endmask << rightShift) & 0xffff) {
300453893Smckusick 						bits = *psrc;
300553893Smckusick 						bits1 |= (bits >> rightShift);
300653893Smckusick 					}
300753893Smckusick 					*pdst = DoMergeRopMask(bits1, *pdst,
300853893Smckusick 							       endmask);
300953893Smckusick 				}
301053893Smckusick 			}
301153893Smckusick 		}
301253893Smckusick 	} else {
301353893Smckusick 		xoffSrc = (sr->origin.x + w - 1) & 0xf;
301453893Smckusick 		xoffDst = (dp->x + w - 1) & 0xf;
301553893Smckusick 		pdstLine += ((dp->x + w - 1) >> 4) + 1;
301653893Smckusick 		psrcLine += ((sr->origin.x + w - 1) >> 4) + 1;
301753893Smckusick 		if (xoffSrc == xoffDst) {
301853893Smckusick 			while (h--) {
301953893Smckusick 				psrc = psrcLine;
302053893Smckusick 				pdst = pdstLine;
302153893Smckusick 				psrcLine += widthSrc;
302253893Smckusick 				pdstLine += widthDst;
302353893Smckusick 				if (endmask) {
302453893Smckusick 					pdst--;
302553893Smckusick 					psrc--;
302653893Smckusick 					*pdst = DoMergeRopMask(*psrc, *pdst,
302753893Smckusick 							       endmask);
302853893Smckusick 				}
302953893Smckusick 				nl = nlMiddle;
303053893Smckusick 				psrc -= nl & 7;
303153893Smckusick 				pdst -= nl & 7;
303253893Smckusick 				switch (nl & 7) {
303353893Smckusick 				case 7:
303453893Smckusick 					pdst[7-1] = DoMergeRop(psrc[7-1], pdst[7-1]);
303553893Smckusick 				case 6:
303653893Smckusick 					pdst[6-1] = DoMergeRop(psrc[6-1], pdst[6-1]);
303753893Smckusick 				case 5:
303853893Smckusick 					pdst[5-1] = DoMergeRop(psrc[5-1], pdst[5-1]);
303953893Smckusick 				case 4:
304053893Smckusick 					pdst[4-1] = DoMergeRop(psrc[4-1], pdst[4-1]);
304153893Smckusick 				case 3:
304253893Smckusick 					pdst[3-1] = DoMergeRop(psrc[3-1], pdst[3-1]);
304353893Smckusick 				case 2:
304453893Smckusick 					pdst[2-1] = DoMergeRop(psrc[2-1], pdst[2-1]);
304553893Smckusick 				case 1:
304653893Smckusick 					pdst[1-1] = DoMergeRop(psrc[1-1], pdst[1-1]);
304753893Smckusick 				}
304853893Smckusick 				while ((nl -= 8) >= 0) {
304953893Smckusick 					pdst -= 8;
305053893Smckusick 					psrc -= 8;
305153893Smckusick 					pdst[8-1] = DoMergeRop(psrc[8-1], pdst[8-1]);
305253893Smckusick 					pdst[7-1] = DoMergeRop(psrc[7-1], pdst[7-1]);
305353893Smckusick 					pdst[6-1] = DoMergeRop(psrc[6-1], pdst[6-1]);
305453893Smckusick 					pdst[5-1] = DoMergeRop(psrc[5-1], pdst[5-1]);
305553893Smckusick 					pdst[4-1] = DoMergeRop(psrc[4-1], pdst[4-1]);
305653893Smckusick 					pdst[3-1] = DoMergeRop(psrc[3-1], pdst[3-1]);
305753893Smckusick 					pdst[2-1] = DoMergeRop(psrc[2-1], pdst[2-1]);
305853893Smckusick 					pdst[1-1] = DoMergeRop(psrc[1-1], pdst[1-1]);
305953893Smckusick 				}
306053893Smckusick 				if (startmask) {
306153893Smckusick 					--pdst;
306253893Smckusick 					--psrc;
306353893Smckusick 					*pdst = DoMergeRopMask(*psrc, *pdst,
306453893Smckusick 							       startmask);
306553893Smckusick 				}
306653893Smckusick 			}
306753893Smckusick 		} else {
306853893Smckusick 			if (xoffDst > xoffSrc) {
306953893Smckusick 				rightShift = xoffDst - xoffSrc;
307053893Smckusick 				leftShift = 16 - rightShift;
307153893Smckusick 			} else {
307253893Smckusick 				leftShift = xoffSrc - xoffDst;
307353893Smckusick 				rightShift = 16 - leftShift;
307453893Smckusick 			}
307553893Smckusick 			while (h--) {
307653893Smckusick 				psrc = psrcLine;
307753893Smckusick 				pdst = pdstLine;
307853893Smckusick 				psrcLine += widthSrc;
307953893Smckusick 				pdstLine += widthDst;
308053893Smckusick 				bits = 0;
308153893Smckusick 				if (xoffDst > xoffSrc)
308253893Smckusick 					bits = *--psrc;
308353893Smckusick 				if (endmask) {
308453893Smckusick 					bits1 = bits >> rightShift;
308553893Smckusick 					bits = *--psrc;
308653893Smckusick 					bits1 |= (bits << leftShift);
308753893Smckusick 					pdst--;
308853893Smckusick 					*pdst = DoMergeRopMask(bits1, *pdst,
308953893Smckusick 							       endmask);
309053893Smckusick 				}
309153893Smckusick 				nl = nlMiddle;
309253893Smckusick 				bits1 = bits;
309353893Smckusick 				psrc -= nl & 7;
309453893Smckusick 				pdst -= nl & 7;
309553893Smckusick 				switch (nl & 7) {
309653893Smckusick 				case 7:
309753893Smckusick 					bits = psrc[7-1];
309853893Smckusick 					pdst[7-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[7-1]);
309953893Smckusick 				case 6:
310053893Smckusick 					bits1 = psrc[6-1];
310153893Smckusick 					pdst[6-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[6-1]);
310253893Smckusick 				case 5:
310353893Smckusick 					bits = psrc[5-1];
310453893Smckusick 					pdst[5-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[5-1]);
310553893Smckusick 				case 4:
310653893Smckusick 					bits1 = psrc[4-1];
310753893Smckusick 					pdst[4-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[4-1]);
310853893Smckusick 				case 3:
310953893Smckusick 					bits = psrc[3-1];
311053893Smckusick 					pdst[3-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[3-1]);
311153893Smckusick 				case 2:
311253893Smckusick 					bits1 = psrc[2-1];
311353893Smckusick 					pdst[2-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[2-1]);
311453893Smckusick 				case 1:
311553893Smckusick 					bits = psrc[1-1];
311653893Smckusick 					pdst[1-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[1-1]);
311753893Smckusick 				}
311853893Smckusick 				while ((nl -= 8) >= 0) {
311953893Smckusick 					pdst -= 8;
312053893Smckusick 					psrc -= 8;
312153893Smckusick 					bits1 = psrc[8-1];
312253893Smckusick 					pdst[8-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[8-1]);
312353893Smckusick 					bits = psrc[7-1];
312453893Smckusick 					pdst[7-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[7-1]);
312553893Smckusick 					bits1 = psrc[6-1];
312653893Smckusick 					pdst[6-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[6-1]);
312753893Smckusick 					bits = psrc[5-1];
312853893Smckusick 					pdst[5-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[5-1]);
312953893Smckusick 					bits1 = psrc[4-1];
313053893Smckusick 					pdst[4-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[4-1]);
313153893Smckusick 					bits = psrc[3-1];
313253893Smckusick 					pdst[3-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[3-1]);
313353893Smckusick 					bits1 = psrc[2-1];
313453893Smckusick 					pdst[2-1] = DoMergeRop(((bits >> rightShift) | (bits1 << leftShift)), pdst[2-1]);
313553893Smckusick 					bits = psrc[1-1];
313653893Smckusick 					pdst[1-1] = DoMergeRop(((bits1 >> rightShift) | (bits << leftShift)), pdst[1-1]);
313753893Smckusick 				}
313853893Smckusick 				if (startmask) {
313953893Smckusick 					bits1 = (bits >> rightShift);
314053893Smckusick 					if (startmask >> leftShift) {
314153893Smckusick 						bits = *--psrc;
314253893Smckusick 						bits1 |= (bits << leftShift);
314353893Smckusick 					}
314453893Smckusick 					--pdst;
314553893Smckusick 					*pdst = DoMergeRopMask(bits1, *pdst,
314653893Smckusick 							       startmask);
314753893Smckusick 				}
314853893Smckusick 			}
314953893Smckusick 		}
315053893Smckusick 	}
315153893Smckusick }
315253893Smckusick 
315353893Smckusick void
mfb_clr_area16(x,y,w,h,addr,nlwidth)315453893Smckusick mfb_clr_area16(x, y, w, h, addr, nlwidth)
315553893Smckusick int x;
315653893Smckusick int y;
315753893Smckusick int w;
315853893Smckusick register int h;
315953893Smckusick register u_short *addr;
316053893Smckusick int nlwidth;
316153893Smckusick {
316253893Smckusick 	register u_short startmask;
316353893Smckusick 	u_short endmask;
316453893Smckusick 	register int nlw, nlwExtra;
316553893Smckusick 	int nlwMiddle;
316653893Smckusick 
316753893Smckusick 	addr += (y * nlwidth + (x >> 4));
316853893Smckusick 
316953893Smckusick 	if (((x & 0xf) + w) < 16) {
317053893Smckusick 		startmask = mfbpartmasks16[x & 0xf][w & 0xf];
317153893Smckusick 		nlwExtra = nlwidth;
317253893Smckusick 		Duff(h, *addr &= ~startmask; addr += nlwExtra)
317353893Smckusick 	} else {
317453893Smckusick 		startmask = mfbstarttab16[x & 0xf];
317553893Smckusick 		endmask = mfbendtab16[(x + w) & 0xf];
317653893Smckusick 		if (startmask) {
317753893Smckusick 			nlwMiddle = (w - (16 - (x & 0xf))) >> 4;
317853893Smckusick 		} else {
317953893Smckusick 			nlwMiddle = w >> 4;
318053893Smckusick 		}
318153893Smckusick 		nlwExtra = nlwidth - nlwMiddle;
318253893Smckusick 		if (startmask && endmask) {
318353893Smckusick 			startmask ^= ~0;
318453893Smckusick 			endmask ^= ~0;
318553893Smckusick 			nlwExtra -= 1;
318653893Smckusick 			while (h--) {
318753893Smckusick 				nlw = nlwMiddle;
318853893Smckusick 				*addr++ &= startmask;
318953893Smckusick 				Duff_single(nlw, addr, = 0)
319053893Smckusick 				*addr &= endmask;
319153893Smckusick 				addr += nlwExtra;
319253893Smckusick 			}
319353893Smckusick 		} else if (startmask && !endmask) {
319453893Smckusick 			startmask ^= ~0;
319553893Smckusick 			nlwExtra -= 1;
319653893Smckusick 			while (h--) {
319753893Smckusick 				nlw = nlwMiddle;
319853893Smckusick 				*addr++ &= startmask;
319953893Smckusick 				Duff_single(nlw, addr, = 0)
320053893Smckusick 				addr += nlwExtra;
320153893Smckusick 			}
320253893Smckusick 		} else if (!startmask && endmask) {
320353893Smckusick 			endmask ^= ~0;
320453893Smckusick 			while (h--) {
320553893Smckusick 				nlw = nlwMiddle;
320653893Smckusick 				Duff_single(nlw, addr, = 0)
320753893Smckusick 				*addr &= endmask;
320853893Smckusick 				addr += nlwExtra;
320953893Smckusick 			}
321053893Smckusick 		} else {
321153893Smckusick 			while (h--) {
321253893Smckusick 				nlw = nlwMiddle;
321353893Smckusick 				Duff_single(nlw, addr, = 0)
321453893Smckusick 				addr += nlwExtra;
321553893Smckusick 			}
321653893Smckusick 		}
321753893Smckusick 	}
321853893Smckusick }
321953893Smckusick 
322053893Smckusick void
mfb_inv_area16(x,y,w,h,addr,nlwidth)322153893Smckusick mfb_inv_area16(x, y, w, h, addr, nlwidth)
322253893Smckusick int x;
322353893Smckusick int y;
322453893Smckusick int w;
322553893Smckusick register int h;
322653893Smckusick register u_short *addr;
322753893Smckusick int nlwidth;
322853893Smckusick {
322953893Smckusick 	register u_short startmask;
323053893Smckusick 	u_short endmask;
323153893Smckusick 	register int nlw, nlwExtra;
323253893Smckusick 	int nlwMiddle;
323353893Smckusick 
323453893Smckusick 	addr += (y * nlwidth + (x >> 4));
323553893Smckusick 
323653893Smckusick 	if (((x & 0xf) + w) < 16) {
323753893Smckusick 		startmask = mfbpartmasks16[x & 0xf][w & 0xf];
323853893Smckusick 		nlwExtra = nlwidth;
323953893Smckusick 		Duff(h, *addr ^= startmask; addr += nlwExtra)
324053893Smckusick 	} else {
324153893Smckusick 		startmask = mfbstarttab16[x & 0xf];
324253893Smckusick 		endmask = mfbendtab16[(x + w) & 0xf];
324353893Smckusick 		if (startmask) {
324453893Smckusick 			nlwMiddle = (w - (16 - (x & 0xf))) >> 4;
324553893Smckusick 		} else {
324653893Smckusick 			nlwMiddle = w >> 4;
324753893Smckusick 		}
324853893Smckusick 		nlwExtra = nlwidth - nlwMiddle;
324953893Smckusick 		if (startmask && endmask) {
325053893Smckusick 			nlwExtra -= 1;
325153893Smckusick 			while (h--) {
325253893Smckusick 				nlw = nlwMiddle;
325353893Smckusick 				*addr++ ^= startmask;
325453893Smckusick 				Duff_single(nlw, addr, ^= ~0)
325553893Smckusick 				*addr ^= endmask;
325653893Smckusick 				addr += nlwExtra;
325753893Smckusick 			}
325853893Smckusick 		} else if (startmask && !endmask) {
325953893Smckusick 			nlwExtra -= 1;
326053893Smckusick 			while (h--) {
326153893Smckusick 				nlw = nlwMiddle;
326253893Smckusick 				*addr++ ^= startmask;
326353893Smckusick 				Duff_single(nlw, addr, ^= ~0)
326453893Smckusick 				addr += nlwExtra;
326553893Smckusick 			}
326653893Smckusick 		} else if (!startmask && endmask) {
326753893Smckusick 			while (h--) {
326853893Smckusick 				nlw = nlwMiddle;
326953893Smckusick 				Duff_single(nlw, addr, ^= ~0)
327053893Smckusick 				*addr ^= endmask;
327153893Smckusick 				addr += nlwExtra;
327253893Smckusick 			}
327353893Smckusick 		} else {
327453893Smckusick 			while (h--) {
327553893Smckusick 				nlw = nlwMiddle;
327653893Smckusick 				Duff_single(nlw, addr, ^= ~0)
327753893Smckusick 				addr += nlwExtra;
327853893Smckusick 			}
327953893Smckusick 		}
328053893Smckusick 	}
328153893Smckusick }
328253893Smckusick 
328353893Smckusick void
mfb_set_area16(x,y,w,h,addr,nlwidth)328453893Smckusick mfb_set_area16(x, y, w, h, addr, nlwidth)
328553893Smckusick int x;
328653893Smckusick int y;
328753893Smckusick int w;
328853893Smckusick register int h;
328953893Smckusick register u_short *addr;
329053893Smckusick int nlwidth;
329153893Smckusick {
329253893Smckusick 	register u_short startmask;
329353893Smckusick 	u_short endmask;
329453893Smckusick 	register int nlw, nlwExtra;
329553893Smckusick 	int nlwMiddle;
329653893Smckusick 
329753893Smckusick 	addr += (y * nlwidth + (x >> 4));
329853893Smckusick 
329953893Smckusick 	if (((x & 0xf) + w) < 16) {
330053893Smckusick 		startmask = mfbpartmasks16[x & 0xf][w & 0xf];
330153893Smckusick 		nlwExtra = nlwidth;
330253893Smckusick 		Duff(h, *addr |= startmask; addr += nlwExtra)
330353893Smckusick 	} else {
330453893Smckusick 		startmask = mfbstarttab16[x & 0xf];
330553893Smckusick 		endmask = mfbendtab16[(x + w) & 0xf];
330653893Smckusick 		if (startmask) {
330753893Smckusick 			nlwMiddle = (w - (16 - (x & 0xf))) >> 4;
330853893Smckusick 		} else {
330953893Smckusick 			nlwMiddle = w >> 4;
331053893Smckusick 		}
331153893Smckusick 		nlwExtra = nlwidth - nlwMiddle;
331253893Smckusick 		if (startmask && endmask) {
331353893Smckusick 			nlwExtra -= 1;
331453893Smckusick 			while (h--) {
331553893Smckusick 				nlw = nlwMiddle;
331653893Smckusick 				*addr++ |= startmask;
331753893Smckusick #ifdef mc68020
331853893Smckusick 				asm(" move.w #-1,d3");
331953893Smckusick 				Duff(nlw, asm(" move.w d3,(a5)+"))
332053893Smckusick #else /* mc68020 */
332153893Smckusick 				Duff_single(nlw, addr, = ~0)
332253893Smckusick #endif /* mc68020 */
332353893Smckusick 				*addr |= endmask;
332453893Smckusick 				addr += nlwExtra;
332553893Smckusick 			}
332653893Smckusick 		} else if (startmask && !endmask) {
332753893Smckusick 			nlwExtra -= 1;
332853893Smckusick 			while (h--) {
332953893Smckusick 				nlw = nlwMiddle;
333053893Smckusick 				*addr++ |= startmask;
333153893Smckusick #ifdef mc68020
333253893Smckusick 				asm(" move.w #-1,d3");
333353893Smckusick 				Duff(nlw, asm(" move.w d3,(a5)+"));
333453893Smckusick #else /* mc68020 */
333553893Smckusick 				Duff_single(nlw, addr, = ~0)
333653893Smckusick #endif /* mc68020 */
333753893Smckusick 				addr += nlwExtra;
333853893Smckusick 			}
333953893Smckusick 		} else if (!startmask && endmask) {
334053893Smckusick 			while (h--) {
334153893Smckusick 				nlw = nlwMiddle;
334253893Smckusick #ifdef mc68020
334353893Smckusick 				asm(" move.w #-1,d3");
334453893Smckusick 				Duff(nlw, asm(" move.w d3,(a5)+"));
334553893Smckusick #else /* mc68020 */
334653893Smckusick 				Duff_single(nlw, addr, = ~0)
334753893Smckusick #endif /* mc68020 */
334853893Smckusick 				*addr |= endmask;
334953893Smckusick 				addr += nlwExtra;
335053893Smckusick 			}
335153893Smckusick 		} else {
335253893Smckusick 			while (h--) {
335353893Smckusick 				nlw = nlwMiddle;
335453893Smckusick #ifdef mc68020
335553893Smckusick 				asm(" move.w #-1,d3");
335653893Smckusick 				Duff(nlw, asm(" move.w d3,(a5)+"));
335753893Smckusick #else /* mc68020 */
335853893Smckusick 				Duff_single(nlw, addr, = ~0)
335953893Smckusick #endif /* mc68020 */
336053893Smckusick 				addr += nlwExtra;
336153893Smckusick 			}
336253893Smckusick 		}
336353893Smckusick 	}
336453893Smckusick }
336553893Smckusick 
336653893Smckusick void
mfb_clrvvector32(addr,nlwidth,x,len,lpf)336753893Smckusick mfb_clrvvector32(addr, nlwidth, x, len, lpf)
336853893Smckusick register u_int *addr;
336953893Smckusick register int nlwidth;
337053893Smckusick register int x;
337153893Smckusick register int len;
337253893Smckusick {
337353893Smckusick 	register u_int bitmask;
337453893Smckusick 
337553893Smckusick 	if (len < 0) {
337653893Smckusick 		nlwidth = -nlwidth;
337753893Smckusick 		len = -len;
337853893Smckusick 	}
337953893Smckusick 	if (lpf)
338053893Smckusick 		len++;
338153893Smckusick 	addr += (x >> 5);
338253893Smckusick 
338353893Smckusick 	bitmask = mfbrmask32[x & 0x1f];
338453893Smckusick 
338553893Smckusick 	Duff(len, *addr &= bitmask; addr += nlwidth)
338653893Smckusick }
338753893Smckusick 
338853893Smckusick void
mfb_clrhvector32(addr,x,len,lpf)338953893Smckusick mfb_clrhvector32(addr, x, len, lpf)
339053893Smckusick register u_int *addr;
339153893Smckusick int x;
339253893Smckusick int len;
339353893Smckusick int lpf;
339453893Smckusick {
339553893Smckusick 	register u_int	startmask;
339653893Smckusick 	register u_int 	endmask;
339753893Smckusick 	register int	nl, off;
339853893Smckusick 
339953893Smckusick 	if (len < 0) {
340053893Smckusick 		x += len;
340153893Smckusick 		len = -len;
340253893Smckusick 		if (lpf) {
340353893Smckusick 			len++;
340453893Smckusick 		} else {
340553893Smckusick 			x++;
340653893Smckusick 		}
340753893Smckusick 	} else {
340853893Smckusick 		if (lpf) {
340953893Smckusick 			len++;
341053893Smckusick 		}
341153893Smckusick 	}
341253893Smckusick 	addr += (x >> 5);
341353893Smckusick 
341453893Smckusick 	off = x & 0x1f;
341553893Smckusick 	if (off + len < 32) {
341653893Smckusick 		*addr &= ~mfbpartmasks32[off][len & 0x1f];
341753893Smckusick 	} else {
341853893Smckusick 		startmask = mfbstarttab32[off];
341953893Smckusick 		endmask = mfbendtab32[(x + len) & 0x1f];
342053893Smckusick 		if (startmask) {
342153893Smckusick 			nl = (len - (32 - off)) >> 5;
342253893Smckusick 			*addr++ &= ~startmask;
342353893Smckusick 		} else
342453893Smckusick 			nl = len >> 5;
342553893Smckusick 		Duff_single(nl, addr, = 0);
342653893Smckusick 		if (endmask)
342753893Smckusick 			*addr &= ~endmask;
342853893Smckusick 	}
342953893Smckusick }
343053893Smckusick 
343153893Smckusick void
mfb_clrvector32(fb,addr,ddy,p0,p1,lpf)343253893Smckusick mfb_clrvector32(fb, addr, ddy, p0, p1, lpf)
343353893Smckusick struct fbdev	*fb;
343453893Smckusick register u_int *addr;
343553893Smckusick register int ddy;
343653893Smckusick register lPoint *p0, *p1;
343753893Smckusick int lpf;		/* if 0, don't draw last point */
343853893Smckusick {
343953893Smckusick 	register int i;
344053893Smckusick 	register int lim;
344153893Smckusick #ifdef mc68020
344253893Smckusick 	register int x = p0->x;
344353893Smckusick #else /* mc68020 */
344453893Smckusick 	register u_int bit, leftbit, rightbit;
344553893Smckusick #endif /* mc68020 */
344653893Smckusick 	int ddx;
344753893Smckusick 	int dx = p1->x - p0->x;
344853893Smckusick 	int dy = p1->y - p0->y;
344953893Smckusick 	int s, d, c;
345053893Smckusick 
345153893Smckusick 	addr += (p0->y * ddy);
345253893Smckusick 
345353893Smckusick 	if (dx == 0) {
345453893Smckusick 		mfb_clrvvector32(addr, ddy, p0->x, dy, lpf);
345553893Smckusick 		return;
345653893Smckusick 	}
345753893Smckusick 	if (dy == 0) {
345853893Smckusick 		mfb_clrhvector32(addr, p0->x, dx, lpf);
345953893Smckusick 		return;
346053893Smckusick 	}
346153893Smckusick 
346253893Smckusick 	if (dx < 0) {
346353893Smckusick 		ddx = -1;
346453893Smckusick 		dx = -dx;
346553893Smckusick 	} else {
346653893Smckusick 		ddx = 1;
346753893Smckusick 	}
346853893Smckusick 	if (dy < 0) {
346953893Smckusick 		dy = -dy;
347053893Smckusick 		ddy = -ddy;
347153893Smckusick 	}
347253893Smckusick 
347353893Smckusick #ifndef mc68020
347453893Smckusick 	bit = mfbmask32[p0->x & 0x1f];
347553893Smckusick 	leftbit = mfbmask32[0];
347653893Smckusick 	rightbit = mfbmask32[31];
347753893Smckusick 	addr += (p0->x >> 5);
347853893Smckusick #endif /* mc68020 */
347953893Smckusick 	if (dx > dy) {	/* case x */
348053893Smckusick 		lim = dx;
348153893Smckusick 		if (lpf)
348253893Smckusick 			lim++;
348353893Smckusick 
348453893Smckusick 		s = -dx;
348553893Smckusick 		d = dx << 1;
348653893Smckusick 		c = dy << 1;
348753893Smckusick 
348853893Smckusick 		if (ddx > 0) {
348953893Smckusick 			for (i = lim; i > 0; i--) {
349053893Smckusick #ifdef mc68020
349153893Smckusick 				asm("	bfclr	(a5){d4:1}");
349253893Smckusick 				x++;
349353893Smckusick #else /* mc68020 */
349453893Smckusick 				*addr &= ~bit;
349553893Smckusick 				bit >>= 1;
349653893Smckusick 				if (!bit) {
349753893Smckusick 					bit = leftbit;
349853893Smckusick 					addr++;
349953893Smckusick 				}
350053893Smckusick #endif /* mc68020 */
350153893Smckusick 				if ((s += c) >= 0) {
350253893Smckusick 					s -= d;
350353893Smckusick 					addr += ddy;
350453893Smckusick 				}
350553893Smckusick 			}
350653893Smckusick 		} else {
350753893Smckusick 			for (i = lim; i > 0; i--) {
350853893Smckusick #ifdef mc68020
350953893Smckusick 				asm("	bfclr	(a5){d4:1}");
351053893Smckusick 				x--;
351153893Smckusick #else /* mc68020 */
351253893Smckusick 				*addr &= ~bit;
351353893Smckusick 				bit <<= 1;
351453893Smckusick 				if (!bit) {
351553893Smckusick 					bit = rightbit;
351653893Smckusick 					addr--;
351753893Smckusick 				}
351853893Smckusick #endif /* mc68020 */
351953893Smckusick 				if ((s += c) >= 0) {
352053893Smckusick 					s -= d;
352153893Smckusick 					addr += ddy;
352253893Smckusick 				}
352353893Smckusick 			}
352453893Smckusick 		}
352553893Smckusick 	} else {			/* case y */
352653893Smckusick 		lim = dy;
352753893Smckusick 		if (lpf)
352853893Smckusick 			lim++;
352953893Smckusick 		s = -dy;
353053893Smckusick 		d = dy << 1;
353153893Smckusick 		c = dx << 1;
353253893Smckusick 
353353893Smckusick 		if (ddx > 0) {
353453893Smckusick 			for (i = lim; i > 0; i--) {
353553893Smckusick #ifdef mc68020
353653893Smckusick 				asm("	bfclr	(a5){d4:1}");
353753893Smckusick 				if ((s += c) >= 0) {
353853893Smckusick 					s -= d;
353953893Smckusick 					x++;
354053893Smckusick 				}
354153893Smckusick #else /* mc68020 */
354253893Smckusick 				*addr &= ~bit;
354353893Smckusick 				if ((s += c) >= 0) {
354453893Smckusick 					s -= d;
354553893Smckusick 					bit >>= 1;
354653893Smckusick 					if (!bit) {
354753893Smckusick 						bit = leftbit;
354853893Smckusick 						addr++;
354953893Smckusick 					}
355053893Smckusick 				}
355153893Smckusick #endif /* mc68020 */
355253893Smckusick 				addr += ddy;
355353893Smckusick 			}
355453893Smckusick 		} else {
355553893Smckusick 			for (i = lim; i > 0; i--) {
355653893Smckusick #ifdef mc68020
355753893Smckusick 				asm("	bfclr	(a5){d4:1}");
355853893Smckusick 				if ((s += c) >= 0) {
355953893Smckusick 					s -= d;
356053893Smckusick 					x--;
356153893Smckusick 				}
356253893Smckusick #else /* mc68020 */
356353893Smckusick 				*addr &= ~bit;
356453893Smckusick 				if ((s += c) >= 0) {
356553893Smckusick 					s -= d;
356653893Smckusick 					bit <<= 1;
356753893Smckusick 					if (!bit) {
356853893Smckusick 						bit = rightbit;
356953893Smckusick 						addr--;
357053893Smckusick 					}
357153893Smckusick 				}
357253893Smckusick #endif /* mc68020 */
357353893Smckusick 				addr += ddy;
357453893Smckusick 			}
357553893Smckusick 		}
357653893Smckusick 	}
357753893Smckusick }
357853893Smckusick 
357953893Smckusick void
mfb_invvvector32(addr,nlwidth,x,len,lpf)358053893Smckusick mfb_invvvector32(addr, nlwidth, x, len, lpf)
358153893Smckusick register u_int *addr;
358253893Smckusick register int nlwidth;
358353893Smckusick register int x;
358453893Smckusick register int len;
358553893Smckusick {
358653893Smckusick 	register u_int bitmask;
358753893Smckusick 
358853893Smckusick 	if (len < 0) {
358953893Smckusick 		nlwidth = -nlwidth;
359053893Smckusick 		len = -len;
359153893Smckusick 	}
359253893Smckusick 	if (lpf)
359353893Smckusick 		len++;
359453893Smckusick 	addr += (x >> 5);
359553893Smckusick 
359653893Smckusick 	bitmask = mfbmask32[x & 0x1f];
359753893Smckusick 
359853893Smckusick 	Duff(len, *addr ^= bitmask; addr += nlwidth)
359953893Smckusick }
360053893Smckusick 
360153893Smckusick void
mfb_invhvector32(addr,x,len,lpf)360253893Smckusick mfb_invhvector32(addr, x, len, lpf)
360353893Smckusick register u_int *addr;
360453893Smckusick int x;
360553893Smckusick int len;
360653893Smckusick int lpf;
360753893Smckusick {
360853893Smckusick 	register u_int	startmask;
360953893Smckusick 	register u_int 	endmask;
361053893Smckusick 	register int nl, off;
361153893Smckusick 
361253893Smckusick 	if (len < 0) {
361353893Smckusick 		x += len;
361453893Smckusick 		len = -len;
361553893Smckusick 		if (lpf) {
361653893Smckusick 			len++;
361753893Smckusick 		} else {
361853893Smckusick 			x++;
361953893Smckusick 		}
362053893Smckusick 	} else {
362153893Smckusick 		if (lpf) {
362253893Smckusick 			len++;
362353893Smckusick 		}
362453893Smckusick 	}
362553893Smckusick 	addr += (x >> 5);
362653893Smckusick 
362753893Smckusick 	off = x & 0x1f;
362853893Smckusick 	if (off + len < 32) {
362953893Smckusick 		*addr ^= mfbpartmasks32[off][len & 0x1f];
363053893Smckusick 	} else {
363153893Smckusick 		startmask = mfbstarttab32[off];
363253893Smckusick 		endmask = mfbendtab32[(x + len) & 0x1f];
363353893Smckusick 		if (startmask) {
363453893Smckusick 			nl = (len - (32 - off)) >> 5;
363553893Smckusick 			*addr++ ^= startmask;
363653893Smckusick 		} else
363753893Smckusick 			nl = len >> 5;
363853893Smckusick 		Duff_single(nl, addr, ^= ~0);
363953893Smckusick 		if (endmask)
364053893Smckusick 			*addr ^= endmask;
364153893Smckusick 	}
364253893Smckusick }
364353893Smckusick 
364453893Smckusick void
mfb_invvector32(fb,addr,ddy,p0,p1,lpf)364553893Smckusick mfb_invvector32(fb, addr, ddy, p0, p1, lpf)
364653893Smckusick struct fbdev	*fb;
364753893Smckusick register u_int *addr;
364853893Smckusick register int	ddy;
364953893Smckusick register lPoint *p0, *p1;
365053893Smckusick int lpf;		/* if 0, don't draw last point */
365153893Smckusick {
365253893Smckusick 	register int i;
365353893Smckusick 	register int lim;
365453893Smckusick #ifdef mc68020
365553893Smckusick 	register int x = p0->x;
365653893Smckusick #else /* mc68020 */
365753893Smckusick 	register u_int bit, leftbit, rightbit;
365853893Smckusick #endif /* mc68020 */
365953893Smckusick 	int ddx;
366053893Smckusick 	int dx = p1->x - p0->x;
366153893Smckusick 	int dy = p1->y - p0->y;
366253893Smckusick 	int s, d, c;
366353893Smckusick 
366453893Smckusick 	addr += (p0->y * ddy);
366553893Smckusick 
366653893Smckusick 	if (dx == 0) {
366753893Smckusick 		mfb_invvvector32(addr, ddy, p0->x, dy, lpf);
366853893Smckusick 		return;
366953893Smckusick 	}
367053893Smckusick 	if (dy == 0) {
367153893Smckusick 		mfb_invhvector32(addr, p0->x, dx, lpf);
367253893Smckusick 		return;
367353893Smckusick 	}
367453893Smckusick 
367553893Smckusick 	if (dx < 0) {
367653893Smckusick 		dx = -dx;
367753893Smckusick 		ddx = -1;
367853893Smckusick 	} else {
367953893Smckusick 		ddx = 1;
368053893Smckusick 	}
368153893Smckusick 	if (dy < 0) {
368253893Smckusick 		dy = -dy;
368353893Smckusick 		ddy = -ddy;
368453893Smckusick 	}
368553893Smckusick 
368653893Smckusick #ifndef mc68020
368753893Smckusick 	bit = mfbmask32[p0->x & 0x1f];
368853893Smckusick 	leftbit = mfbmask32[0];
368953893Smckusick 	rightbit = mfbmask32[31];
369053893Smckusick 	addr += (p0->x >> 5);
369153893Smckusick #endif /* mc68020 */
369253893Smckusick 	if (dx > dy) {	/* case x */
369353893Smckusick 		lim = dx;
369453893Smckusick 		if (lpf)
369553893Smckusick 			lim++;
369653893Smckusick 
369753893Smckusick 		s = -dx;
369853893Smckusick 		d = dx << 1;
369953893Smckusick 		c = dy << 1;
370053893Smckusick 
370153893Smckusick 		if (ddx > 0) {
370253893Smckusick 			for (i = lim; i > 0; i--) {
370353893Smckusick #ifdef mc68020
370453893Smckusick 				asm("	bfchg	(a5){d4:1}");
370553893Smckusick 				x++;
370653893Smckusick #else /* mc68020 */
370753893Smckusick 				*addr ^= bit;
370853893Smckusick 				bit >>= 1;
370953893Smckusick 				if (!bit) {
371053893Smckusick 					bit = leftbit;
371153893Smckusick 					addr++;
371253893Smckusick 				}
371353893Smckusick #endif /* mc68020 */
371453893Smckusick 				if ((s += c) >= 0) {
371553893Smckusick 					s -= d;
371653893Smckusick 					addr += ddy;
371753893Smckusick 				}
371853893Smckusick 			}
371953893Smckusick 		} else {
372053893Smckusick 			for (i = lim; i > 0; i--) {
372153893Smckusick #ifdef mc68020
372253893Smckusick 				asm("	bfchg	(a5){d4:1}");
372353893Smckusick 				x--;
372453893Smckusick #else /* mc68020 */
372553893Smckusick 				*addr ^= bit;
372653893Smckusick 				bit <<= 1;
372753893Smckusick 				if (!bit) {
372853893Smckusick 					bit = rightbit;
372953893Smckusick 					addr--;
373053893Smckusick 				}
373153893Smckusick #endif /* mc68020 */
373253893Smckusick 				if ((s += c) >= 0) {
373353893Smckusick 					s -= d;
373453893Smckusick 					addr += ddy;
373553893Smckusick 				}
373653893Smckusick 			}
373753893Smckusick 		}
373853893Smckusick 	} else {			/* case y */
373953893Smckusick 		lim = dy;
374053893Smckusick 		if (lpf)
374153893Smckusick 			lim++;
374253893Smckusick 		s = -dy;
374353893Smckusick 		d = dy << 1;
374453893Smckusick 		c = dx << 1;
374553893Smckusick 
374653893Smckusick 		if (ddx > 0) {
374753893Smckusick 			for (i = lim; i > 0; i--) {
374853893Smckusick #ifdef mc68020
374953893Smckusick 				asm("	bfchg	(a5){d4:1}");
375053893Smckusick 				if ((s += c) >= 0) {
375153893Smckusick 					s -= d;
375253893Smckusick 					x++;
375353893Smckusick 				}
375453893Smckusick #else /* mc68020 */
375553893Smckusick 				*addr ^= bit;
375653893Smckusick 				if ((s += c) >= 0) {
375753893Smckusick 					s -= d;
375853893Smckusick 					bit >>= 1;
375953893Smckusick 					if (!bit) {
376053893Smckusick 						bit = leftbit;
376153893Smckusick 						addr++;
376253893Smckusick 					}
376353893Smckusick 				}
376453893Smckusick #endif /* mc68020 */
376553893Smckusick 				addr += ddy;
376653893Smckusick 			}
376753893Smckusick 		} else {
376853893Smckusick 			for (i = lim; i > 0; i--) {
376953893Smckusick #ifdef mc68020
377053893Smckusick 				asm("	bfchg	(a5){d4:1}");
377153893Smckusick 				if ((s += c) >= 0) {
377253893Smckusick 					s -= d;
377353893Smckusick 					x--;
377453893Smckusick 				}
377553893Smckusick #else /* mc68020 */
377653893Smckusick 				*addr ^= bit;
377753893Smckusick 				if ((s += c) >= 0) {
377853893Smckusick 					s -= d;
377953893Smckusick 					bit <<= 1;
378053893Smckusick 					if (!bit) {
378153893Smckusick 						bit = rightbit;
378253893Smckusick 						addr--;
378353893Smckusick 					}
378453893Smckusick 				}
378553893Smckusick #endif /* mc68020 */
378653893Smckusick 				addr += ddy;
378753893Smckusick 			}
378853893Smckusick 		}
378953893Smckusick 	}
379053893Smckusick }
379153893Smckusick 
379253893Smckusick void
mfb_setvvector32(addr,nlwidth,x,len,lpf)379353893Smckusick mfb_setvvector32(addr, nlwidth, x, len, lpf)
379453893Smckusick register u_int *addr;
379553893Smckusick register int nlwidth;
379653893Smckusick register int x;
379753893Smckusick register int len;
379853893Smckusick {
379953893Smckusick 	register u_int bitmask;
380053893Smckusick 
380153893Smckusick 	if (len < 0) {
380253893Smckusick 		nlwidth = -nlwidth;
380353893Smckusick 		len = -len;
380453893Smckusick 	}
380553893Smckusick 	if (lpf)
380653893Smckusick 		len++;
380753893Smckusick 	addr += (x >> 5);
380853893Smckusick 
380953893Smckusick 	bitmask = mfbmask32[x & 0x1f];
381053893Smckusick 
381153893Smckusick 	Duff(len, *addr |= bitmask; addr += nlwidth)
381253893Smckusick }
381353893Smckusick 
381453893Smckusick void
mfb_sethvector32(addr,x,len,lpf)381553893Smckusick mfb_sethvector32(addr, x, len, lpf)
381653893Smckusick register u_int *addr;
381753893Smckusick int x;
381853893Smckusick int len;
381953893Smckusick int lpf;
382053893Smckusick {
382153893Smckusick 	register u_int startmask;
382253893Smckusick 	register u_int endmask;
382353893Smckusick 	register int nl, off;
382453893Smckusick 
382553893Smckusick 	if (len < 0) {
382653893Smckusick 		x += len;
382753893Smckusick 		len = -len;
382853893Smckusick 		if (lpf) {
382953893Smckusick 			len++;
383053893Smckusick 		} else {
383153893Smckusick 			x++;
383253893Smckusick 		}
383353893Smckusick 	} else {
383453893Smckusick 		if (lpf) {
383553893Smckusick 			len++;
383653893Smckusick 		}
383753893Smckusick 	}
383853893Smckusick 	addr += (x >> 5);
383953893Smckusick 
384053893Smckusick 	off = x & 0x1f;
384153893Smckusick 	if (off + len < 32) {
384253893Smckusick 		*addr |= mfbpartmasks32[off][len & 0x1f];
384353893Smckusick 	} else {
384453893Smckusick 		startmask = mfbstarttab32[off];
384553893Smckusick 		endmask = mfbendtab32[(x + len) & 0x1f];
384653893Smckusick 		if (startmask) {
384753893Smckusick 			nl = (len - (32 - off)) >> 5;
384853893Smckusick 			*addr++ |= startmask;
384953893Smckusick 		} else
385053893Smckusick 			nl = len >> 5;
385153893Smckusick #ifdef mc68020
385253893Smckusick 		;
385353893Smckusick 		asm(" move.l #-1,d3");
385453893Smckusick 		Duff(nl, asm(" move.l d3,(a5)+"))
385553893Smckusick #else /* mc68020 */
385653893Smckusick 		Duff_single(nl, addr, = ~0);
385753893Smckusick #endif /* mc68020 */
385853893Smckusick 		if (endmask)
385953893Smckusick 			*addr |= endmask;
386053893Smckusick 	}
386153893Smckusick }
386253893Smckusick 
386353893Smckusick void
mfb_setvector32(fb,addr,ddy,p0,p1,lpf)386453893Smckusick mfb_setvector32(fb, addr, ddy, p0, p1, lpf)
386553893Smckusick struct fbdev	*fb;
386653893Smckusick register u_int *addr;
386753893Smckusick register int ddy;
386853893Smckusick register lPoint *p0, *p1;
386953893Smckusick int lpf;		/* if 0, don't draw last point */
387053893Smckusick {
387153893Smckusick 	register int i;
387253893Smckusick 	register int lim;
387353893Smckusick #ifdef mc68020
387453893Smckusick 	register int x = p0->x;
387553893Smckusick #else /* mc68020 */
387653893Smckusick 	register u_int bit, leftbit, rightbit;
387753893Smckusick #endif /* mc68020 */
387853893Smckusick 	int ddx;
387953893Smckusick 	int dx = p1->x - p0->x;
388053893Smckusick 	int dy = p1->y - p0->y;
388153893Smckusick 	int s, d, c;
388253893Smckusick 
388353893Smckusick 	ddx = 1;
388453893Smckusick 	addr += (p0->y * ddy);
388553893Smckusick 
388653893Smckusick 	if (dx == 0) {
388753893Smckusick 		mfb_setvvector32(addr, ddy, p0->x, dy, lpf);
388853893Smckusick 		return;
388953893Smckusick 	}
389053893Smckusick 	if (dy == 0) {
389153893Smckusick 		mfb_sethvector32(addr, p0->x, dx, lpf);
389253893Smckusick 		return;
389353893Smckusick 	}
389453893Smckusick 
389553893Smckusick 	if (dx < 0) {
389653893Smckusick 		dx = -dx;
389753893Smckusick 		ddx = -ddx;
389853893Smckusick 	}
389953893Smckusick 	if (dy < 0) {
390053893Smckusick 		dy = -dy;
390153893Smckusick 		ddy = -ddy;
390253893Smckusick 	}
390353893Smckusick 
390453893Smckusick #ifndef mc68020
390553893Smckusick 	bit = mfbmask32[p0->x & 0x1f];
390653893Smckusick 	leftbit = mfbmask32[0];
390753893Smckusick 	rightbit = mfbmask32[31];
390853893Smckusick 	addr += (p0->x >> 5);
390953893Smckusick #endif /* mc68020 */
391053893Smckusick 	if (dx > dy) {	/* case x */
391153893Smckusick 		lim = dx;
391253893Smckusick 		if (lpf)
391353893Smckusick 			lim++;
391453893Smckusick 
391553893Smckusick 		s = -dx;
391653893Smckusick 		d = dx << 1;
391753893Smckusick 		c = dy << 1;
391853893Smckusick 
391953893Smckusick 		if (ddx > 0) {
392053893Smckusick 			for (i = lim; i > 0; i--) {
392153893Smckusick #ifdef mc68020
392253893Smckusick 				asm("	bfset	(a5){d4:1}");
392353893Smckusick 				x++;
392453893Smckusick #else /* mc68020 */
392553893Smckusick 				*addr |= bit;
392653893Smckusick 				bit >>= 1;
392753893Smckusick 				if (!bit) {
392853893Smckusick 					bit = leftbit;
392953893Smckusick 					addr++;
393053893Smckusick 				}
393153893Smckusick #endif /* mc68020 */
393253893Smckusick 				if ((s += c) >= 0) {
393353893Smckusick 					s -= d;
393453893Smckusick 					addr += ddy;
393553893Smckusick 				}
393653893Smckusick 			}
393753893Smckusick 		} else {
393853893Smckusick 			for (i = lim; i > 0; i--) {
393953893Smckusick #ifdef mc68020
394053893Smckusick 				asm("	bfset	(a5){d4:1}");
394153893Smckusick 				x--;
394253893Smckusick #else /* mc68020 */
394353893Smckusick 				*addr |= bit;
394453893Smckusick 				bit <<= 1;
394553893Smckusick 				if (!bit) {
394653893Smckusick 					bit = rightbit;
394753893Smckusick 					addr--;
394853893Smckusick 				}
394953893Smckusick #endif /* mc68020 */
395053893Smckusick 				if ((s += c) >= 0) {
395153893Smckusick 					s -= d;
395253893Smckusick 					addr += ddy;
395353893Smckusick 				}
395453893Smckusick 			}
395553893Smckusick 		}
395653893Smckusick 	} else {			/* case y */
395753893Smckusick 		lim = dy;
395853893Smckusick 		if (lpf)
395953893Smckusick 			lim++;
396053893Smckusick 		s = -dy;
396153893Smckusick 		d = dy << 1;
396253893Smckusick 		c = dx << 1;
396353893Smckusick 
396453893Smckusick 		if (ddx > 0) {
396553893Smckusick 			for (i = lim; i > 0; i--) {
396653893Smckusick #ifdef mc68020
396753893Smckusick 				asm("	bfset	(a5){d4:1}");
396853893Smckusick 				if ((s += c) >= 0) {
396953893Smckusick 					s -= d;
397053893Smckusick 					x++;
397153893Smckusick 				}
397253893Smckusick #else /* mc68020 */
397353893Smckusick 				*addr |= bit;
397453893Smckusick 				if ((s += c) >= 0) {
397553893Smckusick 					s -= d;
397653893Smckusick 					bit >>= 1;
397753893Smckusick 					if (!bit) {
397853893Smckusick 						bit = leftbit;
397953893Smckusick 						addr++;
398053893Smckusick 					}
398153893Smckusick 				}
398253893Smckusick #endif /* mc68020 */
398353893Smckusick 				addr += ddy;
398453893Smckusick 			}
398553893Smckusick 		} else {
398653893Smckusick 			for (i = lim; i > 0; i--) {
398753893Smckusick #ifdef mc68020
398853893Smckusick 				asm("	bfset	(a5){d4:1}");
398953893Smckusick 				if ((s += c) >= 0) {
399053893Smckusick 					s -= d;
399153893Smckusick 					x--;
399253893Smckusick 				}
399353893Smckusick #else /* mc68020 */
399453893Smckusick 				*addr |= bit;
399553893Smckusick 				if ((s += c) >= 0) {
399653893Smckusick 					s -= d;
399753893Smckusick 					bit <<= 1;
399853893Smckusick 					if (!bit) {
399953893Smckusick 						bit = rightbit;
400053893Smckusick 						addr--;
400153893Smckusick 					}
400253893Smckusick 				}
400353893Smckusick #endif /* mc68020 */
400453893Smckusick 				addr += ddy;
400553893Smckusick 			}
400653893Smckusick 		}
400753893Smckusick 	}
400853893Smckusick }
400953893Smckusick 
401053893Smckusick void
mfb_point(p,x,s,f)401153893Smckusick mfb_point(p, x, s, f)
401253893Smckusick register u_int *p;
401353893Smckusick register int x;
401453893Smckusick register u_int s;
401553893Smckusick register char *f;
401653893Smckusick {
401753893Smckusick #ifdef mc68020
401853893Smckusick 	asm("	andi.l	#31, d7");
401953893Smckusick 	asm("	move.l	d7,d0");
402053893Smckusick 	asm("	neg.l	d7");
402153893Smckusick 	asm("	addi.l	#31, d7");
402253893Smckusick 
402353893Smckusick 	asm("	move.l	(a5), d1");
402453893Smckusick 	asm("	lsr.l	d7, d1");
402553893Smckusick 	asm("	andi.l	#1, d1");
402653893Smckusick 
402753893Smckusick 	asm("	andi.l	#1, d6");
402853893Smckusick 	asm("	lsl.l	#1, d6");
402953893Smckusick 	asm("	or.l	d6, d1");
403053893Smckusick 	asm("	neg.l	d1");
403153893Smckusick 	asm("	addq.l	#3, d1");
403253893Smckusick 
403353893Smckusick 	asm("	btst.b	d1, (a4)");
403453893Smckusick 	asm("	beq	bcl");
403553893Smckusick 	asm("	bfset	(a5){d0:1}");
403653893Smckusick 	asm("	bra	bend");
403753893Smckusick 	asm("bcl:	bfclr	(a5){d0:1}");
403853893Smckusick 	asm("bend:	");
403953893Smckusick #else /* mc68020 */
404053893Smckusick 	x = 31 - (x & 31);
404153893Smckusick 	if ((1 << (3 - (((s & 1) << 1) | ((*p >> x) & 1)))) & *f)
404253893Smckusick 		*p |= (1 << x);
404353893Smckusick 	else
404453893Smckusick 		*p &= ~(1 << x);
404553893Smckusick #endif /* mc68020 */
404653893Smckusick }
404753893Smckusick 
404853893Smckusick void
mfb_vector32(fb,addr,ddy,p0,p1,lpf)404953893Smckusick mfb_vector32(fb, addr, ddy, p0, p1, lpf)
405053893Smckusick struct fbdev	*fb;
405153893Smckusick register u_int *addr;
405253893Smckusick int	ddy;
405353893Smckusick register lPoint *p0, *p1;
405453893Smckusick int lpf;		/* if 0, don't draw last point */
405553893Smckusick {
405653893Smckusick 	register char *fp = fb->funcvec;
405753893Smckusick 	register int x = p0->x;
405853893Smckusick 	register u_int pat = fb->pat;
405953893Smckusick 	int lim;
406053893Smckusick 	register int i;
406153893Smckusick 	register int ddx;
406253893Smckusick 	int s, d, c;
406353893Smckusick 	int dx = p1->x - x;
406453893Smckusick 	int dy = p1->y - p0->y;
406553893Smckusick 
406653893Smckusick 	ddx = 1;
406753893Smckusick 	addr += (p0->y * ddy);
406853893Smckusick 
406953893Smckusick 	if (dx == 0) {
407053893Smckusick 		ddx = 0;
407153893Smckusick 	} else if (dx < 0) {
407253893Smckusick 		dx = -dx;
407353893Smckusick 		ddx = -ddx;
407453893Smckusick 	}
407553893Smckusick 
407653893Smckusick 	if (dy == 0)
407753893Smckusick 		ddy = 0;
407853893Smckusick 	else if (dy < 0) {
407953893Smckusick 		dy = -dy;
408053893Smckusick 		ddy = -ddy;
408153893Smckusick 	}
408253893Smckusick 
408353893Smckusick 	if (dx > dy) {			/* case x */
408453893Smckusick 		lim = dx;
408553893Smckusick 		if (lpf)
408653893Smckusick 			lim++;
408753893Smckusick 
408853893Smckusick 		s = -dx;
408953893Smckusick 		d = dx << 1;
409053893Smckusick 		c = dy << 1;
409153893Smckusick 
409253893Smckusick 		for (i = lim; i > 0; i--) {
409353893Smckusick #ifdef mc68020
409453893Smckusick 			asm(" rol.l	#1, d6 ");
409553893Smckusick #else /* mc68020 */
409653893Smckusick 			pat = (pat << 1) | ((pat & 0x80000000) ? 1: 0);
409753893Smckusick #endif /* mc68020 */
409853893Smckusick 			mfb_point(addr + (x >> 5), x, pat, fp);
409953893Smckusick 
410053893Smckusick 			if ((s += c) >= 0) {
410153893Smckusick 				s -= d;
410253893Smckusick 				addr += ddy;
410353893Smckusick 			}
410453893Smckusick 
410553893Smckusick 			x += ddx;
410653893Smckusick 		}
410753893Smckusick 	} else {			/* case y */
410853893Smckusick 		lim = dy;
410953893Smckusick 		if (lpf)
411053893Smckusick 			lim++;
411153893Smckusick 		s = -dy;
411253893Smckusick 		d = dy << 1;
411353893Smckusick 		c = dx << 1;
411453893Smckusick 
411553893Smckusick 		for (i = lim; i > 0; i--) {
411653893Smckusick #ifdef mc68020
411753893Smckusick 			asm(" rol.l	#1, d6 ");
411853893Smckusick #else /* mc68020 */
411953893Smckusick 			pat = (pat << 1) | ((pat & 0x80000000) ? 1: 0);
412053893Smckusick #endif /* mc68020 */
412153893Smckusick 			mfb_point(addr + (x >> 5), x, pat, fp);
412253893Smckusick 
412353893Smckusick 			if ((s += c) >= 0) {
412453893Smckusick 				s -= d;
412553893Smckusick 				x += ddx;
412653893Smckusick 			}
412753893Smckusick 
412853893Smckusick 			addr += ddy;
412953893Smckusick 		}
413053893Smckusick 	}
413153893Smckusick 
413253893Smckusick 	/* rotate pattern */
413353893Smckusick 	pat = fb->pat;
413453893Smckusick 
413553893Smckusick #ifdef mc68020
413653893Smckusick 	asm("	move.l	(-8, fp), d0");
413753893Smckusick 	asm("	andi.l	#31, d0");
413853893Smckusick 	asm("	rol.l	d0, d6");
413953893Smckusick #else /* mc68020 */
414053893Smckusick 	{
414153893Smckusick 		register int tmp;
414253893Smckusick 
414353893Smckusick 		tmp = lim & 31;
414453893Smckusick 		pat = (pat << tmp) | (pat >> (32 - tmp));
414553893Smckusick 	}
414653893Smckusick #endif /* mc68020 */
414753893Smckusick 
414853893Smckusick 	fb->pat = pat;
414953893Smckusick }
415053893Smckusick 
415153893Smckusick void
mem_to_mem(func,mapSrc,offSrc,widthSrc,mapDst,offDst,widthDst,sr,dp)415253893Smckusick mem_to_mem(func, mapSrc, offSrc, widthSrc, mapDst, offDst, widthDst, sr, dp)
415353893Smckusick int		func;
415453893Smckusick struct fb_map	*mapSrc;
415553893Smckusick int		offSrc;
415653893Smckusick u_int		widthSrc;
415753893Smckusick struct fb_map	*mapDst;
415853893Smckusick int		offDst;
415953893Smckusick u_int		widthDst;
416053893Smckusick register lRectangle *sr;	/* source rectangle */
416153893Smckusick register lPoint	 *dp;	/* destination point */
416253893Smckusick {
416353893Smckusick 	register u_short *addrSrc;
416453893Smckusick 	register u_short *addrDst;
416553893Smckusick 
416653893Smckusick 	addrSrc = (u_short *)TypeAt(mapSrc, offSrc);
416753893Smckusick 	addrDst = (u_short *)TypeAt(mapDst, offDst);
416853893Smckusick 
416953893Smckusick 	if ((!((u_int)addrSrc & 3) && !(widthSrc & 1)) &&
417053893Smckusick 	    (!((u_int)addrDst & 3) && !(widthDst & 1))) {
417153893Smckusick 		switch (func) {
417253893Smckusick 
417353893Smckusick 		case BF_0:
417453893Smckusick 			mfb_clr_area32(dp->x, dp->y,
417553893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, widthDst / 2);
417653893Smckusick 			break;
417753893Smckusick 		case BF_S:
417853893Smckusick 			mfb_copy_area32(addrSrc, addrDst,
417953893Smckusick 			    widthSrc / 2, widthDst / 2, sr, dp);
418053893Smckusick 			break;
418153893Smckusick 		case BF_D:
418253893Smckusick 			break;
418353893Smckusick 		case BF_SDX:
418453893Smckusick 			mfb_xor_area32(addrSrc, addrDst,
418553893Smckusick 			    widthSrc / 2, widthDst / 2, sr, dp);
418653893Smckusick 			break;
418753893Smckusick 		case BF_SDO:
418853893Smckusick 			mfb_or_area32(addrSrc, addrDst,
418953893Smckusick 			    widthSrc / 2, widthDst / 2, sr, dp);
419053893Smckusick 			break;
419153893Smckusick 		case BF_DI:
419253893Smckusick 			mfb_inv_area32(dp->x, dp->y,
419353893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, widthDst / 2);
419453893Smckusick 			break;
419553893Smckusick 		case BF_SI:
419653893Smckusick 			mfb_copyinv_area32(addrSrc, addrDst,
419753893Smckusick 			    widthSrc / 2, widthDst / 2, sr, dp);
419853893Smckusick 			break;
419953893Smckusick 		case BF_1:
420053893Smckusick 			mfb_set_area32(dp->x, dp->y,
420153893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, widthDst / 2);
420253893Smckusick 			break;
420353893Smckusick 		default:
420453893Smckusick 			mfb_general_area32(func, addrSrc, addrDst,
420553893Smckusick 			    widthSrc / 2, widthDst / 2, sr, dp);
420653893Smckusick 			break;
420753893Smckusick 		}
420853893Smckusick 	} else {
420953893Smckusick 		switch (func) {
421053893Smckusick 
421153893Smckusick 		case BF_0:
421253893Smckusick 			mfb_clr_area16(dp->x, dp->y,
421353893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, widthDst);
421453893Smckusick 			break;
421553893Smckusick 		case BF_S:
421653893Smckusick 			mfb_copy_area16(addrSrc, addrDst,
421753893Smckusick 			    widthSrc, widthDst, sr, dp);
421853893Smckusick 			break;
421953893Smckusick 		case BF_D:
422053893Smckusick 			break;
422153893Smckusick 		case BF_SDX:
422253893Smckusick 			mfb_xor_area16(addrSrc, addrDst,
422353893Smckusick 			    widthSrc, widthDst, sr, dp);
422453893Smckusick 			break;
422553893Smckusick 		case BF_SDO:
422653893Smckusick 			mfb_or_area16(addrSrc, addrDst,
422753893Smckusick 			    widthSrc, widthDst, sr, dp);
422853893Smckusick 			break;
422953893Smckusick 		case BF_DI:
423053893Smckusick 			mfb_inv_area16(dp->x, dp->y,
423153893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, widthDst);
423253893Smckusick 			break;
423353893Smckusick 		case BF_SI:
423453893Smckusick 			mfb_copyinv_area16(addrSrc, addrDst,
423553893Smckusick 			    widthSrc, widthDst, sr, dp);
423653893Smckusick 			break;
423753893Smckusick 		case BF_1:
423853893Smckusick 			mfb_set_area16(dp->x, dp->y,
423953893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, widthDst);
424053893Smckusick 			break;
424153893Smckusick 		default:
424253893Smckusick 			mfb_general_area16(func, addrSrc, addrDst,
424353893Smckusick 			    widthSrc, widthDst, sr, dp);
424453893Smckusick 			break;
424553893Smckusick 		}
424653893Smckusick 	}
424753893Smckusick }
424853893Smckusick 
424953893Smckusick void
mem_clear(func,map,offset,width,dr,mode)425053893Smckusick mem_clear(func, map, offset, width, dr, mode)
425153893Smckusick register int	func;
425253893Smckusick struct fb_map	*map;
425353893Smckusick int		offset;
425453893Smckusick u_int		width;
425553893Smckusick register lRectangle *dr;
425653893Smckusick int		mode;
425753893Smckusick {
425853893Smckusick 	u_short *addr;
425953893Smckusick 
426053893Smckusick 	if (!mode)
426153893Smckusick 		func >>= 2;
426253893Smckusick 	func &= 0x3;
426353893Smckusick 
426453893Smckusick 	addr = (u_short *)TypeAt(map, offset);
426553893Smckusick 
426653893Smckusick 	if (!((u_int)addr & 3) && !(width & 1)) {
426753893Smckusick 		switch (func) {
426853893Smckusick 
426953893Smckusick 		case 0:
427053893Smckusick 			mfb_clr_area32(dr->origin.x, dr->origin.y,
427153893Smckusick 			    dr->extent.x, dr->extent.y, addr, width / 2);
427253893Smckusick 			break;
427353893Smckusick 		case 2:
427453893Smckusick 			mfb_inv_area32(dr->origin.x, dr->origin.y,
427553893Smckusick 			    dr->extent.x, dr->extent.y, addr, width / 2);
427653893Smckusick 			break;
427753893Smckusick 		case 3:
427853893Smckusick 			mfb_set_area32(dr->origin.x, dr->origin.y,
427953893Smckusick 			    dr->extent.x, dr->extent.y, addr, width / 2);
428053893Smckusick 			break;
428153893Smckusick 		}
428253893Smckusick 	} else {
428353893Smckusick 		switch (func) {
428453893Smckusick 
428553893Smckusick 		case 0:
428653893Smckusick 			mfb_clr_area16(dr->origin.x, dr->origin.y,
428753893Smckusick 			    dr->extent.x, dr->extent.y, addr, width);
428853893Smckusick 			break;
428953893Smckusick 		case 2:
429053893Smckusick 			mfb_inv_area16(dr->origin.x, dr->origin.y,
429153893Smckusick 			    dr->extent.x, dr->extent.y, addr, width);
429253893Smckusick 			break;
429353893Smckusick 		case 3:
429453893Smckusick 			mfb_set_area16(dr->origin.x, dr->origin.y,
429553893Smckusick 			    dr->extent.x, dr->extent.y, addr, width);
429653893Smckusick 			break;
429753893Smckusick 		}
429853893Smckusick 	}
429953893Smckusick }
430053893Smckusick 
430153893Smckusick #ifdef CPU_SINGLE
430253893Smckusick #define	VRAM_START(fb)		(((struct mfbdev *)(fb)->private)->vram_start)
430353893Smckusick #define	VRAM_WIDTH(fb)		(((struct mfbdev *)(fb)->private)->vram_width)
430453893Smckusick 
430553893Smckusick fbmem_rop_init(fb, func)
430653893Smckusick struct fbdev	*fb;
430753893Smckusick char	*func;
430853893Smckusick {
430953893Smckusick 	fb->func = *func;
431053893Smckusick }
431153893Smckusick 
431253893Smckusick void
fbmem_rop_winit(fb)431353893Smckusick fbmem_rop_winit(fb)
431453893Smckusick struct fbdev	*fb;
431553893Smckusick {
431653893Smckusick }
431753893Smckusick 
431853893Smckusick void
fbmem_rop_copy(fb,sr,dp,mode,wmask)431953893Smckusick fbmem_rop_copy(fb, sr, dp, mode, wmask)
432053893Smckusick register struct fbdev	*fb;
432153893Smckusick register lRectangle	*sr;	/* source rectangle */
432253893Smckusick register lPoint		*dp;	/* destination point */
432353893Smckusick {
432453893Smckusick 	if (!(wmask & 1)) {
432553893Smckusick 		return;
432653893Smckusick 	}
432753893Smckusick 
432853893Smckusick 	switch (fb->func) {
432953893Smckusick 	case BF_0:
433053893Smckusick 		mfb_clr_area32(dp->x, dp->y,
433153893Smckusick 		    sr->extent.x, sr->extent.y, VRAM_START(fb), VRAM_WIDTH(fb));
433253893Smckusick 		break;
433353893Smckusick 	case BF_S:
433453893Smckusick 		mfb_copy_area32(VRAM_START(fb), VRAM_START(fb),
433553893Smckusick 		    VRAM_WIDTH(fb), VRAM_WIDTH(fb), sr, dp);
433653893Smckusick 		break;
433753893Smckusick 	case BF_D:
433853893Smckusick 		break;
433953893Smckusick 	case BF_SDX:
434053893Smckusick 		mfb_xor_area32(VRAM_START(fb), VRAM_START(fb),
434153893Smckusick 		    VRAM_WIDTH(fb), VRAM_WIDTH(fb), sr, dp);
434253893Smckusick 		break;
434353893Smckusick 	case BF_SDO:
434453893Smckusick 		mfb_or_area32(VRAM_START(fb), VRAM_START(fb),
434553893Smckusick 		    VRAM_WIDTH(fb), VRAM_WIDTH(fb), sr, dp);
434653893Smckusick 		break;
434753893Smckusick 	case BF_DI:
434853893Smckusick 		mfb_inv_area32(dp->x, dp->y,
434953893Smckusick 		    sr->extent.x, sr->extent.y, VRAM_START(fb), VRAM_WIDTH(fb));
435053893Smckusick 		break;
435153893Smckusick 	case BF_SI:
435253893Smckusick 		mfb_copyinv_area32(VRAM_START(fb), VRAM_START(fb),
435353893Smckusick 		    VRAM_WIDTH(fb), VRAM_WIDTH(fb), sr, dp);
435453893Smckusick 		break;
435553893Smckusick 	case BF_1:
435653893Smckusick 		mfb_set_area32(dp->x, dp->y,
435753893Smckusick 		    sr->extent.x, sr->extent.y, VRAM_START(fb), VRAM_WIDTH(fb));
435853893Smckusick 		break;
435953893Smckusick 	default:
436053893Smckusick 		mfb_general_area32(fb->func, VRAM_START(fb), VRAM_START(fb),
436153893Smckusick 		    VRAM_WIDTH(fb), VRAM_WIDTH(fb), sr, dp);
436253893Smckusick 		break;
436353893Smckusick 	}
436453893Smckusick }
436553893Smckusick 
436653893Smckusick void
fbmem_rop_read(fb,map,offset,width,sr,dp,rplane,wplane)436753893Smckusick fbmem_rop_read(fb, map, offset, width, sr, dp, rplane, wplane)
436853893Smckusick register struct fbdev	*fb;
436953893Smckusick struct fb_map	*map;
437053893Smckusick u_int		offset;
437153893Smckusick u_int		width;
437253893Smckusick register lRectangle *sr;	/* source rectangle */
437353893Smckusick register lPoint	*dp;	/* destination point */
437453893Smckusick int		rplane;
437553893Smckusick int		wplane;
437653893Smckusick {
437753893Smckusick 	register u_short *addrDst;
437853893Smckusick 
437953893Smckusick 	addrDst = (u_short *)TypeAt(map, offset);
438053893Smckusick 
438153893Smckusick 	if (!((u_int)addrDst & 3) && !(width & 1)) {
438253893Smckusick 		switch (fb->funcvec[wplane]) {
438353893Smckusick 		case BF_0:
438453893Smckusick 			mfb_clr_area32(dp->x, dp->y,
438553893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, width / 2);
438653893Smckusick 			break;
438753893Smckusick 		case BF_S:
438853893Smckusick 			mfb_copy_area32(VRAM_START(fb), addrDst,
438953893Smckusick 			    VRAM_WIDTH(fb), width / 2, sr, dp);
439053893Smckusick 			break;
439153893Smckusick 		case BF_D:
439253893Smckusick 			break;
439353893Smckusick 		case BF_SDX:
439453893Smckusick 			mfb_xor_area32(VRAM_START(fb), addrDst,
439553893Smckusick 			    VRAM_WIDTH(fb), width / 2, sr, dp);
439653893Smckusick 			break;
439753893Smckusick 		case BF_SDO:
439853893Smckusick 			mfb_or_area32(VRAM_START(fb), addrDst,
439953893Smckusick 			    VRAM_WIDTH(fb), width / 2, sr, dp);
440053893Smckusick 			break;
440153893Smckusick 		case BF_DI:
440253893Smckusick 			mfb_inv_area32(dp->x, dp->y,
440353893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, width / 2);
440453893Smckusick 			break;
440553893Smckusick 		case BF_SI:
440653893Smckusick 			mfb_copyinv_area32(VRAM_START(fb), addrDst,
440753893Smckusick 			    VRAM_WIDTH(fb), width / 2, sr, dp);
440853893Smckusick 			break;
440953893Smckusick 		case BF_1:
441053893Smckusick 			mfb_set_area32(dp->x, dp->y,
441153893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, width / 2);
441253893Smckusick 			break;
441353893Smckusick 		default:
441453893Smckusick 			mfb_general_area32(fb->funcvec[wplane], VRAM_START(fb),
441553893Smckusick 			    addrDst, VRAM_WIDTH(fb), width/2, sr, dp);
441653893Smckusick 			break;
441753893Smckusick 		}
441853893Smckusick 	} else {
441953893Smckusick 		switch (fb->funcvec[wplane]) {
442053893Smckusick 		case BF_0:
442153893Smckusick 			mfb_clr_area16(dp->x, dp->y,
442253893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, width);
442353893Smckusick 			break;
442453893Smckusick 		case BF_S:
442553893Smckusick 			mfb_copy_area16(VRAM_START(fb), addrDst,
442653893Smckusick 			    VRAM_WIDTH(fb) * 2, width, sr, dp);
442753893Smckusick 			break;
442853893Smckusick 		case BF_D:
442953893Smckusick 			break;
443053893Smckusick 		case BF_SDX:
443153893Smckusick 			mfb_xor_area16(VRAM_START(fb), addrDst,
443253893Smckusick 			    VRAM_WIDTH(fb) * 2, width, sr, dp);
443353893Smckusick 			break;
443453893Smckusick 		case BF_SDO:
443553893Smckusick 			mfb_or_area16(VRAM_START(fb), addrDst,
443653893Smckusick 			    VRAM_WIDTH(fb) * 2, width, sr, dp);
443753893Smckusick 			break;
443853893Smckusick 		case BF_DI:
443953893Smckusick 			mfb_inv_area16(dp->x, dp->y,
444053893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, width);
444153893Smckusick 			break;
444253893Smckusick 		case BF_SI:
444353893Smckusick 			mfb_copyinv_area16(VRAM_START(fb), addrDst,
444453893Smckusick 			    VRAM_WIDTH(fb) * 2, width, sr, dp);
444553893Smckusick 			break;
444653893Smckusick 		case BF_1:
444753893Smckusick 			mfb_set_area16(dp->x, dp->y,
444853893Smckusick 			    sr->extent.x, sr->extent.y, addrDst, width);
444953893Smckusick 			break;
445053893Smckusick 		default:
445153893Smckusick 			mfb_general_area16(fb->funcvec[wplane], VRAM_START(fb),
445253893Smckusick 			    addrDst, VRAM_WIDTH(fb)*2, width, sr, dp);
445353893Smckusick 			break;
445453893Smckusick 		}
445553893Smckusick 	}
445653893Smckusick }
445753893Smckusick 
445853893Smckusick void
fbmem_rop_write(fb,map,offset,width,sr,dp,wmask)445953893Smckusick fbmem_rop_write(fb, map, offset, width, sr, dp, wmask)
446053893Smckusick register struct fbdev *fb;
446153893Smckusick struct fb_map	*map;
446253893Smckusick int		offset;
446353893Smckusick u_int		width;
446453893Smckusick register lRectangle *sr;	/* source rectangle */
446553893Smckusick register lPoint	*dp;	/* destination point */
446653893Smckusick int		wmask;
446753893Smckusick {
446853893Smckusick 	register u_short *addrSrc;
446953893Smckusick 
447053893Smckusick 	addrSrc = (u_short *)TypeAt(map, offset);
447153893Smckusick 
447253893Smckusick 	if (!(wmask & 1)) {
447353893Smckusick 		return;
447453893Smckusick 	}
447553893Smckusick 
447653893Smckusick 	if (!((u_int)addrSrc & 3) && !(width & 1)) {
447753893Smckusick 		switch (fb->funcvec[0]) {
447853893Smckusick 
447953893Smckusick 		case BF_0:
448053893Smckusick 			mfb_clr_area32(dp->x, dp->y,
448153893Smckusick 			    sr->extent.x, sr->extent.y,
448253893Smckusick 			    VRAM_START(fb), VRAM_WIDTH(fb));
448353893Smckusick 			break;
448453893Smckusick 		case BF_S:
448553893Smckusick 			mfb_copy_area32(addrSrc, VRAM_START(fb),
448653893Smckusick 			    width / 2, VRAM_WIDTH(fb), sr, dp);
448753893Smckusick 			break;
448853893Smckusick 		case BF_D:
448953893Smckusick 			break;
449053893Smckusick 		case BF_SDX:
449153893Smckusick 			mfb_xor_area32(addrSrc, VRAM_START(fb),
449253893Smckusick 			    width / 2, VRAM_WIDTH(fb), sr, dp);
449353893Smckusick 			break;
449453893Smckusick 		case BF_SDO:
449553893Smckusick 			mfb_or_area32(addrSrc, VRAM_START(fb),
449653893Smckusick 			    width / 2, VRAM_WIDTH(fb), sr, dp);
449753893Smckusick 			break;
449853893Smckusick 		case BF_DI:
449953893Smckusick 			mfb_inv_area32(dp->x, dp->y,
450053893Smckusick 			    sr->extent.x, sr->extent.y,
450153893Smckusick 			    VRAM_START(fb), VRAM_WIDTH(fb));
450253893Smckusick 			break;
450353893Smckusick 		case BF_SI:
450453893Smckusick 			mfb_copyinv_area32(addrSrc, VRAM_START(fb),
450553893Smckusick 			    width / 2, VRAM_WIDTH(fb), sr, dp);
450653893Smckusick 			break;
450753893Smckusick 		case BF_1:
450853893Smckusick 			mfb_set_area32(dp->x, dp->y,
450953893Smckusick 			    sr->extent.x, sr->extent.y,
451053893Smckusick 			    VRAM_START(fb), VRAM_WIDTH(fb));
451153893Smckusick 			break;
451253893Smckusick 		default:
451353893Smckusick 			mfb_general_area32(fb->funcvec[0], addrSrc,
451453893Smckusick 			    VRAM_START(fb), width / 2, VRAM_WIDTH(fb), sr, dp);
451553893Smckusick 			break;
451653893Smckusick 		}
451753893Smckusick 	} else {
451853893Smckusick 		switch (fb->funcvec[0]) {
451953893Smckusick 		case BF_0:
452053893Smckusick 			mfb_clr_area32(dp->x, dp->y,
452153893Smckusick 			    sr->extent.x, sr->extent.y,
452253893Smckusick 			    VRAM_START(fb), VRAM_WIDTH(fb));
452353893Smckusick 			break;
452453893Smckusick 		case BF_S:
452553893Smckusick 			mfb_copy_area16(addrSrc, VRAM_START(fb),
452653893Smckusick 			    width, VRAM_WIDTH(fb) * 2, sr, dp);
452753893Smckusick 			break;
452853893Smckusick 		case BF_D:
452953893Smckusick 			break;
453053893Smckusick 		case BF_SDX:
453153893Smckusick 			mfb_xor_area16(addrSrc, VRAM_START(fb),
453253893Smckusick 			    width, VRAM_WIDTH(fb) * 2, sr, dp);
453353893Smckusick 			break;
453453893Smckusick 		case BF_SDO:
453553893Smckusick 			mfb_or_area16(addrSrc, VRAM_START(fb),
453653893Smckusick 			    width, VRAM_WIDTH(fb) * 2, sr, dp);
453753893Smckusick 			break;
453853893Smckusick 		case BF_DI:
453953893Smckusick 			mfb_inv_area32(dp->x, dp->y,
454053893Smckusick 			    sr->extent.x, sr->extent.y,
454153893Smckusick 			    VRAM_START(fb), VRAM_WIDTH(fb));
454253893Smckusick 			break;
454353893Smckusick 		case BF_SI:
454453893Smckusick 			mfb_copyinv_area16(addrSrc, VRAM_START(fb),
454553893Smckusick 			    width, VRAM_WIDTH(fb) * 2, sr, dp);
454653893Smckusick 			break;
454753893Smckusick 		case BF_1:
454853893Smckusick 			mfb_set_area32(dp->x, dp->y,
454953893Smckusick 			    sr->extent.x, sr->extent.y,
455053893Smckusick 			    VRAM_START(fb), VRAM_WIDTH(fb));
455153893Smckusick 			break;
455253893Smckusick 		default:
455353893Smckusick 			mfb_general_area16(fb->funcvec[0], addrSrc,
455453893Smckusick 			    VRAM_START(fb), width, VRAM_WIDTH(fb) * 2, sr, dp);
455553893Smckusick 			break;
455653893Smckusick 		}
455753893Smckusick 	}
455853893Smckusick }
455953893Smckusick 
456053893Smckusick void
fbmem_rop_cinit(fb,wplane,sw)456153893Smckusick fbmem_rop_cinit(fb, wplane, sw)
456253893Smckusick struct fbdev	*fb;
456353893Smckusick {
456453893Smckusick 	fb->Pmask = wplane;
456553893Smckusick 	fb->Mode = sw;
456653893Smckusick }
456753893Smckusick 
456853893Smckusick void
fbmem_rop_clear(fb,dr)456953893Smckusick fbmem_rop_clear(fb, dr)
457053893Smckusick register struct fbdev *fb;
457153893Smckusick register lRectangle *dr;
457253893Smckusick {
457353893Smckusick 	register int func;
457453893Smckusick 
457553893Smckusick 	if (!(fb->Pmask & 1)) {
457653893Smckusick 		return;
457753893Smckusick 	}
457853893Smckusick 	func = fb->funcvec[0];
457953893Smckusick 	if (!fb->Mode)
458053893Smckusick 		func >>= 2;
458153893Smckusick 	func &= 3;
458253893Smckusick 
458353893Smckusick 	switch (func) {
458453893Smckusick 	case 0:
458553893Smckusick 		mfb_clr_area32(dr->origin.x, dr->origin.y,
458653893Smckusick 		    dr->extent.x, dr->extent.y, VRAM_START(fb), VRAM_WIDTH(fb));
458753893Smckusick 		break;
458853893Smckusick 	case 2:
458953893Smckusick 		mfb_inv_area32(dr->origin.x, dr->origin.y,
459053893Smckusick 		    dr->extent.x, dr->extent.y, VRAM_START(fb), VRAM_WIDTH(fb));
459153893Smckusick 		break;
459253893Smckusick 	case 3:
459353893Smckusick 		mfb_set_area32(dr->origin.x, dr->origin.y,
459453893Smckusick 		    dr->extent.x, dr->extent.y, VRAM_START(fb), VRAM_WIDTH(fb));
459553893Smckusick 		break;
459653893Smckusick 	}
459753893Smckusick }
459853893Smckusick 
459953893Smckusick void
fbmem_rop_vect(fb,clip,ropf,forc,auxc,transp,wplane,np,ps,lptn,lpf,joint)460053893Smckusick fbmem_rop_vect(fb, clip, ropf, forc, auxc, transp, wplane,
460153893Smckusick 						np, ps, lptn, lpf, joint)
460253893Smckusick register struct fbdev *fb;
460353893Smckusick register lRectangle *clip;
460453893Smckusick int ropf, forc, auxc, transp;
460553893Smckusick register int np;
460653893Smckusick register lPoint *ps;
460753893Smckusick register u_int lptn;
460853893Smckusick {
460953893Smckusick 	lPoint p0, p1;
461053893Smckusick 	register void (*line_func)();
461153893Smckusick 	register int func;
461253893Smckusick 
461353893Smckusick 	if (!(wplane & 1))
461453893Smckusick 		return;
461553893Smckusick 	linerop(fb, ropf, forc, auxc, transp);
461653893Smckusick 	func = fb->funcvec[0];
461753893Smckusick 	if (lptn == 0xffffffff || lptn == 0) {
461853893Smckusick 		if (!lptn)
461953893Smckusick 			func >>= 2;
462053893Smckusick 		switch (func & 3) {
462153893Smckusick 		case 0:
462253893Smckusick 			line_func = mfb_clrvector32;
462353893Smckusick 			break;
462453893Smckusick 		case 1:
462553893Smckusick 			return;
462653893Smckusick 		case 2:
462753893Smckusick 			line_func = mfb_invvector32;
462853893Smckusick 			break;
462953893Smckusick 		default:
463053893Smckusick 			line_func = mfb_setvector32;
463153893Smckusick 			break;
463253893Smckusick 		}
463353893Smckusick 	} else
463453893Smckusick 		line_func = mfb_vector32;
463553893Smckusick 	if (joint) {
463653893Smckusick 		fb->pat = lptn;
463753893Smckusick 		p0 = *ps++;
463853893Smckusick 		np--;
463953893Smckusick 		if (clip) {
464053893Smckusick 			while (--np > 0) {
464153893Smckusick 				p1 = *ps;
464253893Smckusick 				if (lineclip(&p0, &p1, clip)) {
464353893Smckusick 					(*line_func)(fb,
464453893Smckusick 						VRAM_START(fb), VRAM_WIDTH(fb),
464553893Smckusick 						&p0, &p1,
464653893Smckusick 						ps->x != p1.x || ps->y != p1.y);
464753893Smckusick 				}
464853893Smckusick 				p0 = *ps++;
464953893Smckusick 			}
465053893Smckusick 			p1 = *ps;
465153893Smckusick 			if (lineclip(&p0, &p1, clip)) {
465253893Smckusick 				(*line_func)(fb, VRAM_START(fb), VRAM_WIDTH(fb),
465353893Smckusick 					&p0, &p1,
465453893Smckusick 					ps->x != p1.x || ps->y != p1.y || lpf);
465553893Smckusick 			}
465653893Smckusick 		} else {
465753893Smckusick 			while (--np > 0) {
465853893Smckusick 				p1 = *ps;
465953893Smckusick 				(*line_func)(fb, VRAM_START(fb), VRAM_WIDTH(fb),
466053893Smckusick 					&p0, &p1, 0);
466153893Smckusick 				p0 = *ps++;
466253893Smckusick 			}
466353893Smckusick 			p1 = *ps;
466453893Smckusick 			(*line_func)(fb, VRAM_START(fb), VRAM_WIDTH(fb),
466553893Smckusick 				&p0, &p1, lpf);
466653893Smckusick 		}
466753893Smckusick 	} else {
466853893Smckusick 		np >>= 1;
466953893Smckusick 		if (lpf) {
467053893Smckusick 			if (clip) {
467153893Smckusick 				while (--np >= 0) {
467253893Smckusick 					p0 = *ps++;
467353893Smckusick 					p1 = *ps++;
467453893Smckusick 					fb->pat = lptn;
467553893Smckusick 					if (lineclip(&p0, &p1, clip)) {
467653893Smckusick 						(*line_func)(fb,
467753893Smckusick 							VRAM_START(fb),
467853893Smckusick 							VRAM_WIDTH(fb),
467953893Smckusick 							&p0, &p1, 1);
468053893Smckusick 					}
468153893Smckusick 				}
468253893Smckusick 			} else {
468353893Smckusick 				while (--np >= 0) {
468453893Smckusick 					p0 = *ps++;
468553893Smckusick 					p1 = *ps++;
468653893Smckusick 					fb->pat = lptn;
468753893Smckusick 					(*line_func)(fb,
468853893Smckusick 						VRAM_START(fb), VRAM_WIDTH(fb),
468953893Smckusick 						&p0, &p1, 1);
469053893Smckusick 				}
469153893Smckusick 			}
469253893Smckusick 		} else {
469353893Smckusick 			if (clip) {
469453893Smckusick 				while (--np >= 0) {
469553893Smckusick 					p0 = *ps++;
469653893Smckusick 					p1 = *ps;
469753893Smckusick 					fb->pat = lptn;
469853893Smckusick 					if (lineclip(&p0, &p1, clip)) {
469953893Smckusick 						(*line_func)(fb,
470053893Smckusick 							VRAM_START(fb),
470153893Smckusick 							VRAM_WIDTH(fb),
470253893Smckusick 							&p0, &p1,
470353893Smckusick 							ps->x != p1.x ||
470453893Smckusick 							ps->y != p1.y);
470553893Smckusick 					}
470653893Smckusick 					ps++;
470753893Smckusick 				}
470853893Smckusick 			} else {
470953893Smckusick 				while (--np >= 0) {
471053893Smckusick 					p0 = *ps++;
471153893Smckusick 					p1 = *ps++;
471253893Smckusick 					fb->pat = lptn;
471353893Smckusick 					(*line_func)(fb,
471453893Smckusick 						VRAM_START(fb), VRAM_WIDTH(fb),
471553893Smckusick 						&p0, &p1, 0);
471653893Smckusick 				}
471753893Smckusick 			}
471853893Smckusick 		}
471953893Smckusick 	}
472053893Smckusick }
472153893Smckusick 
472253893Smckusick #define	mfb_clrdot32(fb, addr, ddy, p) \
472353893Smckusick { *((u_int *)addr + (p->y * ddy) + (p->x >> 5)) &= mfbrmask32[p->x & 0x1f]; }
472453893Smckusick 
472553893Smckusick #define	mfb_invdot32(fb, addr, ddy, p) \
472653893Smckusick { *((u_int *)addr + (p->y * ddy) + (p->x >> 5)) ^= mfbmask32[p->x & 0x1f]; }
472753893Smckusick 
472853893Smckusick #define	mfb_setdot32(fb, addr, ddy, p) \
472953893Smckusick { *((u_int *)addr + (p->y * ddy) + (p->x >> 5)) |= mfbmask32[p->x & 0x1f]; }
473053893Smckusick 
473153893Smckusick void
fbmem_rop_dot_BF_clr(fb,clip,np,ps)473253893Smckusick fbmem_rop_dot_BF_clr(fb, clip, np, ps)
473353893Smckusick register struct fbdev *fb;
473453893Smckusick lRectangle *clip;
473553893Smckusick register int np;
473653893Smckusick register lPoint *ps;
473753893Smckusick {
473853893Smckusick 	register int x0, y0, x1, y1;
473953893Smckusick 
474053893Smckusick 	if (clip) {
474153893Smckusick 		x0 = clip->origin.x;
474253893Smckusick 		y0 = clip->origin.y;
474353893Smckusick 		x1 = x0 + clip->extent.x - 1;
474453893Smckusick 		y1 = y0 + clip->extent.y - 1;
474553893Smckusick 		if (x1 <= 0 || y1 <= 0) return;
474653893Smckusick 
474753893Smckusick 		while (np-- > 0) {
474853893Smckusick 			if ((ps->x >= x0) && (ps->y >= y0)
474953893Smckusick 			 && (ps->x <= x1) && (ps->y <= y1))
475053893Smckusick 				mfb_clrdot32(fb, VRAM_START(fb), VRAM_WIDTH(fb), ps);
475153893Smckusick 			ps++;
475253893Smckusick 		}
475353893Smckusick 	} else {
475453893Smckusick 		while (np-- > 0) {
475553893Smckusick 			mfb_clrdot32(fb, VRAM_START(fb), VRAM_WIDTH(fb), ps);
475653893Smckusick 			ps++;
475753893Smckusick 		}
475853893Smckusick 	}
475953893Smckusick }
476053893Smckusick 
476153893Smckusick void
fbmem_rop_dot_BF_inv(fb,clip,np,ps)476253893Smckusick fbmem_rop_dot_BF_inv(fb, clip, np, ps)
476353893Smckusick register struct fbdev *fb;
476453893Smckusick lRectangle *clip;
476553893Smckusick register int np;
476653893Smckusick register lPoint *ps;
476753893Smckusick {
476853893Smckusick 	register int x0, y0, x1, y1;
476953893Smckusick 
477053893Smckusick 	if (clip) {
477153893Smckusick 		x0 = clip->origin.x;
477253893Smckusick 		y0 = clip->origin.y;
477353893Smckusick 		x1 = x0 + clip->extent.x - 1;
477453893Smckusick 		y1 = y0 + clip->extent.y - 1;
477553893Smckusick 		if (x1 <= 0 || y1 <= 0) return;
477653893Smckusick 
477753893Smckusick 		while (np-- > 0) {
477853893Smckusick 			if ((ps->x >= x0) && (ps->y >= y0)
477953893Smckusick 			 && (ps->x <= x1) && (ps->y <= y1))
478053893Smckusick 				mfb_invdot32(fb, VRAM_START(fb), VRAM_WIDTH(fb), ps);
478153893Smckusick 			ps++;
478253893Smckusick 		}
478353893Smckusick 	} else {
478453893Smckusick 		while (np-- > 0) {
478553893Smckusick 			mfb_invdot32(fb, VRAM_START(fb), VRAM_WIDTH(fb), ps);
478653893Smckusick 			ps++;
478753893Smckusick 		}
478853893Smckusick 	}
478953893Smckusick }
479053893Smckusick 
479153893Smckusick void
fbmem_rop_dot(fb,clip,ropf,forc,auxc,transp,wplane,np,ps)479253893Smckusick fbmem_rop_dot(fb, clip, ropf, forc, auxc, transp, wplane, np, ps)
479353893Smckusick register struct fbdev *fb;
479453893Smckusick lRectangle *clip;
479553893Smckusick int ropf, forc, auxc, transp;
479653893Smckusick register int np;
479753893Smckusick register lPoint *ps;
479853893Smckusick {
479953893Smckusick 	register int x0, y0, x1, y1;
480053893Smckusick 
480153893Smckusick 	if (!(wplane & 1))
480253893Smckusick 		return;
480353893Smckusick 
480453893Smckusick 	linerop(fb, ropf, forc, auxc, transp);
480553893Smckusick 
480653893Smckusick 	switch (fb->funcvec[0] & 3) {
480753893Smckusick 	case 1:
480853893Smckusick 		break;
480953893Smckusick 
481053893Smckusick 	case 0:
481153893Smckusick 		fbmem_rop_dot_BF_clr(fb, clip, np, ps);
481253893Smckusick 		break;
481353893Smckusick 	case 2:
481453893Smckusick 		fbmem_rop_dot_BF_inv(fb, clip, np, ps);
481553893Smckusick 		break;
481653893Smckusick 
481753893Smckusick 	default:
481853893Smckusick 		if (clip) {
481953893Smckusick 			x0 = clip->origin.x;
482053893Smckusick 			y0 = clip->origin.y;
482153893Smckusick 			x1 = x0 + clip->extent.x - 1;
482253893Smckusick 			y1 = y0 + clip->extent.y - 1;
482353893Smckusick 			if (x1 <= 0 || y1 <= 0) return;
482453893Smckusick 
482553893Smckusick 			while (np-- > 0) {
482653893Smckusick 				if ((ps->x >= x0) && (ps->y >= y0)
482753893Smckusick 				 && (ps->x <= x1) && (ps->y <= y1))
482853893Smckusick 					mfb_setdot32(fb,
482953893Smckusick 					    VRAM_START(fb), VRAM_WIDTH(fb), ps);
483053893Smckusick 				ps++;
483153893Smckusick 			}
483253893Smckusick 		} else {
483353893Smckusick 			while (np-- > 0) {
483453893Smckusick 				mfb_setdot32(fb,
483553893Smckusick 				    VRAM_START(fb), VRAM_WIDTH(fb), ps);
483653893Smckusick 				ps++;
483753893Smckusick 			}
483853893Smckusick 		}
483953893Smckusick 	}
484053893Smckusick }
484153893Smckusick 
484253893Smckusick #ifdef notdef
484353893Smckusick 
484453893Smckusick #ifndef mfb_clrdot32
484553893Smckusick void
mfb_clrdot32(fb,addr,ddy,p)484653893Smckusick mfb_clrdot32(fb, addr, ddy, p)
484753893Smckusick struct fbdev	*fb;
484853893Smckusick register unsigned int *addr;
484953893Smckusick register int ddy;
485053893Smckusick register lPoint *p;
485153893Smckusick {
485253893Smckusick 	addr += (p->y * ddy) + (p->x >> 5);
485353893Smckusick 	*addr &= mfbrmask32[p->x & 0x1f];
485453893Smckusick }
485553893Smckusick #endif /* ! mfb_clrdot32 */
485653893Smckusick 
485753893Smckusick #ifndef mfb_invdot32
485853893Smckusick void
mfb_invdot32(fb,addr,ddy,p)485953893Smckusick mfb_invdot32(fb, addr, ddy, p)
486053893Smckusick struct fbdev	*fb;
486153893Smckusick register unsigned int *addr;
486253893Smckusick register int	ddy;
486353893Smckusick register lPoint *p;
486453893Smckusick {
486553893Smckusick 	addr += (p->y * ddy) + (p->x >> 5);
486653893Smckusick 	*addr ^= mfbmask32[p->x & 0x1f];
486753893Smckusick }
486853893Smckusick #endif /* ! mfb_invdot32 */
486953893Smckusick 
487053893Smckusick #ifndef mfb_setdot32
487153893Smckusick void
mfb_setdot32(fb,addr,ddy,p)487253893Smckusick mfb_setdot32(fb, addr, ddy, p)
487353893Smckusick struct fbdev	*fb;
487453893Smckusick register unsigned int *addr;
487553893Smckusick register int ddy;
487653893Smckusick register lPoint *p;
487753893Smckusick {
487853893Smckusick 	addr += (p->y * ddy) + (p->x >> 5);
487953893Smckusick 	*addr |= mfbmask32[p->x & 0x1f];
488053893Smckusick }
488153893Smckusick #endif /* ! mfb_setdot32 */
488253893Smckusick #endif
488353893Smckusick 
488453893Smckusick #endif /* CPU_SINGLE */
4885