Subversion Repositories Kolibri OS

Rev

Rev 143 | Rev 224 | 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
61 halyavin 290
 
291
rdelay:
292
    ret
293
 
1 ha 294
iglobal
295
  kernel  db  'KERNEL  MNT'
296
;  shutdown_parameter db 0
297
endg
298
 
299
restart_kernel:
300
 
301
        mov     ax,0x0003      ; set text mode for screen
302
        int     0x10
303
 
304
        jmp     0x4000:0000
305
 
306
 
307
restart_kernel_4000:
30 halyavin 308
        cli
1 ha 309
 
46 halyavin 310
;        mov     di,0x1000      ; load kernel image from 0x8000:0 -> 0x1000:0
311
;
312
;      new_kernel_block_move:
313
;
314
;        mov     ebx,0
315
;
316
;      new_kernel_byte_move:
317
;
318
;        mov     ax,di
319
;        add     ax,0x7000
320
;        mov     es,ax
321
;        mov     dl,[es:bx]
322
;        mov     es,di
323
;        mov     [es:bx],dl
324
;
325
;        inc     ebx
326
;        cmp     ebx,65536
327
;        jbe     new_kernel_byte_move
328
;
329
;        add     di,0x1000
330
;        cmp     di,0x2000
331
;        jbe     new_kernel_block_move
117 mario79 332
    push    ds
333
    pop    es
334
    mov    cx, 0x8000
335
    push    cx
336
    mov    ds, cx
337
    xor    si, si
338
    xor    di, di
339
    rep    movsw
340
    push    0x9000
341
    pop    ds
342
    push    0x2000
343
    pop    es
344
    pop    cx
345
    rep    movsw
1 ha 346
 
347
        wbinvd  ; write and invalidate cache
348
 
46 halyavin 349
;        mov     ax,0x1000
350
;        mov     es,ax
351
;        mov     ax,0x3000
352
;        mov     ss,ax
353
;        mov     sp,0xec00
354
; restore timer
117 mario79 355
    mov    al, 00110100b
356
    out    43h, al
357
    jcxz    $+2
358
    mov    al, 0xFF
359
    out    40h, al
360
    jcxz    $+2
361
    out    40h, al
362
    jcxz    $+2
30 halyavin 363
        sti
1 ha 364
 
46 halyavin 365
; bootloader interface
117 mario79 366
    push    0x1000
367
    pop    ds
183 diamond 368
    mov    si, kernel_restart_bootblock-0x10000
117 mario79 369
    mov    ax, 'KL'
1 ha 370
        jmp     0x1000:0000
371
 
372
APM_PowerOff:
79 diamond 373
        mov     ax, 5304h
374
        xor     bx, bx
375
        int     15h
1 ha 376
;!!!!!!!!!!!!!!!!!!!!!!!!
377
mov ax,0x5300
378
xor bx,bx
379
int 0x15
380
push ax
381
 
382
mov ax,0x5301
383
xor bx,bx
384
int 0x15
385
 
386
mov ax,0x5308
387
mov bx,1
388
mov cx,bx
389
int 0x15
390
 
391
mov ax,0x530E
392
xor bx,bx
393
pop cx
394
int 0x15
395
 
396
mov ax,0x530D
397
mov bx,1
398
mov cx,bx
399
int 0x15
400
 
401
mov ax,0x530F
402
mov bx,1
403
mov cx,bx
404
int 0x15
405
 
406
mov ax,0x5307
407
mov bx,1
408
mov cx,3
409
int 0x15
410
;!!!!!!!!!!!!!!!!!!!!!!!!
61 halyavin 411
fwwritedone:
1 ha 412
        ret
82 halyavin 413
org $+0x10000
61 halyavin 414
flm db 0
82 halyavin 415
org $-0x10000
61 halyavin 416
 
1 ha 417
floppy_write:   ; write diskette image to physical floppy
418
 
61 halyavin 419
        cmp  [flm-0x10000],byte 1
