Subversion Repositories Kolibri OS

Rev

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

Rev 2881 Rev 6619
1
CATMULL_SHIFT equ 16
1
CATMULL_SHIFT equ 16
2
 
2
 
3
 
3
 
4
flat_triangle_z:
4
flat_triangle_z:
5
;  procedure drawing triangle with Z cordinate interpolation ------
5
;  procedure drawing triangle with Z cordinate interpolation ------
6
;  (Catmull  alghoritm)--------------------------------------------
6
;  (Catmull  alghoritm)--------------------------------------------
7
;  ----------------in - eax - x1 shl 16 + y1 ----------------------
7
;  ----------------in - eax - x1 shl 16 + y1 ----------------------
8
;  -------------------- ebx - x2 shl 16 + y2 ----------------------
8
;  -------------------- ebx - x2 shl 16 + y2 ----------------------
9
;  -------------------- ecx - x3 shl 16 + y3 ----------------------
9
;  -------------------- ecx - x3 shl 16 + y3 ----------------------
10
;  -------------------- edx - color 0x00RRGGBB --------------------
10
;  -------------------- edx - color 0x00RRGGBB --------------------
11
;  -------------------- esi - pointer to Z-buffer -----------------
11
;  -------------------- esi - pointer to Z-buffer -----------------
12
;  -------------------- edi - pointer to screen buffer-------------
12
;  -------------------- edi - pointer to screen buffer-------------
13
;  -------------------- stack : z coordinates
13
;  -------------------- stack : z coordinates
14
;  -------------------- Z-buffer : each z variable as dword
14
;  -------------------- Z-buffer : each z variable as dword
15
;  -------------------- (Z coor. as word) shl CATMULL_SHIFT
15
;  -------------------- (Z coor. as word) shl CATMULL_SHIFT
16
.z1	equ word[ebp+4]
16
.z1	equ word[ebp+4]
17
.z2	equ word[ebp+6]    ; each z coordinate as word integer
17
.z2	equ word[ebp+6]    ; each z coordinate as word integer
18
.z3	equ word[ebp+8]
18
.z3	equ word[ebp+8]
19
 
19
 
20
.col	equ dword[ebp-4]
20
.col	equ dword[ebp-4]
21
.x1	equ word[ebp-6]
21
.x1	equ word[ebp-6]
22
.y1	equ word[ebp-8]
22
.y1	equ word[ebp-8]
23
.x2	equ word[ebp-10]
23
.x2	equ word[ebp-10]
24
.y2	equ word[ebp-12]
24
.y2	equ word[ebp-12]
25
.x3	equ word[ebp-14]
25
.x3	equ word[ebp-14]
26
.y3	equ word[ebp-16]
26
.y3	equ word[ebp-16]
27
 
27
 
28
.dx12	equ dword[ebp-20]
28
.dx12	equ dword[ebp-20]
29
;.dz12   equ dword[ebp-24]
29
;.dz12   equ dword[ebp-24]
30
.dx13	equ dword[ebp-24]
30
.dx13	equ dword[ebp-24]
31
.dz13	equ dword[ebp-28]
31
.dz13	equ dword[ebp-28]
32
.dz12	equ dword[ebp-32]
32
.dz12	equ dword[ebp-32]
33
;.dz13   equ dword[ebp-32]
33
;.dz13   equ dword[ebp-32]
34
.dx23	equ dword[ebp-36]
34
.dx23	equ dword[ebp-36]
35
.dz13M	equ	 [ebp-40]
35
.dz13M	equ	 [ebp-40]
36
.dz23	equ dword[ebp-44]
36
.dz23	equ dword[ebp-44]
37
.zz1	equ dword[ebp-48]
37
.zz1	equ dword[ebp-48]
38
.zz2	equ dword[ebp-52]
38
.zz2	equ dword[ebp-52]
39
.zz2M	equ qword[ebp-52]
39
.zz2M	equ qword[ebp-52]
40
.dz12M	equ qword[ebp-32]
40
.dz12M	equ qword[ebp-32]
41
.dz23M	equ qword[ebp-44]
41
.dz23M	equ qword[ebp-44]
42
;if Ext>=MMX
42
;if Ext>=MMX
43
;        emms
43
;        emms
44
;end if
44
;end if
45
	mov	ebp,esp
