Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2271 leency 1
;SIZE_X equ 350
2
;SIZE_Y equ 350
3
ROUND equ 8
4
;TEX_X equ 512
5
;TEX_Y equ 512
6
;TEXTURE_SIZE EQU (512*512)-1
7
;TEX_SHIFT EQU 9
8
CATMULL_SHIFT equ 8
9
;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1
10
;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great---
11
;------- DOS 13h mode demos --------------------------------------------
12
;------- Procedure draws bump triangle using Catmull Z-buffer algorithm-
13
;------- (Z coordinate interpolation)-----------------------------------
14
bump_triangle_z:
15
;------------------in - eax - x1 shl 16 + y1 -----------
16
;---------------------- ebx - x2 shl 16 + y2 -----------
17
;---------------------- ecx - x3 shl 16 + y3 -----------
18
;---------------------- edx - pointer to bump map ------
19
;---------------------- esi - pointer to environment map
20
;---------------------- edi - pointer to screen buffer--
21
;---------------------- stack : bump coordinates--------
22
;----------------------         environment coordinates-
23
;----------------------         Z position coordinates--
24
;----------------------         pointer io Z buffer-----
25
;-- Z-buffer - filled with coordinates as dword --------
26
;-- (Z coor. as word) shl CATMULL_SHIFT ----------------
27
.b_x1	equ ebp+4   ; procedure don't save registers !!!
28
.b_y1	equ ebp+6   ; each coordinate as word
29
.b_x2	equ ebp+8
30
.b_y2	equ ebp+10
31
.b_x3	equ ebp+12
32
.b_y3	equ ebp+14
33
.e_x1	equ ebp+16
34
.e_y1	equ ebp+18
35
.e_x2	equ ebp+20
36
.e_y2	equ ebp+22
37
.e_x3	equ ebp+24
38
.e_y3	equ ebp+26
39
.z1	equ word[ebp+28]
40
.z2	equ word[ebp+30]
41
.z3	equ word[ebp+32]
42
.z_buff equ dword[ebp+34]	; pointer to Z-buffer
43
 
44
 
45
.t_bmap equ dword[ebp-4]	; pointer to bump map
46
.t_emap equ dword[ebp-8]	; pointer to e. map
47
.x1	equ word[ebp-10]
48
.y1	equ word[ebp-12]
49
.x2	equ word[ebp-14]
50
.y2	equ word[ebp-16]
51
.x3	equ word[ebp-18]
52
.y3	equ word[ebp-20]
53
 
54
.dx12  equ dword[ebp-24]
55
.dbx12 equ dword[ebp-28]
56
.dby12 equ dword[ebp-32]
57
.dex12 equ dword[ebp-36]
58
.dey12 equ dword[ebp-40]
59
.dz12  equ dword[ebp-44]
60
 
61
.dx13  equ dword[ebp-48]
62
.dbx13 equ dword[ebp-52]
63
.dby13 equ dword[ebp-56]
64
.dex13 equ dword[ebp-60]
65
.dey13 equ dword[ebp-64]
66
.dz13  equ dword[ebp-68]
67
 
68
.dx23  equ dword[ebp-72]
69
.dbx23 equ dword[ebp-76]
70
.dby23 equ dword[ebp-80]
71
.dex23 equ dword[ebp-84]
72
.dey23 equ dword[ebp-88]
73
.dz23  equ dword[ebp-92]
74
 
75
.cx1   equ dword[ebp-96]   ; current variables
76
.cx2   equ dword[ebp-100]
77
.cbx1  equ dword[ebp-104]
78
.cbx2  equ dword[ebp-108]
79
.cby1  equ dword[ebp-112]
80
.cby2  equ dword[ebp-116]
81
.cex1  equ dword[ebp-120]
82
.cex2  equ dword[ebp-124]
83
.cey1  equ dword[ebp-128]
84
.cey2  equ dword[ebp-132]
85
.cz1   equ dword[ebp-136]
86
.cz2   equ dword[ebp-140]
87
 
88
       mov     ebp,esp
89
       push    edx	  ; store bump map
90
       push    esi	  ; store e. map
91
     ; sub     esp,120
92
 .sort3:		  ; sort triangle coordinates...
93
       cmp     ax,bx
94
       jle     .sort1
95
       xchg    eax,ebx
