Subversion Repositories Kolibri OS

Rev

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

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