;/****************************************************************
;This code is copyright 1993. All Rights Reserved. Authors:-
;
;  Chris Hames
;
;****************************************************************/

;	INCLUDE "defines.i"

	section	data

	XDEF	_mdtmps

sbpr:
	dc.l	0


	section	code

	XDEF	_cpuclear
	XDEF	_cpuclear2

; Could make this much faster if actual sizes are known

_cpuclear:						; has to be multiple of 4 in size
	move.l	4(sp),a0			/* Pointer to mem
	move.l	8(sp),d0			/* size
	lsr.l	#2,d0
	subq.l	#1,d0
	moveq	#0,d1
loophere:
	move.l	d1,(a0)+
	dbra	d0,loophere
	rts

_cpuclear2:						; has to be multiple of 4 in size
	move.l	4(sp),a0			/* Pointer to mem
	move.l	8(sp),d0			/* size
	lsr.l	#2,d0
	subq.l	#1,d0
	moveq	#1,d1
loophere2:
	move.l	d1,(a0)+
	dbra	d0,loophere2
	rts

	XREF	_fastbm
	XREF	_lines


	XDEF	_fasttochip

_fasttochip:
	movem.l	d2-d7/a2-a6,-(sp)
	move.l	44+4(sp),a0		;/* pointer to dst BitMap */
	lea	_fastbm,a1			;/* pointer to src bitmap */
	move.l  #sbpr,a2
	move.w  (a1),(a2)
	move.l	8(a1),a2		;/* pointer to src mem    */
	move.l	8(a0),a3		;/* pointer to dst plane0 */
	move.l	12(a0),a4		;/* pointer to dst plane1 */
	move.l	16(a0),a5		;/* pointer to dst plane2 */
	move.l	20(a0),a6		;/* pointer to dst plane3 */
	move.l	24(a0),a1		;/* pointer to dst plane4 */

	move.w	(a0),d4			;/* get bytes per row */
	move.w	2(a0),d5		;/* get Rows */

	subq.w	#1,d5			;(Rows/2)-1
floop:
	lea	_lines,a0
	move.w  sbpr,d6
	lsr.w   #2,d6
	subq.w  #1,d6
;	moveq	#(SBYTESPERROW/4)-1,d6
lloop:
	movem.l	(a2)+,d0-d3		;Get 32 pixels (4 bitplanes)
	move.b	d0,d4
	lsl.w	#8,d4
	move.b	d1,d4
	swap	d4
	move.b	d2,d4
	lsl.w	#8,d4
	move.b	d3,d4
	lsr.w	#8,d0
	lsr.w	#8,d1
	lsr.w	#8,d2
	lsr.w	#8,d3
	move.l	d4,(a6)+		;Do top copy

	move.b	d0,d4
	lsl.w	#8,d4
	move.b	d1,d4
	swap	d4
	move.b	d2,d4
	lsl.w	#8,d4
	move.b	d3,d4
	swap	d0
	swap	d1
	swap	d2
	swap	d3
	move.l	d4,(a5)+		;Do top copy

	move.b	d0,d4
	lsl.w	#8,d4
	move.b	d1,d4
	swap	d4
	move.b	d2,d4
	lsl.w	#8,d4
	move.b	d3,d4
	lsr.w	#8,d0
	lsr.w	#8,d1
	lsr.w	#8,d2
	lsr.w	#8,d3
	move.l	d4,(a4)+		;Do Top copy

	move.b	d0,d4
	lsl.w	#8,d4
	move.b	d1,d4
	swap	d4
	move.b	d2,d4
	lsl.w	#8,d4
	move.b	d3,d4
	move.l	d4,(a3)+		;Do top copy

	move.l	(a0)+,d4		;Do the special 5th bitplane
	move.l	d4,(a1)+

	dbra	d6,lloop

	dbra	d5,floop

	movem.l	(sp)+,d2-d7/a2-a6
	rts


	XDEF	_fasttochip2

