Subversion Repositories Kolibri OS

Rev

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