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