Subversion Repositories Kolibri OS

Rev

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