96
       mov     edx,dword[.b_x1]
97
       xchg    edx,dword[.b_x2]
98
       mov     dword[.b_x1],edx
99
       mov     edx,dword[.e_x1]
100
       xchg    edx,dword[.e_x2]
101
       mov     dword[.e_x1],edx
102
       mov     dx,.z1
103
       xchg    dx,.z2
104
       mov     .z1,dx
105
 .sort1:
106
       cmp	bx,cx
107
       jle	.sort2
108
       xchg	ebx,ecx
109
       mov	edx,dword[.b_x2]
110
       xchg	edx,dword[.b_x3]
111
       mov	dword[.b_x2],edx
112
       mov	edx,dword[.e_x2]
113
       xchg	edx,dword[.e_x3]
114
       mov	dword[.e_x2],edx
115
       mov     dx,.z2
116
       xchg    dx,.z3
117
       mov     .z2,dx
118
       jmp	.sort3
119
 .sort2:
120
       push	eax	; store triangle coords in variables
121
       push	ebx
122
       push	ecx
123
 
124
	 mov	  edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
125
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
126
	 and	  edx,ecx
127
	 and	  edx,eax
128
	 test	  edx,80008000h  ; Check both X&Y at once
129
	 jne	  .loop23_done
130
    ;   mov     edx,eax         ; eax,ebx,ecx are ORd together into edx which means that
131
    ;   or      edx,ebx         ; if any *one* of them is negative a sign flag is raised
132
    ;   or      edx,ecx
133
    ;   test    edx,80000000h   ; Check only X
134
    ;   jne     .loop23_done
135
 
