Annotation of uae/src/blitter.c, revision 1.1.1.14

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
1.1.1.3   root        3:   *
1.1       root        4:   * Custom chip emulation
1.1.1.3   root        5:   *
1.1       root        6:   * (c) 1995 Bernd Schmidt, Alessandro Bissacco
                      7:   */
                      8: 
                      9: #include "sysconfig.h"
                     10: #include "sysdeps.h"
                     11: 
                     12: #include "config.h"
                     13: #include "options.h"
                     14: #include "events.h"
1.1.1.3   root       15: #include "uae.h"
1.1       root       16: #include "memory.h"
                     17: #include "custom.h"
                     18: #include "newcpu.h"
                     19: #include "blitter.h"
                     20: #include "blit.h"
                     21: 
1.1.1.10  root       22: uae_u16 oldvblts;
1.1.1.3   root       23: uae_u16 bltcon0,bltcon1;
                     24: uae_u32 bltapt,bltbpt,bltcpt,bltdpt;
1.1       root       25: 
                     26: int blinea_shift;
1.1.1.3   root       27: static uae_u16 blitlpos, blinea, blineb;
                     28: static uaecptr bltcnxlpt,bltdnxlpt;
1.1       root       29: static int blitline,blitfc,blitfill,blitife,blitdesc,blitsing;
                     30: static int blitonedot,blitsign;
                     31: static long int bltwait;
                     32: 
                     33: struct bltinfo blt_info;
                     34: 
1.1.1.3   root       35: static uae_u8 blit_filltable[256][4][2];
                     36: uae_u32 blit_masktable[BLITTER_MAX_WORDS];
                     37: static uae_u16 blit_trashtable[BLITTER_MAX_WORDS];
1.1       root       38: enum blitter_states bltstate;
                     39: 
1.1.1.14! root       40: static uae_u8 blit_cycle_diagram_start[][10] =
        !            41: {
        !            42:     { 0, 1, 0 },               /* 0 */
        !            43:     { 0, 2, 4,0 },             /* 1 */
        !            44:     { 0, 2, 3,0 },             /* 2 */
        !            45:     { 2, 3, 3,0, 0,3,4 },      /* 3 */
        !            46:     { 0, 3, 2,0,0 },           /* 4 */
        !            47:     { 2, 3, 2,0, 0,2,4 },      /* 5 */
        !            48:     { 0, 3, 2,3,0 },           /* 6 */
        !            49:     { 3, 4, 2,3,0, 0,2,3,4 },  /* 7 */
        !            50:     { 0, 2, 1,0 },             /* 8 */
        !            51:     { 2, 2, 1,0, 1,4 },                /* 9 */
        !            52:     { 0, 2, 1,3 },             /* A */
        !            53:     { 3, 3, 1,3,0, 1,3,4 },    /* B */
        !            54:     { 2, 3, 1,2, 0,1,2 },      /* C */
        !            55:     { 3, 3, 1,2,0, 1,2,4 },    /* D */
        !            56:     { 0, 3, 1,2,3 },           /* E */
        !            57:     { 4, 4, 1,2,3,0, 1,2,3,4 } /* F */
        !            58: };
        !            59: 
1.1       root       60: void build_blitfilltable(void)
                     61: {
                     62:     unsigned int d, fillmask;
                     63:     int i;
1.1.1.3   root       64: 
1.1.1.2   root       65:     for (i = 0; i < BLITTER_MAX_WORDS; i++)
                     66:        blit_masktable[i] = 0xFFFF;
1.1.1.3   root       67: 
1.1       root       68:     for (d = 0; d < 256; d++) {
                     69:        for (i = 0; i < 4; i++) {
                     70:            int fc = i & 1;
1.1.1.3   root       71:            uae_u8 data = d;
1.1       root       72:            for (fillmask = 1; fillmask != 0x100; fillmask <<= 1) {
1.1.1.3   root       73:                uae_u16 tmp = data;
1.1       root       74:                if (fc) {
                     75:                    if (i & 2)
                     76:                        data |= fillmask;
                     77:                    else
                     78:                        data ^= fillmask;
                     79:                }
                     80:                if (tmp & fillmask) fc = !fc;
                     81:            }
                     82:            blit_filltable[d][i][0] = data;
                     83:            blit_filltable[d][i][1] = fc;
                     84:        }
                     85:     }
                     86: }
                     87: 
