Subversion Repositories Kolibri OS

Rev

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

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