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