Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 431 $
431 serge 2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
;;                                                              ;;
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
7
;;  Shutdown for Menuet                                         ;;
8
;;                                                              ;;
9
;;  Distributed under General Public License                    ;;
10
;;  See file COPYING for details.                               ;;
11
;;  Copyright 2003 Ville Turjanmaa                              ;;
12
;;                                                              ;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 ha 14
 
15
 
16
system_shutdown:          ; shut down the system
224 serge 17
    call stop_all_services
1 ha 18
 
117 mario79 19
    push 3        ; stop playing cd
61 halyavin 20
    pop  eax
1 ha 21
    call sys_cd_audio
22
    cld
23
 
24
    mov  al,[0x2f0000+0x9030]
25
    cmp  al,1
26
    jl   no_shutdown_parameter
27
    cmp  al,4
61 halyavin 28
    jle  yes_shutdown_param
1 ha 29
 no_shutdown_parameter:
30
 
61 halyavin 31
;    movzx ecx,word [0x2f0000+0x900A]
32
;    movzx esi,word [0x2f0000+0x900C]
33
;    imul ecx,esi  ;[0xfe04]
34
;;    mov  ecx,0x500000/4  ;3fff00/4    ; darken screen
35
;    push ecx
36
;    mov  esi,[0xfe80]
37
;    cmp  esi,32*0x100000
38
;    jbe  no_darken_screen
39
;    mov  edi,16*0x100000
40
;    push esi edi
41
;  sdnewpix:
42
;    lodsd
43
;    shr  eax,1
44
;    and  eax,0x7f7f7f7f
45
;    stosd
46
;    loop sdnewpix
47
;    pop  ecx
48
;    pop  esi edi
49
;    rep  movsd
50
;  no_darken_screen:
1 ha 51
 
61 halyavin 52
; read shutdown code:
53
; 1) display shutdown "window"
54
 
1 ha 55
    mov  eax,[0xfe00]
56
    shr  eax,1
117 mario79 57
    lea  esi,[eax+220]        ; x end
58
    sub  eax,220        ; x start
1 ha 59
 
381 serge 60
    mov  ebx,[ScreenHeight]
1 ha 61
    shr  ebx,1
62
    mov  [shutdownpos],ebx
117 mario79 63
    lea  ebp,[ebx+105]        ; y end
64
    sub  ebx,120        ; y start
1 ha 65
 
61 halyavin 66
    xor  edi,edi
117 mario79 67
    inc  edi        ; force putpixel & dtext
1 ha 68
    mov  ecx,0x0000ff
69
 
61 halyavin 70
; vertical loop begin
71
  sdnewpix1:
117 mario79 72
    push eax    ; save x start
61 halyavin 73
 
74
; horizontal loop begin
1 ha 75
  sdnewpix2:
76
 
77
    call [putpixel]
78
 
79
    inc  eax
80
    cmp  eax,esi
81
    jnz  sdnewpix2
61 halyavin 82
; horizontal loop end
1 ha 83
 
117 mario79 84
    dec  ecx    ; color
85
    pop  eax    ; restore x start
1 ha 86
 
117 mario79 87
    inc  ebx    ; advance y pos
61 halyavin 88
    cmp  ebx,ebp
89
    jnz  sdnewpix1
90
; vertical loop end
91
 
92
; 2) display text strings
93
;    a) version
1 ha 94
    mov  eax,[0xfe00]
95
    shr  eax,1
61 halyavin 96
    shl  eax,16
97
    mov  ax,word [shutdownpos]
98
    push eax
99
    sub  eax,(220-27)*10000h + 105
1 ha 100
    mov  ebx,0xffff00
101
    mov  ecx,version
61 halyavin 102
    push 34
103
    pop  edx
1 ha 104
    call dtext
105
 
61 halyavin 106
;    b) variants
107
    add  eax,105+33
108
    push 6
109
    pop  esi
110
;    mov  ebx,0xffffff
111
    mov  bl,0xFF
1 ha 112
    mov  ecx,shutdowntext
61 halyavin 113
    mov  dl,40
1 ha 114
  newsdt:
115
    call dtext
116
    add  eax,10
61 halyavin 117
    add  ecx,edx
1 ha 118
    dec  esi
119
    jnz  newsdt
120
 
61 halyavin 121
; 3) load & display rose.txt
424 spraid 122
    mov  eax,rosef-std_application_base_address          ; load rose.txt
61 halyavin 123
    xor  ebx,ebx
124
    push 2
125
    pop  ecx
1 ha 126
    mov  edx,0x90000
61 halyavin 127
    push edx
128
    push 12
129
    pop  esi
117 mario79 130
    push edi    ; may be destroyed
