Subversion Repositories Kolibri OS

Rev

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: