1 |
/* |
/* |
2 |
* Copyright (C) 2003-2005 Anders Gavare. All rights reserved. |
* Copyright (C) 2003-2006 Anders Gavare. All rights reserved. |
3 |
* |
* |
4 |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
5 |
* modification, are permitted provided that the following conditions are met: |
* modification, are permitted provided that the following conditions are met: |
25 |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
26 |
* |
* |
27 |
* |
* |
28 |
* $Id: diskimage.c,v 1.91 2005/05/27 07:29:24 debug Exp $ |
* $Id: diskimage.c,v 1.109 2006/05/06 08:42:48 debug Exp $ |
29 |
* |
* |
30 |
* Disk image support. |
* Disk image support. |
31 |
* |
* |
53 |
#include "misc.h" |
#include "misc.h" |
54 |
|
|
55 |
|
|
56 |
extern int quiet_mode; |
/* #define debug fatal */ |
57 |
|
|
58 |
extern int single_step; |
extern int single_step; |
59 |
|
|
60 |
static char *diskimage_types[] = DISKIMAGE_TYPES; |
static char *diskimage_types[] = DISKIMAGE_TYPES; |
410 |
static int diskimage__internal_access(struct diskimage *d, int writeflag, |
static int diskimage__internal_access(struct diskimage *d, int writeflag, |
411 |
off_t offset, unsigned char *buf, size_t len) |
off_t offset, unsigned char *buf, size_t len) |
412 |
{ |
{ |
413 |
size_t lendone; |
ssize_t lendone; |
414 |
int res; |
int res; |
415 |
|
|
416 |
if (buf == NULL) { |
if (buf == NULL) { |
479 |
int diskimage_scsicommand(struct cpu *cpu, int id, int type, |
int diskimage_scsicommand(struct cpu *cpu, int id, int type, |
480 |
struct scsi_transfer *xferp) |
struct scsi_transfer *xferp) |
481 |
{ |
{ |
482 |
int retlen, i; |
char namebuf[16]; |
483 |
|
int retlen, i, q; |
484 |
uint64_t size; |
uint64_t size; |
485 |
int64_t ofs; |
int64_t ofs; |
486 |
int pagecode; |
int pagecode; |
590 |
xferp->data_in[6] = 0x04; /* ACKREQQ */ |
xferp->data_in[6] = 0x04; /* ACKREQQ */ |
591 |
xferp->data_in[7] = 0x60; /* WBus32, WBus16 */ |
xferp->data_in[7] = 0x60; /* WBus32, WBus16 */ |
592 |
|
|
593 |
/* These must be padded with spaces: */ |
/* These are padded with spaces: */ |
594 |
memcpy(xferp->data_in+8, "FAKE ", 8); |
|
595 |
memcpy(xferp->data_in+16, "DISK ", 16); |
memcpy(xferp->data_in+8, "GXemul ", 8); |
596 |
memcpy(xferp->data_in+32, "V0.0", 4); |
if (diskimage_getname(cpu->machine, id, |
597 |
|
type, namebuf, sizeof(namebuf))) { |
598 |
|
size_t i; |
599 |
|
for (i=0; i<sizeof(namebuf); i++) |
600 |
|
if (namebuf[i] == 0) { |
601 |
|
for (; i<sizeof(namebuf); i++) |
602 |
|
namebuf[i] = ' '; |
603 |
|
break; |
604 |
|
} |
605 |
|
memcpy(xferp->data_in+16, namebuf, 16); |
606 |
|
} else |
607 |
|
memcpy(xferp->data_in+16, "DISK ", 16); |
608 |
|
memcpy(xferp->data_in+32, "0 ", 4); |
609 |
|
|
610 |
/* |
/* |
611 |
* Some Ultrix kernels want specific responses from |
* Some Ultrix kernels want specific responses from |
612 |
* the drives. |
* the drives. |
613 |
*/ |
*/ |
614 |
|
|
615 |
if (machine->machine_type == MACHINE_DEC) { |
if (machine->machine_type == MACHINE_PMAX) { |
616 |
/* DEC, RZ25 (rev 0900) = 832527 sectors */ |
/* DEC, RZ25 (rev 0900) = 832527 sectors */ |
617 |
/* DEC, RZ58 (rev 2000) = 2698061 sectors */ |
/* DEC, RZ58 (rev 2000) = 2698061 sectors */ |
618 |
memcpy(xferp->data_in+8, "DEC ", 8); |
memcpy(xferp->data_in+8, "DEC ", 8); |
624 |
if (d->is_a_cdrom) { |
if (d->is_a_cdrom) { |
625 |
xferp->data_in[0] = 0x05; /* 0x05 = CD-ROM */ |
xferp->data_in[0] = 0x05; /* 0x05 = CD-ROM */ |
626 |
xferp->data_in[1] = 0x80; /* 0x80 = removable */ |
xferp->data_in[1] = 0x80; /* 0x80 = removable */ |
627 |
memcpy(xferp->data_in+16, "CD-ROM ", 16); |
/* memcpy(xferp->data_in+16, "CD-ROM ", 16);*/ |
628 |
|
|
629 |
if (machine->machine_type == MACHINE_DEC) { |
if (machine->machine_type == MACHINE_PMAX) { |
630 |
/* SONY, CD-ROM: */ |
/* SONY, CD-ROM: */ |
631 |
memcpy(xferp->data_in+8, "SONY ", 8); |
memcpy(xferp->data_in+8, "SONY ", 8); |
632 |
memcpy(xferp->data_in+16, |
memcpy(xferp->data_in+16, |
637 |
memcpy(xferp->data_in+16, |
memcpy(xferp->data_in+16, |
638 |
"RRD42 (C) DEC ", 16); |
"RRD42 (C) DEC ", 16); |
639 |
memcpy(xferp->data_in+32, "4.5d", 4); |
memcpy(xferp->data_in+32, "4.5d", 4); |
640 |
} else { |
} else if (machine->machine_type == MACHINE_ARC) { |
641 |
/* NEC, CD-ROM: */ |
/* NEC, CD-ROM: */ |
642 |
memcpy(xferp->data_in+8, "NEC ", 8); |
memcpy(xferp->data_in+8, "NEC ", 8); |
643 |
memcpy(xferp->data_in+16, |
memcpy(xferp->data_in+16, |
652 |
xferp->data_in[1] = 0x80; /* 0x80 = removable */ |
xferp->data_in[1] = 0x80; /* 0x80 = removable */ |
653 |
memcpy(xferp->data_in+16, "TAPE ", 16); |
memcpy(xferp->data_in+16, "TAPE ", 16); |
654 |
|
|
655 |
if (machine->machine_type == MACHINE_DEC) { |
if (machine->machine_type == MACHINE_PMAX) { |
656 |
/* |
/* |
657 |
* TODO: find out if these are correct. |
* TODO: find out if these are correct. |
658 |
* |
* |
707 |
break; |
break; |
708 |
|
|
709 |
case SCSICMD_MODE_SENSE: |
case SCSICMD_MODE_SENSE: |
710 |
|
case SCSICMD_MODE_SENSE10: |
711 |
debug("MODE_SENSE"); |
debug("MODE_SENSE"); |
712 |
|
q = 4; retlen = xferp->cmd[4]; |
713 |
if (xferp->cmd_len != 6) |
switch (xferp->cmd_len) { |
714 |
fatal(" (unimplemented mode_sense len=%i)", |
case 6: break; |
715 |
|
case 10:q = 8; |
716 |
|
retlen = xferp->cmd[7] * 256 + xferp->cmd[8]; |
717 |
|
break; |
718 |
|
default:fatal(" (unimplemented mode_sense len=%i)", |
719 |
xferp->cmd_len); |
xferp->cmd_len); |
720 |
|
} |
|
retlen = xferp->cmd[4]; |
|
721 |
|
|
722 |
/* |
/* |
723 |
* NOTE/TODO: This code doesn't handle too short retlens |
* NOTE/TODO: This code doesn't handle too short retlens |
752 |
xferp->data_in[3] = 8 * 1; /* block descriptor |
xferp->data_in[3] = 8 * 1; /* block descriptor |
753 |
length: 1 page (?) */ |
length: 1 page (?) */ |
754 |
|
|
755 |
/* TODO: update this when implementing 10-byte commands: */ |
xferp->data_in[q+0] = 0x00; /* density code */ |
756 |
xferp->data_in[4] = 0x00; /* density code */ |
xferp->data_in[q+1] = 0; /* nr of blocks, high */ |
757 |
xferp->data_in[5] = 0; /* nr of blocks, high */ |
xferp->data_in[q+2] = 0; /* nr of blocks, mid */ |
758 |
xferp->data_in[6] = 0; /* nr of blocks, mid */ |
xferp->data_in[q+3] = 0; /* nr of blocks, low */ |
759 |
xferp->data_in[7] = 0; /* nr of blocks, low */ |
xferp->data_in[q+4] = 0x00; /* reserved */ |
760 |
xferp->data_in[8] = 0x00; /* reserved */ |
xferp->data_in[q+5] = (d->logical_block_size >> 16) & 255; |
761 |
xferp->data_in[9] = (d->logical_block_size >> 16) & 255; |
xferp->data_in[q+6] = (d->logical_block_size >> 8) & 255; |
762 |
xferp->data_in[10] = (d->logical_block_size >> 8) & 255; |
xferp->data_in[q+7] = d->logical_block_size & 255; |
763 |
xferp->data_in[11] = d->logical_block_size & 255; |
q += 8; |
764 |
|
|
765 |
diskimage__return_default_status_and_message(xferp); |
diskimage__return_default_status_and_message(xferp); |
766 |
|
|
772 |
/* TODO: Nothing here? */ |
/* TODO: Nothing here? */ |
773 |
break; |
break; |
774 |
case 1: /* read-write error recovery page */ |
case 1: /* read-write error recovery page */ |
775 |
xferp->data_in[12 + 0] = pagecode; |
xferp->data_in[q + 0] = pagecode; |
776 |
xferp->data_in[12 + 1] = 10; |
xferp->data_in[q + 1] = 10; |
777 |
break; |
break; |
778 |
case 3: /* format device page */ |
case 3: /* format device page */ |
779 |
xferp->data_in[12 + 0] = pagecode; |
xferp->data_in[q + 0] = pagecode; |
780 |
xferp->data_in[12 + 1] = 22; |
xferp->data_in[q + 1] = 22; |
781 |
|
|
782 |
/* 10,11 = sectors per track */ |
/* 10,11 = sectors per track */ |
783 |
xferp->data_in[12 + 10] = 0; |
xferp->data_in[q + 10] = 0; |
784 |
xferp->data_in[12 + 11] = d->sectors_per_track; |
xferp->data_in[q + 11] = d->sectors_per_track; |
785 |
|
|
786 |
/* 12,13 = physical sector size */ |
/* 12,13 = physical sector size */ |
787 |
xferp->data_in[12 + 12] = |
xferp->data_in[q + 12] = |
788 |
(d->logical_block_size >> 8) & 255; |
(d->logical_block_size >> 8) & 255; |
789 |
xferp->data_in[12 + 13] = d->logical_block_size & 255; |
xferp->data_in[q + 13] = d->logical_block_size & 255; |
790 |
break; |
break; |
791 |
case 4: /* rigid disk geometry page */ |
case 4: /* rigid disk geometry page */ |
792 |
xferp->data_in[12 + 0] = pagecode; |
xferp->data_in[q + 0] = pagecode; |
793 |
xferp->data_in[12 + 1] = 22; |
xferp->data_in[q + 1] = 22; |
794 |
xferp->data_in[12 + 2] = (d->ncyls >> 16) & 255; |
xferp->data_in[q + 2] = (d->ncyls >> 16) & 255; |
795 |
xferp->data_in[12 + 3] = (d->ncyls >> 8) & 255; |
xferp->data_in[q + 3] = (d->ncyls >> 8) & 255; |
796 |
xferp->data_in[12 + 4] = d->ncyls & 255; |
xferp->data_in[q + 4] = d->ncyls & 255; |
797 |
xferp->data_in[12 + 5] = d->heads; |
xferp->data_in[q + 5] = d->heads; |
798 |
|
|
799 |
xferp->data_in[12 + 20] = (d->rpms >> 8) & 255; |
xferp->data_in[q + 20] = (d->rpms >> 8) & 255; |
800 |
xferp->data_in[12 + 21] = d->rpms & 255; |
xferp->data_in[q + 21] = d->rpms & 255; |
801 |
break; |
break; |
802 |
case 5: /* flexible disk page */ |
case 5: /* flexible disk page */ |
803 |
xferp->data_in[12 + 0] = pagecode; |
xferp->data_in[q + 0] = pagecode; |
804 |
xferp->data_in[12 + 1] = 0x1e; |
xferp->data_in[q + 1] = 0x1e; |
805 |
|
|
806 |
/* 2,3 = transfer rate */ |
/* 2,3 = transfer rate */ |
807 |
xferp->data_in[12 + 2] = ((5000) >> 8) & 255; |
xferp->data_in[q + 2] = ((5000) >> 8) & 255; |
808 |
xferp->data_in[12 + 3] = (5000) & 255; |
xferp->data_in[q + 3] = (5000) & 255; |
809 |
|
|
810 |
xferp->data_in[12 + 4] = d->heads; |
xferp->data_in[q + 4] = d->heads; |
811 |
xferp->data_in[12 + 5] = d->sectors_per_track; |
xferp->data_in[q + 5] = d->sectors_per_track; |
812 |
|
|
813 |
/* 6,7 = data bytes per sector */ |
/* 6,7 = data bytes per sector */ |
814 |
xferp->data_in[12 + 6] = (d->logical_block_size >> 8) |
xferp->data_in[q + 6] = (d->logical_block_size >> 8) |
815 |
& 255; |
& 255; |
816 |
xferp->data_in[12 + 7] = d->logical_block_size & 255; |
xferp->data_in[q + 7] = d->logical_block_size & 255; |
817 |
|
|
818 |
xferp->data_in[12 + 8] = (d->ncyls >> 8) & 255; |
xferp->data_in[q + 8] = (d->ncyls >> 8) & 255; |
819 |
xferp->data_in[12 + 9] = d->ncyls & 255; |
xferp->data_in[q + 9] = d->ncyls & 255; |
820 |
|
|
821 |
xferp->data_in[12 + 28] = (d->rpms >> 8) & 255; |
xferp->data_in[q + 28] = (d->rpms >> 8) & 255; |
822 |
xferp->data_in[12 + 29] = d->rpms & 255; |
xferp->data_in[q + 29] = d->rpms & 255; |
823 |
break; |
break; |
824 |
default: |
default: |
825 |
fatal("[ MODE_SENSE for page %i is not yet " |
fatal("[ MODE_SENSE for page %i is not yet " |
897 |
* blocks to transfer. (NOTE: If the value is |
* blocks to transfer. (NOTE: If the value is |
898 |
* 0, this means 0, not 65536. :-) |
* 0, this means 0, not 65536. :-) |
899 |
*/ |
*/ |
900 |
ofs = (xferp->cmd[2] << 24) + (xferp->cmd[3] |
ofs = ((uint64_t)xferp->cmd[2] << 24) + |
901 |
<< 16) + (xferp->cmd[4] << 8) + |
(xferp->cmd[3] << 16) + (xferp->cmd[4] << 8) |
902 |
xferp->cmd[5]; |
+ xferp->cmd[5]; |
903 |
retlen = (xferp->cmd[7] << 8) + xferp->cmd[8]; |
retlen = (xferp->cmd[7] << 8) + xferp->cmd[8]; |
904 |
} |
} |
905 |
|
|
937 |
xferp->data_in, size); |
xferp->data_in, size); |
938 |
|
|
939 |
if (d->is_a_tape && d->f != NULL) |
if (d->is_a_tape && d->f != NULL) |
940 |
d->tape_offset = ftell(d->f); |
d->tape_offset = ftello(d->f); |
941 |
|
|
942 |
/* TODO: other errors? */ |
/* TODO: other errors? */ |
943 |
break; |
break; |
975 |
* transfer. (NOTE: If the value is 0 this means 0, |
* transfer. (NOTE: If the value is 0 this means 0, |
976 |
* not 65536.) |
* not 65536.) |
977 |
*/ |
*/ |
978 |
ofs = (xferp->cmd[2] << 24) + (xferp->cmd[3] << 16) + |
ofs = ((uint64_t)xferp->cmd[2] << 24) + |
979 |
(xferp->cmd[4] << 8) + xferp->cmd[5]; |
(xferp->cmd[3] << 16) + (xferp->cmd[4] << 8) + |
980 |
|
xferp->cmd[5]; |
981 |
retlen = (xferp->cmd[7] << 8) + xferp->cmd[8]; |
retlen = (xferp->cmd[7] << 8) + xferp->cmd[8]; |
982 |
} |
} |
983 |
|
|
1025 |
if (xferp->cmd_len != 6) |
if (xferp->cmd_len != 6) |
1026 |
debug(" (weird len=%i)", xferp->cmd_len); |
debug(" (weird len=%i)", xferp->cmd_len); |
1027 |
|
|
1028 |
for (i=0; i<xferp->cmd_len ; i++) |
for (i=0; i<(ssize_t)xferp->cmd_len; i++) |
1029 |
debug(" %02x", xferp->cmd[i]); |
debug(" %02x", xferp->cmd[i]); |
1030 |
|
|
1031 |
/* TODO: actualy care about cmd[] */ |
/* TODO: actualy care about cmd[] */ |
1234 |
scsi_transfer_allocbuf(&xferp->data_in_len, |
scsi_transfer_allocbuf(&xferp->data_in_len, |
1235 |
&xferp->data_in, retlen, 1); |
&xferp->data_in, retlen, 1); |
1236 |
|
|
1237 |
/* TODO */ |
xferp->data_in[0] = 0; |
1238 |
|
xferp->data_in[1] = 10; |
1239 |
|
xferp->data_in[2] = 0; /* First track. */ |
1240 |
|
xferp->data_in[3] = 0; /* Last track. */ |
1241 |
|
|
1242 |
|
/* Track 0 data: */ |
1243 |
|
xferp->data_in[4] = 0x00; /* Reserved. */ |
1244 |
|
xferp->data_in[5] = 0x04; /* ADR + CTRL: |
1245 |
|
Data, not audio */ |
1246 |
|
xferp->data_in[6] = 0x00; /* Track nr */ |
1247 |
|
xferp->data_in[7] = 0x00; /* Reserved */ |
1248 |
|
/* 8..11 = absolute CDROM address */ |
1249 |
|
|
1250 |
diskimage__return_default_status_and_message(xferp); |
diskimage__return_default_status_and_message(xferp); |
1251 |
break; |
break; |
1286 |
} else { |
} else { |
1287 |
int i; |
int i; |
1288 |
fatal("[ unknown MODE_SELECT: cmd ="); |
fatal("[ unknown MODE_SELECT: cmd ="); |
1289 |
for (i=0; i<xferp->cmd_len; i++) |
for (i=0; i<(ssize_t)xferp->cmd_len; i++) |
1290 |
fatal(" %02x", xferp->cmd[i]); |
fatal(" %02x", xferp->cmd[i]); |
1291 |
fatal(", data_out ="); |
fatal(", data_out ="); |
1292 |
for (i=0; i<xferp->data_out_len; i++) |
for (i=0; i<(ssize_t)xferp->data_out_len; i++) |
1293 |
fatal(" %02x", xferp->data_out[i]); |
fatal(" %02x", xferp->data_out[i]); |
1294 |
fatal(" ]"); |
fatal(" ]"); |
1295 |
} |
} |
1298 |
diskimage__return_default_status_and_message(xferp); |
diskimage__return_default_status_and_message(xferp); |
1299 |
break; |
break; |
1300 |
|
|
1301 |
case 0x1e: |
case SCSICMD_PREVENT_ALLOW_REMOVE: |
1302 |
debug("[ SCSI 0x%02x: TODO ]\n", xferp->cmd[0]); |
debug("[ SCSI 0x%02x Prevent/allow medium removal: " |
1303 |
|
"TODO ]\n", xferp->cmd[0]); |
|
/* TODO */ |
|
1304 |
|
|
1305 |
diskimage__return_default_status_and_message(xferp); |
diskimage__return_default_status_and_message(xferp); |
1306 |
break; |
break; |
1308 |
case 0xbd: |
case 0xbd: |
1309 |
fatal("[ SCSI 0x%02x (len %i), TODO: ", xferp->cmd[0], |
fatal("[ SCSI 0x%02x (len %i), TODO: ", xferp->cmd[0], |
1310 |
xferp->cmd_len); |
xferp->cmd_len); |
1311 |
for (i=0; i<xferp->cmd_len; i++) |
for (i=0; i<(ssize_t)xferp->cmd_len; i++) |
1312 |
fatal(" %02x", xferp->cmd[i]); |
fatal(" %02x", xferp->cmd[i]); |
1313 |
fatal(" ]\n"); |
fatal(" ]\n"); |
1314 |
|
|
1332 |
&xferp->data_in, retlen, 1); |
&xferp->data_in, retlen, 1); |
1333 |
|
|
1334 |
diskimage__return_default_status_and_message(xferp); |
diskimage__return_default_status_and_message(xferp); |
1335 |
|
|
1336 |
break; |
break; |
1337 |
|
|
1338 |
default: |
default: |
1499 |
d2->next = d; |
d2->next = d; |
1500 |
} |
} |
1501 |
|
|
1502 |
d->type = DISKIMAGE_SCSI; |
/* Default to IDE disks... */ |
1503 |
|
d->type = DISKIMAGE_IDE; |
1504 |
|
|
1505 |
/* Special cases: some machines usually have FLOPPY/IDE, not SCSI: */ |
/* ... but some machines use SCSI by default: */ |
1506 |
if (machine->arch == ARCH_X86 || |
if (machine->machine_type == MACHINE_PMAX || |
1507 |
machine->machine_type == MACHINE_COBALT || |
machine->machine_type == MACHINE_ARC) |
1508 |
machine->machine_type == MACHINE_HPCMIPS || |
d->type = DISKIMAGE_SCSI; |
|
machine->machine_type == MACHINE_PS2) |
|
|
d->type = DISKIMAGE_IDE; |
|
1509 |
|
|
1510 |
if (prefix_i + prefix_f + prefix_s > 1) { |
if (prefix_i + prefix_f + prefix_s > 1) { |
1511 |
fprintf(stderr, "Invalid disk image prefix(es). You can" |
fprintf(stderr, "Invalid disk image prefix(es). You can" |
1532 |
* Is this a tape, CD-ROM or a normal disk? |
* Is this a tape, CD-ROM or a normal disk? |
1533 |
* |
* |
1534 |
* An intelligent guess, if no prefixes are used, would be that |
* An intelligent guess, if no prefixes are used, would be that |
1535 |
* filenames ending with .iso are CD-ROM images. |
* filenames ending with .iso or .cdr are CD-ROM images. |
1536 |
*/ |
*/ |
1537 |
if (prefix_t) { |
if (prefix_t) { |
1538 |
d->is_a_tape = 1; |
d->is_a_tape = 1; |
1539 |
} else { |
} else { |
1540 |
if (prefix_c || |
if (prefix_c || |
1541 |
((strlen(d->fname) > 4 && |
((strlen(d->fname) > 4 && |
1542 |
strcasecmp(d->fname + strlen(d->fname) - 4, ".iso") == 0) |
(strcasecmp(d->fname + strlen(d->fname) - 4, ".cdr") == 0 || |
1543 |
|
strcasecmp(d->fname + strlen(d->fname) - 4, ".iso") == 0)) |
1544 |
&& !prefix_d) |
&& !prefix_d) |
1545 |
) { |
) { |
1546 |
d->is_a_cdrom = 1; |
d->is_a_cdrom = 1; |
1558 |
*/ |
*/ |
1559 |
|
|
1560 |
#if 0 |
#if 0 |
1561 |
if (machine->machine_type == MACHINE_DEC) |
if (machine->machine_type == MACHINE_PMAX) |
1562 |
d->logical_block_size = 512; |
d->logical_block_size = 512; |
1563 |
else |
else |
1564 |
d->logical_block_size = 2048; |
d->logical_block_size = 2048; |
1698 |
|
|
1699 |
|
|
1700 |
/* |
/* |
1701 |
|
* diskimage_getname(): |
1702 |
|
* |
1703 |
|
* Returns 1 if a valid disk image name was returned, 0 otherwise. |
1704 |
|
*/ |
1705 |
|
int diskimage_getname(struct machine *machine, int id, int type, |
1706 |
|
char *buf, size_t bufsize) |
1707 |
|
{ |
1708 |
|
struct diskimage *d = machine->first_diskimage; |
1709 |
|
|
1710 |
|
if (buf == NULL) |
1711 |
|
return 0; |
1712 |
|
|
1713 |
|
while (d != NULL) { |
1714 |
|
if (d->type == type && d->id == id) { |
1715 |
|
char *p = strrchr(d->fname, '/'); |
1716 |
|
if (p == NULL) |
1717 |
|
p = d->fname; |
1718 |
|
else |
1719 |
|
p ++; |
1720 |
|
snprintf(buf, bufsize, "%s", p); |
1721 |
|
return 1; |
1722 |
|
} |
1723 |
|
d = d->next; |
1724 |
|
} |
1725 |
|
return 0; |
1726 |
|
} |
1727 |
|
|
1728 |
|
|
1729 |
|
/* |
1730 |
* diskimage_is_a_cdrom(): |
* diskimage_is_a_cdrom(): |
1731 |
* |
* |
1732 |
* Returns 1 if a disk image is a CDROM, 0 otherwise. |
* Returns 1 if a disk image is a CDROM, 0 otherwise. |
1772 |
*/ |
*/ |
1773 |
void diskimage_dump_info(struct machine *machine) |
void diskimage_dump_info(struct machine *machine) |
1774 |
{ |
{ |
1775 |
int iadd=4; |
int iadd = DEBUG_INDENTATION; |
1776 |
struct diskimage *d = machine->first_diskimage; |
struct diskimage *d = machine->first_diskimage; |
1777 |
|
|
1778 |
while (d != NULL) { |
while (d != NULL) { |