1.1.1.5   root       88: STATIC_INLINE uae_u8 *blit_xlateptr(uaecptr bltpt, int bytecount)
1.1       root       89: {
                     90:     if (!chipmem_bank.check(bltpt,bytecount)) return NULL;
                     91:     return chipmem_bank.xlateaddr(bltpt);
                     92: }
                     93: 
1.1.1.5   root       94: STATIC_INLINE uae_u8 *blit_xlateptr_desc(uaecptr bltpt, int bytecount)
1.1       root       95: {
                     96:     if (!chipmem_bank.check(bltpt-bytecount, bytecount)) return NULL;
                     97:     return chipmem_bank.xlateaddr(bltpt);
                     98: }
                     99: 
1.1.1.3   root      100: static void blitter_dofast(void)
1.1       root      101: {
                    102:     int i,j;
1.1.1.7   root      103:     uaecptr bltadatptr = 0, bltbdatptr = 0, bltcdatptr = 0, bltddatptr = 0;
1.1.1.3   root      104:     uae_u8 mt = bltcon0 & 0xFF;
                    105: 
1.1.1.2   root      106:     blit_masktable[0] = blt_info.bltafwm;
                    107:     blit_masktable[blt_info.hblitsize - 1] &= blt_info.bltalwm;
1.1.1.3   root      108: 
1.1       root      109:     if (bltcon0 & 0x800) {
1.1.1.7   root      110:        bltadatptr = bltapt;
                    111:        bltapt += (blt_info.hblitsize*2 + blt_info.bltamod)*blt_info.vblitsize;
1.1       root      112:     }
                    113:     if (bltcon0 & 0x400) {
1.1.1.7   root      114:        bltbdatptr = bltbpt;
                    115:        bltbpt += (blt_info.hblitsize*2 + blt_info.bltbmod)*blt_info.vblitsize;
1.1       root      116:     }
                    117:     if (bltcon0 & 0x200) {
1.1.1.7   root      118:        bltcdatptr = bltcpt;
                    119:        bltcpt += (blt_info.hblitsize*2 + blt_info.bltcmod)*blt_info.vblitsize;
1.1       root      120:     }
                    121:     if (bltcon0 & 0x100) {
1.1.1.7   root      122:        bltddatptr = bltdpt;
                    123:        bltdpt += (blt_info.hblitsize*2 + blt_info.bltdmod)*blt_info.vblitsize;
1.1       root      124:     }
1.1.1.3   root      125: 
                    126:     if (blitfunc_dofast[mt] && !blitfill)
1.1.1.7   root      127:        (*blitfunc_dofast[mt])(bltadatptr, bltbdatptr, bltcdatptr, bltddatptr, &blt_info);
1.1       root      128:     else {
1.1.1.3   root      129:        uae_u32 blitbhold = blt_info.bltbhold;
                    130:        uae_u32 preva = 0, prevb = 0;
1.1.1.7   root      131:        uaecptr dstp = 0;
1.1.1.2   root      132: 
1.1.1.11  root      133:        /*if (!blitfill) write_log ("minterm %x not present\n",mt); */
1.1.1.3   root      134:        for (j = 0; j < blt_info.vblitsize; j++) {
1.1       root      135:            blitfc = !!(bltcon1 & 0x4);
                    136:            for (i = 0; i < blt_info.hblitsize; i++) {
1.1.1.3   root      137:                uae_u32 bltadat, blitahold;
1.1.1.7   root      138:                if (bltadatptr) {
                    139:                    bltadat = chipmem_wget (bltadatptr);
                    140:                    bltadatptr += 2;
1.1.1.2   root      141:                } else
                    142:                    bltadat = blt_info.bltadat;
                    143:                bltadat &= blit_masktable[i];
1.1.1.3   root      144:                blitahold = (((uae_u32)preva << 16) | bltadat) >> blt_info.blitashift;
1.1.1.2   root      145:                preva = bltadat;
                    146: 
1.1.1.7   root      147:                if (bltbdatptr) {
                    148:                    uae_u16 bltbdat = chipmem_wget (bltbdatptr);
                    149:                    bltbdatptr += 2;
1.1.1.3   root      150:                    blitbhold = (((uae_u32)prevb << 16) | bltbdat) >> blt_info.blitbshift;
1.1.1.2   root      151:                    prevb = bltbdat;
                    152:                }
1.1.1.7   root      153:                if (bltcdatptr) {
                    154:                    blt_info.bltcdat = chipmem_wget (bltcdatptr);
                    155:                    bltcdatptr += 2;
1.1.1.2   root      156:                }
1.1.1.7   root      157:                if (dstp) chipmem_wput (dstp, blt_info.bltddat);
                    158:                blt_info.bltddat = blit_func (blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF;
1.1.1.3   root      159:                if (blitfill) {
                    160:                    uae_u16 d = blt_info.bltddat;
1.1       root      161:                    int ifemode = blitife ? 2 : 0;
                    162:                    int fc1 = blit_filltable[d & 255][ifemode + blitfc][1];
1.1.1.3   root      163:                    blt_info.bltddat = (blit_filltable[d & 255][ifemode + blitfc][0]
1.1       root      164:                                        + (blit_filltable[d >> 8][ifemode + fc1][0] << 8));
                    165:                    blitfc = blit_filltable[d >> 8][ifemode + fc1][1];
                    166:                }
1.1.1.7   root      167:                if (blt_info.bltddat)
                    168:                    blt_info.blitzero = 0;
                    169:                if (bltddatptr) {
                    170:                    dstp = bltddatptr;
                    171:                    bltddatptr += 2;
1.1.1.2   root      172:                }
1.1       root      173:            }
1.1.1.7   root      174:            if (bltadatptr) bltadatptr += blt_info.bltamod;
                    175:            if (bltbdatptr) bltbdatptr += blt_info.bltbmod;
                    176:            if (bltcdatptr) bltcdatptr += blt_info.bltcmod;
                    177:            if (bltddatptr) bltddatptr += blt_info.bltdmod;
1.1.1.3   root      178:        }
1.1.1.7   root      179:        if (dstp) chipmem_wput (dstp, blt_info.bltddat);
1.1.1.2   root      180:        blt_info.bltbhold = blitbhold;
1.1       root      181:     }
1.1.1.2   root      182:     blit_masktable[0] = 0xFFFF;
                    183:     blit_masktable[blt_info.hblitsize - 1] = 0xFFFF;
1.1.1.3   root      184: 
1.1       root      185:     bltstate = BLT_done;
                    186: }
                    187: 
1.1.1.3   root      188: static void blitter_dofast_desc(void)
1.1       root      189: {
                    190:     int i,j;
1.1.1.7   root      191:     uaecptr bltadatptr = 0, bltbdatptr = 0, bltcdatptr = 0, bltddatptr = 0;
1.1.1.3   root      192:     uae_u8 mt = bltcon0 & 0xFF;
                    193: 
1.1.1.2   root      194:     blit_masktable[0] = blt_info.bltafwm;
                    195:     blit_masktable[blt_info.hblitsize - 1] &= blt_info.bltalwm;
1.1.1.3   root      196: 
1.1       root      197:     if (bltcon0 & 0x800) {
1.1.1.7   root      198:        bltadatptr = bltapt;
                    199:        bltapt -= (blt_info.hblitsize*2 + blt_info.bltamod)*blt_info.vblitsize;
1.1       root      200:     }
                    201:     if (bltcon0 & 0x400) {
1.1.1.7   root      202:        bltbdatptr = bltbpt;
                    203:        bltbpt -= (blt_info.hblitsize*2 + blt_info.bltbmod)*blt_info.vblitsize;
1.1       root      204:     }
                    205:     if (bltcon0 & 0x200) {
1.1.1.7   root      206:        bltcdatptr = bltcpt;
                    207:        bltcpt -= (blt_info.hblitsize*2 + blt_info.bltcmod)*blt_info.vblitsize;
1.1       root      208:     }
                    209:     if (bltcon0 & 0x100) {
1.1.1.7   root      210:        bltddatptr = bltdpt;
                    211:        bltdpt -= (blt_info.hblitsize*2 + blt_info.bltdmod)*blt_info.vblitsize;
1.1       root      212:     }
1.1.1.3   root      213:     if (blitfunc_dofast_desc[mt] && !blitfill)
1.1.1.7   root      214:        (*blitfunc_dofast_desc[mt])(bltadatptr, bltbdatptr, bltcdatptr, bltddatptr, &blt_info);
1.1       root      215:     else {
1.1.1.3   root      216:        uae_u32 blitbhold = blt_info.bltbhold;
                    217:        uae_u32 preva = 0, prevb = 0;
1.1.1.7   root      218:        uaecptr dstp = 0;
1.1.1.2   root      219: 
1.1.1.11  root      220: /*     if (!blitfill) write_log ("minterm %x not present\n",mt);*/
1.1.1.3   root      221:        for (j = 0; j < blt_info.vblitsize; j++) {
1.1       root      222:            blitfc = !!(bltcon1 & 0x4);
                    223:            for (i = 0; i < blt_info.hblitsize; i++) {
1.1.1.3   root      224:                uae_u32 bltadat, blitahold;
1.1.1.7   root      225:                if (bltadatptr) {
                    226:                    bltadat = chipmem_wget (bltadatptr);
                    227:                    bltadatptr -= 2;
1.1.1.2   root      228:                } else
                    229:                    bltadat = blt_info.bltadat;
                    230:                bltadat &= blit_masktable[i];
1.1.1.3   root      231:                blitahold = (((uae_u32)bltadat << 16) | preva) >> blt_info.blitdownashift;
1.1.1.2   root      232:                preva = bltadat;
1.1.1.7   root      233:                if (bltbdatptr) {
                    234:                    uae_u16 bltbdat = chipmem_wget (bltbdatptr);
                    235:                    bltbdatptr -= 2;
1.1.1.3   root      236:                    blitbhold = (((uae_u32)bltbdat << 16) | prevb) >> blt_info.blitdownbshift;
1.1.1.2   root      237:                    prevb = bltbdat;
                    238:                }
1.1.1.7   root      239:                if (bltcdatptr) {
                    240:                    blt_info.bltcdat = chipmem_wget (bltcdatptr);
                    241:                    bltcdatptr -= 2;
1.1.1.2   root      242:                }
1.1.1.7   root      243:                if (dstp) chipmem_wput (dstp, blt_info.bltddat);
                    244:                blt_info.bltddat = blit_func (blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF;
1.1.1.3   root      245:                if (blitfill) {
                    246:                    uae_u16 d = blt_info.bltddat;
1.1       root      247:                    int ifemode = blitife ? 2 : 0;
                    248:                    int fc1 = blit_filltable[d & 255][ifemode + blitfc][1];
                    249:                    blt_info.bltddat = (blit_filltable[d & 255][ifemode + blitfc][0]
                    250:                                        + (blit_filltable[d >> 8][ifemode + fc1][0] << 8));
                    251:                    blitfc = blit_filltable[d >> 8][ifemode + fc1][1];
                    252:                }
1.1.1.7   root      253:                if (blt_info.bltddat)
                    254:                    blt_info.blitzero = 0;
                    255:                if (bltddatptr) {
                    256:                    dstp = bltddatptr;
                    257:                    bltddatptr -= 2;
1.1.1.2   root      258:                }
1.1       root      259:            }
1.1.1.7   root      260:            if (bltadatptr) bltadatptr -= blt_info.bltamod;
                    261:            if (bltbdatptr) bltbdatptr -= blt_info.bltbmod;
                    262:            if (bltcdatptr) bltcdatptr -= blt_info.bltcmod;
                    263:            if (bltddatptr) bltddatptr -= blt_info.bltdmod;
1.1.1.3   root      264:        }
1.1.1.7   root      265:        if (dstp) chipmem_wput (dstp, blt_info.bltddat);
1.1.1.2   root      266:        blt_info.bltbhold = blitbhold;
1.1       root      267:     }
1.1.1.2   root      268:     blit_masktable[0] = 0xFFFF;
                    269:     blit_masktable[blt_info.hblitsize - 1] = 0xFFFF;
                    270: 
1.1       root      271:     bltstate = BLT_done;
                    272: }
                    273: 
1.1.1.5   root      274: STATIC_INLINE int blitter_read(void)
1.1       root      275: {
                    276:     if (bltcon0 & 0xe00){
1.1.1.7   root      277:        if (!dmaen(DMA_BLITTER))
                    278:            return 1;
1.1       root      279:        if (bltcon0 & 0x200) blt_info.bltcdat = chipmem_bank.wget(bltcpt);
                    280:     }
                    281:     bltstate = BLT_work;
                    282:     return (bltcon0 & 0xE00) != 0;
                    283: }
                    284: 
1.1.1.5   root      285: STATIC_INLINE int blitter_write(void)
1.1       root      286: {
                    287:     if (blt_info.bltddat) blt_info.blitzero = 0;
                    288:     if ((bltcon0 & 0x100) || blitline){
                    289:        if (!dmaen(DMA_BLITTER)) return 1;
                    290:        chipmem_bank.wput(bltdpt, blt_info.bltddat);
                    291:     }
                    292:     bltstate = BLT_next;
                    293:     return (bltcon0 & 0x100) != 0;
                    294: }
                    295: 
1.1.1.5   root      296: STATIC_INLINE void blitter_line_incx(void)
1.1       root      297: {
                    298:     if (++blinea_shift == 16) {
                    299:        blinea_shift = 0;
                    300:        bltcnxlpt += 2;
                    301:        bltdnxlpt += 2;
                    302:     }
                    303: }
                    304: 
1.1.1.5   root      305: STATIC_INLINE void blitter_line_decx(void)
1.1       root      306: {
                    307:     if (blinea_shift-- == 0) {
                    308:        blinea_shift = 15;
                    309:        bltcnxlpt -= 2;
                    310:        bltdnxlpt -= 2;
                    311:     }
                    312: }
                    313: 
1.1.1.5   root      314: STATIC_INLINE void blitter_line_decy(void)
1.1       root      315: {
                    316:     bltcnxlpt -= blt_info.bltcmod;
                    317:     bltdnxlpt -= blt_info.bltcmod; /* ??? am I wrong or doesn't KS1.3 set bltdmod? */
                    318:     blitonedot = 0;
                    319: }
                    320: 
1.1.1.5   root      321: STATIC_INLINE void blitter_line_incy(void)
1.1       root      322: {
                    323:     bltcnxlpt += blt_info.bltcmod;
                    324:     bltdnxlpt += blt_info.bltcmod; /* ??? */
                    325:     blitonedot = 0;
                    326: }
                    327: 
                    328: static void blitter_line(void)
                    329: {
1.1.1.14! root      330:     uae_u16 blitahold = blinea >> blinea_shift;
        !           331:     uae_u16 blitbhold = blineb & 1 ? 0xFFFF : 0;
        !           332:     uae_u16 blitchold = blt_info.bltcdat;
1.1       root      333:     blt_info.bltddat = 0;
1.1.1.3   root      334: 
1.1       root      335:     if (blitsing && blitonedot) blitahold = 0;
                    336:     blitonedot = 1;
                    337:     blt_info.bltddat = blit_func(blitahold, blitbhold, blitchold, bltcon0 & 0xFF);
                    338:     if (!blitsign){
1.1.1.3   root      339:        bltapt += (uae_s16)blt_info.bltamod;
1.1       root      340:        if (bltcon1 & 0x10){
                    341:            if (bltcon1 & 0x8)
1.1.1.3   root      342:                blitter_line_decy();
1.1       root      343:            else
1.1.1.3   root      344:                blitter_line_incy();
1.1       root      345:        } else {
                    346:            if (bltcon1 & 0x8)
1.1.1.3   root      347:                blitter_line_decx();
                    348:            else
                    349:                blitter_line_incx();
1.1       root      350:        }
                    351:     } else {
1.1.1.3   root      352:        bltapt += (uae_s16)blt_info.bltbmod;
1.1       root      353:     }
                    354:     if (bltcon1 & 0x10){
                    355:        if (bltcon1 & 0x4)
                    356:            blitter_line_decx();
                    357:        else
                    358:            blitter_line_incx();
                    359:     } else {
                    360:        if (bltcon1 & 0x4)
                    361:            blitter_line_decy();
                    362:        else
                    363:            blitter_line_incy();
                    364:     }
1.1.1.3   root      365:     blitsign = 0 > (uae_s16)bltapt;
1.1       root      366:     bltstate = BLT_write;
                    367: }
                    368: 
1.1.1.5   root      369: STATIC_INLINE void blitter_nxline(void)
1.1       root      370: {
                    371:     bltcpt = bltcnxlpt;
                    372:     bltdpt = bltdnxlpt;
                    373:     blineb = (blineb << 1) | (blineb >> 15);
                    374:     if (--blt_info.vblitsize == 0) {
                    375:        bltstate = BLT_done;
                    376:     } else {
                    377:        bltstate = BLT_read;
                    378:     }
                    379: }
                    380: 
                    381: static void blit_init(void)
                    382: {
                    383:     blitlpos = 0;
1.1.1.3   root      384:     blt_info.blitzero = 1;
1.1       root      385:     blitline = bltcon1 & 1;
1.1.1.3   root      386:     blt_info.blitashift = bltcon0 >> 12;
1.1.1.2   root      387:     blt_info.blitdownashift = 16 - blt_info.blitashift;
                    388:     blt_info.blitbshift = bltcon1 >> 12;
                    389:     blt_info.blitdownbshift = 16 - blt_info.blitbshift;
1.1.1.3   root      390: 
1.1       root      391:     if (blitline) {
1.1.1.4   root      392:        if (blt_info.hblitsize != 2)
                    393:            write_log ("weird hblitsize in linemode: %d\n", blt_info.hblitsize);
                    394: 
1.1       root      395:        bltcnxlpt = bltcpt;
                    396:        bltdnxlpt = bltdpt;
                    397:        blitsing = bltcon1 & 0x2;
                    398:        blinea = blt_info.bltadat;
                    399:        blineb = (blt_info.bltbdat >> blt_info.blitbshift) | (blt_info.bltbdat << (16-blt_info.blitbshift));
                    400: #if 0
                    401:        if (blineb != 0xFFFF && blineb != 0)
1.1.1.11  root      402:            write_log ("%x %x %d %x\n", blineb, blt_info.bltbdat, blt_info.blitbshift, bltcon1);
1.1       root      403: #endif
1.1.1.3   root      404:        blitsign = bltcon1 & 0x40;
1.1       root      405:        blitonedot = 0;
                    406:     } else {
                    407:        blitfc = !!(bltcon1 & 0x4);
                    408:        blitife = bltcon1 & 0x8;
                    409:        blitfill = bltcon1 & 0x18;
                    410:        if ((bltcon1 & 0x18) == 0x18) {
                    411:            /* Digital "Trash" demo does this; others too. Apparently, no
                    412:             * negative effects. */
                    413:            static int warn = 1;
                    414:            if (warn)
1.1.1.3   root      415:                write_log ("warning: weird fill mode (further messages suppressed)\n");
1.1       root      416:            warn = 0;
                    417:        }
                    418:        blitdesc = bltcon1 & 0x2;
1.1.1.7   root      419:        if (blitfill && !blitdesc) {
                    420:            static int warn = 1;
                    421:            if (warn)
1.1.1.13  root      422:                write_log ("warning: blitter fill without desc (further messages suppressed)\n");
1.1.1.7   root      423:            warn = 0;
                    424:        }
1.1       root      425:     }
                    426: }
                    427: 
                    428: static void actually_do_blit(void)
                    429: {
                    430:     if (blitline) {
                    431:        do {
                    432:            blitter_read();
                    433:            blitter_line();
                    434:            blitter_write();
                    435:            blitter_nxline();
                    436:        } while (bltstate != BLT_done);
                    437:     } else {
                    438:        /*blitcount[bltcon0 & 0xff]++;  blitter debug */
                    439:        if (blitdesc) blitter_dofast_desc();
                    440:        else blitter_dofast();
                    441:     }
1.1.1.2   root      442:     blitter_done_notify ();
1.1       root      443: }
                    444: 
                    445: void blitter_handler(void)
                    446: {
                    447:     if (!dmaen(DMA_BLITTER)) {
                    448:        eventtab[ev_blitter].active = 1;
1.1.1.9   root      449:        eventtab[ev_blitter].oldcycles = get_cycles ();
                    450:        eventtab[ev_blitter].evtime = 10 * CYCLE_UNIT + get_cycles (); /* wait a little */
1.1       root      451:        return; /* gotta come back later. */
                    452:     }
                    453:     actually_do_blit();
1.1.1.3   root      454: 
1.1       root      455:     INTREQ(0x8040);
                    456:     eventtab[ev_blitter].active = 0;
1.1.1.8   root      457:     unset_special (SPCFLAG_BLTNASTY);
1.1       root      458: }
                    459: 
1.1.1.12  root      460: static long int blit_cycles;
                    461: static long blit_firstline_cycles;
                    462: static long blit_first_cycle;
                    463: static int blit_last_cycle;
                    464: static uae_u8 *blit_diag;
1.1.1.3   root      465: 
1.1.1.12  root      466: void do_blitter(void)
                    467: {
                    468:     int ch = (bltcon0 & 0x0f00) >> 8;
                    469:     blit_diag = blit_cycle_diagram_start[ch];
1.1       root      470: 
1.1.1.12  root      471:     blit_firstline_cycles = blit_first_cycle = get_cycles ();
                    472:     blit_last_cycle = 0;
                    473:     if (!currprefs.immediate_blits) {
1.1       root      474:        if (!blitline) {
1.1.1.12  root      475:            blit_cycles = blit_diag[1];
                    476:            blit_firstline_cycles += blit_cycles * blt_info.hblitsize * CYCLE_UNIT;
1.1       root      477:            blit_cycles *= blt_info.vblitsize * blt_info.hblitsize;
1.1.1.12  root      478:        } else
1.1.1.13  root      479:             blit_cycles = 20; /* Desert Dream demo freezes if line draw is too fast */
1.1.1.3   root      480:     } else
1.1.1.2   root      481:        blit_cycles = 1;
                    482: 
                    483:     blit_init();
1.1.1.3   root      484: 
1.1.1.2   root      485:     eventtab[ev_blitter].active = 1;
1.1.1.9   root      486:     eventtab[ev_blitter].oldcycles = get_cycles ();
                    487:     eventtab[ev_blitter].evtime = blit_cycles * CYCLE_UNIT + get_cycles ();
1.1.1.2   root      488:     events_schedule();
1.1       root      489: 
1.1.1.8   root      490:     unset_special (SPCFLAG_BLTNASTY);
1.1.1.2   root      491:     if (dmaen(DMA_BLITPRI))
1.1.1.8   root      492:        set_special (SPCFLAG_BLTNASTY);
1.1.1.12  root      493: 
1.1       root      494: }
                    495: 
1.1.1.12  root      496: void maybe_blit (int modulo)
1.1       root      497: {
                    498:     static int warned = 0;
                    499:     if (bltstate == BLT_done)
                    500:        return;
1.1.1.3   root      501: 
1.1       root      502:     if (!warned) {
                    503:        warned = 1;
1.1.1.3   root      504:        write_log ("warning: Program does not wait for blitter\n");
1.1       root      505:     }
                    506:     if (!eventtab[ev_blitter].active)
1.1.1.12  root      507:        write_log ("FOO!!?\n");
                    508: 
                    509:     if (modulo && get_cycles() < blit_firstline_cycles)
                    510:        return;
1.1.1.8   root      511:     blitter_handler ();
1.1       root      512: }
1.1.1.12  root      513: 
                    514: int blitnasty (void)
                    515: {
                    516:     int cycles, ccnt;
                    517:     if (!(regs.spcflags & SPCFLAG_BLTNASTY))
                    518:        return 0;
                    519:     if (bltstate == BLT_done)
                    520:        return 0;
                    521:     if (!dmaen(DMA_BLITTER))
                    522:        return 0;
                    523:     cycles = (get_cycles () - blit_first_cycle) / CYCLE_UNIT;
                    524:     ccnt = 0;
                    525:     while (blit_last_cycle < cycles) {
                    526:        int c;
                    527:        if (blit_last_cycle < blit_diag[0])
                    528:            c = blit_diag[blit_last_cycle + 2];
                    529:        else
1.1.1.13  root      530:            c = blit_diag[((blit_last_cycle - blit_diag[0]) % blit_diag[1]) + 2 + blit_diag[0]];
1.1.1.12  root      531:        blit_last_cycle ++;
                    532:        if (!c)
                    533:            return 0;
                    534:        ccnt++;
                    535:     }
                    536:     return ccnt;
                    537: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.