Subversion Repositories Kolibri OS

Rev

Rev 2192 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2192 Rev 6619
1
CATMULL_SHIFT  equ 8
1
CATMULL_SHIFT  equ 8
2
ROUND equ 8
2
ROUND equ 8
3
;NON=0
3
;NON=0
4
;MMX=1
4
;MMX=1
5
;Ext=MMX
5
;Ext=MMX
6
;TEX_SIZE=0x3fff
6
;TEX_SIZE=0x3fff
7
;SIZE_X equ 512
7
;SIZE_X equ 512
8
;SIZE_Y equ 512
8
;SIZE_Y equ 512
9
;ROUND = 8
9
;ROUND = 8
10
;TEX_SHIFT equ 6
10
;TEX_SHIFT equ 6
11
 
11
 
12
; procedure drawing textured triangle with Gouraud shading
12
; procedure drawing textured triangle with Gouraud shading
13
; Z-buffer alghoritm included, Z coord interpolation ----
13
; Z-buffer alghoritm included, Z coord interpolation ----
14
; I set the color by this way -- (col1 * col2)/256 ------
14
; I set the color by this way -- (col1 * col2)/256 ------
15
;------------------in - eax - x1 shl 16 + y1 ------------
15
;------------------in - eax - x1 shl 16 + y1 ------------
16
;---------------------- ebx - x2 shl 16 + y2 ------------
16
;---------------------- ebx - x2 shl 16 + y2 ------------
17
;---------------------- ecx - x3 shl 16 + y3 ------------
17
;---------------------- ecx - x3 shl 16 + y3 ------------
18
;---------------------- esi - pointer to Z-buffer--------
18
;---------------------- esi - pointer to Z-buffer--------
19
;---------------------- edx - pointer to texture---------
19
;---------------------- edx - pointer to texture---------
20
;---------------------- Z-buffer filled with dd variables
20
;---------------------- Z-buffer filled with dd variables
21
;---------------------- shifted CATMULL_SHIFT------------
21
;---------------------- shifted CATMULL_SHIFT------------
22
;---------------------- edi - pointer to screen buffer---
22
;---------------------- edi - pointer to screen buffer---
23
;---------------------- stack : colors-------------------
23
;---------------------- stack : colors-------------------
24
 
24
 
25
 
25
 
26
 
26
 
27
tex_plus_grd_triangle:
27
tex_plus_grd_triangle:
28
; parameters :
28
; parameters :
29
   .tex_y3  equ [ebp+38]   ; 36 bytes through stack
29
   .tex_y3  equ [ebp+38]   ; 36 bytes through stack
30
   .tex_x3  equ [ebp+36]
30
   .tex_x3  equ [ebp+36]
31
   .tex_y2  equ [ebp+34]
31
   .tex_y2  equ [ebp+34]
32
   .tex_x2  equ [ebp+32]
32
   .tex_x2  equ [ebp+32]
33
   .tex_y1  equ [ebp+30]
33
   .tex_y1  equ [ebp+30]
34
   .tex_x1  equ [ebp+28]
34
   .tex_x1  equ [ebp+28]
35
 
35
 
36
   .z3	    equ [ebp+26]
36
   .z3	    equ [ebp+26]
37
   .col3b   equ [ebp+24]
37
   .col3b   equ [ebp+24]
38
   .col3g   equ [ebp+22]
38
   .col3g   equ [ebp+22]
39
   .col3r   equ [ebp+20]
39
   .col3r   equ [ebp+20]
40
 
40
 
41
   .z2	    equ [ebp+18]
41
   .z2	    equ [ebp+18]
42
   .col2b   equ [ebp+16]
42
   .col2b   equ [ebp+16]
43
   .col2g   equ [ebp+14]
43
   .col2g   equ [ebp+14]
44
   .col2r   equ [ebp+12]
44
   .col2r   equ [ebp+12]
45
 
45
 
46
   .z1	    equ [ebp+10]
46
   .z1	    equ [ebp+10]
47
   .col1b   equ [ebp+8]
47
   .col1b   equ [ebp+8]
48
   .col1g   equ [ebp+6]
48
   .col1g   equ [ebp+6]
49
   .col1r   equ [ebp+4]
49
   .col1r   equ [ebp+4]
50
 
50
 
51
; local variables:
51
; local variables:
52
 
52
 
53
   .tex_ptr   equ dword[ebp-4]
53
   .tex_ptr   equ dword[ebp-4]
54
   .z_ptr     equ dword[ebp-8]
54
   .z_ptr     equ dword[ebp-8]
55
   .scr_buff  equ dword[ebp-12]
55
   .scr_buff  equ dword[ebp-12]
56
 
56
 
57
   .x1	      equ  word[ebp-14] ;dw ? ;equ word[ebp-10]
57
   .x1	      equ  word[ebp-14] ;dw ? ;equ word[ebp-10]
58
   .y1	      equ  word[ebp-16] ;dw ? ;equ word[ebp-12]
58
   .y1	      equ  word[ebp-16] ;dw ? ;equ word[ebp-12]
59
   .x2	      equ  word[ebp-18] ;dw ? ;equ word[ebp-14]
59
   .x2	      equ  word[ebp-18] ;dw ? ;equ word[ebp-14]
60
   .y2	      equ  word[ebp-20] ;dw ? ;equ word[ebp-16]
60
   .y2	      equ  word[ebp-20] ;dw ? ;equ word[ebp-16]
61
   .x3	      equ  word[ebp-22] ;dw ? ;equ word[ebp-18]
61
   .x3	      equ  word[ebp-22] ;dw ? ;equ word[ebp-18]
62
   .y3	      equ  word[ebp-24] ;dw ? ;equ word[ebp-20]
62
   .y3	      equ  word[ebp-24] ;dw ? ;equ word[ebp-20]
63
 
63
 
64
   .dx12      equ  dword[ebp-28] ;dd ?
64
   .dx12      equ  dword[ebp-28] ;dd ?
65
   .tex_dx12  equ  dword[ebp-32] ;dd ?
65
   .tex_dx12  equ  dword[ebp-32] ;dd ?
66
   .tex_dy12  equ	[ebp-36] ;dd ?
66
   .tex_dy12  equ	[ebp-36] ;dd ?
67
   .dz12      equ  dword[ebp-40] ;dd ?
67
   .dz12      equ  dword[ebp-40] ;dd ?
68
   .dc12r     equ	[ebp-44] ;dd ?
68
   .dc12r     equ	[ebp-44] ;dd ?
69
   .dc12g     equ  dword[ebp-48] ;dd ?
69
   .dc12g     equ  dword[ebp-48] ;dd ?
70
   .dc12b     equ	[ebp-52] ;dd ?
70
   .dc12b     equ	[ebp-52] ;dd ?
71
 
71
 
72
   .dx23      equ  dword[ebp-56] ;dd ?
72
   .dx23      equ  dword[ebp-56] ;dd ?
73
   .tex_dx23  equ  dword[ebp-60] ;dd ?
73
   .tex_dx23  equ  dword[ebp-60] ;dd ?
74
   .tex_dy23  equ	[ebp-64] ;dd ?
74
   .tex_dy23  equ	[ebp-64] ;dd ?
75
   .dz23      equ  dword[ebp-68] ;dd ?
75
   .dz23      equ  dword[ebp-68] ;dd ?
76
   .dc23r     equ	[ebp-72] ;dd ?
76
   .dc23r     equ	[ebp-72] ;dd ?
77
   .dc23g     equ  dword[ebp-76] ;dd ?
77
   .dc23g     equ  dword[ebp-76] ;dd ?
78
   .dc23b     equ	[ebp-80] ;dword[ebp-8]dd ?
78
   .dc23b     equ	[ebp-80] ;dword[ebp-8]dd ?
79
 
79
 
80
   .dx13      equ  dword[ebp-84] ;dd ?
80
   .dx13      equ  dword[ebp-84] ;dd ?
81
   .tex_dx13  equ  dword[ebp-88] ;dd ?
81
   .tex_dx13  equ  dword[ebp-88] ;dd ?
82
   .tex_dy13  equ	[ebp-92] ;dd ?
82
   .tex_dy13  equ	[ebp-92] ;dd ?
83
   .dz13      equ  dword[ebp-96] ;dd ?
83
   .dz13      equ  dword[ebp-96] ;dd ?
84
   .dc13r     equ	[ebp-100] ;dd ?
84
   .dc13r     equ	[ebp-100] ;dd ?
85
   .dc13g     equ  dword[ebp-104] ;dd ?
85
   .dc13g     equ  dword[ebp-104] ;dd ?
86
   .dc13b     equ	[ebp-108] ;dd ?
86
   .dc13b     equ	[ebp-108] ;dd ?
87
 
87
 
