--- uae/src/blitter.c 2018/04/24 16:38:39 1.1 +++ uae/src/blitter.c 2018/04/24 16:42:15 1.1.1.4 @@ -1,8 +1,8 @@ /* * UAE - The Un*x Amiga Emulator - * + * * Custom chip emulation - * + * * (c) 1995 Bernd Schmidt, Alessandro Bissacco */ @@ -12,39 +12,46 @@ #include "config.h" #include "options.h" #include "events.h" +#include "uae.h" #include "memory.h" #include "custom.h" +#include "readcpu.h" #include "newcpu.h" #include "blitter.h" #include "blit.h" -UWORD bltsize, oldvblts; -UWORD bltcon0,bltcon1; -ULONG bltapt,bltbpt,bltcpt,bltdpt; +uae_u16 bltsize, oldvblts; +uae_u16 bltcon0,bltcon1; +uae_u32 bltapt,bltbpt,bltcpt,bltdpt; int blinea_shift; -static UWORD blitlpos, blinea, blineb; -static CPTR bltcnxlpt,bltdnxlpt; +static uae_u16 blitlpos, blinea, blineb; +static uaecptr bltcnxlpt,bltdnxlpt; static int blitline,blitfc,blitfill,blitife,blitdesc,blitsing; static int blitonedot,blitsign; static long int bltwait; struct bltinfo blt_info; -static UBYTE blit_filltable[256][4][2]; - +static uae_u8 blit_filltable[256][4][2]; +uae_u32 blit_masktable[BLITTER_MAX_WORDS]; +static uae_u16 blit_trashtable[BLITTER_MAX_WORDS]; enum blitter_states bltstate; void build_blitfilltable(void) { unsigned int d, fillmask; int i; + + for (i = 0; i < BLITTER_MAX_WORDS; i++) + blit_masktable[i] = 0xFFFF; + for (d = 0; d < 256; d++) { for (i = 0; i < 4; i++) { int fc = i & 1; - UBYTE data = d; + uae_u8 data = d; for (fillmask = 1; fillmask != 0x100; fillmask <<= 1) { - UWORD tmp = data; + uae_u16 tmp = data; if (fc) { if (i & 2) data |= fillmask; @@ -59,25 +66,27 @@ void build_blitfilltable(void) } } -static __inline__ UBYTE *blit_xlateptr(CPTR bltpt, int bytecount) +static __inline__ uae_u8 *blit_xlateptr(uaecptr bltpt, int bytecount) { if (!chipmem_bank.check(bltpt,bytecount)) return NULL; return chipmem_bank.xlateaddr(bltpt); } -static __inline__ UBYTE *blit_xlateptr_desc(CPTR bltpt, int bytecount) +static __inline__ uae_u8 *blit_xlateptr_desc(uaecptr bltpt, int bytecount) { if (!chipmem_bank.check(bltpt-bytecount, bytecount)) return NULL; return chipmem_bank.xlateaddr(bltpt); } -static void blitter_dofast(void) +static void blitter_dofast(void) { int i,j; - UBYTE *bltadatpt = 0, *bltbdatpt = 0, *bltcdatpt = 0, *bltddatpt = 0; - UWORD blitahold, blitbhold, bltaold; - UBYTE mt = bltcon0 & 0xFF; - + uae_u8 *bltadatpt = 0, *bltbdatpt = 0, *bltcdatpt = 0, *bltddatpt = 0; + uae_u8 mt = bltcon0 & 0xFF; + + blit_masktable[0] = blt_info.bltafwm; + blit_masktable[blt_info.hblitsize - 1] &= blt_info.bltalwm; + if (bltcon0 & 0x800) { bltadatpt = blit_xlateptr(bltapt, (blt_info.hblitsize*2+blt_info.bltamod)*blt_info.vblitsize); bltapt += (blt_info.hblitsize*2+blt_info.bltamod)*blt_info.vblitsize; @@ -94,51 +103,74 @@ static void blitter_dofast(void) bltddatpt = blit_xlateptr(bltdpt, (blt_info.hblitsize*2+blt_info.bltdmod)*blt_info.vblitsize); bltdpt += (blt_info.hblitsize*2+blt_info.bltdmod)*blt_info.vblitsize; } - - if (blitfunc_dofast[mt] && !blitfill) - (*blitfunc_dofast[mt])(bltadatpt,bltbdatpt,bltcdatpt,bltddatpt,&blt_info); + + if (blitfunc_dofast[mt] && !blitfill) + (*blitfunc_dofast[mt])(bltadatpt,bltbdatpt,bltcdatpt,bltddatpt,&blt_info); else { + uae_u32 blitbhold = blt_info.bltbhold; + uae_u32 preva = 0, prevb = 0; + uae_u16 foo, *dstp = &foo; + /*if (!blitfill) fprintf(stderr, "minterm %x not present\n",mt); */ - for (j = 0; j < blt_info.vblitsize; j++) { + for (j = 0; j < blt_info.vblitsize; j++) { blitfc = !!(bltcon1 & 0x4); for (i = 0; i < blt_info.hblitsize; i++) { - if (bltadatpt) { blt_info.bltadat = (*bltadatpt << 8) | *(bltadatpt + 1); bltadatpt += 2; } - if (bltbdatpt) { blt_info.bltbdat = (*bltbdatpt << 8) | *(bltbdatpt + 1); bltbdatpt += 2; } - if (bltcdatpt) { blt_info.bltcdat = (*bltcdatpt << 8) | *(bltcdatpt + 1); bltcdatpt += 2; } - bltaold = blt_info.bltadat; - if (i == 0) bltaold &= blt_info.bltafwm; - if (i== blt_info.hblitsize-1) bltaold &= blt_info.bltalwm; - blitahold = (((ULONG)blt_info.blitpreva << 16) | bltaold) >> blt_info.blitashift; - blitbhold = (((ULONG)blt_info.blitprevb << 16) | blt_info.bltbdat) >> blt_info.blitbshift; - blt_info.bltddat = blit_func(blitahold, blitbhold, blt_info.bltcdat, mt); - if (blitfill) { - UWORD d = blt_info.bltddat; + uae_u32 bltadat, blitahold; + if (bltadatpt) { + bltadat = do_get_mem_word((uae_u16 *)bltadatpt); bltadatpt += 2; + } else + bltadat = blt_info.bltadat; + bltadat &= blit_masktable[i]; + blitahold = (((uae_u32)preva << 16) | bltadat) >> blt_info.blitashift; + preva = bltadat; + + if (bltbdatpt) { + uae_u16 bltbdat = do_get_mem_word((uae_u16 *)bltbdatpt); bltbdatpt += 2; + blitbhold = (((uae_u32)prevb << 16) | bltbdat) >> blt_info.blitbshift; + prevb = bltbdat; + } + if (bltcdatpt) { + blt_info.bltcdat = do_get_mem_word((uae_u16 *)bltcdatpt); bltcdatpt += 2; + } + do_put_mem_word(dstp, blt_info.bltddat); + blt_info.bltddat = blit_func(blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF; + if (blitfill) { + uae_u16 d = blt_info.bltddat; int ifemode = blitife ? 2 : 0; int fc1 = blit_filltable[d & 255][ifemode + blitfc][1]; - blt_info.bltddat = (blit_filltable[d & 255][ifemode + blitfc][0] + blt_info.bltddat = (blit_filltable[d & 255][ifemode + blitfc][0] + (blit_filltable[d >> 8][ifemode + fc1][0] << 8)); blitfc = blit_filltable[d >> 8][ifemode + fc1][1]; } - blt_info.blitpreva = bltaold; blt_info.blitprevb = blt_info.bltbdat; - if (blt_info.bltddat) blt_info.blitzero = 0; - if (bltddatpt) { *bltddatpt = blt_info.bltddat >> 8; *(bltddatpt+1) = blt_info.bltddat; bltddatpt += 2; } + if (blt_info.bltddat) blt_info.blitzero = 0; + if (bltddatpt) { + dstp = (uae_u16 *)bltddatpt; + bltddatpt += 2; + } } if (bltadatpt) bltadatpt += blt_info.bltamod; if (bltbdatpt) bltbdatpt += blt_info.bltbmod; if (bltcdatpt) bltcdatpt += blt_info.bltcmod; if (bltddatpt) bltddatpt += blt_info.bltdmod; - } + } + do_put_mem_word(dstp, blt_info.bltddat); + blt_info.bltbhold = blitbhold; } + blit_masktable[0] = 0xFFFF; + blit_masktable[blt_info.hblitsize - 1] = 0xFFFF; + bltstate = BLT_done; } -static void blitter_dofast_desc(void) +static void blitter_dofast_desc(void) { int i,j; - UBYTE *bltadatpt = 0, *bltbdatpt = 0, *bltcdatpt = 0, *bltddatpt = 0; - UWORD blitahold, blitbhold, bltaold; - UBYTE mt = bltcon0 & 0xFF; - + uae_u8 *bltadatpt = 0, *bltbdatpt = 0, *bltcdatpt = 0, *bltddatpt = 0; + uae_u8 mt = bltcon0 & 0xFF; + + blit_masktable[0] = blt_info.bltafwm; + blit_masktable[blt_info.hblitsize - 1] &= blt_info.bltalwm; + if (bltcon0 & 0x800) { bltadatpt = blit_xlateptr_desc(bltapt, (blt_info.hblitsize*2+blt_info.bltamod)*blt_info.vblitsize); bltapt -= (blt_info.hblitsize*2+blt_info.bltamod)*blt_info.vblitsize; @@ -155,40 +187,60 @@ static void blitter_dofast_desc(void) bltddatpt = blit_xlateptr_desc(bltdpt, (blt_info.hblitsize*2+blt_info.bltdmod)*blt_info.vblitsize); bltdpt -= (blt_info.hblitsize*2+blt_info.bltdmod)*blt_info.vblitsize; } - if (blitfunc_dofast_desc[mt] && !blitfill) + if (blitfunc_dofast_desc[mt] && !blitfill) (*blitfunc_dofast_desc[mt])(bltadatpt,bltbdatpt,bltcdatpt,bltddatpt,&blt_info); else { + uae_u32 blitbhold = blt_info.bltbhold; + uae_u32 preva = 0, prevb = 0; + uae_u16 foo, *dstp = &foo; + /* if (!blitfill) fprintf(stderr, "minterm %x not present\n",mt);*/ - for (j = 0; j < blt_info.vblitsize; j++) { + for (j = 0; j < blt_info.vblitsize; j++) { blitfc = !!(bltcon1 & 0x4); for (i = 0; i < blt_info.hblitsize; i++) { - if (bltadatpt) { blt_info.bltadat = (*bltadatpt << 8) | *(bltadatpt + 1); bltadatpt -= 2; } - if (bltbdatpt) { blt_info.bltbdat = (*bltbdatpt << 8) | *(bltbdatpt + 1); bltbdatpt -= 2; } - if (bltcdatpt) { blt_info.bltcdat = (*bltcdatpt << 8) | *(bltcdatpt + 1); bltcdatpt -= 2; } - bltaold = blt_info.bltadat; - if (i == 0) bltaold &= blt_info.bltafwm; - if (i== blt_info.hblitsize-1) bltaold &= blt_info.bltalwm; - blitahold = (((ULONG)bltaold << 16) | blt_info.blitpreva) >> (16-blt_info.blitashift); - blitbhold = (((ULONG)blt_info.bltbdat << 16) | blt_info.blitprevb) >> (16-blt_info.blitbshift); - blt_info.bltddat = blit_func(blitahold, blitbhold, blt_info.bltcdat, mt); - if (blitfill) { - UWORD d = blt_info.bltddat; + uae_u32 bltadat, blitahold; + if (bltadatpt) { + bltadat = do_get_mem_word((uae_u16 *)bltadatpt); bltadatpt -= 2; + } else + bltadat = blt_info.bltadat; + bltadat &= blit_masktable[i]; + blitahold = (((uae_u32)bltadat << 16) | preva) >> blt_info.blitdownashift; + preva = bltadat; + if (bltbdatpt) { + uae_u16 bltbdat = do_get_mem_word((uae_u16 *)bltbdatpt); bltbdatpt -= 2; + blitbhold = (((uae_u32)bltbdat << 16) | prevb) >> blt_info.blitdownbshift; + prevb = bltbdat; + } + if (bltcdatpt) { + blt_info.bltcdat = do_get_mem_word((uae_u16 *)bltcdatpt); bltcdatpt -= 2; + } + do_put_mem_word(dstp, blt_info.bltddat); + blt_info.bltddat = blit_func(blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF; + if (blitfill) { + uae_u16 d = blt_info.bltddat; int ifemode = blitife ? 2 : 0; int fc1 = blit_filltable[d & 255][ifemode + blitfc][1]; blt_info.bltddat = (blit_filltable[d & 255][ifemode + blitfc][0] + (blit_filltable[d >> 8][ifemode + fc1][0] << 8)); blitfc = blit_filltable[d >> 8][ifemode + fc1][1]; } - blt_info.blitpreva = bltaold; blt_info.blitprevb = blt_info.bltbdat; - if (blt_info.bltddat) blt_info.blitzero = 0; - if (bltddatpt) { *bltddatpt = blt_info.bltddat >> 8; *(bltddatpt + 1) = blt_info.bltddat; bltddatpt -= 2; } + if (blt_info.bltddat) blt_info.blitzero = 0; + if (bltddatpt) { + dstp = (uae_u16 *)bltddatpt; + bltddatpt -= 2; + } } if (bltadatpt) bltadatpt -= blt_info.bltamod; if (bltbdatpt) bltbdatpt -= blt_info.bltbmod; if (bltcdatpt) bltcdatpt -= blt_info.bltcmod; if (bltddatpt) bltddatpt -= blt_info.bltdmod; - } + } + do_put_mem_word(dstp, blt_info.bltddat); + blt_info.bltbhold = blitbhold; } + blit_masktable[0] = 0xFFFF; + blit_masktable[blt_info.hblitsize - 1] = 0xFFFF; + bltstate = BLT_done; } @@ -196,10 +248,6 @@ static __inline__ int blitter_read(void) { if (bltcon0 & 0xe00){ if (!dmaen(DMA_BLITTER)) return 1; /* blitter stopped */ - if (!blitline){ - if (bltcon0 & 0x800) blt_info.bltadat = chipmem_bank.wget(bltapt); - if (bltcon0 & 0x400) blt_info.bltbdat = chipmem_bank.wget(bltbpt); - } if (bltcon0 & 0x200) blt_info.bltcdat = chipmem_bank.wget(bltcpt); } bltstate = BLT_work; @@ -217,97 +265,6 @@ static __inline__ int blitter_write(void return (bltcon0 & 0x100) != 0; } -static void blitter_blit(void) -{ - UWORD blitahold,blitbhold,blitchold; - UWORD bltaold; - - if (blitdesc) { - UWORD bltamask = 0xffff; - - if (!blitlpos) { bltamask &= blt_info.bltafwm; } - if (blitlpos == (blt_info.hblitsize - 1)) { bltamask &= blt_info.bltalwm; } - bltaold = blt_info.bltadat & bltamask; - - blitahold = (((ULONG)bltaold << 16) | blt_info.blitpreva) >> (16-blt_info.blitashift); - blitbhold = (((ULONG)blt_info.bltbdat << 16) | blt_info.blitprevb) >> (16-blt_info.blitbshift); - blitchold = blt_info.bltcdat; - } else { - UWORD bltamask = 0xffff; - - if (!blitlpos) { bltamask &= blt_info.bltafwm; } - if (blitlpos == (blt_info.hblitsize - 1)) { bltamask &= blt_info.bltalwm; } - bltaold = blt_info.bltadat & bltamask; - - blitahold = (((ULONG)blt_info.blitpreva << 16) | bltaold) >> blt_info.blitashift; - blitbhold = (((ULONG)blt_info.blitprevb << 16) | blt_info.bltbdat) >> blt_info.blitbshift; - blitchold = blt_info.bltcdat; - } - blt_info.bltddat = 0; - blt_info.bltddat = blit_func(blitahold, blitbhold, blitchold, bltcon0 & 0xFF); - if (blitfill){ - UWORD fillmask; - for (fillmask = 1; fillmask; fillmask <<= 1){ - UWORD tmp = blt_info.bltddat; - if (blitfc) { - if (blitife) - blt_info.bltddat |= fillmask; - else - blt_info.bltddat ^= fillmask; - } - if (tmp & fillmask) blitfc = !blitfc; - } - } - bltstate = BLT_write; - blt_info.blitpreva = bltaold; blt_info.blitprevb = blt_info.bltbdat; -} - -static void blitter_nxblit(void) -{ - bltstate = BLT_read; - if (blitdesc){ - if (++blitlpos == blt_info.hblitsize) { - if (--blt_info.vblitsize == 0) { - bltstate = BLT_done; -#if FAST_BLITTER == 0 - custom_bank.wput(0xDFF09C,0x8040); -#endif - } - blitfc = bltcon1 & 0x4; - - blitlpos = 0; - if (bltcon0 & 0x800) bltapt -= 2+blt_info.bltamod; - if (bltcon0 & 0x400) bltbpt -= 2+blt_info.bltbmod; - if (bltcon0 & 0x200) bltcpt -= 2+blt_info.bltcmod; - if (bltcon0 & 0x100) bltdpt -= 2+blt_info.bltdmod; - } else { - if (bltcon0 & 0x800) bltapt -= 2; - if (bltcon0 & 0x400) bltbpt -= 2; - if (bltcon0 & 0x200) bltcpt -= 2; - if (bltcon0 & 0x100) bltdpt -= 2; - } - } else { - if (++blitlpos == blt_info.hblitsize) { - if (--blt_info.vblitsize == 0) { - bltstate = BLT_done; -#if FAST_BLITTER == 0 - custom_bank.wput(0xDFF09C,0x8040); -#endif - } - blitlpos = 0; - if (bltcon0 & 0x800) bltapt += 2+blt_info.bltamod; - if (bltcon0 & 0x400) bltbpt += 2+blt_info.bltbmod; - if (bltcon0 & 0x200) bltcpt += 2+blt_info.bltcmod; - if (bltcon0 & 0x100) bltdpt += 2+blt_info.bltdmod; - } else { - if (bltcon0 & 0x800) bltapt += 2; - if (bltcon0 & 0x400) bltbpt += 2; - if (bltcon0 & 0x200) bltcpt += 2; - if (bltcon0 & 0x100) bltdpt += 2; - } - } -} - static __inline__ void blitter_line_incx(void) { if (++blinea_shift == 16) { @@ -342,27 +299,27 @@ static __inline__ void blitter_line_incy static void blitter_line(void) { - UWORD blitahold = blinea >> blinea_shift, blitbhold = blineb & 1 ? 0xFFFF : 0, blitchold = blt_info.bltcdat; + uae_u16 blitahold = blinea >> blinea_shift, blitbhold = blineb & 1 ? 0xFFFF : 0, blitchold = blt_info.bltcdat; blt_info.bltddat = 0; - + if (blitsing && blitonedot) blitahold = 0; blitonedot = 1; blt_info.bltddat = blit_func(blitahold, blitbhold, blitchold, bltcon0 & 0xFF); if (!blitsign){ - bltapt += (WORD)blt_info.bltamod; + bltapt += (uae_s16)blt_info.bltamod; if (bltcon1 & 0x10){ if (bltcon1 & 0x8) - blitter_line_decy(); + blitter_line_decy(); else - blitter_line_incy(); + blitter_line_incy(); } else { if (bltcon1 & 0x8) - blitter_line_decx(); - else - blitter_line_incx(); + blitter_line_decx(); + else + blitter_line_incx(); } } else { - bltapt += (WORD)blt_info.bltbmod; + bltapt += (uae_s16)blt_info.bltbmod; } if (bltcon1 & 0x10){ if (bltcon1 & 0x4) @@ -375,7 +332,7 @@ static void blitter_line(void) else blitter_line_incy(); } - blitsign = 0 > (WORD)bltapt; + blitsign = 0 > (uae_s16)bltapt; bltstate = BLT_write; } @@ -386,9 +343,6 @@ static __inline__ void blitter_nxline(vo blineb = (blineb << 1) | (blineb >> 15); if (--blt_info.vblitsize == 0) { bltstate = BLT_done; -#if FAST_BLITTER == 0 - custom_bank.wput(0xDFF09C,0x8040); -#endif } else { bltstate = BLT_read; } @@ -397,13 +351,17 @@ static __inline__ void blitter_nxline(vo static void blit_init(void) { blitlpos = 0; - blt_info.blitzero = 1; blt_info.blitpreva = blt_info.blitprevb = 0; + blt_info.blitzero = 1; blitline = bltcon1 & 1; - blt_info.blitashift = bltcon0 >> 12; blt_info.blitbshift = bltcon1 >> 12; - + blt_info.blitashift = bltcon0 >> 12; + blt_info.blitdownashift = 16 - blt_info.blitashift; + blt_info.blitbshift = bltcon1 >> 12; + blt_info.blitdownbshift = 16 - blt_info.blitbshift; + if (blitline) { if (blt_info.hblitsize != 2) - fprintf(stderr, "weird hblitsize in linemode: %d\n", blt_info.hblitsize); + write_log ("weird hblitsize in linemode: %d\n", blt_info.hblitsize); + bltcnxlpt = bltcpt; bltdnxlpt = bltdpt; blitsing = bltcon1 & 0x2; @@ -413,7 +371,7 @@ static void blit_init(void) if (blineb != 0xFFFF && blineb != 0) fprintf(stderr, "%x %x %d %x\n", blineb, blt_info.bltbdat, blt_info.blitbshift, bltcon1); #endif - blitsign = bltcon1 & 0x40; + blitsign = bltcon1 & 0x40; blitonedot = 0; } else { blitfc = !!(bltcon1 & 0x4); @@ -424,12 +382,12 @@ static void blit_init(void) * negative effects. */ static int warn = 1; if (warn) - fprintf(stderr, "warning: weird fill mode (further messages suppressed)\n"); + write_log ("warning: weird fill mode (further messages suppressed)\n"); warn = 0; } blitdesc = bltcon1 & 0x2; if (blitfill && !blitdesc) - fprintf(stderr, "warning: blitter fill without desc\n"); + write_log ("warning: blitter fill without desc\n"); } } @@ -447,6 +405,7 @@ static void actually_do_blit(void) if (blitdesc) blitter_dofast_desc(); else blitter_dofast(); } + blitter_done_notify (); } void blitter_handler(void) @@ -458,7 +417,7 @@ void blitter_handler(void) return; /* gotta come back later. */ } actually_do_blit(); - + INTREQ(0x8040); eventtab[ev_blitter].active = 0; regs.spcflags &= ~SPCFLAG_BLTNASTY; @@ -466,48 +425,10 @@ void blitter_handler(void) void do_blitter(void) { -#if FAST_BLITTER == 0 - /* I'm not sure all this bltstate stuff is really necessary. - * Most programs should be OK if the blit is done as soon as BLTSIZE is - * written to, and the BLTFINISH bit is set some time after that. - * This code here is nowhere near exact. - */ - do { - switch(bltstate) { - case BLT_init: - blit_init(); - bltstate = BLT_read; - /* fall through */ - case BLT_read: - if (blitter_read()) - break; - /* fall through */ - case BLT_work: - if (blitline) - blitter_line(); - else - blitter_blit(); - /* fall through */ - case BLT_write: - if (blitter_write()) - break; - /* fall through */ - case BLT_next: - if (blitline) - blitter_nxline(); - else - blitter_nxblit(); - break; - case BLT_done: - regs.spcflags &= ~SPCFLAG_BLIT; - break; - } - } while(bltstate != BLT_done && dmaen(DMA_BLITTER) - && dmaen(DMA_BLITPRI)); /* blitter nasty -> no time for CPU */ -#else - { -#if FAST_BLITTER < 4 - long int blit_cycles = 2; + long int blit_cycles; + if (!currprefs.immediate_blits) { + + blit_cycles = 2; if (!blitline) { if (bltcon0 & 0x400) @@ -516,21 +437,18 @@ void do_blitter(void) blit_cycles++; blit_cycles *= blt_info.vblitsize * blt_info.hblitsize; } -#else - long int blit_cycles = 1; -#endif - blit_init(); - - eventtab[ev_blitter].active = 1; - eventtab[ev_blitter].oldcycles = cycles; - eventtab[ev_blitter].evtime = blit_cycles + cycles; - events_schedule(); + } else + blit_cycles = 1; - regs.spcflags &= ~SPCFLAG_BLIT; - if (dmaen(DMA_BLITPRI)) - regs.spcflags |= SPCFLAG_BLTNASTY; - } -#endif + blit_init(); + + eventtab[ev_blitter].active = 1; + eventtab[ev_blitter].oldcycles = cycles; + eventtab[ev_blitter].evtime = blit_cycles + cycles; + events_schedule(); + + if (dmaen(DMA_BLITPRI)) + regs.spcflags |= SPCFLAG_BLTNASTY; } void maybe_blit(void) @@ -538,10 +456,10 @@ void maybe_blit(void) static int warned = 0; if (bltstate == BLT_done) return; - + if (!warned) { warned = 1; - fprintf(stderr, "warning: Program does not wait for blitter (no further messages)\n"); + write_log ("warning: Program does not wait for blitter\n"); } if (!eventtab[ev_blitter].active) printf("FOO!!?\n");