45
	mov	ebp,esp
46
 
46
 
47
	push	edx	       ; store edx in variable .col
47
	push	edx	       ; store edx in variable .col
48
      .sort2:
48
      .sort2:
49
	cmp	ax,bx
49
	cmp	ax,bx
50
	jle	.sort1
50
	jle	.sort1
51
	xchg	eax,ebx
51
	xchg	eax,ebx
52
	mov	dx,.z1
52
	mov	dx,.z1
53
	xchg	dx,.z2
53
	xchg	dx,.z2
54
	mov	.z1,dx
54
	mov	.z1,dx
55
      .sort1:
55
      .sort1:
56
	cmp	bx,cx
56
	cmp	bx,cx
57
	jle	.sort3
57
	jle	.sort3
58
	xchg	ebx,ecx
58
	xchg	ebx,ecx
59
	mov	dx,.z2
59
	mov	dx,.z2
60
	xchg	dx,.z3
60
	xchg	dx,.z3
61
	mov	.z2,dx
61
	mov	.z2,dx
62
	jmp	.sort2
62
	jmp	.sort2
63
      .sort3:
63
      .sort3:
64
	push	eax	       ; store triangle coordinates in user friendly variables
64
	push	eax	       ; store triangle coordinates in user friendly variables
65
	push	ebx
65
	push	ebx
66
	push	ecx
66
	push	ecx
67
	 mov	  edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
67
	 mov	  edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
68
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
68
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
69
	 and	  edx,ecx
69
	 and	  edx,ecx
70
	 and	  edx,eax
70
	 and	  edx,eax
71
	 test	  edx,80008000h  ; Check both X&Y at once
71
	 test	  edx,80008000h  ; Check both X&Y at once
72
	 jne	  .ft_loop2_end
72
	 jne	  .ft_loop2_end
73
       ;  cmp      ax,SIZE_Y
73
       ;  cmp      ax,SIZE_Y
74
       ;  jle      @f
74
       ;  jle      @f
75
       ;  cmp      bx,SIZE_Y
75
       ;  cmp      bx,SIZE_Y
76
       ;  jle      @f
76
       ;  jle      @f
77
       ;  cmp      cx,SIZE_Y
77
       ;  cmp      cx,SIZE_Y
78
       ;  jge      @f
78
       ;  jge      @f
79
       ;  ror      eax,16
79
       ;  ror      eax,16
80
       ;  ror      ebx,16
80
       ;  ror      ebx,16
81
       ;  ror      ecx,16
81
       ;  ror      ecx,16
82
       ;  cmp      ax,SIZE_X
82
       ;  cmp      ax,SIZE_X
83
       ;  jle      @f
83
       ;  jle      @f
84
       ;  cmp      bx,SIZE_X
84
       ;  cmp      bx,SIZE_X
85
       ;  jle      @f
85
       ;  jle      @f
86
       ;  cmp      cx,SIZE_X
86
       ;  cmp      cx,SIZE_X
87
       ;  jle      @f
87
       ;  jle      @f
88
       ;  jmp      .ft_loop2_end
88
       ;  jmp      .ft_loop2_end
89
       ;@@:
89
       ;@@:
90
	sub	esp,52-12
90
	sub	esp,52-12
91
 
91
 
92
	mov	bx,.y2	     ; calc delta 12
92
	mov	bx,.y2	     ; calc delta 12
93
	sub	bx,.y1
93
	sub	bx,.y1
94
	jnz	.ft_dx12_make
94
	jnz	.ft_dx12_make
95
	mov	.dx12,0
95
	mov	.dx12,0
96
	mov	.dz12,0
96
	mov	.dz12,0
97
	jmp	.ft_dx12_done
97
	jmp	.ft_dx12_done
98
   .ft_dx12_make:
98
   .ft_dx12_make:
99
	mov	ax,.x2
99
	mov	ax,.x2
100
	sub	ax,.x1
100
	sub	ax,.x1
101
	cwde
101
	cwde
102
	movsx	ebx,bx
102
	movsx	ebx,bx
103
	shl	eax,ROUND
103
	shl	eax,ROUND
104
	cdq
104
	cdq
105
	idiv	ebx
105
	idiv	ebx
106
	mov	.dx12,eax
106
	mov	.dx12,eax
107
 
107
 
108
	mov	ax,.z2
108
	mov	ax,.z2
109
	sub	ax,.z1
109
	sub	ax,.z1
110
	cwde
110
	cwde
111
	shl	eax,CATMULL_SHIFT
111
	shl	eax,CATMULL_SHIFT
112
	cdq
112
	cdq
113
	idiv	ebx
113
	idiv	ebx
114
	mov	.dz12,eax
114
	mov	.dz12,eax
115
  .ft_dx12_done:
115
  .ft_dx12_done:
116
	mov	bx,.y3	     ; calc delta 13
116
	mov	bx,.y3	     ; calc delta 13
117
	sub	bx,.y1
117
	sub	bx,.y1
118
	jnz	.ft_dx13_make
118
	jnz	.ft_dx13_make
119
	mov	.dx13,0
119
	mov	.dx13,0
120
	mov	.dz13,0
120
	mov	.dz13,0
121
	mov	dword .dz13M,0
121
	mov	dword .dz13M,0
122
	jmp	.ft_dx13_done
122
	jmp	.ft_dx13_done
123
   .ft_dx13_make:
123
   .ft_dx13_make:
124
	mov	ax,.x3
124
	mov	ax,.x3
125
	sub	ax,.x1
125
	sub	ax,.x1
126
	cwde
126
	cwde
127
	movsx	ebx,bx
127
	movsx	ebx,bx
128
	shl	eax,ROUND
128
	shl	eax,ROUND
129
	cdq
129
	cdq
130
	idiv	ebx
130
	idiv	ebx
131
	mov	.dx13,eax
131
	mov	.dx13,eax
132
 
132
 
133
	mov	ax,.z3
133
	mov	ax,.z3
134
	sub	ax,.z1
134
	sub	ax,.z1
135
	cwde
135
	cwde
136
	shl	eax,CATMULL_SHIFT
136
	shl	eax,CATMULL_SHIFT
137
	cdq
137
	cdq
138
	idiv	ebx
138
	idiv	ebx
139
	mov	.dz13,eax
139
	mov	.dz13,eax
140
	mov	dword .dz13M,eax
140
	mov	dword .dz13M,eax
141
    .ft_dx13_done:
141
    .ft_dx13_done:
142
	mov	bx,.y3	     ; calc delta 23
142
	mov	bx,.y3	     ; calc delta 23
143
	sub	bx,.y2
143
	sub	bx,.y2
144
	jnz	.gt_dx23_make
144
	jnz	.gt_dx23_make
145
	mov	.dx23,0
145
	mov	.dx23,0
146
	mov	.dz23,0
146
	mov	.dz23,0
147
	jmp	.gt_dx23_done
147
	jmp	.gt_dx23_done
148
   .gt_dx23_make:
148
   .gt_dx23_make:
149
	mov	ax,.x3
149
	mov	ax,.x3
150
	sub	ax,.x2
150
	sub	ax,.x2
151
	cwde
151
	cwde
152
	movsx	ebx,bx
152
	movsx	ebx,bx
153
	shl	eax,ROUND
153
	shl	eax,ROUND
154
	cdq
154
	cdq
155
	idiv	ebx
155
	idiv	ebx
156
	mov	.dx23,eax
156
	mov	.dx23,eax
157
 
157
 
