/ MCUME_teensy / teensyuae / blitfunc.c
blitfunc.c
   1  #include "shared.h"
   2  
   3  #include "custom.h"
   4  #include "blitfunc.h"
   5  
   6  void blitdofast_0(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
   7  {
   8  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
   9  int i,j;
  10  {
  11  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
  12  for (j=0;j<b->vblitsize;j++) {
  13  	for (i=0;i<b->hblitsize;i++) {
  14  		b->bltddat=0;
  15  		if (b->bltddat) b->blitzero=0;
  16  		if (ptd) *ptd++=b->bltddat;
  17  	}
  18  	if (ptd) ptd+=bltdmodw;
  19  }
  20  }
  21  }
  22  void blitdofast_desc_0(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
  23  {
  24  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
  25  int i,j;
  26  {
  27  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
  28  for (j=0;j<b->vblitsize;j++) {
  29  	for (i=0;i<b->hblitsize;i++) {
  30  		b->bltddat=0;
  31  		if (b->bltddat) b->blitzero=0;
  32  		if (ptd) *ptd--=b->bltddat;
  33  	}
  34  	if (ptd) ptd-=bltdmodw;
  35  }
  36  }
  37  }
  38  void blitdofast_a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
  39  {
  40  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
  41  int i,j;
  42  {
  43  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
  44  if (b->hblitsize==1) bltamask&=b->bltalwm;
  45  for (j=0;j<b->vblitsize;j++) {
  46  	if (pta) b->bltadat=*pta++;
  47  	if (ptc) b->bltcdat=*ptc++;
  48  	bltaold=b->bltadat & bltamask;
  49  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
  50  	srcc=b->bltcdat;
  51  	b->bltddat=(srcc & ~srca);
  52  	b->blitpreva=bltaold;
  53  	if (b->bltddat) b->blitzero=0;
  54  	if (ptd) *ptd++=b->bltddat;
  55  	for (i=2;i<b->hblitsize;i++) {
  56  		if (pta) b->bltadat=*pta++;
  57  		if (ptc) b->bltcdat=*ptc++;
  58  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
  59  		srcc=b->bltcdat;
  60  		b->bltddat=(srcc & ~srca);
  61  		b->blitpreva=b->bltadat;
  62  		if (b->bltddat) b->blitzero=0;
  63  		if (ptd) *ptd++=b->bltddat;
  64  	}
  65  	if (b->hblitsize>1) {
  66  		if (pta) b->bltadat=*pta++;
  67  		if (ptc) b->bltcdat=*ptc++;
  68  		bltaold=b->bltadat & b->bltalwm;
  69  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
  70  		srcc=b->bltcdat;
  71  		b->bltddat=(srcc & ~srca);
  72  		b->blitpreva=bltaold;
  73  		if (b->bltddat) b->blitzero=0;
  74  		if (ptd) *ptd++=b->bltddat;
  75  	}
  76  	if (pta) pta+=bltamodw;
  77  	if (ptc) ptc+=bltcmodw;
  78  	if (ptd) ptd+=bltdmodw;
  79  }
  80  }
  81  }
  82  void blitdofast_desc_a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
  83  {
  84  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
  85  int i,j;
  86  {
  87  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
  88  if (b->hblitsize==1) bltamask&=b->bltalwm;
  89  for (j=0;j<b->vblitsize;j++) {
  90  	if (pta) b->bltadat=*pta--;
  91  	if (ptc) b->bltcdat=*ptc--;
  92  	bltaold=b->bltadat & bltamask;
  93  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
  94  	srcc=b->bltcdat;
  95  	b->bltddat=(srcc & ~srca);
  96  	b->blitpreva=bltaold;
  97  	if (b->bltddat) b->blitzero=0;
  98  	if (ptd) *ptd--=b->bltddat;
  99  	for (i=2;i<b->hblitsize;i++) {
 100  		if (pta) b->bltadat=*pta--;
 101  		if (ptc) b->bltcdat=*ptc--;
 102  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
 103  		srcc=b->bltcdat;
 104  		b->bltddat=(srcc & ~srca);
 105  		b->blitpreva=b->bltadat;
 106  		if (b->bltddat) b->blitzero=0;
 107  		if (ptd) *ptd--=b->bltddat;
 108  	}
 109  	if (b->hblitsize>1) {
 110  		if (pta) b->bltadat=*pta--;
 111  		if (ptc) b->bltcdat=*ptc--;
 112  		bltaold=b->bltadat & b->bltalwm;
 113  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 114  		srcc=b->bltcdat;
 115  		b->bltddat=(srcc & ~srca);
 116  		b->blitpreva=bltaold;
 117  		if (b->bltddat) b->blitzero=0;
 118  		if (ptd) *ptd--=b->bltddat;
 119  	}
 120  	if (pta) pta-=bltamodw;
 121  	if (ptc) ptc-=bltcmodw;
 122  	if (ptd) ptd-=bltdmodw;
 123  }
 124  }
 125  }
 126  void blitdofast_2a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 127  {
 128  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 129  int i,j;
 130  {
 131  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 132  if (b->hblitsize==1) bltamask&=b->bltalwm;
 133  for (j=0;j<b->vblitsize;j++) {
 134  	if (pta) b->bltadat=*pta++;
 135  	if (ptb) b->bltbdat=*ptb++;
 136  	if (ptc) b->bltcdat=*ptc++;
 137  	bltaold=b->bltadat & bltamask;
 138  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 139  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 140  	srcc=b->bltcdat;
 141  	b->bltddat=(srcc & ~srca) | (srcc & ~srcb);
 142  	b->blitpreva=bltaold;
 143  	b->blitprevb=b->bltbdat;
 144  	if (b->bltddat) b->blitzero=0;
 145  	if (ptd) *ptd++=b->bltddat;
 146  	for (i=2;i<b->hblitsize;i++) {
 147  		if (pta) b->bltadat=*pta++;
 148  		if (ptb) b->bltbdat=*ptb++;
 149  		if (ptc) b->bltcdat=*ptc++;
 150  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
 151  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 152  		srcc=b->bltcdat;
 153  		b->bltddat=(srcc & ~srca) | (srcc & ~srcb);
 154  		b->blitpreva=b->bltadat;
 155  		b->blitprevb=b->bltbdat;
 156  		if (b->bltddat) b->blitzero=0;
 157  		if (ptd) *ptd++=b->bltddat;
 158  	}
 159  	if (b->hblitsize>1) {
 160  		if (pta) b->bltadat=*pta++;
 161  		if (ptb) b->bltbdat=*ptb++;
 162  		if (ptc) b->bltcdat=*ptc++;
 163  		bltaold=b->bltadat & b->bltalwm;
 164  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 165  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 166  		srcc=b->bltcdat;
 167  		b->bltddat=(srcc & ~srca) | (srcc & ~srcb);
 168  		b->blitpreva=bltaold;
 169  		b->blitprevb=b->bltbdat;
 170  		if (b->bltddat) b->blitzero=0;
 171  		if (ptd) *ptd++=b->bltddat;
 172  	}
 173  	if (pta) pta+=bltamodw;
 174  	if (ptb) ptb+=bltbmodw;
 175  	if (ptc) ptc+=bltcmodw;
 176  	if (ptd) ptd+=bltdmodw;
 177  }
 178  }
 179  }
 180  void blitdofast_desc_2a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 181  {
 182  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 183  int i,j;
 184  {
 185  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 186  if (b->hblitsize==1) bltamask&=b->bltalwm;
 187  for (j=0;j<b->vblitsize;j++) {
 188  	if (pta) b->bltadat=*pta--;
 189  	if (ptb) b->bltbdat=*ptb--;
 190  	if (ptc) b->bltcdat=*ptc--;
 191  	bltaold=b->bltadat & bltamask;
 192  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 193  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 194  	srcc=b->bltcdat;
 195  	b->bltddat=(srcc & ~srca) | (srcc & ~srcb);
 196  	b->blitpreva=bltaold;
 197  	b->blitprevb=b->bltbdat;
 198  	if (b->bltddat) b->blitzero=0;
 199  	if (ptd) *ptd--=b->bltddat;
 200  	for (i=2;i<b->hblitsize;i++) {
 201  		if (pta) b->bltadat=*pta--;
 202  		if (ptb) b->bltbdat=*ptb--;
 203  		if (ptc) b->bltcdat=*ptc--;
 204  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
 205  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 206  		srcc=b->bltcdat;
 207  		b->bltddat=(srcc & ~srca) | (srcc & ~srcb);
 208  		b->blitpreva=b->bltadat;
 209  		b->blitprevb=b->bltbdat;
 210  		if (b->bltddat) b->blitzero=0;
 211  		if (ptd) *ptd--=b->bltddat;
 212  	}
 213  	if (b->hblitsize>1) {
 214  		if (pta) b->bltadat=*pta--;
 215  		if (ptb) b->bltbdat=*ptb--;
 216  		if (ptc) b->bltcdat=*ptc--;
 217  		bltaold=b->bltadat & b->bltalwm;
 218  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 219  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 220  		srcc=b->bltcdat;
 221  		b->bltddat=(srcc & ~srca) | (srcc & ~srcb);
 222  		b->blitpreva=bltaold;
 223  		b->blitprevb=b->bltbdat;
 224  		if (b->bltddat) b->blitzero=0;
 225  		if (ptd) *ptd--=b->bltddat;
 226  	}
 227  	if (pta) pta-=bltamodw;
 228  	if (ptb) ptb-=bltbmodw;
 229  	if (ptc) ptc-=bltcmodw;
 230  	if (ptd) ptd-=bltdmodw;
 231  }
 232  }
 233  }
 234  void blitdofast_30(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 235  {
 236  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 237  int i,j;
 238  {
 239  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 240  if (b->hblitsize==1) bltamask&=b->bltalwm;
 241  for (j=0;j<b->vblitsize;j++) {
 242  	if (pta) b->bltadat=*pta++;
 243  	if (ptb) b->bltbdat=*ptb++;
 244  	bltaold=b->bltadat & bltamask;
 245  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 246  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 247  	b->bltddat=(~srcb & srca);
 248  	b->blitpreva=bltaold;
 249  	b->blitprevb=b->bltbdat;
 250  	if (b->bltddat) b->blitzero=0;
 251  	if (ptd) *ptd++=b->bltddat;
 252  	for (i=2;i<b->hblitsize;i++) {
 253  		if (pta) b->bltadat=*pta++;
 254  		if (ptb) b->bltbdat=*ptb++;
 255  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
 256  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 257  		b->bltddat=(~srcb & srca);
 258  		b->blitpreva=b->bltadat;
 259  		b->blitprevb=b->bltbdat;
 260  		if (b->bltddat) b->blitzero=0;
 261  		if (ptd) *ptd++=b->bltddat;
 262  	}
 263  	if (b->hblitsize>1) {
 264  		if (pta) b->bltadat=*pta++;
 265  		if (ptb) b->bltbdat=*ptb++;
 266  		bltaold=b->bltadat & b->bltalwm;
 267  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 268  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 269  		b->bltddat=(~srcb & srca);
 270  		b->blitpreva=bltaold;
 271  		b->blitprevb=b->bltbdat;
 272  		if (b->bltddat) b->blitzero=0;
 273  		if (ptd) *ptd++=b->bltddat;
 274  	}
 275  	if (pta) pta+=bltamodw;
 276  	if (ptb) ptb+=bltbmodw;
 277  	if (ptd) ptd+=bltdmodw;
 278  }
 279  }
 280  }
 281  void blitdofast_desc_30(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 282  {
 283  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 284  int i,j;
 285  {
 286  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 287  if (b->hblitsize==1) bltamask&=b->bltalwm;
 288  for (j=0;j<b->vblitsize;j++) {
 289  	if (pta) b->bltadat=*pta--;
 290  	if (ptb) b->bltbdat=*ptb--;
 291  	bltaold=b->bltadat & bltamask;
 292  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 293  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 294  	b->bltddat=(~srcb & srca);
 295  	b->blitpreva=bltaold;
 296  	b->blitprevb=b->bltbdat;
 297  	if (b->bltddat) b->blitzero=0;
 298  	if (ptd) *ptd--=b->bltddat;
 299  	for (i=2;i<b->hblitsize;i++) {
 300  		if (pta) b->bltadat=*pta--;
 301  		if (ptb) b->bltbdat=*ptb--;
 302  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
 303  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 304  		b->bltddat=(~srcb & srca);
 305  		b->blitpreva=b->bltadat;
 306  		b->blitprevb=b->bltbdat;
 307  		if (b->bltddat) b->blitzero=0;
 308  		if (ptd) *ptd--=b->bltddat;
 309  	}
 310  	if (b->hblitsize>1) {
 311  		if (pta) b->bltadat=*pta--;
 312  		if (ptb) b->bltbdat=*ptb--;
 313  		bltaold=b->bltadat & b->bltalwm;
 314  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 315  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 316  		b->bltddat=(~srcb & srca);
 317  		b->blitpreva=bltaold;
 318  		b->blitprevb=b->bltbdat;
 319  		if (b->bltddat) b->blitzero=0;
 320  		if (ptd) *ptd--=b->bltddat;
 321  	}
 322  	if (pta) pta-=bltamodw;
 323  	if (ptb) ptb-=bltbmodw;
 324  	if (ptd) ptd-=bltdmodw;
 325  }
 326  }
 327  }
 328  void blitdofast_3a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 329  {
 330  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 331  int i,j;
 332  {
 333  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 334  if (b->hblitsize==1) bltamask&=b->bltalwm;
 335  for (j=0;j<b->vblitsize;j++) {
 336  	if (pta) b->bltadat=*pta++;
 337  	if (ptb) b->bltbdat=*ptb++;
 338  	if (ptc) b->bltcdat=*ptc++;
 339  	bltaold=b->bltadat & bltamask;
 340  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 341  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 342  	srcc=b->bltcdat;
 343  	b->bltddat=(srcc & ~srca) | (~srcb & srca);
 344  	b->blitpreva=bltaold;
 345  	b->blitprevb=b->bltbdat;
 346  	if (b->bltddat) b->blitzero=0;
 347  	if (ptd) *ptd++=b->bltddat;
 348  	for (i=2;i<b->hblitsize;i++) {
 349  		if (pta) b->bltadat=*pta++;
 350  		if (ptb) b->bltbdat=*ptb++;
 351  		if (ptc) b->bltcdat=*ptc++;
 352  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
 353  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 354  		srcc=b->bltcdat;
 355  		b->bltddat=(srcc & ~srca) | (~srcb & srca);
 356  		b->blitpreva=b->bltadat;
 357  		b->blitprevb=b->bltbdat;
 358  		if (b->bltddat) b->blitzero=0;
 359  		if (ptd) *ptd++=b->bltddat;
 360  	}
 361  	if (b->hblitsize>1) {
 362  		if (pta) b->bltadat=*pta++;
 363  		if (ptb) b->bltbdat=*ptb++;
 364  		if (ptc) b->bltcdat=*ptc++;
 365  		bltaold=b->bltadat & b->bltalwm;
 366  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 367  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 368  		srcc=b->bltcdat;
 369  		b->bltddat=(srcc & ~srca) | (~srcb & srca);
 370  		b->blitpreva=bltaold;
 371  		b->blitprevb=b->bltbdat;
 372  		if (b->bltddat) b->blitzero=0;
 373  		if (ptd) *ptd++=b->bltddat;
 374  	}
 375  	if (pta) pta+=bltamodw;
 376  	if (ptb) ptb+=bltbmodw;
 377  	if (ptc) ptc+=bltcmodw;
 378  	if (ptd) ptd+=bltdmodw;
 379  }
 380  }
 381  }
 382  void blitdofast_desc_3a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 383  {
 384  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 385  int i,j;
 386  {
 387  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 388  if (b->hblitsize==1) bltamask&=b->bltalwm;
 389  for (j=0;j<b->vblitsize;j++) {
 390  	if (pta) b->bltadat=*pta--;
 391  	if (ptb) b->bltbdat=*ptb--;
 392  	if (ptc) b->bltcdat=*ptc--;
 393  	bltaold=b->bltadat & bltamask;
 394  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 395  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 396  	srcc=b->bltcdat;
 397  	b->bltddat=(srcc & ~srca) | (~srcb & srca);
 398  	b->blitpreva=bltaold;
 399  	b->blitprevb=b->bltbdat;
 400  	if (b->bltddat) b->blitzero=0;
 401  	if (ptd) *ptd--=b->bltddat;
 402  	for (i=2;i<b->hblitsize;i++) {
 403  		if (pta) b->bltadat=*pta--;
 404  		if (ptb) b->bltbdat=*ptb--;
 405  		if (ptc) b->bltcdat=*ptc--;
 406  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
 407  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 408  		srcc=b->bltcdat;
 409  		b->bltddat=(srcc & ~srca) | (~srcb & srca);
 410  		b->blitpreva=b->bltadat;
 411  		b->blitprevb=b->bltbdat;
 412  		if (b->bltddat) b->blitzero=0;
 413  		if (ptd) *ptd--=b->bltddat;
 414  	}
 415  	if (b->hblitsize>1) {
 416  		if (pta) b->bltadat=*pta--;
 417  		if (ptb) b->bltbdat=*ptb--;
 418  		if (ptc) b->bltcdat=*ptc--;
 419  		bltaold=b->bltadat & b->bltalwm;
 420  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 421  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 422  		srcc=b->bltcdat;
 423  		b->bltddat=(srcc & ~srca) | (~srcb & srca);
 424  		b->blitpreva=bltaold;
 425  		b->blitprevb=b->bltbdat;
 426  		if (b->bltddat) b->blitzero=0;
 427  		if (ptd) *ptd--=b->bltddat;
 428  	}
 429  	if (pta) pta-=bltamodw;
 430  	if (ptb) ptb-=bltbmodw;
 431  	if (ptc) ptc-=bltcmodw;
 432  	if (ptd) ptd-=bltdmodw;
 433  }
 434  }
 435  }
 436  void blitdofast_3c(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 437  {
 438  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 439  int i,j;
 440  {
 441  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 442  if (b->hblitsize==1) bltamask&=b->bltalwm;
 443  for (j=0;j<b->vblitsize;j++) {
 444  	if (pta) b->bltadat=*pta++;
 445  	if (ptb) b->bltbdat=*ptb++;
 446  	bltaold=b->bltadat & bltamask;
 447  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 448  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 449  	b->bltddat=(srcb & ~srca) | (~srcb & srca);
 450  	b->blitpreva=bltaold;
 451  	b->blitprevb=b->bltbdat;
 452  	if (b->bltddat) b->blitzero=0;
 453  	if (ptd) *ptd++=b->bltddat;
 454  	for (i=2;i<b->hblitsize;i++) {
 455  		if (pta) b->bltadat=*pta++;
 456  		if (ptb) b->bltbdat=*ptb++;
 457  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
 458  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 459  		b->bltddat=(srcb & ~srca) | (~srcb & srca);
 460  		b->blitpreva=b->bltadat;
 461  		b->blitprevb=b->bltbdat;
 462  		if (b->bltddat) b->blitzero=0;
 463  		if (ptd) *ptd++=b->bltddat;
 464  	}
 465  	if (b->hblitsize>1) {
 466  		if (pta) b->bltadat=*pta++;
 467  		if (ptb) b->bltbdat=*ptb++;
 468  		bltaold=b->bltadat & b->bltalwm;
 469  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 470  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 471  		b->bltddat=(srcb & ~srca) | (~srcb & srca);
 472  		b->blitpreva=bltaold;
 473  		b->blitprevb=b->bltbdat;
 474  		if (b->bltddat) b->blitzero=0;
 475  		if (ptd) *ptd++=b->bltddat;
 476  	}
 477  	if (pta) pta+=bltamodw;
 478  	if (ptb) ptb+=bltbmodw;
 479  	if (ptd) ptd+=bltdmodw;
 480  }
 481  }
 482  }
 483  void blitdofast_desc_3c(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 484  {
 485  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 486  int i,j;
 487  {
 488  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 489  if (b->hblitsize==1) bltamask&=b->bltalwm;
 490  for (j=0;j<b->vblitsize;j++) {
 491  	if (pta) b->bltadat=*pta--;
 492  	if (ptb) b->bltbdat=*ptb--;
 493  	bltaold=b->bltadat & bltamask;
 494  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 495  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 496  	b->bltddat=(srcb & ~srca) | (~srcb & srca);
 497  	b->blitpreva=bltaold;
 498  	b->blitprevb=b->bltbdat;
 499  	if (b->bltddat) b->blitzero=0;
 500  	if (ptd) *ptd--=b->bltddat;
 501  	for (i=2;i<b->hblitsize;i++) {
 502  		if (pta) b->bltadat=*pta--;
 503  		if (ptb) b->bltbdat=*ptb--;
 504  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
 505  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 506  		b->bltddat=(srcb & ~srca) | (~srcb & srca);
 507  		b->blitpreva=b->bltadat;
 508  		b->blitprevb=b->bltbdat;
 509  		if (b->bltddat) b->blitzero=0;
 510  		if (ptd) *ptd--=b->bltddat;
 511  	}
 512  	if (b->hblitsize>1) {
 513  		if (pta) b->bltadat=*pta--;
 514  		if (ptb) b->bltbdat=*ptb--;
 515  		bltaold=b->bltadat & b->bltalwm;
 516  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 517  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 518  		b->bltddat=(srcb & ~srca) | (~srcb & srca);
 519  		b->blitpreva=bltaold;
 520  		b->blitprevb=b->bltbdat;
 521  		if (b->bltddat) b->blitzero=0;
 522  		if (ptd) *ptd--=b->bltddat;
 523  	}
 524  	if (pta) pta-=bltamodw;
 525  	if (ptb) ptb-=bltbmodw;
 526  	if (ptd) ptd-=bltdmodw;
 527  }
 528  }
 529  }
 530  void blitdofast_4a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 531  {
 532  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 533  int i,j;
 534  {
 535  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 536  if (b->hblitsize==1) bltamask&=b->bltalwm;
 537  for (j=0;j<b->vblitsize;j++) {
 538  	if (pta) b->bltadat=*pta++;
 539  	if (ptb) b->bltbdat=*ptb++;
 540  	if (ptc) b->bltcdat=*ptc++;
 541  	bltaold=b->bltadat & bltamask;
 542  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 543  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 544  	srcc=b->bltcdat;
 545  	b->bltddat=(srcc & ~srca) | (~srcc & srcb & srca);
 546  	b->blitpreva=bltaold;
 547  	b->blitprevb=b->bltbdat;
 548  	if (b->bltddat) b->blitzero=0;
 549  	if (ptd) *ptd++=b->bltddat;
 550  	for (i=2;i<b->hblitsize;i++) {
 551  		if (pta) b->bltadat=*pta++;
 552  		if (ptb) b->bltbdat=*ptb++;
 553  		if (ptc) b->bltcdat=*ptc++;
 554  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
 555  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 556  		srcc=b->bltcdat;
 557  		b->bltddat=(srcc & ~srca) | (~srcc & srcb & srca);
 558  		b->blitpreva=b->bltadat;
 559  		b->blitprevb=b->bltbdat;
 560  		if (b->bltddat) b->blitzero=0;
 561  		if (ptd) *ptd++=b->bltddat;
 562  	}
 563  	if (b->hblitsize>1) {
 564  		if (pta) b->bltadat=*pta++;
 565  		if (ptb) b->bltbdat=*ptb++;
 566  		if (ptc) b->bltcdat=*ptc++;
 567  		bltaold=b->bltadat & b->bltalwm;
 568  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 569  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 570  		srcc=b->bltcdat;
 571  		b->bltddat=(srcc & ~srca) | (~srcc & srcb & srca);
 572  		b->blitpreva=bltaold;
 573  		b->blitprevb=b->bltbdat;
 574  		if (b->bltddat) b->blitzero=0;
 575  		if (ptd) *ptd++=b->bltddat;
 576  	}
 577  	if (pta) pta+=bltamodw;
 578  	if (ptb) ptb+=bltbmodw;
 579  	if (ptc) ptc+=bltcmodw;
 580  	if (ptd) ptd+=bltdmodw;
 581  }
 582  }
 583  }
 584  void blitdofast_desc_4a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 585  {
 586  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 587  int i,j;
 588  {
 589  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 590  if (b->hblitsize==1) bltamask&=b->bltalwm;
 591  for (j=0;j<b->vblitsize;j++) {
 592  	if (pta) b->bltadat=*pta--;
 593  	if (ptb) b->bltbdat=*ptb--;
 594  	if (ptc) b->bltcdat=*ptc--;
 595  	bltaold=b->bltadat & bltamask;
 596  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 597  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 598  	srcc=b->bltcdat;
 599  	b->bltddat=(srcc & ~srca) | (~srcc & srcb & srca);
 600  	b->blitpreva=bltaold;
 601  	b->blitprevb=b->bltbdat;
 602  	if (b->bltddat) b->blitzero=0;
 603  	if (ptd) *ptd--=b->bltddat;
 604  	for (i=2;i<b->hblitsize;i++) {
 605  		if (pta) b->bltadat=*pta--;
 606  		if (ptb) b->bltbdat=*ptb--;
 607  		if (ptc) b->bltcdat=*ptc--;
 608  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
 609  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 610  		srcc=b->bltcdat;
 611  		b->bltddat=(srcc & ~srca) | (~srcc & srcb & srca);
 612  		b->blitpreva=b->bltadat;
 613  		b->blitprevb=b->bltbdat;
 614  		if (b->bltddat) b->blitzero=0;
 615  		if (ptd) *ptd--=b->bltddat;
 616  	}
 617  	if (b->hblitsize>1) {
 618  		if (pta) b->bltadat=*pta--;
 619  		if (ptb) b->bltbdat=*ptb--;
 620  		if (ptc) b->bltcdat=*ptc--;
 621  		bltaold=b->bltadat & b->bltalwm;
 622  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 623  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 624  		srcc=b->bltcdat;
 625  		b->bltddat=(srcc & ~srca) | (~srcc & srcb & srca);
 626  		b->blitpreva=bltaold;
 627  		b->blitprevb=b->bltbdat;
 628  		if (b->bltddat) b->blitzero=0;
 629  		if (ptd) *ptd--=b->bltddat;
 630  	}
 631  	if (pta) pta-=bltamodw;
 632  	if (ptb) ptb-=bltbmodw;
 633  	if (ptc) ptc-=bltcmodw;
 634  	if (ptd) ptd-=bltdmodw;
 635  }
 636  }
 637  }
 638  void blitdofast_6a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 639  {
 640  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 641  int i,j;
 642  {
 643  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 644  if (b->hblitsize==1) bltamask&=b->bltalwm;
 645  for (j=0;j<b->vblitsize;j++) {
 646  	if (pta) b->bltadat=*pta++;
 647  	if (ptb) b->bltbdat=*ptb++;
 648  	if (ptc) b->bltcdat=*ptc++;
 649  	bltaold=b->bltadat & bltamask;
 650  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 651  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 652  	srcc=b->bltcdat;
 653  	b->bltddat=(srcc & ~srca) | (srcc & ~srcb) | (~srcc & srcb & srca);
 654  	b->blitpreva=bltaold;
 655  	b->blitprevb=b->bltbdat;
 656  	if (b->bltddat) b->blitzero=0;
 657  	if (ptd) *ptd++=b->bltddat;
 658  	for (i=2;i<b->hblitsize;i++) {
 659  		if (pta) b->bltadat=*pta++;
 660  		if (ptb) b->bltbdat=*ptb++;
 661  		if (ptc) b->bltcdat=*ptc++;
 662  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
 663  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 664  		srcc=b->bltcdat;
 665  		b->bltddat=(srcc & ~srca) | (srcc & ~srcb) | (~srcc & srcb & srca);
 666  		b->blitpreva=b->bltadat;
 667  		b->blitprevb=b->bltbdat;
 668  		if (b->bltddat) b->blitzero=0;
 669  		if (ptd) *ptd++=b->bltddat;
 670  	}
 671  	if (b->hblitsize>1) {
 672  		if (pta) b->bltadat=*pta++;
 673  		if (ptb) b->bltbdat=*ptb++;
 674  		if (ptc) b->bltcdat=*ptc++;
 675  		bltaold=b->bltadat & b->bltalwm;
 676  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 677  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 678  		srcc=b->bltcdat;
 679  		b->bltddat=(srcc & ~srca) | (srcc & ~srcb) | (~srcc & srcb & srca);
 680  		b->blitpreva=bltaold;
 681  		b->blitprevb=b->bltbdat;
 682  		if (b->bltddat) b->blitzero=0;
 683  		if (ptd) *ptd++=b->bltddat;
 684  	}
 685  	if (pta) pta+=bltamodw;
 686  	if (ptb) ptb+=bltbmodw;
 687  	if (ptc) ptc+=bltcmodw;
 688  	if (ptd) ptd+=bltdmodw;
 689  }
 690  }
 691  }
 692  void blitdofast_desc_6a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 693  {
 694  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 695  int i,j;
 696  {
 697  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 698  if (b->hblitsize==1) bltamask&=b->bltalwm;
 699  for (j=0;j<b->vblitsize;j++) {
 700  	if (pta) b->bltadat=*pta--;
 701  	if (ptb) b->bltbdat=*ptb--;
 702  	if (ptc) b->bltcdat=*ptc--;
 703  	bltaold=b->bltadat & bltamask;
 704  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 705  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 706  	srcc=b->bltcdat;
 707  	b->bltddat=(srcc & ~srca) | (srcc & ~srcb) | (~srcc & srcb & srca);
 708  	b->blitpreva=bltaold;
 709  	b->blitprevb=b->bltbdat;
 710  	if (b->bltddat) b->blitzero=0;
 711  	if (ptd) *ptd--=b->bltddat;
 712  	for (i=2;i<b->hblitsize;i++) {
 713  		if (pta) b->bltadat=*pta--;
 714  		if (ptb) b->bltbdat=*ptb--;
 715  		if (ptc) b->bltcdat=*ptc--;
 716  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
 717  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 718  		srcc=b->bltcdat;
 719  		b->bltddat=(srcc & ~srca) | (srcc & ~srcb) | (~srcc & srcb & srca);
 720  		b->blitpreva=b->bltadat;
 721  		b->blitprevb=b->bltbdat;
 722  		if (b->bltddat) b->blitzero=0;
 723  		if (ptd) *ptd--=b->bltddat;
 724  	}
 725  	if (b->hblitsize>1) {
 726  		if (pta) b->bltadat=*pta--;
 727  		if (ptb) b->bltbdat=*ptb--;
 728  		if (ptc) b->bltcdat=*ptc--;
 729  		bltaold=b->bltadat & b->bltalwm;
 730  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 731  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 732  		srcc=b->bltcdat;
 733  		b->bltddat=(srcc & ~srca) | (srcc & ~srcb) | (~srcc & srcb & srca);
 734  		b->blitpreva=bltaold;
 735  		b->blitprevb=b->bltbdat;
 736  		if (b->bltddat) b->blitzero=0;
 737  		if (ptd) *ptd--=b->bltddat;
 738  	}
 739  	if (pta) pta-=bltamodw;
 740  	if (ptb) ptb-=bltbmodw;
 741  	if (ptc) ptc-=bltcmodw;
 742  	if (ptd) ptd-=bltdmodw;
 743  }
 744  }
 745  }
 746  void blitdofast_8a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 747  {
 748  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 749  int i,j;
 750  {
 751  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 752  if (b->hblitsize==1) bltamask&=b->bltalwm;
 753  for (j=0;j<b->vblitsize;j++) {
 754  	if (pta) b->bltadat=*pta++;
 755  	if (ptb) b->bltbdat=*ptb++;
 756  	if (ptc) b->bltcdat=*ptc++;
 757  	bltaold=b->bltadat & bltamask;
 758  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 759  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 760  	srcc=b->bltcdat;
 761  	b->bltddat=(srcc & ~srca) | (srcc & srcb);
 762  	b->blitpreva=bltaold;
 763  	b->blitprevb=b->bltbdat;
 764  	if (b->bltddat) b->blitzero=0;
 765  	if (ptd) *ptd++=b->bltddat;
 766  	for (i=2;i<b->hblitsize;i++) {
 767  		if (pta) b->bltadat=*pta++;
 768  		if (ptb) b->bltbdat=*ptb++;
 769  		if (ptc) b->bltcdat=*ptc++;
 770  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
 771  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 772  		srcc=b->bltcdat;
 773  		b->bltddat=(srcc & ~srca) | (srcc & srcb);
 774  		b->blitpreva=b->bltadat;
 775  		b->blitprevb=b->bltbdat;
 776  		if (b->bltddat) b->blitzero=0;
 777  		if (ptd) *ptd++=b->bltddat;
 778  	}
 779  	if (b->hblitsize>1) {
 780  		if (pta) b->bltadat=*pta++;
 781  		if (ptb) b->bltbdat=*ptb++;
 782  		if (ptc) b->bltcdat=*ptc++;
 783  		bltaold=b->bltadat & b->bltalwm;
 784  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 785  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 786  		srcc=b->bltcdat;
 787  		b->bltddat=(srcc & ~srca) | (srcc & srcb);
 788  		b->blitpreva=bltaold;
 789  		b->blitprevb=b->bltbdat;
 790  		if (b->bltddat) b->blitzero=0;
 791  		if (ptd) *ptd++=b->bltddat;
 792  	}
 793  	if (pta) pta+=bltamodw;
 794  	if (ptb) ptb+=bltbmodw;
 795  	if (ptc) ptc+=bltcmodw;
 796  	if (ptd) ptd+=bltdmodw;
 797  }
 798  }
 799  }
 800  void blitdofast_desc_8a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 801  {
 802  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 803  int i,j;
 804  {
 805  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 806  if (b->hblitsize==1) bltamask&=b->bltalwm;
 807  for (j=0;j<b->vblitsize;j++) {
 808  	if (pta) b->bltadat=*pta--;
 809  	if (ptb) b->bltbdat=*ptb--;
 810  	if (ptc) b->bltcdat=*ptc--;
 811  	bltaold=b->bltadat & bltamask;
 812  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 813  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 814  	srcc=b->bltcdat;
 815  	b->bltddat=(srcc & ~srca) | (srcc & srcb);
 816  	b->blitpreva=bltaold;
 817  	b->blitprevb=b->bltbdat;
 818  	if (b->bltddat) b->blitzero=0;
 819  	if (ptd) *ptd--=b->bltddat;
 820  	for (i=2;i<b->hblitsize;i++) {
 821  		if (pta) b->bltadat=*pta--;
 822  		if (ptb) b->bltbdat=*ptb--;
 823  		if (ptc) b->bltcdat=*ptc--;
 824  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
 825  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 826  		srcc=b->bltcdat;
 827  		b->bltddat=(srcc & ~srca) | (srcc & srcb);
 828  		b->blitpreva=b->bltadat;
 829  		b->blitprevb=b->bltbdat;
 830  		if (b->bltddat) b->blitzero=0;
 831  		if (ptd) *ptd--=b->bltddat;
 832  	}
 833  	if (b->hblitsize>1) {
 834  		if (pta) b->bltadat=*pta--;
 835  		if (ptb) b->bltbdat=*ptb--;
 836  		if (ptc) b->bltcdat=*ptc--;
 837  		bltaold=b->bltadat & b->bltalwm;
 838  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 839  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 840  		srcc=b->bltcdat;
 841  		b->bltddat=(srcc & ~srca) | (srcc & srcb);
 842  		b->blitpreva=bltaold;
 843  		b->blitprevb=b->bltbdat;
 844  		if (b->bltddat) b->blitzero=0;
 845  		if (ptd) *ptd--=b->bltddat;
 846  	}
 847  	if (pta) pta-=bltamodw;
 848  	if (ptb) ptb-=bltbmodw;
 849  	if (ptc) ptc-=bltcmodw;
 850  	if (ptd) ptd-=bltdmodw;
 851  }
 852  }
 853  }
 854  void blitdofast_8c(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 855  {
 856  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 857  int i,j;
 858  {
 859  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 860  if (b->hblitsize==1) bltamask&=b->bltalwm;
 861  for (j=0;j<b->vblitsize;j++) {
 862  	if (pta) b->bltadat=*pta++;
 863  	if (ptb) b->bltbdat=*ptb++;
 864  	if (ptc) b->bltcdat=*ptc++;
 865  	bltaold=b->bltadat & bltamask;
 866  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 867  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 868  	srcc=b->bltcdat;
 869  	b->bltddat=(srcb & ~srca) | (srcc & srcb);
 870  	b->blitpreva=bltaold;
 871  	b->blitprevb=b->bltbdat;
 872  	if (b->bltddat) b->blitzero=0;
 873  	if (ptd) *ptd++=b->bltddat;
 874  	for (i=2;i<b->hblitsize;i++) {
 875  		if (pta) b->bltadat=*pta++;
 876  		if (ptb) b->bltbdat=*ptb++;
 877  		if (ptc) b->bltcdat=*ptc++;
 878  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
 879  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 880  		srcc=b->bltcdat;
 881  		b->bltddat=(srcb & ~srca) | (srcc & srcb);
 882  		b->blitpreva=b->bltadat;
 883  		b->blitprevb=b->bltbdat;
 884  		if (b->bltddat) b->blitzero=0;
 885  		if (ptd) *ptd++=b->bltddat;
 886  	}
 887  	if (b->hblitsize>1) {
 888  		if (pta) b->bltadat=*pta++;
 889  		if (ptb) b->bltbdat=*ptb++;
 890  		if (ptc) b->bltcdat=*ptc++;
 891  		bltaold=b->bltadat & b->bltalwm;
 892  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 893  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 894  		srcc=b->bltcdat;
 895  		b->bltddat=(srcb & ~srca) | (srcc & srcb);
 896  		b->blitpreva=bltaold;
 897  		b->blitprevb=b->bltbdat;
 898  		if (b->bltddat) b->blitzero=0;
 899  		if (ptd) *ptd++=b->bltddat;
 900  	}
 901  	if (pta) pta+=bltamodw;
 902  	if (ptb) ptb+=bltbmodw;
 903  	if (ptc) ptc+=bltcmodw;
 904  	if (ptd) ptd+=bltdmodw;
 905  }
 906  }
 907  }
 908  void blitdofast_desc_8c(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 909  {
 910  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 911  int i,j;
 912  {
 913  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 914  if (b->hblitsize==1) bltamask&=b->bltalwm;
 915  for (j=0;j<b->vblitsize;j++) {
 916  	if (pta) b->bltadat=*pta--;
 917  	if (ptb) b->bltbdat=*ptb--;
 918  	if (ptc) b->bltcdat=*ptc--;
 919  	bltaold=b->bltadat & bltamask;
 920  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 921  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 922  	srcc=b->bltcdat;
 923  	b->bltddat=(srcb & ~srca) | (srcc & srcb);
 924  	b->blitpreva=bltaold;
 925  	b->blitprevb=b->bltbdat;
 926  	if (b->bltddat) b->blitzero=0;
 927  	if (ptd) *ptd--=b->bltddat;
 928  	for (i=2;i<b->hblitsize;i++) {
 929  		if (pta) b->bltadat=*pta--;
 930  		if (ptb) b->bltbdat=*ptb--;
 931  		if (ptc) b->bltcdat=*ptc--;
 932  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
 933  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 934  		srcc=b->bltcdat;
 935  		b->bltddat=(srcb & ~srca) | (srcc & srcb);
 936  		b->blitpreva=b->bltadat;
 937  		b->blitprevb=b->bltbdat;
 938  		if (b->bltddat) b->blitzero=0;
 939  		if (ptd) *ptd--=b->bltddat;
 940  	}
 941  	if (b->hblitsize>1) {
 942  		if (pta) b->bltadat=*pta--;
 943  		if (ptb) b->bltbdat=*ptb--;
 944  		if (ptc) b->bltcdat=*ptc--;
 945  		bltaold=b->bltadat & b->bltalwm;
 946  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
 947  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
 948  		srcc=b->bltcdat;
 949  		b->bltddat=(srcb & ~srca) | (srcc & srcb);
 950  		b->blitpreva=bltaold;
 951  		b->blitprevb=b->bltbdat;
 952  		if (b->bltddat) b->blitzero=0;
 953  		if (ptd) *ptd--=b->bltddat;
 954  	}
 955  	if (pta) pta-=bltamodw;
 956  	if (ptb) ptb-=bltbmodw;
 957  	if (ptc) ptc-=bltcmodw;
 958  	if (ptd) ptd-=bltdmodw;
 959  }
 960  }
 961  }
 962  void blitdofast_9a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
 963  {
 964  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
 965  int i,j;
 966  {
 967  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
 968  if (b->hblitsize==1) bltamask&=b->bltalwm;
 969  for (j=0;j<b->vblitsize;j++) {
 970  	if (pta) b->bltadat=*pta++;
 971  	if (ptb) b->bltbdat=*ptb++;
 972  	if (ptc) b->bltcdat=*ptc++;
 973  	bltaold=b->bltadat & bltamask;
 974  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
 975  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 976  	srcc=b->bltcdat;
 977  	b->bltddat=(srcc & ~srca) | (~srcc & ~srcb & srca) | (srcc & srcb);
 978  	b->blitpreva=bltaold;
 979  	b->blitprevb=b->bltbdat;
 980  	if (b->bltddat) b->blitzero=0;
 981  	if (ptd) *ptd++=b->bltddat;
 982  	for (i=2;i<b->hblitsize;i++) {
 983  		if (pta) b->bltadat=*pta++;
 984  		if (ptb) b->bltbdat=*ptb++;
 985  		if (ptc) b->bltcdat=*ptc++;
 986  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
 987  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
 988  		srcc=b->bltcdat;
 989  		b->bltddat=(srcc & ~srca) | (~srcc & ~srcb & srca) | (srcc & srcb);
 990  		b->blitpreva=b->bltadat;
 991  		b->blitprevb=b->bltbdat;
 992  		if (b->bltddat) b->blitzero=0;
 993  		if (ptd) *ptd++=b->bltddat;
 994  	}
 995  	if (b->hblitsize>1) {
 996  		if (pta) b->bltadat=*pta++;
 997  		if (ptb) b->bltbdat=*ptb++;
 998  		if (ptc) b->bltcdat=*ptc++;
 999  		bltaold=b->bltadat & b->bltalwm;
1000  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1001  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1002  		srcc=b->bltcdat;
1003  		b->bltddat=(srcc & ~srca) | (~srcc & ~srcb & srca) | (srcc & srcb);
1004  		b->blitpreva=bltaold;
1005  		b->blitprevb=b->bltbdat;
1006  		if (b->bltddat) b->blitzero=0;
1007  		if (ptd) *ptd++=b->bltddat;
1008  	}
1009  	if (pta) pta+=bltamodw;
1010  	if (ptb) ptb+=bltbmodw;
1011  	if (ptc) ptc+=bltcmodw;
1012  	if (ptd) ptd+=bltdmodw;
1013  }
1014  }
1015  }
1016  void blitdofast_desc_9a(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1017  {
1018  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1019  int i,j;
1020  {
1021  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1022  if (b->hblitsize==1) bltamask&=b->bltalwm;
1023  for (j=0;j<b->vblitsize;j++) {
1024  	if (pta) b->bltadat=*pta--;
1025  	if (ptb) b->bltbdat=*ptb--;
1026  	if (ptc) b->bltcdat=*ptc--;
1027  	bltaold=b->bltadat & bltamask;
1028  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1029  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1030  	srcc=b->bltcdat;
1031  	b->bltddat=(srcc & ~srca) | (~srcc & ~srcb & srca) | (srcc & srcb);
1032  	b->blitpreva=bltaold;
1033  	b->blitprevb=b->bltbdat;
1034  	if (b->bltddat) b->blitzero=0;
1035  	if (ptd) *ptd--=b->bltddat;
1036  	for (i=2;i<b->hblitsize;i++) {
1037  		if (pta) b->bltadat=*pta--;
1038  		if (ptb) b->bltbdat=*ptb--;
1039  		if (ptc) b->bltcdat=*ptc--;
1040  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
1041  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1042  		srcc=b->bltcdat;
1043  		b->bltddat=(srcc & ~srca) | (~srcc & ~srcb & srca) | (srcc & srcb);
1044  		b->blitpreva=b->bltadat;
1045  		b->blitprevb=b->bltbdat;
1046  		if (b->bltddat) b->blitzero=0;
1047  		if (ptd) *ptd--=b->bltddat;
1048  	}
1049  	if (b->hblitsize>1) {
1050  		if (pta) b->bltadat=*pta--;
1051  		if (ptb) b->bltbdat=*ptb--;
1052  		if (ptc) b->bltcdat=*ptc--;
1053  		bltaold=b->bltadat & b->bltalwm;
1054  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1055  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1056  		srcc=b->bltcdat;
1057  		b->bltddat=(srcc & ~srca) | (~srcc & ~srcb & srca) | (srcc & srcb);
1058  		b->blitpreva=bltaold;
1059  		b->blitprevb=b->bltbdat;
1060  		if (b->bltddat) b->blitzero=0;
1061  		if (ptd) *ptd--=b->bltddat;
1062  	}
1063  	if (pta) pta-=bltamodw;
1064  	if (ptb) ptb-=bltbmodw;
1065  	if (ptc) ptc-=bltcmodw;
1066  	if (ptd) ptd-=bltdmodw;
1067  }
1068  }
1069  }
1070  void blitdofast_a8(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1071  {
1072  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1073  int i,j;
1074  {
1075  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1076  if (b->hblitsize==1) bltamask&=b->bltalwm;
1077  for (j=0;j<b->vblitsize;j++) {
1078  	if (pta) b->bltadat=*pta++;
1079  	if (ptb) b->bltbdat=*ptb++;
1080  	if (ptc) b->bltcdat=*ptc++;
1081  	bltaold=b->bltadat & bltamask;
1082  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1083  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1084  	srcc=b->bltcdat;
1085  	b->bltddat=(srcc & srcb) | (srcc & srca);
1086  	b->blitpreva=bltaold;
1087  	b->blitprevb=b->bltbdat;
1088  	if (b->bltddat) b->blitzero=0;
1089  	if (ptd) *ptd++=b->bltddat;
1090  	for (i=2;i<b->hblitsize;i++) {
1091  		if (pta) b->bltadat=*pta++;
1092  		if (ptb) b->bltbdat=*ptb++;
1093  		if (ptc) b->bltcdat=*ptc++;
1094  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
1095  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1096  		srcc=b->bltcdat;
1097  		b->bltddat=(srcc & srcb) | (srcc & srca);
1098  		b->blitpreva=b->bltadat;
1099  		b->blitprevb=b->bltbdat;
1100  		if (b->bltddat) b->blitzero=0;
1101  		if (ptd) *ptd++=b->bltddat;
1102  	}
1103  	if (b->hblitsize>1) {
1104  		if (pta) b->bltadat=*pta++;
1105  		if (ptb) b->bltbdat=*ptb++;
1106  		if (ptc) b->bltcdat=*ptc++;
1107  		bltaold=b->bltadat & b->bltalwm;
1108  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1109  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1110  		srcc=b->bltcdat;
1111  		b->bltddat=(srcc & srcb) | (srcc & srca);
1112  		b->blitpreva=bltaold;
1113  		b->blitprevb=b->bltbdat;
1114  		if (b->bltddat) b->blitzero=0;
1115  		if (ptd) *ptd++=b->bltddat;
1116  	}
1117  	if (pta) pta+=bltamodw;
1118  	if (ptb) ptb+=bltbmodw;
1119  	if (ptc) ptc+=bltcmodw;
1120  	if (ptd) ptd+=bltdmodw;
1121  }
1122  }
1123  }
1124  void blitdofast_desc_a8(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1125  {
1126  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1127  int i,j;
1128  {
1129  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1130  if (b->hblitsize==1) bltamask&=b->bltalwm;
1131  for (j=0;j<b->vblitsize;j++) {
1132  	if (pta) b->bltadat=*pta--;
1133  	if (ptb) b->bltbdat=*ptb--;
1134  	if (ptc) b->bltcdat=*ptc--;
1135  	bltaold=b->bltadat & bltamask;
1136  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1137  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1138  	srcc=b->bltcdat;
1139  	b->bltddat=(srcc & srcb) | (srcc & srca);
1140  	b->blitpreva=bltaold;
1141  	b->blitprevb=b->bltbdat;
1142  	if (b->bltddat) b->blitzero=0;
1143  	if (ptd) *ptd--=b->bltddat;
1144  	for (i=2;i<b->hblitsize;i++) {
1145  		if (pta) b->bltadat=*pta--;
1146  		if (ptb) b->bltbdat=*ptb--;
1147  		if (ptc) b->bltcdat=*ptc--;
1148  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
1149  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1150  		srcc=b->bltcdat;
1151  		b->bltddat=(srcc & srcb) | (srcc & srca);
1152  		b->blitpreva=b->bltadat;
1153  		b->blitprevb=b->bltbdat;
1154  		if (b->bltddat) b->blitzero=0;
1155  		if (ptd) *ptd--=b->bltddat;
1156  	}
1157  	if (b->hblitsize>1) {
1158  		if (pta) b->bltadat=*pta--;
1159  		if (ptb) b->bltbdat=*ptb--;
1160  		if (ptc) b->bltcdat=*ptc--;
1161  		bltaold=b->bltadat & b->bltalwm;
1162  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1163  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1164  		srcc=b->bltcdat;
1165  		b->bltddat=(srcc & srcb) | (srcc & srca);
1166  		b->blitpreva=bltaold;
1167  		b->blitprevb=b->bltbdat;
1168  		if (b->bltddat) b->blitzero=0;
1169  		if (ptd) *ptd--=b->bltddat;
1170  	}
1171  	if (pta) pta-=bltamodw;
1172  	if (ptb) ptb-=bltbmodw;
1173  	if (ptc) ptc-=bltcmodw;
1174  	if (ptd) ptd-=bltdmodw;
1175  }
1176  }
1177  }
1178  void blitdofast_aa(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1179  {
1180  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1181  int i,j;
1182  {
1183  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1184  for (j=0;j<b->vblitsize;j++) {
1185  	for (i=0;i<b->hblitsize;i++) {
1186  		if (ptc) b->bltcdat=*ptc++;
1187  		srcc=b->bltcdat;
1188  		b->bltddat=(srcc);
1189  		if (b->bltddat) b->blitzero=0;
1190  		if (ptd) *ptd++=b->bltddat;
1191  	}
1192  	if (ptc) ptc+=bltcmodw;
1193  	if (ptd) ptd+=bltdmodw;
1194  }
1195  }
1196  }
1197  void blitdofast_desc_aa(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1198  {
1199  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1200  int i,j;
1201  {
1202  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1203  for (j=0;j<b->vblitsize;j++) {
1204  	for (i=0;i<b->hblitsize;i++) {
1205  		if (ptc) b->bltcdat=*ptc--;
1206  		srcc=b->bltcdat;
1207  		b->bltddat=(srcc);
1208  		if (b->bltddat) b->blitzero=0;
1209  		if (ptd) *ptd--=b->bltddat;
1210  	}
1211  	if (ptc) ptc-=bltcmodw;
1212  	if (ptd) ptd-=bltdmodw;
1213  }
1214  }
1215  }
1216  void blitdofast_b1(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1217  {
1218  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1219  int i,j;
1220  {
1221  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1222  if (b->hblitsize==1) bltamask&=b->bltalwm;
1223  for (j=0;j<b->vblitsize;j++) {
1224  	if (pta) b->bltadat=*pta++;
1225  	if (ptb) b->bltbdat=*ptb++;
1226  	if (ptc) b->bltcdat=*ptc++;
1227  	bltaold=b->bltadat & bltamask;
1228  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1229  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1230  	srcc=b->bltcdat;
1231  	b->bltddat=(~srcc & ~srcb) | (~srcb & srca) | (srcc & srca);
1232  	b->blitpreva=bltaold;
1233  	b->blitprevb=b->bltbdat;
1234  	if (b->bltddat) b->blitzero=0;
1235  	if (ptd) *ptd++=b->bltddat;
1236  	for (i=2;i<b->hblitsize;i++) {
1237  		if (pta) b->bltadat=*pta++;
1238  		if (ptb) b->bltbdat=*ptb++;
1239  		if (ptc) b->bltcdat=*ptc++;
1240  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
1241  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1242  		srcc=b->bltcdat;
1243  		b->bltddat=(~srcc & ~srcb) | (~srcb & srca) | (srcc & srca);
1244  		b->blitpreva=b->bltadat;
1245  		b->blitprevb=b->bltbdat;
1246  		if (b->bltddat) b->blitzero=0;
1247  		if (ptd) *ptd++=b->bltddat;
1248  	}
1249  	if (b->hblitsize>1) {
1250  		if (pta) b->bltadat=*pta++;
1251  		if (ptb) b->bltbdat=*ptb++;
1252  		if (ptc) b->bltcdat=*ptc++;
1253  		bltaold=b->bltadat & b->bltalwm;
1254  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1255  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1256  		srcc=b->bltcdat;
1257  		b->bltddat=(~srcc & ~srcb) | (~srcb & srca) | (srcc & srca);
1258  		b->blitpreva=bltaold;
1259  		b->blitprevb=b->bltbdat;
1260  		if (b->bltddat) b->blitzero=0;
1261  		if (ptd) *ptd++=b->bltddat;
1262  	}
1263  	if (pta) pta+=bltamodw;
1264  	if (ptb) ptb+=bltbmodw;
1265  	if (ptc) ptc+=bltcmodw;
1266  	if (ptd) ptd+=bltdmodw;
1267  }
1268  }
1269  }
1270  void blitdofast_desc_b1(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1271  {
1272  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1273  int i,j;
1274  {
1275  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1276  if (b->hblitsize==1) bltamask&=b->bltalwm;
1277  for (j=0;j<b->vblitsize;j++) {
1278  	if (pta) b->bltadat=*pta--;
1279  	if (ptb) b->bltbdat=*ptb--;
1280  	if (ptc) b->bltcdat=*ptc--;
1281  	bltaold=b->bltadat & bltamask;
1282  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1283  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1284  	srcc=b->bltcdat;
1285  	b->bltddat=(~srcc & ~srcb) | (~srcb & srca) | (srcc & srca);
1286  	b->blitpreva=bltaold;
1287  	b->blitprevb=b->bltbdat;
1288  	if (b->bltddat) b->blitzero=0;
1289  	if (ptd) *ptd--=b->bltddat;
1290  	for (i=2;i<b->hblitsize;i++) {
1291  		if (pta) b->bltadat=*pta--;
1292  		if (ptb) b->bltbdat=*ptb--;
1293  		if (ptc) b->bltcdat=*ptc--;
1294  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
1295  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1296  		srcc=b->bltcdat;
1297  		b->bltddat=(~srcc & ~srcb) | (~srcb & srca) | (srcc & srca);
1298  		b->blitpreva=b->bltadat;
1299  		b->blitprevb=b->bltbdat;
1300  		if (b->bltddat) b->blitzero=0;
1301  		if (ptd) *ptd--=b->bltddat;
1302  	}
1303  	if (b->hblitsize>1) {
1304  		if (pta) b->bltadat=*pta--;
1305  		if (ptb) b->bltbdat=*ptb--;
1306  		if (ptc) b->bltcdat=*ptc--;
1307  		bltaold=b->bltadat & b->bltalwm;
1308  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1309  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1310  		srcc=b->bltcdat;
1311  		b->bltddat=(~srcc & ~srcb) | (~srcb & srca) | (srcc & srca);
1312  		b->blitpreva=bltaold;
1313  		b->blitprevb=b->bltbdat;
1314  		if (b->bltddat) b->blitzero=0;
1315  		if (ptd) *ptd--=b->bltddat;
1316  	}
1317  	if (pta) pta-=bltamodw;
1318  	if (ptb) ptb-=bltbmodw;
1319  	if (ptc) ptc-=bltcmodw;
1320  	if (ptd) ptd-=bltdmodw;
1321  }
1322  }
1323  }
1324  void blitdofast_ca(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1325  {
1326  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1327  int i,j;
1328  {
1329  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1330  if (b->hblitsize==1) bltamask&=b->bltalwm;
1331  for (j=0;j<b->vblitsize;j++) {
1332  	if (pta) b->bltadat=*pta++;
1333  	if (ptb) b->bltbdat=*ptb++;
1334  	if (ptc) b->bltcdat=*ptc++;
1335  	bltaold=b->bltadat & bltamask;
1336  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1337  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1338  	srcc=b->bltcdat;
1339  	b->bltddat=(srcc & ~srca) | (srcb & srca);
1340  	b->blitpreva=bltaold;
1341  	b->blitprevb=b->bltbdat;
1342  	if (b->bltddat) b->blitzero=0;
1343  	if (ptd) *ptd++=b->bltddat;
1344  	for (i=2;i<b->hblitsize;i++) {
1345  		if (pta) b->bltadat=*pta++;
1346  		if (ptb) b->bltbdat=*ptb++;
1347  		if (ptc) b->bltcdat=*ptc++;
1348  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
1349  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1350  		srcc=b->bltcdat;
1351  		b->bltddat=(srcc & ~srca) | (srcb & srca);
1352  		b->blitpreva=b->bltadat;
1353  		b->blitprevb=b->bltbdat;
1354  		if (b->bltddat) b->blitzero=0;
1355  		if (ptd) *ptd++=b->bltddat;
1356  	}
1357  	if (b->hblitsize>1) {
1358  		if (pta) b->bltadat=*pta++;
1359  		if (ptb) b->bltbdat=*ptb++;
1360  		if (ptc) b->bltcdat=*ptc++;
1361  		bltaold=b->bltadat & b->bltalwm;
1362  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1363  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1364  		srcc=b->bltcdat;
1365  		b->bltddat=(srcc & ~srca) | (srcb & srca);
1366  		b->blitpreva=bltaold;
1367  		b->blitprevb=b->bltbdat;
1368  		if (b->bltddat) b->blitzero=0;
1369  		if (ptd) *ptd++=b->bltddat;
1370  	}
1371  	if (pta) pta+=bltamodw;
1372  	if (ptb) ptb+=bltbmodw;
1373  	if (ptc) ptc+=bltcmodw;
1374  	if (ptd) ptd+=bltdmodw;
1375  }
1376  }
1377  }
1378  void blitdofast_desc_ca(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1379  {
1380  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1381  int i,j;
1382  {
1383  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1384  if (b->hblitsize==1) bltamask&=b->bltalwm;
1385  for (j=0;j<b->vblitsize;j++) {
1386  	if (pta) b->bltadat=*pta--;
1387  	if (ptb) b->bltbdat=*ptb--;
1388  	if (ptc) b->bltcdat=*ptc--;
1389  	bltaold=b->bltadat & bltamask;
1390  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1391  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1392  	srcc=b->bltcdat;
1393  	b->bltddat=(srcc & ~srca) | (srcb & srca);
1394  	b->blitpreva=bltaold;
1395  	b->blitprevb=b->bltbdat;
1396  	if (b->bltddat) b->blitzero=0;
1397  	if (ptd) *ptd--=b->bltddat;
1398  	for (i=2;i<b->hblitsize;i++) {
1399  		if (pta) b->bltadat=*pta--;
1400  		if (ptb) b->bltbdat=*ptb--;
1401  		if (ptc) b->bltcdat=*ptc--;
1402  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
1403  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1404  		srcc=b->bltcdat;
1405  		b->bltddat=(srcc & ~srca) | (srcb & srca);
1406  		b->blitpreva=b->bltadat;
1407  		b->blitprevb=b->bltbdat;
1408  		if (b->bltddat) b->blitzero=0;
1409  		if (ptd) *ptd--=b->bltddat;
1410  	}
1411  	if (b->hblitsize>1) {
1412  		if (pta) b->bltadat=*pta--;
1413  		if (ptb) b->bltbdat=*ptb--;
1414  		if (ptc) b->bltcdat=*ptc--;
1415  		bltaold=b->bltadat & b->bltalwm;
1416  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1417  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1418  		srcc=b->bltcdat;
1419  		b->bltddat=(srcc & ~srca) | (srcb & srca);
1420  		b->blitpreva=bltaold;
1421  		b->blitprevb=b->bltbdat;
1422  		if (b->bltddat) b->blitzero=0;
1423  		if (ptd) *ptd--=b->bltddat;
1424  	}
1425  	if (pta) pta-=bltamodw;
1426  	if (ptb) ptb-=bltbmodw;
1427  	if (ptc) ptc-=bltcmodw;
1428  	if (ptd) ptd-=bltdmodw;
1429  }
1430  }
1431  }
1432  void blitdofast_cc(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1433  {
1434  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1435  int i,j;
1436  {
1437  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1438  for (j=0;j<b->vblitsize;j++) {
1439  	for (i=0;i<b->hblitsize;i++) {
1440  		if (ptb) b->bltbdat=*ptb++;
1441  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1442  		b->bltddat=(srcb);
1443  		b->blitprevb=b->bltbdat;
1444  		if (b->bltddat) b->blitzero=0;
1445  		if (ptd) *ptd++=b->bltddat;
1446  	}
1447  	if (ptb) ptb+=bltbmodw;
1448  	if (ptd) ptd+=bltdmodw;
1449  }
1450  }
1451  }
1452  void blitdofast_desc_cc(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1453  {
1454  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1455  int i,j;
1456  {
1457  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1458  for (j=0;j<b->vblitsize;j++) {
1459  	for (i=0;i<b->hblitsize;i++) {
1460  		if (ptb) b->bltbdat=*ptb--;
1461  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1462  		b->bltddat=(srcb);
1463  		b->blitprevb=b->bltbdat;
1464  		if (b->bltddat) b->blitzero=0;
1465  		if (ptd) *ptd--=b->bltddat;
1466  	}
1467  	if (ptb) ptb-=bltbmodw;
1468  	if (ptd) ptd-=bltdmodw;
1469  }
1470  }
1471  }
1472  void blitdofast_d8(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1473  {
1474  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1475  int i,j;
1476  {
1477  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1478  if (b->hblitsize==1) bltamask&=b->bltalwm;
1479  for (j=0;j<b->vblitsize;j++) {
1480  	if (pta) b->bltadat=*pta++;
1481  	if (ptb) b->bltbdat=*ptb++;
1482  	if (ptc) b->bltcdat=*ptc++;
1483  	bltaold=b->bltadat & bltamask;
1484  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1485  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1486  	srcc=b->bltcdat;
1487  	b->bltddat=(srcc & srcb) | (~srcc & srca);
1488  	b->blitpreva=bltaold;
1489  	b->blitprevb=b->bltbdat;
1490  	if (b->bltddat) b->blitzero=0;
1491  	if (ptd) *ptd++=b->bltddat;
1492  	for (i=2;i<b->hblitsize;i++) {
1493  		if (pta) b->bltadat=*pta++;
1494  		if (ptb) b->bltbdat=*ptb++;
1495  		if (ptc) b->bltcdat=*ptc++;
1496  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
1497  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1498  		srcc=b->bltcdat;
1499  		b->bltddat=(srcc & srcb) | (~srcc & srca);
1500  		b->blitpreva=b->bltadat;
1501  		b->blitprevb=b->bltbdat;
1502  		if (b->bltddat) b->blitzero=0;
1503  		if (ptd) *ptd++=b->bltddat;
1504  	}
1505  	if (b->hblitsize>1) {
1506  		if (pta) b->bltadat=*pta++;
1507  		if (ptb) b->bltbdat=*ptb++;
1508  		if (ptc) b->bltcdat=*ptc++;
1509  		bltaold=b->bltadat & b->bltalwm;
1510  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1511  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1512  		srcc=b->bltcdat;
1513  		b->bltddat=(srcc & srcb) | (~srcc & srca);
1514  		b->blitpreva=bltaold;
1515  		b->blitprevb=b->bltbdat;
1516  		if (b->bltddat) b->blitzero=0;
1517  		if (ptd) *ptd++=b->bltddat;
1518  	}
1519  	if (pta) pta+=bltamodw;
1520  	if (ptb) ptb+=bltbmodw;
1521  	if (ptc) ptc+=bltcmodw;
1522  	if (ptd) ptd+=bltdmodw;
1523  }
1524  }
1525  }
1526  void blitdofast_desc_d8(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1527  {
1528  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1529  int i,j;
1530  {
1531  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1532  if (b->hblitsize==1) bltamask&=b->bltalwm;
1533  for (j=0;j<b->vblitsize;j++) {
1534  	if (pta) b->bltadat=*pta--;
1535  	if (ptb) b->bltbdat=*ptb--;
1536  	if (ptc) b->bltcdat=*ptc--;
1537  	bltaold=b->bltadat & bltamask;
1538  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1539  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1540  	srcc=b->bltcdat;
1541  	b->bltddat=(srcc & srcb) | (~srcc & srca);
1542  	b->blitpreva=bltaold;
1543  	b->blitprevb=b->bltbdat;
1544  	if (b->bltddat) b->blitzero=0;
1545  	if (ptd) *ptd--=b->bltddat;
1546  	for (i=2;i<b->hblitsize;i++) {
1547  		if (pta) b->bltadat=*pta--;
1548  		if (ptb) b->bltbdat=*ptb--;
1549  		if (ptc) b->bltcdat=*ptc--;
1550  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
1551  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1552  		srcc=b->bltcdat;
1553  		b->bltddat=(srcc & srcb) | (~srcc & srca);
1554  		b->blitpreva=b->bltadat;
1555  		b->blitprevb=b->bltbdat;
1556  		if (b->bltddat) b->blitzero=0;
1557  		if (ptd) *ptd--=b->bltddat;
1558  	}
1559  	if (b->hblitsize>1) {
1560  		if (pta) b->bltadat=*pta--;
1561  		if (ptb) b->bltbdat=*ptb--;
1562  		if (ptc) b->bltcdat=*ptc--;
1563  		bltaold=b->bltadat & b->bltalwm;
1564  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1565  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1566  		srcc=b->bltcdat;
1567  		b->bltddat=(srcc & srcb) | (~srcc & srca);
1568  		b->blitpreva=bltaold;
1569  		b->blitprevb=b->bltbdat;
1570  		if (b->bltddat) b->blitzero=0;
1571  		if (ptd) *ptd--=b->bltddat;
1572  	}
1573  	if (pta) pta-=bltamodw;
1574  	if (ptb) ptb-=bltbmodw;
1575  	if (ptc) ptc-=bltcmodw;
1576  	if (ptd) ptd-=bltdmodw;
1577  }
1578  }
1579  }
1580  void blitdofast_e2(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1581  {
1582  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1583  int i,j;
1584  {
1585  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1586  if (b->hblitsize==1) bltamask&=b->bltalwm;
1587  for (j=0;j<b->vblitsize;j++) {
1588  	if (pta) b->bltadat=*pta++;
1589  	if (ptb) b->bltbdat=*ptb++;
1590  	if (ptc) b->bltcdat=*ptc++;
1591  	bltaold=b->bltadat & bltamask;
1592  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1593  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1594  	srcc=b->bltcdat;
1595  	b->bltddat=(srcc & ~srcb) | (srcb & srca);
1596  	b->blitpreva=bltaold;
1597  	b->blitprevb=b->bltbdat;
1598  	if (b->bltddat) b->blitzero=0;
1599  	if (ptd) *ptd++=b->bltddat;
1600  	for (i=2;i<b->hblitsize;i++) {
1601  		if (pta) b->bltadat=*pta++;
1602  		if (ptb) b->bltbdat=*ptb++;
1603  		if (ptc) b->bltcdat=*ptc++;
1604  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
1605  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1606  		srcc=b->bltcdat;
1607  		b->bltddat=(srcc & ~srcb) | (srcb & srca);
1608  		b->blitpreva=b->bltadat;
1609  		b->blitprevb=b->bltbdat;
1610  		if (b->bltddat) b->blitzero=0;
1611  		if (ptd) *ptd++=b->bltddat;
1612  	}
1613  	if (b->hblitsize>1) {
1614  		if (pta) b->bltadat=*pta++;
1615  		if (ptb) b->bltbdat=*ptb++;
1616  		if (ptc) b->bltcdat=*ptc++;
1617  		bltaold=b->bltadat & b->bltalwm;
1618  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1619  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1620  		srcc=b->bltcdat;
1621  		b->bltddat=(srcc & ~srcb) | (srcb & srca);
1622  		b->blitpreva=bltaold;
1623  		b->blitprevb=b->bltbdat;
1624  		if (b->bltddat) b->blitzero=0;
1625  		if (ptd) *ptd++=b->bltddat;
1626  	}
1627  	if (pta) pta+=bltamodw;
1628  	if (ptb) ptb+=bltbmodw;
1629  	if (ptc) ptc+=bltcmodw;
1630  	if (ptd) ptd+=bltdmodw;
1631  }
1632  }
1633  }
1634  void blitdofast_desc_e2(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1635  {
1636  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1637  int i,j;
1638  {
1639  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1640  if (b->hblitsize==1) bltamask&=b->bltalwm;
1641  for (j=0;j<b->vblitsize;j++) {
1642  	if (pta) b->bltadat=*pta--;
1643  	if (ptb) b->bltbdat=*ptb--;
1644  	if (ptc) b->bltcdat=*ptc--;
1645  	bltaold=b->bltadat & bltamask;
1646  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1647  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1648  	srcc=b->bltcdat;
1649  	b->bltddat=(srcc & ~srcb) | (srcb & srca);
1650  	b->blitpreva=bltaold;
1651  	b->blitprevb=b->bltbdat;
1652  	if (b->bltddat) b->blitzero=0;
1653  	if (ptd) *ptd--=b->bltddat;
1654  	for (i=2;i<b->hblitsize;i++) {
1655  		if (pta) b->bltadat=*pta--;
1656  		if (ptb) b->bltbdat=*ptb--;
1657  		if (ptc) b->bltcdat=*ptc--;
1658  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
1659  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1660  		srcc=b->bltcdat;
1661  		b->bltddat=(srcc & ~srcb) | (srcb & srca);
1662  		b->blitpreva=b->bltadat;
1663  		b->blitprevb=b->bltbdat;
1664  		if (b->bltddat) b->blitzero=0;
1665  		if (ptd) *ptd--=b->bltddat;
1666  	}
1667  	if (b->hblitsize>1) {
1668  		if (pta) b->bltadat=*pta--;
1669  		if (ptb) b->bltbdat=*ptb--;
1670  		if (ptc) b->bltcdat=*ptc--;
1671  		bltaold=b->bltadat & b->bltalwm;
1672  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1673  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1674  		srcc=b->bltcdat;
1675  		b->bltddat=(srcc & ~srcb) | (srcb & srca);
1676  		b->blitpreva=bltaold;
1677  		b->blitprevb=b->bltbdat;
1678  		if (b->bltddat) b->blitzero=0;
1679  		if (ptd) *ptd--=b->bltddat;
1680  	}
1681  	if (pta) pta-=bltamodw;
1682  	if (ptb) ptb-=bltbmodw;
1683  	if (ptc) ptc-=bltcmodw;
1684  	if (ptd) ptd-=bltdmodw;
1685  }
1686  }
1687  }
1688  void blitdofast_ea(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1689  {
1690  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1691  int i,j;
1692  {
1693  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1694  if (b->hblitsize==1) bltamask&=b->bltalwm;
1695  for (j=0;j<b->vblitsize;j++) {
1696  	if (pta) b->bltadat=*pta++;
1697  	if (ptb) b->bltbdat=*ptb++;
1698  	if (ptc) b->bltcdat=*ptc++;
1699  	bltaold=b->bltadat & bltamask;
1700  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1701  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1702  	srcc=b->bltcdat;
1703  	b->bltddat=(srcc) | (srcb & srca);
1704  	b->blitpreva=bltaold;
1705  	b->blitprevb=b->bltbdat;
1706  	if (b->bltddat) b->blitzero=0;
1707  	if (ptd) *ptd++=b->bltddat;
1708  	for (i=2;i<b->hblitsize;i++) {
1709  		if (pta) b->bltadat=*pta++;
1710  		if (ptb) b->bltbdat=*ptb++;
1711  		if (ptc) b->bltcdat=*ptc++;
1712  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
1713  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1714  		srcc=b->bltcdat;
1715  		b->bltddat=(srcc) | (srcb & srca);
1716  		b->blitpreva=b->bltadat;
1717  		b->blitprevb=b->bltbdat;
1718  		if (b->bltddat) b->blitzero=0;
1719  		if (ptd) *ptd++=b->bltddat;
1720  	}
1721  	if (b->hblitsize>1) {
1722  		if (pta) b->bltadat=*pta++;
1723  		if (ptb) b->bltbdat=*ptb++;
1724  		if (ptc) b->bltcdat=*ptc++;
1725  		bltaold=b->bltadat & b->bltalwm;
1726  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1727  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1728  		srcc=b->bltcdat;
1729  		b->bltddat=(srcc) | (srcb & srca);
1730  		b->blitpreva=bltaold;
1731  		b->blitprevb=b->bltbdat;
1732  		if (b->bltddat) b->blitzero=0;
1733  		if (ptd) *ptd++=b->bltddat;
1734  	}
1735  	if (pta) pta+=bltamodw;
1736  	if (ptb) ptb+=bltbmodw;
1737  	if (ptc) ptc+=bltcmodw;
1738  	if (ptd) ptd+=bltdmodw;
1739  }
1740  }
1741  }
1742  void blitdofast_desc_ea(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1743  {
1744  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1745  int i,j;
1746  {
1747  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1748  if (b->hblitsize==1) bltamask&=b->bltalwm;
1749  for (j=0;j<b->vblitsize;j++) {
1750  	if (pta) b->bltadat=*pta--;
1751  	if (ptb) b->bltbdat=*ptb--;
1752  	if (ptc) b->bltcdat=*ptc--;
1753  	bltaold=b->bltadat & bltamask;
1754  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1755  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1756  	srcc=b->bltcdat;
1757  	b->bltddat=(srcc) | (srcb & srca);
1758  	b->blitpreva=bltaold;
1759  	b->blitprevb=b->bltbdat;
1760  	if (b->bltddat) b->blitzero=0;
1761  	if (ptd) *ptd--=b->bltddat;
1762  	for (i=2;i<b->hblitsize;i++) {
1763  		if (pta) b->bltadat=*pta--;
1764  		if (ptb) b->bltbdat=*ptb--;
1765  		if (ptc) b->bltcdat=*ptc--;
1766  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
1767  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1768  		srcc=b->bltcdat;
1769  		b->bltddat=(srcc) | (srcb & srca);
1770  		b->blitpreva=b->bltadat;
1771  		b->blitprevb=b->bltbdat;
1772  		if (b->bltddat) b->blitzero=0;
1773  		if (ptd) *ptd--=b->bltddat;
1774  	}
1775  	if (b->hblitsize>1) {
1776  		if (pta) b->bltadat=*pta--;
1777  		if (ptb) b->bltbdat=*ptb--;
1778  		if (ptc) b->bltcdat=*ptc--;
1779  		bltaold=b->bltadat & b->bltalwm;
1780  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1781  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
1782  		srcc=b->bltcdat;
1783  		b->bltddat=(srcc) | (srcb & srca);
1784  		b->blitpreva=bltaold;
1785  		b->blitprevb=b->bltbdat;
1786  		if (b->bltddat) b->blitzero=0;
1787  		if (ptd) *ptd--=b->bltddat;
1788  	}
1789  	if (pta) pta-=bltamodw;
1790  	if (ptb) ptb-=bltbmodw;
1791  	if (ptc) ptc-=bltcmodw;
1792  	if (ptd) ptd-=bltdmodw;
1793  }
1794  }
1795  }
1796  void blitdofast_f0(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1797  {
1798  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1799  int i,j;
1800  {
1801  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1802  if (b->hblitsize==1) bltamask&=b->bltalwm;
1803  for (j=0;j<b->vblitsize;j++) {
1804  	if (pta) b->bltadat=*pta++;
1805  	bltaold=b->bltadat & bltamask;
1806  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1807  	b->bltddat=(srca);
1808  	b->blitpreva=bltaold;
1809  	if (b->bltddat) b->blitzero=0;
1810  	if (ptd) *ptd++=b->bltddat;
1811  	for (i=2;i<b->hblitsize;i++) {
1812  		if (pta) b->bltadat=*pta++;
1813  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
1814  		b->bltddat=(srca);
1815  		b->blitpreva=b->bltadat;
1816  		if (b->bltddat) b->blitzero=0;
1817  		if (ptd) *ptd++=b->bltddat;
1818  	}
1819  	if (b->hblitsize>1) {
1820  		if (pta) b->bltadat=*pta++;
1821  		bltaold=b->bltadat & b->bltalwm;
1822  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1823  		b->bltddat=(srca);
1824  		b->blitpreva=bltaold;
1825  		if (b->bltddat) b->blitzero=0;
1826  		if (ptd) *ptd++=b->bltddat;
1827  	}
1828  	if (pta) pta+=bltamodw;
1829  	if (ptd) ptd+=bltdmodw;
1830  }
1831  }
1832  }
1833  void blitdofast_desc_f0(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1834  {
1835  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1836  int i,j;
1837  {
1838  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1839  if (b->hblitsize==1) bltamask&=b->bltalwm;
1840  for (j=0;j<b->vblitsize;j++) {
1841  	if (pta) b->bltadat=*pta--;
1842  	bltaold=b->bltadat & bltamask;
1843  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1844  	b->bltddat=(srca);
1845  	b->blitpreva=bltaold;
1846  	if (b->bltddat) b->blitzero=0;
1847  	if (ptd) *ptd--=b->bltddat;
1848  	for (i=2;i<b->hblitsize;i++) {
1849  		if (pta) b->bltadat=*pta--;
1850  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
1851  		b->bltddat=(srca);
1852  		b->blitpreva=b->bltadat;
1853  		if (b->bltddat) b->blitzero=0;
1854  		if (ptd) *ptd--=b->bltddat;
1855  	}
1856  	if (b->hblitsize>1) {
1857  		if (pta) b->bltadat=*pta--;
1858  		bltaold=b->bltadat & b->bltalwm;
1859  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1860  		b->bltddat=(srca);
1861  		b->blitpreva=bltaold;
1862  		if (b->bltddat) b->blitzero=0;
1863  		if (ptd) *ptd--=b->bltddat;
1864  	}
1865  	if (pta) pta-=bltamodw;
1866  	if (ptd) ptd-=bltdmodw;
1867  }
1868  }
1869  }
1870  void blitdofast_fa(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1871  {
1872  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1873  int i,j;
1874  {
1875  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1876  if (b->hblitsize==1) bltamask&=b->bltalwm;
1877  for (j=0;j<b->vblitsize;j++) {
1878  	if (pta) b->bltadat=*pta++;
1879  	if (ptc) b->bltcdat=*ptc++;
1880  	bltaold=b->bltadat & bltamask;
1881  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1882  	srcc=b->bltcdat;
1883  	b->bltddat=(srcc) | (srca);
1884  	b->blitpreva=bltaold;
1885  	if (b->bltddat) b->blitzero=0;
1886  	if (ptd) *ptd++=b->bltddat;
1887  	for (i=2;i<b->hblitsize;i++) {
1888  		if (pta) b->bltadat=*pta++;
1889  		if (ptc) b->bltcdat=*ptc++;
1890  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
1891  		srcc=b->bltcdat;
1892  		b->bltddat=(srcc) | (srca);
1893  		b->blitpreva=b->bltadat;
1894  		if (b->bltddat) b->blitzero=0;
1895  		if (ptd) *ptd++=b->bltddat;
1896  	}
1897  	if (b->hblitsize>1) {
1898  		if (pta) b->bltadat=*pta++;
1899  		if (ptc) b->bltcdat=*ptc++;
1900  		bltaold=b->bltadat & b->bltalwm;
1901  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1902  		srcc=b->bltcdat;
1903  		b->bltddat=(srcc) | (srca);
1904  		b->blitpreva=bltaold;
1905  		if (b->bltddat) b->blitzero=0;
1906  		if (ptd) *ptd++=b->bltddat;
1907  	}
1908  	if (pta) pta+=bltamodw;
1909  	if (ptc) ptc+=bltcmodw;
1910  	if (ptd) ptd+=bltdmodw;
1911  }
1912  }
1913  }
1914  void blitdofast_desc_fa(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1915  {
1916  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1917  int i,j;
1918  {
1919  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1920  if (b->hblitsize==1) bltamask&=b->bltalwm;
1921  for (j=0;j<b->vblitsize;j++) {
1922  	if (pta) b->bltadat=*pta--;
1923  	if (ptc) b->bltcdat=*ptc--;
1924  	bltaold=b->bltadat & bltamask;
1925  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1926  	srcc=b->bltcdat;
1927  	b->bltddat=(srcc) | (srca);
1928  	b->blitpreva=bltaold;
1929  	if (b->bltddat) b->blitzero=0;
1930  	if (ptd) *ptd--=b->bltddat;
1931  	for (i=2;i<b->hblitsize;i++) {
1932  		if (pta) b->bltadat=*pta--;
1933  		if (ptc) b->bltcdat=*ptc--;
1934  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
1935  		srcc=b->bltcdat;
1936  		b->bltddat=(srcc) | (srca);
1937  		b->blitpreva=b->bltadat;
1938  		if (b->bltddat) b->blitzero=0;
1939  		if (ptd) *ptd--=b->bltddat;
1940  	}
1941  	if (b->hblitsize>1) {
1942  		if (pta) b->bltadat=*pta--;
1943  		if (ptc) b->bltcdat=*ptc--;
1944  		bltaold=b->bltadat & b->bltalwm;
1945  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
1946  		srcc=b->bltcdat;
1947  		b->bltddat=(srcc) | (srca);
1948  		b->blitpreva=bltaold;
1949  		if (b->bltddat) b->blitzero=0;
1950  		if (ptd) *ptd--=b->bltddat;
1951  	}
1952  	if (pta) pta-=bltamodw;
1953  	if (ptc) ptc-=bltcmodw;
1954  	if (ptd) ptd-=bltdmodw;
1955  }
1956  }
1957  }
1958  void blitdofast_fc(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
1959  {
1960  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
1961  int i,j;
1962  {
1963  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
1964  if (b->hblitsize==1) bltamask&=b->bltalwm;
1965  for (j=0;j<b->vblitsize;j++) {
1966  	if (pta) b->bltadat=*pta++;
1967  	if (ptb) b->bltbdat=*ptb++;
1968  	bltaold=b->bltadat & bltamask;
1969  	srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1970  	srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1971  	b->bltddat=(srcb) | (srca);
1972  	b->blitpreva=bltaold;
1973  	b->blitprevb=b->bltbdat;
1974  	if (b->bltddat) b->blitzero=0;
1975  	if (ptd) *ptd++=b->bltddat;
1976  	for (i=2;i<b->hblitsize;i++) {
1977  		if (pta) b->bltadat=*pta++;
1978  		if (ptb) b->bltbdat=*ptb++;
1979  		srca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;
1980  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1981  		b->bltddat=(srcb) | (srca);
1982  		b->blitpreva=b->bltadat;
1983  		b->blitprevb=b->bltbdat;
1984  		if (b->bltddat) b->blitzero=0;
1985  		if (ptd) *ptd++=b->bltddat;
1986  	}
1987  	if (b->hblitsize>1) {
1988  		if (pta) b->bltadat=*pta++;
1989  		if (ptb) b->bltbdat=*ptb++;
1990  		bltaold=b->bltadat & b->bltalwm;
1991  		srca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;
1992  		srcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;
1993  		b->bltddat=(srcb) | (srca);
1994  		b->blitpreva=bltaold;
1995  		b->blitprevb=b->bltbdat;
1996  		if (b->bltddat) b->blitzero=0;
1997  		if (ptd) *ptd++=b->bltddat;
1998  	}
1999  	if (pta) pta+=bltamodw;
2000  	if (ptb) ptb+=bltbmodw;
2001  	if (ptd) ptd+=bltdmodw;
2002  }
2003  }
2004  }
2005  void blitdofast_desc_fc(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)
2006  {
2007  WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;
2008  int i,j;
2009  {
2010  UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;
2011  if (b->hblitsize==1) bltamask&=b->bltalwm;
2012  for (j=0;j<b->vblitsize;j++) {
2013  	if (pta) b->bltadat=*pta--;
2014  	if (ptb) b->bltbdat=*ptb--;
2015  	bltaold=b->bltadat & bltamask;
2016  	srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
2017  	srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
2018  	b->bltddat=(srcb) | (srca);
2019  	b->blitpreva=bltaold;
2020  	b->blitprevb=b->bltbdat;
2021  	if (b->bltddat) b->blitzero=0;
2022  	if (ptd) *ptd--=b->bltddat;
2023  	for (i=2;i<b->hblitsize;i++) {
2024  		if (pta) b->bltadat=*pta--;
2025  		if (ptb) b->bltbdat=*ptb--;
2026  		srca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);
2027  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
2028  		b->bltddat=(srcb) | (srca);
2029  		b->blitpreva=b->bltadat;
2030  		b->blitprevb=b->bltbdat;
2031  		if (b->bltddat) b->blitzero=0;
2032  		if (ptd) *ptd--=b->bltddat;
2033  	}
2034  	if (b->hblitsize>1) {
2035  		if (pta) b->bltadat=*pta--;
2036  		if (ptb) b->bltbdat=*ptb--;
2037  		bltaold=b->bltadat & b->bltalwm;
2038  		srca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);
2039  		srcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);
2040  		b->bltddat=(srcb) | (srca);
2041  		b->blitpreva=bltaold;
2042  		b->blitprevb=b->bltbdat;
2043  		if (b->bltddat) b->blitzero=0;
2044  		if (ptd) *ptd--=b->bltddat;
2045  	}
2046  	if (pta) pta-=bltamodw;
2047  	if (ptb) ptb-=bltbmodw;
2048  	if (ptd) ptd-=bltdmodw;
2049  }
2050  }
2051  }