Annotation of src/cdrom.c, revision 1.1

1.1     ! root        1: /***************************************************************************
        !             2:  *    CDROM.C  - CD-ROM interface code (audio routines)                    *
        !             3:  *                                                                         *
        !             4:  ***************************************************************************/
        !             5: 
        !             6: #if 0     // old code for CD-ROM detection - doesn't work under Windows '95
        !             7: #include "stdio.h"
        !             8: #include "dos.h"
        !             9: #include "malloc.h"
        !            10: #include "sys\types.h"
        !            11: #include "sys\stat.h"
        !            12: #include "fcntl.h"
        !            13: #include <memcheck.h>
        !            14: 
        !            15: #ifdef __386__
        !            16: #define   LES_MKFP(s,o)  (void far *)(s<<4)
        !            17: #else
        !            18: #define   LES_MKFP(s,o)  MK_FP(s,o)
        !            19: #endif
        !            20: 
        !            21: #define   CMDBUFSIZE     22
        !            22: 
        !            23: #define   IOCMD2         0x4402
        !            24: #define   IOCMD3         0x4403
        !            25: 
        !            26: //** IOCTL3 commands
        !            27: #define   CD_OPENDOORCMD 0x00
        !            28: #define   CD_CLOSEDOORCMD 0x05
        !            29: #define   CD_RESETCMD    0x02
        !            30: 
        !            31: //** IOCTL2 commands
        !            32: #define   CD_STATUSCMD   0x06
        !            33: 
        !            34: short cddrive,
        !            35:      cddrives,
        !            36:      cdhdl,
        !            37:      cdhitrack,
        !            38:      cdlotrack,
        !            39:      cdtracktoplay;
        !            40: 
        !            41: long leadout;
        !            42: 
        !            43: unsigned short bufoff[100],bufseg[100],
        !            44:      cmdoff,cmdseg,
        !            45:      devoff,devseg,
        !            46:      nameoff,nameseg,
        !            47:      rmoff,rmseg;
        !            48: 
        !            49: char cddevname[9],
        !            50:      far *namebuf;
        !            51: 
        !            52: char far *cddevadr;
        !            53: 
        !            54: struct redbook {
        !            55:      char frame;
        !            56:      char second;
        !            57:      char minute;
        !            58:      char unused;
        !            59:      char control;
        !            60: } redbook[20];
        !            61: 
        !            62: struct rmregs {
        !            63:      unsigned long edi,esi,ebp;
        !            64:      unsigned long reserved;
        !            65:      unsigned long ebx,edx,ecx,eax;
        !            66:      unsigned short flags,es,ds,fs,gs,ip,cs,sp,ss;
        !            67: } rmregs;
        !            68: 
        !            69: #ifdef __386__
        !            70: void
        !            71: rmint86(short intno,struct rmregs *rmptr)
        !            72: {
        !            73:      union REGS regs;
        !            74:      struct SREGS sregs;
        !            75: 
        !            76:      memset(&regs,0,sizeof(union REGS));
        !            77:      segread(&sregs);
        !            78:      regs.x.eax=0x0300;
        !            79:      regs.x.ebx=intno;
        !            80:      regs.x.ecx=0x0000;
        !            81:      sregs.es=FP_SEG(rmptr);
        !            82:      regs.x.edi=FP_OFF(rmptr);
        !            83:      rmptr->ss=rmptr->sp=0;
        !            84:      rmptr->flags=0;
        !            85:      int386x(0x31,&regs,&regs,&sregs);
        !            86: }
        !            87: #else
        !            88: void
        !            89: rmint86(short intno,struct rmregs *rmptr)
        !            90: {
        !            91:      union REGS regs;
        !            92:      struct SREGS sregs;
        !            93: 
        !            94:      regs.x.ax=rmptr->eax;
        !            95:      regs.x.bx=rmptr->ebx;
        !            96:      regs.x.cx=rmptr->ecx;
        !            97:      regs.x.dx=rmptr->edx;
        !            98:      regs.x.di=rmptr->edi;
        !            99:      regs.x.si=rmptr->esi;
        !           100:      regs.x.cflag=rmptr->flags;
        !           101:      segread(&sregs);
        !           102:      if (rmptr->es != 0) {
        !           103:           sregs.es=rmptr->es;
        !           104:      }
        !           105:      if (rmptr->cs != 0) {
        !           106:           sregs.cs=rmptr->cs;
        !           107:      }
        !           108:      if (rmptr->ss != 0) {
        !           109:           sregs.ss=rmptr->ss;
        !           110:      }
        !           111:      if (rmptr->ds != 0) {
        !           112:           sregs.ds=rmptr->ds;
        !           113:      }
        !           114:      int86x(intno,&regs,&regs,&sregs);
        !           115:      rmptr->eax=regs.x.ax;
        !           116:      rmptr->ebx=regs.x.bx;
        !           117:      rmptr->ecx=regs.x.cx;
        !           118:      rmptr->edx=regs.x.dx;
        !           119:      rmptr->edi=regs.x.di;
        !           120:      rmptr->esi=regs.x.si;
        !           121:      rmptr->flags=regs.x.cflag;
        !           122:      rmptr->es=sregs.es;
        !           123:      rmptr->cs=sregs.cs;
        !           124:      rmptr->ss=sregs.ss;
        !           125:      rmptr->ds=sregs.ds;
        !           126: }
        !           127: #endif
        !           128: 
        !           129: #ifdef __386__
        !           130: void far *
        !           131: alcmem(short bytes)
        !           132: {
        !           133:      union REGS regs;
        !           134: 
        !           135:      regs.x.eax=0x0100;
        !           136:      regs.x.ebx=((bytes+16)/16);
        !           137:      int386(0x31,&regs,&regs);
        !           138:      if (regs.x.cflag == 0) {
        !           139:           rmseg=regs.x.eax;
        !           140:           rmoff=0x0000;
        !           141:           return((void far *)(rmseg<<4));
        !           142:      }
        !           143:      return(NULL);
        !           144: }
        !           145: #else
        !           146: void far *
        !           147: alcmem(short bytes)
        !           148: {
        !           149:      char far *ptr;
        !           150: 
        !           151:      ptr=_fmalloc(bytes);
        !           152:      rmseg=FP_SEG(ptr);
        !           153:      rmoff=FP_OFF(ptr);
        !           154:      return(ptr);
        !           155: }
        !           156: #endif
        !           157: 
        !           158: int
        !           159: ismscdex(void)
        !           160: {
        !           161:      memset(&rmregs,0,sizeof(struct rmregs));
        !           162:      rmregs.eax=0x1500;
        !           163:      rmregs.ebx=0x0000;
        !           164:      rmint86(0x2F,&rmregs);
        !           165:      if (rmregs.ebx != 0) {
        !           166:           cddrive='A'+rmregs.ecx;
        !           167:           return('A'+rmregs.ecx);
        !           168:      }
        !           169:      return(0);
        !           170: }
        !           171: 
        !           172: void
        !           173: cd_getname(void)
        !           174: {
        !           175:      if (alcmem(cddrives*5) != NULL) {
        !           176:           devseg=rmseg;
        !           177:           devoff=rmoff;
        !           178:           namebuf=LES_MKFP(devseg,devoff);
        !           179:      }
        !           180:      memset(&rmregs,0,sizeof(struct rmregs));
        !           181:      rmregs.eax=0x1501;
        !           182:      rmregs.ebx=devoff;
        !           183:      rmregs.es=devseg;
        !           184:      rmint86(0x2F,&rmregs);
        !           185: }
        !           186: 
        !           187: void
        !           188: sendIOcmd(short hdl,short bytes,short cmd)
        !           189: {
        !           190:      memset(&rmregs,0,sizeof(rmregs));
        !           191:      rmregs.ebx=hdl;
        !           192:      rmregs.ds=cmdseg;
        !           193:      rmregs.edx=cmdoff;
        !           194:      rmregs.ecx=bytes;
        !           195:      rmregs.eax=cmd;
        !           196:      rmint86(0x21,&rmregs);
        !           197: }
        !           198: 
        !           199: void
        !           200: cd_opendoor(short cdhdl)
        !           201: {
        !           202:      char far *ptr;
        !           203: 
        !           204:      ptr=LES_MKFP(cmdseg,cmdoff);
        !           205:      ptr[0]=CD_OPENDOORCMD;
        !           206:      sendIOcmd(cdhdl,1,IOCMD3);
        !           207: }
        !           208: 
        !           209: void
        !           210: cd_closedoor(short cdhdl)
        !           211: {
        !           212:      char far *ptr;
        !           213: 
        !           214:      ptr=LES_MKFP(cmdseg,cmdoff);
        !           215:      ptr[0]=CD_CLOSEDOORCMD;
        !           216:      sendIOcmd(cdhdl,1,IOCMD3);
        !           217: }
        !           218: 
        !           219: void
        !           220: cd_reset(short cdhdl)
        !           221: {
        !           222:      char far *ptr;
        !           223: 
        !           224:      ptr=LES_MKFP(cmdseg,cmdoff);
        !           225:      ptr[0]=CD_RESETCMD;
        !           226:      sendIOcmd(cdhdl,1,IOCMD3);
        !           227: }
        !           228: 
        !           229: void
        !           230: cd_getaudiodisk(short cdhdl)
        !           231: {
        !           232:      int  i;
        !           233:      char far *ptr;
        !           234: 
        !           235:      ptr=LES_MKFP(cmdseg,cmdoff);
        !           236:      ptr[0]=0x0A;
        !           237:      sendIOcmd(cdhdl,8,IOCMD2);
        !           238:      cdlotrack=ptr[1];
        !           239:      cdhitrack=ptr[2];
        !           240:      leadout=ptr[3]+(ptr[4]<<8)+(ptr[5]<<16)+(ptr[6]<<24);
        !           241: }
        !           242: 
        !           243: void
        !           244: cd_getaudiotrack(short cdhdl,char tno)
        !           245: {
        !           246:      char far *ptr;
        !           247: 
        !           248:      ptr=LES_MKFP(cmdseg,cmdoff);
        !           249:      ptr[0]=0x0B;
        !           250:      ptr[1]=tno;
        !           251:      sendIOcmd(cdhdl,8,IOCMD2);
        !           252:      redbook[tno].frame=ptr[2];
        !           253:      redbook[tno].second=ptr[3];
        !           254:      redbook[tno].minute=ptr[4];
        !           255:      redbook[tno].unused=ptr[5];
        !           256:      redbook[tno].control=ptr[6];
        !           257: }
        !           258: 
        !           259: int
        !           260: cd_init(void)
        !           261: {
        !           262:      int  i;
        !           263: 
        !           264:      if ((cddrives=ismscdex()) == 0) {
        !           265:           return(0);
        !           266:      }
        !           267:      if (alcmem(CMDBUFSIZE) == NULL) {
        !           268:           return(0);
        !           269:      }
        !           270:      cmdseg=rmseg;
        !           271:      cmdoff=rmoff;
        !           272:      cd_getname();
        !           273:      nameseg=(unsigned short)(namebuf[4]<<8)+namebuf[3];
        !           274:      nameoff=(unsigned short)(namebuf[2]<<8)+namebuf[1];
        !           275:      cddevadr=LES_MKFP(nameseg,nameoff);
        !           276:      _fmemmove((char far *)&cddevname,cddevadr+10,8);
        !           277:      if ((cdhdl=open(cddevname,O_RDWR)) == -1) {
        !           278:           return(0);
        !           279:      }
        !           280:      cd_reset(cdhdl);
        !           281:      cd_getaudiodisk(cdhdl);
        !           282:      for (i=cdlotrack ; i <= cdhitrack ; i++) {
        !           283:           cd_getaudiotrack(cdhdl,i);
        !           284:      }
        !           285:      return(1);
        !           286: }
        !           287: 
        !           288: void
        !           289: cd_uninit(void)
        !           290: {
        !           291:      close(cdhdl);
        !           292: }
        !           293: 
        !           294: void
        !           295: cd_stopplay(void)
        !           296: {
        !           297:      char far *ptr;
        !           298: 
        !           299:      ptr=LES_MKFP(cmdseg,cmdoff);
        !           300:      memset(ptr,0,CMDBUFSIZE);
        !           301:      ptr[0]=0x16;
        !           302:      ptr[1]=0x00;
        !           303:      ptr[2]=0x85;
        !           304:      memset(&rmregs,0,sizeof(struct rmregs));
        !           305:      rmregs.es=cmdseg;
        !           306:      rmregs.ebx=cmdoff;
        !           307:      rmregs.ecx=cddrive-'A';
        !           308:      rmregs.eax=0x1510;
        !           309:      rmint86(0x2F,&rmregs);
        !           310: }
        !           311: 
        !           312: int
        !           313: cd_playtrack(char tno)
        !           314: {
        !           315:      char status;
        !           316:      long frames,hsgfmt;
        !           317:      char far *ptr;
        !           318: 
        !           319:      if ((redbook[tno].control&0x40) == 0x40) {   // don't play data tracks
        !           320:           return(0);
        !           321:      }
        !           322:      cd_stopplay();
        !           323:      ptr=LES_MKFP(cmdseg,cmdoff);
        !           324:      memset(ptr,0,CMDBUFSIZE);
        !           325:      ptr[0]=0x16;
        !           326:      ptr[1]=0x00;   // sub-unit
        !           327:      ptr[2]=0x84;   // play-audio command
        !           328:      ptr[13]=0x00;  // addressing mode
        !           329:      hsgfmt=((long)redbook[tno].minute*4500L)+((long)redbook[tno].second*75L)
        !           330:           +((long)redbook[tno].frame)-150L;
        !           331:      ptr[14]=(char)hsgfmt&0x0FF;
        !           332:      ptr[15]=(char)(hsgfmt>>8)&0xFF;
        !           333:      ptr[16]=(char)(hsgfmt>>16)&0xFF;
        !           334:      ptr[17]=(char)(hsgfmt>>24)&0xFF;
        !           335:      if (tno+1 > cdhitrack) {
        !           336:           frames=leadout;
        !           337:      }
        !           338:      else {
        !           339:           frames=((long)redbook[tno+1].minute*4500L)+((long)redbook[tno+1].second*75L)
        !           340:                +((long)redbook[tno+1].frame)-150L;
        !           341:      }
        !           342:      frames-=hsgfmt;
        !           343:      ptr[18]=(char)frames&0xFF;
        !           344:      ptr[19]=(char)(frames>>8)&0xFF;
        !           345:      ptr[20]=(char)(frames>>16)&0xFF;
        !           346:      ptr[21]=(char)(frames>>24)&0xFF;
        !           347:      memset(&rmregs,0,sizeof(struct rmregs));
        !           348:      rmregs.es=cmdseg;
        !           349:      rmregs.ebx=cmdoff;
        !           350:      rmregs.ecx=cddrive-'A';
        !           351:      rmregs.eax=0x1510;
        !           352:      rmint86(0x2F,&rmregs);
        !           353:      status=ptr[4];
        !           354:      if (status&0x01) {
        !           355:           return(1);
        !           356:      }
        !           357:      return(0);
        !           358: }
        !           359: 
        !           360: void
        !           361: cd_resumeplay(void)
        !           362: {
        !           363:      char far *ptr;
        !           364: 
        !           365:      ptr=LES_MKFP(cmdseg,cmdoff);
        !           366:      memset(ptr,0,CMDBUFSIZE);
        !           367:      ptr[0]=0x16;
        !           368:      ptr[1]=0x00;
        !           369:      ptr[2]=0x88;
        !           370:      memset(&rmregs,0,sizeof(struct rmregs));
        !           371:      rmregs.es=cmdseg;
        !           372:      rmregs.ebx=cmdoff;
        !           373:      rmregs.ecx=cddrive-'A';
        !           374:      rmregs.eax=0x1510;
        !           375:      rmint86(0x2F,&rmregs);
        !           376: }
        !           377: 
        !           378: #if 0
        !           379: void
        !           380: main(void)
        !           381: {
        !           382:      short i;
        !           383:      unsigned short nameoff,nameseg;
        !           384:      char far *ptr;
        !           385: 
        !           386:      if ((cddrives=ismscdex())) {
        !           387:           if (alcmem(CMDBUFSIZE) == NULL) {
        !           388:                exit(0);
        !           389:           }
        !           390:           cmdseg=rmseg;
        !           391:           cmdoff=rmoff;
        !           392:           ptr=LES_MKFP(cmdseg,cmdoff);
        !           393:           printf("CD-ROM drive is %c\n",cddrive);
        !           394:           cd_getname();
        !           395:           nameseg=(unsigned short)(namebuf[4]<<8)+namebuf[3];
        !           396:           nameoff=(unsigned short)(namebuf[2]<<8)+namebuf[1];
        !           397:           cddevadr=LES_MKFP(nameseg,nameoff);
        !           398:           _fmemmove((char far *)&cddevname,cddevadr+10,8);
        !           399:           if ((cdhdl=open(cddevname,O_RDWR)) != -1) {
        !           400:                //cd_opendoor(cdhdl);
        !           401:                //printf("Insert CD then press a key\n");
        !           402:                //getch();
        !           403:                //cd_closedoor(cdhdl);
        !           404:                //printf("Door closed.  Resetting drive\n");
        !           405:                cd_reset(cdhdl);
        !           406:                printf("Getting audio disk info\n");
        !           407:                cd_getaudiodisk(cdhdl);
        !           408:                printf("Getting and playing audio tracks\n");
        !           409:                for (i=cdlotrack ; i <= cdhitrack ; i++) {
        !           410:                     cd_getaudiotrack(cdhdl,i);
        !           411:                }
        !           412:                for (i=cdlotrack ; i <= cdhitrack ; i++) {
        !           413:                     if (cd_playtrack(i)) {
        !           414:                          printf("Playing track %d...any key to stop\n",i);
        !           415:                          getch();
        !           416:                     }
        !           417:                }
        !           418:                cd_reset(cdhdl);
        !           419:                close(cdhdl);
        !           420:           }
        !           421:      }
        !           422: }
        !           423: #endif
        !           424: #else     // new code for CD-ROM detection - for Windows '95
        !           425: #include "stdio.h"
        !           426: #include "dos.h"
        !           427: #include <memcheck.h>
        !           428: 
        !           429: int  cddrive;
        !           430: 
        !           431: int
        !           432: ismscdex(void)
        !           433: {
        !           434:      union REGS regs;
        !           435: 
        !           436:      regs.x.eax=0x1500;
        !           437:      regs.x.ebx=0x0000;
        !           438:      int386(0x2F,&regs,&regs);
        !           439:      if (regs.x.ebx == 0) {
        !           440:           return(0);
        !           441:      }
        !           442:      cddrive='A'+regs.x.ecx;
        !           443:      return(cddrive);
        !           444: }
        !           445: 
        !           446: int
        !           447: cd_init(void)
        !           448: {
        !           449:      if (ismscdex()) {
        !           450:           return(1);
        !           451:      }
        !           452:      return(0);
        !           453: }
        !           454: #endif
        !           455: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.