1
2;
3; Date: 1999-03-07			Mikael Kalms (Scout/C-Lous & more)
4;					Email: mikael@kalms.org
5;
6; 1x1 8bpl cpu5 C2P for arbitrary BitMaps
7;
8; Features:
9; Performs CPU-only C2P conversion using rather state-of-the-art (as of
10; the creation date, anyway) techniques
11; Different routines for non-modulo and modulo C2P conversions
12; Handles bitmaps of virtually any size (>4096x4096)
13; Position-independent (PC-relative) code
14;
15; Restrictions:
16; Chunky-buffer must be an even multiple of 32 pixels wide
17; X-Offset must be set to an even multiple of 8
18; If these conditions not are met, the routine will abort.
19; If incorrect/invalid parameters are specified, the routine will
20; most probably crash.
21;
22; c2p1x1_8_c5_bm
23
24
25	xdef	_c2p1x1_8_c5_bm
26	xdef	c2p1x1_8_c5_bm
27
28	incdir	include:
29	include	graphics/gfx.i
30
31
32			rsreset
33C2P1X1_8_C5_BM_CHUNKYX	rs.w	1
34C2P1X1_8_C5_BM_CHUNKYY	rs.w	1
35C2P1X1_8_C5_BM_ROWMOD	rs.l	1
36C2P1X1_8_C5_BM_SIZEOF	rs.b	0
37
38
39	section	code,code
40
41; d0.w	chunkyx [chunky-pixels]
42; d1.w	chunkyy [chunky-pixels]
43; d2.w	offsx [screen-pixels]
44; d3.w	offsy [screen-pixels]
45; a0	chunkyscreen
46; a1	BitMap
47
48_c2p1x1_8_c5_bm
49c2p1x1_8_c5_bm
50	movem.l	d2-d7/a2-a6,-(sp)
51	subq.l	#C2P1X1_8_C5_BM_SIZEOF,sp
52					; A few sanity checks
53	cmpi.b	#8,bm_Depth(a1)		; At least 8 valid bplptrs?
54	blo	.exit
55	move.w	d0,d4
56	move.w	d2,d5
57	andi.w	#$1f,d4			; Even 32-pixel width?
58	bne	.exit
59	andi.w	#$7,d5			; Even 8-pixel xoffset?
60	bne	.exit
61	moveq	#0,d4
62	move.w	bm_BytesPerRow(a1),d4
63
64	move.w	d0,C2P1X1_8_C5_BM_CHUNKYX(sp) ; Skip if 0 pixels to convert
65	beq	.exit
66	move.w	d1,C2P1X1_8_C5_BM_CHUNKYY(sp)
67	beq	.exit
68
69	ext.l	d2			; Offs to first pixel to draw in bpl
70	mulu.w	d4,d3
71	lsr.l	#3,d2
72	add.l	d2,d3
73
74	lsl.w	#3,d4			; Modulo c2p required?
75	sub.w	d0,d4
76	bmi	.exit
77	bne	.c2p_mod
78
79	mulu.w	d0,d1
80	add.l	a0,d1
81	move.l	d1,a2			; Ptr to end of chunkybuffer
82
83	movem.l	a0-a1/d3,-(sp)
84
85	movem.l	bm_Planes(a1),a3-a6	; Setup ptrs to bpl0-3
86	add.l	d3,a3
87	add.l	d3,a4
88	add.l	d3,a5
89	add.l	d3,a6
90
91	move.l	(a0)+,d0		; Convert lower 4 bpls
92	move.l	(a0)+,d2
93	move.l	(a0)+,d1
94	move.l	(a0)+,d3
95
96	move.l	#$0f0f0f0f,d6		; Merge 4x1, part 1
97	and.l	d6,d0
98	and.l	d6,d1
99	and.l	d6,d2
100	and.l	d6,d3
101	lsl.l	#4,d0
102	lsl.l	#4,d1
103	or.l	d2,d0
104	or.l	d3,d1
105
106	move.l	(a0)+,d2
107	move.l	(a0)+,d6
108	move.l	(a0)+,d3
109	move.l	(a0)+,d7
110
111	move.l	#$0f0f0f0f,d4		; Merge 4x1, part 2
112	and.l	d4,d2
113	and.l	d4,d6
114	and.l	d4,d3
115	and.l	d4,d7
116	lsl.l	#4,d2
117	lsl.l	#4,d3
118	or.l	d6,d2
119	or.l	d7,d3
120
121	move.w	d2,d6			; Swap 16x2
122	move.w	d3,d7
123	move.w	d0,d2
124	move.w	d1,d3
125	swap	d2
126	swap	d3
127	move.w	d2,d0
128	move.w	d3,d1
129	move.w	d6,d2
130	move.w	d7,d3
131
132	move.l	#$33333333,d4
133	move.l	d2,d6			; Swap 2x2
134	move.l	d3,d7
135	lsr.l	#2,d6
136	lsr.l	#2,d7
137	eor.l	d0,d6
138	eor.l	d1,d7
139	and.l	d4,d6
140	and.l	d4,d7
141	eor.l	d6,d0
142	eor.l	d7,d1
143	lsl.l	#2,d6
144	lsl.l	#2,d7
145	eor.l	d6,d2
146	eor.l	d7,d3
147
148	move.l	#$00ff00ff,d4
149	move.l	d1,d6			; Swap 8x1
150	move.l	d3,d7
151	lsr.l	#8,d6
152	lsr.l	#8,d7
153	eor.l	d0,d6
154	eor.l	d2,d7
155	bra	.x1start
156
157.x1
158	move.l	(a0)+,d0
159	move.l	(a0)+,d2
160	move.l	(a0)+,d1
161	move.l	(a0)+,d3
162	move.l	d7,(a3)+
163
164	move.l	#$0f0f0f0f,d6		; Merge 4x1, part 1
165	and.l	d6,d0
166	and.l	d6,d1
167	and.l	d6,d2
168	and.l	d6,d3
169	lsl.l	#4,d0
170	lsl.l	#4,d1
171	or.l	d2,d0
172	or.l	d3,d1
173
174	move.l	(a0)+,d2
175	move.l	(a0)+,d6
176	move.l	(a0)+,d3
177	move.l	(a0)+,d7
178	move.l	d4,(a4)+
179
180	move.l	#$0f0f0f0f,d4		; Merge 4x1, part 2
181	and.l	d4,d2
182	and.l	d4,d6
183	and.l	d4,d3
184	and.l	d4,d7
185	lsl.l	#4,d2
186	lsl.l	#4,d3
187	or.l	d6,d2
188	or.l	d7,d3
189
190	move.w	d2,d6			; Swap 16x2
191	move.w	d3,d7
192	move.w	d0,d2
193	move.w	d1,d3
194	swap	d2
195	swap	d3
196	move.w	d2,d0
197	move.w	d3,d1
198	move.w	d6,d2
199	move.w	d7,d3
200	move.l	d5,(a5)+
201
202	move.l	#$33333333,d4
203	move.l	d2,d6			; Swap 2x2
204	move.l	d3,d7
205	lsr.l	#2,d6
206	lsr.l	#2,d7
207	eor.l	d0,d6
208	eor.l	d1,d7
209	and.l	d4,d6
210	and.l	d4,d7
211	eor.l	d6,d0
212	eor.l	d7,d1
213	lsl.l	#2,d6
214	lsl.l	#2,d7
215	eor.l	d6,d2
216	eor.l	d7,d3
217
218	move.l	#$00ff00ff,d4
219	move.l	d1,d6			; Swap 8x1
220	move.l	d3,d7
221	lsr.l	#8,d6
222	lsr.l	#8,d7
223	eor.l	d0,d6
224	eor.l	d2,d7
225	move.l	a1,(a6)+
226.x1start
227	and.l	d4,d6
228	and.l	d4,d7
229	eor.l	d6,d0
230	eor.l	d7,d2
231	lsl.l	#8,d6
232	lsl.l	#8,d7
233	eor.l	d6,d1
234	eor.l	d7,d3
235
236	move.l	#$55555555,d4
237	move.l	d1,d5			; Swap 1x1
238	move.l	d3,d7
239	lsr.l	#1,d5
240	lsr.l	#1,d7
241	eor.l	d0,d5
242	eor.l	d2,d7
243	and.l	d4,d5
244	and.l	d4,d7
245	eor.l	d5,d0
246	eor.l	d7,d2
247	add.l	d5,d5
248	add.l	d7,d7
249	eor.l	d1,d5
250	eor.l	d3,d7
251
252	move.l	d0,a1
253	move.l	d2,d4
254
255	cmpa.l	a0,a2
256	bne	.x1
257
258	move.l	d7,(a3)+
259	move.l	d4,(a4)+
260	move.l	d5,(a5)+
261	move.l	a1,(a6)+
262
263	movem.l	(sp)+,a0-a1/d3
264
265	movem.l	bm_Planes+4*4(a1),a3-a6	; Setup ptrs to bpl4-7
266	add.l	d3,a3
267	add.l	d3,a4
268	add.l	d3,a5
269	add.l	d3,a6
270
271	move.l	(a0)+,d0		; Convert upper 4 bpls
272	move.l	(a0)+,d2
273	move.l	(a0)+,d1
274	move.l	(a0)+,d3
275
276	move.l	#$f0f0f0f0,d6		; Merge 4x1, part 1
277	and.l	d6,d0
278	and.l	d6,d1
279	and.l	d6,d2
280	and.l	d6,d3
281	lsr.l	#4,d2
282	lsr.l	#4,d3
283	or.l	d2,d0
284	or.l	d3,d1
285
286	move.l	(a0)+,d2
287	move.l	(a0)+,d6
288	move.l	(a0)+,d3
289	move.l	(a0)+,d7
290
291	move.l	#$f0f0f0f0,d4		; Merge 4x1, part 2
292	and.l	d4,d2
293	and.l	d4,d6
294	and.l	d4,d3
295	and.l	d4,d7
296	lsr.l	#4,d6
297	lsr.l	#4,d7
298	or.l	d6,d2
299	or.l	d7,d3
300
301	move.w	d2,d6			; Swap 16x2
302	move.w	d3,d7
303	move.w	d0,d2
304	move.w	d1,d3
305	swap	d2
306	swap	d3
307	move.w	d2,d0
308	move.w	d3,d1
309	move.w	d6,d2
310	move.w	d7,d3
311
312	move.l	#$33333333,d4
313	move.l	d2,d6			; Swap 2x2
314	move.l	d3,d7
315	lsr.l	#2,d6
316	lsr.l	#2,d7
317	eor.l	d0,d6
318	eor.l	d1,d7
319	and.l	d4,d6
320	and.l	d4,d7
321	eor.l	d6,d0
322	eor.l	d7,d1
323	lsl.l	#2,d6
324	lsl.l	#2,d7
325	eor.l	d6,d2
326	eor.l	d7,d3
327
328	move.l	#$00ff00ff,d4
329	move.l	d1,d6			; Swap 8x1
330	move.l	d3,d7
331	lsr.l	#8,d6
332	lsr.l	#8,d7
333	eor.l	d0,d6
334	eor.l	d2,d7
335	bra	.x2start
336
337.x2
338	move.l	(a0)+,d0
339	move.l	(a0)+,d2
340	move.l	(a0)+,d1
341	move.l	(a0)+,d3
342	move.l	d7,(a3)+
343
344	move.l	#$f0f0f0f0,d6		; Merge 4x1, part 1
345	and.l	d6,d0
346	and.l	d6,d1
347	and.l	d6,d2
348	and.l	d6,d3
349	lsr.l	#4,d2
350	lsr.l	#4,d3
351	or.l	d2,d0
352	or.l	d3,d1
353
354	move.l	(a0)+,d2
355	move.l	(a0)+,d6
356	move.l	(a0)+,d3
357	move.l	(a0)+,d7
358	move.l	d4,(a4)+
359
360	move.l	#$f0f0f0f0,d4		; Merge 4x1, part 2
361	and.l	d4,d2
362	and.l	d4,d6
363	and.l	d4,d3
364	and.l	d4,d7
365	lsr.l	#4,d6
366	lsr.l	#4,d7
367	or.l	d6,d2
368	or.l	d7,d3
369
370	move.w	d2,d6			; Swap 16x2
371	move.w	d3,d7
372	move.w	d0,d2
373	move.w	d1,d3
374	swap	d2
375	swap	d3
376	move.w	d2,d0
377	move.w	d3,d1
378	move.w	d6,d2
379	move.w	d7,d3
380	move.l	d5,(a5)+
381
382	move.l	#$33333333,d4
383	move.l	d2,d6			; Swap 2x2
384	move.l	d3,d7
385	lsr.l	#2,d6
386	lsr.l	#2,d7
387	eor.l	d0,d6
388	eor.l	d1,d7
389	and.l	d4,d6
390	and.l	d4,d7
391	eor.l	d6,d0
392	eor.l	d7,d1
393	lsl.l	#2,d6
394	lsl.l	#2,d7
395	eor.l	d6,d2
396	eor.l	d7,d3
397
398	move.l	#$00ff00ff,d4
399	move.l	d1,d6			; Swap 8x1
400	move.l	d3,d7
401	lsr.l	#8,d6
402	lsr.l	#8,d7
403	eor.l	d0,d6
404	eor.l	d2,d7
405	move.l	a1,(a6)+
406.x2start
407	and.l	d4,d6
408	and.l	d4,d7
409	eor.l	d6,d0
410	eor.l	d7,d2
411	lsl.l	#8,d6
412	lsl.l	#8,d7
413	eor.l	d6,d1
414	eor.l	d7,d3
415
416	move.l	#$55555555,d4
417	move.l	d1,d5			; Swap 1x1
418	move.l	d3,d7
419	lsr.l	#1,d5
420	lsr.l	#1,d7
421	eor.l	d0,d5
422	eor.l	d2,d7
423	and.l	d4,d5
424	and.l	d4,d7
425	eor.l	d5,d0
426	eor.l	d7,d2
427	add.l	d5,d5
428	add.l	d7,d7
429	eor.l	d1,d5
430	eor.l	d3,d7
431
432	move.l	d0,a1
433	move.l	d2,d4
434
435	cmpa.l	a0,a2
436	bne	.x2
437
438	move.l	d7,(a3)+
439	move.l	d4,(a4)+
440	move.l	d5,(a5)+
441	move.l	a1,(a6)+
442
443.exit
444	addq.l	#C2P1X1_8_C5_BM_SIZEOF,sp
445	movem.l	(sp)+,d2-d7/a2-a6
446.earlyexit
447	rts
448
449.c2p_mod
450	lsr.w	#3,d4
451	move.l	d4,C2P1X1_8_C5_BM_ROWMOD(sp) ; Modulo between two rows
452
453	move.l	a0,a2			; Ptr to end of line + 1 iter
454	add.w	C2P1X1_8_C5_BM_CHUNKYX(sp),a2
455	add.w	#32,a2
456
457	movem.l	a0-a2/d1/d3,-(sp)
458
459	movem.l	bm_Planes(a1),a3-a6	; Setup ptrs to bpl0-3
460	add.l	d3,a3
461	add.l	d3,a4
462	add.l	d3,a5
463	add.l	d3,a6
464
465	move.l	(a0)+,d0		; Convert lower 4 bpls
466	move.l	(a0)+,d2
467	move.l	(a0)+,d1
468	move.l	(a0)+,d3
469
470	move.l	#$0f0f0f0f,d6		; Merge 4x1, part 1
471	and.l	d6,d0
472	and.l	d6,d1
473	and.l	d6,d2
474	and.l	d6,d3
475	lsl.l	#4,d0
476	lsl.l	#4,d1
477	or.l	d2,d0
478	or.l	d3,d1
479
480	move.l	(a0)+,d2
481	move.l	(a0)+,d6
482	move.l	(a0)+,d3
483	move.l	(a0)+,d7
484
485	move.l	#$0f0f0f0f,d4		; Merge 4x1, part 2
486	and.l	d4,d2
487	and.l	d4,d6
488	and.l	d4,d3
489	and.l	d4,d7
490	lsl.l	#4,d2
491	lsl.l	#4,d3
492	or.l	d6,d2
493	or.l	d7,d3
494
495	move.w	d2,d6			; Swap 16x2
496	move.w	d3,d7
497	move.w	d0,d2
498	move.w	d1,d3
499	swap	d2
500	swap	d3
501	move.w	d2,d0
502	move.w	d3,d1
503	move.w	d6,d2
504	move.w	d7,d3
505
506	move.l	#$33333333,d4
507	move.l	d2,d6			; Swap 2x2
508	move.l	d3,d7
509	lsr.l	#2,d6
510	lsr.l	#2,d7
511	eor.l	d0,d6
512	eor.l	d1,d7
513	and.l	d4,d6
514	and.l	d4,d7
515	eor.l	d6,d0
516	eor.l	d7,d1
517	lsl.l	#2,d6
518	lsl.l	#2,d7
519	eor.l	d6,d2
520	eor.l	d7,d3
521
522	move.l	#$00ff00ff,d4
523	move.l	d1,d6			; Swap 8x1
524	move.l	d3,d7
525	lsr.l	#8,d6
526	lsr.l	#8,d7
527	eor.l	d0,d6
528	eor.l	d2,d7
529	bra	.modx1start
530.modx1y
531	add.w	C2P1X1_8_C5_BM_CHUNKYX+20(sp),a2 ; Skip to end of next
532						 ; line + 1 iter
533	move.l	C2P1X1_8_C5_BM_ROWMOD+20(sp),d0  ; Skip to beginning of
534	add.l	d0,a3				 ; next line
535	add.l	d0,a4
536	add.l	d0,a5
537	add.l	d0,a6
538.modx1
539	move.l	(a0)+,d0
540	move.l	(a0)+,d2
541	move.l	(a0)+,d1
542	move.l	(a0)+,d3
543	move.l	d7,(a3)+
544
545	move.l	#$0f0f0f0f,d6		; Merge 4x1, part 1
546	and.l	d6,d0
547	and.l	d6,d1
548	and.l	d6,d2
549	and.l	d6,d3
550	lsl.l	#4,d0
551	lsl.l	#4,d1
552	or.l	d2,d0
553	or.l	d3,d1
554
555	move.l	(a0)+,d2
556	move.l	(a0)+,d6
557	move.l	(a0)+,d3
558	move.l	(a0)+,d7
559	move.l	d4,(a4)+
560
561	move.l	#$0f0f0f0f,d4		; Merge 4x1, part 2
562	and.l	d4,d2
563	and.l	d4,d6
564	and.l	d4,d3
565	and.l	d4,d7
566	lsl.l	#4,d2
567	lsl.l	#4,d3
568	or.l	d6,d2
569	or.l	d7,d3
570
571	move.w	d2,d6			; Swap 16x2
572	move.w	d3,d7
573	move.w	d0,d2
574	move.w	d1,d3
575	swap	d2
576	swap	d3
577	move.w	d2,d0
578	move.w	d3,d1
579	move.w	d6,d2
580	move.w	d7,d3
581	move.l	d5,(a5)+
582
583	move.l	#$33333333,d4
584	move.l	d2,d6			; Swap 2x2
585	move.l	d3,d7
586	lsr.l	#2,d6
587	lsr.l	#2,d7
588	eor.l	d0,d6
589	eor.l	d1,d7
590	and.l	d4,d6
591	and.l	d4,d7
592	eor.l	d6,d0
593	eor.l	d7,d1
594	lsl.l	#2,d6
595	lsl.l	#2,d7
596	eor.l	d6,d2
597	eor.l	d7,d3
598
599	move.l	#$00ff00ff,d4
600	move.l	d1,d6			; Swap 8x1
601	move.l	d3,d7
602	lsr.l	#8,d6
603	lsr.l	#8,d7
604	eor.l	d0,d6
605	eor.l	d2,d7
606	move.l	a1,(a6)+
607.modx1start
608	and.l	d4,d6
609	and.l	d4,d7
610	eor.l	d6,d0
611	eor.l	d7,d2
612	lsl.l	#8,d6
613	lsl.l	#8,d7
614	eor.l	d6,d1
615	eor.l	d7,d3
616
617	move.l	#$55555555,d4
618	move.l	d1,d5			; Swap 1x1
619	move.l	d3,d7
620	lsr.l	#1,d5
621	lsr.l	#1,d7
622	eor.l	d0,d5
623	eor.l	d2,d7
624	and.l	d4,d5
625	and.l	d4,d7
626	eor.l	d5,d0
627	eor.l	d7,d2
628	add.l	d5,d5
629	add.l	d7,d7
630	eor.l	d1,d5
631	eor.l	d3,d7
632
633	move.l	d0,a1
634	move.l	d2,d4
635
636	cmpa.l	a0,a2
637	bne	.modx1
638
639	subq.w	#1,C2P1X1_8_C5_BM_CHUNKYY+20(sp)
640	bne	.modx1y
641
642	movem.l	(sp)+,a0-a2/d1/d3
643
644	move.w	d1,C2P1X1_8_C5_BM_CHUNKYY(sp)
645
646	movem.l	bm_Planes+4*4(a1),a3-a6	; Setup ptrs to bpl4-7
647	add.l	d3,a3
648	add.l	d3,a4
649	add.l	d3,a5
650	add.l	d3,a6
651
652	move.l	(a0)+,d0		; Convert lower 4 bpls
653	move.l	(a0)+,d2
654	move.l	(a0)+,d1
655	move.l	(a0)+,d3
656
657	move.l	#$f0f0f0f0,d6		; Merge 4x1, part 1
658	and.l	d6,d0
659	and.l	d6,d1
660	and.l	d6,d2
661	and.l	d6,d3
662	lsr.l	#4,d2
663	lsr.l	#4,d3
664	or.l	d2,d0
665	or.l	d3,d1
666
667	move.l	(a0)+,d2
668	move.l	(a0)+,d6
669	move.l	(a0)+,d3
670	move.l	(a0)+,d7
671
672	move.l	#$f0f0f0f0,d4		; Merge 4x1, part 2
673	and.l	d4,d2
674	and.l	d4,d6
675	and.l	d4,d3
676	and.l	d4,d7
677	lsr.l	#4,d6
678	lsr.l	#4,d7
679	or.l	d6,d2
680	or.l	d7,d3
681
682	move.w	d2,d6			; Swap 16x2
683	move.w	d3,d7
684	move.w	d0,d2
685	move.w	d1,d3
686	swap	d2
687	swap	d3
688	move.w	d2,d0
689	move.w	d3,d1
690	move.w	d6,d2
691	move.w	d7,d3
692
693	move.l	#$33333333,d4
694	move.l	d2,d6			; Swap 2x2
695	move.l	d3,d7
696	lsr.l	#2,d6
697	lsr.l	#2,d7
698	eor.l	d0,d6
699	eor.l	d1,d7
700	and.l	d4,d6
701	and.l	d4,d7
702	eor.l	d6,d0
703	eor.l	d7,d1
704	lsl.l	#2,d6
705	lsl.l	#2,d7
706	eor.l	d6,d2
707	eor.l	d7,d3
708
709	move.l	#$00ff00ff,d4
710	move.l	d1,d6			; Swap 8x1
711	move.l	d3,d7
712	lsr.l	#8,d6
713	lsr.l	#8,d7
714	eor.l	d0,d6
715	eor.l	d2,d7
716	bra	.modx2start
717
718.modx2y
719	add.w	C2P1X1_8_C5_BM_CHUNKYX(sp),a2 ; Skip to end of next line + 1
720					      ; iter
721	move.l	C2P1X1_8_C5_BM_ROWMOD(sp),d0  ; Skip to beginning of
722	add.l	d0,a3			      ; next line
723	add.l	d0,a4
724	add.l	d0,a5
725	add.l	d0,a6
726.modx2
727	move.l	(a0)+,d0
728	move.l	(a0)+,d2
729	move.l	(a0)+,d1
730	move.l	(a0)+,d3
731	move.l	d7,(a3)+
732
733	move.l	#$f0f0f0f0,d6		; Merge 4x1, part 1
734	and.l	d6,d0
735	and.l	d6,d1
736	and.l	d6,d2
737	and.l	d6,d3
738	lsr.l	#4,d2
739	lsr.l	#4,d3
740	or.l	d2,d0
741	or.l	d3,d1
742
743	move.l	(a0)+,d2
744	move.l	(a0)+,d6
745	move.l	(a0)+,d3
746	move.l	(a0)+,d7
747	move.l	d4,(a4)+
748
749	move.l	#$f0f0f0f0,d4		; Merge 4x1, part 2
750	and.l	d4,d2
751	and.l	d4,d6
752	and.l	d4,d3
753	and.l	d4,d7
754	lsr.l	#4,d6
755	lsr.l	#4,d7
756	or.l	d6,d2
757	or.l	d7,d3
758
759	move.w	d2,d6			; Swap 16x2
760	move.w	d3,d7
761	move.w	d0,d2
762	move.w	d1,d3
763	swap	d2
764	swap	d3
765	move.w	d2,d0
766	move.w	d3,d1
767	move.w	d6,d2
768	move.w	d7,d3
769	move.l	d5,(a5)+
770
771	move.l	#$33333333,d4
772	move.l	d2,d6			; Swap 2x2
773	move.l	d3,d7
774	lsr.l	#2,d6
775	lsr.l	#2,d7
776	eor.l	d0,d6
777	eor.l	d1,d7
778	and.l	d4,d6
779	and.l	d4,d7
780	eor.l	d6,d0
781	eor.l	d7,d1
782	lsl.l	#2,d6
783	lsl.l	#2,d7
784	eor.l	d6,d2
785	eor.l	d7,d3
786
787	move.l	#$00ff00ff,d4
788	move.l	d1,d6			; Swap 8x1
789	move.l	d3,d7
790	lsr.l	#8,d6
791	lsr.l	#8,d7
792	eor.l	d0,d6
793	eor.l	d2,d7
794	move.l	a1,(a6)+
795.modx2start
796	and.l	d4,d6
797	and.l	d4,d7
798	eor.l	d6,d0
799	eor.l	d7,d2
800	lsl.l	#8,d6
801	lsl.l	#8,d7
802	eor.l	d6,d1
803	eor.l	d7,d3
804
805	move.l	#$55555555,d4
806	move.l	d1,d5			; Swap 1x1
807	move.l	d3,d7
808	lsr.l	#1,d5
809	lsr.l	#1,d7
810	eor.l	d0,d5
811	eor.l	d2,d7
812	and.l	d4,d5
813	and.l	d4,d7
814	eor.l	d5,d0
815	eor.l	d7,d2
816	add.l	d5,d5
817	add.l	d7,d7
818	eor.l	d1,d5
819	eor.l	d3,d7
820
821	move.l	d0,a1
822	move.l	d2,d4
823
824	cmpa.l	a0,a2
825	bne	.modx2
826
827	subq.w	#1,C2P1X1_8_C5_BM_CHUNKYY(sp)
828	bne	.modx2y
829
830	bra	.exit
831
832