Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
;
2
; TRIANGLE SPEED TEST 3
3
; 32 triangle draw use! 12300 triangle in sec on 800Mhz processor
4
;
5
; Pavlushin Evgeni 11.09.2004
6
; mail: waptap@mail.ru       site: www.deck4.narod.ru
7
;                                www.cyberdeck.fatal.ru
8
 
9
use32
10
               org     0x0
11
               db     'MENUET01'              ; 8 byte id
12
               dd     0x01                    ; header version
13
               dd     START                   ; start of code
14
               dd     I_END                   ; size of image
15
               dd     0x2000000                 ; memory for app
16
               dd     0x2000000                ; esp
17
               dd     0x0 , 0x0               ; I_Param , I_Icon
18
 
19
SCREEN_X equ 320 ;800
20
SCREEN_Y equ 200 ;600
21
 
22
include 'lang.inc'
23
include 'ascl.inc'
24
include 'ascgl.inc'
25
 
26
START:
27
    call draw_window
28
 
29
still:
30
    scevent red,key,button
31
    fps  280,8,cl_White,cl_Black
32
 
33
main_loop:
34
     random SCREEN_X,eax
35
     mov [@@tx1],eax
36
     random SCREEN_Y,eax
37
     mov [@@ty1],eax
38
     random SCREEN_X,eax
39
     mov [@@tx2],eax
40
     random SCREEN_Y,eax
41
     mov [@@ty2],eax
42
     random SCREEN_X,eax
43
     mov [@@tx3],eax
44
     random SCREEN_Y,eax
45
     mov [@@ty3],eax
46
 
47
     random 255,eax
48
     mov byte [@@rgb],al
49
     random 255,eax
50
     mov byte [@@rgb+1],al
51
     random 255,eax
52
     mov byte [@@rgb+2],al
53
     pushad
54
     call filled_triangle
55
     popad
56
 
57
     dec [count]  ;for max speed
58
     jnz xxx
59
     call outscr
60
     mov [count],100
61
xxx:
62
     jmp still
63
 
64
count dd 100
65
 
66
red:
67
     call draw_window
68
     jmp still
69
key:
70
     mov eax,2
71
     int 0x40
72
     jmp still
73
button:
74
     mov eax,17
75
     int 0x40
76
     cmp ah,1
77
     jne still
78
exit:
79
     mov eax,-1
80
     int 0x40
81
 
82
;Draw window
83
draw_window:
84
    mov eax,12  ;Start
85
    mov ebx,1
86
    int 0x40
87
 
88
    mov eax,0   ;Draw window
89
    mov ebx,100*65536+(SCREEN_X+9) ;x start*65536+x size
90
    mov ecx,100*65536+(SCREEN_Y+26) ;y start*65536+y size
91
    mov edx,0x03000000         ;0x03 use skinned window
92
    int 0x40
93
 
94
    mov eax,4   ;Out Text
95
    mov ebx,8*65536+8          ;x start*65536+y start
96
    mov ecx,0x00ffffff         ;color White
97
    mov edx,head_label
98
    mov esi,hl_end-head_label
99
    int 0x40
100
 
101
    mov eax,12  ;End
102
    mov ebx,2
103
    int 0x40
104
    ret
105
 
106
head_label: db "3D TEST SAMPLE FOR MENUETOS"
107
hl_end:
108
 
109
outscr:
110
 
111
;outscrbuf
112
 mov ebx,scrbuf
113
 mov ecx,SCREEN_X*65536+SCREEN_Y
114
 mov edx,5*65536+22
115
 mov ax,7
116
 int 0x40
117
 
118
	ret
119
 
120
;filled trangle 32 bit draw procedure
121
;from NAAG3d demo
122
 
123
@@tx1  dd 0
124
@@ty1  dd 0
125
@@tx2  dd 0
126
@@ty2  dd 0
127
@@tx3  dd 0
128
@@ty3  dd 0
129
@@rgb  dd 0
130
 
131
@@dx12 dd 0
132
@@dx13 dd 0
133
@@dx23 dd 0
134
 
135
filled_triangle:
136
	mov eax,[@@ty1]
137
	cmp eax,[@@ty3]
138
	jle @@ok13
139
 
140
	xchg eax,[@@ty3]
141
	mov [@@ty1],eax
142
 
143
	mov eax,[@@tx1]
144
	xchg eax,[@@tx3]
145
	mov [@@tx1],eax
146
@@ok13:
147
	mov eax,[@@ty2]
148
	cmp eax,[@@ty3]
149
	jle @@ok23
150
 
151
	xchg eax,[@@ty3]
152
	mov [@@ty2],eax
153
 
154
	mov eax,[@@tx2]
155
	xchg eax,[@@tx3]
156
	mov [@@tx2],eax
157
@@ok23:
158
	mov eax,[@@ty1]
159
	cmp eax,[@@ty2]
160
	jle @@ok12
161
 
