Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ;   application : WAVED 3D FORM SIN(SQRT(x*x+y*y))
  3. ;   author      : macgub
  4. ;   email       : macgub3@wp.pl
  5. ;   system      : MenuetOS
  6. ;   compiler    : fasm
  7. ;
  8. ;
  9. TIMEOUT EQU 2
  10. use32
  11.  
  12.                org    0x0
  13.  
  14.                db     'MENUET01'              ; 8 byte id
  15.                dd     0x01                    ; header version
  16.                dd     START                   ; start of code
  17.                dd     I_END                   ; size of image
  18.                dd     0x100000                ; memory for app
  19.                dd     0x7fff0                 ; esp
  20.                dd     0x0 , 0x0               ; I_Param , I_Icon
  21.  
  22. START:                          ; start of execution
  23.  
  24.      call draw_window
  25.  
  26. still:
  27.  
  28.     mov  eax,23                 ; wait here for event
  29.     mov  ebx,TIMEOUT
  30.     int  0x40
  31.  
  32.     cmp  eax,1                  ; redraw request ?
  33.     je   red
  34.     cmp  eax,2                  ; key in buffer ?
  35.     je   key
  36.     cmp  eax,3                  ; button in buffer ?
  37.     je   button
  38.  
  39.     jmp  noclose
  40.  
  41.   red:                          ; redraw
  42.     call draw_window
  43.     jmp  still
  44.  
  45.   key:                          ; key
  46.     mov  eax,2                  ; just read it and ignore
  47.     int  0x40
  48.     jmp  still
  49.  
  50.   button:                       ; button
  51.     mov  eax,17                 ; get id
  52.     int  0x40
  53.  
  54.     cmp  ah,1                   ; button id=1 ?
  55.     jne  noclose
  56.  
  57.     mov  eax,-1                 ; close this program
  58.     int  0x40
  59.   noclose:
  60.  
  61.     call calc_deg
  62.  
  63. ;    mov eax,13    ;clear screen
  64. ;    mov ebx,5*65536 + 517
  65. ;    mov ecx,20*65536 + 345
  66. ;    xor edx,edx
  67. ;    int 0x40
  68.  
  69.     mov edi,the_mem        ;clear buffer
  70.     mov ecx,512*384*3/4
  71.     xor eax,eax
  72.     cld
  73.     rep stosd
  74.  
  75.     mov eax,1    ;main loop
  76.     oop:
  77.     mov ebx,1
  78.     oop1:
  79.      push eax
  80.      push ebx
  81.      mov [x],eax
  82.      mov [z],ebx
  83.      call fun
  84.      add [y],260
  85.      add [x],40
  86.      call rotateY
  87.      call put3dpixel
  88.      pop ebx
  89.      pop eax
  90.     add ebx,4
  91.     cmp ebx,201
  92.     jne oop1
  93.     inc eax
  94.     cmp eax,300
  95.     jne oop
  96.  
  97.     mov eax,7    ;put image
  98.     mov ebx,the_mem
  99.     mov ecx,512*65536+384
  100.     mov edx,0
  101.     int 0x40
  102.  
  103.     jmp  still
  104. ;-------------------PROCEDURES-------------------------------
  105. calc_deg:
  106.  cmp [deg_counter], 360
  107.  jne go_deg
  108.  mov [deg_counter],0
  109.  go_deg:
  110.  fldpi
  111.  fidiv [deg_div]
  112.  fimul [deg_counter]
  113.  fst [current_deg]
  114.  fsincos
  115.  fstp [cosbeta]
  116.  fstp [sinbeta]
  117.  inc [deg_counter]
  118.  ret
  119. ;-----------------
  120. rotateY:
  121.  mov eax,[z]
  122.  sub eax,[zo]
  123.  mov [subz],eax
  124.  mov eax,[x]
  125.  sub eax,[xo]
  126.  mov [subx],eax
  127.  
  128.  fld [sinbeta]
  129.  fimul [subz]
  130.  fchs
  131.  fld [cosbeta]
  132.  fimul[subx]
  133.  faddp
  134.  fiadd [xo]
  135.  fistp [x]
  136.  
  137.  fld [sinbeta]
  138.  fimul [subx]
  139.  fld [cosbeta]
  140.  fimul [subz]
  141.  faddp
  142.  fiadd [zo]
  143.  fistp [z]
  144.  ret
  145. ;-----------------------------
  146. fun:
  147.  finit
  148.  fild [x]
  149.  fisub [i150]
  150.  fidiv [xdiv]
  151.  fmul st,st0
  152.  fld st0
  153.  fild [z]
  154.  fisub [i100]
  155.  fidiv [zdiv]
  156.  fmul st,st0
  157.  faddp
  158.  fsqrt
  159.  
  160.  fld [current_deg]
  161.  fimul [cur_deg_mul]
  162.  faddp
  163.  fsin
  164.  fimul [ymul]
  165.  fistp [y]
  166.  ret
  167. ;--------------------------
  168. put3dpixel:
  169.  fild [z]
  170.  fmul [sq]
  171.  fchs
  172.  fiadd [y]
  173.  fistp [y]
  174.  fild [z]
  175.  fmul [sq]
  176.  fiadd [x]
  177.  fistp [x]
  178.  ;mov eax,1
  179.  ;mov ebx,[x]
  180.  ;mov ecx,[y]
  181.  ;mov edx,[col]
  182.  ;int 0x40
  183.  mov eax,[y]    ; calculating pixel position in buffer
  184.  dec eax
  185.  shl eax,9
  186.  add eax,[x]
  187.  mov ebx,eax
  188.  shl eax,1
  189.  add eax,ebx
  190.  add eax,the_mem
  191.  mov ebx,[col]
  192.  or [eax],ebx
  193.  ret
  194.  
  195. ;   *********************************************
  196. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  197. ;   *********************************************
  198.  
  199.  
  200. draw_window:
  201.  
  202.  
  203.     mov  eax,12                    ; function 12:tell os about windowdraw
  204.     mov  ebx,1                     ; 1, start of draw
  205.     int  0x40
  206.  
  207.         mov  eax,48
  208.         mov  ebx,4
  209.         int  0x40
  210.         mov  esi, eax
  211.                                    ; DRAW WINDOW
  212.     mov  eax,0                     ; function 0 : define and draw window
  213.     mov  ebx,100*65536+512+9         ; [x start] *65536 + [x size]
  214.     mov  ecx,100*65536+384+4         ; [y start] *65536 + [y size]
  215.         add  ecx, esi
  216.         mov  edx,0x74000000                ; color of work area RRGGBB,8->color gl
  217.     mov  edi,labelt
  218.         int  0x40
  219.  
  220.     mov  eax,12                    ; function 12:tell os about windowdraw
  221.     mov  ebx,2                     ; 2, end of draw
  222.     int  0x40
  223.  
  224.     ret
  225.  
  226. ; DATA AREA
  227. deg_div dd 90
  228. deg_counter dd ?
  229. col dd 0x00ffffff
  230. sq dd 0.707    ;sin pi/4
  231. cosbeta dd ?
  232. sinbeta dd ?
  233. x dd ?
  234. y dd ?
  235. z dd ?
  236. xo dd 200           ;axle variables
  237. ;yo dd 110
  238. zo dd 80
  239. xdiv dd 20
  240. zdiv dd 20
  241. ymul dd 20
  242. subx dd ?
  243. ;suby dd ?
  244. subz dd ?
  245. current_deg dd ? ;real
  246. cur_deg_mul dd 12
  247. i100 dd 100
  248. i150 dd 150
  249. labelt:
  250.      db   'Waved 3d form',0
  251. the_mem:
  252. I_END:
  253.  
  254.  
  255.  
  256.  
  257.