convert line ends
[canaan.git] / prj / tech / libsrc / g2 / lo816il.asm
bloba60d4151e7dc431d9941e8be961ef4cb89b4b0f6
1 ; $Header: x:/prj/tech/libsrc/g2/RCS/lo816il.asm 1.1 1998/04/09 10:01:00 KEVIN Exp $
3 .386
4 include type.inc
5 include cseg.inc
6 include dseg.inc
7 include macros.inc
8 include thunks.inc
10 include grs.inc
11 include plyrast.inc
12 include plyparam.inc
14 assume ds:_DATA
15 _DATA segment
16 last_ltab dd 0deadbeefh
17 last_mask_u dd 0deadbeefh
18 last_mask_v dd 0deadbeefh
19 last_p_src dd 0deadbeefh
20 last_shift_v db 0ffh
22 dux_local dd ?
23 dvx_local dd ?
24 i_local dd ?
25 di_local dd ?
26 count dd ?
28 extd _grd_ltab816
29 _DATA ends
31 p_dest equ G2S_POLY_PARAMS_P
32 row equ G2S_POLY_PARAMS_CANVAS_ROW
33 dux equ G2S_POLY_PARAMS_DUX
34 dvx equ G2S_POLY_PARAMS_DVX
35 dix equ G2S_POLY_PARAMS_DIX
36 u equ G2S_POLY_PARAMS_LEFT_U
37 v equ G2S_POLY_PARAMS_LEFT_V
38 i equ G2S_POLY_PARAMS_LEFT_I
39 du equ G2S_POLY_PARAMS_LEFT_DU
40 dv equ G2S_POLY_PARAMS_LEFT_DV
41 i_left equ G2S_POLY_PARAMS_LEFT_I
42 di_left equ G2S_POLY_PARAMS_LEFT_DI
43 x_left equ G2S_POLY_PARAMS_LEFT_X
44 dx_left equ G2S_POLY_PARAMS_LEFT_DX
45 x_frac equ G2S_POLY_PARAMS_LEFT_X_FRAC
46 dx_frac equ G2S_POLY_PARAMS_LEFT_DX_FRAC
47 x_right equ G2S_POLY_PARAMS_RIGHT_X
48 dx_right equ G2S_POLY_PARAMS_RIGHT_DX
50 _TEXT segment
52 ;takes eax = poly params
53 ; edx = num scanlines
54 _FUNCDEF opaque_lit_8to16_raster, 2
55 push ebp
56 mov ebp, eax
58 push edi
59 push esi
61 push ecx
62 push ebx
64 mov ebx, dix[ebp]
65 mov ecx, i[ebp]
67 mov di_local, ebx
68 mov i_local, ecx
70 mov ebx, dux[ebp]
71 mov ecx, dvx[ebp]
73 mov dux_local, ebx
74 mov dvx_local, ecx
76 mov ebx, x_right[ebp] ; fixed point
77 mov ecx, x_left[ebp] ; int
79 sar ebx, 16 ; convert to int
80 mov edi, p_dest[ebp] ; beginning of canvas row
82 mov esi, v[ebp]
85 ;ebx = x_right
86 ;ecx = x_left
87 ;edx = num scanlines remaining
88 ;esi = v
89 ;edi = p_dest
90 ;ebp = triangle_params
92 raster_loop:
93 mov count, edx ; number of scanlines remaining
95 sub ecx, ebx ; ecx = -num pixels in scanline
96 jge skip_pixel_loop
98 mov eax, u[ebp]
99 lea edi, [edi+2*ebx] ; point to end of scanline
101 push ebp
102 xor edx, edx
104 mov ebx, eax ; two copies of u
105 mov ebp, esi ; two copies of v
107 ;eax = u_temp
108 ;ebx = u
109 ;ecx = - count
110 ;edx = temp
111 ;esi = v_temp
112 ;edi = p_dest
113 ;ebp = v
115 pixel_loop:
116 shr eax, 16 ; convert u_temp to int
117 and esi, 0deadbeefh ; mask v_temp
118 mask_v:
120 shr esi, 0ffh ; set up for read from texture
121 shift_v:
122 and eax, 0deadbeefh ; mask u_temp
123 mask_u:
125 add ebx, dux_local ; increment u
126 add ebp, dvx_local ; increment v (note: 2 cycles on p5; 1 on p55c)
128 mov dl, 0deadbeefh[esi+eax] ; read pixel from texture
129 p_src:
130 mov eax, i_local
132 shr eax, 16
133 mov esi, i_local
135 mov dh, al
136 mov eax, di_local
138 add esi, eax
139 mov eax, ebx ; copy u to u_temp
141 mov i_local, esi
142 inc ecx ; increment count
144 mov dx, 0deadbeefh[2*edx] ; read from ltab
145 ltab:
146 mov esi, ebp ; copy v to v_temp
148 mov [edi+2*ecx-2], dx ; write pixel
149 jnz pixel_loop ; continue until done
151 ; update u, v, x_left (int), x_frac (fraction for x_left), x_right (fix), and p_dest.
152 ; maintain sub-pixel precision.
154 pop ebp
155 skip_pixel_loop:
157 mov edx, x_frac[ebp]
158 mov ecx, x_left[ebp]
160 add ecx, dx_left[ebp] ; update x_left
161 add edx, dx_frac[ebp]
163 sbb ebx, ebx ; -1 if there was a carry
164 mov x_frac[ebp], edx
166 mov edx, u[ebp]
167 sub ecx, ebx ; adjust x_left for carry
169 mov esi, i[ebp]
170 mov eax, dix[ebp]
172 add edx, du[ebp]
173 add esi, di_left[ebp]
175 and eax, ebx ; adjust di for carry
176 mov x_left[ebp], ecx
178 add esi, eax ; adjust i for carry
179 mov eax, dux[ebp]
181 mov i[ebp], esi
182 and eax, ebx ; adjust du for carry
184 mov i_local, esi
185 add edx, eax ; adjust u for carry
187 mov eax, dvx[ebp]
188 mov u[ebp], edx
190 and eax, ebx ; adjust dv for carry
191 mov esi, v[ebp]
193 mov ebx, x_right[ebp]
194 mov edx, count
196 add ebx, dx_right[ebp]
197 add esi, dv[ebp]
199 add esi, eax ; adjust v for carry
200 mov x_right[ebp], ebx
202 sar ebx, 16
203 mov edi, p_dest[ebp]
205 mov eax, row[ebp] ; canvas row, that is
206 mov v[ebp], esi
208 add edi, eax
209 dec edx
211 mov p_dest[ebp], edi
212 jnz raster_loop
214 pop ebx
215 pop ecx
217 pop esi
218 pop edi
220 pop ebp
223 ;takes eax = bitmap
224 _FUNCDEF opaque_lit_8to16_il_init, 1
225 push esi
226 push edi
228 mov edx, _grd_ltab816
231 mov esi, last_ltab
232 mov ebx, GRS_BITMAP_BITS[eax]
234 cmp esi, edx
235 jz skip_ltab
237 mov d ds:[ltab-4], edx
238 mov last_ltab, edx
240 skip_ltab:
241 mov edx, GRS_BITMAP_W[eax] ;width AND height
242 mov al, GRS_BITMAP_WLOG[eax]
244 mov cl, 16
245 sub edx, 010001h ;convert to masks
247 sub cl, al ;v_shift = 16-bm->wlog
248 mov eax, edx
250 and edx, 0ffff0000h ;v_mask = fix_make(bm->h-1,0)
251 and eax, 0ffffh ;u_mask = bm->w -1
253 ;eax = mask_u, edx = mask_v, ebx = p_src, cl = shift_v
254 mov esi, last_mask_u
255 mov edi, last_mask_v
257 cmp esi, eax
258 jz skip_mask_u
260 mov d ds:[mask_u-4], eax
261 mov last_mask_u, eax
262 skip_mask_u:
263 cmp edi, edx
264 jz skip_mask_v
266 mov d ds:[mask_v-4], edx
267 mov last_mask_v, edx
268 skip_mask_v:
270 mov eax, last_p_src
271 mov dl, last_shift_v
273 cmp eax, ebx
274 jz skip_p_src
276 mov d ds:[p_src-4], ebx
277 mov last_p_src, ebx
278 skip_p_src:
279 cmp dl, cl
280 jz skip_shift_v
282 mov b ds:[shift_v-1], cl
283 mov last_shift_v, cl
284 skip_shift_v:
286 pop edi
287 pop esi
291 _TEXT ends