Subversion Repositories Kolibri OS

Rev

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

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