431 serge 131
 
424 spraid 132
    pushad
133
    push eax
134
    call file_system_lfn ; by SPraid  fileread
135
    pop eax
431 serge 136
    popad
61 halyavin 137
    pop  edi
1 ha 138
 
61 halyavin 139
    pop  ecx
117 mario79 140
    inc  ecx    ; do not display stars from rose.txt
61 halyavin 141
    pop  eax
142
    add  eax,20*10000h - 110
1 ha 143
 
144
    mov  ebx,0x00ff00
61 halyavin 145
    push 27
146
    pop  edx
1 ha 147
 
148
   nrl:
149
    call dtext
143 diamond 150
;    sub  ebx,0x050000
151
        ror     ebx, 16
152
        sub     bl, 0x05
153
        ror     ebx, 16
1 ha 154
    add  eax,8
155
    add  ecx,31
61 halyavin 156
    cmp  cx,word 0x0001+25*31
1 ha 157
    jnz  nrl
158
 
117 mario79 159
    call checkVga_N13
1 ha 160
 
161
 yes_shutdown_param:
162
    cli
163
 
164
    mov  eax,kernel               ; load kernel.mnt to 0x8000:0
61 halyavin 165
    push 12
166
    pop  esi
167
    xor  ebx,ebx
168
    or   ecx,-1
1 ha 169
    mov  edx,0x80000
170
    call fileread
171
 
89 diamond 172
    mov  esi,restart_kernel_4000+0x10000  ; move kernel re-starter to 0x4000:0
1 ha 173
    mov  edi,0x40000
174
    mov  ecx,1000
175
    rep  movsb
176
 
177
    mov  eax,0x2F0000    ; restore 0x0 - 0xffff
61 halyavin 178
    xor  ebx,ebx
179
    mov  ecx,0x10000
1 ha 180
    call memmove
181
 
182
    call restorefatchain
183
 
227 serge 184
    mov al, 0xFF
185
    out 0x21, al
186
    out 0xA1, al
187
 
61 halyavin 188
    mov  word [0x467+0],pr_mode_exit-0x10000
189
    mov  word [0x467+2],0x1000
1 ha 190
 
191
    mov  al,0x0F
192
    out  0x70,al
193
    mov  al,0x05
194
    out  0x71,al
195
 
196
    mov  al,0xFE
197
    out  0x64,al
198
    hlt
199
 
200
use16
201
 
202
pr_mode_exit:
82 halyavin 203
org $-0x10000
1 ha 204
 
46 halyavin 205
; setup stack
117 mario79 206
    mov    ax, 3000h
207
    mov    ss, ax
208
    mov    esp, 0EC00h
46 halyavin 209
; setup ds
117 mario79 210
    push    cs
211
    pop    ds
1 ha 212
 
46 halyavin 213
    lidt [old_ints_h-0x10000]
27 halyavin 214
;remap IRQs
215
    mov  al,0x11
216
    out  0x20,al
217
    call rdelay
218
    out  0xA0,al
219
    call rdelay
227 serge 220
 
27 halyavin 221
    mov  al,0x08
222
    out  0x21,al
223
    call rdelay
224
    mov  al,0x70
225
    out  0xA1,al
226
    call rdelay
227 serge 227
 
27 halyavin 228
    mov  al,0x04
229
    out  0x21,al
230
    call rdelay
231
    mov  al,0x02
232
    out  0xA1,al
233
    call rdelay
227 serge 234
 
27 halyavin 235
    mov  al,0x01
236
    out  0x21,al
237
    call rdelay
238
    out  0xA1,al
239
    call rdelay
227 serge 240
 
241
    mov  al,0xB8
27 halyavin 242
    out  0x21,al
46 halyavin 243
    call rdelay
227 serge 244
    mov  al,0xBD
27 halyavin 245
    out  0xA1,al
1 ha 246
    sti
247
 
61 halyavin 248
  temp_3456:
249
    xor  ax,ax
250
    mov  es,ax
251
    mov  al,byte [es:0x9030]
252
    cmp  al,1
253
    jl   nbw
254
    cmp  al,4
255
    jle  nbw32
227 serge 256
 
1 ha 257
  nbw:
258
    in   al,0x60
259
    call pause_key
61 halyavin 260
    cmp  al,6
261
    jae  nbw
1 ha 262
    mov  bl,al
263
  nbw2:
264
    in   al,0x60
265
    call pause_key
266
    cmp  al,bl
267
    je   nbw2
268
    cmp  al,240  ;ax,240
269
    jne  nbw31
270
    mov  al,bl
61 halyavin 271
    dec  ax
1 ha 272
    jmp  nbw32
273
  nbw31:
274
    add  bl,128
