; 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