aboutsummaryrefslogtreecommitdiff
path: root/jindroush/lib/adsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'jindroush/lib/adsk.cpp')
-rw-r--r--jindroush/lib/adsk.cpp319
1 files changed, 319 insertions, 0 deletions
diff --git a/jindroush/lib/adsk.cpp b/jindroush/lib/adsk.cpp
new file mode 100644
index 0000000..e5d0b5a
--- /dev/null
+++ b/jindroush/lib/adsk.cpp
@@ -0,0 +1,319 @@
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+
+#include "adsk.h"
+
+ADisk::ADisk() : CDisk()
+{
+ #ifdef _MEMORY_DUMP_
+ printf( "ADisk constructed: %p\n", this );
+ #endif
+}
+
+ADisk::~ADisk()
+{
+ #ifdef _MEMORY_DUMP_
+ printf( "ADisk destructed: %p\n", this );
+ #endif
+}
+
+void GuessClassicSizes( int iSectors, int iSectorSize, DISK_GEOMETRY* pGeometry )
+{
+ pGeometry->iSides = 1;
+ pGeometry->iBytesPerSector = iSectorSize;
+
+ pGeometry->iTracks = 1;
+ pGeometry->iSectorsPerTrack = iSectors;
+
+ switch( iSectors )
+ {
+ case 720:
+ switch( iSectorSize )
+ {
+ case 0x80:
+ pGeometry->iTracks = 40;
+ pGeometry->iSectorsPerTrack = 18;
+ break;
+
+ case 0x100:
+ pGeometry->iTracks = 40;
+ pGeometry->iSectorsPerTrack = 18;
+ break;
+ }
+ break;
+
+ case 1040:
+ pGeometry->iTracks = 40;
+ pGeometry->iSectorsPerTrack = 26;
+ break;
+
+ }
+
+}
+
+void ForceClassicSize( DISK_GEOMETRY* pGeometry )
+{
+ ForceClassicSize( pGeometry->iSectors, pGeometry->iBytesPerSector, pGeometry );
+}
+
+void ForceClassicSize( int iSectors, int iSectorSize, DISK_GEOMETRY* pGeometry )
+{
+ pGeometry->iSides = 1;
+ pGeometry->iBytesPerSector = iSectorSize;
+
+ pGeometry->iTracks = 1;
+ pGeometry->iSectorsPerTrack = iSectors;
+
+ switch( iSectorSize )
+ {
+ case 0x80:
+ if ( iSectors <= 720 )
+ {
+ pGeometry->iTracks = 40;
+ pGeometry->iSectorsPerTrack = 18;
+ }
+ else if ( ( iSectors > 720 ) && ( iSectors <= 1040 ) )
+ {
+ pGeometry->iTracks = 40;
+ pGeometry->iSectorsPerTrack = 26;
+ }
+ else
+ {
+ GuessClassicSizes( iSectors, iSectorSize, pGeometry );
+ }
+ break;
+
+ case 0x100:
+ default:
+ if ( iSectors <= 720 )
+ {
+ pGeometry->iTracks = 40;
+ pGeometry->iSectorsPerTrack = 18;
+ }
+ else
+ {
+ GuessClassicSizes( iSectors, iSectorSize, pGeometry );
+ }
+ break;
+ }
+
+ switch( iSectors )
+ {
+ case 720:
+ switch( iSectorSize )
+ {
+ case 0x80:
+ pGeometry->iTracks = 40;
+ pGeometry->iSectorsPerTrack = 18;
+ break;
+
+ case 0x100:
+ pGeometry->iTracks = 40;
+ pGeometry->iSectorsPerTrack = 18;
+ break;
+ }
+ break;
+
+ case 1040:
+ pGeometry->iTracks = 40;
+ pGeometry->iSectorsPerTrack = 26;
+ break;
+
+ }
+
+}
+
+
+//returns ptr to disk type name
+char* GetDiskTypeName( DISK_TYPE disktype )
+{
+ switch( disktype )
+ {
+ case DISK_XFD:
+ return "XFD";
+
+ case DISK_ATR:
+ return "ATR";
+
+ case DISK_XFDb:
+ return "XFDb";
+
+ case DISK_ATRb:
+ return "ATRb";
+
+ case DISK_DCM:
+ return "DCM";
+
+ case DISK_SCP:
+ return "SCP";
+
+ case DISK_DI:
+ return "DI";
+
+ default:
+ return "None";
+ }
+}
+
+//returns ptr to disk type extension
+char* GetDiskTypeExt( DISK_TYPE disktype )
+{
+ switch( disktype )
+ {
+ case DISK_XFD:
+ case DISK_XFDb:
+ return "xfd";
+
+ case DISK_ATR:
+ case DISK_ATRb:
+ return "atr";
+
+ case DISK_DCM:
+ return "dcm";
+
+ case DISK_SCP:
+ return "scp";
+
+ case DISK_DI:
+ return "di";
+
+ default:
+ return "xxx";
+ }
+}
+
+#ifndef __CDISK_NOLOAD__
+DISKINIT_RETCODE InitializeDisk( ADisk** ppDisk, DISK_TYPE disktype, char* szFname, BOOL bVerbose, BOOL bRepair, BOOL bRepairAuto )
+{
+ switch( disktype )
+ {
+ case DISK_ATR:
+ *ppDisk = new CAtr();
+ break;
+
+ case DISK_SCP:
+ *ppDisk = new CScp();
+ break;
+
+ case DISK_DCM:
+ *ppDisk = new CDcm();
+ break;
+
+ case DISK_XFD:
+ *ppDisk = new CXfd();
+ break;
+
+ case DISK_DI:
+ *ppDisk = new CDi();
+ break;
+
+ default:
+ if ( bVerbose )
+ fprintf( stderr, "Invalid disk type specified!\n" );
+ return DI_RET_CANT_CONTINUE;
+ }
+
+ if ( !*ppDisk )
+ {
+ if ( bVerbose )
+ fprintf( stderr, "Can't initialize disk driver!\n" );
+ return DI_RET_CONTINUE;
+ }
+
+ if ( !(*ppDisk)->Load( szFname, bRepair, bRepairAuto ) )
+ {
+ int iError = (*ppDisk)->GetErrorCode();
+
+ DISKINIT_RETCODE ret = DI_RET_CONTINUE;
+
+ switch( iError )
+ {
+ case CATR_FORMAT_VIOLATED:
+ case CXFD_FORMAT_VIOLATED:
+ case CDISK_ERROR_CANT_OPEN:
+ case CDCM_FORMAT_VIOLATED:
+ case CSCP_FORMAT_VIOLATED:
+ case CDI_FORMAT_VIOLATED:
+ ret = DI_RET_CANT_CONTINUE;
+ break;
+ }
+
+ if ( bVerbose || ( ret == DI_RET_CANT_CONTINUE ) )
+ {
+ printf( "Input file '%s' ", szFname );
+ printf( "(%s)\n", GetDiskTypeName( disktype ) );
+ printf( "Load failed because:\n%s\n", (*ppDisk)->GetLastError() );
+ }
+ if ( ret != DI_RET_OK )
+ {
+ delete *ppDisk;
+ return ret;
+ }
+ }
+
+ return DI_RET_OK;
+}
+#endif
+
+BOOL ADisk::ReadSectors( void* pBuf, int iStartSec, int iSecs )
+{
+ while( iSecs )
+ {
+ if ( !ReadSector( pBuf, iStartSec ) )
+ return FALSE;
+
+ pBuf = (BYTE*)pBuf + ( ( iStartSec <= 3 ) ? 0x80 :m_geometry.iBytesPerSector );
+ iStartSec++;
+ iSecs--;
+ }
+
+ return TRUE;
+}
+
+BOOL ADisk::WriteSectors( int iStartSec, void* pBuf, int iSecs )
+{
+ while( iSecs )
+ {
+ if ( !WriteSector( iStartSec, pBuf ) )
+ return FALSE;
+
+ pBuf = (BYTE*)pBuf + ( ( iStartSec <= 3 ) ? 0x80 :m_geometry.iBytesPerSector );
+ iStartSec++;
+ iSecs--;
+ }
+
+ return TRUE;
+}
+
+int ADisk::GetBootSectorCount()
+{
+ return m_pbtMemory[ 1 ];
+}
+
+int ADisk::GetBootSectorSize()
+{
+ int iSecCount = GetBootSectorCount();
+
+ if ( iSecCount > 3 )
+ return ( ( iSecCount - 3 ) * GetSectorSize() + 0x180 );
+ else
+ return iSecCount * 0x80;
+}
+
+BOOL ADisk::GetBootSector( BYTE* pbtData )
+{
+ return ReadSectors( pbtData, 1, GetBootSectorCount() );
+}
+