88
   .scan_x1   equ  dword[ebp-112] ;dd ?
88
   .scan_x1   equ  dword[ebp-112] ;dd ?
89
   .scan_y1   equ	[ebp-116] ;dd ?
89
   .scan_y1   equ	[ebp-116] ;dd ?
90
   .zz1       equ  dword[ebp-120] ;dw ?
90
   .zz1       equ  dword[ebp-120] ;dw ?
91
   .cur1r     equ	[ebp-124] ;dw ?
91
   .cur1r     equ	[ebp-124] ;dw ?
92
   .cur1g     equ  dword[ebp-128] ;dw ?
92
   .cur1g     equ  dword[ebp-128] ;dw ?
93
   .cur1b     equ	[ebp-132] ;dw ?
93
   .cur1b     equ	[ebp-132] ;dw ?
94
 
94
 
95
   .scan_x2   equ  dword[ebp-136] ;dd ?
95
   .scan_x2   equ  dword[ebp-136] ;dd ?
96
   .scan_y2   equ	[ebp-140] ;dd ?
96
   .scan_y2   equ	[ebp-140] ;dd ?
97
   .zz2       equ  dword[ebp-144] ;dw ?
97
   .zz2       equ  dword[ebp-144] ;dw ?
98
   .cur2r     equ	[ebp-148] ;dw ?
98
   .cur2r     equ	[ebp-148] ;dw ?
99
   .cur2g     equ  dword[ebp-152] ;dw ?
99
   .cur2g     equ  dword[ebp-152] ;dw ?
100
   .cur2b     equ	[ebp-156] ;dw ?
100
   .cur2b     equ	[ebp-156] ;dw ?
101
 
101
 
102
 
102
 
103
       mov    ebp,esp
103
       mov    ebp,esp
104
 
104
 
105
   ;    mov     .tex_ptr,edx
105
   ;    mov     .tex_ptr,edx
106
   ;    mov     .z_ptr,esi
106
   ;    mov     .z_ptr,esi
107
   ;    mov     .scr_buff,edi
107
   ;    mov     .scr_buff,edi
108
	 push	 edx esi edi
108
	 push	 edx esi edi
109
;         push    esi
109
;         push    esi
110
;         push    edi
110
;         push    edi
111
	 mov	  edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
111
	 mov	  edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
112
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
112
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
113
	 and	  edx,ecx
113
	 and	  edx,ecx
114
	 and	  edx,eax
114
	 and	  edx,eax
115
	 test	  edx,80008000h  ; Check both X&Y at once
115
	 test	  edx,80008000h  ; Check both X&Y at once
116
	 jne	  .loop2_end
116
	 jne	  .loop2_end
117
 
117
 
118
   .sort3:
118
   .sort3:
119
       cmp     ax,bx
119
       cmp     ax,bx
120
       jle     .sort1
120
       jle     .sort1
121
       xchg    eax,ebx
121
       xchg    eax,ebx
122
if Ext>=MMX
122
if Ext>=MMX
123
       movq    mm0, .col1r	 ; exchange r, g, b, z
123
       movq    mm0, .col1r	 ; exchange r, g, b, z
124
       movq    mm1, .col2r
124
       movq    mm1, .col2r
125
       movq    .col1r ,mm1
125
       movq    .col1r ,mm1
126
       movq    .col2r ,mm0
126
       movq    .col2r ,mm0
127
else
127
else
128
       mov     edx,dword .col1r   ; exchange both r and g
128
       mov     edx,dword .col1r   ; exchange both r and g
129
       xchg    edx,dword .col2r
129
       xchg    edx,dword .col2r
130
       mov     dword .col1r ,edx
130
       mov     dword .col1r ,edx
131
 
131
 
132
       mov     edx,dword .col1b   ; b and z
132
       mov     edx,dword .col1b   ; b and z
133
       xchg    edx,dword .col2b
133
       xchg    edx,dword .col2b
134
       mov     dword .col1b ,edx
134
       mov     dword .col1b ,edx
135
end if
135
end if
136
 
136
 
137
       mov     edx,dword .tex_x1
137
       mov     edx,dword .tex_x1
138
       xchg    edx,dword .tex_x2
138
       xchg    edx,dword .tex_x2
139
       mov     dword .tex_x1 ,edx
139
       mov     dword .tex_x1 ,edx
140
 
140
 
141
 .sort1:
141
 .sort1:
142
       cmp	bx,cx
142
       cmp	bx,cx
143
       jle	.sort2
143
       jle	.sort2
144
       xchg    ebx,ecx
144
       xchg    ebx,ecx
145
 
145
 
146
if Ext>=MMX
146
if Ext>=MMX
147
       movq    mm0, .col2r	 ; exchange r, g, b, z
147
       movq    mm0, .col2r	 ; exchange r, g, b, z
148
       movq    mm1, .col3r
148
       movq    mm1, .col3r
149
       movq    .col3r ,mm0
149
       movq    .col3r ,mm0
150
       movq    .col2r ,mm1
150
       movq    .col2r ,mm1
151
else
151
else
152
 
152
 
153
       mov     edx,dword .col2r  ; r, g
153
       mov     edx,dword .col2r  ; r, g
154
       xchg    edx,dword .col3r
154
       xchg    edx,dword .col3r
155
       mov     dword .col2r,edx
155
       mov     dword .col2r,edx
156
 
156
 
157
       mov     edx,dword .col2b  ; b, z
157
       mov     edx,dword .col2b  ; b, z
158
       xchg    edx,dword .col3b
158
       xchg    edx,dword .col3b
159
       mov     dword .col2b,edx
159
       mov     dword .col2b,edx
160
end if
160
end if
161
 
161
 
162
       mov     edx,dword .tex_x2
162
       mov     edx,dword .tex_x2
163
       xchg    edx,dword .tex_x3
163
       xchg    edx,dword .tex_x3
164
       mov     dword .tex_x2,edx
164
       mov     dword .tex_x2,edx
165
 
165
 
166
       jmp .sort3
166
       jmp .sort3
167
 
167
 
168
 .sort2:
168
 .sort2:
169
 
169
 
170
       push	eax ebx ecx	    ; store in variables
170
       push	eax ebx ecx	    ; store in variables
171
  ;     push     ebx
171
  ;     push     ebx
172
  ;     push     ecx
172
  ;     push     ecx
173
 
173
 
174
;****************** delta computng zone **************
174
;****************** delta computng zone **************
175
;+++++++++ first zone
175
;+++++++++ first zone
176
       mov	bx,.y2	     ; calc delta12
176
       mov	bx,.y2	     ; calc delta12
177
       sub	bx,.y1
177
       sub	bx,.y1
178
       jnz	.dx12_make
178
       jnz	.dx12_make
179
       mov	ecx,7
179
       mov	ecx,7
180
     @@:
180
     @@:
181
       push	dword 0
181
       push	dword 0
182
       loop	@b
182
       loop	@b
183
       jmp	.dx12_done
183
       jmp	.dx12_done
184
  .dx12_make:
184
  .dx12_make:
185
 
185
 
186
 
186
 
187
       mov	ax,.x2
187
       mov	ax,.x2
188
       sub	ax,.x1
188
       sub	ax,.x1
189
       cwde
189
       cwde
190
       movsx	ebx,bx
190
       movsx	ebx,bx
191
       shl	eax,ROUND
191
       shl	eax,ROUND
192
       cdq
192
       cdq
193
       idiv	ebx
193
       idiv	ebx
194
 ;      mov      .dx12,eax
194
 ;      mov      .dx12,eax
195
       push	 eax
195
       push	 eax
196
 
196
 
197
if  0  ; Ext=SSE
197
if  0  ; Ext=SSE
198
       movd	 mm0,.col1r    ; 2 words  r, g
198
       movd	 mm0,.col1r    ; 2 words  r, g
199
       pxor	 mm1,mm1
199
       pxor	 mm1,mm1
200
       punpcklwd mm0,mm1
200
       punpcklwd mm0,mm1
201
       cvtpi2ps  xmm0,mm0
201
       cvtpi2ps  xmm0,mm0
202
       movlhps	 xmm0,xmm0
202
       movlhps	 xmm0,xmm0
203
       movd	 mm0,.col1g    ; 2 words  b, z
203
       movd	 mm0,.col1g    ; 2 words  b, z
204
       punpcklwd mm0,mm1
204
       punpcklwd mm0,mm1
205
       cvtpi2ps  xmm0,mm0
205
       cvtpi2ps  xmm0,mm0
206
       ; xmm0=four float double words
206
       ; xmm0=four float double words
207
       divss	 xmm0,.pack3
207
       divss	 xmm0,.pack3
208
       ;convert and insert mm0 to lower xmm1     ..
208
       ;convert and insert mm0 to lower xmm1     ..