158
	mov	ax,.z3
158
	mov	ax,.z3
159
	sub	ax,.z2
159
	sub	ax,.z2
160
	cwde
160
	cwde
161
	shl	eax,CATMULL_SHIFT
161
	shl	eax,CATMULL_SHIFT
162
	cdq
162
	cdq
163
	idiv	ebx
163
	idiv	ebx
164
	mov	.dz23,eax
164
	mov	.dz23,eax
165
    .gt_dx23_done:
165
    .gt_dx23_done:
166
 
166
 
167
	movsx	edx,.z1
167
	movsx	edx,.z1
168
	shl	edx,CATMULL_SHIFT
168
	shl	edx,CATMULL_SHIFT
169
	mov	.zz1,edx
169
	mov	.zz1,edx
170
	mov	.zz2,edx
170
	mov	.zz2,edx
171
	movsx	eax,.x1
171
	movsx	eax,.x1
172
	shl	eax,ROUND    ; eax - x1
172
	shl	eax,ROUND    ; eax - x1
173
	mov	ebx,eax      ; ebx - x2
173
	mov	ebx,eax      ; ebx - x2
174
;if Ext>=MMX
174
;if Ext>=MMX
175
;        movq    mm0,.zz2M
175
;        movq    mm0,.zz2M
176
;end if
176
;end if
177
	mov	cx,.y1
177
	mov	cx,.y1
178
	cmp	cx,.y2
178
	cmp	cx,.y2
179
	jge	.ft_loop1_end
179
	jge	.ft_loop1_end
180
     .ft_loop1:
180
     .ft_loop1:
181
 
181
 
182
	pushad
182
	pushad
183
 
183
 
184
	push	.col
184
	push	.col
185
	push	cx	    ; y
185
	push	cx	    ; y
186
	sar	ebx,ROUND
186
	sar	ebx,ROUND
187
	push	bx	    ; x2
187
	push	bx	    ; x2
188
	sar	eax,ROUND
188
	sar	eax,ROUND
189
	push	ax	    ; x1
189
	push	ax	    ; x1
190
;if Ext>=MMX
190
;if Ext>=MMX
191
;        sub     esp,8
191
;        sub     esp,8
192
;        movq    [esp],mm0
192
;        movq    [esp],mm0
193
;else
193
;else
194
	push	.zz2	    ; z2 shl CATMULL_SHIFT
194
	push	.zz2	    ; z2 shl CATMULL_SHIFT
195
	push	.zz1	    ; z1 shl CATMULL_SHIFT
195
	push	.zz1	    ; z1 shl CATMULL_SHIFT
196
;end if
196
;end if
197
	call	flat_line_z
197
	call	flat_line_z
198
 
198
 
199
	popad
199
	popad
200
 
200
 
201
	add	eax,.dx13
201
	add	eax,.dx13
202
	add	ebx,.dx12
202
	add	ebx,.dx12
203
;if  Ext>=MMX
203
;if  Ext>=MMX
204
;        paddd   mm0,.dz12M
204
;        paddd   mm0,.dz12M
205
;else
205
;else
206
 
206
 
207
	mov	edx,.dz13
207
	mov	edx,.dz13
208
	add	.zz1,edx
208
	add	.zz1,edx
209
	mov	edx,.dz12
209
	mov	edx,.dz12
210
	add	.zz2,edx
210
	add	.zz2,edx
211
;end if
211
;end if
212
	inc	cx
212
	inc	cx
213
	cmp	cx,.y2
213
	cmp	cx,.y2
214
	jl	.ft_loop1
214
	jl	.ft_loop1
215
    .ft_loop1_end:
215
    .ft_loop1_end:
216
 
216
 
217
	movsx	edx,.z2
217
	movsx	edx,.z2
218
	shl	edx,CATMULL_SHIFT
218
	shl	edx,CATMULL_SHIFT
219
	mov	.zz2,edx
219
	mov	.zz2,edx
220
	movsx	ebx,.x2