_fasttochip2:
	movem.l	d2-d7/a2-a6,-(sp)
	move.l	44+4(sp),a0		;/* pointer to dst BitMap */
	lea	_fastbm,a1		;/* pointer to src bitmap */
	move.l	8(a1),a2		;/* pointer to src mem    */
	move.l	8(a0),a3		;/* pointer to dst plane0 */
	move.l	12(a0),a4		;/* pointer to dst plane1 */
	move.l	16(a0),a5		;/* pointer to dst plane2 */
	move.l	20(a0),a6		;/* pointer to dst plane3 */
	move.l	24(a0),a1		;/* pointer to dst plane4 */

	move.w	(a0),d4			;/* get bytes per row */
	move.w	2(a0),d5		;/* get Rows */

	lsr.w	#1,d5
	subq.w	#1,d5			;((Rows/2)/2)-1
floop2:
	lea	_lines,a0
	move.w  sbpr,d6
	lsr.w   #2,d6
	subq.w  #1,d6
;	moveq	#(SBYTESPERROW/4)-1,d6
lloop2:
	move.w  sbpr,d2
	movem.l	(a2)+,d0-d1			;Get 16 pixels (4 bitplanes)
	move.l	a2,-(sp)
	lea	Table,a2
	moveq	#0,d4
	move.b	d0,d4
	add.w	d4,d4				; This is not needed if 68020+
	move.w	0(a2,d4.w),d4
	swap	d4
	move.b	d1,d4
	add.w	d4,d4				; This is not needed if 68020+
	move.w	0(a2,d4.w),d4
	move.l	d4,0(a6,d2.w)		;Do top copy
	move.l	d4,(a6)+			;Do top copy
	lsr.w	#8,d0
	lsr.w	#8,d1

	moveq	#0,d4
	move.b	d0,d4
	add.w	d4,d4				; This is not needed if 68020+
	move.w	0(a2,d4.w),d4
	swap	d4
	move.b	d1,d4
	add.w	d4,d4				; This is not needed if 68020+
	move.w	0(a2,d4.w),d4
	move.l	d4,0(a5,d2.w)		;Do top copy
	move.l	d4,(a5)+			;Do top copy
	swap	d0
	swap	d1

	moveq	#0,d4
	move.b	d0,d4
	add.w	d4,d4				; This is not needed if 68020+
	move.w	0(a2,d4.w),d4
	swap	d4
	move.b	d1,d4
	add.w	d4,d4				; This is not needed if 68020+
	move.w	0(a2,d4.w),d4
	move.l	d4,0(a4,d2.w)		;Do top copy
	move.l	d4,(a4)+			;Do top copy
	lsr.w	#8,d0
	lsr.w	#8,d1

	moveq	#0,d4
	move.b	d0,d4
	add.w	d4,d4				; This is not needed if 68020+
	move.w	0(a2,d4.w),d4
	swap	d4
	move.b	d1,d4
	add.w	d4,d4				; This is not needed if 68020+
	move.w	0(a2,d4.w),d4
	move.l	d4,0(a3,d2.w)		;Do top copy
	move.l	d4,(a3)+			;Do top copy

	moveq	#0,d4
	move.w	(a0)+,d1		;Do the special 5th bitplane
	move.w	d1,d4
	lsr.w	#8,d4
	add.w	d4,d4				; This is not needed if 68020+
	move.w	0(a2,d4.w),d4
	swap	d4
	move.b	d1,d4
	add.w	d4,d4				; This is not needed if 68020+
	move.w	0(a2,d4.w),d4
	move.l	d4,0(a1,d2.w)		;Do top copy
	move.l	d4,(a1)+			;Do top copy

	move.l	(sp)+,a2
	dbra	d6,lloop2

	move.w  sbpr,d6
	adda.w	d6,a6
	adda.w	d6,a5
	adda.w	d6,a4
	adda.w	d6,a3

	adda.w	d6,a1

	dbra	d5,floop2

	movem.l	(sp)+,d2-d7/a2-a6
	rts

        XDEF    _ReadEClock

