Subversion Repositories Kolibri OS

Rev

Rev 183 | Rev 227 | 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,[0xfe04]
  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          ; 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.     call fileread
  127.     pop  edi
  128.  
  129.     pop  ecx
  130.     inc  ecx    ; do not display stars from rose.txt
  131.     pop  eax
  132.     add  eax,20*10000h - 110
  133.  
  134.     mov  ebx,0x00ff00
  135.     push 27
  136.     pop  edx
  137.  
  138.    nrl:
  139.     call dtext
  140. ;    sub  ebx,0x050000
  141.         ror     ebx, 16
  142.         sub     bl, 0x05
  143.         ror     ebx, 16
  144.     add  eax,8
  145.     add  ecx,31
  146.     cmp  cx,word 0x0001+25*31
  147.     jnz  nrl
  148.  
  149.     call checkVga_N13
  150.  
  151.  yes_shutdown_param:
  152.     cli
  153.  
  154.     mov  eax,kernel               ; load kernel.mnt to 0x8000:0
  155.     push 12
  156.     pop  esi
  157.     xor  ebx,ebx
  158.     or   ecx,-1
  159.     mov  edx,0x80000
  160.     call fileread
  161.  
  162.     mov  esi,restart_kernel_4000+0x10000  ; move kernel re-starter to 0x4000:0
  163.     mov  edi,0x40000
  164.     mov  ecx,1000
  165.     rep  movsb
  166.  
  167.     mov  eax,0x2F0000    ; restore 0x0 - 0xffff
  168.     xor  ebx,ebx
  169.     mov  ecx,0x10000
  170.     call memmove
  171.  
  172.     call restorefatchain
  173.  
  174.     mov  word [0x467+0],pr_mode_exit-0x10000
  175.     mov  word [0x467+2],0x1000
  176.  
  177.     mov  al,0x0F
  178.     out  0x70,al
  179.     mov  al,0x05
  180.     out  0x71,al
  181.  
  182.     mov  al,0xFE
  183.     out  0x64,al
  184.     hlt
  185.  
  186. use16
  187.  
  188. pr_mode_exit:
  189. org $-0x10000
  190.  
  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.  
  199.     lidt [old_ints_h-0x10000]
  200. ;remap IRQs
  201.     mov  al,0x11
  202.     out  0x20,al
  203.     call rdelay
  204.     out  0xA0,al
  205.     call rdelay
  206.    
  207.     mov  al,0x08
  208.     out  0x21,al
  209.     call rdelay
  210.     mov  al,0x70
  211.     out  0xA1,al
  212.     call rdelay
  213.    
  214.     mov  al,0x04
  215.     out  0x21,al
  216.     call rdelay
  217.     mov  al,0x02
  218.     out  0xA1,al
  219.     call rdelay
  220.    
  221.     mov  al,0x01
  222.     out  0x21,al
  223.     call rdelay
  224.     out  0xA1,al
  225.     call rdelay
  226.    
  227.     mov  al,0
  228.     out  0x21,al
  229.     call rdelay
  230.     out  0xA1,al
  231.     sti
  232.  
  233.   temp_3456:
  234.     xor  ax,ax
  235.     mov  es,ax
  236.     mov  al,byte [es:0x9030]
  237.     cmp  al,1
  238.     jl   nbw
  239.     cmp  al,4
  240.     jle  nbw32
  241.  
  242.   nbw:
  243.     in   al,0x60
  244.     call pause_key
  245.     cmp  al,6
  246.     jae  nbw
  247.     mov  bl,al
  248.   nbw2:
  249.     in   al,0x60
  250.     call pause_key
  251.     cmp  al,bl
  252.     je   nbw2
  253.     cmp  al,240  ;ax,240
  254.     jne  nbw31
  255.     mov  al,bl
  256.     dec  ax
  257.     jmp  nbw32
  258.   nbw31:
  259.     add  bl,128
  260.     cmp  al,bl
  261.     jne  nbw
  262.     sub  al,129
  263.  
  264.   nbw32:
  265.  
  266.     dec  ax    ; 1 = write floppy
  267.     js   nbw
  268.     jnz  no_floppy_write
  269.     call floppy_write
  270.     jmp  temp_3456 ;nbw
  271.   no_floppy_write:
  272.  
  273.     dec  ax    ; 2 = power off
  274.     jnz  no_apm_off
  275.     call APM_PowerOff
  276.     jmp  $
  277.   no_apm_off:
  278.  
  279.     dec  ax    ; 3 = reboot
  280.     jnz  restart_kernel        ; 4 = restart kernel
  281.     push 0x40
  282.     pop  ds
  283.     mov  word[0x0072],0x1234
  284.     jmp  0xF000:0xFFF0
  285.  
  286.     pause_key:
  287.       mov cx,100
  288.     pause_key_1:
  289.       loop  pause_key_1
  290.       ret
  291.  
  292. rdelay:
  293.     ret
  294.  
  295. iglobal
  296.   kernel  db  'KERNEL  MNT'
  297. ;  shutdown_parameter db 0
  298. endg
  299.  
  300. restart_kernel:
  301.  
  302.         mov     ax,0x0003      ; set text mode for screen
  303.         int     0x10
  304.  
  305.         jmp     0x4000:0000
  306.  
  307.  
  308. restart_kernel_4000:
  309.         cli
  310.  
  311. ;        mov     di,0x1000      ; load kernel image from 0x8000:0 -> 0x1000:0
  312. ;
  313. ;      new_kernel_block_move:
  314. ;
  315. ;        mov     ebx,0
  316. ;
  317. ;      new_kernel_byte_move:
  318. ;
  319. ;        mov     ax,di
  320. ;        add     ax,0x7000
  321. ;        mov     es,ax
  322. ;        mov     dl,[es:bx]
  323. ;        mov     es,di
  324. ;        mov     [es:bx],dl
  325. ;
  326. ;        inc     ebx
  327. ;        cmp     ebx,65536
  328. ;        jbe     new_kernel_byte_move
  329. ;
  330. ;        add     di,0x1000
  331. ;        cmp     di,0x2000
  332. ;        jbe     new_kernel_block_move
  333.     push    ds
  334.     pop    es
  335.     mov    cx, 0x8000
  336.     push    cx
  337.     mov    ds, cx
  338.     xor    si, si
  339.     xor    di, di
  340.     rep    movsw
  341.     push    0x9000
  342.     pop    ds
  343.     push    0x2000
  344.     pop    es
  345.     pop    cx
  346.     rep    movsw
  347.  
  348.         wbinvd  ; write and invalidate cache
  349.  
  350. ;        mov     ax,0x1000
  351. ;        mov     es,ax
  352. ;        mov     ax,0x3000
  353. ;        mov     ss,ax
  354. ;        mov     sp,0xec00
  355. ; restore timer
  356.     mov    al, 00110100b
  357.     out    43h, al
  358.     jcxz    $+2
  359.     mov    al, 0xFF
  360.     out    40h, al
  361.     jcxz    $+2
  362.     out    40h, al
  363.     jcxz    $+2
  364.         sti
  365.  
  366. ; bootloader interface
  367.     push    0x1000
  368.     pop    ds
  369.     mov    si, kernel_restart_bootblock-0x10000
  370.     mov    ax, 'KL'
  371.         jmp     0x1000:0000
  372.  
  373. APM_PowerOff:
  374.         mov     ax, 5304h
  375.         xor     bx, bx
  376.         int     15h
  377. ;!!!!!!!!!!!!!!!!!!!!!!!!
  378. mov ax,0x5300
  379. xor bx,bx
  380. int 0x15
  381. push ax
  382.  
  383. mov ax,0x5301
  384. xor bx,bx
  385. int 0x15
  386.  
  387. mov ax,0x5308
  388. mov bx,1
  389. mov cx,bx
  390. int 0x15
  391.  
  392. mov ax,0x530E
  393. xor bx,bx
  394. pop cx
  395. int 0x15
  396.  
  397. mov ax,0x530D
  398. mov bx,1
  399. mov cx,bx
  400. int 0x15
  401.  
  402. mov ax,0x530F
  403. mov bx,1
  404. mov cx,bx
  405. int 0x15
  406.  
  407. mov ax,0x5307
  408. mov bx,1
  409. mov cx,3
  410. int 0x15
  411. ;!!!!!!!!!!!!!!!!!!!!!!!!
  412. fwwritedone:
  413.         ret
  414. org $+0x10000
  415. flm db 0
  416. org $-0x10000
  417.  
  418. floppy_write:   ; write diskette image to physical floppy
  419.  
  420.         cmp  [flm-0x10000],byte 1
  421.         je   fwwritedone
  422.         mov  [flm-0x10000],byte 1
  423.  
  424.     xor    ax, ax        ; reset drive
  425.     xor    dx, dx
  426.         int     0x13
  427.  
  428.         mov     cx,0x0001               ; startcyl,startsector
  429. ;        mov     dx,0x0000               ; starthead,drive
  430.     xor    dx, dx
  431.         mov    ax, 80*2               ; read no of sect
  432.  
  433.       fwwrites:
  434.     push    ax
  435.  
  436.         ; move 1mb+ -> 0:a000
  437.  
  438.     pusha
  439.         mov     si,fwmovedesc -0x10000
  440.         mov     cx,256*18
  441.         mov     ah,0x87
  442.         push    ds
  443.         pop    es
  444.         int     0x15
  445.         add    dword [fwmovedesc-0x10000+0x12], 512*18
  446.         popa
  447.  
  448.         xor     si,si
  449.         mov    es,si
  450.       fwnewwrite:
  451.         mov     bx,0xa000               ; es:bx -> data area
  452.         mov     ax,0x0300+18            ; read, no of sectors to read
  453.         int     0x13
  454.  
  455.     test    ah, ah
  456.         jz      fwgoodwrite
  457.  
  458.     inc    si
  459.         cmp     si,10
  460.         jnz     fwnewwrite
  461.  
  462. ; can't access diskette - return
  463.     pop    ax
  464.         ret
  465.  
  466.       fwgoodwrite:
  467.         inc     dh
  468.         cmp     dh,2
  469.         jnz     fwbb2
  470.         mov     dh,0
  471.         inc     ch
  472.       fwbb2:
  473.         pop     ax
  474.         dec     ax
  475.         jnz     fwwrites
  476.         ret
  477. org $+0x10000
  478.       fwmovedesc:
  479.         db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
  480.         db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
  481.         db      0xff,0xff,0x0,0x00,0x10,0x93,0x0,0x0
  482.         db      0xff,0xff,0x0,0xa0,0x00,0x93,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.         db      0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
  487. org $-0x10000
  488. use32
  489. org $+0x10000
  490. uglobal
  491.   shutdownpos dd 0x0
  492. endg
  493.  
  494. iglobal
  495. if lang eq en
  496. shutdowntext:
  497.     db   "IT'S SAFE TO POWER OFF COMPUTER OR      "
  498.     db   '                                        '
  499.     db   '1) SAVE RAMDISK TO FLOPPY               '
  500.     db   '2) APM - POWEROFF                       '
  501.     db   '3) REBOOT                               '
  502.     db   '4) RESTART KERNEL                       '
  503. else if lang eq ru
  504. shutdowntext:
  505.     db   "¥§®¯ á­®¥ ¢ëª«î祭¨¥ ª®¬¯ìîâ¥à  ¨«¨    "
  506.     db   '                                        '
  507.     db   '1) ‘®åà ­¨âì à ¬¤¨áª ­  ¤¨áª¥âã         '
  508.     db   '2) APM - ¢ëª«î祭¨¥ ¯¨â ­¨ï             '
  509.     db   '3) ¥à¥§ £à㧪  á¨áâ¥¬ë                 '
  510.     db   '4) ¥áâ àâ ï¤à  ¨§ Ž‡“                  '
  511. else
  512. shutdowntext:
  513.     db   "SIE KOENNEN DEN COMPUTER NUN AUSSCHALTEN"
  514.     db   '                                        '
  515.     db   '1) RAMDISK AUF DISK SPEICHERN           '
  516.     db   '2) APM - AUSSCHALTEN                    '
  517.     db   '3) NEUSTARTEN                           '
  518.     db   '4) KERNEL NEU STARTEN                   '
  519. end if
  520. rosef:
  521.     db 'ROSE    TXT'
  522. endg
  523.