162
	xchg eax,[@@ty2]
163
	mov [@@ty1],eax
164
 
165
	mov eax,[@@tx1]
166
	xchg eax,[@@tx2]
167
	mov [@@tx1],eax
168
@@ok12:
169
 
170
	mov ebx,[@@ty2]
171
	sub ebx,[@@ty1]
172
	jnz @@make_d12
173
 
174
	mov [@@dx12],dword 0
175
	jmp @@done_d12
176
@@make_d12:
177
	mov eax,[@@tx2]
178
	sub eax,[@@tx1]
179
	shl eax,12 ;7
180
	cdq
181
	idiv ebx
182
	mov [@@dx12],eax			; dx12 = (x2-x1)/(y2-y1)
183
@@done_d12:
184
 
185
	mov ebx,[@@ty3]
186
	sub ebx,[@@ty1]
187
	jnz @@make_d13
188
 
189
	mov [@@dx13],dword 0
190
	jmp @@done_d13
191
@@make_d13:
192
	mov eax,[@@tx3]
193
	sub eax,[@@tx1]
194
	shl eax,12 ;7
195
	cdq
196
	idiv ebx
197
	mov [@@dx13],eax			; dx13 = (x3-x1)/(y3-y1)
198
@@done_d13:
199
 
200
	mov ebx,[@@ty3]
201
	sub ebx,[@@ty2]
202
	jnz @@make_d23
203
 
204
	mov [@@dx23],dword 0
205
	jmp @@done_d23
206
@@make_d23:
207
	mov eax,[@@tx3]
208
	sub eax,[@@tx2]
209
	shl eax,12 ;7
210
	cdq
211
	idiv ebx
212
	mov [@@dx23],eax			; dx23 = (x3-x2)/(y3-y2)
213
@@done_d23:
214
 
215
	mov eax,[@@tx1]
216
	shl eax,12 ;7
217
	mov ebx,eax
218
 
219
	mov ecx,[@@ty1]
220
 cmp ecx,[@@ty2]
221
 jge @@end_loop12
222
 
223
@@loop12:
224
 
225
 call flat_line
226
 
227
	add eax,[@@dx13]
228
	add ebx,[@@dx12]
229
	inc ecx
230
	cmp ecx,[@@ty2]
231
	jl  @@loop12
232
@@end_loop12:
233
 
234
 mov ecx,[@@ty2]
235
 cmp ecx,[@@ty3]
236
 jge @@end_loop23
237
 
238
	mov ebx,[@@tx2]
239
	shl ebx,12 ;7
240
@@loop23:
241
 
242
 call flat_line
243
 
244
	add eax,[@@dx13]
245
	add ebx,[@@dx23]
246
	inc ecx
247
	cmp ecx,[@@ty3]
248
	jl  @@loop23
249
@@end_loop23:
250
 
251
	ret
252
 
253
;flatline proc
254
 
255
flat_line:
256
 push eax
257
 push ebx
258
 push ecx
259
 
260
 or ecx,ecx
261
 jl @@quit
262
 cmp ecx,SCREEN_Y-1 ;199
263
 jg @@quit
264
 
265
 sar eax,12
266
 sar ebx,12
267
 
268
 or eax,eax
269
 jge @@ok1
270
 xor eax,eax
271
 jmp @@ok2
272
@@ok1:
273
 cmp eax,SCREEN_X-1 ;319
274
 jle @@ok2
275
 mov eax,SCREEN_X-1 ;319
276
@@ok2:
277
 or ebx,ebx
278
 jge @@ok3
279
 xor ebx,ebx
280
 jmp @@ok4
281
@@ok3:
282
 cmp ebx,SCREEN_X-1 ;319
283
 jle @@ok4
284
 mov ebx,SCREEN_X-1 ;319
285
@@ok4:
286
 cmp eax,ebx
287
 jl @@ok
288
 je @@quit
289
 
290
 xchg eax,ebx
291
@@ok:
292
 mov edi,ecx
293
 
294
; shl edi,6    ;for 320 speed+
295
; shl ecx,8
296
; add edi,ecx
297
 
298
 push eax
299
 mov eax,SCREEN_X
300
 mul edi
301
 mov edi,eax
302
 pop eax
303
 
304
 add edi,eax
305
 
306
 mov ebp,edi
307
 shl ebp,1
308
 add edi,ebp
309
 
310
 add edi,scrbuf
311
 
312
 mov ecx,ebx
313
 sub ecx,eax
314
 
315
lineout:
316
 mov eax,[@@rgb]
317
 mov byte [edi],al
318
 shr eax,8
319
 mov byte [edi+1],al
320
 shr eax,8
321
 mov byte [edi+2],al
322
 add edi,3
323
 dec ecx
324
 jnz lineout
325
 
326
@@quit:
327
 pop ecx
328
 pop ebx
329
 pop eax
330
 ret
331
 
332
scrbuf:
333
I_END: