Rev 109 | Rev 485 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ; |
2 | ; 3D POLYGONAL CUBE - ASCL |
||
3 | ; |
||
4 | ; Pavlushin Evgeni |
||
5 | ; mail: waptap@mail.ru site: www.deck4.narod.ru |
||
6 | ; |
||
7 | ; Create on base 3D test sample |
||
8 | ; Mikolaj Felix mfelix@polbox.com |
||
9 | ; |
||
10 | |||
11 | use32 |
||
12 | org 0x0 |
||
13 | db 'MENUET01' ; 8 byte id |
||
14 | dd 0x01 ; header version |
||
15 | dd START ; start of code |
||
16 | dd I_END ; size of image |
||
17 | dd 0x30000 ; memory for app |
||
18 | dd 0x30000 ; esp |
||
19 | dd 0x0 , 0x0 ; I_Param , I_Icon |
||
20 | |||
21 | MAX_POINTS equ 8 |
||
22 | MAX_TRIANGLES equ 12 |
||
23 | SCREEN_X equ 320 |
||
24 | SCREEN_Y equ 200 |
||
25 | |||
26 | include 'lang.inc' |
||
27 | include 'ascl.inc' |
||
28 | include 'ascgl.inc' |
||
29 | include 'macros.inc' |
||
30 | START: |
||
31 | call draw_window |
||
32 | call init_sin_cos |
||
33 | |||
34 | still: |
||
35 | ; mov eax,23 ; wait for system event with 10 ms timeout |
||
36 | ; mov ebx,1 ; wait 10 ms, then continue |
||
37 | ; int 0x40 |
||
38 | |||
39 | mov eax,11 |
||
40 | int 0x40 |
||
41 | |||
42 | dec eax |
||
43 | ; cmp eax,1 ; window redraw request ? |
||
44 | jz red |
||
45 | dec eax |
||
46 | ; cmp eax,2 ; key in buffer ? |
||
47 | jz key |
||
48 | dec eax |
||
49 | ; cmp eax,3 ; button in buffer ? |
||
50 | jz button |
||
51 | |||
316 | heavyiron | 52 | fps 230,8,cl_White,cl_Black |
31 | halyavin | 53 | |
54 | main_loop: |
||
55 | |||
56 | mov esi,object |
||
57 | mov edi,object_rotated |
||
58 | mov ecx,MAX_POINTS*3 |
||
59 | cld |
||
60 | rep movsw |
||
61 | |||
62 | mov esi,angle_x |
||
63 | mov edi,object_rotated |
||
64 | mov ecx,MAX_POINTS |
||
65 | call rotate_points |
||
66 | |||
67 | mov esi,object_rotated |
||
68 | mov edi,object_translated |
||
69 | mov ecx,MAX_POINTS |
||
70 | call translate_points |
||
71 | |||
72 | call draw_faces |
||
73 | |||
74 | call clear_screen_buffer |
||
75 | |||
76 | add [angle_x],2 |
||
77 | add [angle_y],3 |
||
78 | add [angle_z],1 |
||
79 | |||
80 | jmp still |
||
81 | |||
82 | red: |
||
83 | call draw_window |
||
84 | jmp still |
||
85 | key: |
||
86 | mov eax,2 |
||
87 | int 0x40 |
||
88 | jmp still |
||
89 | button: |
||
90 | mov eax,17 |
||
91 | int 0x40 |
||
92 | cmp ah,1 |
||
93 | jne still |
||
94 | exit: |
||
95 | mov eax,-1 |
||
96 | int 0x40 |
||
97 | |||
98 | ;Draw window |
||
99 | draw_window: |
||
100 | mov eax,12 ;Start |
||
101 | mov ebx,1 |
||
102 | int 0x40 |
||
103 | |||
104 | mov eax,0 ;Draw window |
||
105 | mov ebx,100*65536+(SCREEN_X+9) ;x start*65536+x size |
||
106 | mov ecx,100*65536+(SCREEN_Y+26) ;y start*65536+y size |
||
316 | heavyiron | 107 | mov edx,0x13000000 ;0x03 use skinned window |
108 | mov edi,header |
||
31 | halyavin | 109 | int 0x40 |
110 | |||
111 | mov eax,12 ;End |
||
112 | mov ebx,2 |
||
113 | int 0x40 |
||
114 | ret |
||
115 | |||
316 | heavyiron | 116 | header db '3D TEST SAMPLE FOR MENUETOS',0 |
31 | halyavin | 117 | |
118 | |||
119 | ; Draw faces procedure |
||
120 | |||
121 | draw_faces: |
||
122 | |||
123 | mov esi,link |
||
124 | mov ecx,MAX_TRIANGLES |
||
125 | df_draw: |
||
126 | push ecx |
||
127 | mov ecx,3 |
||
128 | mov edi,@@tx1 ;bp |
||
129 | df_get_point: |
||
130 | xor bh,bh |
||
131 | mov bl,byte [esi] |
||
132 | shl bx,2 |
||
133 | mov ax,word [object_translated+bx] |
||
134 | mov word [edi],ax |
||
135 | mov ax,word [object_translated+bx+2] |
||
136 | mov word [edi+2],ax |
||
137 | inc esi |
||
138 | add edi,4 |
||
139 | dec ecx |
||
140 | jnz df_get_point |
||
141 | |||
142 | mov ax,[@@ty1] |
||
143 | sub ax,[@@ty3] |
||
144 | mov bx,[@@tx2] |
||
145 | sub bx,[@@tx1] |
||
146 | imul bx |
||
147 | shl edx,16 |
||
148 | mov dx,ax |
||
149 | push edx |
||
150 | mov ax,[@@tx1] |
||
151 | sub ax,[@@tx3] |
||
152 | mov bx,[@@ty2] |
||
153 | sub bx,[@@ty1] |
||
154 | imul bx |
||
155 | shl edx,16 |
||
156 | mov dx,ax |
||
157 | pop ebx |
||
158 | sub ebx,edx |
||
159 | or ebx,ebx |
||
160 | jge df_next |
||
161 | |||
162 | xor ah,ah |
||
163 | mov al,byte [si] |
||
164 | |||
165 | mov [@@xcol],ax |
||
166 | |||
167 | call filled_triangle |
||
168 | df_next: |
||
169 | inc si |
||
170 | pop ecx |
||
171 | dec ecx |
||
172 | jnz df_draw |
||
173 | ret |
||
174 | |||
175 | ;modify |
||
176 | ;include graphlib.asm |
||
177 | |||
178 | clear_screen_buffer: |
||
179 | |||
180 | ;outscrbuf |
||
181 | mov ebx,scrbuf |
||
182 | mov ecx,SCREEN_X*65536+SCREEN_Y |
||
183 | mov edx,5*65536+22 |
||
184 | mov ax,7 |
||
185 | int 0x40 |
||
186 | |||
187 | ;White background |
||
188 | mov edi,scrbuf |
||
189 | mov ecx,(SCREEN_X*SCREEN_Y*3)/4 |
||
190 | mov eax,0xffffffff |
||
191 | cld |
||
192 | rep stosd |
||
193 | |||
194 | ret |
||
195 | |||
196 | ;include triangle.asm |
||
197 | ; Mikolaj Felix 14/5/2001 |
||
198 | ; mfelix@polbox.com |
||
199 | |||
200 | ;filled trangle procedure |
||
201 | |||
202 | @@tx1 dw 0 |
||
203 | @@ty1 dw 0 |
||
204 | @@tx2 dw 0 |
||
205 | @@ty2 dw 0 |
||
206 | @@tx3 dw 0 |
||
207 | @@ty3 dw 0 |
||
208 | @@xcol dw 0 |
||
209 | |||
210 | @@dx12 dw 0 |
||
211 | @@dx13 dw 0 |
||
212 | @@dx23 dw 0 |
||
213 | |||
214 | filled_triangle: |
||
215 | |||
216 | mov ax,[@@xcol] ;trnsforming color |
||
217 | mov bl,al ;byte bbbggrrx |
||
218 | mov dl,al ;to 3 byte |
||
219 | mov dh,al ;bbbxxxxx ggxxxxxx rrxxxxxx |
||
220 | and dh,00000001b |
||
221 | |||
222 | and al,11100000b |
||
223 | and bl,00011000b |
||
224 | and dl,00000110b |
||
225 | shl bl,3 |
||
226 | shl dl,5 |
||
227 | |||
228 | cmp dh,1 |
||
229 | jne no_bitup |
||
230 | or al,00011111b |
||
231 | or bl,00111111b |
||
232 | or dl,00111111b |
||
233 | no_bitup: |
||
234 | |||
235 | shl eax,8 ;puck colors |
||
236 | mov al,bl |
||
237 | shl eax,8 |
||
238 | mov al,dl |
||
239 | mov dword [@@rgb],eax |
||
240 | mov eax,0 ; for 16 bit instructions |
||
241 | |||
242 | mov ax,[@@ty1] |
||
243 | cmp ax,[@@ty3] |
||
244 | jb ft_check1 |
||
245 | |||
246 | xchg ax,[@@ty3] |
||
247 | mov [@@ty1],ax |
||
248 | |||
249 | mov ax,[@@tx1] |
||
250 | xchg ax,[@@tx3] |
||
251 | mov [@@tx1],ax |
||
252 | ft_check1: |
||
253 | mov ax,[@@ty2] |
||
254 | cmp ax,[@@ty3] |
||
255 | jb ft_check2 |
||
256 | |||
257 | xchg ax,[@@ty3] |
||
258 | mov [@@ty2],ax |
||
259 | |||
260 | mov ax,[@@tx2] |
||
261 | xchg ax,[@@tx3] |
||
262 | mov [@@tx2],ax |
||
263 | ft_check2: |
||
264 | mov ax,[@@ty1] |
||
265 | cmp ax,[@@ty2] |
||
266 | jb ft_check3 |
||
267 | |||
268 | xchg ax,[@@ty2] |
||
269 | mov [@@ty1],ax |
||
270 | |||
271 | mov ax,[@@tx1] |
||
272 | xchg ax,[@@tx2] |
||
273 | mov [@@tx1],ax |
||
274 | ft_check3: |
||
275 | |||
276 | mov bx,[@@ty2] |
||
277 | sub bx,[@@ty1] |
||
278 | jnz ft_dx12_make |
||
279 | |||
280 | mov [@@dx12],word 0 |
||
281 | jmp ft_dx12_done |
||
282 | ft_dx12_make: |
||
283 | mov ax,[@@tx2] |
||
284 | sub ax,[@@tx1] |
||
285 | shl ax,7 |
||
286 | cwd |
||
287 | idiv bx |
||
288 | mov [@@dx12],ax ; dx12 = (x2-x1)/(y2-y1) |
||
289 | ft_dx12_done: |
||
290 | |||
291 | mov bx,[@@ty3] |
||
292 | sub bx,[@@ty1] |
||
293 | jnz ft_dx13_make |
||
294 | |||
295 | mov [@@dx13],word 0 |
||
296 | jmp ft_dx13_done |
||
297 | ft_dx13_make: |
||
298 | mov ax,[@@tx3] |
||
299 | sub ax,[@@tx1] |
||
300 | shl ax,7 |
||
301 | cwd |
||
302 | idiv bx |
||
303 | mov [@@dx13],ax ; dx13 = (x3-x1)/(y3-y1) |
||
304 | ft_dx13_done: |
||
305 | |||
306 | mov bx,[@@ty3] |
||
307 | sub bx,[@@ty2] |
||
308 | jnz ft_dx23_make |
||
309 | |||
310 | mov [@@dx23],word 0 |
||
311 | jmp ft_dx23_done |
||
312 | ft_dx23_make: |
||
313 | mov ax,[@@tx3] |
||
314 | sub ax,[@@tx2] |
||
315 | shl ax,7 |
||
316 | cwd |
||
317 | idiv bx |
||
318 | mov [@@dx23],ax ; dx23 = (x3-x2)/(y3-y2) |
||
319 | ft_dx23_done: |
||
320 | |||
321 | mov ax,[@@tx1] |
||
322 | shl ax,7 |
||
323 | mov bx,ax |
||
324 | |||
325 | mov cx,[@@ty1] |
||
326 | ft_loop1: |
||
327 | |||
328 | pushad |
||
329 | |||
330 | mov [@@ly],cx |
||
331 | mov dx,bx |
||
332 | shr dx,7 |
||
333 | mov [@@lx2],dx |
||
334 | mov dx,ax |
||
335 | shr dx,7 |
||
336 | mov [@@lx1],dx |
||
337 | mov ax,[@@xcol] |
||
338 | mov [@@lcol],ax |
||
339 | call horizontal_line |
||
340 | |||
341 | popad |
||
342 | |||
343 | add ax,[@@dx13] |
||
344 | add bx,[@@dx12] |
||
345 | inc cx |
||
346 | cmp cx,[@@ty2] |
||
347 | jb ft_loop1 |
||
348 | |||
349 | |||
350 | mov bx,[@@tx2] |
||
351 | shl bx,7 |
||
352 | mov cx,[@@ty2] |
||
353 | ft_loop2: |
||
354 | |||
355 | pushad |
||
356 | |||
357 | mov [@@ly],cx |
||
358 | mov dx,bx |
||
359 | shr dx,7 |
||
360 | mov [@@lx2],dx |
||
361 | mov dx,ax |
||
362 | shr dx,7 |
||
363 | mov [@@lx1],dx |
||
364 | mov ax,[@@xcol] |
||
365 | mov [@@lcol],ax |
||
366 | call horizontal_line |
||
367 | |||
368 | popad |
||
369 | |||
370 | add ax,[@@dx13] |
||
371 | add bx,[@@dx23] |
||
372 | inc ecx |
||
373 | cmp cx,[@@ty3] |
||
374 | jb ft_loop2 |
||
375 | |||
376 | ret |
||
377 | |||
378 | ;horizontal line subproc |
||
379 | |||
380 | @@lx1 dw 0 |
||
381 | @@lx2 dw 0 |
||
382 | @@ly dw 0 |
||
383 | @@lcol dw 0 |
||
384 | |||
385 | @@rgb dd 0 |
||
386 | |||
387 | horizontal_line: |
||
388 | |||
389 | mov ecx,0 |
||
390 | mov cx,[@@lx1] |
||
391 | cmp cx,[@@lx2] |
||
392 | ja x12 |
||
393 | je ext |
||
394 | ; ret |
||
395 | mov cx,[@@lx2] |
||
396 | sub cx,[@@lx1] |
||
397 | mov edi,3 |
||
398 | jmp xx |
||
399 | x12: |
||
400 | mov cx,[@@lx1] |
||
401 | sub cx,[@@lx2] |
||
402 | mov edi,-3 |
||
403 | jmp xx |
||
404 | ext: |
||
405 | mov ecx,-1 ;1 |
||
406 | ; sub ebp,3 |
||
407 | xx: |
||
408 | mov eax,0 |
||
409 | mov ax,[@@ly] |
||
410 | mov ebx,SCREEN_X ;320 |
||
411 | mul ebx |
||
412 | mov ebp,0 |
||
413 | mov bp,[@@lx1] ;for correct 16 bit size |
||
414 | add eax,ebp |
||
415 | mov ebx,3 |
||
416 | mul ebx |
||
417 | mov ebp,eax |
||
418 | sub ebp,3 ;for delete white dots |
||
419 | add ecx,2 |
||
420 | loo: |
||
421 | |||
422 | mov eax,dword [@@rgb] |
||
423 | mov bl,al |
||
424 | shr eax,8 ;puck colors |
||
425 | |||
426 | mov byte [scrbuf+ebp],ah |
||
427 | mov byte [scrbuf+ebp+1],al |
||
428 | mov byte [scrbuf+ebp+2],bl |
||
429 | add ebp,edi |
||
430 | dec ecx |
||
431 | jnz loo |
||
432 | |||
433 | ret |
||
434 | |||
435 | ;include fixed3d.asm |
||
436 | ; Mikolaj Felix 25/5/2001 |
||
437 | ; mfelix@polbox.com |
||
438 | |||
439 | ;------------------------------------------------------------ |
||
440 | ; ds:si - offset to angles |
||
441 | ; ds:di - offset to 3d points |
||
442 | ; cx - number of points |
||
443 | ;------------------------------------------------------------ |
||
444 | |||
445 | @@sin_x dw 0 |
||
446 | @@cos_x dw 0 |
||
447 | @@sin_y dw 0 |
||
448 | @@cos_y dw 0 |
||
449 | @@sin_z dw 0 |
||
450 | @@cos_z dw 0 |
||
451 | |||
452 | @@px equ word [edi] |
||
453 | @@py equ word [edi+2] |
||
454 | @@pz equ word [edi+4] |
||
455 | |||
456 | rotate_points: |
||
457 | |||
458 | push edi |
||
459 | mov edi,@@sin_x |
||
460 | mov edx,3 |
||
461 | rp_sin_cos: |
||
462 | mov bx,word [esi] |
||
463 | and bx,511 |
||
464 | shl bx,1 |
||
465 | mov ax,word [sin_table+bx] |
||
466 | mov word [edi],ax |
||
467 | mov ax,word [cos_table+bx] |
||
468 | mov word [edi+2],ax |
||
469 | |||
470 | add esi,2 |
||
471 | add edi,4 |
||
472 | dec edx |
||
473 | jnz rp_sin_cos |
||
474 | pop edi |
||
475 | |||
476 | rp_rotate: |
||
477 | |||
478 | ; rotate around x-axis |
||
479 | |||
480 | mov ax,@@py |
||
481 | imul [@@cos_x] |
||
482 | mov bx,ax |
||
483 | mov si,dx |
||
484 | |||
485 | mov ax,@@pz |
||
486 | imul [@@sin_x] |
||
487 | sub bx,ax |
||
488 | sbb si,dx |
||
489 | shrd bx,si,14 |
||
490 | push bx |
||
491 | |||
492 | mov ax,@@py |
||
493 | imul [@@sin_x] |
||
494 | mov bx,ax |
||
495 | mov si,dx |
||
496 | |||
497 | mov ax,@@pz |
||
498 | imul [@@cos_x] |
||
499 | add bx,ax |
||
500 | adc si,dx |
||
501 | shrd bx,si,14 |
||
502 | |||
503 | pop @@py |
||
504 | mov @@pz,bx |
||
505 | |||
506 | ; rotate around y-axis |
||
507 | |||
508 | mov ax,@@px |
||
509 | imul [@@cos_y] |
||
510 | mov bx,ax |
||
511 | mov si,dx |
||
512 | |||
513 | mov ax,@@pz |
||
514 | imul [@@sin_y] |
||
515 | sub bx,ax |
||
516 | sbb si,dx |
||
517 | shrd bx,si,14 |
||
518 | push bx |
||
519 | |||
520 | mov ax,@@px |
||
521 | imul [@@sin_y] |
||
522 | mov bx,ax |
||
523 | mov si,dx |
||
524 | |||
525 | mov ax,@@pz |
||
526 | imul [@@cos_y] |
||
527 | add bx,ax |
||
528 | adc si,dx |
||
529 | shrd bx,si,14 |
||
530 | |||
531 | pop @@px |
||
532 | mov @@pz,bx |
||
533 | |||
534 | ; rotate around z-axis |
||
535 | |||
536 | mov ax,@@px |
||
537 | imul [@@cos_z] |
||
538 | mov bx,ax |
||
539 | mov si,dx |
||
540 | |||
541 | mov ax,@@py |
||
542 | imul [@@sin_z] |
||
543 | sub bx,ax |
||
544 | sbb si,dx |
||
545 | shrd bx,si,14 |
||
546 | push bx |
||
547 | |||
548 | mov ax,@@px |
||
549 | imul [@@sin_z] |
||
550 | mov bx,ax |
||
551 | mov si,dx |
||
552 | |||
553 | mov ax,@@py |
||
554 | imul [@@cos_z] |
||
555 | add bx,ax |
||
556 | adc si,dx |
||
557 | shrd bx,si,14 |
||
558 | |||
559 | pop @@px |
||
560 | mov @@py,bx |
||
561 | |||
562 | add edi,6 |
||
563 | dec ecx |
||
564 | jnz rp_rotate |
||
565 | |||
566 | ret |
||
567 | |||
568 | ;------------------------------------------------------------ |
||
569 | ; ds:si - offset to 3d points |
||
570 | ; es:di - offset to 2d points |
||
571 | ; cx - number of points |
||
572 | ;------------------------------------------------------------ |
||
573 | |||
574 | mx dw 0 |
||
575 | my dw 0 |
||
576 | |||
577 | translate_points: |
||
578 | pushad |
||
579 | mov eax,37 |
||
580 | mov ebx,1 |
||
581 | int 0x40 |
||
582 | mov ebx,eax |
||
583 | shr eax,16 |
||
584 | and ebx,0xffff |
||
585 | cmp ax,SCREEN_X |
||
586 | jna x_n |
||
587 | mov ax,0 ;SCREEN_X |
||
588 | x_n: |
||
589 | cmp bx,SCREEN_Y |
||
590 | jna y_n |
||
591 | mov bx,0 ;SCREEN_Y |
||
592 | y_n: |
||
593 | mov [mx],ax |
||
594 | mov [my],bx |
||
595 | popad |
||
596 | |||
597 | mov ebx,0 ;? |
||
598 | mov bx,word [esi+4] |
||
599 | mov ax,[my] |
||
600 | cmp ax,0 |
||
601 | jng no_m |
||
602 | shl ax,3 |
||
603 | add bx,ax |
||
604 | no_m: |
||
605 | add bx,256 ; Z factor (zoom) |
||
606 | |||
607 | mov eax,0 ;? |
||
608 | mov ax,word [esi] |
||
609 | shl ax,8 |
||
610 | cwd |
||
611 | idiv bx; bx |
||
612 | add ax,(SCREEN_X/2) ;160 ;X factor (center X) |
||
613 | stosw |
||
614 | |||
615 | mov eax,0 ;? |
||
616 | mov ax,word [esi+2] |
||
617 | shl ax,8 |
||
618 | cwd |
||
619 | idiv bx |
||
620 | add ax,(SCREEN_Y/2) ;100 ;Y factor (center Y) |
||
621 | stosw |
||
622 | |||
623 | add esi,6 |
||
624 | dec ecx |
||
625 | jnz translate_points |
||
626 | ret |
||
627 | |||
628 | init_sin_cos: |
||
629 | finit |
||
630 | fldz |
||
631 | fstp [temp] |
||
632 | xor edi,edi |
||
633 | mov ecx,512 |
||
634 | isc_make: |
||
635 | fld [temp] |
||
636 | fld st0 |
||
637 | fld st0 |
||
638 | fsin |
||
639 | fmul [fixed_point_const] |
||
640 | fistp word [sin_table+edi] |
||
641 | fcos |
||
642 | fmul [fixed_point_const] |
||
643 | fistp word [cos_table+edi] |
||
644 | |||
645 | fadd [inc_angle] |
||
646 | fstp [temp] |
||
647 | |||
648 | add edi,2 |
||
649 | loop isc_make |
||
650 | ret |
||
651 | |||
652 | temp dd 0 |
||
653 | |||
654 | fixed_point_const dd 16384.0 |
||
655 | inc_angle dd 0.01227184630309 ; pi/256 |
||
656 | |||
657 | angle_x dw 0 |
||
658 | angle_y dw 0 |
||
659 | angle_z dw 0 |
||
660 | |||
661 | object dw -50,-50,-50, 50,-50,-50, 50,50,-50, -50,50,-50 |
||
662 | dw -50,-50, 50, 50,-50, 50, 50,50, 50, -50,50, 50 |
||
663 | |||
664 | link: |
||
665 | db 0,1,2,10000011b, 0,2,3,10000011b ;purpure side |
||
666 | db 5,4,7,00000111b, 5,7,6,00000111b ;soft-red side |
||
667 | db 1,5,6,00011000b, 1,6,2,00011000b ;soft-lime side |
||
668 | db 4,0,3,11100001b, 4,3,7,11100001b ;soft-blue side |
||
669 | db 4,5,1,00011111b, 1,0,4,00011111b ;yellow side |
||
670 | db 3,2,6,00000000b, 3,6,7,00000000b ;black side |
||
671 | |||
672 | sin_table: |
||
673 | rw 512 |
||
674 | cos_table: |
||
675 | rw 512 |
||
676 | |||
677 | object_rotated: |
||
678 | rw MAX_POINTS*3 |
||
679 | object_translated: |
||
680 | rw MAX_POINTS*2 |
||
681 | |||
682 | scrbuf: |
||
683 | I_END: |