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: 2288 $
  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.