209
end if
209
end if
210
 
210
 
211
       mov	ax,word .tex_x2
211
       mov	ax,word .tex_x2
212
       sub	ax,word .tex_x1
212
       sub	ax,word .tex_x1
213
       cwde
213
       cwde
214
       shl	eax,ROUND
214
       shl	eax,ROUND
215
       cdq
215
       cdq
216
       idiv	ebx
216
       idiv	ebx
217
;       mov      .tex_dx12r,eax
217
;       mov      .tex_dx12r,eax
218
       push	  eax
218
       push	  eax
219
 
219
 
220
       mov	  ax,word .tex_y2
220
       mov	  ax,word .tex_y2
221
       sub	  ax,word .tex_y1
221
       sub	  ax,word .tex_y1
222
       cwde
222
       cwde
223
       shl	eax,ROUND
223
       shl	eax,ROUND
224
       cdq
224
       cdq
225
       idiv	ebx
225
       idiv	ebx
226
;       mov      .tex_dx12,eax
226
;       mov      .tex_dx12,eax
227
       push	eax
227
       push	eax
228
 
228
 
229
       mov	ax,word .z2
229
       mov	ax,word .z2
230
       sub	ax,word .z1
230
       sub	ax,word .z1
231
       cwde
231
       cwde
232
       shl	eax,CATMULL_SHIFT
232
       shl	eax,CATMULL_SHIFT
233
       cdq
233
       cdq
234
       idiv	ebx
234
       idiv	ebx
235
 ;      mov      .dz12,eax
235
 ;      mov      .dz12,eax
236
       push	eax	  ; .dza12
236
       push	eax	  ; .dza12
237
 
237
 
238
       mov	ax,word .col2r
238
       mov	ax,word .col2r
239
       sub	ax,word .col1r
239
       sub	ax,word .col1r
240
       cwde
240
       cwde
241
       shl	eax,ROUND
241
       shl	eax,ROUND
242
       cdq
242
       cdq
243
       idiv	ebx
243
       idiv	ebx
244
 ;      mov      .dc12r,eax
244
 ;      mov      .dc12r,eax
245
       push	  eax
245
       push	  eax
246
 
246
 
247
       mov	  ax,word .col2g
247
       mov	  ax,word .col2g
248
       sub	  ax,word .col1g
248
       sub	  ax,word .col1g
249
       cwde
249
       cwde
250
       shl	eax,ROUND
250
       shl	eax,ROUND
251
       cdq
251
       cdq
252
       idiv	ebx
252
       idiv	ebx
253
 ;      mov      .dc12g,eax
253
 ;      mov      .dc12g,eax
254
       push	eax
254
       push	eax
255
 
255
 
256
       mov	ax,word .col2b	       ;;---
256
       mov	ax,word .col2b	       ;;---
257
       sub	ax,word .col1b
257
       sub	ax,word .col1b
258
       cwde
258
       cwde
259
       shl	eax,ROUND
259
       shl	eax,ROUND
260
       cdq
260
       cdq
261
       idiv	ebx
261
       idiv	ebx
262
;       mov      .dc12b,eax
262
;       mov      .dc12b,eax
263
       push	eax
263
       push	eax
264
 
264
 
265
;+++++++++++++++++ second zone +++++++++++++
265
;+++++++++++++++++ second zone +++++++++++++
266
   .dx12_done:
266
   .dx12_done:
267
 
267
 
268
       mov	bx,.y3	     ; calc delta23
268
       mov	bx,.y3	     ; calc delta23
269
       sub	bx,.y2
269
       sub	bx,.y2
270
       jnz	.dx23_make
270
       jnz	.dx23_make
271
       mov	ecx,7
271
       mov	ecx,7
272
    @@:
272
    @@:
273
       push	dword 0
273
       push	dword 0
274
       loop	@b
274
       loop	@b
275
       jmp	.dx23_done
275
       jmp	.dx23_done
276
 
276
 
277
  .dx23_make:
277
  .dx23_make:
278
       mov	ax,.x3
278
       mov	ax,.x3
279
       sub	ax,.x2
279
       sub	ax,.x2
280
       cwde
280
       cwde
281
       movsx	ebx,bx
281
       movsx	ebx,bx
282
       shl	eax,ROUND
282
       shl	eax,ROUND
283
       cdq
283
       cdq
284
       idiv	ebx
284
       idiv	ebx
285
 ;      mov      .dx23,eax
285
 ;      mov      .dx23,eax
286
       push	 eax
286
       push	 eax
287
 
287
 
288
       mov	ax,word .tex_x3
288
       mov	ax,word .tex_x3
289
       sub	ax,word .tex_x2
289
       sub	ax,word .tex_x2
290
       cwde
290
       cwde
291
       shl	eax,ROUND
291
       shl	eax,ROUND
292
       cdq
292
       cdq
293
       idiv	ebx
293
       idiv	ebx
294
;       mov      .tex_dx23,eax
294
;       mov      .tex_dx23,eax
295
       push	  eax
295
       push	  eax
296
 
296
 
297
       mov	  ax,word .tex_y3
297
       mov	  ax,word .tex_y3
298
       sub	  ax,word .tex_y2
298
       sub	  ax,word .tex_y2
299
       cwde
299
       cwde
300
       shl	eax,ROUND
300
       shl	eax,ROUND
301
       cdq
301
       cdq
302
       idiv	ebx
302
       idiv	ebx
303
;       mov      .tex_dy23,eax
303
;       mov      .tex_dy23,eax
304
       push	eax
304
       push	eax
305
 
305
 
306
       mov	ax,word .z3
306
       mov	ax,word .z3
307
       sub	ax,word .z2
307
       sub	ax,word .z2
308
       cwde				   ;
308
       cwde				   ;
309
       shl	eax,CATMULL_SHIFT	   ;  2222222
309
       shl	eax,CATMULL_SHIFT	   ;  2222222
310
       cdq				   ;  2     2
310
       cdq				   ;  2     2
311
       idiv	ebx			   ;        2
311
       idiv	ebx			   ;        2
312
;       mov      .dz23,eax                 ;       2
312
;       mov      .dz23,eax                 ;       2
313
       push	eax	  ; .dza12         ;      2
313
       push	eax	  ; .dza12         ;      2
314
					   ;     2
314
					   ;     2
315
       mov	ax,word .col3r		   ;    2
315
       mov	ax,word .col3r		   ;    2
316
       sub	ax,word .col2r		   ;   2222222
316
       sub	ax,word .col2r		   ;   2222222
317
       cwde				   ;  second delta
317
       cwde				   ;  second delta
318
       shl	eax,ROUND		   ;
318
       shl	eax,ROUND		   ;
319
       cdq				   ;
319
       cdq				   ;
320
       idiv	ebx			   ;
320
       idiv	ebx			   ;
321
;       mov      .dc23r,eax                 ;
321
;       mov      .dc23r,eax                 ;
322
       push	  eax
322
       push	  eax
323
 
323
 
324
       mov	  ax,word .col3g
324
       mov	  ax,word .col3g
325
       sub	  ax,word .col2g
325
       sub	  ax,word .col2g
326
       cwde
326
       cwde
327
       shl	eax,ROUND
327
       shl	eax,ROUND
328
       cdq
328
       cdq
329
       idiv	ebx
329
       idiv	ebx
330
;       mov      .dc23g,eax
330
;       mov      .dc23g,eax
331
       push	eax
331
       push	eax
332
 
332
 
333
       mov	ax,word .col3b	       ;;---
333
       mov	ax,word .col3b	       ;;---
334
       sub	ax,word .col2b
334
       sub	ax,word .col2b
335
       cwde
335
       cwde
336
       shl	eax,ROUND
336
       shl	eax,ROUND
337
       cdq
337
       cdq
338
       idiv	ebx
338
       idiv	ebx
339
;       mov      .dc23b,eax
339
;       mov      .dc23b,eax
340
       push	eax
340
       push	eax
341
 
341
 
342
   .dx23_done:
342
   .dx23_done:
343
;++++++++++++++++++third zone++++++++++++++++++++++++
343
;++++++++++++++++++third zone++++++++++++++++++++++++
344
       mov	bx,.y3	     ; calc delta13
344
       mov	bx,.y3	     ; calc delta13
345
       sub	bx,.y1
345
       sub	bx,.y1
346
       jnz	.dx13_make
346
       jnz	.dx13_make
347
       mov	ecx,7
347
       mov	ecx,7
348
     @@:
348
     @@:
349
       push	dword 0
349
       push	dword 0
350
       loop	@b
350
       loop	@b
351
       jmp	.dx13_done
351
       jmp	.dx13_done
352
  .dx13_make:
352
  .dx13_make:
353
       mov	ax,.x3
353
       mov	ax,.x3
354
       sub	ax,.x1
354
       sub	ax,.x1
355
       cwde
355
       cwde
356
       movsx	ebx,bx
356
       movsx	ebx,bx
357
       shl	eax,ROUND
357
       shl	eax,ROUND
358
       cdq
358
       cdq
359
       idiv	ebx
359
       idiv	ebx
360
;       mov      .dx13,eax
360
;       mov      .dx13,eax
361
       push	 eax
361
       push	 eax
362
 
362
 
363
       mov	ax,word .tex_x3 	   ; triangle b
363
       mov	ax,word .tex_x3 	   ; triangle b
364
       sub	ax,word .tex_x1
364
       sub	ax,word .tex_x1
365
       cwde
365
       cwde
366
       shl	eax,ROUND
366
       shl	eax,ROUND
367
       cdq
367
       cdq
368
       idiv	ebx
368
       idiv	ebx
369
;       mov      .tex_dx13r,eax
369
;       mov      .tex_dx13r,eax
370
       push	  eax
370
       push	  eax
371
 
371
 
372
       mov	  ax,word .tex_y3
372
       mov	  ax,word .tex_y3
373
       sub	  ax,word .tex_y1
373
       sub	  ax,word .tex_y1
374
       cwde
374
       cwde
375
       shl	eax,ROUND
375
       shl	eax,ROUND
376
       cdq
376
       cdq
377
       idiv	ebx
377
       idiv	ebx
378
;       mov      .tex_dy13,eax
378
;       mov      .tex_dy13,eax
379
       push	eax
379
       push	eax
380
 
380
 
381
       mov	ax,word .z3
381
       mov	ax,word .z3
382
       sub	ax,word .z1	       ;    333333333
382
       sub	ax,word .z1	       ;    333333333
383
       cwde			       ;   3        3
383
       cwde			       ;   3        3
384
       shl	eax,CATMULL_SHIFT      ;            3
384
       shl	eax,CATMULL_SHIFT      ;            3
385
       cdq			       ;            3
385
       cdq			       ;            3
386
       idiv	ebx		       ;            3
386
       idiv	ebx		       ;            3
387
;       mov      .dz13,eax             ;            3
387
;       mov      .dz13,eax             ;            3
388
       push	eax	  ; .dza12     ;            3
388
       push	eax	  ; .dza12     ;            3
389
				       ;            3
389
				       ;            3
390
       mov	ax,word .col3r	       ;    3333333333
390
       mov	ax,word .col3r	       ;    3333333333
391
       sub	ax,word .col1r	       ;            3
391
       sub	ax,word .col1r	       ;            3
392
       cwde			       ;            3
392
       cwde			       ;            3
393
       shl	eax,ROUND	       ;            3
393
       shl	eax,ROUND	       ;            3
394
       cdq			       ;            3
394
       cdq			       ;            3
395
       idiv	ebx		       ;            3
395
       idiv	ebx		       ;            3
396
  ;    mov      .dc13r,eax             ;    3       3
396
  ;    mov      .dc13r,eax             ;    3       3
397
       push	  eax		      ;     33333333
397
       push	  eax		      ;     33333333
398
 
398
 
399
       mov	  ax,word .col3g
399
       mov	  ax,word .col3g
400
       sub	  ax,word .col1g
400
       sub	  ax,word .col1g
401
       cwde
401
       cwde
402
       shl	eax,ROUND
402
       shl	eax,ROUND
403
       cdq
403
       cdq
404
       idiv	ebx
404
       idiv	ebx
405
 ;      mov      .dc13g,eax
405
 ;      mov      .dc13g,eax
406
       push	eax
406
       push	eax
407
 
407
 
408
       mov	ax,word .col3b	       ;;---
408
       mov	ax,word .col3b	       ;;---
409
       sub	ax,word .col1b
409
       sub	ax,word .col1b
410
       cwde
410
       cwde
411
       shl	eax,ROUND
411
       shl	eax,ROUND
412
       cdq
412
       cdq
413
       idiv	ebx
413
       idiv	ebx
414
;       mov      .dc13b,eax
414
;       mov      .dc13b,eax
415
       push	eax
415
       push	eax
416
 
416
 
417
   .dx13_done:
417
   .dx13_done:
418
 
418
 
419
; <<<<<<<  ::delta zone end+++++++++++++++++++++ >>>>>>>>
419
; <<<<<<<  ::delta zone end+++++++++++++++++++++ >>>>>>>>
420
       sub	esp,55	 ;(12*4)
420
       sub	esp,55	 ;(12*4)
421
 
421
 
422
       movsx	eax,.x1 		   ; eax - cur x1
422
       movsx	eax,.x1 		   ; eax - cur x1
423
       shl	eax,ROUND		   ; ebx - cur x2
423
       shl	eax,ROUND		   ; ebx - cur x2
424
       mov	ebx,eax
424
       mov	ebx,eax
425
       movsx	edx,word .z1
425
       movsx	edx,word .z1
426
       shl	edx,CATMULL_SHIFT
426
       shl	edx,CATMULL_SHIFT
427
       mov	.zz1,edx
427
       mov	.zz1,edx
428
       mov	.zz2,edx
428
       mov	.zz2,edx
429
 
429
 
430
       movzx	edi,word .col1r
430
       movzx	edi,word .col1r
431
       shl	edi,ROUND
431
       shl	edi,ROUND
432
       mov	.cur1r,edi
432
       mov	.cur1r,edi
433
       mov	.cur2r,edi
433
       mov	.cur2r,edi
434
       movzx	esi,word .col1g
434
       movzx	esi,word .col1g
435
       shl	esi,ROUND
435
       shl	esi,ROUND
436
       mov	.cur1g,esi
436
       mov	.cur1g,esi
437
       mov	.cur2g,esi
437
       mov	.cur2g,esi
438
       movzx	edx,word .col1b
438
       movzx	edx,word .col1b
439
       shl	edx,ROUND
439
       shl	edx,ROUND
440
       mov	.cur1b,edx
440
       mov	.cur1b,edx
441
       mov	.cur2b,edx
441
       mov	.cur2b,edx
442
 
442
 
443
       movzx	edi,word .tex_x1
443
       movzx	edi,word .tex_x1
444
       shl	edi,ROUND
444
       shl	edi,ROUND
445
       mov	.scan_x1,edi
445
       mov	.scan_x1,edi
446
       mov	.scan_x2,edi
446
       mov	.scan_x2,edi
447
       movzx	edx,word .tex_y1
447
       movzx	edx,word .tex_y1
448
       shl	edx,ROUND
448
       shl	edx,ROUND
449
       mov	.scan_y1,edx
449
       mov	.scan_y1,edx
450
       mov	.scan_y2,edx
450
       mov	.scan_y2,edx
451
 
451
 
452
       mov	cx,.y1
452
       mov	cx,.y1
453
       cmp	cx,.y2
453
       cmp	cx,.y2
454
       jge	.loop1_end
454
       jge	.loop1_end
455
    .loop_1:
455
    .loop_1:
456
    ;   push     eax ebx ebp
456
    ;   push     eax ebx ebp
457
       pushad
457
       pushad
458
 
458
 
459
       push	.tex_ptr
459
       push	.tex_ptr
460
       push	.scr_buff
460
       push	.scr_buff
461
       push	.z_ptr
461
       push	.z_ptr
462
       push	cx
462
       push	cx
463
 
463
 
464
       push	.zz2
464
       push	.zz2
465
 
465
 
466
       push	.scan_x2
466
       push	.scan_x2
467
       push	dword .scan_y2
467
       push	dword .scan_y2
468
       push	dword .cur2r
468
       push	dword .cur2r
469
       push	.cur2g
469
       push	.cur2g
470
       push	dword .cur2b
470
       push	dword .cur2b
471
 
471
 
472
       push	.zz1
472
       push	.zz1
473
 
473
 
474
       push	.scan_x1
474
       push	.scan_x1
475
       push	dword .scan_y1
475
       push	dword .scan_y1
476
       push	dword .cur1r
476
       push	dword .cur1r
477
       push	.cur1g
477
       push	.cur1g
478
       push	dword .cur1b
478
       push	dword .cur1b
479
 
479
 
480
       sar	eax,ROUND
480
       sar	eax,ROUND
481
       sar	ebx,ROUND
481
       sar	ebx,ROUND
482
       call	horizontal_tex_grd_line
482
       call	horizontal_tex_grd_line
483
 
483
 
484
      ; pop      ebp ebx eax
484
      ; pop      ebp ebx eax
485
       popad
485
       popad
486
 
486
 
487
if (Ext = MMX)|(Ext=SSE)
487
if (Ext = MMX)|(Ext=SSE)
488
       movq	mm0,.cur1b
488
       movq	mm0,.cur1b
