Subversion Repositories Kolibri OS

Rev

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