Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | 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     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:
  334.