Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 ha 13
 
593 mikedld 14
$Revision: 593 $
15
 
16
 
465 serge 17
align 4
1 ha 18
pr_mode_exit:
19
 
46 halyavin 20
; setup stack
465 serge 21
        mov    ax, 0x3000
22
        mov    ss, ax
23
        mov    esp, 0x0EC00
46 halyavin 24
; setup ds
465 serge 25
        push    cs
26
        pop    ds
1 ha 27
 
465 serge 28
        lidt [old_ints_h]
27 halyavin 29
;remap IRQs
465 serge 30
        mov  al,0x11
31
        out  0x20,al
32
        call rdelay
33
        out  0xA0,al
34
        call rdelay
227 serge 35
 
465 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
 
465 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
 
465 serge 50
        mov  al,0x01
51
        out  0x21,al
52
        call rdelay
53
        out  0xA1,al
54
        call rdelay
227 serge 55
 
465 serge 56
        mov  al,0xB8
57
        out  0x21,al
58
        call rdelay
59
        mov  al,0xBD
60
        out  0xA1,al
61
        sti
1 ha 62
 
465 serge 63
temp_3456:
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:
73
        in   al,0x60
74
        call pause_key
75
        cmp  al,6
76
        jae  nbw
77
        mov  bl,al
78
nbw2:
79
        in   al,0x60
80
        call pause_key
81
        cmp  al,bl
82
        je   nbw2
83
        cmp  al,240  ;ax,240
84
        jne  nbw31
85
        mov  al,bl
86
        dec  ax
87
        jmp  nbw32
88
nbw31:
89
        add  bl,128
90
        cmp  al,bl
91
        jne  nbw
92
        sub  al,129
1 ha 93
 
465 serge 94
nbw32:
61 halyavin 95
 
465 serge 96
        dec  ax    ; 1 = write floppy
97
        js   nbw
98
        jnz  no_floppy_write
99
        call floppy_write
100
        jmp  temp_3456 ;nbw
101
no_floppy_write:
1 ha 102
 
465 serge 103
        dec  ax    ; 2 = power off
104
        jnz  no_apm_off
105
        call APM_PowerOff
106
        jmp  $
107
no_apm_off:
1 ha 108
 
465 serge 109
        dec  ax    ; 3 = reboot
110
        jnz  restart_kernel        ; 4 = restart kernel
111
        push 0x40
112
        pop  ds
113
        mov  word[0x0072],0x1234
114
        jmp  0xF000:0xFFF0
1 ha 115
 
465 serge 116
pause_key:
117
        mov cx,100
118
pause_key_1:
119
        loop  pause_key_1
120
        ret
61 halyavin 121
 
122
rdelay:
1 ha 123
        ret
61 halyavin 124
 
1 ha 125
floppy_write:   ; write diskette image to physical floppy
126
 
465 serge 127
        cmp  [flm],byte 1
1 ha 128
        je   fwwritedone
465 serge 129
        mov  [flm],byte 1
1 ha 130
 
465 serge 131
        xor    ax, ax        ; reset drive
132
        xor    dx, dx
1 ha 133
        int     0x13
134
 
135
        mov     cx,0x0001               ; startcyl,startsector
465 serge 136
        xor    dx, dx                    ; starthead,drive
117 mario79 137
        mov    ax, 80*2               ; read no of sect
1 ha 138
 
465 serge 139
fwwrites:
140
        push    ax
1 ha 141
 
142
        ; move 1mb+ -> 0:a000
143
 
465 serge 144
         pusha
145
        mov     si, fwmovedesc
1 ha 146
        mov     cx,256*18
147
        mov     ah,0x87
117 mario79 148
        push    ds
149
        pop    es
1 ha 150
        int     0x15
465 serge 151
        add    dword [fwmovedesc+0x12], 512*18
1 ha 152
        popa
153
 
154
        xor     si,si
117 mario79 155
        mov    es,si
465 serge 156
fwnewwrite:
1 ha 157
        mov     bx,0xa000               ; es:bx -> data area
158
        mov     ax,0x0300+18            ; read, no of sectors to read
159
        int     0x13
160
 
465 serge 161
         test    ah, ah
1 ha 162
        jz      fwgoodwrite
163
 
465 serge 164
        inc    si
1 ha 165
        cmp     si,10
166
        jnz     fwnewwrite
167
 
61 halyavin 168
; can't access diskette - return
465 serge 169
        pop    ax
1 ha 170
        ret
171
 
465 serge 172
fwgoodwrite:
1 ha 173
        inc     dh
174
        cmp     dh,2
175
        jnz     fwbb2
176
        mov     dh,0
177
        inc     ch
465 serge 178
fwbb2:
1 ha 179
        pop     ax
180
        dec     ax
61 halyavin 181
        jnz     fwwrites
182
        ret
1 ha 183
 
465 serge 184
APM_PowerOff:
185
        mov     ax, 5304h
186
        xor     bx, bx
187
        int     15h
188
;!!!!!!!!!!!!!!!!!!!!!!!!
189
        mov ax,0x5300
190
        xor bx,bx
191
        int 0x15
192
        push ax
193
 
194
        mov ax,0x5301
195
        xor bx,bx
196
        int 0x15
197
 
198
        mov ax,0x5308
199
        mov bx,1
200
        mov cx,bx
201
        int 0x15
202
 
203
        mov ax,0x530E
204
        xor bx,bx
205
        pop cx
206
        int 0x15
207
 
208
        mov ax,0x530D
209
        mov bx,1
210
        mov cx,bx
211
        int 0x15
212
 
213
        mov ax,0x530F
214
        mov bx,1
215
        mov cx,bx
216
        int 0x15
217
 
218
        mov ax,0x5307
219
        mov bx,1
220
        mov cx,3
221
        int 0x15
222
;!!!!!!!!!!!!!!!!!!!!!!!!
223
fwwritedone:
224
        ret
225
 
226
restart_kernel:
227
 
228
        mov     ax,0x0003      ; set text mode for screen
229
        int     0x10
230
        jmp     0x4000:0000
231
 
232
restart_kernel_4000:
233
        cli
234
 
235
        push    ds
236
        pop    es
237
        mov    cx, 0x8000
238
        push    cx
239
        mov    ds, cx
240
        xor    si, si
241
        xor    di, di
242
        rep    movsw
243
        push    0x9000
244
        pop    ds
245
        push    0x2000
246
        pop    es
247
        pop    cx
248
        rep    movsw
249
 
250
        wbinvd  ; write and invalidate cache
251
 
252
        mov    al, 00110100b
253
        out    43h, al
254
        jcxz    $+2
255
        mov    al, 0xFF
256
        out    40h, al
257
        jcxz    $+2
258
        out    40h, al
259
        jcxz    $+2
260
        sti
261
 
262
; (hint by Black_mirror)
263
; We must read data from keyboard port,
264
; because there may be situation when previous keyboard interrupt is lost
265
; (due to return to real mode and IRQ reprogramming)
266
; and next interrupt will not be generated (as keyboard waits for handling)
267
        in      al, 0x60
268
 
269
; bootloader interface
270
        push    0x1000
271
        pop    ds
272
        mov    si, kernel_restart_bootblock
273
        mov    ax, 'KL'
274
        jmp     0x1000:0000
275