?? menuetos.htm
字號:
labelt:
db 'THREAD EXAMPLE'
labellen:
I_END:
1f) Real-Time data
==================
The following example focuses on Real-Time data fetching and processing.
Application informs the OS for all the ports and datatypes to read
at a specific IRQ.
Steps:
1) reserve I/O port area
2) reserve IRQ
3) program IRQ
4) program EVENT list for wanted IRQ
5) runtime processing of the data
6) back to default events - free IRQ from EVENT list
7) free IRQ
8) free port area
9) terminate program
After IRQ's are programmed, the application has a new event for the
main event loop, number (IRQ+16).
When the application receives this event, the OS has recorded data
ready for the application to process.
The table below shows the main structure of processing real time data.
All the steps on the left of (A) are processed by the OS and the steps
right from (A) are processed by the application.
IRQ OWNER => REC DATA (A) SYS_EVENT => READ DATA => PROCESS
0 TIMER SYS
1 KEYBOARD SYS
2 free ->
3 COM MOUSE SYS/free ?>
4 COM MOUSE SYS/free ?>
5 SOUND BL. SYS
6 FLOPPY SYS
7 free ->
8 free ->
9 free ->
10 free ->
11 free ->
12 PS2 MOUSE SYS/free ?>
13 MATH PR. SYS
14 IDE SYS
15 IDE SYS
An example of processing Real-Time data:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; REAL-TIME DATA ;
; ;
; Compile with FASM for Menuet ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
use32
org 0x0
db 'MENUET00' ; 8 byte id
dd 56 ; required os
dd START ; program start
dd I_END ; program image size
dd 0x100000 ; required amount of memory
; esp = 0x7FFF0
dd 0x00000000 ; reserved=no extended header
START: ; start of execution
call draw_window ; at first, draw the window
call program_real_time_data ; program the OS to receive real time data
call program_com_port ; program the com port for specific device
event_wait:
mov eax,10 ; wait here for event
int 0x40
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 ; RT: new event for wanted IRQ data (16+IRQ)
je read_rt
jmp event_wait
; The next section reads the event and processes data.
read_rt: ; RT data
mov eax,42 ; Function 42 returns recorded data for IRQ 4
mov ebx,4 ;
int 0x40 ; OS returns the recorded data.
; eax number of bytes in buffer left
; bl data
; ecx 0 = success, other = no data in buf.
call process_data
jmp event_wait
red: ; redraw
call draw_window
jmp event_wait
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
jmp event_wait
button: ; button
mov eax,17 ; get id
int 0x40
cmp ah,1 ; button id=1 ?
jne noclose
call free_real_time_data
mov eax,-1 ; close this program
int 0x40
noclose:
jmp event_wait
program_real_time_data:
; Program the Real-Time data fetch
;
; 1) reserve I/O port area
; 2) reserve IRQ
; 3) program IRQ
; 4) program EVENT list for wanted IRQ
;
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,44 ; set read ports for irq 4
mov ebx,irqtable
mov ecx,4
int 0x40
mov eax,40 ; get com 1 data with irq 4
mov ebx,0000000000010000b shl 16 + 111b ; after this we have a new
; event (16+4)
int 0x40
popa
ret
irqtable:
dd 0x3f8+0x01000000 ; 3f8 =port to read : 01 =read byte, 02 =read word
dd 0x0 ; 0x0 = termintes read per IRQ event
dd 0x0
dd 0x0
dd 0x0
dd 0x0
dd 0x0
dd 0x0
dd 0x0
dd 0x0
dd 0x0
dd 0x0
dd 0x0
dd 0x0
dd 0x0
dd 0x0
free_real_time_data:
; Free the used resources
;
; 1) get default events
; 2) free irq with function 45,1
; 3) free port area with function 46,1
;
pusha
mov eax,40 ; default events - disable irq 4 event
mov ebx,111b
int 0x40
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
popa
ret
; The following functions are for processing device specific data.
process_data:
cmp ebx,80
jne nocd
mov eax,19
mov ebx,cdplayer
mov ecx,0
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
ret
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
draw_text:
pusha
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,40
dec edi
jne newline
popa
ret
program_com_port:
; the following sequence programs COM port for infrared receiver
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
ret
; *********************************************
; ******* 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 esi,0x8099bbff ; color of grab bar RRGGBB,8->color glide
mov edi,0x00ffffff ; 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,(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
; DATA AREA
wcolor dd 0x0
pos dd 0x0
cdplayer db 'CDPLAY '
labelt db 'INFRARED RECEIVER FOR IRMAN IN COM 1'
labellen:
text:
I_END:
eof
</PRE></TD></TD></TR></TBODY></TABLE></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -