Subversion Repositories Kolibri OS

Rev

Rev 381 | Rev 425 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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