489
       movq	mm1,.cur1r
489
       movq	mm1,.cur1r
490
       movq	mm2,.scan_y1
490
       movq	mm2,.scan_y1
491
       movq	mm3,.cur2b
491
       movq	mm3,.cur2b
492
       movq	mm4,.cur2r
492
       movq	mm4,.cur2r
493
       movq	mm5,.scan_y2
493
       movq	mm5,.scan_y2
494
       paddd	mm0,.dc13b
494
       paddd	mm0,.dc13b
495
       paddd	mm1,.dc13r
495
       paddd	mm1,.dc13r
496
       paddd	mm2,.tex_dy13
496
       paddd	mm2,.tex_dy13
497
       paddd	mm3,.dc12b
497
       paddd	mm3,.dc12b
498
       paddd	mm4,.dc12r
498
       paddd	mm4,.dc12r
499
       paddd	mm5,.tex_dy12
499
       paddd	mm5,.tex_dy12
500
       movq	.cur1b,mm0
500
       movq	.cur1b,mm0
501
       movq	.cur1r,mm1
501
       movq	.cur1r,mm1
502
       movq	.scan_y1,mm2
502
       movq	.scan_y1,mm2
503
       movq	.cur2b,mm3
503
       movq	.cur2b,mm3
504
       movq	.cur2r,mm4
504
       movq	.cur2r,mm4
505
       movq	.scan_y2,mm5
505
       movq	.scan_y2,mm5
506
end if
506
end if
507
if Ext >= SSE2
507
if Ext >= SSE2
508
       movups	xmm0,.cur1b
508
       movups	xmm0,.cur1b
509
       movups	xmm1,.dc13b
509
       movups	xmm1,.dc13b
510
       movups	xmm2,.cur2b
510
       movups	xmm2,.cur2b
511
       movups	xmm3,.dc12b
511
       movups	xmm3,.dc12b
512
       movq	mm2,.scan_y1
512
       movq	mm2,.scan_y1
513
       movq	mm5,.scan_y2
513
       movq	mm5,.scan_y2
514
       paddd	xmm0,xmm1
514
       paddd	xmm0,xmm1
515
       paddd	xmm2,xmm3
515
       paddd	xmm2,xmm3
516
       paddd	mm2,.tex_dy13
516
       paddd	mm2,.tex_dy13
517
       paddd	mm5,.tex_dy12
517
       paddd	mm5,.tex_dy12
518
       movq	.scan_y1,mm2
518
       movq	.scan_y1,mm2
519
       movq	.scan_y2,mm5
519
       movq	.scan_y2,mm5
520
       movups	.cur1b,xmm0
520
       movups	.cur1b,xmm0
521
       movups	.cur2b,xmm2
521
       movups	.cur2b,xmm2
522
end if
522
end if
523
 
523
 
524
if Ext = NON
524
if Ext = NON
525
       mov	edx,.dc13b
525
       mov	edx,.dc13b
526
       add	.cur1b,edx
526
       add	.cur1b,edx
527
       mov	esi,.dc13g
527
       mov	esi,.dc13g
528
       add	.cur1g,esi
528
       add	.cur1g,esi
529
       mov	edi,.dc13r
529
       mov	edi,.dc13r
530
       add	.cur1r,edi
530
       add	.cur1r,edi
531
       mov	edx,.dz13
531
       mov	edx,.dz13
532
       add	.zz1,edx
532
       add	.zz1,edx
533
       mov	edx,.tex_dx13
533
       mov	edx,.tex_dx13
534
       add	.scan_x1,edx
534
       add	.scan_x1,edx
535
       mov	esi,.tex_dy13
535
       mov	esi,.tex_dy13
536
       add	.scan_y1,esi
536
       add	.scan_y1,esi
537
 
537
 
538
       mov	edi,.dc12b
538
       mov	edi,.dc12b
539
       add	.cur2b,edi
539
       add	.cur2b,edi
540
       mov	esi,.dc12g
540
       mov	esi,.dc12g
541
       add	.cur2g,esi
541
       add	.cur2g,esi
542
       mov	edx,.dc12r
542
       mov	edx,.dc12r
543
       add	.cur2r,edx
543
       add	.cur2r,edx
544
       mov	edi,.tex_dx12
544
       mov	edi,.tex_dx12
545
       add	.scan_x2,edi
545
       add	.scan_x2,edi
546
       mov	esi,.tex_dy12
546
       mov	esi,.tex_dy12
547
       add	.scan_y2,esi
547
       add	.scan_y2,esi
548
       mov	edx,.dz12
548
       mov	edx,.dz12
549
       add	.zz2,edx
549
       add	.zz2,edx
550
end if
550
end if
551
       add	eax,.dx13
551
       add	eax,.dx13
552
       add	ebx,.dx12
552
       add	ebx,.dx12
553
       inc	cx
553
       inc	cx
554
       cmp	cx,.y2
554
       cmp	cx,.y2
555
       jl      .loop_1
555
       jl      .loop_1
556
 .loop1_end:
556
 .loop1_end:
557
       movzx	ecx,.y2
557
       movzx	ecx,.y2
558
       cmp	cx,.y3
558
       cmp	cx,.y3
559
       jge	.loop2_end
559
       jge	.loop2_end
560
 
560
 
561
       movsx	ebx,.x2 		   ; eax - cur x1
561
       movsx	ebx,.x2 		   ; eax - cur x1
562
       shl	ebx,ROUND		   ; ebx - cur x2
562
       shl	ebx,ROUND		   ; ebx - cur x2
563
 
563
 
564
       movsx	edx,word .z2
564
       movsx	edx,word .z2
565
       shl	edx,CATMULL_SHIFT
565
       shl	edx,CATMULL_SHIFT
566
;       mov      .zz1,edx
566
;       mov      .zz1,edx
567
       mov	.zz2,edx
567
       mov	.zz2,edx
568
 
568
 
569
       movzx	edi,word .col2r
569
       movzx	edi,word .col2r
570
       shl	edi,ROUND
570
       shl	edi,ROUND
571
   ;    mov      .cur1r,edi
571
   ;    mov      .cur1r,edi
572
       mov	.cur2r,edi
572
       mov	.cur2r,edi
573
       movzx	esi,word .col2g
573
       movzx	esi,word .col2g
574
       shl	esi,ROUND
574
       shl	esi,ROUND
575
   ;    mov      .cur1g,esi
575
   ;    mov      .cur1g,esi
576
       mov	.cur2g,esi
576
       mov	.cur2g,esi
577
       movzx	edx,word .col2b
577
       movzx	edx,word .col2b
578
       shl	edx,ROUND
578
       shl	edx,ROUND
579
   ;    mov      .cur1b,edx
579
   ;    mov      .cur1b,edx
580
       mov	.cur2b,edx
580
       mov	.cur2b,edx
581
 
581
 
582
       movzx	edi,word .tex_x2
582
       movzx	edi,word .tex_x2
583
       shl	edi,ROUND
583
       shl	edi,ROUND
584
 ;      mov      .scan_x1,edi
584
 ;      mov      .scan_x1,edi
585
       mov	.scan_x2,edi
585
       mov	.scan_x2,edi
586
       movzx	edx,word .tex_y2
586
       movzx	edx,word .tex_y2
587
       shl	edx,ROUND
587
       shl	edx,ROUND
588
 ;      mov      .scan_y1,edx
588
 ;      mov      .scan_y1,edx
589
       mov	.scan_y2,edx
589
       mov	.scan_y2,edx
590
 
590
 
591
  .loop_2:
591
  .loop_2:
592
       pushad
592
       pushad
593
 
593
 
594
       push	.tex_ptr
594
       push	.tex_ptr
595
       push	.scr_buff
595
       push	.scr_buff
596
       push	.z_ptr
596
       push	.z_ptr
597
       push	cx
597
       push	cx
598
 
598
 
599
       push	.zz2
599
       push	.zz2
600
 
600
 
601
       push	.scan_x2
601
       push	.scan_x2
602
       push	dword .scan_y2
602
       push	dword .scan_y2
603
       push	dword .cur2r
603
       push	dword .cur2r
604
       push	.cur2g
604
       push	.cur2g
605
       push	dword .cur2b
605
       push	dword .cur2b
606
 
606
 
607
       push	.zz1
607
       push	.zz1
608
 
608
 
609
       push	.scan_x1
609
       push	.scan_x1
610
       push	dword .scan_y1
610
       push	dword .scan_y1
611
       push	dword .cur1r
611
       push	dword .cur1r
612
       push	.cur1g
612
       push	.cur1g
613
       push	dword .cur1b
613
       push	dword .cur1b
614
 
614
 
615
       sar	eax,ROUND
615
       sar	eax,ROUND
616
       sar	ebx,ROUND
