Subversion Repositories Kolibri OS

Rev

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

Rev 6619 Rev 6769
1
;SIZE_X equ 350
1
;SIZE_X equ 350
2
;SIZE_Y equ 350
2
;SIZE_Y equ 350
3
;ROUND equ 8
3
;ROUND equ 8
4
;TEX_X equ 512
4
;TEX_X equ 512
5
;TEX_Y equ 512
5
;TEX_Y equ 512
6
;TEXTURE_SIZE EQU (512*512)-1
6
;TEXTURE_SIZE EQU (512*512)-1
7
;TEX_SHIFT EQU 9
7
;TEX_SHIFT EQU 9
8
 
8
 
9
;CATMULL_SHIFT equ 8
9
;CATMULL_SHIFT equ 8
10
;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1
10
;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1
11
;Ext = SSE
11
;Ext = SSE
12
;SSE = 3
12
;SSE = 3
13
;MMX = 1
13
;MMX = 1
14
;NON = 0
14
;NON = 0
15
;use32
15
;use32
16
;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great---
16
;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great---
17
;------- DOS 13h mode demos --------------------------------------------
17
;------- DOS 13h mode demos --------------------------------------------
18
;------- Procedure draws triangle with two overlapped textures, I use --
18
;------- Procedure draws triangle with two overlapped textures, I use --
19
;--------Catmull Z-buffer algorithm- (Z coordinate interpolation)-------
19
;--------Catmull Z-buffer algorithm- (Z coordinate interpolation)-------
20
;--------I calc texture pixel by this way: col1*col2/256 ---------------
20
;--------I calc texture pixel by this way: col1*col2/256 ---------------
21
two_tex_triangle_z:
21
two_tex_triangle_z:
22
;------------------in - eax - x1 shl 16 + y1 -----------
22
;------------------in - eax - x1 shl 16 + y1 -----------
23
;---------------------- ebx - x2 shl 16 + y2 -----------
23
;---------------------- ebx - x2 shl 16 + y2 -----------
24
;---------------------- ecx - x3 shl 16 + y3 -----------
24
;---------------------- ecx - x3 shl 16 + y3 -----------
25
;---------------------- edx - pointer to b. texture-----
25
;---------------------- edx - pointer to b. texture-----
26
;---------------------- esi - pointer to e. texture-----
26
;---------------------- esi - pointer to e. texture-----
27
;---------------------- edi - pointer to screen buffer--
27
;---------------------- edi - pointer to screen buffer--
28
;---------------------- stack : b. tex coordinates------
28
;---------------------- stack : b. tex coordinates------
29
;----------------------         e. tex coordinates------
29
;----------------------         e. tex coordinates------
30
;----------------------         Z position coordinates--
30
;----------------------         Z position coordinates--
31
;----------------------         pointer io Z buffer-----
31
;----------------------         pointer io Z buffer-----
32
;-- Z-buffer - filled with coordinates as dword --------
32
;-- Z-buffer - filled with coordinates as dword --------
33
;-- (Z coor. as word) shl CATMULL_SHIFT ----------------
33
;-- (Z coor. as word) shl CATMULL_SHIFT ----------------
34
.b_x1	equ ebp+4   ; procedure don't save registers !!!
34
.b_x1	equ ebp+4   ; procedure don't save registers !!!
35
.b_y1	equ ebp+6   ; each coordinate as word
35
.b_y1	equ ebp+6   ; each coordinate as word
36
.b_x2	equ ebp+8
36
.b_x2	equ ebp+8
37
.b_y2	equ ebp+10	 ; b - first texture
37
.b_y2	equ ebp+10	 ; b - first texture
38
.b_x3	equ ebp+12
38
.b_x3	equ ebp+12
39
.b_y3	equ ebp+14	 ; e - second texture
39
.b_y3	equ ebp+14	 ; e - second texture
40
.e_x1	equ ebp+16
40
.e_x1	equ ebp+16
41
.e_y1	equ ebp+18
41
.e_y1	equ ebp+18
42
.e_x2	equ ebp+20
42
.e_x2	equ ebp+20
43
.e_y2	equ ebp+22
43
.e_y2	equ ebp+22
44
.e_x3	equ ebp+24
44
.e_x3	equ ebp+24
45
.e_y3	equ ebp+26
45
.e_y3	equ ebp+26
46
.z1	equ word[ebp+28]
46
.z1	equ word[ebp+28]
47
.z2	equ word[ebp+30]
47
.z2	equ word[ebp+30]
48
.z3	equ word[ebp+32]
48
.z3	equ word[ebp+32]
49
.z_buff equ dword[ebp+34]	; pointer to Z-buffer
49
.z_buff equ dword[ebp+34]	; pointer to Z-buffer
50
 
50
 
51
 
51
 
52
.t_bmap equ dword[ebp-4]	; pointer to b. texture
52
.t_bmap equ dword[ebp-4]	; pointer to b. texture
53
.t_emap equ dword[ebp-8]	; pointer to e. texture
53
.t_emap equ dword[ebp-8]	; pointer to e. texture
54
.x1	equ word[ebp-10]
54
.x1	equ word[ebp-10]
55
.y1	equ word[ebp-12]
55
.y1	equ word[ebp-12]
56
.x2	equ word[ebp-14]
56
.x2	equ word[ebp-14]
57
.y2	equ word[ebp-16]
57
.y2	equ word[ebp-16]
58
.x3	equ word[ebp-18]
58
.x3	equ word[ebp-18]
59
.y3	equ word[ebp-20]
59
.y3	equ word[ebp-20]
60
 
60
 
61
.dx12  equ dword[ebp-24]
61
.dx12  equ dword[ebp-24]
62
.dbx12 equ dword[ebp-28]
62
.dbx12 equ dword[ebp-28]
63
.dby12 equ dword[ebp-32]
63
.dby12 equ dword[ebp-32]
64
.dby12q equ	[ebp-32]
64
.dby12q equ	[ebp-32]
65
.dex12 equ dword[ebp-36]
65
.dex12 equ dword[ebp-36]
66
.dey12 equ dword[ebp-40]
66
.dey12 equ dword[ebp-40]
67
.dey12q equ	[ebp-40]
67
.dey12q equ	[ebp-40]
68
.dz12  equ dword[ebp-44]
68
.dz12  equ dword[ebp-44]
69
 
69
 
70
.dx13  equ dword[ebp-48]
70
.dx13  equ dword[ebp-48]
71
.dbx13 equ dword[ebp-52]
71
.dbx13 equ dword[ebp-52]
72
.dby13 equ dword[ebp-56]
72
.dby13 equ dword[ebp-56]
73
.dby13q equ	[ebp-56]
73
.dby13q equ	[ebp-56]
74
.dex13 equ dword[ebp-60]
74
.dex13 equ dword[ebp-60]
75
.dey13 equ dword[ebp-64]
75
.dey13 equ dword[ebp-64]
76
.dey13q equ	[ebp-64]
76
.dey13q equ	[ebp-64]
77
.dz13  equ dword[ebp-68]
77
.dz13  equ dword[ebp-68]
78
 
78
 
79
.dx23  equ dword[ebp-72]
79
.dx23  equ dword[ebp-72]
80
.dbx23 equ dword[ebp-76]
80
.dbx23 equ dword[ebp-76]
81
.dby23 equ dword[ebp-80]
81
.dby23 equ dword[ebp-80]
82
.dby23q equ	[ebp-80]
82
.dby23q equ	[ebp-80]
83
.dex23 equ dword[ebp-84]
83
.dex23 equ dword[ebp-84]
84
.dey23 equ dword[ebp-88]
84
.dey23 equ dword[ebp-88]
85
.dey23q equ	[ebp-88]
85
.dey23q equ	[ebp-88]
86
.dz23  equ dword[ebp-92]
86
.dz23  equ dword[ebp-92]
87
 
87
 
88
.cx1   equ dword[ebp-96]   ; current variables
88
.cx1   equ dword[ebp-96]   ; current variables
89
.cx2   equ dword[ebp-100]
89
.cx2   equ dword[ebp-100]
90
.cbx1  equ dword[ebp-104]
90
.cbx1  equ dword[ebp-104]
91
.cby1  equ [ebp-108]
91
.cby1  equ [ebp-108]
92
.cex1  equ dword[ebp-112]
92
.cex1  equ dword[ebp-112]
93
.cey1  equ [ebp-116]
93
.cey1  equ [ebp-116]
94
.cbx2  equ dword[ebp-120]
94
.cbx2  equ dword[ebp-120]
95
.cby2  equ [ebp-124]
95
.cby2  equ [ebp-124]
96
.cex2  equ dword[ebp-128]
96
.cex2  equ dword[ebp-128]
97
.cey2  equ [ebp-132]
97
.cey2  equ [ebp-132]
98
 
98
 
99
.cz1   equ dword[ebp-136]
99
.cz1   equ dword[ebp-136]
100
.cz2   equ dword[ebp-140]
100
.cz2   equ dword[ebp-140]
101
 
101
 
102
    if Ext >= MMX
102
    if Ext >= MMX
103
       emms
103
       emms
104
    else
104
    else
105
       cld
105
       cld
106
    end if
106
    end if
107
       mov     ebp,esp
107
       mov     ebp,esp
108
       push    edx esi	     ; store bump map
108
       push    edx esi	     ; store bump map
109
;       push    esi        ; store e. map
109
;       push    esi        ; store e. map
110
     ; sub     esp,120
110
     ; sub     esp,120
111
 .sort3:		  ; sort triangle coordinates...
111
 .sort3:		  ; sort triangle coordinates...
112
       cmp     ax,bx
112
       cmp     ax,bx
113
       jle     .sort1
113
       jle     .sort1
114
       xchg    eax,ebx
114
       xchg    eax,ebx
