/* #includes */ /*{{{C}}}*//*{{{*/
-#undef _POSIX_SOURCE
-#define _POSIX_SOURCE 1
-#undef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 2
+#include "config.h"
#include <assert.h>
-#include <errno.h>
#include <ctype.h>
-#include "config.h"
+#include <errno.h>
+#include <stdio.h>
+
#include "cpmdir.h"
#include "cpmfs.h"
+
+#ifdef USE_DMALLOC
+#include <dmalloc.h>
+#endif
/*}}}*/
/* types */ /*{{{*/
#define PHYSICAL_SECTOR_1 1 /* First physical sector */
#define USE_INT13
/* Windows 95 disk I/O functions - based on Stan Mitchell's DISKDUMP.C */
-#define VWIN32_DIOC_DOS_IOCTL 1 // DOS ioctl calls 4400h-4411h
-#define VWIN32_DIOC_DOS_INT25 2 // absolute disk read, DOS int 25h
-#define VWIN32_DIOC_DOS_INT26 3 // absolute disk write, DOS int 26h
-#define VWIN32_DIOC_DOS_INT13 4 // BIOS INT13 functions
+#define VWIN32_DIOC_DOS_IOCTL 1 /* DOS ioctl calls 4400h-4411h */
+#define VWIN32_DIOC_DOS_INT25 2 /* absolute disk read, DOS int 25h */
+#define VWIN32_DIOC_DOS_INT26 3 /* absolute disk write, DOS int 26h */
+#define VWIN32_DIOC_DOS_INT13 4 /* BIOS INT13 functions */
typedef struct _DIOC_REGISTERS {
DWORD reg_EBX;
#pragma pack(1)
typedef struct _DISKIO {
- DWORD diStartSector; // sector number to start at
- WORD diSectors; // number of sectors
- DWORD diBuffer; // address of buffer
+ DWORD diStartSector; /* sector number to start at */
+ WORD diSectors; /* number of sectors */
+ DWORD diBuffer; /* address of buffer */
}
DISKIO, *PDISKIO;
typedef struct MID {
- WORD midInfoLevel; // information level, must be 0
- DWORD midSerialNum; // serial number for the medium
- char midVolLabel[11]; // volume label for the medium
- char midFileSysType[8]; // type of file system as 8-byte ASCII
+ WORD midInfoLevel; /* information level, must be 0 */
+ DWORD midSerialNum; /* serial number for the medium */
+ char midVolLabel[11]; /* volume label for the medium */
+ char midFileSysType[8]; /* type of file system as 8-byte ASCII */
}
MID, *PMID;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
(LPTSTR)buffer,
1023, NULL);
return buffer;
BOOL bResult;
DWORD cb;
- reg.reg_EAX = 0x440d; // IOCTL for block device
- reg.reg_EBX = volume; // one-based drive number
- reg.reg_ECX = 0x0860; // Get Device params
+ reg.reg_EAX = 0x440d; /* IOCTL for block device */
+ reg.reg_EBX = volume; /* one-based drive number */
+ reg.reg_ECX = 0x0860; /* Get Device params */
reg.reg_EDX = (DWORD)pParam;
- reg.reg_Flags = 1; // preset the carry flag
+ reg.reg_Flags = 1; /* preset the carry flag */
bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL,
®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 );
BOOL bResult;
DWORD cb;
- reg.reg_EAX = 0x440d; // IOCTL for block device
- reg.reg_EBX = volume; // one-based drive number
- reg.reg_ECX = 0x0840; // Set Device params
+ reg.reg_EAX = 0x440d; /* IOCTL for block device */
+ reg.reg_EBX = volume; /* one-based drive number */
+ reg.reg_ECX = 0x0840; /* Set Device params */
reg.reg_EDX = (DWORD)pParam;
- reg.reg_Flags = 1; // preset the carry flag
+ reg.reg_Flags = 1; /* preset the carry flag */
bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL,
®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 );
BOOL bResult;
DWORD cb;
- reg.reg_EAX = 0x440d; // IOCTL for block device
- reg.reg_EBX = volume; // one-based drive number
- reg.reg_ECX = 0x0866; // Get Media ID
+ reg.reg_EAX = 0x440d; /* IOCTL for block device */
+ reg.reg_EBX = volume; /* one-based drive number */
+ reg.reg_ECX = 0x0866; /* Get Media ID */
reg.reg_EDX = (DWORD)pMid;
- reg.reg_Flags = 1; // preset the carry flag
+ reg.reg_Flags = 1; /* preset the carry flag */
bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL,
®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 );
BOOL bResult;
DWORD cb;
- reg.reg_EAX = 0x4409; // Is Drive Remote
- reg.reg_EBX = volume; // one-based drive number
- reg.reg_Flags = 1; // preset the carry flag
+ reg.reg_EAX = 0x4409; /* Is Drive Remote */
+ reg.reg_EBX = volume; /* one-based drive number */
+ reg.reg_Flags = 1; /* preset the carry flag */
bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL,
®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 );
BOOL bResult;
DWORD cb;
- reg.reg_EAX = 0x440d; // generic IOCTL
- reg.reg_ECX = 0x084a; // lock logical volume
+ reg.reg_EAX = 0x440d; /* generic IOCTL */
+ reg.reg_ECX = 0x084a; /* lock logical volume */
reg.reg_EBX = volume | (lock_level << 8);
reg.reg_EDX = permissions;
- reg.reg_Flags = 1; // preset the carry flag
+ reg.reg_Flags = 1; /* preset the carry flag */
bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL,
®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 );
DWORD cb;
reg.reg_EAX = 0x440d;
- reg.reg_ECX = 0x086a; // lock logical volume
+ reg.reg_ECX = 0x086a; /* lock logical volume */
reg.reg_EBX = volume;
- reg.reg_Flags = 1; // preset the carry flag
+ reg.reg_Flags = 1; /* preset the carry flag */
bResult = DeviceIoControl( hVWin32Device, VWIN32_DIOC_DOS_IOCTL,
®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 );
MID media;
vname[0] = toupper(filename[0]);
- driveno = vname[0] - 'A' + 1; // 1=A: 2=B:
+ driveno = vname[0] - 'A' + 1; /* 1=A: 2=B: */
sb->drvtype = CPMDRV_WIN95;
sb->hdisk = CreateFile( "\\\\.\\vwin32",
0,
}
/*}}}*/
/* Device_setGeometry -- Set disk geometry */ /*{{{*/
-void Device_setGeometry(struct Device *this, int secLength, int sectrk, int tracks)
+const char * Device_setGeometry(struct Device *this, int secLength, int sectrk, int tracks, off_t offset, const char *libdskGeometry)
{
int n;
this->secLength=secLength;
this->sectrk=sectrk;
this->tracks=tracks;
+ // Bill Buckels - add this->offset
+ this->offset=offset;
+
+
+ // Bill Buckels - not sure what to do here
if (this->drvtype == CPMDRV_WIN95)
{
DRIVEPARAMS drvp;
memset(&drvp, 0, sizeof(drvp));
- if (GetDriveParams( this->hdisk, this->fd, &drvp )) return;
+ if (GetDriveParams( this->hdisk, this->fd, &drvp )) return "GetDriveParams failed";
drvp.bytespersector = secLength;
drvp.sectorspertrack = sectrk;
*/
SetDriveParams( this->hdisk, this->fd, &drvp );
}
+ return NULL;
}
/*}}}*/
/* Device_close -- Close an image file */ /*{{{*/
LPVOID iobuffer;
DWORD bytesread;
- if (SetFilePointer(drive->hdisk, offset, NULL, FILE_BEGIN) == INVALID_FILE_SIZE)
+ // Bill Buckels - add drive->offset
+ if (SetFilePointer(drive->hdisk, offset+drive->offset, NULL, FILE_BEGIN) == INVALID_FILE_SIZE)
{
return strwin32error();
}
return NULL;
}
+ // Bill Buckels - not sure what to do here
if (drive->drvtype == CPMDRV_WIN95)
{
DIOC_REGISTERS reg;
if (drive->tracks < 44) { cyl = track; head = 0; }
else { cyl = track/2; head = track & 1; }
- reg.reg_EAX = 0x0201; // Read 1 sector
+ reg.reg_EAX = 0x0201; /* Read 1 sector */
reg.reg_EBX = (DWORD)buf;
reg.reg_ECX = (cyl << 8) | (sector + PHYSICAL_SECTOR_1);
reg.reg_EDX = (head << 8) | (drive->fd - 1);
- reg.reg_Flags = 1; // preset the carry flag
+ reg.reg_Flags = 1; /* preset the carry flag */
bResult = DeviceIoControl( drive->hdisk, VWIN32_DIOC_DOS_INT13,
®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 );
#else
DISKIO di;
- reg.reg_EAX = drive->fd - 1; // zero-based volume number
+ reg.reg_EAX = drive->fd - 1; /* zero-based volume number */
reg.reg_EBX = (DWORD)&di;
- reg.reg_ECX = 0xffff; // use DISKIO structure
- reg.reg_Flags = 1; // preset the carry flag
+ reg.reg_ECX = 0xffff; /* use DISKIO structure */
+ reg.reg_Flags = 1; /* preset the carry flag */
di.diStartSector = sector+track*drive->sectrk;
di.diSectors = 1;
di.diBuffer = (DWORD)buf;
return 0;
}
- if (lseek(drive->fd,offset,SEEK_SET)==-1)
+ // Bill Buckels - add drive->offset
+ if (lseek(drive->fd,offset+drive->offset,SEEK_SET)==-1)
{
return strerror(errno);
}
LPVOID iobuffer;
DWORD byteswritten;
- if (SetFilePointer(drive->hdisk, offset, NULL, FILE_BEGIN) == INVALID_FILE_SIZE)
+ // Bill Buckels - add drive->offset
+ if (SetFilePointer(drive->hdisk, offset+drive->offset, NULL, FILE_BEGIN) == INVALID_FILE_SIZE)
{
return strwin32error();
}
return NULL;
}
+ // Bill Buckels - not sure what to do here
if (drive->drvtype == CPMDRV_WIN95)
{
DIOC_REGISTERS reg;
if (drive->tracks < 44) { cyl = track; head = 0; }
else { cyl = track/2; head = track & 1; }
- reg.reg_EAX = 0x0301; // Write 1 sector
+ reg.reg_EAX = 0x0301; /* Write 1 sector */
reg.reg_EBX = (DWORD)buf;
reg.reg_ECX = (cyl << 8) | (sector + PHYSICAL_SECTOR_1);
reg.reg_EDX = (head << 8) | (drive->fd - 1);
- reg.reg_Flags = 1; // preset the carry flag
+ reg.reg_Flags = 1; /* preset the carry flag */
bResult = DeviceIoControl( drive->hdisk, VWIN32_DIOC_DOS_INT13,
®, sizeof( reg ), ®, sizeof( reg ), &cb, 0 );
#else
DISKIO di;
- reg.reg_EAX = drive->fd - 1; // zero-based volume number
+ reg.reg_EAX = drive->fd - 1; /* zero-based volume number */
reg.reg_EBX = (DWORD)&di;
- reg.reg_ECX = 0xffff; // use DISKIO structure
- reg.reg_Flags = 1; // preset the carry flag
+ reg.reg_ECX = 0xffff; /* use DISKIO structure */
+ reg.reg_Flags = 1; /* preset the carry flag */
di.diStartSector = sector+track*drive->sectrk;
di.diSectors = 1;
di.diBuffer = (DWORD)buf;
return NULL;
}
- if (lseek(drive->fd,offset, SEEK_SET)==-1)
+ // Bill Buckels - add drive->offset
+ if (lseek(drive->fd,offset+drive->offset, SEEK_SET)==-1)
{
return strerror(errno);
}