Subversion Repositories Kolibri OS

Rev

Rev 30 | Rev 61 | 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.     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.  
  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
  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.  
  214. rdelay:
  215.     ret
  216. real_mode:
  217.  
  218.     lidt [old_ints_h-0x10000]
  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.    
  246.     mov  al,0
  247.     out  0x21,al
  248.     call rdelay
  249.     out  0xA1,al
  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:
  332.         cli
  333.  
  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
  370.  
  371.         wbinvd  ; write and invalidate cache
  372.  
  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
  387.         sti
  388.  
  389. ; bootloader interface
  390.         push    0x1000
  391.         pop     ds
  392.         mov     si, .bootloader_block-0x10000
  393.         mov     ax, 'KL'
  394.         jmp     0x1000:0000
  395.  
  396. .bootloader_block:
  397.         db      1       ; version
  398.         dw      1       ; floppy image is in memory
  399.         dd      0       ; cannot save parameters
  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
  564.