8,43 → 8,124 |
|
org 0x0 |
|
db 'MENUET00' ; 8 byte id |
dd 56 ; required os |
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 0x00000000 ; reserved=no extended header |
dd 0, 0 |
|
|
include 'lang.inc' |
include 'macros.inc' |
|
START: ; start of execution |
|
call draw_window ; at first, draw the window |
set_variables: |
|
call 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 |
|
cmp eax,1 ; redraw request ? |
je red |
cmp eax,2 ; key in buffer ? |
je key |
cmp eax,3 ; button in buffer ? |
je button |
cmp eax,16+4 |
je readir |
button: ; button |
mov al,17 ; get id |
int 0x40 |
|
jmp still |
; 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 db 'CDPLAY ' |
cdplayer: |
dd 7 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
db '/RD/1/CDP',0 |
|
readir: |
mov eax,42 |
54,9 → 135,8 |
cmp ebx,80 |
jne nocd |
|
mov eax,19 |
mov eax,70 |
mov ebx,cdplayer |
mov ecx,0 |
int 0x40 |
|
|
85,41 → 165,9 |
call draw_data |
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 ; get id |
int 0x40 |
|
cmp ah,1 ; button id=1 ? |
jne noclose |
|
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 |
|
mov eax,-1 ; close this program |
int 0x40 |
noclose: |
|
jmp still |
|
|
|
draw_data: |
|
pusha |
149,107 → 197,9 |
|
dd 0x3f8+0x01000000 ; + 01 = read byte, 02 read word |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
dd 0 |
|
|
|
set_variables: |
|
|
pusha |
|
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,46 ; reserve ports 0x3f0-0x3ff |
mov ebx,0 |
mov ecx,0x3f0 |
mov edx,0x3ff |
int 0x40 |
|
mov eax,44 ; set read ports for irq 4 |
mov ebx,irqtable |
mov ecx,4 |
int 0x40 |
|
mov cx,0x3f3+8 |
mov bl,0x80 |
mov eax,43 |
int 0x40 |
|
mov cx,0x3f1+8 |
mov bl,0 |
mov eax,43 |
int 0x40 |
|
mov cx,0x3f0+8 |
mov bl,0x30 / 4 |
mov eax,43 |
int 0x40 |
|
mov cx,0x3f3+8 |
mov bl,3 |
mov eax,43 |
int 0x40 |
|
mov cx,0x3f4+8 |
mov bl,0xB |
mov eax,43 |
int 0x40 |
|
mov cx,0x3f1+8 |
mov bl,1 |
mov eax,43 |
int 0x40 |
|
mov eax,5 |
mov ebx,100 |
int 0x40 |
|
mov cx,0x3f8 |
mov bl,'I' |
mov eax,43 |
int 0x40 |
|
mov eax,5 |
mov ebx,10 |
int 0x40 |
|
mov cx,0x3f8 |
mov bl,'R' |
mov eax,43 |
int 0x40 |
|
mov eax,40 ; get com 1 data with irq 4 |
mov ebx,0000000000010000b shl 16 + 111b |
int 0x40 |
|
popa |
|
ret |
|
|
; ********************************************* |
; ******* WINDOW DEFINITIONS AND DRAW ******** |
; ********************************************* |
266,38 → 216,27 |
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 esi,0x8099bbff ; color of grab bar RRGGBB,8->color glide |
mov edi,0x00ffffff ; color of frames RRGGBB |
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 |
; ; 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 |
; 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 |
|
call draw_text |
|
mov eax,12 |
mov ebx,2 |
int 0x40 |
|
ret |
|
draw_text: |
|
pusha |
|
mov ebx,25*65536+35 ; draw info text with function 4 |
mov ecx,0xffffff |
mov edx,text |
307,27 → 246,23 |
mov eax,4 |
int 0x40 |
add ebx,10 |
add edx,40 |
add edx,esi |
dec edi |
jne newline |
|
popa |
mov eax,12 |
mov ebx,2 |
int 0x40 |
|
ret |
|
|
|
; DATA AREA |
|
wcolor dd 0x03000000 |
wcolor dd 0x13000000 |
|
labelt db 'INFRARED RECEIVER FOR IRMAN IN COM 1' |
labellen: |
labelt db 'INFRARED RECEIVER FOR IRMAN IN COM 1',0 |
|
text: |
|
I_END: |
|
|
|
|