*
* Zoom 16 screen lines up by 8 times
*
		csect	program

		xdef	@zoomLine
*
* Zoom a 16x16 square of pixels by 8
*
* void
* zoomLine(void *screen, void *zoomed, short lineBytes, short offset)
*
* screen    : (word) address of top line in screen to be zoomed
* zoomed    : address of array uchar[128][16]
* lineBytes : bytes per screen line (found from line A structure)
* offset    : bit offset of required word in a screen longword
*
* Lattice requires that functions preserve d2-d7/a2-6
*
@zoomLine
		movem.l	d2-d4/a2,-(sp)

		swap.w	d0
		clr.w	d0
		swap.w	d0

		move.l	#$fefefefe,d2

		move.w	#15,d3
oneline:
		move.l	(a0),d4				Get 32 pixels
		rol.l	d1,d4				Rotate to get correct pixels in top word
		swap.w	d4					Pixels now in low word of d4
		adda.l	d0,a0				Point to next screen line down
		movea.l	a1,a2				Save in a2, preparing for copy

* a0 = next screen line
* a1 = 0'th line of zoomed blocks
* a2 = 0'th line of zoomed blocks
* d0 = bytes per screen line
* d1 = shift for screen pixels
* d2 = bit mask to get the Mac-style zoomed blocks
* d3 = line count
* d4 = (word) pixels

* 16 rotates and scs's produce a zoomed line in (a2)

		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+
		rol.w	#1,d4
		scs.b	(a1)+

		and.l	d2,(a2)+			Clear right-most bit in each byte
		and.l	d2,(a2)+
		and.l	d2,(a2)+
		and.l	d2,(a2)

		lea		-12(a2),a2			Correct

* Copy line 0 to line 1
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+			Line 1
* Line 1 to line 2
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+			Line 2
* Line 2 to line 3
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+			Line 3
* Line 3 to line 4
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+			Line 4
* Line 4 to line 5
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+			Line 5
* Line 5 to line 6
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2)+,(a1)+
		move.l	(a2),(a1)+			Line 6
* Clear line 7
		clr.l	(a1)+
		clr.l	(a1)+
		clr.l	(a1)+
		clr.l	(a1)+				Line 7

* a0 = address of next screen word to be zoomed
* a1 = address of first long in next zoom line
* a2 = address of last long in line 6
* d0 = bytes per screen line
* d2 = 0xfefefefe
* d3 = line count
* d4 = screen word

		dbra	d3,oneline

		movem.l	(sp)+,d2-d4/a2

		rts

		end

* End of zoomline.s
