Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. Advanced Power Management
  2.  
  3. SYSTEM CALL
  4.  
  5. eax = 70
  6. dx = íîìåð ôóíêöèè APM BIOS (àíàëîãè÷åí ax â ðåàëüíîì ðåæèìå)
  7. îñòàëüíûå (bx, cx) ðåãèñòðû ïî ñïåöèôèêàöèè (ñì. apm.txt)
  8. ðåçóëüòàò : ïî ñïåöèôèêàöèè (âêëþ÷àÿ CF), ñòàðøàÿ ÷àñòü 32 áèòíûõ ðåãèñòðîâ íå îïðåäåëåíà
  9.  
  10.  
  11. MEMORY MAP
  12.  
  13. Boot:
  14.         0x9040 - dword - entry point of APM BIOS
  15.         0x9044 -  word - version (BCD)
  16.         0x9046 -  word - flags
  17.  
  18.  
  19. ÈÇÌÅÍÅÍÈß
  20.  
  21. sys32.inc
  22. syscall.inc
  23. kernel.asm
  24. bootcode.inc
  25.  
  26. ##############[core\sys32.inc]#####################
  27.  
  28. Òðè íîâûõ äåñêðèïòîðà
  29.  
  30. .............
  31. .............
  32.  
  33. ; GDT TABLE
  34.  
  35. gdts:
  36.  
  37.         dw     gdte-$-1
  38.         dd     gdts
  39.         dw     0
  40.  
  41. int_code_l:
  42. os_code_l:
  43.  
  44.         dw     0xffff
  45.         dw     0x0000
  46.         db     0x00
  47.         dw     11011111b *256 +10011010b
  48.         db     0x00
  49.  
  50. int_data_l:
  51. os_data_l:
  52.  
  53.         dw     0xffff
  54.         dw     0x0000
  55.         db     0x00
  56.         dw     11011111b *256 +10010010b
  57.         db     0x00
  58. ; --------------- APM ---------------------
  59. apm_code_32:
  60.         dw     0x10             ; limit 64kb
  61.         db     0, 0, 0
  62.         dw     11011111b *256 +10011010b
  63.         db     0x00
  64. apm_code_16:
  65.         dw     0x10
  66.         db     0, 0, 0
  67.         dw     10011111b *256 +10011010b
  68.         db     0x00
  69. apm_data_16:
  70.         dw     0x10
  71.         db     0, 0, 0
  72.         dw     10011111b *256 +10010010b
  73.         db     0x00
  74. ; -----------------------------------------
  75. app_code_l:
  76.       dw ((0x80000000-std_application_base_address) shr 12) and 0xffff
  77.       dw 0
  78.       db 0
  79.       dw 11010000b*256+11111010b+256*((0x80000000-std_application_base_address) shr 28)
  80.       db std_application_base_address shr 24
  81.  
  82. app_data_l:
  83.       dw (0x80000000-std_application_base_address) shr 12 and 0xffff
  84.       dw 0
  85.       db 0
  86.       dw 11010000b*256+11110010b+256*((0x80000000-std_application_base_address) shr 28)
  87.       db std_application_base_address shr 24
  88.  
  89. graph_data_l:
  90.  
  91.         dw     0x3ff
  92.         dw     0x0000
  93.         db     0x00
  94.         dw     11010000b *256 +11110010b
  95.         db     0x00
  96.  
  97. tss0_l:
  98.       times (max_processes+10) dd 0,0
  99.  
  100. .............
  101. .............
  102.  
  103. ##############[core\syscall.inc]###################
  104.  
  105. .............
  106. .............
  107.  
  108.  
  109.       dd undefined_syscall       ; 65-UTF
  110.       dd sys_process_def         ; 66-Process definitions - keyboard
  111.       dd sys_window_move         ; 67-Window move or resize
  112.       dd sys_internal_services   ; 68-Some internal services
  113.       dd sys_debug_services      ; 69-Debug
  114.       dd sys_apm                 ; 70-APM
  115.  
  116.  
  117. .............
  118. .............
  119.  
  120. ##############[kernel.asm]#########################
  121.  
  122.  
  123. ×àñòü 1 (ïîñëå ìåòêè "; SAVE REAL MODE VARIABLES"):
  124.  
  125. .............
  126. .............
  127.  
  128. ; SAVE REAL MODE VARIABLES
  129.  
  130. ; --------------- APM ---------------------
  131.         mov     eax, [0x2f0000 + 0x9040]        ; entry point
  132.         mov     dword[apm_entry], eax
  133.         mov     word [apm_entry + 4], apm_code_32 - gdts
  134.  
  135.         mov     eax, [0x2f0000 + 0x9044]        ; version & flags
  136.         mov     [apm_vf], eax
  137. ; -----------------------------------------
  138.  
  139. .............
  140. .............
  141.  
  142. ×àñòü 2 (ñèñòåìíûé âûçîâ, ðàñïîëîæåíèå íå êðèòè÷íî,
  143. ÿ ðàñïîëîæèë ïåðåä ìåòêîé "undefined_syscall:")
  144.  
  145. .............
  146. .............
  147.  
  148. ; --------------- APM ---------------------
  149. apm_entry       dp      0
  150. apm_vf          dd      0
  151. align 4
  152. sys_apm:
  153.         cmp     word [apm_vf], 0        ; Check APM BIOS enable
  154.         jne     @f
  155.         or      [esp + 40], byte 1      ; error
  156.         mov     [esp + 36], dword 8     ; 32-bit protected-mode interface not supported
  157.         ret
  158.        
  159. @@:     xchg    eax, ecx
  160.         xchg    ebx, ecx
  161.        
  162.         cmp     al, 3
  163.         ja      @f
  164.         and     [esp + 40], byte 0xfe   ; emulate func 0..3 as func 0
  165.         mov     eax, [apm_vf]
  166.         mov     [esp + 36], eax
  167.         shr     eax, 16
  168.         mov     [esp + 32], eax
  169.         ret
  170.        
  171. @@:     call    pword [apm_entry]       ; call APM BIOS
  172.         mov     [esp + 8 ], edi
  173.         mov     [esp + 12], esi
  174.         mov     [esp + 24], ebx
  175.         mov     [esp + 28], edx
  176.         mov     [esp + 32], ecx
  177.         mov     [esp + 36], eax
  178.         setc    al
  179.         and     [esp + 40], byte 0xfe
  180.         or      [esp + 40], al
  181.         ret
  182. ; -----------------------------------------
  183.  
  184. align 4
  185.  
  186. undefined_syscall:                      ; Undefined system call
  187.  
  188. .............
  189. .............
  190.  
  191. ##############[boot\bootcode.inc]##################
  192.  
  193. Ïåðåä ìåòêîé "; DISPLAY VESA INFORMATION"
  194.  
  195. .............
  196. .............
  197.  
  198. ; --------------- APM ---------------------
  199.         push    0
  200.         pop     es
  201.         mov     word [es : 0x9044], 0           ; ver = 0.0 (APM not found)
  202.         mov     ax, 0x5300
  203.         xor     bx, bx
  204.         int     0x15
  205.         jc      apm_end                         ; APM not found
  206.         test    cx, 2
  207.         jz      apm_end                         ; APM 32-bit protected-mode interface not supported
  208.         mov     [es : 0x9044], ax               ; Save APM Version
  209.         mov     [es : 0x9046], cx               ; Save APM flags
  210.        
  211.         ; Write APM ver ----
  212.         jmp     @f
  213. msg_apm:db      ' APM x.x ', 0
  214. @@:     and     ax, 0xf0f
  215.         add     ax, '00'
  216.         mov     [msg_apm - 0x10000 + 5], ah
  217.         mov     [msg_apm - 0x10000 + 7], al
  218.         _setcursor 0, 3
  219.         mov     si, msg_apm - 0x10000
  220.         call    printplain
  221.         _setcursor d80x25_top_num,0
  222.         ; ------------------
  223.        
  224.         mov     ax, 0x5304                      ; Disconnect interface
  225.         xor     bx, bx
  226.         int     0x15
  227.         mov     ax, 0x5303                      ; Connect 32 bit mode interface
  228.         xor     bx, bx
  229.         int     0x15
  230.         ; init selectors
  231.         movzx   eax, ax ; real-mode segment base address of protected-mode 32-bit code segment
  232.         shl     eax, 4
  233.         mov     [apm_code_32 - 0x10000 + 2], ax
  234.         shr     eax, 16
  235.         mov     [apm_code_32 - 0x10000 + 4], al
  236.         movzx   ecx, cx ; real-mode segment base address of protected-mode 16-bit code segment
  237.         shl     ecx, 4
  238.         mov     [apm_code_16 - 0x10000 + 2], cx
  239.         shr     ecx, 16
  240.         mov     [apm_code_16 - 0x10000 + 4], cl
  241.         movzx   edx, dx ; real-mode segment base address of protected-mode 16-bit data segment
  242.         shl     edx, 4
  243.         mov     [apm_data_16 - 0x10000 + 2], dx
  244.         shr     edx, 16
  245.         mov     [apm_data_16 - 0x10000 + 4], dl
  246.         mov     [es : 0x9040], ebx              ; offset of APM entry point
  247. apm_end:
  248. ; -----------------------------------------
  249.  
  250.  
  251. ; DISPLAY VESA INFORMATION
  252.  
  253. .............
  254. .............
  255.  
  256.