Subversion Repositories Kolibri OS

Rev

Rev 5565 | Rev 6242 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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