220
	movsx	ebx,.x2
221
	shl	ebx,ROUND
221
	shl	ebx,ROUND
222
;if Ext>=MMX
222
;if Ext>=MMX
223
;        movq    mm0,.zz2M
223
;        movq    mm0,.zz2M
224
;;        push    .dz13    ; exchange
224
;;        push    .dz13    ; exchange
225
;;        pop     .dz12
225
;;        pop     .dz12
226
;;        push    .dz23    ; exchange
226
;;        push    .dz23    ; exchange
227
;;        pop     .dz13
227
;;        pop     .dz13
228
;end if
228
;end if
229
	mov	cx,.y2
229
	mov	cx,.y2
230
	cmp	cx,.y3
230
	cmp	cx,.y3
231
	jge	.ft_loop2_end
231
	jge	.ft_loop2_end
232
     .ft_loop2:
232
     .ft_loop2:
233
	pushad
233
	pushad
234
 
234
 
235
	push	.col
235
	push	.col
236
	push	cx
236
	push	cx
237
	sar	ebx,ROUND
237
	sar	ebx,ROUND
238
	push	bx
238
	push	bx
239
	sar	eax,ROUND
239
	sar	eax,ROUND
240
	push	ax	    ; x1
240
	push	ax	    ; x1
241
;if Ext>=MMX
241
;if Ext>=MMX
242
;        sub     esp,8
242
;        sub     esp,8
243
;        movq    [esp],mm0
243
;        movq    [esp],mm0
244
;else
244
;else
245
	push	.zz2	    ; z2 shl CATMULL_SHIFT
245
	push	.zz2	    ; z2 shl CATMULL_SHIFT
246
	push	.zz1	    ; z1 shl CATMULL_SHIFT
246
	push	.zz1	    ; z1 shl CATMULL_SHIFT
247
;end if
247
;end if
248
	call	flat_line_z
248
	call	flat_line_z
249
 
249
 
250
	popad
250
	popad
251
 
251
 
252
	add	eax,.dx13
252
	add	eax,.dx13
253
	add	ebx,.dx23
253
	add	ebx,.dx23
254
;if  Ext>=MMX
254
;if  Ext>=MMX
255
;        paddd   mm0,.dz23M
255
;        paddd   mm0,.dz23M
256
;else
256
;else
257
	mov	edx,.dz13
257
	mov	edx,.dz13
258
	add	.zz1,edx
258
	add	.zz1,edx
259
	mov	edx,.dz23
259
	mov	edx,.dz23
260
	add	.zz2,edx
260
	add	.zz2,edx
261
 
261
 
262
;        mov     edx,.dz13
262
;        mov     edx,.dz13
263
;        add     .zz1,edx
263
;        add     .zz1,edx
264
;        mov     edx,.dz12
264
;        mov     edx,.dz12
265
;        add     .zz2,edx
265
;        add     .zz2,edx
266
;end if
266
;end if
267
	inc	cx
267
	inc	cx
268
	cmp	cx,.y3
268
	cmp	cx,.y3
269
	jl	.ft_loop2
269
	jl	.ft_loop2
270
     .ft_loop2_end:
270
     .ft_loop2_end:
271
 
271
 
272
	mov esp,ebp
272
	mov esp,ebp
273
ret 6
273
ret 6
274
 
274
 
275
flat_line_z:
275
flat_line_z:
276
;----------------
276
;----------------
277
;-------------in edi - pointer to screen buffer ----------------------------------
277
;-------------in edi - pointer to screen buffer ----------------------------------
278
;--------------- esi - pointer to z-buffer (each Z varible dword)-----------------
278
;--------------- esi - pointer to z-buffer (each Z varible dword)-----------------
279
;----------stack - (each z coordinate shifted shl CATMULL_SHIFT)------------------
279
;----------stack - (each z coordinate shifted shl CATMULL_SHIFT)------------------
280
.z1 equ dword [ebp+4]
280
.z1 equ dword [ebp+4]
281
.z2 equ dword [ebp+8]
281
.z2 equ dword [ebp+8]
282
.x1 equ word  [ebp+12]
282
.x1 equ word  [ebp+12]
283
.x2 equ word  [ebp+14]
283
.x2 equ word  [ebp+14]
284
.y  equ word  [ebp+16]
284
.y  equ word  [ebp+16]
285
.col equ dword [ebp+18]
285
.col equ dword [ebp+18]
286
 