275
    cmp  al,bl
276
    jne  nbw
277
    sub  al,129
278
 
279
  nbw32:
61 halyavin 280
 
117 mario79 281
    dec  ax    ; 1 = write floppy
61 halyavin 282
    js   nbw
283
    jnz  no_floppy_write
1 ha 284
    call floppy_write
285
    jmp  temp_3456 ;nbw
286
  no_floppy_write:
287
 
117 mario79 288
    dec  ax    ; 2 = power off
61 halyavin 289
    jnz  no_apm_off
1 ha 290
    call APM_PowerOff
61 halyavin 291
    jmp  $
1 ha 292
  no_apm_off:
293
 
117 mario79 294
    dec  ax    ; 3 = reboot
295
    jnz  restart_kernel        ; 4 = restart kernel
61 halyavin 296
    push 0x40
297
    pop  ds
227 serge 298
    mov  word[0x0072],0x1234
1 ha 299
    jmp  0xF000:0xFFF0
300
 
301
    pause_key:
61 halyavin 302
      mov cx,100
1 ha 303
    pause_key_1:
304
      loop  pause_key_1
305
      ret
61 halyavin 306
 
307
rdelay:
308
    ret
309
 
1 ha 310
iglobal
311
  kernel  db  'KERNEL  MNT'
312
;  shutdown_parameter db 0
313
endg
314
 
315
restart_kernel:
316
 
317
        mov     ax,0x0003      ; set text mode for screen
318
        int     0x10
319
 
320
        jmp     0x4000:0000
321
 
322
 
323
restart_kernel_4000:
30 halyavin 324
        cli
1 ha 325
 
46 halyavin 326
;        mov     di,0x1000      ; load kernel image from 0x8000:0 -> 0x1000:0
327
;
328
;      new_kernel_block_move:
329
;
330
;        mov     ebx,0
331
;
332
;      new_kernel_byte_move:
333
;
334
;        mov     ax,di
335
;        add     ax,0x7000
336
;        mov     es,ax
337
;        mov     dl,[es:bx]
338
;        mov     es,di
339
;        mov     [es:bx],dl
340
;
341
;        inc     ebx
342
;        cmp     ebx,65536
343
;        jbe     new_kernel_byte_move
344
;
345
;        add     di,0x1000
346
;        cmp     di,0x2000
347
;        jbe     new_kernel_block_move
117 mario79 348
    push    ds
349
    pop    es
350
    mov    cx, 0x8000
351
    push    cx
352
    mov    ds, cx
353
    xor    si, si
354
    xor    di, di
355
    rep    movsw
356
    push    0x9000
357
    pop    ds
358
    push    0x2000
359
    pop    es
360
    pop    cx
361
    rep    movsw
1 ha 362
 
363
        wbinvd  ; write and invalidate cache
364
 
46 halyavin 365
;        mov     ax,0x1000
366
;        mov     es,ax
367
;        mov     ax,0x3000
368
;        mov     ss,ax
369
;        mov     sp,0xec00
370
; restore timer
117 mario79 371
    mov    al, 00110100b
372
    out    43h, al
373
    jcxz    $+2
374
    mov    al, 0xFF
375
    out    40h, al
376
    jcxz    $+2
377
    out    40h, al
378
    jcxz    $+2
30 halyavin 379
        sti
1 ha 380
 
301 diamond 381
; (hint by Black_mirror)
382
; We must read data from keyboard port,
383
; because there may be situation when previous keyboard interrupt is lost
384
; (due to return to real mode and IRQ reprogramming)
385
; and next interrupt will not be generated (as keyboard waits for handling)
386
        in      al, 0x60
387
 
46 halyavin 388
; bootloader interface
117 mario79 389
    push    0x1000
390
    pop    ds
183 diamond 391
    mov    si, kernel_restart_bootblock-0x10000
117 mario79 392
    mov    ax, 'KL'
1 ha 393
        jmp     0x1000:0000
394
 
395
APM_PowerOff:
79 diamond 396
        mov     ax, 5304h
397
        xor     bx, bx
398
        int     15h
1 ha 399
;!!!!!!!!!!!!!!!!!!!!!!!!
400
mov ax,0x5300
401
xor bx,bx
402
int 0x15
403
push ax
404
 
405
mov ax,0x5301
406
xor bx,bx
407
int 0x15
408
 
409
mov ax,0x5308
410
mov bx,1
411
mov cx,bx
412
int 0x15
413
 
414
mov ax,0x530E
415
xor bx,bx
416
pop cx
417
int 0x15
418
 
419
mov ax,0x530D
420
mov bx,1
421
mov cx,bx
422
int 0x15
423
 
