; 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]
shl edx,16
mov dx,[mr_xstep]
mov si,[mr_yfrac]
shl esi,16
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