; Originally written by Jarek Pelczar
include "lang.inc"
include "macros.inc"

WND_SIZE_X		= 320
WND_SIZE_Y		= 200

MEOS_APP_START
CODE
    fninit
    mov al,40
    mov bl,101b
    int 0x40
    call init_palette
    call init_texture
    jmp .paint_window
.event_loop:
    mov al,23
    mov ebx,1
    int 0x40
    test eax,eax
    je .draw_screen
    dec eax
    je .paint_window

    or  eax,-1
    int 0x40

.draw_screen:
    call blit_8_to_32
    mov al,7
    mov ebx,virtual_screen_32
    mov ecx,(WND_SIZE_X shl 16)+WND_SIZE_Y
    mov edx,(4 shl 16)+24
    int 0x40
    call rotate_pal
    jmp .event_loop

.paint_window:
    mov al,12
    push eax
    xor ebx,ebx
    inc ebx
    int 0x40

    xor eax,eax
    mov ebx,(100 shl 16)+(WND_SIZE_X+8)
    mov ecx,(100 shl 16)+(WND_SIZE_Y+28)
    mov edx,0x03000000
    int 0x40

    mov al,7
    mov ebx,virtual_screen_32
    mov ecx,(WND_SIZE_X shl 16)+WND_SIZE_Y
    mov edx,(4 shl 16)+24
    int 0x40

    mov al,4
    mov ebx,0x00060006
    mov ecx,0x10ffffff
    mov edx,window_title
    mov esi,window_title_len
    int 0x40

    pop eax
    and ebx,2 ; bit 1 is set
    int 0x40

    jmp .event_loop

init_palette:
    mov edi,_palette
    mov ecx,64
    xor eax,eax
.color1:
    inc ah
    mov al,ah
    stosb
    xor al,al
    stosb
    stosb
    inc edi
    loop .color1
    mov ecx,64
    push ecx
    xor eax,eax
.color2:
    mov al,63
    stosb
    mov al,ah
    stosb
    xor al,al
    stosb
    inc ah
    inc edi
    loop .color2
    pop ecx
    push ecx
    xor eax,eax
.color3:
    mov al,63
    stosb
    stosb
    mov al,ah
    stosb
    inc ah
    inc edi
    loop .color3
    pop ecx
    mov eax,0x003f3f3f
    rep stosd
    ret

init_texture:
    fldpi
    mov [_fpom16],180
    fidiv [_fpom16]
    fstp [_st_rad]
    mov edi,virtual_screen_8
    cdq
.itex_vertical:
    xor ecx,ecx
    fld [_st_rad]
    mov [_fpom16],5
    fimul [_fpom16]
    mov [_fpom16],dx
    fimul [_fpom16]
    fsin
    fmul [_multiplier]
    fstp [_fpom32]
.itex_horizontal:
    fld [_st_rad]
    mov [_fpom16],3
    fimul [_fpom16]
    mov [_fpom16],cx
    fimul [_fpom16]
    fsin
    fmul [_multiplier]
    fadd [_fpom32]
    mov [_fpom16],127
    fiadd [_fpom16]
    fistp [_fpom16]
    mov ax,[_fpom16]
    inc eax
    stosb
    inc ecx
    cmp ecx,WND_SIZE_X
    jne .itex_horizontal
    inc edx
    cmp edx,WND_SIZE_Y
    jne .itex_vertical
    ret

rotate_pal:
    mov ebx,[_palette+4]
    mov edi,_palette+4
    mov esi,_palette+8
    xor ecx,ecx
    mov cl,255
;    cld
    rep movsd
    mov [_palette+1020],ebx
    ret

include "graph8.inc"

DATA
  _multiplier	dd 63.5

  window_title:
      db 'Plasma'
  window_title_len = $ - window_title

UDATA
  _fpom32		rd 1
  _fpom16		rw 1
  _st_rad		rd 1
  _palette:	rd 256

  virtual_screen_8:
   	rb WND_SIZE_X*WND_SIZE_Y

  virtual_screen_32:
   	rb WND_SIZE_X*WND_SIZE_Y*3

MEOS_APP_END
