Subversion Repositories Kolibri OS

Rev

Rev 425 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. $Revision: 431 $
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;                                                              ;;
  4. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  5. ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
  6. ;; Distributed under terms of the GNU General Public License    ;;
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8.  
  9. sys_cd_audio:
  10.  
  11.      cmp  word [cdbase],word 0
  12.      jnz  @f
  13.      mov  eax,1
  14.      ret
  15.    @@:
  16.  
  17.      ; eax=1 cdplay at ebx 0x00FFSSMM
  18.      ; eax=2 get tracklist size of ecx to [ebx]
  19.      ; eax=3 stop/pause playing
  20.  
  21.      cmp  eax,1
  22.      jnz  nocdp
  23.      call sys_cdplay
  24.      ret
  25.    nocdp:
  26.  
  27.      cmp eax,2
  28.      jnz nocdtl
  29.      mov edi,[TASK_BASE]
  30.      add edi,TASKDATA.mem_start
  31.      add ebx,[edi]
  32.      call sys_cdtracklist
  33.      ret
  34.    nocdtl:
  35.  
  36.      cmp eax,3
  37.      jnz nocdpause
  38.      call sys_cdpause
  39.      ret
  40.    nocdpause:
  41.  
  42.      mov eax,0xffffff01
  43.      ret
  44.  
  45.  
  46.  
  47. sys_cd_atapi_command:
  48.  
  49.      pushad
  50.  
  51.      mov  dx,word [cdbase]
  52.      add  dx,6
  53.      mov  ax,word [cdid]
  54.      out  dx,al
  55.      mov  esi,10
  56.      call delay_ms
  57.      mov  dx,word [cdbase]
  58.      add  dx,7
  59.      in   al,dx
  60.      and  al,0x80
  61.      cmp  al,0
  62.      jnz  res
  63.      jmp  cdl6
  64.    res:
  65.      mov dx,word [cdbase]
  66.      add dx,7
  67.      mov al,0x8
  68.      out dx,al
  69.      mov dx,word [cdbase]
  70.      add dx,0x206
  71.      mov al,0xe
  72.      out dx,al
  73.      mov  esi,1
  74.      call delay_ms
  75.      mov dx,word [cdbase]
  76.      add dx,0x206
  77.      mov al,0x8
  78.      out dx,al
  79.      mov  esi,30
  80.      call delay_ms
  81.      xor  cx,cx
  82.    cdl5:
  83.      inc  cx
  84.      cmp  cx,10
  85.      jz   cdl6
  86.      mov  dx,word [cdbase]
  87.      add  dx,7
  88.      in   al,dx
  89.      and  al,0x88
  90.      cmp  al,0x00
  91.      jz   cdl5
  92.      mov  esi,100
  93.      call delay_ms
  94.      jmp  cdl5
  95.    cdl6:
  96.      mov dx,word [cdbase]
  97.      add dx,4
  98.      mov al,0
  99.      out dx,al
  100.      mov dx,word [cdbase]
  101.      add dx,5
  102.      mov al,0
  103.      out dx,al
  104.      mov dx,word [cdbase]
  105.      add dx,7
  106.      mov al,0xec
  107.      out dx,al
  108.      mov  esi,5
  109.      call delay_ms
  110.      mov dx,word [cdbase]
  111.      add dx,1
  112.      mov al,0
  113.      out dx,al
  114.      add dx,1
  115.      mov al,0
  116.      out dx,al
  117.      add dx,1
  118.      mov al,0
  119.      out dx,al
  120.      add dx,1
  121.      mov al,0
  122.      out dx,al
  123.      add dx,1
  124.      mov al,128
  125.      out dx,al
  126.      add dx,2
  127.      mov al,0xa0
  128.      out dx,al
  129.      xor  cx,cx
  130.      mov  dx,word [cdbase]
  131.      add  dx,7
  132.    cdl1:
  133.      inc  cx
  134.      cmp  cx,100
  135.      jz   cdl2
  136.      in   al,dx
  137.      and  ax,0x88
  138.      cmp  al,0x8
  139.      jz   cdl2
  140.      mov  esi,2
  141.      call delay_ms
  142.      jmp  cdl1
  143.    cdl2:
  144.  
  145.      popad
  146.      ret
  147.  
  148.  
  149. sys_cdplay:
  150.  
  151.      mov  ax,5
  152.      push ax
  153.      push ebx
  154.    cdplay:
  155.      call sys_cd_atapi_command
  156.      cli
  157.      mov  dx,word [cdbase]
  158.      mov  ax,0x0047
  159.      out  dx,ax
  160.      mov  al,1
  161.      mov  ah,[esp+0] ; min xx
  162.      out  dx,ax
  163.      mov  ax,[esp+1] ; fr sec
  164.      out  dx,ax
  165.      mov  ax,256+99
  166.      out  dx,ax
  167.      mov  ax,0x0001
  168.      out  dx,ax
  169.      mov  ax,0x0000
  170.      out  dx,ax
  171.      mov  esi,10
  172.      call delay_ms
  173.      sti
  174.      add  dx,7
  175.      in   al,dx
  176.      test al,1
  177.      jz   cdplayok
  178.      mov  ax,[esp+4]
  179.      dec  ax
  180.      mov  [esp+4],ax
  181.      cmp  ax,0
  182.      jz   cdplayfail
  183.      jmp  cdplay
  184.    cdplayfail:
  185.    cdplayok:
  186.      pop  ebx
  187.      pop  ax
  188.      xor  eax, eax
  189.      ret
  190.  
  191.  
  192. sys_cdtracklist:
  193.  
  194.      push ebx
  195.    tcdplay:
  196.      call sys_cd_atapi_command
  197.      mov  dx,word [cdbase]
  198.      mov  ax,0x43+2*256
  199.      out  dx,ax
  200.      mov  ax,0x0
  201.      out  dx,ax
  202.      mov  ax,0x0
  203.      out  dx,ax
  204.      mov  ax,0x0
  205.      out  dx,ax
  206.      mov  ax,200
  207.      out  dx,ax
  208.      mov  ax,0x0
  209.      out  dx,ax
  210.      in   al,dx
  211.      mov  cx,1000
  212.      mov  dx,word [cdbase]
  213.      add  dx,7
  214.      cld
  215.    cdtrnwewait:
  216.      mov  esi,10
  217.      call delay_ms
  218.      in   al,dx
  219.      and  al,128
  220.      cmp  al,0
  221.      jz   cdtrl1
  222.      loop cdtrnwewait
  223.    cdtrl1:
  224.      ; read the result
  225.      mov  ecx,[esp+0]
  226.      mov  dx,word [cdbase]
  227.    cdtrread:
  228.      add  dx,7
  229.      in   al,dx
  230.      and  al,8
  231.      cmp  al,8
  232.      jnz  cdtrdone
  233.      sub  dx,7
  234.      in   ax,dx
  235.      mov  [ecx],ax
  236.      add  ecx,2
  237.      jmp  cdtrread
  238.    cdtrdone:
  239.      pop  ecx
  240.      xor  eax, eax
  241.      ret
  242.  
  243.  
  244. sys_cdpause:
  245.  
  246.      call sys_cd_atapi_command
  247.  
  248.      mov  dx,word [cdbase]
  249.      mov  ax,0x004B
  250.      out  dx,ax
  251.      mov  ax,0
  252.      out  dx,ax
  253.      mov  ax,0
  254.      out  dx,ax
  255.      mov  ax,0
  256.      out  dx,ax
  257.      mov  ax,0
  258.      out  dx,ax
  259.      mov  ax,0
  260.      out  dx,ax
  261.  
  262.      mov  esi,10
  263.      call delay_ms
  264.      add  dx,7
  265.      in   al,dx
  266.  
  267.      xor  eax, eax
  268.      ret
  269.  
  270.