616
       sar	ebx,ROUND
617
       call	horizontal_tex_grd_line
617
       call	horizontal_tex_grd_line
618
 
618
 
619
       popad
619
       popad
620
 
620
 
621
if (Ext = MMX)|(Ext=SSE)
621
if (Ext = MMX)|(Ext=SSE)
622
       movq	mm0,.cur1b
622
       movq	mm0,.cur1b
623
       movq	mm1,.cur1r
623
       movq	mm1,.cur1r
624
       movq	mm2,.scan_y1
624
       movq	mm2,.scan_y1
625
       movq	mm3,.cur2b
625
       movq	mm3,.cur2b
626
       movq	mm4,.cur2r
626
       movq	mm4,.cur2r
627
       movq	mm5,.scan_y2
627
       movq	mm5,.scan_y2
628
       paddd	mm0,.dc13b
628
       paddd	mm0,.dc13b
629
       paddd	mm1,.dc13r
629
       paddd	mm1,.dc13r
630
       paddd	mm2,.tex_dy13
630
       paddd	mm2,.tex_dy13
631
       paddd	mm3,.dc23b
631
       paddd	mm3,.dc23b
632
       paddd	mm4,.dc23r
632
       paddd	mm4,.dc23r
633
       paddd	mm5,.tex_dy23
633
       paddd	mm5,.tex_dy23
634
       movq	.cur1b,mm0
634
       movq	.cur1b,mm0
635
       movq	.cur1r,mm1
635
       movq	.cur1r,mm1
636
       movq	.scan_y1,mm2
636
       movq	.scan_y1,mm2
637
       movq	.cur2b,mm3
637
       movq	.cur2b,mm3
638
       movq	.cur2r,mm4
638
       movq	.cur2r,mm4
639
       movq	.scan_y2,mm5
639
       movq	.scan_y2,mm5
640
end if
640
end if
641
if Ext >= SSE2
641
if Ext >= SSE2
642
       movups	xmm0,.cur1b
642
       movups	xmm0,.cur1b
643
       movups	xmm1,.dc13b
643
       movups	xmm1,.dc13b
644
       movups	xmm2,.cur2b
644
       movups	xmm2,.cur2b
645
       movups	xmm3,.dc23b
645
       movups	xmm3,.dc23b
646
       movq	mm2,.scan_y1
646
       movq	mm2,.scan_y1
647
       movq	mm5,.scan_y2
647
       movq	mm5,.scan_y2
648
       paddd	xmm0,xmm1
648
       paddd	xmm0,xmm1
649
       paddd	xmm2,xmm3
649
       paddd	xmm2,xmm3
650
       paddd	mm2,.tex_dy13
650
       paddd	mm2,.tex_dy13
651
       paddd	mm5,.tex_dy23
651
       paddd	mm5,.tex_dy23
652
       movq	.scan_y1,mm2
652
       movq	.scan_y1,mm2
653
       movq	.scan_y2,mm5
653
       movq	.scan_y2,mm5
654
       movups	.cur1b,xmm0
654
       movups	.cur1b,xmm0
655
       movups	.cur2b,xmm2
655
       movups	.cur2b,xmm2
656
end if
656
end if
657
if Ext = NON
657
if Ext = NON
658
       mov	edx,.dc13b
658
       mov	edx,.dc13b
659
       add	.cur1b,edx
659
       add	.cur1b,edx
660
       mov	esi,.dc13g
660
       mov	esi,.dc13g
661
       add	.cur1g,esi
661
       add	.cur1g,esi
662
       mov	edi,.dc13r
662
       mov	edi,.dc13r
663
       add	.cur1r,edi
663
       add	.cur1r,edi
664
       mov	edx,.tex_dx13
664
       mov	edx,.tex_dx13
665
       add	.scan_x1,edx
665
       add	.scan_x1,edx
666
       mov	esi,.tex_dy13
666
       mov	esi,.tex_dy13
667
       add	.scan_y1,esi
667
       add	.scan_y1,esi
668
       mov	edx,.dz13
668
       mov	edx,.dz13
669
       add	.zz1,edx
669
       add	.zz1,edx
670
 
670
 
671
       mov	edi,.dc23b
671
       mov	edi,.dc23b
672
       add	.cur2b,edi
672
       add	.cur2b,edi
673
       mov	esi,.dc23g
673
       mov	esi,.dc23g
674
       add	.cur2g,esi
674
       add	.cur2g,esi
675
       mov	edx,.dc23r
675
       mov	edx,.dc23r
676
       add	.cur2r,edx
676
       add	.cur2r,edx
677
       mov	edi,.tex_dx23
677
       mov	edi,.tex_dx23
678
       add	.scan_x2,edi
678
       add	.scan_x2,edi
679
       mov	esi,.tex_dy23
679
       mov	esi,.tex_dy23
680
       add	.scan_y2,esi
680
       add	.scan_y2,esi
681
       mov	edx,.dz23
681
       mov	edx,.dz23
682
       add	.zz2,edx
682
       add	.zz2,edx
683
end if
683
end if
684
       add	eax,.dx13
684
       add	eax,.dx13
685
       add	ebx,.dx23
685
       add	ebx,.dx23
686
       inc	cx
686
       inc	cx
687
       cmp	cx,.y3
687
       cmp	cx,.y3
688
       jl	.loop_2
688
       jl	.loop_2
689
 
689
 
690
.loop2_end:
690
.loop2_end:
691
       mov	esp,ebp
691
       mov	esp,ebp
692
ret 36
692
ret 36
693
horizontal_tex_grd_line:
693
horizontal_tex_grd_line:
694
;in:
694
;in:
695
; eax : x1, ebx : x2
695
; eax : x1, ebx : x2
696
 
696
 
697
.tex_ptr  equ [ebp+62]
697
.tex_ptr  equ [ebp+62]
698
.screen   equ [ebp+58]
698
.screen   equ [ebp+58]
699
.z_buffer equ [ebp+54]
699
.z_buffer equ [ebp+54]
700
.y	  equ [ebp+52]
700
.y	  equ [ebp+52]
701
 
701
 
702
.z2	equ [ebp+48]
702
.z2	equ [ebp+48]
703
.tex_x2 equ [ebp+44]
703
.tex_x2 equ [ebp+44]
704
.tex_y2 equ [ebp+40]
704
.tex_y2 equ [ebp+40]
705
.r2	equ [ebp+36]
705
.r2	equ [ebp+36]
706
.g2	equ [ebp+32]
706
.g2	equ [ebp+32]
707
.b2	equ [ebp+28]
707
.b2	equ [ebp+28]
708
 
708
 
709
.z1	equ [ebp+24]
709
.z1	equ [ebp+24]
710
.tex_x1 equ [ebp+20]
710
.tex_x1 equ [ebp+20]
711
.tex_y1 equ [ebp+16]
711
.tex_y1 equ [ebp+16]
712
.r1	equ [ebp+12]
712
.r1	equ [ebp+12]
713
.g1	equ [ebp+8]
713
.g1	equ [ebp+8]
714
.b1	equ [ebp+4]
714
.b1	equ [ebp+4]
715
 
715
 
716
.x1 equ  word[ebp-2]
716
.x1 equ  word[ebp-2]
717
.x2 equ  word[ebp-4]
717
.x2 equ  word[ebp-4]
718
.dz equ dword[ebp-8]
718
.dz equ dword[ebp-8]
719
.db equ dword[ebp-12]
719
.db equ dword[ebp-12]
720
.dg equ dword[ebp-16]
720
.dg equ dword[ebp-16]
721
.dr equ dword[ebp-20]
721
.dr equ dword[ebp-20]
722
.dtex_x equ dword[ebp-24]
722
.dtex_x equ dword[ebp-24]
723
.dtex_y equ dword[ebp-28]
723
.dtex_y equ dword[ebp-28]
724
 
724
 
725
.c_ty equ [ebp-32]
725
.c_ty equ [ebp-32]
726
.c_tx equ [ebp-36]
726
.c_tx equ [ebp-36]
727
.cb  equ  [ebp-40]
727
.cb  equ  [ebp-40]
728
.cg  equ  [ebp-44]
728
.cg  equ  [ebp-44]
729
.cr  equ  [ebp-48]
729
.cr  equ  [ebp-48]
730
.t_col equ [ebp-52]
730
.t_col equ [ebp-52]
731
 
731
 
732
.dtex_yM equ qword[ebp-28]
732
.dtex_yM equ qword[ebp-28]
733
.drM equ qword[ebp-20]
733
.drM equ qword[ebp-20]
734
.dbM equ qword[ebp-12]
734
.dbM equ qword[ebp-12]
735
 
735
 
736
	mov	ebp,esp
736
	mov	ebp,esp
737
  ;      sub     esp,30
