home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 July
/
Chip_1998-07_cd.bin
/
ctenari
/
Soban
/
CD
/
CD1.C
next >
Wrap
C/C++ Source or Header
|
1995-08-10
|
7KB
|
331 lines
/*-------------------------------------------------------*/
/* Originally part of SOUNDHAX v1 by John M. Trindle */
/* FREEWARE 12/19/91 */
/*-------------------------------------------------------*/
/* Drobne upravy Petr Soban (c) 10.8.1995 */
/*-------------------------------------------------------*/
/* */
/* Program pro prehravani hudebnich CD */
/* */
/*-------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>
#define MULTIPLEX_INT 0x2f
#define INIT_MP_INT 0x1500
#define CDREQ_MP_INT 0x1510
#define STAT_HAS_AN_ERROR 0x8000
#define STAT_BUSY 0x0200
#define STAT_DONE 0x0100
#define CD_EJECT_COMMAND 0
#define CD_SEEK_COMMAND 131
#define CD_PLAY_COMMAND 132
#define CD_STOP_COMMAND 133
#define CD_RESUME_COMMAND 136
#define READ_IOCTL_COMMAND 3
#define WRITE_IOCTL_COMMAND 12
#define CD_STATUS_COMMAND 6
#define GET_AUDIO_DISKINFO 10
#define GET_AUDIO_TRACKINFO 11
#define ADDR_HSG 0
#define ADDR_RED 1
typedef struct
{
unsigned char ParamLength;
unsigned char SubUnit;
unsigned char CommandCode;
int Status;
unsigned long Reserved1;
unsigned long Reserved2;
unsigned char AddressMode;
void *BeginPointer;
unsigned long Length;
unsigned long Reserved3;
} CDCmdStru;
typedef struct
{
unsigned char CommandCode;
unsigned char TrackNumber;
unsigned long StartAddress;
unsigned char Control;
} CDTrackInfoStru;
typedef struct
{
unsigned char CommandCode;
} CDEjectStru;
typedef struct
{
unsigned char CommandCode;
unsigned long Status;
} CDStatusStru;
typedef struct
{
unsigned char AddrMode;
unsigned long FrameOffset;
unsigned long NumberFrames;
} CDPlayStru;
typedef struct DiskInfo_Rec {
unsigned char CommandCode;
unsigned char LoTrack;
unsigned char HiTrack;
unsigned long LeadOut;
} CDDiskInfoStru;
CDCmdStru CDCmdBlock;
CDTrackInfoStru TrackInfo[100];
CDDiskInfoStru DiskInfo;
long LastSector;
int NumTracks;
int CDRomLoaded,CDRomDrive;
unsigned int CheckCD2F()
{
union REGS regs;
regs.x.ax = INIT_MP_INT;
int86(MULTIPLEX_INT,®s,®s);
CDRomLoaded = regs.x.bx;
CDRomDrive = regs.x.cx;
return regs.h.al;
}
void CDEject()
{
CDEjectStru EjectRequestBlock;
EjectRequestBlock.CommandCode = CD_EJECT_COMMAND;
SendCDCommand(WRITE_IOCTL_COMMAND,&EjectRequestBlock,sizeof(CDEjectStru));
}
unsigned int CDStatus()
{
unsigned int RetVal;
CDStatusStru StatusRequestBlock;
StatusRequestBlock.CommandCode = CD_STATUS_COMMAND;
RetVal = SendCDCommand(READ_IOCTL_COMMAND,&StatusRequestBlock,sizeof(CDStatusStru));
return(RetVal);
}
CDStop()
{
return(SendCDCommand(CD_STOP_COMMAND,NULL,0));
}
CDResume()
{
return(SendCDCommand(CD_RESUME_COMMAND,NULL,0));
}
void CDPlay(long FrameOffset, long NumFrames)
{
SendCDCommand(CD_PLAY_COMMAND,(void *)FrameOffset,NumFrames);
}
void CDGetDiskInfo()
{
DiskInfo.CommandCode = GET_AUDIO_DISKINFO;
SendCDCommand(READ_IOCTL_COMMAND,&DiskInfo,sizeof(CDDiskInfoStru));
}
void PrintTimeFrames(long NumFrames)
{
long Mins;
long Secs;
long PlusFrames;
PlusFrames = NumFrames;
Secs = PlusFrames/75;
PlusFrames -= Secs*75;
Mins = Secs/60;
Secs -= Mins*60;
printf("%2ld:%02ld,%02ld",Mins,Secs,PlusFrames);
}
int SendCDCommand(int CommandCode, void *BeginPtr, long Length)
{
union REGS regs;
struct SREGS sregs;
CDCmdBlock.ParamLength = 13;
CDCmdBlock.SubUnit = 0;
CDCmdBlock.CommandCode = CommandCode;
CDCmdBlock.Status = 0;
CDCmdBlock.AddressMode = ADDR_HSG;
CDCmdBlock.BeginPointer = BeginPtr;
CDCmdBlock.Length = Length;
CDCmdBlock.Reserved3 = 0;
regs.x.ax = CDREQ_MP_INT;
regs.x.bx = FP_OFF(&CDCmdBlock);
regs.x.cx = CDRomDrive;
sregs.es = FP_SEG(&CDCmdBlock);
int86x(MULTIPLEX_INT,®s,®s,&sregs);
return(CDCmdBlock.Status);
}
unsigned long Red2HSG(unsigned long RedValue)
{
unsigned long Mins;
unsigned long Secs;
unsigned long PlusFrames;
PlusFrames = RedValue & 0x000000ffL;
Secs = ((RedValue & 0x0000ff00L) >> 8);
Mins = ((RedValue & 0x00ff0000L) >> 16);
return((Mins*60+Secs)*75+PlusFrames);
}
unsigned long CDTrackInfo(int TrackNumber, int Minutes, int Seconds, int Frames)
{
TrackInfo[TrackNumber].CommandCode = GET_AUDIO_TRACKINFO;
TrackInfo[TrackNumber].TrackNumber = TrackNumber;
SendCDCommand(READ_IOCTL_COMMAND,&(TrackInfo[TrackNumber]),sizeof(CDTrackInfoStru));
return(Red2HSG(TrackInfo[TrackNumber].StartAddress)+(Minutes*60L+((long)Seconds))*75L+((long)Frames));
}
int main(int argc, char *argv[])
{
int i,j;
int Track,StartMin,StartSec,EndMin,EndSec,StartFrame,EndFrame;
long StartSector,EndSector;
float TempFloat;
char LocalBuffer[132];
if (!CheckCD2F())
{
printf("MSCDEX NENI V PAMETI\n");
return 1;
}
CDGetDiskInfo();
LastSector = DiskInfo.LeadOut;
NumTracks = DiskInfo.HiTrack-DiskInfo.LoTrack+1;
printf("Cteni zarizeni: %c:\n",CDRomDrive+'A');
if (argc > 1)
{
Track = atoi(argv[1]);
printf("Start stopa %d, %d ",Track,NumTracks);
if (NumTracks==1) printf("stopa");
if ((NumTracks>2) && (NumTracks<5)) printf("stopy");
if (NumTracks>=5) printf("stop");
printf(" na disku.\n");
}
else
{
CDStop();
printf("\n Program pro prehravani zvukovych CD v1.0 (c) 1995 John M. Trindle & Petr Soban\n\n CD1 [start_stopa] [start_cas] [konec_cas]\n\n");
for (i = DiskInfo.LoTrack; i <= DiskInfo.HiTrack; i++)
{
CDTrackInfo(i,0,0,0);
}
TrackInfo[DiskInfo.HiTrack+1].StartAddress = DiskInfo.LeadOut;
for (i = DiskInfo.LoTrack; i <= DiskInfo.HiTrack; i++)
{
printf("Stopa %2d ",i);
PrintTimeFrames(Red2HSG(TrackInfo[i+1].StartAddress)-Red2HSG(TrackInfo[i].StartAddress));
printf("\n");
}
}
if (argc < 2) return 0;
EndSector = Red2HSG(DiskInfo.LeadOut)-150L; /* 150L Fudge Factor */
StartMin = 0;
StartSec = 0;
StartFrame = 0;
EndMin = 0;
EndSec = 0;
EndFrame = 0;
if (argc > 2)
{
strcpy(LocalBuffer,argv[2]);
StartMin = atoi(strtok(LocalBuffer,":"));
TempFloat = atof(strtok(NULL,","));
StartSec = (int) TempFloat;
StartFrame = ((int)(TempFloat*75))-StartSec*75;
}
StartSector = CDTrackInfo(Track,StartMin,StartSec,StartFrame);
if (argc > 3)
{
strcpy(LocalBuffer,argv[3]);
EndMin = atoi(strtok(LocalBuffer,":"));
TempFloat = atof(strtok(NULL,","));
EndSec = (int) TempFloat;
EndFrame = ((int)(TempFloat*75))-EndSec*75;
EndSector = CDTrackInfo(Track,EndMin,EndSec,EndFrame);
}
CDStop();
CDPlay(StartSector,EndSector-StartSector);
if (argc > 4) CDStop();
printf("\n");
return 0;
}