424
mov ax,0x530F
425
mov bx,1
426
mov cx,bx
427
int 0x15
428
 
429
mov ax,0x5307
430
mov bx,1
431
mov cx,3
432
int 0x15
433
;!!!!!!!!!!!!!!!!!!!!!!!!
61 halyavin 434
fwwritedone:
1 ha 435
        ret
82 halyavin 436
org $+0x10000
61 halyavin 437
flm db 0
82 halyavin 438
org $-0x10000
61 halyavin 439
 
1 ha 440
floppy_write:   ; write diskette image to physical floppy
441
 
61 halyavin 442
        cmp  [flm-0x10000],byte 1
1 ha 443
        je   fwwritedone
61 halyavin 444
        mov  [flm-0x10000],byte 1
1 ha 445
 
117 mario79 446
    xor    ax, ax        ; reset drive
447
    xor    dx, dx
1 ha 448
        int     0x13
449
 
450
        mov     cx,0x0001               ; startcyl,startsector
61 halyavin 451
;        mov     dx,0x0000               ; starthead,drive
117 mario79 452
    xor    dx, dx
453
        mov    ax, 80*2               ; read no of sect
1 ha 454
 
455
      fwwrites:
117 mario79 456
    push    ax
1 ha 457
 
458
        ; move 1mb+ -> 0:a000
459
 
117 mario79 460
    pusha
1 ha 461
        mov     si,fwmovedesc -0x10000
462
        mov     cx,256*18
463
        mov     ah,0x87
117 mario79 464
        push    ds
465
        pop    es
1 ha 466
        int     0x15
117 mario79 467
        add    dword [fwmovedesc-0x10000+0x12], 512*18
1 ha 468
        popa
469
 
470
        xor     si,si
117 mario79 471
        mov    es,si
1 ha 472
      fwnewwrite:
473
        mov     bx,0xa000               ; es:bx -> data area
474
        mov     ax,0x0300+18            ; read, no of sectors to read
475
        int     0x13
476
 
117 mario79 477
    test    ah, ah
1 ha 478
        jz      fwgoodwrite
479
 
117 mario79 480
    inc    si
1 ha 481
        cmp     si,10
482
        jnz     fwnewwrite
483
 
61 halyavin 484
; can't access diskette - return
117 mario79 485
    pop    ax
1 ha 486
        ret
487
 
488
      fwgoodwrite:
489
        inc     dh
490
        cmp     dh,2
491
        jnz     fwbb2
492
        mov     dh,0
493
        inc     ch
494
      fwbb2:
495
        pop     ax
496
        dec     ax
61 halyavin 497
        jnz     fwwrites
498
        ret
82 halyavin 499
org $+0x10000
1 ha 500
      fwmovedesc:
501
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
502
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
503
        db      0xff,0xff,0x0,0x00,0x10,0x93,0x0,0x0
504
        db      0xff,0xff,0x0,0xa0,0x00,0x93,0x0,0x0
505
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
506
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
507
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
508
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
82 halyavin 509
org $-0x10000
1 ha 510
use32
82 halyavin 511
org $+0x10000
1 ha 512
uglobal
513
  shutdownpos dd 0x0
514
endg
515
 
516
iglobal
61 halyavin 517
if lang eq en
1 ha 518
shutdowntext:
61 halyavin 519
    db   "IT'S SAFE TO POWER OFF COMPUTER OR      "
520
    db   '                                        '
521
    db   '1) SAVE RAMDISK TO FLOPPY               '
522
    db   '2) APM - POWEROFF                       '
523
    db   '3) REBOOT                               '
227 serge 524
    db   '4) RESTART KERNEL                       '
139 diamond 525
else if lang eq ru
61 halyavin 526
shutdowntext:
1 ha 527
    db   "Безопасное выключение компьютера или    "
528
    db   '                                        '
529
    db   '1) Сохранить рамдиск на дискету         '
530
    db   '2) APM - выключение питания             '
531
    db   '3) Перезагрузка системы                 '
532
    db   '4) Рестарт ядра из ОЗУ                  '
139 diamond 533
else
534
shutdowntext:
535
    db   "SIE KOENNEN DEN COMPUTER NUN AUSSCHALTEN"
536
    db   '                                        '
537
    db   '1) RAMDISK AUF DISK SPEICHERN           '
538
    db   '2) APM - AUSSCHALTEN                    '
539
    db   '3) NEUSTARTEN                           '
227 serge 540
    db   '4) KERNEL NEU STARTEN                   '
61 halyavin 541
end if
1 ha 542
rosef:
424 spraid 543
    dd 0,0,0,1024,0x90000-std_application_base_address
544
    db '/rd/1/ROSE.TXT',0
1 ha 545
endg