737
  ;      sub     esp,30
738
 
738
 
739
	mov	cx,word .y
739
	mov	cx,word .y
740
	or	cx,cx
740
	or	cx,cx
741
	jl	.quit_l
741
	jl	.quit_l
742
 
742
 
743
	cmp	cx,SIZE_Y
743
	cmp	cx,word[size_y_var]  ;SIZE_Y
744
	jge	.quit_l
744
	jge	.quit_l
745
 
745
 
746
	cmp	ax,bx
746
	cmp	ax,bx
747
	je	.quit_l
747
	je	.quit_l
748
	jl	@f
748
	jl	@f
749
 
749
 
750
	xchg	eax,ebx
750
	xchg	eax,ebx
751
 
751
 
752
if Ext=NON
752
if Ext=NON
753
	mov	ecx,dword .r1
753
	mov	ecx,dword .r1
754
	xchg	ecx, .r2
754
	xchg	ecx, .r2
755
	mov	dword .r1, ecx
755
	mov	dword .r1, ecx
756
 
756
 
757
	mov	ecx,dword .g1
757
	mov	ecx,dword .g1
758
	xchg	ecx, .g2
758
	xchg	ecx, .g2
759
	mov	dword .g1, ecx
759
	mov	dword .g1, ecx
760
 
760
 
761
	mov	ecx,dword .b1
761
	mov	ecx,dword .b1
762
	xchg	ecx, .b2
762
	xchg	ecx, .b2
763
	mov	dword .b1, ecx
763
	mov	dword .b1, ecx
764
 
764
 
765
	mov	ecx,dword .tex_x1
765
	mov	ecx,dword .tex_x1
766
	xchg	ecx, .tex_x2
766
	xchg	ecx, .tex_x2
767
	mov	dword .tex_x1, ecx
767
	mov	dword .tex_x1, ecx
768
 
768
 
769
	mov	ecx,dword .tex_y1
769
	mov	ecx,dword .tex_y1
770
	xchg	ecx, .tex_y2
770
	xchg	ecx, .tex_y2
771
	mov	dword .tex_y1, ecx
771
	mov	dword .tex_y1, ecx
772
 
772
 
773
	mov	ecx,dword .z1
773
	mov	ecx,dword .z1
774
	xchg	ecx, .z2
774
	xchg	ecx, .z2
775
	mov	dword .z1, ecx
775
	mov	dword .z1, ecx
776
end if
776
end if
777
if (Ext=MMX)
777
if (Ext=MMX)
778
	movq	mm0,.b1        ; b, g
778
	movq	mm0,.b1        ; b, g
779
	movq	mm1,.b2
779
	movq	mm1,.b2
780
	movq	.b1, mm1
780
	movq	.b1, mm1
781
	movq	.b2, mm0
781
	movq	.b2, mm0
782
	movq	mm2,.r1        ; r, y
782
	movq	mm2,.r1        ; r, y
783
	movq	mm3,.r2
783
	movq	mm3,.r2
784
	movq	.r1,mm3
784
	movq	.r1,mm3
785
	movq	.r2,mm2
785
	movq	.r2,mm2
786
	movq	mm4,.tex_x1    ; x, z
786
	movq	mm4,.tex_x1    ; x, z
787
	movq	mm5,.tex_x2
787
	movq	mm5,.tex_x2
788
	movq	.tex_x1,mm5
788
	movq	.tex_x1,mm5
789
	movq	.tex_x2,mm4
789
	movq	.tex_x2,mm4
790
 
790
 
791
end if
791
end if
792
if Ext>=SSE
792
if Ext>=SSE
793
       movups  xmm0,.b1
793
       movups  xmm0,.b1
794
       movups  xmm1,.b2
794
       movups  xmm1,.b2
795
       movups  .b1,xmm1
795
       movups  .b1,xmm1
796
       movups  .b2,xmm0
796
       movups  .b2,xmm0
797
       movq    mm4,.tex_x1    ; x, z
797
       movq    mm4,.tex_x1    ; x, z
798
       movq    mm5,.tex_x2
798
       movq    mm5,.tex_x2
799
       movq    .tex_x1,mm5
799
       movq    .tex_x1,mm5
800
       movq    .tex_x2,mm4
800
       movq    .tex_x2,mm4
801
end if
801
end if
802
 
802
 
803
    @@:
803
    @@:
804
	or	bx,bx
804
	or	bx,bx
805
	jle	.quit_l
805
	jle	.quit_l
806
	cmp	ax,SIZE_X
806
	cmp	ax,word[size_x_var]  ;SIZE_X
807
	jge	.quit_l
807
	jge	.quit_l
808
 
808
 
809
	push	ax
809
	push	ax
810
	push	bx
810
	push	bx
811
 
811
 
812
	mov	eax,.z2 	   ; delta zone************
812
	mov	eax,.z2 	   ; delta zone************
813
	sub	eax,.z1
813
	sub	eax,.z1
814
	cdq
814
	cdq
815
	mov	bx,.x2
815
	mov	bx,.x2
816
	sub	bx,.x1
816
	sub	bx,.x1
817
	movsx	ebx,bx
817
	movsx	ebx,bx
818
	idiv	ebx
818
	idiv	ebx
819
	push	eax  ; .dz
819
	push	eax  ; .dz
820
 
820
 
821
	mov	eax,.b2
821
	mov	eax,.b2
822
	sub	eax,.b1
822
	sub	eax,.b1
823
	cdq
823
	cdq
824
	idiv	ebx
824
	idiv	ebx
825
	push	eax  ; .db
825
	push	eax  ; .db
826
 
826
 
827
	mov	eax,.g2
827
	mov	eax,.g2
828
	sub	eax,.g1
828
	sub	eax,.g1
829
	cdq
829
	cdq
830
	idiv	ebx
830
	idiv	ebx
831
	push	eax  ; .dg
831
	push	eax  ; .dg
832
 
832
 
833
	mov	eax,.r2
833
	mov	eax,.r2
834
	sub	eax,.r1
834
	sub	eax,.r1
835
	cdq
835
	cdq
836
	idiv	ebx
836
	idiv	ebx
837
	push	eax  ; .dr
837
	push	eax  ; .dr
838
 
838
 
839
	mov	eax,.tex_x2
839
	mov	eax,.tex_x2
840
	sub	eax,.tex_x1
840
	sub	eax,.tex_x1
841
	cdq
841
	cdq
842
	idiv	ebx
842
	idiv	ebx
843
	push	eax  ; .dtex_x
843
	push	eax  ; .dtex_x
844
 
844
 
845
	mov	eax,.tex_y2
845
	mov	eax,.tex_y2
846
	sub	eax,.tex_y1
846
	sub	eax,.tex_y1
847
	cdq
847
	cdq
848
	idiv	ebx
848
	idiv	ebx
849
	push	eax  ; .dtey_x
849
	push	eax  ; .dtey_x
850
 
850
 
851
	cmp	.x1,0
851
	cmp	.x1,0
852
	jg	@f
852
	jg	@f
853
 
853
 
854
	mov	eax,.dz     ; clipping
854
	mov	eax,.dz     ; clipping
855
	movsx	ebx,.x1
855
	movsx	ebx,.x1
856
	neg	ebx
856
	neg	ebx
857
	imul	ebx
857
	imul	ebx
858
	add	.z1,eax
858
	add	.z1,eax
859
	mov	.x1,0
859
	mov	.x1,0
860
 
860
 
861
	mov    eax,.dr
861
	mov    eax,.dr
862
	imul   ebx
862
	imul   ebx
863
	add    .r1,eax
863
	add    .r1,eax
864
;if  Ext=NON
864
;if  Ext=NON
865
	mov    eax,.dg
865
	mov    eax,.dg
866
	imul   ebx
866
	imul   ebx
867
	add    .g1,eax
867
	add    .g1,eax
868
 
868
 
869
	mov    eax,.db
869
	mov    eax,.db
870
	imul   ebx
870
	imul   ebx
871
	add    .b1,eax
871
	add    .b1,eax
872
 
872
 
873
	mov    eax,.dtex_x
873
	mov    eax,.dtex_x
874
	imul   ebx
874
	imul   ebx
875
	add    .tex_x1,eax
875
	add    .tex_x1,eax
876
 
876
 
877
	mov    eax,.dtex_y
877
	mov    eax,.dtex_y
878
	imul   ebx
878
	imul   ebx
879
	add    .tex_y1,eax
879
	add    .tex_y1,eax
880
   @@:
880
   @@:
881
	mov	  edx,SIZE_X
881
	movsx	  edx,word[size_x_var]	;SIZE_X
882
	cmp	  .x2,dx
882
	cmp	  .x2,dx
883
	jl	  @f
883
	jl	  @f
884
	mov	  .x2,dx
