📄 ecda.h
字号:
/*
哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
~ 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 (®s, 0, sizeof (regs));
regs.w.ax = 0x0300;
regs.h.bl = IRQ;
sregs.es = FP_SEG(&RMI);
regs.x.edi = FP_OFF(&RMI);
int386x(0x31, ®s, ®s, &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, ®s, ®s);
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(®s,0,sizeof(regs));
}
// 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
void CDAudio::DPMIAllocDOSMem(short int paras, struct DPMIPTR *p) {
PrepareRegisters();
regs.w.ax=0x0100;
regs.w.bx=paras;
int386x(0x31, ®s, ®s, &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, ®s, ®s, &sregs);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -