Subversion Repositories Kolibri OS

Rev

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

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