⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdrom.cpp

📁 控制cdrom播放音乐的程序。
💻 CPP
字号:
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <iostream.h>

class CD_ROM
   {
	 private:
		unsigned char* dev_name;
		unsigned playing;
		unsigned cd;
		unsigned opened;
		unsigned char continuous;

		void is_open();
		void no_cd();
		void is_playing();
	 public:
		CD_ROM();
		unsigned first_track;
		unsigned last_track;
		unsigned state;
		unsigned sector[30];
		unsigned offset[30];
		unsigned track_time[30];

		void init();
		void status();
		void reset();
		void open();
		void close();
		void play(unsigned char);
		void stop();
		void get_tracks();
		void disk_info();

	 unsigned char* name()
	    { return dev_name; }
	 unsigned first()
	    { return first_track; }
	 unsigned last()
	    { return last_track; }
   };


CD_ROM::CD_ROM()
{
   playing=cd=opened=0;
}


void CD_ROM::init()
{
   unsigned char num=0,h;

   asm{push ds
	  push di
	  mov ah,0x0048
	  mov bx,0x0001
	  int 0x0021

	  mov es,ax
	  mov bx,0
	  mov ax,0x1501
	  int 0x002f
	  lds di,es:[bx+1]
	  add di,10
	  mov cx,9
	 }
loop:
   asm{mov bh,ds:[di]
	  mov h,bh
	 }
   dev_name[num]=h;
   num++;
   asm{
	  inc di
       dec cx
	  cmp cx,0
       jne loop
	 }
   dev_name[8]=0x0000;
   asm{mov ah,0x0049
	  int 0x0021
       pop di
	  pop ds

	 }
}


void CD_ROM::get_tracks()
{
   unsigned int dev_info_low,dev_info_high;
   unsigned char* buffer=name();
   unsigned int mins,secs;
   char track,l;
   char dev_info[2];
   unsigned segm,off;

   off=FP_OFF(dev_name);
   segm=FP_SEG(dev_name);

   asm{push ds
	  push di
	  
	  mov ah,0x0048
	  mov bx,0x0001
	  int 0x0021

	  mov  es,ax
	  mov  bx,0
	  mov  ax,0x1501
	  int  0x002f

	  mov  ax,0x3c00
	  mov  cx,0x0000

	  mov  dx,segm
	  mov  ds,dx
	  mov  dx,off

	  int  0x0021

	  mov  bx,ax

	  mov  cx,0x0064
	  mov  ax,es
	  mov  ds,ax
	  mov  dx,0
	  mov  di,dx
	  mov  byte ptr ds:[di],0x000a
	  mov  ax,0x4402

	  int  0x0021
	  mov  dx,ds:[di+1]

	  mov  byte ptr dev_info[0],dl
	  mov  byte ptr dev_info[1],dh

	  mov ah,0x0049
	  int 0x0021


	  pop  di
	  pop  ds
	 }
	 first_track=dev_info[0];
	 last_track=dev_info[1];

   l=last_track;

   asm{push ds
	  push di

	  mov ah,0x0048
	  mov bx,0x0001
	  int 0x0021

	  mov es,ax

	  mov bx,0
	  mov ax,0x1501
	  int 0x002f

	  mov ax,0x3c00
	  mov cx,0x0000
	  lds dx,buffer
	  int 0x0021

	  mov bx,ax
	  }
   for (track=1;track<=l;track++)
   {

   asm{push bx
	  mov cx,0x0064
	  mov ax,es
	  mov ds,ax
	  mov dx,0
	  mov di,dx
	  mov dl,track
	  mov byte ptr ds:[di],0x000b
	  mov byte ptr ds:[di+1],dl
	  xor dx,dx
	  mov ax,0x4402
	  int 0x0021

	  mov dx,ds:[di+2]
	  mov word ptr dev_info_low,dx

	  mov dx,ds:[di+4]
	  mov word ptr dev_info_high,dx
	 }
	 offset[track-1]=dev_info_low;
	 sector[track-1]=dev_info_high;
	 asm{pop bx}
   }
   asm{mov ah,0x0049
       int 0x0021
       pop di
	  pop ds
	 }

   for (track=1;track<l;track++)
   {
   if (offset[track]<offset[track-1]) {secs=(unsigned int) (offset[track]-offset[track-1]+65535l);mins=sector[track]-sector[track-1]-1;}
		else
	 {secs=offset[track]-offset[track-1];mins=sector[track]-sector[track-1];}
   secs=secs/255;
   if (secs>200) secs=secs-200;
   track_time[track-1]=mins*4500+secs*75;
   }
   track_time[l-1]=0xffff;

}

void CD_ROM::disk_info()
{
   unsigned segm,off,sectors,sectors_1;

   off=FP_OFF(dev_name);
   segm=FP_SEG(dev_name);

   asm{push ds
	  push di

	  mov ah,0x0048
	  mov bx,0x0001
	  int 0x0021

	  mov  es,ax
	  mov  bx,0
	  mov  ax,0x1501
	  int  0x002f

	  mov  ax,0x3c00
	  mov  cx,0x0000

	  mov  dx,segm
	  mov  ds,dx
	  mov  dx,off

	  int  0x0021

	  mov  bx,ax

	  mov  cx,0x0064
	  mov  ax,es
	  mov  ds,ax
	  mov  dx,0
	  mov  di,dx
	  mov  byte ptr ds:[di],0x0008
	  mov  ax,0x4402

	  int  0x0021
	  mov  dx,ds:[di+1]

	  mov  sectors,dx
	  mov  dx,ds:[di+3]
	  mov  sectors_1,dx

	  mov ah,0x0049
	  int 0x0021


	  pop  di
	  pop  ds
	 }
}


