; ; MIXER ; ; Compile with FASM ; use32 org 0x0 db 'MENUET00' ; 8 byte id dd 38 ; required os dd START ; program start dd I_END ; program image size dd 0x1000 ; reguired amount of memory dd 0x1000 dd 0x00000000 ; reserved=no extended header include 'lang.inc' include 'macros.inc' START: ; start of execution call draw_window ; at first, draw the window still: mov eax,10 ; wait here for event int 0x40 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 red: ; redraw call draw_window jmp still key: ; key mov eax,2 ; just read it and ignore int 0x40 jmp still button: ; button mov eax,17 int 0x40 cmp ah,1 ; button id=1 ? jnz noclose mov eax,-1 ; close this program int 0x40 noclose: cmp ah,101 jnz nochange mov al,byte [usecard] cld inc al and al,3 cmp al,0 jnz nozer mov al,1 nozer: mov byte [usecard],al call drawusedcard nochange: cmp byte [usecard],byte 1 jz usesb16 cmp byte [usecard],byte 2 jnz nousesb16II jmp usesb16II nousesb16II: cmp byte [usecard],byte 3 jnz nousewss jmp usewss nousewss: ; SOUND BLASTER 16 usesb16: cld 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 int 0x40 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 int 0x40 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 int 0x40 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 int 0x40 jmp still IIwnocd: jmp still ; WINDOWS SOUND SYSTEM usewss: cld mov al,20 cmp ah,al jge wnomain mov ecx,255 cmp ah,12 jnz wnomain12 mov ecx,200 wnomain12: cmp ah,13 jnz wnomain13 mov ecx,150 wnomain13: cmp ah,14 jnz wnomain14 mov ecx,70 wnomain14: cmp ah,15 jnz wnomain15 mov ecx,0 wnomain15: mov eax,27 mov ebx,1 int 0x40 jmp still wnomain: mov al,30 cmp ah,al jge wnocd mov ecx,255 cmp ah,22 jnz wnocd12 mov ecx,200 wnocd12: cmp ah,23 jnz wnocd13 mov ecx,150 wnocd13: cmp ah,24 jnz wnocd14 mov ecx,70 wnocd14: cmp ah,25 jnz wnocd15 mov ecx,0 wnocd15: mov eax,27 mov ebx,2 int 0x40 jmp still wnocd: jmp still ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window: mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw int 0x40 ; 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 esi,0x8099bbff ; color of grab bar RRGGBB,8->color glide mov edi,0x0099bbee ; color of frames RRGGBB int 0x40 ; WINDOW LABEL mov eax,4 ; function 4 : write text to window mov ebx,8*65536+8 ; [x start] *65536 + [y start] mov ecx,0x00ffffff ; color of text RRGGBB mov edx,labelt ; pointer to text beginning mov esi,labellen-labelt ; text length int 0x40 ; CLOSE BUTTON mov eax,8 ; function 8 : define and draw button mov ebx,(195-19)*65536+12 ; [x start] *65536 + [x size] mov ecx,5*65536+12 ; [y start] *65536 + [y size] mov edx,1 ; button id mov esi,0x22aacc ; button color RRGGBB ; int 0x40 mov edx,16 ; button id mov ebx,10*65536 newbut: push edx push ebx mov esi,[bcolor] mov eax,8 ; function 8 : define and draw button mov bx,22 ; [x start] *65536 + [x size] mov ecx,35*65536+8 ; [y start] *65536 + [y size] dec edx int 0x40 mov eax,8 ; function 8 : define and draw button mov bx,22 ; [x start] *65536 + [x size] mov ecx,45*65536+8 ; [y start] *65536 + [y size] dec edx int 0x40 mov eax,8 ; function 8 : define and draw button mov bx,22 ; [x start] *65536 + [x size] mov ecx,55*65536+8 ; [y start] *65536 + [y size] dec edx int 0x40 mov eax,8 ; function 8 : define and draw button mov bx,22 ; [x start] *65536 + [x size] mov ecx,65*65536+8 ; [y start] *65536 + [y size] dec edx int 0x40 mov eax,8 ; function 8 : define and draw button mov bx,22 ; [x start] *65536 + [x size] mov ecx,75*65536+8 ; [y start] *65536 + [y size] dec edx int 0x40 pop ebx pop edx add ebx,30*65536 add edx,10 cmp edx,16+6*10 jz butdone jmp newbut butdone: 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 int 0x40 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 int 0x40 call drawusedcard mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw int 0x40 ret drawusedcard: pusha mov eax,13 mov ebx,14*65536+160 mov ecx,123*65536+10 mov edx,[bcolor] int 0x40 mov eax,[usecard] mov edx,c3 cmp al,1 jnz nosbc mov edx,c1 nosbc: cmp al,2 jnz nosbcII mov edx,c2 nosbcII: cmp al,3 jnz nowssc mov edx,c3 nowssc: mov eax,4 mov ebx,14*65536+123 mov ecx,0x00ffffff mov esi,30 int 0x40 popa ret ; DATA AREA bcolor dd 0x5577c8 wcolor dd 0x03000000 text: db 'MAIN CD WAVE MPU4 AUX1 AUX2' c1 db 'SOUND BLASTER 16 - MIXER I ' c2 db 'SOUND BLASTER 16 - MIXER II ' c3 db 'WINDOWS SOUND SYSTEM ' usecard dd 0x1 labelt: db 'MIXER' labellen: I_END: