Subversion Repositories Kolibri OS

Rev

Rev 593 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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