Subversion Repositories Kolibri OS

Rev

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