⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menuetos.htm

📁 Menuet 操作系统源代码。 非常难得的东西
💻 HTM
📖 第 1 页 / 共 3 页
字号:
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 + -