Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ;    FIRE for MENUET  - Compile with FASM
  3. ;
  4.  
  5. use32
  6.  
  7.            org     0x0
  8.            db      'MENUET00'           ; 8 byte id
  9.            dd      38                   ; required os
  10.            dd      START                ; program start
  11.            dd      I_END                ; image size
  12.            dd      0x80000               ; reguired amount of memory
  13.            dd      0x80000
  14.            dd      0x00000000           ; reserved=no extended header
  15.  
  16. include 'lang.inc'
  17. include 'macros.inc'
  18.  
  19. START:
  20.  
  21.     call draw_window
  22.  
  23.     mov  edi,0x40000
  24.     mov  ecx,320*600+100
  25.     mov  eax,0
  26.     cld
  27.     rep  stosb
  28.  
  29. sta:                                         ; calculate fire image
  30.  
  31.     mov  esi, FireScreen
  32.     add  esi, 0x2300
  33.     sub  esi, 80
  34.     mov  ecx, 80
  35.     xor  edx, edx
  36.  
  37.   NEWLINE:
  38.  
  39.     mov  eax,dword [FireSeed]                ; New number
  40.     mov  edx, 0x8405
  41.     mul  edx
  42.     inc  eax
  43.     mov  dword [FireSeed], eax               ; Store seed
  44.  
  45.     mov  [esi], dl
  46.     inc  esi
  47.     dec  ecx
  48.     jnz  NEWLINE
  49.  
  50.     mov  ecx, 0x2300
  51.     sub  ecx, 80
  52.     mov  esi, FireScreen
  53.     add  esi, 80
  54.  
  55.   FIRELOOP:
  56.  
  57.     xor  eax,eax
  58.  
  59.     cmp  [type],0
  60.     jnz  notype1
  61.     mov  al, [esi]
  62.     add  al, [esi + 2]
  63.     adc  ah, 0
  64.     add  al, [esi + 1]
  65.     adc  ah, 0
  66.     add  al, [esi + 81]
  67.     adc  ah, 0
  68.   notype1:
  69.  
  70.     cmp  [type],1
  71.     jnz  notype2
  72.     mov  al, [esi]
  73.     add  al, [esi - 1]
  74.     adc  ah, 0
  75.     add  al, [esi - 1]
  76.     adc  ah, 0
  77.     add  al, [esi + 79]
  78.     adc  ah,0
  79.   notype2:
  80.  
  81.     cmp  [type],2
  82.     jnz  notype3
  83.     mov  al, [esi]
  84.     add  al, [esi - 1]
  85.     adc  ah,0
  86.     add  al, [esi + 1]
  87.     adc  ah, 0
  88.     add  al, [esi + 81]
  89.     adc  ah,0
  90.   notype3:
  91.  
  92.     shr  eax, 2
  93.     jz   ZERO
  94.     dec  eax
  95.  
  96.   ZERO:
  97.  
  98.     mov  [esi - 80], al
  99.     inc  esi
  100.     dec  ecx
  101.     jnz  FIRELOOP
  102.  
  103.     pusha
  104.  
  105.     mov  eax,5
  106.     mov  ebx,[delay]
  107.     int  0x40
  108.  
  109.     mov  al,byte [calc]
  110.     inc  al
  111.     mov  byte [calc],al
  112.     cmp  al,byte 2
  113.     jz   pdraw
  114.  
  115.     jmp  nodrw
  116.  
  117.   pdraw:
  118.  
  119.     mov  byte [calc],byte 0
  120.  
  121.     mov  edi,0x40000
  122.     add  edi,[fcolor]
  123.     mov  esi,FireScreen
  124.     xor  edx,edx
  125.  
  126.   newc:
  127.  
  128.     movzx eax,byte [esi]
  129.     mov   ebx,eax
  130.     mov   ecx,eax
  131.     shl   ax,8
  132.     shr   bx,1
  133.     mov   al,bl
  134.     add   ecx,eax
  135.     shl   ax,8
  136.     mov   ch,ah
  137.  
  138.     mov  [edi+0],cx
  139.     mov  [edi+3],cx
  140.     mov  [edi+6],cx
  141.     mov  [edi+9],cx
  142.     mov  [edi+0+320*3],cx
  143.     mov  [edi+3+320*3],cx
  144.     mov  [edi+6+320*3],cx
  145.     mov  [edi+9+320*3],cx
  146.  
  147.     add  edi,12
  148.     inc  edx
  149.     cmp  edx,80
  150.     jnz  nnl
  151.     xor  edx,edx
  152.     add  edi,320*3
  153.   nnl:
  154.     inc  esi
  155.     cmp  esi,FireScreen+0x2000
  156.     jnz  newc
  157.  
  158.     mov  eax,dword 0x00000007           ; display image
  159.     mov  ebx,0x40000
  160.     mov  ecx,4*80*65536+200
  161.     mov  edx,1*65536+22
  162.     int  0x40
  163.  
  164.   nodrw:
  165.  
  166.     popa
  167.  
  168.     mov  eax,11                  ; check if os wants to talk to us
  169.     int  0x40
  170.     cmp  eax,1
  171.     jz   red
  172.     cmp  eax,3
  173.     jz   button
  174.  
  175.     jmp  sta
  176.  
  177.   red:                           ; draw window
  178.     call draw_window
  179.     jmp  sta
  180.  
  181.   button:                        ; get button id
  182.     mov  eax,17
  183.     int  0x40
  184.  
  185.     cmp  ah,1
  186.     jnz  noclose
  187.     mov  eax,-1                  ; close this program
  188.     int  0x40
  189.   noclose:
  190.  
  191.     cmp  ah,2                    ; change fire type
  192.     jnz  nob2
  193.     mov  eax,[type]
  194.     add  eax,1
  195.     and  eax,1
  196.     mov  [type],eax
  197.    nob2:
  198.  
  199.     cmp  ah,3                    ; change delay
  200.     jnz  nob3
  201.     mov  eax,[delay]
  202.     sub  eax,1
  203.     and  eax,1
  204.     mov  [delay],eax
  205.   nob3:
  206.  
  207.     cmp  ah,4                    ; change color
  208.     jnz  nob4
  209.     mov  eax,[fcolor]
  210.     add  eax,1
  211.     cmp  eax,2
  212.     jbe  fcok
  213.     mov  eax,0
  214.   fcok:
  215.     mov  [fcolor],eax
  216.     mov  eax,0
  217.     mov  ecx,0x10000
  218.     mov  edi,0x40000
  219.     cld
  220.     rep  stosd
  221.  
  222.   nob4:
  223.  
  224.     jmp  sta
  225.  
  226.  
  227.  
  228. ; ************************************************
  229. ; ********* WINDOW DEFINITIONS AND DRAW **********
  230. ; ************************************************
  231.  
  232.  
  233. draw_window:
  234.  
  235.     pusha
  236.  
  237.     mov  eax,12                    ; tell os about redraw
  238.     mov  ebx,1
  239.     int  0x40
  240.  
  241.     mov  eax,0                     ; define and draw window
  242.     mov  ebx,100*65536+321
  243.     mov  ecx,70*65536+222
  244.     mov  edx,0x00000000
  245.     mov  esi,0x00000000
  246.     mov  edi,0x00000000
  247.     int  0x40
  248.  
  249.     mov  eax,dword 0x00000004      ; 'FIRE FOR MENUET'
  250.     mov  ebx,110*65536+8
  251.     mov  ecx,dword 0x00FFFFFF
  252.     mov  edx,text
  253.     mov  esi,textlen-text
  254.     int  0x40
  255.  
  256.     mov  eax,8
  257.     mov  ebx,(321-19)*65536+12     ; button start x & size
  258.     mov  ecx,5*65536+12            ; button start y & size
  259.     mov  edx,1                     ; button number
  260.     mov  esi,0x009a0000
  261.     int  0x40
  262.  
  263.     mov  eax,8
  264.     mov  ebx,5*65536+12
  265.     mov  ecx,5*65536+12
  266.     mov  edx,2
  267.     int  0x40
  268.  
  269.     mov  eax,8
  270.     mov  ebx,18*65536+12
  271.     mov  ecx,5*65536+12
  272.     mov  edx,3
  273.     int  0x40
  274.  
  275.     mov  eax,8
  276.     mov  ebx,31*65536+12
  277.     mov  ecx,5*65536+12
  278.     mov  edx,4
  279.     int  0x40
  280.  
  281.     mov  eax,12                    ; tell os about redraw end
  282.     mov  ebx,2
  283.     int  0x40
  284.  
  285.     popa
  286.  
  287.     ret
  288.  
  289.  
  290. ; DATA SECTION
  291.  
  292. calc      dd  0
  293. fcolor    dd  2
  294. xx        db  'x'
  295. type      dd  0
  296. delay     dd  0
  297. FireSeed  dd  0x1234
  298. text:     db 'FIRE FOR MENUET'
  299. textlen:
  300.  
  301. FireScreen:
  302.  
  303. I_END:
  304.  
  305.  
  306.  
  307.