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

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

unix.superglobalmegacorp.com

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