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

📄 ecda.h

📁 DOS下CD播放程序: 1.0.32.MSDOS.WATCOM.C
💻 H
📖 第 1 页 / 共 2 页
字号:
/*
  哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
               ~ ENDEAVOUR CDROM AUDIO INTERFACE 1.0 ~

       -- (C) Copyright 1998 Karljohan Leuchowius / XybriD --


             -->> E-mail: cybrid@mad.scientist.com <<--
                  WWW:    http://i.am/cybrid

 Rev:  27th August  1998 - Cleaned up the code, completely rewritten
                           to C++ OOP (Object Oriented Programming)
                           code. Removed things that seemed to
                           be unimportant from the code to make
                           it smaller. Using Java style naming
                           conventions / Watcom C++32 11.0

       13th January 1998 - Initial Version (BETA) / Watcom C32 11.0

 
 Greetings to: SkyQ, Madman, Adviceman, Pezac, Guran, SUBMiSSiVE
               E-rotic - thanks for providing great coding music.
  哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
*/
#ifndef _ECDA_H
#define _ECDA_H

#include <i86.h>
#include <iostream.h>

#define EJECT_TRAY     0
#define RESET          2
#define CLOSE_TRAY     5
#define DATA_TRACK    64
#define LOCK           1
#define UNLOCK         0
#define BUSY         512
#define MEDIA_CHANGE   9
#define TRACK_MASK   208
#define WHOLE_CD       0
#define MAX          255
#define MIN            0
#define VERSION "1.0.32.MSDOS.WATCOM.C++"
#define BUILD "70"
// Lazy me.. X)
typedef unsigned char  uchar;
typedef unsigned short ushort;
typedef unsigned long  ulong;
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
class CDAudio {
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
 protected:
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
  struct DPMIPTR {
    unsigned int segment;
    unsigned int selector;
  };
#pragma pack(1);
  struct rminfo {
    ulong EDI;
    ulong ESI;
    ulong EBP;
    ulong reservedBySystem;
    ulong EBX;
    ulong EDX;
    ulong ECX;
    ulong EAX;
    ushort flags;
    ushort ES,DS,FS,GS,IP,CS,SP,SS;
  } RMI;
    union  REGS  regs;
    struct SREGS sregs;
    struct DPMIPTR CDDeviceReq;
    struct DPMIPTR CDDeviceExtra;
  struct {
    ushort drives;
    uchar  firstDrive;
    ushort currentTrack;
    ulong  trackPosition;
    uchar  trackType;
    uchar  lowAudio;
    uchar  highAudio;
    uchar  diskLengthMin;
    uchar  diskLengthSec;
    uchar  diskLengthFrames;
    ulong  endOfDisk;
    uchar  UPC[7];
    uchar  diskID[6];
    ulong  status;
    ushort error;
  } CDROMData;
  typedef struct IOCTLI {
    uchar  length;
    uchar  subunit;
    uchar  comcode;
    ushort status;
    uchar  unused[8];
    uchar  media;
    ulong  address;
    ushort bytes;
    ushort sector;
    ulong  volID;
  } IOCTLI;
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
// CLASS METHODS
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
  void  CDDeviceRequest(void);
  void  CDGetAudioInfo(void);
  void  CDSeek (ulong location);
  void  CDStatus(void);
  void  DPMIAllocDOSMem(short int paras, struct DPMIPTR *p);
  void  DPMIFreeDOSMem(struct DPMIPTR *p);
  ulong getTrackLength(short track);
  ulong HSG (ulong Value);
  void  playAudio(ulong begin, ulong end);
  void  PrepareRegisters(void);
  void  redBook (ulong Value, uchar * min, uchar * sec, uchar * frame);
  void  RMIRQ(char IRQ);
  void  setTrack(short track);
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
 public:
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
  struct CDVolumeInfo {
    uchar  mode;
    uchar  input0;
    uchar  volume0;
    uchar  input1;
    uchar  volume1;
    uchar  input2;
    uchar  volume2;
    uchar  input3;
    uchar  volume3;
  } CDVolumeInfo;
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
// CLASS METHODS
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
  CDAudio(void);                                         // default constructor
  ~CDAudio(void);                                        // destructor
  short getUPC(void);
  void  getVolume(void);
  ulong headPosition(void);
  void  info(void);
  void  play(int track, int fullCD);
  void  setVolume(uchar v1, uchar v2, uchar v3, uchar v4);
  void  stop(void);
};
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
CDAudio::~CDAudio(void) {
  DPMIFreeDOSMem(&CDDeviceReq);
  DPMIFreeDOSMem(&CDDeviceExtra);
}
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
ulong CDAudio::HSG (ulong Value) {
    uchar min, sec, frame;

  redBook (Value, &min, &sec, &frame);
  Value    = (ulong) min * 4500;
  Value   += (short)         sec * 75;
  Value   += frame - 150;
  return (Value);
}
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
void CDAudio::redBook (ulong Value, uchar * min, uchar * sec, uchar * frame) {
  *frame  = (Value & 0x000000FF);
  *sec    = (Value & 0x0000FF00) >> 8;
  *min    = (Value & 0x00FF0000) >> 16;
}
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
void CDAudio::RMIRQ(char IRQ) {
  memset (&regs, 0, sizeof (regs));
  regs.w.ax =  0x0300;              
  regs.h.bl =  IRQ;
  sregs.es =   FP_SEG(&RMI);
  regs.x.edi = FP_OFF(&RMI);
  int386x(0x31, &regs, &regs, &sregs);
}
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
void CDAudio::CDDeviceRequest (void) {
  PrepareRegisters();
  RMI.EAX = 0x01510;
  RMI.ECX = CDROMData.firstDrive;
  RMI.EDI = 0;
  RMI.ES  = CDDeviceReq.segment;
  RMIRQ (0x02F);
}
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
void CDAudio::CDGetAudioInfo (void) {
  typedef struct trackData {
    uchar  mode;
    uchar  lowest;
    uchar  highest;
    ulong  address;
  } trackData;
    static struct IOCTLI     * IOCTLIPointers;
    static struct trackData  * trackDataPointers;
    IOCTLIPointers     = (struct IOCTLI *)     (CDDeviceReq.segment*16);
    trackDataPointers  = (struct trackData *) (CDDeviceExtra.segment*16);

  memset (IOCTLIPointers, 0, sizeof (struct IOCTLI));
  memset (trackDataPointers, 0, sizeof (struct trackData));
  IOCTLIPointers->length   = sizeof (struct IOCTLI);
  IOCTLIPointers->comcode  = 3;
  IOCTLIPointers->address  = CDDeviceExtra.segment<<16;
  IOCTLIPointers->bytes    = sizeof (struct trackData);
  trackDataPointers->mode = 0x0A;
  CDDeviceRequest();
  memcpy(&CDROMData.diskID, &trackDataPointers->lowest, 6);
  CDROMData.lowAudio  = trackDataPointers->lowest;
  CDROMData.highAudio = trackDataPointers->highest;
  redBook (trackDataPointers->address, &CDROMData.diskLengthMin, &CDROMData.diskLengthSec, &CDROMData.diskLengthFrames);
  CDROMData.endOfDisk = HSG(trackDataPointers->address);
  CDROMData.error     = IOCTLIPointers->status;
}
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
CDAudio::CDAudio(void) {
  DPMIAllocDOSMem (4, &CDDeviceReq);
  DPMIAllocDOSMem (2, &CDDeviceExtra);
  PrepareRegisters();
  regs.x.eax = 0x01500;
  int386 (0x02F, &regs, &regs);
  CDROMData.drives      = (short)regs.x.ebx;
  CDROMData.firstDrive  = (short)regs.x.ecx;
  CDGetAudioInfo();
}
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
void CDAudio::PrepareRegisters(void) {
  memset(&RMI,0,sizeof(RMI));
  memset(&sregs,0,sizeof(sregs));
  memset(&regs,0,sizeof(regs));
}
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
void CDAudio::DPMIAllocDOSMem(short int paras, struct DPMIPTR *p) {
  PrepareRegisters();
  regs.w.ax=0x0100;
  regs.w.bx=paras;
  int386x(0x31, &regs, &regs, &sregs);
  p->segment=regs.w.ax;
  p->selector=regs.w.dx;
}
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
void CDAudio::DPMIFreeDOSMem(struct DPMIPTR *p) {
  memset(&sregs,0,sizeof(sregs));
  regs.w.ax=0x0101;
  regs.w.dx=p->selector;
  int386x(0x31, &regs, &regs, &sregs);
}

⌨️ 快捷键说明

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