- dst = upper_lookup(blitter.dstaddr, &dste, &dstrd);
- src = upper_lookup(blitter.srcaddr, &srce, &sstrd);
-
- if (dst == NULL || src == NULL) {
- printf("blit %08x->%08x %dx%d translated to %p->%p\n",
- blitter.srcaddr, blitter.dstaddr, w, h, src, dst);
- return;
+ // XXX: need to confirm this..
+ addr = (blitter.dstaddr & ~3) | ((blitter.dstctrl & 0x1f) >> 3);
+ dst = upper_lookup(addr, &dste, &dstrd);
+ if (dst == NULL)
+ goto bad_blit;
+
+ // XXX: assume fill if no SRCENB, but it could be pattern blit..
+ if (blitter.srcctrl & SRCCTRL_SRCENB) {
+ if (!(blitter.srcctrl & SRCCTRL_INVIDEO))
+ goto bad_blit;
+
+ addr = (blitter.srcaddr & ~3) | ((blitter.srcctrl & 0x1f) >> 3);
+ src = upper_lookup(addr, &srce, &sstrd);
+ if (src == NULL)
+ goto bad_blit;
+
+ if (src + sstrd * h > srce) {
+ printf("blit %08x->%08x %dx%d did not fit src\n",
+ blitter.srcaddr, blitter.dstaddr, w, h);
+ h = (srce - src) / sstrd;
+ }