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