Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2465 Serge 3
;; Copyright (C) KolibriOS team 2004-2011. 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: 2465 $
15
 
16
 
465 serge 17
align 4
1 ha 18
pr_mode_exit:
19
 
46 halyavin 20
; setup stack
2434 Serge 21
        mov     ax, 0x3000
22
        mov     ss, ax
23
        mov     esp, 0x0EC00
46 halyavin 24
; setup ds
465 serge 25
        push    cs
2434 Serge 26
        pop     ds
1 ha 27
 
2434 Serge 28
        lidt    [old_ints_h]
27 halyavin 29
;remap IRQs
2434 Serge 30
        mov     al, 0x11
31
        out     0x20, al
32
        call    rdelay
33
        out     0xA0, al
34
        call    rdelay
227 serge 35
 
2434 Serge 36
        mov     al, 0x08
37
        out     0x21, al
38
        call    rdelay
39
        mov     al, 0x70
40
        out     0xA1, al
41
        call    rdelay
227 serge 42
 
2434 Serge 43
        mov     al, 0x04
44
        out     0x21, al
45
        call    rdelay
46
        mov     al, 0x02
47
        out     0xA1, al
48
        call    rdelay
227 serge 49
 
2434 Serge 50
        mov     al, 0x01
51
        out     0x21, al
52
        call    rdelay
53
        out     0xA1, al
54
        call    rdelay
227 serge 55
 
2434 Serge 56
        mov     al, 0xB8
57
        out     0x21, al
58
        call    rdelay
59
        mov     al, 0xBD
60
        out     0xA1, al
465 serge 61
        sti
1 ha 62
 
465 serge 63
temp_3456:
2434 Serge 64
        xor     ax, ax
65
        mov     es, ax
66
        mov     al, byte [es:0x9030]
67
        cmp     al, 1
68
        jl      nbw
69
        cmp     al, 4
70
        jle     nbw32
227 serge 71
 
465 serge 72
nbw:
2434 Serge 73
        in      al, 0x60
74
        cmp     al, 6
75
        jae     nbw
76
        mov     bl, al
465 serge 77
nbw2:
2434 Serge 78
        in      al, 0x60
79
        cmp     al, bl
80
        je      nbw2
81
        cmp     al, 240;ax,240
82
        jne     nbw31
83
        mov     al, bl
84
        dec     ax
85
        jmp     nbw32
465 serge 86
nbw31:
2434 Serge 87
        add     bl, 128
88
        cmp     al, bl
89
        jne     nbw
90
        sub     al, 129
1 ha 91
 
465 serge 92
nbw32:
61 halyavin 93
 
2434 Serge 94
        dec     ax
95
        dec     ax ; 2 = power off
96
        jnz     no_apm_off
97
        call    APM_PowerOff
98
        jmp     $
465 serge 99
no_apm_off:
1 ha 100
 
2010 serge 101
if ~ defined extended_primary_loader ; kernel restarting is not supported
2434 Serge 102
        dec     ax ; 3 = reboot
103
        jnz     restart_kernel     ; 4 = restart kernel
2010 serge 104
end if
2434 Serge 105
        push    0x40
106
        pop     ds
107
        mov     word[0x0072], 0x1234
108
        jmp     0xF000:0xFFF0
1 ha 109
 
61 halyavin 110
 
111
rdelay:
1 ha 112
        ret
61 halyavin 113
 
465 serge 114
APM_PowerOff:
115
        mov     ax, 5304h
116
        xor     bx, bx
117
        int     15h
118
;!!!!!!!!!!!!!!!!!!!!!!!!
2434 Serge 119
        mov     ax, 0x5300
120
        xor     bx, bx
121
        int     0x15
122
        push    ax
465 serge 123
 
2434 Serge 124
        mov     ax, 0x5301
125
        xor     bx, bx
126
        int     0x15
465 serge 127
 
2434 Serge 128
        mov     ax, 0x5308
129
        mov     bx, 1
130
        mov     cx, bx
131
        int     0x15
465 serge 132
 
2434 Serge 133
        mov     ax, 0x530E
134
        xor     bx, bx
135
        pop     cx
136
        int     0x15
465 serge 137
 
2434 Serge 138
        mov     ax, 0x530D
139
        mov     bx, 1
140
        mov     cx, bx
141
        int     0x15
465 serge 142
 
2434 Serge 143
        mov     ax, 0x530F
144
        mov     bx, 1
145
        mov     cx, bx
146
        int     0x15
465 serge 147
 
2434 Serge 148
        mov     ax, 0x5307
149
        mov     bx, 1
150
        mov     cx, 3
151
        int     0x15
465 serge 152
;!!!!!!!!!!!!!!!!!!!!!!!!
153
        ret
154
 
2010 serge 155
if ~ defined extended_primary_loader
465 serge 156
restart_kernel:
157
 
2434 Serge 158
        mov     ax, 0x0003     ; set text mode for screen
465 serge 159
        int     0x10
160
        jmp     0x4000:0000
161
 
162
restart_kernel_4000:
163
        cli
164
 
165
        push    ds
681 diamond 166
        pop     es
167
        mov     cx, 0x8000
465 serge 168
        push    cx
681 diamond 169
        push    0x7000
170
        pop     ds
171
        xor     si, si
172
        xor     di, di
2434 Serge 173
        rep movsw
681 diamond 174
        pop     cx
175
        mov     ds, cx
176
        push    0x2000
177
        pop     es
2434 Serge 178
        rep movsw
465 serge 179
        push    0x9000
681 diamond 180
        pop     ds
181
        push    0x3000
182
        pop     es
183
        mov     cx, 0xE000/2
2434 Serge 184
        rep movsw
465 serge 185
 
186
        wbinvd  ; write and invalidate cache
187
 
2434 Serge 188
        mov     al, 00110100b
189
        out     43h, al
465 serge 190
        jcxz    $+2
2434 Serge 191
        mov     al, 0xFF
192
        out     40h, al
465 serge 193
        jcxz    $+2
2434 Serge 194
        out     40h, al
465 serge 195
        jcxz    $+2
196
        sti
197
 
198
; (hint by Black_mirror)
199
; We must read data from keyboard port,
200
; because there may be situation when previous keyboard interrupt is lost
201
; (due to return to real mode and IRQ reprogramming)
202
; and next interrupt will not be generated (as keyboard waits for handling)
203
        in      al, 0x60
204
 
205
; bootloader interface
206
        push    0x1000
2434 Serge 207
        pop     ds
208
        mov     si, kernel_restart_bootblock
209
        mov     ax, 'KL'
465 serge 210
        jmp     0x1000:0000
2010 serge 211
end if
465 serge 212