115
       mov     edx,dword[.b_x1]
115
       mov     edx,dword[.b_x1]
116
       xchg    edx,dword[.b_x2]
116
       xchg    edx,dword[.b_x2]
117
       mov     dword[.b_x1],edx
117
       mov     dword[.b_x1],edx
118
       mov     edx,dword[.e_x1]
118
       mov     edx,dword[.e_x1]
119
       xchg    edx,dword[.e_x2]
119
       xchg    edx,dword[.e_x2]
120
       mov     dword[.e_x1],edx
120
       mov     dword[.e_x1],edx
121
       mov     dx,.z1
121
       mov     dx,.z1
122
       xchg    dx,.z2
122
       xchg    dx,.z2
123
       mov     .z1,dx
123
       mov     .z1,dx
124
 .sort1:
124
 .sort1:
125
       cmp	bx,cx
125
       cmp	bx,cx
126
       jle	.sort2
126
       jle	.sort2
127
       xchg	ebx,ecx
127
       xchg	ebx,ecx
128
       mov	edx,dword[.b_x2]
128
       mov	edx,dword[.b_x2]
129
       xchg	edx,dword[.b_x3]
129
       xchg	edx,dword[.b_x3]
130
       mov	dword[.b_x2],edx
130
       mov	dword[.b_x2],edx
131
       mov	edx,dword[.e_x2]
131
       mov	edx,dword[.e_x2]
132
       xchg	edx,dword[.e_x3]
132
       xchg	edx,dword[.e_x3]
133
       mov	dword[.e_x2],edx
133
       mov	dword[.e_x2],edx
134
       mov     dx,.z2
134
       mov     dx,.z2
135
       xchg    dx,.z3
135
       xchg    dx,.z3
136
       mov     .z2,dx
136
       mov     .z2,dx
137
       jmp	.sort3
137
       jmp	.sort3
138
 .sort2:
138
 .sort2:
139
       push	eax ebx ecx    ; store triangle coords in variables
139
       push	eax ebx ecx    ; store triangle coords in variables
140
;       push     ebx
140
;       push     ebx
141
;       push     ecx
141
;       push     ecx
142
 
142
 
143
	 mov	  edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
143
	 mov	  edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
144
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
144
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
145
	 and	  edx,ecx
145
	 and	  edx,ecx
146
	 and	  edx,eax
146
	 and	  edx,eax
147
	 test	  edx,80008000h  ; Check both X&Y at once
147
	 test	  edx,80008000h  ; Check both X&Y at once
148
	 jne	  .loop23_done
148
	 jne	  .loop23_done
149
    ;   mov     edx,eax         ; eax,ebx,ecx are ORd together into edx which means that
149
    ;   mov     edx,eax         ; eax,ebx,ecx are ORd together into edx which means that
150
    ;   or      edx,ebx         ; if any *one* of them is negative a sign flag is raised
150
    ;   or      edx,ebx         ; if any *one* of them is negative a sign flag is raised
151
    ;   or      edx,ecx
151
    ;   or      edx,ecx
152
    ;   test    edx,80000000h   ; Check only X
152
    ;   test    edx,80000000h   ; Check only X
153
    ;   jne     .loop23_done
153
    ;   jne     .loop23_done
154
 
154
 
