1 .386 2 .MODEL flat 3 4;================ 5; 6; R_DrawFilmColumn 7; 8;================ 9 10SCREENWIDTH = 96 11 12 13.data 14loopcount dd 0 15pixelcount dd 0 16EXTRN _dc_yl:DWORD 17EXTRN _dc_yh:DWORD 18EXTRN _dc_ycenter:DWORD 19EXTRN _dc_iscale:DWORD 20EXTRN _dc_texturemid:DWORD 21EXTRN _ylookup:DWORD 22EXTRN _dc_source:DWORD 23 24.code 25SEGMENT text USE32 26 ALIGN 16 27 28PROC R_DrawFilmColumn_ 29PUBLIC R_DrawFilmColumn_ 30 push ebp 31 mov ebp,[_dc_yl] 32 mov ebx,ebp 33 add edi,[_ylookup+ebx*4] 34 mov eax,[_dc_yh] 35 inc eax 36 sub eax,ebp ; pixel count 37 mov [pixelcount],eax ; save for final pixel 38 js done ; nothing to scale 39 shr eax,1 ; double pixel count 40 mov [loopcount],eax 41 42 mov ecx,[_dc_iscale] 43 44 mov eax,[_dc_ycenter] 45 sub eax,ebp 46 imul ecx 47 mov ebp,[_dc_texturemid] 48 sub ebp,eax 49 50 mov esi,[_dc_source] 51 52 53 mov ebx,[_dc_iscale] 54 mov eax,OFFSET patch1+2 ; convice tasm to modify code... 55 mov [eax],ebx 56 mov eax,OFFSET patch2+2 ; convice tasm to modify code... 57 mov [eax],ebx 58 59; eax aligned colormap 60; ebx aligned colormap 61; ecx,edx scratch 62; esi virtual source 63; edi moving destination pointer 64; ebp frac 65 66 mov ecx,ebp ; begin calculating first pixel 67 add ebp,ebx ; advance frac pointer 68 shr ecx,16 ; finish calculation for first pixel 69 mov edx,ebp ; begin calculating second pixel 70 add ebp,ebx ; advance frac pointer 71 shr edx,16 ; finish calculation for second pixel 72 mov al,[esi+ecx] ; get first pixel 73 mov bl,[esi+edx] ; get second pixel 74 75 test [pixelcount],0fffffffeh 76 jnz doubleloop ; at least two pixels to map 77 jmp checklast 78 79 ALIGN 16 80doubleloop: 81 mov ecx,ebp ; begin calculating third pixel 82patch1: 83 add ebp,12345678h ; advance frac pointer 84 mov [edi],al ; write first pixel 85 shr ecx,16 ; finish calculation for third pixel 86 mov edx,ebp ; begin calculating fourth pixel 87patch2: 88 add ebp,12345678h ; advance frac pointer 89 mov [edi+SCREENWIDTH],bl ; write second pixel 90 shr edx,16 ; finish calculation for fourth pixel 91 mov al,[esi+ecx] ; get third pixel 92 add edi,SCREENWIDTH*2 ; advance to third pixel destination 93 mov bl,[esi+edx] ; get fourth pixel 94 dec [loopcount] ; done with loop? 95 jnz doubleloop 96 97; check for final pixel 98checklast: 99 test [pixelcount],1 100 jz done 101 mov [edi],al ; write final pixel 102done: 103 pop ebp 104 ret 105 106ENDP 107ENDS 108 109 110END 111 112