/*  ＣＤ演奏用  インクルードファイル  */

unsigned char   cd_play(unsigned char *,unsigned char,unsigned char);
void            cd_stop(void);
unsigned char   cd_pause(void);
unsigned char   cd_restart(void);
unsigned char   toc_read(unsigned char *);
unsigned        cd_status(unsigned char *);
unsigned char   cd_read(unsigned char *);
void            cd_vol_on(void);
void            cd_vol_off(void);
void            cd_vol(unsigned int);
void            cd_vol_l(unsigned int);
void            cd_vol_r(unsigned int);


union REGS      inregs,outregs;
struct SREGS    segregs;
int             i;
unsigned char   da[303];
unsigned        _data_seg;
unsigned        _buf_ofs;


unsigned char cd_play(unsigned char *data,unsigned char repeat,unsigned char num)
{
	if(repeat==0) inregs.h.ch=0x0;
	if(repeat==1) inregs.h.ch=0xff;
	if(repeat==2) inregs.h.ch=0xfe;

	for(i=0;i<6;i++){
	  da[i]=*(data+i);
	}

	_asm{
	  mov     _data_seg,ds
	  mov     ax,offset da
	  mov     _buf_ofs,ax
	}
	inregs.h.ah=0x50;
	inregs.h.al=0xc0;
	inregs.h.bh=num;
	inregs.h.cl=0x01;
	segregs.ds =_data_seg;
	inregs.x.di=_buf_ofs;
	int86(0x93,&inregs,&outregs);

	return outregs.h.ah;
}

void cd_stop(void)
{
	inregs.h.ah=0x52;
	inregs.h.al=0xc0;
	inregs.h.ch=0x0;
	int86(0x93,&inregs,&outregs);
}

unsigned char  cd_pause(void)
{
	inregs.h.ah=0x55;
	inregs.h.al=0xc0;
	inregs.h.ch=0x0;
	int86(0x93,&inregs,&outregs);

	return outregs.h.ah;
}

unsigned char  cd_restart(void)
{
	inregs.h.ah=0x56;
	inregs.h.al=0xc0;
	inregs.h.ch=0x0;
	int86(0x93,&inregs,&outregs);

	return outregs.h.ah;
}

unsigned char toc_read(unsigned char *data)
{
	_asm{
	  mov     _data_seg,ds
	  mov     ax,offset da
	  mov     _buf_ofs,ax
	}
	inregs.h.ah=0x54;
	inregs.h.al=0xc0;
	inregs.h.ch=0x00;
	inregs.h.cl=0x00;
	segregs.ds =_data_seg;
	inregs.x.di=_buf_ofs;
	int86x(0x93,&inregs,&outregs,&segregs);

	for(i=0;i<303;i++){
	  *(data+i)=da[i];
	}

	return outregs.h.ah;
}

unsigned cd_status(unsigned char *data)
{
	_asm{
	  mov     _data_seg,ds
	  mov     ax,offset da
	  mov     _buf_ofs,ax
	}
	inregs.h.ah=0x53;
	inregs.h.al=0xc0;
	inregs.h.ch=0x00;
	inregs.h.cl=0x00;
	segregs.ds =_data_seg;
	inregs.x.di=_buf_ofs;
	int86x(0x93,&inregs,&outregs,&segregs);

	for(i=0;i<10;i++){
	  *(data+i)=da[i];
	}

	return outregs.x.ax;
}

unsigned char cd_read(unsigned char *data)
{
	_asm{
	  mov     _data_seg,ds
	  mov     ax,offset da
	  mov     _buf_ofs,ax
	}
	inregs.h.ah=0x51;
	inregs.h.al=0xc0;
	inregs.h.ch=0x00;
	inregs.h.cl=0x00;
	segregs.ds =_data_seg;
	inregs.x.di=_buf_ofs;
	int86x(0x93,&inregs,&outregs,&segregs);

	for(i=0;i<6;i++){
	  *(data+i)=da[i];
	}

	return outregs.h.ah;
}

void cd_vol(unsigned int vol)
{
	outp(0x04e3,(3<<2)|0);
	outp(0x04e2,(unsigned char)(vol));
	outp(0x04e3,(3<<2)|1);
	outp(0x04e2,(unsigned char)(vol));
}

void cd_vol_on(void)
{
	outp(0x04e3,(3<<2)|0);
	outp(0x04e2,63);
	outp(0x04e3,(3<<2)|1);
	outp(0x04e2,63);
}

void cd_vol_off(void)
{
	outp(0x04e3,0);
	outp(0x04e2,0);
	outp(0x04e3,1);
	outp(0x04e2,0);
}

void cd_vol_l(unsigned int vol)
{
	outp(0x04e3,(3<<2)|0);
	outp(0x04e2,vol);
}

void cd_vol_r(unsigned int vol)
{
	outp(0x04e3,(3<<2)|1);
	outp(0x04e2,vol);
}
