Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
129 | mikedld | 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 |