		mc68020
		multipass

		xdef	@R_DrawColumn
		xdef	@R_DrawSpan

		xref	_dc_yl
		xref	_dc_yh
		xref	_dc_x
		xref	_columnofs
		xref	_ylookup
		xref	_dc_iscale
		xref	_centery
		xref	_dc_texturemid
		xref	_dc_source
		xref	_dc_colormap
		xref	_ds_xfrac
		xref	_ds_yfrac
		xref	_ds_x1
		xref	_ds_y
		xref	_ds_x2
		xref	_ds_xstep
		xref	_ds_ystep
		xref	_ds_source
		xref	_ds_colormap

SCREENWIDTH	equ	320
FRACBITS	equ	16

;***********************************************************************
@R_DrawColumn	movem.l	d3-d7/a2-a5,-(sp)
		move.l	(_dc_yl),d0
		move.l	(_dc_yh),d7
		sub.l	d0,d7
		bmi.b	1$
		move.l	(_dc_x),d1
		lea	(_columnofs),a5
		lea	(a5,d1.l*4),a1
		lea	(_ylookup),a5
		movea.l	(a5,d0.l*4),a2
		adda.l	(a1),a2
		move.l	(_dc_iscale),d6
		sub.l	(_centery),d0
		muls.l	d6,d0
		move.l	(_dc_texturemid),d5
		add.l	d0,d5
		movea.l	(_dc_source),a3
		movea.l	(_dc_colormap),a4
		moveq	#127,d4
		move.l	#SCREENWIDTH,d3
		moveq	#0,d1		; ensure high bits of d1 are clear
2$		move.l	d5,d0		; frac
		swap	d0
		and.w	d4,d0		; (frac>>16)&127
		move.b	(a3,d0.w),d1	; dc_source[(frac>>FRACBITS)&127]
		move.b	(a4,d1.w),(a2)	; *dest = dc_colormap[d1]
		adda.l	d3,a2		; dest += SCREENWIDTH
		add.l	d6,d5		; frac += fracstep
		dbra	d7,2$
1$		movem.l	(sp)+,d3-d7/a2-a5
		rts

;void R_DrawColumn (void)
;{
;  int count;
;  byte* dest;
;  fixed_t frac;
;  fixed_t fracstep;
;
;  count = dc_yh - dc_yl;
;  if (count < 0)
;    return;
;  dest = ylookup[dc_yl] + columnofs[dc_x];
;  fracstep = dc_iscale;
;  frac = dc_texturemid + (dc_yl-centery)*fracstep;
;  do {
;    *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]];
;    dest += SCREENWIDTH;
;    frac += fracstep;
;  } while (count--);
;}

;***********************************************************************
@R_DrawSpan	movem.l	d2-d7/a2-a5,-(a7)
		move.l	(_ds_x1),d0
		lea	(_columnofs),a5
		lea	(a5,d0.l*4),a1
		move.l	(_ds_y),d1
		lea	(_ylookup),a5
		movea.l	(a5,d1.l*4),a2
		adda.l	(a1),a2
		move.l	(_ds_x2),d5
		sub.l	d0,d5		; count
		movea.l	(_ds_source),a3
		movea.l	(_ds_colormap),a4
		move.l	(_ds_xstep),d3
		move.l	(_ds_ystep),d4
		moveq	#10,d2
		moveq	#63,d6
		move.l	#63*64,d7
		movea.l	(_ds_xfrac),a0	; xfrac
		movea.l	(_ds_yfrac),a1	; yfrac
1$		move.l	a0,d0		; xfrac
		swap	d0
		and.l	d6,d0		; (xfrac>>16)&63
		move.l	a1,d1		; yfrac
		asr.l	d2,d1
		and.l	d7,d1		; (yfrac>>10)&(63*64)
		add.l	d0,d1		; spot
		moveq	#0,d0
		move.b	(a3,d1.l),d0	; ds_source[spot]
		move.b	(a4,d0.w),(a2)+	; *dest++ = ds_colormap[...]
		adda.l	d3,a0		; xfrac += ds_xstep
		adda.l	d4,a1		; yfrac += ds_ystep
		dbra	d5,1$
		movem.l	(a7)+,d2-d7/a2-a5
		rts

;void R_DrawSpan (void)
;{
;  fixed_t xfrac, yfrac;
;  byte* dest;
;  int count, spot;
;
;  xfrac = ds_xfrac;
;  yfrac = ds_yfrac;
;  dest = ylookup[ds_y] + columnofs[ds_x1];
;  count = ds_x2 - ds_x1;
;  do {
;    spot = ((yfrac>>(16-6))&(63*64)) + ((xfrac>>16)&63);
;    *dest++ = ds_colormap[ds_source[spot]];
;    xfrac += ds_xstep;
;    yfrac += ds_ystep;
;  } while (count--);
;}

;***********************************************************************

		end
