Subversion Repositories Kolibri OS

Rev

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