Subversion Repositories Kolibri OS

Rev

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

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