; ; INFRARED ; ; Compile with FASM for Menuet ; use32 org 0x0 db 'MENUET01' ; 8 byte id dd 1 ; required os dd START ; program start dd I_END ; program image size dd 0x1000 ; required amount of memory dd 0x1000 ; esp = 0x7FFF0 dd 0, 0 include 'macros.inc' START: ; start of execution set_variables: mov eax,46 ; reserve ports 0x3f0 - 0x3ff mov ebx,0 mov ecx,0x3f0 mov edx,0x3ff int 0x40 mov eax,45 ; reserve irq 4 mov ebx,0 mov ecx,4 int 0x40 mov eax,44 ; set read ports for irq 4 mov ebx,irqtable ; mov ecx,4 int 0x40 mov dh, 3 ; all ports have number 3xx hex mov dl, 0xf3+8 mov al, 0x80 out dx, al mov dl, 0xf1+8 mov al, 0 out dx, al mov dl, 0xf0+8 mov al, 0x30 / 4 out dx, al mov dl, 0xf3+8 mov al, 3 out dx, al mov dl, 0xf4+8 mov al, 0xB out dx, al mov dl, 0xf1+8 mov al, 1 out dx, al mov eax,5 mov ebx,100 int 0x40 mov dl, 0xf8 mov al, 'I' out dx, al mov eax,5 mov ebx,10 int 0x40 mov al, 'R' out dx, al mov eax,40 ; get com 1 data with irq 4 mov ebx,0000000000010000b shl 16 + 101b int 0x40 red: call draw_window still: mov eax,10 ; wait here for event int 0x40 dec eax jz red dec eax dec eax jnz readir button: ; button mov al,17 ; get id int 0x40 ; we have only one button, close mov eax,45 ; free irq mov ebx,1 mov ecx,4 int 0x40 mov eax,46 ; free ports 0x3f0-0x3ff mov ebx,1 mov ecx,0x3f0 mov edx,0x3ff int 0x40 or eax,-1 ; close this program int 0x40 pos dd 0x0 cdplayer: dd 7 dd 0 dd 0 dd 0 dd 0 db '/RD/1/CDP',0 readir: mov eax,42 mov ebx,4 int 0x40 cmp ebx,80 jne nocd mov eax,70 mov ebx,cdplayer int 0x40 nocd: push ebx mov eax,[pos] add eax,1 cmp eax,10*20+1 jb noeaxz mov esi,text+10*4 mov edi,text mov ecx,10*21*4 cld rep movsb mov eax,13 mov ebx,20*65536+260 mov ecx,22*65536+220 mov edx,[wcolor] int 0x40 mov eax,10*19+1 noeaxz: mov [pos],eax pop ebx and ebx,0xff call draw_data jmp still draw_data: pusha xchg eax,ebx mov ecx,10 shl ebx,2 mov esi,3 newnum: xor edx,edx div ecx add edx,48 mov [ebx+text-1],dl dec ebx dec esi jnz newnum call draw_text popa ret irqtable: dd 0x3f8+0x01000000 ; + 01 = read byte, 02 read word dd 0 ; ********************************************* ; ******* 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+300 ; [x start] *65536 + [x size] mov ecx,100*65536+250 ; [y start] *65536 + [y size] mov edx,[wcolor] ; color of work area RRGGBB,8->color mov edi,labelt ; caption string 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,(300-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,0x5599cc ; button color RRGGBB ; int 0x40 draw_text: mov ebx,25*65536+35 ; draw info text with function 4 mov ecx,0xffffff mov edx,text mov esi,40 mov edi,20 newline: mov eax,4 int 0x40 add ebx,10 add edx,esi dec edi jne newline mov eax,12 mov ebx,2 int 0x40 ret ; DATA AREA wcolor dd 0x13000000 labelt db 'INFRARED RECEIVER FOR IRMAN IN COM 1',0 text: I_END: