Subversion Repositories Kolibri OS

Rev

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