286
 
287
.dz equ dword [ebp-4]
287
.dz equ dword [ebp-4]
288
 
288
 
289
     mov	ebp,esp
289
     mov	ebp,esp
290
;;     sub        esp,4
290
;;     sub        esp,4
291
     mov	ax,.y
291
     mov	ax,.y
292
     or 	ax,ax
292
     or 	ax,ax
293
     jl 	.fl_quit
293
     jl 	.fl_quit
294
;;     mov        bx,[size_y]
294
     mov	bx,[size_y_var]
295
;;     dec        bx
295
     dec	bx
296
     cmp	ax,[size_y]
296
     cmp	ax,bx ;[size_y_var]
297
     cmp	ax,SIZE_Y-1
297
  ;   cmp        ax,SIZE_Y-1
298
     jg 	.fl_quit
298
     jg 	.fl_quit
299
 
299
 
300
 ;    cmp        .x1,0
300
 ;    cmp        .x1,0
301
 ;    jge        .fl_ok1
301
 ;    jge        .fl_ok1
302
 ;    cmp        .x2,0
302
 ;    cmp        .x2,0
303
 ;    jl         .fl_quit
303
 ;    jl         .fl_quit
304
 ;  .fl_ok1:
304
 ;  .fl_ok1:
305
 ;    cmp        .x1,SIZE_X
305
 ;    cmp        .x1,SIZE_X
306
 ;    jle        .fl_ok2
306
 ;    jle        .fl_ok2
307
 ;    cmp        .x2,SIZE_X
307
 ;    cmp        .x2,SIZE_X
308
 ;    jg         .fl_quit
308
 ;    jg         .fl_quit
309
 ;  .fl_ok2:
309
 ;  .fl_ok2:
310
     mov	ax,.x1
310
     mov	ax,.x1
311
     cmp	ax,.x2
311
     cmp	ax,.x2
312
     je 	.fl_quit
312
     je 	.fl_quit
313
     jl 	.fl_ok
313
     jl 	.fl_ok
314
 
314
 
315
     xchg	ax,.x2
315
     xchg	ax,.x2
316
     mov	.x1,ax
316
     mov	.x1,ax
317
     mov	edx,.z1
317
     mov	edx,.z1
318
     xchg	edx,.z2
318
     xchg	edx,.z2
319
     mov	.z1,edx
319
     mov	.z1,edx
320
   .fl_ok:
320
   .fl_ok:
321
   ;;  mov        bx,[size_x]
321
     mov	bx,[size_x_var]
322
   ;;  dec        bx
322
     dec	bx
323
     cmp	.x1,SIZE_X-1
323
     cmp	.x1,bx ;SIZE_X-1
324
     jg 	.fl_quit
324
     jg 	.fl_quit
325
     cmp	.x2,0
325
     cmp	.x2,0
326
     jle	.fl_quit
326
     jle	.fl_quit
327
 
327
 
328
     mov	eax,.z2
328
     mov	eax,.z2
329
     sub	eax,.z1
329
     sub	eax,.z1
330
     cdq
330
     cdq
331
     mov	bx,.x2
331
     mov	bx,.x2
332
     sub	bx,.x1
332
     sub	bx,.x1
333
     movsx	ebx,bx
333
     movsx	ebx,bx
334
     idiv	ebx
334
     idiv	ebx
335
;;     mov        .dz,eax                ; calculated delta - shifted .dz
335
;;     mov        .dz,eax                ; calculated delta - shifted .dz
336
     push	eax
