Rev 5032 | Rev 5363 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5032 | Rev 5130 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;; Shutdown for Menuet ;; |
6 | ;; Shutdown for Menuet ;; |
7 | ;; ;; |
7 | ;; ;; |
8 | ;; Distributed under General Public License ;; |
8 | ;; Distributed under General Public License ;; |
9 | ;; See file COPYING for details. ;; |
9 | ;; See file COPYING for details. ;; |
10 | ;; Copyright 2003 Ville Turjanmaa ;; |
10 | ;; Copyright 2003 Ville Turjanmaa ;; |
11 | ;; ;; |
11 | ;; ;; |
12 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
12 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
13 | 13 | ||
14 | $Revision: 5032 $ |
14 | $Revision: 5130 $ |
15 | 15 | ||
16 | use32 |
16 | use32 |
17 | become_real: |
17 | become_real: |
18 | cli |
18 | cli |
19 | lgdt [realmode_gdt-OS_BASE] |
19 | lgdt [realmode_gdt-OS_BASE] |
20 | jmp 8:@f |
20 | jmp 8:@f |
21 | use16 |
21 | use16 |
22 | @@: |
22 | @@: |
23 | mov ax, 10h |
23 | mov ax, 10h |
24 | mov ds, ax |
24 | mov ds, ax |
25 | mov es, ax |
25 | mov es, ax |
26 | mov fs, ax |
26 | mov fs, ax |
27 | mov gs, ax |
27 | mov gs, ax |
28 | mov ss, ax |
28 | mov ss, ax |
29 | mov eax, cr0 |
29 | mov eax, cr0 |
30 | and eax, not 80000001h |
30 | and eax, not 80000001h |
31 | mov cr0, eax |
31 | mov cr0, eax |
32 | jmp 0x1000:pr_mode_exit |
32 | jmp 0x1000:pr_mode_exit |
33 | 33 | ||
34 | pr_mode_exit: |
34 | pr_mode_exit: |
35 | 35 | ||
36 | ; setup stack |
36 | ; setup stack |
37 | mov ax, 0x3000 |
37 | mov ax, 0x3000 |
38 | mov ss, ax |
38 | mov ss, ax |
39 | mov esp, 0x0EC00 |
39 | mov esp, 0x0EC00 |
40 | ; setup ds |
40 | ; setup ds |
41 | push cs |
41 | push cs |
42 | pop ds |
42 | pop ds |
43 | 43 | ||
44 | lidt [old_ints_h] |
44 | lidt [old_ints_h] |
45 | ;remap IRQs |
45 | ;remap IRQs |
46 | mov al, 0x11 |
46 | mov al, 0x11 |
47 | out 0x20, al |
47 | out 0x20, al |
48 | call rdelay |
48 | call rdelay |
49 | out 0xA0, al |
49 | out 0xA0, al |
50 | call rdelay |
50 | call rdelay |
51 | 51 | ||
52 | mov al, 0x08 |
52 | mov al, 0x08 |
53 | out 0x21, al |
53 | out 0x21, al |
54 | call rdelay |
54 | call rdelay |
55 | mov al, 0x70 |
55 | mov al, 0x70 |
56 | out 0xA1, al |
56 | out 0xA1, al |
57 | call rdelay |
57 | call rdelay |
58 | 58 | ||
59 | mov al, 0x04 |
59 | mov al, 0x04 |
60 | out 0x21, al |
60 | out 0x21, al |
61 | call rdelay |
61 | call rdelay |
62 | mov al, 0x02 |
62 | mov al, 0x02 |
63 | out 0xA1, al |
63 | out 0xA1, al |
64 | call rdelay |
64 | call rdelay |
65 | 65 | ||
66 | mov al, 0x01 |
66 | mov al, 0x01 |
67 | out 0x21, al |
67 | out 0x21, al |
68 | call rdelay |
68 | call rdelay |
69 | out 0xA1, al |
69 | out 0xA1, al |
70 | call rdelay |
70 | call rdelay |
71 | 71 | ||
72 | mov al, 0xB8 |
72 | mov al, 0xB8 |
73 | out 0x21, al |
73 | out 0x21, al |
74 | call rdelay |
74 | call rdelay |
75 | mov al, 0xBD |
75 | mov al, 0xBD |
76 | out 0xA1, al |
76 | out 0xA1, al |
77 | sti |
77 | sti |
78 | 78 | ||
79 | temp_3456: |
79 | temp_3456: |
80 | xor ax, ax |
80 | xor ax, ax |
81 | mov es, ax |
81 | mov es, ax |
82 | mov al, byte [es:0x9030] |
82 | mov al, byte [es:0x9030] |
83 | cmp al, 1 |
83 | cmp al, 1 |
84 | jl nbw |
84 | jl nbw |
85 | cmp al, 4 |
85 | cmp al, 4 |
86 | jle nbw32 |
86 | jle nbw32 |
87 | 87 | ||
88 | nbw: |
88 | nbw: |
89 | in al, 0x60 |
89 | in al, 0x60 |
90 | cmp al, 6 |
90 | cmp al, 6 |
91 | jae nbw |
91 | jae nbw |
92 | mov bl, al |
92 | mov bl, al |
93 | nbw2: |
93 | nbw2: |
94 | in al, 0x60 |
94 | in al, 0x60 |
95 | cmp al, bl |
95 | cmp al, bl |
96 | je nbw2 |
96 | je nbw2 |
97 | cmp al, 240;ax,240 |
97 | cmp al, 240;ax,240 |
98 | jne nbw31 |
98 | jne nbw31 |
99 | mov al, bl |
99 | mov al, bl |
100 | dec ax |
100 | dec ax |
101 | jmp nbw32 |
101 | jmp nbw32 |
102 | nbw31: |
102 | nbw31: |
103 | add bl, 128 |
103 | add bl, 128 |
104 | cmp al, bl |
104 | cmp al, bl |
105 | jne nbw |
105 | jne nbw |
106 | sub al, 129 |
106 | sub al, 129 |
107 | 107 | ||
108 | nbw32: |
108 | nbw32: |
109 | 109 | ||
110 | dec ax |
110 | dec ax |
111 | dec ax ; 2 = power off |
111 | dec ax ; 2 = power off |
112 | jnz no_apm_off |
112 | jnz no_apm_off |
113 | call APM_PowerOff |
113 | call APM_PowerOff |
114 | jmp $ |
114 | jmp $ |
115 | no_apm_off: |
115 | no_apm_off: |
116 | 116 | ||
117 | if ~ defined extended_primary_loader ; kernel restarting is not supported |
117 | if ~ defined extended_primary_loader ; kernel restarting is not supported |
118 | dec ax ; 3 = reboot |
118 | dec ax ; 3 = reboot |
119 | jnz restart_kernel ; 4 = restart kernel |
119 | jnz restart_kernel ; 4 = restart kernel |
120 | end if |
120 | end if |
121 | push 0x40 |
121 | push 0x40 |
122 | pop ds |
122 | pop ds |
123 | mov word[0x0072], 0x1234 |
123 | mov word[0x0072], 0x1234 |
124 | jmp 0xF000:0xFFF0 |
124 | jmp 0xF000:0xFFF0 |
125 | 125 | ||
126 | 126 | ||
127 | rdelay: |
127 | rdelay: |
128 | ret |
128 | ret |
129 | 129 | ||
130 | APM_PowerOff: |
130 | APM_PowerOff: |
131 | mov ax, 5304h |
131 | mov ax, 5304h |
132 | xor bx, bx |
132 | xor bx, bx |
133 | int 15h |
133 | int 15h |
134 | ;!!!!!!!!!!!!!!!!!!!!!!!! |
134 | ;!!!!!!!!!!!!!!!!!!!!!!!! |
135 | mov ax, 0x5300 |
135 | mov ax, 0x5300 |
136 | xor bx, bx |
136 | xor bx, bx |
137 | int 0x15 |
137 | int 0x15 |
138 | push ax |
138 | push ax |
139 | 139 | ||
140 | mov ax, 0x5301 |
140 | mov ax, 0x5301 |
141 | xor bx, bx |
141 | xor bx, bx |
142 | int 0x15 |
142 | int 0x15 |
143 | 143 | ||
144 | mov ax, 0x5308 |
144 | mov ax, 0x5308 |
145 | mov bx, 1 |
145 | mov bx, 1 |
146 | mov cx, bx |
146 | mov cx, bx |
147 | int 0x15 |
147 | int 0x15 |
148 | 148 | ||
149 | mov ax, 0x530E |
149 | mov ax, 0x530E |
150 | xor bx, bx |
150 | xor bx, bx |
151 | pop cx |
151 | pop cx |
152 | int 0x15 |
152 | int 0x15 |
153 | 153 | ||
154 | mov ax, 0x530D |
154 | mov ax, 0x530D |
155 | mov bx, 1 |
155 | mov bx, 1 |
156 | mov cx, bx |
156 | mov cx, bx |
157 | int 0x15 |
157 | int 0x15 |
158 | 158 | ||
159 | mov ax, 0x530F |
159 | mov ax, 0x530F |
160 | mov bx, 1 |
160 | mov bx, 1 |
161 | mov cx, bx |
161 | mov cx, bx |
162 | int 0x15 |
162 | int 0x15 |
163 | 163 | ||
164 | mov ax, 0x5307 |
164 | mov ax, 0x5307 |
165 | mov bx, 1 |
165 | mov bx, 1 |
166 | mov cx, 3 |
166 | mov cx, 3 |
167 | int 0x15 |
167 | int 0x15 |
168 | ;!!!!!!!!!!!!!!!!!!!!!!!! |
168 | ;!!!!!!!!!!!!!!!!!!!!!!!! |
169 | ret |
169 | ret |
170 | 170 | ||
171 | if ~ defined extended_primary_loader |
171 | if ~ defined extended_primary_loader |
172 | restart_kernel: |
172 | restart_kernel: |
173 | 173 | ||
174 | mov ax, 0x0003 ; set text mode for screen |
174 | mov ax, 0x0003 ; set text mode for screen |
175 | int 0x10 |
175 | int 0x10 |
176 | jmp 0x4000:0000 |
176 | jmp 0x4000:0000 |
177 | 177 | ||
178 | restart_kernel_4000: |
178 | restart_kernel_4000: |
179 | cli |
179 | cli |
180 | 180 | ||
181 | push ds |
181 | push ds |
182 | pop es |
182 | pop es |
183 | mov cx, 0x8000 |
183 | mov cx, 0x8000 |
184 | push cx |
184 | push cx |
185 | push 0x7000 |
185 | push 0x7100 |
186 | pop ds |
186 | pop ds |
187 | xor si, si |
187 | xor si, si |
188 | xor di, di |
188 | xor di, di |
189 | rep movsw |
189 | rep movsw |
190 | pop cx |
190 | pop cx |
191 | mov ds, cx |
191 | mov ds, cx |
192 | push 0x2000 |
192 | push 0x2000 |
193 | pop es |
193 | pop es |
194 | rep movsw |
194 | rep movsw |
195 | push 0x9000 |
195 | push 0x9000 |
196 | pop ds |
196 | pop ds |
197 | push 0x3000 |
197 | push 0x3000 |
198 | pop es |
198 | pop es |
199 | mov cx, 0xE000/2 |
199 | mov cx, 0xE000/2 |
200 | rep movsw |
200 | rep movsw |
201 | 201 | ||
202 | wbinvd ; write and invalidate cache |
202 | wbinvd ; write and invalidate cache |
203 | 203 | ||
204 | mov al, 00110100b |
204 | mov al, 00110100b |
205 | out 43h, al |
205 | out 43h, al |
206 | jcxz $+2 |
206 | jcxz $+2 |
207 | mov al, 0xFF |
207 | mov al, 0xFF |
208 | out 40h, al |
208 | out 40h, al |
209 | jcxz $+2 |
209 | jcxz $+2 |
210 | out 40h, al |
210 | out 40h, al |
211 | jcxz $+2 |
211 | jcxz $+2 |
212 | sti |
212 | sti |
213 | 213 | ||
214 | ; (hint by Black_mirror) |
214 | ; (hint by Black_mirror) |
215 | ; We must read data from keyboard port, |
215 | ; We must read data from keyboard port, |
216 | ; because there may be situation when previous keyboard interrupt is lost |
216 | ; because there may be situation when previous keyboard interrupt is lost |
217 | ; (due to return to real mode and IRQ reprogramming) |
217 | ; (due to return to real mode and IRQ reprogramming) |
218 | ; and next interrupt will not be generated (as keyboard waits for handling) |
218 | ; and next interrupt will not be generated (as keyboard waits for handling) |
219 | in al, 0x60 |
219 | in al, 0x60 |
220 | 220 | ||
221 | ; bootloader interface |
221 | ; bootloader interface |
222 | push 0x1000 |
222 | push 0x1000 |
223 | pop ds |
223 | pop ds |
224 | mov si, kernel_restart_bootblock |
224 | mov si, kernel_restart_bootblock |
225 | mov ax, 'KL' |
225 | mov ax, 'KL' |
226 | jmp 0x1000:0000 |
226 | jmp 0x1000:0000 |
227 | end if |
227 | end if |