;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; ;; Distributed under terms of the GNU General Public License ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; $Revision: 2455 $ sys_cd_audio: cmp word [cdbase], word 0 jnz @f mov eax, 1 ret @@: ; eax=1 cdplay at ebx 0x00FFSSMM ; eax=2 get tracklist size of ecx to [ebx] ; eax=3 stop/pause playing cmp eax, 1 jnz nocdp call sys_cdplay ret nocdp: cmp eax, 2 jnz nocdtl mov edi, [TASK_BASE] add edi, TASKDATA.mem_start add ebx, [edi] call sys_cdtracklist ret nocdtl: cmp eax, 3 jnz nocdpause call sys_cdpause ret nocdpause: mov eax, 0xffffff01 ret sys_cd_atapi_command: pushad mov dx, word [cdbase] add dx, 6 mov ax, word [cdid] out dx, al mov esi, 10 call delay_ms mov dx, word [cdbase] add dx, 7 in al, dx and al, 0x80 cmp al, 0 jnz res jmp cdl6 res: mov dx, word [cdbase] add dx, 7 mov al, 0x8 out dx, al mov dx, word [cdbase] add dx, 0x206 mov al, 0xe out dx, al mov esi, 1 call delay_ms mov dx, word [cdbase] add dx, 0x206 mov al, 0x8 out dx, al mov esi, 30 call delay_ms xor cx, cx cdl5: inc cx cmp cx, 10 jz cdl6 mov dx, word [cdbase] add dx, 7 in al, dx and al, 0x88 cmp al, 0x00 jz cdl5 mov esi, 100 call delay_ms jmp cdl5 cdl6: mov dx, word [cdbase] add dx, 4 mov al, 0 out dx, al mov dx, word [cdbase] add dx, 5 mov al, 0 out dx, al mov dx, word [cdbase] add dx, 7 mov al, 0xec out dx, al mov esi, 5 call delay_ms mov dx, word [cdbase] add dx, 1 mov al, 0 out dx, al add dx, 1 mov al, 0 out dx, al add dx, 1 mov al, 0 out dx, al add dx, 1 mov al, 0 out dx, al add dx, 1 mov al, 128 out dx, al add dx, 2 mov al, 0xa0 out dx, al xor cx, cx mov dx, word [cdbase] add dx, 7 cdl1: inc cx cmp cx, 100 jz cdl2 in al, dx and ax, 0x88 cmp al, 0x8 jz cdl2 mov esi, 2 call delay_ms jmp cdl1 cdl2: popad ret sys_cdplay: mov ax, 5 push ax push ebx cdplay: call sys_cd_atapi_command cli mov dx, word [cdbase] mov ax, 0x0047 out dx, ax mov al, 1 mov ah, [esp+0]; min xx out dx, ax mov ax, [esp+1]; fr sec out dx, ax mov ax, 256+99 out dx, ax mov ax, 0x0001 out dx, ax mov ax, 0x0000 out dx, ax mov esi, 10 call delay_ms sti add dx, 7 in al, dx test al, 1 jz cdplayok mov ax, [esp+4] dec ax mov [esp+4], ax cmp ax, 0 jz cdplayfail jmp cdplay cdplayfail: cdplayok: pop ebx pop ax xor eax, eax ret sys_cdtracklist: push ebx tcdplay: call sys_cd_atapi_command mov dx, word [cdbase] mov ax, 0x43+2*256 out dx, ax mov ax, 0x0 out dx, ax mov ax, 0x0 out dx, ax mov ax, 0x0 out dx, ax mov ax, 200 out dx, ax mov ax, 0x0 out dx, ax in al, dx mov cx, 1000 mov dx, word [cdbase] add dx, 7 cld cdtrnwewait: mov esi, 10 call delay_ms in al, dx and al, 128 cmp al, 0 jz cdtrl1 loop cdtrnwewait cdtrl1: ; read the result mov ecx, [esp+0] mov dx, word [cdbase] cdtrread: add dx, 7 in al, dx and al, 8 cmp al, 8 jnz cdtrdone sub dx, 7 in ax, dx mov [ecx], ax add ecx, 2 jmp cdtrread cdtrdone: pop ecx xor eax, eax ret sys_cdpause: call sys_cd_atapi_command mov dx, word [cdbase] mov ax, 0x004B out dx, ax mov ax, 0 out dx, ax mov ax, 0 out dx, ax mov ax, 0 out dx, ax mov ax, 0 out dx, ax mov ax, 0 out dx, ax mov esi, 10 call delay_ms add dx, 7 in al, dx xor eax, eax ret