1 ha 420
        je   fwwritedone
61 halyavin 421
        mov  [flm-0x10000],byte 1
1 ha 422
 
117 mario79 423
    xor    ax, ax        ; reset drive
424
    xor    dx, dx
1 ha 425
        int     0x13
426
 
427
        mov     cx,0x0001               ; startcyl,startsector
61 halyavin 428
;        mov     dx,0x0000               ; starthead,drive
117 mario79 429
    xor    dx, dx
430
        mov    ax, 80*2               ; read no of sect
1 ha 431
 
432
      fwwrites:
117 mario79 433
    push    ax
1 ha 434
 
435
        ; move 1mb+ -> 0:a000
436
 
117 mario79 437
    pusha
1 ha 438
        mov     si,fwmovedesc -0x10000
439
        mov     cx,256*18
440
        mov     ah,0x87
117 mario79 441
        push    ds
442
        pop    es
1 ha 443
        int     0x15
117 mario79 444
        add    dword [fwmovedesc-0x10000+0x12], 512*18
1 ha 445
        popa
446
 
447
        xor     si,si
117 mario79 448
        mov    es,si
1 ha 449
      fwnewwrite:
450
        mov     bx,0xa000               ; es:bx -> data area
451
        mov     ax,0x0300+18            ; read, no of sectors to read
452
        int     0x13
453
 
117 mario79 454
    test    ah, ah
1 ha 455
        jz      fwgoodwrite
456
 
117 mario79 457
    inc    si
1 ha 458
        cmp     si,10
459
        jnz     fwnewwrite
460
 
61 halyavin 461
; can't access diskette - return
117 mario79 462
    pop    ax
1 ha 463
        ret
464
 
465
      fwgoodwrite:
466
        inc     dh
467
        cmp     dh,2
468
        jnz     fwbb2
469
        mov     dh,0
470
        inc     ch
471
      fwbb2:
472
        pop     ax
473
        dec     ax
61 halyavin 474
        jnz     fwwrites
475
        ret
82 halyavin 476
org $+0x10000
1 ha 477
      fwmovedesc:
478
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
479
        db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
480
        db      0xff,0xff,0x0,0x00,0x10,0x93,0x0,0x0
481
        db      0xff,0xff,0x0,0xa0,0x00,0x93,0x0,0x0
482
        db      0x00,0x00,0x0,0x00,0x00,0x00,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
82 halyavin 486
org $-0x10000
1 ha 487
use32
82 halyavin 488
org $+0x10000
1 ha 489
uglobal
490
  shutdownpos dd 0x0
491
endg
492
 
493
iglobal
61 halyavin 494
if lang eq en
1 ha 495
shutdowntext:
61 halyavin 496
    db   "IT'S SAFE TO POWER OFF COMPUTER OR      "
497
    db   '                                        '
498
    db   '1) SAVE RAMDISK TO FLOPPY               '
499
    db   '2) APM - POWEROFF                       '
500
    db   '3) REBOOT                               '
501
    db   '4) RESTART KERNEL                       '
139 diamond 502
else if lang eq ru
61 halyavin 503
shutdowntext:
1 ha 504
    db   "Безопасное выключение компьютера или    "
505
    db   '                                        '
506
    db   '1) Сохранить рамдиск на дискету         '
507
    db   '2) APM - выключение питания             '
508
    db   '3) Перезагрузка системы                 '
509
    db   '4) Рестарт ядра из ОЗУ                  '
139 diamond 510
else
511
shutdowntext:
512
    db   "SIE KOENNEN DEN COMPUTER NUN AUSSCHALTEN"
513
    db   '                                        '
514
    db   '1) RAMDISK AUF DISK SPEICHERN           '
515
    db   '2) APM - AUSSCHALTEN                    '
516
    db   '3) NEUSTARTEN                           '
517
    db   '4) KERNEL NEU STARTEN                   '
61 halyavin 518
end if
1 ha 519
rosef:
520
    db 'ROSE    TXT'
521
endg