155
    ;   cmp     .x1,SIZE_X    ; {
155
    ;   cmp     .x1,SIZE_X    ; {
156
    ;   jg      .loop23_done
156
    ;   jg      .loop23_done
157
    ;   cmp     .x2,SIZE_X     ; This can be optimized with effort
157
    ;   cmp     .x2,SIZE_X     ; This can be optimized with effort
158
    ;   jg      .loop23_done
158
    ;   jg      .loop23_done
159
    ;   cmp     .x3,SIZE_X
159
    ;   cmp     .x3,SIZE_X
160
    ;   jg      .loop23_done    ; {
160
    ;   jg      .loop23_done    ; {
161
 
161
 
162
 
162
 
163
       mov	bx,.y2	     ; calc delta 12
163
       mov	bx,.y2	     ; calc delta 12
164
       sub	bx,.y1
164
       sub	bx,.y1
165
       jnz	.bt_dx12_make
165
       jnz	.bt_dx12_make
166
       mov	ecx,6
166
       mov	ecx,6
167
       xor	edx,edx
167
       xor	edx,edx
168
     @@:
168
     @@:
169
       push	edx   ;dword 0
169
       push	edx   ;dword 0
170
       loop	@b
170
       loop	@b
171
       jmp	.bt_dx12_done
171
       jmp	.bt_dx12_done
172
 .bt_dx12_make:
172
 .bt_dx12_make:
173
       mov	ax,.x2
173
       mov	ax,.x2
174
       sub	ax,.x1
174
       sub	ax,.x1
175
       cwde
175
       cwde
176
       movsx	ebx,bx
176
       movsx	ebx,bx
177
       shl	eax,ROUND
177
       shl	eax,ROUND
178
       cdq
178
       cdq
179
       idiv	ebx
179
       idiv	ebx
180
;      mov      .dx12,eax
180
;      mov      .dx12,eax
181
       push	 eax
181
       push	 eax
182
 
182
 
183
if Ext=SSE
183
if Ext=SSE
184
 
184
 
185
       sub	 esp,16
185
       sub	 esp,16
186
       cvtsi2ss  xmm3,ebx	     ;rcps
186
       cvtsi2ss  xmm3,ebx	     ;rcps
187
    ;   mov       eax,255
187
    ;   mov       eax,255
188
       cvtsi2ss  xmm4,[i255d] ;eax
188
       cvtsi2ss  xmm4,[i255d] ;eax
189
       divss	 xmm3,xmm4
189
       divss	 xmm3,xmm4
190
       rcpss	 xmm3,xmm3
190
       rcpss	 xmm3,xmm3
191
    ;   mulss     xmm3,xmm4
191
    ;   mulss     xmm3,xmm4
192
       shufps	 xmm3,xmm3,0
192
       shufps	 xmm3,xmm3,0
193
 
193
 
194
       movd	 mm0,[.b_x1]
194
       movd	 mm0,[.b_x1]
195
       movd	 mm1,[.b_x2]
195
       movd	 mm1,[.b_x2]
196
       movd	 mm2,[.e_x1]
196
       movd	 mm2,[.e_x1]
197
       movd	 mm3,[.e_x2]
197
       movd	 mm3,[.e_x2]
198
     ;  psubsw    mm3,mm2
198
     ;  psubsw    mm3,mm2
199
     ;  psubsw    mm1,mm0
199
     ;  psubsw    mm1,mm0
200
       pxor	 mm4,mm4
200
       pxor	 mm4,mm4
201
       punpcklwd mm0,mm4
201
       punpcklwd mm0,mm4
202
       punpcklwd mm1,mm4
202
       punpcklwd mm1,mm4
203
       punpcklwd mm2,mm4
203
       punpcklwd mm2,mm4
204
       punpcklwd mm3,mm4
204
       punpcklwd mm3,mm4
205
   ;    pslld     mm0,ROUND
205
   ;    pslld     mm0,ROUND
206
   ;    pslld     mm1,ROUND
206
   ;    pslld     mm1,ROUND
207
   ;    pslld     mm2,ROUND
207
   ;    pslld     mm2,ROUND
208
   ;    pslld     mm3,ROUND
208
   ;    pslld     mm3,ROUND
209
       cvtpi2ps  xmm0,mm0
209
       cvtpi2ps  xmm0,mm0
210
       movlhps	 xmm0,xmm0
210
       movlhps	 xmm0,xmm0
211
       cvtpi2ps  xmm0,mm2
211
       cvtpi2ps  xmm0,mm2
212
       cvtpi2ps  xmm1,mm1
212
       cvtpi2ps  xmm1,mm1
213
       movlhps	 xmm1,xmm1
213
       movlhps	 xmm1,xmm1
214
       cvtpi2ps  xmm1,mm3
214
       cvtpi2ps  xmm1,mm3
215
       subps	 xmm1,xmm0
215
       subps	 xmm1,xmm0
216
 
216
 
217
     ;  pxor      mm4,mm4
217
     ;  pxor      mm4,mm4
218
     ;  movq      mm5,mm1
218
     ;  movq      mm5,mm1
219
     ;  movq      mm6,mm1
219
     ;  movq      mm6,mm1
220
     ;  pcmpeqb   mm5,mm4
220
     ;  pcmpeqb   mm5,mm4
221
;       psubd     mm1,mm0
221
;       psubd     mm1,mm0
222
;       psubd     mm3,mm2
222
;       psubd     mm3,mm2
223
 
223
 
224
    ;   movq      mm0,[.b_x1]      ; bx1  by1   bx2    by2
224
    ;   movq      mm0,[.b_x1]      ; bx1  by1   bx2    by2
225
    ;   movq      mm1,[.e_x1]      ; ex1  ey1   ex2    ey2
225
    ;   movq      mm1,[.e_x1]      ; ex1  ey1   ex2    ey2
226
    ;   pxor
226
    ;   pxor
227
    ;   punpcklhd mm0,mm1   ; lwd  ;
227
    ;   punpcklhd mm0,mm1   ; lwd  ;
228
    ;   psubw     mm1,mm0   ; mm1, mm0
228
    ;   psubw     mm1,mm0   ; mm1, mm0
229
    ;   pxor      mm2,mm2
229
    ;   pxor      mm2,mm2
230
  ;     pmovmaskb eax,mm1
230
  ;     pmovmaskb eax,mm1
231
  ;     and       eax,10101010b
231
  ;     and       eax,10101010b
232
    ;   pcmpgtw   mm2,mm1
232
    ;   pcmpgtw   mm2,mm1
233
    ;   punpcklwd mm1,mm2
233
    ;   punpcklwd mm1,mm2
234
 ;      psllw     mm0,ROUND
234
 ;      psllw     mm0,ROUND
235
 ;      psllw     mm1,ROUND
235
 ;      psllw     mm1,ROUND
236
 ;      movq      mm2,mm0
236
 ;      movq      mm2,mm0
237
 ;      psrlq     mm0,32
237
 ;      psrlq     mm0,32
238
 
238
 
239
;       cvtpi2ps  xmm0,mm1
239
;       cvtpi2ps  xmm0,mm1
240
;       movlhps   xmm0,xmm0
240
;       movlhps   xmm0,xmm0
241
;       cvtpi2ps  xmm0,mm3
241
;       cvtpi2ps  xmm0,mm3
242
  ;     divps     xmm1,xmm3
242
  ;     divps     xmm1,xmm3
243
       mulps	 xmm1,xmm3
243
       mulps	 xmm1,xmm3
244
       shufps	 xmm1,xmm1,10110001b
244
       shufps	 xmm1,xmm1,10110001b
245
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
245
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
246
       movhlps	 xmm1,xmm1
246
       movhlps	 xmm1,xmm1
247
       cvtps2pi  mm1,xmm1
247
       cvtps2pi  mm1,xmm1
248
       movq	 .dey12q,mm0
248
       movq	 .dey12q,mm0
249
       movq	 .dby12q,mm1
249
       movq	 .dby12q,mm1
250
 
250
 
251
;       movd      .dex12,mm0
251
;       movd      .dex12,mm0
252
;       psrlq     mm0,32
252
;       psrlq     mm0,32
253
;       movd      .dey12,mm0
253
;       movd      .dey12,mm0
254
;       movhlps   xmm1,xmm1
254
;       movhlps   xmm1,xmm1
255
;       cvtps2pi  mm0,xmm1
255
;       cvtps2pi  mm0,xmm1
256
;       movd      .dbx12,mm0
256
;       movd      .dbx12,mm0
257
;       psrlq     mm0,32
257
;       psrlq     mm0,32
258
;       movd      .dby12,mm0
258
;       movd      .dby12,mm0
259
 
259
 
260
else
260
else
261
       mov	ax,word[.b_x2]
261
       mov	ax,word[.b_x2]
262
       sub	ax,word[.b_x1]
262
       sub	ax,word[.b_x1]
263
       cwde
263
       cwde
264
       shl	eax,ROUND
264
       shl	eax,ROUND
265
       cdq
265
       cdq
266
       idiv	ebx
266
       idiv	ebx
267
 ;     mov      .dbx12,eax
267
 ;     mov      .dbx12,eax
268
       push	 eax
268
       push	 eax
269
 
269
 
270
       mov	ax,word[.b_y2]
270
       mov	ax,word[.b_y2]
271
       sub	ax,word[.b_y1]
271
       sub	ax,word[.b_y1]
272
       cwde
272
       cwde
273
       shl	eax,ROUND
273
       shl	eax,ROUND
274
       cdq
274
       cdq
275
       idiv	ebx
275
       idiv	ebx
276
 ;     mov      .dby12,eax
276
 ;     mov      .dby12,eax
277
       push	 eax
277
       push	 eax
278
 
278
 
279
 ;     mov       eax,.dbx12
279
 ;     mov       eax,.dbx12
280
 ;     mov       ebx,.dby12
280
 ;     mov       ebx,.dby12
281
 ;     int3
281
 ;     int3
282
 
282
 
283
       mov	ax,word[.e_x2]
283
       mov	ax,word[.e_x2]
284
       sub	ax,word[.e_x1]
284
       sub	ax,word[.e_x1]
285
       cwde
285
       cwde
286
       shl	eax,ROUND
286
       shl	eax,ROUND
287
       cdq
287
       cdq
288
       idiv	ebx
288
       idiv	ebx
289
 ;      mov      .dex12,eax
289
 ;      mov      .dex12,eax
290
       push	 eax
290
       push	 eax
291
 
291
 
292
       mov	ax,word[.e_y2]
292
       mov	ax,word[.e_y2]
293
       sub	ax,word[.e_y1]
293
       sub	ax,word[.e_y1]
294
       cwde
294
       cwde
295
       shl	eax,ROUND
295
       shl	eax,ROUND
296
       cdq
296
       cdq
297
       idiv	ebx
297
       idiv	ebx
298
 ;      mov      .dey12,eax
298
 ;      mov      .dey12,eax
299
       push	 eax
299
       push	 eax
300
 
300
 
301
end if
301
end if
302
	mov	ax,.z2
302
	mov	ax,.z2
303
	sub	ax,.z1
303
	sub	ax,.z1
304
	cwde
304
	cwde
305
	shl	eax,CATMULL_SHIFT
305
	shl	eax,CATMULL_SHIFT
306
	cdq
306
	cdq
307
	idiv	ebx
307
	idiv	ebx
308
	push	eax
308
	push	eax
309
   .bt_dx12_done:
309
   .bt_dx12_done:
310
 
310
 
311
       mov	bx,.y3	     ; calc delta13
311
       mov	bx,.y3	     ; calc delta13
312
       sub	bx,.y1
312
       sub	bx,.y1
313
       jnz	.bt_dx13_make
313
       jnz	.bt_dx13_make
314
       mov	ecx,6
314
       mov	ecx,6
315
       xor	edx,edx
315
       xor	edx,edx
316
     @@:
316
     @@:
317
       push	edx   ;dword 0
317
       push	edx   ;dword 0
318
       loop	@b
318
       loop	@b
319
       jmp	.bt_dx13_done
319
       jmp	.bt_dx13_done
320
 .bt_dx13_make:
320
 .bt_dx13_make:
321
       mov	ax,.x3
321
       mov	ax,.x3
322
       sub	ax,.x1
322
       sub	ax,.x1
323
       cwde
323
       cwde
324
       movsx	ebx,bx
324
       movsx	ebx,bx
325
       shl	eax,ROUND
325
       shl	eax,ROUND
326
       cdq
326
       cdq
327
       idiv	ebx
327
       idiv	ebx
328
 ;      mov      .dx13,eax
328
 ;      mov      .dx13,eax
329
       push	 eax
329
       push	 eax
330
 
330
 
331
if Ext=SSE
331
if Ext=SSE
332
 
332
 
333
       cvtsi2ss  xmm3,ebx
333
       cvtsi2ss  xmm3,ebx
334
  ;     mov       eax,255
334
  ;     mov       eax,255
335
       cvtsi2ss  xmm4,[i255d]
335
       cvtsi2ss  xmm4,[i255d]
336
       divss	 xmm3,xmm4
336
       divss	 xmm3,xmm4
337
       rcpss	 xmm3,xmm3
337
       rcpss	 xmm3,xmm3
338
;       mulss     xmm3,xmm4
338
;       mulss     xmm3,xmm4
339
       shufps	 xmm3,xmm3,0
339
       shufps	 xmm3,xmm3,0
340
       sub	 esp,16
340
       sub	 esp,16
341
 
341
 
342
       movd	 mm0,[.b_x1]
342
       movd	 mm0,[.b_x1]
343
       movd	 mm1,[.b_x3]
343
       movd	 mm1,[.b_x3]
344
       movd	 mm2,[.e_x1]
344
       movd	 mm2,[.e_x1]
345
       movd	 mm3,[.e_x3]
345
       movd	 mm3,[.e_x3]
346
 
346
 
347
       pxor	 mm4,mm4
347
       pxor	 mm4,mm4
348
       punpcklwd mm0,mm4
348
       punpcklwd mm0,mm4
349
       punpcklwd mm1,mm4
349
       punpcklwd mm1,mm4
350
       punpcklwd mm2,mm4
350
       punpcklwd mm2,mm4
351
       punpcklwd mm3,mm4
351
       punpcklwd mm3,mm4
352
 
352
 
353
       cvtpi2ps  xmm0,mm0
353
       cvtpi2ps  xmm0,mm0
354
       movlhps	 xmm0,xmm0
354
       movlhps	 xmm0,xmm0
355
       cvtpi2ps  xmm0,mm2
355
       cvtpi2ps  xmm0,mm2
356
       cvtpi2ps  xmm1,mm1
356
       cvtpi2ps  xmm1,mm1
357
       movlhps	 xmm1,xmm1
357
       movlhps	 xmm1,xmm1
358
       cvtpi2ps  xmm1,mm3
358
       cvtpi2ps  xmm1,mm3
359
       subps	 xmm1,xmm0
359
       subps	 xmm1,xmm0
360
 
360
 
361
   ;    divps     xmm1,xmm3
361
   ;    divps     xmm1,xmm3
362
       mulps	 xmm1,xmm3
362
       mulps	 xmm1,xmm3
363
       shufps	 xmm1,xmm1,10110001b
363
       shufps	 xmm1,xmm1,10110001b
364
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
364
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
365
       movhlps	 xmm1,xmm1
365
       movhlps	 xmm1,xmm1
366
       cvtps2pi  mm1,xmm1
366
       cvtps2pi  mm1,xmm1
367
       movq	 .dey13q,mm0
367
       movq	 .dey13q,mm0
368
       movq	 .dby13q,mm1
368
       movq	 .dby13q,mm1
369
 
369
 
370
else
370
else
371
 
371
 
372
       mov	ax,word[.b_x3]
372
       mov	ax,word[.b_x3]
373
       sub	ax,word[.b_x1]
373
       sub	ax,word[.b_x1]
374
       cwde
374
       cwde
375
       shl	eax,ROUND
375
       shl	eax,ROUND
376
       cdq
376
       cdq
377
       idiv	ebx
377
       idiv	ebx
378
 ;      mov      .dbx13,eax
378
 ;      mov      .dbx13,eax
379
       push	 eax
379
       push	 eax
380
 
380
 
381
       mov	ax,word[.b_y3]
381
       mov	ax,word[.b_y3]
382
       sub	ax,word[.b_y1]
382
       sub	ax,word[.b_y1]
383
       cwde
383
       cwde
384
       shl	eax,ROUND
384
       shl	eax,ROUND
385
       cdq
385
       cdq
386
       idiv	ebx
386
       idiv	ebx
387
 ;      mov      .dby13,eax
387
 ;      mov      .dby13,eax
388
       push	 eax
388
       push	 eax
389
 
389
 
390
       mov	ax,word[.e_x3]
390
       mov	ax,word[.e_x3]
391
       sub	ax,word[.e_x1]
391
       sub	ax,word[.e_x1]
392
       cwde
392
       cwde
393
       shl	eax,ROUND
393
       shl	eax,ROUND
394
       cdq
394
       cdq
395
       idiv	ebx
395
       idiv	ebx
396
 ;      mov      .dex13,eax
396
 ;      mov      .dex13,eax
397
       push	 eax
397
       push	 eax
398
 
398
 
399
       mov	ax,word[.e_y3]
399
       mov	ax,word[.e_y3]
400
       sub	ax,word[.e_y1]
400
       sub	ax,word[.e_y1]
401
       cwde
401
       cwde
402
       shl	eax,ROUND
402
       shl	eax,ROUND
403
       cdq
403
       cdq
404
       idiv	ebx
404
       idiv	ebx
405
 ;      mov      .dey13,eax
405
 ;      mov      .dey13,eax
406
       push	 eax
406
       push	 eax
407
 
407
 
408
end if
408
end if
409
 
409
 
410
       mov     ax,.z3
410
       mov     ax,.z3
411
       sub     ax,.z1
411
       sub     ax,.z1
412
       cwde
412
       cwde
413
       shl     eax,CATMULL_SHIFT
413
       shl     eax,CATMULL_SHIFT
414
       cdq
414
       cdq
415
       idiv    ebx
415
       idiv    ebx
416
  ;    mov    .dz13,eax
416
  ;    mov    .dz13,eax
417
       push    eax
417
       push    eax
418
   .bt_dx13_done:
418
   .bt_dx13_done:
419
 
419
 
420
       mov	bx,.y3	     ; calc delta23
420
       mov	bx,.y3	     ; calc delta23
421
       sub	bx,.y2
421
       sub	bx,.y2
422
       jnz	.bt_dx23_make
422
       jnz	.bt_dx23_make
423
       mov	ecx,6
423
       mov	ecx,6
424
       xor	edx,edx
424
       xor	edx,edx
425
     @@:
425
     @@:
426
       push	edx   ;dword 0
426
       push	edx   ;dword 0
427
       loop	@b
427
       loop	@b
428
       jmp	.bt_dx23_done
428
       jmp	.bt_dx23_done
429
 .bt_dx23_make:
429
 .bt_dx23_make:
430
       mov	ax,.x3
430
       mov	ax,.x3
431
       sub	ax,.x2
431
       sub	ax,.x2
432
       cwde
432
       cwde
433
       movsx	ebx,bx
433
       movsx	ebx,bx
434
       shl	eax,ROUND
434
       shl	eax,ROUND
435
       cdq
435
       cdq
436
       idiv	ebx
436
       idiv	ebx
437
 ;      mov      .dx23,eax
437
 ;      mov      .dx23,eax
438
       push	 eax
438
       push	 eax
439
 
439
 
440
if Ext=SSE
440
if Ext=SSE
441
 
441
 
442
       cvtsi2ss  xmm3,ebx
442
       cvtsi2ss  xmm3,ebx
443
     ;  mov       eax,255
443
     ;  mov       eax,255
444
       cvtsi2ss  xmm4,[i255d] ;eax
444
       cvtsi2ss  xmm4,[i255d] ;eax
445
       divss	 xmm3,xmm4
445
       divss	 xmm3,xmm4
446
       shufps	 xmm3,xmm3,0
446
       shufps	 xmm3,xmm3,0
447
       sub	 esp,16
447
       sub	 esp,16
448
 
448
 
449
       movd	 mm0,[.b_x2]
449
       movd	 mm0,[.b_x2]
450
       movd	 mm1,[.b_x3]
450
       movd	 mm1,[.b_x3]
451
       movd	 mm2,[.e_x2]
451
       movd	 mm2,[.e_x2]
452
       movd	 mm3,[.e_x3]
452
       movd	 mm3,[.e_x3]
453
 
453
 
454
       pxor	 mm4,mm4
454
       pxor	 mm4,mm4
455
       punpcklwd mm0,mm4
455
       punpcklwd mm0,mm4
456
       punpcklwd mm1,mm4
456
       punpcklwd mm1,mm4
457
       punpcklwd mm2,mm4
457
       punpcklwd mm2,mm4
458
       punpcklwd mm3,mm4
458
       punpcklwd mm3,mm4
459
 
459
 
460
       cvtpi2ps  xmm0,mm0
460
       cvtpi2ps  xmm0,mm0
461
       movlhps	 xmm0,xmm0
461
       movlhps	 xmm0,xmm0
462
       cvtpi2ps  xmm0,mm2
462
       cvtpi2ps  xmm0,mm2
463
       cvtpi2ps  xmm1,mm1
463
       cvtpi2ps  xmm1,mm1
464
       movlhps	 xmm1,xmm1
464
       movlhps	 xmm1,xmm1
465
       cvtpi2ps  xmm1,mm3
465
       cvtpi2ps  xmm1,mm3
466
       subps	 xmm1,xmm0
466
       subps	 xmm1,xmm0
467
 
467
 
468
       divps	 xmm1,xmm3
468
       divps	 xmm1,xmm3
469
       shufps	 xmm1,xmm1,10110001b
469
       shufps	 xmm1,xmm1,10110001b
470
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
470
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
471
       movhlps	 xmm1,xmm1
471
       movhlps	 xmm1,xmm1
472
       cvtps2pi  mm1,xmm1
472
       cvtps2pi  mm1,xmm1
473
       movq	 .dey23q,mm0
473
       movq	 .dey23q,mm0
474
       movq	 .dby23q,mm1
474
       movq	 .dby23q,mm1
475
 
475
 
476
else
476
else
477
 
477
 
478
       mov	ax,word[.b_x3]
478
       mov	ax,word[.b_x3]
479
       sub	ax,word[.b_x2]
479
       sub	ax,word[.b_x2]
480
       cwde
480
       cwde
481
       shl	eax,ROUND
481
       shl	eax,ROUND
482
       cdq
482
       cdq
483
       idiv	ebx
483
       idiv	ebx
484
 ;      mov      .dbx23,eax
484
 ;      mov      .dbx23,eax
485
       push	 eax
485
       push	 eax
486
 
486
 
487
       mov	ax,word[.b_y3]
487
       mov	ax,word[.b_y3]
488
       sub	ax,word[.b_y2]
488
       sub	ax,word[.b_y2]
489
       cwde
489
       cwde
490
       shl	eax,ROUND
490
       shl	eax,ROUND
491
       cdq
491
       cdq
492
       idiv	ebx
492
       idiv	ebx
493
 ;      mov      .dby23,eax
493
 ;      mov      .dby23,eax
494
       push	 eax
494
       push	 eax
495
 
495
 
496
       mov	ax,word[.e_x3]
496
       mov	ax,word[.e_x3]
497
       sub	ax,word[.e_x2]
497
       sub	ax,word[.e_x2]
498
       cwde
498
       cwde
499
       shl	eax,ROUND
499
       shl	eax,ROUND
500
       cdq
500
       cdq
501
       idiv	ebx
501
       idiv	ebx
502
 ;      mov      .dex23,eax
502
 ;      mov      .dex23,eax
503
       push	 eax
503
       push	 eax
504
 
504
 
505
       mov	ax,word[.e_y3]
505
       mov	ax,word[.e_y3]
506
       sub	ax,word[.e_y2]
506
       sub	ax,word[.e_y2]
507
       cwde
507
       cwde
508
       shl	eax,ROUND
508
       shl	eax,ROUND
509
       cdq
509
       cdq
510
       idiv	ebx
510
       idiv	ebx
511
 ;      mov      .dey23,eax
511
 ;      mov      .dey23,eax
512
       push	 eax
512
       push	 eax
513
end if
513
end if
514
       mov     ax,.z3
514
       mov     ax,.z3
515
       sub     ax,.z2
515
       sub     ax,.z2
516
       cwde
516
       cwde
517
       shl     eax,CATMULL_SHIFT
517
       shl     eax,CATMULL_SHIFT
518
       cdq
518
       cdq
519
       idiv    ebx
519
       idiv    ebx
520
      ; mov     .dz23,eax
520
      ; mov     .dz23,eax
521
       push    eax
521
       push    eax
522
      ;  sub     esp,40
522
      ;  sub     esp,40
523
   .bt_dx23_done:
523
   .bt_dx23_done:
524
       movsx	eax,.x1
524
       movsx	eax,.x1
525
       shl	eax,ROUND
525
       shl	eax,ROUND
526
     ;  mov      .cx1,eax
526
     ;  mov      .cx1,eax
527
     ;  mov      .cx2,eax
527
     ;  mov      .cx2,eax
528
       push	eax eax
528
       push	eax eax
529
     ; push     eax
529
     ; push     eax
530
 
530
 
531
       movsx	eax,word[.b_x1]
531
       movsx	eax,word[.b_x1]
532
       shl	eax,ROUND
532
       shl	eax,ROUND
533
       mov	.cbx1,eax
533
       mov	.cbx1,eax
534
       mov	.cbx2,eax
534
       mov	.cbx2,eax
535
     ;  push     eax eax
535
     ;  push     eax eax
536
     ; push     eax
536
     ; push     eax
537
 
537
 
538
       movsx	eax,word[.b_y1]
538
       movsx	eax,word[.b_y1]
539
       shl	eax,ROUND
539
       shl	eax,ROUND
540
       mov	.cby1,eax
540
       mov	.cby1,eax
541
       mov	.cby2,eax
541
       mov	.cby2,eax
542
     ;  push     eax eax
542
     ;  push     eax eax
543
     ; push     eax
543
     ; push     eax
544
 
544
 
545
       movsx	eax,word[.e_x1]
545
       movsx	eax,word[.e_x1]
546
       shl	eax,ROUND
546
       shl	eax,ROUND
547
       mov	.cex1,eax
547
       mov	.cex1,eax
548
       mov	.cex2,eax
548
       mov	.cex2,eax
549
      ; push     eax eax
549
      ; push     eax eax
550
      ;push     eax
550
      ;push     eax
551
 
551
 
552
       movsx	eax,word[.e_y1]
552
       movsx	eax,word[.e_y1]
553
       shl	eax,ROUND
553
       shl	eax,ROUND
554
       mov	.cey1,eax
554
       mov	.cey1,eax
555
       mov	.cey2,eax
555
       mov	.cey2,eax
556
       sub	esp,32
556
       sub	esp,32
557
      ; push     eax eax
557
      ; push     eax eax
558
      ;push     eax
558
      ;push     eax
559
 
559
 
560
       movsx	eax,.z1
560
       movsx	eax,.z1
561
       shl	eax,CATMULL_SHIFT
561
       shl	eax,CATMULL_SHIFT
562
      ; mov      .cz1,eax
562
      ; mov      .cz1,eax
563
      ; mov      .cz2,eax
563
      ; mov      .cz2,eax
564
      push     eax eax
564
      push     eax eax
565
      ;push     eax
565
      ;push     eax
566
 
566
 
567
       movsx	ecx,.y1
567
       movsx	ecx,.y1
568
       cmp	cx,.y2
568
       cmp	cx,.y2
569
       jge	.loop12_done
569
       jge	.loop12_done
570
  .loop12:
570
  .loop12:
571
       call	.call_line
571
       call	.call_line
572
 
572
 
573
       mov	eax,.dx13
573
       mov	eax,.dx13
574
       add	.cx1,eax
574
       add	.cx1,eax
575
       mov	ebx,.dx12
575
       mov	ebx,.dx12
576
       add	.cx2,ebx
576
       add	.cx2,ebx
577
if Ext>= SSE2
577
if Ext>= SSE2
578
       movups	xmm0,.cey1
578
       movups	xmm0,.cey1
579
       movups	xmm1,.cey2
579
       movups	xmm1,.cey2
580
       movups	xmm2,.dey12q
580
       movups	xmm2,.dey12q
581
       movups	xmm3,.dey13q
581
       movups	xmm3,.dey13q
582
       paddd	xmm0,xmm3
582
       paddd	xmm0,xmm3
583
       paddd	xmm1,xmm2
583
       paddd	xmm1,xmm2
584
       movups	.cey1,xmm0
584
       movups	.cey1,xmm0
585
       movups	.cey2,xmm1
585
       movups	.cey2,xmm1
586
else if (Ext = MMX) | (Ext=SSE)
586
else if (Ext = MMX) | (Ext=SSE)
587
       movq	mm0,.cby2	; with this optimization object
587
       movq	mm0,.cby2	; with this optimization object
588
       movq	mm1,.cby1	; looks bit annoying
588
       movq	mm1,.cby1	; looks bit annoying
589
       movq	mm2,.cey2
589
       movq	mm2,.cey2
590
       movq	mm3,.cey1
590
       movq	mm3,.cey1
591
       paddd	mm0,.dby12q
591
       paddd	mm0,.dby12q
592
       paddd	mm1,.dby13q
592
       paddd	mm1,.dby13q
593
       paddd	mm2,.dey12q
593
       paddd	mm2,.dey12q
594
       paddd	mm3,.dey13q
594
       paddd	mm3,.dey13q
595
       movq	.cby2,mm0
595
       movq	.cby2,mm0
596
       movq	.cby1,mm1
596
       movq	.cby1,mm1
597
       movq	.cey1,mm3
597
       movq	.cey1,mm3
598
       movq	.cey2,mm2
598
       movq	.cey2,mm2
599
else
599
else
600
       mov	edx,.dbx13
600
       mov	edx,.dbx13
601
       add	.cbx1,edx
601
       add	.cbx1,edx
602
       mov	eax,.dbx12
602
       mov	eax,.dbx12
603
       add	.cbx2,eax
603
       add	.cbx2,eax
604
       mov	ebx,.dby13
604
       mov	ebx,.dby13
605
       add	.cby1,ebx
605
       add	.cby1,ebx
606
       mov	edx,.dby12
606
       mov	edx,.dby12
607
       add	.cby2,edx
607
       add	.cby2,edx
608
 
608
 
609
       mov	eax,.dex13
609
       mov	eax,.dex13
610
       add	.cex1,eax
610
       add	.cex1,eax
611
       mov	ebx,.dex12
611
       mov	ebx,.dex12
612
       add	.cex2,ebx
612
       add	.cex2,ebx
613
       mov	edx,.dey13
613
       mov	edx,.dey13
614
       add	.cey1,edx
614
       add	.cey1,edx
615
       mov	eax,.dey12
615
       mov	eax,.dey12
616
       add	.cey2,eax
616
       add	.cey2,eax
617
 
617
 
618
end if
618
end if
619
       mov	ebx,.dz13
619
       mov	ebx,.dz13
620
       add	.cz1,ebx
620
       add	.cz1,ebx
621
       mov	edx,.dz12
621
       mov	edx,.dz12
622
       add	.cz2,edx
622
       add	.cz2,edx
623
 
623
 
624
       inc	ecx
624
       inc	ecx
625
       cmp	cx,.y2
625
       cmp	cx,.y2
626
       jl	.loop12
626
       jl	.loop12
627
    .loop12_done:
627
    .loop12_done:
628
 
628
 
629
       movsx	ecx,.y2
629
       movsx	ecx,.y2
630
       cmp	cx,.y3
630
       cmp	cx,.y3
631
       jge	.loop23_done
631
       jge	.loop23_done
632
 
632
 
633
       movsx	eax,.z2
633
       movsx	eax,.z2
634
       shl	eax,CATMULL_SHIFT
634
       shl	eax,CATMULL_SHIFT
635
       mov	.cz2,eax
635
       mov	.cz2,eax
636
 
636
 
637
       movsx	eax,.x2
637
       movsx	eax,.x2
638
       shl	eax,ROUND
638
       shl	eax,ROUND
639
       mov	.cx2,eax
639
       mov	.cx2,eax
640
 
640
 
641
       movzx	eax,word[.b_x2]
641
       movzx	eax,word[.b_x2]
642
       shl	eax,ROUND
642
       shl	eax,ROUND
643
       mov	.cbx2,eax
643
       mov	.cbx2,eax
644
 
644
 
645
       movzx	eax,word[.b_y2]
645
       movzx	eax,word[.b_y2]
646
       shl	eax,ROUND
646
       shl	eax,ROUND
647
       mov	.cby2,eax
647
       mov	.cby2,eax
648
 
648
 
649
       movzx	eax,word[.e_x2]
649
       movzx	eax,word[.e_x2]
650
       shl	eax,ROUND
650
       shl	eax,ROUND
651
       mov	.cex2,eax
651
       mov	.cex2,eax
652
 
652
 
653
       movzx	eax,word[.e_y2]
653
       movzx	eax,word[.e_y2]
654
       shl	eax,ROUND
654
       shl	eax,ROUND
655
       mov	.cey2,eax
655
       mov	.cey2,eax
656
 
656
 
657
     .loop23:
657
     .loop23:
658
       call	.call_line
658
       call	.call_line
659
;if Ext = NON
659
;if Ext = NON
660
       mov	eax,.dx13
660
       mov	eax,.dx13
661
       add	.cx1,eax
661
       add	.cx1,eax
662
       mov	ebx,.dx23
662
       mov	ebx,.dx23
663
       add	.cx2,ebx
663
       add	.cx2,ebx
664
if Ext>= SSE2
664
if Ext>= SSE2
665
       movups	xmm0,.cey1
665
       movups	xmm0,.cey1
666
       movups	xmm1,.cey2
666
       movups	xmm1,.cey2
667
       movups	xmm2,.dey23q
667
       movups	xmm2,.dey23q
668
       movups	xmm3,.dey13q
668
       movups	xmm3,.dey13q
669
       paddd	xmm0,xmm3
669
       paddd	xmm0,xmm3
670
       paddd	xmm1,xmm2
670
       paddd	xmm1,xmm2
671
       movups	.cey1,xmm0
671
       movups	.cey1,xmm0
672
       movups	.cey2,xmm1
672
       movups	.cey2,xmm1
673
else if (Ext = MMX) | ( Ext = SSE)
673
else if (Ext = MMX) | ( Ext = SSE)
674
       movq	mm0,.cby2	 ;    with this mmx optimization object looks bit
674
       movq	mm0,.cby2	 ;    with this mmx optimization object looks bit
675
       movq	mm1,.cby1	 ;    annoying
675
       movq	mm1,.cby1	 ;    annoying
676
       movq	mm2,.cey2
676
       movq	mm2,.cey2
677
       movq	mm3,.cey1
677
       movq	mm3,.cey1
678
       paddd	mm0,.dby23q
678
       paddd	mm0,.dby23q
679
       paddd	mm1,.dby13q
679
       paddd	mm1,.dby13q
680
       paddd	mm2,.dey23q
680
       paddd	mm2,.dey23q
681
       paddd	mm3,.dey13q
681
       paddd	mm3,.dey13q
682
       movq	.cby2,mm0
682
       movq	.cby2,mm0
683
       movq	.cby1,mm1
683
       movq	.cby1,mm1
684
       movq	.cey2,mm2
684
       movq	.cey2,mm2
685
       movq	.cey1,mm3
685
       movq	.cey1,mm3
686
 
686
 
687
else
687
else
688
       mov	edx,.dbx13
688
       mov	edx,.dbx13
689
       add	.cbx1,edx
689
       add	.cbx1,edx
690
       mov	eax,.dbx23
690
       mov	eax,.dbx23
691
       add	.cbx2,eax
691
       add	.cbx2,eax
692
       mov	ebx,.dby13
692
       mov	ebx,.dby13
693
       add	.cby1,ebx
693
       add	.cby1,ebx
694
       mov	edx,.dby23
694
       mov	edx,.dby23
695
       add	.cby2,edx
695
       add	.cby2,edx
696
 
696
 
697
       mov	eax,.dex13
697
       mov	eax,.dex13
698
       add	.cex1,eax
698
       add	.cex1,eax
699
       mov	ebx,.dex23
699
       mov	ebx,.dex23
700
       add	.cex2,ebx
700
       add	.cex2,ebx
701
       mov	edx,.dey13
701
       mov	edx,.dey13
702
       add	.cey1,edx
702
       add	.cey1,edx
703
       mov	eax,.dey23
703
       mov	eax,.dey23
704
       add	.cey2,eax
704
       add	.cey2,eax
705
end if
705
end if
706
 
706
 
707
       mov	ebx,.dz13
707
       mov	ebx,.dz13
708
       add	.cz1,ebx
708
       add	.cz1,ebx
709
       mov	edx,.dz23
709
       mov	edx,.dz23
710
       add	.cz2,edx
710
       add	.cz2,edx
711
;else
711
;else
712
;       movq     mm0,.db13q
712
;       movq     mm0,.db13q
713
;       movq     mm1,.cbx1q
713
;       movq     mm1,.cbx1q
714
 
714
 
715
       inc	ecx
715
       inc	ecx
716
       cmp	cx,.y3
716
       cmp	cx,.y3
717
       jl	.loop23
717
       jl	.loop23
718
    .loop23_done:
718
    .loop23_done:
719
 
719
 
720
       mov	esp,ebp
720
       mov	esp,ebp
721
ret   34
721
ret   34
722
 
722
 
723
.call_line:
723
.call_line:
724
 
724
 
725
       pushad
725
       pushad
726
 
726
 
727
       push	.cz1
727
       push	.cz1
728
       push	.cz2
728
       push	.cz2
729
       push	.z_buff
729
       push	.z_buff
730
       push	.t_bmap
730
       push	.t_bmap
731
       push	.t_emap
731
       push	.t_emap
732
       push	dword .cey2
732
       push	dword .cey2
733
       push	.cex2
733
       push	.cex2
734
       push	dword .cey1
734
       push	dword .cey1
735
       push	.cex1
735
       push	.cex1
736
       push	dword .cby2
736
       push	dword .cby2
737
       push	.cbx2
737
       push	.cbx2
738
       push	dword .cby1
738
       push	dword .cby1
739
       push	.cbx1
739
       push	.cbx1
740
       push	ecx
740
       push	ecx
741
 
741
 
742
       mov	eax,.cx1
742
       mov	eax,.cx1
743
       sar	eax,ROUND
743
       sar	eax,ROUND
744
       mov	ebx,.cx2
744
       mov	ebx,.cx2
745
       sar	ebx,ROUND
745
       sar	ebx,ROUND
746
 
746
 
747
       call	two_tex_line_z
747
       call	two_tex_line_z
748
 
748
 
749
       popad
749
       popad
750
ret
750
ret
751
two_tex_line_z:
751
two_tex_line_z:
752
;--------------in: eax - x1
752
;--------------in: eax - x1
753
;--------------    ebx - x2
753
;--------------    ebx - x2
754
;--------------    edi - pointer to screen buffer
754
;--------------    edi - pointer to screen buffer
755
;stack - another parameters :
755
;stack - another parameters :
756
.y	equ dword [ebp+4]
756
.y	equ dword [ebp+4]
757
.bx1	equ  [ebp+8]   ;   ---
757
.bx1	equ  [ebp+8]   ;   ---
758
.by1	equ  [ebp+12]  ;       |
758
.by1	equ  [ebp+12]  ;       |
759
.bx2	equ  [ebp+16]  ;       |
759
.bx2	equ  [ebp+16]  ;       |
760
.by2	equ  [ebp+20]  ;       |>   b. texture and e. texture coords
760
.by2	equ  [ebp+20]  ;       |>   b. texture and e. texture coords
761
.ex1	equ  [ebp+24]  ;       |>   shifted shl ROUND
761
.ex1	equ  [ebp+24]  ;       |>   shifted shl ROUND
762
.ey1	equ  [ebp+28]  ;       |
762
.ey1	equ  [ebp+28]  ;       |
763
.ex2	equ  [ebp+32]  ;       |
763
.ex2	equ  [ebp+32]  ;       |
764
.ey2	equ  [ebp+36]  ;   ---
764
.ey2	equ  [ebp+36]  ;   ---
765
.emap	equ  [ebp+40]  ; b texture offset
765
.emap	equ  [ebp+40]  ; b texture offset
766
.bmap	equ  [ebp+44]  ; e texture offset
766
.bmap	equ  [ebp+44]  ; e texture offset
767
.z_buff equ dword [ebp+48]
767
.z_buff equ dword [ebp+48]
768
.z2	equ dword [ebp+52]  ;   -- |>   z coords shifted
768
.z2	equ dword [ebp+52]  ;   -- |>   z coords shifted
769
.z1	equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
769
.z1	equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
770
 
770
 
771
.x1	equ dword [ebp-4]
771
.x1	equ dword [ebp-4]
772
.x2	equ dword [ebp-8]
772
.x2	equ dword [ebp-8]
773
.dbx	equ [ebp-12]
773
.dbx	equ [ebp-12]
774
.dex	equ [ebp-16]
774
.dex	equ [ebp-16]
775
.dby	equ [ebp-20]
775
.dby	equ [ebp-20]
776
.dey	equ [ebp-24]
776
.dey	equ [ebp-24]
777
.dz	equ dword [ebp-28]
777
.dz	equ dword [ebp-28]
778
.cbx	equ [ebp-32]
778
.cbx	equ [ebp-32]
779
.cex	equ [ebp-36]
779
.cex	equ [ebp-36]
780
.cby	equ [ebp-40]
780
.cby	equ [ebp-40]
781
.cey	equ [ebp-44]
781
.cey	equ [ebp-44]
782
.cz	equ dword [ebp-48]
782
.cz	equ dword [ebp-48]
783
.czbuff equ dword [ebp-52]
783
.czbuff equ dword [ebp-52]
784
 
784
 
785
	mov	ebp,esp
785
	mov	ebp,esp
786
 
786
 
787
	mov	ecx,.y
787
	mov	ecx,.y
788
	or	ecx,ecx
788
	or	ecx,ecx
789
	jl	.bl_end
789
	jl	.bl_end
790
	cmp	cx,word[size_y_var]  ;SIZE_Y
790
	mov	dx,word[size_y_var]
-
 
791
	dec	dx
-
 
792
	cmp	cx,dx	;word[size_y_var]  ;SIZE_Y
791
	jge	.bl_end
793
	jge	.bl_end
792
 
794
 
793
	cmp	eax,ebx
795
	cmp	eax,ebx
794
	jl	@f
796
	jl	@f
795
	je	.bl_end
797
	je	.bl_end
796
 
798
 
797
	xchg	eax,ebx
799
	xchg	eax,ebx
798
if Ext=NON
800
if Ext=NON
799
	mov	edx,.bx1
801
	mov	edx,.bx1
800
	xchg	edx,.bx2
802
	xchg	edx,.bx2
801
	mov	.bx1,edx
803
	mov	.bx1,edx
802
	mov	edx,.by1
804
	mov	edx,.by1
803
	xchg	edx,.by2
805
	xchg	edx,.by2
804
	mov	.by1,edx
806
	mov	.by1,edx
805
 
807
 
806
	mov	edx,.ex1
808
	mov	edx,.ex1
807
	xchg	edx,.ex2
809
	xchg	edx,.ex2
808
	mov	.ex1,edx
810
	mov	.ex1,edx
809
	mov	edx,.ey1
811
	mov	edx,.ey1
810
	xchg	edx,.ey2
812
	xchg	edx,.ey2
811
	mov	.ey1,edx
813
	mov	.ey1,edx
812
else
814
else
813
	movq	mm0,.bx1
815
	movq	mm0,.bx1
814
	movq	mm1,.ex1
816
	movq	mm1,.ex1
815
	movq	mm2,.bx2
817
	movq	mm2,.bx2
816
	movq	mm3,.ex2
818
	movq	mm3,.ex2
817
	movq	.bx2,mm0
819
	movq	.bx2,mm0
818
	movq	.ex2,mm1
820
	movq	.ex2,mm1
819
	movq	.bx1,mm2
821
	movq	.bx1,mm2
820
	movq	.ex1,mm3
822
	movq	.ex1,mm3
821
end if
823
end if
822
	mov	edx,.z1
824
	mov	edx,.z1
823
	xchg	edx,.z2
825
	xchg	edx,.z2
824
	mov	.z1,edx
826
	mov	.z1,edx
825
    @@:
827
    @@:
826
	push	eax ebx    ;store x1, x2
828
	push	eax ebx    ;store x1, x2
827
	mov	ebx,.x1
829
	mov	ebx,.x1
828
	movzx	edx,word[size_x_var]
830
	movzx	edx,word[size_x_var]
829
	cmp	ebx,edx
831
	dec	edx
-
 
832
	cmp	ebx,edx
830
  ;      cmp     bx,word[size_x_var]  ;SIZE_X
833
  ;      cmp     bx,word[size_x_var]  ;SIZE_X
831
	jg	.bl_end
834
	jg	.bl_end
832
	cmp	.x2,0
835
	cmp	.x2,0
833
	jle	.bl_end
836
	jle	.bl_end
834
 
837
 
835
	mov	ebx,.x2
838
	mov	ebx,.x2
836
	sub	ebx,.x1
839
	sub	ebx,.x1
837
 
840
 
838
if Ext>=SSE
841
if  Ext >= SSE
839
 
842
 
840
       sub	 esp,16
843
       sub	 esp,16
841
       cvtsi2ss  xmm3,ebx	     ;rcps
844
       cvtsi2ss  xmm3,ebx	     ;rcps
842
       shufps	 xmm3,xmm3,0
845
       shufps	 xmm3,xmm3,0
843
 
846
 
844
  ;     movq      mm0,.bx1q
847
  ;     movq      mm0,.bx1q
845
  ;     movq      mm1,.bx2q
848
  ;     movq      mm1,.bx2q
846
  ;     movq      mm2,.ex1q
849
  ;     movq      mm2,.ex1q
847
  ;     movq      mm3,.ex2q
850
  ;     movq      mm3,.ex2q
848
  ;     psubd     mm1,mm0
851
  ;     psubd     mm1,mm0
849
  ;     psubd     mm3,mm2
852
  ;     psubd     mm3,mm2
850
  ;     cvtpi2ps  xmm1,mm1
853
  ;     cvtpi2ps  xmm1,mm1
851
  ;     movlhps   xmm1,xmm1
854
  ;     movlhps   xmm1,xmm1
852
  ;     cvtpi2ps  xmm1,mm3
855
  ;     cvtpi2ps  xmm1,mm3
853
 
856
 
854
       cvtpi2ps  xmm0,.bx1 ;mm0     ; bx1; by1
857
       cvtpi2ps  xmm0,.bx1 ;mm0     ; bx1; by1
855
       movlhps	 xmm0,xmm0
858
       movlhps	 xmm0,xmm0
856
       cvtpi2ps  xmm0,.ex1 ;mm2     ; ex1; ey1
859
       cvtpi2ps  xmm0,.ex1 ;mm2     ; ex1; ey1
857
       cvtpi2ps  xmm1,.bx2 ;mm1     ; bx2; by2
860
       cvtpi2ps  xmm1,.bx2 ;mm1     ; bx2; by2
858
       movlhps	 xmm1,xmm1
861
       movlhps	 xmm1,xmm1
859
       cvtpi2ps  xmm1,.ex2 ;mm3     ; ex2; ey2
862
       cvtpi2ps  xmm1,.ex2 ;mm3     ; ex2; ey2
860
       subps	 xmm1,xmm0
863
       subps	 xmm1,xmm0
861
				    ; hi             lo
864
				    ; hi             lo
862
       divps	 xmm1,xmm3 ; xmm1 -> dby; dbx; dey; dex
865
       divps	 xmm1,xmm3 ; xmm1 -> dby; dbx; dey; dex
863
 
866
 
864
       shufps	 xmm1,xmm1,11011000b
867
       shufps	 xmm1,xmm1,11011000b
865
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
868
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
866
       movhlps	 xmm1,xmm1
869
       movhlps	 xmm1,xmm1
867
       cvtps2pi  mm1,xmm1
870
       cvtps2pi  mm1,xmm1
868
       movq	 .dex,mm0 ; hi - lo  ->  dbx, dex
871
       movq	 .dex,mm0 ; hi - lo  ->  dbx, dex
869
       movq	 .dey,mm1 ; hi - lo  ->  dby, dey
872
       movq	 .dey,mm1 ; hi - lo  ->  dby, dey
870
 
873
 
871
else
874
else
872
 
875
 
873
	mov	eax,.bx2       ; calc .dbx
876
	mov	eax,.bx2       ; calc .dbx
874
	sub	eax,.bx1
877
	sub	eax,.bx1
875
	cdq
878
	cdq
876
	idiv	ebx
879
	idiv	ebx
877
	push	eax
880
	push	eax
878
 
881
 
879
	mov	eax,.ex2       ; calc .dby
882
	mov	eax,.ex2       ; calc .dby
880
	sub	eax,.ex1
883
	sub	eax,.ex1
881
	cdq
884
	cdq
882
	idiv	ebx
885
	idiv	ebx
883
	push	eax
886
	push	eax
884
 
887
 
885
	mov	eax,.by2       ; calc .dex
888
	mov	eax,.by2       ; calc .dex
886
	sub	eax,.by1
889
	sub	eax,.by1
887
	cdq
890
	cdq
888
	idiv	ebx
891
	idiv	ebx
889
	push	eax
892
	push	eax
890
 
893
 
891
	mov	eax,.ey2       ; calc .dey
894
	mov	eax,.ey2       ; calc .dey
892
	sub	eax,.ey1
895
	sub	eax,.ey1
893
	cdq
896
	cdq
894
	idiv	ebx
897
	idiv	ebx
895
	push	eax
898
	push	eax
896
 
899
 
897
end if
900
end if
898
 
901
 
899
	mov	eax,.z2        ; calc .dz
902
	mov	eax,.z2        ; calc .dz
900
	sub	eax,.z1
903
	sub	eax,.z1
901
	cdq
904
	cdq
902
	idiv	ebx
905
	idiv	ebx
903
	push	eax
906
	push	eax
904
 
907
 
905
	cmp	.x1,0	      ; set correctly begin variable
908
	cmp	.x1,0	      ; set correctly begin variable
906
	jge	@f	      ; CLIPPING ON FUNCTION
909
	jge	@f	      ; CLIPPING ON FUNCTION
907
			      ; cutting triangle exceedes screen
910
			      ; cutting triangle exceedes screen
908
	mov	ebx,.x1
911
	mov	ebx,.x1
909
	neg	ebx
912
	neg	ebx
910
	imul	ebx	      ; eax = .dz * abs(.x1)
913
	imul	ebx	      ; eax = .dz * abs(.x1)
911
	add	.z1,eax
914
	add	.z1,eax
912
	mov	.x1,0
915
	mov	.x1,0
913
 
916
 
914
	mov	eax,.dbx
917
	mov	eax,.dbx
915
	imul	ebx
918
	imul	ebx
916
	add    .bx1,eax
919
	add    .bx1,eax
917
 
920
 
918
	mov	eax,.dby
921
	mov	eax,.dby
919
	imul	ebx
922
	imul	ebx
920
	add	.by1,eax
923
	add	.by1,eax
921
 
924
 
922
	mov	eax,.dex
925
	mov	eax,.dex
923
	imul	ebx
926
	imul	ebx
924
	add	.ex1,eax
927
	add	.ex1,eax
925
 
928
 
926
	mov	eax,.dey
929
	mov	eax,.dey
927
	imul	ebx
930
	imul	ebx
928
	add	.ey1,eax
931
	add	.ey1,eax
929
      @@:
932
      @@:
930
	movzx	eax,word[size_x_var] ;SIZE_X  ;word[size_x_var]
933
	movzx	eax,word[size_x_var] ;SIZE_X  ;word[size_x_var]
931
	mov	ebx,.x2
934
	mov	ebx,.x2
932
	cmp	eax,ebx
935
	cmp	eax,ebx
933
	jg	@f
936
	jg	@f
934
	mov	.x2,eax
937
	mov	.x2,eax
935
      @@:
938
      @@:
936
      ;  movd    mm0,eax
939
      ;  movd    mm0,eax
937
      ;  movd    mm1,.x2
940
      ;  movd    mm1,.x2
938
      ;  pminsw  mm0,mm1
941
      ;  pminsw  mm0,mm1
939
      ;  movd    .x2,mm0
942
      ;  movd    .x2,mm0
940
 ;       cmp     .x2,SIZE_X  ;eax   |
943
 ;       cmp     .x2,SIZE_X  ;eax   |
941
 ;       jl      @f                 |>       this dont work idk cause
944
 ;       jl      @f                 |>       this dont work idk cause
942
 ;       mov     .x2,SIZE_X ;eax    |
945
 ;       mov     .x2,SIZE_X ;eax    |
943
      @@:
946
      @@:
944
      ;  movzx   eax,word[size_x_var]       ;calc memory begin in buffers
947
      ;  movzx   eax,word[size_x_var]       ;calc memory begin in buffers
945
	mov	ebx,.y
948
	mov	ebx,.y
946
	mul	ebx
949
	mul	ebx
947
	mov	ebx,.x1
950
	mov	ebx,.x1
948
	add	eax,ebx
951
	add	eax,ebx
949
	mov	ebx,eax
952
	mov	ebx,eax
950
	lea	eax,[eax*3]
953
	lea	eax,[eax*3]
951
	add	edi,eax 	  ; edi - screen
954
	add	edi,eax 	  ; edi - screen
952
	mov	esi,.z_buff	  ; z-buffer filled with dd variables
955
	mov	esi,.z_buff	  ; z-buffer filled with dd variables
953
	shl	ebx,2
956
	shl	ebx,2
954
	add	esi,ebx 	  ; esi - Z buffer
957
	add	esi,ebx 	  ; esi - Z buffer
955
 
958
 
956
	mov	ecx,.x2
959
	mov	ecx,.x2
957
	sub	ecx,.x1
960
	sub	ecx,.x1
958
	; init current variables
961
	; init current variables
959
	push	dword .bx1 ;.by1 .ex1 .ey1 .z1 esi
962
	push	dword .bx1 ;.by1 .ex1 .ey1 .z1 esi
960
	push	dword .ex1
963
	push	dword .ex1
961
	push	dword .by1
964
	push	dword .by1
962
	push	dword .ey1
965
	push	dword .ey1
963
 
966
 
964
	push	.z1		 ; current z shl CATMULL_SHIFT
967
	push	.z1		 ; current z shl CATMULL_SHIFT
965
	push	esi
968
	push	esi
966
 
969
 
967
if Ext >= MMX
970
if Ext >= MMX
968
     pxor   mm0,mm0
971
     pxor   mm0,mm0
969
     movq   mm3,.cex   ; hi - lo -> cbx; cex
972
     movq   mm3,.cex   ; hi - lo -> cbx; cex
970
     movq   mm4,.cey   ; hi - lo -> cby; cey
973
     movq   mm4,.cey   ; hi - lo -> cby; cey
971
;     movq   mm5,mm3
974
;     movq   mm5,mm3
972
;     movq   mm6,mm4
975
;     movq   mm6,mm4
973
;     psrad  mm5,ROUND
976
;     psrad  mm5,ROUND
974
;     psrad  mm6,ROUND
977
;     psrad  mm6,ROUND
975
;     movq   .ceyq,mm5
978
;     movq   .ceyq,mm5
976
;     movq   .cbyq,mm6
979
;     movq   .cbyq,mm6
977
     mov    edx,.czbuff
980
     mov    edx,.czbuff
978
else
981
else
979
     cld
982
     cld
980
end if
983
end if
981
     .draw:
984
     .draw:
982
    ; if TEX = SHIFTING   ;bump drawing only in shifting mode
985
    ; if TEX = SHIFTING   ;bump drawing only in shifting mode
983
if Ext=NON
986
if Ext=NON
984
	mov	esi,.czbuff	 ; .czbuff current address in buffer
987
	mov	esi,.czbuff	 ; .czbuff current address in buffer
985
	mov	ebx,.cz 	 ; .cz - cur z position
988
	mov	ebx,.cz 	 ; .cz - cur z position
986
	cmp	ebx,dword[esi]
989
	cmp	ebx,dword[esi]
987
else
990
else
988
	mov	ebx,.cz
991
	mov	ebx,.cz
989
	cmp	ebx,dword[edx]
992
	cmp	ebx,dword[edx]
990
end if
993
end if
991
	jge	.skip
994
	jge	.skip
992
 
995
 
993
if Ext=NON
996
if Ext=NON
994
	mov	eax,.cby
997
	mov	eax,.cby
995
	mov	esi,.cbx
998
	mov	esi,.cbx
996
	sar	eax,ROUND
999
	sar	eax,ROUND
997
	sar	esi,ROUND
1000
	sar	esi,ROUND
998
	shl	eax,TEX_SHIFT	;-
1001
	shl	eax,TEX_SHIFT	;-
999
	add	esi,eax
1002
	add	esi,eax
1000
	lea	esi,[esi*3]	    ;-  ; esi - current b. texture addres
1003
	lea	esi,[esi*3]	    ;-  ; esi - current b. texture addres
1001
	add	esi,.bmap
1004
	add	esi,.bmap
1002
 
1005
 
1003
	mov	ebx,.cex       ;.cex - current env map X
1006
	mov	ebx,.cex       ;.cex - current env map X
1004
	mov	eax,.cey       ;.cey - current  env map y
1007
	mov	eax,.cey       ;.cey - current  env map y
1005
	sar	ebx,ROUND
1008
	sar	ebx,ROUND
1006
	sar	eax,ROUND
1009
	sar	eax,ROUND
1007
 
1010
 
1008
	shl	eax,TEX_SHIFT
1011
	shl	eax,TEX_SHIFT
1009
	add	ebx,eax
1012
	add	ebx,eax
1010
	lea	ebx,[ebx*3]
1013
	lea	ebx,[ebx*3]
1011
	add	ebx,.emap
1014
	add	ebx,.emap
1012
 
1015
 
1013
 
1016
 
1014
else
1017
else
1015
	movq	mm5,mm4 ;.cey
1018
	movq	mm5,mm4 ;.cey
1016
	psrad	mm5,ROUND
1019
	psrad	mm5,ROUND
1017
	pslld	mm5,TEX_SHIFT
1020
	pslld	mm5,TEX_SHIFT
1018
	movq	mm6,mm3 ;.cex
1021
	movq	mm6,mm3 ;.cex
1019
	psrad	mm6,ROUND
1022
	psrad	mm6,ROUND
1020
	paddd	mm5,mm6
1023
	paddd	mm5,mm6
1021
	movq	mm6,mm5
1024
	movq	mm6,mm5
1022
	paddd	mm5,mm5
1025
	paddd	mm5,mm5
1023
	paddd	mm5,mm6
1026
	paddd	mm5,mm6
1024
	paddd	mm5,.emap
1027
	paddd	mm5,.emap
1025
	movd	esi,mm5
1028
	movd	esi,mm5
1026
	psrlq	mm5,32
1029
	psrlq	mm5,32
1027
	movd	ebx,mm5
1030
	movd	ebx,mm5
1028
end if
1031
end if
1029
if Ext>=MMX
1032
if Ext>=MMX
1030
	movd	  mm1,[esi]
1033
	movd	  mm1,[esi]
1031
	movd	  mm2,[ebx]
1034
	movd	  mm2,[ebx]
1032
	punpcklbw mm1,mm0
1035
	punpcklbw mm1,mm0
1033
	punpcklbw mm2,mm0
1036
	punpcklbw mm2,mm0
1034
	pmullw	  mm1,mm2
1037
	pmullw	  mm1,mm2
1035
	psrlw	  mm1,8
1038
	psrlw	  mm1,8
1036
	packuswb  mm1,mm0
1039
	packuswb  mm1,mm0
1037
	movd	  [edi],mm1
1040
	movd	  [edi],mm1
1038
	mov	  ebx,.cz
1041
	mov	  ebx,.cz
1039
	mov	  dword[edx],ebx
1042
	mov	  dword[edx],ebx
1040
else
1043
else
1041
	cld			; esi - tex e.
1044
	cld			; esi - tex e.
1042
	lodsb			; ebx - tex b.
1045
	lodsb			; ebx - tex b.
1043
	mov	dl,[ebx]
1046
	mov	dl,[ebx]
1044
	mul	dl
1047
	mul	dl
1045
	shr	ax,8
1048
	shr	ax,8
1046
	stosb
1049
	stosb
1047
	inc	ebx
1050
	inc	ebx
1048
	lodsb
1051
	lodsb
1049
	mov	dl,[ebx]
1052
	mov	dl,[ebx]
1050
	mul	dl
1053
	mul	dl
1051
	shr	ax,8
1054
	shr	ax,8
1052
	stosb
1055
	stosb
1053
	inc	ebx
1056
	inc	ebx
1054
	lodsb
1057
	lodsb
1055
	mov	dl,[ebx]
1058
	mov	dl,[ebx]
1056
	mul	dl
1059
	mul	dl
1057
	shr	ax,8
1060
	shr	ax,8
1058
	stosb
1061
	stosb
1059
	mov	ebx,.cz
1062
	mov	ebx,.cz
1060
	mov	esi,.czbuff
1063
	mov	esi,.czbuff
1061
	mov	dword[esi],ebx
1064
	mov	dword[esi],ebx
1062
	jmp	.no_skip
1065
	jmp	.no_skip
1063
end if
1066
end if
1064
     .skip:
1067
     .skip:
1065
	add	edi,3
1068
	add	edi,3
1066
 
1069
 
1067
   if Ext = NON
1070
   if Ext = NON
1068
     .no_skip:
1071
     .no_skip:
1069
	add	.czbuff,4
1072
	add	.czbuff,4
1070
	mov	eax,.dbx
1073
	mov	eax,.dbx
1071
	add	.cbx,eax
1074
	add	.cbx,eax
1072
	mov	eax,.dby
1075
	mov	eax,.dby
1073
	add	.cby,eax
1076
	add	.cby,eax
1074
	mov	eax,.dex
1077
	mov	eax,.dex
1075
	add	.cex,eax
1078
	add	.cex,eax
1076
	mov	eax,.dey
1079
	mov	eax,.dey
1077
	add	.cey,eax
1080
	add	.cey,eax
1078
    else
1081
    else
1079
	add	edx,4
1082
	add	edx,4
1080
	paddd	mm3,.dex
1083
	paddd	mm3,.dex
1081
	paddd	mm4,.dey
1084
	paddd	mm4,.dey
1082
  ;      movq    mm5,mm3
1085
  ;      movq    mm5,mm3
1083
  ;      movq    mm6,mm4
1086
  ;      movq    mm6,mm4
1084
  ;      psrad   mm5,ROUND
1087
  ;      psrad   mm5,ROUND
1085
  ;      psrad   mm6,ROUND
1088
  ;      psrad   mm6,ROUND
1086
     ;   movq    .cex,mm3
1089
     ;   movq    .cex,mm3
1087
     ;   movq    .cey,mm4
1090
     ;   movq    .cey,mm4
1088
    end if
1091
    end if
1089
	mov	eax,.dz
1092
	mov	eax,.dz
1090
	add	.cz,eax
1093
	add	.cz,eax
1091
    if Ext = NON
1094
    if Ext = NON
1092
	dec	ecx
1095
	dec	ecx
1093
	jnz	.draw
1096
	jnz	.draw
1094
    else
1097
    else
1095
	loop	.draw
1098
	loop	.draw
1096
    end if
1099
    end if
1097
 
1100
 
1098
  .bl_end:
1101
  .bl_end:
1099
	mov	esp,ebp
1102
	mov	esp,ebp
1100
ret 56
1103
ret 56