+ 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;
+ }
+
+ if (dst + dstrd * h > dste) {
+ printf("blit %08x->%08x %dx%d did not fit dst\n",
+ blitter.srcaddr, blitter.dstaddr, w, h);
+ h = (dste - dst) / dstrd;
+ }
+
+ 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;
+ }
+
+ for (; h > 0; h--, dst += dstrd, src += sstrd)
+ memcpy(dst, src, w * 2);
+}
+
+static u32 xread8(u32 a)
+{