336
     push	eax
337
 
337
 
338
     cmp	.x1,0
338
     cmp	.x1,0
339
     jge	@f
339
     jge	@f
340
     movsx	ebx,.x1
340
     movsx	ebx,.x1
341
     neg	ebx
341
     neg	ebx
342
     imul	ebx
342
     imul	ebx
343
     add	.z1,eax
343
     add	.z1,eax
344
     mov	.x1,0
344
     mov	.x1,0
345
    @@:
345
    @@:
-
 
346
     movzx	edx,word[size_x_var]
346
     cmp	.x2,SIZE_X
347
     cmp	.x2,dx ;[size_x_var] ;SIZE_X
347
     jl 	@f
348
     jl 	@f
348
     mov	.x2,SIZE_X
349
     mov	.x2,dx ;[size_x_var] ;SIZE_X
349
    @@:
350
    @@:
350
     mov	edx,SIZE_X
351
 ;    movzx      edx,[size_x_var] ;SIZE_X
351
     movsx	eax,.y
352
     movsx	eax,.y
352
     mul	edx		     ; edi = edi + (SIZE_X * y + x1)*3
353
     mul	edx		     ; edi = edi + (SIZE_X * y + x1)*3
353
     movsx	edx,.x1
354
     movsx	edx,.x1
354
     add	eax,edx
355
     add	eax,edx
355
     push	eax
356
     push	eax
356
     lea	eax,[eax*3]
357
     lea	eax,[eax*3]
357
     add	edi,eax 	     ; esi = esi + (SIZE_X * y + x1)*4
358
     add	edi,eax 	     ; esi = esi + (SIZE_X * y + x1)*4
358
     pop	eax
359
     pop	eax
359
     shl	eax,2
360
     shl	eax,2
360
     add	esi,eax
361
     add	esi,eax
361
 
362
 
362
     mov	cx,.x2
363
     mov	cx,.x2
363
     sub	cx,.x1
364
     sub	cx,.x1
364
     movzx	ecx,cx
365
     movzx	ecx,cx
365
 
366
 
366
     mov	eax,.col
367
     mov	eax,.col
367
     mov	ebx,.z1  ; ebx : curr. z
368
     mov	ebx,.z1  ; ebx : curr. z
368
     mov	edx,.dz
369
     mov	edx,.dz
369
     dec	ecx
370
     dec	ecx
370
     jecxz	.draw_last
371
     jecxz	.draw_last
371
   .ddraw:
372
   .ddraw:
372
     cmp	ebx,dword[esi]
373
     cmp	ebx,dword[esi]
373
   ;  cmovl      [edi],eax
374
   ;  cmovl      [edi],eax
374
    ; cmovl      [esi],ebx
375
    ; cmovl      [esi],ebx
375
     jge	@f
376
     jge	@f
376
     stosd
377
     stosd
377
     dec	edi
378
     dec	edi
378
     mov	dword[esi],ebx
379
     mov	dword[esi],ebx
379
     jmp	.no_skip
380
     jmp	.no_skip
380
   @@:
381
   @@:
381
     add	edi,3
382
     add	edi,3
382
   .no_skip:
383
   .no_skip:
383
     add	esi,4
384
     add	esi,4
384
     add	ebx,edx
385
     add	ebx,edx
385
     loop	.ddraw
386
     loop	.ddraw
386
 
387
 
387
   .draw_last:
388
   .draw_last:
388
     cmp	ebx,dword[esi]
389
     cmp	ebx,dword[esi]
389
     jge	.fl_quit
390
     jge	.fl_quit
390
     stosw
391
     stosw
391
     shr	eax,16
392
     shr	eax,16
392
     stosb
393
     stosb
393
     mov	dword[esi],ebx
394
     mov	dword[esi],ebx
394
 
395
 
395
   .fl_quit:
396
   .fl_quit:
396
 
397
 
397
     mov   esp,ebp
398
     mov   esp,ebp
398
ret 18
399
ret 18