_ReadEClock:
        move.l  4(sp),a0
        move.l  a6,-(sp)
        move.l  _TimerBase#,a6
        jsr     -$3c(a6)
        move.l  (sp)+,a6
        rts


	section	data

Table:
 dc.w $0000,$0003,$000c,$000f,$0030,$0033,$003c,$003f
 dc.w $00c0,$00c3,$00cc,$00cf,$00f0,$00f3,$00fc,$00ff
 dc.w $0300,$0303,$030c,$030f,$0330,$0333,$033c,$033f
 dc.w $03c0,$03c3,$03cc,$03cf,$03f0,$03f3,$03fc,$03ff
 dc.w $0c00,$0c03,$0c0c,$0c0f,$0c30,$0c33,$0c3c,$0c3f
 dc.w $0cc0,$0cc3,$0ccc,$0ccf,$0cf0,$0cf3,$0cfc,$0cff
 dc.w $0f00,$0f03,$0f0c,$0f0f,$0f30,$0f33,$0f3c,$0f3f
 dc.w $0fc0,$0fc3,$0fcc,$0fcf,$0ff0,$0ff3,$0ffc,$0fff
 dc.w $3000,$3003,$300c,$300f,$3030,$3033,$303c,$303f
 dc.w $30c0,$30c3,$30cc,$30cf,$30f0,$30f3,$30fc,$30ff
 dc.w $3300,$3303,$330c,$330f,$3330,$3333,$333c,$333f
 dc.w $33c0,$33c3,$33cc,$33cf,$33f0,$33f3,$33fc,$33ff
 dc.w $3c00,$3c03,$3c0c,$3c0f,$3c30,$3c33,$3c3c,$3c3f
 dc.w $3cc0,$3cc3,$3ccc,$3ccf,$3cf0,$3cf3,$3cfc,$3cff
 dc.w $3f00,$3f03,$3f0c,$3f0f,$3f30,$3f33,$3f3c,$3f3f
 dc.w $3fc0,$3fc3,$3fcc,$3fcf,$3ff0,$3ff3,$3ffc,$3fff
 dc.w $c000,$c003,$c00c,$c00f,$c030,$c033,$c03c,$c03f
 dc.w $c0c0,$c0c3,$c0cc,$c0cf,$c0f0,$c0f3,$c0fc,$c0ff
 dc.w $c300,$c303,$c30c,$c30f,$c330,$c333,$c33c,$c33f
 dc.w $c3c0,$c3c3,$c3cc,$c3cf,$c3f0,$c3f3,$c3fc,$c3ff
 dc.w $cc00,$cc03,$cc0c,$cc0f,$cc30,$cc33,$cc3c,$cc3f
 dc.w $ccc0,$ccc3,$cccc,$cccf,$ccf0,$ccf3,$ccfc,$ccff
 dc.w $cf00,$cf03,$cf0c,$cf0f,$cf30,$cf33,$cf3c,$cf3f
 dc.w $cfc0,$cfc3,$cfcc,$cfcf,$cff0,$cff3,$cffc,$cfff
 dc.w $f000,$f003,$f00c,$f00f,$f030,$f033,$f03c,$f03f
 dc.w $f0c0,$f0c3,$f0cc,$f0cf,$f0f0,$f0f3,$f0fc,$f0ff
 dc.w $f300,$f303,$f30c,$f30f,$f330,$f333,$f33c,$f33f
 dc.w $f3c0,$f3c3,$f3cc,$f3cf,$f3f0,$f3f3,$f3fc,$f3ff
 dc.w $fc00,$fc03,$fc0c,$fc0f,$fc30,$fc33,$fc3c,$fc3f
 dc.w $fcc0,$fcc3,$fccc,$fccf,$fcf0,$fcf3,$fcfc,$fcff
 dc.w $ff00,$ff03,$ff0c,$ff0f,$ff30,$ff33,$ff3c,$ff3f
 dc.w $ffc0,$ffc3,$ffcc,$ffcf,$fff0,$fff3,$fffc,$ffff


