;
;    MIXER
;
;    Compile with FASM
;

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


use32
 org	0x0
 db	'MENUET01'    ; header
 dd	0x01	      ; header version
 dd	START	      ; entry point
 dd	I_END	      ; image size
 dd	0x1000        ; required memory
 dd	0x1000        ; esp
 dd	0x0 , 0x0     ; I_Param , I_Path



START:                          ; start of execution

  red:                          ; redraw
    call draw_window            ; at first, draw the window


still:

    mov  eax,10                 ; wait here for event
    mcall

    cmp  eax,1                  ; redraw request ?
    jz   red
    cmp  eax,2                  ; key in buffer ?
    jz   key
    cmp  eax,3                  ; button in buffer ?
    jz   button

    jmp  still

  key:                          ; key
    mov  eax,2                  ; just read it and ignore
    mcall

    jmp  still

  button:                       ; button
    mov  eax,17
    mcall

    cmp  ah,1                   ; button id=1 ?
    jnz  noclose
    or   eax,-1                 ; close this program
    mcall
  noclose:

    cmp  ah,101
    jnz  nochange
    xor  byte [usecard], 3      ; 1 <-> 2

    call drawusedcard

  nochange:

    cmp  byte [usecard],byte 1
    jnz  usesb16II

; SOUND BLASTER 16


  usesb16:

    mov  al,20
    cmp  ah,al
    jge  nomain

    mov  ecx,0
    cmp  ah,12
    jnz  nomain12
    mov  ecx,3*16+3
  nomain12:
    cmp  ah,13
    jnz  nomain13
    mov  ecx,7*16+7
  nomain13:
    cmp  ah,14
    jnz  nomain14
    mov  ecx,11*16+11
  nomain14:
    cmp  ah,15
    jnz  nomain15
    mov  ecx,15*16+15
  nomain15:

    mov  eax,25
    mov  ebx,1
    mcall

    jmp  still

  nomain:

    mov  al,30
    cmp  ah,al
    jge  nocd

    mov  ecx,0

    cmp  ah,22
    jnz  nocd12
    mov  ecx,3*16+3
  nocd12:
    cmp  ah,23
    jnz  nocd13
    mov  ecx,7*16+7
  nocd13:
    cmp  ah,24
    jnz  nocd14
    mov  ecx,11*16+11
  nocd14:
    cmp  ah,25
    jnz  nocd15
    mov  ecx,15*16+15
  nocd15:

    mov  eax,25
    mov  ebx,2
    mcall

    jmp  still

  nocd:


    jmp  still




; SOUND BLASTER 16 II

  usesb16II:

    cld

    mov  al,20
    cmp  ah,al
    jge  IIwnomain

    mov  ecx,0
    cmp  ah,12
    jnz  IIwnomain12
    mov  ecx,50
  IIwnomain12:
    cmp  ah,13
    jnz  IIwnomain13
    mov  ecx,150
  IIwnomain13:
    cmp  ah,14
    jnz  IIwnomain14
    mov  ecx,200
  IIwnomain14:
    cmp  ah,15
    jnz  IIwnomain15
    mov  ecx,255
  IIwnomain15:

    mov  eax,28
    mov  ebx,1
    mcall

    jmp  still

  IIwnomain:

    mov  al,30
    cmp  ah,al
    jge  IIwnocd

    mov  ecx,0

    cmp  ah,22
    jnz  IIwnocd12
    mov  ecx,50
  IIwnocd12:
    cmp  ah,23
    jnz  IIwnocd13
    mov  ecx,150
  IIwnocd13:
    cmp  ah,24
    jnz  IIwnocd14
    mov  ecx,200
  IIwnocd14:
    cmp  ah,25
    jnz  IIwnocd15
    mov  ecx,255
  IIwnocd15:

    mov  eax,28
    mov  ebx,2
    mcall

    jmp  still

  IIwnocd:


    jmp  still



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


draw_window:

    mov  eax,12                    ; function 12:tell os about windowdraw
    mov  ebx,1                     ; 1, start of draw
    mcall

                                   ; DRAW WINDOW
    mov  eax,0                     ; function 0 : define and draw window
    mov  ebx,100*65536+195         ; [x start] *65536 + [x size]
    mov  ecx,100*65536+140         ; [y start] *65536 + [y size]
    mov  edx,[wcolor]              ; color of work area RRGGBB
    mov  edi,title                 ; WINDOW LABEL
    mcall


    mov  edx,16                    ; button id
    mov  ebx,10*65536+22

  newbut:

    push edx

    mov  esi,[bcolor]

    mov  eax,8                     ; function 8 : define and draw button
    mov  ecx,35*65536+8            ; [y start] *65536 + [y size]
    dec  edx
    mcall
    mov  ecx,45*65536+8            ; [y start] *65536 + [y size]
    dec  edx
    mcall
    mov  ecx,55*65536+8            ; [y start] *65536 + [y size]
    dec  edx
    mcall
    mov  ecx,65*65536+8            ; [y start] *65536 + [y size]
    dec  edx
    mcall
    mov  ecx,75*65536+8            ; [y start] *65536 + [y size]
    dec  edx
    mcall

    pop  edx

    add  ebx,30*65536
    add  edx,10

    cmp  edx,16+6*10
    jnz  newbut


    mov  eax,4                     ; function 4 : write text to window
    mov  ebx,10*65536+104          ; [x start] *65536 + [y start]
    mov  ecx,0x00ffffff            ; color of text RRGGBB
    mov  edx,text                  ; pointer to text beginning
    mov  esi,29
    mcall

    mov  eax,8                     ; function 8 : define and draw button
    mov  ebx,(5)*65536+185         ; [x start] *65536 + [x size]
    mov  ecx,120*65536+14          ; [y start] *65536 + [y size]
    mov  edx,101                   ; button id
    mov  esi,[bcolor]              ; button color RRGGBB
    mcall

    call drawusedcard

    mov  eax,12                    ; function 12:tell os about windowdraw
    mov  ebx,2                     ; 2, end of draw
    mcall

    ret


drawusedcard:

    pusha

    mov  eax,13
    mov  ebx,14*65536+160
    mov  ecx,123*65536+10
    mov  edx,[bcolor]
    mcall

    mov  edx,c1

    cmp  [usecard],2
    jnz  nosbcII
    mov  edx,c2
  nosbcII:

    mov  eax,4
    mov  ebx,14*65536+123
    mov  ecx,0x00ffffff
    mov  esi,30
    mcall

    popa

    ret



; DATA AREA

bcolor  dd  0x5577c8

wcolor  dd  0x14000000


text:
    db 'MAIN  CD  WAVE MPU4 AUX1 AUX2'

c1  db 'SOUND BLASTER 16 - MIXER I    '
c2  db 'SOUND BLASTER 16 - MIXER II   '


usecard db 0x1

title    db   'MIXER',0

I_END: