|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.