--- uae/src/blitter.c 2018/04/24 16:39:15 1.1.1.2 +++ uae/src/blitter.c 2018/04/24 16:53:06 1.1.1.7 @@ -1,8 +1,8 @@ /* * UAE - The Un*x Amiga Emulator - * + * * Custom chip emulation - * + * * (c) 1995 Bernd Schmidt, Alessandro Bissacco */ @@ -12,6 +12,7 @@ #include "config.h" #include "options.h" #include "events.h" +#include "uae.h" #include "memory.h" #include "custom.h" #include "readcpu.h" @@ -19,38 +20,38 @@ #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]; -ULONG blit_masktable[BLITTER_MAX_WORDS]; -static UWORD blit_trashtable[BLITTER_MAX_WORDS]; +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; @@ -65,170 +66,184 @@ 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; - UBYTE mt = bltcon0 & 0xFF; - + uaecptr bltadatptr = 0, bltbdatptr = 0, bltcdatptr = 0, bltddatptr = 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; + bltadatptr = bltapt; + bltapt += (blt_info.hblitsize*2 + blt_info.bltamod)*blt_info.vblitsize; } if (bltcon0 & 0x400) { - bltbdatpt = blit_xlateptr(bltbpt, (blt_info.hblitsize*2+blt_info.bltbmod)*blt_info.vblitsize); - bltbpt += (blt_info.hblitsize*2+blt_info.bltbmod)*blt_info.vblitsize; + bltbdatptr = bltbpt; + bltbpt += (blt_info.hblitsize*2 + blt_info.bltbmod)*blt_info.vblitsize; } if (bltcon0 & 0x200) { - bltcdatpt = blit_xlateptr(bltcpt, (blt_info.hblitsize*2+blt_info.bltcmod)*blt_info.vblitsize); - bltcpt += (blt_info.hblitsize*2+blt_info.bltcmod)*blt_info.vblitsize; + bltcdatptr = bltcpt; + bltcpt += (blt_info.hblitsize*2 + blt_info.bltcmod)*blt_info.vblitsize; } if (bltcon0 & 0x100) { - 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; + bltddatptr = bltdpt; + 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])(bltadatptr, bltbdatptr, bltcdatptr, bltddatptr, &blt_info); else { - ULONG blitbhold = blt_info.bltbhold; - ULONG preva = 0, prevb = 0; + uae_u32 blitbhold = blt_info.bltbhold; + uae_u32 preva = 0, prevb = 0; + uaecptr dstp = 0; /*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++) { - ULONG bltadat, blitahold; - if (bltadatpt) { - bltadat = do_get_mem_word((UWORD *)bltadatpt); bltadatpt += 2; + uae_u32 bltadat, blitahold; + if (bltadatptr) { + bltadat = chipmem_wget (bltadatptr); + bltadatptr += 2; } else bltadat = blt_info.bltadat; bltadat &= blit_masktable[i]; - blitahold = (((ULONG)preva << 16) | bltadat) >> blt_info.blitashift; + blitahold = (((uae_u32)preva << 16) | bltadat) >> blt_info.blitashift; preva = bltadat; - if (bltbdatpt) { - UWORD bltbdat = do_get_mem_word((UWORD *)bltbdatpt); bltbdatpt += 2; - blitbhold = (((ULONG)prevb << 16) | bltbdat) >> blt_info.blitbshift; + if (bltbdatptr) { + uae_u16 bltbdat = chipmem_wget (bltbdatptr); + bltbdatptr += 2; + blitbhold = (((uae_u32)prevb << 16) | bltbdat) >> blt_info.blitbshift; prevb = bltbdat; } - if (bltcdatpt) { - blt_info.bltcdat = do_get_mem_word((UWORD *)bltcdatpt); bltcdatpt += 2; + if (bltcdatptr) { + blt_info.bltcdat = chipmem_wget (bltcdatptr); + bltcdatptr += 2; } - blt_info.bltddat = blit_func(blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF; - if (blitfill) { - UWORD d = blt_info.bltddat; + if (dstp) chipmem_wput (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]; } - if (blt_info.bltddat) blt_info.blitzero = 0; - if (bltddatpt) { - do_put_mem_word((UWORD *)bltddatpt, blt_info.bltddat); - bltddatpt += 2; + if (blt_info.bltddat) + blt_info.blitzero = 0; + if (bltddatptr) { + dstp = bltddatptr; + bltddatptr += 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; - } + if (bltadatptr) bltadatptr += blt_info.bltamod; + if (bltbdatptr) bltbdatptr += blt_info.bltbmod; + if (bltcdatptr) bltcdatptr += blt_info.bltcmod; + if (bltddatptr) bltddatptr += blt_info.bltdmod; + } + if (dstp) chipmem_wput (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; - UBYTE mt = bltcon0 & 0xFF; - + uaecptr bltadatptr = 0, bltbdatptr = 0, bltcdatptr = 0, bltddatptr = 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; + bltadatptr = bltapt; + bltapt -= (blt_info.hblitsize*2 + blt_info.bltamod)*blt_info.vblitsize; } if (bltcon0 & 0x400) { - bltbdatpt = blit_xlateptr_desc(bltbpt, (blt_info.hblitsize*2+blt_info.bltbmod)*blt_info.vblitsize); - bltbpt -= (blt_info.hblitsize*2+blt_info.bltbmod)*blt_info.vblitsize; + bltbdatptr = bltbpt; + bltbpt -= (blt_info.hblitsize*2 + blt_info.bltbmod)*blt_info.vblitsize; } if (bltcon0 & 0x200) { - bltcdatpt = blit_xlateptr_desc(bltcpt, (blt_info.hblitsize*2+blt_info.bltcmod)*blt_info.vblitsize); - bltcpt -= (blt_info.hblitsize*2+blt_info.bltcmod)*blt_info.vblitsize; + bltcdatptr = bltcpt; + bltcpt -= (blt_info.hblitsize*2 + blt_info.bltcmod)*blt_info.vblitsize; } if (bltcon0 & 0x100) { - 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; + bltddatptr = bltdpt; + bltdpt -= (blt_info.hblitsize*2 + blt_info.bltdmod)*blt_info.vblitsize; } - if (blitfunc_dofast_desc[mt] && !blitfill) - (*blitfunc_dofast_desc[mt])(bltadatpt,bltbdatpt,bltcdatpt,bltddatpt,&blt_info); + if (blitfunc_dofast_desc[mt] && !blitfill) + (*blitfunc_dofast_desc[mt])(bltadatptr, bltbdatptr, bltcdatptr, bltddatptr, &blt_info); else { - ULONG blitbhold = blt_info.bltbhold; - ULONG preva = 0, prevb = 0; + uae_u32 blitbhold = blt_info.bltbhold; + uae_u32 preva = 0, prevb = 0; + uaecptr dstp = 0; /* 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++) { - ULONG bltadat, blitahold; - if (bltadatpt) { - bltadat = do_get_mem_word((UWORD *)bltadatpt); bltadatpt -= 2; + uae_u32 bltadat, blitahold; + if (bltadatptr) { + bltadat = chipmem_wget (bltadatptr); + bltadatptr -= 2; } else bltadat = blt_info.bltadat; bltadat &= blit_masktable[i]; - blitahold = (((ULONG)bltadat << 16) | preva) >> blt_info.blitdownashift; + blitahold = (((uae_u32)bltadat << 16) | preva) >> blt_info.blitdownashift; preva = bltadat; - if (bltbdatpt) { - UWORD bltbdat = do_get_mem_word((UWORD *)bltbdatpt); bltbdatpt -= 2; - blitbhold = (((ULONG)bltbdat << 16) | prevb) >> blt_info.blitdownbshift; + if (bltbdatptr) { + uae_u16 bltbdat = chipmem_wget (bltbdatptr); + bltbdatptr -= 2; + blitbhold = (((uae_u32)bltbdat << 16) | prevb) >> blt_info.blitdownbshift; prevb = bltbdat; } - if (bltcdatpt) { - blt_info.bltcdat = do_get_mem_word((UWORD *)bltcdatpt); bltcdatpt -= 2; + if (bltcdatptr) { + blt_info.bltcdat = chipmem_wget (bltcdatptr); + bltcdatptr -= 2; } - blt_info.bltddat = blit_func(blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF; - if (blitfill) { - UWORD d = blt_info.bltddat; + if (dstp) chipmem_wput (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]; } - if (blt_info.bltddat) blt_info.blitzero = 0; - if (bltddatpt) { - do_put_mem_word((UWORD *)bltddatpt, blt_info.bltddat); - bltddatpt -= 2; + if (blt_info.bltddat) + blt_info.blitzero = 0; + if (bltddatptr) { + dstp = bltddatptr; + bltddatptr -= 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; - } + if (bltadatptr) bltadatptr -= blt_info.bltamod; + if (bltbdatptr) bltbdatptr -= blt_info.bltbmod; + if (bltcdatptr) bltcdatptr -= blt_info.bltcmod; + if (bltddatptr) bltddatptr -= blt_info.bltdmod; + } + if (dstp) chipmem_wput (dstp, blt_info.bltddat); blt_info.bltbhold = blitbhold; } blit_masktable[0] = 0xFFFF; @@ -237,17 +252,18 @@ static void blitter_dofast_desc(void) bltstate = BLT_done; } -static __inline__ int blitter_read(void) +STATIC_INLINE int blitter_read(void) { if (bltcon0 & 0xe00){ - if (!dmaen(DMA_BLITTER)) return 1; /* blitter stopped */ + if (!dmaen(DMA_BLITTER)) + return 1; if (bltcon0 & 0x200) blt_info.bltcdat = chipmem_bank.wget(bltcpt); } bltstate = BLT_work; return (bltcon0 & 0xE00) != 0; } -static __inline__ int blitter_write(void) +STATIC_INLINE int blitter_write(void) { if (blt_info.bltddat) blt_info.blitzero = 0; if ((bltcon0 & 0x100) || blitline){ @@ -258,7 +274,7 @@ static __inline__ int blitter_write(void return (bltcon0 & 0x100) != 0; } -static __inline__ void blitter_line_incx(void) +STATIC_INLINE void blitter_line_incx(void) { if (++blinea_shift == 16) { blinea_shift = 0; @@ -267,7 +283,7 @@ static __inline__ void blitter_line_incx } } -static __inline__ void blitter_line_decx(void) +STATIC_INLINE void blitter_line_decx(void) { if (blinea_shift-- == 0) { blinea_shift = 15; @@ -276,14 +292,14 @@ static __inline__ void blitter_line_decx } } -static __inline__ void blitter_line_decy(void) +STATIC_INLINE void blitter_line_decy(void) { bltcnxlpt -= blt_info.bltcmod; bltdnxlpt -= blt_info.bltcmod; /* ??? am I wrong or doesn't KS1.3 set bltdmod? */ blitonedot = 0; } -static __inline__ void blitter_line_incy(void) +STATIC_INLINE void blitter_line_incy(void) { bltcnxlpt += blt_info.bltcmod; bltdnxlpt += blt_info.bltcmod; /* ??? */ @@ -292,27 +308,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) @@ -325,11 +341,11 @@ static void blitter_line(void) else blitter_line_incy(); } - blitsign = 0 > (WORD)bltapt; + blitsign = 0 > (uae_s16)bltapt; bltstate = BLT_write; } -static __inline__ void blitter_nxline(void) +STATIC_INLINE void blitter_nxline(void) { bltcpt = bltcnxlpt; bltdpt = bltdnxlpt; @@ -344,16 +360,17 @@ static __inline__ void blitter_nxline(vo static void blit_init(void) { blitlpos = 0; - blt_info.blitzero = 1; + blt_info.blitzero = 1; blitline = bltcon1 & 1; - blt_info.blitashift = bltcon0 >> 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; @@ -363,7 +380,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); @@ -374,12 +391,16 @@ 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"); + if (blitfill && !blitdesc) { + static int warn = 1; + if (warn) + write_log ("warning: blitter fill without desc (further messages suppressed)\n"); + warn = 0; + } } } @@ -409,7 +430,7 @@ void blitter_handler(void) return; /* gotta come back later. */ } actually_do_blit(); - + INTREQ(0x8040); eventtab[ev_blitter].active = 0; regs.spcflags &= ~SPCFLAG_BLTNASTY; @@ -418,8 +439,8 @@ void blitter_handler(void) void do_blitter(void) { long int blit_cycles; - if (!immediate_blits) { - + if (!currprefs.immediate_blits) { + blit_cycles = 2; if (!blitline) { @@ -429,16 +450,17 @@ void do_blitter(void) blit_cycles++; blit_cycles *= blt_info.vblitsize * blt_info.hblitsize; } - } else + } else blit_cycles = 1; blit_init(); - + eventtab[ev_blitter].active = 1; eventtab[ev_blitter].oldcycles = cycles; eventtab[ev_blitter].evtime = blit_cycles + cycles; events_schedule(); + regs.spcflags &= ~SPCFLAG_BLTNASTY; if (dmaen(DMA_BLITPRI)) regs.spcflags |= SPCFLAG_BLTNASTY; } @@ -448,10 +470,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");