Subversion Repositories Kolibri OS

Rev

Rev 388 | Go to most recent revision | Blame | 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. align 4
  11. pr_mode_exit:
  12.  
  13. ; setup stack
  14.         mov    ax, 0x3000
  15.         mov    ss, ax
  16.         mov    esp, 0x0EC00
  17. ; setup ds
  18.         push    cs
  19.         pop    ds
  20.  
  21.         lidt [old_ints_h]
  22. ;remap IRQs
  23.         mov  al,0x11
  24.         out  0x20,al
  25.         call rdelay
  26.         out  0xA0,al
  27.         call rdelay
  28.  
  29.         mov  al,0x08
  30.         out  0x21,al
  31.         call rdelay
  32.         mov  al,0x70
  33.         out  0xA1,al
  34.         call rdelay
  35.  
  36.         mov  al,0x04
  37.         out  0x21,al
  38.         call rdelay
  39.         mov  al,0x02
  40.         out  0xA1,al
  41.         call rdelay
  42.  
  43.         mov  al,0x01
  44.         out  0x21,al
  45.         call rdelay
  46.         out  0xA1,al
  47.         call rdelay
  48.  
  49.         mov  al,0xB8
  50.         out  0x21,al
  51.         call rdelay
  52.         mov  al,0xBD
  53.         out  0xA1,al
  54.         sti
  55.  
  56. temp_3456:
  57.         xor  ax,ax
  58.         mov  es,ax
  59.         mov  al,byte [es:0x9030]
  60.         cmp  al,1
  61.         jl   nbw
  62.         cmp  al,4
  63.         jle  nbw32
  64.  
  65. nbw:
  66.         in   al,0x60
  67.         call pause_key
  68.         cmp  al,6
  69.         jae  nbw
  70.         mov  bl,al
  71. nbw2:
  72.         in   al,0x60
  73.         call pause_key
  74.         cmp  al,bl
  75.         je   nbw2
  76.         cmp  al,240  ;ax,240
  77.         jne  nbw31
  78.         mov  al,bl
  79.         dec  ax
  80.         jmp  nbw32
  81. nbw31:
  82.         add  bl,128
  83.         cmp  al,bl
  84.         jne  nbw
  85.         sub  al,129
  86. nbw32:
  87.  
  88.         dec  ax    ; 1 = write floppy
  89.         js   nbw
  90.         jnz  no_floppy_write
  91.         call floppy_write
  92.         jmp  temp_3456 ;nbw
  93. no_floppy_write:
  94.  
  95.         dec  ax    ; 2 = power off
  96.         jnz  no_apm_off
  97.         call APM_PowerOff
  98.         jmp  $
  99. no_apm_off:
  100.  
  101.         dec  ax    ; 3 = reboot
  102.         jnz  restart_kernel        ; 4 = restart kernel
  103.         push 0x40
  104.         pop  ds
  105.         mov  word[0x0072],0x1234
  106.         jmp  0xF000:0xFFF0
  107.  
  108. pause_key:
  109.         mov cx,100
  110. pause_key_1:
  111.         loop  pause_key_1
  112.         ret
  113.  
  114. rdelay:
  115.         ret
  116.  
  117. floppy_write:   ; write diskette image to physical floppy
  118.  
  119.         cmp  [flm],byte 1
  120.         je   fwwritedone
  121.         mov  [flm],byte 1
  122.  
  123.         xor    ax, ax        ; reset drive
  124.         xor    dx, dx
  125.         int     0x13
  126.  
  127.         mov     cx,0x0001               ; startcyl,startsector
  128.         xor    dx, dx                    ; starthead,drive
  129.         mov    ax, 80*2               ; read no of sect
  130.  
  131. fwwrites:
  132.         push    ax
  133.  
  134.         ; move 1mb+ -> 0:a000
  135.  
  136.          pusha
  137.         mov     si, fwmovedesc
  138.         mov     cx,256*18
  139.         mov     ah,0x87
  140.         push    ds
  141.         pop    es
  142.         int     0x15
  143.         add    dword [fwmovedesc+0x12], 512*18
  144.         popa
  145.  
  146.         xor     si,si
  147.         mov    es,si
  148. fwnewwrite:
  149.         mov     bx,0xa000               ; es:bx -> data area
  150.         mov     ax,0x0300+18            ; read, no of sectors to read
  151.         int     0x13
  152.  
  153.          test    ah, ah
  154.         jz      fwgoodwrite
  155.  
  156.         inc    si
  157.         cmp     si,10
  158.         jnz     fwnewwrite
  159.  
  160. ; can't access diskette - return
  161.         pop    ax
  162.         ret
  163.  
  164. fwgoodwrite:
  165.         inc     dh
  166.         cmp     dh,2
  167.         jnz     fwbb2
  168.         mov     dh,0
  169.         inc     ch
  170. fwbb2:
  171.         pop     ax
  172.         dec     ax
  173.         jnz     fwwrites
  174.         ret
  175.  
  176. APM_PowerOff:
  177.         mov     ax, 5304h
  178.         xor     bx, bx
  179.         int     15h
  180. ;!!!!!!!!!!!!!!!!!!!!!!!!
  181.         mov ax,0x5300
  182.         xor bx,bx
  183.         int 0x15
  184.         push ax
  185.  
  186.         mov ax,0x5301
  187.         xor bx,bx
  188.         int 0x15
  189.  
  190.         mov ax,0x5308
  191.         mov bx,1
  192.         mov cx,bx
  193.         int 0x15
  194.  
  195.         mov ax,0x530E
  196.         xor bx,bx
  197.         pop cx
  198.         int 0x15
  199.  
  200.         mov ax,0x530D
  201.         mov bx,1
  202.         mov cx,bx
  203.         int 0x15
  204.  
  205.         mov ax,0x530F
  206.         mov bx,1
  207.         mov cx,bx
  208.         int 0x15
  209.  
  210.         mov ax,0x5307
  211.         mov bx,1
  212.         mov cx,3
  213.         int 0x15
  214. ;!!!!!!!!!!!!!!!!!!!!!!!!
  215. fwwritedone:
  216.         ret
  217.  
  218. restart_kernel:
  219.  
  220.         mov     ax,0x0003      ; set text mode for screen
  221.         int     0x10
  222.         jmp     0x4000:0000
  223.  
  224. restart_kernel_4000:
  225.         cli
  226.  
  227.         push    ds
  228.         pop    es
  229.         mov    cx, 0x8000
  230.         push    cx
  231.         mov    ds, cx
  232.         xor    si, si
  233.         xor    di, di
  234.         rep    movsw
  235.         push    0x9000
  236.         pop    ds
  237.         push    0x2000
  238.         pop    es
  239.         pop    cx
  240.         rep    movsw
  241.  
  242.         wbinvd  ; write and invalidate cache
  243.  
  244.         mov    al, 00110100b
  245.         out    43h, al
  246.         jcxz    $+2
  247.         mov    al, 0xFF
  248.         out    40h, al
  249.         jcxz    $+2
  250.         out    40h, al
  251.         jcxz    $+2
  252.         sti
  253.  
  254. ; (hint by Black_mirror)
  255. ; We must read data from keyboard port,
  256. ; because there may be situation when previous keyboard interrupt is lost
  257. ; (due to return to real mode and IRQ reprogramming)
  258. ; and next interrupt will not be generated (as keyboard waits for handling)
  259.         in      al, 0x60
  260.  
  261. ; bootloader interface
  262.         push    0x1000
  263.         pop    ds
  264.         mov    si, kernel_restart_bootblock
  265.         mov    ax, 'KL'
  266.         jmp     0x1000:0000
  267.  
  268.  
  269.