]> icculus.org git repositories - btb/d2x.git/blob - main/old/cdrom.c
This commit was manufactured by cvs2svn to create branch
[btb/d2x.git] / main / old / cdrom.c
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-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13
14 #pragma off (unreferenced)
15 static char rcsid[] = "$Id: cdrom.c,v 1.1.1.1 2001-01-19 03:30:14 bradleyb Exp $";
16 #pragma on (unreferenced)
17
18 #include <dos.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22
23 #include "dpmi.h"
24
25 typedef struct {
26         char unit;
27         ushort dev_offset;
28         ushort dev_segment;
29 } dev_list;
30
31 typedef struct _Dev_Hdr {
32         unsigned int dev_next;
33         unsigned short dev_att;
34         ushort dev_stat;
35         ushort dev_int;
36         char dev_name[8];
37         short dev_resv;
38         char dev_letr;
39         char dev_units;
40 } dev_header;
41
42 int find_descent_cd()
43 {
44         dpmi_real_regs rregs;
45                 
46         // Get dos memory for call...
47         dev_list * buf;
48         dev_header *device;
49         int num_drives, i;
50         unsigned cdrive, cur_drive, cdrom_drive;
51
52         memset(&rregs,0,sizeof(dpmi_real_regs));
53         rregs.eax = 0x1500;
54         rregs.ebx = 0;
55         dpmi_real_int386x( 0x2f, &rregs );
56         if ((rregs.ebx & 0xffff) == 0) {
57                 return -1;                      // No cdrom
58         }
59         num_drives = rregs.ebx;
60
61         buf = (dev_list *)dpmi_get_temp_low_buffer( sizeof(dev_list)*26 );      
62         if (buf==NULL) {
63                 return -2;                      // Error getting memory!
64         }
65
66         memset(&rregs,0,sizeof(dpmi_real_regs));
67         rregs.es = DPMI_real_segment(buf);
68         rregs.ebx = DPMI_real_offset(buf);
69         rregs.eax = 0x1501;
70         dpmi_real_int386x( 0x2f, &rregs );
71         cdrom_drive = 0;
72         _dos_getdrive(&cdrive);
73         for (i = 0; i < num_drives; i++) {
74                 device = (dev_header *)((buf[i].dev_segment<<4)+ buf[i].dev_offset);
75                 _dos_setdrive(device->dev_letr,&cur_drive);
76                 _dos_getdrive(&cur_drive);
77                 if (cur_drive == device->dev_letr) {
78                         if (!chdir("\\descent")) {
79                                 FILE * fp;
80                                 fp = fopen( "saturn.hog", "rb" );       
81                                 if ( fp )       {
82                                         cdrom_drive = device->dev_letr;
83                                         fclose(fp);
84                                         break;
85                                 }
86                         }
87                 }                               
88         }
89         _dos_setdrive(cdrive,&cur_drive);
90         return cdrom_drive;
91 }
92