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