136
    ;   cmp     .x1,SIZE_X    ; {
137
    ;   jg      .loop23_done
138
    ;   cmp     .x2,SIZE_X     ; This can be optimized with effort
139
    ;   jg      .loop23_done
140
    ;   cmp     .x3,SIZE_X
141
    ;   jg      .loop23_done    ; {
142
 
143
 
144
       mov	bx,.y2	     ; calc delta 12
145
       sub	bx,.y1
146
       jnz	.bt_dx12_make
147
       mov	ecx,6
148
       xor	edx,edx
149
     @@:
150
       push	edx   ;dword 0
151
       loop	@b
152
       jmp	.bt_dx12_done
153
 .bt_dx12_make:
154
       mov	ax,.x2
155
       sub	ax,.x1
156
       cwde
157
       movsx	ebx,bx
158
       shl	eax,ROUND
159
       cdq
160
       idiv	ebx
161
 ;      mov      .dx12,eax
162
       push	 eax
163
 
164
       mov	ax,word[.b_x2]
165
       sub	ax,word[.b_x1]
166
       cwde
167
       shl	eax,ROUND
168
       cdq
169
       idiv	ebx
170
 ;      mov      .dbx12,eax
171
       push	 eax
172
 
173
       mov	ax,word[.b_y2]
174
       sub	ax,word[.b_y1]
175
       cwde
176
       shl	eax,ROUND
177
       cdq
178
       idiv	ebx
179
 ;      mov      .dby12,eax
180
       push	 eax
181
 
182
       mov	ax,word[.e_x2]
183
       sub	ax,word[.e_x1]
184
       cwde
185
       shl	eax,ROUND
186
       cdq
187
       idiv	ebx
188
 ;      mov      .dex12,eax
189
       push	 eax
190
 
191
       mov	ax,word[.e_y2]
192
       sub	ax,word[.e_y1]
193
       cwde
194
       shl	eax,ROUND
195
       cdq
196
       idiv	ebx
197
 ;      mov      .dey12,eax
198
       push	 eax
199
 
200
	mov	ax,.z2
201
	sub	ax,.z1
202
	cwde
203
	shl	eax,CATMULL_SHIFT
204
	cdq
205
	idiv	ebx
206
	push	eax
207
   .bt_dx12_done:
208
 
209
       mov	bx,.y3	     ; calc delta13
210
       sub	bx,.y1
211
       jnz	.bt_dx13_make
212
       mov	ecx,6
213
       xor	edx,edx
214
     @@:
215
       push	edx   ;dword 0
216
       loop	@b
217
       jmp	.bt_dx13_done
218
 .bt_dx13_make:
219
       mov	ax,.x3
220
       sub	ax,.x1
221
       cwde
222
       movsx	ebx,bx
223
       shl	eax,ROUND
224
       cdq
225
       idiv	ebx
226
 ;      mov      .dx13,eax
227
       push	 eax
228
 
229
       mov	ax,word[.b_x3]
230
       sub	ax,word[.b_x1]
231
       cwde
232
       shl	eax,ROUND
233
       cdq
234
       idiv	ebx
235
 ;      mov      .dbx13,eax
236
       push	 eax
237
 
238
       mov	ax,word[.b_y3]
239
       sub	ax,word[.b_y1]
240
       cwde
241
       shl	eax,ROUND
242
       cdq
243
       idiv	ebx
244
 ;      mov      .dby13,eax
245
       push	 eax
246
 
247
       mov	ax,word[.e_x3]
248
       sub	ax,word[.e_x1]
249
       cwde
250
       shl	eax,ROUND
251
       cdq
252
       idiv	ebx
253
 ;      mov      .dex13,eax
254
       push	 eax
255
 
256
       mov	ax,word[.e_y3]
257
       sub	ax,word[.e_y1]
258
       cwde
259
       shl	eax,ROUND
260
       cdq
261
       idiv	ebx
262
 ;      mov      .dey13,eax
263
       push	 eax
264
 
265
     ;  nop                     here bug ????!!!
266
 
267
       mov     ax,.z3
268
       sub     ax,.z1
269
       cwde
270
       shl     eax,CATMULL_SHIFT
271
       cdq
272
       idiv    ebx
273
  ;    mov    .dz13,eax
274
       push    eax
275
   .bt_dx13_done:
276
 
277
       mov	bx,.y3	     ; calc delta23
278
       sub	bx,.y2
279
       jnz	.bt_dx23_make
280
       mov	ecx,6
281
       xor	edx,edx
282
     @@:
283
       push	edx   ;dword 0
284
       loop	@b
285
       jmp	.bt_dx23_done
286
 .bt_dx23_make:
287
       mov	ax,.x3
288
       sub	ax,.x2
289
       cwde
290
       movsx	ebx,bx
291
       shl	eax,ROUND
292
       cdq
293
       idiv	ebx
294
 ;      mov      .dx23,eax
295
       push	 eax
296
 
297
       mov	ax,word[.b_x3]
298
       sub	ax,word[.b_x2]
299
       cwde
300
       shl	eax,ROUND
301
       cdq
302
       idiv	ebx
303
 ;      mov      .dbx23,eax
304
       push	 eax
305
 
306
       mov	ax,word[.b_y3]
307
       sub	ax,word[.b_y2]
308
       cwde
309
       shl	eax,ROUND
310
       cdq
311
       idiv	ebx
312
 ;      mov      .dby23,eax
313
       push	 eax
314
 
315
       mov	ax,word[.e_x3]
316
       sub	ax,word[.e_x2]
317
       cwde
318
       shl	eax,ROUND
319
       cdq
320
       idiv	ebx
321
 ;      mov      .dex23,eax
322
       push	 eax
323
 
324
       mov	ax,word[.e_y3]
325
       sub	ax,word[.e_y2]
326
       cwde
327
       shl	eax,ROUND
328
       cdq
329
       idiv	ebx
330
 ;      mov      .dey23,eax
331
       push	 eax
332
 
333
       mov     ax,.z3
334
       sub     ax,.z2
335
       cwde
336
       shl     eax,CATMULL_SHIFT
337
       cdq
338
       idiv    ebx
339
      ; mov     .dz23,eax
340
       push    eax
341
      ;  sub     esp,40
342
   .bt_dx23_done:
343
       movsx	eax,.x1
344
       shl	eax,ROUND
345
     ; mov      .cx1,eax
346
     ; mov      .cx2,eax
347
       push	eax
348
       push	eax
349
 
350
       movsx	eax,word[.b_x1]
351
       shl	eax,ROUND
352
     ; mov      .cbx1,eax
353
     ; mov      .cbx2,eax
354
       push	eax
355
       push	eax
356
 
357
       movsx	eax,word[.b_y1]
358
       shl	eax,ROUND
359
     ; mov      .cby1,eax
360
     ; mov      .cby2,eax
361
       push	eax
362
       push	eax
363
 
364
       movsx	eax,word[.e_x1]
365
       shl	eax,ROUND
366
      ;mov      .cex1,eax
367
      ;mov      .cex2,eax
368
       push	eax
369
       push	eax
370
 
371
       movsx	eax,word[.e_y1]
372
       shl	eax,ROUND
373
      ;mov      .cey1,eax
374
      ;mov      .cey2,eax
375
       push	eax
376
       push	eax
377
 
378
       movsx	eax,.z1
379
       shl	eax,CATMULL_SHIFT
380
      ;mov      .cz1,eax
381
      ;mov      .cz2,eax
382
       push	eax
383
       push	eax
384
 
385
       movsx	ecx,.y1
386
       cmp	cx,.y2
387
       jge	.loop12_done
388
  .loop12:
389
       call	.call_bump_line
390
 
391
       mov	eax,.dx13
392
       add	.cx1,eax
393
       mov	eax,.dx12
394
       add	.cx2,eax
395
 
396
       mov	eax,.dbx13
397
       add	.cbx1,eax
398
       mov	eax,.dbx12
399
       add	.cbx2,eax
400
       mov	eax,.dby13
401
       add	.cby1,eax
402
       mov	eax,.dby12
403
       add	.cby2,eax
404
 
405
       mov	eax,.dex13
406
       add	.cex1,eax
407
       mov	eax,.dex12
408
       add	.cex2,eax
409
       mov	eax,.dey13
410
       add	.cey1,eax
411
       mov	eax,.dey12
412
       add	.cey2,eax
413
 
414
       mov	eax,.dz13
415
       add	.cz1,eax
416
       mov	eax,.dz12
417
       add	.cz2,eax
418
 
419
       inc	ecx
420
       cmp	cx,.y2
421
       jl	.loop12
422
    .loop12_done:
423
 
424
       movsx	ecx,.y2
425
       cmp	cx,.y3
426
       jge	.loop23_done
427
 
428
       movsx	eax,.z2
429
       shl	eax,CATMULL_SHIFT
430
       mov	.cz2,eax
431
 
432
       movsx	eax,.x2
433
       shl	eax,ROUND
434
       mov	.cx2,eax
435
 
436
       movzx	eax,word[.b_x2]
437
       shl	eax,ROUND
438
       mov	.cbx2,eax
439
 
440
       movzx	eax,word[.b_y2]
441
       shl	eax,ROUND
442
       mov	.cby2,eax
443
 
444
       movzx	eax,word[.e_x2]
445
       shl	eax,ROUND
446
       mov	.cex2,eax
447
 
448
       movzx	eax,word[.e_y2]
449
       shl	eax,ROUND
450
       mov	.cey2,eax
451
 
452
     .loop23:
453
       call	.call_bump_line
454
 
455
       mov	eax,.dx13
456
       add	.cx1,eax
457
       mov	eax,.dx23
458
       add	.cx2,eax
459
 
460
       mov	eax,.dbx13
461
       add	.cbx1,eax
462
       mov	eax,.dbx23
463
       add	.cbx2,eax
464
       mov	eax,.dby13
465
       add	.cby1,eax
466
       mov	eax,.dby23
467
       add	.cby2,eax
468
 
469
       mov	eax,.dex13
470
       add	.cex1,eax
471
       mov	eax,.dex23
472
       add	.cex2,eax
473
       mov	eax,.dey13
474
       add	.cey1,eax
475
       mov	eax,.dey23
476
       add	.cey2,eax
477
 
478
       mov	eax,.dz13
479
       add	.cz1,eax
480
       mov	eax,.dz23
481
       add	.cz2,eax
482
 
483
       inc	ecx
484
       cmp	cx,.y3
485
       jl	.loop23
486
    .loop23_done:
487
 
488
       mov	esp,ebp
489
ret   34
490
 
491
.call_bump_line:
492
 
493
      ; push     ebp
494
      ; push     ecx
495
       pushad
496
 
497
       push	.cz1
498
       push	.cz2
499
       push	.z_buff
500
       push	.t_emap
501
       push	.t_bmap
502
       push	.cey2
503
       push	.cex2
504
       push	.cey1
505
       push	.cex1
506
       push	.cby2
507
       push	.cbx2
508
       push	.cby1
509
       push	.cbx1
510
       push	ecx
511
 
512
       mov	eax,.cx1
513
       sar	eax,ROUND
514
       mov	ebx,.cx2
515
       sar	ebx,ROUND
516
 
517
       call	bump_line_z
518
 
519
       popad
520
ret
521
bump_line_z:
522
;--------------in: eax - x1
523
;--------------    ebx - x2
524
;--------------    edi - pointer to screen buffer
525
;stack - another parameters :
526
.y	equ dword [ebp+4]
527
.bx1	equ dword [ebp+8]   ;   ---
528
.by1	equ dword [ebp+12]  ;       |
529
.bx2	equ dword [ebp+16]  ;       |
530
.by2	equ dword [ebp+20]  ;       |>   bump and env coords
531
.ex1	equ dword [ebp+24]  ;       |>   shifted shl ROUND
532
.ey1	equ dword [ebp+28]  ;       |
533
.ex2	equ dword [ebp+32]  ;       |
534
.ey2	equ dword [ebp+36]  ;   ---
535
.bmap	equ dword [ebp+40]
536
.emap	equ dword [ebp+44]
537
.z_buff equ dword [ebp+48]
538
.z2	equ dword [ebp+52]  ;   -- |>   z coords shifted
539
.z1	equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
540
 
541
.x1	equ dword [ebp-4]
542
.x2	equ dword [ebp-8]
543
.dbx	equ dword [ebp-12]
544
.dby	equ dword [ebp-16]
545
.dex	equ dword [ebp-20]
546
.dey	equ dword [ebp-24]
547
.dz	equ dword [ebp-28]
548
.cbx	equ dword [ebp-32]
549
.cby	equ dword [ebp-36]
550
.cex	equ dword [ebp-40]
551
.cey	equ dword [ebp-44]
552
.cz	equ dword [ebp-48]
553
.czbuff equ dword [ebp-52]
554
	mov	ebp,esp
555
 
556
	mov	ecx,.y
557
	or	ecx,ecx
558
	jl	.bl_end
559
	cmp	ecx,SIZE_Y
560
	jge	.bl_end
561
 
562
	cmp	eax,ebx
563
	jl	.bl_ok
564
	je	.bl_end
565
 
566
	xchg	eax,ebx
567
 
568
	mov	edx,.bx1
569
	xchg	edx,.bx2
570
	mov	.bx1,edx
571
	mov	edx,.by1
572
	xchg	edx,.by2
573
	mov	.by1,edx
574
 
575
	mov	edx,.ex1
576
	xchg	edx,.ex2
577
	mov	.ex1,edx
578
	mov	edx,.ey1
579
	xchg	edx,.ey2
580
	mov	.ey1,edx
581
 
582
	mov	edx,.z1
583
	xchg	edx,.z2
584
	mov	.z1,edx
585
  .bl_ok:
586
	push	eax
587
	push	ebx	      ;store x1, x2
588
 
589
	cmp	.x1,SIZE_X
590
	jge	.bl_end
591
	cmp	.x2,0
592
	jle	.bl_end
593
 
594
	mov	ebx,.x2
595
	sub	ebx,.x1
596
 
597
	mov	eax,.bx2       ; calc .dbx
598
	sub	eax,.bx1
599
	cdq
600
	idiv	ebx
601
	push	eax
602
 
603
	mov	eax,.by2       ; calc .dby
604
	sub	eax,.by1
605
	cdq
606
	idiv	ebx
607
	push	eax
608
 
609
	mov	eax,.ex2       ; calc .dex
610
	sub	eax,.ex1
611
	cdq
612
	idiv	ebx
613
	push	eax
614
 
615
	mov	eax,.ey2       ; calc .dey
616
	sub	eax,.ey1
617
	cdq
618
	idiv	ebx
619
	push	eax
620
 
621
	mov	eax,.z2        ; calc .dz
622
	sub	eax,.z1
623
	cdq
624
	idiv	ebx
625
	push	eax
626
 
627
	cmp	.x1,0	      ; set correctly begin variable
628
	jge	@f	      ; CLIPPING ON FUNCTION
629
			      ; cutting triangle exceedes screen
630
	mov	ebx,.x1
631
	neg	ebx
632
	imul	ebx	      ; eax = .dz * abs(.x1)
633
	add	.z1,eax
634
	mov	.x1,0
635
 
636
	mov	eax,.dbx
637
	imul	ebx
638
	add    .bx1,eax
639
 
640
	mov	eax,.dby
641
	imul	ebx
642
	add	.by1,eax
643
 
644
	mov	eax,.dex
645
	imul	ebx
646
	add	.ex1,eax
647
 
648
	mov	eax,.dey
649
	imul	ebx
650
	add	.ey1,eax
651
      @@:
652
	cmp	.x2,SIZE_X
653
	jl	@f
654
	mov	.x2,SIZE_X
655
      @@:
656
	mov	eax,SIZE_X	 ;calc memory begin in buffers
657
	mov	ebx,.y
658
	mul	ebx
659
	mov	ebx,.x1
660
	add	eax,ebx
661
	mov	ebx,eax
662
	lea	eax,[eax*3]
663
	add	edi,eax
664
	mov	esi,.z_buff	  ; z-buffer filled with dd variables
665
	shl	ebx,2
666
	add	esi,ebx
667
 
668
	mov	ecx,.x2
669
	sub	ecx,.x1
670
	; init current variables
671
	push	.bx1
672
	push	.by1
673
	push	.ex1
674
	push	.ey1
675
	push	.z1		 ; current z shl CATMULL_SHIFT
676
	push	esi
677
     .draw:
678
    ; if TEX = SHIFTING   ;bump drawing only in shifting mode
679
	mov	esi,.czbuff	 ; .czbuff current address in buffer
680
	mov	ebx,.cz 	 ; .cz - cur z position
681
	cmp	ebx,dword[esi]
682
	jge	.skip
683
 
684
	mov	eax,.cby
685
	sar	eax,ROUND
686
	shl	eax,TEX_SHIFT
687
	mov	esi,.cbx
688
	sar	esi,ROUND
689
	add	esi,eax
690
 
691
	mov	ebx,esi
692
	dec	ebx
693
	and	ebx,TEXTURE_SIZE
694
	add	ebx,.bmap
695
	movzx	eax,byte [ebx]
696
 
697
	mov	ebx,esi
698
	inc	ebx
699
	and	ebx,TEXTURE_SIZE
700
	add	ebx,.bmap
701
	movzx	ebx,byte [ebx]
702
	sub	eax,ebx
703
 
704
	mov	ebx,esi
705
	sub	ebx,TEX_X
706
	and	ebx,TEXTURE_SIZE
707
	add	ebx,.bmap
708
	movzx	edx,byte [ebx]
709
 
710
	mov	ebx,esi
711
	add	ebx,TEX_X
712
	and	ebx,TEXTURE_SIZE
713
	add	ebx,.bmap
714
	movzx	ebx,byte [ebx]
715
	sub	edx,ebx
716
 
717
	mov	ebx,.cex       ;.cex - current env map X
718
	sar	ebx,ROUND
719
	add	eax,ebx        ; eax - modified x coord
720
 
721
	mov	ebx,.cey       ;.cey - current  env map y
722
	sar	ebx,ROUND
723
	add	edx,ebx        ; edx - modified y coord
724
 
725
	or	eax,eax
726
	jl	.black
727
	cmp	eax,TEX_X
728
	jg	.black
729
	or	edx,edx
730
	jl	.black
731
	cmp	edx,TEX_Y
732
	jg	.black
733
 
734
	shl	edx,TEX_SHIFT
735
	add	edx,eax
736
	lea	edx,[edx*3]
737
	add	edx,.emap
738
	mov	eax,dword[edx]
739
	jmp	.put_pixel
740
     .black:
741
	xor	eax,eax
742
     .put_pixel:
743
	stosd
744
	dec	edi
745
	mov	ebx,.cz
746
	mov	esi,.czbuff
747
	mov	dword[esi],ebx
748
	jmp	.no_skip
749
     .skip:
750
	add	edi,3
751
     .no_skip:
752
	add	.czbuff,4
753
	mov	eax,.dbx
754
	add	.cbx,eax
755
	mov	eax,.dby
756
	add	.cby,eax
757
	mov	eax,.dex
758
	add	.cex,eax
759
	mov	eax,.dey
760
	add	.cey,eax
761
	mov	eax,.dz
762
	add	.cz,eax
763
 
764
	dec	ecx
765
	jnz	.draw
766
   ;   end if
767
  .bl_end:
768
	mov	esp,ebp
769
ret 56