Subversion Repositories Kolibri OS

Rev

Rev 180 | Rev 316 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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