Subversion Repositories Kolibri OS

Rev

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