;
;    FIRE for MENUET  - Compile with FASM
;

use32

           org     0x0
           db      'MENUET01'           ; 8 byte id
           dd      1                    ; header version
           dd      START                ; program start
           dd      I_END                ; image size
           dd      mem_end              ; reguired amount of memory
           dd      mem_end
           dd      0,0                  ; no parameters, no path

include '..\..\..\macros.inc'

START:

red:

; ************************************************
; ********* WINDOW DEFINITIONS AND DRAW **********
; ************************************************

draw_window:

    mov  eax,12                    ; tell os about redraw
    mov  ebx,1
    mcall

    xor  eax,eax                   ; define and draw window
    mov  ebx,100*65536+321
    mov  ecx,70*65536+222
    mov  edx,0x00000000
    mov  esi,0x00000000
    mov  edi,0x00000000
    mcall

    mov  al,4      ; 'FIRE FOR MENUET'
    mov  ebx,110*65536+8
    mov  ecx,dword 0x00FFFFFF
    mov  edx,text
    mov  esi,textlen-text
    mcall

    mov  al,8
    mov  ebx,(321-19)*65536+12     ; button start x & size
    mov  ecx,5*65536+12            ; button start y & size
    mov  edx,1                     ; button number
    mov  esi,0x009a0000
    mcall

    mov  ebx,ecx ;5*65536+12
    inc  edx
    mcall

    mov  ebx,18*65536+12
    inc  edx
    mcall

    mov  ebx,31*65536+12
    inc  edx
    mcall

    mov  al,12                    ; tell os about redraw end
    mov  ebx,2
    mcall

sta:                                         ; calculate fire image

    mov  esi, FireScreen+0x2300-80
    mov  ecx, 80
    mov  eax, [FireSeed]

  NEWLINE:

    mul  [RandSeedConst]
    inc  eax
    mov  [esi], dl
    inc  esi
    loop NEWLINE

    mov  [FireSeed], eax

    mov  ecx, 0x2300-80
    sub  esi, ecx
    xor  edx, edx
    xor  eax, eax

  FIRELOOP:
    lodsb

    cmp  [type], ah
    jnz  notype1
    mov  dl, [esi + 1]
    add  eax, edx
    mov  dl, [esi]
    add  eax, edx
    mov  dl, [esi + 80]
    jmp  typedone
  notype1:

;    cmp  [type],1
;    jnz  notype2
    mov  dl, [esi - 2]
;    add  eax, edx
;    mov  dl, [esi - 2]
;    add  eax, edx
    lea  eax, [eax + edx*2]
    mov  dl, [esi + 78]
;  notype2:

; type 2 is never used
;    cmp  [type],2
;    jnz  notype3
;    mov  dl, [esi - 2]
;    add  eax, edx
;    mov  dl, [esi]
;    add  eax, edx
;    mov  dl, [esi + 80]
;  notype3:

typedone:
    add  eax, edx
    shr  eax, 2
    jz   ZERO
    dec  eax

  ZERO:

    mov  [esi - 81], al
    loop FIRELOOP

    mov  al, 5              ; in this moment always high 24 bits of eax are zero!
    mov  ebx,[delay]
    mcall

    inc  [calc]
    cmp  [calc], byte 2
    jnz  nodrw

  pdraw:

    mov  byte [calc],ah ;byte 0

    mov  edi,ImageData
    push edi     ; pointer for sysfunction 7, draw image
    add  edi,[fcolor]
    mov  esi,FireScreen
    xor  edx,edx

  newc:
    xor   eax, eax
    lodsb

    mov   ecx,eax
    shr   eax,1
    add   cl,al
    mov   ch,al

    mov  [edi+0],ecx
    mov  [edi+3],ecx
    mov  [edi+6],ecx
    mov  [edi+9],cx
    lea  ebx, [edi+320*3]
    mov  [ebx+0],ecx
    mov  [ebx+3],ecx
    mov  [ebx+6],ecx
    mov  [ebx+9],ecx

    add  edi,12
    inc  edx
    cmp  edx,80
    jnz  nnl
    xor  edx,edx
    add  edi,320*3
  nnl:
    cmp  esi,FireScreen+8000; 0x2000
    jnz  newc

    mov  al,7           ; display image
                        ; high 24 bits of eax are zero!
    pop  ebx
    mov  ecx,4*80*65536+200
    mov  edx,1*65536+22
    mcall

  nodrw:

    mov  eax,11                  ; check if os wants to talk to us
    mcall
    dec  eax
    jz   red
    cmp  al, 3-1
    jnz  nob4

  button:                        ; get button id
    mov  al,17
    mcall
    shr  eax, 8

    dec  eax
    jnz  noclose
    or   eax,-1                  ; close this program
    mcall
  noclose:

    dec  eax                     ; change fire type
    jnz  nob2
    xor  [type], 1
   nob2:

    dec  eax                     ; change delay
    jnz  nob3
    xor  [delay], 1
  nob3:

    dec  eax                     ; change color
    jnz  nob4
    mov  eax,[fcolor]
    inc  eax
;    cmp  al,2
;    jbe  fcok
    jnp  fcok
    xor  eax,eax
  fcok:
    mov  [fcolor],eax
    mov  edi,ImageData
    mov  ecx,(320*600)/4
    xor  eax,eax
    rep  stosd

  nob4:
    jmp  sta

; DATA SECTION
RandSeedConst dd 0x8405
fcolor    dd  2
xx        db  'x'
type      db  0
calc      db  0
delay     dd  0
FireSeed  dd  0x1234
text:     db 'FIRE FOR MENUET'
textlen:

I_END:

FireScreen:
          rb 0x2300
ImageData:
          rb 320*200*3

; stack
          align 512
          rb 512
mem_end: