1 |
|
/* |
2 |
|
* cdrom.cpp - CD-ROM driver |
3 |
|
* |
4 |
< |
* Basilisk II (C) 1997-2001 Christian Bauer |
4 |
> |
* Basilisk II (C) 1997-2005 Christian Bauer |
5 |
|
* |
6 |
|
* This program is free software; you can redistribute it and/or modify |
7 |
|
* it under the terms of the GNU General Public License as published by |
28 |
|
* Technote FL 36: "Apple Extensions to ISO 9660" |
29 |
|
*/ |
30 |
|
|
31 |
+ |
#include "sysdeps.h" |
32 |
+ |
|
33 |
|
#include <string.h> |
34 |
|
#include <vector> |
35 |
|
|
37 |
|
using std::vector; |
38 |
|
#endif |
39 |
|
|
38 |
– |
#include "sysdeps.h" |
40 |
|
#include "cpu_emulation.h" |
41 |
|
#include "main.h" |
42 |
|
#include "macos_util.h" |
133 |
|
void *fh; // File handle |
134 |
|
int block_size; // CD-ROM block size |
135 |
|
int twok_offset; // Offset of beginning of 2K block to last Prime position |
136 |
< |
uint32 start_byte; // Start of HFS partition on disk |
136 |
> |
loff_t start_byte; // Start of HFS partition on disk |
137 |
|
bool to_be_mounted; // Flag: drive must be mounted in accRun |
138 |
|
bool mount_non_hfs; // Flag: Issue disk-inserted events for non-HFS disks |
139 |
|
|
180 |
|
{ |
181 |
|
info.start_byte = 0; |
182 |
|
uint8 *map = new uint8[512]; |
183 |
+ |
D(bug("Looking for HFS partitions on CD-ROM...\n")); |
184 |
|
|
185 |
|
// Search first 64 blocks for HFS partition |
186 |
|
for (int i=0; i<64; i++) { |
187 |
|
if (Sys_read(info.fh, map, i * 512, 512) != 512) |
188 |
|
break; |
189 |
+ |
D(bug(" block %d, signature '%c%c' (%02x%02x)\n", i, map[0], map[1], map[0], map[1])); |
190 |
|
|
191 |
|
// Not a partition map block? Then look at next block |
192 |
|
uint16 sig = (map[0] << 8) | map[1]; |
195 |
|
|
196 |
|
// Partition map block found, Apple HFS partition? |
197 |
|
if (strcmp((char *)(map + 48), "Apple_HFS") == 0) { |
198 |
< |
info.start_byte = ntohl(((uint32 *)map)[2]) << 9; |
199 |
< |
D(bug(" HFS partition found at %d, %d blocks\n", info.start_byte, ntohl(((uint32 *)map)[3]))); |
198 |
> |
info.start_byte = (loff_t)((map[8] << 24) | (map[9] << 16) | (map[10] << 8) | map[11]) << 9; |
199 |
> |
uint32 num_blocks = (map[12] << 24) | (map[13] << 16) | (map[14] << 8) | map[15]; |
200 |
> |
D(bug(" HFS partition found at %d, %d blocks\n", info.start_byte, num_blocks)); |
201 |
|
break; |
202 |
|
} |
203 |
|
} |
214 |
|
// Read TOC |
215 |
|
memset(info.toc, 0, sizeof(info.toc)); |
216 |
|
SysCDReadTOC(info.fh, info.toc); |
217 |
< |
D(bug(" TOC: %08lx %08lx\n", ntohl(((uint32 *)info.toc)[0]), ntohl(((uint32 *)info.toc)[1]))); |
217 |
> |
|
218 |
> |
#if DEBUG |
219 |
> |
// Dump TOC for debugging |
220 |
> |
D(bug(" TOC:\n %02x%02x%02x%02x : %d bytes, first track = %d, last track = %d\n", info.toc[0], info.toc[1], info.toc[2], info.toc[3], (info.toc[0] << 8) | info.toc[1], info.toc[2], info.toc[3])); |
221 |
> |
for (int i=4; i<804; i+=8) { |
222 |
> |
D(bug(" %02x%02x%02x%02x%02x%02x%02x%02x: ", info.toc[i+0], info.toc[i+1], info.toc[i+2], info.toc[i+3], info.toc[i+4], info.toc[i+5], info.toc[i+6], info.toc[i+7])); |
223 |
> |
const char *type = (info.toc[i+2] == 0xaa ? "lead-out" : (info.toc[i+1] & 0x04 ? "data" : "audio")); |
224 |
> |
D(bug("track %d (%s), addr/ctrl 0x%02x, M %d S %d F %d\n", info.toc[i+2], type, info.toc[i+1], info.toc[i+5], info.toc[i+6], info.toc[i+7])); |
225 |
> |
if (info.toc[i+2] == 0xaa) |
226 |
> |
break; |
227 |
> |
} |
228 |
> |
#endif |
229 |
|
|
230 |
|
// Find lead-out track |
231 |
|
info.lead_out[0] = 0; |