void CD_ROM::status()
{
   unsigned char* buffer=name();
   unsigned drive_state;

   asm{push ds
	  push di

	  mov ah,0x0048
	  mov bx,0x0001
	  int 0x0021

	  mov es,ax

	  mov ax,0x3c00
	  mov cx,0x0000

	  lds dx,buffer
	  int 0x0021

	  mov bx,ax
	  mov ax,es
	  mov ds,ax

	  mov ax,0x4402
	  mov cx,5
	  mov dx,0
	  mov di,dx
	  mov byte ptr ds:[di],6
	  int 0x0021

	  mov dx,ds:[di+1]
	  mov drive_state,dx

	  mov ah,0x0049
	  int 0x0021
	  pop di
	  pop ds

	 }
   state=drive_state;
   is_open();
   no_cd();
   is_playing();
}

void CD_ROM::is_open()
{
   unsigned temp=state;

   asm{test temp,1
	  jz   closed;
	 }
   opened=1;
   cout << "CD door is open.\n";
   return;
   closed:
   opened=0;
   cout << "CD door is closed.\n";
}

void CD_ROM::no_cd()
{
   unsigned temp=state;

   asm{test temp,100000000000b
	  jnz  empty
	 }
   cd=1;
   cout << "There is a CD in the drive.\n";
   return;
   empty:
   cd=0;
   cout << "There is no CD in the drive.\n";
}

void CD_ROM::is_playing()
{
   unsigned temp=state;

   asm{test temp,10000000000b
	  jz   playing_1
	 }
   playing=0;
   cout << "The CD is not playing.\n";
   return;
   playing_1:
   playing=1;
   cout << "The CD is not playing.\n";
}


void CD_ROM::open()
{
   unsigned char* buffer=name();

   asm{push ds
	  push di

	  mov ah,0x0048
	  mov bx,0x0001
	  int 0x0021

	  mov es,ax

	  mov ax,0x3c00
	  mov cx,0x0000

	  lds dx,buffer
	  int 0x0021

	  mov bx,ax
	  mov ax,es
	  mov ds,ax

	  mov ax,0x4403
	  mov cx,1
	  mov dx,0
	  mov di,dx
	  mov byte ptr ds:[di],0
	  int 0x0021
	  mov ah,0x0049
	  int 0x0021
	  pop di
	  pop ds

	 }
}

void CD_ROM::reset()
{
   unsigned char* buffer=name();

   asm{push ds
	  push di

	  mov ah,0x0048
	  mov bx,0x0001
	  int 0x0021

	  mov es,ax

	  mov ax,0x3c00
	  mov cx,0x0000
	  lds dx,buffer
	  int 0x0021

	  mov bx,ax
	  mov ax,es
	  mov ds,ax

	  mov ax,0x4403
	  mov cx,1
	  mov dx,0
	  mov di,dx
	  mov byte ptr ds:[di],2
	  int 0x0021
	  mov ah,0x0049
	  int 0x0021
	  pop di
	  pop ds

	 }
}


void CD_ROM::close()
{
   unsigned char* buffer=name();

   asm{push ds
	  push di

	  mov ah,0x0048
	  mov bx,0x0001
	  int 0x0021

	  mov es,ax

	  mov ax,0x3c00
	  mov cx,0x0000
	  lds dx,buffer
	  int 0x0021

	  mov bx,ax
	  mov ax,es
	  mov ds,ax

	  mov ax,0x4403
	  mov cx,1
	  mov dx,0
	  mov di,dx
	  mov byte ptr ds:[di],5
	  int 0x0021
	  mov ah,0x0049
	  int 0x0021
	  pop di
	  pop ds

	 }
}

void CD_ROM::play(unsigned char track)
{
   unsigned int upper=sector[track-1],lower=offset[track-1],length;

   length=track_time[track-1];

   asm{push ds
	  push di

	  mov ah,0x0048
	  mov bx,0x0002
	  int 0x0021
 
	  mov es,ax

	  mov bx,1
	  mov ax,0x1501
	  int 0x002f

	  mov bx,0
	  mov dx,lower
	  mov byte ptr es:[bx],0x0016
	  mov byte ptr es:[bx+2],0x0084
	  mov byte ptr es:[bx+0x000d],0x0001
	  mov word ptr es:[bx+0x000e],dx
	  mov dx,upper
	  mov word ptr es:[bx+0x0010],dx
	  mov dx,length
	  mov word ptr es:[bx+0x0012],dx      //here is the length
	  mov word ptr es:[bx+0x0014],0x0000  //not sure of actual parameters
	  mov ax,0x1510
	  mov cx,0x0003
	  int 0x002f

	  mov ah,0x0049
	  int 0x0021
	  pop di
	  pop ds
	 }
}

void CD_ROM::stop()
{
   asm{push ds
	  push di

	  mov ah,0x0048
	  mov bx,0x0001
	  int 0x0021
	  
	  mov es,ax

	  mov bx,1
	  mov ax,0x1501
	  int 0x002f

	  mov bx,0
	  mov byte ptr es:[bx],0x000d
	  mov byte ptr es:[bx+2],0x0085
	  mov ax,0x1510
	  mov cx,0x0003
	  int 0x002f

	  mov ah,0x0049
	  int 0x0021
	  pop di
	  pop ds
	 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -