convert line ends
[canaan.git] / prj / tech / libsrc / g2 / ptlinear.asm
blob545c844b21296dee58c5c5c9aafd20797e44ff85
1 ; $Header: x:/prj/tech/libsrc/g2/RCS/ptlinear.asm 1.2 1998/03/23 14:56:29 KEVIN Exp $
3 ; PORTAL Texture Mappers
5 ; ptlinear.asm
7 ; linear outer (per 8 pixel) loops
10 .486
11 .nolist
13 include macros.inc
14 include lg.inc
15 include fix.inc
16 include thunks.inc
18 .list
20 assume cs:_TEXT, ds:_DATA
22 extd _g2pt_tmap_mask
23 extd _g2pt_tmap_ptr
24 extd _g2pt_buffer
25 extd _g2pt_lit_buffer
27 extd _g2pt_light
28 extd _g2pt_dlight
30 extd _g2pt_func_n
31 extd _g2pt_func_8
33 extd _g2pt_dest
35 _DATA segment dword public USE32 'DATA'
37 align 4
39 dlight_8 dd 0
41 pixel_count dd 0
42 scanline_count dd 0
44 dest_save dd 0
45 count_save dd 0
46 pixel_save dd 0
48 save_ebp dd 0
49 save_edx dd 0
51 _DATA ends
54 _TEXT segment para public USE32 'CODE'
56 ;extn g2ptmap_run_
57 ;extn g2ptmap_flat_run_
58 ;extn g2ptmap_lit_run_
59 ;extn g2ptmap_setup_uv
60 extn g2ptmap_setup_duv
61 extn g2ptmap_setup_uvduv
62 extn g2pt_compute_light_n
63 extn g2pt_compute_light_8
65 ; g2ptmap_AFFINE_DUV
66 ; eax = DU
67 ; edx = DV
69 _FUNCDEF g2ptmap_affine_duv,2
70 mov save_edx,eax
71 mov save_ebp,edx
73 ret
76 ; edx = DU
77 ; ecx = DV
79 ; g2ptmap_RUN
81 ; old parms:
82 ; esi = count
83 ; eax = V
84 ; ebx = U
85 ; edi = dest
87 ; new parms:
88 ; eax = dest
89 ; edx = count
90 ; ebx = U
91 ; ecx = V
93 _FUNCDEF g2ptmap_run,4
94 push ebp
95 push esi
96 push edi
98 mov pixel_count,edx
100 mov edi,eax
101 mov eax,ecx
103 mov edx,save_edx
104 mov ebp,save_ebp
106 mov esi,ebx
107 mov ecx,pixel_count
109 ; check if whole thing is short
111 cmp ecx,16
112 jg pr_handle_long_case
114 call [_g2pt_func_n]
116 pop edi
117 pop esi
118 pop ebp
122 pr_handle_long_case:
124 ; now pick up a leading run of 1-7 pixels
125 ; the length is equal to 8-(edi&7), except
126 ; we want 0 if edi&7 is 0. This is just
127 ; (-edi)&7
129 mov ecx,edi
131 neg ecx
133 and ecx,7
134 jz pr_no_leading_run
136 ; stuff length of leading run
138 sub pixel_count,ecx ; SLOW!
139 call [_g2pt_func_n]
141 pr_no_leading_run:
143 mov ecx,pixel_count
144 mov _g2pt_dest,edi
146 shr ecx,3
148 pr_pixel_8_loop:
149 push ecx
150 call [_g2pt_func_8]
152 pop ecx
153 mov _g2pt_dest,edi
155 mov edx,save_edx
156 mov ebp,save_ebp
158 dec ecx
159 jnz pr_pixel_8_loop
161 mov ecx,pixel_count
163 and ecx,7
164 jz pr_no_trailing_run
166 call [_g2pt_func_n]
168 pr_no_trailing_run:
169 pop edi
170 pop esi
171 pop ebp
177 ; g2ptmap_LIT_RUN
179 ; This has two entry points,
180 ; one for C and one for assembly.
182 ; This is broken under MSVC, cause it
183 ; takes 6 parameters. Can we not change
184 ; this calling convention, like CDECL it
185 ; or pass in a structure pointer or something
186 ; or even write a separate entry point
187 ; for MSVC and ifdef it?
188 ; BROKEN BROKEN BROKEN
190 ; old parms:
191 ; edi: dest
192 ; esi: count
193 ; ebx: u
194 ; eax: v
195 ; edx: du
196 ; ecx: dv
198 ; new parms:
199 ; eax = dest
200 ; edx = count
201 ; ebx = U
202 ; ecx = V
205 _FUNCDEF g2ptmap_lit_run,4
206 push ebp
207 push esi
208 push edi
209 mov pixel_count,edx
211 mov edi,eax
212 mov eax,ecx
214 mov esi,ebx
215 mov ecx,pixel_count
217 cmp ecx,16
218 jg pl_handle_long_case
220 call g2pt_compute_light_n
222 mov edx,save_edx ; du,dv
223 mov ebp,save_ebp
225 call [_g2pt_func_n]
227 pop edi
228 pop esi
229 pop ebp
232 pl_handle_long_case:
234 ; now pick up a leading run of 1-7 pixels
235 ; the length is equal to 8-(edi&7), except
236 ; we want 0 if edi&7 is 0. This is just
237 ; (-edi)&7
239 mov ecx,edi
241 neg ecx
243 and ecx,7
244 jz pl_no_leading_run
246 ; stuff length of leading run
248 sub pixel_count,ecx ; SLOW!
249 call g2pt_compute_light_n
251 mov edx,save_edx
252 mov ebp,save_ebp
254 call [_g2pt_func_n]
256 pl_no_leading_run:
258 mov ecx,_g2pt_dlight
260 shl ecx,3
262 mov dlight_8,ecx
263 mov ecx,pixel_count
265 shr ecx,3
267 pl_pixel_8_loop:
268 mov count_save,ecx
269 call g2pt_compute_light_8
271 mov edx,save_edx
272 mov ebp,save_ebp
274 mov _g2pt_dest,edi
275 call [_g2pt_func_8]
277 mov ecx,count_save
279 dec ecx
280 jnz pl_pixel_8_loop
282 cleanup:
283 mov ecx,pixel_count
285 and ecx,7
286 jz pl_no_trailing_run
288 call g2pt_compute_light_n
290 mov edx,save_edx
291 mov ebp,save_ebp
293 call [_g2pt_func_n]
295 pl_no_trailing_run:
296 pop edi
297 pop esi
298 pop ebp
301 _TEXT ends