home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / main / cdrom.c < prev    next >
Text File  |  1998-06-08  |  3KB  |  111 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13. /*
  14.  * $Source: f:/miner/source/main/rcs/cdrom.c $
  15.  * $Revision: 1.2 $
  16.  * $Author: john $
  17.  * $Date: 1995/03/20 15:01:19 $
  18.  * 
  19.  * Routines to access a cdrom drive.
  20.  * 
  21.  * $Log: cdrom.c $
  22.  * Revision 1.2  1995/03/20  15:01:19  john
  23.  * Initial revision.
  24.  * 
  25.  * Revision 1.1  1995/03/14  16:56:59  john
  26.  * Initial revision
  27.  * 
  28.  * 
  29.  */
  30.  
  31. #pragma off (unreferenced)
  32. static char rcsid[] = "$Id: cdrom.c 1.2 1995/03/20 15:01:19 john Exp $";
  33. #pragma on (unreferenced)
  34.  
  35. #include <dos.h>
  36. #include <stdio.h>
  37. #include <stdlib.h>
  38. #include <string.h>
  39.  
  40. #include "dpmi.h"
  41.  
  42. typedef struct {
  43.     char unit;
  44.     ushort dev_offset;
  45.     ushort dev_segment;
  46. } dev_list;
  47.  
  48. typedef struct _Dev_Hdr {
  49.     unsigned int dev_next;
  50.     unsigned short dev_att;
  51.     ushort dev_stat;
  52.     ushort dev_int;
  53.     char dev_name[8];
  54.     short dev_resv;
  55.     char dev_letr;
  56.     char dev_units;
  57. } dev_header;
  58.  
  59. int find_descent_cd()
  60. {
  61.     dpmi_real_regs rregs;
  62.         
  63.     // Get dos memory for call...
  64.     dev_list * buf;
  65.     dev_header *device;
  66.     int num_drives, i;
  67.     unsigned cdrive, cur_drive, cdrom_drive;
  68.  
  69.     memset(&rregs,0,sizeof(dpmi_real_regs));
  70.     rregs.eax = 0x1500;
  71.     rregs.ebx = 0;
  72.     dpmi_real_int386x( 0x2f, &rregs );
  73.     if ((rregs.ebx & 0xffff) == 0) {
  74.         return -1;            // No cdrom
  75.     }
  76.     num_drives = rregs.ebx;
  77.  
  78.     buf = (dev_list *)dpmi_get_temp_low_buffer( sizeof(dev_list)*26 );    
  79.     if (buf==NULL) {
  80.         return -2;            // Error getting memory!
  81.     }
  82.  
  83.     memset(&rregs,0,sizeof(dpmi_real_regs));
  84.     rregs.es = DPMI_real_segment(buf);
  85.     rregs.ebx = DPMI_real_offset(buf);
  86.     rregs.eax = 0x1501;
  87.     dpmi_real_int386x( 0x2f, &rregs );
  88.     cdrom_drive = 0;
  89.     _dos_getdrive(&cdrive);
  90.     for (i = 0; i < num_drives; i++) {
  91.         device = (dev_header *)((buf[i].dev_segment<<4)+ buf[i].dev_offset);
  92.         _dos_setdrive(device->dev_letr,&cur_drive);
  93.         _dos_getdrive(&cur_drive);
  94.         if (cur_drive == device->dev_letr) {
  95.             if (!chdir("\\descent")) {
  96.                 FILE * fp;
  97.                 fp = fopen( "saturn.hog", "rb" );    
  98.                 if ( fp )    {
  99.                     cdrom_drive = device->dev_letr;
  100.                     fclose(fp);
  101.                     break;
  102.                 }
  103.             }
  104.         }                
  105.     }
  106.     _dos_setdrive(cdrive,&cur_drive);
  107.     return cdrom_drive;
  108. }
  109.  
  110. 
  111.