; WOLFHACK.ASM

.386C
IDEAL
MODEL	MEDIUM,C


;============================================================================

DATASEG

EXTRN	mr_rowofs:WORD
EXTRN	mr_count:WORD
EXTRN	mr_xstep:WORD
EXTRN	mr_ystep:WORD
EXTRN	mr_xfrac:WORD
EXTRN	mr_yfrac:WORD
EXTRN	mr_dest:WORD

FARDATA

planepics	db	8192 dup(?)	;	// 4k of ceiling, 4k of floor
PUBLIC	planepics


;============================================================================

CODESEG

;============================
;
; MapRow
;
;
;============================

PROC	MapRow
PUBLIC	MapRow
	push	esi
	push	edi
	push	ebp
	push 	ds

	mov     bp,[mr_rowofs]
	mov		cx,[mr_count]
	mov		dx,[mr_ystep]
	;begin 8086 hack
	;shl		edx,16
	push cx
	mov		cl,16
	shl		edx,cl
	pop cx
	;end 8086 hack
	mov		dx,[mr_xstep]
	mov		si,[mr_yfrac]
	;begin 8086 hack
	;shl		esi,16
	push cx
	mov		cl,16
	shl		esi,cl
	pop cx
	;end 8086 hack
	mov		si,[mr_xfrac]
	mov		di,[mr_dest]
	mov		ax,SEG planepics
	mov		ds,ax
	mov		ax,0a000h
	mov		es,ax
	mov		ax,1111111111110b

; eax		color lookup
; ebx		scratch offset and pixel values
; ecx     	loop counter
; edx		packed x / y step values
; esi		packed x / y fractional values
; edi		write pointer
; ebp		toprow to bottomrow delta
; es:		screenseg
; ds:		pictures

; mov	al,[esi]
; mov	al,[eax]
; mov	[edi],al

; mov   ax,[_variable+ebx+2]


pixelloop:
	shld	ebx,esi,22				; shift y units in
	shld	ebx,esi,7				; shift x units in and one extra bit
	and		bx,63*65*2				; mask off extra top bits and 0 low bit
	add		esi,edx					; position += step
	mov		al,[bx]
	mov		al,[eax]
	mov     [es:di],al     			; write ceiling pixel
	mov		al,[bx+1]
	mov		al,[eax]
	mov     [es:di+bp],al     		; write floor pixel
	inc		di
	loop	pixelloop

	pop		ds
	pop		ebp
	pop		edi
	pop		esi

	retf

ENDP

END

