Subversion Repositories Kolibri OS

Rev

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

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