Subversion Repositories Kolibri OS

Rev

Rev 143 | Rev 224 | 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.  
  13.     push 3        ; stop playing cd
  14.     pop  eax
  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
  22.     jle  yes_shutdown_param
  23.  no_shutdown_parameter:
  24.  
  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:
  45.  
  46. ; read shutdown code:
  47. ; 1) display shutdown "window"
  48.  
  49.     mov  eax,[0xfe00]
  50.     shr  eax,1
  51.     lea  esi,[eax+220]        ; x end
  52.     sub  eax,220        ; x start
  53.  
  54.     mov  ebx,[0xfe04]
  55.     shr  ebx,1
  56.     mov  [shutdownpos],ebx
  57.     lea  ebp,[ebx+105]        ; y end
  58.     sub  ebx,120        ; y start
  59.  
  60.     xor  edi,edi
  61.     inc  edi        ; force putpixel & dtext
  62.     mov  ecx,0x0000ff
  63.  
  64. ; vertical loop begin
  65.   sdnewpix1:
  66.     push eax    ; save x start
  67.  
  68. ; horizontal loop begin
  69.   sdnewpix2:
  70.  
  71.     call [putpixel]
  72.  
  73.     inc  eax
  74.     cmp  eax,esi
  75.     jnz  sdnewpix2
  76. ; horizontal loop end
  77.  
  78.     dec  ecx    ; color
  79.     pop  eax    ; restore x start
  80.  
  81.     inc  ebx    ; advance y pos
  82.     cmp  ebx,ebp
  83.     jnz  sdnewpix1
  84. ; vertical loop end
  85.  
  86. ; 2) display text strings
  87. ;    a) version
  88.     mov  eax,[0xfe00]
  89.     shr  eax,1
  90.     shl  eax,16
  91.     mov  ax,word [shutdownpos]
  92.     push eax
  93.     sub  eax,(220-27)*10000h + 105
  94.     mov  ebx,0xffff00
  95.     mov  ecx,version
  96.     push 34
  97.     pop  edx
  98.     call dtext
  99.  
  100. ;    b) variants
  101.     add  eax,105+33
  102.     push 6
  103.     pop  esi
  104. ;    mov  ebx,0xffffff
  105.     mov  bl,0xFF
  106.     mov  ecx,shutdowntext
  107.     mov  dl,40
  108.   newsdt:
  109.     call dtext
  110.     add  eax,10
  111.     add  ecx,edx
  112.     dec  esi
  113.     jnz  newsdt
  114.  
  115. ; 3) load & display rose.txt
  116.     mov  eax,rosef          ; load rose.txt
  117.     xor  ebx,ebx
  118.     push 2
  119.     pop  ecx
  120.     mov  edx,0x90000
  121.     push edx
  122.     push 12
  123.     pop  esi
  124.     push edi    ; may be destroyed
  125.     call fileread
  126.     pop  edi
  127.  
  128.     pop  ecx
  129.     inc  ecx    ; do not display stars from rose.txt
  130.     pop  eax
  131.     add  eax,20*10000h - 110
  132.  
  133.     mov  ebx,0x00ff00
  134.     push 27
  135.     pop  edx
  136.  
  137.    nrl:
  138.     call dtext
  139. ;    sub  ebx,0x050000
  140.         ror     ebx, 16
  141.         sub     bl, 0x05
  142.         ror     ebx, 16
  143.     add  eax,8
  144.     add  ecx,31
  145.     cmp  cx,word 0x0001+25*31
  146.     jnz  nrl
  147.  
  148.     call checkVga_N13
  149.  
  150.  yes_shutdown_param:
  151.     cli
  152.  
  153.     mov  eax,kernel               ; load kernel.mnt to 0x8000:0
  154.     push 12
  155.     pop  esi
  156.     xor  ebx,ebx
  157.     or   ecx,-1
  158.     mov  edx,0x80000
  159.     call fileread
  160.  
  161.     mov  esi,restart_kernel_4000+0x10000  ; move kernel re-starter to 0x4000:0
  162.     mov  edi,0x40000
  163.     mov  ecx,1000
  164.     rep  movsb
  165.  
  166.     mov  eax,0x2F0000    ; restore 0x0 - 0xffff
  167.     xor  ebx,ebx
  168.     mov  ecx,0x10000
  169.     call memmove
  170.  
  171.     call restorefatchain
  172.  
  173.     mov  word [0x467+0],pr_mode_exit-0x10000
  174.     mov  word [0x467+2],0x1000
  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:
  188. org $-0x10000
  189.  
  190. ; setup stack
  191.     mov    ax, 3000h
  192.     mov    ss, ax
  193.     mov    esp, 0EC00h
  194. ; setup ds
  195.     push    cs
  196.     pop    ds
  197.  
  198.     lidt [old_ints_h-0x10000]
  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.    
  226.     mov  al,0
  227.     out  0x21,al
  228.     call rdelay
  229.     out  0xA1,al
  230.     sti
  231.  
  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.  
  241.   nbw:
  242.     in   al,0x60
  243.     call pause_key
  244.     cmp  al,6
  245.     jae  nbw
  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
  255.     dec  ax
  256.     jmp  nbw32
  257.   nbw31:
  258.     add  bl,128
  259.     cmp  al,bl
  260.     jne  nbw
  261.     sub  al,129
  262.  
  263.   nbw32:
  264.  
  265.     dec  ax    ; 1 = write floppy
  266.     js   nbw
  267.     jnz  no_floppy_write
  268.     call floppy_write
  269.     jmp  temp_3456 ;nbw
  270.   no_floppy_write:
  271.  
  272.     dec  ax    ; 2 = power off
  273.     jnz  no_apm_off
  274.     call APM_PowerOff
  275.     jmp  $
  276.   no_apm_off:
  277.  
  278.     dec  ax    ; 3 = reboot
  279.     jnz  restart_kernel        ; 4 = restart kernel
  280.     push 0x40
  281.     pop  ds
  282.     mov  word[0x0072],0x1234
  283.     jmp  0xF000:0xFFF0
  284.  
  285.     pause_key:
  286.       mov cx,100
  287.     pause_key_1:
  288.       loop  pause_key_1
  289.       ret
  290.  
  291. rdelay:
  292.     ret
  293.  
  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:
  308.         cli
  309.  
  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
  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
  346.  
  347.         wbinvd  ; write and invalidate cache
  348.  
  349. ;        mov     ax,0x1000
  350. ;        mov     es,ax
  351. ;        mov     ax,0x3000
  352. ;        mov     ss,ax
  353. ;        mov     sp,0xec00
  354. ; restore timer
  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
  363.         sti
  364.  
  365. ; bootloader interface
  366.     push    0x1000
  367.     pop    ds
  368.     mov    si, kernel_restart_bootblock-0x10000
  369.     mov    ax, 'KL'
  370.         jmp     0x1000:0000
  371.  
  372. APM_PowerOff:
  373.         mov     ax, 5304h
  374.         xor     bx, bx
  375.         int     15h
  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. ;!!!!!!!!!!!!!!!!!!!!!!!!
  411. fwwritedone:
  412.         ret
  413. org $+0x10000
  414. flm db 0
  415. org $-0x10000
  416.  
  417. floppy_write:   ; write diskette image to physical floppy
  418.  
  419.         cmp  [flm-0x10000],byte 1
  420.         je   fwwritedone
  421.         mov  [flm-0x10000],byte 1
  422.  
  423.     xor    ax, ax        ; reset drive
  424.     xor    dx, dx
  425.         int     0x13
  426.  
  427.         mov     cx,0x0001               ; startcyl,startsector
  428. ;        mov     dx,0x0000               ; starthead,drive
  429.     xor    dx, dx
  430.         mov    ax, 80*2               ; read no of sect
  431.  
  432.       fwwrites:
  433.     push    ax
  434.  
  435.         ; move 1mb+ -> 0:a000
  436.  
  437.     pusha
  438.         mov     si,fwmovedesc -0x10000
  439.         mov     cx,256*18
  440.         mov     ah,0x87
  441.         push    ds
  442.         pop    es
  443.         int     0x15
  444.         add    dword [fwmovedesc-0x10000+0x12], 512*18
  445.         popa
  446.  
  447.         xor     si,si
  448.         mov    es,si
  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.  
  454.     test    ah, ah
  455.         jz      fwgoodwrite
  456.  
  457.     inc    si
  458.         cmp     si,10
  459.         jnz     fwnewwrite
  460.  
  461. ; can't access diskette - return
  462.     pop    ax
  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
  474.         jnz     fwwrites
  475.         ret
  476. org $+0x10000
  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
  486. org $-0x10000
  487. use32
  488. org $+0x10000
  489. uglobal
  490.   shutdownpos dd 0x0
  491. endg
  492.  
  493. iglobal
  494. if lang eq en
  495. shutdowntext:
  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                       '
  502. else if lang eq ru
  503. shutdowntext:
  504.     db   "Безопасное выключение компьютера или    "
  505.     db   '                                        '
  506.     db   '1) Сохранить рамдиск на дискету         '
  507.     db   '2) APM - выключение питания             '
  508.     db   '3) Перезагрузка системы                 '
  509.     db   '4) Рестарт ядра из ОЗУ                  '
  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                   '
  518. end if
  519. rosef:
  520.     db 'ROSE    TXT'
  521. endg
  522.