/[gxemul]/upstream/0.4.4/src/diskimage.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /upstream/0.4.4/src/diskimage.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 26 by dpavlin, Mon Oct 8 16:20:10 2007 UTC revision 34 by dpavlin, Mon Oct 8 16:21:17 2007 UTC
# Line 1  Line 1 
1  /*  /*
2   *  Copyright (C) 2003-2006  Anders Gavare.  All rights reserved.   *  Copyright (C) 2003-2007  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:
# Line 25  Line 25 
25   *  SUCH DAMAGE.   *  SUCH DAMAGE.
26   *   *
27   *   *
28   *  $Id: diskimage.c,v 1.110 2006/06/24 19:52:27 debug Exp $   *  $Id: diskimage.c,v 1.116 2006/12/30 13:30:51 debug Exp $
29   *   *
30   *  Disk image support.   *  Disk image support.
31   *   *
# Line 283  int64_t diskimage_getsize(struct machine Line 283  int64_t diskimage_getsize(struct machine
283    
284    
285  /*  /*
286     *  diskimage_get_baseoffset():
287     *
288     *  Returns -1 if the specified disk id/type does not exists, otherwise
289     *  the base offset of the disk image is returned.
290     */
291    int64_t diskimage_get_baseoffset(struct machine *machine, int id, int type)
292    {
293            struct diskimage *d = machine->first_diskimage;
294    
295            while (d != NULL) {
296                    if (d->type == type && d->id == id)
297                            return d->override_base_offset;
298                    d = d->next;
299            }
300            return -1;
301    }
302    
303    
304    /*
305   *  diskimage_getchs():   *  diskimage_getchs():
306   *   *
307   *  Returns the current CHS values of a disk image.   *  Returns the current CHS values of a disk image.
# Line 451  static int diskimage__internal_access(st Line 470  static int diskimage__internal_access(st
470    
471          /*  Warn about non-complete data transfers:  */          /*  Warn about non-complete data transfers:  */
472          if (lendone != (ssize_t)len) {          if (lendone != (ssize_t)len) {
473    #ifdef UNSTABLE_DEVEL
474                  fatal("[ diskimage__internal_access(): disk_id %i, offset %lli"                  fatal("[ diskimage__internal_access(): disk_id %i, offset %lli"
475                      ", transfer not completed. len=%i, len_done=%i ]\n",                      ", transfer not completed. len=%i, len_done=%i ]\n",
476                      d->id, (long long)offset, (int)len, (int)lendone);                      d->id, (long long)offset, (int)len, (int)lendone);
477    #endif
478                  return 0;                  return 0;
479          }          }
480    
# Line 1141  xferp->data_in[4] = 0x2c - 4;  /*  Additi Line 1162  xferp->data_in[4] = 0x2c - 4;  /*  Additi
1162    
1163                  /*                  /*
1164                   *  Bits 2..0 of buf[1] contain the 'code' which describes how                   *  Bits 2..0 of buf[1] contain the 'code' which describes how
1165                   *  we should space, and buf[2..4] contain the number of                   *  spacing should be done, and buf[2..4] contain the number of
1166                   *  operations.                   *  operations.
1167                   */                   */
1168                  debug("[ SPACE: buf[] = %02x %02x %02x %02x %02x %02x ]\n",                  debug("[ SPACE: buf[] = %02x %02x %02x %02x %02x %02x ]\n",
# Line 1250  xferp->data_in[4] = 0x2c - 4;  /*  Additi Line 1271  xferp->data_in[4] = 0x2c - 4;  /*  Additi
1271                  diskimage__return_default_status_and_message(xferp);                  diskimage__return_default_status_and_message(xferp);
1272                  break;                  break;
1273    
1274            case SCSICDROM_READ_DISCINFO:
1275                    debug("(SCSICDROM_READ_DISCINFO: ");
1276                    debug("TODO");
1277                    retlen = 0;
1278    
1279                    /*  Return data:  */
1280                    scsi_transfer_allocbuf(&xferp->data_in_len,
1281                        &xferp->data_in, retlen, 1);
1282    
1283                    /*  TODO  */
1284    
1285                    diskimage__return_default_status_and_message(xferp);
1286                    break;
1287    
1288            case SCSICDROM_READ_TRACKINFO:
1289                    debug("(SCSICDROM_READ_TRACKINFO: ");
1290                    debug("TODO");
1291                    retlen = 0;
1292    
1293                    /*  Return data:  */
1294                    scsi_transfer_allocbuf(&xferp->data_in_len,
1295                        &xferp->data_in, retlen, 1);
1296    
1297                    /*  TODO  */
1298    
1299                    diskimage__return_default_status_and_message(xferp);
1300                    break;
1301    
1302          case SCSICMD_MODE_SELECT:          case SCSICMD_MODE_SELECT:
1303                  debug("[ SCSI MODE_SELECT: ");                  debug("[ SCSI MODE_SELECT: ");
1304    
# Line 1371  int diskimage_access(struct machine *mac Line 1420  int diskimage_access(struct machine *mac
1420                  return 0;                  return 0;
1421          }          }
1422    
1423            offset -= d->override_base_offset;
1424            if (offset < 0 && offset + d->override_base_offset >= 0) {
1425                    debug("[ reading before start of disk image ]\n");
1426                    /*  Returning zeros.  */
1427                    memset(buf, 0, len);
1428                    return 1;
1429            }
1430    
1431          return diskimage__internal_access(d, writeflag, offset, buf, len);          return diskimage__internal_access(d, writeflag, offset, buf, len);
1432  }  }
1433    
# Line 1389  int diskimage_access(struct machine *mac Line 1446  int diskimage_access(struct machine *mac
1446   *      gH;S;   set geometry (H=heads, S=sectors per track, cylinders are   *      gH;S;   set geometry (H=heads, S=sectors per track, cylinders are
1447   *              automatically calculated). (This is ignored for floppies.)   *              automatically calculated). (This is ignored for floppies.)
1448   *      i       IDE (instead of SCSI)   *      i       IDE (instead of SCSI)
1449     *      oOFS;   set base offset in bytes, when booting from an ISO9660 fs
1450   *      r       read-only (don't allow changes to the file)   *      r       read-only (don't allow changes to the file)
1451   *      s       SCSI (this is the default)   *      s       SCSI (this is the default)
1452   *      t       tape   *      t       tape
# Line 1401  int diskimage_add(struct machine *machin Line 1459  int diskimage_add(struct machine *machin
1459  {  {
1460          struct diskimage *d, *d2;          struct diskimage *d, *d2;
1461          int id = 0, override_heads=0, override_spt=0;          int id = 0, override_heads=0, override_spt=0;
1462          int64_t bytespercyl;          int64_t bytespercyl, override_base_offset=0;
1463          char *cp;          char *cp;
1464          int prefix_b=0, prefix_c=0, prefix_d=0, prefix_f=0, prefix_g=0;          int prefix_b=0, prefix_c=0, prefix_d=0, prefix_f=0, prefix_g=0;
1465          int prefix_i=0, prefix_r=0, prefix_s=0, prefix_t=0, prefix_id = -1;          int prefix_i=0, prefix_r=0, prefix_s=0, prefix_t=0, prefix_id=-1;
1466            int prefix_o=0;
1467    
1468          if (fname == NULL) {          if (fname == NULL) {
1469                  fprintf(stderr, "diskimage_add(): NULL ptr\n");                  fprintf(stderr, "diskimage_add(): NULL ptr\n");
# Line 1463  int diskimage_add(struct machine *machin Line 1522  int diskimage_add(struct machine *machin
1522                          case 'i':                          case 'i':
1523                                  prefix_i = 1;                                  prefix_i = 1;
1524                                  break;                                  break;
1525                            case 'o':
1526                                    prefix_o = 1;
1527                                    override_base_offset = atoi(fname);
1528                                    while (*fname != '\0' && *fname != ':'
1529                                        && *fname != ';')
1530                                            fname ++;
1531                                    if (*fname == ':' || *fname == ';')
1532                                            fname ++;
1533                                    if (override_base_offset < 0) {
1534                                            fatal("Bad base offset: %"PRIi64
1535                                                "\n", override_base_offset);
1536                                            exit(1);
1537                                    }
1538                                    break;
1539                          case 'r':                          case 'r':
1540                                  prefix_r = 1;                                  prefix_r = 1;
1541                                  break;                                  break;
# Line 1520  int diskimage_add(struct machine *machin Line 1593  int diskimage_add(struct machine *machin
1593          if (prefix_s)          if (prefix_s)
1594                  d->type = DISKIMAGE_SCSI;                  d->type = DISKIMAGE_SCSI;
1595    
1596            if (prefix_o)
1597                    d->override_base_offset = override_base_offset;
1598    
1599          d->fname = strdup(fname);          d->fname = strdup(fname);
1600          if (d->fname == NULL) {          if (d->fname == NULL) {
1601                  fprintf(stderr, "out of memory\n");                  fprintf(stderr, "out of memory\n");

Legend:
Removed from v.26  
changed lines
  Added in v.34

  ViewVC Help
Powered by ViewVC 1.1.26