Subversion Repositories Kolibri OS

Rev

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

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