884
	mov	  .x2,dx
885
    @@:
885
    @@:
886
; calc line addres begin in screen and Z buffer
886
; calc line addres begin in screen and Z buffer
887
	movsx	  eax,word .y
887
	movsx	  eax,word .y
888
	mul	  edx
888
	mul	  edx
889
	movsx	  edx,.x1
889
	movsx	  edx,.x1
890
	add	  eax,edx
890
	add	  eax,edx
891
 
891
 
892
	mov	  esi,eax
892
	mov	  esi,eax
893
	shl	  esi,2
893
	shl	  esi,2
894
	add	  esi,.z_buffer
894
	add	  esi,.z_buffer
895
 
895
 
896
	lea	  eax,[eax*3]
896
	lea	  eax,[eax*3]
897
	mov	  edi,.screen
897
	mov	  edi,.screen
898
	add	  edi,eax
898
	add	  edi,eax
899
 
899
 
900
	mov	  cx,.x2
900
	mov	  cx,.x2
901
	sub	  cx,.x1
901
	sub	  cx,.x1
902
	movzx	  ecx,cx
902
	movzx	  ecx,cx
903
 
903
 
904
; init current variables
904
; init current variables
905
	push	  dword .tex_y1
905
	push	  dword .tex_y1
906
;if  Ext=NON
906
;if  Ext=NON
907
	push	  dword .tex_x1
907
	push	  dword .tex_x1
908
 
908
 
909
	push	  dword .b1
909
	push	  dword .b1
910
	push	  dword .g1
910
	push	  dword .g1
911
	push	  dword .r1
911
	push	  dword .r1
912
 
912
 
913
if Ext>=MMX
913
if Ext>=MMX
914
	movq	  mm4,.cr  ; lo -> r,g
914
	movq	  mm4,.cr  ; lo -> r,g
915
	movq	  mm6,.cb  ; hi -> b, tex_x
915
	movq	  mm6,.cb  ; hi -> b, tex_x
916
	pxor	  mm0,mm0
916
	pxor	  mm0,mm0
917
end if
917
end if
918
	mov	  ebx,.z1
918
	mov	  ebx,.z1
919
      .ddraw:
919
      .ddraw:
920
	cmp	  ebx,dword[esi]
920
	cmp	  ebx,dword[esi]
921
	jge	  @f
921
	jge	  @f
922
	mov	  eax,.c_ty
922
	mov	  eax,.c_ty
923
;  if ROUND
923
;  if ROUND
924
;        shl        eax,TEX_SHIFT-ROUND
924
;        shl        eax,TEX_SHIFT-ROUND
925
;  end if
925
;  end if
926
;  if ROUND>TEX_SHIFT
926
;  if ROUND>TEX_SHIFT
927
;        shr        eax,ROUND-TEX_SHIFT
927
;        shr        eax,ROUND-TEX_SHIFT
928
;  end if
928
;  end if
929
	shr	  eax,ROUND
929
	shr	  eax,ROUND
930
	shl	  Eax,TEX_SHIFT
930
	shl	  Eax,TEX_SHIFT
931
	mov	  edx,.c_tx   ; calc texture pixel mem addres
931
	mov	  edx,.c_tx   ; calc texture pixel mem addres
932
	shr	  edx,ROUND
932
	shr	  edx,ROUND
933
	add	  eax,edx
933
	add	  eax,edx
934
	and	  eax,TEXTURE_SIZE   ; cutting
934
	and	  eax,TEXTURE_SIZE   ; cutting
935
	lea	  eax,[3*eax]
935
	lea	  eax,[3*eax]
936
	add	  eax,.tex_ptr
936
	add	  eax,.tex_ptr
937
	mov	  dword[esi],ebx
937
	mov	  dword[esi],ebx
938
if    Ext = NON
938
if    Ext = NON
939
	mov	  eax,dword[eax]
939
	mov	  eax,dword[eax]
940
 ;      mov        .tex_col,eax
940
 ;      mov        .tex_col,eax
941
	push	  ax
941
	push	  ax
942
	shl	  eax,8
942
	shl	  eax,8
943
	pop	  ax
943
	pop	  ax
944
	mov	  edx,.cr
944
	mov	  edx,.cr
945
	sar	  edx,ROUND
945
	sar	  edx,ROUND
946
	mul	  dl	     ; al*dl
946
	mul	  dl	     ; al*dl
947
	shr	  ax,8
947
	shr	  ax,8
948
	stosb
948
	stosb
949
	ror	  eax,16
949
	ror	  eax,16
950
	push	  ax
950
	push	  ax
951
	mov	  edx,.cg
951
	mov	  edx,.cg
952
	sar	  edx,ROUND
952
	sar	  edx,ROUND
953
	mul	  dl
953
	mul	  dl
954
	shr	  ax,8
954
	shr	  ax,8
955
	stosb
955
	stosb
956
	pop	  ax
956
	pop	  ax
957
	shr	  ax,8
957
	shr	  ax,8
958
	mov	  edx,.cb
958
	mov	  edx,.cb
959
	sar	  edx,ROUND
959
	sar	  edx,ROUND
960
	mul	  dl
960
	mul	  dl
961
	shr	  ax,8
961
	shr	  ax,8
962
	stosb
962
	stosb
963
	jmp	  .no_skip
963
	jmp	  .no_skip
964
else
964
else
965
	movd	  mm1,[eax]
965
	movd	  mm1,[eax]
966
	punpcklbw mm1,mm0
966
	punpcklbw mm1,mm0
967
	movq	  mm3,mm4  ;.cr     ; lo -> r,g
967
	movq	  mm3,mm4  ;.cr     ; lo -> r,g
968
	movq	  mm5,mm6  ;.cb     ; lo -> b,tex_x
968
	movq	  mm5,mm6  ;.cb     ; lo -> b,tex_x
969
	psrld	  mm3,ROUND  ;
969
	psrld	  mm3,ROUND  ;
970
	psrld	  mm5,ROUND  ;
970
	psrld	  mm5,ROUND  ;
971
	packssdw  mm3,mm5
971
	packssdw  mm3,mm5
972
	pmullw	  mm1,mm3
972
	pmullw	  mm1,mm3
973
	psrlw	  mm1,8
973
	psrlw	  mm1,8
974
	packuswb  mm1,mm0
974
	packuswb  mm1,mm0
975
	movd	  [edi],mm1
975
	movd	  [edi],mm1
976
end if
976
end if
977
       mov	  dword[esi],ebx
977
       mov	  dword[esi],ebx
978
if Ext = NON
978
if Ext = NON
979
       jmp	  .no_skip
979
       jmp	  .no_skip
980
end if
980
end if
981
     @@:
981
     @@:
982
       add	  edi,3
982
       add	  edi,3
983
     .no_skip:
983
     .no_skip:
984
       add	  esi,4
984
       add	  esi,4
985
       add	  ebx,.dz
985
       add	  ebx,.dz
986
 
986
 
987
       mov	  eax,.dtex_x
987
       mov	  eax,.dtex_x
988
       add	  .c_tx, eax
988
       add	  .c_tx, eax
989
       mov	  edx,.dtex_y
989
       mov	  edx,.dtex_y
990
       add	  .c_ty, edx
990
       add	  .c_ty, edx
991
if Ext=NON
991
if Ext=NON
992
       mov	  eax,.dr
992
       mov	  eax,.dr
993
       add	  .cr,eax
993
       add	  .cr,eax
994
       mov	  edx,.dg
994
       mov	  edx,.dg
995
       add	  .cg,edx
995
       add	  .cg,edx
996
       mov	  eax,.db
996
       mov	  eax,.db
997
       add	  .cb,eax
997
       add	  .cb,eax
998
 
998
 
999
else
999
else
1000
	paddd	   mm4,.drM
1000
	paddd	   mm4,.drM
1001
	paddd	   mm6,.dbM
1001
	paddd	   mm6,.dbM
1002
;;        paddd      mm7,.dtex_y      ; mm4 - b, g
1002
;;        paddd      mm7,.dtex_y      ; mm4 - b, g
1003
;;        movq       .c_tx,mm7
1003
;;        movq       .c_tx,mm7
1004
				    ; mm6 - r, x
1004
				    ; mm6 - r, x
1005
end if				    ; mm7 - y, x
1005
end if				    ; mm7 - y, x
1006
 
1006
 
1007
       dec	ecx
1007
       dec	ecx
1008
       jnz	.ddraw
1008
       jnz	.ddraw
1009
 
1009
 
1010
  .quit_l:
1010
  .quit_l:
1011
 
1011
 
1012
	mov	esp,ebp
1012
	mov	esp,ebp
1013
ret 42+20  ; horizontal line
1013
ret 42+20  ; horizontal line
1014
;>
1014
;>