Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;; SYSTEM ;;;;;;;;;;;;;;;;;;;;;
  2.  
  3. ; menuet interrupt: eax, ebx, ecx, edx
  4.  
  5. macro mint a, b, c, d {
  6.  IF ~a eq
  7.   . r0=a
  8.  END IF
  9.  IF ~b eq
  10.   . r3=b
  11.  END IF
  12.  IF ~c eq
  13.   . r1=c
  14.  END IF
  15.  IF ~d eq
  16.   . r2=d
  17.  END IF
  18.  db 0CDh, 40h
  19. }
  20.  
  21. ; events
  22.  
  23. EVENT.REDRAW=1
  24. EVENT.KEY=2
  25. EVENT.BUTTON=3
  26.  
  27. align
  28. integer timer.speed=-1,\
  29.  timer.counter, event.delay=1
  30.  
  31. macro set.timer n {
  32.   . r0=n, r1=10, r0/r1
  33.   . timer.speed=r0, timer.counter=r0
  34. }
  35.  
  36. macro get.timer { mint 26, 9 }
  37.  
  38. macro delay x {
  39.   . r0=x, r0/100, r3=r0
  40.   mint 5
  41. }
  42.  
  43. macro wait.event { mint 23, event.delay }
  44.  
  45. ;;;;;;;;;;;;;;;;;;;;; WINDOW ;;;;;;;;;;;;;;;;;;;;;
  46.  
  47. function draw.window
  48.   . r2=0, r6=0, r7=0FFFFFFh
  49.   . r3=WINDOW.X, r3<<16, r3|screen.w
  50.   . r1=WINDOW.Y, r1<<16, r1|screen.h
  51.   mint 0
  52. endf
  53.  
  54. macro draw.begin { mint 12, 1 }
  55. macro draw.end   { mint 12, 2 }
  56. macro render     { call !on.draw } ; mint 15, 3
  57. macro retrace    { mint 18, 14 }
  58.  
  59. ;;;;;;;;;;;;;;;;;;;;; INPUT ;;;;;;;;;;;;;;;;;;;;;;
  60.  
  61. align 4
  62.  
  63. align
  64. integer event.type
  65.  
  66. integer key, old.key, key.event
  67. text keys.t(128)
  68.  
  69. numeric KEY.ESCAPE=27, KEY.SPACE=' ',\
  70.  KEY.UP=0B2h, KEY.RIGHT=0B3h, KEY.DOWN=0B1h,\
  71.  KEY.LEFT=0B0h, KEY.A='a', KEY.S='s',\
  72.  KEY.D='d', KEY.W='w'
  73.  
  74. macro get.key.buffer { mint 26, 2, 1, keys.t }
  75.  
  76. integer mouse.event,\
  77.  mouse.1, mouse.2, mouse.x, mouse.y,\
  78.  mouse.drag, mouse.drag.x, mouse.drag.y,\
  79.  mouse.drop, mouse.drop.x, mouse.drop.y,\
  80.  old.mouse.1, old.mouse.2,\
  81.  old.mouse.x, old.mouse.y
  82.  
  83. macro get.mouse.xy      { mint 37, 0 }
  84. macro get.mouse.buttons { mint 37, 2 }
  85. macro get.mouse.wheel   { mint 37, 3 }
  86.  
  87. function update.mouse
  88.   . mouse.event=0
  89.   . old.mouse.1=mouse.1, old.mouse.2=mouse.2
  90.   . old.mouse.x=mouse.x, old.mouse.y=mouse.y
  91.  
  92.   get.mouse.xy
  93.   . r1=r0, r1&0FFFFh, r0>>>16, r0&0FFFFh
  94.   . mouse.x=r0, mouse.y=r1
  95.   get.mouse.buttons
  96.   . r1=r0, r1&1, mouse.1=r1
  97.   . r1=r0, r1&2, mouse.2=r1
  98.  
  99.   if mouse.1
  100.     if not old.mouse.1, mouse.event='c'
  101.       . mouse.drop=NO
  102.       callf on.mouse
  103.       return 1
  104.     end
  105.   else.if old.mouse.1, mouse.event='r'
  106.     callf on.mouse
  107.     if mouse.drag
  108.       . mouse.drop=YES,\
  109.       mouse.drop.x=mouse.x,\
  110.       mouse.drop.y=mouse.y,\
  111.       mouse.drag=NO
  112.       . mouse.event='d'
  113.       callf on.mouse
  114.     end
  115.     return 1
  116.   end
  117.   . r0=mouse.x, r1=old.mouse.x
  118.   if r0<>r1
  119.     .mouse.move:
  120.     . mouse.event='m'
  121.     callf on.mouse
  122.     if mouse.1
  123.       if not mouse.drag
  124.         . mouse.drag=YES,\
  125.         mouse.drag.x=mouse.x,\
  126.         mouse.drag.y=mouse.y
  127.       end
  128.     else
  129.       . mouse.drop=NO
  130.     end
  131.     return 1
  132.   else
  133.     . r0=mouse.y, r1=old.mouse.y
  134.     if r0<>r1
  135.       go .mouse.move
  136.     end
  137.   end
  138. endf 0
  139.  
  140.  function select.box, box
  141.   . r0=mouse.x, r1=mouse.y
  142.   . r0-WINDOW.X, r1-WINDOW.Y
  143.   callf point.inside, box, r0, r1
  144. endf
  145.  
  146. macro if.select box { !if select.box, box }
  147. macro else.if.select box
  148.  { !else.if select.box, box }
  149.  
  150. ;;;;;;;;;;;;;;;;;;;;; RANDOM ;;;;;;;;;;;;;;;;;;;;;
  151.  
  152. align integer @seed
  153.  
  154. ; generate unique random number: 0-n
  155.  
  156. function random, n
  157.   . r0=@seed
  158.   if false
  159.     rdtsc
  160.     . @seed=r0
  161.   end
  162.   . r0*343FDh, r0+269EC3h,\
  163.   @seed=r0, r0>>16, r0&7FFFh,\
  164.   r1=n, r1+1, r0/r1, r0=r2
  165. endf
  166.  
  167. ; random(from-to-2)+from
  168.  
  169. function random.x, from, to
  170.   . r0=from, r0-to, r0-2
  171.   random r0
  172.   . r0+from
  173. endf
  174.  
  175. ;;;;;;;;;;;;;;;;;;;;;; MAIN ;;;;;;;;;;;;;;;;;;;;;;
  176.  
  177. ; main entry. detect current input states,
  178. ; translate and redirect to on.event handlers.
  179.  
  180. ; drawing has slight flicker. no double
  181. ; buffer yet. kolibri only supports misaligned
  182. ; 24BPP images :( images should be stored in
  183. ; memory as 1-8BPP or 16/32BPP for fast access
  184.  
  185. !main:
  186.   callf set.screen,\
  187.    SCREEN.W, SCREEN.H, SCREEN.BPP
  188.   callf on.create
  189.  
  190.   get.event:
  191.   wait.event
  192.   . event.type=r0
  193.  
  194.   update.mouse
  195.  
  196.   if timer.speed<>-1
  197.     . timer.counter--
  198.     if timer.counter<=0
  199.       . timer.counter=timer.speed
  200.       callf on.timer
  201.     end
  202.   end
  203.  
  204.   if event.type=EVENT.REDRAW
  205. ;    draw.begin
  206.     callf draw.window
  207.     callf on.draw
  208. ;    draw.end
  209. ;    retrace ; ?
  210.  
  211.   else.if event.type=EVENT.KEY
  212.     mint 2
  213.     if r0<>1, r0>>8, r0&0FFh, key=r0
  214.       . key.event='k'
  215.       callf on.key
  216.       . key.event='c'
  217.       callf on.key
  218.       if key=KEY.ESCAPE
  219.         callf exit
  220.       end
  221.     end
  222.  
  223.   else.if event.type=EVENT.BUTTON
  224.     callf exit
  225.   end
  226. go get.event
  227.  
  228. function exit
  229.   callf on.exit
  230.   mint -1
  231. endf